Fix 1539: Add --skip-repo option for Helm 16/10916/5
authorDavid Garcia <david.garcia@canonical.com>
Fri, 28 May 2021 14:21:51 +0000 (16:21 +0200)
committergarciadav <david.garcia@canonical.com>
Wed, 2 Jun 2021 13:25:02 +0000 (15:25 +0200)
If stablerepourl is not set, Helm will skip adding the stablerepo.

Depends on:
- https://osm.etsi.org/gerrit/#/c/osm/devops/+/10915

Change-Id: I11f10fdfba24ec274d463f12c07d7b0247b37068
Signed-off-by: David Garcia <david.garcia@canonical.com>
n2vc/k8s_helm3_conn.py
n2vc/k8s_helm_base_conn.py
n2vc/k8s_helm_conn.py
n2vc/tests/unit/test_k8s_helm3_conn.py

index 06e5788..404485f 100644 (file)
@@ -42,7 +42,6 @@ class K8sHelm3Connector(K8sHelmBaseConnector):
         helm_command: str = "/usr/bin/helm3",
         log: object = None,
         on_update_db=None,
-        vca_config: dict = None,
     ):
         """
         Initializes helm connector for helm v3
@@ -64,7 +63,6 @@ class K8sHelm3Connector(K8sHelmBaseConnector):
             kubectl_command=kubectl_command,
             helm_command=helm_command,
             on_update_db=on_update_db,
-            vca_config=vca_config,
         )
 
         self.log.info("K8S Helm3 connector initialized")
@@ -300,12 +298,8 @@ class K8sHelm3Connector(K8sHelmBaseConnector):
         # If default repo is not included add
         cluster_uuid = "{}:{}".format(namespace, cluster_id)
         repo_list = await self.repo_list(cluster_uuid)
-        for repo in repo_list:
-            self.log.debug("repo")
-            if repo["name"] == "stable":
-                self.log.debug("Default repo already present")
-                break
-        else:
+        stable_repo = [repo for repo in repo_list if repo["name"] == "stable"]
+        if not stable_repo and self._stable_repo_url:
             await self.repo_add(cluster_uuid, "stable", self._stable_repo_url)
 
         # Returns False as no software needs to be uninstalled
index b3d7bda..4a43ee2 100644 (file)
@@ -31,6 +31,7 @@ import os
 import yaml
 from uuid import uuid4
 
+from n2vc.config import EnvironConfig
 from n2vc.exceptions import K8sException
 from n2vc.k8s_conn import K8sConnector
 
@@ -44,7 +45,6 @@ class K8sHelmBaseConnector(K8sConnector):
     """
 
     service_account = "osm"
-    _STABLE_REPO_URL = "https://charts.helm.sh/stable"
 
     def __init__(
         self,
@@ -54,7 +54,6 @@ class K8sHelmBaseConnector(K8sConnector):
         helm_command: str = "/usr/bin/helm",
         log: object = None,
         on_update_db=None,
-        vca_config: dict = None,
     ):
         """
 
@@ -71,6 +70,7 @@ class K8sHelmBaseConnector(K8sConnector):
 
         self.log.info("Initializing K8S Helm connector")
 
+        self.config = EnvironConfig()
         # random numbers for release name generation
         random.seed(time.time())
 
@@ -86,10 +86,9 @@ class K8sHelmBaseConnector(K8sConnector):
         self._check_file_exists(filename=helm_command, exception_if_not_exists=True)
 
         # obtain stable repo url from config or apply default
-        if not vca_config or not vca_config.get("stablerepourl"):
-            self._stable_repo_url = self._STABLE_REPO_URL
-        else:
-            self._stable_repo_url = vca_config.get("stablerepourl")
+        self._stable_repo_url = self.config.get("stablerepourl")
+        if self._stable_repo_url == "None":
+            self._stable_repo_url = None
 
     @staticmethod
     def _get_namespace_cluster_id(cluster_uuid: str) -> (str, str):
@@ -1137,9 +1136,10 @@ class K8sHelmBaseConnector(K8sConnector):
         of dictionaries
         """
         new_list = []
-        for dictionary in input_list:
-            new_dict = dict((k.lower(), v) for k, v in dictionary.items())
-            new_list.append(new_dict)
+        if input_list:
+            for dictionary in input_list:
+                new_dict = dict((k.lower(), v) for k, v in dictionary.items())
+                new_list.append(new_dict)
         return new_list
 
     def _local_exec(self, command: str) -> (str, int):
index 46a0e99..6bbc0fa 100644 (file)
@@ -43,7 +43,6 @@ class K8sHelmConnector(K8sHelmBaseConnector):
         helm_command: str = "/usr/bin/helm",
         log: object = None,
         on_update_db=None,
-        vca_config: dict = None,
     ):
         """
         Initializes helm connector for helm v2
@@ -65,15 +64,17 @@ class K8sHelmConnector(K8sHelmBaseConnector):
             kubectl_command=kubectl_command,
             helm_command=helm_command,
             on_update_db=on_update_db,
-            vca_config=vca_config,
         )
 
         self.log.info("Initializing K8S Helm2 connector")
 
         # initialize helm client-only
         self.log.debug("Initializing helm client-only...")
-        command = "{} init --client-only --stable-repo-url {} ".format(
-            self._helm_command, self._stable_repo_url
+        command = "{} init --client-only {} ".format(
+            self._helm_command,
+            "--stable-repo-url {}".format(self._stable_repo_url)
+            if self._stable_repo_url
+            else "--skip-repos",
         )
         try:
             asyncio.ensure_future(
@@ -299,14 +300,16 @@ class K8sHelmConnector(K8sHelmBaseConnector):
 
             command = (
                 "{} --kubeconfig={} --tiller-namespace={} --home={} --service-account {} "
-                " --stable-repo-url {} init"
+                " {} init"
             ).format(
                 self._helm_command,
                 paths["kube_config"],
                 namespace,
                 paths["helm_dir"],
                 self.service_account,
-                self._stable_repo_url,
+                "--stable-repo-url {}".format(self._stable_repo_url)
+                if self._stable_repo_url
+                else "--skip-repos",
             )
             _, _rc = await self._local_async_exec(
                 command=command, raise_exception_on_error=True, env=env
@@ -321,13 +324,15 @@ class K8sHelmConnector(K8sHelmBaseConnector):
                 self.log.info("Initializing helm in client: {}".format(cluster_id))
                 command = (
                     "{} --kubeconfig={} --tiller-namespace={} "
-                    "--home={} init --client-only --stable-repo-url {} "
+                    "--home={} init --client-only {} "
                 ).format(
                     self._helm_command,
                     paths["kube_config"],
                     namespace,
                     paths["helm_dir"],
-                    self._stable_repo_url,
+                    "--stable-repo-url {}".format(self._stable_repo_url)
+                    if self._stable_repo_url
+                    else "--skip-repos",
                 )
                 output, _rc = await self._local_async_exec(
                     command=command, raise_exception_on_error=True, env=env
@@ -342,7 +347,8 @@ class K8sHelmConnector(K8sHelmBaseConnector):
             if repo["name"] == "stable" and repo["url"] != self._stable_repo_url:
                 self.log.debug("Add new stable repo url: {}")
                 await self.repo_remove(cluster_uuid, "stable")
-                await self.repo_add(cluster_uuid, "stable", self._stable_repo_url)
+                if self._stable_repo_url:
+                    await self.repo_add(cluster_uuid, "stable", self._stable_repo_url)
                 break
 
         return n2vc_installed_sw
index c175b7a..25749af 100644 (file)
@@ -18,7 +18,7 @@
 import asynctest
 import logging
 
-from asynctest.mock import Mock
+from asynctest.mock import Mock, patch
 from osm_common.dbmemory import DbMemory
 from osm_common.fslocal import FsLocal
 from n2vc.k8s_helm3_conn import K8sHelm3Connector
@@ -31,7 +31,11 @@ class TestK8sHelm3Conn(asynctest.TestCase):
     logger = logging.getLogger(__name__)
     logger.setLevel(logging.DEBUG)
 
-    async def setUp(self):
+    @patch("n2vc.k8s_helm_base_conn.EnvironConfig")
+    async def setUp(self, mock_env):
+        mock_env.return_value = {
+            "stablerepourl": "https://charts.helm.sh/stable"
+        }
         self.db = Mock(DbMemory())
         self.fs = asynctest.Mock(FsLocal())
         self.fs.path = "./tmp/"