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
.cli_commands
import utils
18 from prettytable
import PrettyTable
23 logger
= logging
.getLogger("osmclient")
26 def _check_ca_cert(vim_config
: dict) -> None:
28 Checks if the VIM has a CA certificate.
29 In that case, reads the content and add it to the config
30 : param vim_config: configuration provided with the VIM creation
34 if vim_config
.get("ca_cert"):
35 with
open(vim_config
["ca_cert"], "r") as cert_f
:
36 vim_config
["ca_cert_content"] = str(cert_f
.read())
37 del vim_config
["ca_cert"]
40 @click.command(name
="vim-create", short_help
="creates a new VIM account")
41 @click.option("--name", required
=True, help="Name to create datacenter")
42 @click.option("--user", default
=None, help="VIM username")
43 @click.option("--password", default
=None, help="VIM password")
44 @click.option("--auth_url", default
=None, help="VIM url")
46 "--tenant", "--project", "tenant", default
=None, help="VIM tenant/project name"
48 @click.option("--config", default
=None, help="VIM specific config parameters")
52 help="VIM specific config parameters in YAML or JSON file",
54 @click.option("--account_type", default
="openstack", help="VIM type")
55 @click.option("--description", default
=None, help="human readable description")
59 help="Name or id of the SDN controller associated to this VIM account",
64 help="File describing the port mapping between compute nodes' ports and switch ports",
71 help="do not return the control immediately, but keep it "
72 "until the operation is completed, or timeout",
74 @click.option("--vca", default
=None, help="VCA to be used in this VIM account")
76 "--creds", default
=None, help="credentials file (only applicable for GCP VIM type)"
81 help="PrometheusTSBD URL to get VIM data",
86 help="PrometheusTSBD metrics mapping for VIM data",
89 "--prometheus_config_file",
91 help="Prometheus configuration to get VIM data",
112 prometheus_config_file
,
114 """creates a new VIM account"""
117 utils
.check_client_version(ctx
.obj
, "--sdn_controller")
119 utils
.check_client_version(ctx
.obj
, "--sdn_port_mapping")
121 prometheus_config
= {}
123 prometheus_config
["prometheus-url"] = prometheus_url
125 prometheus_config
["prometheus-map"] = prometheus_map
126 if prometheus_config_file
:
127 with
open(prometheus_config_file
) as prometheus_file
:
128 prometheus_config_dict
= json
.load(prometheus_file
)
129 prometheus_config
.update(prometheus_config_dict
)
130 if prometheus_config
:
131 vim
["prometheus-config"] = prometheus_config
132 vim
["vim-username"] = user
133 vim
["vim-password"] = password
134 vim
["vim-url"] = auth_url
135 vim
["vim-tenant-name"] = tenant
136 vim
["vim-type"] = account_type
137 vim
["description"] = description
140 vim_config
= utils
.create_config(config_file
, config
)
141 _check_ca_cert(vim_config
)
143 with
open(creds
, "r") as cf
:
144 vim_config
["credentials"] = yaml
.safe_load(cf
.read())
146 name
, vim
, vim_config
, sdn_controller
, sdn_port_mapping
, wait
=wait
150 @click.command(name
="vim-update", short_help
="updates a VIM account")
151 @click.argument("name")
152 @click.option("--newname", help="New name for the VIM account")
153 @click.option("--user", help="VIM username")
154 @click.option("--password", help="VIM password")
155 @click.option("--auth_url", help="VIM url")
156 @click.option("--tenant", help="VIM tenant name")
157 @click.option("--config", help="VIM specific config parameters")
161 help="VIM specific config parameters in YAML or JSON file",
163 @click.option("--account_type", help="VIM type")
164 @click.option("--description", help="human readable description")
168 help="Name or id of the SDN controller to be associated with this VIM"
169 "account. Use empty string to disassociate",
172 "--sdn_port_mapping",
174 help="File describing the port mapping between compute nodes' ports and switch ports",
181 help="do not return the control immediately, but keep it "
182 "until the operation is completed, or timeout",
185 "--creds", default
=None, help="credentials file (only applicable for GCP VIM type)"
190 help="PrometheusTSBD URL to get VIM data",
195 help="PrometheusTSBD metrics mapping for VIM data",
198 "--prometheus_config_file",
200 help="Prometheus configuration to get VIM data",
221 prometheus_config_file
,
223 """updates a VIM account
225 NAME: name or ID of the VIM account
228 utils
.check_client_version(ctx
.obj
, ctx
.command
.name
)
231 vim
["name"] = newname
233 vim
["vim_user"] = user
235 vim
["vim_password"] = password
237 vim
["vim_url"] = auth_url
239 vim
["vim-tenant-name"] = tenant
241 vim
["vim_type"] = account_type
243 vim
["description"] = description
245 if config
or config_file
:
246 vim_config
= utils
.create_config(config_file
, config
)
247 _check_ca_cert(vim_config
)
249 with
open(creds
, "r") as cf
:
250 vim_config
["credentials"] = yaml
.safe_load(cf
.read())
251 prometheus_config
= {}
253 prometheus_config
["prometheus-url"] = prometheus_url
255 prometheus_config
["prometheus-map"] = prometheus_map
256 if prometheus_config_file
:
257 with
open(prometheus_config_file
) as prometheus_file
:
258 prometheus_config_dict
= json
.load(prometheus_file
)
259 prometheus_config
.update(prometheus_config_dict
)
260 if prometheus_config
:
261 vim
["prometheus-config"] = prometheus_config
263 name
, vim
, vim_config
, sdn_controller
, sdn_port_mapping
, wait
=wait
267 @click.command(name
="vim-delete", short_help
="deletes a VIM account")
268 @click.argument("name")
270 "--force", is_flag
=True, help="forces the deletion bypassing pre-conditions"
277 help="do not return the control immediately, but keep it "
278 "until the operation is completed, or timeout",
281 def vim_delete(ctx
, name
, force
, wait
):
282 """deletes a VIM account
284 NAME: name or ID of the VIM account to be deleted
288 ctx
.obj
.vim
.delete(name
, wait
=wait
)
290 utils
.check_client_version(ctx
.obj
, "--force")
291 ctx
.obj
.vim
.delete(name
, force
, wait
=wait
)
294 @click.command(name
="vim-list", short_help
="list all VIM accounts")
299 help="restricts the list to the VIM accounts matching the filter",
304 help="get more details of the NS (project, vim, deployment status, configuration status.",
307 def vim_list(ctx
, filter, long):
308 """list all VIM accounts"""
311 filter = "&".join(filter)
312 utils
.check_client_version(ctx
.obj
, "--filter")
313 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
314 if fullclassname
== "osmclient.sol005.client.Client":
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", "-")]
354 @click.command(name
="vim-show", short_help
="shows the details of a VIM account")
355 @click.argument("name")
359 help="restricts the information to the fields in the filter",
361 @click.option("--literal", is_flag
=True, help="print literally, no pretty table")
363 def vim_show(ctx
, name
, filter, literal
):
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)])