Feature 10509 manual scaling for native k8s charm
[osm/N2VC.git] / n2vc / k8s_juju_conn.py
index e3ec17e..3a2d9e3 100644 (file)
@@ -375,6 +375,66 @@ class K8sJujuConnector(K8sConnector):
             )
         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