Remove eval function
[osm/osmclient.git] / osmclient / scripts / osm.py
index 0e63958..ca79545 100755 (executable)
@@ -3154,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,
@@ -3171,6 +3172,7 @@ def vim_create(
     wait,
     vca,
     creds,
+    prometheus_config_file
 ):
     """creates a new VIM account"""
     logger.debug("")
@@ -3180,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
@@ -3229,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,
@@ -3246,6 +3254,7 @@ def vim_update(
     sdn_port_mapping,
     wait,
     creds,
+    prometheus_config_file
 ):
     """updates a VIM account
 
@@ -3275,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:
@@ -3865,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",
@@ -3892,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
 
@@ -3907,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:
@@ -4036,6 +4071,7 @@ def k8scluster_list(ctx, filter, literal, long):
                 "Version",
                 "VIM",
                 "K8s-nets",
+                "Deployment methods",
                 "Operational State",
                 "Op. state (details)",
                 "Description",
@@ -4073,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),
@@ -4844,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,
@@ -4854,6 +4901,8 @@ def user_update(
     remove_project,
     add_project_role,
     remove_project_role,
+    change_password,
+    new_password,
 ):
     """Update a user information
 
@@ -4865,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 = {}
@@ -4874,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)
@@ -5532,6 +5588,53 @@ 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)
+
+
 @cli_osm.command(name="alarm-show", short_help="show alarm details")
 @click.argument("uuid")
 @click.pass_context
@@ -5556,8 +5659,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)
@@ -5599,7 +5701,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(
                 [