mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
* Refactored nuage tests Added simulator support for ConfigDrive Allow all nuage tests to run against simulator Refactored nuage tests to remove code duplication * Move test data from test_data.py to nuage_test_data.py Nuage test data is now contained in nuage_test_data.py instead of test_data.py Removed all nuage test data from nuage_test_data.py * CLOUD-1252 fixed cleanup of vpc tier network * Import libVSD into the codebase * CLOUDSTACK-1253: Volumes are not expunged in simulator * Fixed some merge issues in test_nuage_vsp_mngd_subnets test * Implement GetVolumeStatsCommand in Simulator * Add vspk as marvin nuagevsp dependency, after removing libVSD dependency * correct libVSD files for license purposes pep8 pyflakes compliant
136 lines
4.6 KiB
Python
136 lines
4.6 KiB
Python
# 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
|