def _get_reset_instance_progress(self, context, instance_id): client = clients.nova(context) try: instance = client.servers.get(instance_id) except clients.novaclient.exceptions.NotFound: return operation_util.get_final_progress() if instance.status != "HARD_REBOOT": return operation_util.get_final_progress() return None
def _get_delete_item_progress(self, context, image_id): image_service = clients.glance(context).images try: image = image_service.get(image_id) if image.status in self._deleted_statuses: return operation_util.get_final_progress() except glanceclient_exc.HTTPNotFound: return operation_util.get_final_progress() return None
def _get_add_item_progress(self, context, image_id): image_service = clients.glance(context).images try: image = image_service.get(image_id) except glanceclient_exc.HTTPNotFound: return operation_util.get_final_progress() if image.status not in ["queued", "saving"]: return operation_util.get_final_progress(image.status == "killed") return None
def _get_delete_item_progress(self, context, snapshot_id): client = clients.cinder(context) try: snapshot = client.volume_snapshots.get(snapshot_id) except clients.cinderclient.exceptions.NotFound: return operation_util.get_final_progress() if snapshot.status not in ["deleting", "deleted"]: return operation_util.get_final_progress(True) return None
def _get_add_item_progress(self, context, volume_id): client = clients.cinder(context) try: volume = client.volumes.get(volume_id) except clients.cinderclient.exceptions.NotFound: return operation_util.get_final_progress() if (volume.status not in ["creating", "downloading"]): return operation_util.get_final_progress(volume.status == "error") return None
def _get_delete_item_progress(self, context, instance_id): client = clients.nova(context) try: instance = client.servers.get(instance_id) except clients.novaclient.exceptions.NotFound: return operation_util.get_final_progress() if getattr(instance, "OS-EXT-STS:task_state") != "deleting": return operation_util.get_final_progress( instance.status != "DELETED") return None
def _get_add_item_progress(self, context, snapshot_id): client = clients.cinder(context) try: snapshot = client.volume_snapshots.get(snapshot_id) except clients.cinderclient.exceptions.NotFound: return operation_util.get_final_progress() if (snapshot.status != "creating"): return operation_util.get_final_progress(snapshot.status == "error") return None
def _get_add_item_progress(self, context, snapshot_id): client = clients.cinder(context) try: snapshot = client.volume_snapshots.get(snapshot_id) except clients.cinderclient.exceptions.NotFound: return operation_util.get_final_progress() if (snapshot.status != "creating"): return operation_util.get_final_progress( snapshot.status == "error") return None
def _get_add_item_progress(self, context, instance_id): client = clients.nova(context) try: instance = client.servers.get(instance_id) except clients.novaclient.exceptions.NotFound: return operation_util.get_final_progress() if instance.status != "BUILD": return operation_util.get_final_progress(instance.status == "ERROR") return None
def _attach_volume(self, context): params = context.operation_data.get("params") if params: scope = context.operation_data["scope"] context.operation_data.pop("params") body = {"sizeGb": params.get("diskSizeGb"), "sourceImage": params["sourceImage"]} volume = disk_api.API().add_item(context, params.get("diskName"), body, scope=scope) context.operation_data["disk"] = volume return None disk = context.operation_data.get("disk") if disk: volume_id = disk["id"] item_progress = disk_api.API()._get_add_item_progress(context, volume_id) if not operation_util.is_final_progress(item_progress): return None context.operation_data.pop("disk") context.operation_data["volume_id"] = volume_id instance_id = context.operation_data["instance_id"] device_name = context.operation_data["device_name"] volume_id = context.operation_data["volume_id"] volumes_client = clients.nova(context).volumes volumes_client.create_server_volume( instance_id, volume_id, "/dev/" + device_name) args = context.operation_data["register_args"] self.register_item(context, args[0], volume_id, args[1], args[2]) return operation_util.get_final_progress()
def _delete_instance(self, context): progress = {"progress": 0} full_count = context.operation_data.get("count") disks = context.operation_data.get("disks") instance = context.operation_data.get("instance") if instance: item_progress = self._get_delete_item_progress(context, instance["id"]) if not operation_util.is_final_progress(item_progress): return progress context.operation_data.pop("instance") progress = {"progress": int(100.0 * (full_count - len(disks)) / full_count)} disk = context.operation_data.get("disk") if disk: volume_id = disk["volume_id"] item_progress = disk_api.API()._get_delete_item_progress(context, volume_id) if not operation_util.is_final_progress(item_progress): return progress context.operation_data.pop("disk") progress = {"progress": int(100.0 * (full_count - len(disks) + 1) / full_count)} if disks: disk = disks.pop() try: cinder_client = clients.cinder(context) volume = cinder_client.volumes.get(disk["volume_id"]) cinder_client.volumes.delete(volume) context.operation_data["disk"] = disk except Exception: LOG.exception("Failed to remove disk %s of instance" % disk["volume_id"]) return progress return operation_util.get_final_progress()
def _attach_volume(self, context): params = context.operation_data.get("params") if params: scope = context.operation_data["scope"] context.operation_data.pop("params") body = { "sizeGb": params.get("diskSizeGb"), "sourceImage": params["sourceImage"] } volume = disk_api.API().add_item(context, params.get("diskName"), body, scope=scope) context.operation_data["disk"] = volume return None disk = context.operation_data.get("disk") if disk: volume_id = disk["id"] item_progress = disk_api.API()._get_add_item_progress( context, volume_id) if not operation_util.is_final_progress(item_progress): return None context.operation_data.pop("disk") context.operation_data["volume_id"] = volume_id instance_id = context.operation_data["instance_id"] device_name = context.operation_data["device_name"] volume_id = context.operation_data["volume_id"] volumes_client = clients.nova(context).volumes volumes_client.create_server_volume(instance_id, volume_id, "/dev/" + device_name) args = context.operation_data["register_args"] self.register_item(context, args[0], volume_id, args[1], args[2]) return operation_util.get_final_progress()
def _get_delete_item_progress(self, context, dummy_id): return operation_util.get_final_progress()
def _create_instance(self, context): disks = context.operation_data["disks"] acs = context.operation_data["acs"] full_count = 1 + len(disks) + (1 if acs else 0) disk_device = context.operation_data["disk_device"] instance = context.operation_data.get("instance") progress = {"progress": int(100.0 * disk_device / full_count)} disk = context.operation_data.get("disk") if disk: volume_id = disk["id"] item_progress = disk_api.API()._get_add_item_progress(context, volume_id) if not operation_util.is_final_progress(item_progress): return progress context.operation_data.pop("disk") disk_device += 1 context.operation_data["disk_device"] = disk_device progress["progress"] = int(100.0 * disk_device / full_count) scope = context.operation_data["scope"] args = context.operation_data["args"] bdm = context.operation_data["bdm"] while disk_device < len(disks): disk = disks[disk_device] if "initializeParams" in disk: da = disk_api.API() params = disk["initializeParams"] body = {"sizeGb": params.get("diskSizeGb"), "sourceImage": params["sourceImage"]} volume = da.add_item(context, params.get("diskName", args[0]), body, scope=scope) disk["id"] = volume["id"] context.operation_data["disk"] = disk # deviceName is optional parameter # use passed value if given, othewise generate new dev name device_name = disk.get("deviceName") if device_name is None: device_name = "vd" + string.ascii_lowercase[disk_device] disk["deviceName"] = device_name bdm[device_name] = disk["id"] if "initializeParams" in disk: return progress disk_device += 1 context.operation_data["disk_device"] = disk_device if not instance: kwargs = context.operation_data["kwargs"] kwargs["block_device_mapping"] = bdm kwargs["availability_zone"] = scope.get_name() client = clients.nova(context) try: instance = client.servers.create(*args, **kwargs) for disk in disks: instance_disk_api.API().register_item(context, args[0], disk["id"], disk["deviceName"], disk["autoDelete"]) instance = utils.to_dict(client.servers.get(instance.id)) instance = self._prepare_instance(client, context, instance) instance["description"] = context.operation_data["description"] instance = self._add_db_item(context, instance) finally: try: ssh_keys = context.operation_data["ssh_keys"] if ssh_keys is not None: client.keypairs.delete(kwargs["key_name"]) except Exception: pass context.operation_data["instance"] = instance return progress progress = self._get_add_item_progress(context, instance["id"]) if not operation_util.is_final_progress(progress): return progress client = clients.nova(context) try: instance = client.servers.get(instance["id"]) except clients.novaclient.exceptions.NotFound: return operation_util.get_final_progress() for net in acs: ac = acs[net] instance_address_api.API().add_item(context, instance.name, net, ac.get("natIP"), ac.get("type"), ac.get("name")) return operation_util.get_final_progress()