| # Copyright ETSI Contributors and Others. |
| # All Rights Reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| # not use this file except in compliance with the License. You may obtain |
| # a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations |
| # under the License. |
| |
| import click |
| from osmclient.common import print_output |
| from osmclient.cli_commands import utils |
| from prettytable import PrettyTable |
| import yaml |
| import json |
| import logging |
| |
| logger = logging.getLogger("osmclient") |
| |
| |
| def _check_ca_cert(vim_config: dict) -> None: |
| """ |
| Checks if the VIM has a CA certificate. |
| In that case, reads the content and add it to the config |
| : param vim_config: configuration provided with the VIM creation |
| : return: None |
| """ |
| |
| if vim_config.get("ca_cert"): |
| with open(vim_config["ca_cert"], "r") as cert_f: |
| vim_config["ca_cert_content"] = str(cert_f.read()) |
| del vim_config["ca_cert"] |
| |
| |
| @click.command(name="vim-create", short_help="creates a new VIM account") |
| @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( |
| "--sdn_controller", |
| default=None, |
| help="Name or id of the SDN controller associated to this VIM account", |
| ) |
| @click.option( |
| "--sdn_port_mapping", |
| default=None, |
| help="File describing the port mapping between compute nodes' ports and switch ports", |
| ) |
| @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("--vca", default=None, help="VCA to be used in this VIM account") |
| @click.option( |
| "--creds", default=None, help="credentials file (only applicable for GCP VIM type)" |
| ) |
| @click.option( |
| "--prometheus_url", |
| default=None, |
| help="PrometheusTSBD URL to get VIM data", |
| ) |
| @click.option( |
| "--prometheus_map", |
| default=None, |
| help="PrometheusTSBD metrics mapping for VIM data", |
| ) |
| @click.option( |
| "--prometheus_config_file", |
| default=None, |
| help="Prometheus configuration to get VIM data", |
| ) |
| @click.pass_context |
| def vim_create( |
| ctx, |
| name, |
| user, |
| password, |
| auth_url, |
| tenant, |
| config, |
| config_file, |
| account_type, |
| description, |
| sdn_controller, |
| sdn_port_mapping, |
| wait, |
| vca, |
| creds, |
| prometheus_url, |
| prometheus_map, |
| prometheus_config_file, |
| ): |
| """creates a new VIM account""" |
| logger.debug("") |
| if sdn_controller: |
| utils.check_client_version(ctx.obj, "--sdn_controller") |
| if sdn_port_mapping: |
| utils.check_client_version(ctx.obj, "--sdn_port_mapping") |
| vim = {} |
| prometheus_config = {} |
| if prometheus_url: |
| prometheus_config["prometheus-url"] = prometheus_url |
| if prometheus_map: |
| prometheus_config["prometheus-map"] = prometheus_map |
| if prometheus_config_file: |
| with open(prometheus_config_file) as prometheus_file: |
| prometheus_config_dict = json.load(prometheus_file) |
| prometheus_config.update(prometheus_config_dict) |
| if prometheus_config: |
| vim["prometheus-config"] = prometheus_config |
| vim["vim-username"] = user |
| vim["vim-password"] = password |
| vim["vim-url"] = auth_url |
| vim["vim-tenant-name"] = tenant |
| vim["vim-type"] = account_type |
| vim["description"] = description |
| if vca: |
| vim["vca"] = vca |
| vim_config = utils.create_config(config_file, config) |
| _check_ca_cert(vim_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 |
| ) |
| |
| |
| @click.command(name="vim-update", short_help="updates a VIM account") |
| @click.argument("name") |
| @click.option("--newname", help="New name for the VIM account") |
| @click.option("--user", help="VIM username") |
| @click.option("--password", help="VIM password") |
| @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( |
| "--sdn_controller", |
| default=None, |
| help="Name or id of the SDN controller to be associated with this VIM" |
| "account. Use empty string to disassociate", |
| ) |
| @click.option( |
| "--sdn_port_mapping", |
| default=None, |
| help="File describing the port mapping between compute nodes' ports and switch ports", |
| ) |
| @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( |
| "--creds", default=None, help="credentials file (only applicable for GCP VIM type)" |
| ) |
| @click.option( |
| "--prometheus_url", |
| default=None, |
| help="PrometheusTSBD URL to get VIM data", |
| ) |
| @click.option( |
| "--prometheus_map", |
| default=None, |
| help="PrometheusTSBD metrics mapping for VIM data", |
| ) |
| @click.option( |
| "--prometheus_config_file", |
| default=None, |
| help="Prometheus configuration to get VIM data", |
| ) |
| @click.pass_context |
| def vim_update( |
| ctx, |
| name, |
| newname, |
| user, |
| password, |
| auth_url, |
| tenant, |
| config, |
| config_file, |
| account_type, |
| description, |
| sdn_controller, |
| sdn_port_mapping, |
| wait, |
| creds, |
| prometheus_url, |
| prometheus_map, |
| prometheus_config_file, |
| ): |
| """updates a VIM account |
| |
| NAME: name or ID of the VIM account |
| """ |
| logger.debug("") |
| utils.check_client_version(ctx.obj, ctx.command.name) |
| vim = {} |
| if newname: |
| vim["name"] = newname |
| if user: |
| vim["vim_user"] = user |
| if password: |
| vim["vim_password"] = password |
| if auth_url: |
| vim["vim_url"] = auth_url |
| if tenant: |
| vim["vim-tenant-name"] = tenant |
| if account_type: |
| vim["vim_type"] = account_type |
| if description: |
| vim["description"] = description |
| vim_config = None |
| if config or config_file: |
| vim_config = utils.create_config(config_file, config) |
| _check_ca_cert(vim_config) |
| if creds: |
| with open(creds, "r") as cf: |
| vim_config["credentials"] = yaml.safe_load(cf.read()) |
| prometheus_config = {} |
| if prometheus_url: |
| prometheus_config["prometheus-url"] = prometheus_url |
| if prometheus_map: |
| prometheus_config["prometheus-map"] = prometheus_map |
| if prometheus_config_file: |
| with open(prometheus_config_file) as prometheus_file: |
| prometheus_config_dict = json.load(prometheus_file) |
| prometheus_config.update(prometheus_config_dict) |
| if prometheus_config: |
| vim["prometheus-config"] = prometheus_config |
| ctx.obj.vim.update( |
| name, vim, vim_config, sdn_controller, sdn_port_mapping, wait=wait |
| ) |
| |
| |
| @click.command(name="vim-delete", short_help="deletes a VIM account") |
| @click.argument("name") |
| @click.option( |
| "--force", is_flag=True, help="forces the deletion bypassing pre-conditions" |
| ) |
| @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 vim_delete(ctx, name, force, wait): |
| """deletes a VIM account |
| |
| NAME: name or ID of the VIM account to be deleted |
| """ |
| logger.debug("") |
| if not force: |
| ctx.obj.vim.delete(name, wait=wait) |
| else: |
| utils.check_client_version(ctx.obj, "--force") |
| ctx.obj.vim.delete(name, force, wait=wait) |
| |
| |
| @click.command(name="vim-list", short_help="list all VIM accounts") |
| @click.option( |
| "--filter", |
| default=None, |
| multiple=True, |
| help="restricts the list to the VIM accounts matching the filter", |
| ) |
| @click.option( |
| "--long", |
| is_flag=True, |
| help="get more details of the NS (project, vim, deployment status, configuration status.", |
| ) |
| @print_output.output_option |
| @click.pass_context |
| def vim_list(ctx, filter, long, output): |
| """list all VIM accounts""" |
| logger.debug("") |
| if filter: |
| filter = "&".join(filter) |
| utils.check_client_version(ctx.obj, "--filter") |
| fullclassname = ctx.obj.__module__ + "." + ctx.obj.__class__.__name__ |
| if fullclassname == "osmclient.sol005.client.Client": |
| resp = ctx.obj.vim.list(filter) |
| if long: |
| table = PrettyTable( |
| ["vim name", "uuid", "project", "operational state", "error details"] |
| ) |
| project_list = ctx.obj.project.list() |
| else: |
| table = PrettyTable(["vim name", "uuid", "operational state"]) |
| for vim in resp: |
| 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" |
| if vim_state == "ERROR": |
| error_details = vim["_admin"].get("detailed-status", "Not found") |
| project_id, project_name = utils.get_project(project_list, vim) |
| # project_info = '{} ({})'.format(project_name, project_id) |
| project_info = project_name |
| table.add_row( |
| [ |
| vim["name"], |
| vim["uuid"], |
| project_info, |
| vim_state, |
| utils.wrap_text(text=error_details, width=80), |
| ] |
| ) |
| else: |
| table.add_row( |
| [vim["name"], vim["uuid"], vim["_admin"].get("operationalState", "-")] |
| ) |
| print_output.print_output(output, table.field_names, table._rows) |
| |
| |
| @click.command(name="vim-show", short_help="shows the details of a VIM account") |
| @click.argument("name") |
| @click.option( |
| "--filter", |
| multiple=True, |
| help="restricts the information to the fields in the filter", |
| ) |
| @click.option("--literal", is_flag=True, help="print literally, no pretty table") |
| @print_output.output_option |
| @click.pass_context |
| def vim_show(ctx, name, filter, literal, output): |
| """shows the details of a VIM account |
| |
| NAME: name or ID of the VIM account |
| """ |
| logger.debug("") |
| 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"] = "********" |
| |
| 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: |
| table.add_row([k, utils.wrap_text(text=json.dumps(v, indent=2), width=100)]) |
| print_output.print_output(output, table.field_names, table._rows) |