This is an automated email from the ASF dual-hosted git repository. ofuks pushed a commit to branch multiple-cloud in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git
The following commit(s) were added to refs/heads/multiple-cloud by this push: new e6524c5 Updated provisioning callbacks e6524c5 is described below commit e6524c5249dd36749a96c5d5f62bf8cfc78522f2 Author: Oleh Fuks <olegfuk...@gmail.com> AuthorDate: Wed Jan 15 16:29:02 2020 +0200 Updated provisioning callbacks --- .../src/ssn/templates/ssn.yml | 3 - .../dto/base/computational/ComputationalBase.java | 8 +- services/provisioning-service/pom.xml | 5 + .../backendapi/ProvisioningServiceApplication.java | 2 +- .../handlers/ComputationalCallbackHandler.java | 8 +- .../response/handlers/ComputationalConfigure.java | 11 +- .../ComputationalConfigureCallbackHandler.java | 7 +- .../handlers/ExploratoryCallbackHandler.java | 10 +- .../ExploratoryGitCredsCallbackHandler.java | 7 +- .../handlers/ImageCreateCallbackHandler.java | 6 +- .../handlers/LibInstallCallbackHandler.java | 8 +- .../response/handlers/LibListCallbackHandler.java | 7 +- .../java/com/epam/dlab/backendapi/dao/BaseDAO.java | 111 +++++++++++++++++++++ .../EndpointDAO.java} | 31 ++---- .../dlab/backendapi/dao/impl/EndpointDAOImpl.java | 54 ++++++++++ .../dlab/backendapi/modules/ProductionModule.java | 8 ++ .../backendapi/modules/ProvisioningDevModule.java | 12 ++- ...lthCheckResource.java => EndpointResource.java} | 30 ++++-- .../resources/GitExploratoryResource.java | 15 ++- .../dlab/backendapi/resources/ImageResource.java | 9 +- .../dlab/backendapi/resources/LibraryResource.java | 32 +++--- .../resources/aws/ComputationalResourceAws.java | 16 ++- .../resources/base/ExploratoryService.java | 14 ++- .../resources/gcp/ComputationalResourceGcp.java | 15 ++- .../EndpointService.java} | 30 +----- .../service/impl/EndpointServiceImpl.java | 62 ++++++++++++ .../service/impl/ProjectServiceImpl.java | 7 +- .../service/impl/SparkClusterService.java | 15 ++- .../core/commands/CommandExecutorMockTest.java | 4 +- .../dao/FileSystemCallbackHandlerDaoTest.java | 9 +- .../dropwizard/listeners/MongoStartupListener.java | 7 +- .../dlab/backendapi/modules/ModuleFactory.java | 24 ++--- .../backendapi/resources/EndpointResource.java | 2 +- .../endpoint/CheckEndpointStatusScheduler.java | 2 +- .../dlab/backendapi/service/EndpointService.java | 3 +- .../service/impl/EndpointServiceImpl.java | 29 +++++- .../epam/dlab/backendapi/util/RequestBuilder.java | 12 ++- 37 files changed, 483 insertions(+), 152 deletions(-) diff --git a/infrastructure-provisioning/src/ssn/templates/ssn.yml b/infrastructure-provisioning/src/ssn/templates/ssn.yml index bed2bf6..70b89e2 100644 --- a/infrastructure-provisioning/src/ssn/templates/ssn.yml +++ b/infrastructure-provisioning/src/ssn/templates/ssn.yml @@ -42,9 +42,6 @@ mongo: database: dlabdb selfService: - protocol: https - host: localhost - port: 8443 jerseyClient: timeout: 3s connectionTimeout: 3s diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/ComputationalBase.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/ComputationalBase.java index e3aa000..a55445c 100644 --- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/ComputationalBase.java +++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/ComputationalBase.java @@ -41,7 +41,7 @@ public abstract class ComputationalBase<T extends ComputationalBase<?>> extends @JsonProperty("project_name") private String project; @JsonProperty("endpoint_name") - private String ednpoint; + private String endpoint; @JsonProperty("tags") private Map<String, String> tags; @@ -96,7 +96,7 @@ public abstract class ComputationalBase<T extends ComputationalBase<?>> extends } public T withEndpoint(String endpoint) { - this.ednpoint = endpoint; + this.endpoint = endpoint; return self; } @@ -104,6 +104,10 @@ public abstract class ComputationalBase<T extends ComputationalBase<?>> extends return project; } + public String getEndpoint() { + return endpoint; + } + @Override public ToStringHelper toStringHelper(Object self) { return super.toStringHelper(self) diff --git a/services/provisioning-service/pom.xml b/services/provisioning-service/pom.xml index 1a6548e..5c625a4 100644 --- a/services/provisioning-service/pom.xml +++ b/services/provisioning-service/pom.xml @@ -63,6 +63,11 @@ <artifactId>conveyor</artifactId> <version>${com.aegisql.conveyor.version}</version> </dependency> + <dependency> + <groupId>org.mongodb</groupId> + <artifactId>mongo-java-driver</artifactId> + <version>${org.mongodb.version}</version> + </dependency> <dependency> <groupId>org.mockito</groupId> diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplication.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplication.java index 6f1047b..1a136f1 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplication.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplication.java @@ -144,6 +144,6 @@ public class ProvisioningServiceApplication extends Application<ProvisioningServ jersey.register(injector.getInstance(KeyResource.class)); jersey.register(injector.getInstance(CallbackHandlerResource.class)); jersey.register(injector.getInstance(ProjectResource.class)); - jersey.register(injector.getInstance(ProvisioningHealthCheckResource.class)); + jersey.register(injector.getInstance(EndpointResource.class)); } } diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalCallbackHandler.java index 8ccf260..c77476c 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalCallbackHandler.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalCallbackHandler.java @@ -25,7 +25,6 @@ import com.epam.dlab.dto.UserInstanceStatus; import com.epam.dlab.dto.base.computational.ComputationalBase; import com.epam.dlab.dto.computational.ComputationalStatusDTO; import com.epam.dlab.rest.client.RESTService; -import com.epam.dlab.rest.contracts.ApiCallbacks; import com.fasterxml.jackson.annotation.JacksonInject; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; @@ -51,17 +50,20 @@ public class ComputationalCallbackHandler extends ResourceCallbackHandler<Comput @JsonProperty private final ComputationalBase<?> dto; private ComputationalConfigure computationalConfigure; + private String callbackUri; @JsonCreator public ComputationalCallbackHandler(@JacksonInject ComputationalConfigure computationalConfigure, @JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action, @JsonProperty("uuid") String uuid, - @JsonProperty("dto") ComputationalBase<?> dto) { + @JsonProperty("dto") ComputationalBase<?> dto, + String callbackUri) { super(selfService, dto.getCloudSettings().getIamUser(), uuid, action); this.computationalConfigure = computationalConfigure; this.dto = dto; + this.callbackUri = callbackUri; } protected ComputationalBase<?> getDto() { @@ -70,7 +72,7 @@ public class ComputationalCallbackHandler extends ResourceCallbackHandler<Comput @Override protected String getCallbackURI() { - return ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI; + return callbackUri; } @Override diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigure.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigure.java index adba483..16826b1 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigure.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigure.java @@ -24,12 +24,14 @@ import com.epam.dlab.backendapi.core.Directories; import com.epam.dlab.backendapi.core.FileHandlerCallback; import com.epam.dlab.backendapi.core.commands.*; import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor; +import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.dto.aws.computational.SparkComputationalCreateAws; import com.epam.dlab.dto.base.DataEngineType; import com.epam.dlab.dto.base.computational.ComputationalBase; import com.epam.dlab.dto.gcp.computational.SparkComputationalCreateGcp; import com.epam.dlab.exceptions.DlabException; import com.epam.dlab.rest.client.RESTService; +import com.epam.dlab.rest.contracts.ApiCallbacks; import com.google.inject.Inject; import com.google.inject.Singleton; import lombok.extern.slf4j.Slf4j; @@ -49,6 +51,8 @@ public class ComputationalConfigure implements DockerCommands { private CommandBuilder commandBuilder; @Inject private RESTService selfService; + @Inject + private EndpointService endpointService; public String configure(String uuid, ComputationalBase<?> dto) { switch (configuration.getCloudProvider()) { @@ -79,7 +83,8 @@ public class ComputationalConfigure implements DockerCommands { folderListenerExecutor.start( configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(), - getFileHandlerCallback(CONFIGURE, uuid, dto)); + getFileHandlerCallback(CONFIGURE, uuid, dto, endpointService.getEndpointUrl(dto.getEndpoint()) + + ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI)); try { commandExecutor.executeAsync( dto.getEdgeUserName(), @@ -106,8 +111,8 @@ public class ComputationalConfigure implements DockerCommands { } private FileHandlerCallback getFileHandlerCallback(DockerAction action, String originalUuid, ComputationalBase<?> - dto) { - return new ComputationalConfigureCallbackHandler(selfService, action, originalUuid, dto); + dto, String callbackUri) { + return new ComputationalConfigureCallbackHandler(selfService, action, originalUuid, dto, callbackUri); } private String nameContainer(String user, DockerAction action, String exploratoryName, String name) { diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java index c53c86e..aa4174e 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java @@ -36,19 +36,22 @@ public class ComputationalConfigureCallbackHandler extends ResourceCallbackHandl @JsonProperty private final ComputationalBase<?> dto; + private String callbackUri; @JsonCreator public ComputationalConfigureCallbackHandler(@JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action, @JsonProperty("uuid") String uuid, - @JsonProperty("dto") ComputationalBase<?> dto) { + @JsonProperty("dto") ComputationalBase<?> dto, + String callbackUri) { super(selfService, dto.getCloudSettings().getIamUser(), uuid, action); this.dto = dto; + this.callbackUri = callbackUri; } @Override protected String getCallbackURI() { - return ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI; + return callbackUri; } @Override diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java index 62746e8..0569690 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java @@ -35,9 +35,6 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.List; -import static com.epam.dlab.rest.contracts.ApiCallbacks.EXPLORATORY; -import static com.epam.dlab.rest.contracts.ApiCallbacks.STATUS_URI; - public class ExploratoryCallbackHandler extends ResourceCallbackHandler<ExploratoryStatusDTO> { private static final Logger LOGGER = LoggerFactory.getLogger(ExploratoryCallbackHandler.class); @@ -50,19 +47,22 @@ public class ExploratoryCallbackHandler extends ResourceCallbackHandler<Explorat @JsonProperty private final String exploratoryName; + private String callbackUri; @JsonCreator public ExploratoryCallbackHandler(@JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action, @JsonProperty("uuid") String uuid, @JsonProperty("user") String user, - @JsonProperty("exploratoryName") String exploratoryName) { + @JsonProperty("exploratoryName") String exploratoryName, + String callbackUri) { super(selfService, user, uuid, action); this.exploratoryName = exploratoryName; + this.callbackUri = callbackUri; } @Override protected String getCallbackURI() { - return EXPLORATORY + STATUS_URI; + return callbackUri; } @Override diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java index b6857e5..9bfe366 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java @@ -35,20 +35,23 @@ public class ExploratoryGitCredsCallbackHandler extends ResourceCallbackHandler< @JsonProperty private final String exploratoryName; + private String callbackUri; @JsonCreator public ExploratoryGitCredsCallbackHandler(@JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action, @JsonProperty("uuid") String uuid, @JsonProperty("user") String user, - @JsonProperty("exploratoryName") String exploratoryName) { + @JsonProperty("exploratoryName") String exploratoryName, + String callbackUri) { super(selfService, user, uuid, action); this.exploratoryName = exploratoryName; + this.callbackUri = callbackUri; } @Override protected String getCallbackURI() { - return ApiCallbacks.GIT_CREDS; + return callbackUri; } @Override diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java index dbbc535..108aa26 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java @@ -44,14 +44,16 @@ public class ImageCreateCallbackHandler extends ResourceCallbackHandler<ImageCre private final String project; @JsonProperty private final String endpoint; + private String callbackUri; public ImageCreateCallbackHandler(RESTService selfService, String uuid, DockerAction action, - ExploratoryImageDTO image) { + ExploratoryImageDTO image, String callbackUri) { super(selfService, image.getCloudSettings().getIamUser(), uuid, action); this.imageName = image.getImageName(); this.exploratoryName = image.getExploratoryName(); this.project = image.getProject(); this.endpoint = image.getEndpoint(); + this.callbackUri = callbackUri; } @JsonCreator @@ -72,7 +74,7 @@ public class ImageCreateCallbackHandler extends ResourceCallbackHandler<ImageCre @Override protected String getCallbackURI() { - return ApiCallbacks.IMAGE_STATUS_URI; + return callbackUri; } @Override diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibInstallCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibInstallCallbackHandler.java index a31fea3..947232b 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibInstallCallbackHandler.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibInstallCallbackHandler.java @@ -26,7 +26,6 @@ import com.epam.dlab.dto.exploratory.LibInstallStatusDTO; import com.epam.dlab.dto.exploratory.LibraryInstallDTO; import com.epam.dlab.exceptions.DlabException; import com.epam.dlab.rest.client.RESTService; -import com.epam.dlab.rest.contracts.ApiCallbacks; import com.fasterxml.jackson.annotation.JacksonInject; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; @@ -60,6 +59,7 @@ public class LibInstallCallbackHandler extends ResourceCallbackHandler<LibInstal */ @JsonProperty private final LibraryInstallDTO dto; + private String callbackUri; /** * Instantiate handler for process of docker response for libraries installation. @@ -74,14 +74,16 @@ public class LibInstallCallbackHandler extends ResourceCallbackHandler<LibInstal @JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action, @JsonProperty("uuid") String uuid, @JsonProperty("user") String user, - @JsonProperty("dto") LibraryInstallDTO dto) { + @JsonProperty("dto") LibraryInstallDTO dto, + String callbackUri) { super(selfService, user, uuid, action); this.dto = dto; + this.callbackUri = callbackUri; } @Override protected String getCallbackURI() { - return ApiCallbacks.LIB_STATUS_URI; + return callbackUri; } @Override diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java index ca0268c..b68d385 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java @@ -50,6 +50,7 @@ public class LibListCallbackHandler extends ResourceCallbackHandler<LibListStatu */ @JsonProperty private final String imageName; + private String callbackUri; /** * Instantiate handler for process of docker response for list of libraries. @@ -64,14 +65,16 @@ public class LibListCallbackHandler extends ResourceCallbackHandler<LibListStatu public LibListCallbackHandler( @JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action, @JsonProperty("uuid") String uuid, @JsonProperty("user") String user, - @JsonProperty("imageName") String imageName) { + @JsonProperty("imageName") String imageName, + String callbackUri) { super(selfService, user, uuid, action); this.imageName = imageName; + this.callbackUri = callbackUri; } @Override protected String getCallbackURI() { - return ApiCallbacks.UPDATE_LIBS_URI; + return callbackUri; } @Override diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java new file mode 100644 index 0000000..af23922 --- /dev/null +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package com.epam.dlab.backendapi.dao; + +import com.epam.dlab.exceptions.DlabException; +import com.epam.dlab.mongo.MongoService; +import com.epam.dlab.util.mongo.modules.IsoDateModule; +import com.epam.dlab.util.mongo.modules.JavaPrimitiveModule; +import com.epam.dlab.util.mongo.modules.MongoModule; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.inject.Inject; +import com.mongodb.MongoException; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoIterable; +import lombok.extern.slf4j.Slf4j; +import org.bson.Document; +import org.bson.conversions.Bson; + +import java.io.IOException; +import java.util.Date; +import java.util.Optional; +import java.util.UUID; + +@Slf4j +public class BaseDAO { + public static final String ID = "_id"; + public static final String TIMESTAMP = "timestamp"; + + private static final ObjectMapper MAPPER = new ObjectMapper() + .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true) + .registerModule(new IsoDateModule()) + .registerModule(new JavaPrimitiveModule()) + .registerModule(new MongoModule()); + + @Inject + protected MongoService mongoService; + + protected Optional<Document> findOne(String collection, Bson condition) { + FindIterable<Document> found = find(collection, condition); + return limitOne(found); + } + + protected void insertOne(String collection, Object object) { + insertOne(collection, object, generateUUID()); + } + + protected FindIterable<Document> find(String collection) { + return mongoService.getCollection(collection).find(); + } + + private FindIterable<Document> find(String collection, Bson condition) { + return mongoService.getCollection(collection).find(condition); + } + + private Optional<Document> limitOne(MongoIterable<Document> documents) { + Document first = documents.first(); + try (MongoCursor<Document> iterator = documents.iterator()) { + if (iterator.hasNext()) { + iterator.next(); + if (iterator.hasNext()) { + log.error("Too many items found while one is expected"); + throw new DlabException("Too many items found while one is expected"); + } + } + } + return Optional.ofNullable(first); + } + + private void insertOne(String collection, Object object, String uuid) { + try { + mongoService.getCollection(collection) + .insertOne(convertToBson(object) + .append(ID, uuid) + .append(TIMESTAMP, new Date())); + } catch (MongoException e) { + log.error("Insert to Mongo DB fails: {}", e.getLocalizedMessage(), e); + throw new DlabException("Insert to Mongo DB fails: " + e.getLocalizedMessage(), e); + } + } + + private Document convertToBson(Object object) { + try { + return Document.parse(MAPPER.writeValueAsString(object)); + } catch (IOException e) { + throw new DlabException("error converting to bson", e); + } + } + + private String generateUUID() { + return UUID.randomUUID().toString(); + } +} diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/EndpointDAO.java similarity index 51% copy from services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java copy to services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/EndpointDAO.java index e50d7ae..3ef5d68 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/EndpointDAO.java @@ -17,30 +17,17 @@ * under the License. */ -package com.epam.dlab.backendapi.resources; +package com.epam.dlab.backendapi.dao; +import org.bson.Document; -import com.epam.dlab.auth.UserInfo; -import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration; -import com.google.inject.Inject; -import io.dropwizard.auth.Auth; +import java.util.List; +import java.util.Optional; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +public interface EndpointDAO { + Optional<Document> findOne(String name); -@Path("/healthcheck") -@Produces(MediaType.APPLICATION_JSON) -public class ProvisioningHealthCheckResource { - private static final String HEALTH_CHECK = "ProvisioningHealthCheck"; + List<Document> findAll(); - @Inject - private ProvisioningServiceApplicationConfiguration configuration; - - @GET - public Response status(@Auth UserInfo ui) { - return Response.ok(configuration.getCloudProvider()).build(); - } -} \ No newline at end of file + void create(String name, String url); +} diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/impl/EndpointDAOImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/impl/EndpointDAOImpl.java new file mode 100644 index 0000000..39aa9b0 --- /dev/null +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/dao/impl/EndpointDAOImpl.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package com.epam.dlab.backendapi.dao.impl; + +import com.epam.dlab.backendapi.dao.BaseDAO; +import com.epam.dlab.backendapi.dao.EndpointDAO; +import org.bson.Document; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import static com.mongodb.client.model.Filters.eq; + +public class EndpointDAOImpl extends BaseDAO implements EndpointDAO { + private static final String SELFSERVICE_COLLECTION = "selfservice"; + private static final String NAME = "name"; + private static final String URL = "url"; + + + @Override + public Optional<Document> findOne(String name) { + return findOne(SELFSERVICE_COLLECTION, eq(NAME, name)); + } + + @Override + public List<Document> findAll() { + return find(SELFSERVICE_COLLECTION).into(new ArrayList<>()); + } + + @Override + public void create(String name, String url) { + Document document = new Document(URL, url); + document.append(NAME, name); + insertOne(SELFSERVICE_COLLECTION, document); + } +} diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java index 40744fa..2b574f7 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java @@ -27,13 +27,18 @@ import com.epam.dlab.backendapi.core.commands.CommandExecutor; import com.epam.dlab.backendapi.core.commands.ICommandExecutor; import com.epam.dlab.backendapi.core.response.handlers.dao.CallbackHandlerDao; import com.epam.dlab.backendapi.core.response.handlers.dao.FileSystemCallbackHandlerDao; +import com.epam.dlab.backendapi.dao.EndpointDAO; +import com.epam.dlab.backendapi.dao.impl.EndpointDAOImpl; import com.epam.dlab.backendapi.service.CheckInactivityService; +import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.backendapi.service.ProjectService; import com.epam.dlab.backendapi.service.RestoreCallbackHandlerService; import com.epam.dlab.backendapi.service.impl.CheckInactivityServiceImpl; +import com.epam.dlab.backendapi.service.impl.EndpointServiceImpl; import com.epam.dlab.backendapi.service.impl.ProjectServiceImpl; import com.epam.dlab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl; import com.epam.dlab.constants.ServiceConsts; +import com.epam.dlab.mongo.MongoService; import com.epam.dlab.rest.client.RESTService; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; @@ -58,6 +63,7 @@ public class ProductionModule extends ModuleBase<ProvisioningServiceApplicationC @Override protected void configure() { bind(ProvisioningServiceApplicationConfiguration.class).toInstance(configuration); + bind(MongoService.class).toInstance(configuration.getMongoFactory().build(environment)); bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.SECURITY_SERVICE_NAME)) .toInstance(configuration.getSecurityFactory() @@ -73,5 +79,7 @@ public class ProductionModule extends ModuleBase<ProvisioningServiceApplicationC bind(RestoreCallbackHandlerService.class).to(RestoreCallbackHandlerServiceImpl.class); bind(CheckInactivityService.class).to(CheckInactivityServiceImpl.class); bind(ProjectService.class).to(ProjectServiceImpl.class); + bind(EndpointDAO.class).to(EndpointDAOImpl.class); + bind(EndpointService.class).to(EndpointServiceImpl.class); } } diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java index 73d333f..e0957dd 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java @@ -30,14 +30,16 @@ import com.epam.dlab.backendapi.core.commands.CommandExecutorMock; import com.epam.dlab.backendapi.core.commands.ICommandExecutor; import com.epam.dlab.backendapi.core.response.handlers.dao.CallbackHandlerDao; import com.epam.dlab.backendapi.core.response.handlers.dao.FileSystemCallbackHandlerDao; -import com.epam.dlab.backendapi.service.ProjectService; -import com.epam.dlab.backendapi.service.RestoreCallbackHandlerService; -import com.epam.dlab.backendapi.service.CheckInactivityService; +import com.epam.dlab.backendapi.dao.EndpointDAO; +import com.epam.dlab.backendapi.dao.impl.EndpointDAOImpl; +import com.epam.dlab.backendapi.service.*; import com.epam.dlab.backendapi.service.RestoreCallbackHandlerService; import com.epam.dlab.backendapi.service.impl.CheckInactivityServiceImpl; +import com.epam.dlab.backendapi.service.impl.EndpointServiceImpl; import com.epam.dlab.backendapi.service.impl.ProjectServiceImpl; import com.epam.dlab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl; import com.epam.dlab.constants.ServiceConsts; +import com.epam.dlab.mongo.MongoService; import com.epam.dlab.rest.client.RESTService; import com.epam.dlab.rest.contracts.DockerAPI; import com.fasterxml.jackson.core.JsonParser; @@ -69,6 +71,8 @@ public class ProvisioningDevModule extends ModuleBase<ProvisioningServiceApplica @Override protected void configure() { bind(ProvisioningServiceApplicationConfiguration.class).toInstance(configuration); + bind(MongoService.class).toInstance(configuration.getMongoFactory().build(environment)); + bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.SECURITY_SERVICE_NAME)).toInstance (createAuthenticationService()); bind(RESTService.class).toInstance(configuration.getSelfFactory().build(environment, ServiceConsts @@ -80,6 +84,8 @@ public class ProvisioningDevModule extends ModuleBase<ProvisioningServiceApplica bind(RestoreCallbackHandlerService.class).to(RestoreCallbackHandlerServiceImpl.class); bind(CheckInactivityService.class).to(CheckInactivityServiceImpl.class); bind(ProjectService.class).to(ProjectServiceImpl.class); + bind(EndpointDAO.class).to(EndpointDAOImpl.class); + bind(EndpointService.class).to(EndpointServiceImpl.class); } /** diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java similarity index 57% copy from services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java copy to services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java index e50d7ae..1a85d39 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java @@ -19,28 +19,44 @@ package com.epam.dlab.backendapi.resources; - import com.epam.dlab.auth.UserInfo; import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration; +import com.epam.dlab.backendapi.service.EndpointService; import com.google.inject.Inject; import io.dropwizard.auth.Auth; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.Consumes; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -@Path("/healthcheck") +@Path("infrastructure/endpoint") +@Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) -public class ProvisioningHealthCheckResource { - private static final String HEALTH_CHECK = "ProvisioningHealthCheck"; +public class EndpointResource { + private final EndpointService endpointService; + private final ProvisioningServiceApplicationConfiguration configuration; @Inject - private ProvisioningServiceApplicationConfiguration configuration; + public EndpointResource(EndpointService endpointService, ProvisioningServiceApplicationConfiguration configuration) { + this.endpointService = endpointService; + this.configuration = configuration; + } @GET - public Response status(@Auth UserInfo ui) { + @Path("/healthcheck") + public Response status(@Auth UserInfo userInfo) { + return Response.ok().build(); + } + + @POST + public Response connectEndpoint(@Auth UserInfo userInfo, @Context HttpServletRequest request, String name) { + endpointService.create(name, request.getScheme() + "://" + request.getRemoteHost()); return Response.ok(configuration.getCloudProvider()).build(); } -} \ No newline at end of file +} diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/GitExploratoryResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/GitExploratoryResource.java index 80a3d5b..0afeea4 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/GitExploratoryResource.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/GitExploratoryResource.java @@ -26,10 +26,13 @@ import com.epam.dlab.backendapi.core.commands.DockerAction; import com.epam.dlab.backendapi.core.commands.DockerCommands; import com.epam.dlab.backendapi.core.commands.RunDockerCommand; import com.epam.dlab.backendapi.core.response.handlers.ExploratoryGitCredsCallbackHandler; +import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.backendapi.service.impl.DockerService; import com.epam.dlab.dto.exploratory.ExploratoryBaseDTO; import com.epam.dlab.dto.exploratory.ExploratoryGitCredsUpdateDTO; +import com.epam.dlab.rest.contracts.ApiCallbacks; import com.fasterxml.jackson.core.JsonProcessingException; +import com.google.inject.Inject; import io.dropwizard.auth.Auth; import lombok.extern.slf4j.Slf4j; @@ -45,6 +48,9 @@ import javax.ws.rs.core.MediaType; @Slf4j public class GitExploratoryResource extends DockerService implements DockerCommands { + @Inject + private EndpointService endpointService; + @Path("/git_creds") @POST public String gitCredsUpdate(@Auth UserInfo ui, ExploratoryGitCredsUpdateDTO dto) throws JsonProcessingException { @@ -56,7 +62,8 @@ public class GitExploratoryResource extends DockerService implements DockerComma String uuid = DockerCommands.generateUUID(); folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(), - getFileHandlerCallback(action, uuid, dto)); + getFileHandlerCallback(action, uuid, dto, endpointService.getEndpointUrl(dto.getEndpoint()) + + ApiCallbacks.GIT_CREDS)); RunDockerCommand runDockerCommand = new RunDockerCommand() .withInteractive() @@ -74,8 +81,10 @@ public class GitExploratoryResource extends DockerService implements DockerComma return uuid; } - private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ExploratoryBaseDTO<?> dto) { - return new ExploratoryGitCredsCallbackHandler(selfService, action, uuid, dto.getCloudSettings().getIamUser(), dto.getExploratoryName()); + private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ExploratoryBaseDTO<?> dto, + String callbackUri) { + return new ExploratoryGitCredsCallbackHandler(selfService, action, uuid, dto.getCloudSettings().getIamUser(), + dto.getExploratoryName(), callbackUri); } private String nameContainer(String user, DockerAction action, String name) { diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ImageResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ImageResource.java index b57f5b2..cccc600 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ImageResource.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ImageResource.java @@ -25,10 +25,13 @@ import com.epam.dlab.backendapi.core.commands.DockerAction; import com.epam.dlab.backendapi.core.commands.DockerCommands; import com.epam.dlab.backendapi.core.commands.RunDockerCommand; import com.epam.dlab.backendapi.core.response.handlers.ImageCreateCallbackHandler; +import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.backendapi.service.impl.DockerService; import com.epam.dlab.dto.exploratory.ExploratoryImageDTO; +import com.epam.dlab.rest.contracts.ApiCallbacks; import com.epam.dlab.rest.contracts.ExploratoryAPI; import com.fasterxml.jackson.core.JsonProcessingException; +import com.google.inject.Inject; import io.dropwizard.auth.Auth; import lombok.extern.slf4j.Slf4j; @@ -45,12 +48,16 @@ import javax.ws.rs.core.Response; @Slf4j public class ImageResource extends DockerService implements DockerCommands { + @Inject + private EndpointService endpointService; + @POST public Response createImage(@Auth UserInfo ui, ExploratoryImageDTO image) throws JsonProcessingException { final String uuid = DockerCommands.generateUUID(); folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(), - new ImageCreateCallbackHandler(selfService, uuid, DockerAction.CREATE_IMAGE, image)); + new ImageCreateCallbackHandler(selfService, uuid, DockerAction.CREATE_IMAGE, image, + endpointService.getEndpointUrl(image.getEndpoint()) + ApiCallbacks.IMAGE_STATUS_URI)); String command = commandBuilder.buildCommand(getDockerCommand(DockerAction.CREATE_IMAGE, uuid, image), image); commandExecutor.executeAsync(ui.getName(), uuid, command); log.debug("Docker command: " + command); diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java index 0e07d69..28bf9ae 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java @@ -27,15 +27,18 @@ import com.epam.dlab.backendapi.core.commands.DockerCommands; import com.epam.dlab.backendapi.core.commands.RunDockerCommand; import com.epam.dlab.backendapi.core.response.handlers.LibInstallCallbackHandler; import com.epam.dlab.backendapi.core.response.handlers.LibListCallbackHandler; +import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.backendapi.service.impl.DockerService; import com.epam.dlab.dto.LibListComputationalDTO; import com.epam.dlab.dto.base.DataEngineType; import com.epam.dlab.dto.exploratory.ExploratoryActionDTO; import com.epam.dlab.dto.exploratory.ExploratoryBaseDTO; import com.epam.dlab.dto.exploratory.LibraryInstallDTO; +import com.epam.dlab.rest.contracts.ApiCallbacks; import com.epam.dlab.rest.contracts.ComputationalAPI; import com.epam.dlab.rest.contracts.ExploratoryAPI; import com.fasterxml.jackson.core.JsonProcessingException; +import com.google.inject.Inject; import io.dropwizard.auth.Auth; import lombok.extern.slf4j.Slf4j; @@ -51,6 +54,8 @@ import javax.ws.rs.core.MediaType; @Slf4j public class LibraryResource extends DockerService implements DockerCommands { + @Inject + private EndpointService endpointService; @POST @Path(ExploratoryAPI.EXPLORATORY + "/lib_list") @@ -81,7 +86,8 @@ public class LibraryResource extends DockerService implements DockerCommands { String uuid = DockerCommands.generateUUID(); folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(), - getFileHandlerCallbackExploratory(action, uuid, dto)); + getFileHandlerCallbackExploratory(action, uuid, dto, endpointService.getEndpointUrl(dto.getEndpoint()) + + ApiCallbacks.LIB_STATUS_URI)); RunDockerCommand runDockerCommand = getDockerCommandExploratory(dto, action, uuid); @@ -94,7 +100,8 @@ public class LibraryResource extends DockerService implements DockerCommands { String uuid = DockerCommands.generateUUID(); folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(), - getFileHandlerCallbackComputational(action, uuid, dto)); + getFileHandlerCallbackComputational(action, uuid, dto, endpointService.getEndpointUrl(dto.getEndpoint()) + + ApiCallbacks.LIB_STATUS_URI)); RunDockerCommand runDockerCommand = getDockerCommandComputational(dto, action, uuid); @@ -149,29 +156,28 @@ public class LibraryResource extends DockerService implements DockerCommands { } private FileHandlerCallback getFileHandlerCallbackExploratory(DockerAction action, String uuid, - ExploratoryBaseDTO<?> dto) { + ExploratoryBaseDTO<?> dto, String callbackUri) { switch (action) { - case LIB_INSTALL: - return new LibInstallCallbackHandler(selfService, action, uuid, - dto.getCloudSettings().getIamUser(), - (LibraryInstallDTO) dto); case LIB_LIST: return new LibListCallbackHandler(selfService, DockerAction.LIB_LIST, uuid, - dto.getCloudSettings().getIamUser(), dto.getNotebookImage()); + dto.getCloudSettings().getIamUser(), dto.getNotebookImage(), callbackUri); + case LIB_INSTALL: + return new LibInstallCallbackHandler(selfService, action, uuid, dto.getCloudSettings().getIamUser(), + (LibraryInstallDTO) dto, callbackUri); default: throw new IllegalArgumentException("Unknown action " + action); } } private FileHandlerCallback getFileHandlerCallbackComputational(DockerAction action, String uuid, - ExploratoryBaseDTO<?> dto) { + ExploratoryBaseDTO<?> dto, String callbackUri) { switch (action) { case LIB_LIST: - return new LibListCallbackHandler(selfService, action, uuid, - dto.getCloudSettings().getIamUser(), ((LibListComputationalDTO) dto).getLibCacheKey()); + return new LibListCallbackHandler(selfService, action, uuid, dto.getCloudSettings().getIamUser(), + ((LibListComputationalDTO) dto).getLibCacheKey(), callbackUri); case LIB_INSTALL: - return new LibInstallCallbackHandler(selfService, action, uuid, - dto.getCloudSettings().getIamUser(), ((LibraryInstallDTO) dto)); + return new LibInstallCallbackHandler(selfService, action, uuid, dto.getCloudSettings().getIamUser(), + ((LibraryInstallDTO) dto), callbackUri); default: throw new IllegalArgumentException("Unknown action " + action); diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java index 8e8730c..932848f 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java @@ -27,6 +27,7 @@ import com.epam.dlab.backendapi.core.commands.DockerCommands; import com.epam.dlab.backendapi.core.commands.RunDockerCommand; import com.epam.dlab.backendapi.core.response.handlers.ComputationalCallbackHandler; import com.epam.dlab.backendapi.core.response.handlers.ComputationalConfigure; +import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.backendapi.service.impl.DockerService; import com.epam.dlab.backendapi.service.impl.SparkClusterService; import com.epam.dlab.dto.aws.computational.AwsComputationalTerminateDTO; @@ -38,6 +39,7 @@ import com.epam.dlab.dto.computational.ComputationalClusterConfigDTO; import com.epam.dlab.dto.computational.ComputationalStartDTO; import com.epam.dlab.dto.computational.ComputationalStopDTO; import com.epam.dlab.exceptions.DlabException; +import com.epam.dlab.rest.contracts.ApiCallbacks; import com.epam.dlab.rest.contracts.ComputationalAPI; import com.fasterxml.jackson.core.JsonProcessingException; import com.google.inject.Inject; @@ -64,15 +66,19 @@ public class ComputationalResourceAws extends DockerService implements DockerCom private ComputationalConfigure computationalConfigure; @Inject private SparkClusterService sparkClusterService; + @Inject + private EndpointService endpointService; @POST @Path(ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC) public String create(@Auth UserInfo ui, ComputationalCreateAws dto) { log.debug("Create computational resources {} for user {}: {}", dto.getComputationalName(), ui.getName(), dto); String uuid = DockerCommands.generateUUID(); + folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(), - getFileHandlerCallback(CREATE, uuid, dto)); + getFileHandlerCallback(CREATE, uuid, dto, endpointService.getEndpointUrl(dto.getEndpoint()) + + ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI)); try { long timeout = configuration.getResourceStatusPollTimeout().toSeconds(); commandExecutor.executeAsync( @@ -111,7 +117,8 @@ public class ComputationalResourceAws extends DockerService implements DockerCom String uuid = DockerCommands.generateUUID(); folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(), - getFileHandlerCallback(TERMINATE, uuid, dto)); + getFileHandlerCallback(TERMINATE, uuid, dto, endpointService.getEndpointUrl(dto.getEndpoint()) + + ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI)); try { commandExecutor.executeAsync( ui.getName(), @@ -183,8 +190,9 @@ public class ComputationalResourceAws extends DockerService implements DockerCom return sparkClusterService.updateConfig(ui, config); } - private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ComputationalBase<?> dto) { - return new ComputationalCallbackHandler(computationalConfigure, selfService, action, uuid, dto); + private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ComputationalBase<?> dto, + String callbackUri) { + return new ComputationalCallbackHandler(computationalConfigure, selfService, action, uuid, dto, callbackUri); } private String nameContainer(String user, DockerAction action, String exploratoryName, String name) { diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/ExploratoryService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/ExploratoryService.java index c25f484..a59442c 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/ExploratoryService.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/ExploratoryService.java @@ -25,20 +25,27 @@ import com.epam.dlab.backendapi.core.commands.DockerAction; import com.epam.dlab.backendapi.core.commands.DockerCommands; import com.epam.dlab.backendapi.core.commands.RunDockerCommand; import com.epam.dlab.backendapi.core.response.handlers.ExploratoryCallbackHandler; +import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.backendapi.service.impl.DockerService; import com.epam.dlab.dto.exploratory.ExploratoryBaseDTO; +import com.epam.dlab.rest.contracts.ApiCallbacks; import com.fasterxml.jackson.core.JsonProcessingException; +import com.google.inject.Inject; import lombok.extern.slf4j.Slf4j; @Slf4j public class ExploratoryService extends DockerService implements DockerCommands { + @Inject + private EndpointService endpointService; + public String action(String username, ExploratoryBaseDTO<?> dto, DockerAction action) throws JsonProcessingException { log.debug("{} exploratory environment", action); String uuid = DockerCommands.generateUUID(); folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(), - getFileHandlerCallback(action, uuid, dto)); + getFileHandlerCallback(action, uuid, dto, endpointService.getEndpointUrl(dto.getEndpoint()) + + ApiCallbacks.EXPLORATORY + ApiCallbacks.STATUS_URI)); RunDockerCommand runDockerCommand = new RunDockerCommand() .withInteractive() @@ -60,9 +67,10 @@ public class ExploratoryService extends DockerService implements DockerCommands return Directories.NOTEBOOK_LOG_DIRECTORY; } - private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ExploratoryBaseDTO<?> dto) { + private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ExploratoryBaseDTO<?> dto, + String callbackUri) { return new ExploratoryCallbackHandler(selfService, action, uuid, dto.getCloudSettings().getIamUser(), - dto.getExploratoryName()); + dto.getExploratoryName(), callbackUri); } private String nameContainer(String user, DockerAction action, String name) { diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java index 0db357b..06efd9f 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java @@ -27,6 +27,7 @@ import com.epam.dlab.backendapi.core.commands.DockerCommands; import com.epam.dlab.backendapi.core.commands.RunDockerCommand; import com.epam.dlab.backendapi.core.response.handlers.ComputationalCallbackHandler; import com.epam.dlab.backendapi.core.response.handlers.ComputationalConfigure; +import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.backendapi.service.impl.DockerService; import com.epam.dlab.backendapi.service.impl.SparkClusterService; import com.epam.dlab.dto.base.DataEngineType; @@ -38,6 +39,7 @@ import com.epam.dlab.dto.gcp.computational.ComputationalCreateGcp; import com.epam.dlab.dto.gcp.computational.GcpComputationalTerminateDTO; import com.epam.dlab.dto.gcp.computational.SparkComputationalCreateGcp; import com.epam.dlab.exceptions.DlabException; +import com.epam.dlab.rest.contracts.ApiCallbacks; import com.epam.dlab.rest.contracts.ComputationalAPI; import com.fasterxml.jackson.core.JsonProcessingException; import com.google.inject.Inject; @@ -64,6 +66,8 @@ public class ComputationalResourceGcp extends DockerService implements DockerCom private ComputationalConfigure computationalConfigure; @Inject private SparkClusterService sparkClusterService; + @Inject + private EndpointService endpointService; @POST @Path(ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC) @@ -72,7 +76,8 @@ public class ComputationalResourceGcp extends DockerService implements DockerCom String uuid = DockerCommands.generateUUID(); folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(), - getFileHandlerCallback(CREATE, uuid, dto)); + getFileHandlerCallback(CREATE, uuid, dto, endpointService.getEndpointUrl(dto.getEndpoint()) + + ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI)); try { commandExecutor.executeAsync( ui.getName(), @@ -108,7 +113,8 @@ public class ComputationalResourceGcp extends DockerService implements DockerCom String uuid = DockerCommands.generateUUID(); folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(), - getFileHandlerCallback(TERMINATE, uuid, dto)); + getFileHandlerCallback(TERMINATE, uuid, dto, endpointService.getEndpointUrl(dto.getEndpoint()) + + ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI)); try { commandExecutor.executeAsync( ui.getName(), @@ -182,8 +188,9 @@ public class ComputationalResourceGcp extends DockerService implements DockerCom return sparkClusterService.updateConfig(ui, config); } - private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ComputationalBase<?> dto) { - return new ComputationalCallbackHandler(computationalConfigure, selfService, action, uuid, dto); + private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ComputationalBase<?> dto, + String callbackUri) { + return new ComputationalCallbackHandler(computationalConfigure, selfService, action, uuid, dto, callbackUri); } private String nameContainer(String user, DockerAction action, String exploratoryName, String name) { diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java similarity index 51% rename from services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java rename to services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java index e50d7ae..7bbd25a 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java @@ -17,30 +17,10 @@ * under the License. */ -package com.epam.dlab.backendapi.resources; +package com.epam.dlab.backendapi.service; +public interface EndpointService { + String getEndpointUrl(String name); -import com.epam.dlab.auth.UserInfo; -import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration; -import com.google.inject.Inject; -import io.dropwizard.auth.Auth; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -@Path("/healthcheck") -@Produces(MediaType.APPLICATION_JSON) -public class ProvisioningHealthCheckResource { - private static final String HEALTH_CHECK = "ProvisioningHealthCheck"; - - @Inject - private ProvisioningServiceApplicationConfiguration configuration; - - @GET - public Response status(@Auth UserInfo ui) { - return Response.ok(configuration.getCloudProvider()).build(); - } -} \ No newline at end of file + void create(String name, String url); +} diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java new file mode 100644 index 0000000..650ac0d --- /dev/null +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package com.epam.dlab.backendapi.service.impl; + +import com.epam.dlab.backendapi.dao.EndpointDAO; +import com.epam.dlab.backendapi.service.EndpointService; +import com.epam.dlab.exceptions.DlabException; +import com.google.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import org.bson.Document; + +import java.util.List; + +@Slf4j +public class EndpointServiceImpl implements EndpointService { + private static final String URL = "url"; + private final EndpointDAO endpointDAO; + + @Inject + public EndpointServiceImpl(EndpointDAO endpointDAO) { + this.endpointDAO = endpointDAO; + } + + @Override + public String getEndpointUrl(String name) { + return (String) getOrError(name).get(URL); + } + + @Override + public void create(String name, String url) { + List<Document> all = endpointDAO.findAll(); + if (all.isEmpty()) { + endpointDAO.create(name, url); + log.debug("Successfully created connection with selfservice url: {}", url); + } else { + log.error("Endpoint is already connected, excising {}, url {}", all, url); + throw new DlabException("Endpoint is already connected"); + } + } + + private Document getOrError(String name) { + return endpointDAO.findOne(name).orElseThrow(() -> + new DlabException("Cannot find selfservice endpoint url with name " + name)); + } +} diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java index 47c4dee..24b68fc 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java @@ -5,6 +5,7 @@ import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration; import com.epam.dlab.backendapi.core.commands.*; import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor; import com.epam.dlab.backendapi.core.response.handlers.ProjectCallbackHandler; +import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.backendapi.service.ProjectService; import com.epam.dlab.cloud.CloudProvider; import com.epam.dlab.dto.ResourceBaseDTO; @@ -33,6 +34,8 @@ public class ProjectServiceImpl implements ProjectService { private ICommandExecutor commandExecutor; @Inject private CommandBuilder commandBuilder; + @Inject + private EndpointService endpointService; @Override public String create(UserInfo userInfo, ProjectCreateDTO dto) { @@ -60,10 +63,12 @@ public class ProjectServiceImpl implements ProjectService { String resourceType, String image, String endpoint) { String uuid = DockerCommands.generateUUID(); + log.debug(endpointService.getEndpointUrl(endpoint) + CALLBACK_URI); folderListenerExecutor.start(configuration.getKeyLoaderDirectory(), configuration.getKeyLoaderPollTimeout(), new ProjectCallbackHandler(selfService, userInfo.getName(), uuid, - action, CALLBACK_URI, projectName, getEdgeClass(), endpoint)); + action, endpointService.getEndpointUrl(endpoint) + CALLBACK_URI, projectName, + getEdgeClass(), endpoint)); RunDockerCommand runDockerCommand = new RunDockerCommand() .withInteractive() diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/SparkClusterService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/SparkClusterService.java index a773b70..22d6698 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/SparkClusterService.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/SparkClusterService.java @@ -27,6 +27,7 @@ import com.epam.dlab.backendapi.core.commands.DockerCommands; import com.epam.dlab.backendapi.core.commands.RunDockerCommand; import com.epam.dlab.backendapi.core.response.handlers.ComputationalCallbackHandler; import com.epam.dlab.backendapi.core.response.handlers.ComputationalConfigure; +import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.dto.base.DataEngineType; import com.epam.dlab.dto.base.computational.ComputationalBase; import com.epam.dlab.dto.computational.ComputationalClusterConfigDTO; @@ -34,6 +35,7 @@ import com.epam.dlab.dto.computational.ComputationalStartDTO; import com.epam.dlab.dto.computational.ComputationalStopDTO; import com.epam.dlab.dto.computational.ComputationalTerminateDTO; import com.epam.dlab.exceptions.DlabException; +import com.epam.dlab.rest.contracts.ApiCallbacks; import com.fasterxml.jackson.core.JsonProcessingException; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -47,6 +49,8 @@ public class SparkClusterService extends DockerService implements DockerCommands @Inject private ComputationalConfigure computationalConfigure; + @Inject + private EndpointService endpointService; public String create(UserInfo ui, ComputationalBase<?> dto) { return action(ui, dto, CREATE); @@ -68,7 +72,8 @@ public class SparkClusterService extends DockerService implements DockerCommands String uuid = DockerCommands.generateUUID(); folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(), - getFileHandlerCallback(RECONFIGURE_SPARK, uuid, clusterConfigDTO)); + getFileHandlerCallback(RECONFIGURE_SPARK, uuid, clusterConfigDTO, endpointService.getEndpointUrl( + clusterConfigDTO.getEndpoint()) + ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI)); runReconfigureSparkDockerCommand(ui, clusterConfigDTO, uuid); return uuid; } @@ -101,7 +106,8 @@ public class SparkClusterService extends DockerService implements DockerCommands String uuid = DockerCommands.generateUUID(); folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(), - getFileHandlerCallback(action, uuid, dto)); + getFileHandlerCallback(action, uuid, dto, endpointService.getEndpointUrl(dto.getEndpoint()) + + ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI)); try { final RunDockerCommand dockerCommand = new RunDockerCommand() .withInteractive() @@ -124,8 +130,9 @@ public class SparkClusterService extends DockerService implements DockerCommands return uuid; } - private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ComputationalBase<?> dto) { - return new ComputationalCallbackHandler(computationalConfigure, selfService, action, uuid, dto); + private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ComputationalBase<?> dto, + String callbackUri) { + return new ComputationalCallbackHandler(computationalConfigure, selfService, action, uuid, dto, callbackUri); } private String nameContainer(String user, DockerAction action, String exploratoryName, String name) { diff --git a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockTest.java b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockTest.java index bf92609..773f4e3 100644 --- a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockTest.java +++ b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockTest.java @@ -70,7 +70,7 @@ public class CommandExecutorMockTest { RESTServiceMock selfService = new RESTServiceMock(); ExploratoryCallbackHandler handler = new ExploratoryCallbackHandler(selfService, action, - getRequestId(exec), getEdgeUserName(exec), getExploratoryName(exec)); + getRequestId(exec), getEdgeUserName(exec), getExploratoryName(exec), "someCallbackUri"); handler.handle(exec.getResponseFileName(), Files.readAllBytes(Paths.get(exec.getResponseFileName()))); try { @@ -98,7 +98,7 @@ public class CommandExecutorMockTest { getRequestId(exec), getEdgeUserName(exec), getExploratoryName(exec)); */ ResourceCallbackHandler<?> handler = new LibListCallbackHandler(selfService, action, getRequestId(exec), - getEdgeUserName(exec), getExploratoryName(exec)); + getEdgeUserName(exec), getExploratoryName(exec), "someCallbackUri"); handler.handle(exec.getResponseFileName(), Files.readAllBytes(Paths.get(exec.getResponseFileName()))); diff --git a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java index 0dc3663..dc6377c 100644 --- a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java +++ b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java @@ -76,7 +76,8 @@ public class FileSystemCallbackHandlerDaoTest { when(mapper.writeValueAsBytes(any())).thenReturn("{'test': 'test'}".getBytes()); final PersistentFileHandler persistentFileHandler = new PersistentFileHandler(new LibListCallbackHandler(null, - DockerAction.LIB_LIST, "uuid", "test", "das"), 1L, "/opt/test"); + DockerAction.LIB_LIST, "uuid", "test", "das", "someCallbackUri"), + 1L, "/opt/test"); fileSystemCallbackHandlerDao.upsert(persistentFileHandler); @@ -95,10 +96,12 @@ public class FileSystemCallbackHandlerDaoTest { .new DockerFileHandlerCallback("sameUUID"), 1L, "/opt/test"); final PersistentFileHandler persistentFileHandler2 = new PersistentFileHandler(new LibListCallbackHandler(null, - DockerAction.LIB_LIST, "sameUUID", "test", "das1"), 1L, "/opt/test"); + DockerAction.LIB_LIST, "sameUUID", "test", "das1", "someCallbackUri"), + 1L, "/opt/test"); final PersistentFileHandler persistentFileHandler3 = new PersistentFileHandler(new LibListCallbackHandler(null, - DockerAction.LIB_LIST, "anotherUUID", "test", "das2"), 1L, "/opt/test"); + DockerAction.LIB_LIST, "anotherUUID", "test", "das2", "someCallbackUri"), + 1L, "/opt/test"); fileSystemCallbackHandlerDao.upsert(persistentFileHandler1); diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java index d83bfe7..eb9c553 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java @@ -29,8 +29,8 @@ public class MongoStartupListener implements ServerLifecycleListener { private final SettingsDAO settingsDAO; @Inject - public MongoStartupListener(UserRoleDao userRoleDao, - SelfServiceApplicationConfiguration configuration, SettingsDAO settingsDAO) { + public MongoStartupListener(UserRoleDao userRoleDao, SelfServiceApplicationConfiguration configuration, + SettingsDAO settingsDAO) { this.userRoleDao = userRoleDao; this.configuration = configuration; this.settingsDAO = settingsDAO; @@ -50,8 +50,7 @@ public class MongoStartupListener implements ServerLifecycleListener { } private List<UserRoleDto> getRoles() { - try (InputStream is = getClass().getResourceAsStream(format(ROLES_FILE_FORMAT, - configuration.getCloudProvider().getName()))) { + try (InputStream is = getClass().getResourceAsStream(format(ROLES_FILE_FORMAT, CloudProvider.AWS.getName()))) { return MAPPER.readValue(is, new TypeReference<List<UserRoleDto>>() { }); } catch (IOException e) { diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java index 7ab2ac0..4ca089f 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java @@ -49,16 +49,16 @@ public class ModuleFactory { return new CloudProviderModule(); } - private static CloudModule getCloudModule(SelfServiceApplicationConfiguration configuration) { - switch (configuration.getCloudProvider()) { - case AWS: - return new AwsSelfServiceModule(); - case AZURE: - return new AzureSelfServiceModule(); - case GCP: - return new GcpSelfServiceModule(); - default: - throw new UnsupportedOperationException("Unsupported cloud provider " + configuration.getCloudProvider()); - } - } +// private static CloudModule getCloudModule(SelfServiceApplicationConfiguration configuration) { +// switch (configuration.getCloudProvider()) { +// case AWS: +// return new AwsSelfServiceModule(); +// case AZURE: +// return new AzureSelfServiceModule(); +// case GCP: +// return new GcpSelfServiceModule(); +// default: +// throw new UnsupportedOperationException("Unsupported cloud provider " + configuration.getCloudProvider()); +// } +// } } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java index 71873eb..6707571 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java @@ -153,7 +153,7 @@ public class EndpointResource { public Response checkEndpointUrl(@Parameter(hidden = true) @Auth UserInfo userInfo, @Parameter(description = "Endpoint url") @PathParam("url") String url) { - endpointService.checkEndpointUrl(userInfo, url); + endpointService.checkUrl(userInfo, url); return Response.ok().build(); } } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java index 658370a..2f34688 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java @@ -49,7 +49,7 @@ public class CheckEndpointStatusScheduler implements Job { private boolean checkUrl(UserInfo serviceUser, EndpointDTO endpoint) { try { - endpointService.checkEndpointUrl(serviceUser, endpoint.getUrl()); + endpointService.checkUrl(serviceUser, endpoint.getUrl()); } catch (Exception e) { return true; } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java index dde3547..9ad6bfe 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java @@ -4,7 +4,6 @@ import com.epam.dlab.auth.UserInfo; import com.epam.dlab.backendapi.domain.EndpointDTO; import com.epam.dlab.backendapi.domain.EndpointResourcesDTO; import com.epam.dlab.backendapi.domain.ProjectDTO; -import com.epam.dlab.cloud.CloudProvider; import java.util.List; @@ -25,5 +24,5 @@ public interface EndpointService { void removeEndpointInAllProjects(UserInfo userInfo, String endpointName, List<ProjectDTO> projects); - CloudProvider checkEndpointUrl(UserInfo userInfo, String url); + void checkUrl(UserInfo userInfo, String url); } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java index 812c21b..6c70927 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java @@ -24,10 +24,12 @@ import javax.ws.rs.core.Response; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Objects; @Slf4j public class EndpointServiceImpl implements EndpointService { - private static final String HEALTH_CHECK = "healthcheck"; + private static final String ENDPOINT = "infrastructure/endpoint"; + private static final String HEALTH_CHECK = "infrastructure/endpoint/healthcheck"; private final EndpointDAO endpointDAO; private final ProjectService projectService; private final ExploratoryDAO exploratoryDAO; @@ -71,8 +73,11 @@ public class EndpointServiceImpl implements EndpointService { @Override public void create(UserInfo userInfo, EndpointDTO endpointDTO) { - CloudProvider cloudProvider = checkEndpointUrl(userInfo, endpointDTO.getUrl()); if (!endpointDAO.get(endpointDTO.getName()).isPresent()) { + CloudProvider cloudProvider = connectEndpoint(userInfo, endpointDTO.getUrl(), endpointDTO.getName()); + if (!Objects.nonNull(cloudProvider)) { + throw new DlabException("CloudProvider cannot be null"); + } endpointDAO.create(new EndpointDTO(endpointDTO.getName(), endpointDTO.getUrl(), endpointDTO.getAccount(), endpointDTO.getTag(), EndpointDTO.EndpointStatus.ACTIVE, cloudProvider)); } else { @@ -102,12 +107,10 @@ public class EndpointServiceImpl implements EndpointService { } @Override - public CloudProvider checkEndpointUrl(UserInfo userInfo, String url) { + public void checkUrl(UserInfo userInfo, String url) { Response response; - CloudProvider cloudProvider; try { response = provisioningService.get(url + HEALTH_CHECK, userInfo.getAccessToken(), Response.class); - cloudProvider = response.readEntity(CloudProvider.class); } catch (Exception e) { log.error("Cannot connect to url '{}'", url); throw new DlabException(String.format("Cannot connect to url '%s'", url), e); @@ -116,6 +119,22 @@ public class EndpointServiceImpl implements EndpointService { log.warn("Endpoint url {} is not valid", url); throw new ResourceNotFoundException(String.format("Endpoint url '%s' is not valid", url)); } + } + + private CloudProvider connectEndpoint(UserInfo userInfo, String url, String name) { + Response response; + CloudProvider cloudProvider; + try { + response = provisioningService.post(url + ENDPOINT, userInfo.getAccessToken(), name, Response.class); + cloudProvider = response.readEntity(CloudProvider.class); + } catch (Exception e) { + log.error("Cannot connect to url '{}'", url); + throw new DlabException(String.format("Cannot connect to url '%s'", url), e); + } + if (response.getStatus() != 200) { + log.warn("Endpoint connection failed, url {}", url); + throw new ResourceNotFoundException(String.format("Endpoint url '%s' is not valid", url)); + } return cloudProvider; } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java index fd9e45c..bd67fab 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java @@ -283,6 +283,7 @@ public class RequestBuilder { return (T) newResourceSysBaseDTO(userInfo, endpointDTO.getCloudProvider(), ExploratoryActionDTO.class) .withNotebookInstanceName(userInstance.getExploratoryId()) .withProject(userInstance.getProject()) + .withEndpoint(endpointDTO.getName()) .withNotebookImage(userInstance.getImageName()) .withApplicationName(getApplicationNameFromImage(userInstance.getImageName())) .withExploratoryName(userInstance.getExploratoryName()); @@ -307,7 +308,7 @@ public class RequestBuilder { public <T extends LibListComputationalDTO> T newLibComputationalList(UserInfo userInfo, UserInstanceDTO userInstance, UserComputationalResource - computationalResource, + computationalResource, EndpointDTO endpointDTO) { checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider()); @@ -316,7 +317,8 @@ public class RequestBuilder { .withProject(userInstance.getProject()) .withComputationalImage(computationalResource.getImageName()) .withLibCacheKey(ExploratoryLibCache.libraryCacheKey(userInstance)) - .withApplicationName(getApplicationNameFromImage(userInstance.getImageName())); + .withApplicationName(getApplicationNameFromImage(userInstance.getImageName())) + .withEndpoint(endpointDTO.getName()); } @SuppressWarnings("unchecked") @@ -472,7 +474,8 @@ public class RequestBuilder { .withComputationalName(computationalName) .withNotebookInstanceName(exploratory.getExploratoryId()) .withApplicationName(getApplicationNameFromImage(exploratory.getImageName())) - .withProject(exploratory.getProject()); + .withProject(exploratory.getProject()) + .withEndpoint(endpointDTO.getName()); } @SuppressWarnings("unchecked") @@ -483,7 +486,8 @@ public class RequestBuilder { .withComputationalName(computationalName) .withNotebookInstanceName(exploratory.getExploratoryId()) .withApplicationName(getApplicationNameFromImage(exploratory.getImageName())) - .withProject(exploratory.getProject()); + .withProject(exploratory.getProject()) + .withEndpoint(endpointDTO.getName()); } @SuppressWarnings("unchecked") --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@dlab.apache.org For additional commands, e-mail: commits-h...@dlab.apache.org