import os
import textwrap
import pkg_resources
+import logging
+from datetime import datetime
+# Global variables
+
+CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'], max_content_width=160)
+
def wrap_text(text, width):
wrapper = textwrap.TextWrapper(width=width)
lines = text.splitlines()
:return: -
:raises ClientError: if the specified version does not match the client version
"""
+ logger.debug("")
fullclassname = obj.__module__ + "." + obj.__class__.__name__
message = 'The following commands or options are only supported with the option "--sol005": {}'.format(what)
if version == 'v1':
return
-CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'], max_content_width=160)
-
-@click.group(context_settings=CONTEXT_SETTINGS)
+@click.group(context_settings=dict(help_option_names=['-h', '--help'], max_content_width=160))
@click.option('--hostname',
default="127.0.0.1",
envvar='OSM_HOSTNAME',
envvar='OSM_PROJECT',
help='project (defaults to admin). ' +
'Also can set OSM_PROJECT in environment')
+@click.option('-v', '--verbose', count=True,
+ help='increase verbosity (-v INFO, -vv VERBOSE, -vvv DEBUG)')
#@click.option('--so-port',
# default=None,
# envvar='OSM_SO_PORT',
# help='hostname of RO server. ' +
# 'Also can set OSM_RO_PORT in environment')
@click.pass_context
-def cli_osm(ctx, hostname, user, password, project):
+def cli_osm(ctx, hostname, user, password, project, verbose):
+ global logger
if hostname is None:
print((
"either hostname option or OSM_HOSTNAME " +
"environment variable needs to be specified"))
exit(1)
- kwargs={}
+ kwargs = {'verbose': verbose}
# if so_port is not None:
# kwargs['so_port']=so_port
# if so_project is not None:
if project is not None:
kwargs['project']=project
ctx.obj = client.Client(host=hostname, sol005=sol005, **kwargs)
+ logger = logging.getLogger('osmclient')
####################
@cli_osm.command(name='ns-list', short_help='list all NS instances')
@click.option('--filter', default=None,
help='restricts the list to the NS instances matching the filter.')
+@click.option('--details', is_flag=True,
+ help='get more details of current operation in the NS.')
@click.pass_context
-def ns_list(ctx, filter):
+def ns_list(ctx, filter,details):
"""list all NS instances
\b
--filter nsd.vendor=<VENDOR>&nsd-ref=<NSD_NAME>
--filter nsd.constituent-vnfd.vnfd-id-ref=<VNFD_NAME>
"""
+ def summarize_deployment_status(status_dict):
+ #Nets
+ summary = ""
+ n_nets = 0
+ status_nets = {}
+ net_list = status_dict['nets']
+ for net in net_list:
+ n_nets += 1
+ if net['status'] not in status_nets:
+ status_nets[net['status']] = 1
+ else:
+ status_nets[net['status']] +=1
+ message = "Nets: "
+ for k,v in status_nets.items():
+ message += "{}:{},".format(k,v)
+ message += "TOTAL:{}".format(n_nets)
+ summary += "{}".format(message)
+ #VMs and VNFs
+ n_vms = 0
+ status_vms = {}
+ status_vnfs = {}
+ vnf_list = status_dict['vnfs']
+ for vnf in vnf_list:
+ member_vnf_index = vnf['member_vnf_index']
+ if member_vnf_index not in status_vnfs:
+ status_vnfs[member_vnf_index] = {}
+ for vm in vnf['vms']:
+ n_vms += 1
+ if vm['status'] not in status_vms:
+ status_vms[vm['status']] = 1
+ else:
+ status_vms[vm['status']] +=1
+ if vm['status'] not in status_vnfs[member_vnf_index]:
+ status_vnfs[member_vnf_index][vm['status']] = 1
+ else:
+ status_vnfs[member_vnf_index][vm['status']] += 1
+ message = "VMs: "
+ for k,v in status_vms.items():
+ message += "{}:{},".format(k,v)
+ message += "TOTAL:{}".format(n_vms)
+ summary += "\n{}".format(message)
+ summary += "\nNFs:"
+ for k,v in status_vnfs.items():
+ total = 0
+ message = "\n {} VMs: ".format(k)
+ for k2,v2 in v.items():
+ message += "{}:{},".format(k2,v2)
+ total += v2
+ message += "TOTAL:{}".format(total)
+ summary += message
+ return summary
+
+ def summarize_config_status(ee_list):
+ n_ee = 0
+ status_ee = {}
+ for ee in ee_list:
+ n_ee += 1
+ if ee['elementType'] not in status_ee:
+ status_ee[ee['elementType']] = {}
+ status_ee[ee['elementType']][ee['status']] = 1
+ continue;
+ if ee['status'] in status_ee[ee['elementType']]:
+ status_ee[ee['elementType']][ee['status']] += 1
+ else:
+ status_ee[ee['elementType']][ee['status']] = 1
+ summary = ""
+ for elementType in ["KDU", "VDU", "PDU", "VNF", "NS"]:
+ if elementType in status_ee:
+ message = ""
+ total = 0
+ for k,v in status_ee[elementType].items():
+ message += "{}:{},".format(k,v)
+ total += v
+ message += "TOTAL:{}\n".format(total)
+ summary += "{}: {}".format(elementType, message)
+ summary += "TOTAL Exec. Env.: {}".format(n_ee)
+ return summary
+ logger.debug("")
if filter:
check_client_version(ctx.obj, '--filter')
resp = ctx.obj.ns.list(filter)
else:
resp = ctx.obj.ns.list()
- table = PrettyTable(
+ if details:
+ table = PrettyTable(
['ns instance name',
'id',
- 'operational status',
- 'config status',
- 'detailed status'])
+ 'ns state',
+ 'current operation',
+ 'error details',
+ 'deployment status',
+ 'configuration status'])
+ else:
+ table = PrettyTable(
+ ['ns instance name',
+ 'id',
+ 'ns state',
+ 'current operation',
+ 'error details'])
for ns in resp:
fullclassname = ctx.obj.__module__ + "." + ctx.obj.__class__.__name__
if fullclassname == 'osmclient.sol005.client.Client':
nsr = ns
nsr_name = nsr['name']
nsr_id = nsr['_id']
+ ns_state = nsr['nsState']
+ if details:
+ deployment_status = summarize_deployment_status(nsr['deploymentStatus'])
+ config_status = summarize_config_status(nsr['configurationStatus'])
+ current_operation = "{} ({})".format(nsr['currentOperation'],nsr['currentOperationID'])
+ error_details = "N/A"
+ if ns_state == "BROKEN" or ns_state == "DEGRADED":
+ error_details = "{}\nDetail: {}".format(nsr['errorDescription'],nsr['errorDetail'])
else:
nsopdata = ctx.obj.ns.get_opdata(ns['id'])
nsr = nsopdata['nsr:nsr']
nsr_name = nsr['name-ref']
nsr_id = nsr['ns-instance-config-ref']
- opstatus = nsr['operational-status'] if 'operational-status' in nsr else 'Not found'
- configstatus = nsr['config-status'] if 'config-status' in nsr else 'Not found'
- detailed_status = nsr['detailed-status'] if 'detailed-status' in nsr else 'Not found'
- detailed_status = wrap_text(text=detailed_status,width=50)
- if configstatus == "config_not_needed":
- configstatus = "configured (no charms)"
-
- table.add_row(
- [nsr_name,
- nsr_id,
- opstatus,
- configstatus,
- detailed_status])
+ deployment_status = nsr['operational-status'] if 'operational-status' in nsr else 'Not found'
+ ns_state = deployment_status
+ config_status = nsr['config-status'] if 'config-status' in nsr else 'Not found'
+ current_operation = "Unknown"
+ error_details = nsr['detailed-status'] if 'detailed-status' in nsr else 'Not found'
+ if config_status == "config_not_needed":
+ config_status = "configured (no charms)"
+
+ if details:
+ table.add_row(
+ [nsr_name,
+ nsr_id,
+ ns_state,
+ current_operation,
+ wrap_text(text=error_details,width=40),
+ deployment_status,
+ config_status])
+ else:
+ table.add_row(
+ [nsr_name,
+ nsr_id,
+ ns_state,
+ current_operation,
+ wrap_text(text=error_details,width=40)])
table.align = 'l'
print(table)
-
+ print('To get the history of all operations over a NS, run "osm ns-op-list NS_ID"')
+ print('For more details on the current operation, run "osm ns-op-show OPERATION_ID"')
def nsd_list(ctx, filter):
+ logger.debug("")
if filter:
check_client_version(ctx.obj, '--filter')
resp = ctx.obj.nsd.list(filter)
@click.pass_context
def nsd_list1(ctx, filter):
"""list all NSD/NS pkg in the system"""
+ logger.debug("")
nsd_list(ctx, filter)
@click.pass_context
def nsd_list2(ctx, filter):
"""list all NS packages"""
+ logger.debug("")
nsd_list(ctx, filter)
def vnfd_list(ctx, nf_type, filter):
+ logger.debug("")
if nf_type:
check_client_version(ctx.obj, '--nf_type')
elif filter:
@click.pass_context
def vnfd_list1(ctx, nf_type, filter):
"""list all xNF packages (VNF, HNF, PNF)"""
+ logger.debug("")
vnfd_list(ctx, nf_type, filter)
@click.pass_context
def vnfd_list2(ctx, nf_type, filter):
"""list all xNF packages (VNF, HNF, PNF)"""
+ logger.debug("")
vnfd_list(ctx, nf_type, filter)
@click.pass_context
def nfpkg_list(ctx, nf_type, filter):
"""list all xNF packages (VNF, HNF, PNF)"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
vnfd_list(ctx, nf_type, filter)
@click.pass_context
def vnf_list1(ctx, ns, filter):
"""list all NF instances"""
+ logger.debug("")
vnf_list(ctx, ns, filter)
--filter vdur.ip-address=<IP_ADDRESS>
--filter vnfd-ref=<VNFD_NAME>,vdur.ip-address=<IP_ADDRESS>
"""
+ logger.debug("")
vnf_list(ctx, ns, filter)
NAME: name or ID of the NS instance
"""
+ def formatParams(params):
+ if params['lcmOperationType']=='instantiate':
+ params.pop('nsDescription')
+ params.pop('nsName')
+ params.pop('nsdId')
+ params.pop('nsr_id')
+ elif params['lcmOperationType']=='action':
+ params.pop('primitive')
+ params.pop('lcmOperationType')
+ params.pop('nsInstanceId')
+ return params
+
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.ns.list_op(name)
# print(str(e))
# exit(1)
- table = PrettyTable(['id', 'operation', 'action_name', 'status'])
+ table = PrettyTable(['id', 'operation', 'action_name', 'operation_params', 'status', 'detail'])
#print(yaml.safe_dump(resp))
for op in resp:
action_name = "N/A"
if op['lcmOperationType']=='action':
action_name = op['operationParams']['primitive']
- table.add_row([op['id'], op['lcmOperationType'], action_name,
- op['operationState']])
+ detail = "-"
+ if op['operationState']=='PROCESSING':
+ if op['lcmOperationType']=='instantiate':
+ if op['stage']:
+ detail = op['stage']
+ else:
+ detail = "In queue. Current position: {}".format(op['queuePosition'])
+ elif op['operationState']=='FAILED' or op['operationState']=='FAILED_TEMP':
+ detail = op['errorMessage']
+ table.add_row([op['id'],
+ op['lcmOperationType'],
+ action_name,
+ wrap_text(text=json.dumps(formatParams(op['operationParams']),indent=2),width=70),
+ op['operationState'],
+ wrap_text(text=detail,width=50)])
table.align = 'l'
print(table)
def nsi_list(ctx, filter):
"""list all Network Slice Instances"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.nsi.list(filter)
@click.pass_context
def nsi_list1(ctx, filter):
"""list all Network Slice Instances (NSI)"""
+ logger.debug("")
nsi_list(ctx, filter)
@click.pass_context
def nsi_list2(ctx, filter):
"""list all Network Slice Instances (NSI)"""
+ logger.debug("")
nsi_list(ctx, filter)
def nst_list(ctx, filter):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.nst.list(filter)
@click.pass_context
def nst_list1(ctx, filter):
"""list all Network Slice Templates (NST) in the system"""
+ logger.debug("")
nst_list(ctx, filter)
@click.pass_context
def nst_list2(ctx, filter):
"""list all Network Slice Templates (NST) in the system"""
+ logger.debug("")
nst_list(ctx, filter)
def nsi_op_list(ctx, name):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.nsi.list_op(name)
NAME: name or ID of the Network Slice Instance
"""
+ logger.debug("")
nsi_op_list(ctx, name)
NAME: name or ID of the Network Slice Instance
"""
+ logger.debug("")
nsi_op_list(ctx, name)
@click.pass_context
def pdu_list(ctx, filter):
"""list all Physical Deployment Units (PDU)"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.pdu.list(filter)
####################
def nsd_show(ctx, name, literal):
+ logger.debug("")
# try:
resp = ctx.obj.nsd.get(name)
# resp = ctx.obj.nsd.get_individual(name)
NAME: name or ID of the NSD/NSpkg
"""
+ logger.debug("")
nsd_show(ctx, name, literal)
NAME: name or ID of the NSD/NSpkg
"""
+ logger.debug("")
nsd_show(ctx, name, literal)
def vnfd_show(ctx, name, literal):
+ logger.debug("")
# try:
resp = ctx.obj.vnfd.get(name)
# resp = ctx.obj.vnfd.get_individual(name)
NAME: name or ID of the VNFD/VNFpkg
"""
+ logger.debug("")
vnfd_show(ctx, name, literal)
NAME: name or ID of the VNFD/VNFpkg
"""
+ logger.debug("")
vnfd_show(ctx, name, literal)
NAME: name or ID of the NFpkg
"""
+ logger.debug("")
vnfd_show(ctx, name, literal)
NAME: name or ID of the NS instance
"""
+ logger.debug("")
# try:
ns = ctx.obj.ns.get(name)
# except ClientException as e:
NAME: name or ID of the VNF instance
"""
+ def print_kdu_status(op_info_status):
+ """print KDU status properly formatted
+ """
+ try:
+ op_status = yaml.safe_load(op_info_status)
+ if "namespace" in op_status and "info" in op_status and \
+ "last_deployed" in op_status["info"] and "status" in op_status["info"] and \
+ "code" in op_status["info"]["status"] and "resources" in op_status["info"]["status"] and \
+ "notes" in op_status["info"]["status"] and "seconds" in op_status["info"]["last_deployed"]:
+ last_deployed_time = datetime.fromtimestamp(op_status["info"]["last_deployed"]["seconds"]).strftime("%a %b %d %I:%M:%S %Y")
+ print("LAST DEPLOYED: {}".format(last_deployed_time))
+ print("NAMESPACE: {}".format(op_status["namespace"]))
+ status_code = "UNKNOWN"
+ if op_status["info"]["status"]["code"]==1:
+ status_code = "DEPLOYED"
+ print("STATUS: {}".format(status_code))
+ print()
+ print("RESOURCES:")
+ print(op_status["info"]["status"]["resources"])
+ print("NOTES:")
+ print(op_status["info"]["status"]["notes"])
+ else:
+ print(op_info_status)
+ except Exception:
+ print(op_info_status)
+
+ logger.debug("")
if kdu:
if literal:
raise ClientException('"--literal" option is incompatible with "--kdu" option')
while t<30:
op_info = ctx.obj.ns.get_op(op_id)
if op_info['operationState'] == 'COMPLETED':
- print(op_info['detailed-status'])
+ print_kdu_status(op_info['detailed-status'])
return
time.sleep(5)
t += 5
ID: operation identifier
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
op_info = ctx.obj.ns.get_op(id)
def nst_show(ctx, name, literal):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.nst.get(name)
NAME: name or ID of the NST
"""
+ logger.debug("")
nst_show(ctx, name, literal)
NAME: name or ID of the NST
"""
+ logger.debug("")
nst_show(ctx, name, literal)
def nsi_show(ctx, name, literal, filter):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
nsi = ctx.obj.nsi.get(name)
NAME: name or ID of the Network Slice Instance
"""
+ logger.debug("")
nsi_show(ctx, name, literal, filter)
NAME: name or ID of the Network Slice Instance
"""
+ logger.debug("")
nsi_show(ctx, name, literal, filter)
def nsi_op_show(ctx, id, filter):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
op_info = ctx.obj.nsi.get_op(id)
ID: operation identifier
"""
+ logger.debug("")
nsi_op_show(ctx, id, filter)
ID: operation identifier
"""
+ logger.debug("")
nsi_op_show(ctx, id, filter)
NAME: name or ID of the PDU
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
pdu = ctx.obj.pdu.get(name)
####################
def nsd_create(ctx, filename, overwrite):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.nsd.create(filename, overwrite)
@cli_osm.command(name='nsd-create', short_help='creates a new NSD/NSpkg')
@click.argument('filename')
-@click.option('--overwrite', 'overwrite', default=None, hidden=True,
+@click.option('--overwrite', 'overwrite', default=None, # hidden=True,
help='Deprecated. Use override')
@click.option('--override', 'overwrite', default=None,
help='overrides fields in descriptor, format: '
FILENAME: NSD yaml file or NSpkg tar.gz file
"""
+ logger.debug("")
nsd_create(ctx, filename, overwrite)
@cli_osm.command(name='nspkg-create', short_help='creates a new NSD/NSpkg')
@click.argument('filename')
-@click.option('--overwrite', 'overwrite', default=None, hidden=True,
+@click.option('--overwrite', 'overwrite', default=None, # hidden=True,
help='Deprecated. Use override')
@click.option('--override', 'overwrite', default=None,
help='overrides fields in descriptor, format: '
FILENAME: NSD yaml file or NSpkg tar.gz file
"""
+ logger.debug("")
nsd_create(ctx, filename, overwrite)
def vnfd_create(ctx, filename, overwrite):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.vnfd.create(filename, overwrite)
FILENAME: VNFD yaml file or VNFpkg tar.gz file
"""
+ logger.debug("")
vnfd_create(ctx, filename, overwrite)
@cli_osm.command(name='vnfpkg-create', short_help='creates a new VNFD/VNFpkg')
@click.argument('filename')
-@click.option('--overwrite', 'overwrite', default=None, hidden=True,
+@click.option('--overwrite', 'overwrite', default=None, # hidden=True,
help='Deprecated. Use override')
@click.option('--override', 'overwrite', default=None,
help='overrides fields in descriptor, format: '
FILENAME: VNFD yaml file or VNFpkg tar.gz file
"""
+ logger.debug("")
vnfd_create(ctx, filename, overwrite)
@cli_osm.command(name='nfpkg-create', short_help='creates a new NFpkg')
@click.argument('filename')
-@click.option('--overwrite', 'overwrite', default=None, hidden=True,
+@click.option('--overwrite', 'overwrite', default=None, # hidden=True,
help='Deprecated. Use override')
@click.option('--override', 'overwrite', default=None,
help='overrides fields in descriptor, format: '
FILENAME: NF Descriptor yaml file or NFpkg tar.gz file
"""
+ logger.debug("")
vnfd_create(ctx, filename, overwrite)
config_file,
wait):
"""creates a new NS instance"""
+ logger.debug("")
# try:
if config_file:
check_client_version(ctx.obj, '--config_file')
def nst_create(ctx, filename, overwrite):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.nst.create(filename, overwrite)
@cli_osm.command(name='nst-create', short_help='creates a new Network Slice Template (NST)')
@click.argument('filename')
-@click.option('--overwrite', 'overwrite', default=None, hidden=True,
+@click.option('--overwrite', 'overwrite', default=None, # hidden=True,
help='Deprecated. Use override')
@click.option('--override', 'overwrite', default=None,
help='overrides fields in descriptor, format: '
FILENAME: NST yaml file or NSTpkg tar.gz file
"""
+ logger.debug("")
nst_create(ctx, filename, overwrite)
@cli_osm.command(name='netslice-template-create', short_help='creates a new Network Slice Template (NST)')
@click.argument('filename')
-@click.option('--overwrite', 'overwrite', default=None, hidden=True,
+@click.option('--overwrite', 'overwrite', default=None, # hidden=True,
help='Deprecated. Use override')
@click.option('--override', 'overwrite', default=None,
help='overrides fields in descriptor, format: '
FILENAME: NST yaml file or NSTpkg tar.gz file
"""
+ logger.debug("")
nst_create(ctx, filename, overwrite)
def nsi_create(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_file, wait):
"""creates a new Network Slice Instance (NSI)"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
if config_file:
@click.pass_context
def nsi_create1(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_file, wait):
"""creates a new Network Slice Instance (NSI)"""
+ logger.debug("")
nsi_create(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_file, wait=wait)
@click.pass_context
def nsi_create2(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_file, wait):
"""creates a new Network Slice Instance (NSI)"""
+ logger.debug("")
nsi_create(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_file, wait=wait)
@click.pass_context
def pdu_create(ctx, name, pdu_type, interface, description, vim_account, descriptor_file):
"""creates a new Physical Deployment Unit (PDU)"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
pdu = {}
# print(str(e))
# exit(1)
+
####################
# UPDATE operations
####################
def nsd_update(ctx, name, content):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.nsd.update(name, content)
NAME: name or ID of the NSD/NSpkg
"""
+ logger.debug("")
nsd_update(ctx, name, content)
NAME: name or ID of the NSD/NSpkg
"""
+ logger.debug("")
nsd_update(ctx, name, content)
def vnfd_update(ctx, name, content):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.vnfd.update(name, content)
NAME: name or ID of the VNFD/VNFpkg
"""
+ logger.debug("")
vnfd_update(ctx, name, content)
NAME: VNFD yaml file or VNFpkg tar.gz file
"""
+ logger.debug("")
vnfd_update(ctx, name, content)
NAME: NF Descriptor yaml file or NFpkg tar.gz file
"""
+ logger.debug("")
vnfd_update(ctx, name, content)
def nst_update(ctx, name, content):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.nst.update(name, content)
NAME: name or ID of the NSD/NSpkg
"""
+ logger.debug("")
nst_update(ctx, name, content)
NAME: name or ID of the NSD/NSpkg
"""
+ logger.debug("")
nst_update(ctx, name, content)
####################
def nsd_delete(ctx, name, force):
+ logger.debug("")
# try:
if not force:
ctx.obj.nsd.delete(name)
NAME: name or ID of the NSD/NSpkg to be deleted
"""
+ logger.debug("")
nsd_delete(ctx, name, force)
NAME: name or ID of the NSD/NSpkg to be deleted
"""
+ logger.debug("")
nsd_delete(ctx, name, force)
def vnfd_delete(ctx, name, force):
+ logger.debug("")
# try:
if not force:
ctx.obj.vnfd.delete(name)
NAME: name or ID of the VNFD/VNFpkg to be deleted
"""
+ logger.debug("")
vnfd_delete(ctx, name, force)
NAME: name or ID of the VNFD/VNFpkg to be deleted
"""
+ logger.debug("")
vnfd_delete(ctx, name, force)
NAME: name or ID of the NFpkg to be deleted
"""
+ logger.debug("")
vnfd_delete(ctx, name, force)
NAME: name or ID of the NS instance to be deleted
"""
+ logger.debug("")
# try:
if not force:
ctx.obj.ns.delete(name, wait=wait)
def nst_delete(ctx, name, force):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.nst.delete(name, force)
NAME: name or ID of the NST/NSTpkg to be deleted
"""
+ logger.debug("")
nst_delete(ctx, name, force)
NAME: name or ID of the NST/NSTpkg to be deleted
"""
+ logger.debug("")
nst_delete(ctx, name, force)
def nsi_delete(ctx, name, force, wait):
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.nsi.delete(name, force, wait=wait)
NAME: name or ID of the Network Slice instance to be deleted
"""
+ logger.debug("")
nsi_delete(ctx, name, force, wait=wait)
NAME: name or ID of the Network Slice instance to be deleted
"""
+ logger.debug("")
nsi_delete(ctx, name, force, wait=wait)
NAME: name or ID of the PDU to be deleted
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.pdu.delete(name, force)
sdn_port_mapping,
wait):
"""creates a new VIM account"""
+ logger.debug("")
# try:
if sdn_controller:
check_client_version(ctx.obj, '--sdn_controller')
NAME: name or ID of the VIM account
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
vim = {}
NAME: name or ID of the VIM account to be deleted
"""
+ logger.debug("")
# try:
if not force:
ctx.obj.vim.delete(name, wait=wait)
@click.pass_context
def vim_list(ctx, filter):
"""list all VIM accounts"""
+ logger.debug("")
if filter:
check_client_version(ctx.obj, '--filter')
# if ro_update:
NAME: name or ID of the VIM account
"""
+ logger.debug("")
# try:
resp = ctx.obj.vim.get(name)
if 'vim_password' in resp:
wim_port_mapping,
wait):
"""creates a new WIM account"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
# if sdn_controller:
NAME: name or ID of the WIM account
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
wim = {}
NAME: name or ID of the WIM account to be deleted
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.wim.delete(name, force, wait=wait)
@click.pass_context
def wim_list(ctx, filter):
"""list all WIM accounts"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.wim.list(filter)
NAME: name or ID of the WIM account
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.wim.get(name)
@click.option('--type',
prompt=True,
help='SDN controller type')
-@click.option('--sdn_controller_version', hidden=True,
+@click.option('--sdn_controller_version', # hidden=True,
help='Deprecated. Use --config {version: sdn_controller_version}')
@click.option('--url',
help='URL in format http[s]://HOST:IP/')
-@click.option('--ip_address', hidden=True,
+@click.option('--ip_address', # hidden=True,
help='Deprecated. Use --url')
-@click.option('--port', hidden=True,
+@click.option('--port', # hidden=True,
help='Deprecated. Use --url')
-@click.option('--switch_dpid', hidden=True,
+@click.option('--switch_dpid', # hidden=True,
help='Deprecated. Use --config {dpid: DPID}')
@click.option('--config',
help='Extra information for SDN in yaml format, as {dpid: (Openflow Datapath ID), version: version}')
@click.pass_context
def sdnc_create(ctx, **kwargs):
"""creates a new SDN controller"""
+ logger.debug("")
sdncontroller = {x: kwargs[x] for x in kwargs if kwargs[x] and
x not in ("wait", "ip_address", "port", "switch_dpid")}
if kwargs.get("port"):
'{dpid: (Openflow Datapath ID), version: version}')
@click.option('--user', help='SDN controller username')
@click.option('--password', help='SDN controller password')
-@click.option('--ip_address', hidden=True, help='Deprecated. Use --url')
-@click.option('--port', hidden=True, help='Deprecated. Use --url')
-@click.option('--switch_dpid', hidden=True, help='Deprecated. Use --config {switch_dpid: DPID}')
-@click.option('--sdn_controller_version', hidden=True, help='Deprecated. Use --config {version: VERSION}')
+@click.option('--ip_address', help='Deprecated. Use --url') # hidden=True
+@click.option('--port', help='Deprecated. Use --url') # hidden=True
+@click.option('--switch_dpid', help='Deprecated. Use --config {switch_dpid: DPID}') # hidden=True
+@click.option('--sdn_controller_version', help='Deprecated. Use --config {version: VERSION}') # hidden=True
@click.option('--wait', required=False, default=False, is_flag=True,
help='do not return the control immediately, but keep it until the operation is completed, or timeout')
@click.pass_context
NAME: name or ID of the SDN controller
"""
+ logger.debug("")
sdncontroller = {x: kwargs[x] for x in kwargs if kwargs[x] and
x not in ("wait", "ip_address", "port", "switch_dpid", "new_name")}
if kwargs.get("newname"):
NAME: name or ID of the SDN controller to be deleted
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.sdnc.delete(name, force, wait=wait)
@click.pass_context
def sdnc_list(ctx, filter):
"""list all SDN controllers"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.sdnc.list(filter)
NAME: name or ID of the SDN controller
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.sdnc.get(name)
NAME: name of the project
"""
+ logger.debug("")
project = {}
project['name'] = name
# try:
NAME: name or ID of the project to be deleted
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.project.delete(name)
@click.pass_context
def project_list(ctx, filter):
"""list all projects"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.project.list(filter)
NAME: name or ID of the project
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.project.get(name)
:param name: new name for the project
:return:
"""
-
+ logger.debug("")
project_changes = {}
project_changes['name'] = name
PROJECTS: projects assigned to user (internal only)
PROJECT_ROLE_MAPPING: roles in projects assigned to user (keystone)
"""
+ logger.debug("")
user = {}
user['username'] = username
user['password'] = password
ADD_PROJECT_ROLE: adding mappings for project/role(s)
REMOVE_PROJECT_ROLE: removing mappings for project/role(s)
"""
+ logger.debug("")
user = {}
user['password'] = password
user['username'] = set_username
\b
NAME: name or ID of the user to be deleted
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.user.delete(name)
NAME: name or ID of the user
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.user.get(name)
"""creates a new alarm for a NS instance"""
# TODO: Check how to validate threshold_value.
# Should it be an integer (1-100), percentage, or decimal (0.01-1.00)?
+ logger.debug("")
# try:
ns_instance = ctx.obj.ns.get(ns)
alarm = {}
"""exports a metric to the internal OSM bus, which can be read by other apps"""
# TODO: Check how to validate interval.
# Should it be an integer (seconds), or should a suffix (s,m,h,d,w) also be permitted?
+ logger.debug("")
# try:
ns_instance = ctx.obj.ns.get(ns)
metric_data = {}
FILENAME: VNF or NS package file (tar.gz)
"""
+ logger.debug("")
# try:
ctx.obj.package.upload(filename)
fullclassname = ctx.obj.__module__ + "." + ctx.obj.__class__.__name__
NS_NAME: name or ID of the NS instance
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
op_data = {}
NS_NAME: name or ID of the NS instance.
VNF_NAME: member-vnf-index in the NS to be scaled.
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
if not scale_in and not scale_out:
NAME: Name or ID of the role.
DEFINITION: Definition of grant/denial of access to resources.
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.role.create(name, permissions)
ADD: Grant/denial of access to resource to add.
REMOVE: Grant/denial of access to resource to remove.
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.role.update(name, set_name, None, add, remove)
\b
NAME: Name or ID of the role.
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
ctx.obj.role.delete(name)
"""
List all roles.
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.role.list(filter)
\b
NAME: Name or ID of the role.
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.role.get(name)
if __name__ == '__main__':
cli()
+