Instantiate VDU Worfklow and Activities

Using Juju

Change-Id: I5c0ab16e348f6f66573085269b8729bbc8854f15
Signed-off-by: Patricia Reinoso <patricia.reinoso@canonical.com>
diff --git a/osm_lcm/temporal/vim_activities.py b/osm_lcm/temporal/vim_activities.py
index 6307704..c84713a 100644
--- a/osm_lcm/temporal/vim_activities.py
+++ b/osm_lcm/temporal/vim_activities.py
@@ -23,12 +23,17 @@
     ACTIVITY_TEST_VIM_CONNECTIVITY,
     ACTIVITY_UPDATE_VIM_OPERATION_STATE,
     ACTIVITY_UPDATE_VIM_STATE,
+    ACTIVITY_CREATE_MODEL_IF_DOESNT_EXIST,
+    ACTIVITY_DEPLOY_CHARM,
+    ACTIVITY_CHECK_CHARM_STATUS,
 )
 from osm_common.dataclasses.temporal_dataclasses import (
     DeleteVimInput,
     TestVimConnectivityInput,
     UpdateVimOperationStateInput,
     UpdateVimStateInput,
+    CreateModelInput,
+    VduInstantiateInput,
 )
 
 activity.logger = logging.getLogger("lcm.temporal.vim_activities")
@@ -79,6 +84,10 @@
             endpoint, username, password, cacert, cloud_name, cloud_credentials
         )
 
+    def _get_libjuju(self, vim_uuid):
+        connection_info = self._get_connection_info(vim_uuid)
+        return Libjuju(connection_info)
+
     @activity.defn(name=ACTIVITY_TEST_VIM_CONNECTIVITY)
     async def test_vim_connectivity(
         self, test_connectivity_input: TestVimConnectivityInput
@@ -108,14 +117,101 @@
         vim_id = test_connectivity_input.vim_uuid
         controller = None
         try:
-            connection_info = self._get_connection_info(vim_id)
-            libjuju = Libjuju(connection_info)
+            libjuju = self._get_libjuju(vim_id)
             controller = await libjuju.get_controller()
             message = f"Connection to juju controller succeeded for {vim_id}"
             activity.logger.info(message)
         finally:
             await libjuju.disconnect_controller(controller)
 
+    @activity.defn(name=ACTIVITY_CREATE_MODEL_IF_DOESNT_EXIST)
+    async def create_model_if_doesnt_exist(
+        self, create_model_input: CreateModelInput
+    ) -> None:
+        """Connects to Juju Controller. Create a new model if model_name does not exist
+
+        Collaborators:
+            DB Read:            vim_accounts
+            Juju Controller:    Connect and create model.
+
+        Raises  (Retryable):
+            ApplicationError    If 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.
+        """
+        model_name = create_model_input.model_name
+        libjuju = self._get_libjuju(create_model_input.vim_uuid)
+        await libjuju.add_model(model_name)
+
+    @activity.defn(name=ACTIVITY_DEPLOY_CHARM)
+    async def deploy_charm(self, deploy_charm_input: VduInstantiateInput) -> None:
+        """Deploys a charm.
+
+        Collaborators:
+            DB Read:            vim_accounts
+            Juju Controller:    Connect and deploy charm
+
+        Raises  (Retryable):
+            ApplicationError    If 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.
+        """
+        model_name = deploy_charm_input.model_name
+        libjuju = self._get_libjuju(deploy_charm_input.vim_uuid)
+        charm_info = deploy_charm_input.charm_info
+        await libjuju.deploy_charm(
+            application_name=charm_info.app_name,
+            path=charm_info.entity_url,
+            model_name=model_name,
+            channel=charm_info.channel,
+        )
+
+    @activity.defn(name=ACTIVITY_CHECK_CHARM_STATUS)
+    async def check_charm_status(self, check_charm_status: VduInstantiateInput) -> None:
+        """Validates the credentials by attempting to connect to the given Juju Controller.
+
+        Collaborators:
+            DB Read:            vim_accounts
+            Juju Controller:    Connect to controller and check charm status.
+
+        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.
+        """
+        pass
+
 
 class VimDbActivity:
     """Perform Database operations for VIM accounts.