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')
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 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 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 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
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)
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)
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)
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 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)
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 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 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)
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)
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()
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
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): write = self.stdout.write if len(args) < 1: raise CommandError("Please provide a backend ID") backend = common.get_resource("backend", args[0], for_update=True) write("Trying to remove backend: %s\n" % backend.clustername) if backend.virtual_machines.filter(deleted=False).exists(): raise CommandError('Backend hosts non-deleted vms. Cannot delete') # Get networks before deleting backend, because after deleting the # backend, all BackendNetwork objects are deleted! networks = [bn.network for bn in backend.networks.all()] try: delete_backend(backend) except models.ProtectedError as e: msg = ("Cannot delete backend because it contains" "non-deleted VMs:\n%s" % e) raise CommandError(msg) write('Successfully removed backend from DB.\n') if networks: write("Clearing networks from %s..\n" % backend.clustername) for network in networks: backend_mod.delete_network(network=network, backend=backend) write("Successfully issued jobs to remove all networks.\n")
def 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()
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)
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))
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"])
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)
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))
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')
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)
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')
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)
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)
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)
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')
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)
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")
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")
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)
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()
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))
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")
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))
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)