Ejemplo n.º 1
0
    def handle(self, *args, **options):
        write = self.stdout.write
        project = options['project']
        flavor_id = options['flavor']

        if len(args) < 1 and not project and not flavor_id:
            raise CommandError("Please provide a flavor-access ID or a "
                               "PROJECT or a FLAVOR")

        if len(args) > 0:
            flavor_access = common.get_resource("flavor-access",
                                                args[0],
                                                for_update=True)
            flavor_access.delete()
            write('Successfully removed flavor-access.\n')
        else:
            flavor_accesses = FlavorAccess.objects
            if flavor_id:
                flavor = common.get_resource("flavor",
                                             flavor_id,
                                             for_update=True)
                flavor_accesses = flavor_accesses.filter(flavor=flavor)
            if project:
                flavor_accesses = flavor_accesses.filter(project=project)

            flavor_accesses.delete()
            write('Successfully removed flavor-accesses.\n')
Ejemplo n.º 2
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a server ID")

        server = get_resource("server", args[0], for_update=True)

        new_name = options.get("name", None)
        if new_name is not None:
            old_name = server.name
            server = servers.rename(server, new_name)
            self.stdout.write("Renamed server '%s' from '%s' to '%s'\n" %
                              (server, old_name, new_name))

        suspended = options.get("suspended", None)
        if suspended is not None:
            suspended = parse_bool(suspended)
            server.suspended = suspended
            server.save()
            self.stdout.write("Set server '%s' as suspended=%s\n" %
                              (server, suspended))

        new_owner = options.get('user')
        if new_owner is not None:
            if "@" in new_owner:
                raise CommandError("Invalid user UUID.")
            if new_owner == server.userid:
                self.stdout.write("%s is already server owner.\n" % new_owner)
            else:
                servers.change_owner(server, new_owner)
                self.stdout.write(
                    "WARNING: User quotas should be out of sync now,"
                    " run `snf-manage reconcile-resources-cyclades'"
                    " to review and update them.\n")

        wait = parse_bool(options["wait"])
        new_flavor_id = options.get("flavor")
        if new_flavor_id is not None:
            new_flavor = get_resource("flavor", new_flavor_id)
            old_flavor = server.flavor
            msg = "Resizing server '%s' from flavor '%s' to '%s'.\n"
            self.stdout.write(msg % (server, old_flavor, new_flavor))
            server = servers.resize(server, new_flavor)
            wait_server_task(server, wait, stdout=self.stdout)

        action = options.get("action")
        if action is not None:
            if action == "start":
                server = servers.start(server)
            elif action == "stop":
                server = servers.stop(server)
            elif action == "reboot_hard":
                server = servers.reboot(server, reboot_type="HARD")
            elif action == "reboot_soft":
                server = servers.reboot(server, reboot_type="SOFT")
            else:
                raise CommandError("Unknown action.")
            wait_server_task(server, wait, stdout=self.stdout)
Ejemplo n.º 3
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a server ID")

        server = get_resource("server", args[0], for_update=True)

        new_name = options.get("name", None)
        if new_name is not None:
            old_name = server.name
            server = servers.rename(server, new_name)
            self.stdout.write("Renamed server '%s' from '%s' to '%s'\n" %
                              (server, old_name, new_name))

        suspended = options.get("suspended", None)
        if suspended is not None:
            suspended = parse_bool(suspended)
            server.suspended = suspended
            server.save()
            self.stdout.write("Set server '%s' as suspended=%s\n" %
                              (server, suspended))

        new_owner = options.get('user')
        if new_owner is not None:
            if "@" in new_owner:
                raise CommandError("Invalid user UUID.")
            old_owner = server.userid
            server.userid = new_owner
            server.save()
            msg = "Changed the owner of server '%s' from '%s' to '%s'.\n"
            self.stdout.write(msg % (server, old_owner, new_owner))

        wait = parse_bool(options["wait"])
        new_flavor_id = options.get("flavor")
        if new_flavor_id is not None:
            new_flavor = get_resource("flavor", new_flavor_id)
            old_flavor = server.flavor
            msg = "Resizing server '%s' from flavor '%s' to '%s'.\n"
            self.stdout.write(msg % (server, old_flavor, new_flavor))
            server = servers.resize(server, new_flavor)
            wait_server_task(server, wait, stdout=self.stdout)

        action = options.get("action")
        if action is not None:
            if action == "start":
                server = servers.start(server)
            elif action == "stop":
                server = servers.stop(server)
            elif action == "reboot_hard":
                server = servers.reboot(server, reboot_type="HARD")
            elif action == "reboot_stof":
                server = servers.reboot(server, reboot_type="SOFT")
            else:
                raise CommandError("Unknown action.")
            wait_server_task(server, wait, stdout=self.stdout)
Ejemplo n.º 4
0
    def handle(self, *args, **options):
        if args:
            raise CommandError("Command doesn't accept any arguments")

        name = options['name']
        user_id = options['user_id']
        project = options['project']
        backend_id = options['backend_id']
        image_id = options['image_id']
        flavor_id = options['flavor_id']
        password = options['password']
        volumes = options['volumes']
        helper_vm = options['helper_vm']

        if not name:
            raise CommandError("name is mandatory")
        if not user_id:
            raise CommandError("user is mandatory")
        if not project:
            project = user_id
        if not password:
            raise CommandError("password is mandatory")
        if not flavor_id:
            raise CommandError("flavor is mandatory")
        if not image_id and not volumes:
            raise CommandError("image is mandatory")

        flavor = common.get_resource("flavor", flavor_id)
        if image_id is not None:
            common.get_image(image_id, user_id)

        if backend_id:
            backend = common.get_resource("backend", backend_id)
        else:
            backend = None

        connection_list = parse_connections(options["connections"])
        volumes_list = parse_volumes(volumes)
        credentials = Credentials(user_id)
        server = servers.create(credentials,
                                name,
                                password,
                                flavor,
                                image_id,
                                networks=connection_list,
                                volumes=volumes_list,
                                use_backend=backend,
                                helper=helper_vm,
                                project=project)
        pprint.pprint_server(server, stdout=self.stdout)

        wait = parse_bool(options["wait"])
        common.wait_server_task(server, wait, self.stdout)
Ejemplo n.º 5
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a server ID")

        server = get_resource("server", args[0], for_update=True)

        new_name = options.get("name", None)
        if new_name is not None:
            old_name = server.name
            server = servers.rename(server, new_name)
            self.stdout.write("Renamed server '%s' from '%s' to '%s'\n" % (server, old_name, new_name))

        suspended = options.get("suspended", None)
        if suspended is not None:
            suspended = parse_bool(suspended)
            server.suspended = suspended
            server.save()
            self.stdout.write("Set server '%s' as suspended=%s\n" % (server, suspended))

        new_owner = options.get("user")
        if new_owner is not None:
            if "@" in new_owner:
                raise CommandError("Invalid user UUID.")
            old_owner = server.userid
            server.userid = new_owner
            server.save()
            msg = "Changed the owner of server '%s' from '%s' to '%s'.\n"
            self.stdout.write(msg % (server, old_owner, new_owner))

        wait = parse_bool(options["wait"])
        new_flavor_id = options.get("flavor")
        if new_flavor_id is not None:
            new_flavor = get_resource("flavor", new_flavor_id)
            old_flavor = server.flavor
            msg = "Resizing server '%s' from flavor '%s' to '%s'.\n"
            self.stdout.write(msg % (server, old_flavor, new_flavor))
            server = servers.resize(server, new_flavor)
            wait_server_task(server, wait, stdout=self.stdout)

        action = options.get("action")
        if action is not None:
            if action == "start":
                server = servers.start(server)
            elif action == "stop":
                server = servers.stop(server)
            elif action == "reboot_hard":
                server = servers.reboot(server, reboot_type="HARD")
            elif action == "reboot_stof":
                server = servers.reboot(server, reboot_type="SOFT")
            else:
                raise CommandError("Unknown action.")
            wait_server_task(server, wait, stdout=self.stdout)
Ejemplo n.º 6
0
def import_server(instance_name, backend_id, flavor_id, image_id, user_id,
                  new_public_nic, stream):
    flavor = common.get_resource("flavor", flavor_id)
    backend = common.get_resource("backend", backend_id)

    backend_client = backend.get_client()

    try:
        instance = backend_client.GetInstance(instance_name)
    except GanetiApiError as e:
        if e.code == 404:
            raise CommandError("Instance %s does not exist in backend %s"
                               % (instance_name, backend))
        else:
            raise CommandError("Unexpected error: %s" % e)

    if not new_public_nic:
        check_instance_nics(instance, stream)

    shutdown_instance(instance, backend_client, stream=stream)

    # Create the VM in DB
    stream.write("Creating VM entry in DB\n")
    vm = VirtualMachine.objects.create(name=instance_name,
                                       backend=backend,
                                       userid=user_id,
                                       imageid=image_id,
                                       flavor=flavor)

    quotas.issue_and_accept_commission(vm)

    if new_public_nic:
        remove_instance_nics(instance, backend_client,
                             stream=stream)

    # Rename instance
    rename_instance(instance_name, vm.backend_vm_id, backend_client,
                    stream)

    if new_public_nic:
        ports = servers.create_instance_ports(user_id)
        stream.write("Adding new NICs to server")
        [servers.associate_port_with_machine(port, vm)
         for port in ports]
        [connect_to_network(vm, port) for port in ports]

    # Startup instance
    startup_instance(vm.backend_vm_id, backend_client, stream=stream)

    backend.put_client(backend_client)
    return
Ejemplo n.º 7
0
    def handle(self, *args, **options):
        if args:
            raise CommandError("Command doesn't accept any arguments")

        name = options['name']
        user_id = options['user_id']
        project = options['project']
        backend_id = options['backend_id']
        image_id = options['image_id']
        flavor_id = options['flavor_id']
        password = options['password']
        volumes = options['volumes']
        helper_vm = options['helper_vm']

        if not name:
            raise CommandError("name is mandatory")
        if not user_id:
            raise CommandError("user is mandatory")
        if not project:
            project = user_id
        if not password:
            raise CommandError("password is mandatory")
        if not flavor_id:
            raise CommandError("flavor is mandatory")
        if not image_id and not volumes:
            raise CommandError("image is mandatory")

        flavor = common.get_resource("flavor", flavor_id)
        if image_id is not None:
            common.get_image(image_id, user_id)

        if backend_id:
            backend = common.get_resource("backend", backend_id)
        else:
            backend = None

        connection_list = parse_connections(options["connections"])
        volumes_list = parse_volumes(volumes)
        credentials = Credentials(user_id)
        server = servers.create(credentials, name, password, flavor, image_id,
                                networks=connection_list,
                                volumes=volumes_list,
                                use_backend=backend, helper=helper_vm,
                                project=project)
        pprint.pprint_server(server, stdout=self.stdout)

        wait = parse_bool(options["wait"])
        common.wait_server_task(server, wait, self.stdout)
Ejemplo n.º 8
0
def import_server(instance_name, backend_id, flavor_id, image_id, user_id,
                  new_public_nic, stream):
    flavor = common.get_resource("flavor", flavor_id)
    backend = common.get_resource("backend", backend_id)

    backend_client = backend.get_client()

    try:
        instance = backend_client.GetInstance(instance_name)
    except GanetiApiError as e:
        if e.code == 404:
            raise CommandError("Instance %s does not exist in backend %s" %
                               (instance_name, backend))
        else:
            raise CommandError("Unexpected error: %s" % e)

    if not new_public_nic:
        check_instance_nics(instance, stream)

    shutdown_instance(instance, backend_client, stream=stream)

    # Create the VM in DB
    stream.write("Creating VM entry in DB\n")
    vm = VirtualMachine.objects.create(name=instance_name,
                                       backend=backend,
                                       userid=user_id,
                                       imageid=image_id,
                                       flavor=flavor)

    quotas.issue_and_accept_commission(vm)

    if new_public_nic:
        remove_instance_nics(instance, backend_client, stream=stream)

    # Rename instance
    rename_instance(instance_name, vm.backend_vm_id, backend_client, stream)

    if new_public_nic:
        ports = servers.create_instance_ports(user_id)
        stream.write("Adding new NICs to server")
        [servers.associate_port_with_machine(port, vm) for port in ports]
        [connect_to_network(vm, port) for port in ports]

    # Startup instance
    startup_instance(vm.backend_vm_id, backend_client, stream=stream)

    backend.put_client(backend_client)
    return
Ejemplo n.º 9
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a volume ID")

        volume_type = common.get_resource("volume-type", args[0])

        pprint.pprint_volume_type(volume_type, stdout=self.stdout)
Ejemplo n.º 10
0
    def handle(self, *args, **options):
        if len(args) < 1:
            raise CommandError("Please provide a flavor ID")

        flavor = common.get_resource("flavor", args[0])

        pprint.pprint_flavor(flavor, stdout=self.stdout)
Ejemplo n.º 11
0
    def handle(self, *args, **options):
        if args:
            raise CommandError("Command doesn't accept any arguments")

        network_id = options['network_id']
        address = options['address']
        user = options['user']
        project = options['project']

        if not user:
            raise CommandError("'user' is required for floating IP creation")
        if not project:
            project = user

        if network_id is not None:
            network = common.get_resource("network", network_id)
            if network.deleted:
                raise CommandError("Network '%s' is deleted" % network.id)
            if not network.floating_ip_pool:
                raise CommandError("Network '%s' is not a floating IP pool." %
                                   network)

        credentials = Credentials(user)
        floating_ip = ips.create_floating_ip(credentials,
                                             project=project,
                                             network_id=network_id,
                                             address=address)

        self.stdout.write("Created floating IP '%s'.\n" % floating_ip)
Ejemplo n.º 12
0
    def handle(self, *args, **options):
        if not args:
            raise CommandError("Please provide a port ID")

        force = options['force']
        message = "ports" if len(args) > 1 else "port"
        self.confirm_deletion(force, message, args)

        for port_id in args:
            self.stdout.write("\n")
            try:
                with transaction.atomic():
                    port = common.get_resource("port",
                                               port_id,
                                               for_update=True)
                    machine = port.machine
                    servers._delete_port(port)

                wait = parse_bool(options["wait"])
                if machine is not None:
                    common.wait_server_task(machine, wait, stdout=self.stdout)
                else:
                    self.stdout.write("Successfully removed port %s\n" % port)
            except CommandError as e:
                self.stdout.write("Error -- %s\n" % e.message)
Ejemplo n.º 13
0
    def handle(self, *args, **options):
        if args:
            raise CommandError("Command doesn't accept any arguments")

        network_id = options['network_id']
        address = options['address']
        user = options['user']

        if not user:
            raise CommandError("'user' is required for floating IP creation")

        if network_id is not None:
            network = common.get_resource("network",
                                          network_id,
                                          for_update=True)
            if network.deleted:
                raise CommandError("Network '%s' is deleted" % network.id)
            if not network.floating_ip_pool:
                raise CommandError("Network '%s' is not a floating IP pool." %
                                   network)
        else:
            network = None

        floating_ip = ips.create_floating_ip(userid=user,
                                             network=network,
                                             address=address)

        self.stdout.write("Created floating IP '%s'.\n" % floating_ip)
Ejemplo n.º 14
0
    def handle(self, *args, **options):
        if args:
            raise CommandError("Command doesn't accept any arguments")

        network_id = options['network_id']
        address = options['address']
        user = options['user']
        project = options['project']

        if not user:
            raise CommandError("'user' is required for floating IP creation")
        if not project:
            project = user

        if network_id is not None:
            network = common.get_resource("network", network_id)
            if network.deleted:
                raise CommandError("Network '%s' is deleted" % network.id)
            if not network.floating_ip_pool:
                raise CommandError("Network '%s' is not a floating IP pool."
                                   % network)

        credentials = Credentials(user)
        floating_ip = ips.create_floating_ip(credentials,
                                             project=project,
                                             network_id=network_id,
                                             address=address)

        self.stdout.write("Created floating IP '%s'.\n" % floating_ip)
Ejemplo n.º 15
0
    def handle(self, *args, **options):
        if not args:
            raise CommandError("Please provide a volume ID")

        force = options['force']
        message = "volumes" if len(args) > 1 else "volume"
        self.confirm_deletion(force, message, args)

        for volume_id in args:
            self.stdout.write("\n")
            try:
                volume = common.get_resource("volume",
                                             volume_id,
                                             for_update=True)
                volumes.delete(volume)

                wait = parse_bool(options["wait"])
                if volume.machine is not None:
                    volume.machine.task_job_id = volume.backendjobid
                    common.wait_server_task(volume.machine,
                                            wait,
                                            stdout=self.stdout)
                else:
                    self.stdout.write("Successfully removed volume %s\n" %
                                      volume)
            except CommandError as e:
                self.stdout.write("Error -- %s\n" % e.message)
Ejemplo n.º 16
0
    def handle(self, *args, **options):
        if not args:
            raise CommandError("Please provide a server ID")

        force = options['force']
        message = "servers" if len(args) > 1 else "server"
        self.confirm_deletion(force, message, args)

        for server_id in args:
            self.stdout.write("\n")
            try:
                server = get_resource("server", server_id)

                self.stdout.write("Trying to remove server '%s' from backend "
                                  "'%s' \n" % (server.backend_vm_id,
                                               server.backend))

                credentials = Credentials("snf-manage", is_admin=True)
                server = servers.destroy(server_id, credentials=credentials)
                jobID = server.task_job_id

                self.stdout.write("Issued OP_INSTANCE_REMOVE with id: %s\n" %
                                  jobID)

                wait = parse_bool(options["wait"])
                wait_server_task(server, wait, self.stdout)
            except (CommandError, faults.BadRequest) as e:
                self.stdout.write("Error -- %s\n" % e.message)
Ejemplo n.º 17
0
    def handle(self, *args, **options):
        if options["backend"] is not None:
            backend = get_resource("backend", options["backend"])
        else:
            backend = None

        clusters = parse_bool(options["clusters"])
        servers = parse_bool(options["servers"])
        images = parse_bool(options["images"])
        if backend is None:
            ip_pools = parse_bool(options["ip_pools"])
            networks = parse_bool(options["networks"])
        else:
            ip_pools = False
            networks = False

        if options["json_file"] is None:
            stats = statistics.get_cyclades_stats(backend, clusters, servers,
                                                  ip_pools, networks, images)
        else:
            with open(options["json_file"]) as data_file:
                stats = json.load(data_file)

        output_format = options["output_format"]
        if output_format == "json":
            self.stdout.write(json.dumps(stats, indent=4) + "\n")
        elif output_format == "pretty":
            cluster_details = parse_bool(options["cluster_details"])
            pretty_print_stats(stats,
                               self.stdout,
                               cluster_details=cluster_details)
        else:
            raise CommandError("Output format '%s' not supported." %
                               output_format)
Ejemplo n.º 18
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Command accepts only the subnet ID as an"
                               " argument. Use snf-manage subnet-modify --help"
                               " for more info.")

        subnet_id = args[0]
        name = options["name"]

        if not name:
            raise CommandError("--name is mandatory")

        subnet = common.get_resource("subnet", subnet_id, for_update=True)
        user_id = common.get_resource("network", subnet.network.id).userid

        subnets.update_subnet(sub_id=subnet_id, name=name, user_id=user_id)
Ejemplo n.º 19
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a backend ID")

        backend = common.get_resource("backend", args[0], for_update=True)

        # Ensure fields correspondence with options and Backend model
        credentials_changed = False
        fields = ('clustername', 'port', 'username', 'password')
        for field in fields:
            value = options.get(field)
            if value is not None:
                backend.__setattr__(field, value)
                credentials_changed = True

        if credentials_changed:
                # check credentials, if any of them changed!
                common.check_backend_credentials(backend.clustername,
                                                 backend.port,
                                                 backend.username,
                                                 backend.password)
        if options['drained']:
            backend.drained = parse_bool(options['drained'], strict=True)
        if options['offline']:
            backend.offline = parse_bool(options['offline'], strict=True)
        if options['public']:
            backend.public = parse_bool(options['public'], strict=True)
        hypervisor = options["hypervisor"]
        if hypervisor:
            backend.hypervisor = hypervisor

        backend.save()
Ejemplo n.º 20
0
def parse_connections(con_list):
    connections = []
    if con_list:
        for opt in con_list:
            try:
                con_kind = opt.split(":")[0]
                if con_kind == "network":
                    info = opt.split(",")
                    network_id = info[0].split(":")[1]
                    try:
                        address = info[1].split(":")[1]
                    except:
                        address = None
                    if address:
                        val = {"uuid": network_id, "fixed_ip": address}
                    else:
                        val = {"uuid": network_id}
                elif con_kind == "id":
                    port_id = opt.split(":")[1]
                    val = {"port": port_id}
                elif con_kind == "floatingip":
                    fip_id = opt.split(":")[1]
                    fip = common.get_resource("floating-ip",
                                              fip_id,
                                              for_update=True)
                    val = {"uuid": fip.network_id, "fixed_ip": fip.address}
                else:
                    raise CommandError("Unknown argument for option --port")

                connections.append(val)
            except:
                raise CommandError("Malformed information for option --port")
    return connections
Ejemplo n.º 21
0
    def handle(self, *args, **options):
        if not args:
            raise CommandError("Please provide a port ID")

        force = options['force']
        message = "ports" if len(args) > 1 else "port"
        self.confirm_deletion(force, message, args)

        for port_id in args:
            self.stdout.write("\n")
            try:
                with transaction.atomic():
                    port = common.get_resource(
                        "port", port_id, for_update=True)
                    machine = port.machine
                    servers._delete_port(port)

                wait = parse_bool(options["wait"])
                if machine is not None:
                    common.wait_server_task(machine, wait,
                                            stdout=self.stdout)
                else:
                    self.stdout.write("Successfully removed port %s\n" % port)
            except CommandError as e:
                self.stdout.write("Error -- %s\n" % e.message)
Ejemplo n.º 22
0
    def handle(self, *args, **options):
        if args:
            raise CommandError("Command doesn't accept any arguments")

        network_id = options['network_id']
        address = options['address']
        user = options['user']

        if not user:
            raise CommandError("'user' is required for floating IP creation")

        if network_id is not None:
            network = common.get_resource("network", network_id,
                                          for_update=True)
            if network.deleted:
                raise CommandError("Network '%s' is deleted" % network.id)
            if not network.floating_ip_pool:
                raise CommandError("Network '%s' is not a floating IP pool."
                                   % network)
        else:
            network = None

        floating_ip = ips.create_floating_ip(userid=user,
                                             network=network,
                                             address=address)

        self.stdout.write("Created floating IP '%s'.\n" % floating_ip)
Ejemplo n.º 23
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")
Ejemplo n.º 24
0
    def handle(self, *args, **options):
        if not args:
            raise CommandError("Please provide a server ID")

        force = options['force']
        message = "servers" if len(args) > 1 else "server"
        self.confirm_deletion(force, message, args)

        for server_id in args:
            self.stdout.write("\n")
            try:
                server = get_resource("server", server_id)

                self.stdout.write("Trying to remove server '%s' from backend "
                                  "'%s' \n" %
                                  (server.backend_vm_id, server.backend))

                credentials = Credentials("snf-manage", is_admin=True)
                server = servers.destroy(server_id, credentials=credentials)
                jobID = server.task_job_id

                self.stdout.write("Issued OP_INSTANCE_REMOVE with id: %s\n" %
                                  jobID)

                wait = parse_bool(options["wait"])
                wait_server_task(server, wait, self.stdout)
            except (CommandError, faults.BadRequest) as e:
                self.stdout.write("Error -- %s\n" % e.message)
Ejemplo n.º 25
0
def parse_connections(con_list):
    connections = []
    if con_list:
        for opt in con_list:
            try:
                con_kind = opt.split(":")[0]
                if con_kind == "network":
                    info = opt.split(",")
                    network_id = info[0].split(":")[1]
                    try:
                        address = info[1].split(":")[1]
                    except:
                        address = None
                    if address:
                        val = {"uuid": network_id, "fixed_ip": address}
                    else:
                        val = {"uuid": network_id}
                elif con_kind == "id":
                    port_id = opt.split(":")[1]
                    val = {"port": port_id}
                elif con_kind == "floatingip":
                    fip_id = opt.split(":")[1]
                    fip = common.get_resource("floating-ip", fip_id,
                                              for_update=True)
                    val = {"uuid": fip.network_id, "fixed_ip": fip.address}
                else:
                    raise CommandError("Unknown argument for option --port")

                connections.append(val)
            except:
                raise CommandError("Malformed information for option --port")
    return connections
Ejemplo n.º 26
0
    def handle(self, *args, **options):
        if not args:
            raise CommandError("Please provide a volume ID")

        force = options['force']
        message = "volumes" if len(args) > 1 else "volume"
        self.confirm_deletion(force, message, args)

        for volume_id in args:
            self.stdout.write("\n")
            try:
                volume = common.get_resource("volume", volume_id,
                                             for_update=True)
                volumes.delete(volume)

                wait = parse_bool(options["wait"])
                if volume.machine is not None:
                    volume.machine.task_job_id = volume.backendjobid
                    common.wait_server_task(volume.machine, wait,
                                            stdout=self.stdout)
                else:
                    self.stdout.write("Successfully removed volume %s\n"
                                      % volume)
            except CommandError as e:
                self.stdout.write("Error -- %s\n" % e.message)
Ejemplo n.º 27
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")
Ejemplo n.º 28
0
    def handle(self, *args, **options):
        if options["backend"] is not None:
            backend = get_resource("backend", options["backend"])
        else:
            backend = None

        clusters = parse_bool(options["clusters"])
        servers = parse_bool(options["servers"])
        images = parse_bool(options["images"])
        if backend is None:
            ip_pools = parse_bool(options["ip_pools"])
            networks = parse_bool(options["networks"])
        else:
            ip_pools = False
            networks = False

        if options["json_file"] is None:
            stats = statistics.get_cyclades_stats(backend, clusters, servers,
                                                  ip_pools, networks, images)
        else:
            with open(options["json_file"]) as data_file:
                stats = json.load(data_file)

        output_format = options["output_format"]
        if output_format == "json":
            self.stdout.write(json.dumps(stats, indent=4) + "\n")
        elif output_format == "pretty":
            cluster_details = parse_bool(options["cluster_details"])
            pretty_print_stats(stats, self.stdout,
                               cluster_details=cluster_details)
        else:
            raise CommandError("Output format '%s' not supported." %
                               output_format)
Ejemplo n.º 29
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a backend ID")

        backend = common.get_resource("backend", args[0], for_update=True)

        # Ensure fields correspondence with options and Backend model
        credentials_changed = False
        fields = ('clustername', 'port', 'username', 'password')
        for field in fields:
            value = options.get(field)
            if value is not None:
                backend.__setattr__(field, value)
                credentials_changed = True

        if credentials_changed:
                # check credentials, if any of them changed!
                common.check_backend_credentials(backend.clustername,
                                                 backend.port,
                                                 backend.username,
                                                 backend.password)
        if options['drained']:
            backend.drained = parse_bool(options['drained'], strict=True)
        if options['offline']:
            backend.offline = parse_bool(options['offline'], strict=True)
        hypervisor = options["hypervisor"]
        if hypervisor:
            backend.hypervisor = hypervisor

        backend.save()
Ejemplo n.º 30
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a subnet ID.")

        subnet = common.get_resource("subnet", args[0])

        pprint.pprint_subnet_in_db(subnet, stdout=self.stdout)
        self.stdout.write("\n\n")
        pprint.pprint_ippool(subnet, stdout=self.stdout)
Ejemplo n.º 31
0
    def handle(self, *args, **options):
        if not args or len(args) > 1:
            raise CommandError("Command accepts exactly one argument")

        floating_ip_id = args[0]  # this is the floating-ip address
        device = options['machine']

        if not device:
            raise CommandError('Please give either a server or a router id')

        #get the vm
        vm = common.get_resource("server", device)
        floating_ip = common.get_resource("floating-ip", floating_ip_id)
        credentials = Credentials(vm.userid)
        servers.create_port(credentials, floating_ip.network_id,
                            address=floating_ip.address, machine_id=device)

        self.stdout.write("Attached %s to %s.\n" % (floating_ip, vm))
Ejemplo n.º 32
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a floating IP ID")

        ip = common.get_resource("floating-ip", args[0])

        pprint.pprint_floating_ip(ip,
                                  stdout=self.stdout,
                                  display_mails=options["displaymail"])
Ejemplo n.º 33
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Command accepts only the subnet ID as an"
                               " argument. Use snf-manage subnet-modify --help"
                               " for more info.")

        subnet_id = args[0]
        name = options["name"]

        if not name:
            raise CommandError("--name is mandatory")

        subnet = common.get_resource("subnet", subnet_id)
        user_id = common.get_resource("network", subnet.network.id).userid

        subnets.update_subnet(sub_id=subnet_id,
                              name=name,
                              user_id=user_id)
Ejemplo n.º 34
0
    def handle(self, *args, **options):
        if not args or len(args) > 1:
            raise CommandError("Command accepts exactly one argument")

        floating_ip_id = args[0]  # this is the floating-ip address
        device = options['machine']

        if not device:
            raise CommandError('Please give either a server or a router id')

        #get the vm
        vm = common.get_resource("server", device, for_update=True)
        floating_ip = common.get_resource("floating-ip", floating_ip_id,
                                          for_update=True)
        servers.create_port(vm.userid, floating_ip.network,
                            use_ipaddress=floating_ip, machine=vm)

        self.stdout.write("Attached %s to %s.\n" % (floating_ip, vm))
Ejemplo n.º 35
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a volume ID")

        volume = common.get_resource("volume", args[0])

        pprint.pprint_volume(volume,
                             stdout=self.stdout,
                             display_mails=options["displaymail"])
        self.stdout.write('\n\n')
Ejemplo n.º 36
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a volume ID")

        volume = common.get_resource("volume", args[0])

        pprint.pprint_volume(volume, stdout=self.stdout,
                             display_mails=options['displaymail'])
        self.stdout.write('\n\n')

        pprint.pprint_volume_in_ganeti(volume, stdout=self.stdout)
Ejemplo n.º 37
0
    def handle(self, *args, **options):
        write = self.stdout.write
        project = options['project']
        backend_id = options['backend']

        if len(args) < 1 and not project and not backend_id:
            raise CommandError("Please provide a project-backend ID or a "
                               "PROJECT or BACKEND")

        if len(args) > 0:
            project_backend = common.get_resource("project-backend", args[0])
            project_backend.delete()
            write('Successfully removed project-backend mapping.\n')
        else:
            project_backends = ProjectBackend.objects
            if backend_id:
                backend = common.get_resource("backend", backend_id)
                project_backends = project_backends.filter(backend=backend)
            if project:
                project_backends = project_backends.filter(project=project)

            project_backends.delete()
            write('Successfully removed project-backend mappings.\n')
Ejemplo n.º 38
0
    def handle(self, *args, **options):

        if len(args) != 1:
            raise CommandError("Please provide a volume type ID")

        vtype = get_resource("volume-type", args[0], for_update=True)

        # Keep a list with spec keys that are added. If one of these keys
        # appears in the list to be deleted, we should raise an error
        added_keys = []
        spec_add = options.get('spec_add')
        if spec_add:
            spec_regex = re.compile(r'^(?P<key>.+?)=(?P<value>.+)$')

            specs = spec_add.split(',')
            for spec in specs:
                match = spec_regex.match(spec)
                if match is None:
                    raise CommandError("Incorrect spec format. Expected: "
                                       " <key>=<value> ,found: \'%s\' " % spec)
                k, v = match.group('key'), match.group('value')
                spec, _ = vtype.specs.get_or_create(key=k)
                spec.value = v
                spec.save()
                added_keys.append(k)

        spec_delete = options.get('spec_delete')
        if spec_delete:
            spec_keys = spec_delete.split(',')
            for key in spec_keys:
                if key in added_keys:
                    raise CommandError("Cannot add and delete key %s at the "
                                       "same time. If that was the intended "
                                       "action, consider adding first and then"
                                       " deleting it" % key)
                spec = vtype.specs.filter(key=key)
                if not spec:
                    raise CommandError("Spec with key \'%s\' does not exist" %
                                       key)
                spec.delete()

        deleted = options['deleted']
        if deleted:
            deleted = parse_bool(deleted)
            self.stdout.write("Marking volume type '%s' and all related"
                              " flavors as deleted=%s\n" % (vtype.id, deleted))
            vtype.deleted = deleted
            vtype.save()
            vtype.flavors.update(deleted=deleted)
Ejemplo n.º 39
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a volume type ID")

        vtype = get_resource("volume-type", args[0], for_update=True)

        deleted = options['deleted']

        if deleted:
            deleted = parse_bool(deleted)
            self.stdout.write("Marking volume type '%s' and all related"
                              " flavors as deleted=%s\n" % (vtype.id, deleted))
            vtype.deleted = deleted
            vtype.save()
            vtype.flavors.update(deleted=deleted)
Ejemplo n.º 40
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a port ID")

        port = common.get_resource("port", args[0])
        display_mails = options['displaymails']

        pprint.pprint_port(port, display_mails=display_mails,
                           stdout=self.stdout)
        self.stdout.write('\n\n')

        pprint.pprint_port_ips(port, stdout=self.stdout)
        self.stdout.write('\n\n')

        pprint.pprint_port_in_ganeti(port, stdout=self.stdout)
Ejemplo n.º 41
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a port ID")

        port = common.get_resource("port", args[0])
        display_mails = options['displaymails']

        pprint.pprint_port(port,
                           display_mails=display_mails,
                           stdout=self.stdout)
        self.stdout.write('\n\n')

        pprint.pprint_port_ips(port, stdout=self.stdout)
        self.stdout.write('\n\n')

        pprint.pprint_port_in_ganeti(port, stdout=self.stdout)
Ejemplo n.º 42
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a volume ID")

        volume = common.get_resource("volume", args[0], for_update=True)

        name = options.get("name")
        description = options.get("description")
        delete_on_termination = options.get("delete_on_termination")
        if delete_on_termination is not None:
            delete_on_termination = parse_bool(delete_on_termination)

        volume = volumes.update(volume, name, description,
                                delete_on_termination)

        pprint.pprint_volume(volume, stdout=self.stdout)
        self.stdout.write('\n\n')
Ejemplo n.º 43
0
    def handle(self, *args, **options):
        self.add_default_options(options)

        flavor_id = options['flavor_id']
        if not flavor_id:
            raise CommandError("flavor is mandatory")

        # Get the disk template of the helper servers.
        flavor = common.get_resource("flavor", flavor_id)
        disk_template = flavor.volume_type.template

        # Check if we will operate on all online backends or just for a
        # specified one.
        backend_id = options['backend_id']
        if backend_id:
            backend = Backend.objects.get(id=backend_id)
            if disk_template in backend.disk_templates:
                backends = [backend]
            else:
                raise CommandError("backend %s cannot host servers with disk"
                                   " template %s.\nAvailable templates are: %s"
                                   % (backend.clustername, disk_template,
                                      backend.disk_templates))
        else:
            backends = Backend.objects.filter(
                offline=False, disk_templates__contains=disk_template)

        # Check if we will create VMs in parallel
        parallel = options['parallel']
        del options['parallel']

        # Construct a name that will be used for all helper VMs, if the user
        # has not given any.
        if not options['name']:
            options['name'] = "Helper VM"

        # Do the syncing
        if parallel:
            ps = [Process(target=self.sync_servers, args=(backend, options))
                  for backend in backends]
            map(lambda p: p.start(), ps)
            map(lambda p: p.join(), ps)

        else:
            for backend in backends:
                self.sync_servers(backend, options)
Ejemplo n.º 44
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a server ID")

        vm = common.get_resource("server", args[0])

        display_mails = options['displaymails']

        pprint.pprint_server(vm, display_mails=display_mails, stdout=self.stdout)
        self.stdout.write("\n")
        pprint.pprint_server_nics(vm, stdout=self.stdout)
        self.stdout.write("\n")
        pprint.pprint_server_volumes(vm, stdout=self.stdout)
        self.stdout.write("\n")
        pprint.pprint_server_in_ganeti(vm, print_jobs=options["jobs"],
                                       stdout=self.stdout)
        self.stdout.write("\n")
Ejemplo n.º 45
0
    def handle_args(self, *args, **options):
        if options["suspended"]:
            self.filters["suspended"] = True

        if options["backend_id"]:
            backend = get_resource("backend", options["backend_id"])
            self.filters["backend"] = backend.id

        if options["build"]:
            self.filters["operstate"] = "BUILD"

        if options["image_name"]:
            self.fields = ["image.name" if x == "image.id" else x
                           for x in self.fields]

        if "ipv4" in self.fields or "ipv6" in self.fields:
            self.prefetch_related.append("nics__ips__subnet")
Ejemplo n.º 46
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a network ID.")

        network = common.get_resource("network", args[0])
        display_mails = options["displaymail"]

        pprint.pprint_network(network, display_mails=display_mails,
                              stdout=self.stdout)
        self.stdout.write("\n\n")
        pprint.pprint_network_subnets(network, stdout=self.stdout)
        self.stdout.write("\n\n")
        pprint.pprint_network_backends(network, stdout=self.stdout)
        backends = parse_bool(options["backends"])
        if backends:
            self.stdout.write("\n\n")
            pprint.pprint_network_in_ganeti(network, stdout=self.stdout)
Ejemplo n.º 47
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a volume ID")

        volume = common.get_resource("volume", args[0], for_update=True)

        name = options.get("name")
        description = options.get("description")
        delete_on_termination = options.get("delete_on_termination")
        if delete_on_termination is not None:
            delete_on_termination = parse_bool(delete_on_termination)

        volume = volumes.update(volume, name, description,
                                delete_on_termination)

        pprint.pprint_volume(volume, stdout=self.stdout)
        self.stdout.write('\n\n')
Ejemplo n.º 48
0
    def handle(self, **options):
        backend_id = options['backend-id']
        if backend_id:
            backends = [get_resource("backend", backend_id)]
        else:
            backends = reconciliation.get_online_backends()

        parallel = parse_bool(options["parallel"])
        if parallel and len(backends) > 1:
            cmd = sys.argv
            processes = []
            for backend in backends:
                p = subprocess.Popen(cmd + ["--backend-id=%s" % backend.id])
                processes.append(p)
            for p in processes:
                p.wait()
            return

        verbosity = int(options["verbosity"])

        logger = logging.getLogger("reconcile-servers")
        logger.propagate = 0

        formatter = logging.Formatter("%(message)s")
        log_handler = logging.StreamHandler()
        log_handler.setFormatter(formatter)
        if verbosity == 2:
            formatter =\
                logging.Formatter("%(asctime)s [%(process)d]: %(message)s")
            log_handler.setFormatter(formatter)
            logger.setLevel(logging.DEBUG)
        elif verbosity == 1:
            logger.setLevel(logging.INFO)
        else:
            logger.setLevel(logging.WARNING)

        logger.addHandler(log_handler)

        self._process_args(options)

        for backend in backends:
            r = reconciliation.BackendReconciler(backend=backend,
                                                 logger=logger,
                                                 options=options)
            r.reconcile()
Ejemplo n.º 49
0
    def handle(self, **options):
        backend_id = options['backend-id']
        if backend_id:
            backends = [get_resource("backend", backend_id)]
        else:
            backends = reconciliation.get_online_backends()

        parallel = parse_bool(options["parallel"])
        if parallel and len(backends) > 1:
            cmd = sys.argv
            processes = []
            for backend in backends:
                p = subprocess.Popen(cmd + ["--backend-id=%s" % backend.id])
                processes.append(p)
            for p in processes:
                p.wait()
            return

        verbosity = int(options["verbosity"])

        logger = logging.getLogger("reconcile-servers")
        logger.propagate = 0

        formatter = logging.Formatter("%(message)s")
        log_handler = logging.StreamHandler()
        log_handler.setFormatter(formatter)
        if verbosity == 2:
            formatter =\
                logging.Formatter("%(asctime)s [%(process)d]: %(message)s")
            log_handler.setFormatter(formatter)
            logger.setLevel(logging.DEBUG)
        elif verbosity == 1:
            logger.setLevel(logging.INFO)
        else:
            logger.setLevel(logging.WARNING)

        logger.addHandler(log_handler)

        self._process_args(options)

        for backend in backends:
            r = reconciliation.BackendReconciler(backend=backend,
                                                 logger=logger,
                                                 options=options)
            r.reconcile()
Ejemplo n.º 50
0
    def handle(self, *args, **options):
        if not args or len(args) > 1:
            raise CommandError("Command accepts exactly one argument")

        floating_ip_id = args[0]

        #get the floating-ip
        floating_ip = common.get_resource("floating-ip", floating_ip_id)

        if not floating_ip.nic:
            raise CommandError('This floating IP is not attached to a device')

        credentials = Credentials("snf-manage", is_admin=True)
        nic = floating_ip.nic
        vm = nic.machine
        servers.delete_port(nic.id, credentials)
        self.stdout.write("Detached floating IP %s from  %s.\n" %
                          (floating_ip_id, vm))
Ejemplo n.º 51
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Please provide a network ID.")

        network = common.get_resource("network", args[0])
        display_mails = options["displaymail"]

        pprint.pprint_network(network,
                              display_mails=display_mails,
                              stdout=self.stdout)
        self.stdout.write("\n\n")
        pprint.pprint_network_subnets(network, stdout=self.stdout)
        self.stdout.write("\n\n")
        pprint.pprint_network_backends(network, stdout=self.stdout)
        backends = parse_bool(options["backends"])
        if backends:
            self.stdout.write("\n\n")
            pprint.pprint_network_in_ganeti(network, stdout=self.stdout)
Ejemplo n.º 52
0
    def handle_args(self, *args, **options):
        if options["suspended"]:
            self.filters["suspended"] = True

        if options["backend_id"]:
            backend = get_resource("backend", options["backend_id"])
            self.filters["backend"] = backend.id

        if options["build"]:
            self.filters["operstate"] = "BUILD"

        if options["image_name"]:
            self.fields = [
                "image.name" if x == "image.id" else x for x in self.fields
            ]

        if "ipv4" in self.fields or "ipv6" in self.fields:
            self.prefetch_related.append("nics__ips__subnet")
Ejemplo n.º 53
0
    def handle(self, *args, **options):
        if not args or len(args) > 1:
            raise CommandError("Command accepts exactly one argument")

        floating_ip_id = args[0]

        #get the floating-ip
        floating_ip = common.get_resource("floating-ip", floating_ip_id,
                                          for_update=True)

        if not floating_ip.nic:
            raise CommandError('This floating IP is not attached to a device')

        nic = floating_ip.nic
        vm = nic.machine
        servers.delete_port(nic)
        self.stdout.write("Detached floating IP %s from  %s.\n"
                          % (floating_ip_id, vm))
Ejemplo n.º 54
0
    def handle(self, *args, **options):
        if not args:
            raise CommandError("Please provide a network ID")

        force = options["force"]
        message = "networks" if len(args) > 1 else "network"
        self.confirm_deletion(force, message, args)

        for network_id in args:
            self.stdout.write("\n")
            try:
                network = common.get_resource("network", network_id, for_update=True)
                self.stdout.write("Removing network: %s\n" % network.backend_id)

                networks.delete(network)

                self.stdout.write("Successfully submitted Ganeti jobs to" " remove network %s\n" % network.backend_id)
            except (CommandError, faults.BadRequest) as e:
                self.stdout.write("Error -- %s\n" % e.message)