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 get_keystone_creds(): d = {} d['username'] = cfg.get('openstack', 'admin_username') d['password'] = cfg.get('openstack', 'admin_password') d['auth_url'] = cfg.get('openstack', 'auth_url') d['tenant_name'] = "admin" return d
def get_keystone_creds(): return { 'username': cfg.get('openstack', 'admin_username'), 'password': cfg.get('openstack', 'admin_password'), 'auth_url': cfg.get('openstack', 'auth_url'), 'tenant_name': "admin" }
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 get_keystone_creds(): d = {} d['username'] = cfg.get('openstack','admin_username') d['password'] = cfg.get('openstack','admin_password') d['auth_url'] = cfg.get('openstack','auth_url') d['tenant_name'] = "admin" return d
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 get_admin_nova_creds(tenant_name): d = {} d['version'] = "2" d['username'] = cfg.get('openstack', 'admin_username') d['api_key'] = cfg.get('openstack', 'admin_password') d['auth_url'] = cfg.get('openstack', 'auth_url') d['project_id'] = tenant_name d['service_type'] = "compute" return d
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 get_admin_nova_creds(tenant_name): return { 'version': "2", 'username': cfg.get('openstack', 'admin_username'), 'api_key': cfg.get('openstack', 'admin_password'), 'auth_url': cfg.get('openstack', 'auth_url'), 'project_id': tenant_name, 'service_type': "compute" }
def get_admin_nova_creds(tenant_name): d = {} d['version'] = "2" d['username'] = cfg.get('openstack','admin_username') d['api_key'] = cfg.get('openstack','admin_password') d['auth_url'] = cfg.get('openstack','auth_url') d['project_id'] = tenant_name d['service_type'] = "compute" return d
def netpartition_exists(tenant_name): neutron_creds = get_neutron_creds(cfg.get('openstack','admin_username'), cfg.get('openstack','admin_password'), "admin") neutron = neutronclient.Client(**neutron_creds) try: if neutron.list_net_partitions(name=tenant_name)['net_partitions'][0]: return True else: return False except: return False
def vsd_subnet_exists(os_nw,mapping): 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')) logger.debug("Checking if Openstack network(%s,%s) exists in the VSD" % (os_nw['id'],os_nw['name'])) try: vsd_subnet = nc.get("subnets/%s" % mapping["nuage_subnet_id"]).obj()[0] except Exception, e: try: vsd_subnet = nc.get("l2domains/%s" % mapping["nuage_subnet_id"]).obj()[0] except Exception, e: logger.info("|- Subnet (%s - ID:%s) not found in VSD --> Removing" % (os_nw['name'], os_nw['id']) ) vsd_subnet = []
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 netpartition_exists(tenant_name): neutron_creds = get_neutron_creds(cfg.get('openstack', 'admin_username'), cfg.get('openstack', 'admin_password'), "admin") neutron = neutronclient.Client(**neutron_creds) try: if neutron.list_net_partitions(name=tenant_name)['net_partitions'][0]: return True else: return False except: return False
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 get_current_subnet_mappings(): con = mdb.connect(cfg.get('neutron', 'db_hostname'), cfg.get('neutron', 'db_username'), cfg.get('neutron', 'db_password'), cfg.get('neutron', 'db_name')) cur = con.cursor(mdb.cursors.DictCursor) if not cfg.has_option('openstack', 'version'): cur.execute("SELECT * FROM nuage_subnet_l2dom_mapping") else: if cfg.get('openstack', 'version').lower() == "icehouse": cur.execute("SELECT * FROM subnet_l2dom_mapping") else: # juno, kilo and liberty cur.execute("SELECT * FROM nuage_subnet_l2dom_mapping") rows = cur.fetchall() return rows
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 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 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
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 get_neutron_creds(user, pw, tenant): d = {} d['username'] = user d['password'] = pw d['auth_url'] = cfg.get('openstack', 'auth_url') d['tenant_name'] = tenant return d
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_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 get_neutron_creds(user,pw, tenant): d = {} d['username'] = user d['password'] = pw d['auth_url'] = cfg.get('openstack','auth_url') d['tenant_name'] = tenant return d
def get_neutron_creds(user, pw, tenant): return { 'username': user, 'password': pw, 'auth_url': cfg.get('openstack', 'auth_url'), 'tenant_name': tenant }
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 calcL2SubnetName(nc,l2domain): if not cfg.has_option('sync','l2_name_format'): L2NameFormat = "$d" else: L2NameFormat = cfg.get('sync','l2_name_format') name = l2domain['name'] return name
def calcL2SubnetName(nc, l2domain): if not cfg.has_option('sync', 'l2_name_format'): L2NameFormat = "$d" else: L2NameFormat = cfg.get('sync', 'l2_name_format') name = l2domain['name'] return name
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 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 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 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(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 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 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 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 calcL3SubnetName(nc, vsd_subnet): if not cfg.has_option('sync', 'l3_name_format'): L3NameFormat = "$d ($z) \ $s" else: L3NameFormat = cfg.get('sync', 'l3_name_format') name = L3NameFormat name = name.replace('$s', vsd_subnet['name']) if '$d' in L3NameFormat: zone = nc.get("zones/%s" % vsd_subnet['parentID']).obj()[0] domain = nc.get("domains/%s" % zone['parentID']).obj()[0] name = name.replace('$d', domain['name']) if '$z' in L3NameFormat: name = name.replace('$z', zone['name']) elif '$z' in L3NameFormat: zone = nc.get("zones/%s" % vsd_subnet['parentID']).obj()[0] name = name.replace('$z', zone['name']) return name
def calcL3SubnetName(nc,vsd_subnet): if not cfg.has_option('sync','l3_name_format'): L3NameFormat = "$d ($z) \ $s" else: L3NameFormat = cfg.get('sync','l3_name_format') name = L3NameFormat name = name.replace('$s',vsd_subnet['name']) if '$d' in L3NameFormat: zone = nc.get("zones/%s" % vsd_subnet['parentID']).obj()[0] domain = nc.get("domains/%s" % zone['parentID']).obj()[0] name = name.replace('$d',domain['name']) if '$z' in L3NameFormat: name = name.replace('$z',zone['name']) elif '$z' in L3NameFormat: zone = nc.get("zones/%s" % vsd_subnet['parentID']).obj()[0] name = name.replace('$z',zone['name']) return name
def delete_vsdobjects_in_tenant(tenant_name): logger.info("Deleting all VSD objects for tenant: {0}".format(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 == \"{0}\"".format(tenant_name)).obj()[0] # Get and delete all the active domains in the enterprise try: domains = nc.get("enterprises/{0}/domains".format( enterprise['ID'])).obj() # Delete each L3 domain for domain in domains: nc.put("domains/{0}".format(domain["ID"]), {"maintenanceMode": "ENABLED"}) vports = nc.get("domains/{0}/vports".format(domain["ID"])).obj() for vport in vports: logger.info("VSD - Deleting vport: {0}".format(vport["ID"])) if vport["type"] == "BRIDGE": logger.info("VSD - Deleting bridgeport") try: nc.delete("bridgeinterfaces/{0}".format( nc.get("vports/{0}/bridgeinterfaces".format( 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/{0}/hostinterfaces".format( vport["ID"])).obj() nc.delete("hostinterfaces/{0}".format( hostport[0]["ID"])) except Exception, e: logger.info("VSD - no host interface found") logger.error(repr(e)) sleep(2) alarms = nc.get("vports/{0}/alarms".format(vport["ID"])).obj() for alarm in alarms: try: nc.delete("alarms/{0}".format(alarm["ID"])) except Exception, e: logger.info("VSD - while deleting alarm") logger.error(repr(e)) nc.delete("vports/{0}".format(vport["ID"]))
def vsd_subnet_exists(os_nw, mapping): 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')) logger.debug("Checking if Openstack network(%s,%s) exists in the VSD" % (os_nw['id'], os_nw['name'])) try: vsd_subnet = nc.get("subnets/%s" % mapping["nuage_subnet_id"]).obj()[0] except Exception, e: try: vsd_subnet = nc.get("l2domains/%s" % mapping["nuage_subnet_id"]).obj()[0] except Exception, e: logger.info( "|- Subnet (%s - ID:%s) not found in VSD --> Removing" % (os_nw['name'], os_nw['id'])) vsd_subnet = []
logger.error("|- ERROR tenant {0} already exists in keystone".format(tenant_name)) os_tenant = keystone.tenants.find(name="{0}".format(tenant_name)) else: os_tenant = keystone.tenants.create(tenant_name="{0}".format(tenant_name), description="VSD Managed Openstack Tenant", enabled=True) except Exception, e: logger.error("|- ERROR creating tenant {0} in keystone".format(tenant_name)) logger.error(repr(e)) try: admin_role = keystone.roles.find(name='admin') except Exception, e: logger.error("|- ERROR finding admin role in keystone") logger.error(repr(e)) try: os_admin = keystone.users.find(name=cfg.get('openstack', 'admin_username')) except Exception, e: logger.error("|- ERROR finding user {0} in keystone".format(cfg.get('openstack', 'admin_username'))) logger.error(repr(e)) try: logger.info("Adding admin role for user {0} in tenant {1} in keystone".format( cfg.get('openstack', 'admin_username'), tenant_name)) keystone.roles.add_user_role(os_admin, admin_role, os_tenant) except Exception, e: logger.error("|- ERROR adding admin role for user {0} in tenant {1} in keystone".format( cfg.get('openstack', 'admin_username'), tenant_name)) logger.error(repr(e)) neutron_creds = get_neutron_creds(cfg.get('openstack', 'admin_username'), cfg.get('openstack', 'admin_password'), "admin") neutron = neutronclient.Client(**neutron_creds) try:
def get_admin_nova_creds(tenant_name): return {'version': "2", 'username': cfg.get('openstack', 'admin_username'), 'api_key': cfg.get('openstack', 'admin_password'), 'auth_url': cfg.get('openstack', 'auth_url'), 'project_id': tenant_name, 'service_type': "compute"}
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)) try: admin_role = keystone.roles.find(name='admin') except Exception, e: logger.error("|- ERROR finding admin role in keystone") logger.error(repr(e)) try: os_admin = keystone.users.find( name=cfg.get('openstack', 'admin_username')) except Exception, e: logger.error("|- ERROR finding user %s in keystone" % cfg.get('openstack', 'admin_username')) logger.error(repr(e)) try: logger.info("Adding admin role for user %s in tenant %s in keystone" % (cfg.get('openstack', 'admin_username'), tenant_name)) keystone.roles.add_user_role(os_admin, admin_role, os_tenant) except Exception, e: logger.error( "|- ERROR adding admin role for user %s in tenant %s in keystone" % (cfg.get('openstack', 'admin_username'), tenant_name)) logger.error(repr(e)) neutron_creds = get_neutron_creds(cfg.get('openstack', 'admin_username'), cfg.get('openstack', 'admin_password'),
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
def get_keystone_creds(): return {'username': cfg.get('openstack', 'admin_username'), 'password': cfg.get('openstack', 'admin_password'), 'auth_url': cfg.get('openstack', 'auth_url'), 'tenant_name': "admin"}
def get_neutron_creds(user, pw, tenant): return {'username': user, 'password': pw, 'auth_url': cfg.get('openstack', 'auth_url'), 'tenant_name': tenant}
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)) try: admin_role = keystone.roles.find(name='admin') except Exception, e: logger.error("|- ERROR finding admin role in keystone") logger.error(repr(e)) try: os_admin = keystone.users.find(name=cfg.get('openstack','admin_username')) except Exception, e: logger.error("|- ERROR finding user %s in keystone" % cfg.get('openstack','admin_username')) logger.error(repr(e)) try: logger.info("Adding admin role for user %s in tenant %s in keystone" % (cfg.get('openstack','admin_username'),tenant_name)) keystone.roles.add_user_role(os_admin, admin_role, os_tenant) except Exception, e: logger.error("|- ERROR adding admin role for user %s in tenant %s in keystone" % (cfg.get('openstack','admin_username'),tenant_name)) logger.error(repr(e)) neutron_creds = get_neutron_creds(cfg.get('openstack','admin_username'), cfg.get('openstack','admin_password'), "admin") neutron = neutronclient.Client(**neutron_creds) try: logger.info("Creating Net-Partition: %s" % tenant_name) body_netpart = {"net_partition": {