From 2c03789c2bd0e798ab2a3f4f7b6eb459ac77138e Mon Sep 17 00:00:00 2001 From: Harish Venkatraman Date: Fri, 20 Nov 2020 03:32:11 +0000 Subject: [PATCH] New Feature:ORAN CSAR Package Validation tool Updated README Signed-off-by: Harish Venkatraman Change-Id: Ic158d137b56f07994d1a1331ad581b09e94594c9 --- .../CSAR-dest/Tosca-csar-ver-vnf-vsn.csar | Bin 0 -> 10044 bytes .../CSAR-dest/Tosca-ver-vnf-vsn.csar | Bin 0 -> 10041 bytes tools/oran-pkg-validation/CSAR-dest/ns-vsn.csar | Bin 0 -> 2767 bytes tools/oran-pkg-validation/CSAR-dest/vnf-vsn.csar | Bin 0 -> 13149 bytes .../CSAR-dest/yaml-error-vnf-vsn.csar | Bin 0 -> 10042 bytes .../CSAR-dest/yaml-file-error-vnf-vsn.csar | Bin 0 -> 10042 bytes tools/oran-pkg-validation/README | 27 ++++ tools/oran-pkg-validation/csar.py | 112 ++++++++++++++ tools/oran-pkg-validation/main.py | 67 ++++++++ tools/oran-pkg-validation/requirements.txt | 3 + tools/oran-pkg-validation/toscameta.py | 171 +++++++++++++++++++++ tools/oran-pkg-validation/unit-test/Tosca-error.sh | 22 +++ tools/oran-pkg-validation/unit-test/validate.sh | 24 +++ tools/oran-pkg-validation/unit-test/yaml-error.sh | 21 +++ tools/oran-pkg-validation/utils.py | 108 +++++++++++++ 15 files changed, 555 insertions(+) create mode 100755 tools/oran-pkg-validation/CSAR-dest/Tosca-csar-ver-vnf-vsn.csar create mode 100755 tools/oran-pkg-validation/CSAR-dest/Tosca-ver-vnf-vsn.csar create mode 100755 tools/oran-pkg-validation/CSAR-dest/ns-vsn.csar create mode 100755 tools/oran-pkg-validation/CSAR-dest/vnf-vsn.csar create mode 100755 tools/oran-pkg-validation/CSAR-dest/yaml-error-vnf-vsn.csar create mode 100755 tools/oran-pkg-validation/CSAR-dest/yaml-file-error-vnf-vsn.csar create mode 100644 tools/oran-pkg-validation/README create mode 100644 tools/oran-pkg-validation/csar.py create mode 100644 tools/oran-pkg-validation/main.py create mode 100644 tools/oran-pkg-validation/requirements.txt create mode 100644 tools/oran-pkg-validation/toscameta.py create mode 100755 tools/oran-pkg-validation/unit-test/Tosca-error.sh create mode 100755 tools/oran-pkg-validation/unit-test/validate.sh create mode 100755 tools/oran-pkg-validation/unit-test/yaml-error.sh create mode 100644 tools/oran-pkg-validation/utils.py diff --git a/tools/oran-pkg-validation/CSAR-dest/Tosca-csar-ver-vnf-vsn.csar b/tools/oran-pkg-validation/CSAR-dest/Tosca-csar-ver-vnf-vsn.csar new file mode 100755 index 0000000000000000000000000000000000000000..857a80f41742e496c65ab72ad3ee7bbf0a97d38c GIT binary patch literal 10044 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 literal 0 HcmV?d00001 diff --git a/tools/oran-pkg-validation/CSAR-dest/ns-vsn.csar b/tools/oran-pkg-validation/CSAR-dest/ns-vsn.csar new file mode 100755 index 0000000000000000000000000000000000000000..370c3019a5864cd07893bf8316400ba231908550 GIT binary patch literal 2767 zcmZuz2{=@38$O6(?7OK+5-EdWY*A^lBsAF?V~a3DL$+y9*2F9rR)FTcp11e#^yT5G|2Mj(ZFM|{aKFX!#v9Z3lICnH56CSjZt5#Rk=E|>fXgm-TY>#i~ z$f`Yqf|aS$>{BWsEH9bPjy&mi=4bJ)7<>si_+czM&G=SP1T0GQ*UZ_0E-x%96T=^U znH2!mcLTsy-NegYID0J48SjB7;ypbSE<3ni=(n=*oKzGFeoU_HfawgP0$#+GPlXMe zj%Mvgr{V-aWtzUOhaKLHEgcdSkho$HV{uQiYh`1gDriycZqPNBorpHBWbKzJvfTC& z2SN(1gf2#7q^Os!Z061-r}v4uIEVMk7WqdWS?|Ss9)&|jj`A0^fQn9OuL}!4#y(mY z)KO$Eu{30X%0jra4tN%*zPu+*|Bv36=>0)wrvN z8xD0v%W}bEKS@6xl7-Znp6Y7}5)k>%O=b~+G}4NHAoAd>+=Jx|%lL$0xnhA~BL9Je zMM;R1=-CeHC-b$9h8RawGLkB-c-*)+Md=kG%E^(-e) zNoQnD1JcM@WZoZMcTqQi4KZ=%I=~CA|X+IcQ=2urbp)j>5?}Hh^n!=okw+?_c!uUTlsBetJiVYFVubDq)HLLH zsi&&^Dce&rZxSOnz{9=(1t;!I8zb6aR0?U$0b|g!Ui|mOCf&3a1(QG7<{eiLu_M-W zcGA5ijk~U-;p}|U6m5zclb5(Xuhou7V&b%VbVKZhcbb?>gwy>Ak{jLhIE92OeQ!pXy*-M>{W>R1Sg=8DtBnJ)ZJV6u|Xv#0h4#TemZ7%jcWOY(}C+@O$ z6{B_MsDzEZyHjmC#i91lMiK1ubi^qAl?Ax|;Jq#c%)xpQfHpSi-_0_V3@mjd*9Z?@ z*GRpnM-7+HL0or9B#hY&roxQIo8UKJ4|A~H?_{27-!V0DE?F&Rd1{YxD!3=c_5Rz> z!LW?^ot`cM6YNjcc9&$*Pev3!(4B~=moF>7YU%flO(cl`o!f1GC(^tg!y8J+eQ#bb zZ086lT?h_)7()anw!TW7w|PUqpG#|!P)|_;X^gxt=$JvIqUvSD#^ZO+XwnuTfky#k zL&!DR);O{!Eze$5EVH6c&_FR5Z{Tga)(o4E?_WPKH@GUXGZBz4Xuax`wb$hN>xz!S z18ks-i&Ng?{fqu%R%2gtX}l4T{)(CD4uTJLVp29i^WEi|5e2Ih%$&_vyM>16kqi5q zQf{h5tW{G6GEsU;yg5r6s<`lP^OuSxJ|6qsss(IZQKmk2zT(UPu+^^F8Lis);?MS+ za|V@=rO4Ov5mshPKp@(%f*viO(k-HEZx$O?p}&5YWS$H00Fdd#0fCYlUGo!sxSkz6kfL0>4JDb22vN%d&Isn2mw<09clk zv(i+o>3F%hD7Tu-%xQay@d-{09}oB)H<+ybzCT_Xlqr>hlbU!PI}0CaZnm!+5)(LZLckh{?23JI^WphfzdLdg@4LiKy~)US zA;?fj2HdXSFw@xV=3b$rQJUGQ;O~-cv<0`?fwdx4%*6&_aW884o)`Bkh;|za^L8rv z?p4VKrF!23<-gr7BP|#%%b(0WnU|fK^x@ru;zI?{>#E7B@Lt1V!s(VhpA)PTXYqZb zP5P?2GP&nfs96n2iBL10*LGvdWeLmrFZa>)*N+4kBxNdRjvgt5!V7WT$~~WNpf~rq z!0~HVi_HFq^QIm92rgukrK*fNE2;v-w?C&hW3rWlGlU#}K}C3>2;Pu7+{zljc-aedwl`pRTt#Ke5;$FKcwmPU%PjYQqTXBqgV8MECv!FHFJ@Lo1^}=!j(H{k7}{zPz&}N_iT(fp literal 0 HcmV?d00001 diff --git a/tools/oran-pkg-validation/CSAR-dest/vnf-vsn.csar b/tools/oran-pkg-validation/CSAR-dest/vnf-vsn.csar new file mode 100755 index 0000000000000000000000000000000000000000..1e297f9366c9dc9037c9b023502ad3e2b26014f0 GIT binary patch literal 13149 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 literal 0 HcmV?d00001 diff --git a/tools/oran-pkg-validation/CSAR-dest/yaml-error-vnf-vsn.csar b/tools/oran-pkg-validation/CSAR-dest/yaml-error-vnf-vsn.csar new file mode 100755 index 0000000000000000000000000000000000000000..3b4ab154ff70b83f385f64272cbc59bbafae2b6a GIT binary patch literal 10042 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 literal 0 HcmV?d00001 diff --git a/tools/oran-pkg-validation/README b/tools/oran-pkg-validation/README new file mode 100644 index 0000000..1984db7 --- /dev/null +++ b/tools/oran-pkg-validation/README @@ -0,0 +1,27 @@ +ORAN CSAR Package validating Tool +--------------------------------- +ORAN CSAR package validating tool provides the testers and DevOps engineers to validate the TOSCA version, CSAR version and verify if the yaml file exists in the directory and the enttry definition contents of yaml file. + +Source code: + +Tool file contents: + +main.py +csar.py +Toscameta.py +utlis.py + +Usage: + +python3 main.py -d [--no-verify-cert] + + : source directory where the csar package zip file exists. + : destination directory to unzip the csar contents. +[--no-verify-cert] : Optional parameter. + + +example: + +python3 main.py csar-validate -d /tmp/ [--no-verify-cert] CSAR-dest/vnf-vsn.csar + +The ORAN CSAR package validation code leverages from vnfsdk CSAR pkg code with modification. diff --git a/tools/oran-pkg-validation/csar.py b/tools/oran-pkg-validation/csar.py new file mode 100644 index 0000000..2955070 --- /dev/null +++ b/tools/oran-pkg-validation/csar.py @@ -0,0 +1,112 @@ + +import logging +import os +import tempfile +import zipfile + +import requests +from ruamel import yaml + +import toscameta +import utils + +LOG = logging.getLogger(__name__) + +class _CSARReader(object): + + def __init__(self, source, destination, no_verify_cert=True): + if os.path.isdir(destination) and os.listdir(destination): + raise ValueError('{0} already exists and is not empty. ' + 'Please specify the location where the CSAR ' + 'should be extracted.'.format(destination)) + downloaded_csar = '://' in source + if downloaded_csar: + file_descriptor, download_target = tempfile.mkstemp() + os.close(file_descriptor) + self._download(source, download_target) + source = download_target + self.source = os.path.expanduser(source) + self.destination = os.path.expanduser(destination) + self.metadata = None + self.manifest = None + try: + if not os.path.exists(self.source): + raise ValueError('{0} does not exists. Please specify a valid CSAR path.' + .format(self.source)) + if not zipfile.is_zipfile(self.source): + raise ValueError('{0} is not a valid CSAR.'.format(self.source)) + self._extract() + self._read_metadata() + finally: + if downloaded_csar: + os.remove(self.source) + + @property + def created_by(self): + return self.metadata.created_by + + @property + def csar_version(self): + return self.metadata.csar_version + + @property + def meta_file_version(self): + return self.metadata.meta_file_version + + @property + def entry_definitions(self): + return self.metadata.entry_definitions + + @property + def entry_definitions_yaml(self): + with open(os.path.join(self.destination, self.entry_definitions)) as f: + return yaml.safe_load(f) + + @property + def entry_manifest_file(self): + return self.metadata.entry_manifest_file + + @property + def entry_history_file(self): + return self.metadata.entry_history_file + + @property + def entry_tests_dir(self): + return self.metadata.entry_tests_dir + + @property + def entry_licenses_dir(self): + return self.metadata.entry_licenses_dir + + @property + def entry_certificate_file(self): + return self.metadata.entry_certificate_file + + def _extract(self): + LOG.debug('Extracting CSAR contents') + if not os.path.exists(self.destination): + os.mkdir(self.destination) + with zipfile.ZipFile(self.source) as f: + f.extractall(self.destination) + LOG.debug('CSAR contents successfully extracted') + + def _read_metadata(self): + self.metadata = toscameta.create_from_file(self.destination) + + def _download(self, url, target): + response = requests.get(url, stream=True) + if response.status_code != 200: + raise ValueError('Server at {0} returned a {1} status code' + .format(url, response.status_code)) + LOG.info('Downloading {0} to {1}'.format(url, target)) + with open(target, 'wb') as f: + for chunk in response.iter_content(chunk_size=8192): + if chunk: + f.write(chunk) + + +def read(source, destination, no_verify_cert=False): + return _CSARReader(source=source, + destination=destination, + no_verify_cert=no_verify_cert) + diff --git a/tools/oran-pkg-validation/main.py b/tools/oran-pkg-validation/main.py new file mode 100644 index 0000000..7964916 --- /dev/null +++ b/tools/oran-pkg-validation/main.py @@ -0,0 +1,67 @@ + +import sys +import logging +import argparse +import shutil +import tempfile + +import pkg_resources + +import csar + +LOG = logging.getLogger(__name__) + +def csar_validate_func(namespace): + try: + csar.read(namespace.source, + namespace.destination, + namespace.no_verify_cert) + finally: + LOG.debug('Calling rmtree: {}'.format(namespace.destination)) + shutil.rmtree(namespace.destination, ignore_errors=True) + +def parse_args(args_list): + """ + Entry point + """ + parser = argparse.ArgumentParser(description='CSAR Validation tool') + parser.add_argument('-v', '--verbose', + dest='verbosity', + action='count', + default=0, + help='Set verbosity level (can be passed multiple times)') + + subparsers = parser.add_subparsers(help='csar-validate') + + csar_open = subparsers.add_parser('csar-validate') + csar_open.set_defaults(func=csar_validate_func) + csar_open.add_argument( + 'source', + help='CSAR file location') + csar_open.add_argument( + '-d', '--destination', + help='Output directory to extract the CSAR into', + required=True) + csar_open.add_argument( + '--no-verify-cert', + action='store_true', + help="Do NOT verify the signer's certificate") + + return parser.parse_args(args_list) + + +def init_logging(): +# verbosity = [logging.WARNING, logging.INFO, logging.DEBUG] +# + logging.basicConfig(level=logging.INFO) + +def main(): + args = parse_args(sys.argv[1:]) +# logging.basicConfig(level=logging.DEBUG) + init_logging() + return args.func(args) + + +if __name__ == '__main__': + main() + diff --git a/tools/oran-pkg-validation/requirements.txt b/tools/oran-pkg-validation/requirements.txt new file mode 100644 index 0000000..103f925 --- /dev/null +++ b/tools/oran-pkg-validation/requirements.txt @@ -0,0 +1,3 @@ +install python3-pip +pip3 install ruamel.yaml +pip3 install udatetime diff --git a/tools/oran-pkg-validation/toscameta.py b/tools/oran-pkg-validation/toscameta.py new file mode 100644 index 0000000..9001815 --- /dev/null +++ b/tools/oran-pkg-validation/toscameta.py @@ -0,0 +1,171 @@ + +import logging +import os +import pprint + +from ruamel import yaml +import six + +import utils + +LOG = logging.getLogger(__name__) + +META_FILE = 'TOSCA-Metadata/TOSCA.meta' + +META_FILE_VERSION_KEY = 'TOSCA-Meta-File-Version' +META_FILE_VERSION_VALUE = '1.0' +META_CSAR_VERSION_KEY = 'CSAR-Version' +META_CSAR_VERSION_VALUE = '1.1' +META_CREATED_BY_KEY = 'Created-By' +META_CREATED_BY_VALUE = 'ORAN' + +META_ENTRY_DEFINITIONS_KEY = 'Entry-Definitions' + +BASE_META = { + META_FILE_VERSION_KEY: META_FILE_VERSION_VALUE, + META_CSAR_VERSION_KEY: META_CSAR_VERSION_VALUE, +} + + +class ToscaMeta(object): + META_ENTRY_MANIFEST_FILE_KEY = 'ETSI-Entry-Manifest' + META_ENTRY_HISTORY_FILE_KEY = 'ETSI-Entry-Change-Log' + META_ENTRY_TESTS_DIR_KEY = 'ETSI-Entry-Tests' + META_ENTRY_LICENSES_DIR_KEY = 'ETSI-Entry-Licenses' + META_ENTRY_CERT_FILE_KEY = 'ETSI-Entry-Certificate' + REQUIRED_KEYS = [ + META_FILE_VERSION_KEY, META_CSAR_VERSION_KEY, + META_CREATED_BY_KEY, META_ENTRY_DEFINITIONS_KEY, + META_ENTRY_MANIFEST_FILE_KEY, META_ENTRY_HISTORY_FILE_KEY, + META_ENTRY_LICENSES_DIR_KEY, ] + OPTIONAL_KEYS = [META_ENTRY_TESTS_DIR_KEY, META_ENTRY_CERT_FILE_KEY] + + def __init__(self, base_dir, entry, manifest=None, changelog=None, + licenses=None, tests=None, certificate=None, + meta_file_version=META_FILE_VERSION_VALUE, + meta_csar_version=META_CSAR_VERSION_VALUE, + meta_created_by=META_CREATED_BY_VALUE): + + self.base_dir = base_dir + + metadata = {} + metadata[META_FILE_VERSION_KEY] = str(meta_file_version) + metadata[META_CSAR_VERSION_KEY] = str(meta_csar_version) + metadata[META_CREATED_BY_KEY] = meta_created_by + metadata[META_ENTRY_DEFINITIONS_KEY] = entry + + self.metadata = self._validate(metadata) + + def _validate(self, metadata): + LOG.debug('CSAR Validating metadata file: {0}'.format(metadata)) + for (key, value) in six.iteritems(BASE_META): + LOG.info('TOSCA.meta: {} {}'.format(key, value)) + LOG.info('get.meta: {} '.format(metadata.get(key))) + if metadata.get(key) != value: + raise ValueError('TOSCA.meta: {} must be {}'.format(key, value)) + + utils.check_file_dir(root=self.base_dir, + entry=metadata.get(META_ENTRY_DEFINITIONS_KEY), + msg='Please specify a valid entry point.', + check_dir=False) + entry_file = os.path.join(self.base_dir, + metadata.get(META_ENTRY_DEFINITIONS_KEY)) + LOG.info('entry file: {} '.format(entry_file)) + try: + with open(entry_file) as f: + yaml.safe_load(f)['tosca_definitions_version'] + except Exception: + raise ValueError('Entry file {} is not a valid tosca simple yaml file'.format(entry_file)) + return metadata + + def dump_as_string(self): + s = "" + for key in self.REQUIRED_KEYS + self.OPTIONAL_KEYS: + if self.metadata.get(key): + s += "{}: {}\n".format(key, self.metadata.get(key)) + return s + + @property + def created_by(self): + return self.metadata.get(META_CREATED_BY_KEY) + + @property + def csar_version(self): + return self.metadata.get(META_CSAR_VERSION_KEY) + + @property + def meta_file_version(self): + return self.metadata.get(META_FILE_VERSION_KEY) + + @property + def entry_definitions(self): + return self.metadata.get(META_ENTRY_DEFINITIONS_KEY) + + @property + def entry_manifest_file(self): + return self.metadata.get(self.META_ENTRY_MANIFEST_FILE_KEY) + + @property + def entry_history_file(self): + return self.metadata.get(self.META_ENTRY_HISTORY_FILE_KEY) + + @property + def entry_tests_dir(self): + return self.metadata.get(self.META_ENTRY_TESTS_DIR_KEY) + + @property + def entry_licenses_dir(self): + return self.metadata.get(self.META_ENTRY_LICENSES_DIR_KEY) + + @property + def entry_certificate_file(self): + return self.metadata.get(self.META_ENTRY_CERT_FILE_KEY) + + +class ToscaMeta241(ToscaMeta): + # SOL004 v2.4.1 + META_ENTRY_MANIFEST_FILE_KEY = 'Entry-Manifest' + META_ENTRY_HISTORY_FILE_KEY = 'Entry-Change-Log' + META_ENTRY_TESTS_DIR_KEY = 'Entry-Tests' + META_ENTRY_LICENSES_DIR_KEY = 'Entry-Licenses' + META_ENTRY_CERT_FILE_KEY = 'Entry-Certificate' + REQUIRED_KEYS = [ + META_FILE_VERSION_KEY, META_CSAR_VERSION_KEY, + META_CREATED_BY_KEY, META_ENTRY_DEFINITIONS_KEY, ] + OPTIONAL_KEYS = [ + META_ENTRY_MANIFEST_FILE_KEY, META_ENTRY_HISTORY_FILE_KEY, + META_ENTRY_LICENSES_DIR_KEY, META_ENTRY_TESTS_DIR_KEY, + META_ENTRY_CERT_FILE_KEY, ] + + +class ToscaMeta261(ToscaMeta): + # SOL004 v2.6.1 + pass + + +def create_from_file(base_dir): + csar_metafile = os.path.join(base_dir, META_FILE) + if not os.path.exists(csar_metafile): + raise ValueError('Metadata file {0} is missing from the CSAR'.format(csar_metafile)) + LOG.debug('CSAR metadata file: {0}'.format(csar_metafile)) + LOG.debug('Attempting to parse CSAR metadata YAML') + with open(csar_metafile) as f: + metadata = yaml.safe_load(f) + LOG.debug('CSAR metadata:\n{0}'.format(pprint.pformat(metadata))) + # By default we assume it's SOL004 2.4.1 + cls = ToscaMeta241 + for key in metadata.keys(): + if key.startswith('ETSI-'): + cls = ToscaMeta261 + break + return cls(base_dir, + entry=metadata.get(META_ENTRY_DEFINITIONS_KEY), + manifest=metadata.get(cls.META_ENTRY_MANIFEST_FILE_KEY), + changelog=metadata.get(cls.META_ENTRY_HISTORY_FILE_KEY), + licenses=metadata.get(cls.META_ENTRY_LICENSES_DIR_KEY), + tests=metadata.get(cls.META_ENTRY_TESTS_DIR_KEY), + certificate=metadata.get(cls.META_ENTRY_CERT_FILE_KEY), + meta_file_version=metadata.get(META_FILE_VERSION_KEY), + meta_csar_version=metadata.get(META_CSAR_VERSION_KEY), + meta_created_by=metadata.get(META_CREATED_BY_KEY)) + diff --git a/tools/oran-pkg-validation/unit-test/Tosca-error.sh b/tools/oran-pkg-validation/unit-test/Tosca-error.sh new file mode 100755 index 0000000..bf4ae00 --- /dev/null +++ b/tools/oran-pkg-validation/unit-test/Tosca-error.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +echo +echo "Validating TOSCA Version(Tosca-ver-vnf-vsn.csar) Unit test case 1" +python3 ../main.py csar-validate -d /tmp/vh2/ --no-verify-cert ../CSAR-dest/Tosca-ver-vnf-vsn.csar +if [ $? -eq 0 ] +then + echo "TOSCA Unit test case 1 Passed" +else + echo "TOSCA Unit test case 1 Failed" +fi +echo +echo "Validating TOSCA CSAR Version(Tosca-csar-ver-vnf-vsn.csar) Unit test case 2" +echo +python3 ../main.py csar-validate -d /tmp/vh2/ --no-verify-cert ../CSAR-dest/Tosca-csar-ver-vnf-vsn.csar +if [ $? -eq 0 ] +then + echo "TOSCA Unit test case 2 Passed" +else + echo "TOSCA Unit test case 2 Failed" +fi + diff --git a/tools/oran-pkg-validation/unit-test/validate.sh b/tools/oran-pkg-validation/unit-test/validate.sh new file mode 100755 index 0000000..29f6a7b --- /dev/null +++ b/tools/oran-pkg-validation/unit-test/validate.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +echo +echo "Validating vnf-vsn.csar Unit test case 1" +python3 ../main.py csar-validate -d /tmp/vh2/ --no-verify-cert ../CSAR-dest/vnf-vsn.csar +if [ $? -eq 0 ] +then + echo "Unit test case 1 Passed" +else + echo "Unit test case 1 Failed" +fi +echo +echo "Validating ns-vsn.csar unit test case 2" +echo +python3 ../main.py csar-validate -d /tmp/vh2/ --no-verify-cert ../CSAR-dest/ns-vsn.csar +echo +if [ $? -eq 0 ] +then + echo "Unit test case 2 Passed" +else + echo "Unit test case 2 Failed" +fi +echo + diff --git a/tools/oran-pkg-validation/unit-test/yaml-error.sh b/tools/oran-pkg-validation/unit-test/yaml-error.sh new file mode 100755 index 0000000..0aedf10 --- /dev/null +++ b/tools/oran-pkg-validation/unit-test/yaml-error.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +echo +echo "Validating YAML error(yaml-error-vnf-vsn.csar) Unit test case 1" +python3 ../main.py csar-validate -d /tmp/vh2/ --no-verify-cert ../CSAR-dest/yaml-error-vnf-vsn.csar +if [ $? -eq 0 ] +then + echo "YAML error Unit test case 1 Passed" +else + echo "YAML error Unit test case 1 Failed" +fi +echo +echo "Validating YAML file error(yaml-file-error-vnf-vsn.csar) Unit test case 1" +python3 ../main.py csar-validate -d /tmp/vh2/ --no-verify-cert ../CSAR-dest/yaml-file-error-vnf-vsn.csar +if [ $? -eq 0 ] +then + echo "YAML file error Unit test case 2 Passed" +else + echo "YAML file error Unit test case 2 Failed" +fi + diff --git a/tools/oran-pkg-validation/utils.py b/tools/oran-pkg-validation/utils.py new file mode 100644 index 0000000..bef8967 --- /dev/null +++ b/tools/oran-pkg-validation/utils.py @@ -0,0 +1,108 @@ + +import hashlib +from io import BytesIO +import logging +import os +import os.path +import subprocess +import tempfile + +import requests +import six +from six.moves.urllib import parse as urlparse + + +LOG = logging.getLogger(__name__) + + +def check_file_dir(root, entry, msg, check_for_non=False, check_dir=False): + path = os.path.join(root, entry) + LOG.debug('Path is {} ' .format(path)) + if check_for_non: + ret = not os.path.exists(path) + error_msg = '{0} already exists. ' + msg + elif check_dir: + ret = os.path.isdir(path) + error_msg = '{0} is not an existing directory. ' + msg + else: + ret = os.path.isfile(path) + error_msg = '{0} is not an existing file. ' + msg + if not ret: + raise ValueError(error_msg.format(path)) + + +def _hash_value_for_file(f, hash_function, block_size=2**20): + while True: + data = f.read(block_size) + if not data: + break + hash_function.update(data) + + return hash_function.hexdigest() + + +def cal_file_hash(root, path, algo): + if algo == 'SHA-256': + algo = 'SHA256' + elif algo == 'SHA-512': + algo = 'SHA512' + h = hashlib.new(algo) + if urlparse.urlparse(path).scheme: + r = requests.get(path) + if r.status_code != 200: + raise ValueError('Server at {0} returned a {1} status code' + .format(path, r.status_code)) + fp = BytesIO(r.content) + return _hash_value_for_file(fp, h) + else: + with open(os.path.join(root, path), 'rb') as fp: + return _hash_value_for_file(fp, h) + + +def _run_cmd(cmd, **kwargs): + if isinstance(cmd, list): + args = cmd + elif isinstance(cmd, str): + args = [cmd] + else: + raise RuntimeError("cmd must be string or list") + + for key, value in six.iteritems(kwargs): + args.append(key) + if value: + args.append(value) + try: + LOG.debug("Executing %s", args) + return str(subprocess.check_output(args).decode('utf-8')) + except subprocess.CalledProcessError as e: + LOG.error("Executing %s failed with return code %d, output: %s", + e.cmd, e.returncode, e.output) + raise e + + +def sign(msg_file, cert_file, key_file): + args = ["openssl", "cms", "-sign", "-binary"] + kwargs = { + '-in': os.path.abspath(msg_file), + '-signer': os.path.abspath(cert_file), + '-inkey': os.path.abspath(key_file), + '-outform': 'PEM', } + + return _run_cmd(args, **kwargs) + + +def verify(msg_file, cert_file, cms, no_verify_cert=False): + args = ["openssl", "cms", "-verify", "-binary"] + if no_verify_cert: + args.append("-noverify") + + with tempfile.NamedTemporaryFile(mode='w') as f: + f.write(cms) + f.flush() + kwargs = { + '-in': f.name, + '-inform': 'PEM', + '-content': os.path.abspath(msg_file), + '-certfile': os.path.abspath(cert_file), } + return _run_cmd(args, **kwargs) + -- 2.16.6