From f3396eef47700e573c7540f4294f258db0f62d53 Mon Sep 17 00:00:00 2001 From: Dario Faccin Date: Mon, 10 Jul 2023 09:28:22 +0200 Subject: [PATCH] OSMENG-1090 OSMENG-1091: Remove model and check model is removed Change-Id: I7a4acabb20412b4f737ff95eb8b33723fceaa004 Signed-off-by: Dario Faccin --- osm_common/temporal/activities/paas.py | 114 +++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 5 deletions(-) diff --git a/osm_common/temporal/activities/paas.py b/osm_common/temporal/activities/paas.py index 6a29247..fc08af2 100644 --- a/osm_common/temporal/activities/paas.py +++ b/osm_common/temporal/activities/paas.py @@ -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() -- 2.25.1