Example #1
0
 def download_image(self, image):
     """
     Creates a stream for image data
     :param image: Image object for downloading
     :return: stream of image data
     """
     LOG.debug("Download image enter")
     stream = self.get_glance().images.data(image.id)
     LOG.debug("Stream with size {0}".format(image.size))
     return utils.ReSizeStream(stream, image.size, 1000000)
Example #2
0
    def restore_level(self, restore_resource, read_pipe, backup, except_queue):
        try:
            metadata = backup.metadata()
            if (not self.encrypt_pass_file
                    and metadata.get("encryption", False)):
                raise Exception("Cannot restore encrypted backup without key")
            engine_metadata = backup.engine_metadata()
            image_info = metadata.get('image', {})
            container_format = image_info.get('container_format', 'bare')
            disk_format = image_info.get('disk_format', 'raw')

            length = int(engine_metadata.get('length'))

            stream = self.stream_image(read_pipe)
            data = utils.ReSizeStream(stream, length, 1)
            image = self.client.create_image("Restore: {0}".format(
                image_info.get('name', image_info.get('id', None))),
                                             container_format,
                                             disk_format,
                                             data=data)

            if self.encrypt_pass_file:
                try:
                    tmpdir = tempfile.mkdtemp()
                except Exception:
                    LOG.error("Unable to create a tmp directory")
                    raise

                tar_engine = tar.TarEngine(self.compression_algo,
                                           self.dereference_symlink,
                                           self.exclude, self.storage,
                                           self.max_segment_size,
                                           self.encrypt_pass_file,
                                           self.dry_run)

                tar_engine.restore_level(tmpdir, read_pipe, backup,
                                         except_queue)

            utils.wait_for(
                GlanceEngine.image_active,
                1,
                CONF.timeout,
                message="Waiting for image to finish uploading {0} and become"
                " active".format(image.id),
                kwargs={
                    "glance_client": self.glance,
                    "image_id": image.id
                })
            return image
        except Exception as e:
            LOG.exception(e)
            except_queue.put(e)
            raise
Example #3
0
    def restore_level(self, restore_resource, read_pipe, backup, except_queue):
        try:
            metadata = backup.metadata()
            engine_metadata = backup.engine_metadata()
            server_info = metadata.get('server', {})
            length = int(engine_metadata.get('length'))
            available_networks = server_info.get('addresses')
            nova_networks = self.nova.networks.findall()

            net_names = [
                network for network, _ in available_networks.iteritems()
            ]
            match_networks = [{
                "net-id": network.id
            } for network in nova_networks
                              if network.to_dict().get('label') in net_names]

            stream = self.stream_image(read_pipe)
            data = utils.ReSizeStream(stream, length, 1)
            image = self.client.create_image("Restore: {0}".format(
                server_info.get('name', server_info.get('id', None))),
                                             'bare',
                                             'raw',
                                             data=data)

            utils.wait_for(
                NovaEngine.image_active,
                1,
                CONF.timeout,
                message="Waiting for image to finish uploading {0} and become"
                " active".format(image.id),
                kwargs={
                    "glance_client": self.glance,
                    "image_id": image.id
                })
            server = self.nova.servers.create(
                name=server_info.get('name'),
                flavor=server_info['flavor']['id'],
                image=image.id,
                nics=match_networks)
            return server
        except Exception as e:
            LOG.exception(e)
            except_queue.put(e)
            raise
Example #4
0
 def _create_image(self, path, restore_from_timestamp):
     """
     :param path:
     :param restore_from_timestamp:
     :type restore_from_timestamp: int
     :return:
     """
     swift = self.client_manager.get_swift()
     glance = self.client_manager.get_glance()
     backup = self._get_backups(path, restore_from_timestamp)
     stream = swift.get_object(self.container,
                               "%s/%s" % (path, backup),
                               resp_chunk_size=10000000)
     length = int(stream[0]["x-object-meta-length"])
     logging.info("[*] Creation glance image")
     image = glance.images.create(data=utils.ReSizeStream(
         stream[1], length, 1),
                                  container_format="bare",
                                  disk_format="raw")
     return stream[0], image
Example #5
0
    def _create_image(self, path, restore_from_timestamp):
        """
        :param path:
        :param restore_from_timestamp:
        :type restore_from_timestamp: int
        :return:
        """
        swift = self.client_manager.get_swift()
        glance = self.client_manager.get_glance()
        backup = self._get_backups(path, restore_from_timestamp)
        path = "{0}_segments/{1}/{2}".format(self.container, path, backup)

        stream = swift.get_object(self.container,
                                  "%s/%s" % (path, backup),
                                  resp_chunk_size=10000000)
        length = int(stream[0]["x-object-meta-length"])
        LOG.info("Creation glance image")
        image = glance.images.create(container_format="bare",
                                     disk_format="raw")
        glance.images.upload(image.id,
                             utils.ReSizeStream(stream[1], length, 1))
        return stream[0], image
Example #6
0
    def _create_image(self, path, restore_from_timestamp):
        """
        :param path:
        :param restore_from_timestamp:
        :type restore_from_timestamp: int
        :return:
        """
        backup = self._get_backups(path, restore_from_timestamp)
        if self.storage.type == 'swift':
            swift = self.client_manager.get_swift()
            path = "{0}_segments/{1}/{2}".format(self.container, path, backup)
            stream = swift.get_object(self.container,
                                      "{}/{}".format(path, backup),
                                      resp_chunk_size=10000000)
            length = int(stream[0]["x-object-meta-length"])
            data = utils.ReSizeStream(stream[1], length, 1)
            info = stream[0]
            image = self.client_manager.create_image(
                name="restore_{}".format(path),
                container_format="bare",
                disk_format="raw",
                data=data)
            return info, image
        elif self.storage.type == 's3':
            if self.storage.get_object_prefix() != '':
                base_path = "{0}/{1}/{2}".format(
                    self.storage.get_object_prefix(), path, backup)
            else:
                base_path = "{0}/{1}".format(path, backup)
            image_file = "{0}/{1}".format(base_path, path)
            s3_object = self.storage.get_object(
                bucket_name=self.storage.get_bucket_name(), key=image_file)
            stream = utils.S3ResponseStream(data=s3_object['Body'],
                                            chunk_size=10000000)
            data = utils.ReSizeStream(stream, s3_object['ContentLength'], 1)
            metadata = "{0}/metadata".format(base_path)
            metadata_object = self.storage.get_object(
                bucket_name=self.storage.get_bucket_name(), key=metadata)
            info = json.load(metadata_object['Body'])

            image = self.client_manager.create_image(
                name="restore_{}".format(path),
                container_format="bare",
                disk_format="raw",
                data=data)
            return info, image
        elif self.storage.type == 'local':
            image_file = "{0}/{1}/{2}/{3}".format(self.container, path, backup,
                                                  path)
            metadata_file = "{0}/{1}/{2}/metadata".format(
                self.container, path, backup)
            try:
                data = open(image_file, 'rb')
            except Exception:
                msg = "Failed to open image file {}".format(image_file)
                LOG.error(msg)
                raise BaseException(msg)
            info = json.load(open(metadata_file, 'r'))
            image = self.client_manager.create_image(
                name="restore_{}".format(path),
                container_format="bare",
                disk_format="raw",
                data=data)
            return info, image
        elif self.storage.type == 'ssh':
            image_file = "{0}/{1}/{2}/{3}".format(self.container, path, backup,
                                                  path)
            metadata_file = "{0}/{1}/{2}/metadata".format(
                self.container, path, backup)
            try:
                data = self.storage.open(image_file, 'rb')
            except Exception:
                msg = "Failed to open remote image file {}".format(image_file)
                LOG.error(msg)
                raise BaseException(msg)
            info = json.loads(self.storage.read_metadata_file(metadata_file))
            image = self.client_manager.create_image(
                name="restore_{}".format(path),
                container_format="bare",
                disk_format="raw",
                data=data)
            return info, image
        elif self.storage.type in ['ftp', 'ftps']:
            image_file = "{0}/{1}/{2}/{3}".format(self.container, path, backup,
                                                  path)
            metadata_file = "{0}/{1}/{2}/metadata".format(
                self.container, path, backup)
            try:
                tmpdir = tempfile.mkdtemp()
            except Exception:
                LOG.error("Unable to create a tmp directory")
                raise
            try:
                data_image = utils.path_join(tmpdir, "data_image")
                LOG.info('create image restore ftp storage')
                self.storage.get_file(image_file, data_image)
                data_meta = utils.path_join(tmpdir, "data_meta")
                self.storage.get_file(metadata_file, data_meta)
                data = open(data_image, 'rb')
                info = json.load(open(data_meta, 'r'))
                image = self.client_manager.create_image(
                    name="restore_{}".format(path),
                    container_format="bare",
                    disk_format="raw",
                    data=data)
                return info, image
            finally:
                shutil.rmtree(tmpdir)
        else:
            return {}
Example #7
0
    def restore_level(self, restore_resource, read_pipe, backup, except_queue):
        try:
            metadata = backup.metadata()
            if (not self.encrypt_pass_file
                    and metadata.get("encryption", False)):
                raise Exception("Cannot restore encrypted backup without key")
            engine_metadata = backup.engine_metadata()
            server_info = metadata.get('server', {})
            length = int(engine_metadata.get('length'))
            available_networks = server_info.get('addresses')
            nova_networks = self.neutron.list_networks()['networks']

            net_names = [
                network for network, _ in available_networks.iteritems()
            ]
            match_networks = [{
                "net-id": network.get('id')
            } for network in nova_networks if network.get('name') in net_names]

            stream = self.stream_image(read_pipe)
            data = utils.ReSizeStream(stream, length, 1)
            image = self.client.create_image("Restore: {0}".format(
                server_info.get('name', server_info.get('id', None))),
                                             'bare',
                                             'raw',
                                             data=data)

            if self.encrypt_pass_file:
                try:
                    tmpdir = tempfile.mkdtemp()
                except Exception:
                    LOG.error("Unable to create a tmp directory")
                    raise

                tar_engine = tar.TarEngine(self.compression_algo,
                                           self.dereference_symlink,
                                           self.exclude, self.storage,
                                           self.max_segment_size,
                                           self.encrypt_pass_file,
                                           self.dry_run)

                tar_engine.restore_level(tmpdir, read_pipe, backup,
                                         except_queue)

            utils.wait_for(
                NovaEngine.image_active,
                1,
                CONF.timeout,
                message="Waiting for image to finish uploading {0} and become"
                " active".format(image.id),
                kwargs={
                    "glance_client": self.glance,
                    "image_id": image.id
                })
            server = self.nova.servers.create(
                name=server_info.get('name'),
                flavor=server_info['flavor']['id'],
                image=image.id,
                nics=match_networks)
            return server
        except Exception as e:
            LOG.exception(e)
            except_queue.put(e)
            raise
Example #8
0
 def _create_image(self, path, restore_from_timestamp):
     """
     :param path:
     :param restore_from_timestamp:
     :type restore_from_timestamp: int
     :return:
     """
     swift = self.client_manager.get_swift()
     backup = self._get_backups(path, restore_from_timestamp)
     if self.storage.type == 'swift':
         path = "{0}_segments/{1}/{2}".format(self.container, path, backup)
         stream = swift.get_object(self.container,
                                   "{}/{}".format(path, backup),
                                   resp_chunk_size=10000000)
         length = int(stream[0]["x-object-meta-length"])
         data = utils.ReSizeStream(stream[1], length, 1)
         info = stream[0]
         image = self.client_manager.create_image(
             name="restore_{}".format(path),
             container_format="bare",
             disk_format="raw",
             data=data)
         return info, image
     elif self.storage.type == 'local':
         image_file = "{0}/{1}/{2}/{3}".format(self.container, path, backup,
                                               path)
         metadata_file = "{0}/{1}/{2}/metadata".format(
             self.container, path, backup)
         try:
             data = open(image_file, 'rb')
         except Exception:
             msg = "Failed to open image file {}".format(image_file)
             LOG.error(msg)
             raise BaseException(msg)
         info = json.load(file(metadata_file))
         image = self.client_manager.create_image(
             name="restore_{}".format(path),
             container_format="bare",
             disk_format="raw",
             data=data)
         return info, image
     elif self.storage.type == 'ssh':
         image_file = "{0}/{1}/{2}/{3}".format(self.container, path, backup,
                                               path)
         metadata_file = "{0}/{1}/{2}/metadata".format(
             self.container, path, backup)
         try:
             data = self.storage.open(image_file, 'rb')
         except Exception:
             msg = "Failed to open remote image file {}".format(image_file)
             LOG.error(msg)
             raise BaseException(msg)
         info = json.loads(self.storage.read_metadata_file(metadata_file))
         image = self.client_manager.create_image(
             name="restore_{}".format(path),
             container_format="bare",
             disk_format="raw",
             data=data)
         return info, image
     else:
         return {}