From 85c13fc77aa3cfed7ca1b0ed1dfb339dc300201c Mon Sep 17 00:00:00 2001 From: Antonio Marsico Date: Wed, 23 Jun 2021 23:19:36 +0100 Subject: [PATCH] Improved PDU management * Fixing PDU update * Adding client option Change-Id: If74a43f9696b720d62b49e6db93571cbfc9024a0 Signed-off-by: Antonio Marsico --- osmclient/scripts/osm.py | 104 ++++++++++++++++++++++++++++++--------- osmclient/sol005/pdud.py | 46 ++++++++++------- 2 files changed, 107 insertions(+), 43 deletions(-) diff --git a/osmclient/scripts/osm.py b/osmclient/scripts/osm.py index feb8c2f..9ca159f 100755 --- a/osmclient/scripts/osm.py +++ b/osmclient/scripts/osm.py @@ -2564,13 +2564,15 @@ def nsi_create2( @click.option("--description", help="human readable description") @click.option( "--vim_account", - help="list of VIM accounts (in the same VIM) that can reach this PDU", + help="list of VIM accounts (in the same VIM) that can reach this PDU\n" + + "The format for multiple VIMs is --vim_account " + + "--vim_account ... --vim_account ", multiple=True, ) @click.option( "--descriptor_file", default=None, - help="PDU descriptor file (as an alternative to using the other arguments", + help="PDU descriptor file (as an alternative to using the other arguments)", ) @click.pass_context def pdu_create( @@ -2578,26 +2580,84 @@ def pdu_create( ): """creates a new Physical Deployment Unit (PDU)""" logger.debug("") - # try: + check_client_version(ctx.obj, ctx.command.name) + + pdu = create_pdu_dictionary(name, pdu_type, interface, description, vim_account, descriptor_file) + ctx.obj.pdu.create(pdu) + + +######################## +# UPDATE PDU operation # +######################## + + +@cli_osm.command( + name="pdu-update", short_help="updates a Physical Deployment Unit to the catalog" +) +@click.argument("name") +@click.option("--newname", help="New name for the Physical Deployment Unit") +@click.option("--pdu_type", help="type of PDU (e.g. router, firewall, FW001)") +@click.option( + "--interface", + help="interface(s) of the PDU: name=,mgmt=,ip-address=" + + "[,type=][,mac-address=][,vim-network-name=]", + multiple=True, +) +@click.option("--description", help="human readable description") +@click.option( + "--vim_account", + help="list of VIM accounts (in the same VIM) that can reach this PDU\n" + + "The format for multiple VIMs is --vim_account " + + "--vim_account ... --vim_account ", + multiple=True, +) +@click.option( + "--descriptor_file", + default=None, + help="PDU descriptor file (as an alternative to using the other arguments)", +) +@click.pass_context +def pdu_update( + ctx, name, newname, pdu_type, interface, description, vim_account, descriptor_file +): + """Updates a new Physical Deployment Unit (PDU)""" + logger.debug("") + + check_client_version(ctx.obj, ctx.command.name) + + update = True + + if not newname: + newname = name + + pdu = create_pdu_dictionary(newname, pdu_type, interface, description, vim_account, descriptor_file, update) + ctx.obj.pdu.update(name, pdu) + + +def create_pdu_dictionary(name, pdu_type, interface, description, vim_account, descriptor_file, update=False): + + logger.debug("") pdu = {} + if not descriptor_file: - if not name: - raise ClientException( - 'in absence of descriptor file, option "--name" is mandatory' - ) - if not pdu_type: - raise ClientException( - 'in absence of descriptor file, option "--pdu_type" is mandatory' - ) - if not interface: - raise ClientException( - 'in absence of descriptor file, option "--interface" is mandatory (at least once)' - ) - if not vim_account: - raise ClientException( - 'in absence of descriptor file, option "--vim_account" is mandatory (at least once)' - ) + if not update: + if not name: + raise ClientException( + 'in absence of descriptor file, option "--name" is mandatory' + ) + if not pdu_type: + raise ClientException( + 'in absence of descriptor file, option "--pdu_type" is mandatory' + ) + if not interface: + raise ClientException( + 'in absence of descriptor file, option "--interface" is mandatory (at least once)' + ) + if not vim_account: + raise ClientException( + 'in absence of descriptor file, option "--vim_account" is mandatory (at least once)' + ) else: with open(descriptor_file, "r") as df: pdu = yaml.safe_load(df.read()) @@ -2616,11 +2676,7 @@ def pdu_create( new_iface["mgmt"] = new_iface.get("mgmt", "false").lower() == "true" ifaces_list.append(new_iface) pdu["interfaces"] = ifaces_list - ctx.obj.pdu.create(pdu) - # except ClientException as e: - # print(str(e)) - # exit(1) - + return pdu #################### # UPDATE operations diff --git a/osmclient/sol005/pdud.py b/osmclient/sol005/pdud.py index df5bad1..e47dadd 100644 --- a/osmclient/sol005/pdud.py +++ b/osmclient/sol005/pdud.py @@ -37,6 +37,12 @@ class Pdu(object): self._apiName, self._apiVersion, self._apiResource ) + def _get_vim_account(self, vim_account): + vim = self._client.vim.get(vim_account) + if vim is None: + raise NotFound("cannot find vim account '{}'".format(vim_account)) + return vim + def list(self, filter=None): self._logger.debug("") self._client.get_token() @@ -101,6 +107,14 @@ class Pdu(object): def create(self, pdu, update_endpoint=None): self._logger.debug("") + + if pdu["vim_accounts"]: + vim_account_list = [] + for vim_account in pdu["vim_accounts"]: + vim = self._get_vim_account(vim_account) + vim_account_list.append(vim["_id"]) + pdu["vim_accounts"] = vim_account_list + self._client.get_token() headers = self._client._headers headers["Content-Type"] = "application/yaml" @@ -109,7 +123,7 @@ class Pdu(object): ] self._http.set_http_header(http_header) if update_endpoint: - http_code, resp = self._http.put_cmd( + http_code, resp = self._http.patch_cmd( endpoint=update_endpoint, postfields_dict=pdu ) else: @@ -118,25 +132,19 @@ class Pdu(object): http_code, resp = self._http.post_cmd( endpoint=endpoint, postfields_dict=pdu ) - # 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: - # msg = "Error {}".format(http_code) - # if resp: - # try: - # msg = "{} - {}".format(msg, json.loads(resp)) - # except ValueError: - # msg = "{} - {}".format(msg, resp) - # raise ClientException("failed to create/update pdu - {}".format(msg)) + if http_code in (200, 201, 202): + 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"]) + elif http_code == 204: + print("Updated") - def update(self, name, filename): + def update(self, name, pdu): self._logger.debug("") pdud = self.get(name) endpoint = "{}/{}".format(self._apiBase, pdud["_id"]) - self.create(filename=filename, update_endpoint=endpoint) + self.create(pdu=pdu, update_endpoint=endpoint) -- 2.17.1