Example #1
0
    def fetch_manifest(self, s3_service, privkey_filename=None):
        if self.args.get('local_manifest'):
            _assert_is_file(self.args['local_manifest'], 'manifest')
            return euca2ools.bundle.manifest.BundleManifest.read_from_file(
                self.args['local_manifest'], privkey_filename=privkey_filename)

        # It's on the server, so do things the hard way
        manifest_s3path = self.get_manifest_s3path()
        with tempfile.TemporaryFile() as manifest_tempfile:
            self.log.info('reading manifest from %s', manifest_s3path)
            req = GetObject(config=self.config,
                            service=s3_service,
                            source=manifest_s3path,
                            dest=manifest_tempfile)
            try:
                req.main()
            except AWSError as err:
                if err.status_code == 404:
                    self.log.debug('failed to fetch manifest', exc_info=True)
                    raise ValueError("manifest '{0}' does not exist on the "
                                     "server".format(manifest_s3path))
                raise
            manifest_tempfile.flush()
            manifest_tempfile.seek(0)
            return euca2ools.bundle.manifest.BundleManifest.read_from_fileobj(
                manifest_tempfile, privkey_filename=privkey_filename)
Example #2
0
    def download_bundle_to_dir(self, manifest, dest_dir, s3_service):
        parts = self.map_bundle_parts_to_s3paths(manifest)
        for part, part_s3path in parts:
            part.filename = os.path.join(dest_dir,
                                         os.path.basename(part_s3path))
            self.log.info('downloading part %s to %s',
                          part_s3path, part.filename)
            req = GetObject.from_other(
                self, service=s3_service, source=part_s3path,
                dest=part.filename,
                show_progress=self.args.get('show_progress', False))
            response = req.main()
            self.__check_part_sha1(part, part_s3path, response)

        manifest_s3path = self.get_manifest_s3path()
        if manifest_s3path:
            # Can't download a manifest if we're using a local one
            manifest_dest = os.path.join(dest_dir,
                                         os.path.basename(manifest_s3path))
            self.log.info('downloading manifest %s to %s',
                          manifest_s3path, manifest_dest)
            req = GetObject.from_other(
                self, service=s3_service, source=manifest_s3path,
                dest=manifest_dest,
                show_progress=self.args.get('show_progress', False))
            req.main()
            return manifest_dest
        return None
Example #3
0
    def download_bundle_to_dir(self, manifest, dest_dir, s3_service):
        parts = self.map_bundle_parts_to_s3paths(manifest)
        for part, part_s3path in parts:
            part.filename = os.path.join(dest_dir,
                                         os.path.basename(part_s3path))
            self.log.info('downloading part %s to %s', part_s3path,
                          part.filename)
            req = GetObject.from_other(self,
                                       service=s3_service,
                                       source=part_s3path,
                                       dest=part.filename,
                                       show_progress=self.args.get(
                                           'show_progress', False))
            response = req.main()
            self.__check_part_sha1(part, part_s3path, response)

        manifest_s3path = self.get_manifest_s3path()
        if manifest_s3path:
            # Can't download a manifest if we're using a local one
            manifest_dest = os.path.join(dest_dir,
                                         os.path.basename(manifest_s3path))
            self.log.info('downloading manifest %s to %s', manifest_s3path,
                          manifest_dest)
            req = GetObject.from_other(self,
                                       service=s3_service,
                                       source=manifest_s3path,
                                       dest=manifest_dest,
                                       show_progress=self.args.get(
                                           'show_progress', False))
            req.main()
            return manifest_dest
        return None
Example #4
0
 def download_bundle_to_fileobj(self, manifest, fileobj, s3_service):
     # We can skip downloading the manifest since we're just writing all
     # parts to a file object.
     parts = self.map_bundle_parts_to_s3paths(manifest)
     for part, part_s3path in parts:
         self.log.info('downloading part %s', part_s3path)
         req = GetObject(
             config=self.config, service=s3_service,
             source=part_s3path, dest=fileobj,
             show_progress=self.args.get('show_progress', False))
         response = req.main()
         self.__check_part_sha1(part, part_s3path, response)
Example #5
0
 def download_bundle_to_fileobj(self, manifest, fileobj, s3_service):
     # We can skip downloading the manifest since we're just writing all
     # parts to a file object.
     parts = self.map_bundle_parts_to_s3paths(manifest)
     for part, part_s3path in parts:
         self.log.info('downloading part %s', part_s3path)
         req = GetObject(config=self.config,
                         service=s3_service,
                         source=part_s3path,
                         dest=fileobj,
                         show_progress=self.args.get(
                             'show_progress', False))
         response = req.main()
         self.__check_part_sha1(part, part_s3path, response)
Example #6
0
    def fetch_manifest(self, s3_service, privkey_filename=None):
        if self.args.get('local_manifest'):
            _assert_is_file(self.args['local_manifest'], 'manifest')
            return euca2ools.bundle.manifest.BundleManifest.read_from_file(
                self.args['local_manifest'], privkey_filename=privkey_filename)

        # It's on the server, so do things the hard way
        manifest_s3path = self.get_manifest_s3path()
        with tempfile.TemporaryFile() as manifest_tempfile:
            self.log.info('reading manifest from %s', manifest_s3path)
            req = GetObject.from_other(
                self, service=s3_service, source=manifest_s3path,
                dest=manifest_tempfile)
            try:
                req.main()
            except AWSError as err:
                if err.status_code == 404:
                    self.log.debug('failed to fetch manifest', exc_info=True)
                    raise ValueError("manifest '{0}' does not exist on the "
                                     "server".format(manifest_s3path))
                raise
            manifest_tempfile.flush()
            manifest_tempfile.seek(0)
            return euca2ools.bundle.manifest.BundleManifest.read_from_fileobj(
                manifest_tempfile, privkey_filename=privkey_filename)
Example #7
0
    def main(self):
        if self.args.get('dry_run'):
            return

        if not self.args.get('DiskImage.1.Image.ImportManifestUrl'):
            manifest_key = '{0}/{1}.manifest.xml'.format(uuid.uuid4(),
                                                         self.args['source'])
            if self.args.get('prefix'):
                manifest_key = '/'.join((self.args['prefix'], manifest_key))
            getobj = GetObject.from_other(
                self, service=self.args['s3_service'],
                auth=self.args['s3_auth'],
                source='/'.join((self.args['bucket'], manifest_key)))
            days = self.args.get('expires') or 30
            expiration = datetime.datetime.utcnow() + datetime.timedelta(days)
            get_url = getobj.get_presigned_url(expiration)
            self.log.info('generated manifest GET URL: %s', get_url)
            self.params['DiskImage.1.Image.ImportManifestUrl'] = get_url

        result = self.send()

        # The manifest creation and uploading parts are done by ResumeImport.
        if not self.args.get('no_upload'):
            resume = ResumeImport.from_other(
                self, source=self.args['source'],
                task=result['conversionTask']['conversionTaskId'],
                s3_service=self.args['s3_service'],
                s3_auth=self.args['s3_auth'], expires=self.args['expires'],
                show_progress=self.args.get('show_progress', False))
            resume.main()

        return result
Example #8
0
 def __generate_manifest(self, vol_container, file_size):
     days = self.args.get('expires') or 30
     timeout = days * 86400  # in seconds
     _, bucket, key = self.args['s3_service'].resolve_url_to_location(
         vol_container['image']['importManifestUrl'])
     key_prefix = key.rsplit('/', 1)[0]
     manifest = ImportManifest(loglevel=self.log.level)
     manifest.file_format = vol_container['image']['format']
     delete_req = DeleteObject.from_other(
         self, service=self.args['s3_service'], auth=self.args['s3_auth'],
         path='/'.join((bucket, key)))
     manifest.self_destruct_url = delete_req.get_presigned_url2(timeout)
     manifest.image_size = int(vol_container['image']['size'])
     manifest.volume_size = int(vol_container['volume']['size'])
     part_size = (self.args.get('part_size') or 10) * 2 ** 20  # MiB
     for index, part_start in enumerate(six.moves.range(0, file_size,
                                                        part_size)):
         part = ImportImagePart()
         part.index = index
         part.start = part_start
         part.end = min(part_start + part_size, file_size) - 1
         part.key = '{0}/{1}.part.{2}'.format(
             key_prefix, os.path.basename(self.args['source']), index)
         part_path = '/'.join((bucket, part.key))
         head_req = HeadObject.from_other(delete_req, path=part_path)
         get_req = GetObject.from_other(delete_req, source=part_path)
         delete_req = DeleteObject.from_other(delete_req, path=part_path)
         part.head_url = head_req.get_presigned_url2(timeout)
         part.get_url = get_req.get_presigned_url2(timeout)
         part.delete_url = delete_req.get_presigned_url2(timeout)
         manifest.image_parts.append(part)
     return manifest
Example #9
0
 def __get_or_create_manifest(self, vol_container, file_size):
     _, bucket, key = self.args['s3_service'].resolve_url_to_location(
         vol_container['image']['importManifestUrl'])
     manifest_s3path = '/'.join((bucket, key))
     try:
         with tempfile.SpooledTemporaryFile(max_size=1024000) as \
                 manifest_destfile:
             get_req = GetObject.from_other(
                 self, service=self.args['s3_service'],
                 auth=self.args['s3_auth'], source=manifest_s3path,
                 dest=manifest_destfile, show_progress=False)
             get_req.main()
             self.log.info('using existing import manifest from the server')
             manifest_destfile.seek(0)
             manifest = ImportManifest.read_from_fileobj(
                 manifest_destfile)
     except ServerError as err:
         if err.status_code == 404:
             self.log.info('creating new import manifest')
             manifest = self.__generate_manifest(vol_container, file_size)
             tempdir = tempfile.mkdtemp()
             manifest_filename = os.path.join(tempdir,
                                              os.path.basename(key))
             with open(manifest_filename, 'w') as manifest_file:
                 manifest.dump_to_fileobj(manifest_file, pretty_print=True)
             put_req = PutObject.from_other(
                 get_req, source=manifest_filename, dest=manifest_s3path,
                 show_progress=False)
             put_req.main()
             os.remove(manifest_filename)
             os.rmdir(tempdir)
         else:
             raise
     return manifest
Example #10
0
    def main(self):
        if self.args.get('dry_run'):
            return

        if not self.args.get('Image.ImportManifestUrl'):
            manifest_key = '{0}/{1}.manifest.xml'.format(
                uuid.uuid4(), self.args['source'])
            if self.args.get('prefix'):
                manifest_key = '/'.join((self.args['prefix'], manifest_key))
            getobj = GetObject.from_other(self,
                                          service=self.args['s3_service'],
                                          auth=self.args['s3_auth'],
                                          source='/'.join((self.args['bucket'],
                                                           manifest_key)))
            days = self.args.get('expires') or 30
            expiration = datetime.datetime.utcnow() + datetime.timedelta(days)
            get_url = getobj.get_presigned_url(expiration)
            self.log.info('generated manifest GET URL: %s', get_url)
            self.params['Image.ImportManifestUrl'] = get_url

        result = self.send()

        # The manifest creation and uploading parts are done by ResumeImport.
        if not self.args.get('no_upload'):
            resume = ResumeImport.from_other(
                self,
                source=self.args['source'],
                task=result['conversionTask']['conversionTaskId'],
                s3_service=self.args['s3_service'],
                s3_auth=self.args['s3_auth'],
                expires=self.args['expires'],
                show_progress=self.args.get('show_progress', False))
            resume.main()

        return result
Example #11
0
 def __download_manifest(self, s3path):
     with tempfile.SpooledTemporaryFile(max_size=1024000) as \
             manifest_destfile:
         get_req = GetObject.from_other(self,
                                        service=self.args['s3_service'],
                                        auth=self.args['s3_auth'],
                                        source=s3path,
                                        dest=manifest_destfile,
                                        show_progress=False)
         try:
             get_req.main()
         except AWSError as err:
             if err.status_code == 404:
                 raise ArgumentError(
                     'import manifest "{0}" does not exist'.format(s3path))
             raise
         manifest_destfile.seek(0)
         return ImportManifest.read_from_fileobj(manifest_destfile)
Example #12
0
 def __download_manifest(self, s3path):
     with tempfile.SpooledTemporaryFile(max_size=1024000) as manifest_destfile:
         get_req = GetObject.from_other(
             self,
             service=self.args["s3_service"],
             auth=self.args["s3_auth"],
             source=s3path,
             dest=manifest_destfile,
             show_progress=False,
         )
         try:
             get_req.main()
         except AWSError as err:
             if err.status_code == 404:
                 raise ArgumentError('import manifest "{0}" does not exist'.format(s3path))
             raise
         manifest_destfile.seek(0)
         return ImportManifest.read_from_fileobj(manifest_destfile)
Example #13
0
    def main(self):
        if self.args.get("dry_run"):
            return

        if self.args.get("bucket"):
            self.ensure_bucket_exists(self.args["bucket"])

        if not self.args.get("DiskImage.1.Image.ImportManifestUrl"):
            manifest_key = "{0}/{1}.manifest.xml".format(uuid.uuid4(), self.args["source"])
            if self.args.get("prefix"):
                manifest_key = "/".join((self.args["prefix"], manifest_key))
            getobj = GetObject.from_other(
                self,
                service=self.args["s3_service"],
                auth=self.args["s3_auth"],
                source="/".join((self.args["bucket"], manifest_key)),
            )
            days = self.args.get("expires") or 30
            expiration = datetime.datetime.utcnow() + datetime.timedelta(days)
            get_url = getobj.get_presigned_url(expiration)
            self.log.info("generated manifest GET URL: %s", get_url)
            self.params["DiskImage.1.Image.ImportManifestUrl"] = get_url

        result = self.send()

        # The manifest creation and uploading parts are done by ResumeImport.
        if not self.args.get("no_upload"):
            resume = ResumeImport.from_other(
                self,
                source=self.args["source"],
                task=result["conversionTask"]["conversionTaskId"],
                s3_service=self.args["s3_service"],
                s3_auth=self.args["s3_auth"],
                expires=self.args["expires"],
                show_progress=self.args.get("show_progress", False),
            )
            resume.main()

        return result