c500286821ff1531c33328759046f499cbb0be1d
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
31 def check_client_version(obj
, what
, version
='sol005'):
33 Checks the version of the client object and raises error if it not the expected.
35 :param obj: the client object
36 :what: the function or command under evaluation (used when an error is raised)
38 :raises ClientError: if the specified version does not match the client version
40 fullclassname
= obj
.__module
__ + "." + obj
.__class
__.__name
__
41 message
= 'The following commands or options are only supported with the option "--sol005": {}'.format(what
)
43 message
= 'The following commands or options are not supported when using option "--sol005": {}'.format(what
)
44 if fullclassname
!= 'osmclient.{}.client.Client'.format(version
):
45 raise ClientException(message
)
50 @click.option('--hostname',
52 envvar
='OSM_HOSTNAME',
53 help='hostname of server. ' +
54 'Also can set OSM_HOSTNAME in environment')
55 @click.option('--sol005/--no-sol005',
58 help='Use ETSI NFV SOL005 API (default) or the previous SO API. ' +
59 'Also can set OSM_SOL005 in environment')
60 @click.option('--user',
63 help='user (only from Release FOUR, defaults to admin). ' +
64 'Also can set OSM_USER in environment')
65 @click.option('--password',
67 envvar
='OSM_PASSWORD',
68 help='password (only from Release FOUR, defaults to admin). ' +
69 'Also can set OSM_PASSWORD in environment')
70 @click.option('--project',
73 help='project (only from Release FOUR, defaults to admin). ' +
74 'Also can set OSM_PROJECT in environment')
75 @click.option('--so-port',
78 help='hostname of server. ' +
79 'Also can set OSM_SO_PORT in environment')
80 @click.option('--so-project',
82 envvar
='OSM_SO_PROJECT',
83 help='Project Name in SO. ' +
84 'Also can set OSM_SO_PROJECT in environment')
85 @click.option('--ro-hostname',
87 envvar
='OSM_RO_HOSTNAME',
88 help='hostname of RO server. ' +
89 'Also can set OSM_RO_HOSTNAME in environment')
90 @click.option('--ro-port',
93 help='hostname of RO server. ' +
94 'Also can set OSM_RO_PORT in environment')
96 def cli(ctx
, hostname
, sol005
, user
, password
, project
, so_port
, so_project
, ro_hostname
, ro_port
):
99 "either hostname option or OSM_HOSTNAME " +
100 "environment variable needs to be specified"))
103 if so_port
is not None:
104 kwargs
['so_port']=so_port
105 if so_project
is not None:
106 kwargs
['so_project']=so_project
107 if ro_hostname
is not None:
108 kwargs
['ro_host']=ro_hostname
109 if ro_port
is not None:
110 kwargs
['ro_port']=ro_port
113 if password
is not None:
114 kwargs
['password']=password
115 if project
is not None:
116 kwargs
['project']=project
118 ctx
.obj
= client
.Client(host
=hostname
, sol005
=sol005
, **kwargs
)
125 @cli.command(name
='ns-list')
126 @click.option('--filter', default
=None,
127 help='restricts the list to the NS instances matching the filter.')
129 def ns_list(ctx
, filter):
130 """list all NS instances
134 --filter filterExpr Restricts the list to the NS instances matching the filter
137 filterExpr consists of one or more strings formatted according to "simpleFilterExpr",
138 concatenated using the "&" character:
141 filterExpr := <simpleFilterExpr>["&"<simpleFilterExpr>]*
142 simpleFilterExpr := <attrName>["."<attrName>]*["."<op>]"="<value>[","<value>]*
143 op := "eq" | "neq" | "gt" | "lt" | "gte" | "lte" | "cont" | "ncont"
145 value := scalar value
149 * zero or more occurrences
150 ? zero or one occurrence
151 [] grouping of expressions to be used with ? and *
152 "" quotation marks for marking string constants
156 "AttrName" is the name of one attribute in the data type that defines the representation
157 of the resource. The dot (".") character in "simpleFilterExpr" allows concatenation of
158 <attrName> entries to filter by attributes deeper in the hierarchy of a structured document.
159 "Op" stands for the comparison operator. If the expression has concatenated <attrName>
160 entries, it means that the operator "op" is applied to the attribute addressed by the last
161 <attrName> entry included in the concatenation. All simple filter expressions are combined
162 by the "AND" logical operator. In a concatenation of <attrName> entries in a <simpleFilterExpr>,
163 the rightmost "attrName" entry in a "simpleFilterExpr" is called "leaf attribute". The
164 concatenation of all "attrName" entries except the leaf attribute is called the "attribute
165 prefix". If an attribute referenced in an expression is an array, an object that contains a
166 corresponding array shall be considered to match the expression if any of the elements in the
167 array matches all expressions that have the same attribute prefix.
171 --filter admin-status=ENABLED
172 --filter nsd-ref=<NSD_NAME>
173 --filter nsd.vendor=<VENDOR>
174 --filter nsd.vendor=<VENDOR>&nsd-ref=<NSD_NAME>
175 --filter nsd.constituent-vnfd.vnfd-id-ref=<VNFD_NAME>
178 check_client_version(ctx
.obj
, '--filter')
179 resp
= ctx
.obj
.ns
.list(filter)
181 resp
= ctx
.obj
.ns
.list()
185 'operational status',
189 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
190 if fullclassname
== 'osmclient.sol005.client.Client':
192 nsr_name
= nsr
['name']
195 nsopdata
= ctx
.obj
.ns
.get_opdata(ns
['id'])
196 nsr
= nsopdata
['nsr:nsr']
197 nsr_name
= nsr
['name-ref']
198 nsr_id
= nsr
['ns-instance-config-ref']
199 opstatus
= nsr
['operational-status'] if 'operational-status' in nsr
else 'Not found'
200 configstatus
= nsr
['config-status'] if 'config-status' in nsr
else 'Not found'
201 detailed_status
= nsr
['detailed-status'] if 'detailed-status' in nsr
else 'Not found'
202 if configstatus
== "config_not_needed":
203 configstatus
= "configured (no charms)"
214 def nsd_list(ctx
, filter):
216 check_client_version(ctx
.obj
, '--filter')
217 resp
= ctx
.obj
.nsd
.list(filter)
219 resp
= ctx
.obj
.nsd
.list()
220 # print yaml.safe_dump(resp)
221 table
= PrettyTable(['nsd name', 'id'])
222 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
223 if fullclassname
== 'osmclient.sol005.client.Client':
225 name
= ns
['name'] if 'name' in ns
else '-'
226 table
.add_row([name
, ns
['_id']])
229 table
.add_row([ns
['name'], ns
['id']])
234 @cli.command(name
='nsd-list')
235 @click.option('--filter', default
=None,
236 help='restricts the list to the NSD/NSpkg matching the filter')
238 def nsd_list1(ctx
, filter):
239 """list all NSD/NS pkg in the system"""
240 nsd_list(ctx
, filter)
243 @cli.command(name
='nspkg-list')
244 @click.option('--filter', default
=None,
245 help='restricts the list to the NSD/NSpkg matching the filter')
247 def nsd_list2(ctx
, filter):
248 """list all NSD/NS pkg in the system"""
249 nsd_list(ctx
, filter)
252 def vnfd_list(ctx
, nf_type
, filter):
254 check_client_version(ctx
.obj
, '--nf_type')
256 check_client_version(ctx
.obj
, '--filter')
259 nf_filter
= "_admin.type=vnfd"
260 elif nf_type
== "pnf":
261 nf_filter
= "_admin.type=pnfd"
262 elif nf_type
== "hnf":
263 nf_filter
= "_admin.type=hnfd"
265 raise ClientException('wrong value for "--nf_type" option, allowed values: vnf, pnf, hnf')
267 filter = '{}&{}'.format(nf_filter
, filter)
271 resp
= ctx
.obj
.vnfd
.list(filter)
273 resp
= ctx
.obj
.vnfd
.list()
274 # print yaml.safe_dump(resp)
275 table
= PrettyTable(['nfpkg name', 'id'])
276 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
277 if fullclassname
== 'osmclient.sol005.client.Client':
279 name
= vnfd
['name'] if 'name' in vnfd
else '-'
280 table
.add_row([name
, vnfd
['_id']])
283 table
.add_row([vnfd
['name'], vnfd
['id']])
288 @cli.command(name
='vnfd-list')
289 @click.option('--nf_type', help='type of NF (vnf, pnf, hnf)')
290 @click.option('--filter', default
=None,
291 help='restricts the list to the NF pkg matching the filter')
293 def vnfd_list1(ctx
, nf_type
, filter):
294 """list all VNFD/VNF pkg in the system"""
295 vnfd_list(ctx
, nf_type
, filter)
298 @cli.command(name
='vnfpkg-list')
299 @click.option('--nf_type', help='type of NF (vnf, pnf, hnf)')
300 @click.option('--filter', default
=None,
301 help='restricts the list to the NFpkg matching the filter')
303 def vnfd_list2(ctx
, nf_type
, filter):
304 """list all VNFD/VNF pkg in the system"""
305 vnfd_list(ctx
, nf_type
, filter)
308 @cli.command(name
='nfpkg-list')
309 @click.option('--nf_type', help='type of NF (vnf, pnf, hnf)')
310 @click.option('--filter', default
=None,
311 help='restricts the list to the NFpkg matching the filter')
313 def nfpkg_list(ctx
, nf_type
, filter):
314 """list all NF pkg (VNF pkg, PNF pkg, HNF pkg) in the system"""
316 check_client_version(ctx
.obj
, ctx
.command
.name
)
317 vnfd_list(ctx
, nf_type
, filter)
318 except ClientException
as inst
:
319 print((inst
.message
))
323 def vnf_list(ctx
, ns
, filter):
327 check_client_version(ctx
.obj
, '--ns')
329 check_client_version(ctx
.obj
, '--filter')
330 resp
= ctx
.obj
.vnf
.list(ns
, filter)
332 resp
= ctx
.obj
.vnf
.list()
333 except ClientException
as inst
:
334 print((inst
.message
))
336 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
337 if fullclassname
== 'osmclient.sol005.client.Client':
347 name
= vnfr
['name'] if 'name' in vnfr
else '-'
352 vnfr
['member-vnf-index-ref'],
354 vnfr
['vim-account-id'],
360 'operational status',
363 if 'mgmt-interface' not in vnfr
:
364 vnfr
['mgmt-interface'] = {}
365 vnfr
['mgmt-interface']['ip-address'] = None
369 vnfr
['operational-status'],
370 vnfr
['config-status']])
375 @cli.command(name
='vnf-list')
376 @click.option('--ns', default
=None, help='NS instance id or name to restrict the NF list')
377 @click.option('--filter', default
=None,
378 help='restricts the list to the NF instances matching the filter.')
380 def vnf_list1(ctx
, ns
, filter):
381 """list all NF instances"""
382 vnf_list(ctx
, ns
, filter)
385 @cli.command(name
='nf-list')
386 @click.option('--ns', default
=None, help='NS instance id or name to restrict the NF list')
387 @click.option('--filter', default
=None,
388 help='restricts the list to the NF instances matching the filter.')
390 def nf_list(ctx
, ns
, filter):
391 """list all NF instances
395 --ns TEXT NS instance id or name to restrict the VNF list
396 --filter filterExpr Restricts the list to the VNF instances matching the filter
399 filterExpr consists of one or more strings formatted according to "simpleFilterExpr",
400 concatenated using the "&" character:
403 filterExpr := <simpleFilterExpr>["&"<simpleFilterExpr>]*
404 simpleFilterExpr := <attrName>["."<attrName>]*["."<op>]"="<value>[","<value>]*
405 op := "eq" | "neq" | "gt" | "lt" | "gte" | "lte" | "cont" | "ncont"
407 value := scalar value
411 * zero or more occurrences
412 ? zero or one occurrence
413 [] grouping of expressions to be used with ? and *
414 "" quotation marks for marking string constants
418 "AttrName" is the name of one attribute in the data type that defines the representation
419 of the resource. The dot (".") character in "simpleFilterExpr" allows concatenation of
420 <attrName> entries to filter by attributes deeper in the hierarchy of a structured document.
421 "Op" stands for the comparison operator. If the expression has concatenated <attrName>
422 entries, it means that the operator "op" is applied to the attribute addressed by the last
423 <attrName> entry included in the concatenation. All simple filter expressions are combined
424 by the "AND" logical operator. In a concatenation of <attrName> entries in a <simpleFilterExpr>,
425 the rightmost "attrName" entry in a "simpleFilterExpr" is called "leaf attribute". The
426 concatenation of all "attrName" entries except the leaf attribute is called the "attribute
427 prefix". If an attribute referenced in an expression is an array, an object that contains a
428 corresponding array shall be considered to match the expression if any of the elements in the
429 array matches all expressions that have the same attribute prefix.
433 --filter vim-account-id=<VIM_ACCOUNT_ID>
434 --filter vnfd-ref=<VNFD_NAME>
435 --filter vdur.ip-address=<IP_ADDRESS>
436 --filter vnfd-ref=<VNFD_NAME>,vdur.ip-address=<IP_ADDRESS>
438 vnf_list(ctx
, ns
, filter)
441 @cli.command(name
='ns-op-list')
442 @click.argument('name')
444 def ns_op_list(ctx
, name
):
445 """shows the history of operations over a NS instance
447 NAME: name or ID of the NS instance
450 check_client_version(ctx
.obj
, ctx
.command
.name
)
451 resp
= ctx
.obj
.ns
.list_op(name
)
452 except ClientException
as inst
:
453 print((inst
.message
))
456 table
= PrettyTable(['id', 'operation', 'status'])
458 table
.add_row([op
['id'], op
['lcmOperationType'],
459 op
['operationState']])
464 def nsi_list(ctx
, filter):
465 """list all Network Slice Instances"""
467 check_client_version(ctx
.obj
, ctx
.command
.name
)
468 resp
= ctx
.obj
.nsi
.list(filter)
469 except ClientException
as inst
:
470 print((inst
.message
))
473 ['netslice instance name',
475 'operational status',
479 nsi_name
= nsi
['name']
481 opstatus
= nsi
['operational-status'] if 'operational-status' in nsi
else 'Not found'
482 configstatus
= nsi
['config-status'] if 'config-status' in nsi
else 'Not found'
483 detailed_status
= nsi
['detailed-status'] if 'detailed-status' in nsi
else 'Not found'
484 if configstatus
== "config_not_needed":
485 configstatus
= "configured (no charms)"
496 @cli.command(name
='nsi-list')
497 @click.option('--filter', default
=None,
498 help='restricts the list to the Network Slice Instances matching the filter')
500 def nsi_list1(ctx
, filter):
501 """list all Network Slice Instances (NSI)"""
502 nsi_list(ctx
, filter)
505 @cli.command(name
='netslice-instance-list')
506 @click.option('--filter', default
=None,
507 help='restricts the list to the Network Slice Instances matching the filter')
509 def nsi_list2(ctx
, filter):
510 """list all Network Slice Instances (NSI)"""
511 nsi_list(ctx
, filter)
514 def nst_list(ctx
, filter):
516 check_client_version(ctx
.obj
, ctx
.command
.name
)
517 resp
= ctx
.obj
.nst
.list(filter)
518 except ClientException
as inst
:
519 print((inst
.message
))
521 # print yaml.safe_dump(resp)
522 table
= PrettyTable(['nst name', 'id'])
524 name
= nst
['name'] if 'name' in nst
else '-'
525 table
.add_row([name
, nst
['_id']])
530 @cli.command(name
='nst-list')
531 @click.option('--filter', default
=None,
532 help='restricts the list to the NST matching the filter')
534 def nst_list1(ctx
, filter):
535 """list all Network Slice Templates (NST) in the system"""
536 nst_list(ctx
, filter)
539 @cli.command(name
='netslice-template-list')
540 @click.option('--filter', default
=None,
541 help='restricts the list to the NST matching the filter')
543 def nst_list2(ctx
, filter):
544 """list all Network Slice Templates (NST) in the system"""
545 nst_list(ctx
, filter)
548 def nsi_op_list(ctx
, name
):
550 check_client_version(ctx
.obj
, ctx
.command
.name
)
551 resp
= ctx
.obj
.nsi
.list_op(name
)
552 except ClientException
as inst
:
553 print((inst
.message
))
555 table
= PrettyTable(['id', 'operation', 'status'])
557 table
.add_row([op
['id'], op
['lcmOperationType'],
558 op
['operationState']])
563 @cli.command(name
='nsi-op-list')
564 @click.argument('name')
566 def nsi_op_list1(ctx
, name
):
567 """shows the history of operations over a Network Slice Instance (NSI)
569 NAME: name or ID of the Network Slice Instance
571 nsi_op_list(ctx
, name
)
574 @cli.command(name
='netslice-instance-op-list')
575 @click.argument('name')
577 def nsi_op_list2(ctx
, name
):
578 """shows the history of operations over a Network Slice Instance (NSI)
580 NAME: name or ID of the Network Slice Instance
582 nsi_op_list(ctx
, name
)
585 @cli.command(name
='pdu-list')
586 @click.option('--filter', default
=None,
587 help='restricts the list to the Physical Deployment Units matching the filter')
589 def pdu_list(ctx
, filter):
590 """list all Physical Deployment Units (PDU)"""
592 check_client_version(ctx
.obj
, ctx
.command
.name
)
593 resp
= ctx
.obj
.pdu
.list(filter)
594 except ClientException
as inst
:
595 print((inst
.message
))
603 pdu_name
= pdu
['name']
605 pdu_type
= pdu
['type']
606 pdu_ipaddress
= "None"
607 for iface
in pdu
['interfaces']:
609 pdu_ipaddress
= iface
['ip-address']
624 def nsd_show(ctx
, name
, literal
):
626 resp
= ctx
.obj
.nsd
.get(name
)
627 # resp = ctx.obj.nsd.get_individual(name)
628 except ClientException
as inst
:
629 print((inst
.message
))
633 print(yaml
.safe_dump(resp
))
636 table
= PrettyTable(['field', 'value'])
637 for k
, v
in list(resp
.items()):
638 table
.add_row([k
, json
.dumps(v
, indent
=2)])
643 @cli.command(name
='nsd-show', short_help
='shows the content of a NSD')
644 @click.option('--literal', is_flag
=True,
645 help='print literally, no pretty table')
646 @click.argument('name')
648 def nsd_show1(ctx
, name
, literal
):
649 """shows the content of a NSD
651 NAME: name or ID of the NSD/NSpkg
653 nsd_show(ctx
, name
, literal
)
656 @cli.command(name
='nspkg-show', short_help
='shows the content of a NSD')
657 @click.option('--literal', is_flag
=True,
658 help='print literally, no pretty table')
659 @click.argument('name')
661 def nsd_show2(ctx
, name
, literal
):
662 """shows the content of a NSD
664 NAME: name or ID of the NSD/NSpkg
666 nsd_show(ctx
, name
, literal
)
669 def vnfd_show(ctx
, name
, literal
):
671 resp
= ctx
.obj
.vnfd
.get(name
)
672 # resp = ctx.obj.vnfd.get_individual(name)
673 except ClientException
as inst
:
674 print((inst
.message
))
678 print(yaml
.safe_dump(resp
))
681 table
= PrettyTable(['field', 'value'])
682 for k
, v
in list(resp
.items()):
683 table
.add_row([k
, json
.dumps(v
, indent
=2)])
688 @cli.command(name
='vnfd-show', short_help
='shows the content of a VNFD')
689 @click.option('--literal', is_flag
=True,
690 help='print literally, no pretty table')
691 @click.argument('name')
693 def vnfd_show1(ctx
, name
, literal
):
694 """shows the content of a VNFD
696 NAME: name or ID of the VNFD/VNFpkg
698 vnfd_show(ctx
, name
, literal
)
701 @cli.command(name
='vnfpkg-show', short_help
='shows the content of a VNFD')
702 @click.option('--literal', is_flag
=True,
703 help='print literally, no pretty table')
704 @click.argument('name')
706 def vnfd_show2(ctx
, name
, literal
):
707 """shows the content of a VNFD
709 NAME: name or ID of the VNFD/VNFpkg
711 vnfd_show(ctx
, name
, literal
)
714 @cli.command(name
='nfpkg-show', short_help
='shows the content of a NF Descriptor')
715 @click.option('--literal', is_flag
=True,
716 help='print literally, no pretty table')
717 @click.argument('name')
719 def nfpkg_show(ctx
, name
, literal
):
720 """shows the content of a NF Descriptor
722 NAME: name or ID of the NFpkg
724 vnfd_show(ctx
, name
, literal
)
727 @cli.command(name
='ns-show', short_help
='shows the info of a NS instance')
728 @click.argument('name')
729 @click.option('--literal', is_flag
=True,
730 help='print literally, no pretty table')
731 @click.option('--filter', default
=None)
733 def ns_show(ctx
, name
, literal
, filter):
734 """shows the info of a NS instance
736 NAME: name or ID of the NS instance
739 ns
= ctx
.obj
.ns
.get(name
)
740 except ClientException
as inst
:
741 print((inst
.message
))
745 print(yaml
.safe_dump(ns
))
748 table
= PrettyTable(['field', 'value'])
750 for k
, v
in list(ns
.items()):
751 if filter is None or filter in k
:
752 table
.add_row([k
, json
.dumps(v
, indent
=2)])
754 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
755 if fullclassname
!= 'osmclient.sol005.client.Client':
756 nsopdata
= ctx
.obj
.ns
.get_opdata(ns
['id'])
757 nsr_optdata
= nsopdata
['nsr:nsr']
758 for k
, v
in list(nsr_optdata
.items()):
759 if filter is None or filter in k
:
760 table
.add_row([k
, json
.dumps(v
, indent
=2)])
765 @cli.command(name
='vnf-show', short_help
='shows the info of a VNF instance')
766 @click.argument('name')
767 @click.option('--literal', is_flag
=True,
768 help='print literally, no pretty table')
769 @click.option('--filter', default
=None)
771 def vnf_show(ctx
, name
, literal
, filter):
772 """shows the info of a VNF instance
774 NAME: name or ID of the VNF instance
777 check_client_version(ctx
.obj
, ctx
.command
.name
)
778 resp
= ctx
.obj
.vnf
.get(name
)
779 except ClientException
as inst
:
780 print((inst
.message
))
784 print(yaml
.safe_dump(resp
))
787 table
= PrettyTable(['field', 'value'])
788 for k
, v
in list(resp
.items()):
789 if filter is None or filter in k
:
790 table
.add_row([k
, json
.dumps(v
, indent
=2)])
795 @cli.command(name
='vnf-monitoring-show')
796 @click.argument('vnf_name')
798 def vnf_monitoring_show(ctx
, vnf_name
):
800 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
801 resp
= ctx
.obj
.vnf
.get_monitoring(vnf_name
)
802 except ClientException
as inst
:
803 print((inst
.message
))
806 table
= PrettyTable(['vnf name', 'monitoring name', 'value', 'units'])
812 monitor
['value-integer'],
818 @cli.command(name
='ns-monitoring-show')
819 @click.argument('ns_name')
821 def ns_monitoring_show(ctx
, ns_name
):
823 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
824 resp
= ctx
.obj
.ns
.get_monitoring(ns_name
)
825 except ClientException
as inst
:
826 print((inst
.message
))
829 table
= PrettyTable(['vnf name', 'monitoring name', 'value', 'units'])
830 for key
, val
in list(resp
.items()):
835 monitor
['value-integer'],
841 @cli.command(name
='ns-op-show', short_help
='shows the info of an operation')
842 @click.argument('id')
843 @click.option('--filter', default
=None)
845 def ns_op_show(ctx
, id, filter):
846 """shows the detailed info of an operation
848 ID: operation identifier
851 check_client_version(ctx
.obj
, ctx
.command
.name
)
852 op_info
= ctx
.obj
.ns
.get_op(id)
853 except ClientException
as inst
:
854 print((inst
.message
))
857 table
= PrettyTable(['field', 'value'])
858 for k
, v
in list(op_info
.items()):
859 if filter is None or filter in k
:
860 table
.add_row([k
, json
.dumps(v
, indent
=2)])
865 def nst_show(ctx
, name
, literal
):
867 check_client_version(ctx
.obj
, ctx
.command
.name
)
868 resp
= ctx
.obj
.nst
.get(name
)
869 #resp = ctx.obj.nst.get_individual(name)
870 except ClientException
as inst
:
871 print((inst
.message
))
875 print(yaml
.safe_dump(resp
))
878 table
= PrettyTable(['field', 'value'])
879 for k
, v
in list(resp
.items()):
880 table
.add_row([k
, json
.dumps(v
, indent
=2)])
885 @cli.command(name
='nst-show', short_help
='shows the content of a Network Slice Template (NST)')
886 @click.option('--literal', is_flag
=True,
887 help='print literally, no pretty table')
888 @click.argument('name')
890 def nst_show1(ctx
, name
, literal
):
891 """shows the content of a Network Slice Template (NST)
893 NAME: name or ID of the NST
895 nst_show(ctx
, name
, literal
)
898 @cli.command(name
='netslice-template-show', short_help
='shows the content of a Network Slice Template (NST)')
899 @click.option('--literal', is_flag
=True,
900 help='print literally, no pretty table')
901 @click.argument('name')
903 def nst_show2(ctx
, name
, literal
):
904 """shows the content of a Network Slice Template (NST)
906 NAME: name or ID of the NST
908 nst_show(ctx
, name
, literal
)
911 def nsi_show(ctx
, name
, literal
, filter):
913 check_client_version(ctx
.obj
, ctx
.command
.name
)
914 nsi
= ctx
.obj
.nsi
.get(name
)
915 except ClientException
as inst
:
916 print((inst
.message
))
920 print(yaml
.safe_dump(nsi
))
923 table
= PrettyTable(['field', 'value'])
925 for k
, v
in list(nsi
.items()):
926 if filter is None or filter in k
:
927 table
.add_row([k
, json
.dumps(v
, indent
=2)])
933 @cli.command(name
='nsi-show', short_help
='shows the content of a Network Slice Instance (NSI)')
934 @click.argument('name')
935 @click.option('--literal', is_flag
=True,
936 help='print literally, no pretty table')
937 @click.option('--filter', default
=None)
939 def nsi_show1(ctx
, name
, literal
, filter):
940 """shows the content of a Network Slice Instance (NSI)
942 NAME: name or ID of the Network Slice Instance
944 nsi_show(ctx
, name
, literal
, filter)
947 @cli.command(name
='netslice-instance-show', short_help
='shows the content of a Network Slice Instance (NSI)')
948 @click.argument('name')
949 @click.option('--literal', is_flag
=True,
950 help='print literally, no pretty table')
951 @click.option('--filter', default
=None)
953 def nsi_show2(ctx
, name
, literal
, filter):
954 """shows the content of a Network Slice Instance (NSI)
956 NAME: name or ID of the Network Slice Instance
958 nsi_show(ctx
, name
, literal
, filter)
961 def nsi_op_show(ctx
, id, filter):
963 check_client_version(ctx
.obj
, ctx
.command
.name
)
964 op_info
= ctx
.obj
.nsi
.get_op(id)
965 except ClientException
as inst
:
966 print((inst
.message
))
969 table
= PrettyTable(['field', 'value'])
970 for k
, v
in list(op_info
.items()):
971 if filter is None or filter in k
:
972 table
.add_row([k
, json
.dumps(v
, indent
=2)])
977 @cli.command(name
='nsi-op-show', short_help
='shows the info of an operation over a Network Slice Instance(NSI)')
978 @click.argument('id')
979 @click.option('--filter', default
=None)
981 def nsi_op_show1(ctx
, id, filter):
982 """shows the info of an operation over a Network Slice Instance(NSI)
984 ID: operation identifier
986 nsi_op_show(ctx
, id, filter)
989 @cli.command(name
='netslice-instance-op-show', short_help
='shows the info of an operation over a Network Slice Instance(NSI)')
990 @click.argument('id')
991 @click.option('--filter', default
=None)
993 def nsi_op_show2(ctx
, id, filter):
994 """shows the info of an operation over a Network Slice Instance(NSI)
996 ID: operation identifier
998 nsi_op_show(ctx
, id, filter)
1001 @cli.command(name
='pdu-show', short_help
='shows the content of a Physical Deployment Unit (PDU)')
1002 @click.argument('name')
1003 @click.option('--literal', is_flag
=True,
1004 help='print literally, no pretty table')
1005 @click.option('--filter', default
=None)
1007 def pdu_show(ctx
, name
, literal
, filter):
1008 """shows the content of a Physical Deployment Unit (PDU)
1010 NAME: name or ID of the PDU
1013 check_client_version(ctx
.obj
, ctx
.command
.name
)
1014 pdu
= ctx
.obj
.pdu
.get(name
)
1015 except ClientException
as inst
:
1016 print((inst
.message
))
1020 print(yaml
.safe_dump(pdu
))
1023 table
= PrettyTable(['field', 'value'])
1025 for k
, v
in list(pdu
.items()):
1026 if filter is None or filter in k
:
1027 table
.add_row([k
, json
.dumps(v
, indent
=2)])
1033 ####################
1035 ####################
1037 def nsd_create(ctx
, filename
, overwrite
):
1039 check_client_version(ctx
.obj
, ctx
.command
.name
)
1040 ctx
.obj
.nsd
.create(filename
, overwrite
)
1041 except ClientException
as inst
:
1042 print((inst
.message
))
1046 @cli.command(name
='nsd-create', short_help
='creates a new NSD/NSpkg')
1047 @click.argument('filename')
1048 @click.option('--overwrite', default
=None,
1049 help='overwrites some fields in NSD')
1051 def nsd_create1(ctx
, filename
, overwrite
):
1052 """creates a new NSD/NSpkg
1054 FILENAME: NSD yaml file or NSpkg tar.gz file
1056 nsd_create(ctx
, filename
, overwrite
)
1059 @cli.command(name
='nspkg-create', short_help
='creates a new NSD/NSpkg')
1060 @click.argument('filename')
1061 @click.option('--overwrite', default
=None,
1062 help='overwrites some fields in NSD')
1064 def nsd_create2(ctx
, filename
, overwrite
):
1065 """creates a new NSD/NSpkg
1067 FILENAME: NSD yaml file or NSpkg tar.gz file
1069 nsd_create(ctx
, filename
, overwrite
)
1072 def vnfd_create(ctx
, filename
, overwrite
):
1074 check_client_version(ctx
.obj
, ctx
.command
.name
)
1075 ctx
.obj
.vnfd
.create(filename
, overwrite
)
1076 except ClientException
as inst
:
1077 print((inst
.message
))
1081 @cli.command(name
='vnfd-create', short_help
='creates a new VNFD/VNFpkg')
1082 @click.argument('filename')
1083 @click.option('--overwrite', default
=None,
1084 help='overwrites some fields in VNFD')
1086 def vnfd_create1(ctx
, filename
, overwrite
):
1087 """creates a new VNFD/VNFpkg
1089 FILENAME: VNFD yaml file or VNFpkg tar.gz file
1091 vnfd_create(ctx
, filename
, overwrite
)
1094 @cli.command(name
='vnfpkg-create', short_help
='creates a new VNFD/VNFpkg')
1095 @click.argument('filename')
1096 @click.option('--overwrite', default
=None,
1097 help='overwrites some fields in VNFD')
1099 def vnfd_create2(ctx
, filename
, overwrite
):
1100 """creates a new VNFD/VNFpkg
1102 FILENAME: VNFD yaml file or VNFpkg tar.gz file
1104 vnfd_create(ctx
, filename
, overwrite
)
1107 @cli.command(name
='nfpkg-create', short_help
='creates a new NFpkg')
1108 @click.argument('filename')
1109 @click.option('--overwrite', default
=None,
1110 help='overwrites some fields in NFD')
1112 def nfpkg_create(ctx
, filename
, overwrite
):
1113 """creates a new NFpkg
1115 FILENAME: NF Descriptor yaml file or NFpkg tar.gz file
1117 vnfd_create(ctx
, filename
, overwrite
)
1120 @cli.command(name
='ns-create', short_help
='creates a new Network Service instance')
1121 @click.option('--ns_name',
1122 prompt
=True, help='name of the NS instance')
1123 @click.option('--nsd_name',
1124 prompt
=True, help='name of the NS descriptor')
1125 @click.option('--vim_account',
1126 prompt
=True, help='default VIM account id or name for the deployment')
1127 @click.option('--admin_status',
1129 help='administration status')
1130 @click.option('--ssh_keys',
1132 help='comma separated list of public key files to inject to vnfs')
1133 @click.option('--config',
1135 help='ns specific yaml configuration')
1136 @click.option('--config_file',
1138 help='ns specific yaml configuration file')
1148 """creates a new NS instance"""
1151 check_client_version(ctx
.obj
, '--config_file')
1153 raise ClientException('"--config" option is incompatible with "--config_file" option')
1154 with
open(config_file
, 'r') as cf
:
1161 account
=vim_account
)
1162 except ClientException
as inst
:
1167 def nst_create(ctx
, filename
, overwrite
):
1169 check_client_version(ctx
.obj
, ctx
.command
.name
)
1170 ctx
.obj
.nst
.create(filename
, overwrite
)
1171 except ClientException
as inst
:
1172 print((inst
.message
))
1176 @cli.command(name
='nst-create', short_help
='creates a new Network Slice Template (NST)')
1177 @click.argument('filename')
1178 @click.option('--overwrite', default
=None,
1179 help='overwrites some fields in NST')
1181 def nst_create1(ctx
, filename
, overwrite
):
1182 """creates a new Network Slice Template (NST)
1184 FILENAME: NST yaml file or NSTpkg tar.gz file
1186 nst_create(ctx
, filename
, overwrite
)
1189 @cli.command(name
='netslice-template-create', short_help
='creates a new Network Slice Template (NST)')
1190 @click.argument('filename')
1191 @click.option('--overwrite', default
=None,
1192 help='overwrites some fields in NST')
1194 def nst_create2(ctx
, filename
, overwrite
):
1195 """creates a new Network Slice Template (NST)
1197 FILENAME: NST yaml file or NSTpkg tar.gz file
1199 nst_create(ctx
, filename
, overwrite
)
1202 def nsi_create(ctx
, nst_name
, nsi_name
, vim_account
, ssh_keys
, config
, config_file
):
1203 """creates a new Network Slice Instance (NSI)"""
1205 check_client_version(ctx
.obj
, ctx
.command
.name
)
1208 raise ClientException('"--config" option is incompatible with "--config_file" option')
1209 with
open(config_file
, 'r') as cf
:
1211 ctx
.obj
.nsi
.create(nst_name
, nsi_name
, config
=config
, ssh_keys
=ssh_keys
,
1212 account
=vim_account
)
1213 except ClientException
as inst
:
1218 @cli.command(name
='nsi-create', short_help
='creates a new Network Slice Instance')
1219 @click.option('--nsi_name', prompt
=True, help='name of the Network Slice Instance')
1220 @click.option('--nst_name', prompt
=True, help='name of the Network Slice Template')
1221 @click.option('--vim_account', prompt
=True, help='default VIM account id or name for the deployment')
1222 @click.option('--ssh_keys', default
=None,
1223 help='comma separated list of keys to inject to vnfs')
1224 @click.option('--config', default
=None,
1225 help='Netslice specific yaml configuration:\n'
1226 'netslice_subnet: [\n'
1227 'id: TEXT, vim_account: TEXT,\n'
1228 'vnf: [member-vnf-index: TEXT, vim_account: TEXT]\n'
1229 'vld: [name: TEXT, vim-network-name: TEXT or DICT with vim_account, vim_net entries]\n'
1230 'additionalParamsForNsi: {param: value, ...}\n'
1231 'additionalParamsForsubnet: [{id: SUBNET_ID, additionalParamsForNs: {}, additionalParamsForVnf: {}}]\n'
1233 'netslice-vld: [name: TEXT, vim-network-name: TEXT or DICT with vim_account, vim_net entries]'
1235 @click.option('--config_file',
1237 help='nsi specific yaml configuration file')
1239 def nsi_create1(ctx
, nst_name
, nsi_name
, vim_account
, ssh_keys
, config
, config_file
):
1240 """creates a new Network Slice Instance (NSI)"""
1241 nsi_create(ctx
, nst_name
, nsi_name
, vim_account
, ssh_keys
, config
, config_file
)
1244 @cli.command(name
='netslice-instance-create', short_help
='creates a new Network Slice Instance')
1245 @click.option('--nsi_name', prompt
=True, help='name of the Network Slice Instance')
1246 @click.option('--nst_name', prompt
=True, help='name of the Network Slice Template')
1247 @click.option('--vim_account', prompt
=True, help='default VIM account id or name for the deployment')
1248 @click.option('--ssh_keys', default
=None,
1249 help='comma separated list of keys to inject to vnfs')
1250 @click.option('--config', default
=None,
1251 help='Netslice specific yaml configuration:\n'
1252 'netslice_subnet: [\n'
1253 'id: TEXT, vim_account: TEXT,\n'
1254 'vnf: [member-vnf-index: TEXT, vim_account: TEXT]\n'
1255 'vld: [name: TEXT, vim-network-name: TEXT or DICT with vim_account, vim_net entries]'
1257 'netslice-vld: [name: TEXT, vim-network-name: TEXT or DICT with vim_account, vim_net entries]'
1259 @click.option('--config_file',
1261 help='nsi specific yaml configuration file')
1263 def nsi_create2(ctx
, nst_name
, nsi_name
, vim_account
, ssh_keys
, config
, config_file
):
1264 """creates a new Network Slice Instance (NSI)"""
1265 nsi_create(ctx
, nst_name
, nsi_name
, vim_account
, ssh_keys
, config
, config_file
)
1268 @cli.command(name
='pdu-create', short_help
='adds a new Physical Deployment Unit to the catalog')
1269 @click.option('--name', help='name of the Physical Deployment Unit')
1270 @click.option('--pdu_type', help='type of PDU (e.g. router, firewall, FW001)')
1271 @click.option('--interface',
1272 help='interface(s) of the PDU: name=<NAME>,mgmt=<true|false>,ip-address=<IP_ADDRESS>'+
1273 '[,type=<overlay|underlay>][,mac-address=<MAC_ADDRESS>][,vim-network-name=<VIM_NET_NAME>]',
1275 @click.option('--description', help='human readable description')
1276 @click.option('--vim_account', help='list of VIM accounts (in the same VIM) that can reach this PDU', multiple
=True)
1277 @click.option('--descriptor_file', default
=None, help='PDU descriptor file (as an alternative to using the other arguments')
1279 def pdu_create(ctx
, name
, pdu_type
, interface
, description
, vim_account
, descriptor_file
):
1280 """creates a new Physical Deployment Unit (PDU)"""
1282 check_client_version(ctx
.obj
, ctx
.command
.name
)
1284 if not descriptor_file
:
1286 raise ClientException('in absence of descriptor file, option "--name" is mandatory')
1288 raise ClientException('in absence of descriptor file, option "--pdu_type" is mandatory')
1290 raise ClientException('in absence of descriptor file, option "--interface" is mandatory (at least once)')
1292 raise ClientException('in absence of descriptor file, option "--vim_account" is mandatory (at least once)')
1294 with
open(descriptor_file
, 'r') as df
:
1295 pdu
= yaml
.load(df
.read())
1296 if name
: pdu
["name"] = name
1297 if pdu_type
: pdu
["type"] = pdu_type
1298 if description
: pdu
["description"] = description
1299 if vim_account
: pdu
["vim_accounts"] = vim_account
1302 for iface
in interface
:
1303 new_iface
={k
:v
for k
,v
in [i
.split('=') for i
in iface
.split(',')]}
1304 new_iface
["mgmt"] = (new_iface
.get("mgmt","false").lower() == "true")
1305 ifaces_list
.append(new_iface
)
1306 pdu
["interfaces"] = ifaces_list
1307 ctx
.obj
.pdu
.create(pdu
)
1308 except ClientException
as inst
:
1309 print((inst
.message
))
1313 ####################
1315 ####################
1317 def nsd_update(ctx
, name
, content
):
1319 check_client_version(ctx
.obj
, ctx
.command
.name
)
1320 ctx
.obj
.nsd
.update(name
, content
)
1321 except ClientException
as inst
:
1322 print((inst
.message
))
1326 @cli.command(name
='nsd-update', short_help
='updates a NSD/NSpkg')
1327 @click.argument('name')
1328 @click.option('--content', default
=None,
1329 help='filename with the NSD/NSpkg replacing the current one')
1331 def nsd_update1(ctx
, name
, content
):
1332 """updates a NSD/NSpkg
1334 NAME: name or ID of the NSD/NSpkg
1336 nsd_update(ctx
, name
, content
)
1339 @cli.command(name
='nspkg-update', short_help
='updates a NSD/NSpkg')
1340 @click.argument('name')
1341 @click.option('--content', default
=None,
1342 help='filename with the NSD/NSpkg replacing the current one')
1344 def nsd_update2(ctx
, name
, content
):
1345 """updates a NSD/NSpkg
1347 NAME: name or ID of the NSD/NSpkg
1349 nsd_update(ctx
, name
, content
)
1352 def vnfd_update(ctx
, name
, content
):
1354 check_client_version(ctx
.obj
, ctx
.command
.name
)
1355 ctx
.obj
.vnfd
.update(name
, content
)
1356 except ClientException
as inst
:
1357 print((inst
.message
))
1361 @cli.command(name
='vnfd-update', short_help
='updates a new VNFD/VNFpkg')
1362 @click.argument('name')
1363 @click.option('--content', default
=None,
1364 help='filename with the VNFD/VNFpkg replacing the current one')
1366 def vnfd_update1(ctx
, name
, content
):
1367 """updates a VNFD/VNFpkg
1369 NAME: name or ID of the VNFD/VNFpkg
1371 vnfd_update(ctx
, name
, content
)
1374 @cli.command(name
='vnfpkg-update', short_help
='updates a VNFD/VNFpkg')
1375 @click.argument('name')
1376 @click.option('--content', default
=None,
1377 help='filename with the VNFD/VNFpkg replacing the current one')
1379 def vnfd_update2(ctx
, name
, content
):
1380 """updates a VNFD/VNFpkg
1382 NAME: VNFD yaml file or VNFpkg tar.gz file
1384 vnfd_update(ctx
, name
, content
)
1387 @cli.command(name
='nfpkg-update', short_help
='updates a NFpkg')
1388 @click.argument('name')
1389 @click.option('--content', default
=None,
1390 help='filename with the NFpkg replacing the current one')
1392 def nfpkg_update(ctx
, name
, content
):
1395 NAME: NF Descriptor yaml file or NFpkg tar.gz file
1397 vnfd_update(ctx
, name
, content
)
1400 def nst_update(ctx
, name
, content
):
1402 check_client_version(ctx
.obj
, ctx
.command
.name
)
1403 ctx
.obj
.nst
.update(name
, content
)
1404 except ClientException
as inst
:
1405 print((inst
.message
))
1409 @cli.command(name
='nst-update', short_help
='updates a Network Slice Template (NST)')
1410 @click.argument('name')
1411 @click.option('--content', default
=None,
1412 help='filename with the NST/NSTpkg replacing the current one')
1414 def nst_update1(ctx
, name
, content
):
1415 """updates a Network Slice Template (NST)
1417 NAME: name or ID of the NSD/NSpkg
1419 nst_update(ctx
, name
, content
)
1422 @cli.command(name
='netslice-template-update', short_help
='updates a Network Slice Template (NST)')
1423 @click.argument('name')
1424 @click.option('--content', default
=None,
1425 help='filename with the NST/NSTpkg replacing the current one')
1427 def nst_update2(ctx
, name
, content
):
1428 """updates a Network Slice Template (NST)
1430 NAME: name or ID of the NSD/NSpkg
1432 nst_update(ctx
, name
, content
)
1435 ####################
1437 ####################
1439 def nsd_delete(ctx
, name
, force
):
1442 ctx
.obj
.nsd
.delete(name
)
1444 check_client_version(ctx
.obj
, '--force')
1445 ctx
.obj
.nsd
.delete(name
, force
)
1446 except ClientException
as inst
:
1447 print((inst
.message
))
1451 @cli.command(name
='nsd-delete', short_help
='deletes a NSD/NSpkg')
1452 @click.argument('name')
1453 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1455 def nsd_delete1(ctx
, name
, force
):
1456 """deletes a NSD/NSpkg
1458 NAME: name or ID of the NSD/NSpkg to be deleted
1460 nsd_delete(ctx
, name
, force
)
1463 @cli.command(name
='nspkg-delete', short_help
='deletes a NSD/NSpkg')
1464 @click.argument('name')
1465 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1467 def nsd_delete2(ctx
, name
, force
):
1468 """deletes a NSD/NSpkg
1470 NAME: name or ID of the NSD/NSpkg to be deleted
1472 nsd_delete(ctx
, name
, force
)
1475 def vnfd_delete(ctx
, name
, force
):
1478 ctx
.obj
.vnfd
.delete(name
)
1480 check_client_version(ctx
.obj
, '--force')
1481 ctx
.obj
.vnfd
.delete(name
, force
)
1482 except ClientException
as inst
:
1483 print((inst
.message
))
1487 @cli.command(name
='vnfd-delete', short_help
='deletes a VNFD/VNFpkg')
1488 @click.argument('name')
1489 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1491 def vnfd_delete1(ctx
, name
, force
):
1492 """deletes a VNFD/VNFpkg
1494 NAME: name or ID of the VNFD/VNFpkg to be deleted
1496 vnfd_delete(ctx
, name
, force
)
1499 @cli.command(name
='vnfpkg-delete', short_help
='deletes a VNFD/VNFpkg')
1500 @click.argument('name')
1501 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1503 def vnfd_delete2(ctx
, name
, force
):
1504 """deletes a VNFD/VNFpkg
1506 NAME: name or ID of the VNFD/VNFpkg to be deleted
1508 vnfd_delete(ctx
, name
, force
)
1511 @cli.command(name
='nfpkg-delete', short_help
='deletes a NFpkg')
1512 @click.argument('name')
1513 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1515 def nfpkg_delete(ctx
, name
, force
):
1518 NAME: name or ID of the NFpkg to be deleted
1520 vnfd_delete(ctx
, name
, force
)
1523 @cli.command(name
='ns-delete', short_help
='deletes a NS instance')
1524 @click.argument('name')
1525 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1527 def ns_delete(ctx
, name
, force
):
1528 """deletes a NS instance
1530 NAME: name or ID of the NS instance to be deleted
1534 ctx
.obj
.ns
.delete(name
)
1536 check_client_version(ctx
.obj
, '--force')
1537 ctx
.obj
.ns
.delete(name
, force
)
1538 except ClientException
as inst
:
1539 print((inst
.message
))
1543 def nst_delete(ctx
, name
, force
):
1545 check_client_version(ctx
.obj
, ctx
.command
.name
)
1546 ctx
.obj
.nst
.delete(name
, force
)
1547 except ClientException
as inst
:
1548 print((inst
.message
))
1552 @cli.command(name
='nst-delete', short_help
='deletes a Network Slice Template (NST)')
1553 @click.argument('name')
1554 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1556 def nst_delete1(ctx
, name
, force
):
1557 """deletes a Network Slice Template (NST)
1559 NAME: name or ID of the NST/NSTpkg to be deleted
1561 nst_delete(ctx
, name
, force
)
1564 @cli.command(name
='netslice-template-delete', short_help
='deletes a Network Slice Template (NST)')
1565 @click.argument('name')
1566 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1568 def nst_delete2(ctx
, name
, force
):
1569 """deletes a Network Slice Template (NST)
1571 NAME: name or ID of the NST/NSTpkg to be deleted
1573 nst_delete(ctx
, name
, force
)
1576 def nsi_delete(ctx
, name
, force
):
1578 check_client_version(ctx
.obj
, ctx
.command
.name
)
1579 ctx
.obj
.nsi
.delete(name
, force
)
1580 except ClientException
as inst
:
1581 print((inst
.message
))
1585 @cli.command(name
='nsi-delete', short_help
='deletes a Network Slice Instance (NSI)')
1586 @click.argument('name')
1587 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1589 def nsi_delete1(ctx
, name
, force
):
1590 """deletes a Network Slice Instance (NSI)
1592 NAME: name or ID of the Network Slice instance to be deleted
1594 nsi_delete(ctx
, name
, force
)
1597 @cli.command(name
='netslice-instance-delete', short_help
='deletes a Network Slice Instance (NSI)')
1598 @click.argument('name')
1599 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1601 def nsi_delete2(ctx
, name
, force
):
1602 """deletes a Network Slice Instance (NSI)
1604 NAME: name or ID of the Network Slice instance to be deleted
1606 nsi_delete(ctx
, name
, force
)
1609 @cli.command(name
='pdu-delete', short_help
='deletes a Physical Deployment Unit (PDU)')
1610 @click.argument('name')
1611 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1613 def pdu_delete(ctx
, name
, force
):
1614 """deletes a Physical Deployment Unit (PDU)
1616 NAME: name or ID of the PDU to be deleted
1619 check_client_version(ctx
.obj
, ctx
.command
.name
)
1620 ctx
.obj
.pdu
.delete(name
, force
)
1621 except ClientException
as inst
:
1622 print((inst
.message
))
1626 ####################
1628 ####################
1630 @cli.command(name
='vim-create')
1631 @click.option('--name',
1633 help='Name to create datacenter')
1634 @click.option('--user',
1636 help='VIM username')
1637 @click.option('--password',
1640 confirmation_prompt
=True,
1641 help='VIM password')
1642 @click.option('--auth_url',
1645 @click.option('--tenant',
1647 help='VIM tenant name')
1648 @click.option('--config',
1650 help='VIM specific config parameters')
1651 @click.option('--account_type',
1652 default
='openstack',
1654 @click.option('--description',
1655 default
='no description',
1656 help='human readable description')
1657 @click.option('--sdn_controller', default
=None, help='Name or id of the SDN controller associated to this VIM account')
1658 @click.option('--sdn_port_mapping', default
=None, help="File describing the port mapping between compute nodes' ports and switch ports")
1671 """creates a new VIM account"""
1674 check_client_version(ctx
.obj
, '--sdn_controller')
1675 if sdn_port_mapping
:
1676 check_client_version(ctx
.obj
, '--sdn_port_mapping')
1678 vim
['vim-username'] = user
1679 vim
['vim-password'] = password
1680 vim
['vim-url'] = auth_url
1681 vim
['vim-tenant-name'] = tenant
1682 vim
['vim-type'] = account_type
1683 vim
['description'] = description
1684 vim
['config'] = config
1685 if sdn_controller
or sdn_port_mapping
:
1686 ctx
.obj
.vim
.create(name
, vim
, sdn_controller
, sdn_port_mapping
)
1688 ctx
.obj
.vim
.create(name
, vim
)
1689 except ClientException
as inst
:
1690 print((inst
.message
))
1694 @cli.command(name
='vim-update', short_help
='updates a VIM account')
1695 @click.argument('name')
1696 @click.option('--newname', help='New name for the VIM account')
1697 @click.option('--user', help='VIM username')
1698 @click.option('--password', help='VIM password')
1699 @click.option('--auth_url', help='VIM url')
1700 @click.option('--tenant', help='VIM tenant name')
1701 @click.option('--config', help='VIM specific config parameters')
1702 @click.option('--account_type', help='VIM type')
1703 @click.option('--description', help='human readable description')
1704 @click.option('--sdn_controller', default
=None, help='Name or id of the SDN controller associated to this VIM account')
1705 @click.option('--sdn_port_mapping', default
=None, help="File describing the port mapping between compute nodes' ports and switch ports")
1719 """updates a VIM account
1721 NAME: name or ID of the VIM account
1724 check_client_version(ctx
.obj
, ctx
.command
.name
)
1726 if newname
: vim
['name'] = newname
1727 if user
: vim
['vim_user'] = user
1728 if password
: vim
['vim_password'] = password
1729 if auth_url
: vim
['vim_url'] = auth_url
1730 if tenant
: vim
['vim-tenant-name'] = tenant
1731 if account_type
: vim
['vim_type'] = account_type
1732 if description
: vim
['description'] = description
1733 if config
: vim
['config'] = config
1734 ctx
.obj
.vim
.update(name
, vim
, sdn_controller
, sdn_port_mapping
)
1735 except ClientException
as inst
:
1736 print((inst
.message
))
1740 @cli.command(name
='vim-delete')
1741 @click.argument('name')
1742 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1744 def vim_delete(ctx
, name
, force
):
1745 """deletes a VIM account
1747 NAME: name or ID of the VIM account to be deleted
1751 ctx
.obj
.vim
.delete(name
)
1753 check_client_version(ctx
.obj
, '--force')
1754 ctx
.obj
.vim
.delete(name
, force
)
1755 except ClientException
as inst
:
1756 print((inst
.message
))
1760 @cli.command(name
='vim-list')
1761 @click.option('--ro_update/--no_ro_update',
1763 help='update list from RO')
1764 @click.option('--filter', default
=None,
1765 help='restricts the list to the VIM accounts matching the filter')
1767 def vim_list(ctx
, ro_update
, filter):
1768 """list all VIM accounts"""
1770 check_client_version(ctx
.obj
, '--filter')
1772 check_client_version(ctx
.obj
, '--ro_update', 'v1')
1773 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
1774 if fullclassname
== 'osmclient.sol005.client.Client':
1775 resp
= ctx
.obj
.vim
.list(filter)
1777 resp
= ctx
.obj
.vim
.list(ro_update
)
1778 table
= PrettyTable(['vim name', 'uuid'])
1780 table
.add_row([vim
['name'], vim
['uuid']])
1785 @cli.command(name
='vim-show')
1786 @click.argument('name')
1788 def vim_show(ctx
, name
):
1789 """shows the details of a VIM account
1791 NAME: name or ID of the VIM account
1794 resp
= ctx
.obj
.vim
.get(name
)
1795 if 'vim_password' in resp
:
1796 resp
['vim_password']='********'
1797 except ClientException
as inst
:
1798 print((inst
.message
))
1801 table
= PrettyTable(['key', 'attribute'])
1802 for k
, v
in list(resp
.items()):
1803 table
.add_row([k
, json
.dumps(v
, indent
=2)])
1808 ####################
1810 ####################
1812 @cli.command(name
='wim-create')
1813 @click.option('--name',
1815 help='Name for the WIM account')
1816 @click.option('--user',
1817 help='WIM username')
1818 @click.option('--password',
1819 help='WIM password')
1820 @click.option('--url',
1823 # @click.option('--tenant',
1824 # help='wIM tenant name')
1825 @click.option('--config',
1827 help='WIM specific config parameters')
1828 @click.option('--wim_type',
1830 @click.option('--description',
1831 default
='no description',
1832 help='human readable description')
1833 @click.option('--wim_port_mapping', default
=None, help="File describing the port mapping between DC edge (datacenters, switches, ports) and WAN edge (WAN service endpoint id and info)")
1845 """creates a new WIM account"""
1847 check_client_version(ctx
.obj
, ctx
.command
.name
)
1848 # if sdn_controller:
1849 # check_client_version(ctx.obj, '--sdn_controller')
1850 # if sdn_port_mapping:
1851 # check_client_version(ctx.obj, '--sdn_port_mapping')
1853 if user
: wim
['user'] = user
1854 if password
: wim
['password'] = password
1855 if url
: wim
['wim_url'] = url
1856 # if tenant: wim['tenant'] = tenant
1857 wim
['wim_type'] = wim_type
1858 if description
: wim
['description'] = description
1859 if config
: wim
['config'] = config
1860 ctx
.obj
.wim
.create(name
, wim
, wim_port_mapping
)
1861 except ClientException
as inst
:
1862 print((inst
.message
))
1866 @cli.command(name
='wim-update', short_help
='updates a WIM account')
1867 @click.argument('name')
1868 @click.option('--newname', help='New name for the WIM account')
1869 @click.option('--user', help='WIM username')
1870 @click.option('--password', help='WIM password')
1871 @click.option('--url', help='WIM url')
1872 @click.option('--config', help='WIM specific config parameters')
1873 @click.option('--wim_type', help='WIM type')
1874 @click.option('--description', help='human readable description')
1875 @click.option('--wim_port_mapping', default
=None, help="File describing the port mapping between DC edge (datacenters, switches, ports) and WAN edge (WAN service endpoint id and info)")
1887 """updates a WIM account
1889 NAME: name or ID of the WIM account
1892 check_client_version(ctx
.obj
, ctx
.command
.name
)
1894 if newname
: wim
['name'] = newname
1895 if user
: wim
['user'] = user
1896 if password
: wim
['password'] = password
1897 if url
: wim
['url'] = url
1898 # if tenant: wim['tenant'] = tenant
1899 if wim_type
: wim
['wim_type'] = wim_type
1900 if description
: wim
['description'] = description
1901 if config
: wim
['config'] = config
1902 ctx
.obj
.wim
.update(name
, wim
, wim_port_mapping
)
1903 except ClientException
as inst
:
1904 print((inst
.message
))
1908 @cli.command(name
='wim-delete')
1909 @click.argument('name')
1910 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
1912 def wim_delete(ctx
, name
, force
):
1913 """deletes a WIM account
1915 NAME: name or ID of the WIM account to be deleted
1918 check_client_version(ctx
.obj
, ctx
.command
.name
)
1919 ctx
.obj
.wim
.delete(name
, force
)
1920 except ClientException
as inst
:
1921 print((inst
.message
))
1925 @cli.command(name
='wim-list')
1926 @click.option('--filter', default
=None,
1927 help='restricts the list to the WIM accounts matching the filter')
1929 def wim_list(ctx
, filter):
1930 """list all WIM accounts"""
1932 check_client_version(ctx
.obj
, ctx
.command
.name
)
1933 resp
= ctx
.obj
.wim
.list(filter)
1934 table
= PrettyTable(['wim name', 'uuid'])
1936 table
.add_row([wim
['name'], wim
['uuid']])
1939 except ClientException
as inst
:
1940 print((inst
.message
))
1944 @cli.command(name
='wim-show')
1945 @click.argument('name')
1947 def wim_show(ctx
, name
):
1948 """shows the details of a WIM account
1950 NAME: name or ID of the WIM account
1953 check_client_version(ctx
.obj
, ctx
.command
.name
)
1954 resp
= ctx
.obj
.wim
.get(name
)
1955 if 'password' in resp
:
1956 resp
['wim_password']='********'
1957 except ClientException
as inst
:
1958 print((inst
.message
))
1961 table
= PrettyTable(['key', 'attribute'])
1962 for k
, v
in list(resp
.items()):
1963 table
.add_row([k
, json
.dumps(v
, indent
=2)])
1968 ####################
1969 # SDN controller operations
1970 ####################
1972 @cli.command(name
='sdnc-create')
1973 @click.option('--name',
1975 help='Name to create sdn controller')
1976 @click.option('--type',
1978 help='SDN controller type')
1979 @click.option('--sdn_controller_version',
1980 help='SDN controller username')
1981 @click.option('--ip_address',
1983 help='SDN controller IP address')
1984 @click.option('--port',
1986 help='SDN controller port')
1987 @click.option('--switch_dpid',
1989 help='Switch DPID (Openflow Datapath ID)')
1990 @click.option('--user',
1991 help='SDN controller username')
1992 @click.option('--password',
1994 confirmation_prompt
=True,
1995 help='SDN controller password')
1996 #@click.option('--description',
1997 # default='no description',
1998 # help='human readable description')
2000 def sdnc_create(ctx
,
2003 sdn_controller_version
,
2009 """creates a new SDN controller"""
2011 sdncontroller
['name'] = name
2012 sdncontroller
['type'] = type
2013 sdncontroller
['ip'] = ip_address
2014 sdncontroller
['port'] = int(port
)
2015 sdncontroller
['dpid'] = switch_dpid
2016 if sdn_controller_version
:
2017 sdncontroller
['version'] = sdn_controller_version
2019 sdncontroller
['user'] = user
2021 sdncontroller
['password'] = password
2022 # sdncontroller['description'] = description
2024 check_client_version(ctx
.obj
, ctx
.command
.name
)
2025 ctx
.obj
.sdnc
.create(name
, sdncontroller
)
2026 except ClientException
as inst
:
2027 print((inst
.message
))
2030 @cli.command(name
='sdnc-update', short_help
='updates an SDN controller')
2031 @click.argument('name')
2032 @click.option('--newname', help='New name for the SDN controller')
2033 @click.option('--type', help='SDN controller type')
2034 @click.option('--sdn_controller_version', help='SDN controller username')
2035 @click.option('--ip_address', help='SDN controller IP address')
2036 @click.option('--port', help='SDN controller port')
2037 @click.option('--switch_dpid', help='Switch DPID (Openflow Datapath ID)')
2038 @click.option('--user', help='SDN controller username')
2039 @click.option('--password', help='SDN controller password')
2040 #@click.option('--description', default=None, help='human readable description')
2042 def sdnc_update(ctx
,
2046 sdn_controller_version
,
2052 """updates an SDN controller
2054 NAME: name or ID of the SDN controller
2057 if newname
: sdncontroller
['name'] = newname
2058 if type: sdncontroller
['type'] = type
2059 if ip_address
: sdncontroller
['ip'] = ip_address
2060 if port
: sdncontroller
['port'] = int(port
)
2061 if switch_dpid
: sdncontroller
['dpid'] = switch_dpid
2062 # sdncontroller['description'] = description
2063 if sdn_controller_version
is not None:
2064 if sdn_controller_version
=="":
2065 sdncontroller
['version'] = None
2067 sdncontroller
['version'] = sdn_controller_version
2068 if user
is not None:
2070 sdncontroller
['user'] = None
2072 sdncontroller
['user'] = user
2073 if password
is not None:
2075 sdncontroller
['password'] = None
2077 sdncontroller
['password'] = user
2079 check_client_version(ctx
.obj
, ctx
.command
.name
)
2080 ctx
.obj
.sdnc
.update(name
, sdncontroller
)
2081 except ClientException
as inst
:
2082 print((inst
.message
))
2086 @cli.command(name
='sdnc-delete')
2087 @click.argument('name')
2088 @click.option('--force', is_flag
=True, help='forces the deletion bypassing pre-conditions')
2090 def sdnc_delete(ctx
, name
, force
):
2091 """deletes an SDN controller
2093 NAME: name or ID of the SDN controller to be deleted
2096 check_client_version(ctx
.obj
, ctx
.command
.name
)
2097 ctx
.obj
.sdnc
.delete(name
, force
)
2098 except ClientException
as inst
:
2099 print((inst
.message
))
2103 @cli.command(name
='sdnc-list')
2104 @click.option('--filter', default
=None,
2105 help='restricts the list to the SDN controllers matching the filter')
2107 def sdnc_list(ctx
, filter):
2108 """list all SDN controllers"""
2110 check_client_version(ctx
.obj
, ctx
.command
.name
)
2111 resp
= ctx
.obj
.sdnc
.list(filter)
2112 except ClientException
as inst
:
2113 print((inst
.message
))
2115 table
= PrettyTable(['name', 'id'])
2117 table
.add_row([sdnc
['name'], sdnc
['_id']])
2122 @cli.command(name
='sdnc-show')
2123 @click.argument('name')
2125 def sdnc_show(ctx
, name
):
2126 """shows the details of an SDN controller
2128 NAME: name or ID of the SDN controller
2131 check_client_version(ctx
.obj
, ctx
.command
.name
)
2132 resp
= ctx
.obj
.sdnc
.get(name
)
2133 except ClientException
as inst
:
2134 print((inst
.message
))
2137 table
= PrettyTable(['key', 'attribute'])
2138 for k
, v
in list(resp
.items()):
2139 table
.add_row([k
, json
.dumps(v
, indent
=2)])
2144 ####################
2145 # Project mgmt operations
2146 ####################
2148 @cli.command(name
='project-create')
2149 @click.argument('name')
2150 #@click.option('--description',
2151 # default='no description',
2152 # help='human readable description')
2154 def project_create(ctx
, name
):
2155 """Creates a new project
2157 NAME: name of the project
2160 project
['name'] = name
2162 check_client_version(ctx
.obj
, ctx
.command
.name
)
2163 ctx
.obj
.project
.create(name
, project
)
2164 except ClientException
as inst
:
2168 @cli.command(name
='project-delete')
2169 @click.argument('name')
2170 #@click.option('--force', is_flag=True, help='forces the deletion bypassing pre-conditions')
2172 def project_delete(ctx
, name
):
2173 """deletes a project
2175 NAME: name or ID of the project to be deleted
2178 check_client_version(ctx
.obj
, ctx
.command
.name
)
2179 ctx
.obj
.project
.delete(name
)
2180 except ClientException
as inst
:
2185 @cli.command(name
='project-list')
2186 @click.option('--filter', default
=None,
2187 help='restricts the list to the projects matching the filter')
2189 def project_list(ctx
, filter):
2190 """list all projects"""
2192 check_client_version(ctx
.obj
, ctx
.command
.name
)
2193 resp
= ctx
.obj
.project
.list(filter)
2194 except ClientException
as inst
:
2197 table
= PrettyTable(['name', 'id'])
2199 table
.add_row([proj
['name'], proj
['_id']])
2204 @cli.command(name
='project-show')
2205 @click.argument('name')
2207 def project_show(ctx
, name
):
2208 """shows the details of a project
2210 NAME: name or ID of the project
2213 check_client_version(ctx
.obj
, ctx
.command
.name
)
2214 resp
= ctx
.obj
.project
.get(name
)
2215 except ClientException
as inst
:
2219 table
= PrettyTable(['key', 'attribute'])
2220 for k
, v
in resp
.items():
2221 table
.add_row([k
, json
.dumps(v
, indent
=2)])
2226 ####################
2227 # User mgmt operations
2228 ####################
2230 @cli.command(name
='user-create')
2231 @click.argument('username')
2232 @click.option('--password',
2235 confirmation_prompt
=True,
2236 help='user password')
2237 @click.option('--projects',
2238 prompt
="Comma separate list of projects",
2240 callback
=lambda ctx
, param
, value
: ''.join(value
).split(',') if all(len(x
)==1 for x
in value
) else value
,
2241 help='list of project ids that the user belongs to')
2242 @click.option('--project-role-mapping', 'project_role_mappings',
2243 default
=None, multiple
=True,
2244 help='creating user project/role(s) mapping')
2246 def user_create(ctx
, username
, password
, projects
, project_role_mappings
):
2247 """Creates a new user
2250 USERNAME: name of the user
2251 PASSWORD: password of the user
2252 PROJECTS: projects assigned to user (internal only)
2253 PROJECT_ROLE_MAPPING: roles in projects assigned to user (keystone)
2256 user
['username'] = username
2257 user
['password'] = password
2258 user
['projects'] = projects
2259 user
['project-role-mappings'] = project_role_mappings
2262 check_client_version(ctx
.obj
, ctx
.command
.name
)
2263 ctx
.obj
.user
.create(username
, user
)
2264 except ClientException
as inst
:
2268 @cli.command(name
='user-update')
2269 @click.argument('username')
2270 @click.option('--password',
2273 confirmation_prompt
=True,
2274 help='user password')
2275 @click.option('--set-project', 'set_project',
2276 default
=None, multiple
=True,
2277 help='create/replace the project,role(s) mapping for this project: \'project,role1,role2,...\'')
2278 @click.option('--remove-project', 'remove_project',
2279 default
=None, multiple
=True,
2280 help='removes project from user: \'project\'')
2281 @click.option('--add-project-role', 'add_project_role',
2282 default
=None, multiple
=True,
2283 help='adds project,role(s) mapping: \'project,role1,role2,...\'')
2284 @click.option('--remove-project-role', 'remove_project_role',
2285 default
=None, multiple
=True,
2286 help='removes project,role(s) mapping: \'project,role1,role2,...\'')
2288 def user_update(ctx
, username
, password
, set_project
, remove_project
,
2289 add_project_role
, remove_project_role
):
2290 """Update a user information
2293 USERNAME: name of the user
2294 PASSWORD: new password
2295 SET_PROJECT: creating mappings for project/role(s)
2296 REMOVE_PROJECT: deleting mappings for project/role(s)
2297 ADD_PROJECT_ROLE: adding mappings for project/role(s)
2298 REMOVE_PROJECT_ROLE: removing mappings for project/role(s)
2301 user
['username'] = username
2302 user
['password'] = password
2303 user
['set-project'] = set_project
2304 user
['remove-project'] = remove_project
2305 user
['add-project-role'] = add_project_role
2306 user
['remove-project-role'] = remove_project_role
2309 check_client_version(ctx
.obj
, ctx
.command
.name
)
2310 ctx
.obj
.user
.update(username
, user
)
2311 except ClientException
as inst
:
2315 @cli.command(name
='user-delete')
2316 @click.argument('name')
2317 #@click.option('--force', is_flag=True, help='forces the deletion bypassing pre-conditions')
2319 def user_delete(ctx
, name
):
2323 NAME: name or ID of the user to be deleted
2326 check_client_version(ctx
.obj
, ctx
.command
.name
)
2327 ctx
.obj
.user
.delete(name
)
2328 except ClientException
as inst
:
2333 @cli.command(name
='user-list')
2334 @click.option('--filter', default
=None,
2335 help='restricts the list to the users matching the filter')
2337 def user_list(ctx
, filter):
2338 """list all users"""
2340 check_client_version(ctx
.obj
, ctx
.command
.name
)
2341 resp
= ctx
.obj
.user
.list(filter)
2342 except ClientException
as inst
:
2345 table
= PrettyTable(['name', 'id'])
2347 table
.add_row([user
['username'], user
['_id']])
2352 @cli.command(name
='user-show')
2353 @click.argument('name')
2355 def user_show(ctx
, name
):
2356 """shows the details of a user
2358 NAME: name or ID of the user
2361 check_client_version(ctx
.obj
, ctx
.command
.name
)
2362 resp
= ctx
.obj
.user
.get(name
)
2363 if 'password' in resp
:
2364 resp
['password']='********'
2365 except ClientException
as inst
:
2369 table
= PrettyTable(['key', 'attribute'])
2370 for k
, v
in resp
.items():
2371 table
.add_row([k
, json
.dumps(v
, indent
=2)])
2376 ####################
2377 # Fault Management operations
2378 ####################
2380 @cli.command(name
='ns-alarm-create')
2381 @click.argument('name')
2382 @click.option('--ns', prompt
=True, help='NS instance id or name')
2383 @click.option('--vnf', prompt
=True,
2384 help='VNF name (VNF member index as declared in the NSD)')
2385 @click.option('--vdu', prompt
=True,
2386 help='VDU name (VDU name as declared in the VNFD)')
2387 @click.option('--metric', prompt
=True,
2388 help='Name of the metric (e.g. cpu_utilization)')
2389 @click.option('--severity', default
='WARNING',
2390 help='severity of the alarm (WARNING, MINOR, MAJOR, CRITICAL, INDETERMINATE)')
2391 @click.option('--threshold_value', prompt
=True,
2392 help='threshold value that, when crossed, an alarm is triggered')
2393 @click.option('--threshold_operator', prompt
=True,
2394 help='threshold operator describing the comparison (GE, LE, GT, LT, EQ)')
2395 @click.option('--statistic', default
='AVERAGE',
2396 help='statistic (AVERAGE, MINIMUM, MAXIMUM, COUNT, SUM)')
2398 def ns_alarm_create(ctx
, name
, ns
, vnf
, vdu
, metric
, severity
,
2399 threshold_value
, threshold_operator
, statistic
):
2400 """creates a new alarm for a NS instance"""
2401 ns_instance
= ctx
.obj
.ns
.get(ns
)
2403 alarm
['alarm_name'] = name
2404 alarm
['ns_id'] = ns_instance
['_id']
2405 alarm
['correlation_id'] = ns_instance
['_id']
2406 alarm
['vnf_member_index'] = vnf
2407 alarm
['vdu_name'] = vdu
2408 alarm
['metric_name'] = metric
2409 alarm
['severity'] = severity
2410 alarm
['threshold_value'] = int(threshold_value
)
2411 alarm
['operation'] = threshold_operator
2412 alarm
['statistic'] = statistic
2414 check_client_version(ctx
.obj
, ctx
.command
.name
)
2415 ctx
.obj
.ns
.create_alarm(alarm
)
2416 except ClientException
as inst
:
2417 print((inst
.message
))
2421 #@cli.command(name='ns-alarm-delete')
2422 #@click.argument('name')
2423 #@click.pass_context
2424 #def ns_alarm_delete(ctx, name):
2425 # '''deletes an alarm
2427 # NAME: name of the alarm to be deleted
2430 # check_client_version(ctx.obj, ctx.command.name)
2431 # ctx.obj.ns.delete_alarm(name)
2432 # except ClientException as inst:
2433 # print(inst.message)
2437 ####################
2438 # Performance Management operations
2439 ####################
2441 @cli.command(name
='ns-metric-export')
2442 @click.option('--ns', prompt
=True, help='NS instance id or name')
2443 @click.option('--vnf', prompt
=True,
2444 help='VNF name (VNF member index as declared in the NSD)')
2445 @click.option('--vdu', prompt
=True,
2446 help='VDU name (VDU name as declared in the VNFD)')
2447 @click.option('--metric', prompt
=True,
2448 help='name of the metric (e.g. cpu_utilization)')
2449 #@click.option('--period', default='1w',
2450 # help='metric collection period (e.g. 20s, 30m, 2h, 3d, 1w)')
2451 @click.option('--interval', help='periodic interval (seconds) to export metrics continuously')
2453 def ns_metric_export(ctx
, ns
, vnf
, vdu
, metric
, interval
):
2454 """exports a metric to the internal OSM bus, which can be read by other apps"""
2455 ns_instance
= ctx
.obj
.ns
.get(ns
)
2457 metric_data
['ns_id'] = ns_instance
['_id']
2458 metric_data
['correlation_id'] = ns_instance
['_id']
2459 metric_data
['vnf_member_index'] = vnf
2460 metric_data
['vdu_name'] = vdu
2461 metric_data
['metric_name'] = metric
2462 metric_data
['collection_unit'] = 'WEEK'
2463 metric_data
['collection_period'] = 1
2465 check_client_version(ctx
.obj
, ctx
.command
.name
)
2467 print('{}'.format(ctx
.obj
.ns
.export_metric(metric_data
)))
2471 print('{} {}'.format(ctx
.obj
.ns
.export_metric(metric_data
),i
))
2472 time
.sleep(int(interval
))
2474 except ClientException
as inst
:
2475 print((inst
.message
))
2479 ####################
2481 ####################
2483 @cli.command(name
='upload-package')
2484 @click.argument('filename')
2486 def upload_package(ctx
, filename
):
2487 """uploads a VNF package or NS package
2489 FILENAME: VNF or NS package file (tar.gz)
2492 ctx
.obj
.package
.upload(filename
)
2493 fullclassname
= ctx
.obj
.__module
__ + "." + ctx
.obj
.__class
__.__name
__
2494 if fullclassname
!= 'osmclient.sol005.client.Client':
2495 ctx
.obj
.package
.wait_for_upload(filename
)
2496 except ClientException
as inst
:
2497 print((inst
.message
))
2501 @cli.command(name
='ns-scaling-show')
2502 @click.argument('ns_name')
2504 def show_ns_scaling(ctx
, ns_name
):
2505 """shows the status of a NS scaling operation
2507 NS_NAME: name of the NS instance being scaled
2510 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
2511 resp
= ctx
.obj
.ns
.list()
2512 except ClientException
as inst
:
2513 print((inst
.message
))
2516 table
= PrettyTable(
2519 'operational status',
2524 if ns_name
== ns
['name']:
2525 nsopdata
= ctx
.obj
.ns
.get_opdata(ns
['id'])
2526 scaling_records
= nsopdata
['nsr:nsr']['scaling-group-record']
2527 for record
in scaling_records
:
2528 if 'instance' in record
:
2529 instances
= record
['instance']
2530 for inst
in instances
:
2532 [record
['scaling-group-name-ref'],
2533 inst
['instance-id'],
2535 time
.strftime('%Y-%m-%d %H:%M:%S',
2537 inst
['create-time'])),
2543 @cli.command(name
='ns-scale')
2544 @click.argument('ns_name')
2545 @click.option('--ns_scale_group', prompt
=True)
2546 @click.option('--index', prompt
=True)
2548 def ns_scale(ctx
, ns_name
, ns_scale_group
, index
):
2551 NS_NAME: name of the NS instance to be scaled
2554 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
2555 ctx
.obj
.ns
.scale(ns_name
, ns_scale_group
, index
)
2556 except ClientException
as inst
:
2557 print((inst
.message
))
2561 @cli.command(name
='config-agent-list')
2563 def config_agent_list(ctx
):
2564 """list config agents"""
2566 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
2567 except ClientException
as inst
:
2568 print((inst
.message
))
2570 table
= PrettyTable(['name', 'account-type', 'details'])
2571 for account
in ctx
.obj
.vca
.list():
2574 account
['account-type'],
2580 @cli.command(name
='config-agent-delete')
2581 @click.argument('name')
2583 def config_agent_delete(ctx
, name
):
2584 """deletes a config agent
2586 NAME: name of the config agent to be deleted
2589 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
2590 ctx
.obj
.vca
.delete(name
)
2591 except ClientException
as inst
:
2592 print((inst
.message
))
2596 @cli.command(name
='config-agent-add')
2597 @click.option('--name',
2599 @click.option('--account_type',
2601 @click.option('--server',
2603 @click.option('--user',
2605 @click.option('--secret',
2608 confirmation_prompt
=True)
2610 def config_agent_add(ctx
, name
, account_type
, server
, user
, secret
):
2611 """adds a config agent"""
2613 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
2614 ctx
.obj
.vca
.create(name
, account_type
, server
, user
, secret
)
2615 except ClientException
as inst
:
2616 print((inst
.message
))
2620 @cli.command(name
='ro-dump')
2623 """shows RO agent information"""
2624 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
2625 resp
= ctx
.obj
.vim
.get_resource_orchestrator()
2626 table
= PrettyTable(['key', 'attribute'])
2627 for k
, v
in list(resp
.items()):
2628 table
.add_row([k
, json
.dumps(v
, indent
=2)])
2633 @cli.command(name
='vcs-list')
2636 check_client_version(ctx
.obj
, ctx
.command
.name
, 'v1')
2637 resp
= ctx
.obj
.utils
.get_vcs_info()
2638 table
= PrettyTable(['component name', 'state'])
2639 for component
in resp
:
2640 table
.add_row([component
['component_name'], component
['state']])
2645 @cli.command(name
='ns-action')
2646 @click.argument('ns_name')
2647 @click.option('--vnf_name', default
=None)
2648 @click.option('--action_name', prompt
=True)
2649 @click.option('--params', prompt
=True)
2656 """executes an action/primitive over a NS instance
2658 NS_NAME: name or ID of the NS instance
2661 check_client_version(ctx
.obj
, ctx
.command
.name
)
2664 op_data
['vnf_member_index'] = vnf_name
2665 op_data
['primitive'] = action_name
2666 op_data
['primitive_params'] = yaml
.load(params
)
2667 ctx
.obj
.ns
.exec_op(ns_name
, op_name
='action', op_data
=op_data
)
2669 except ClientException
as inst
:
2670 print((inst
.message
))
2674 @cli.command(name
='vnf-scale')
2675 @click.argument('ns_name')
2676 @click.argument('vnf_name')
2677 @click.option('--scaling-group', prompt
=True, help="scaling-group-descriptor name to use")
2678 @click.option('--scale-in', default
=False, is_flag
=True, help="performs a scale in operation")
2679 @click.option('--scale-out', default
=False, is_flag
=True, help="performs a scale out operation (by default)")
2688 Executes a VNF scale (adding/removing VDUs)
2691 NS_NAME: name or ID of the NS instance.
2692 VNF_NAME: member-vnf-index in the NS to be scaled.
2695 check_client_version(ctx
.obj
, ctx
.command
.name
)
2696 if not scale_in
and not scale_out
:
2698 ctx
.obj
.ns
.scale_vnf(ns_name
, vnf_name
, scaling_group
, scale_in
, scale_out
)
2699 except ClientException
as inst
:
2700 print((inst
.message
))
2704 ##############################
2705 # Role Management Operations #
2706 ##############################
2708 @cli.command(name
='role-create', short_help
='creates a role')
2709 @click.argument('name')
2710 @click.option('--definition',
2712 help='role definition using a dictionary')
2714 def role_create(ctx
, name
, definition
):
2719 NAME: Name or ID of the role.
2720 DEFINITION: Definition of grant/denial of access to resources.
2723 check_client_version(ctx
.obj
, ctx
.command
.name
)
2724 ctx
.obj
.role
.create(name
, definition
)
2725 except ClientException
as inst
:
2729 @cli.command(name
='role-update', short_help
='updates a role')
2730 @click.argument('name')
2731 @click.option('--definition',
2733 help='add a new definition to the role')
2734 @click.option('--add',
2736 help='add a resource access grant/denial')
2737 @click.option('--remove',
2739 help='remove a resource access grant/denial')
2741 def role_update(ctx
, name
, definition
, add
, remove
):
2746 NAME: Name or ID of the role.
2747 DEFINITION: Definition overwrites the old definition.
2748 ADD: Grant/denial of access to resource to add.
2749 REMOVE: Grant/denial of access to resource to remove.
2752 check_client_version(ctx
.obj
, ctx
.command
.name
)
2753 ctx
.obj
.role
.update(name
, definition
, add
, remove
)
2754 except ClientException
as inst
:
2759 @cli.command(name
='role-delete', short_help
='deletes a role')
2760 @click.argument('name')
2761 # @click.option('--force', is_flag=True, help='forces the deletion bypassing pre-conditions')
2763 def role_delete(ctx
, name
):
2768 NAME: Name or ID of the role.
2771 check_client_version(ctx
.obj
, ctx
.command
.name
)
2772 ctx
.obj
.role
.delete(name
)
2773 except ClientException
as inst
:
2778 @cli.command(name
='role-list', short_help
='list all roles')
2779 @click.option('--filter', default
=None,
2780 help='restricts the list to the projects matching the filter')
2782 def role_list(ctx
, filter):
2787 check_client_version(ctx
.obj
, ctx
.command
.name
)
2788 resp
= ctx
.obj
.role
.list(filter)
2789 except ClientException
as inst
:
2792 table
= PrettyTable(['name', 'id'])
2794 table
.add_row([role
['name'], role
['_id']])
2799 @cli.command(name
='role-show', short_help
='show specific role')
2800 @click.argument('name')
2802 def role_show(ctx
, name
):
2804 Shows the details of a role.
2807 NAME: Name or ID of the role.
2810 check_client_version(ctx
.obj
, ctx
.command
.name
)
2811 resp
= ctx
.obj
.role
.get(name
)
2812 except ClientException
as inst
:
2816 table
= PrettyTable(['key', 'attribute'])
2817 for k
, v
in resp
.items():
2818 table
.add_row([k
, json
.dumps(v
, indent
=2)])
2823 if __name__
== '__main__':
2826 except pycurl
.error
as e
:
2828 print('Maybe "--hostname" option or OSM_HOSTNAME' +
2829 'environment variable needs to be specified')