1 # Copyright 2017 Sandvine
5 # Licensed under the Apache License, Version 2.0 (the "License"); you may
6 # not use this file except in compliance with the License. You may obtain
7 # a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 # License for the specific language governing permissions and limitations
21 from osmclient
.client
import client
22 from osmclient
.common
.exceptions
import ClientException
23 from prettytable
import PrettyTable
29 @click.option('--hostname',
31 envvar
='OSM_HOSTNAME',
32 help='hostname of server. ' +
33 'Also can set OSM_HOSTNAME in environment')
34 @click.option('--so-port',
37 help='hostname of server. ' +
38 'Also can set OSM_SO_PORT in environment')
39 @click.option('--ro-hostname',
41 envvar
='OSM_RO_HOSTNAME',
42 help='hostname of RO server. ' +
43 'Also can set OSM_RO_HOSTNAME in environment')
44 @click.option('--ro-port',
47 help='hostname of RO server. ' +
48 'Also can set OSM_RO_PORT in environment')
50 def cli(ctx
, hostname
, so_port
, ro_hostname
, ro_port
):
53 "either hostname option or OSM_HOSTNAME " +
54 "environment variable needs to be specified")
56 ctx
.obj
= client
.Client(
63 @cli.command(name
='ns-list')
66 resp
= ctx
.obj
.ns
.list()
73 nsopdata
= ctx
.obj
.ns
.get_opdata(ns
['id'])
74 nsr
= nsopdata
['nsr:nsr']
77 nsr
['ns-instance-config-ref'],
78 nsr
['operational-status'],
79 nsr
['config-status']])
84 @cli.command(name
='nsd-list')
87 resp
= ctx
.obj
.nsd
.list()
88 table
= PrettyTable(['nsd name', 'id'])
90 table
.add_row([ns
['name'], ns
['id']])
95 @cli.command(name
='vnfd-list')
98 resp
= ctx
.obj
.vnfd
.list()
99 table
= PrettyTable(['vnfd name', 'id'])
101 table
.add_row([vnfd
['name'], vnfd
['id']])
106 @cli.command(name
='vnf-list')
109 resp
= ctx
.obj
.vnf
.list()
113 'operational status',
116 if 'mgmt-interface' not in vnfr
:
117 vnfr
['mgmt-interface'] = {}
118 vnfr
['mgmt-interface']['ip-address'] = None
122 vnfr
['operational-status'],
123 vnfr
['config-status']])
128 @cli.command(name
='vnf-show')
129 @click.argument('vnf_name')
130 @click.option('--filter', default
=None)
132 def vnf_show(ctx
, vnf_name
, filter):
134 resp
= ctx
.obj
.vnf
.get(vnf_name
)
135 except ClientException
as inst
:
139 table
= PrettyTable(['field', 'value'])
140 for k
, v
in resp
.items():
141 if filter is None or filter in k
:
142 table
.add_row([k
, json
.dumps(v
, indent
=2)])
147 @cli.command(name
='vnf-monitoring-show')
148 @click.argument('vnf_name')
150 def vnf_monitoring_show(ctx
, vnf_name
):
152 resp
= ctx
.obj
.vnf
.get_monitoring(vnf_name
)
153 except ClientException
as inst
:
157 table
= PrettyTable(['vnf name', 'monitoring name', 'value', 'units'])
163 monitor
['value-integer'],
169 @cli.command(name
='ns-monitoring-show')
170 @click.argument('ns_name')
172 def ns_monitoring_show(ctx
, ns_name
):
174 resp
= ctx
.obj
.ns
.get_monitoring(ns_name
)
175 except ClientException
as inst
:
179 table
= PrettyTable(['vnf name', 'monitoring name', 'value', 'units'])
180 for key
, val
in resp
.items():
185 monitor
['value-integer'],
191 @cli.command(name
='ns-create')
192 @click.option('--ns_name',
194 @click.option('--nsd_name',
196 @click.option('--vim_account',
198 @click.option('--admin_status',
200 help='administration status')
201 @click.option('--ssh_keys',
203 help='comma separated list of keys to inject to vnfs')
204 @click.option('--vim_network_prefix',
206 help='vim network name prefix')
219 vim_network_prefix
=vim_network_prefix
,
222 except ClientException
as inst
:
227 @cli.command(name
='ns-delete')
228 @click.argument('ns_name')
230 def ns_delete(ctx
, ns_name
):
232 ctx
.obj
.ns
.delete(ns_name
)
233 except ClientException
as inst
:
238 @cli.command(name
='upload-package')
239 @click.argument('filename')
241 def upload_package(ctx
, filename
):
243 ctx
.obj
.package
.upload(filename
)
244 ctx
.obj
.package
.wait_for_upload(filename
)
245 except ClientException
as inst
:
250 @cli.command(name
='ns-show')
251 @click.argument('ns_name')
252 @click.option('--filter', default
=None)
254 def ns_show(ctx
, ns_name
, filter):
256 ns
= ctx
.obj
.ns
.get(ns_name
)
257 except ClientException
as inst
:
261 table
= PrettyTable(['field', 'value'])
263 for k
, v
in ns
.items():
264 if filter is None or filter in k
:
265 table
.add_row([k
, json
.dumps(v
, indent
=2)])
267 nsopdata
= ctx
.obj
.ns
.get_opdata(ns
['id'])
268 nsr_optdata
= nsopdata
['nsr:nsr']
269 for k
, v
in nsr_optdata
.items():
270 if filter is None or filter in k
:
271 table
.add_row([k
, json
.dumps(v
, indent
=2)])
276 @cli.command(name
='ns-scaling-show')
277 @click.argument('ns_name')
279 def show_ns_scaling(ctx
, ns_name
):
280 resp
= ctx
.obj
.ns
.list()
285 'operational status',
290 if ns_name
== ns
['name']:
291 nsopdata
= ctx
.obj
.ns
.get_opdata(ns
['id'])
292 scaling_records
= nsopdata
['nsr:nsr']['scaling-group-record']
293 for record
in scaling_records
:
294 if 'instance' in record
:
295 instances
= record
['instance']
296 for inst
in instances
:
298 [record
['scaling-group-name-ref'],
301 time
.strftime('%Y-%m-%d %H:%M:%S',
303 inst
['create-time'])),
309 @cli.command(name
='ns-scale')
310 @click.argument('ns_name')
311 @click.option('--ns_scale_group', prompt
=True)
312 @click.option('--index', prompt
=True)
314 def ns_scale(ctx
, ns_name
, ns_scale_group
, index
):
315 ctx
.obj
.ns
.scale(ns_name
, ns_scale_group
, index
)
318 @cli.command(name
='nsd-delete')
319 @click.argument('nsd_name')
321 def nsd_delete(ctx
, nsd_name
):
323 ctx
.obj
.nsd
.delete(nsd_name
)
324 except ClientException
as inst
:
329 @cli.command(name
='vnfd-delete')
330 @click.argument('vnfd_name')
332 def vnfd_delete(ctx
, vnfd_name
):
334 ctx
.obj
.vnfd
.delete(vnfd_name
)
335 except ClientException
as inst
:
340 @cli.command(name
='config-agent-list')
342 def config_agent_list(ctx
):
343 table
= PrettyTable(['name', 'account-type', 'details'])
344 for account
in ctx
.obj
.vca
.list():
347 account
['account-type'],
353 @cli.command(name
='config-agent-delete')
354 @click.argument('name')
356 def config_agent_delete(ctx
, name
):
358 ctx
.obj
.vca
.delete(name
)
359 except ClientException
as inst
:
364 @cli.command(name
='config-agent-add')
365 @click.option('--name',
367 @click.option('--account_type',
369 @click.option('--server',
371 @click.option('--user',
373 @click.option('--secret',
376 confirmation_prompt
=True)
378 def config_agent_add(ctx
, name
, account_type
, server
, user
, secret
):
380 ctx
.obj
.vca
.create(name
, account_type
, server
, user
, secret
)
381 except ClientException
as inst
:
386 @cli.command(name
='vim-create')
387 @click.option('--name',
389 @click.option('--user',
391 @click.option('--password',
394 confirmation_prompt
=True)
395 @click.option('--auth_url',
397 @click.option('--tenant',
399 @click.option('--floating_ip_pool',
401 @click.option('--keypair',
403 @click.option('--account_type',
405 @click.option('--description',
406 default
='no description')
419 vim
['os-username'] = user
420 vim
['os-password'] = password
421 vim
['os-url'] = auth_url
422 vim
['os-project-name'] = tenant
423 vim
['floating_ip_pool'] = floating_ip_pool
424 vim
['keypair'] = keypair
425 vim
['vim-type'] = 'openstack'
426 vim
['description'] = description
428 ctx
.obj
.vim
.create(name
, vim
)
429 except ClientException
as inst
:
434 @cli.command(name
='vim-delete')
435 @click.argument('name')
437 def vim_delete(ctx
, name
):
439 ctx
.obj
.vim
.delete(name
)
440 except ClientException
as inst
:
445 @cli.command(name
='vim-list')
448 resp
= ctx
.obj
.vim
.list()
449 table
= PrettyTable(['vim name', 'uuid'])
451 table
.add_row([vim
['name'], vim
['uuid']])
456 @cli.command(name
='vim-show')
457 @click.argument('name')
459 def vim_show(ctx
, name
):
461 resp
= ctx
.obj
.vim
.get(name
)
462 except ClientException
as inst
:
466 table
= PrettyTable(['key', 'attribute'])
467 for k
, v
in resp
.items():
468 table
.add_row([k
, json
.dumps(v
, indent
=2)])
473 @cli.command(name
='ro-dump')
476 resp
= ctx
.obj
.vim
.get_resource_orchestrator()
477 table
= PrettyTable(['key', 'attribute'])
478 for k
, v
in resp
.items():
479 table
.add_row([k
, json
.dumps(v
, indent
=2)])
484 @cli.command(name
='vcs-list')
487 resp
= ctx
.obj
.utils
.get_vcs_info()
488 table
= PrettyTable(['component name', 'state'])
489 for component
in resp
:
490 table
.add_row([component
['component_name'], component
['state']])
495 if __name__
== '__main__':