def delete_network(request, network_id): # Normal Response Code: 204 # Error Response Codes: computeFault (400, 500), # serviceUnavailable (503), # unauthorized (401), # forbidden (403) # itemNotFound (404), # overLimit (413) log.info('delete_network %s', network_id) net = util.get_network(network_id, request.user_uniq, for_update=True) if net.public: raise faults.Forbidden('Can not delete the public network.') if net.deleted: raise faults.BadRequest("Network has been deleted.") if net.machines.all(): # Nics attached on network raise faults.NetworkInUse('Machines are connected to network.') net.action = 'DESTROY' net.save() backend_networks = net.backend_networks.exclude(operstate="DELETED") for bnet in backend_networks: backend.delete_network(net, bnet.backend) if not backend_networks: backend.update_network_state(net) return HttpResponse(status=204)
def handle(self, *args, **options): write = self.stdout.write if len(args) < 1: raise CommandError("Please provide a backend ID") backend = common.get_resource("backend", args[0], for_update=True) write("Trying to remove backend: %s\n" % backend.clustername) if backend.virtual_machines.filter(deleted=False).exists(): raise CommandError('Backend hosts non-deleted vms. Cannot delete') # Get networks before deleting backend, because after deleting the # backend, all BackendNetwork objects are deleted! networks = [bn.network for bn in backend.networks.all()] try: delete_backend(backend) except models.ProtectedError as e: msg = ("Cannot delete backend because it contains" "non-deleted VMs:\n%s" % e) raise CommandError(msg) write('Successfully removed backend from DB.\n') if networks: write("Clearing networks from %s..\n" % backend.clustername) for network in networks: backend_mod.delete_network(network=network, backend=backend) write("Successfully issued jobs to remove all networks.\n")
def delete(network_id, credentials, atomic_context=None): network = util.get_network(network_id, credentials, for_update=True, non_deleted=True) if network.public and not credentials.is_admin: raise faults.Forbidden("Cannot delete the public network.") validate_network_action(network, "DESTROY") if network.nics.exists(): raise faults.Conflict("Cannot delete network. There are ports still" " configured on network network %s" % network.id) if network.ips.filter(deleted=False, floating_ip=True).exists(): msg = "Cannot delete netowrk. Network has allocated floating IPs." raise faults.Conflict(msg) network.action = "DESTROY" # Mark network as drained to prevent automatic allocation of # public/floating IPs while the network is being deleted if network.public: network.drained = True network.save() # Delete network to all backends that exists for bnet in network.backend_networks.exclude(operstate="DELETED"): backend_mod.delete_network(network, bnet.backend) else: # If network does not exist in any backend, update the network state backend_mod.update_network_state(network, atomic_context=atomic_context) return network
def reconcile_orphan_networks(db_networks, ganeti_networks): # Detect Orphan Networks in Ganeti db_network_ids = set([net.id for net in db_networks]) for back_end, ganeti_networks in ganeti_networks.items(): ganeti_network_ids = set(ganeti_networks.keys()) orphans = ganeti_network_ids - db_network_ids if len(orphans) > 0: write('D: Orphan Networks in backend %s:\n' % back_end.clustername) write('- ' + '\n- '.join([str(o) for o in orphans]) + '\n') if fix: for net_id in orphans: write('Disconnecting and deleting network %d\n' % net_id) try: network = Network.objects.get(id=net_id) backend_mod.delete_network(network, backend=back_end) except Network.DoesNotExist: write("Not entry for network %s in DB !!\n" % net_id)
def delete(network): if network.nics.exists(): raise faults.Conflict("Cannot delete network. There are ports still" " configured on network network %s" % network.id) if network.ips.filter(deleted=False, floating_ip=True).exists(): msg = "Cannot delete netowrk. Network has allocated floating IPs." raise faults.Conflict(msg) network.action = "DESTROY" # Mark network as drained to prevent automatic allocation of # public/floating IPs while the network is being deleted if network.public: network.drained = True network.save() # Delete network to all backends that exists for bnet in network.backend_networks.exclude(operstate="DELETED"): backend_mod.delete_network(network, bnet.backend) else: # If network does not exist in any backend, update the network state backend_mod.update_network_state(network) return network
def handle(self, *args, **options): if len(args) < 1: raise CommandError("Please provide a network ID") network = get_network(args[0]) self.stdout.write('Trying to remove network: %s\n' % str(network)) if network.machines.exists(): raise CommandError('Network is not empty. Can not delete') network.action = 'DESTROY' network.save() if network.userid: quotas.issue_and_accept_commission(network, delete=True) for bnet in network.backend_networks.exclude(operstate="DELETED"): delete_network(network, bnet.backend) self.stdout.write("Successfully submitted Ganeti jobs to" " remove network %s" % network.backend_id)
def _reconcile_orphan_networks(self): db_networks = self.networks ganeti_networks = self.ganeti_networks # Detect Orphan Networks in Ganeti db_network_ids = set([net.id for net in db_networks]) for back_end, ganeti_networks in ganeti_networks.items(): ganeti_network_ids = set(ganeti_networks.keys()) orphans = ganeti_network_ids - db_network_ids if len(orphans) > 0: self.log.info('D: Orphan Networks in backend %s:', back_end.clustername) self.log.info('- ' + '\n- '.join([str(o) for o in orphans])) if self.fix: for net_id in orphans: self.log.info('Disconnecting and deleting network %d', net_id) try: network = Network.objects.get(id=net_id) backend_mod.delete_network(network, backend=back_end) except Network.DoesNotExist: self.log.info("Not entry for network %s in DB !!", net_id)
def handle(self, *args, **options): if len(args) != 1: raise CommandError("Please provide a network ID") network = get_network(args[0]) new_name = options.get("name") if new_name is not None: old_name = network.name network = networks.rename(network, new_name) self.stdout.write("Renamed network '%s' from '%s' to '%s'.\n" % (network, old_name, new_name)) drained = options.get("drained") if drained is not None: drained = parse_bool(drained) network.drained = drained network.save() self.stdout.write("Set network '%s' as drained=%s.\n" % (network, drained)) new_owner = options.get("userid") if new_owner is not None: if "@" in new_owner: raise CommandError("Invalid owner UUID.") old_owner = network.userid network.userid = new_owner network.save() msg = "Changed the owner of network '%s' from '%s' to '%s'.\n" self.stdout.write(msg % (network, old_owner, new_owner)) floating_ip_pool = options["floating_ip_pool"] if floating_ip_pool is not None: floating_ip_pool = parse_bool(floating_ip_pool) if floating_ip_pool is False and network.floating_ip_pool is True: if network.ips.filter(deleted=False, floating_ip=True)\ .exists(): msg = ("Cannot make network a non floating IP pool." " There are still reserved floating IPs.") raise CommandError(msg) network.floating_ip_pool = floating_ip_pool network.save() self.stdout.write("Set network '%s' as floating-ip-pool=%s.\n" % (network, floating_ip_pool)) if floating_ip_pool is True: for backend in Backend.objects.filter(offline=False): bnet, jobs =\ backend_mod.ensure_network_is_active(backend, network.id) if jobs: msg = ("Sent job to create network '%s' in backend" " '%s'\n" % (network, backend)) self.stdout.write(msg) add_reserved_ips = options.get('add_reserved_ips') remove_reserved_ips = options.get('remove_reserved_ips') if add_reserved_ips or remove_reserved_ips: if add_reserved_ips: add_reserved_ips = add_reserved_ips.split(",") for ip in add_reserved_ips: network.reserve_address(ip, external=True) if remove_reserved_ips: remove_reserved_ips = remove_reserved_ips.split(",") for ip in remove_reserved_ips: network.release_address(ip, external=True) add_to_backend = options["add_to_backend"] if add_to_backend is not None: backend = get_backend(add_to_backend) bnet, jobs = backend_mod.ensure_network_is_active(backend, network.id) if jobs: msg = "Sent job to create network '%s' in backend '%s'\n" self.stdout.write(msg % (network, backend)) remove_from_backend = options["remove_from_backend"] if remove_from_backend is not None: backend = get_backend(remove_from_backend) if network.nics.filter(machine__backend=backend, machine__deleted=False).exists(): msg = "Cannot remove. There are still connected VMs to this"\ " network" raise CommandError(msg) backend_mod.delete_network(network, backend, disconnect=True) msg = "Sent job to delete network '%s' from backend '%s'\n" self.stdout.write(msg % (network, backend))