diff options
author | Lianhao Lu <lianhao.lu@intel.com> | 2018-03-26 13:35:22 +0800 |
---|---|---|
committer | Lianhao Lu <lianhao.lu@intel.com> | 2018-03-26 13:37:37 +0800 |
commit | cd02d1f9b64957a63ad4b16bac639116975edb22 (patch) | |
tree | 1615d4af58dbe0354649e146e6dd3431977899d0 /vnfsdk_pkgtools | |
parent | 432bca4baa6d704301b0c6e24026018212ecc368 (diff) |
Added file digest computation
Support to compute file digest and save it to manifest file. Also extend
the manifest file module to be able to write content into temporary
file.
Change-Id: If1f3f42799eb527bdeac418d1a40aa203641f628
Issue-ID: VNFSDK-174
Signed-off-by: Lianhao Lu <lianhao.lu@intel.com>
Diffstat (limited to 'vnfsdk_pkgtools')
-rw-r--r-- | vnfsdk_pkgtools/cli/__main__.py | 4 | ||||
-rw-r--r-- | vnfsdk_pkgtools/packager/csar.py | 29 | ||||
-rw-r--r-- | vnfsdk_pkgtools/packager/manifest.py | 11 |
3 files changed, 39 insertions, 5 deletions
diff --git a/vnfsdk_pkgtools/cli/__main__.py b/vnfsdk_pkgtools/cli/__main__.py index 005a1ac..88776de 100644 --- a/vnfsdk_pkgtools/cli/__main__.py +++ b/vnfsdk_pkgtools/cli/__main__.py @@ -87,6 +87,10 @@ def parse_args(args_list): csar_create.add_argument( '--licenses', help='Directory containing license information, relative to service template directory') + csar_create.add_argument( + '--digest', + choices=['SHA256', 'SHA512'], + help='If present, means to check the file deigest in manifest; compute the digest using the specified hash algorithm of all files in the csar package to be put into the manifest file') csar_open = subparsers.add_parser('csar-open') diff --git a/vnfsdk_pkgtools/packager/csar.py b/vnfsdk_pkgtools/packager/csar.py index b4bee29..31fba8b 100644 --- a/vnfsdk_pkgtools/packager/csar.py +++ b/vnfsdk_pkgtools/packager/csar.py @@ -21,6 +21,7 @@ import zipfile import requests from ruamel import yaml # @UnresolvedImport +from vnfsdk_pkgtools.packager import manifest META_FILE = 'TOSCA-Metadata/TOSCA.meta' META_FILE_VERSION_KEY = 'TOSCA-Meta-File-Version' @@ -90,6 +91,12 @@ def write(source, entry, destination, logger, args): msg='Please specify a valid manifest file.', check_dir=False) metadata[META_ENTRY_MANIFEST_FILE_KEY] = args.manifest + manifest_file = manifest.Manifest(source, args.manifest) + manifest_file_full_path = os.path.join(source, args.manifest) + else: + manifest_file = None + manifest_file_full_path = None + if(args.history): check_file_dir(root=source, @@ -117,9 +124,14 @@ def write(source, entry, destination, logger, args): for root, dirs, files in os.walk(source): for file in files: file_full_path = os.path.join(root, file) - file_relative_path = os.path.relpath(file_full_path, source) - logger.debug('Writing to archive: {0}'.format(file_relative_path)) - f.write(file_full_path, file_relative_path) + # skip manifest file here in case we need to generate digest + if file_full_path!=manifest_file_full_path: + file_relative_path = os.path.relpath(file_full_path, source) + logger.debug('Writing to archive: {0}'.format(file_relative_path)) + f.write(file_full_path, file_relative_path) + if manifest_file and args.digest: + logger.debug('Update file digest: {0}'.format(file_relative_path)) + manifest_file.add_file(file_relative_path, args.digest) # add empty dir for dir in dirs: dir_full_path = os.path.join(root, dir) @@ -128,6 +140,13 @@ def write(source, entry, destination, logger, args): logger.debug('Writing to archive: {0}'.format(dir_relative_path)) f.write(dir_full_path + os.sep, dir_relative_path) + if manifest_file: + if args.digest: + logger.debug('Update manifest file to temporary file') + manifest_file_full_path = manifest_file.update_to_file(True) + logger.debug('Writing to archive: {0}'.format(args.manifest)) + f.write(manifest_file_full_path, args.manifest) + logger.debug('Writing new metadata file to {0}'.format(META_FILE)) f.writestr(META_FILE, yaml.dump(metadata, default_flow_style=False)) @@ -149,6 +168,7 @@ class _CSARReader(object): self.source = os.path.expanduser(source) self.destination = os.path.expanduser(destination) self.metadata = {} + self.manifest = None try: if not os.path.exists(self.source): raise ValueError('{0} does not exists. Please specify a valid CSAR path.' @@ -247,6 +267,9 @@ class _CSARReader(object): 'The manifest file {0} referenced by the metadata ' 'file does not exist.'.format(self.entry_manifest_file), check_dir=False) + self.manifest = manifest.Manifest(self.destination, + self.entry_manifest_file) + if(self.entry_history_file): check_file_dir(self.destination, diff --git a/vnfsdk_pkgtools/packager/manifest.py b/vnfsdk_pkgtools/packager/manifest.py index a2d9d70..d819a70 100644 --- a/vnfsdk_pkgtools/packager/manifest.py +++ b/vnfsdk_pkgtools/packager/manifest.py @@ -15,6 +15,7 @@ from collections import namedtuple import os +import tempfile import udatetime @@ -158,7 +159,13 @@ class Manifest(object): ret += "Hash: %s\n" % digest[1] return ret - def update_to_file(self): + def update_to_file(self, temporary=False): content = self.return_as_string() - with open(os.path.join(self.root, self.path), 'w') as fp: + if temporary: + abs_path = tempfile.mktemp() + else: + abs_path = os.path.abspath(os.path.join(self.root, self.path)) + + with open(abs_path, 'w') as fp: fp.write(content) + return abs_path |