Add models_exist function to libjuju.py 37/9637/4
authorDavid Garcia <david.garcia@canonical.com>
Tue, 25 Aug 2020 13:03:01 +0000 (15:03 +0200)
committerDavid Garcia <david.garcia@canonical.com>
Fri, 11 Sep 2020 12:33:20 +0000 (14:33 +0200)
This function checks if a gives list of model names exist in the controller.
Additionally, it returns the list of unexisting models from the given list.

Change-Id: I2a9290ef1a4ee1308626f3a31dba0a83127fdd8c
Signed-off-by: David Garcia <david.garcia@canonical.com>
n2vc/libjuju.py
n2vc/tests/unit/test_libjuju.py

index cb24a3e..2f18837 100644 (file)
@@ -232,6 +232,28 @@ class Libjuju:
             if need_to_disconnect:
                 await self.disconnect_controller(controller)
 
             if need_to_disconnect:
                 await self.disconnect_controller(controller)
 
+    async def models_exist(self, model_names: [str]) -> (bool, list):
+        """
+        Check if models exists
+
+        :param: model_names: List of strings with model names
+
+        :return (bool, list[str]): (True if all models exists, List of model names that don't exist)
+        """
+        if not model_names:
+            raise Exception(
+                "model_names must be a non-empty array. Given value: {}".format(model_names)
+            )
+        non_existing_models = []
+        models = await self.list_models()
+        existing_models = list(set(models).intersection(model_names))
+        non_existing_models = list(set(model_names) - set(existing_models))
+
+        return (
+            len(non_existing_models) == 0,
+            non_existing_models,
+        )
+
     async def get_model_status(self, model_name: str) -> FullStatus:
         """
         Get model status
     async def get_model_status(self, model_name: str) -> FullStatus:
         """
         Get model status
index 5669959..f517afc 100644 (file)
@@ -873,3 +873,37 @@ class ListModelsTest(LibjujuTestCase):
 
         mock_disconnect_controller.assert_called_once()
         self.assertEquals(models, ["existingmodel", "model"])
 
         mock_disconnect_controller.assert_called_once()
         self.assertEquals(models, ["existingmodel", "model"])
+
+
+@asynctest.mock.patch("n2vc.libjuju.Libjuju.list_models")
+class ModelsExistTest(LibjujuTestCase):
+    def setUp(self):
+        super(ModelsExistTest, self).setUp()
+
+    def test_model_names_none(self, mock_list_models):
+        mock_list_models.return_value = []
+        with self.assertRaises(Exception):
+            self.loop.run_until_complete(self.libjuju.models_exist(None))
+
+    def test_model_names_empty(self, mock_list_models):
+        mock_list_models.return_value = []
+        with self.assertRaises(Exception):
+            (exist, non_existing_models) = self.loop.run_until_complete(
+                self.libjuju.models_exist([])
+            )
+
+    def test_model_names_not_existing(self, mock_list_models):
+        mock_list_models.return_value = ["prometheus", "grafana"]
+        (exist, non_existing_models) = self.loop.run_until_complete(
+            self.libjuju.models_exist(["prometheus2", "grafana"])
+        )
+        self.assertFalse(exist)
+        self.assertEqual(non_existing_models, ["prometheus2"])
+
+    def test_model_names_exist(self, mock_list_models):
+        mock_list_models.return_value = ["prometheus", "grafana"]
+        (exist, non_existing_models) = self.loop.run_until_complete(
+            self.libjuju.models_exist(["prometheus", "grafana"])
+        )
+        self.assertTrue(exist)
+        self.assertEqual(non_existing_models, [])