Support distributed cloud with or without SSL
[pti/o2.git] / o2dms / service / nfdeployment_handler.py
index e960792..0fdd00a 100644 (file)
@@ -20,6 +20,7 @@ from o2dms.domain.dms import NfDeployment, NfDeploymentDesc
 from o2dms.domain import commands
 from typing import Callable
 
+from o2dms.domain.exceptions import NfdeploymentNotFoundError
 from o2dms.domain import events
 from o2common.service.unit_of_work import AbstractUnitOfWork
 from helm_sdk import Helm
@@ -52,19 +53,28 @@ def handle_nfdeployment_statechanged(
     uow: AbstractUnitOfWork
 ):
     if cmd.FromState == NfDeploymentState.Initial:
-        if cmd.ToState == NfDeploymentState.NotInstalled:
+        if cmd.ToState == NfDeploymentState.Installing:
             cmd2 = commands.InstallNfDeployment(cmd.NfDeploymentId)
             install_nfdeployment(cmd2, uow)
+        elif cmd.ToState == NfDeploymentState.Deleting:
+            cmd2 = commands.DeleteNfDeployment(cmd.NfDeploymentId)
+            delete_nfdeployment(cmd2, uow)
         else:
             logger.debug("Not insterested state change: {}".format(cmd))
-    elif cmd.FromState == NfDeploymentState.Installed:
+    elif cmd.FromState == NfDeploymentState.Installed \
+            or cmd.FromState == NfDeploymentState.Installing \
+            or cmd.FromState == NfDeploymentState.Updating \
+            or cmd.FromState == NfDeploymentState.Abnormal:
+
         if cmd.ToState == NfDeploymentState.Uninstalling:
             cmd2 = commands.UninstallNfDeployment(cmd.NfDeploymentId)
             uninstall_nfdeployment(cmd2, uow)
         else:
             logger.debug("Not insterested state change: {}".format(cmd))
-    elif cmd.FromState == NfDeploymentState.NotInstalled:
-        if cmd.ToState == NfDeploymentState.Initial:
+    elif cmd.FromState == NfDeploymentState.Abnormal:
+        if cmd.ToState == NfDeploymentState.Deleting:
+            # cmd2 = commands.UninstallNfDeployment(cmd.NfDeploymentId)
+            # uninstall_nfdeployment(cmd2, uow)
             cmd2 = commands.DeleteNfDeployment(cmd.NfDeploymentId)
             delete_nfdeployment(cmd2, uow)
         else:
@@ -74,15 +84,19 @@ def handle_nfdeployment_statechanged(
 
 
 # retry 10 seconds
-@retry(tries=20, max_delay=10000)
+@retry(
+    (NfdeploymentNotFoundError),
+    tries=100,
+    delay=2, max_delay=10000, backoff=1)
 def _retry_get_nfdeployment(
         cmd: commands.InstallNfDeployment,
         uow: AbstractUnitOfWork):
     nfdeployment: NfDeployment = uow.nfdeployments.get(
         cmd.NfDeploymentId)
     if nfdeployment is None:
-        raise Exception("Cannot find NfDeployment: {}".format(
-            cmd.NfDeploymentId))
+        raise NfdeploymentNotFoundError(
+            "Cannot find NfDeployment: {}".format(
+                cmd.NfDeploymentId))
     return nfdeployment
 
 
@@ -105,6 +119,8 @@ def install_nfdeployment(
                 nfdeployment.descriptorId, nfdeployment.id
             ))
 
+    nfdeployment.set_state(NfDeploymentState.Installing)
+
     # helm repo add
     repourl = desc.artifactRepoUrl
     helm = Helm(logger, LOCAL_HELM_BIN, environment_variables={})
@@ -153,7 +169,9 @@ def install_nfdeployment(
     # in case success
     with uow:
         entity: NfDeployment = uow.nfdeployments.get(cmd.NfDeploymentId)
-        entity.transit_state(NfDeploymentState.Installed)
+        if entity:
+            entity.set_state(NfDeploymentState.Installed)
+            entity.transit_state(NfDeploymentState.Installed)
         uow.commit()
 
 
@@ -181,6 +199,12 @@ def uninstall_nfdeployment(
                 nfdeployment.descriptorId, nfdeployment.id
             ))
 
+    with uow:
+        entity: NfDeployment = uow.nfdeployments.get(cmd.NfDeploymentId)
+        if entity:
+            entity.set_state(NfDeploymentState.Uninstalling)
+        uow.commit()
+
     helm = Helm(logger, LOCAL_HELM_BIN, environment_variables={})
 
     logger.debug('Try to helm del {}'.format(
@@ -198,7 +222,9 @@ def uninstall_nfdeployment(
 
     with uow:
         entity: NfDeployment = uow.nfdeployments.get(cmd.NfDeploymentId)
-        entity.transit_state(NfDeploymentState.Initial)
+        if entity:
+            entity.set_state(NfDeploymentState.Initial)
+            entity.transit_state(NfDeploymentState.Deleting)
         # uow.nfdeployments.update(
         #     cmd.NfDeploymentId, status=NfDeploymentState.Initial)
         uow.commit()