Fix Bug 1575
[osm/N2VC.git] / n2vc / k8s_juju_conn.py
index e3ec17e..24b3142 100644 (file)
@@ -371,10 +371,72 @@ class K8sJujuConnector(K8sConnector):
                 cluster_uuid,
                 kdu_instance,
                 filter=db_dict["filter"],
-                vca_id=kwargs.get("vca_id")
+                vca_id=kwargs.get("vca_id"),
             )
         return True
 
+    async def scale(
+        self,
+        kdu_instance: str,
+        scale: int,
+        resource_name: str,
+        total_timeout: float = 1800,
+        **kwargs,
+    ) -> bool:
+        """Scale an application in a model
+
+        :param: kdu_instance str:        KDU instance name
+        :param: scale int:               Scale to which to set this application
+        :param: resource_name str:       Resource name (Application name)
+        :param: timeout float:           The time, in seconds, to wait for the install
+                                         to finish
+        :param kwargs:                   Additional parameters
+                                            vca_id (str): VCA ID
+
+        :return: If successful, returns True
+        """
+
+        try:
+            libjuju = await self._get_libjuju(kwargs.get("vca_id"))
+            await libjuju.scale_application(
+                model_name=kdu_instance,
+                application_name=resource_name,
+                scale=scale,
+                total_timeout=total_timeout,
+            )
+        except Exception as e:
+            error_msg = "Error scaling application {} in kdu instance {}: {}".format(
+                resource_name, kdu_instance, e
+            )
+            self.log.error(error_msg)
+            raise K8sException(message=error_msg)
+        return True
+
+    async def get_scale_count(
+        self,
+        resource_name: str,
+        kdu_instance: str,
+        **kwargs,
+    ) -> int:
+        """Get an application scale count
+
+        :param: resource_name str:       Resource name (Application name)
+        :param: kdu_instance str:        KDU instance name
+        :param kwargs:                   Additional parameters
+                                            vca_id (str): VCA ID
+        :return: Return application instance count
+        """
+        try:
+            libjuju = await self._get_libjuju(kwargs.get("vca_id"))
+            status = await libjuju.get_model_status(kdu_instance)
+            return len(status.applications[resource_name].units)
+        except Exception as e:
+            error_msg = "Error getting scale count from application {} in kdu instance {}: {}".format(
+                resource_name, kdu_instance, e
+            )
+            self.log.error(error_msg)
+            raise K8sException(message=error_msg)
+
     async def instances_list(self, cluster_uuid: str) -> list:
         """
         returns a list of deployed releases in a cluster
@@ -517,7 +579,9 @@ class K8sJujuConnector(K8sConnector):
                     "status is not completed: {} output: {}".format(status, output)
                 )
             if self.on_update_db:
-                await self.on_update_db(cluster_uuid, kdu_instance, filter=db_dict["filter"])
+                await self.on_update_db(
+                    cluster_uuid, kdu_instance, filter=db_dict["filter"]
+                )
 
             return output
 
@@ -651,16 +715,19 @@ class K8sJujuConnector(K8sConnector):
         try:
             for model_name in vcastatus:
                 # Adding executed actions
-                vcastatus[model_name]["executedActions"] = \
-                    await libjuju.get_executed_actions(kdu_instance)
+                vcastatus[model_name][
+                    "executedActions"
+                ] = await libjuju.get_executed_actions(kdu_instance)
 
                 for application in vcastatus[model_name]["applications"]:
                     # Adding application actions
-                    vcastatus[model_name]["applications"][application]["actions"] = \
-                        await libjuju.get_actions(application, kdu_instance)
+                    vcastatus[model_name]["applications"][application][
+                        "actions"
+                    ] = await libjuju.get_actions(application, kdu_instance)
                     # Adding application configs
-                    vcastatus[model_name]["applications"][application]["configs"] = \
-                        await libjuju.get_application_configs(kdu_instance, application)
+                    vcastatus[model_name]["applications"][application][
+                        "configs"
+                    ] = await libjuju.get_application_configs(kdu_instance, application)
 
         except Exception as e:
             self.log.debug("Error in updating vca status: {}".format(str(e)))