OSM package API handling
"""
-import tarfile
-import re
-import yaml
from osmclient.common.exceptions import ClientException
from osmclient.common.exceptions import NotFound
from osmclient.common import utils
self._upload_http = upload_http
def _wait_for_package(self, pkg_type):
- if 'vnfd' in pkg_type['type']:
+ if "vnfd" in pkg_type["type"]:
get_method = self._client.vnfd.get
- elif 'nsd' in pkg_type['type']:
+ elif "nsd" in pkg_type["type"]:
get_method = self._client.nsd.get
else:
raise ClientException("no valid package type found")
return False
return True
- return utils.wait_for_value(lambda:
- check_exists(lambda:
- get_method(pkg_type['name'])))
+ return utils.wait_for_value(
+ lambda: check_exists(lambda: get_method(pkg_type["name"]))
+ )
- # method opens up a package and finds the name of the resulting
- # descriptor (vnfd or nsd name)
def get_key_val_from_pkg(self, descriptor_file):
- tar = tarfile.open(descriptor_file)
- yamlfile = None
- for member in tar.getmembers():
- if (re.match('.*.yaml', member.name) and
- len(member.name.split('/')) == 2):
- yamlfile = member.name
- break
- if yamlfile is None:
- return None
-
- dict = yaml.load(tar.extractfile(yamlfile))
- result = {}
- for k1, v1 in dict.items():
- if not k1.endswith('-catalog'):
- continue
- for k2, v2 in v1.items():
- if not k2.endswith('nsd') and not k2.endswith('vnfd'):
- continue
-
- if 'nsd' in k2:
- result['type'] = 'nsd'
- else:
- result['type'] = 'vnfd'
-
- for entry in v2:
- for k3, v3 in entry.items():
- # strip off preceeding chars before :
- key_name = k3.split(':').pop()
-
- result[key_name] = v3
- tar.close()
- return result
+ return utils.get_key_val_from_pkg(descriptor_file)
def wait_for_upload(self, filename):
"""wait(block) for an upload to succeed.
- The filename passed is assumed to be a descriptor tarball.
+ The filename passed is assumed to be a descriptor tarball.
"""
- pkg_type = self.get_key_val_from_pkg(filename)
+ pkg_type = utils.get_key_val_from_pkg(filename)
if pkg_type is None:
raise ClientException("Cannot determine package type")
if not self._wait_for_package(pkg_type):
- raise ClientException("package {} failed to upload"
- .format(filename))
+ raise ClientException("package {} failed to upload".format(filename))
def upload(self, filename):
- resp = self._upload_http.post_cmd(formfile=('package', filename))
- if not resp or 'transaction_id' not in resp:
+ resp = self._upload_http.post_cmd(formfile=("package", filename))
+ if not resp or "transaction_id" not in resp:
raise ClientException("failed to upload package")