)
# NS '--wait' option
- def _wait(self, op_id, wait_time, delete_flag=False):
+ def _wait(self, id, wait_time, deleteFlag=False):
self._logger.debug("")
# Endpoint to get operation status
apiUrlStatus = "{}{}{}".format(
wait_time = WaitForStatus.TIMEOUT_NS_OPERATION
WaitForStatus.wait_for_status(
"NS",
- str(op_id),
+ str(id),
wait_time,
apiUrlStatus,
self._http.get2_cmd,
- deleteFlag=delete_flag,
+ deleteFlag=deleteFlag,
)
def list(self, filter=None):
:param config: parameters of deletion, as:
autoremove: Bool (default True)
timeout_ns_terminate: int
- skip_terminate_primitives: Bool (default False) to not exec termination primitives
+ skip_terminate_primitives: Bool (default False) to not exec the terminate primitives
:param wait: Make synchronous. Wait until deletion is completed:
False to not wait (by default), True to wait a standard time, or int (time to wait)
:return: None. Exception if fail
if wait and resp:
resp = json.loads(resp)
# For the 'delete' operation, '_id' is used
- self._wait(resp.get("_id"), wait, delete_flag=True)
+ self._wait(resp.get("_id"), wait, deleteFlag=True)
else:
print("Deletion in progress")
elif http_code == 204:
print("Deleted")
else:
msg = resp or ""
+ # if resp:
+ # try:
+ # msg = json.loads(resp)
+ # except ValueError:
+ # msg = resp
raise ClientException("failed to delete ns {} - {}".format(name, msg))
- def _get_vim_account_id(self, vim_account: str, vim_account_dict: dict) -> str:
- """Get VIM account ID.
- Args:
- vim_account (str): VIM account id as string
- vim_account_dict (dict): A dictionary which includes vim account id
-
- Returns:
- vim_id (str): VIM account id as string
-
- Raises:
- NotFound Exception
- """
- self._logger.debug("")
- if vim_account_dict.get(vim_account):
- return vim_account_dict[vim_account]
- vim = self._client.vim.get(vim_account)
- if vim is None:
- raise NotFound("cannot find vim account '{}'".format(vim_account))
- vim_account_dict[vim_account] = vim["_id"]
- return vim["_id"]
-
- def _get_wim_account_id(self, wim_account: str, wim_account_dict: dict) -> str:
- """Get WIM account ID.
- Args:
- wim_account (str): WIM account id as string
- wim_account_dict (dict): A dictionary which includes wim account id
-
- Returns:
- wim_id (str): WIM account id as string
-
- Raises:
- NotFound Exception
- """
- self._logger.debug("")
- # wim_account can be False (boolean) to indicate not use wim account
- if not isinstance(wim_account, str):
- return wim_account
- if wim_account_dict.get(wim_account):
- return wim_account_dict[wim_account]
- wim = self._client.wim.get(wim_account)
- if wim is None:
- raise NotFound("cannot find wim account '{}'".format(wim_account))
- wim_account_dict[wim_account] = wim["_id"]
- return wim["_id"]
-
- def _get_paas_account_id(self, paas_account: str) -> str:
- """Get PaaS account ID.
- Args:
- paas_account (str): PaaS account id as string
-
- Returns:
- paas_id (str): PaaS account id as string
-
- Raises:
- NotFound Exception
- """
- self._logger.debug("")
- paas = self._client.paas.get(paas_account)
- if paas is None:
- raise NotFound("cannot find PaaS account '{}'".format(paas_account))
- return paas["_id"]
-
- def _update_vnf_in_ns_config(self, ns_config: dict, vim_account_dict: dict) -> dict:
- """Update vnf field in ns_config.
- Args:
- ns_config (dict): NS config dictionary which includes additional params
- vim_account_dict (dict): A dictionary which includes vim account id
-
- Returns:
- ns (dict): NS dictionary
- """
- if "vnf" in ns_config:
- for vnf in ns_config["vnf"]:
- if vnf.get("vim_account"):
- vnf["vimAccountId"] = self._get_vim_account_id(
- vnf.pop("vim_account"), vim_account_dict
- )
- return ns_config
-
- def _update_wim_account_in_ns(
- self, ns_config: dict, wim_account_dict: dict, ns: dict
- ) -> dict:
- """Update WIM_account in NS dictionary.
- Args:
- ns_config (dict): NS config dictionary which includes additional params
- wim_account_dict (dict): A dictionary which includes wim account id
- ns (dict): NS dictionary which includes ns_id, ns_name, description etc.
-
- Returns:
- ns (dict): NS dictionary
- """
- if "wim_account" in ns_config:
- wim_account = ns_config.pop("wim_account")
- if wim_account is not None:
- ns["wimAccountId"] = self._get_wim_account_id(
- wim_account, wim_account_dict
- )
- return ns
-
- def _update_vld_in_ns_config(
- self, ns_config: dict, vim_account_dict: dict, wim_account_dict: dict
- ) -> dict:
- """Validating the additionalParamsForNs and additionalParamsForVnf in ns_config.
-
- Args:
- ns_config (dict): NS config dictionary which includes additional params
- vim_account_dict (dict): A dictionary which includes vim account id
- wim_account_dict (dict): A dictionary which includes wim account id
-
- Returns:
- ns_config (dict): NS config dictionary which includes additional params
-
- Raises:
- ClientException
- """
- if "vld" in ns_config:
- if not isinstance(ns_config["vld"], list):
- raise ClientException(
- "Error at --config 'vld' must be a list of dictionaries"
- )
- for vld in ns_config["vld"]:
- if not isinstance(vld, dict):
- raise ClientException(
- "Error at --config 'vld' must be a list of dictionaries"
- )
- if vld.get("vim-network-name"):
- if isinstance(vld["vim-network-name"], dict):
- vim_network_name_dict = {}
- for vim_account, vim_net in vld["vim-network-name"].items():
- vim_network_name_dict[
- self._get_vim_account_id(vim_account, vim_account_dict)
- ] = vim_net
- vld["vim-network-name"] = vim_network_name_dict
- if "wim_account" in vld and vld["wim_account"] is not None:
- vld["wimAccountId"] = self._get_wim_account_id(
- vld.pop("wim_account"), wim_account_dict
- )
- return ns_config
-
- def _validate_additional_params_in_ns_config(self, ns_config: dict) -> None:
- """Validating the additionalParamsForNs and additionalParamsForVnf in ns_config.
- Args:
- ns_config (dict): NS config dictionary which includes additional params
-
- Raises:
- ClientException
- """
- if "additionalParamsForNs" in ns_config:
- if not isinstance(ns_config["additionalParamsForNs"], dict):
- raise ClientException(
- "Error at --config 'additionalParamsForNs' must be a dictionary"
- )
- if "additionalParamsForVnf" in ns_config:
- if not isinstance(ns_config["additionalParamsForVnf"], list):
- raise ClientException(
- "Error at --config 'additionalParamsForVnf' must be a list"
- )
- for additional_param_vnf in ns_config["additionalParamsForVnf"]:
- if not isinstance(additional_param_vnf, dict):
- raise ClientException(
- "Error at --config 'additionalParamsForVnf' items must be dictionaries"
- )
- if not additional_param_vnf.get("member-vnf-index"):
- raise ClientException(
- "Error at --config 'additionalParamsForVnf' items must contain "
- "'member-vnf-index'"
- )
-
- def process_ns_create_with_vim_account(
+ def create(
self,
- vim_account: str,
- nsd: dict,
- nsr_name: str,
- description: str,
- config: dict = None,
- ssh_keys: str = None,
- timeout: int = None,
- ) -> dict:
- """Process NS create request which includes VIM Account.
- Args:
- vim_account (str): VIM Account id as string
- nsd (dict): A dictionary which includes network service description
- nsr_name (str): Network service record name
- description (str): Service description
- config (dict): Placeholder for additional configuration
- ssh_keys (str): ssh-key file
- timeout (int): Max time to wait (seconds)
-
- Returns:
- ns (dict): Payload for ns create request
+ nsd_name,
+ nsr_name,
+ account,
+ config=None,
+ ssh_keys=None,
+ description="default description",
+ admin_status="ENABLED",
+ wait=False,
+ timeout=None,
+ ):
+ self._logger.debug("")
+ self._client.get_token()
+ nsd = self._client.nsd.get(nsd_name)
- Raises:
- ClientException
- """
- vim_account_dict = {}
- wim_account_dict = {}
- vim_id = self._get_vim_account_id(vim_account, vim_account_dict)
- ns = {
- "nsdId": nsd["_id"],
- "nsName": nsr_name,
- "nsDescription": description,
- "vimAccountId": vim_id,
- }
+ vim_account_id = {}
+ wim_account_id = {}
+
+ def get_vim_account_id(vim_account):
+ self._logger.debug("")
+ if vim_account_id.get(vim_account):
+ return vim_account_id[vim_account]
+ 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"]
+
+ def get_wim_account_id(wim_account):
+ self._logger.debug("")
+ # wim_account can be False (boolean) to indicate not use wim account
+ if not isinstance(wim_account, str):
+ return wim_account
+ if wim_account_id.get(wim_account):
+ return wim_account_id[wim_account]
+ wim = self._client.wim.get(wim_account)
+ if wim is None:
+ raise NotFound("cannot find wim account '{}'".format(wim_account))
+ wim_account_id[wim_account] = wim["_id"]
+ return wim["_id"]
+
+ vim_id = get_vim_account_id(account)
+ ns = {}
+ ns["nsdId"] = nsd["_id"]
+ ns["nsName"] = nsr_name
+ ns["nsDescription"] = description
+ ns["vimAccountId"] = vim_id
+ # ns['userdata'] = {}
+ # ns['userdata']['key1']='value1'
+ # ns['userdata']['key2']='value2'
if ssh_keys is not None:
ns["ssh_keys"] = []
for pubkeyfile in ssh_keys.split(","):
with open(pubkeyfile, "r") as f:
ns["ssh_keys"].append(f.read())
-
if timeout:
ns["timeout_ns_deploy"] = timeout
-
if config:
ns_config = yaml.safe_load(config)
if "vim-network-name" in ns_config:
ns_config["vld"] = ns_config.pop("vim-network-name")
-
- ns_config = self._update_vld_in_ns_config(
- ns_config, vim_account_dict, wim_account_dict
- )
- ns_config = self._update_vnf_in_ns_config(ns_config, vim_account_dict)
- self._validate_additional_params_in_ns_config(ns_config)
- ns = self._update_wim_account_in_ns(ns_config, vim_account_dict, ns)
- ns.update(ns_config)
-
- return ns
-
- def process_ns_create_with_paas_account(
- self,
- paas_account: str,
- nsd: dict,
- nsr_name: str,
- description: str,
- config: dict = None,
- timeout: int = None,
- ) -> dict:
- """Process NS create request which includes PaaS Account.
- Args:
- paas_account (str): PaaS Account id as string
- nsd (dict): A dictionary which includes network service description
- nsr_name (str): Network service record name
- description (str): Service description
- config (dict): Placeholder for additional configuration
- timeout (int): Max time to wait (seconds)
-
- Returns:
- ns (dict): Payload for ns create request
-
- Raises:
- ClientException
- """
- paas_id = self._get_paas_account_id(paas_account)
- ns = {
- "nsdId": nsd["_id"],
- "nsName": nsr_name,
- "nsDescription": description,
- "paasAccountId": paas_id,
- }
-
- if timeout:
- ns["timeout_ns_deploy"] = timeout
-
- if config:
- ns_config = yaml.safe_load(config)
- self._validate_additional_params_in_ns_config(ns_config)
+ if "vld" in ns_config:
+ if not isinstance(ns_config["vld"], list):
+ raise ClientException(
+ "Error at --config 'vld' must be a list of dictionaries"
+ )
+ for vld in ns_config["vld"]:
+ if not isinstance(vld, dict):
+ raise ClientException(
+ "Error at --config 'vld' must be a list of dictionaries"
+ )
+ if vld.get("vim-network-name"):
+ if isinstance(vld["vim-network-name"], dict):
+ vim_network_name_dict = {}
+ for vim_account, vim_net in 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 "wim_account" in vld and vld["wim_account"] is not None:
+ vld["wimAccountId"] = get_wim_account_id(vld.pop("wim_account"))
+ if "vnf" in ns_config:
+ for vnf in ns_config["vnf"]:
+ if vnf.get("vim_account"):
+ vnf["vimAccountId"] = get_vim_account_id(vnf.pop("vim_account"))
+
+ if "additionalParamsForNs" in ns_config:
+ if not isinstance(ns_config["additionalParamsForNs"], dict):
+ raise ClientException(
+ "Error at --config 'additionalParamsForNs' must be a dictionary"
+ )
+ if "additionalParamsForVnf" in ns_config:
+ if not isinstance(ns_config["additionalParamsForVnf"], list):
+ raise ClientException(
+ "Error at --config 'additionalParamsForVnf' must be a list"
+ )
+ for additional_param_vnf in ns_config["additionalParamsForVnf"]:
+ if not isinstance(additional_param_vnf, dict):
+ raise ClientException(
+ "Error at --config 'additionalParamsForVnf' items must be dictionaries"
+ )
+ if not additional_param_vnf.get("member-vnf-index"):
+ raise ClientException(
+ "Error at --config 'additionalParamsForVnf' items must contain "
+ "'member-vnf-index'"
+ )
+ if "wim_account" in ns_config:
+ wim_account = ns_config.pop("wim_account")
+ if wim_account is not None:
+ ns["wimAccountId"] = get_wim_account_id(wim_account)
+ # rest of parameters without any transformation or checking
+ # "timeout_ns_deploy"
+ # "placement-engine"
ns.update(ns_config)
- return ns
-
- def create(
- self,
- nsd_name: dict,
- nsr_name: str,
- vim_account: str = None,
- paas_account: str = None,
- config: dict = None,
- ssh_keys: str = None,
- description: str = "default description",
- admin_status: str = "ENABLED",
- wait: bool = False,
- timeout: int = None,
- ) -> str:
- """NS create request which includes PaaS Account or VIM account.
- Args:
- nsd_name (dict): A dictionary which includes network service description
- nsr_name (str): Network service record name
- vim_account (str): VIM account ID as string
- paas_account (str): PaaS Account id as string
- config (dict): Placeholder for additional configuration
- ssh_keys (str): ssh-key file
- description (str): Service description
- admin_status (str): Administration Status
- wait (Boolean): True or False
- timeout (int): Max time to wait (seconds)
-
- Returns:
- response id (str): Response ID
-
- Raises:
- ClientException
- """
- self._logger.debug("")
-
- if not (vim_account or paas_account):
- raise ClientException(
- "Both of vim_account and paas_account options are empty."
- )
-
- if vim_account and paas_account:
- raise ClientException(
- "Both of vim_account and paas_account options are set."
- )
-
- self._client.get_token()
- nsd = self._client.nsd.get(nsd_name)
-
- if vim_account:
- # VIM account is provided as input parameter.
- ns = self.process_ns_create_with_vim_account(
- vim_account,
- nsd,
- nsr_name,
- description,
- config=config,
- ssh_keys=ssh_keys,
- timeout=timeout,
- )
-
- elif paas_account:
- # PaaS account is provided as input parameter.
- ns = self.process_ns_create_with_paas_account(
- paas_account, nsd, nsr_name, description, config=config, timeout=timeout
- )
-
+ # print(yaml.safe_dump(ns))
try:
self._apiResource = "/ns_instances_content"
self._apiBase = "{}{}{}".format(
http_code, resp = self._http.post_cmd(
endpoint=self._apiBase, postfields_dict=ns
)
-
+ # 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 resp:
- resp = json.loads(resp)
- print(str(resp["id"]))
if wait:
# Wait for status for NS instance creation
self._wait(resp.get("nslcmop_id"), wait)
-
+ print(resp["id"])
return resp["id"]
-
+ # else:
+ # msg = ""
+ # if resp:
+ # try:
+ # msg = json.loads(resp)
+ # except ValueError:
+ # msg = resp
+ # raise ClientException(msg)
except ClientException as exc:
message = "failed to create ns: {} nsd: {}\nerror:\n{}".format(
nsr_name, nsd_name, str(exc)