Feature 10948: Set labels to new namespaces

Change-Id: I0f40d198d398c79f3e9badd8def8f884f60fb7f8
Signed-off-by: Gabriel Cuba <gcuba@whitestack.com>
diff --git a/n2vc/k8s_helm_base_conn.py b/n2vc/k8s_helm_base_conn.py
index 34d3129..2a588b4 100644
--- a/n2vc/k8s_helm_base_conn.py
+++ b/n2vc/k8s_helm_base_conn.py
@@ -2118,12 +2118,14 @@
         self,
         namespace,
         cluster_uuid,
+        labels,
     ):
         """
         Create a namespace in a specific cluster
 
-        :param namespace: namespace to be created
+        :param namespace:    Namespace to be created
         :param cluster_uuid: K8s cluster uuid used to retrieve kubeconfig
+        :param labels:       Dictionary with labels for the new namespace
         :returns: None
         """
         paths, env = self._init_paths_env(
@@ -2132,6 +2134,7 @@
         kubectl = Kubectl(config_file=paths["kube_config"])
         await kubectl.create_namespace(
             name=namespace,
+            labels=labels,
         )
 
     async def delete_namespace(
diff --git a/n2vc/kubectl.py b/n2vc/kubectl.py
index 7cc6ac2..c16c95a 100644
--- a/n2vc/kubectl.py
+++ b/n2vc/kubectl.py
@@ -574,15 +574,16 @@
         delay=1,
         fallback=Exception("Failed creating the namespace"),
     )
-    async def create_namespace(self, name: str):
+    async def create_namespace(self, name: str, labels: dict = None):
         """
         Create a namespace
 
         :param: name:       Name of the namespace to be created
+        :param: labels:     Dictionary with labels for the new namespace
 
         """
         v1_core = self.clients[CORE_CLIENT]
-        metadata = V1ObjectMeta(name=name)
+        metadata = V1ObjectMeta(name=name, labels=labels)
         namespace = V1Namespace(
             metadata=metadata,
         )
diff --git a/n2vc/tests/unit/test_kubectl.py b/n2vc/tests/unit/test_kubectl.py
index 6ba074f..a6d02ff 100644
--- a/n2vc/tests/unit/test_kubectl.py
+++ b/n2vc/tests/unit/test_kubectl.py
@@ -734,6 +734,7 @@
     def setUp(self, mock_load_kube_config):
         super(CreateNamespaceClass, self).setUp()
         self.namespace = "osm"
+        self.labels = {"key": "value"}
         self.kubectl = Kubectl()
 
     @asynctest.fail_on(active_handles=True)
@@ -741,7 +742,21 @@
         self,
         mock_create_namespace,
     ):
-        metadata = V1ObjectMeta(name=self.namespace)
+        metadata = V1ObjectMeta(name=self.namespace, labels=self.labels)
+        namespace = V1Namespace(
+            metadata=metadata,
+        )
+        await self.kubectl.create_namespace(
+            name=self.namespace,
+            labels=self.labels,
+        )
+        mock_create_namespace.assert_called_once_with(namespace)
+
+    async def test_namespace_is_created_default_labels(
+        self,
+        mock_create_namespace,
+    ):
+        metadata = V1ObjectMeta(name=self.namespace, labels=None)
         namespace = V1Namespace(
             metadata=metadata,
         )