Improved PDU management 33/11033/6
authorAntonio Marsico <antonio.marsico@bt.com>
Wed, 23 Jun 2021 22:19:36 +0000 (23:19 +0100)
committerAntonio Marsico <antonio.marsico@bt.com>
Tue, 29 Jun 2021 14:27:26 +0000 (16:27 +0200)
  * Fixing PDU update
  * Adding client option

Change-Id: If74a43f9696b720d62b49e6db93571cbfc9024a0
Signed-off-by: Antonio Marsico <antonio.marsico@bt.com>
osmclient/scripts/osm.py
osmclient/sol005/pdud.py

index feb8c2f..9ca159f 100755 (executable)
@@ -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_id_1> "
+    + "--vim_account <vim_account_id_2> ... --vim_account <vim_account_id_N>",
     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=<NAME>,mgmt=<true|false>,ip-address=<IP_ADDRESS>"
+    + "[,type=<overlay|underlay>][,mac-address=<MAC_ADDRESS>][,vim-network-name=<VIM_NET_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_id_1> "
+    + "--vim_account <vim_account_id_2> ... --vim_account <vim_account_id_N>",
+    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
index df5bad1..e47dadd 100644 (file)
@@ -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)