X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osmclient%2Fscripts%2Fosm.py;h=df638a0e0359d6f4e46cce1c633152e3e361d98d;hb=8a29667fc3e9222e6ee2288c69d7a450d6bc014a;hp=0ce20c4e4bc6daebcd809a22f27b1bf1c7d89a24;hpb=3f19f49290d595f561850ca9bcdbfcd4b3733297;p=osm%2Fosmclient.git diff --git a/osmclient/scripts/osm.py b/osmclient/scripts/osm.py index 0ce20c4..df638a0 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 @@ -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) @@ -4966,6 +5043,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 ####################