OSMENG-1090 OSMENG-1091: Remove model and check model is removed 57/13657/2
authorDario Faccin <dario.faccin@canonical.com>
Mon, 10 Jul 2023 07:28:22 +0000 (09:28 +0200)
committeraticig <gulsum.atici@canonical.com>
Tue, 11 Jul 2023 11:54:45 +0000 (13:54 +0200)
Change-Id: I7a4acabb20412b4f737ff95eb8b33723fceaa004
Signed-off-by: Dario Faccin <dario.faccin@canonical.com>
osm_common/temporal/activities/paas.py

index 6a29247..fc08af2 100644 (file)
@@ -235,7 +235,7 @@ class RemoveCharm(BaseActivity):
     """Removes the given charm from the given model.
 
     Collaborators:
-        Juju Controller:    Connect to controller and check charm status.
+        Juju Controller:    Connect to controller and remove charm.
 
     Raises  (Retryable):
         ApplicationError    If any of password, cacert, cloud_credentials is invalid
@@ -257,8 +257,7 @@ class RemoveCharm(BaseActivity):
     @dataclass
     class Input:
         """
-        Input dataclass for checking on a specific charm's removal
-        status
+        Input dataclass for removing a specific charm
 
         Attributes:
         -----------
@@ -325,8 +324,8 @@ class CheckCharmIsRemoved(BaseActivity):
             Name of the model in Juju where the charm is deployed.
 
         application_name : str
-            Name of the application whose removal is going to be
-            awaited.
+            Name of the application for which the removal is going
+            to be awaited.
 
         poll_interval : int (optional)
             Time, in seconds, to wait between status checks.
@@ -343,3 +342,108 @@ class CheckCharmIsRemoved(BaseActivity):
 
     async def __call__(self, activity_input: Input) -> None:
         raise NotImplementedError()
+
+
+class RemoveModel(BaseActivity):
+    """Removes the given model from the given controller.
+
+    Collaborators:
+        Juju Controller:    Connect to controller and remove model.
+
+    Raises  (Retryable):
+        ApplicationError    If any of password, cacert, cloud_credentials is invalid
+                            or Juju controller is not reachable
+
+    Activity Lifecycle:
+        This activity should complete relatively quickly (in a few seconds).
+        However, it would be reasonable to wait more than 72 seconds (network timeout)
+        incase there are network issues.
+
+        This activity will not report a heartbeat due to its
+        short-running nature.
+
+        It is recommended, although not necessary to implement a
+        back-off strategy for this activity, as it will naturally block
+        and wait on each connection attempt.
+    """
+
+    @dataclass
+    class Input:
+        """
+        Input dataclass for removing a specific model
+
+        Attributes:
+        -----------
+        vim_uuid : str
+            The UUID of the VIM as stored in the OSM vim_accounts
+            collection in Mongo.
+
+        model_name : str
+            Name of the model in Juju to be removed.
+
+        force_remove : bool
+            If model has to be forcefully removed.
+
+        """
+
+        vim_uuid: str
+        model_name: str
+        force_remove: bool
+
+    def __init__(self, juju_controller):
+        super().__init__()
+        self.juju_controller = juju_controller
+
+    async def __call__(self, activity_input: Input) -> None:
+        raise NotImplementedError()
+
+
+class CheckModelIsRemoved(BaseActivity):
+    """Checks the removal of the model. This activity will block until the model
+    is not present in the specified controller.
+
+    Collaborators:
+        Juju Controller:    Connect to controller and check model removal status.
+
+    Raises  (Retryable):
+        ApplicationError    If any of password, cacert, cloud_credentials is invalid
+                            or Juju controller is not reachable
+
+    Activity Lifecycle:
+        This activity will continue indefinitely until the specified model is removed.
+        Heartbeats are performed to ensure this activity does not time out.
+
+        A start-to-close of something reasonable (such as 5 minutes) should be implemented
+        at the workflow level and such a timeout shall trigger workflow failure logic.
+    """
+
+    @dataclass
+    class Input:
+        """
+        Input dataclass for checking on a specific model's removal
+        status
+
+        Attributes:
+        -----------
+        vim_uuid : str
+            The UUID of the VIM as stored in the OSM vim_accounts
+            collection in Mongo.
+
+        model_name : str
+            Name of the model in Juju for which the removal is going
+            to be awaited.
+
+        poll_interval : int (optional)
+            Time, in seconds, to wait between status checks.
+        """
+
+        vim_uuid: str
+        model_name: str
+        poll_interval: int = 1
+
+    def __init__(self, juju_controller):
+        super().__init__()
+        self.juju_controller = juju_controller
+
+    async def __call__(self, activity_input: Input) -> None:
+        raise NotImplementedError()