allow ns config to set vim network name
[osm/osmclient.git] / osmclient / scripts / osm.py
1 # Copyright 2017 Sandvine
2 #
3 # All Rights Reserved.
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License"); you may
6 # not use this file except in compliance with the License. You may obtain
7 # a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 # License for the specific language governing permissions and limitations
15 # under the License.
16 """
17 OSM shell/cli
18 """
19
20 import click
21 from osmclient.client import client
22 from osmclient.common.exceptions import ClientException
23 from prettytable import PrettyTable
24 import json
25 import time
26
27
28 @click.group()
29 @click.option('--hostname',
30 default=None,
31 envvar='OSM_HOSTNAME',
32 help='hostname of server. ' +
33 'Also can set OSM_HOSTNAME in environment')
34 @click.option('--so-port',
35 default=8008,
36 envvar='OSM_SO_PORT',
37 help='hostname of server. ' +
38 'Also can set OSM_SO_PORT in environment')
39 @click.option('--so-project',
40 default='default',
41 envvar='OSM_SO_PROJECT',
42 help='Project Name in SO. ' +
43 'Also can set OSM_SO_PROJECT in environment')
44 @click.option('--ro-hostname',
45 default=None,
46 envvar='OSM_RO_HOSTNAME',
47 help='hostname of RO server. ' +
48 'Also can set OSM_RO_HOSTNAME in environment')
49 @click.option('--ro-port',
50 default=9090,
51 envvar='OSM_RO_PORT',
52 help='hostname of RO server. ' +
53 'Also can set OSM_RO_PORT in environment')
54 @click.pass_context
55 def cli(ctx, hostname, so_port, so_project, ro_hostname, ro_port):
56 if hostname is None:
57 print(
58 "either hostname option or OSM_HOSTNAME " +
59 "environment variable needs to be specified")
60 exit(1)
61 ctx.obj = client.Client(
62 host=hostname,
63 so_port=so_port,
64 so_project=so_project,
65 ro_host=ro_hostname,
66 ro_port=ro_port)
67
68
69 @cli.command(name='ns-list')
70 @click.pass_context
71 def ns_list(ctx):
72 resp = ctx.obj.ns.list()
73 table = PrettyTable(
74 ['ns instance name',
75 'id',
76 'operational status',
77 'config status'])
78 for ns in resp:
79 nsopdata = ctx.obj.ns.get_opdata(ns['id'])
80 nsr = nsopdata['nsr:nsr']
81 table.add_row(
82 [nsr['name-ref'],
83 nsr['ns-instance-config-ref'],
84 nsr['operational-status'],
85 nsr['config-status']])
86 table.align = 'l'
87 print(table)
88
89
90 @cli.command(name='nsd-list')
91 @click.pass_context
92 def nsd_list(ctx):
93 resp = ctx.obj.nsd.list()
94 table = PrettyTable(['nsd name', 'id'])
95 for ns in resp:
96 table.add_row([ns['name'], ns['id']])
97 table.align = 'l'
98 print(table)
99
100
101 @cli.command(name='vnfd-list')
102 @click.pass_context
103 def vnfd_list(ctx):
104 resp = ctx.obj.vnfd.list()
105 table = PrettyTable(['vnfd name', 'id'])
106 for vnfd in resp:
107 table.add_row([vnfd['name'], vnfd['id']])
108 table.align = 'l'
109 print(table)
110
111
112 @cli.command(name='vnf-list')
113 @click.pass_context
114 def vnf_list(ctx):
115 resp = ctx.obj.vnf.list()
116 table = PrettyTable(
117 ['vnf name',
118 'id',
119 'operational status',
120 'config status'])
121 for vnfr in resp:
122 if 'mgmt-interface' not in vnfr:
123 vnfr['mgmt-interface'] = {}
124 vnfr['mgmt-interface']['ip-address'] = None
125 table.add_row(
126 [vnfr['name'],
127 vnfr['id'],
128 vnfr['operational-status'],
129 vnfr['config-status']])
130 table.align = 'l'
131 print(table)
132
133
134 @cli.command(name='vnf-show')
135 @click.argument('vnf_name')
136 @click.option('--filter', default=None)
137 @click.pass_context
138 def vnf_show(ctx, vnf_name, filter):
139 try:
140 resp = ctx.obj.vnf.get(vnf_name)
141 except ClientException as inst:
142 print(inst.message)
143 exit(1)
144
145 table = PrettyTable(['field', 'value'])
146 for k, v in resp.items():
147 if filter is None or filter in k:
148 table.add_row([k, json.dumps(v, indent=2)])
149 table.align = 'l'
150 print(table)
151
152
153 @cli.command(name='vnf-monitoring-show')
154 @click.argument('vnf_name')
155 @click.pass_context
156 def vnf_monitoring_show(ctx, vnf_name):
157 try:
158 resp = ctx.obj.vnf.get_monitoring(vnf_name)
159 except ClientException as inst:
160 print(inst.message)
161 exit(1)
162
163 table = PrettyTable(['vnf name', 'monitoring name', 'value', 'units'])
164 if resp is not None:
165 for monitor in resp:
166 table.add_row(
167 [vnf_name,
168 monitor['name'],
169 monitor['value-integer'],
170 monitor['units']])
171 table.align = 'l'
172 print(table)
173
174
175 @cli.command(name='ns-monitoring-show')
176 @click.argument('ns_name')
177 @click.pass_context
178 def ns_monitoring_show(ctx, ns_name):
179 try:
180 resp = ctx.obj.ns.get_monitoring(ns_name)
181 except ClientException as inst:
182 print(inst.message)
183 exit(1)
184
185 table = PrettyTable(['vnf name', 'monitoring name', 'value', 'units'])
186 for key, val in resp.items():
187 for monitor in val:
188 table.add_row(
189 [key,
190 monitor['name'],
191 monitor['value-integer'],
192 monitor['units']])
193 table.align = 'l'
194 print(table)
195
196
197 @cli.command(name='ns-create')
198 @click.option('--ns_name',
199 prompt=True)
200 @click.option('--nsd_name',
201 prompt=True)
202 @click.option('--vim_account',
203 prompt=True)
204 @click.option('--admin_status',
205 default='ENABLED',
206 help='administration status')
207 @click.option('--ssh_keys',
208 default=None,
209 help='comma separated list of keys to inject to vnfs')
210 @click.option('--config',
211 default=None,
212 help='ns specific yaml configuration')
213 @click.pass_context
214 def ns_create(ctx,
215 nsd_name,
216 ns_name,
217 vim_account,
218 admin_status,
219 ssh_keys,
220 config):
221 try:
222 ctx.obj.ns.create(
223 nsd_name,
224 ns_name,
225 config=config,
226 ssh_keys=ssh_keys,
227 account=vim_account)
228 except ClientException as inst:
229 print(inst.message)
230 exit(1)
231
232
233 @cli.command(name='ns-delete')
234 @click.argument('ns_name')
235 @click.pass_context
236 def ns_delete(ctx, ns_name):
237 try:
238 ctx.obj.ns.delete(ns_name)
239 except ClientException as inst:
240 print(inst.message)
241 exit(1)
242
243
244 @cli.command(name='upload-package')
245 @click.argument('filename')
246 @click.pass_context
247 def upload_package(ctx, filename):
248 try:
249 ctx.obj.package.upload(filename)
250 ctx.obj.package.wait_for_upload(filename)
251 except ClientException as inst:
252 print(inst.message)
253 exit(1)
254
255
256 @cli.command(name='ns-show')
257 @click.argument('ns_name')
258 @click.option('--filter', default=None)
259 @click.pass_context
260 def ns_show(ctx, ns_name, filter):
261 try:
262 ns = ctx.obj.ns.get(ns_name)
263 except ClientException as inst:
264 print(inst.message)
265 exit(1)
266
267 table = PrettyTable(['field', 'value'])
268
269 for k, v in ns.items():
270 if filter is None or filter in k:
271 table.add_row([k, json.dumps(v, indent=2)])
272
273 nsopdata = ctx.obj.ns.get_opdata(ns['id'])
274 nsr_optdata = nsopdata['nsr:nsr']
275 for k, v in nsr_optdata.items():
276 if filter is None or filter in k:
277 table.add_row([k, json.dumps(v, indent=2)])
278 table.align = 'l'
279 print(table)
280
281
282 @cli.command(name='ns-scaling-show')
283 @click.argument('ns_name')
284 @click.pass_context
285 def show_ns_scaling(ctx, ns_name):
286 resp = ctx.obj.ns.list()
287
288 table = PrettyTable(
289 ['group-name',
290 'instance-id',
291 'operational status',
292 'create-time',
293 'vnfr ids'])
294
295 for ns in resp:
296 if ns_name == ns['name']:
297 nsopdata = ctx.obj.ns.get_opdata(ns['id'])
298 scaling_records = nsopdata['nsr:nsr']['scaling-group-record']
299 for record in scaling_records:
300 if 'instance' in record:
301 instances = record['instance']
302 for inst in instances:
303 table.add_row(
304 [record['scaling-group-name-ref'],
305 inst['instance-id'],
306 inst['op-status'],
307 time.strftime('%Y-%m-%d %H:%M:%S',
308 time.localtime(
309 inst['create-time'])),
310 inst['vnfrs']])
311 table.align = 'l'
312 print(table)
313
314
315 @cli.command(name='ns-scale')
316 @click.argument('ns_name')
317 @click.option('--ns_scale_group', prompt=True)
318 @click.option('--index', prompt=True)
319 @click.pass_context
320 def ns_scale(ctx, ns_name, ns_scale_group, index):
321 ctx.obj.ns.scale(ns_name, ns_scale_group, index)
322
323
324 @cli.command(name='nsd-delete')
325 @click.argument('nsd_name')
326 @click.pass_context
327 def nsd_delete(ctx, nsd_name):
328 try:
329 ctx.obj.nsd.delete(nsd_name)
330 except ClientException as inst:
331 print(inst.message)
332 exit(1)
333
334
335 @cli.command(name='vnfd-delete')
336 @click.argument('vnfd_name')
337 @click.pass_context
338 def vnfd_delete(ctx, vnfd_name):
339 try:
340 ctx.obj.vnfd.delete(vnfd_name)
341 except ClientException as inst:
342 print(inst.message)
343 exit(1)
344
345
346 @cli.command(name='config-agent-list')
347 @click.pass_context
348 def config_agent_list(ctx):
349 table = PrettyTable(['name', 'account-type', 'details'])
350 for account in ctx.obj.vca.list():
351 table.add_row(
352 [account['name'],
353 account['account-type'],
354 account['juju']])
355 table.align = 'l'
356 print(table)
357
358
359 @cli.command(name='config-agent-delete')
360 @click.argument('name')
361 @click.pass_context
362 def config_agent_delete(ctx, name):
363 try:
364 ctx.obj.vca.delete(name)
365 except ClientException as inst:
366 print(inst.message)
367 exit(1)
368
369
370 @cli.command(name='config-agent-add')
371 @click.option('--name',
372 prompt=True)
373 @click.option('--account_type',
374 prompt=True)
375 @click.option('--server',
376 prompt=True)
377 @click.option('--user',
378 prompt=True)
379 @click.option('--secret',
380 prompt=True,
381 hide_input=True,
382 confirmation_prompt=True)
383 @click.pass_context
384 def config_agent_add(ctx, name, account_type, server, user, secret):
385 try:
386 ctx.obj.vca.create(name, account_type, server, user, secret)
387 except ClientException as inst:
388 print(inst.message)
389 exit(1)
390
391
392 @cli.command(name='vim-create')
393 @click.option('--name',
394 prompt=True,
395 help='Name to create datacenter')
396 @click.option('--user',
397 prompt=True,
398 help='VIM username')
399 @click.option('--password',
400 prompt=True,
401 hide_input=True,
402 confirmation_prompt=True,
403 help='VIM password')
404 @click.option('--auth_url',
405 prompt=True,
406 help='VIM connector url')
407 @click.option('--tenant',
408 prompt=True,
409 help='tenant name')
410 @click.option('--config',
411 default=None,
412 help='VIM specific config parameters')
413 @click.option('--account_type',
414 default='openstack',
415 help='VIM type')
416 @click.option('--description',
417 default='no description')
418 @click.pass_context
419 def vim_create(ctx,
420 name,
421 user,
422 password,
423 auth_url,
424 tenant,
425 config,
426 account_type,
427 description):
428 vim = {}
429 vim['vim-username'] = user
430 vim['vim-password'] = password
431 vim['vim-url'] = auth_url
432 vim['vim-tenant-name'] = tenant
433 vim['config'] = config
434 vim['vim-type'] = account_type
435 vim['description'] = description
436 try:
437 ctx.obj.vim.create(name, vim)
438 except ClientException as inst:
439 print(inst.message)
440 exit(1)
441
442
443 @cli.command(name='vim-delete')
444 @click.argument('name')
445 @click.pass_context
446 def vim_delete(ctx, name):
447 try:
448 ctx.obj.vim.delete(name)
449 except ClientException as inst:
450 print(inst.message)
451 exit(1)
452
453
454 @cli.command(name='vim-list')
455 @click.option('--ro_update/--no_ro_update',
456 default=False,
457 help='update list from RO')
458 @click.pass_context
459 def vim_list(ctx, ro_update):
460 resp = ctx.obj.vim.list(ro_update)
461 table = PrettyTable(['vim name', 'uuid'])
462 for vim in resp:
463 table.add_row([vim['name'], vim['uuid']])
464 table.align = 'l'
465 print(table)
466
467
468 @cli.command(name='vim-show')
469 @click.argument('name')
470 @click.pass_context
471 def vim_show(ctx, name):
472 try:
473 resp = ctx.obj.vim.get(name)
474 except ClientException as inst:
475 print(inst.message)
476 exit(1)
477
478 table = PrettyTable(['key', 'attribute'])
479 for k, v in resp.items():
480 table.add_row([k, json.dumps(v, indent=2)])
481 table.align = 'l'
482 print(table)
483
484
485 @cli.command(name='ro-dump')
486 @click.pass_context
487 def ro_dump(ctx):
488 resp = ctx.obj.vim.get_resource_orchestrator()
489 table = PrettyTable(['key', 'attribute'])
490 for k, v in resp.items():
491 table.add_row([k, json.dumps(v, indent=2)])
492 table.align = 'l'
493 print(table)
494
495
496 @cli.command(name='vcs-list')
497 @click.pass_context
498 def vcs_list(ctx):
499 resp = ctx.obj.utils.get_vcs_info()
500 table = PrettyTable(['component name', 'state'])
501 for component in resp:
502 table.add_row([component['component_name'], component['state']])
503 table.align = 'l'
504 print(table)
505
506
507 if __name__ == '__main__':
508 cli()