+
+####################
+# Project mgmt operations
+####################
+
+@cli.command(name='project-create')
+@click.argument('name')
+#@click.option('--description',
+# default='no description',
+# help='human readable description')
+@click.pass_context
+def project_create(ctx, name):
+ '''Creates a new project
+
+ NAME: name of the project
+ '''
+ project = {}
+ project['name'] = name
+ try:
+ check_client_version(ctx.obj, ctx.command.name)
+ ctx.obj.project.create(name, project)
+ except ClientException as inst:
+ print(inst.message)
+
+
+@cli.command(name='project-delete')
+@click.argument('name')
+#@click.option('--force', is_flag=True, help='forces the deletion bypassing pre-conditions')
+@click.pass_context
+def project_delete(ctx, name):
+ '''deletes a project
+
+ NAME: name or ID of the project to be deleted
+ '''
+ try:
+ check_client_version(ctx.obj, ctx.command.name)
+ ctx.obj.project.delete(name)
+ except ClientException as inst:
+ print(inst.message)
+ exit(1)
+
+
+@cli.command(name='project-list')
+@click.option('--filter', default=None,
+ help='restricts the list to the projects matching the filter')
+@click.pass_context
+def project_list(ctx, filter):
+ '''list all projects'''
+ try:
+ check_client_version(ctx.obj, ctx.command.name)
+ resp = ctx.obj.project.list(filter)
+ except ClientException as inst:
+ print(inst.message)
+ exit(1)
+ table = PrettyTable(['name', 'id'])
+ for proj in resp:
+ table.add_row([proj['name'], proj['_id']])
+ table.align = 'l'
+ print(table)
+
+
+@cli.command(name='project-show')
+@click.argument('name')
+@click.pass_context
+def project_show(ctx, name):
+ '''shows the details of a project
+
+ NAME: name or ID of the project
+ '''
+ try:
+ check_client_version(ctx.obj, ctx.command.name)
+ resp = ctx.obj.project.get(name)
+ except ClientException as inst:
+ print(inst.message)
+ exit(1)
+
+ table = PrettyTable(['key', 'attribute'])
+ for k, v in resp.items():
+ table.add_row([k, json.dumps(v, indent=2)])
+ table.align = 'l'
+ print(table)
+
+
+####################
+# User mgmt operations
+####################
+
+@cli.command(name='user-create')
+@click.argument('username')
+@click.option('--password',
+ prompt=True,
+ hide_input=True,
+ confirmation_prompt=True,
+ help='user password')
+@click.option('--projects',
+ default=None,
+ help='list of project ids that the user belongs to')
+#@click.option('--description',
+# default='no description',
+# help='human readable description')
+@click.pass_context
+def user_create(ctx, username, password, projects):
+ '''Creates a new user
+
+ USERNAME: name of the user
+ '''
+ user = {}
+ user['username'] = username
+ user['password'] = password
+ user['projects'] = projects
+ try:
+ check_client_version(ctx.obj, ctx.command.name)
+ ctx.obj.user.create(username, user)
+ except ClientException as inst:
+ print(inst.message)
+
+
+@cli.command(name='user-delete')
+@click.argument('name')
+#@click.option('--force', is_flag=True, help='forces the deletion bypassing pre-conditions')
+@click.pass_context
+def user_delete(ctx, name):
+ '''deletes a user
+
+ NAME: name or ID of the user to be deleted
+ '''
+ try:
+ check_client_version(ctx.obj, ctx.command.name)
+ ctx.obj.user.delete(name)
+ except ClientException as inst:
+ print(inst.message)
+ exit(1)
+
+
+@cli.command(name='user-list')
+@click.option('--filter', default=None,
+ help='restricts the list to the users matching the filter')
+@click.pass_context
+def user_list(ctx, filter):
+ '''list all users'''
+ try:
+ check_client_version(ctx.obj, ctx.command.name)
+ resp = ctx.obj.user.list(filter)
+ except ClientException as inst:
+ print(inst.message)
+ exit(1)
+ table = PrettyTable(['name', 'id'])
+ for user in resp:
+ table.add_row([user['name'], user['_id']])
+ table.align = 'l'
+ print(table)
+
+
+@cli.command(name='user-show')
+@click.argument('name')
+@click.pass_context
+def user_show(ctx, name):
+ '''shows the details of a user
+
+ NAME: name or ID of the user
+ '''
+ try:
+ check_client_version(ctx.obj, ctx.command.name)
+ resp = ctx.obj.user.get(name)
+ if 'password' in resp:
+ resp['password']='********'
+ except ClientException as inst:
+ print(inst.message)
+ exit(1)
+
+ table = PrettyTable(['key', 'attribute'])
+ for k, v in resp.items():
+ table.add_row([k, json.dumps(v, indent=2)])
+ table.align = 'l'
+ print(table)
+
+
+####################
+# Fault Management operations
+####################
+
+@cli.command(name='ns-alarm-create')
+@click.argument('name')
+@click.option('--ns', prompt=True, help='NS instance id or name')
+@click.option('--vnf', prompt=True,
+ help='VNF name (VNF member index as declared in the NSD)')
+@click.option('--vdu', prompt=True,
+ help='VDU name (VDU name as declared in the VNFD)')
+@click.option('--metric', prompt=True,
+ help='Name of the metric (e.g. cpu_utilization)')
+@click.option('--severity', default='WARNING',
+ help='severity of the alarm (WARNING, MINOR, MAJOR, CRITICAL, INDETERMINATE)')
+@click.option('--threshold_value', prompt=True,
+ help='threshold value that, when crossed, an alarm is triggered')
+@click.option('--threshold_operator', prompt=True,
+ help='threshold operator describing the comparison (GE, LE, GT, LT, EQ)')
+@click.option('--statistic', default='AVERAGE',
+ help='statistic (AVERAGE, MINIMUM, MAXIMUM, COUNT, SUM)')
+@click.pass_context
+def ns_alarm_create(ctx, name, ns, vnf, vdu, metric, severity,
+ threshold_value, threshold_operator, statistic):
+ '''creates a new alarm for a NS instance'''
+ ns_instance = ctx.obj.ns.get(ns)
+ alarm = {}
+ alarm['alarm_name'] = name
+ alarm['ns_id'] = ns_instance['_id']
+ alarm['correlation_id'] = ns_instance['_id']
+ alarm['vnf_member_index'] = vnf
+ alarm['vdu_name'] = vdu
+ alarm['metric_name'] = metric
+ alarm['severity'] = severity
+ alarm['threshold_value'] = int(threshold_value)
+ alarm['operation'] = threshold_operator
+ alarm['statistic'] = statistic
+ try:
+ check_client_version(ctx.obj, ctx.command.name)
+ ctx.obj.ns.create_alarm(alarm)
+ except ClientException as inst:
+ print((inst.message))
+ exit(1)
+
+
+#@cli.command(name='ns-alarm-delete')
+#@click.argument('name')
+#@click.pass_context
+#def ns_alarm_delete(ctx, name):
+# '''deletes an alarm
+#
+# NAME: name of the alarm to be deleted
+# '''
+# try:
+# check_client_version(ctx.obj, ctx.command.name)
+# ctx.obj.ns.delete_alarm(name)
+# except ClientException as inst:
+# print(inst.message)
+# exit(1)
+
+
+####################
+# Performance Management operations
+####################
+
+@cli.command(name='ns-metric-export')
+@click.option('--ns', prompt=True, help='NS instance id or name')
+@click.option('--vnf', prompt=True,
+ help='VNF name (VNF member index as declared in the NSD)')
+@click.option('--vdu', prompt=True,
+ help='VDU name (VDU name as declared in the VNFD)')
+@click.option('--metric', prompt=True,
+ help='name of the metric (e.g. cpu_utilization)')
+#@click.option('--period', default='1w',
+# help='metric collection period (e.g. 20s, 30m, 2h, 3d, 1w)')
+@click.option('--interval', help='periodic interval (seconds) to export metrics continuously')
+@click.pass_context
+def ns_metric_export(ctx, ns, vnf, vdu, metric, interval):
+ '''exports a metric to the internal OSM bus, which can be read by other apps
+ '''
+ ns_instance = ctx.obj.ns.get(ns)
+ metric_data = {}
+ metric_data['ns_id'] = ns_instance['_id']
+ metric_data['correlation_id'] = ns_instance['_id']
+ metric_data['vnf_member_index'] = vnf
+ metric_data['vdu_name'] = vdu
+ metric_data['metric_name'] = metric
+ metric_data['collection_unit'] = 'WEEK'
+ metric_data['collection_period'] = 1
+ try:
+ check_client_version(ctx.obj, ctx.command.name)
+ if not interval:
+ print('{}'.format(ctx.obj.ns.export_metric(metric_data)))
+ else:
+ i = 1
+ while True:
+ print('{} {}'.format(ctx.obj.ns.export_metric(metric_data),i))
+ time.sleep(int(interval))
+ i+=1
+ except ClientException as inst:
+ print((inst.message))
+ exit(1)
+
+
+####################
+# Other operations
+####################
+
+@cli.command(name='upload-package')
+@click.argument('filename')
+@click.pass_context
+def upload_package(ctx, filename):
+ '''uploads a VNF package or NS package
+
+ FILENAME: VNF or NS package file (tar.gz)
+ '''
+ try:
+ ctx.obj.package.upload(filename)
+ fullclassname = ctx.obj.__module__ + "." + ctx.obj.__class__.__name__
+ if fullclassname != 'osmclient.sol005.client.Client':
+ ctx.obj.package.wait_for_upload(filename)
+ except ClientException as inst:
+ print((inst.message))
+ exit(1)
+
+
+@cli.command(name='ns-scaling-show')
+@click.argument('ns_name')
+@click.pass_context
+def show_ns_scaling(ctx, ns_name):
+ '''shows the status of a NS scaling operation
+
+ NS_NAME: name of the NS instance being scaled
+ '''
+ try:
+ check_client_version(ctx.obj, ctx.command.name, 'v1')
+ resp = ctx.obj.ns.list()
+ except ClientException as inst:
+ print((inst.message))
+ exit(1)
+
+ table = PrettyTable(
+ ['group-name',
+ 'instance-id',
+ 'operational status',
+ 'create-time',
+ 'vnfr ids'])
+
+ for ns in resp:
+ if ns_name == ns['name']:
+ nsopdata = ctx.obj.ns.get_opdata(ns['id'])
+ scaling_records = nsopdata['nsr:nsr']['scaling-group-record']
+ for record in scaling_records:
+ if 'instance' in record:
+ instances = record['instance']
+ for inst in instances:
+ table.add_row(
+ [record['scaling-group-name-ref'],
+ inst['instance-id'],
+ inst['op-status'],
+ time.strftime('%Y-%m-%d %H:%M:%S',
+ time.localtime(
+ inst['create-time'])),
+ inst['vnfrs']])
+ table.align = 'l'
+ print(table)
+
+
+@cli.command(name='ns-scale')
+@click.argument('ns_name')
+@click.option('--ns_scale_group', prompt=True)
+@click.option('--index', prompt=True)
+@click.pass_context
+def ns_scale(ctx, ns_name, ns_scale_group, index):
+ '''scales NS
+
+ NS_NAME: name of the NS instance to be scaled
+ '''
+ try:
+ check_client_version(ctx.obj, ctx.command.name, 'v1')
+ ctx.obj.ns.scale(ns_name, ns_scale_group, index)
+ except ClientException as inst:
+ print((inst.message))
+ exit(1)
+
+
+@cli.command(name='config-agent-list')
+@click.pass_context
+def config_agent_list(ctx):
+ '''list config agents'''
+ try:
+ check_client_version(ctx.obj, ctx.command.name, 'v1')
+ except ClientException as inst:
+ print((inst.message))
+ exit(1)
+ table = PrettyTable(['name', 'account-type', 'details'])
+ for account in ctx.obj.vca.list():
+ table.add_row(
+ [account['name'],
+ account['account-type'],
+ account['juju']])
+ table.align = 'l'
+ print(table)
+
+
+@cli.command(name='config-agent-delete')
+@click.argument('name')
+@click.pass_context
+def config_agent_delete(ctx, name):
+ '''deletes a config agent
+
+ NAME: name of the config agent to be deleted
+ '''
+ try:
+ check_client_version(ctx.obj, ctx.command.name, 'v1')
+ ctx.obj.vca.delete(name)
+ except ClientException as inst:
+ print((inst.message))
+ exit(1)
+
+
+@cli.command(name='config-agent-add')
+@click.option('--name',
+ prompt=True)
+@click.option('--account_type',
+ prompt=True)
+@click.option('--server',
+ prompt=True)
+@click.option('--user',
+ prompt=True)
+@click.option('--secret',
+ prompt=True,
+ hide_input=True,
+ confirmation_prompt=True)
+@click.pass_context
+def config_agent_add(ctx, name, account_type, server, user, secret):
+ '''adds a config agent'''
+ try:
+ check_client_version(ctx.obj, ctx.command.name, 'v1')
+ ctx.obj.vca.create(name, account_type, server, user, secret)
+ except ClientException as inst:
+ print((inst.message))
+ exit(1)
+
+@cli.command(name='ro-dump')
+@click.pass_context
+def ro_dump(ctx):
+ '''shows RO agent information'''
+ check_client_version(ctx.obj, ctx.command.name, 'v1')
+ resp = ctx.obj.vim.get_resource_orchestrator()
+ table = PrettyTable(['key', 'attribute'])
+ for k, v in list(resp.items()):
+ table.add_row([k, json.dumps(v, indent=2)])
+ table.align = 'l'
+ print(table)
+
+