Improved PDU management
[osm/osmclient.git] / osmclient / scripts / osm.py
index 0ce20c4..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
@@ -4966,6 +5022,128 @@ def ns_metric_export(ctx, ns, vnf, vdu, metric, interval):
     #     exit(1)
 
 
+#################
+# Subscription operations
+#################
+
+
+@cli_osm.command(
+    name="subscription-create",
+    short_help="creates a new subscription to a specific event",
+)
+@click.option(
+    "--event_type",
+    # type=click.Choice(['ns', 'nspkg', 'vnfpkg'], case_sensitive=False))
+    type=click.Choice(["ns"], case_sensitive=False),
+    help="event type to be subscribed (for the moment, only ns is supported)",
+)
+@click.option("--event", default=None, help="specific yaml configuration for the event")
+@click.option(
+    "--event_file", default=None, help="specific yaml configuration file for the event"
+)
+@click.pass_context
+def subscription_create(ctx, event_type, event, event_file):
+    """creates a new subscription to a specific event"""
+    logger.debug("")
+    check_client_version(ctx.obj, ctx.command.name)
+    if event_file:
+        if event:
+            raise ClientException(
+                '"--event" option is incompatible with "--event_file" option'
+            )
+        with open(event_file, "r") as cf:
+            event = cf.read()
+    ctx.obj.subscription.create(event_type, event)
+
+
+@cli_osm.command(name="subscription-delete", short_help="deletes a subscription")
+@click.option(
+    "--event_type",
+    # type=click.Choice(['ns', 'nspkg', 'vnfpkg'], case_sensitive=False))
+    type=click.Choice(["ns"], case_sensitive=False),
+    help="event type to be subscribed (for the moment, only ns is supported)",
+)
+@click.argument("subscription_id")
+@click.option(
+    "--force", is_flag=True, help="forces the deletion bypassing pre-conditions"
+)
+@click.pass_context
+def subscription_delete(ctx, event_type, subscription_id, force):
+    """deletes a subscription
+
+    SUBSCRIPTION_ID: ID of the subscription to be deleted
+    """
+    logger.debug("")
+    check_client_version(ctx.obj, ctx.command.name)
+    ctx.obj.subscription.delete(event_type, subscription_id, force)
+
+
+@cli_osm.command(name="subscription-list", short_help="list all subscriptions")
+@click.option(
+    "--event_type",
+    # type=click.Choice(['ns', 'nspkg', 'vnfpkg'], case_sensitive=False))
+    type=click.Choice(["ns"], case_sensitive=False),
+    help="event type to be subscribed (for the moment, only ns is supported)",
+)
+@click.option(
+    "--filter",
+    default=None,
+    multiple=True,
+    help="restricts the list to the subscriptions matching the filter",
+)
+@click.pass_context
+def subscription_list(ctx, event_type, filter):
+    """list all subscriptions"""
+    logger.debug("")
+    check_client_version(ctx.obj, ctx.command.name)
+    if filter:
+        filter = "&".join(filter)
+    resp = ctx.obj.subscription.list(event_type, filter)
+    table = PrettyTable(["id", "filter", "CallbackUri"])
+    for sub in resp:
+        table.add_row(
+            [
+                sub["_id"],
+                wrap_text(text=json.dumps(sub["filter"], indent=2), width=70),
+                sub["CallbackUri"],
+            ]
+        )
+    table.align = "l"
+    print(table)
+
+
+@cli_osm.command(
+    name="subscription-show", short_help="shows the details of a subscription"
+)
+@click.argument("subscription_id")
+@click.option(
+    "--event_type",
+    # type=click.Choice(['ns', 'nspkg', 'vnfpkg'], case_sensitive=False))
+    type=click.Choice(["ns"], case_sensitive=False),
+    help="event type to be subscribed (for the moment, only ns is supported)",
+)
+@click.option(
+    "--filter",
+    multiple=True,
+    help="restricts the information to the fields in the filter",
+)
+@click.pass_context
+def subscription_show(ctx, event_type, subscription_id, filter):
+    """shows the details of a subscription
+
+    SUBSCRIPTION_ID: ID of the subscription
+    """
+    logger.debug("")
+    # try:
+    resp = ctx.obj.subscription.get(subscription_id)
+    table = PrettyTable(["key", "attribute"])
+    for k, v in list(resp.items()):
+        if not filter or k in filter:
+            table.add_row([k, wrap_text(text=json.dumps(v, indent=2), width=100)])
+    table.align = "l"
+    print(table)
+
+
 ####################
 # Other operations
 ####################