You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datalab.apache.org by yk...@apache.org on 2021/07/01 23:45:30 UTC

[incubator-datalab] branch develop updated: [DATALAB] -- fixed bugs with statuses

This is an automated email from the ASF dual-hosted git repository.

ykinash pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-datalab.git


The following commit(s) were added to refs/heads/develop by this push:
     new dcb1818  [DATALAB] -- fixed bugs with statuses
     new 2084983  Merge remote-tracking branch 'origin/develop' into develop
dcb1818 is described below

commit dcb1818cfbc06f9079b949ffab33a1f720291b83
Author: KinashYurii <ur...@gmail.com>
AuthorDate: Fri Jul 2 02:44:56 2021 +0300

    [DATALAB] -- fixed bugs with statuses
---
 .../response/handlers/ProjectCallbackHandler.java  | 32 +++++---
 .../response/handlers/ResourceCallbackHandler.java | 15 ++--
 .../handlers/dao/FileSystemCallbackHandlerDao.java |  1 +
 .../service/impl/ProjectServiceImpl.java           | 86 +++++++++++-----------
 .../backendapi/resources/ProjectResource.java      |  7 ++
 .../resources/callback/ProjectCallback.java        | 51 +++++++++----
 6 files changed, 118 insertions(+), 74 deletions(-)

diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ProjectCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ProjectCallbackHandler.java
index cad5635..1fd151a 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ProjectCallbackHandler.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ProjectCallbackHandler.java
@@ -26,10 +26,12 @@ import com.epam.datalab.dto.base.project.ProjectResult;
 import com.epam.datalab.exceptions.DatalabException;
 import com.epam.datalab.rest.client.RESTService;
 import com.fasterxml.jackson.databind.JsonNode;
+import lombok.extern.slf4j.Slf4j;
 
 import java.io.IOException;
 import java.util.Arrays;
 
+@Slf4j
 public class ProjectCallbackHandler extends ResourceCallbackHandler<ProjectResult> {
 
 
@@ -55,18 +57,24 @@ public class ProjectCallbackHandler extends ResourceCallbackHandler<ProjectResul
 
     @Override
     protected ProjectResult parseOutResponse(JsonNode resultNode, ProjectResult baseStatus) {
-	    baseStatus.setProjectName(projectName);
-	    baseStatus.setEndpointName(endpointName);
-	    if (resultNode != null && Arrays.asList(DockerAction.CREATE, DockerAction.RECREATE).contains(getAction()) &&
-			    UserInstanceStatus.of(baseStatus.getStatus()) != UserInstanceStatus.FAILED) {
-		    try {
-			    final EdgeInfo projectEdgeInfo = mapper.readValue(resultNode.toString(), clazz);
-			    baseStatus.setEdgeInfo(projectEdgeInfo);
-		    } catch (IOException e) {
-			    throw new DatalabException("Cannot parse the EDGE info in JSON: " + e.getLocalizedMessage(), e);
-		    }
-	    }
+        log.info("TEST LOG!!!: resultNoe: {}, projectResult: {} , projectName: {}, endpointName: {}"
+                , resultNode, baseStatus, projectName, endpointName);
 
-	    return baseStatus;
+        baseStatus.setProjectName(projectName);
+        baseStatus.setEndpointName(endpointName);
+        if (resultNode != null &&
+                Arrays.asList(DockerAction.CREATE, DockerAction.RECREATE, DockerAction.START).contains(getAction()) &&
+                UserInstanceStatus.of(baseStatus.getStatus()) != UserInstanceStatus.FAILED) {
+            log.info("TEST LOG!!!: result!=null, dockerAction = create,recreate");
+            try {
+                final EdgeInfo projectEdgeInfo = mapper.readValue(resultNode.toString(), clazz);
+                log.info("TEST LOG!!!: edgeInfo:{}", projectEdgeInfo);
+                baseStatus.setEdgeInfo(projectEdgeInfo);
+                log.info("TEST LOG!!!: baseStatus:{}", baseStatus);
+            } catch (IOException e) {
+                throw new DatalabException("Cannot parse the EDGE info in JSON: " + e.getLocalizedMessage(), e);
+            }
+        }
+        return baseStatus;
     }
 }
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourceCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourceCallbackHandler.java
index 5690657..94909be 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourceCallbackHandler.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourceCallbackHandler.java
@@ -104,10 +104,12 @@ public abstract class ResourceCallbackHandler<T extends StatusBaseDTO<?>> implem
         debugMessage("Send post request to self service {} for UUID {}, object is {}",
                 getCallbackURI(), uuid, object);
         try {
+            log.info("TEST LOG!!!: post to ss. SS: {}, uri: {}, obj: {}, resultType: {}"
+                    , selfService, getCallbackURI(), object, resultType);
             selfService.post(getCallbackURI(), object, resultType);
         } catch (Exception e) {
-            log.error("Send request or response error for UUID {}: {}", uuid, e.getLocalizedMessage(), e);
-            throw new DatalabException("Send request or responce error for UUID " + uuid + ": " + e.getLocalizedMessage()
+            log.error("{} Send request or response error for UUID {}: {}", this.getClass().toString(), uuid, e.getLocalizedMessage(), e);
+            throw new DatalabException("Send request or response error for UUID " + uuid + ": " + e.getLocalizedMessage()
                     , e);
         }
     }
@@ -129,7 +131,7 @@ public abstract class ResourceCallbackHandler<T extends StatusBaseDTO<?>> implem
             result.setErrorMessage(getTextValue(resultNode.get(ERROR_NODE)));
         }
         result = parseOutResponse(resultNode, result);
-
+        log.info("TEST LOG!!!: send to ss: {}", result);
         selfServicePost(result);
         return !UserInstanceStatus.FAILED.equals(status);
     }
@@ -141,7 +143,8 @@ public abstract class ResourceCallbackHandler<T extends StatusBaseDTO<?>> implem
             selfServicePost((T) getBaseStatusDTO(UserInstanceStatus.FAILED)
                     .withErrorMessage(errorMessage));
         } catch (Exception t) {
-            throw new DatalabException("Could not send error message to Self Service for UUID " + uuid + ", user " + user + ": " + errorMessage, t);
+            throw new DatalabException("Could not send error message to Self Service for UUID "
+                    + uuid + ", user " + user + ": " + errorMessage, t);
         }
     }
 
@@ -176,8 +179,8 @@ public abstract class ResourceCallbackHandler<T extends StatusBaseDTO<?>> implem
                 case CREATE_IMAGE:
                     return UserInstanceStatus.CREATED; // Any status besides failed
                 case CREATE:
-	            case RECREATE:
-	            case CONFIGURE:
+                case RECREATE:
+                case CONFIGURE:
                 case START:
                 case RECONFIGURE_SPARK:
                     return UserInstanceStatus.RUNNING;
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
index 6e39555..002b498 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
@@ -111,6 +111,7 @@ public class FileSystemCallbackHandlerDao implements CallbackHandlerDao {
     }
 
     private Optional<PersistentFileHandler> toPersistentFileHandler(Path path) {
+        log.info("TEST LOG!!!: path: {}",path);
         try {
             return Optional.of(mapper.readValue(path.toFile(), PersistentFileHandler.class));
         } catch (Exception e) {
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
index 640190c..f92e1f4 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
@@ -21,11 +21,7 @@ package com.epam.datalab.backendapi.service.impl;
 
 import com.epam.datalab.auth.UserInfo;
 import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.datalab.backendapi.core.commands.CommandBuilder;
-import com.epam.datalab.backendapi.core.commands.DockerAction;
-import com.epam.datalab.backendapi.core.commands.DockerCommands;
-import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
-import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.commands.*;
 import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
 import com.epam.datalab.backendapi.core.response.handlers.ProjectCallbackHandler;
 import com.epam.datalab.backendapi.service.ProjectService;
@@ -45,51 +41,56 @@ import java.util.Objects;
 
 @Slf4j
 public class ProjectServiceImpl implements ProjectService {
-	private static final String PROJECT_IMAGE = "docker.datalab-project";
-	private static final String EDGE_IMAGE = "docker.datalab-edge";
-	private static final String CALLBACK_URI = "/api/project/status";
-	private static final String PROJECT_RESOURCE_TYPE = "project";
-	private static final String EDGE_RESOURCE_TYPE = "edge";
-
-	protected final RESTService selfService;
-	private final ProvisioningServiceApplicationConfiguration configuration;
-	private final FolderListenerExecutor folderListenerExecutor;
-	private final ICommandExecutor commandExecutor;
-	private final CommandBuilder commandBuilder;
-
-	@Inject
-	public ProjectServiceImpl(RESTService selfService, ProvisioningServiceApplicationConfiguration configuration,
-	                          FolderListenerExecutor folderListenerExecutor, ICommandExecutor commandExecutor, CommandBuilder commandBuilder) {
-	    this.selfService = selfService;
-	    this.configuration = configuration;
-	    this.folderListenerExecutor = folderListenerExecutor;
-	    this.commandExecutor = commandExecutor;
-	    this.commandBuilder = commandBuilder;
+    private static final String PROJECT_IMAGE = "docker.datalab-project";
+    private static final String EDGE_IMAGE = "docker.datalab-edge";
+    private static final String CALLBACK_URI = "/api/project/status";
+    private static final String PROJECT_RESOURCE_TYPE = "project";
+    private static final String EDGE_RESOURCE_TYPE = "edge";
+
+    protected final RESTService selfService;
+    private final ProvisioningServiceApplicationConfiguration configuration;
+    private final FolderListenerExecutor folderListenerExecutor;
+    private final ICommandExecutor commandExecutor;
+    private final CommandBuilder commandBuilder;
+
+    @Inject
+    public ProjectServiceImpl(RESTService selfService, ProvisioningServiceApplicationConfiguration configuration,
+                              FolderListenerExecutor folderListenerExecutor, ICommandExecutor commandExecutor, CommandBuilder commandBuilder) {
+        this.selfService = selfService;
+        this.configuration = configuration;
+        this.folderListenerExecutor = folderListenerExecutor;
+        this.commandExecutor = commandExecutor;
+        this.commandBuilder = commandBuilder;
     }
 
-	@Override
-	public String create(UserInfo userInfo, ProjectCreateDTO dto) {
-		return executeDocker(userInfo, dto, DockerAction.CREATE, dto.getName(), PROJECT_RESOURCE_TYPE, PROJECT_IMAGE, dto.getEndpoint());
-	}
+    @Override
+    public String create(UserInfo userInfo, ProjectCreateDTO dto) {
+        log.info("Trying to create project: {}", dto);
+        return executeDocker(userInfo, dto, DockerAction.CREATE, dto.getName(), PROJECT_RESOURCE_TYPE, PROJECT_IMAGE, dto.getEndpoint());
+    }
 
-	@Override
-	public String recreate(UserInfo userInfo, ProjectCreateDTO dto) {
-		return executeDocker(userInfo, dto, DockerAction.RECREATE, dto.getName(), PROJECT_RESOURCE_TYPE, PROJECT_IMAGE, dto.getEndpoint());
-	}
+    @Override
+    public String recreate(UserInfo userInfo, ProjectCreateDTO dto) {
+        log.info("Trying to recreate project: {}", dto);
+        return executeDocker(userInfo, dto, DockerAction.RECREATE, dto.getName(), PROJECT_RESOURCE_TYPE, PROJECT_IMAGE, dto.getEndpoint());
+    }
 
-	@Override
-	public String terminate(UserInfo userInfo, ProjectActionDTO dto) {
-		return executeDocker(userInfo, dto, DockerAction.TERMINATE, dto.getName(), PROJECT_RESOURCE_TYPE, PROJECT_IMAGE, dto.getEndpoint());
-	}
+    @Override
+    public String terminate(UserInfo userInfo, ProjectActionDTO dto) {
+        log.info("Trying to terminate project: {}", dto);
+        return executeDocker(userInfo, dto, DockerAction.TERMINATE, dto.getName(), PROJECT_RESOURCE_TYPE, PROJECT_IMAGE, dto.getEndpoint());
+    }
 
-	@Override
-	public String start(UserInfo userInfo, ProjectActionDTO dto) {
-		return executeDocker(userInfo, dto, DockerAction.START, dto.getName(), EDGE_RESOURCE_TYPE, EDGE_IMAGE, dto.getEndpoint());
-	}
+    @Override
+    public String start(UserInfo userInfo, ProjectActionDTO dto) {
+        log.info("Trying to start project: {}", dto);
+        return executeDocker(userInfo, dto, DockerAction.START, dto.getName(), EDGE_RESOURCE_TYPE, EDGE_IMAGE, dto.getEndpoint());
+    }
 
     @Override
     public String stop(UserInfo userInfo, ProjectActionDTO dto) {
-	    return executeDocker(userInfo, dto, DockerAction.STOP, dto.getName(), EDGE_RESOURCE_TYPE, EDGE_IMAGE, dto.getEndpoint());
+        log.info("Trying to stop project: {}", dto);
+        return executeDocker(userInfo, dto, DockerAction.STOP, dto.getName(), EDGE_RESOURCE_TYPE, EDGE_IMAGE, dto.getEndpoint());
     }
 
     private String executeDocker(UserInfo userInfo, ResourceBaseDTO dto, DockerAction action, String projectName,
@@ -113,6 +114,7 @@ public class ProjectServiceImpl implements ProjectService {
                 .withConfKeyName(configuration.getAdminKey())
                 .withImage(image)
                 .withAction(action);
+        log.info("Docker command : {}", runDockerCommand);
         if (configuration.getCloudProvider() == CloudProvider.AZURE &&
                 Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
                 !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ProjectResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ProjectResource.java
index a0f3407..15eae6a 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ProjectResource.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ProjectResource.java
@@ -39,6 +39,7 @@ import io.swagger.v3.oas.annotations.headers.Header;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import lombok.extern.slf4j.Slf4j;
 
 import javax.annotation.security.RolesAllowed;
 import javax.validation.Valid;
@@ -61,6 +62,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 @Path("project")
+@Slf4j
 public class ProjectResource {
     private final ProjectService projectService;
     private final AccessKeyService keyService;
@@ -90,6 +92,7 @@ public class ProjectResource {
     @RolesAllowed("/api/project/create")
     public Response createProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
                                   @Valid CreateProjectDTO projectDTO) {
+        log.info("Trying to create project: {}", projectDTO);
         List<ProjectEndpointDTO> projectEndpointDTOS = projectDTO.getEndpoints()
                 .stream()
                 .map(e -> new ProjectEndpointDTO(e, UserInstanceStatus.CREATING, null))
@@ -115,6 +118,8 @@ public class ProjectResource {
     @RolesAllowed("/api/project")
     public Response recreateProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
                                     @NotNull @Valid ProjectActionFormDTO startProjectDto) {
+        log.info("Trying to recreate project: {}", startProjectDto);
+
         startProjectDto.getEndpoints()
                 .forEach(endpoint -> projectService.recreate(userInfo, endpoint, startProjectDto.getProjectName()));
         return Response
@@ -133,6 +138,7 @@ public class ProjectResource {
     @RolesAllowed("/api/project")
     public Response startProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
                                  @NotNull @Valid ProjectActionFormDTO startProjectDto) {
+        log.info("Trying to start project: {}", startProjectDto);
         projectService.start(userInfo, startProjectDto.getEndpoints(), startProjectDto.getProjectName());
         return Response
                 .accepted()
@@ -150,6 +156,7 @@ public class ProjectResource {
     @RolesAllowed("/api/project")
     public Response stopProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
                                 @NotNull @Valid ProjectActionFormDTO stopProjectDTO) {
+        log.info("Trying to stop project: {}", stopProjectDTO);
         projectService.stopWithResources(userInfo, stopProjectDTO.getEndpoints(), stopProjectDTO.getProjectName());
         return Response
                 .accepted()
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java
index 42a1297..be8f076 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java
@@ -23,10 +23,12 @@ import com.epam.datalab.backendapi.dao.EndpointDAO;
 import com.epam.datalab.backendapi.dao.GpuDAO;
 import com.epam.datalab.backendapi.dao.ProjectDAO;
 import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.schedulers.CheckInfrastructureStatusScheduler;
 import com.epam.datalab.backendapi.service.ExploratoryService;
 import com.epam.datalab.dto.UserInstanceStatus;
 import com.epam.datalab.dto.base.project.ProjectResult;
 import com.epam.datalab.dto.imagemetadata.EdgeGPU;
+import com.epam.datalab.exceptions.DatalabException;
 import com.google.inject.Inject;
 import lombok.extern.slf4j.Slf4j;
 
@@ -47,36 +49,57 @@ public class ProjectCallback {
     private final ExploratoryService exploratoryService;
     private final RequestId requestId;
     private final GpuDAO gpuDAO;
+    private final CheckInfrastructureStatusScheduler scheduler;
 
     @Inject
     public ProjectCallback(ProjectDAO projectDAO, EndpointDAO endpointDAO, ExploratoryService exploratoryService, RequestId requestId,
-                           GpuDAO gpuDAO) {
+                           GpuDAO gpuDAO, CheckInfrastructureStatusScheduler scheduler) {
         this.projectDAO = projectDAO;
         this.exploratoryService = exploratoryService;
         this.requestId = requestId;
         this.gpuDAO = gpuDAO;
+        this.scheduler = scheduler;
     }
 
 
     @POST
     public Response updateProjectStatus(ProjectResult projectResult) {
-        requestId.checkAndRemove(projectResult.getRequestId());
-        final String projectName = projectResult.getProjectName();
-        final UserInstanceStatus status = UserInstanceStatus.of(projectResult.getStatus());
-        if (projectResult.getEdgeInfo().getGpuList() != null) {
-            List<String> gpuList = projectResult.getEdgeInfo().getGpuList();
-            log.info("Adding edgeGpu with gpu_types: {}, for project: {}", gpuList, projectName);
-            gpuDAO.create(new EdgeGPU(projectName, gpuList));
-        }
-        if (UserInstanceStatus.RUNNING == status && Objects.nonNull(projectResult.getEdgeInfo())) {
-            projectDAO.updateEdgeInfo(projectName, projectResult.getEndpointName(), projectResult.getEdgeInfo());
-        } else {
-            updateExploratoriesStatusIfNeeded(status, projectResult.getProjectName(), projectResult.getEndpointName());
-            projectDAO.updateEdgeStatus(projectName, projectResult.getEndpointName(), status);
+        try {
+
+            log.info("TEST LOG!!!: projectResult: {}", projectResult);
+
+            requestId.checkAndRemove(projectResult.getRequestId());
+            final String projectName = projectResult.getProjectName();
+            final UserInstanceStatus status = UserInstanceStatus.of(projectResult.getStatus());
+            saveGpuForProject(projectResult, projectName);
+            if (UserInstanceStatus.RUNNING == status && Objects.nonNull(projectResult.getEdgeInfo())) {
+                projectDAO.updateEdgeInfo(projectName, projectResult.getEndpointName(), projectResult.getEdgeInfo());
+            } else {
+                updateExploratoriesStatusIfNeeded(status, projectResult.getProjectName(), projectResult.getEndpointName());
+                projectDAO.updateEdgeStatus(projectName, projectResult.getEndpointName(), status);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            log.info("Run scheduler");
+            scheduler.execute(null);
         }
         return Response.ok().build();
     }
 
+    private void saveGpuForProject(ProjectResult projectResult, String projectName) {
+        try {
+
+            if (projectResult.getEdgeInfo().getGpuList() != null) {
+                List<String> gpuList = projectResult.getEdgeInfo().getGpuList();
+                log.info("Adding edgeGpu with gpu_types: {}, for project: {}", gpuList, projectName);
+                gpuDAO.create(new EdgeGPU(projectName, gpuList));
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            throw new DatalabException(e.getMessage(), e);
+        }
+    }
+
     private void updateExploratoriesStatusIfNeeded(UserInstanceStatus status, String projectName, String endpoint) {
         if (UserInstanceStatus.TERMINATED == status) {
             exploratoryService.updateProjectExploratoryStatuses(projectName, endpoint, UserInstanceStatus.TERMINATED);

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datalab.apache.org
For additional commands, e-mail: commits-help@datalab.apache.org