X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FN2VC.git;a=blobdiff_plain;f=n2vc%2Ftests%2Funit%2Ftest_k8s_juju_conn.py;h=3e354946df6d0c6f3f0d5ba982f1e873ef2c0eb0;hp=1423c61a82b4ea6eddab7f0ed59b8ab2b42e52e7;hb=764d8664333e7a6f16353bc8f578c5681f66433f;hpb=d8d4b6e70c0e4410a4b5c274faecd37ee821f3b7 diff --git a/n2vc/tests/unit/test_k8s_juju_conn.py b/n2vc/tests/unit/test_k8s_juju_conn.py index 1423c61..3e35494 100644 --- a/n2vc/tests/unit/test_k8s_juju_conn.py +++ b/n2vc/tests/unit/test_k8s_juju_conn.py @@ -17,6 +17,7 @@ import asyncio import logging import asynctest from unittest.mock import Mock +from n2vc.definitions import Offer, RelationEndpoint from n2vc.k8s_juju_conn import K8sJujuConnector, RBAC_LABEL_KEY_NAME from osm_common import fslocal from .utils import kubeconfig, FakeModel, FakeFileWrapper, AsyncMock, FakeApplication @@ -66,6 +67,10 @@ class K8sJujuConnTestCase(asynctest.TestCase): ) logging.disable(logging.CRITICAL) + self.kdu_name = "kdu_name" + self.kdu_instance = "{}-{}".format(self.kdu_name, "id") + self.default_namespace = self.kdu_instance + self.k8s_juju_conn = K8sJujuConnector( fs=fslocal.FsLocal(), db=self.db, @@ -82,6 +87,9 @@ class K8sJujuConnTestCase(asynctest.TestCase): self.kubectl.get_services.return_value = [{}] self.k8s_juju_conn._get_kubectl = Mock() self.k8s_juju_conn._get_kubectl.return_value = self.kubectl + self.k8s_juju_conn._obtain_namespace_from_db = Mock( + return_value=self.default_namespace + ) class InitEnvTest(K8sJujuConnTestCase): @@ -202,9 +210,7 @@ class InstallTest(K8sJujuConnTestCase): self.local_bundle = "bundle" self.cs_bundle = "cs:bundle" self.http_bundle = "https://example.com/bundle.yaml" - self.kdu_name = "kdu_name" self.cluster_uuid = "cluster" - self.kdu_instance = "{}-{}".format(self.kdu_name, "id") self.k8s_juju_conn.libjuju.add_model = AsyncMock() self.k8s_juju_conn.libjuju.deploy = AsyncMock() @@ -224,7 +230,7 @@ class InstallTest(K8sJujuConnTestCase): self.k8s_juju_conn.libjuju.add_model.assert_called_once() self.k8s_juju_conn.libjuju.deploy.assert_called_once_with( "local:{}".format(self.local_bundle), - model_name=self.kdu_instance, + model_name=self.default_namespace, wait=True, timeout=1800, ) @@ -244,7 +250,7 @@ class InstallTest(K8sJujuConnTestCase): self.k8s_juju_conn.libjuju.add_model.assert_called_once() self.k8s_juju_conn.libjuju.deploy.assert_called_once_with( self.cs_bundle, - model_name=self.kdu_instance, + model_name=self.default_namespace, wait=True, timeout=1800, ) @@ -264,7 +270,7 @@ class InstallTest(K8sJujuConnTestCase): self.k8s_juju_conn.libjuju.add_model.assert_called_once() self.k8s_juju_conn.libjuju.deploy.assert_called_once_with( self.http_bundle, - model_name=self.kdu_instance, + model_name=self.default_namespace, wait=True, timeout=1800, ) @@ -283,7 +289,7 @@ class InstallTest(K8sJujuConnTestCase): self.k8s_juju_conn.libjuju.add_model.assert_called_once() self.k8s_juju_conn.libjuju.deploy.assert_called_once_with( self.cs_bundle, - model_name=self.kdu_instance, + model_name=self.default_namespace, wait=True, timeout=1800, ) @@ -322,7 +328,7 @@ class InstallTest(K8sJujuConnTestCase): self.k8s_juju_conn.libjuju.add_model.assert_called_once() self.k8s_juju_conn.libjuju.deploy.assert_called_once_with( self.cs_bundle, - model_name=self.kdu_instance, + model_name=self.default_namespace, wait=True, timeout=1800, ) @@ -360,7 +366,7 @@ class InstallTest(K8sJujuConnTestCase): self.k8s_juju_conn.libjuju.add_model.assert_called_once() self.k8s_juju_conn.libjuju.deploy.assert_called_once_with( "local:{}".format(self.local_bundle), - model_name=self.kdu_instance, + model_name=self.default_namespace, wait=True, timeout=1800, ) @@ -394,7 +400,6 @@ class ExecPrimitivesTest(K8sJujuConnTestCase): super(ExecPrimitivesTest, self).setUp() self.action_name = "touch" self.application_name = "myapp" - self.model_name = "model" self.k8s_juju_conn.libjuju.get_actions = AsyncMock() self.k8s_juju_conn.libjuju.execute_action = AsyncMock() @@ -408,16 +413,22 @@ class ExecPrimitivesTest(K8sJujuConnTestCase): output = self.loop.run_until_complete( self.k8s_juju_conn.exec_primitive( - "cluster", self.model_name, self.action_name, params=params + "cluster", self.kdu_instance, self.action_name, params=params ) ) self.assertEqual(output, "success") + self.k8s_juju_conn._obtain_namespace_from_db.assert_called_once_with( + kdu_instance=self.kdu_instance + ) self.k8s_juju_conn.libjuju.get_actions.assert_called_once_with( - self.application_name, self.model_name + application_name=self.application_name, model_name=self.default_namespace ) self.k8s_juju_conn.libjuju.execute_action.assert_called_once_with( - self.application_name, self.model_name, self.action_name, **params + application_name=self.application_name, + model_name=self.default_namespace, + action_name=self.action_name, + **params ) def test_exception(self): @@ -429,16 +440,22 @@ class ExecPrimitivesTest(K8sJujuConnTestCase): with self.assertRaises(Exception): output = self.loop.run_until_complete( self.k8s_juju_conn.exec_primitive( - "cluster", self.model_name, self.action_name, params=params + "cluster", self.kdu_instance, self.action_name, params=params ) ) self.assertIsNone(output) + self.k8s_juju_conn._obtain_namespace_from_db.assert_called_once_with( + kdu_instance=self.kdu_instance + ) self.k8s_juju_conn.libjuju.get_actions.assert_called_once_with( - self.application_name, self.model_name + application_name=self.application_name, model_name=self.default_namespace ) self.k8s_juju_conn.libjuju.execute_action.assert_called_once_with( - self.application_name, self.model_name, self.action_name, **params + application_name=self.application_name, + model_name=self.default_namespace, + action_name=self.action_name, + **params ) def test_missing_application_name_in_params(self): @@ -448,7 +465,7 @@ class ExecPrimitivesTest(K8sJujuConnTestCase): with self.assertRaises(K8sException): output = self.loop.run_until_complete( self.k8s_juju_conn.exec_primitive( - "cluster", self.model_name, self.action_name, params=params + "cluster", self.kdu_instance, self.action_name, params=params ) ) @@ -461,7 +478,7 @@ class ExecPrimitivesTest(K8sJujuConnTestCase): with self.assertRaises(K8sException): output = self.loop.run_until_complete( self.k8s_juju_conn.exec_primitive( - "cluster", self.model_name, self.action_name + "cluster", self.kdu_instance, self.action_name ) ) @@ -480,13 +497,16 @@ class ExecPrimitivesTest(K8sJujuConnTestCase): with self.assertRaises(K8sException): output = self.loop.run_until_complete( self.k8s_juju_conn.exec_primitive( - "cluster", self.model_name, "non-existing-action", params=params + "cluster", self.kdu_instance, "non-existing-action", params=params ) ) self.assertIsNone(output) + self.k8s_juju_conn._obtain_namespace_from_db.assert_called_once_with( + kdu_instance=self.kdu_instance + ) self.k8s_juju_conn.libjuju.get_actions.assert_called_once_with( - self.application_name, self.model_name + application_name=self.application_name, model_name=self.default_namespace ) self.k8s_juju_conn.libjuju.execute_action.assert_not_called() @@ -498,16 +518,22 @@ class ExecPrimitivesTest(K8sJujuConnTestCase): with self.assertRaises(K8sException): output = self.loop.run_until_complete( self.k8s_juju_conn.exec_primitive( - "cluster", self.model_name, self.action_name, params=params + "cluster", self.kdu_instance, self.action_name, params=params ) ) self.assertIsNone(output) + self.k8s_juju_conn._obtain_namespace_from_db.assert_called_once_with( + kdu_instance=self.kdu_instance + ) self.k8s_juju_conn.libjuju.get_actions.assert_called_once_with( - self.application_name, self.model_name + application_name=self.application_name, model_name=self.default_namespace ) self.k8s_juju_conn.libjuju.execute_action.assert_called_once_with( - self.application_name, self.model_name, self.action_name, **params + application_name=self.application_name, + model_name=self.default_namespace, + action_name=self.action_name, + **params ) @@ -646,8 +672,6 @@ class UpdateVcaStatusTest(K8sJujuConnTestCase): def setUp(self): super(UpdateVcaStatusTest, self).setUp() self.vcaStatus = {"model": {"applications": {"app": {"actions": {}}}}} - self.kdu_name = "kdu_name" - self.kdu_instance = "{}-{}".format(self.kdu_name, "id") self.k8s_juju_conn.libjuju.get_executed_actions = AsyncMock() self.k8s_juju_conn.libjuju.get_actions = AsyncMock() self.k8s_juju_conn.libjuju.get_application_configs = AsyncMock() @@ -657,7 +681,6 @@ class UpdateVcaStatusTest(K8sJujuConnTestCase): self.k8s_juju_conn.update_vca_status(self.vcaStatus, self.kdu_instance) ) self.k8s_juju_conn.libjuju.get_executed_actions.assert_called_once() - self.k8s_juju_conn.libjuju.get_actions.assert_called_once() self.k8s_juju_conn.libjuju.get_application_configs.assert_called_once() def test_exception(self): @@ -668,7 +691,6 @@ class UpdateVcaStatusTest(K8sJujuConnTestCase): self.k8s_juju_conn.update_vca_status(self.vcaStatus, self.kdu_instance) ) self.k8s_juju_conn.libjuju.get_executed_actions.assert_not_called() - self.k8s_juju_conn.libjuju.get_actions.assert_not_called_once() self.k8s_juju_conn.libjuju.get_application_configs.assert_not_called_once() @@ -721,3 +743,50 @@ class GetScaleCount(K8sJujuConnTestCase): ) self.assertIsNone(status) self.k8s_juju_conn.libjuju.get_model_status.assert_called_once() + + +class AddRelationTest(K8sJujuConnTestCase): + def setUp(self): + super(AddRelationTest, self).setUp() + self.k8s_juju_conn.libjuju.add_relation = AsyncMock() + self.k8s_juju_conn.libjuju.offer = AsyncMock() + self.k8s_juju_conn.libjuju.get_controller = AsyncMock() + self.k8s_juju_conn.libjuju.consume = AsyncMock() + + def test_standard_relation(self): + relation_endpoint_1 = RelationEndpoint("model-1.app1.0", None, "endpoint") + relation_endpoint_2 = RelationEndpoint("model-1.app2.1", None, "endpoint") + self.loop.run_until_complete( + self.k8s_juju_conn.add_relation(relation_endpoint_1, relation_endpoint_2) + ) + self.k8s_juju_conn.libjuju.add_relation.assert_called_once_with( + model_name="model-1", endpoint_1="app1:endpoint", endpoint_2="app2:endpoint" + ) + self.k8s_juju_conn.libjuju.offer.assert_not_called() + self.k8s_juju_conn.libjuju.consume.assert_not_called() + + def test_cmr_relation_same_controller(self): + relation_endpoint_1 = RelationEndpoint("model-1.app1.0", None, "endpoint") + relation_endpoint_2 = RelationEndpoint("model-2.app2.1", None, "endpoint") + offer = Offer("admin/model-1.app1") + self.k8s_juju_conn.libjuju.offer.return_value = offer + self.k8s_juju_conn.libjuju.consume.return_value = "saas" + self.loop.run_until_complete( + self.k8s_juju_conn.add_relation(relation_endpoint_1, relation_endpoint_2) + ) + self.k8s_juju_conn.libjuju.offer.assert_called_once_with(relation_endpoint_1) + self.k8s_juju_conn.libjuju.consume.assert_called_once() + self.k8s_juju_conn.libjuju.add_relation.assert_called_once_with( + "model-2", "app2:endpoint", "saas" + ) + + def test_relation_exception(self): + relation_endpoint_1 = RelationEndpoint("model-1.app1.0", None, "endpoint") + relation_endpoint_2 = RelationEndpoint("model-2.app2.1", None, "endpoint") + self.k8s_juju_conn.libjuju.offer.side_effect = Exception() + with self.assertRaises(Exception): + self.loop.run_until_complete( + self.k8s_juju_conn.add_relation( + relation_endpoint_1, relation_endpoint_2 + ) + )