Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
    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")
Пример #4
0
    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")
Пример #5
0
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
Пример #6
0
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 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)
Пример #8
0
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
Пример #9
0
    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)
Пример #10
0
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
Пример #11
0
    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)
Пример #12
0
    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)
Пример #13
0
    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))