X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osmclient%2Fscripts%2Fosm.py;h=a19613992725c98996e22a4007a074131ee71bef;hb=fcfed2f9c065ba92f775fb6f4563d5d4b64e7797;hp=30aa33f86a82890532fd1c764ce69da16fbf50cd;hpb=e7c24981a7021176e68ee87998c86d21e87f548e;p=osm%2Fosmclient.git diff --git a/osmclient/scripts/osm.py b/osmclient/scripts/osm.py index 30aa33f..a196139 100755 --- a/osmclient/scripts/osm.py +++ b/osmclient/scripts/osm.py @@ -2350,6 +2350,7 @@ def nfpkg_create( help="do not return the control immediately, but keep it " "until the operation is completed, or timeout", ) +@click.option("--timeout", default=None, help="ns deployment timeout") @click.pass_context def ns_create( ctx, @@ -2361,6 +2362,7 @@ def ns_create( config, config_file, wait, + timeout ): """creates a new NS instance""" logger.debug("") @@ -2380,6 +2382,7 @@ def ns_create( ssh_keys=ssh_keys, account=vim_account, wait=wait, + timeout=timeout, ) # except ClientException as e: # print(str(e)) @@ -2603,7 +2606,9 @@ def pdu_create( check_client_version(ctx.obj, ctx.command.name) - pdu = create_pdu_dictionary(name, pdu_type, interface, description, vim_account, descriptor_file) + pdu = create_pdu_dictionary( + name, pdu_type, interface, description, vim_account, descriptor_file + ) ctx.obj.pdu.create(pdu) @@ -2651,11 +2656,15 @@ def pdu_update( if not newname: newname = name - pdu = create_pdu_dictionary(newname, pdu_type, interface, description, vim_account, descriptor_file, update) + 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): +def create_pdu_dictionary( + name, pdu_type, interface, description, vim_account, descriptor_file, update=False +): logger.debug("") pdu = {} @@ -2698,6 +2707,7 @@ def create_pdu_dictionary(name, pdu_type, interface, description, vim_account, d pdu["interfaces"] = ifaces_list return pdu + #################### # UPDATE operations #################### @@ -3144,6 +3154,7 @@ def pdu_delete(ctx, name, force): ) @click.option("--vca", default=None, help="VCA to be used in this VIM account") @click.option("--creds", default=None, help="credentials file (only applycable for GCP VIM type)") +@click.option("--prometheus_config_file", default=None, help="Prometheus configuration to get VIM data") @click.pass_context def vim_create( ctx, @@ -3161,6 +3172,7 @@ def vim_create( wait, vca, creds, + prometheus_config_file ): """creates a new VIM account""" logger.debug("") @@ -3170,6 +3182,11 @@ def vim_create( if sdn_port_mapping: check_client_version(ctx.obj, "--sdn_port_mapping") vim = {} + if prometheus_config_file: + with open(prometheus_config_file) as prometheus_file: + prometheus_config_dict = json.load(prometheus_file) + vim["prometheus-config"] = prometheus_config_dict + vim["vim-username"] = user vim["vim-password"] = password vim["vim-url"] = auth_url @@ -3219,6 +3236,7 @@ def vim_create( "until the operation is completed, or timeout", ) @click.option("--creds", default=None, help="credentials file (only applycable for GCP VIM type)") +@click.option("--prometheus_config_file", default=None, help="Prometheus configuration to get VIM data") @click.pass_context def vim_update( ctx, @@ -3236,6 +3254,7 @@ def vim_update( sdn_port_mapping, wait, creds, + prometheus_config_file ): """updates a VIM account @@ -3265,6 +3284,10 @@ def vim_update( if creds: with open(creds, "r") as cf: vim_config["credentials"] = yaml.safe_load(cf.read()) + if prometheus_config_file: + with open(prometheus_config_file) as prometheus_file: + prometheus_config_dict = json.load(prometheus_file) + vim["prometheus-config"] = prometheus_config_dict logger.info(f"VIM: {vim}, VIM config: {vim_config}") ctx.obj.vim.update(name, vim, vim_config, sdn_controller, sdn_port_mapping, wait=wait) # except ClientException as e: @@ -3855,6 +3878,24 @@ def sdnc_show(ctx, name): help='''list of VIM networks, in JSON inline format, where the cluster is accessible via L3 routing, e.g. "{(k8s_net1:vim_network1) [,(k8s_net2:vim_network2) ...]}"''', ) +@click.option( + "--init-helm2/--skip-helm2", + required=False, + default=True, + help="Initialize helm v2", +) +@click.option( + "--init-helm3/--skip-helm3", + required=False, + default=True, + help="Initialize helm v3", +) +@click.option( + "--init-jujubundle/--skip-jujubundle", + required=False, + default=True, + help="Initialize juju-bundle", +) @click.option("--description", default=None, help="human readable description") @click.option( "--namespace", @@ -3882,7 +3923,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, wait, cni + ctx, name, creds, version, vim, k8s_nets, init_helm2, init_helm3, init_jujubundle, description, namespace, wait, cni ): """adds a K8s cluster to OSM @@ -3897,6 +3938,10 @@ def k8scluster_add( cluster["k8s_version"] = version cluster["vim_account"] = vim cluster["nets"] = yaml.safe_load(k8s_nets) + if not (init_helm2 and init_jujubundle and init_helm3): + cluster["deployment_methods"] = {"helm-chart": init_helm2, + "juju-bundle": init_jujubundle, + "helm-chart-v3": init_helm3} if description: cluster["description"] = description if namespace: @@ -4026,6 +4071,7 @@ def k8scluster_list(ctx, filter, literal, long): "Version", "VIM", "K8s-nets", + "Deployment methods", "Operational State", "Op. state (details)", "Description", @@ -4063,6 +4109,7 @@ def k8scluster_list(ctx, filter, literal, long): cluster["k8s_version"], vim_info, json.dumps(cluster["nets"]), + json.dumps(cluster["deployment_methods"]), cluster["_admin"]["operationalState"], op_state_details, trunc_text(cluster.get("description") or "", 40), @@ -4834,6 +4881,16 @@ def user_create(ctx, username, password, projects, project_role_mappings, domain multiple=True, help="remove role(s) in a project. Can be used several times: 'project,role1[,role2,...]'", ) +@click.option( + "--change_password", + "change_password", + help="user's current password" +) +@click.option( + "--new_password", + "new_password", + help="user's new password to update in expiry condition" +) @click.pass_context def user_update( ctx, @@ -4844,6 +4901,8 @@ def user_update( remove_project, add_project_role, remove_project_role, + change_password, + new_password, ): """Update a user information @@ -4855,6 +4914,8 @@ def user_update( REMOVE_PROJECT: deleting mappings for project/role(s) ADD_PROJECT_ROLE: adding mappings for project/role(s) REMOVE_PROJECT_ROLE: removing mappings for project/role(s) + CHANGE_PASSWORD: user's current password to change + NEW_PASSWORD: user's new password to update in expiry condition """ logger.debug("") user = {} @@ -4864,10 +4925,15 @@ def user_update( user["remove-project"] = remove_project user["add-project-role"] = add_project_role user["remove-project-role"] = remove_project_role + user["change_password"] = change_password + user["new_password"] = new_password # try: check_client_version(ctx.obj, ctx.command.name) - ctx.obj.user.update(username, user) + if not user.get("change_password"): + ctx.obj.user.update(username, user) + else: + ctx.obj.user.update(username, user, pwd_change=True) # except ClientException as e: # print(str(e)) # exit(1) @@ -5522,6 +5588,271 @@ def vnf_scale( # exit(1) +@cli_osm.command( + name="ns-update", short_help="executes an update of a Network Service." +) +@click.argument("ns_name") +@click.option( + "--updatetype", required=True, type=str, help="available types: CHANGE_VNFPKG" +) +@click.option( + "--config", + required=True, + type=str, + help="extra information for update operation as YAML/JSON inline string as --config" + " '{changeVnfPackageData:[{vnfInstanceId: xxx, vnfdId: yyy}]}'", +) +@click.option( + "--timeout", required=False, default=None, type=int, help="timeout in seconds" +) +@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 update(ctx, ns_name, updatetype, config, timeout, wait): + """Executes an update of a Network Service. + + The update will check new revisions of the Network Functions that are part of the + Network Service, and it will update them if needed. + Sample update command: osm ns-update ns_instance_id --updatetype CHANGE_VNFPKG + --config '{changeVnfPackageData: [{vnfInstanceId: id_x,vnfdId: id_y}]}' --timeout 300 --wait + + NS_NAME: Network service instance name or ID. + + """ + op_data = { + "timeout": timeout, + "updateType": updatetype, + } + if config: + op_data["config"] = yaml.safe_load(config) + + check_client_version(ctx.obj, ctx.command.name) + ctx.obj.ns.update(ns_name, op_data, wait=wait) + + +def process_common_heal_params(ctx, param, value): + logger.debug("") + if not value: + return + logger.debug(f"Param name: {param.name}") + if not ctx.params.get("heal_params", {}).get("healVnfData"): + raise ClientException(f"Expected option --vnf before {param.name}") + if param.name == "cause": + param_dict = ctx.params["heal_params"]["healVnfData"][-1]["cause"] = value + return + # If not "vnf" and not "cause", then the param lies on "additionalParams" + if not ctx.params["heal_params"]["healVnfData"][-1].get("additionalParams"): + ctx.params["heal_params"]["healVnfData"][-1]["additionalParams"] = {} + if param.name == "vdu": + # Check VDU id ? + if not ctx.params["heal_params"]["healVnfData"][-1]["additionalParams"].get( + "vdu" + ): + ctx.params["heal_params"]["healVnfData"][-1]["additionalParams"][ + "vdu" + ] = [] + vdu = {"vdu-id": value} + ctx.params["heal_params"]["healVnfData"][-1]["additionalParams"][ + "vdu" + ].append(vdu) + ctx.params["heal_params"]["current_item"] = "vdu" + else: + current_item = ctx.params["heal_params"]["current_item"] + if current_item == "vnf": + param_dict = ctx.params["heal_params"]["healVnfData"][-1][ + "additionalParams" + ] + else: + # if current_item == "vdu": + param_dict = ctx.params["heal_params"]["healVnfData"][-1][ + "additionalParams" + ]["vdu"][-1] + if param.name == "count_index": + param_name = "count-index" + elif param.name == "run_day1": + param_name = "run-day1" + else: + param_name = param.name + param_dict[param_name] = value + return + + +def process_ns_heal_params(ctx, param, value): + logger.debug("") + if not ctx.params.get("heal_params"): + ctx.params["heal_params"] = {} + ctx.params["heal_params"]["healVnfData"] = [] + if param.name == "vnf" and value: + # Check VNF id ? + logger.debug(f"Param name: {param.name}") + vnf = {"vnfInstanceId": value} + ctx.params["heal_params"]["healVnfData"].append(vnf) + ctx.params["heal_params"]["current_item"] = "vnf" + else: + process_common_heal_params(ctx, param, value) + + +def process_vnf_heal_params(ctx, param, value): + logger.debug("") + if not ctx.params.get("heal_params"): + ctx.params["heal_params"] = {} + ctx.params["heal_params"]["healVnfData"] = [] + vnf = {"vnfInstanceId": "id_to_be_substituted"} + ctx.params["heal_params"]["healVnfData"].append(vnf) + ctx.params["heal_params"]["current_item"] = "vnf" + else: + process_common_heal_params(ctx, param, value) + + +@click.command( + name="ns-heal", short_help="heals (recreates) VNFs or VDUs of a NS instance" +) +@click.argument("ns_name") +@click.option( + "--vnf", + required=True, + default=None, + callback=process_ns_heal_params, + help="vnf-id if the target is a vnf instead of a ns)", +) +@click.option( + "--cause", + default=None, + callback=process_ns_heal_params, + help="human readable cause of the healing", +) +@click.option( + "--run-day1", + is_flag=True, + default=False, + callback=process_ns_heal_params, + help="indicates whether or not to run day1 primitives for the VNF/VDU", +) +@click.option( + "--vdu", + default=None, + callback=process_ns_heal_params, + help="vdu-id", +) +@click.option( + "--count-index", + type=int, + default=None, + callback=process_ns_heal_params, + help="count-index", +) +@click.option( + "--timeout", + type=int, + default=None, + help="timeout in seconds" +) +@click.option( + "--wait", + is_flag=True, + default=False, + help="do not return the control immediately, but keep it until the operation is completed, or timeout", +) +@click.pass_context +def ns_heal( + ctx, + ns_name, + heal_params, + cause, + vnf, + run_day1, + vdu, + count_index, + wait, + timeout, +): + """heals (recreates) VNFs or VDUs of a NS instance + + NS_NAME: name or ID of the NS instance + """ + logger.debug("") + heal_dict = ctx.params["heal_params"] + heal_dict.pop("current_item") + if cause: + heal_dict["cause"] = cause + logger.debug(f"Heal dict: {heal_dict}") + check_client_version(ctx.obj, ctx.command.name) + ctx.obj.ns.heal(ns_name, heal_dict, wait, timeout) + + +@click.command( + name="vnf-heal", + short_help="heals (recreates) a VNF instance or the VDUs of a VNF instance", +) +@click.argument("vnf_name") +@click.option( + "--cause", + default=None, + callback=process_vnf_heal_params, + help="human readable cause of the healing", +) +@click.option( + "--run-day1", + is_flag=True, + default=False, + callback=process_vnf_heal_params, + help="indicates whether or not to run day1 primitives for the VNF/VDU", +) +@click.option( + "--vdu", + default=None, + callback=process_vnf_heal_params, + help="vdu-id", +) +@click.option( + "--count-index", + type=int, + default=None, + callback=process_vnf_heal_params, + help="count-index", +) +@click.option( + "--timeout", + type=int, + default=None, + help="timeout in seconds" +) +@click.option( + "--wait", + 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 vnf_heal( + ctx, + vnf_name, + heal_params, + cause, + run_day1, + vdu, + count_index, + wait, + timeout, +): + """heals (recreates) a VNF instance or the VDUs of a VNF instance + + VNF_NAME: name or ID of the VNF instance + """ + logger.debug("") + heal_dict = ctx.params["heal_params"] + heal_dict.pop("current_item") + heal_dict["healVnfData"][-1]["vnfInstanceId"] = vnf_name + logger.debug(f"Heal dict: {heal_dict}") + check_client_version(ctx.obj, ctx.command.name) + ctx.obj.vnf.heal(vnf_name, heal_dict, wait, timeout) + + @cli_osm.command(name="alarm-show", short_help="show alarm details") @click.argument("uuid") @click.pass_context @@ -5546,8 +5877,7 @@ def alarm_show(ctx, uuid): table = PrettyTable(["key", "attribute"]) try: # Arrange and return the response data - resp = resp.replace("ObjectId", "") - alarm = eval(resp) + alarm = resp.replace("ObjectId", "") for key in alarm_filter: if key == "uuid": value = alarm.get(key) @@ -5589,7 +5919,6 @@ def alarm_list(ctx, ns_id): if resp: # return the response data in a table resp = resp.replace("ObjectId", "") - resp = eval(resp) for alarm in resp: table.add_row( [ @@ -5808,7 +6137,10 @@ def role_show(ctx, name): "--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)" + "--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(