fixes for ns-alarm-create and ns-metric-export, disabled ns-alarm-delete
[osm/osmclient.git] / osmclient / scripts / osm.py
index 23f258e..1fc824e 100755 (executable)
@@ -926,6 +926,286 @@ def vim_show(ctx, name):
     print(table)
 
 
+####################
+# SDN controller operations
+####################
+
+@cli.command(name='sdnc-create')
+@click.option('--name',
+              prompt=True,
+              help='Name to create sdn controller')
+@click.option('--type',
+              prompt=True,
+              help='SDN controller type')
+@click.option('--sdn_controller_version',
+              help='SDN controller username')
+@click.option('--ip_address',
+              prompt=True,
+              help='SDN controller IP address')
+@click.option('--port',
+              prompt=True,
+              help='SDN controller port')
+@click.option('--switch_dpid',
+              prompt=True,
+              help='Switch DPID (Openflow Datapath ID)')
+@click.option('--user',
+              help='SDN controller username')
+@click.option('--password',
+              hide_input=True,
+              confirmation_prompt=True,
+              help='SDN controller password')
+#@click.option('--description',
+#              default='no description',
+#              help='human readable description')
+@click.pass_context
+def sdnc_create(ctx,
+               name,
+               type,
+               sdn_controller_version,
+               ip_address,
+               port,
+               switch_dpid,
+               user,
+               password):
+    '''creates a new SDN controller
+    '''
+    sdncontroller = {}
+    sdncontroller['name'] = name
+    sdncontroller['type'] = type
+    sdncontroller['ip'] = ip_address
+    sdncontroller['port'] = int(port)
+    sdncontroller['dpid'] = switch_dpid
+    if sdn_controller_version:
+        sdncontroller['version'] = sdn_controller_version
+    if user:
+        sdncontroller['user'] = user
+    if password:
+        sdncontroller['password'] = password
+#    sdncontroller['description'] = description
+    try:
+        check_client_version(ctx.obj, ctx.command.name)
+        ctx.obj.sdnc.create(name, sdncontroller)
+    except ClientException as inst:
+        print(inst.message)
+
+
+@cli.command(name='sdnc-update', short_help='updates an SDN controller')
+@click.argument('name')
+@click.option('--newname', help='New name for the SDN controller')
+@click.option('--type', help='SDN controller type')
+@click.option('--sdn_controller_version', help='SDN controller username')
+@click.option('--ip_address', help='SDN controller IP address')
+@click.option('--port', help='SDN controller port')
+@click.option('--switch_dpid', help='Switch DPID (Openflow Datapath ID)')
+@click.option('--user', help='SDN controller username')
+@click.option('--password', help='SDN controller password')
+#@click.option('--description',  default=None, help='human readable description')
+@click.pass_context
+def sdnc_update(ctx,
+               name,
+               newname,
+               type,
+               sdn_controller_version,
+               ip_address,
+               port,
+               switch_dpid,
+               user,
+               password):
+    '''updates an SDN controller
+
+    NAME: name or ID of the SDN controller
+    '''
+    sdncontroller = {}
+    if newname: sdncontroller['name'] = newname
+    if type: sdncontroller['type'] = type
+    if ip_address: sdncontroller['ip'] = ip_address
+    if port: sdncontroller['port'] = int(port)
+    if switch_dpid: sdncontroller['dpid'] = switch_dpid
+#    sdncontroller['description'] = description
+    if sdn_controller_version is not None:
+        if sdn_controller_version=="":
+            sdncontroller['version'] = None
+        else:
+            sdncontroller['version'] = sdn_controller_version
+    if user is not None:
+        if user=="":
+            sdncontroller['user'] = None
+        else:
+            sdncontroller['user'] = user
+    if password is not None:
+        if password=="":
+            sdncontroller['password'] = None
+        else:
+            sdncontroller['password'] = user
+    try:
+        check_client_version(ctx.obj, ctx.command.name)
+        ctx.obj.sdnc.update(name, sdncontroller)
+    except ClientException as inst:
+        print(inst.message)
+        exit(1)
+
+
+@cli.command(name='sdnc-delete')
+@click.argument('name')
+@click.pass_context
+def sdnc_delete(ctx, name):
+    '''deletes an SDN controller
+
+    NAME: name or ID of the SDN controller to be deleted
+    '''
+    try:
+        check_client_version(ctx.obj, ctx.command.name)
+        ctx.obj.sdnc.delete(name)
+    except ClientException as inst:
+        print(inst.message)
+        exit(1)
+
+
+@cli.command(name='sdnc-list')
+@click.option('--filter', default=None,
+              help='restricts the list to the SDN controllers matching the filter')
+@click.pass_context
+def sdnc_list(ctx, filter):
+    '''list all SDN controllers'''
+    try:
+        check_client_version(ctx.obj, ctx.command.name)
+        resp = ctx.obj.sdnc.list(filter)
+    except ClientException as inst:
+        print(inst.message)
+        exit(1)
+    table = PrettyTable(['name', 'id'])
+    for sdnc in resp:
+        table.add_row([sdnc['name'], sdnc['_id']])
+    table.align = 'l'
+    print(table)
+
+
+@cli.command(name='sdnc-show')
+@click.argument('name')
+@click.pass_context
+def sdnc_show(ctx, name):
+    '''shows the details of an SDN controller
+
+    NAME: name or ID of the SDN controller
+    '''
+    try:
+        check_client_version(ctx.obj, ctx.command.name)
+        resp = ctx.obj.sdnc.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)
+
+
+####################
+# 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
 ####################
@@ -952,8 +1232,16 @@ def upload_package(ctx, filename):
 @click.argument('ns_name')
 @click.pass_context
 def show_ns_scaling(ctx, ns_name):
-    check_client_version(ctx.obj, ctx.command.name, 'v1')
-    resp = ctx.obj.ns.list()
+    '''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',
@@ -988,14 +1276,27 @@ def show_ns_scaling(ctx, ns_name):
 @click.option('--index', prompt=True)
 @click.pass_context
 def ns_scale(ctx, ns_name, ns_scale_group, index):
-    check_client_version(ctx.obj, ctx.command.name, 'v1')
-    ctx.obj.ns.scale(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):
-    check_client_version(ctx.obj, ctx.command.name, 'v1')
+    '''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(
@@ -1010,6 +1311,10 @@ def config_agent_list(ctx):
 @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)
@@ -1033,6 +1338,7 @@ def config_agent_delete(ctx, name):
               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)
@@ -1043,6 +1349,7 @@ def config_agent_add(ctx, name, account_type, server, user, secret):
 @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'])
@@ -1073,6 +1380,7 @@ def vcs_list(ctx):
 def ns_action(ctx,
               ns_name,
               vnf_name,
+              action_name,
               params):
     '''executes an action/primitive over a NS instance