Add automatic build for ops charms 20/10520/3
authorDavid Garcia <david.garcia@canonical.com>
Mon, 22 Mar 2021 11:56:16 +0000 (12:56 +0100)
committerDavid Garcia <david.garcia@canonical.com>
Mon, 22 Mar 2021 13:21:19 +0000 (14:21 +0100)
Added charmcraft dependency for building charms.
For using this utility, place the src code of the charm under
charms/ops, and the osmclient will build and place the charm code in the
charms/ folder.

Change-Id: Ib86d9ac966822131b2df3fc7621b42a49be7baba
Signed-off-by: David Garcia <david.garcia@canonical.com>
osmclient/common/package_tool.py
requirements.txt
setup.py
snap/snapcraft.yaml

index e792ce9..473ff3d 100644 (file)
@@ -367,6 +367,8 @@ class PackageTool(object):
                     print('Building charm {}/charms/layers/{}'.format(package_folder, charmName))
                     self.charm_build(package_folder, charmName)
                     print('Charm built: {}'.format(charmName))
+                elif os.path.isdir('{}/charms/ops/{}'.format(package_folder, charmName)):
+                    self.charmcraft_build(package_folder, charmName)
                 else:
                     if not os.path.isdir('{}/charms/{}'.format(package_folder, charmName)):
                         raise ClientException('The charm: {} referenced in the descriptor file '
@@ -431,6 +433,26 @@ class PackageTool(object):
             raise ClientException("failed to build the charm: {}".format(src_folder))
         self._logger.verbose("charm {} built".format(src_folder))
 
+    def charmcraft_build(self, package_folder, charm_name):
+        """
+        Build the charms inside the package (new operator framework charms)
+        params: package_folder is the name of the folder where is the charms to compile.
+                build_name is the name of the layer or interface
+        """
+        self._logger.debug("Building charm {}".format(charm_name))
+        src_folder = f"{package_folder}/charms/ops/{charm_name}"
+        current_directory = os.getcwd()
+        os.chdir(src_folder)
+        try:
+            result = subprocess.run(["charmcraft", "build"])
+            if result.returncode == 1:
+                raise ClientException("failed to build the charm: {}".format(src_folder))
+            subprocess.run(["rm", "-rf", f"../../{charm_name}"])
+            subprocess.run(["mv", "build", f"../../{charm_name}"])
+            self._logger.verbose("charm {} built".format(src_folder))
+        finally:
+            os.chdir(current_directory)
+
     def build_tarfile(self, package_folder, charm_list=None):
         """
         Creates a .tar.gz file given a package_folder
@@ -556,17 +578,14 @@ class PackageTool(object):
     def _charms_search_on_vnfd_sol006_dict(self, sol006_dict):
         self._logger.debug("")
         charms_list = []
-        for k1, v1 in sol006_dict.items():
-            for k2, v2 in v1.items():
-                if k2 == "df":
-                    for df in v2:
-                        lcm_ops = df.get("lcm-operations-configuration", {})
-                        ops_config = lcm_ops.get("operate-vnf-op-config", {})
-                        for day_12_config in ops_config.get("day1-2", []):
-                            self._logger.debug("Execution environment found")
-                            for ee in day_12_config.get("execution-environment-list", []):
-                                if "juju" in ee:
-                                    charms_list.append((ee["juju"]['charm']))
+        dfs = sol006_dict.get("vnfd", {}).get("df", [])
+        for df in dfs:
+            day_1_2s = df.get("lcm-operations-configuration", {}).get("operate-vnf-op-config", {}).get("day1-2")
+            for day_1_2 in day_1_2s:
+                exec_env_list = day_1_2.get("execution-environment-list", [])
+                for exec_env in exec_env_list:
+                    if "juju" in exec_env and "charm" in exec_env["juju"]:
+                        charms_list.append(exec_env["juju"]["charm"])
         return charms_list
 
     def _charms_search_on_nsd_sol006_dict(self, sol006_dict):
index f3cb782..ee434ca 100644 (file)
 
 Click
 prettytable<=1.0.1
-PyYAML
+PyYAML==5.3.1
 pycurl
 python-magic
-jinja2
+jinja2==2.11.2
 verboselogs
 packaging
-requests
+requests==2.24.0
+charmcraft
 git+https://osm.etsi.org/gerrit/osm/IM.git#egg=osm-im
index 43ce3ee..22b5a54 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -28,8 +28,9 @@ setup(
     description=_description,
     license='Apache 2',
     install_requires=[
-        'Click', 'prettytable', 'pyyaml', 'pycurl', 'python-magic',
-        'jinja2', 'osm-im', 'verboselogs', 'packaging', 'requests',
+        'Click', 'prettytable', 'pyyaml==5.3.1', 'pycurl', 'python-magic',
+        'jinja2==2.11.2', 'osm-im', 'verboselogs', 'packaging',
+        'requests==2.24.0', 'charmcraft',
     ],
     setup_requires=['setuptools-version-command'],
     test_suite='nose.collector',
index 84635ae..e131f3b 100644 (file)
@@ -37,7 +37,7 @@ apps:
       - home
       - ssh-public-keys
     environment:
-      PATH: $SNAP/usr/bin:$SNAP/bin/:$PATH
+      PATH: $SNAP/usr/bin:$SNAP/bin/:$PATH:$SNAP/usr/local/bin/
       PYTHONPATH: $SNAP/usr/lib/python3/dist-packages:$PYTHONPATH
       MAGIC: $SNAP/usr/share/file/magic.mgc
 
@@ -52,6 +52,8 @@ parts:
       - git
       - make
       - wget
+      - libcurl4-openssl-dev
+      - libssl-dev
     stage-packages:
       - libmagic1
       - python3
@@ -70,6 +72,7 @@ parts:
       git checkout $BRANCH_OR_TAG
       $SNAPCRAFT_PART_INSTALL/usr/bin/pip3 install .
       cd ../ && rm -rf IM/
+      $SNAPCRAFT_PART_INSTALL/usr/bin/pip3 install -r requirements.txt
       $SNAPCRAFT_PART_INSTALL/usr/bin/pip3 install .
       rm -rf .tox
       snapcraftctl build