'''
openmano client used to interact with openmano-server (openmanod)
'''
-__author__="Alfonso Tierno, Gerardo Garcia"
-__date__ ="$09-oct-2014 09:09:48$"
-__version__="0.4.11-r517"
-version_date="Jan 2017"
+__author__ = "Alfonso Tierno, Gerardo Garcia, Pablo Montes"
+__date__ = "$09-oct-2014 09:09:48$"
+__version__ = "0.4.14-r521"
+version_date = "May 2017"
from argcomplete.completers import FilesCompleter
import os
return result
if mano_response.status_code == 200:
+ uuid = None
for content in content_list:
if "uuid" in content:
uuid = content['uuid']
if verbose_level >=1:
if content.get('created_at'):
myoutput += " " + content['created_at'].ljust(20)
+ if content.get('sdn_attached_ports'):
+ #myoutput += " " + str(content['sdn_attached_ports']).ljust(20)
+ myoutput += "\nsdn_attached_ports:\n" + yaml.safe_dump(content['sdn_attached_ports'], indent=4, default_flow_style=False)
if verbose_level >=2:
new_line='\n'
if content.get('type'):
def scenario_verify(args):
#print "scenario-verify",args
+ tenant = _get_tenant()
headers_req = {'content-type': 'application/json'}
action = {}
action["verify"] = {}
payload_req = json.dumps(action, indent=4)
#print payload_req
- URLrequest = "http://%s:%s/openmano/%s/scenarios/%s/action" %(mano_host, mano_port, mano_tenant, args.scenario)
+ URLrequest = "http://%s:%s/openmano/%s/scenarios/%s/action" %(mano_host, mano_port, tenant, args.scenario)
logger.debug("openmano request: %s", payload_req)
mano_response = requests.post(URLrequest, headers = headers_req, data=payload_req)
logger.debug("openmano response: %s", mano_response.text )
print "Try to specify a different name with --vim-tenant-name"
return result
+
+def datacenter_edit_vim_tenant(args):
+ tenant = _get_tenant()
+ datacenter = _get_datacenter(args.name)
+ headers_req = {'Accept': 'application/json', 'content-type': 'application/json'}
+
+ if not (args.vim_tenant_id or args.vim_tenant_name or args.user or args.password or args.config):
+ raise OpenmanoCLIError("Error. At least one parameter must be updated.")
+
+ datacenter_dict = {}
+ if args.vim_tenant_id != None:
+ datacenter_dict['vim_tenant'] = args.vim_tenant_id
+ if args.vim_tenant_name != None:
+ datacenter_dict['vim_tenant_name'] = args.vim_tenant_name
+ if args.user != None:
+ datacenter_dict['vim_username'] = args.user
+ if args.password != None:
+ datacenter_dict['vim_password'] = args.password
+ if args.config != None:
+ datacenter_dict["config"] = _load_file_or_yaml(args.config)
+ payload_req = json.dumps({"datacenter": datacenter_dict})
+
+ # print payload_req
+
+ URLrequest = "http://%s:%s/openmano/%s/datacenters/%s" % (mano_host, mano_port, tenant, datacenter)
+ logger.debug("openmano request: %s", payload_req)
+ mano_response = requests.put(URLrequest, headers=headers_req, data=payload_req)
+ logger.debug("openmano response: %s", mano_response.text)
+ result = _print_verbose(mano_response, args.verbose)
+
+ return result
+
def datacenter_detach(args):
if args.all:
tenant = "any"
if args.url!=None:
datacenter_dict["vim_url_admin"] = args.url_admin
if args.config!=None:
- datacenter_dict["config"] = _load_file_or_yaml(args.config)
+ datacenter_dict["config"] = _load_file_or_yaml(args.config)
+ if args.sdn_controller!=None:
+ tenant = _get_tenant()
+ sdn_controller = _get_item_uuid("sdn_controllers", args.sdn_controller, tenant)
+ if not 'config' in datacenter_dict:
+ datacenter_dict['config'] = {}
+ datacenter_dict['config']['sdn-controller'] = sdn_controller
payload_req = json.dumps( {"datacenter": datacenter_dict })
#print payload_req
args.verbose += 1
return _print_verbose(mano_response, args.verbose)
+def datacenter_sdn_port_mapping_set(args):
+ tenant = _get_tenant()
+ datacenter = _get_datacenter(args.name, tenant)
+ headers_req = {'Accept': 'application/json', 'content-type': 'application/json'}
+
+ if not args.file:
+ raise OpenmanoCLIError(
+ "No yaml/json has been provided specifying the SDN port mapping")
+
+ port_mapping = yaml.load(datacenter_sdn_port_mapping_list(args))
+ if 'error' in port_mapping:
+ raise OpenmanoCLIError("openmano client error: {}".format(port_mapping['error']['description']))
+ if len(port_mapping["sdn_port_mapping"]["ports_mapping"]) > 0:
+ if not args.force:
+ r = raw_input("Datacenter %s already contains a port mapping. Overwrite? (y/N)? " % (datacenter))
+ if not (len(r) > 0 and r[0].lower() == "y"):
+ return 0
+ args.force = True
+ print datacenter_sdn_port_mapping_clear(args)
+
+ sdn_port_mapping = _load_file_or_yaml(args.file)
+ payload_req = json.dumps({"sdn_port_mapping": sdn_port_mapping})
+
+ URLrequest = "http://%s:%s/openmano/%s/datacenters/%s/sdn_mapping" % (mano_host, mano_port, tenant, datacenter)
+ logger.debug("openmano request: %s", payload_req)
+ mano_response = requests.post(URLrequest, headers=headers_req, data=payload_req)
+ logger.debug("openmano response: %s", mano_response.text)
+
+ if mano_response.status_code == 200:
+ return yaml.safe_dump(mano_response.json())
+ else:
+ return mano_response.content
+
+def datacenter_sdn_port_mapping_list(args):
+ tenant = _get_tenant()
+ datacenter = _get_datacenter(args.name, tenant)
+
+ URLrequest = "http://%s:%s/openmano/%s/datacenters/%s/sdn_mapping" % (mano_host, mano_port, tenant, datacenter)
+ mano_response = requests.get(URLrequest)
+ logger.debug("openmano response: %s", mano_response.text)
+
+ if mano_response.status_code != 200:
+ return mano_response.content
+
+ return yaml.safe_dump(mano_response.json())
+
+def datacenter_sdn_port_mapping_clear(args):
+ tenant = _get_tenant()
+ datacenter = _get_datacenter(args.name, tenant)
+
+ if not args.force:
+ r = raw_input("Clean SDN port mapping for datacenter %s (y/N)? " %(datacenter))
+ if not (len(r)>0 and r[0].lower()=="y"):
+ return 0
+
+ URLrequest = "http://%s:%s/openmano/%s/datacenters/%s/sdn_mapping" % (mano_host, mano_port, tenant, datacenter)
+ mano_response = requests.delete(URLrequest)
+ logger.debug("openmano response: %s", mano_response.text)
+
+ if mano_response.status_code != 200:
+ if "No port mapping for datacenter" in mano_response.content:
+ return "No port mapping for datacenter " + datacenter + " has been found"
+ return mano_response.content
+
+ return yaml.safe_dump(mano_response.json())
+
+def sdn_controller_create(args):
+ tenant = _get_tenant()
+ headers_req = {'Accept': 'application/json', 'content-type': 'application/json'}
+
+ if not (args.ip and args.port and args.dpid and args.type):
+ raise OpenmanoCLIError("The following arguments are required: ip, port, dpid, type")
+
+ controller_dict = {}
+ controller_dict['name'] = args.name
+ controller_dict['ip'] = args.ip
+ controller_dict['port'] = int(args.port)
+ controller_dict['dpid'] = args.dpid
+ controller_dict['type'] = args.type
+ if args.description != None:
+ controller_dict['description'] = args.description
+ if args.user != None:
+ controller_dict['user'] = args.user
+ if args.password != None:
+ controller_dict['password'] = args.password
+
+ payload_req = json.dumps({"sdn_controller": controller_dict})
+
+ # print payload_req
+
+ URLrequest = "http://%s:%s/openmano/%s/sdn_controllers" % (mano_host, mano_port, tenant)
+ logger.debug("openmano request: %s", payload_req)
+ mano_response = requests.post(URLrequest, headers=headers_req, data=payload_req)
+ logger.debug("openmano response: %s", mano_response.text)
+ result = _print_verbose(mano_response, args.verbose)
+
+ return result
+
+def sdn_controller_edit(args):
+ tenant = _get_tenant()
+ controller_uuid = _get_item_uuid("sdn_controllers", args.name, tenant)
+ headers_req = {'Accept': 'application/json', 'content-type': 'application/json'}
+
+ if not (args.new_name or args.ip or args.port or args.dpid or args.type):
+ raise OpenmanoCLIError("At least one parameter must be editd")
+
+ if not args.force:
+ r = raw_input("Update SDN controller %s (y/N)? " %(args.name))
+ if not (len(r)>0 and r[0].lower()=="y"):
+ return 0
+
+ controller_dict = {}
+ if args.new_name != None:
+ controller_dict['name'] = args.new_name
+ if args.ip != None:
+ controller_dict['ip'] = args.ip
+ if args.port != None:
+ controller_dict['port'] = int(args.port)
+ if args.dpid != None:
+ controller_dict['dpid'] = args.dpid
+ if args.type != None:
+ controller_dict['type'] = args.type
+ if args.description != None:
+ controller_dict['description'] = args.description
+ if args.user != None:
+ controller_dict['user'] = args.user
+ if args.password != None:
+ controller_dict['password'] = args.password
+
+ payload_req = json.dumps({"sdn_controller": controller_dict})
+
+ # print payload_req
+
+ URLrequest = "http://%s:%s/openmano/%s/sdn_controllers/%s" % (mano_host, mano_port, tenant, controller_uuid)
+ logger.debug("openmano request: %s", payload_req)
+ mano_response = requests.put(URLrequest, headers=headers_req, data=payload_req)
+ logger.debug("openmano response: %s", mano_response.text)
+ result = _print_verbose(mano_response, args.verbose)
+
+ return result
+
+def sdn_controller_list(args):
+ tenant = _get_tenant()
+ headers_req = {'Accept': 'application/json', 'content-type': 'application/json'}
+
+ if args.name:
+ toshow = _get_item_uuid("sdn_controllers", args.name, tenant)
+ URLrequest = "http://%s:%s/openmano/%s/sdn_controllers/%s" %(mano_host, mano_port, tenant, toshow)
+ else:
+ URLrequest = "http://%s:%s/openmano/%s/sdn_controllers" %(mano_host, mano_port, tenant)
+ #print URLrequest
+ mano_response = requests.get(URLrequest)
+ logger.debug("openmano response: %s", mano_response.text )
+ if args.verbose==None:
+ args.verbose=0
+ if args.name!=None:
+ args.verbose += 1
+
+ result = json.dumps(mano_response.json(), indent=4)
+ return result
+
+def sdn_controller_delete(args):
+ tenant = _get_tenant()
+ controller_uuid = _get_item_uuid("sdn_controllers", args.name, tenant)
+
+ if not args.force:
+ r = raw_input("Delete SDN controller %s (y/N)? " % (args.name))
+ if not (len(r) > 0 and r[0].lower() == "y"):
+ return 0
+
+ URLrequest = "http://%s:%s/openmano/%s/sdn_controllers/%s" % (mano_host, mano_port, tenant, controller_uuid)
+ mano_response = requests.delete(URLrequest)
+ logger.debug("openmano response: %s", mano_response.text)
+ result = _print_verbose(mano_response, args.verbose)
+
+ return result
+
def vim_action(args):
#print "datacenter-net-action",args
tenant = _get_tenant()
create_dict[args.item]['name'] = args.name
#if args.description:
# create_dict[args.item]['description'] = args.description
- if args.item=="vim-net":
+ if args.item=="network":
if args.bind_net:
create_dict[args.item]['bind_net'] = args.bind_net
- if args.bind_type:
- create_dict[args.item]['bind_type'] = args.bind_type
+ if args.type:
+ create_dict[args.item]['type'] = args.type
if args.shared:
create_dict[args.item]['shared'] = args.shared
if "name" not in create_dict[args.item]:
return
payload_req = yaml.safe_dump(create_dict, explicit_start=True, indent=4, default_flow_style=False, tags=False, encoding='utf-8', allow_unicode=True)
logger.debug("openmano request: %s", payload_req)
- URLrequest = "http://%s:%s/openmano/%s/vim/%s/%ss" %(mano_host, mano_port, mano_tenant, datacenter, args.item)
+ URLrequest = "http://%s:%s/openmano/%s/vim/%s/%ss" %(mano_host, mano_port, tenant, datacenter, args.item)
mano_response = requests.post(URLrequest, headers = headers_req, data=payload_req)
logger.debug("openmano response: %s", mano_response.text )
if args.verbose==None:
args.verbose=0
return _print_verbose(mano_response, args.verbose)
+def _get_items(item, item_name_id=None, datacenter=None, tenant=None):
+ URLrequest = "http://%s:%s/openmano" %(mano_host, mano_port)
+ if tenant:
+ URLrequest += "/" + tenant
+ if datacenter:
+ URLrequest += "/vim/" + datacenter
+ if item:
+ URLrequest += "/" + item +"s"
+ if item_name_id:
+ URLrequest += "/" + item_name_id
+ mano_response = requests.get(URLrequest)
+ logger.debug("openmano response: %s", mano_response.text )
+
+ return mano_response
+
+def vim_net_sdn_attach(args):
+ #Verify the network exists in the vim
+ tenant = _get_tenant()
+ datacenter = _get_datacenter(args.datacenter, tenant)
+ result = _get_items('network', item_name_id=args.vim_net, datacenter=datacenter, tenant=tenant)
+ content = yaml.load(result.content)
+ if 'networks' in content:
+ raise OpenmanoCLIError('More than one network in the vim named ' + args.vim_net + '. Use uuid instead')
+ if 'error' in content:
+ raise OpenmanoCLIError(yaml.safe_dump(content))
+ network_uuid = content['network']['id']
+
+ #Make call to attach the dataplane port to the SND network associated to the vim network
+ headers_req = {'content-type': 'application/yaml'}
+ payload_req = {'port': args.port}
+ if args.vlan:
+ payload_req['vlan'] = int(args.vlan)
+ if args.mac:
+ payload_req['mac'] = args.mac
+
+ URLrequest = "http://%s:%s/openmano/%s/vim/%s/network/%s/attach" % (mano_host, mano_port, tenant, datacenter, network_uuid)
+ logger.debug("openmano request: %s", payload_req)
+ mano_response = requests.post(URLrequest, headers=headers_req, data=json.dumps(payload_req))
+ logger.debug("openmano response: %s", mano_response.text)
+ result = _print_verbose(mano_response, args.verbose)
+
+ return
+
+
+def vim_net_sdn_detach(args):
+ if not args.all and not args.id:
+ print "--all or --id must be used"
+ return 1
+
+ # Verify the network exists in the vim
+ tenant = _get_tenant()
+ datacenter = _get_datacenter(args.datacenter, tenant)
+ result = _get_items('network', item_name_id=args.vim_net, datacenter=datacenter, tenant=tenant)
+ content = yaml.load(result.content)
+ if 'networks' in content:
+ raise OpenmanoCLIError('More than one network in the vim named ' + args.vim_net + '. Use uuid instead')
+ if 'error' in content:
+ raise OpenmanoCLIError(yaml.safe_dump(content))
+ network_uuid = content['network']['id']
+
+ if not args.force:
+ r = raw_input("Confirm action' (y/N)? ")
+ if len(r) == 0 or r[0].lower() != "y":
+ return 0
+
+ if args.id:
+ URLrequest = "http://%s:%s/openmano/%s/vim/%s/network/%s/detach/%s" % (
+ mano_host, mano_port, tenant, datacenter, network_uuid, args.id)
+ else:
+ URLrequest = "http://%s:%s/openmano/%s/vim/%s/network/%s/detach" % (
+ mano_host, mano_port, tenant, datacenter, network_uuid)
+ mano_response = requests.delete(URLrequest)
+ logger.debug("openmano response: %s", mano_response.text)
+ result = _print_verbose(mano_response, args.verbose)
+
+ return
def datacenter_net_action(args):
if args.action == "net-update":
return _print_verbose(mano_response, args.verbose)
+def datacenter_edit(args):
+ tenant = _get_tenant()
+ element = _get_item_uuid('datacenters', args.name, tenant)
+ headers_req = {'Accept': 'application/json', 'content-type': 'application/json'}
+ URLrequest = "http://%s:%s/openmano/datacenters/%s" % (mano_host, mano_port, element)
+
+ has_arguments = False
+ if args.file != None:
+ has_arguments = True
+ payload = _load_file_or_yaml(args.file)
+ else:
+ payload = {}
+
+ if args.sdn_controller != None:
+ has_arguments = True
+ if not 'config' in payload:
+ payload['config'] = {}
+ if not 'sdn-controller' in payload['config']:
+ payload['config']['sdn-controller'] = {}
+ if args.sdn_controller == 'null':
+ payload['config']['sdn-controller'] = None
+ else:
+ payload['config']['sdn-controller'] = _get_item_uuid("sdn_controllers", args.sdn_controller, tenant)
+
+ if not has_arguments:
+ raise OpenmanoCLIError("At least one argument must be provided to modify the datacenter")
+
+ if 'datacenter' not in payload:
+ payload = {'datacenter': payload}
+ payload_req = json.dumps(payload)
+
+ # print payload_req
+ if not args.force or (args.name == None and args.filer == None):
+ r = raw_input(" Edit datacenter " + args.name + " (y/N)? ")
+ if len(r) > 0 and r[0].lower() == "y":
+ pass
+ else:
+ return 0
+ logger.debug("openmano request: %s", payload_req)
+ mano_response = requests.put(URLrequest, headers=headers_req, data=payload_req)
+ logger.debug("openmano response: %s", mano_response.text)
+ if args.verbose == None:
+ args.verbose = 0
+ if args.name != None:
+ args.verbose += 1
+ return _print_verbose(mano_response, args.verbose)
+
+def version(args):
+ headers_req = {'Accept': 'application/json', 'content-type': 'application/json'}
+ URLrequest = "http://%s:%s/openmano/version" % (mano_host, mano_port)
+
+ mano_response = requests.get(URLrequest, headers=headers_req)
+ logger.debug("openmano response: %s", mano_response.text)
+ print mano_response.text
+
+
global mano_host
global mano_port
global mano_tenant
mano_datacenter = os.getenv('OPENMANO_DATACENTER',None)
main_parser = ThrowingArgumentParser(description='User program to interact with OPENMANO-SERVER (openmanod)')
- main_parser.add_argument('--version', action='version', version='%(prog)s ' + __version__ )
-
+ main_parser.add_argument('--version', action='version', help="get version of this client",
+ version='%(prog)s client version ' + __version__ +
+ " (Note: use '%(prog)s version' to get server version)")
+
subparsers = main_parser.add_subparsers(help='commands')
parent_parser = argparse.ArgumentParser(add_help=False)
config_parser.add_argument("-n", action="store_true", help="resolves tenant and datacenter names")
config_parser.set_defaults(func=config)
+ version_parser = subparsers.add_parser('version', parents=[parent_parser], help="get server version")
+ version_parser.set_defaults(func=version)
+
vnf_create_parser = subparsers.add_parser('vnf-create', parents=[parent_parser], help="adds a vnf into the catalogue")
vnf_create_parser.add_argument("file", action="store", help="location of the JSON file describing the VNF").completer = FilesCompleter
vnf_create_parser.add_argument("--name", action="store", help="name of the VNF (if it exists in the VNF descriptor, it is overwritten)")
tenant_list_parser.add_argument("name", nargs='?', help="name or uuid of the tenant")
tenant_list_parser.set_defaults(func=tenant_list)
- item_list=('tenant','datacenter') #put tenant before so that help appear in order
- for item in item_list:
- element_edit_parser = subparsers.add_parser(item+'-edit', parents=[parent_parser], help="edits one "+item)
- element_edit_parser.add_argument("name", help="name or uuid of the "+item)
- element_edit_parser.add_argument("file", help="json/yaml text or file with the changes").completer = FilesCompleter
- element_edit_parser.add_argument("-f","--force", action="store_true", help="do not prompt for confirmation")
- element_edit_parser.set_defaults(func=element_edit, element=item + 's')
+ element_edit_parser = subparsers.add_parser('tenant-edit', parents=[parent_parser], help="edits one tenant")
+ element_edit_parser.add_argument("name", help="name or uuid of the tenant")
+ element_edit_parser.add_argument("file", help="json/yaml text or file with the changes").completer = FilesCompleter
+ element_edit_parser.add_argument("-f","--force", action="store_true", help="do not prompt for confirmation")
+ element_edit_parser.set_defaults(func=element_edit, element='tenants')
datacenter_create_parser = subparsers.add_parser('datacenter-create', parents=[parent_parser], help="creates a new datacenter")
datacenter_create_parser.add_argument("name", action="store", help="name for the datacenter")
datacenter_create_parser.add_argument("--type", action="store", help="datacenter type: openstack or openvim (default)")
datacenter_create_parser.add_argument("--config", action="store", help="aditional configuration in json/yaml format")
datacenter_create_parser.add_argument("--description", action="store", help="description of the datacenter")
+ datacenter_create_parser.add_argument("--sdn-controller", action="store", help="Name or uuid of the SDN controller to be used", dest='sdn_controller')
datacenter_create_parser.set_defaults(func=datacenter_create)
datacenter_delete_parser = subparsers.add_parser('datacenter-delete', parents=[parent_parser], help="deletes a datacenter from the catalogue")
datacenter_delete_parser.add_argument("-f", "--force", action="store_true", help="forces deletion without asking")
datacenter_delete_parser.set_defaults(func=datacenter_delete)
+ datacenter_edit_parser = subparsers.add_parser('datacenter-edit', parents=[parent_parser], help="Edit datacenter")
+ datacenter_edit_parser.add_argument("name", help="name or uuid of the datacenter")
+ datacenter_edit_parser.add_argument("--file", help="json/yaml text or file with the changes").completer = FilesCompleter
+ datacenter_edit_parser.add_argument("--sdn-controller", action="store",
+ help="Name or uuid of the SDN controller to be used. Specify 'null' to clear entry", dest='sdn_controller')
+ datacenter_edit_parser.add_argument("-f", "--force", action="store_true", help="do not prompt for confirmation")
+ datacenter_edit_parser.set_defaults(func=datacenter_edit)
+
datacenter_list_parser = subparsers.add_parser('datacenter-list', parents=[parent_parser], help="lists information about a datacenter")
datacenter_list_parser.add_argument("name", nargs='?', help="name or uuid of the datacenter")
datacenter_list_parser.add_argument("-a", "--all", action="store_true", help="shows all datacenters, not only datacenters attached to tenant")
datacenter_attach_parser.add_argument("--config", action="store", help="aditional configuration in json/yaml format")
datacenter_attach_parser.set_defaults(func=datacenter_attach)
+ datacenter_edit_vim_tenant_parser = subparsers.add_parser('datacenter-edit-vim-tenant', parents=[parent_parser],
+ help="Edit the association of a datacenter to the operating tenant")
+ datacenter_edit_vim_tenant_parser.add_argument("name", help="name or uuid of the datacenter")
+ datacenter_edit_vim_tenant_parser.add_argument('--vim-tenant-id', action='store',
+ help="specify a datacenter tenant to use. A new one is created by default")
+ datacenter_edit_vim_tenant_parser.add_argument('--vim-tenant-name', action='store', help="specify a datacenter tenant name.")
+ datacenter_edit_vim_tenant_parser.add_argument("--user", action="store", help="user credentials for the datacenter")
+ datacenter_edit_vim_tenant_parser.add_argument("--password", action="store", help="password credentials for the datacenter")
+ datacenter_edit_vim_tenant_parser.add_argument("--config", action="store",
+ help="aditional configuration in json/yaml format")
+ datacenter_edit_vim_tenant_parser.set_defaults(func=datacenter_edit_vim_tenant)
+
datacenter_detach_parser = subparsers.add_parser('datacenter-detach', parents=[parent_parser], help="removes the association between a datacenter and the operating tenant")
datacenter_detach_parser.add_argument("name", help="name or uuid of the datacenter")
datacenter_detach_parser.add_argument("-a", "--all", action="store_true", help="removes all associations from this datacenter")
datacenter_detach_parser.set_defaults(func=datacenter_detach)
+ #=======================datacenter_sdn_port_mapping_xxx section=======================
+ #datacenter_sdn_port_mapping_set
+ datacenter_sdn_port_mapping_set_parser = subparsers.add_parser('datacenter-sdn-port-mapping-set',
+ parents=[parent_parser],
+ help="Load a file with the mapping of physical ports "
+ "and the ports of the dataplaneswitch controlled "
+ "by a datacenter")
+ datacenter_sdn_port_mapping_set_parser.add_argument("name", action="store", help="specifies the datacenter")
+ datacenter_sdn_port_mapping_set_parser.add_argument("file",
+ help="json/yaml text or file with the port mapping").completer = FilesCompleter
+ datacenter_sdn_port_mapping_set_parser.add_argument("-f", "--force", action="store_true",
+ help="forces overwriting without asking")
+ datacenter_sdn_port_mapping_set_parser.set_defaults(func=datacenter_sdn_port_mapping_set)
+
+ #datacenter_sdn_port_mapping_list
+ datacenter_sdn_port_mapping_list_parser = subparsers.add_parser('datacenter-sdn-port-mapping-list',
+ parents=[parent_parser],
+ help="Show the SDN port mapping in a datacenter")
+ datacenter_sdn_port_mapping_list_parser.add_argument("name", action="store", help="specifies the datacenter")
+ datacenter_sdn_port_mapping_list_parser.set_defaults(func=datacenter_sdn_port_mapping_list)
+
+ # datacenter_sdn_port_mapping_clear
+ datacenter_sdn_port_mapping_clear_parser = subparsers.add_parser('datacenter-sdn-port-mapping-clear',
+ parents=[parent_parser],
+ help="Clean the the SDN port mapping in a datacenter")
+ datacenter_sdn_port_mapping_clear_parser.add_argument("name", action="store",
+ help="specifies the datacenter")
+ datacenter_sdn_port_mapping_clear_parser.add_argument("-f", "--force", action="store_true",
+ help="forces clearing without asking")
+ datacenter_sdn_port_mapping_clear_parser.set_defaults(func=datacenter_sdn_port_mapping_clear)
+ # =======================
+
+ # =======================sdn_controller_xxx section=======================
+ # sdn_controller_create
+ sdn_controller_create_parser = subparsers.add_parser('sdn-controller-create', parents=[parent_parser],
+ help="Creates an SDN controller entity within RO")
+ sdn_controller_create_parser.add_argument("name", help="name of the SDN controller")
+ sdn_controller_create_parser.add_argument("--description", action="store", help="description of the SDN controller")
+ sdn_controller_create_parser.add_argument("--ip", action="store", help="IP of the SDN controller")
+ sdn_controller_create_parser.add_argument("--port", action="store", help="Port of the SDN controller")
+ sdn_controller_create_parser.add_argument("--dpid", action="store",
+ help="DPID of the dataplane switch controlled by this SDN controller")
+ sdn_controller_create_parser.add_argument("--type", action="store",
+ help="Specify the SDN controller type. Valid types are 'opendaylight' and 'floodlight'")
+ sdn_controller_create_parser.add_argument("--user", action="store", help="user credentials for the SDN controller")
+ sdn_controller_create_parser.add_argument("--passwd", action="store", dest='password',
+ help="password credentials for the SDN controller")
+ sdn_controller_create_parser.set_defaults(func=sdn_controller_create)
+
+ # sdn_controller_edit
+ sdn_controller_edit_parser = subparsers.add_parser('sdn-controller-edit', parents=[parent_parser],
+ help="Update one or more options of a SDN controller")
+ sdn_controller_edit_parser.add_argument("name", help="name or uuid of the SDN controller", )
+ sdn_controller_edit_parser.add_argument("--name", action="store", help="Update the name of the SDN controller",
+ dest='new_name')
+ sdn_controller_edit_parser.add_argument("--description", action="store", help="description of the SDN controller")
+ sdn_controller_edit_parser.add_argument("--ip", action="store", help="IP of the SDN controller")
+ sdn_controller_edit_parser.add_argument("--port", action="store", help="Port of the SDN controller")
+ sdn_controller_edit_parser.add_argument("--dpid", action="store",
+ help="DPID of the dataplane switch controlled by this SDN controller")
+ sdn_controller_edit_parser.add_argument("--type", action="store",
+ help="Specify the SDN controller type. Valid types are 'opendaylight' and 'floodlight'")
+ sdn_controller_edit_parser.add_argument("--user", action="store", help="user credentials for the SDN controller")
+ sdn_controller_edit_parser.add_argument("--password", action="store",
+ help="password credentials for the SDN controller", dest='password')
+ sdn_controller_edit_parser.add_argument("-f", "--force", action="store_true", help="do not prompt for confirmation")
+ #TODO: include option --file
+ sdn_controller_edit_parser.set_defaults(func=sdn_controller_edit)
+
+ #sdn_controller_list
+ sdn_controller_list_parser = subparsers.add_parser('sdn-controller-list',
+ parents=[parent_parser],
+ help="List the SDN controllers")
+ sdn_controller_list_parser.add_argument("name", nargs='?', help="name or uuid of the SDN controller")
+ sdn_controller_list_parser.set_defaults(func=sdn_controller_list)
+
+ # sdn_controller_delete
+ sdn_controller_delete_parser = subparsers.add_parser('sdn-controller-delete',
+ parents=[parent_parser],
+ help="Delete the the SDN controller")
+ sdn_controller_delete_parser.add_argument("name", help="name or uuid of the SDN controller")
+ sdn_controller_delete_parser.add_argument("-f", "--force", action="store_true", help="forces deletion without asking")
+ sdn_controller_delete_parser.set_defaults(func=sdn_controller_delete)
+ # =======================
action_dict={'net-update': 'retrieves external networks from datacenter',
'net-edit': 'edits an external network',
if item=='netmap-import':
datacenter_action_parser.add_argument("-f","--force", action="store_true", help="do not prompt for confirmation")
datacenter_action_parser.set_defaults(func=datacenter_netmap_action, action=item)
-
+
+ # =======================vim_net_sdn_xxx section=======================
+ # vim_net_sdn_attach
+ vim_net_sdn_attach_parser = subparsers.add_parser('vim-net-sdn-attach',
+ parents=[parent_parser],
+ help="Specify the port to access to an external network using SDN")
+ vim_net_sdn_attach_parser.add_argument("vim_net", action="store",
+ help="Name/id of the network in the vim that will be used to connect to the external network")
+ vim_net_sdn_attach_parser.add_argument("port", action="store", help="Specifies the port in the dataplane switch to access to the external network")
+ vim_net_sdn_attach_parser.add_argument("--vlan", action="store", help="Specifies the vlan (if any) to use in the defined port")
+ vim_net_sdn_attach_parser.add_argument("--mac", action="store", help="Specifies the MAC (if known) of the physical device that will be reachable by this external port")
+ vim_net_sdn_attach_parser.add_argument("--datacenter", action="store", help="specifies the datacenter")
+ vim_net_sdn_attach_parser.set_defaults(func=vim_net_sdn_attach)
+
+ # vim_net_sdn_detach
+ vim_net_sdn_detach_parser = subparsers.add_parser('vim-net-sdn-detach',
+ parents=[parent_parser],
+ help="Remove the port information to access to an external network using SDN")
+
+ vim_net_sdn_detach_parser.add_argument("vim_net", action="store", help="Name/id of the vim network")
+ vim_net_sdn_detach_parser.add_argument("--id", action="store",help="Specify the uuid of the external ports from this network to be detached")
+ vim_net_sdn_detach_parser.add_argument("--all", action="store_true", help="Detach all external ports from this network")
+ vim_net_sdn_detach_parser.add_argument("-f", "--force", action="store_true", help="forces clearing without asking")
+ vim_net_sdn_detach_parser.add_argument("--datacenter", action="store", help="specifies the datacenter")
+ vim_net_sdn_detach_parser.set_defaults(func=vim_net_sdn_detach)
+ # =======================
+
for item in ("network", "tenant", "image"):
if item=="network":
- commnad_name = 'vim-net'
+ command_name = 'vim-net'
else:
- commnad_name = 'vim-'+item
- vim_item_list_parser = subparsers.add_parser(commnad_name + '-list', parents=[parent_parser], help="list the vim " + item + "s")
+ command_name = 'vim-'+item
+ vim_item_list_parser = subparsers.add_parser(command_name + '-list', parents=[parent_parser], help="list the vim " + item + "s")
vim_item_list_parser.add_argument("name", nargs='?', help="name or uuid of the " + item + "s")
vim_item_list_parser.add_argument("--datacenter", action="store", help="specifies the datacenter")
vim_item_list_parser.set_defaults(func=vim_action, item=item, action="list")
- vim_item_del_parser = subparsers.add_parser(commnad_name + '-delete', parents=[parent_parser], help="list the vim " + item + "s")
+ vim_item_del_parser = subparsers.add_parser(command_name + '-delete', parents=[parent_parser], help="list the vim " + item + "s")
vim_item_del_parser.add_argument("name", help="name or uuid of the " + item + "s")
vim_item_del_parser.add_argument("--datacenter", action="store", help="specifies the datacenter")
vim_item_del_parser.set_defaults(func=vim_action, item=item, action="delete")
if item == "network" or item == "tenant":
- vim_item_create_parser = subparsers.add_parser(commnad_name + '-create', parents=[parent_parser], help="create a "+item+" at vim")
+ vim_item_create_parser = subparsers.add_parser(command_name + '-create', parents=[parent_parser], help="create a "+item+" at vim")
vim_item_create_parser.add_argument("file", nargs='?', help="descriptor of the %s. Must be a file or yaml/json text" % item).completer = FilesCompleter
vim_item_create_parser.add_argument("--name", action="store", help="name of the %s" % item )
vim_item_create_parser.add_argument("--datacenter", action="store", help="specifies the datacenter")