RIFT 16618 access checksum validation information through a different property.
[osm/SO.git] / rwlaunchpad / plugins / rwlaunchpadtasklet / rift / tasklets / rwlaunchpad / uploader.py
index c8fc3fc..e89c50a 100644 (file)
@@ -251,6 +251,7 @@ class UpdatePackage(downloader.DownloaderProtocol):
             with pkg as temp_package:
                 package_checksums = self.validate_package(temp_package)
                 stored_package = self.update_package(temp_package)
+                self.validate_vnfd_fields(temp_package)
 
                 try:
                     self.extract_charms(temp_package)
@@ -391,17 +392,34 @@ class UpdatePackage(downloader.DownloaderProtocol):
         except rift.package.icon.IconExtractionError as e:
             raise MessageException(UpdateExtractionError()) from e
 
+    def validate_vnfd_fields(self, package):
+        # We can add more VNFD validations here. Currently we are validating only cloud-init
+        if package.descriptor_msg is not None:
+            self.validate_cloud_init_file(package)
+
+    def validate_cloud_init_file(self, package):
+        """ This validation is for VNFDs with associated VDUs. """
+        if 'vdu' in package.descriptor_msg.as_dict():
+            for vdu in package.descriptor_msg.as_dict()['vdu']:
+                if 'cloud_init_file' in vdu:
+                    cloud_init_file = vdu['cloud_init_file']
+                    for file in package.files:
+                        if file.endswith('/' + cloud_init_file) is True:
+                            return
+                    raise MessageException(
+                        OnboardError("Cloud-Init file reference in VNFD does not match with cloud-init file"))
+
     def validate_package(self, package):
         checksum_validator = rift.package.package.PackageChecksumValidator(self.log)
 
         try:
-            file_checksums = checksum_validator.validate(package)
+            checksum_validator.validate(package)
         except rift.package.package.PackageFileChecksumError as e:
             raise MessageException(UpdateChecksumMismatch(e.filename)) from e
         except rift.package.package.PackageValidationError as e:
             raise MessageException(UpdateUnreadablePackage()) from e
 
-        return file_checksums
+        return checksum_validator.checksums
 
     def update_descriptors(self, package):
         descriptor_msg = package.descriptor_msg
@@ -433,6 +451,7 @@ class OnboardPackage(downloader.DownloaderProtocol):
             with pkg as temp_package:
                 package_checksums = self.validate_package(temp_package)
                 stored_package = self.store_package(temp_package)
+                self.validate_vnfd_fields(temp_package)
 
                 try:
                     self.extract_charms(temp_package)
@@ -569,17 +588,40 @@ class OnboardPackage(downloader.DownloaderProtocol):
         except rift.package.icon.IconExtractionError as e:
             raise MessageException(OnboardExtractionError()) from e
 
+    def validate_vnfd_fields(self, package):
+        # We can add more VNFD validations here. Currently we are validating only cloud-init
+        if package.descriptor_msg is not None:
+            self.validate_cloud_init_file(package)
+
+    def validate_cloud_init_file(self, package):
+        """ This validation is for VNFDs with associated VDUs. """
+        if 'vdu' in package.descriptor_msg.as_dict():
+            for vdu in package.descriptor_msg.as_dict()['vdu']:
+                if 'cloud_init_file' in vdu:
+                    cloud_init_file = vdu['cloud_init_file']
+                    for file in package.files:
+                        if file.endswith('/' + cloud_init_file) is True:
+                            return
+                    raise MessageException(
+                        OnboardError("Cloud-Init file reference in VNFD does not match with cloud-init file"))
+
     def validate_package(self, package):
-        checksum_validator = rift.package.package.PackageChecksumValidator(self.log)
+        validators = (
+                rift.package.package.PackageChecksumValidator(self.log),
+                rift.package.package.PackageConstructValidator(self.log),
+                )
 
-        try:
-            file_checksums = checksum_validator.validate(package)
-        except rift.package.package.PackageFileChecksumError as e:
-            raise MessageException(OnboardChecksumMismatch(e.filename)) from e
-        except rift.package.package.PackageValidationError as e:
-            raise MessageException(OnboardUnreadablePackage()) from e
+        # Run the validators for checksum and package construction for imported pkgs
+        for validator in validators:
+            try:
+                validator.validate(package)
+
+            except rift.package.package.PackageFileChecksumError as e:
+                raise MessageException(OnboardChecksumMismatch(e.filename)) from e
+            except rift.package.package.PackageValidationError as e:
+                raise MessageException(OnboardUnreadablePackage()) from e
 
-        return file_checksums
+        return validators[0].checksums
 
     def onboard_descriptors(self, package):
         descriptor_msg = package.descriptor_msg
@@ -669,6 +711,7 @@ class UploaderApplication(tornado.web.Application):
                     self,
                     store_map=self.package_store_map,
                     exporter=self.exporter,
+                    onboarder=self.onboarder, 
                     catalog_map=catalog_map
                     )