def delete(self, namespace): if not namespace: return error(400, 'no namespace specified') if namespace == 'system': return error(403, 'you cannot delete the system namespace') # The namespace must be empty instances = [] deleted_instances = [] for i in db.get_instances(all=True, namespace=namespace): if i['state'] in ['deleted', 'error']: deleted_instances.append(i['uuid']) else: instances.append(i['uuid']) if len(instances) > 0: return error(400, 'you cannot delete a namespace with instances') networks = [] deleted_networks = [] for n in db.get_networks(all=True, namespace=namespace): if n['state'] in ['deleted', 'error']: deleted_networks.append(n['uuid']) else: networks.append(n['uuid']) if len(networks) > 0: return error(400, 'you cannot delete a namespace with networks') db.delete_namespace(namespace) db.delete_metadata('namespace', namespace)
def delete(self, confirm=False, namespace=None): """Delete all networks in the namespace.""" if confirm is not True: return error(400, 'parameter confirm is not set true') if get_jwt_identity() == 'system': if not isinstance(namespace, str): # A client using a system key must specify the namespace. This # ensures that deleting all networks in the cluster (by # specifying namespace='system') is a deliberate act. return error(400, 'system user must specify parameter namespace') else: if namespace and namespace != get_jwt_identity(): return error(401, 'you cannot delete other namespaces') namespace = get_jwt_identity() networks_del = [] networks_unable = [] for n in list(db.get_networks(all=all, namespace=namespace)): if n['uuid'] == 'floating': continue if len(list(db.get_network_interfaces(n['uuid']))) > 0: logutil.info([n], 'Network in use, cannot be deleted by delete-all') networks_unable.append(n['uuid']) continue if n['state'] == 'deleted': continue _delete_network(n) networks_del.append(n['uuid']) if networks_unable: return error(403, { 'deleted': networks_del, 'unable': networks_unable }) return networks_del
def _maintain_networks(self): LOG.info('Maintaining networks') # Discover what networks are present _, _, vxid_to_mac = util.discover_interfaces() # Determine what networks we should be on host_networks = [] seen_vxids = [] if not util.is_network_node(): # For normal nodes, just the ones we have instances for for inst in list(db.get_instances(only_node=config.parsed.get('NODE_NAME'))): for iface in db.get_instance_interfaces(inst['uuid']): if not iface['network_uuid'] in host_networks: host_networks.append(iface['network_uuid']) else: # For network nodes, its all networks for n in db.get_networks(): host_networks.append(n['uuid']) # Network nodes also look for interfaces for absent instances # and delete them for ni in db.get_network_interfaces(n['uuid']): inst = db.get_instance(ni['instance_uuid']) if (not inst or inst.get('state', 'unknown') in ['deleted', 'error', 'unknown']): db.hard_delete_network_interface(ni['uuid']) LOG.withInstance( ni['instance_uuid']).withNetworkInterface( ni['uuid']).info('Hard deleted stray network interface') # Ensure we are on every network we have a host for for network in host_networks: try: n = net.from_db(network) if not n: continue if n.db_entry['state_updated'] - time.time() < 60: # Network state changed in the last minute, punt for now continue if not n.is_okay(): LOG.withObj(n).info('Recreating not okay network') n.create() n.ensure_mesh() seen_vxids.append(n.vxlan_id) except exceptions.LockException as e: LOG.warning( 'Failed to acquire lock while maintaining networks: %s' % e) # Determine if there are any extra vxids extra_vxids = set(vxid_to_mac.keys()) - set(seen_vxids) # Delete "deleted" SF networks and log unknown vxlans if extra_vxids: LOG.withField('vxids', extra_vxids).warning( 'Extra vxlans present!') # Determine the network uuids for those vxids # vxid_to_uuid = {} # for n in db.get_networks(): # vxid_to_uuid[n['vxid']] = n['uuid'] # for extra in extra_vxids: # if extra in vxid_to_uuid: # with db.get_lock('network', None, vxid_to_uuid[extra], # ttl=120, op='Network reap VXLAN'): # n = net.from_db(vxid_to_uuid[extra]) # n.delete() # LOG.info('Extra vxlan %s (network %s) removed.' # % (extra, vxid_to_uuid[extra])) # else: # LOG.error('Extra vxlan %s does not map to any network.' # % extra) # And record vxids in the database db.persist_node_vxid_mapping( config.parsed.get('NODE_NAME'), vxid_to_mac)
def get(self, all=False): return list(db.get_networks(all=all, namespace=get_jwt_identity()))
def get(self): return list(db.get_networks())