def _delete_all_bundles(self): bucket = self.args.get('bucket') directory = tempfile.mkdtemp() try: manifest_keys = get_manifest_keys(bucket, service=self.service, config=self.config) download_files(bucket, manifest_keys, directory, service=self.service, config=self.config) self._delete_manifest_parts(manifest_keys, directory) self._delete_manifest_keys(manifest_keys) finally: shutil.rmtree(directory)
def _download_by_prefix(self, directory): bucket = self.args.get('bucket') prefix = self.args.get('prefix') manifest_keys = get_manifest_keys(bucket, prefix, service=self.service, config=self.config) if not manifest_keys: if prefix: raise ArgumentError( "no manifests found with prefix '{0}' in bucket '{1}'." .format(prefix, bucket)) else: raise ArgumentError("no manifests found in bucket '{0}'." .format(bucket)) try: download_files(bucket, manifest_keys, directory, service=self.service, config=self.config, show_progress=self.args.get('show_progress', True)) except AWSError as err: if err.code != 'NoSuchEntity': raise raise ArgumentError( "cannot find manifest file(s) {0} in bucket '{1}'." .format(",".join(manifest_keys), bucket)) self._download_parts(manifest_keys, directory)
def _download_manifest(self, bucket=None, prefix=None, private_key=None, dest_dir=None): ''' Read in bundle manifest from remote bucket. :param bucket: Bucket to download bundle manifest from :param prefix: Manifest prefix used to download bundle :param private_key: Local file path to key used to create the bundle. :dest_dir: Local dir path. If provided the downloaded manifest will be written to a file in this directory, otherwise it will not be written to a local file. :returns: BundleManifest obj ''' self.log.debug('download to dest_dir:' + str(dest_dir)) bucket = bucket or self.args.get('bucket') prefix = prefix or self.args.get('prefix') if bucket is None or prefix is None: raise ArgumentError('Need to provide both bucket and prefix' ' to download manifest') #Make sure the manifest exists, and the prefix is unique... self.log.debug('Downloading manifest bucket "{0}" prefix "{1}"' .format(bucket, prefix)) manifest_keys = get_manifest_keys(bucket, prefix, service=self.service, config=self.config) if not manifest_keys: if prefix: raise ArgumentError("no manifests found with prefix '{0}' " "in bucket '{1}'." .format(prefix, bucket)) else: raise ArgumentError("no manifests found in bucket '{0}'." .format(bucket)) if len(manifest_keys) > 1: raise RuntimeError('Multiple manifests found:{0}' .format(",".join(str(m) for m in manifest_keys))) manifest_key = manifest_keys.pop() #Write to a local file if dest_dir was provided... if dest_dir: #Download paths to individual files under provided directory... if not os.path.isdir(dest_dir): self.log.debug('Creating dir at: {0}'.format(dest_dir)) os.mkdir(dest_dir) local_file_path = os.path.join(dest_dir, os.path.basename(manifest_key)) self.log.debug('Writing manifest to "{0}"'.format(local_file_path)) manifest_fileobj = open(local_file_path, 'w+') else: manifest_fileobj = BytesIO() #Read manifest in from fileobj and create BundleManifest obj... with manifest_fileobj: try: path = os.path.join(bucket, manifest_key) self.log.debug('Attempting to download:{0}'.format(path)) GetObject(paths=[path], fileobj=manifest_fileobj, opath=None, service=self.service, config=self.config).main() except AWSError as err: if err.code != 'NoSuchEntity': raise raise ArgumentError( "cannot find manifest file(s) {0} in bucket '{1}'." .format(",".join(manifest_keys), bucket)) #Read manifest info from pipe... manifest_fileobj.seek(0) manifest = BundleManifest.read_from_fileobj( manifest_fileobj, privkey_filename=private_key) manifest.manifest_key = manifest_key self.log.debug('Returning Manifest for image:{0}' .format(str(manifest.image_name))) return manifest