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=e0faaf0405c231d7e563fb74d5efa5a0b8b43f0e;hp=915738e1f702f5040ca7b049b62b396e14ee9dd3;hb=HEAD;hpb=93bee7ea8407c7501daf04190f1bae7947e7d74c diff --git a/n2vc/tests/unit/test_k8s_juju_conn.py b/n2vc/tests/unit/test_k8s_juju_conn.py index 915738e..1de1288 100644 --- a/n2vc/tests/unit/test_k8s_juju_conn.py +++ b/n2vc/tests/unit/test_k8s_juju_conn.py @@ -21,10 +21,7 @@ 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 -from n2vc.exceptions import ( - MethodNotImplemented, - K8sException, -) +from n2vc.exceptions import MethodNotImplemented, K8sException from n2vc.vca.connection_data import ConnectionData @@ -67,11 +64,14 @@ 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, log=None, - loop=self.loop, on_update_db=None, ) self.k8s_juju_conn._store.get_vca_id.return_value = None @@ -83,6 +83,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): @@ -127,9 +130,15 @@ class InitEnvTest(K8sJujuConnTestCase): uuid, created = self.loop.run_until_complete( self.k8s_juju_conn.init_env(k8s_creds=kubeconfig) ) - self.assertIsNone(created) self.assertIsNone(uuid) + self.kubectl.create_cluster_role.assert_called_once() + self.kubectl.create_service_account.assert_called_once() + self.kubectl.create_cluster_role_binding.assert_called_once() + self.kubectl.get_default_storage_class.assert_called_once() + self.kubectl.delete_cluster_role.assert_called_once() + self.kubectl.delete_service_account.assert_called_once() + self.kubectl.delete_cluster_role_binding.assert_called_once() self.k8s_juju_conn.libjuju.add_k8s.assert_called_once() @@ -203,9 +212,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() @@ -219,15 +226,17 @@ class InstallTest(K8sJujuConnTestCase): kdu_name=self.kdu_name, db_dict=self.db_dict, timeout=1800, + params=None, ) ) self.assertEqual(mock_chdir.call_count, 2) 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, + instantiation_params=None, ) def test_success_cs(self, mock_chdir): @@ -240,17 +249,20 @@ class InstallTest(K8sJujuConnTestCase): kdu_name=self.kdu_name, db_dict=self.db_dict, timeout=1800, + params={}, ) ) 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, + instantiation_params=None, ) def test_success_http(self, mock_chdir): + params = {"overlay": {"applications": {"squid": {"scale": 2}}}} self.loop.run_until_complete( self.k8s_juju_conn.install( self.cluster_uuid, @@ -260,17 +272,20 @@ class InstallTest(K8sJujuConnTestCase): kdu_name=self.kdu_name, db_dict=self.db_dict, timeout=1800, + params=params, ) ) 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, + instantiation_params=params.get("overlay"), ) def test_success_not_kdu_name(self, mock_chdir): + params = {"some_key": {"applications": {"squid": {"scale": 2}}}} self.loop.run_until_complete( self.k8s_juju_conn.install( self.cluster_uuid, @@ -279,14 +294,16 @@ class InstallTest(K8sJujuConnTestCase): atomic=True, db_dict=self.db_dict, timeout=1800, + params=params, ) ) 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, + instantiation_params=None, ) def test_missing_db_dict(self, mock_chdir): @@ -323,9 +340,10 @@ 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, + instantiation_params=None, ) def test_missing_bundle(self, mock_chdir): @@ -361,9 +379,10 @@ 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, + instantiation_params=None, ) @@ -395,7 +414,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() @@ -409,16 +427,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): @@ -430,16 +454,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): @@ -449,7 +479,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 ) ) @@ -462,7 +492,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 ) ) @@ -481,13 +511,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() @@ -499,16 +532,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 ) @@ -647,8 +686,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() @@ -730,14 +767,16 @@ class AddRelationTest(K8sJujuConnTestCase): 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") + def test_standard_relation_same_model_and_controller(self): + relation_endpoint_1 = RelationEndpoint("model-1.app1.0", None, "endpoint1") + relation_endpoint_2 = RelationEndpoint("model-1.app2.1", None, "endpoint2") 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" + model_name="model-1", + endpoint_1="app1:endpoint1", + endpoint_2="app2:endpoint2", ) self.k8s_juju_conn.libjuju.offer.assert_not_called() self.k8s_juju_conn.libjuju.consume.assert_not_called() @@ -757,6 +796,24 @@ class AddRelationTest(K8sJujuConnTestCase): "model-2", "app2:endpoint", "saas" ) + def test_cmr_relation_different_controller(self): + self.k8s_juju_conn._get_libjuju = AsyncMock( + return_value=self.k8s_juju_conn.libjuju + ) + relation_endpoint_1 = RelationEndpoint("model-1.app1.0", "vca-id-1", "endpoint") + relation_endpoint_2 = RelationEndpoint("model-1.app2.1", "vca-id-2", "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-1", "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")