c6424caaf208a941388356a0eaa2afbc36e9ce92
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)"
79 "--prometheus_config_file",
81 help="Prometheus configuration to get VIM data",
100 prometheus_config_file
,
102 """creates a new VIM account"""
105 utils
.check_client_version(ctx
.obj
, "--sdn_controller")
107 utils
.check_client_version(ctx
.obj
, "--sdn_port_mapping")
109 if prometheus_config_file
:
110 with
open(prometheus_config_file
) as prometheus_file
:
111 prometheus_config_dict
= json
.load(prometheus_file
)
112 vim
["prometheus-config"] = prometheus_config_dict
114 vim
["vim-username"] = user
115 vim
["vim-password"] = password
116 vim
["vim-url"] = auth_url
117 vim
["vim-tenant-name"] = tenant
118 vim
["vim-type"] = account_type
119 vim
["description"] = description
122 vim_config
= utils
.create_config(config_file
, config
)
123 _check_ca_cert(vim_config
)
125 with
open(creds
, "r") as cf
:
126 vim_config
["credentials"] = yaml
.safe_load(cf
.read())
128 name
, vim
, vim_config
, sdn_controller
, sdn_port_mapping
, wait
=wait
132 @click.command(name
="vim-update", short_help
="updates a VIM account")
133 @click.argument("name")
134 @click.option("--newname", help="New name for the VIM account")
135 @click.option("--user", help="VIM username")
136 @click.option("--password", help="VIM password")
137 @click.option("--auth_url", help="VIM url")
138 @click.option("--tenant", help="VIM tenant name")
139 @click.option("--config", help="VIM specific config parameters")
143 help="VIM specific config parameters in YAML or JSON file",
145 @click.option("--account_type", help="VIM type")
146 @click.option("--description", help="human readable description")
150 help="Name or id of the SDN controller to be associated with this VIM"
151 "account. Use empty string to disassociate",
154 "--sdn_port_mapping",
156 help="File describing the port mapping between compute nodes' ports and switch ports",
163 help="do not return the control immediately, but keep it "
164 "until the operation is completed, or timeout",
167 "--creds", default
=None, help="credentials file (only applicable for GCP VIM type)"
170 "--prometheus_config_file",
172 help="Prometheus configuration to get VIM data",
191 prometheus_config_file
,
193 """updates a VIM account
195 NAME: name or ID of the VIM account
198 utils
.check_client_version(ctx
.obj
, ctx
.command
.name
)
201 vim
["name"] = newname
203 vim
["vim_user"] = user
205 vim
["vim_password"] = password
207 vim
["vim_url"] = auth_url
209 vim
["vim-tenant-name"] = tenant
211 vim
["vim_type"] = account_type
213 vim
["description"] = description
215 if config
or config_file
:
216 vim_config
= utils
.create_config(config_file
, config
)
217 _check_ca_cert(vim_config
)
219 with
open(creds
, "r") as cf
:
220 vim_config
["credentials"] = yaml
.safe_load(cf
.read())
221 if prometheus_config_file
:
222 with
open(prometheus_config_file
) as prometheus_file
:
223 prometheus_config_dict
= json
.load(prometheus_file
)
224 vim
["prometheus-config"] = prometheus_config_dict
225 logger
.info(f
"VIM: {vim}, VIM config: {vim_config}")
227 name
, vim
, vim_config
, sdn_controller
, sdn_port_mapping
, wait
=wait
231 @click.command(name
="vim-delete", short_help
="deletes a VIM account")
232 @click.argument("name")
234 "--force", is_flag
=True, help="forces the deletion bypassing pre-conditions"
241 help="do not return the control immediately, but keep it "
242 "until the operation is completed, or timeout",
245 def vim_delete(ctx
, name
, force
, wait
):
246 """deletes a VIM account
248 NAME: name or ID of the VIM account to be deleted
252 ctx
.obj
.vim
.delete(name
, wait
=wait
)
254 utils
.check_client_version(ctx
.obj
, "--force")
255 ctx
.obj
.vim
.delete(name
, force
, wait
=wait
)
258 @click.command(name
="vim-list", short_help
="list all VIM accounts")
263 help="restricts the list to the VIM accounts matching the filter",
268 help="get more details of the NS (project, vim, deployment status, configuration status.",
271 def vim_list(ctx
, filter, long):
272 """list all VIM accounts"""
275 filter = "&".join(filter)
276 utils
.check_client_version(ctx
.obj
, "--filter")
277 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
278 if fullclassname
== "osmclient.sol005.client.Client":
279 resp
= ctx
.obj
.vim
.list(filter)
282 ["vim name", "uuid", "project", "operational state", "error details"]
284 project_list
= ctx
.obj
.project
.list()
286 table
= PrettyTable(["vim name", "uuid", "operational state"])
289 if "vim_password" in vim
:
290 vim
["vim_password"] = "********"
291 if "config" in vim
and "credentials" in vim
["config"]:
292 vim
["config"]["credentials"] = "********"
293 logger
.debug("VIM details: {}".format(yaml
.safe_dump(vim
)))
294 vim_state
= vim
["_admin"].get("operationalState", "-")
295 error_details
= "N/A"
296 if vim_state
== "ERROR":
297 error_details
= vim
["_admin"].get("detailed-status", "Not found")
298 project_id
, project_name
= utils
.get_project(project_list
, vim
)
299 # project_info = '{} ({})'.format(project_name, project_id)
300 project_info
= project_name
307 utils
.wrap_text(text
=error_details
, width
=80),
312 [vim
["name"], vim
["uuid"], vim
["_admin"].get("operationalState", "-")]
318 @click.command(name
="vim-show", short_help
="shows the details of a VIM account")
319 @click.argument("name")
323 help="restricts the information to the fields in the filter",
325 @click.option("--literal", is_flag
=True, help="print literally, no pretty table")
327 def vim_show(ctx
, name
, filter, literal
):
328 """shows the details of a VIM account
330 NAME: name or ID of the VIM account
333 resp
= ctx
.obj
.vim
.get(name
)
334 if "vim_password" in resp
:
335 resp
["vim_password"] = "********"
336 if "config" in resp
and "credentials" in resp
["config"]:
337 resp
["config"]["credentials"] = "********"
340 print(yaml
.safe_dump(resp
, indent
=4, default_flow_style
=False))
342 table
= PrettyTable(["key", "attribute"])
343 for k
, v
in list(resp
.items()):
344 if not filter or k
in filter:
345 table
.add_row([k
, utils
.wrap_text(text
=json
.dumps(v
, indent
=2), width
=100)])