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)
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)
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)
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)
def wait_building_server(self, vm, period=1): common.wait_server_task(vm, True, self.stdout) while vm.task: time.sleep(period) # We need to reload the VM from the DB, as the task field has # changed. vm = VirtualMachine.objects.get(id=vm.id) return vm
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)
def stop_server(self, vm, wait): """Stop a helper VM. First, we need to wait for the server to finish building. Then, we can send a shutdown job to Ganeti and optionally wait once more. """ vm = self.wait_building_server(vm) servers.stop(vm) common.wait_server_task(vm, wait, self.stdout)
def handle(self, *args, **options): if len(args) != 1: raise CommandError("Please provide a server ID") server = get_vm(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('owner') if new_owner is not None: if "@" in new_owner: raise CommandError("Invalid owner 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_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)
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)
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)
def handle(self, *args, **options): if args: raise CommandError("Command doesn't accept any arguments") name = options['name'] user_id = options['user_id'] backend_id = options['backend_id'] image_id = options['image_id'] flavor_id = options['flavor_id'] password = options['password'] if not name: raise CommandError("name is mandatory") if not user_id: raise CommandError("user-id is mandatory") if not password: raise CommandError("password is mandatory") if not flavor_id: raise CommandError("flavor-id is mandatory") if not image_id: raise CommandError("image-id is mandatory") flavor = common.get_flavor(flavor_id) image = common.get_image(image_id, user_id) if backend_id: backend = common.get_backend(backend_id) else: backend = None connection_list = parse_connections(options["connections"]) server = servers.create(user_id, name, password, flavor, image, networks=connection_list, use_backend=backend) pprint.pprint_server(server, stdout=self.stdout) wait = parse_bool(options["wait"]) common.wait_server_task(server, wait, self.stdout)
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_detachment(force, message, args) credentials = Credentials("snf-manage", is_admin=True) for volume_id in args: self.stdout.write("\n") try: volume = volumes.detach(volume_id, credentials) 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 detached volume %s\n" % volume) except CommandError as e: self.stdout.write("Error -- %s\n" % e.message)
def handle(self, *args, **options): if not args: raise CommandError("Please provide a volume ID") server_id = options.get("server_id") wait = parse_bool(options["wait"]) if not server_id: raise CommandError("Please provide a server ID") for volume_id in args: try: volume = volumes.attach(server_id, volume_id) if volume.machine is None: volume.machine.task_job_id = volume.backendjobid common.wait_server_task(volume.machine, wait, stdout=self.stdout) else: self.stdout.write("Successfully attached volume %s\n" % volume) except CommandError as e: self.stdout.write("Error -- %s\n" % e.message)
def handle(self, *args, **options): if not args: raise CommandError("Please provide a volume ID") server_id = options.get("server_id") wait = parse_bool(options["wait"]) credentials = Credentials("snf-manage", is_admin=True) if not server_id: raise CommandError("Please provide a server ID") for volume_id in args: try: volume = volumes.attach(server_id, volume_id, credentials) if volume.machine is None: volume.machine.task_job_id = volume.backendjobid common.wait_server_task(volume.machine, wait, stdout=self.stdout) else: self.stdout.write("Successfully attached volume %s\n" % volume) except CommandError as e: self.stdout.write("Error -- %s\n" % e.message)
def handle(self, *args, **options): if args: raise CommandError("Command doesn't accept any arguments") size = options.get("size") user_id = options.get("user_id") project_id = options.get("project") server_id = options.get("server_id") volume_type_id = options.get("volume_type_id") wait = parse_bool(options["wait"]) display_name = options.get("name", "") display_description = options.get("description", "") if size is None: raise CommandError("Please specify the size of the volume") if server_id is None: raise CommandError("Please specify the server to attach the" " volume.") vm = common.get_resource("server", server_id, for_update=True) if user_id is None: user_id = vm.userid if volume_type_id is not None: vtype = common.get_resource("volume-type", volume_type_id) else: vtype = vm.flavor.volume_type if project_id is None: project_id = vm.project source_image_id = source_volume_id = source_snapshot_id = None source = options.get("source") if source is not None: try: source_type, source_uuid = source.split(":", 1) except (ValueError, TypeError): raise CommandError("Invalid '--source' option. Value must be" " of the form <source_type>:<source_uuid>") if source_type == "image": source_image_id = source_uuid elif source_type == "snapshot": source_snapshot_id = source_uuid else: raise CommandError("Unknown volume source type '%s'" % source_type) volume = volumes.create(user_id, size, server_id, name=display_name, description=display_description, source_image_id=source_image_id, source_snapshot_id=source_snapshot_id, source_volume_id=source_volume_id, volume_type_id=vtype.id, metadata={}, project=project_id) self.stdout.write("Created volume '%s' in DB:\n" % volume.id) pprint.pprint_volume(volume, stdout=self.stdout) self.stdout.write("\n") if volume.machine is not None: volume.machine.task_job_id = volume.backendjobid common.wait_server_task(volume.machine, wait, stdout=self.stdout)
def handle(self, *args, **options): if args: raise CommandError("Command doesn't accept any arguments") size = options.get("size") user_id = options.get("user_id") project_id = options.get("project") server_id = options.get("server_id") volume_type_id = options.get("volume_type_id") wait = parse_bool(options["wait"]) credentials = Credentials(user_id) display_name = options.get("name", "") display_description = options.get("description", "") if size is None: raise CommandError("Please specify the size of the volume") if server_id: vm = common.get_resource("server", server_id) if project_id is None: project_id = vm.project if user_id is None and server_id is None: raise CommandError("Please specify the id of a user or a server") elif user_id is None and server_id is not None: user_id = vm.userid if volume_type_id is not None: vtype = common.get_resource("volume-type", volume_type_id) elif server_id: vtype = vm.flavor.volume_type else: raise CommandError("Please specify the id of the volume type") # At this point, user_id, vtype must have been provided or extracted by # the server. The project_id is optional and will default to the user's # project. source_image_id = source_volume_id = source_snapshot_id = None source = options.get("source") if source is not None: try: source_type, source_uuid = source.split(":", 1) except (ValueError, TypeError): raise CommandError("Invalid '--source' option. Value must be" " of the form <source_type>:<source_uuid>") if source_type == "image": source_image_id = source_uuid elif source_type == "snapshot": source_snapshot_id = source_uuid else: raise CommandError("Unknown volume source type '%s'" % source_type) volume = volumes.create(credentials, size, server_id, name=display_name, description=display_description, source_image_id=source_image_id, source_snapshot_id=source_snapshot_id, source_volume_id=source_volume_id, volume_type_id=vtype.id, metadata={}, project_id=project_id) self.stdout.write("Created volume '%s' in DB:\n" % volume.id) pprint.pprint_volume(volume, stdout=self.stdout) self.stdout.write("\n") if volume.machine is not None: volume.machine.task_job_id = volume.backendjobid common.wait_server_task(volume.machine, wait, stdout=self.stdout)
def handle(self, *args, **options): if args: raise CommandError("Command doesn't accept any arguments") name = options["name"] user_id = options["user_id"] network_id = options["network_id"] server_id = options["server_id"] #router_id = options["router_id"] router_id = None # assume giving security groups comma separated security_group_ids = options["security-groups"] wait = parse_bool(options["wait"]) if not name: name = "" if not network_id: raise CommandError("Please specify a 'network'") vm = None owner = None if server_id: owner = "vm" vm = common.get_resource("server", server_id) #if vm.router: # raise CommandError("Server '%s' does not exist." % server_id) elif router_id: owner = "router" vm = common.get_resource("server", router_id) if not vm.router: raise CommandError("Router '%s' does not exist." % router_id) if user_id is None: if vm is not None: user_id = vm.userid else: raise CommandError("Please specify the owner of the port.") # Get either floating IP or fixed ip address ipaddress = None floating_ip_id = options["floating_ip_id"] ipv4_address = options["ipv4_address"] if floating_ip_id: ipaddress = common.get_resource("floating-ip", floating_ip_id) address = ipaddress.address if ipv4_address is not None and address != ipv4_address: raise CommandError("Floating IP address '%s' is different from" " specified address '%s'" % (address, ipv4_address)) else: address = ipv4_address # validate security groups sg_list = [] if security_group_ids: security_group_ids = security_group_ids.split(",") for gid in security_group_ids: sg = util.get_security_group(int(gid)) sg_list.append(sg) credentials = Credentials(user_id) new_port = servers.create_port(credentials, network_id, machine=vm.id, name=name, address=address, security_groups=sg_list, device_owner=owner) self.stdout.write("Created port '%s' in DB:\n" % new_port) pprint.pprint_port(new_port, stdout=self.stdout) pprint.pprint_port_ips(new_port, stdout=self.stdout) self.stdout.write("\n") if vm is not None: common.wait_server_task(new_port.machine, wait, stdout=self.stdout)
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 old_project = server.project server.project = 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)) msg = "Changed the project of server '%s' from '%s' to '%s'.\n" self.stdout.write(msg % (server, old_project, new_owner)) for vol in server.volumes.filter( userid=old_owner).select_for_update(): vol.userid = new_owner vol_old_project = vol.project vol.project = new_owner vol.save() msg = "Changed the owner of volume '%s' from '%s' to '%s'.\n" self.stdout.write(msg % (vol, old_owner, new_owner)) msg = "Changed the project of volume '%s' from '%s' to '%s'.\n" self.stdout.write(msg % (vol, vol_old_project, 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_stof": server = servers.reboot(server, reboot_type="SOFT") else: raise CommandError("Unknown action.") wait_server_task(server, wait, stdout=self.stdout)
def handle(self, *args, **options): if len(args) != 1: raise CommandError("Please provide a server ID") server_id = args[0] server = get_resource("server", server_id) credentials = Credentials("snf-manage", is_admin=True) new_name = options.get("name", None) if new_name is not None: old_name = server.name server = servers.rename(server_id, new_name, credentials) 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 = servers.suspend(server_id, suspended, credentials) 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_id, new_owner, credentials) 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_id, new_flavor, credentials) wait_server_task(server, wait, stdout=self.stdout) action = options.get("action") if action is not None: if action == "start": server = servers.start(server_id, credentials=credentials) elif action == "stop": server = servers.stop(server_id, credentials=credentials) elif action == "reboot_hard": server = servers.reboot(server_id, reboot_type="HARD", credentials=credentials) elif action == "reboot_soft": server = servers.reboot(server_id, reboot_type="SOFT", credentials=credentials) elif action == "rescue": server = servers.rescue(server_id, credentials=credentials) elif action == "unrescue": server = servers.unrescue(server_id, credentials=credentials) else: raise CommandError("Unknown action.") wait_server_task(server, wait, stdout=self.stdout)