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
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