1 # Copyright ETSI Contributors and Others.
4 # Licensed under the Apache License, Version 2.0 (the "License"); you may
5 # not use this file except in compliance with the License. You may obtain
6 # a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 # License for the specific language governing permissions and limitations
17 from osmclient
.common
import print_output
18 from osmclient
.cli_commands
import utils
19 from prettytable
import PrettyTable
24 logger
= logging
.getLogger("osmclient")
27 def _check_ca_cert(vim_config
: dict) -> None:
29 Checks if the VIM has a CA certificate.
30 In that case, reads the content and add it to the config
31 : param vim_config: configuration provided with the VIM creation
35 if vim_config
.get("ca_cert"):
36 with
open(vim_config
["ca_cert"], "r") as cert_f
:
37 vim_config
["ca_cert_content"] = str(cert_f
.read())
38 del vim_config
["ca_cert"]
41 @click.command(name
="vim-create", short_help
="creates a new VIM account")
42 @click.option("--name", required
=True, help="Name to create datacenter")
43 @click.option("--user", default
=None, help="VIM username")
44 @click.option("--password", default
=None, help="VIM password")
45 @click.option("--auth_url", default
=None, help="VIM url")
47 "--tenant", "--project", "tenant", default
=None, help="VIM tenant/project name"
49 @click.option("--config", default
=None, help="VIM specific config parameters")
53 help="VIM specific config parameters in YAML or JSON file",
55 @click.option("--account_type", default
="openstack", help="VIM type")
56 @click.option("--description", default
=None, help="human readable description")
60 help="Name or id of the SDN controller associated to this VIM account",
65 help="File describing the port mapping between compute nodes' ports and switch ports",
72 help="do not return the control immediately, but keep it "
73 "until the operation is completed, or timeout",
75 @click.option("--vca", default
=None, help="VCA to be used in this VIM account")
77 "--creds", default
=None, help="credentials file (only applicable for GCP VIM type)"
82 help="PrometheusTSBD URL to get VIM data",
87 help="PrometheusTSBD metrics mapping for VIM data",
90 "--prometheus_config_file",
92 help="Prometheus configuration to get VIM data",
113 prometheus_config_file
,
115 """creates a new VIM account"""
118 utils
.check_client_version(ctx
.obj
, "--sdn_controller")
120 utils
.check_client_version(ctx
.obj
, "--sdn_port_mapping")
122 prometheus_config
= {}
124 prometheus_config
["prometheus-url"] = prometheus_url
126 prometheus_config
["prometheus-map"] = prometheus_map
127 if prometheus_config_file
:
128 with
open(prometheus_config_file
) as prometheus_file
:
129 prometheus_config_dict
= json
.load(prometheus_file
)
130 prometheus_config
.update(prometheus_config_dict
)
131 if prometheus_config
:
132 vim
["prometheus-config"] = prometheus_config
133 vim
["vim-username"] = user
134 vim
["vim-password"] = password
135 vim
["vim-url"] = auth_url
136 vim
["vim-tenant-name"] = tenant
137 vim
["vim-type"] = account_type
138 vim
["description"] = description
141 vim_config
= utils
.create_config(config_file
, config
)
142 _check_ca_cert(vim_config
)
144 with
open(creds
, "r") as cf
:
145 vim_config
["credentials"] = yaml
.safe_load(cf
.read())
147 name
, vim
, vim_config
, sdn_controller
, sdn_port_mapping
, wait
=wait
151 @click.command(name
="vim-update", short_help
="updates a VIM account")
152 @click.argument("name")
153 @click.option("--newname", help="New name for the VIM account")
154 @click.option("--user", help="VIM username")
155 @click.option("--password", help="VIM password")
156 @click.option("--auth_url", help="VIM url")
157 @click.option("--tenant", help="VIM tenant name")
158 @click.option("--config", help="VIM specific config parameters")
162 help="VIM specific config parameters in YAML or JSON file",
164 @click.option("--account_type", help="VIM type")
165 @click.option("--description", help="human readable description")
169 help="Name or id of the SDN controller to be associated with this VIM"
170 "account. Use empty string to disassociate",
173 "--sdn_port_mapping",
175 help="File describing the port mapping between compute nodes' ports and switch ports",
182 help="do not return the control immediately, but keep it "
183 "until the operation is completed, or timeout",
186 "--creds", default
=None, help="credentials file (only applicable for GCP VIM type)"
191 help="PrometheusTSBD URL to get VIM data",
196 help="PrometheusTSBD metrics mapping for VIM data",
199 "--prometheus_config_file",
201 help="Prometheus configuration to get VIM data",
222 prometheus_config_file
,
224 """updates a VIM account
226 NAME: name or ID of the VIM account
229 utils
.check_client_version(ctx
.obj
, ctx
.command
.name
)
232 vim
["name"] = newname
234 vim
["vim_user"] = user
236 vim
["vim_password"] = password
238 vim
["vim_url"] = auth_url
240 vim
["vim-tenant-name"] = tenant
242 vim
["vim_type"] = account_type
244 vim
["description"] = description
246 if config
or config_file
:
247 vim_config
= utils
.create_config(config_file
, config
)
248 _check_ca_cert(vim_config
)
250 with
open(creds
, "r") as cf
:
251 vim_config
["credentials"] = yaml
.safe_load(cf
.read())
252 prometheus_config
= {}
254 prometheus_config
["prometheus-url"] = prometheus_url
256 prometheus_config
["prometheus-map"] = prometheus_map
257 if prometheus_config_file
:
258 with
open(prometheus_config_file
) as prometheus_file
:
259 prometheus_config_dict
= json
.load(prometheus_file
)
260 prometheus_config
.update(prometheus_config_dict
)
261 if prometheus_config
:
262 vim
["prometheus-config"] = prometheus_config
264 name
, vim
, vim_config
, sdn_controller
, sdn_port_mapping
, wait
=wait
268 @click.command(name
="vim-delete", short_help
="deletes a VIM account")
269 @click.argument("name")
271 "--force", is_flag
=True, help="forces the deletion bypassing pre-conditions"
278 help="do not return the control immediately, but keep it "
279 "until the operation is completed, or timeout",
282 def vim_delete(ctx
, name
, force
, wait
):
283 """deletes a VIM account
285 NAME: name or ID of the VIM account to be deleted
289 ctx
.obj
.vim
.delete(name
, wait
=wait
)
291 utils
.check_client_version(ctx
.obj
, "--force")
292 ctx
.obj
.vim
.delete(name
, force
, wait
=wait
)
295 @click.command(name
="vim-list", short_help
="list all VIM accounts")
300 help="restricts the list to the VIM accounts matching the filter",
305 help="get more details of the NS (project, vim, deployment status, configuration status.",
307 @print_output.output_option
309 def vim_list(ctx
, filter, long, output
):
310 """list all VIM accounts"""
313 filter = "&".join(filter)
314 utils
.check_client_version(ctx
.obj
, "--filter")
315 resp
= ctx
.obj
.vim
.list(filter)
318 ["vim name", "uuid", "project", "operational state", "error details"]
320 project_list
= ctx
.obj
.project
.list()
322 table
= PrettyTable(["vim name", "uuid", "operational state"])
325 if "vim_password" in vim
:
326 vim
["vim_password"] = "********"
327 if "config" in vim
and "credentials" in vim
["config"]:
328 vim
["config"]["credentials"] = "********"
329 logger
.debug("VIM details: {}".format(yaml
.safe_dump(vim
)))
330 vim_state
= vim
["_admin"].get("operationalState", "-")
331 error_details
= "N/A"
332 if vim_state
== "ERROR":
333 error_details
= vim
["_admin"].get("detailed-status", "Not found")
334 project_id
, project_name
= utils
.get_project(project_list
, vim
)
335 # project_info = '{} ({})'.format(project_name, project_id)
336 project_info
= project_name
343 utils
.wrap_text(text
=error_details
, width
=80),
348 [vim
["name"], vim
["uuid"], vim
["_admin"].get("operationalState", "-")]
350 print_output
.print_output(output
, table
.field_names
, table
._rows
)
353 @click.command(name
="vim-show", short_help
="shows the details of a VIM account")
354 @click.argument("name")
358 help="restricts the information to the fields in the filter",
360 @click.option("--literal", is_flag
=True, help="print literally, no pretty table")
361 @print_output.output_option
363 def vim_show(ctx
, name
, filter, literal
, output
):
364 """shows the details of a VIM account
366 NAME: name or ID of the VIM account
369 resp
= ctx
.obj
.vim
.get(name
)
370 if "vim_password" in resp
:
371 resp
["vim_password"] = "********"
372 if "config" in resp
and "credentials" in resp
["config"]:
373 resp
["config"]["credentials"] = "********"
376 print(yaml
.safe_dump(resp
, indent
=4, default_flow_style
=False))
378 table
= PrettyTable(["key", "attribute"])
379 for k
, v
in list(resp
.items()):
380 if not filter or k
in filter:
381 table
.add_row([k
, utils
.wrap_text(text
=json
.dumps(v
, indent
=2), width
=100)])
382 print_output
.print_output(output
, table
.field_names
, table
._rows
)