1 # Copyright 2017-2018 Sandvine
2 # Copyright 2018 Telefonica
6 # Licensed under the Apache License, Version 2.0 (the "License"); you may
7 # not use this file except in compliance with the License. You may obtain
8 # a copy of the License at
10 # http://www.apache.org/licenses/LICENSE-2.0
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15 # License for the specific language governing permissions and limitations
22 from osmclient
import client
23 from osmclient
.common
.exceptions
import ClientException
24 from prettytable
import PrettyTable
29 def check_client_version(obj
, what
, version
='sol005'):
31 Checks the version of the client object and raises error if it not the expected.
33 :param obj: the client object
34 :what: the function or command under evaluation (used when an error is raised)
36 :raises ClientError: if the specified version does not match the client version
38 fullclassname
= obj
.__module
__ + "." + obj
.__class
__.__name
__
39 message
= 'The following commands or options are only supported with the option "--sol005": {}'.format(what
)
41 message
= 'The following commands or options are not supported when using option "--sol005": {}'.format(what
)
42 if fullclassname
!= 'osmclient.{}.client.Client'.format(version
):
43 raise ClientException(message
)
47 @click.option('--hostname',
49 envvar
='OSM_HOSTNAME',
50 help='hostname of server. ' +
51 'Also can set OSM_HOSTNAME in environment')
52 @click.option('--so-port',
55 help='hostname of server. ' +
56 'Also can set OSM_SO_PORT in environment')
57 @click.option('--so-project',
59 envvar
='OSM_SO_PROJECT',
60 help='Project Name in SO. ' +
61 'Also can set OSM_SO_PROJECT in environment')
62 @click.option('--ro-hostname',
64 envvar
='OSM_RO_HOSTNAME',
65 help='hostname of RO server. ' +
66 'Also can set OSM_RO_HOSTNAME in environment')
67 @click.option('--ro-port',
70 help='hostname of RO server. ' +
71 'Also can set OSM_RO_PORT in environment')
72 @click.option('--sol005',
75 help='Use ETSI NFV SOL005 API')
77 def cli(ctx
, hostname
, so_port
, so_project
, ro_hostname
, ro_port
, sol005
):
80 "either hostname option or OSM_HOSTNAME " +
81 "environment variable needs to be specified")
84 if so_port
is not None:
85 kwargs
['so_port']=so_port
86 if so_project
is not None:
87 kwargs
['so_project']=so_project
88 if ro_hostname
is not None:
89 kwargs
['ro_host']=ro_hostname
90 if ro_port
is not None:
91 kwargs
['ro_port']=ro_port
93 ctx
.obj
= client
.Client(host
=hostname
, sol005
=sol005
, **kwargs
)
100 @cli.command(name
='ns-list')
101 @click.option('--filter', default
=None,
102 help='restricts the list to the NS instances matching the filter')
104 def ns_list(ctx
, filter):
105 '''list all NS instances'''
107 check_client_version(ctx
.obj
, '--filter')
108 resp
= ctx
.obj
.ns
.list(filter)
110 resp
= ctx
.obj
.ns
.list()
114 'operational status',
118 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
119 if fullclassname
== 'osmclient.sol005.client.Client':
121 nsr_name
= nsr
['name']
124 nsopdata
= ctx
.obj
.ns
.get_opdata(ns
['id'])
125 nsr
= nsopdata
['nsr:nsr']
126 nsr_name
= nsr
['name-ref']
127 nsr_id
= nsr
['ns-instance-config-ref']
128 opstatus
= nsr
['operational-status'] if 'operational-status' in nsr
else 'Not found'
129 configstatus
= nsr
['config-status'] if 'config-status' in nsr
else 'Not found'
130 detailed_status
= nsr
['detailed-status'] if 'detailed-status' in nsr
else 'Not found'
131 if configstatus
== "config_not_needed":
132 configstatus
= "configured (no charms)"
143 def nsd_list(ctx
, filter):
145 check_client_version(ctx
.obj
, '--filter')
146 resp
= ctx
.obj
.nsd
.list(filter)
148 resp
= ctx
.obj
.nsd
.list()
149 #print yaml.safe_dump(resp)
150 table
= PrettyTable(['nsd name', 'id'])
151 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
152 if fullclassname
== 'osmclient.sol005.client.Client':
154 name
= ns
['name'] if 'name' in ns
else '-'
155 table
.add_row([name
, ns
['_id']])
158 table
.add_row([ns
['name'], ns
['id']])
163 @cli.command(name
='nsd-list')
164 @click.option('--filter', default
=None,
165 help='restricts the list to the NSD/NSpkg matching the filter')
167 def nsd_list1(ctx
, filter):
168 '''list all NSD/NSpkg in the system'''
172 @cli.command(name
='nspkg-list')
173 @click.option('--filter', default
=None,
174 help='restricts the list to the NSD/NSpkg matching the filter')
176 def nsd_list2(ctx
, filter):
177 '''list all NSD/NSpkg in the system'''
181 def vnfd_list(ctx
, filter):
183 check_client_version(ctx
.obj
, '--filter')
184 resp
= ctx
.obj
.vnfd
.list(filter)
186 resp
= ctx
.obj
.vnfd
.list()
187 #print yaml.safe_dump(resp)
188 table
= PrettyTable(['vnfd name', 'id'])
189 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
190 if fullclassname
== 'osmclient.sol005.client.Client':
192 name
= vnfd
['name'] if 'name' in vnfd
else '-'
193 table
.add_row([name
, vnfd
['_id']])
196 table
.add_row([vnfd
['name'], vnfd
['id']])
201 @cli.command(name
='vnfd-list')
202 @click.option('--filter', default
=None,
203 help='restricts the list to the VNFD/VNFpkg matching the filter')
205 def vnfd_list1(ctx
, filter):
206 '''list all VNFD/VNFpkg in the system'''
207 vnfd_list(ctx
,filter)
210 @cli.command(name
='vnfpkg-list')
211 @click.option('--filter', default
=None,
212 help='restricts the list to the VNFD/VNFpkg matching the filter')
214 def vnfd_list2(ctx
, filter):
215 '''list all VNFD/VNFpkg in the system'''
216 vnfd_list(ctx
,filter)
219 @cli.command(name
='vnf-list')
222 ''' list all VNF instances'''
224 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
225 resp
= ctx
.obj
.vnf
.list()
226 except ClientException
as inst
:
232 'operational status',
235 if 'mgmt-interface' not in vnfr
:
236 vnfr
['mgmt-interface'] = {}
237 vnfr
['mgmt-interface']['ip-address'] = None
241 vnfr
['operational-status'],
242 vnfr
['config-status']])
246 @cli.command(name
='ns-op-list')
247 @click.argument('name')
249 def ns_op_list(ctx
, name
):
250 '''shows the history of operations over a NS instance
252 NAME: name or ID of the NS instance
255 check_client_version(ctx
.obj
, ctx
.command
.name
)
256 resp
= ctx
.obj
.ns
.list_op(name
)
257 except ClientException
as inst
:
261 table
= PrettyTable(['id', 'operation', 'status'])
263 table
.add_row([op
['id'], op
['lcmOperationType'],
264 op
['operationState']])
272 def nsd_show(ctx
, name
, literal
):
274 resp
= ctx
.obj
.nsd
.get(name
)
275 #resp = ctx.obj.nsd.get_individual(name)
276 except ClientException
as inst
:
281 print yaml
.safe_dump(resp
)
284 table
= PrettyTable(['field', 'value'])
285 for k
, v
in resp
.items():
286 table
.add_row([k
, json
.dumps(v
, indent
=2)])
291 @cli.command(name
='nsd-show', short_help
='shows the content of a NSD')
292 @click.option('--literal', is_flag
=True,
293 help='print literally, no pretty table')
294 @click.argument('name')
296 def nsd_show1(ctx
, name
, literal
):
297 '''shows the content of a NSD
299 NAME: name or ID of the NSD/NSpkg
301 nsd_show(ctx
, name
, literal
)
304 @cli.command(name
='nspkg-show', short_help
='shows the content of a NSD')
305 @click.option('--literal', is_flag
=True,
306 help='print literally, no pretty table')
307 @click.argument('name')
309 def nsd_show2(ctx
, name
, literal
):
310 '''shows the content of a NSD
312 NAME: name or ID of the NSD/NSpkg
314 nsd_show(ctx
, name
, literal
)
317 def vnfd_show(ctx
, name
, literal
):
319 resp
= ctx
.obj
.vnfd
.get(name
)
320 #resp = ctx.obj.vnfd.get_individual(name)
321 except ClientException
as inst
:
326 print yaml
.safe_dump(resp
)
329 table
= PrettyTable(['field', 'value'])
330 for k
, v
in resp
.items():
331 table
.add_row([k
, json
.dumps(v
, indent
=2)])
336 @cli.command(name
='vnfd-show', short_help
='shows the content of a VNFD')
337 @click.option('--literal', is_flag
=True,
338 help='print literally, no pretty table')
339 @click.argument('name')
341 def vnfd_show1(ctx
, name
, literal
):
342 '''shows the content of a VNFD
344 NAME: name or ID of the VNFD/VNFpkg
346 vnfd_show(ctx
, name
, literal
)
349 @cli.command(name
='vnfpkg-show', short_help
='shows the content of a VNFD')
350 @click.option('--literal', is_flag
=True,
351 help='print literally, no pretty table')
352 @click.argument('name')
354 def vnfd_show2(ctx
, name
, literal
):
355 '''shows the content of a VNFD
357 NAME: name or ID of the VNFD/VNFpkg
359 vnfd_show(ctx
, name
, literal
)
362 @cli.command(name
='ns-show', short_help
='shows the info of a NS instance')
363 @click.argument('name')
364 @click.option('--literal', is_flag
=True,
365 help='print literally, no pretty table')
366 @click.option('--filter', default
=None)
368 def ns_show(ctx
, name
, literal
, filter):
369 '''shows the info of a NS instance
371 NAME: name or ID of the NS instance
374 ns
= ctx
.obj
.ns
.get(name
)
375 except ClientException
as inst
:
380 print yaml
.safe_dump(resp
)
383 table
= PrettyTable(['field', 'value'])
385 for k
, v
in ns
.items():
386 if filter is None or filter in k
:
387 table
.add_row([k
, json
.dumps(v
, indent
=2)])
389 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
390 if fullclassname
!= 'osmclient.sol005.client.Client':
391 nsopdata
= ctx
.obj
.ns
.get_opdata(ns
['id'])
392 nsr_optdata
= nsopdata
['nsr:nsr']
393 for k
, v
in nsr_optdata
.items():
394 if filter is None or filter in k
:
395 table
.add_row([k
, json
.dumps(v
, indent
=2)])
400 @cli.command(name
='vnf-show', short_help
='shows the info of a VNF instance')
401 @click.argument('name')
402 @click.option('--literal', is_flag
=True,
403 help='print literally, no pretty table')
404 @click.option('--filter', default
=None)
406 def vnf_show(ctx
, name
, literal
, filter):
407 '''shows the info of a VNF instance
409 NAME: name or ID of the VNF instance
412 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
413 resp
= ctx
.obj
.vnf
.get(name
)
414 except ClientException
as inst
:
419 print yaml
.safe_dump(resp
)
422 table
= PrettyTable(['field', 'value'])
423 for k
, v
in resp
.items():
424 if filter is None or filter in k
:
425 table
.add_row([k
, json
.dumps(v
, indent
=2)])
430 @cli.command(name
='vnf-monitoring-show')
431 @click.argument('vnf_name')
433 def vnf_monitoring_show(ctx
, vnf_name
):
435 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
436 resp
= ctx
.obj
.vnf
.get_monitoring(vnf_name
)
437 except ClientException
as inst
:
441 table
= PrettyTable(['vnf name', 'monitoring name', 'value', 'units'])
447 monitor
['value-integer'],
453 @cli.command(name
='ns-monitoring-show')
454 @click.argument('ns_name')
456 def ns_monitoring_show(ctx
, ns_name
):
458 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
459 resp
= ctx
.obj
.ns
.get_monitoring(ns_name
)
460 except ClientException
as inst
:
464 table
= PrettyTable(['vnf name', 'monitoring name', 'value', 'units'])
465 for key
, val
in resp
.items():
470 monitor
['value-integer'],
475 @cli.command(name
='ns-op-show', short_help
='shows the info of an operation')
476 @click.argument('id')
477 @click.option('--filter', default
=None)
479 def ns_op_show(ctx
, id, filter):
480 '''shows the detailed info of an operation
482 ID: operation identifier
485 check_client_version(ctx
.obj
, ctx
.command
.name
)
486 op_info
= ctx
.obj
.ns
.get_op(id)
487 except ClientException
as inst
:
491 table
= PrettyTable(['field', 'value'])
492 for k
, v
in op_info
.items():
493 if filter is None or filter in k
:
494 table
.add_row([k
, json
.dumps(v
, indent
=2)])
503 def nsd_create(ctx
, filename
, overwrite
):
505 check_client_version(ctx
.obj
, ctx
.command
.name
)
506 ctx
.obj
.nsd
.create(filename
, overwrite
)
507 except ClientException
as inst
:
512 @cli.command(name
='nsd-create', short_help
='creates a new NSD/NSpkg')
513 @click.argument('filename')
514 @click.option('--overwrite', default
=None,
515 help='overwrites some fields in NSD')
517 def nsd_create1(ctx
, filename
, overwrite
):
518 '''creates a new NSD/NSpkg
520 FILENAME: NSD yaml file or NSpkg tar.gz file
522 nsd_create(ctx
, filename
, overwrite
)
525 @cli.command(name
='nspkg-create', short_help
='creates a new NSD/NSpkg')
526 @click.argument('filename')
527 @click.option('--overwrite', default
=None,
528 help='overwrites some fields in NSD')
530 def nsd_create2(ctx
, filename
, overwrite
):
531 '''creates a new NSD/NSpkg
533 FILENAME: NSD yaml file or NSpkg tar.gz file
535 nsd_create(ctx
, filename
, overwrite
)
538 def vnfd_create(ctx
, filename
, overwrite
):
540 check_client_version(ctx
.obj
, ctx
.command
.name
)
541 ctx
.obj
.vnfd
.create(filename
, overwrite
)
542 except ClientException
as inst
:
547 @cli.command(name
='vnfd-create', short_help
='creates a new VNFD/VNFpkg')
548 @click.argument('filename')
549 @click.option('--overwrite', default
=None,
550 help='overwrites some fields in VNFD')
552 def vnfd_create1(ctx
, filename
, overwrite
):
553 '''creates a new VNFD/VNFpkg
555 FILENAME: VNFD yaml file or VNFpkg tar.gz file
557 vnfd_create(ctx
, filename
, overwrite
)
560 @cli.command(name
='vnfpkg-create', short_help
='creates a new VNFD/VNFpkg')
561 @click.argument('filename')
562 @click.option('--overwrite', default
=None,
563 help='overwrites some fields in VNFD')
565 def vnfd_create2(ctx
, filename
, overwrite
):
566 '''creates a new VNFD/VNFpkg
568 FILENAME: VNFD yaml file or VNFpkg tar.gz file
570 vnfd_create(ctx
, filename
, overwrite
)
573 @cli.command(name
='ns-create')
574 @click.option('--ns_name',
576 @click.option('--nsd_name',
578 @click.option('--vim_account',
580 @click.option('--admin_status',
582 help='administration status')
583 @click.option('--ssh_keys',
585 help='comma separated list of keys to inject to vnfs')
586 @click.option('--config',
588 help='ns specific yaml configuration:\nvnf: [member-vnf-index: TEXT, vim_account: TEXT]\n'
589 'vld: [name: TEXT, vim-network-name: TEXT or DICT with vim_account, vim_net entries]')
598 '''creates a new NS instance'''
601 # check_client_version(ctx.obj, '--config', 'v1')
608 except ClientException
as inst
:
617 def nsd_update(ctx
, name
, content
):
619 check_client_version(ctx
.obj
, ctx
.command
.name
)
620 ctx
.obj
.nsd
.update(name
, content
)
621 except ClientException
as inst
:
625 @cli.command(name
='nsd-update', short_help
='updates a NSD/NSpkg')
626 @click.argument('name')
627 @click.option('--content', default
=None,
628 help='filename with the NSD/NSpkg replacing the current one')
630 def nsd_update1(ctx
, name
, content
):
631 '''updates a NSD/NSpkg
633 NAME: name or ID of the NSD/NSpkg
635 nsd_update(ctx
, name
, content
)
638 @cli.command(name
='nspkg-update', short_help
='updates a NSD/NSpkg')
639 @click.argument('name')
640 @click.option('--content', default
=None,
641 help='filename with the NSD/NSpkg replacing the current one')
643 def nsd_update2(ctx
, name
, content
):
644 '''updates a NSD/NSpkg
646 NAME: name or ID of the NSD/NSpkg
648 nsd_update(ctx
, name
, content
)
651 def vnfd_update(ctx
, name
, content
):
653 check_client_version(ctx
.obj
, ctx
.command
.name
)
654 ctx
.obj
.vnfd
.update(name
, content
)
655 except ClientException
as inst
:
660 @cli.command(name
='vnfd-update', short_help
='updates a new VNFD/VNFpkg')
661 @click.argument('name')
662 @click.option('--content', default
=None,
663 help='filename with the VNFD/VNFpkg replacing the current one')
665 def vnfd_update1(ctx
, name
, content
):
666 '''updates a VNFD/VNFpkg
668 NAME: name or ID of the VNFD/VNFpkg
670 vnfd_update(ctx
, name
, content
)
673 @cli.command(name
='vnfpkg-update', short_help
='updates a VNFD/VNFpkg')
674 @click.argument('name')
675 @click.option('--content', default
=None,
676 help='filename with the VNFD/VNFpkg replacing the current one')
678 def vnfd_update2(ctx
, name
, content
):
679 '''updates a VNFD/VNFpkg
681 NAME: VNFD yaml file or VNFpkg tar.gz file
683 vnfd_update(ctx
, name
, content
)
690 def nsd_delete(ctx
, name
, force
):
693 ctx
.obj
.nsd
.delete(name
)
695 check_client_version(ctx
.obj
, '--force')
696 ctx
.obj
.nsd
.delete(name
, force
)
697 except ClientException
as inst
:
702 @cli.command(name
='nsd-delete', short_help
='deletes a NSD/NSpkg')
703 @click.argument('name')
704 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
706 def nsd_delete1(ctx
, name
, force
):
707 '''deletes a NSD/NSpkg
709 NAME: name or ID of the NSD/NSpkg to be deleted
711 nsd_delete(ctx
, name
, force
)
714 @cli.command(name
='nspkg-delete', short_help
='deletes a NSD/NSpkg')
715 @click.argument('name')
716 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
718 def nsd_delete2(ctx
, name
, force
):
719 '''deletes a NSD/NSpkg
721 NAME: name or ID of the NSD/NSpkg to be deleted
723 nsd_delete(ctx
, name
, force
)
726 def vnfd_delete(ctx
, name
, force
):
729 ctx
.obj
.vnfd
.delete(name
)
731 check_client_version(ctx
.obj
, '--force')
732 ctx
.obj
.vnfd
.delete(name
, force
)
733 except ClientException
as inst
:
738 @cli.command(name
='vnfd-delete', short_help
='deletes a VNFD/VNFpkg')
739 @click.argument('name')
740 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
742 def vnfd_delete1(ctx
, name
, force
):
743 '''deletes a VNFD/VNFpkg
745 NAME: name or ID of the VNFD/VNFpkg to be deleted
747 vnfd_delete(ctx
, name
, force
)
750 @cli.command(name
='vnfpkg-delete', short_help
='deletes a VNFD/VNFpkg')
751 @click.argument('name')
752 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
754 def vnfd_delete2(ctx
, name
, force
):
755 '''deletes a VNFD/VNFpkg
757 NAME: name or ID of the VNFD/VNFpkg to be deleted
759 vnfd_delete(ctx
, name
, force
)
762 @cli.command(name
='ns-delete', short_help
='deletes a NS instance')
763 @click.argument('name')
764 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
766 def ns_delete(ctx
, name
, force
):
767 '''deletes a NS instance
769 NAME: name or ID of the NS instance to be deleted
773 ctx
.obj
.ns
.delete(name
)
775 check_client_version(ctx
.obj
, '--force')
776 ctx
.obj
.ns
.delete(name
, force
)
777 except ClientException
as inst
:
786 @cli.command(name
='vim-create')
787 @click.option('--name',
789 help='Name to create datacenter')
790 @click.option('--user',
793 @click.option('--password',
796 confirmation_prompt
=True,
798 @click.option('--auth_url',
801 @click.option('--tenant',
803 help='VIM tenant name')
804 @click.option('--config',
806 help='VIM specific config parameters')
807 @click.option('--account_type',
810 @click.option('--description',
811 default
='no description',
812 help='human readable description')
823 '''creates a new VIM account
826 vim
['vim-username'] = user
827 vim
['vim-password'] = password
828 vim
['vim-url'] = auth_url
829 vim
['vim-tenant-name'] = tenant
830 vim
['config'] = config
831 vim
['vim-type'] = account_type
832 vim
['description'] = description
834 ctx
.obj
.vim
.create(name
, vim
)
835 except ClientException
as inst
:
840 @cli.command(name
='vim-update', short_help
='updates a VIM account')
841 @click.argument('name')
842 @click.option('--newname', default
=None, help='New name for the VIM account')
843 @click.option('--user', default
=None, help='VIM username')
844 @click.option('--password', default
=None, help='VIM password')
845 @click.option('--auth_url', default
=None, help='VIM url')
846 @click.option('--tenant', default
=None, help='VIM tenant name')
847 @click.option('--config', default
=None, help='VIM specific config parameters')
848 @click.option('--account_type', default
=None, help='VIM type')
849 @click.option('--description', default
=None, help='human readable description')
861 '''updates a VIM account
863 NAME: name or ID of the VIM account
867 vim
['name'] = newname
868 vim
['vim_user'] = user
869 vim
['vim_password'] = password
870 vim
['vim_url'] = auth_url
871 vim
['vim-tenant-name'] = tenant
872 vim
['config'] = config
873 vim
['vim_type'] = account_type
874 vim
['description'] = description
876 check_client_version(ctx
.obj
, ctx
.command
.name
)
877 ctx
.obj
.vim
.update(name
, vim
)
878 except ClientException
as inst
:
883 @cli.command(name
='vim-delete')
884 @click.argument('name')
885 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
887 def vim_delete(ctx
, name
, force
):
888 '''deletes a VIM account
890 NAME: name or ID of the VIM account to be deleted
894 ctx
.obj
.vim
.delete(name
)
896 check_client_version(ctx
.obj
, '--force')
897 ctx
.obj
.vim
.delete(name
, force
)
898 except ClientException
as inst
:
903 @cli.command(name
='vim-list')
904 @click.option('--ro_update/--no_ro_update',
906 help='update list from RO')
907 @click.option('--filter', default
=None,
908 help='restricts the list to the VIM accounts matching the filter')
910 def vim_list(ctx
, ro_update
, filter):
911 '''list all VIM accounts'''
913 check_client_version(ctx
.obj
, '--filter')
915 check_client_version(ctx
.obj
, '--ro_update', 'v1')
916 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
917 if fullclassname
== 'osmclient.sol005.client.Client':
918 resp
= ctx
.obj
.vim
.list(filter)
920 resp
= ctx
.obj
.vim
.list(ro_update
)
921 table
= PrettyTable(['vim name', 'uuid'])
923 table
.add_row([vim
['name'], vim
['uuid']])
928 @cli.command(name
='vim-show')
929 @click.argument('name')
931 def vim_show(ctx
, name
):
932 '''shows the details of a VIM account
934 NAME: name or ID of the VIM account
937 resp
= ctx
.obj
.vim
.get(name
)
938 if 'vim_password' in resp
:
939 resp
['vim_password']='********'
940 except ClientException
as inst
:
944 table
= PrettyTable(['key', 'attribute'])
945 for k
, v
in resp
.items():
946 table
.add_row([k
, json
.dumps(v
, indent
=2)])
952 # SDN controller operations
955 @cli.command(name
='sdnc-create')
956 @click.option('--name',
958 help='Name to create sdn controller')
959 @click.option('--type',
961 help='SDN controller type')
962 @click.option('--sdn_controller_version',
963 help='SDN controller username')
964 @click.option('--ip_address',
966 help='SDN controller IP address')
967 @click.option('--port',
969 help='SDN controller port')
970 @click.option('--switch_dpid',
972 help='Switch DPID (Openflow Datapath ID)')
973 @click.option('--user',
974 help='SDN controller username')
975 @click.option('--password',
977 confirmation_prompt
=True,
978 help='SDN controller password')
979 #@click.option('--description',
980 # default='no description',
981 # help='human readable description')
986 sdn_controller_version
,
992 '''creates a new SDN controller
995 sdncontroller
['name'] = name
996 sdncontroller
['type'] = type
997 sdncontroller
['ip'] = ip_address
998 sdncontroller
['port'] = int(port
)
999 sdncontroller
['dpid'] = switch_dpid
1000 if sdn_controller_version
:
1001 sdncontroller
['version'] = sdn_controller_version
1003 sdncontroller
['user'] = user
1005 sdncontroller
['password'] = password
1006 # sdncontroller['description'] = description
1008 check_client_version(ctx
.obj
, ctx
.command
.name
)
1009 ctx
.obj
.sdnc
.create(name
, sdncontroller
)
1010 except ClientException
as inst
:
1014 @cli.command(name
='sdnc-update', short_help
='updates an SDN controller')
1015 @click.argument('name')
1016 @click.option('--newname', help='New name for the SDN controller')
1017 @click.option('--type', help='SDN controller type')
1018 @click.option('--sdn_controller_version', help='SDN controller username')
1019 @click.option('--ip_address', help='SDN controller IP address')
1020 @click.option('--port', help='SDN controller port')
1021 @click.option('--switch_dpid', help='Switch DPID (Openflow Datapath ID)')
1022 @click.option('--user', help='SDN controller username')
1023 @click.option('--password', help='SDN controller password')
1024 #@click.option('--description', default=None, help='human readable description')
1026 def sdnc_update(ctx
,
1030 sdn_controller_version
,
1036 '''updates an SDN controller
1038 NAME: name or ID of the SDN controller
1041 if newname
: sdncontroller
['name'] = newname
1042 if type: sdncontroller
['type'] = type
1043 if ip_address
: sdncontroller
['ip'] = ip_address
1044 if port
: sdncontroller
['port'] = int(port
)
1045 if switch_dpid
: sdncontroller
['dpid'] = switch_dpid
1046 # sdncontroller['description'] = description
1047 if sdn_controller_version
is not None:
1048 if sdn_controller_version
=="":
1049 sdncontroller
['version'] = None
1051 sdncontroller
['version'] = sdn_controller_version
1052 if user
is not None:
1054 sdncontroller
['user'] = None
1056 sdncontroller
['user'] = user
1057 if password
is not None:
1059 sdncontroller
['password'] = None
1061 sdncontroller
['password'] = user
1063 check_client_version(ctx
.obj
, ctx
.command
.name
)
1064 ctx
.obj
.sdnc
.update(name
, sdncontroller
)
1065 except ClientException
as inst
:
1070 @cli.command(name
='sdnc-delete')
1071 @click.argument('name')
1072 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1074 def sdnc_delete(ctx
, name
, force
):
1075 '''deletes an SDN controller
1077 NAME: name or ID of the SDN controller to be deleted
1080 check_client_version(ctx
.obj
, ctx
.command
.name
)
1081 ctx
.obj
.sdnc
.delete(name
, force
)
1082 except ClientException
as inst
:
1087 @cli.command(name
='sdnc-list')
1088 @click.option('--filter', default
=None,
1089 help='restricts the list to the SDN controllers matching the filter')
1091 def sdnc_list(ctx
, filter):
1092 '''list all SDN controllers'''
1094 check_client_version(ctx
.obj
, ctx
.command
.name
)
1095 resp
= ctx
.obj
.sdnc
.list(filter)
1096 except ClientException
as inst
:
1099 table
= PrettyTable(['name', 'id'])
1101 table
.add_row([sdnc
['name'], sdnc
['_id']])
1106 @cli.command(name
='sdnc-show')
1107 @click.argument('name')
1109 def sdnc_show(ctx
, name
):
1110 '''shows the details of an SDN controller
1112 NAME: name or ID of the SDN controller
1115 check_client_version(ctx
.obj
, ctx
.command
.name
)
1116 resp
= ctx
.obj
.sdnc
.get(name
)
1117 except ClientException
as inst
:
1121 table
= PrettyTable(['key', 'attribute'])
1122 for k
, v
in resp
.items():
1123 table
.add_row([k
, json
.dumps(v
, indent
=2)])
1128 ####################
1129 # Fault Management operations
1130 ####################
1132 @cli.command(name
='ns-alarm-create')
1133 @click.argument('name')
1134 @click.option('--ns', prompt
=True, help='NS instance id or name')
1135 @click.option('--vnf', prompt
=True,
1136 help='VNF name (VNF member index as declared in the NSD)')
1137 @click.option('--vdu', prompt
=True,
1138 help='VDU name (VDU name as declared in the VNFD)')
1139 @click.option('--metric', prompt
=True,
1140 help='Name of the metric (e.g. cpu_utilization)')
1141 @click.option('--severity', default
='WARNING',
1142 help='severity of the alarm (WARNING, MINOR, MAJOR, CRITICAL, INDETERMINATE)')
1143 @click.option('--threshold_value', prompt
=True,
1144 help='threshold value that, when crossed, an alarm is triggered')
1145 @click.option('--threshold_operator', prompt
=True,
1146 help='threshold operator describing the comparison (GE, LE, GT, LT, EQ)')
1147 @click.option('--statistic', default
='AVERAGE',
1148 help='statistic (AVERAGE, MINIMUM, MAXIMUM, COUNT, SUM)')
1150 def ns_alarm_create(ctx
, name
, ns
, vnf
, vdu
, metric
, severity
,
1151 threshold_value
, threshold_operator
, statistic
):
1152 '''creates a new alarm for a NS instance'''
1153 ns_instance
= ctx
.obj
.ns
.get(ns
)
1155 alarm
['alarm_name'] = name
1156 alarm
['ns_id'] = ns_instance
['_id']
1157 alarm
['correlation_id'] = ns_instance
['_id']
1158 alarm
['vnf_member_index'] = vnf
1159 alarm
['vdu_name'] = vdu
1160 alarm
['metric_name'] = metric
1161 alarm
['severity'] = severity
1162 alarm
['threshold_value'] = int(threshold_value
)
1163 alarm
['operation'] = threshold_operator
1164 alarm
['statistic'] = statistic
1166 check_client_version(ctx
.obj
, ctx
.command
.name
)
1167 ctx
.obj
.ns
.create_alarm(alarm
)
1168 except ClientException
as inst
:
1173 #@cli.command(name='ns-alarm-delete')
1174 #@click.argument('name')
1175 #@click.pass_context
1176 #def ns_alarm_delete(ctx, name):
1177 # '''deletes an alarm
1179 # NAME: name of the alarm to be deleted
1182 # check_client_version(ctx.obj, ctx.command.name)
1183 # ctx.obj.ns.delete_alarm(name)
1184 # except ClientException as inst:
1185 # print(inst.message)
1189 ####################
1190 # Performance Management operations
1191 ####################
1193 @cli.command(name
='ns-metric-export')
1194 @click.option('--ns', prompt
=True, help='NS instance id or name')
1195 @click.option('--vnf', prompt
=True,
1196 help='VNF name (VNF member index as declared in the NSD)')
1197 @click.option('--vdu', prompt
=True,
1198 help='VDU name (VDU name as declared in the VNFD)')
1199 @click.option('--metric', prompt
=True,
1200 help='name of the metric (e.g. cpu_utilization)')
1201 #@click.option('--period', default='1w',
1202 # help='metric collection period (e.g. 20s, 30m, 2h, 3d, 1w)')
1203 @click.option('--interval', help='periodic interval (seconds) to export metrics continuously')
1205 def ns_metric_export(ctx
, ns
, vnf
, vdu
, metric
, interval
):
1206 '''exports a metric to the internal OSM bus, which can be read by other apps
1208 ns_instance
= ctx
.obj
.ns
.get(ns
)
1210 metric_data
['ns_id'] = ns_instance
['_id']
1211 metric_data
['correlation_id'] = ns_instance
['_id']
1212 metric_data
['vnf_member_index'] = vnf
1213 metric_data
['vdu_name'] = vdu
1214 metric_data
['metric_name'] = metric
1215 metric_data
['collection_unit'] = 'WEEK'
1216 metric_data
['collection_period'] = 1
1218 check_client_version(ctx
.obj
, ctx
.command
.name
)
1220 print '{}'.format(ctx
.obj
.ns
.export_metric(metric_data
))
1224 print '{} {}'.format(ctx
.obj
.ns
.export_metric(metric_data
),i
)
1225 time
.sleep(int(interval
))
1227 except ClientException
as inst
:
1232 ####################
1234 ####################
1236 @cli.command(name
='upload-package')
1237 @click.argument('filename')
1239 def upload_package(ctx
, filename
):
1240 '''uploads a VNF package or NS package
1242 FILENAME: VNF or NS package file (tar.gz)
1245 ctx
.obj
.package
.upload(filename
)
1246 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
1247 if fullclassname
!= 'osmclient.sol005.client.Client':
1248 ctx
.obj
.package
.wait_for_upload(filename
)
1249 except ClientException
as inst
:
1254 @cli.command(name
='ns-scaling-show')
1255 @click.argument('ns_name')
1257 def show_ns_scaling(ctx
, ns_name
):
1258 '''shows the status of a NS scaling operation
1260 NS_NAME: name of the NS instance being scaled
1263 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
1264 resp
= ctx
.obj
.ns
.list()
1265 except ClientException
as inst
:
1269 table
= PrettyTable(
1272 'operational status',
1277 if ns_name
== ns
['name']:
1278 nsopdata
= ctx
.obj
.ns
.get_opdata(ns
['id'])
1279 scaling_records
= nsopdata
['nsr:nsr']['scaling-group-record']
1280 for record
in scaling_records
:
1281 if 'instance' in record
:
1282 instances
= record
['instance']
1283 for inst
in instances
:
1285 [record
['scaling-group-name-ref'],
1286 inst
['instance-id'],
1288 time
.strftime('%Y-%m-%d %H:%M:%S',
1290 inst
['create-time'])),
1296 @cli.command(name
='ns-scale')
1297 @click.argument('ns_name')
1298 @click.option('--ns_scale_group', prompt
=True)
1299 @click.option('--index', prompt
=True)
1301 def ns_scale(ctx
, ns_name
, ns_scale_group
, index
):
1304 NS_NAME: name of the NS instance to be scaled
1307 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
1308 ctx
.obj
.ns
.scale(ns_name
, ns_scale_group
, index
)
1309 except ClientException
as inst
:
1314 @cli.command(name
='config-agent-list')
1316 def config_agent_list(ctx
):
1317 '''list config agents'''
1319 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
1320 except ClientException
as inst
:
1323 table
= PrettyTable(['name', 'account-type', 'details'])
1324 for account
in ctx
.obj
.vca
.list():
1327 account
['account-type'],
1333 @cli.command(name
='config-agent-delete')
1334 @click.argument('name')
1336 def config_agent_delete(ctx
, name
):
1337 '''deletes a config agent
1339 NAME: name of the config agent to be deleted
1342 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
1343 ctx
.obj
.vca
.delete(name
)
1344 except ClientException
as inst
:
1349 @cli.command(name
='config-agent-add')
1350 @click.option('--name',
1352 @click.option('--account_type',
1354 @click.option('--server',
1356 @click.option('--user',
1358 @click.option('--secret',
1361 confirmation_prompt
=True)
1363 def config_agent_add(ctx
, name
, account_type
, server
, user
, secret
):
1364 '''adds a config agent'''
1366 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
1367 ctx
.obj
.vca
.create(name
, account_type
, server
, user
, secret
)
1368 except ClientException
as inst
:
1372 @cli.command(name
='ro-dump')
1375 '''shows RO agent information'''
1376 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
1377 resp
= ctx
.obj
.vim
.get_resource_orchestrator()
1378 table
= PrettyTable(['key', 'attribute'])
1379 for k
, v
in resp
.items():
1380 table
.add_row([k
, json
.dumps(v
, indent
=2)])
1385 @cli.command(name
='vcs-list')
1388 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
1389 resp
= ctx
.obj
.utils
.get_vcs_info()
1390 table
= PrettyTable(['component name', 'state'])
1391 for component
in resp
:
1392 table
.add_row([component
['component_name'], component
['state']])
1397 @cli.command(name
='ns-action')
1398 @click.argument('ns_name')
1399 @click.option('--vnf_name', default
=None)
1400 @click.option('--action_name', prompt
=True)
1401 @click.option('--params', prompt
=True)
1408 '''executes an action/primitive over a NS instance
1410 NS_NAME: name or ID of the NS instance
1413 check_client_version(ctx
.obj
, ctx
.command
.name
)
1416 op_data
['vnf_member_index'] = vnf_name
1417 op_data
['primitive'] = action_name
1418 op_data
['primitive_params'] = yaml
.load(params
)
1419 ctx
.obj
.ns
.exec_op(ns_name
, op_name
='action', op_data
=op_data
)
1421 except ClientException
as inst
:
1426 if __name__
== '__main__':