return vim_name
+def create_config(config_file, json_string):
+ '''
+ Combines a YAML or JSON file with a JSON string into a Python3 structure
+ It loads the YAML or JSON file 'cfile' into a first dictionary.
+ It loads the JSON string into a second dictionary.
+ Then it updates the first dictionary with the info in the second dictionary.
+ If the field is present in both cfile and cdict, the field in cdict prevails.
+ If both cfile and cdict are None, it returns an empty dict (i.e. {})
+ '''
+ config = {}
+ if config_file:
+ with open(config_file, "r") as cf:
+ config = yaml.safe_load(cf.read())
+ if json_string:
+ cdict = yaml.safe_load(json_string)
+ for k, v in cdict.items():
+ config[k] = v
+ return config
+
+
@click.group(
context_settings=dict(help_option_names=["-h", "--help"], max_content_width=160)
)
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,
config,
config_file,
wait,
+ timeout
):
"""creates a new NS instance"""
logger.debug("")
ssh_keys=ssh_keys,
account=vim_account,
wait=wait,
+ timeout=timeout,
)
# except ClientException as e:
# print(str(e))
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)
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 = {}
pdu["interfaces"] = ifaces_list
return pdu
+
####################
# UPDATE operations
####################
@cli_osm.command(name="vim-create", short_help="creates a new VIM account")
-@click.option("--name", prompt=True, help="Name to create datacenter")
-@click.option("--user", prompt=True, help="VIM username")
-@click.option(
- "--password",
- prompt=True,
- hide_input=True,
- confirmation_prompt=True,
- help="VIM password",
-)
-@click.option("--auth_url", prompt=True, help="VIM url")
-@click.option("--tenant", prompt=True, help="VIM tenant name")
+@click.option("--name", required=True, help="Name to create datacenter")
+@click.option("--user", default=None, help="VIM username")
+@click.option("--password", default=None, help="VIM password")
+@click.option("--auth_url", default=None, help="VIM url")
+@click.option("--tenant", "--project", "tenant", default=None, help="VIM tenant/project name")
@click.option("--config", default=None, help="VIM specific config parameters")
+@click.option("--config_file", default=None, help="VIM specific config parameters in YAML or JSON file")
@click.option("--account_type", default="openstack", help="VIM type")
@click.option("--description", default=None, help="human readable description")
@click.option(
"until the operation is completed, or timeout",
)
@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.pass_context
def vim_create(
ctx,
auth_url,
tenant,
config,
+ config_file,
account_type,
description,
sdn_controller,
sdn_port_mapping,
wait,
vca,
+ creds,
):
"""creates a new VIM account"""
logger.debug("")
vim["vim-tenant-name"] = tenant
vim["vim-type"] = account_type
vim["description"] = description
- vim["config"] = config
if vca:
vim["vca"] = vca
- if sdn_controller or sdn_port_mapping:
- ctx.obj.vim.create(name, vim, sdn_controller, sdn_port_mapping, wait=wait)
- else:
- ctx.obj.vim.create(name, vim, wait=wait)
+ vim_config = create_config(config_file, config)
+ if creds:
+ with open(creds, "r") as cf:
+ vim_config["credentials"] = yaml.safe_load(cf.read())
+ ctx.obj.vim.create(name, vim, vim_config, sdn_controller, sdn_port_mapping, wait=wait)
# except ClientException as e:
# print(str(e))
# exit(1)
@click.option("--auth_url", help="VIM url")
@click.option("--tenant", help="VIM tenant name")
@click.option("--config", help="VIM specific config parameters")
+@click.option("--config_file", default=None, help="VIM specific config parameters in YAML or JSON file")
@click.option("--account_type", help="VIM type")
@click.option("--description", help="human readable description")
@click.option(
help="do not return the control immediately, but keep it "
"until the operation is completed, or timeout",
)
+@click.option("--creds", default=None, help="credentials file (only applycable for GCP VIM type)")
@click.pass_context
def vim_update(
ctx,
auth_url,
tenant,
config,
+ config_file,
account_type,
description,
sdn_controller,
sdn_port_mapping,
wait,
+ creds,
):
"""updates a VIM account
vim["vim_type"] = account_type
if description:
vim["description"] = description
- if config:
- vim["config"] = config
- ctx.obj.vim.update(name, vim, sdn_controller, sdn_port_mapping, wait=wait)
+ vim_config = None
+ if config or config_file:
+ vim_config = create_config(config_file, config)
+ if creds:
+ with open(creds, "r") as cf:
+ vim_config["credentials"] = yaml.safe_load(cf.read())
+ 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:
# print(str(e))
# exit(1)
if long:
if "vim_password" in vim:
vim["vim_password"] = "********"
+ if "config" in vim and "credentials" in vim["config"]:
+ vim["config"]["credentials"] = "********"
logger.debug("VIM details: {}".format(yaml.safe_dump(vim)))
vim_state = vim["_admin"].get("operationalState", "-")
error_details = "N/A"
multiple=True,
help="restricts the information to the fields in the filter",
)
+@click.option("--literal", is_flag=True, help="print literally, no pretty table")
@click.pass_context
-def vim_show(ctx, name, filter):
+def vim_show(ctx, name, filter, literal):
"""shows the details of a VIM account
NAME: name or ID of the VIM account
resp = ctx.obj.vim.get(name)
if "vim_password" in resp:
resp["vim_password"] = "********"
+ if "config" in resp and "credentials" in resp["config"]:
+ resp["config"]["credentials"] = "********"
# except ClientException as e:
# print(str(e))
# exit(1)
+ if literal:
+ print(yaml.safe_dump(resp, indent=4, default_flow_style=False))
+ return
table = PrettyTable(["key", "attribute"])
for k, v in list(resp.items()):
if not filter or k in filter:
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,
# 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
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)
"--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
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)
@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)
@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,
detailed,
netslice_subnets,
netslice_vlds,
+ old,
):
"""
Creates an OSM NS, VNF, NST package
detailed=detailed,
netslice_subnets=netslice_subnets,
netslice_vlds=netslice_vlds,
+ old=old,
)
print(resp)
# except ClientException as inst: