# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. import bambou import importlib class ApiClient(object): """ This class provides utilities to instantiate an API client using vspk. Args: address (str): ip address or hostname where the VSD API is exposed. user (str): username to authenticate on the API. password (str): password to authenticate on the API. enterprise (str): VSD organization to use to authenticate on the API. version (str): version of the API to use. """ def __init__(self, address, port='8443', user='csproot', password='csproot', enterprise='csp', version=None): if not version: version = '5.0' self.url = 'https://{}:{}'.format(address, port) self.version = version self.user = user self.password = password self.enterprise = enterprise self.last_pushes = [] self.session = None @staticmethod def import_vspk(version): """ Return the vspk module corresponding to a given version of the API. Args: version (str): version of the API """ version = 'v{}'.format(str(version).replace('.', '_')) try: vsdk = importlib.import_module('vspk.%s' % version) except: vsdk = importlib.import_module('vspk.vsdk.%s' % version) return vsdk def import_vsdenvs(self): """ Return the root class a `vsdenvs`. """ if not self.session: raise Exception('You must have an active session to use vsdenvs') self.vsdenvs = __import__('vsdenvs', globals(), locals(), [], -1) self.vsdenvs.NUCsprootEnvironment.instance = self.session.user def new_session(self): """ Start a new API session via vspk an return the corresponding `vspk.NUVSDSession` object. Note that this object is also exposed as `self.session` """ vspk = self.import_vspk(self.version) self.session = vspk.NUVSDSession( username=self.user, password=self.password, enterprise=self.enterprise, api_url=self.url) self.session.start() return self.session def start_push_center(self, callback=None): """ Add a vspk push center to the current session. """ if not callback: callback = self.default_callback self.session.push_center.add_delegate(callback) self.session.push_center.start() def stop_push_center(self, callback=None): """ Stop the vpsk push center for the current session. """ self.session.push_center.stop() def default_callback(self, data): """ Default callback for the push center. It just stores the new event in a LILO queue exposed as `self.last_pushe` """ self.last_pushes.append(data) # keep only the last 10 events if len(self.last_pushes) == 100: del self.last_pushes[-1] def __call__(self): if not self.session: return self.new_session() return self.session def add_license(self): """ Add a license to the VSD """ vspk = self.import_vspk(self.version) self.session.license = vspk.NULicense(license=self.license) try: self.session.user.create_child(self.session.license) except bambou.exceptions.BambouHTTPError: pass else: self.session.user.add_child(self.session.license) def delete_license(self): """ Delete license on the VSD """ self.session.user.licenses.fetch() for license in self.session.user.licenses: try: license.delete() except bambou.exceptions.BambouHTTPError: pass