Fix bug 1721: charms can include reference to .charm files
[osm/osmclient.git] / osmclient / common / package_tool.py
index 5b56265..436053c 100644 (file)
@@ -54,6 +54,7 @@ class PackageTool(object):
         detailed,
         netslice_subnets,
         netslice_vlds,
+        old,
     ):
         """
         **Create a package descriptor**
@@ -71,6 +72,7 @@ class PackageTool(object):
             - detailed: include all possible values for NSD, VNFD, NST
             - netslice_subnets: number of netslice_subnets for the NST
             - netslice_vlds: number of virtual link descriptors for the NST
+            - old: flag to create a descriptor using the previous OSM format (pre SOL006, OSM<9)
 
         :return: status
         """
@@ -79,7 +81,7 @@ class PackageTool(object):
         file_loader = PackageLoader("osmclient")
         env = Environment(loader=file_loader)
         if package_type == "ns":
-            template = env.get_template("nsd.yaml.j2")
+            template = env.get_template("nsd.yaml.j2" if not old else "nsd_old.yaml.j2")
             content = {
                 "name": package_name,
                 "vendor": vendor,
@@ -89,7 +91,9 @@ class PackageTool(object):
                 "detailed": detailed,
             }
         elif package_type == "vnf":
-            template = env.get_template("vnfd.yaml.j2")
+            template = env.get_template(
+                "vnfd.yaml.j2" if not old else "vnfd_old.yaml.j2"
+            )
             content = {
                 "name": package_name,
                 "vendor": vendor,
@@ -103,6 +107,7 @@ class PackageTool(object):
                 "detailed": detailed,
             }
         elif package_type == "nst":
+            # TODO: repo-index did not support nst in OSM<9, no changes in template
             template = env.get_template("nst.yaml.j2")
             content = {
                 "name": package_name,
@@ -117,9 +122,9 @@ class PackageTool(object):
                 "Wrong descriptor type {}. Options: ns, vnf, nst".format(package_type)
             )
 
-        # print("To be rendered: {}".format(content))
+        self._logger.debug("To be rendered: {}".format(content))
         output = template.render(content)
-        # print(output)
+        self._logger.debug(output)
 
         structure = self.discover_folder_structure(
             base_directory, package_name, override
@@ -149,27 +154,31 @@ class PackageTool(object):
             descriptors_paths = [
                 f for f in glob.glob(base_directory + "/*.yaml", recursive=recursive)
             ]
-        print("Base directory: {}".format(base_directory))
-        print("{} Descriptors found to validate".format(len(descriptors_paths)))
+        self._logger.info("Base directory: {}".format(base_directory))
+        self._logger.info(
+            "{} Descriptors found to validate".format(len(descriptors_paths))
+        )
         for desc_path in descriptors_paths:
             with open(desc_path) as descriptor_file:
                 descriptor_data = descriptor_file.read()
             desc_type = "-"
             try:
+                # TODO: refactor validation_im.yaml_validation to @staticmethod
                 desc_type, descriptor_data = validation_im.yaml_validation(
                     self, descriptor_data
                 )
+                self._logger.debug(f"Validate {desc_type} {descriptor_data}")
                 if not old_format:
                     if desc_type == "vnfd" or desc_type == "nsd":
-                        print(
+                        self._logger.error(
                             "OSM descriptor '{}' written in an unsupported format. Please update to ETSI SOL006 format".format(
                                 desc_path
                             )
                         )
-                        print(
+                        self._logger.warning(
                             "Package validation skipped. It can still be done with 'osm package-validate --old'"
                         )
-                        print(
+                        self._logger.warning(
                             "Package build can still be done with 'osm package-build --skip-validation'"
                         )
                         raise Exception("Not SOL006 format")
@@ -178,6 +187,7 @@ class PackageTool(object):
                     {"type": desc_type, "path": desc_path, "valid": "OK", "error": "-"}
                 )
             except Exception as e:
+                self._logger.error(f"Validation error: {e}", exc_info=True)
                 table.append(
                     {
                         "type": desc_type,
@@ -186,6 +196,7 @@ class PackageTool(object):
                         "error": str(e),
                     }
                 )
+            self._logger.debug(table[-1])
         return table
 
     def translate(self, base_directory, recursive=True, dryrun=False):
@@ -531,6 +542,8 @@ class PackageTool(object):
                 else:
                     if not os.path.isdir(
                         "{}/charms/{}".format(package_folder, charmName)
+                    ) and not os.path.isfile(
+                        "{}/charms/{}".format(package_folder, charmName)
                     ):
                         raise ClientException(
                             "The charm: {} referenced in the descriptor file "
@@ -712,9 +725,12 @@ class PackageTool(object):
                             self._logger.debug(
                                 "Copying tree: {} -> {}".format(s_charm, d_temp)
                             )
-                            shutil.copytree(
-                                s_charm, d_temp, symlinks=True, ignore=ignore
-                            )
+                            if os.path.isdir(s_charm):
+                                shutil.copytree(
+                                    s_charm, d_temp, symlinks=True, ignore=ignore
+                                )
+                            else:
+                                shutil.copy2(s_charm, d_temp)
                             self._logger.debug("DONE")
                     else:
                         self._logger.debug("Copying tree: {} -> {}".format(s, d))