import os
import textwrap
import pkg_resources
+import logging
+# 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')
####################
--filter nsd.vendor=<VENDOR>&nsd-ref=<NSD_NAME>
--filter nsd.constituent-vnfd.vnfd-id-ref=<VNFD_NAME>
"""
+ logger.debug("")
if filter:
check_client_version(ctx.obj, '--filter')
resp = ctx.obj.ns.list(filter)
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
"""
+ logger.debug("")
# try:
check_client_version(ctx.obj, ctx.command.name)
resp = ctx.obj.ns.list_op(name)
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
"""
+ logger.debug("")
if kdu:
if literal:
raise ClientException('"--literal" option is incompatible with "--kdu" option')
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)
FILENAME: NSD yaml file or NSpkg tar.gz file
"""
+ logger.debug("")
nsd_create(ctx, filename, overwrite)
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)
FILENAME: VNFD yaml file or VNFpkg tar.gz file
"""
+ logger.debug("")
vnfd_create(ctx, filename, overwrite)
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)
FILENAME: NST yaml file or NSTpkg tar.gz file
"""
+ logger.debug("")
nst_create(ctx, filename, overwrite)
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.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"):
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()
+