Fix bug 1392 package-create update with sol006 templates for VNFD and NSD
[osm/osmclient.git] / osmclient / scripts / osm.py
index feb8c2f..dd89b9d 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
@@ -3770,6 +3826,14 @@ def sdnc_show(ctx, name):
     default="kube-system",
     help="namespace to be used for its operation, defaults to `kube-system`",
 )
+@click.option(
+    "--wait",
+    required=False,
+    default=False,
+    is_flag=True,
+    help="do not return the control immediately, but keep it "
+    "until the operation is completed, or timeout",
+)
 @click.option(
     "--cni",
     default=None,
@@ -3783,7 +3847,7 @@ def sdnc_show(ctx, name):
 #              help='do not return the control immediately, but keep it until the operation is completed, or timeout')
 @click.pass_context
 def k8scluster_add(
-    ctx, name, creds, version, vim, k8s_nets, description, namespace, cni
+    ctx, name, creds, version, vim, k8s_nets, description, namespace, wait, cni
 ):
     """adds a K8s cluster to OSM
 
@@ -3804,7 +3868,7 @@ def k8scluster_add(
         cluster["namespace"] = namespace
     if cni:
         cluster["cni"] = yaml.safe_load(cni)
-    ctx.obj.k8scluster.create(name, cluster)
+    ctx.obj.k8scluster.create(name, cluster, wait)
     # except ClientException as e:
     #     print(str(e))
     #     exit(1)
@@ -3826,12 +3890,20 @@ def k8scluster_add(
     "--namespace",
     help="namespace to be used for its operation, defaults to `kube-system`",
 )
+@click.option(
+    "--wait",
+    required=False,
+    default=False,
+    is_flag=True,
+    help="do not return the control immediately, but keep it "
+    "until the operation is completed, or timeout",
+)
 @click.option(
     "--cni", help="list of CNI plugins, in JSON inline format, used in the cluster"
 )
 @click.pass_context
 def k8scluster_update(
-    ctx, name, newname, creds, version, vim, k8s_nets, description, namespace, cni
+    ctx, name, newname, creds, version, vim, k8s_nets, description, namespace, wait, cni
 ):
     """updates a K8s cluster
 
@@ -3857,7 +3929,7 @@ def k8scluster_update(
         cluster["namespace"] = namespace
     if cni:
         cluster["cni"] = yaml.safe_load(cni)
-    ctx.obj.k8scluster.update(name, cluster)
+    ctx.obj.k8scluster.update(name, cluster, wait)
     # except ClientException as e:
     #     print(str(e))
     #     exit(1)
@@ -3868,18 +3940,23 @@ def k8scluster_update(
 @click.option(
     "--force", is_flag=True, help="forces the deletion from the DB (not recommended)"
 )
-# @click.option('--wait',
-#              is_flag=True,
-#              help='do not return the control immediately, but keep it until the operation is completed, or timeout')
+@click.option(
+    "--wait",
+    required=False,
+    default=False,
+    is_flag=True,
+    help="do not return the control immediately, but keep it "
+    "until the operation is completed, or timeout",
+)
 @click.pass_context
-def k8scluster_delete(ctx, name, force):
+def k8scluster_delete(ctx, name, force, wait):
     """deletes a K8s cluster
 
     NAME: name or ID of the K8s cluster to be deleted
     """
     # try:
     check_client_version(ctx.obj, ctx.command.name)
-    ctx.obj.k8scluster.delete(name, force=force)
+    ctx.obj.k8scluster.delete(name, force, wait)
     # except ClientException as e:
     #     print(str(e))
     #     exit(1)
@@ -5695,6 +5772,9 @@ def role_show(ctx, name):
 @click.option(
     "--netslice-vlds", default=1, help="(NST) Number of netslice vlds. Default 1"
 )
+@click.option(
+    "--old", default=False, is_flag=True, help="Flag to create a descriptor using the previous OSM format (pre SOL006, OSM<9)"
+)
 @click.pass_context
 def package_create(
     ctx,
@@ -5712,6 +5792,7 @@ def package_create(
     detailed,
     netslice_subnets,
     netslice_vlds,
+    old,
 ):
     """
     Creates an OSM NS, VNF, NST package
@@ -5744,6 +5825,7 @@ def package_create(
         detailed=detailed,
         netslice_subnets=netslice_subnets,
         netslice_vlds=netslice_vlds,
+        old=old,
     )
     print(resp)
     # except ClientException as inst: