class InstanceImageAction(action.Action): is_global = True # store in global container def __init__(self, context): self.clients = Clients(context) self._image_id = None self._name = None self._resource_id = None self.data_block_size_bytes = CONF.backup_image_object_size # super(action.Action, self).__init__(workload_action_excution_id) def pre_protect(self, cntx, workload_action_excution_id, resource_id): pass def post_protect(self, cntx, workload_action_excution_id, resource_id): pass def protect(self, cntx, workload_action_excution_id, resource_id, container_name): LOG.debug("protecting instance (image copied) %s" % (resource_id)) instance = self.clients.nova().servers.get(resource_id) self._image_id = instance.image['id'] self._name = instance.name self._resource_id = resource_id instance_copy_execution =\ ae.ActionExecution(workload_action_excution_id, resource_id, self.id) result = self._imagecopy(cntx, instance, container_name, instance_copy_execution) return result def generate_template(self, context, template_gen): instance = InstanceResource(self._image_id, self._name, resource_id=self._resource_id) template_gen.add_instance(instance) def failover(self, context, resource_id, resource_data, container_name): return self._import_from_swift(context, resource_id, resource_data, container_name) def _import_from_swift(self, context, resource_id, resource_data, container_name): LOG.debug("resource %s data %s container %s" % (resource_id, resource_data, container_name)) swift_client = self.clients.swift() data_chunks = resource_data["chunks"] image_id = resource_data["image_id"] image_response_data = StringIO.StringIO() for chunk in range(data_chunks): swift_meta, image_response =\ swift_client.get_object(container_name, image_id + "_" + str(chunk)) image_response_data.write(image_response) try: image = {} image['name'] = resource_data["meta"]["name"] image['size'] = resource_data["meta"]["size"] image['disk_format'] = resource_data["meta"]["disk_format"] image['container_format'] =\ resource_data["meta"]["container_format"] image['id'] = uuidutils.generate_uuid() image_response_data.seek(0, os.SEEK_SET) self.clients.glance().images.create(data=image_response_data, **image) self._image_id = image['id'] self._name = resource_data["instance_name"] return True # except ImageAlreadyPresentException: except Exception, e: LOG.error(e) return False