def neutron_add_subnet(nc, vsd_subnet, tenant): neutron_creds = get_neutron_creds(cfg.get('openstack', 'admin_username'), cfg.get('openstack', 'admin_password'), tenant.name) neutron = neutronclient.Client(**neutron_creds) # Ignore Shared L3 if not linked to shared subnet if not vsd_subnet['parentType'] == "enterprise" and vsd_subnet['address'] is None and vsd_subnet[ 'associatedSharedNetworkResourceID'] is None: if cfg.getboolean('sync', 'sync_shared_subnets'): logger.info( "|- Ignoring subnet: (ID:{0}). This is a public subnet without a pool assignment yet.".format( vsd_subnet['ID'])) else: logger.info( "|- Ignoring subnet: (ID:{0}). Sync of shared subnets is disabled in configuration.".format( vsd_subnet['ID'])) return None # Ignore if Shared L2/L3 subnet and syncing of shared subnets is disabled in the configuration if vsd_subnet['associatedSharedNetworkResourceID'] is not None and not cfg.getboolean('sync', 'sync_shared_subnets'): logger.info( "|- Ignoring subnet: (ID:{0}). Sync of shared subnets is disabled in configuration.".format( vsd_subnet['ID'])) return None # Check if network exists if vsd_subnet['parentType'] == "enterprise": net_name = calcL2SubnetName(nc, vsd_subnet) else: net_name = calcL3SubnetName(nc, vsd_subnet) try: logger.debug("Checking if openstack network {0} already exists".format(net_name)) netw = neutron.list_networks(name=net_name)['networks'] except Exception, e: logger.error("|- ERROR checking if openstack network {0} exists".format(net_name)) logger.error(repr(e))
def list_vsd_managed_tenants(): """Retrieves a list of the managed tenants in VSD""" # TODO: Improve list speed, nc.get("enterprises") is quite slow. nc = NuageConnection(cfg.get('vsd', 'hostname'), enterprise=cfg.get('vsd', 'enterprise'), username=cfg.get('vsd', 'username'), password=cfg.get('vsd', 'password'), version=cfg.get('vsd', 'version'), port=cfg.get('vsd', 'port')) cr = get_keystone_creds() ks = ksclient.Client(**cr) try: tenants = ks.tenants.list() except: return "Could not connect to keystone." try: template = "{ID:40} | {name:20} | {description:30}" print template.format(ID="TENANT ID", name="TENANT NAME", description="TENANT DESCRIPTION") for ksi in tenants: for ent in nc.get("enterprises").obj(): if ksi.name == ent["name"]: print template.format(**ent) except: logger.error("Unable to get list of enterprises.")
def delete_vsdobjects_in_tenant(tenant_name): logger.info("Deleting all VSD objects for tenant: %s" % tenant_name) nc = NuageConnection(cfg.get('vsd','hostname'), enterprise=cfg.get('vsd','enterprise'), username=cfg.get('vsd','username'), password=cfg.get('vsd','password'), version=cfg.get('vsd','version'), port=cfg.get('vsd','port')) enterprise = nc.get("enterprises",filtertext="name == \"%s\"" % tenant_name).obj()[0] ### Get and delete all the active domains in the enterprise try: domains = nc.get("enterprises/%s/domains" % enterprise['ID']).obj() #Delete each L3 domain for domain in domains: nc.put("domains/%s" % domain["ID"],{"maintenanceMode": "ENABLED"}) vports = nc.get("domains/%s/vports" % domain["ID"]).obj() for vport in vports: logger.info("VSD - Deleting vport: %s" % vport["ID"]) if vport["type"] == "BRIDGE": logger.info("VSD - Deleting bridgeport") try: nc.delete("bridgeinterfaces/%s" %(nc.get("vports/%s/bridgeinterfaces" % vport["ID"]).obj()[0]["ID"])) except Exception, e: logger.info("VSD - no Bridgeinterface found") logger.error(repr(e)) if vport["type"] == "HOST": logger.info("VSD - Deleting hostport interface") try: hostport = nc.get("vports/%s/hostinterfaces" % vport["ID"]).obj() nc.delete("hostinterfaces/%s" % hostport[0]["ID"]) except Exception, e: logger.info("VSD - no host interface found") time.sleep(2) alarms = nc.get("vports/%s/alarms" % vport["ID"]).obj() for alarm in alarms: try: nc.delete("alarms/%s" % alarm["ID"]) except Exception, e: logger.info("VSD - while deleting alarm") nc.delete("vports/%s" % vport["ID"])
def cleanup_os_networks(): neutron_creds = get_neutron_creds(cfg.get('openstack','admin_username'), cfg.get('openstack','admin_password'), "admin") neutron = neutronclient.Client(**neutron_creds) try: networks = neutron.list_networks()['networks'] except Exception, e: logger.error("|- ERROR getting current networks from Openstack") logger.error(repr(e)) return 1
def delete_vms_in_tenant(tenant_name): logger.info("Deleting all VMs for tenant: %s" % tenant_name) nova_creds = get_admin_nova_creds(tenant_name) nova = novaclient.Client(**nova_creds) try: for server in nova.servers.list(): logger.info("Deleting Server: %s" % server['id']) server.delete() except Exception, e: logger.error("|- ERROR deleting VM: %s" % server['id']) logger.error(repr(e))
def delete_vms_in_tenant(tenant_name): logger.info("Deleting all VMs for tenant: %s" % tenant_name) nova_creds = get_admin_nova_creds(tenant_name) nova = novaclient.Client(**nova_creds) try: for server in nova.servers.list(): logger.info("Deleting Server: %s" % server['id']) server.delete() except Exception, e: logger.error("|- ERROR deleting VM: %s" % server['id']) logger.error(repr(e))
def create_uplink_subnet(): logger.info("Adding Uplink Subnet") nc = NuageConnection(cfg.get('vsd','hostname'), enterprise=cfg.get('vsd','enterprise'), username=cfg.get('vsd','username'), password=cfg.get('vsd','password'), version=cfg.get('vsd','version'), port=cfg.get('vsd','port')) try: dead_vms = nc.get("vms",filtertext="hypervisorIP == \"FFFFFF\"").obj() except: logger.error("Error getting orphaned VMs") for vm in dead_vms: logger.info("Deleting orphaned VM with ID: %s" % vm['ID']) try: nc.delete("vms/%s" % vm['ID']) except: logger.error("Error deleting orhpaned VM with ID: %s" % vm['ID']) logger.info("Finished Auditing vPorts")
def delete(url,enterprise_name): logger.info("Deleting Network Macro with url: %s" % url) nc = NuageConnection(cfg.get('vsd','hostname'), enterprise=cfg.get('vsd','enterprise'), username=cfg.get('vsd','username'), password=cfg.get('vsd','password'), version="v3_0", port=cfg.get('vsd','port')) try: enterprise = nc.get("enterprises",filtertext="name == \"%s\"" % enterprise_name).obj()[0] except: logger.error("Error getting enterprise %s" % enterprise_name) return 1 if not enterprise: logger.error("No enterprise found with name %s" % enterprise_name) return 1 try: macro = nc.get("enterprises/%s/enterprisenetworks" % enterprise['ID'],filtertext="name == \"%s\"" % url.replace(".", "-")).obj() except: logger.error("Error getting existing macros %s" % enterprise_name) return 1 if not macro: logger.info("Network Macro for %s does not exist" % url) return 0 else: try: nc.delete("enterprisenetworks/%s" % macro[0]['ID']) logger.info("Deleted Network Macro for %s." % url) return 0 except: logger.error("Error deleting Network Macro for %s" % url) return 1
def audit_vports(): logger.info("Auditing vPorts") nc = NuageConnection(cfg.get('vsd','hostname'), enterprise=cfg.get('vsd','enterprise'), username=cfg.get('vsd','username'), password=cfg.get('vsd','password'), version=cfg.get('vsd','version'), port=cfg.get('vsd','port')) try: dead_vms = nc.get("vms",filtertext="hypervisorIP == \"FFFFFF\"").obj() except: logger.error("Error getting orphaned VMs") for vm in dead_vms: logger.info("Deleting orphaned VM with ID: %s" % vm['ID']) try: nc.delete("vms/%s" % vm['ID']) except: logger.error("Error deleting orhpaned VM with ID: %s" % vm['ID']) logger.info("Finished Auditing vPorts")
def is_excluded_tenant_name(tenant_name): try: if not cfg.has_option('sync','excluded_tenants'): return False excluded_tenants = cfg.get('sync','excluded_tenants').split(',') if tenant_name in excluded_tenants: return True elif cfg.has_option('openstack','default_net_partition'): if cfg.get('openstack','default_net_partition') == tenant_name: return True else: return False except Exception, e: logger.error("|- ERROR getting list of excluded tenants from config file") logger.error(repr(e))
def neutron_add_subnet(nc,vsd_subnet,tenant): neutron_creds = get_neutron_creds(cfg.get('openstack','admin_username'), cfg.get('openstack','admin_password'), tenant.name) neutron = neutronclient.Client(**neutron_creds) if not vsd_subnet['parentType'] == "enterprise" and vsd_subnet['address'] == None and vsd_subnet['associatedSharedNetworkResourceID'] == None: logger.debug("|- Ignoring subnet: (ID:%s). This is a public subnet without a pool assignment yet." % vsd_subnet['ID'] ) return None if vsd_subnet['parentType'] == "enterprise": net_name = calcL2SubnetName(nc,vsd_subnet) else: net_name = calcL3SubnetName(nc,vsd_subnet) try: logger.debug("Checking if openstack network %s already exists" % net_name) network = neutron.list_networks(name=net_name)['networks'] except Exception, e: logger.error("|- ERROR checking if openstack network %s exists" % net_name) logger.error(repr(e))
def is_excluded_keystone_tenant_id(tenant_id): try: if not cfg.has_option('sync','excluded_tenants'): return False excluded_tenants = cfg.get('sync','excluded_tenants').split(',') try: tenant = get_tenant_with_id(tenant_id) except Exception, e: logger.error("|- ERROR getting keystone tenant with id: %s" % tenant_id) logger.error(repr(e)) if tenant.name in excluded_tenants: return True elif cfg.has_option('openstack','default_net_partition'): if cfg.get('openstack','default_net_partition') == tenant.name: return True else: return False
def is_excluded_netpartition_id(netpartition_id): neutron_creds = get_neutron_creds(cfg.get('openstack','admin_username'), cfg.get('openstack','admin_password'), "admin") neutron = neutronclient.Client(**neutron_creds) try: if not cfg.has_option('sync','excluded_tenants'): return False excluded_tenants = cfg.get('sync','excluded_tenants').split(',') try: tenant = neutron.list_net_partitions(id=netpartition_id)['net_partitions'][0] except Exception, e: logger.error("|- ERROR getting netpartition with id: %s" % netpartition_id) logger.error(repr(e)) if tenant['name'] in excluded_tenants: return True elif cfg.has_option('openstack','default_net_partition'): if cfg.get('openstack','default_net_partition') == tenant['name']: return True else: return False
def neutron_add_subnet(nc, vsd_subnet, tenant): neutron_creds = get_neutron_creds(cfg.get('openstack', 'admin_username'), cfg.get('openstack', 'admin_password'), tenant.name) neutron = neutronclient.Client(**neutron_creds) # Ignore Shared L3 if not linked to shared subnet if not vsd_subnet['parentType'] == "enterprise" and vsd_subnet[ 'address'] is None and vsd_subnet[ 'associatedSharedNetworkResourceID'] is None: if cfg.getboolean('sync', 'sync_shared_subnets'): logger.info( "|- Ignoring subnet: (ID:{0}). This is a public subnet without a pool assignment yet." .format(vsd_subnet['ID'])) else: logger.info( "|- Ignoring subnet: (ID:{0}). Sync of shared subnets is disabled in configuration." .format(vsd_subnet['ID'])) return None # Ignore if Shared L2/L3 subnet and syncing of shared subnets is disabled in the configuration if vsd_subnet[ 'associatedSharedNetworkResourceID'] is not None and not cfg.getboolean( 'sync', 'sync_shared_subnets'): logger.info( "|- Ignoring subnet: (ID:{0}). Sync of shared subnets is disabled in configuration." .format(vsd_subnet['ID'])) return None # Check if network exists if vsd_subnet['parentType'] == "enterprise": net_name = calcL2SubnetName(nc, vsd_subnet) else: net_name = calcL3SubnetName(nc, vsd_subnet) try: logger.debug("Checking if openstack network {0} already exists".format( net_name)) netw = neutron.list_networks(name=net_name)['networks'] except Exception, e: logger.error( "|- ERROR checking if openstack network {0} exists".format( net_name)) logger.error(repr(e))
def list_vsd_managed_tenants(): """Retrieves a list of the managed tenants in VSD""" # TODO: Improve list speed, nc.get("enterprises") is quite slow. nc = NuageConnection(cfg.get('vsd', 'hostname'), enterprise=cfg.get('vsd', 'enterprise'), username=cfg.get('vsd', 'username'), password=cfg.get('vsd', 'password'), version="v3_0", port=cfg.get('vsd', 'port')) cr = get_keystone_creds() ks = ksclient.Client(**cr) try: tenants = ks.tenants.list() except: return "Could not connect to keystone." try: template = "{ID:40} | {name:20} | {description:30}" print template.format(ID="TENANT ID", name="TENANT NAME", description="TENANT DESCRIPTION") for ksi in tenants: for ent in nc.get("enterprises").obj(): if ksi.name == ent["name"]: print template.format(**ent) except: logger.error("Unable to get list of enterprises.")
def delete_vsd_managed_tenant(tenant_name,force): logger.info("Deleting VSD Managed Tenant: %s" % tenant_name) creds = get_keystone_creds() keystone = ksclient.Client(**creds) if force: try: delete_vms_in_tenant(tenant_name) except Exception, e: logger.error("|- ERROR deleting VMs from tenant %s" % tenant_name) logger.error(repr(e)) try: delete_vsdobjects_in_tenant(tenant_name) except Exception, e: logger.error("|- ERROR deleting VSD Objects from tenant %s" % tenant_name) logger.error(repr(e))
def delete_vsd_managed_tenant(tenant_name, force): logger.info("Deleting VSD Managed Tenant: %s" % tenant_name) creds = get_keystone_creds() keystone = ksclient.Client(**creds) if force: try: delete_vms_in_tenant(tenant_name) except Exception, e: logger.error("|- ERROR deleting VMs from tenant %s" % tenant_name) logger.error(repr(e)) try: delete_vsdobjects_in_tenant(tenant_name) except Exception, e: logger.error("|- ERROR deleting VSD Objects from tenant %s" % tenant_name) logger.error(repr(e))
def sync_subnets(): try: logger.info("Starting Subnet Synchronizing") neutron_creds = get_neutron_creds(cfg.get('openstack','admin_username'), cfg.get('openstack','admin_password'), "admin") neutron = neutronclient.Client(**neutron_creds) nc = NuageConnection(cfg.get('vsd','hostname'), enterprise=cfg.get('vsd','enterprise'), username=cfg.get('vsd','username'), password=cfg.get('vsd','password'), version=cfg.get('vsd','version'), port=cfg.get('vsd','port')) try: subnet_mappings = get_current_subnet_mappings() except Exception, e: logger.error("|- ERROR getting current subnet mappings from OpenStack MYSQL database") logger.error(repr(e)) return #First clean up existing Networks without attached subnets try: logger.info("Cleaning up Networks without subnets attached") cleanup_os_networks() except Exception, e: logger.error("|- ERROR cleaning up Networks without subnets attached") logger.error(repr(e))
def delete(url, enterprise_name): logger.info("Deleting Network Macro with url: {0}".format(url)) nc = NuageConnection(cfg.get('vsd', 'hostname'), enterprise=cfg.get('vsd', 'enterprise'), username=cfg.get('vsd', 'username'), password=cfg.get('vsd', 'password'), version="v3_0", port=cfg.get('vsd', 'port')) try: enterprise = nc.get( "enterprises", filtertext="name == \"{0}\"".format(enterprise_name)).obj()[0] except: logger.error("Error getting enterprise {0}".format(enterprise_name)) return 1 if not enterprise: logger.error( "No enterprise found with name {0}".format(enterprise_name)) return 1 try: macro = nc.get( "enterprises/{0}/enterprisenetworks".format(enterprise['ID']), filtertext="name == \"{0}\"".format(url.replace(".", "-"))).obj() except: logger.error( "Error getting existing macros {0}".format(enterprise_name)) return 1 if not macro: logger.info("Network Macro for {0} does not exist".format(url)) return 0 else: try: nc.delete("enterprisenetworks/{0}".format(macro[0]['ID'])) logger.info("Deleted Network Macro for {0}.".format(url)) return 0 except: logger.error("Error deleting Network Macro for {0}".format(url)) return 1
def create_vsd_managed_tenant(tenant_name): logger.info("Creating VSD Managed Tenant: %s" % tenant_name) creds = get_keystone_creds() keystone = ksclient.Client(**creds) logger.info("Creating Keystone Tenant: %s" % tenant_name) try: if keystone_tenant_exists(tenant_name): logger.error("|- ERROR tenant %s already exists in keystone" % tenant_name) os_tenant = keystone.tenants.find(name="%s" % tenant_name) else: os_tenant = keystone.tenants.create(tenant_name="%s" % tenant_name, description="VSD Managed Openstack Tenant", enabled=True) except Exception, e: logger.error("|- ERROR creating tenant %s in keystone" % tenant_name) logger.error(repr(e))
def create_vsd_managed_tenant(tenant_name): logger.info("Creating VSD Managed Tenant: %s" % tenant_name) creds = get_keystone_creds() keystone = ksclient.Client(**creds) logger.info("Creating Keystone Tenant: %s" % tenant_name) try: if keystone_tenant_exists(tenant_name): logger.error("|- ERROR tenant %s already exists in keystone" % tenant_name) os_tenant = keystone.tenants.find(name="%s" % tenant_name) else: os_tenant = keystone.tenants.create( tenant_name="%s" % tenant_name, description="VSD Managed Openstack Tenant", enabled=True) except Exception, e: logger.error("|- ERROR creating tenant %s in keystone" % tenant_name) logger.error(repr(e))
netw = neutron.list_networks(name=net_name)['networks'] except Exception, e: logger.error("|- ERROR checking if openstack network {0} exists".format(net_name)) logger.error(repr(e)) else: body_nw = { "network": { "name": net_name, "admin_state_up": True } } try: netw = neutron.create_network(body=body_nw) except Exception, e: logger.error("|- ERROR creating network: (ID:{0})".format(vsd_subnet['ID'])) logger.error(repr(e)) return None # Add subnet if vsd_subnet['parentType'] == "enterprise": # L2 subnet if vsd_subnet['DHCPManaged']: # private L2 with DHCP body_subnet = { "subnets": [ { "name": calcL2SubnetName(nc, vsd_subnet), "cidr": "{0}".format(net_nm_sanitizer(vsd_subnet['address'], vsd_subnet['netmask'])), "ip_version": 4, "network_id": netw['network']['id'],
hostport = nc.get("vports/%s/hostinterfaces" % vport["ID"]).obj() nc.delete("hostinterfaces/%s" % hostport[0]["ID"]) except Exception, e: logger.info("VSD - no host interface found") time.sleep(2) alarms = nc.get("vports/%s/alarms" % vport["ID"]).obj() for alarm in alarms: try: nc.delete("alarms/%s" % alarm["ID"]) except Exception, e: logger.info("VSD - while deleting alarm") nc.delete("vports/%s" % vport["ID"]) nc.delete("domains/%s" % domain["ID"]) except Exception, e: result = 1 logger.error("VSD - while deleting domains") logger.error(repr(e)) ### Get and delete all the active l2domains in the enterprise try: domains = nc.get("enterprises/%s/l2domains" % enterprise['ID']).obj() #Delete each L2 domain for domain in domains: nc.put("l2domains/%s" % domain["ID"],{"maintenanceMode": "ENABLED"}) vports = nc.get("l2domains/%s/vports" % domain["ID"]).obj() for vport in vports: logger.info("VSD - Deleting l2vport: %s" % vport["ID"]) if vport["type"] == "BRIDGE": logger.info("VSD - Deleting bridgeport") try: nc.delete("bridgeinterfaces/%s" %(nc.get("vports/%s/bridgeinterfaces" % vport["ID"]).obj()[0]["ID"]))
vport["ID"]).obj() nc.delete("hostinterfaces/%s" % hostport[0]["ID"]) except Exception, e: logger.info("VSD - no host interface found") time.sleep(2) alarms = nc.get("vports/%s/alarms" % vport["ID"]).obj() for alarm in alarms: try: nc.delete("alarms/%s" % alarm["ID"]) except Exception, e: logger.info("VSD - while deleting alarm") nc.delete("vports/%s" % vport["ID"]) nc.delete("domains/%s" % domain["ID"]) except Exception, e: result = 1 logger.error("VSD - while deleting domains") logger.error(repr(e)) ### Get and delete all the active l2domains in the enterprise try: domains = nc.get("enterprises/%s/l2domains" % enterprise['ID']).obj() #Delete each L2 domain for domain in domains: nc.put("l2domains/%s" % domain["ID"], {"maintenanceMode": "ENABLED"}) vports = nc.get("l2domains/%s/vports" % domain["ID"]).obj() for vport in vports: logger.info("VSD - Deleting l2vport: %s" % vport["ID"]) if vport["type"] == "BRIDGE": logger.info("VSD - Deleting bridgeport") try:
net_name = calcL3SubnetName(nc, vsd_subnet) try: logger.debug("Checking if openstack network {0} already exists".format( net_name)) netw = neutron.list_networks(name=net_name)['networks'] except Exception, e: logger.error( "|- ERROR checking if openstack network {0} exists".format( net_name)) logger.error(repr(e)) else: body_nw = {"network": {"name": net_name, "admin_state_up": True}} try: netw = neutron.create_network(body=body_nw) except Exception, e: logger.error("|- ERROR creating network: (ID:{0})".format( vsd_subnet['ID'])) logger.error(repr(e)) return None # Add subnet if vsd_subnet['parentType'] == "enterprise": # L2 subnet if vsd_subnet['DHCPManaged']: # private L2 with DHCP body_subnet = { "subnets": [{ "name": calcL2SubnetName(nc, vsd_subnet), "cidr": "{0}".format( net_nm_sanitizer(vsd_subnet['address'],
def create(url,enterprise_name): logger.info("Creating/updating Network Macro from url: %s" % url) nc = NuageConnection(cfg.get('vsd','hostname'), enterprise=cfg.get('vsd','enterprise'), username=cfg.get('vsd','username'), password=cfg.get('vsd','password'), version=cfg.get('vsd','version'), port=cfg.get('vsd','port')) try: ip = socket.gethostbyname(url) except: logger.error("Error looking up hostname or hostname cannot be found") return 1 try: enterprise = nc.get("enterprises",filtertext="name == \"%s\"" % enterprise_name).obj()[0] except: logger.error("Error getting enterprise %s" % enterprise_name) return 1 if not enterprise: logger.error("No enterprise found with name %s" % enterprise_name) return 1 try: macro = nc.get("enterprises/%s/enterprisenetworks" % enterprise['ID'],filtertext="name == \"%s\"" % url.replace(".", "-")).obj() except: logger.error("Error getting existing macros from enterprise %s" % enterprise_name) return 1 if not macro: logger.info("Network Macro for %s does not exist, creating a new one." % url) try: nc.post("enterprises/%s/enterprisenetworks" % enterprise['ID'], {"IPType": "IPV4", "address": ip, "name": url.replace(".", "-"), "netmask": "255.255.255.255"}) logger.info("Network Macro created for %s with ip:%s." % (url,ip)) return 0 except: logger.error("Error creating new Network Macro for %s" % url) return 1 else: if not macro[0]['address'] == ip: logger.info("Network Macro for %s does exists, but address is not correct.(current:%s | new:%s)" % (url,macro[0]['address'],ip)) try: nc.put("enterprisenetworks/%s" % macro[0]['ID'], {"address": ip, "netmask": "255.255.255.255"}) logger.info("Network Macro for %s updated with ip:%s." % (url,ip)) return 0 except: logger.error("Error updating Network Macro for %s" % url) return 1 else: logger.info("Network Macro for %s does exists and address is correct." % url) return 0
logger.error("|- ERROR checking if openstack network %s exists" % net_name) logger.error(repr(e)) if network: netw = network else: body_nw = { "network": { "name": net_name, "admin_state_up": True } } try: netw = neutron.create_network(body=body_nw) except Exception, e: logger.error("|- ERROR creating network: (ID:%s)" % vsd_subnet['ID'] ) logger.error(repr(e)) return None if vsd_subnet['parentType'] == "enterprise" and not vsd_subnet['DHCPManaged']: body_subnet = { "subnets": [ { "name": calcL2SubnetName(nc,vsd_subnet), "cidr": "9.0.0.0/8", "ip_version": 4, "gateway_ip": "9.9.9.1", "network_id": netw['network']['id'], "nuagenet": vsd_subnet['ID'], "net_partition": tenant.name, "enable_dhcp": False }