X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osmclient%2Fsol005%2Fnsi.py;fp=osmclient%2Fsol005%2Fnsi.py;h=999959e4ce22c0e1d8f8ef63f8250347a590decf;hb=95686bbc69ded243c346f94dceb0bee567572fb7;hp=20065b72ee5354bfde2bab55897347c3c3fb540a;hpb=52424a2ae26db69c5a97d01e84454ffdd4d31228;p=osm%2Fosmclient.git diff --git a/osmclient/sol005/nsi.py b/osmclient/sol005/nsi.py index 20065b7..999959e 100644 --- a/osmclient/sol005/nsi.py +++ b/osmclient/sol005/nsi.py @@ -28,59 +28,60 @@ import logging class Nsi(object): - def __init__(self, http=None, client=None): self._http = http self._client = client - self._logger = logging.getLogger('osmclient') - self._apiName = '/nsilcm' - self._apiVersion = '/v1' - self._apiResource = '/netslice_instances_content' - self._apiBase = '{}{}{}'.format(self._apiName, - self._apiVersion, self._apiResource) + self._logger = logging.getLogger("osmclient") + self._apiName = "/nsilcm" + self._apiVersion = "/v1" + self._apiResource = "/netslice_instances_content" + self._apiBase = "{}{}{}".format( + self._apiName, self._apiVersion, self._apiResource + ) # NSI '--wait' option def _wait(self, id, wait_time, deleteFlag=False): self._logger.debug("") self._client.get_token() # Endpoint to get operation status - apiUrlStatus = '{}{}{}'.format(self._apiName, self._apiVersion, '/nsi_lcm_op_occs') + apiUrlStatus = "{}{}{}".format( + self._apiName, self._apiVersion, "/nsi_lcm_op_occs" + ) # Wait for status for NSI instance creation/update/deletion if isinstance(wait_time, bool): wait_time = WaitForStatus.TIMEOUT_NSI_OPERATION WaitForStatus.wait_for_status( - 'NSI', + "NSI", str(id), wait_time, apiUrlStatus, self._http.get2_cmd, - deleteFlag=deleteFlag) + deleteFlag=deleteFlag, + ) def list(self, filter=None): - """Returns a list of NSI - """ + """Returns a list of NSI""" self._logger.debug("") self._client.get_token() - filter_string = '' + filter_string = "" if filter: - filter_string = '?{}'.format(filter) - _, resp = self._http.get2_cmd('{}{}'.format(self._apiBase,filter_string)) + filter_string = "?{}".format(filter) + _, resp = self._http.get2_cmd("{}{}".format(self._apiBase, filter_string)) if resp: return json.loads(resp) return list() def get(self, name): - """Returns an NSI based on name or id - """ + """Returns an NSI based on name or id""" self._logger.debug("") self._client.get_token() if utils.validate_uuid4(name): for nsi in self.list(): - if name == nsi['_id']: + if name == nsi["_id"]: return nsi else: for nsi in self.list(): - if name == nsi['name']: + if name == nsi["name"]: return nsi raise NotFound("nsi {} not found".format(name)) @@ -90,13 +91,13 @@ class Nsi(object): self._client.get_token() if not utils.validate_uuid4(name): for nsi in self.list(): - if name == nsi['name']: - nsi_id = nsi['_id'] + if name == nsi["name"]: + nsi_id = nsi["_id"] break try: - _, resp = self._http.get2_cmd('{}/{}'.format(self._apiBase, nsi_id)) - #resp = self._http.get_cmd('{}/{}/nsd_content'.format(self._apiBase, nsi_id)) - #print(yaml.safe_dump(resp)) + _, resp = self._http.get2_cmd("{}/{}".format(self._apiBase, nsi_id)) + # resp = self._http.get_cmd('{}/{}/nsd_content'.format(self._apiBase, nsi_id)) + # print(yaml.safe_dump(resp)) if resp: return json.loads(resp) except NotFound: @@ -106,11 +107,12 @@ class Nsi(object): def delete(self, name, force=False, wait=False): self._logger.debug("") nsi = self.get(name) - querystring = '' + querystring = "" if force: - querystring = '?FORCE=True' - http_code, resp = self._http.delete_cmd('{}/{}{}'.format(self._apiBase, - nsi['_id'], querystring)) + querystring = "?FORCE=True" + http_code, resp = self._http.delete_cmd( + "{}/{}{}".format(self._apiBase, nsi["_id"], querystring) + ) # print('HTTP CODE: {}'.format(http_code)) # print('RESP: {}'.format(resp)) if http_code == 202: @@ -118,11 +120,11 @@ class Nsi(object): resp = json.loads(resp) # Wait for status for NSI instance deletion # For the 'delete' operation, '_id' is used - self._wait(resp.get('_id'), wait, deleteFlag=True) + self._wait(resp.get("_id"), wait, deleteFlag=True) else: - print('Deletion in progress') + print("Deletion in progress") elif http_code == 204: - print('Deleted') + print("Deleted") else: msg = resp or "" # if resp: @@ -132,9 +134,17 @@ class Nsi(object): # msg = resp raise ClientException("failed to delete nsi {} - {}".format(name, msg)) - def create(self, nst_name, nsi_name, account, config=None, - ssh_keys=None, description='default description', - admin_status='ENABLED', wait=False): + def create( + self, + nst_name, + nsi_name, + account, + config=None, + ssh_keys=None, + description="default description", + admin_status="ENABLED", + wait=False, + ): self._logger.debug("") self._client.get_token() @@ -150,17 +160,17 @@ class Nsi(object): vim = self._client.vim.get(vim_account) if vim is None: raise NotFound("cannot find vim account '{}'".format(vim_account)) - vim_account_id[vim_account] = vim['_id'] - return vim['_id'] + vim_account_id[vim_account] = vim["_id"] + return vim["_id"] nsi = {} - nsi['nstId'] = nst['_id'] - nsi['nsiName'] = nsi_name - nsi['nsiDescription'] = description - nsi['vimAccountId'] = get_vim_account_id(account) - #nsi['userdata'] = {} - #nsi['userdata']['key1']='value1' - #nsi['userdata']['key2']='value2' + nsi["nstId"] = nst["_id"] + nsi["nsiName"] = nsi_name + nsi["nsiDescription"] = description + nsi["vimAccountId"] = get_vim_account_id(account) + # nsi['userdata'] = {} + # nsi['userdata']['key1']='value1' + # nsi['userdata']['key2']='value2' if ssh_keys is not None: # ssh_keys is comma separate list @@ -169,10 +179,10 @@ class Nsi(object): # ssh_keys_format.append({'key-pair-ref': key}) # # ns['ssh-authorized-key'] = ssh_keys_format - nsi['ssh_keys'] = [] - for pubkeyfile in ssh_keys.split(','): - with open(pubkeyfile, 'r') as f: - nsi['ssh_keys'].append(f.read()) + nsi["ssh_keys"] = [] + for pubkeyfile in ssh_keys.split(","): + with open(pubkeyfile, "r") as f: + nsi["ssh_keys"].append(f.read()) if config: nsi_config = yaml.safe_load(config) if "netslice-vld" in nsi_config: @@ -180,8 +190,12 @@ class Nsi(object): if vld.get("vim-network-name"): if isinstance(vld["vim-network-name"], dict): vim_network_name_dict = {} - for vim_account, vim_net in list(vld["vim-network-name"].items()): - vim_network_name_dict[get_vim_account_id(vim_account)] = vim_net + for vim_account, vim_net in list( + vld["vim-network-name"].items() + ): + vim_network_name_dict[ + get_vim_account_id(vim_account) + ] = vim_net vld["vim-network-name"] = vim_network_name_dict nsi["netslice-vld"] = nsi_config["netslice-vld"] if "netslice-subnet" in nsi_config: @@ -191,60 +205,83 @@ class Nsi(object): if vld.get("vim-network-name"): if isinstance(vld["vim-network-name"], dict): vim_network_name_dict = {} - for vim_account, vim_net in list(vld["vim-network-name"].items()): - vim_network_name_dict[get_vim_account_id(vim_account)] = vim_net + for vim_account, vim_net in list( + vld["vim-network-name"].items() + ): + vim_network_name_dict[ + get_vim_account_id(vim_account) + ] = vim_net vld["vim-network-name"] = vim_network_name_dict if "vnf" in nssubnet: for vnf in nssubnet["vnf"]: if vnf.get("vim_account"): - vnf["vimAccountId"] = get_vim_account_id(vnf.pop("vim_account")) + vnf["vimAccountId"] = get_vim_account_id( + vnf.pop("vim_account") + ) nsi["netslice-subnet"] = nsi_config["netslice-subnet"] if "additionalParamsForNsi" in nsi_config: nsi["additionalParamsForNsi"] = nsi_config.pop("additionalParamsForNsi") if not isinstance(nsi["additionalParamsForNsi"], dict): - raise ValueError("Error at --config 'additionalParamsForNsi' must be a dictionary") + raise ValueError( + "Error at --config 'additionalParamsForNsi' must be a dictionary" + ) if "additionalParamsForSubnet" in nsi_config: - nsi["additionalParamsForSubnet"] = nsi_config.pop("additionalParamsForSubnet") + nsi["additionalParamsForSubnet"] = nsi_config.pop( + "additionalParamsForSubnet" + ) if not isinstance(nsi["additionalParamsForSubnet"], list): - raise ValueError("Error at --config 'additionalParamsForSubnet' must be a list") + raise ValueError( + "Error at --config 'additionalParamsForSubnet' must be a list" + ) for additional_param_subnet in nsi["additionalParamsForSubnet"]: if not isinstance(additional_param_subnet, dict): - raise ValueError("Error at --config 'additionalParamsForSubnet' items must be dictionaries") + raise ValueError( + "Error at --config 'additionalParamsForSubnet' items must be dictionaries" + ) if not additional_param_subnet.get("id"): - raise ValueError("Error at --config 'additionalParamsForSubnet' items must contain subnet 'id'") - if not additional_param_subnet.get("additionalParamsForNs") and\ - not additional_param_subnet.get("additionalParamsForVnf"): - raise ValueError("Error at --config 'additionalParamsForSubnet' items must contain " - "'additionalParamsForNs' and/or 'additionalParamsForVnf'") + raise ValueError( + "Error at --config 'additionalParamsForSubnet' items must contain subnet 'id'" + ) + if not additional_param_subnet.get( + "additionalParamsForNs" + ) and not additional_param_subnet.get("additionalParamsForVnf"): + raise ValueError( + "Error at --config 'additionalParamsForSubnet' items must contain " + "'additionalParamsForNs' and/or 'additionalParamsForVnf'" + ) if "timeout_nsi_deploy" in nsi_config: nsi["timeout_nsi_deploy"] = nsi_config.pop("timeout_nsi_deploy") # print(yaml.safe_dump(nsi)) try: - self._apiResource = '/netslice_instances_content' - self._apiBase = '{}{}{}'.format(self._apiName, - self._apiVersion, self._apiResource) + self._apiResource = "/netslice_instances_content" + self._apiBase = "{}{}{}".format( + self._apiName, self._apiVersion, self._apiResource + ) headers = self._client._headers - headers['Content-Type'] = 'application/yaml' - http_header = ['{}: {}'.format(key,val) - for (key,val) in list(headers.items())] + headers["Content-Type"] = "application/yaml" + http_header = [ + "{}: {}".format(key, val) for (key, val) in list(headers.items()) + ] self._http.set_http_header(http_header) - http_code, resp = self._http.post_cmd(endpoint=self._apiBase, - postfields_dict=nsi) - #print('HTTP CODE: {}'.format(http_code)) - #print('RESP: {}'.format(resp)) - #if http_code in (200, 201, 202, 204): + http_code, resp = self._http.post_cmd( + endpoint=self._apiBase, postfields_dict=nsi + ) + # print('HTTP CODE: {}'.format(http_code)) + # print('RESP: {}'.format(resp)) + # if http_code in (200, 201, 202, 204): if resp: resp = json.loads(resp) - if not resp or 'id' not in resp: - raise ClientException('unexpected response from server - {} '.format( - resp)) + if not resp or "id" not in resp: + raise ClientException( + "unexpected response from server - {} ".format(resp) + ) if wait: # Wait for status for NSI instance creation - self._wait(resp.get('nsilcmop_id'), wait) - print(resp['id']) - #else: + self._wait(resp.get("nsilcmop_id"), wait) + print(resp["id"]) + # else: # msg = "" # if resp: # try: @@ -253,36 +290,37 @@ class Nsi(object): # msg = resp # raise ClientException(msg) except ClientException as exc: - message="failed to create nsi: {} nst: {}\nerror:\n{}".format( - nsi_name, - nst_name, - str(exc)) + message = "failed to create nsi: {} nst: {}\nerror:\n{}".format( + nsi_name, nst_name, str(exc) + ) raise ClientException(message) def list_op(self, name, filter=None): - """Returns the list of operations of a NSI - """ + """Returns the list of operations of a NSI""" self._logger.debug("") nsi = self.get(name) try: - self._apiResource = '/nsi_lcm_op_occs' - self._apiBase = '{}{}{}'.format(self._apiName, - self._apiVersion, self._apiResource) - filter_string = '' + self._apiResource = "/nsi_lcm_op_occs" + self._apiBase = "{}{}{}".format( + self._apiName, self._apiVersion, self._apiResource + ) + filter_string = "" if filter: - filter_string = '&{}'.format(filter) - http_code, resp = self._http.get2_cmd('{}?netsliceInstanceId={}{}'.format( - self._apiBase, nsi['_id'], - filter_string) ) - #print('HTTP CODE: {}'.format(http_code)) - #print('RESP: {}'.format(resp)) - #if http_code == 200: + filter_string = "&{}".format(filter) + http_code, resp = self._http.get2_cmd( + "{}?netsliceInstanceId={}{}".format( + self._apiBase, nsi["_id"], filter_string + ) + ) + # print('HTTP CODE: {}'.format(http_code)) + # print('RESP: {}'.format(resp)) + # if http_code == 200: if resp: resp = json.loads(resp) return resp else: - raise ClientException('unexpected response from server') - #else: + raise ClientException("unexpected response from server") + # else: # msg = "" # if resp: # try: @@ -292,30 +330,32 @@ class Nsi(object): # msg = resp # raise ClientException(msg) except ClientException as exc: - message="failed to get operation list of NSI {}:\nerror:\n{}".format( - name, - str(exc)) + message = "failed to get operation list of NSI {}:\nerror:\n{}".format( + name, str(exc) + ) raise ClientException(message) def get_op(self, operationId): - """Returns the status of an operation - """ + """Returns the status of an operation""" self._logger.debug("") self._client.get_token() try: - self._apiResource = '/nsi_lcm_op_occs' - self._apiBase = '{}{}{}'.format(self._apiName, - self._apiVersion, self._apiResource) - http_code, resp = self._http.get2_cmd('{}/{}'.format(self._apiBase, operationId)) - #print('HTTP CODE: {}'.format(http_code)) - #print('RESP: {}'.format(resp)) - #if http_code == 200: + self._apiResource = "/nsi_lcm_op_occs" + self._apiBase = "{}{}{}".format( + self._apiName, self._apiVersion, self._apiResource + ) + http_code, resp = self._http.get2_cmd( + "{}/{}".format(self._apiBase, operationId) + ) + # print('HTTP CODE: {}'.format(http_code)) + # print('RESP: {}'.format(resp)) + # if http_code == 200: if resp: resp = json.loads(resp) return resp else: - raise ClientException('unexpected response from server') - #else: + raise ClientException("unexpected response from server") + # else: # msg = "" # if resp: # try: @@ -325,34 +365,37 @@ class Nsi(object): # msg = resp # raise ClientException(msg) except ClientException as exc: - message="failed to get status of operation {}:\nerror:\n{}".format( - operationId, - str(exc)) + message = "failed to get status of operation {}:\nerror:\n{}".format( + operationId, str(exc) + ) raise ClientException(message) def exec_op(self, name, op_name, op_data=None): - """Executes an operation on a NSI - """ + """Executes an operation on a NSI""" self._logger.debug("") nsi = self.get(name) try: - self._apiResource = '/netslice_instances' - self._apiBase = '{}{}{}'.format(self._apiName, - self._apiVersion, self._apiResource) - endpoint = '{}/{}/{}'.format(self._apiBase, nsi['_id'], op_name) - #print('OP_NAME: {}'.format(op_name)) - #print('OP_DATA: {}'.format(json.dumps(op_data))) - http_code, resp = self._http.post_cmd(endpoint=endpoint, postfields_dict=op_data) - #print('HTTP CODE: {}'.format(http_code)) - #print('RESP: {}'.format(resp)) - #if http_code in (200, 201, 202, 204): + self._apiResource = "/netslice_instances" + self._apiBase = "{}{}{}".format( + self._apiName, self._apiVersion, self._apiResource + ) + endpoint = "{}/{}/{}".format(self._apiBase, nsi["_id"], op_name) + # print('OP_NAME: {}'.format(op_name)) + # print('OP_DATA: {}'.format(json.dumps(op_data))) + http_code, resp = self._http.post_cmd( + endpoint=endpoint, postfields_dict=op_data + ) + # print('HTTP CODE: {}'.format(http_code)) + # print('RESP: {}'.format(resp)) + # if http_code in (200, 201, 202, 204): if resp: resp = json.loads(resp) - if not resp or 'id' not in resp: - raise ClientException('unexpected response from server - {}'.format( - resp)) - print(resp['id']) - #else: + if not resp or "id" not in resp: + raise ClientException( + "unexpected response from server - {}".format(resp) + ) + print(resp["id"]) + # else: # msg = "" # if resp: # try: @@ -361,8 +404,5 @@ class Nsi(object): # msg = resp # raise ClientException(msg) except ClientException as exc: - message="failed to exec operation {}:\nerror:\n{}".format( - name, - str(exc)) + message = "failed to exec operation {}:\nerror:\n{}".format(name, str(exc)) raise ClientException(message) -