You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datalab.apache.org by pp...@apache.org on 2022/02/01 14:49:57 UTC
[incubator-datalab] 02/03: [spring-migration] provisioning sevice
This is an automated email from the ASF dual-hosted git repository.
ppapou pushed a commit to branch spring-migration
in repository https://gitbox.apache.org/repos/asf/incubator-datalab.git
commit 222d68f9e0957c7259333752653b77480fac20d4
Author: Pavel Papou <pp...@gmail.com>
AuthorDate: Sun Jan 23 10:26:07 2022 -0500
[spring-migration] provisioning sevice
- main class has been asjusted
- config structure has been change
---
.../src/ssn/templates/ssn.yml | 12 ++--
services/billing-gcp/pom.xml | 2 +-
services/datalab-webapp-common/pom.xml | 12 ++++
.../java/com/epam/datalab/cloud/CloudModule.java | 2 +-
services/provisioning-service/pom.xml | 4 +-
services/provisioning-service/provisioning.yml | 72 ++++++++++++----------
.../DropwizardBearerTokenFilterImpl.java | 39 ------------
.../backendapi/ProvisioningServiceApplication.java | 66 ++++++++++++++++----
...rovisioningServiceApplicationConfiguration.java | 54 ++++++++++++----
.../backendapi/conf/SecurityConfiguration.java | 55 +++++++++++++++++
.../datalab/backendapi/core/DockerWarmuper.java | 22 +++----
.../response/folderlistener/AsyncFileHandler.java | 5 +-
.../folderlistener/FolderListenerExecutor.java | 18 ++++--
.../response/folderlistener/WatchItemList.java | 5 +-
.../response/handlers/ComputationalConfigure.java | 15 +++--
.../handlers/dao/FileSystemCallbackHandlerDao.java | 16 +++--
.../backendapi/modules/AwsProvisioningModule.java | 24 +++++---
.../modules/CloudModuleConfigurator.java | 4 +-
.../backendapi/resources/BackupResource.java | 9 +--
.../resources/ProvisioningHealthCheckResource.java | 3 +-
.../resources/aws/ComputationalResourceAws.java | 3 +-
.../resources/gcp/ComputationalResourceGcp.java | 5 +-
.../backendapi/resources/gcp/EdgeResourceGcp.java | 4 +-
.../resources/gcp/ExploratoryResourceGcp.java | 4 +-
.../resources/gcp/InfrastructureResourceGcp.java | 3 +
.../service/impl/CheckInactivityServiceImpl.java | 3 +-
.../backendapi/service/impl/DockerService.java | 11 ++--
.../backendapi/service/impl/KeyService.java | 6 +-
.../backendapi/service/impl/OdahuServiceImpl.java | 3 +-
.../service/impl/ProjectServiceImpl.java | 5 +-
.../impl/RestoreCallbackHandlerServiceImpl.java | 23 +++----
.../service/impl/SparkClusterService.java | 6 +-
.../service/impl/aws/BucketServiceAwsImpl.java | 2 +
.../service/impl/azure/BucketServiceAzureImpl.java | 5 +-
.../service/impl/gcp/BucketServiceGcpImpl.java | 2 +
.../epam/datalab/process/model/DatalabProcess.java | 5 +-
.../backendapi/core/DockerWarmuperTest.java | 5 +-
.../response/folderlistener/WatchItemTest.java | 5 +-
.../RestoreCallbackHandlerServiceImplTest.java | 7 ++-
services/self-service/self-service.yml | 22 +++----
40 files changed, 365 insertions(+), 203 deletions(-)
diff --git a/infrastructure-provisioning/src/ssn/templates/ssn.yml b/infrastructure-provisioning/src/ssn/templates/ssn.yml
index 8720ef2..4a5ff8d 100644
--- a/infrastructure-provisioning/src/ssn/templates/ssn.yml
+++ b/infrastructure-provisioning/src/ssn/templates/ssn.yml
@@ -20,26 +20,26 @@
# ******************************************************************************
<#assign LOG_ROOT_DIR="/var/opt/datalab/log">
-<#assign KEYS_DIR="/home/${sys['user.name']}/keys">
+<#assign KEYS_DIR="/home/pavel/keys">
<#assign KEY_STORE_PATH="${KEYS_DIR}/ssn.keystore.jks">
<#assign KEY_STORE_PASSWORD="KEYSTORE_PASSWORD">
-<#assign TRUST_STORE_PATH="${JRE_HOME}/lib/security/cacerts">
+<#assign TRUST_STORE_PATH="/opt/jdk1.8.0_202/jre/lib/security/cacerts">
<#assign TRUST_STORE_PASSWORD="changeit">
# Available options are aws, azure, gcp
-<#assign CLOUD_TYPE="CLOUD_PROVIDER">
+<#assign CLOUD_TYPE="GCP">
cloudProvider: ${CLOUD_TYPE}
#Switch on/off developer mode here
-<#assign DEV_MODE="false">
+<#assign DEV_MODE="true">
devMode: ${DEV_MODE}
mongo:
host: localhost
port: 27017
username: admin
- password: MONGO_PASSWORD
- database: datalabdb
+ password: admin
+ database: pavel
selfService:
protocol: https
diff --git a/services/billing-gcp/pom.xml b/services/billing-gcp/pom.xml
index fa4bbcf..bc3034d 100644
--- a/services/billing-gcp/pom.xml
+++ b/services/billing-gcp/pom.xml
@@ -61,7 +61,7 @@
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
+ <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
diff --git a/services/datalab-webapp-common/pom.xml b/services/datalab-webapp-common/pom.xml
index b42da46..6011fbe 100644
--- a/services/datalab-webapp-common/pom.xml
+++ b/services/datalab-webapp-common/pom.xml
@@ -70,5 +70,17 @@
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ <version>4.0.6.RELEASE</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ <version>4.0.6.RELEASE</version>
+ <scope>compile</scope>
+ </dependency>
</dependencies>
</project>
\ No newline at end of file
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/cloud/CloudModule.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/cloud/CloudModule.java
index 7be15b1..b87c1b0 100644
--- a/services/datalab-webapp-common/src/main/java/com/epam/datalab/cloud/CloudModule.java
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/cloud/CloudModule.java
@@ -23,6 +23,7 @@ import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import io.dropwizard.setup.Environment;
+//TODO: the object can be removed and replaced by spring annotations
public abstract class CloudModule extends AbstractModule {
@Override
@@ -30,5 +31,4 @@ public abstract class CloudModule extends AbstractModule {
}
public abstract void init(Environment environment, Injector injector);
-
}
diff --git a/services/provisioning-service/pom.xml b/services/provisioning-service/pom.xml
index 5a9bdee..444938c 100644
--- a/services/provisioning-service/pom.xml
+++ b/services/provisioning-service/pom.xml
@@ -74,11 +74,11 @@
<groupId>com.epam.datalab</groupId>
<artifactId>common</artifactId>
</dependency>
- <dependency>
+ <!--dependency>
<groupId>de.ahus1.keycloak.dropwizard</groupId>
<artifactId>keycloak-dropwizard</artifactId>
<version>1.1.1</version>
- </dependency>
+ </dependency-->
<dependency>
<groupId>de.thomaskrille</groupId>
<artifactId>dropwizard-template-config</artifactId>
diff --git a/services/provisioning-service/provisioning.yml b/services/provisioning-service/provisioning.yml
index b6ced32..a657763 100644
--- a/services/provisioning-service/provisioning.yml
+++ b/services/provisioning-service/provisioning.yml
@@ -19,26 +19,26 @@
#
# ******************************************************************************
- <#include "ssn.yml">
+#---"infrastructure-provisioning/src/ssn/templates/ssn.yml"
backupScriptPath: /opt/datalab/tmp/backup.py
backupDirectory: /opt/datalab/tmp/result
-keyDirectory: ${KEYS_DIR}
+keyDirectory: /home/pavel/keys
responseDirectory: /opt/datalab/tmp
handlerDirectory: /opt/datalab/handlers
-dockerLogDirectory: ${LOG_ROOT_DIR}
-warmupPollTimeout: 2m
-resourceStatusPollTimeout: 400m
+dockerLogDirectory: /var/opt/datalab/log
+warmupPollTimeout: 50s
+resourceStatusPollTimeout: 300m
keyLoaderPollTimeout: 30m
requestEnvStatusTimeout: 50s
adminKey: KEYNAME
edgeImage: docker.datalab-edge
fileLengthCheckDelay: 500ms
- <#if CLOUD_TYPE == "aws">
+#<#if CLOUD_TYPE == "aws">
emrEC2RoleDefault: EMR_EC2_DefaultRole
emrServiceRoleDefault: EMR_DefaultRole
-</#if>
+#</#if>
processMaxThreadsPerJvm: 50
processMaxThreadsPerUser: 5
@@ -46,7 +46,16 @@ processTimeout: 180m
handlersPersistenceEnabled: true
+cloudProvider: GCP
+
server:
+ port: 8084
+ type: https
+ ssl:
+ key-store: /home/pavel/keys/ssn.keystore.jks
+ key-store-type: JKS
+ key-alias: ssn
+ key-store-password: KEYSTORE_PASSWORD
requestLog:
appenders:
- type: file
@@ -55,15 +64,15 @@ server:
archivedLogFilenamePattern: ${LOG_ROOT_DIR}/ssn/request-provisioning-%d{yyyy-MM-dd}.log.gz
archivedFileCount: 10
applicationConnectors:
-# - type: http
- - type: https
- port: 8084
- certAlias: ssn
- validateCerts: false
- keyStorePath: ${KEY_STORE_PATH}
- keyStorePassword: ${KEY_STORE_PASSWORD}
- trustStorePath: ${TRUST_STORE_PATH}
- trustStorePassword: ${TRUST_STORE_PASSWORD}
+## - type: http
+# - type: https
+# port: 8084
+# certAlias: ssn
+# validateCerts: false
+# keyStorePath: ${KEY_STORE_PATH}
+# keyStorePassword: ${KEY_STORE_PASSWORD}
+# trustStorePath: ${TRUST_STORE_PATH}
+# trustStorePassword: ${TRUST_STORE_PASSWORD}
adminConnectors:
# - type: http
- type: https
@@ -76,30 +85,31 @@ server:
trustStorePassword: ${TRUST_STORE_PASSWORD}
logging:
- level: INFO
- loggers:
- com.epam: TRACE
- com.aegisql: INFO
+ level:
+ root: ERROR
+ com:
+ epam: DEBUG
+ aegisql: INFO
appenders:
-<#if DEV_MODE == "true">
+#<#if DEV_MODE == "true">
- type: console
-</#if>
- - type: file
+#</#if>
+# - type: file
currentLogFilename: ${LOG_ROOT_DIR}/ssn/provisioning.log
archive: true
archivedLogFilenamePattern: ${LOG_ROOT_DIR}/ssn/provisioning-%d{yyyy-MM-dd}.log.gz
archivedFileCount: 10
-keycloakConfiguration:
- realm: KEYCLOAK_REALM_NAME
+keycloak:
+ realm: DLAB_bhliva
bearer-only: true
- auth-server-url: KEYCLOAK_AUTH_SERVER_URL
+ auth-server-url: http://52.11.45.11:8080/auth
ssl-required: none
register-node-at-startup: true
register-node-period: 600
- resource: KEYCLOAK_CLIENT_NAME
+ resource: sss
credentials:
- secret: KEYCLOAK_CLIENT_SECRET
+ secret: cf5a484b-039b-4161-8707-ad65c0f25962
cloudProperties:
os: CONF_OS
@@ -122,7 +132,7 @@ cloudProperties:
datalakeTagName: AZURE_DATALAKE_TAG
azureClientId: AZURE_CLIENT_ID
gcpProjectId: GCP_PROJECT_ID
- imageEnabled: CONF_IMAGE_ENABLED
+ imageEnabled: true
azureAuthFile: AZURE_AUTH_FILE_PATH
ldap:
host: LDAP_HOST
@@ -131,7 +141,7 @@ cloudProperties:
user: LDAP_USER_NAME
password: LDAP_USER_PASSWORD
stepCerts:
- enabled: STEP_CERTS_ENABLED
+ enabled: true
rootCA: STEP_ROOT_CA
kid: STEP_KID_ID
kidPassword: STEP_KID_PASSWORD
@@ -140,4 +150,4 @@ cloudProperties:
auth_server_url: KEYCLOAK_AUTH_SERVER_URL
realm_name: KEYCLOAK_REALM_NAME
user: KEYCLOAK_USER_NAME
- user_password: KEYCLOAK_PASSWORD
\ No newline at end of file
+ user_password: KEYCLOAK_PASSWORD
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/DropwizardBearerTokenFilterImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/DropwizardBearerTokenFilterImpl.java
deleted file mode 100644
index d0a36ba..0000000
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/DropwizardBearerTokenFilterImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.datalab.backendapi;
-
-import org.keycloak.adapters.AdapterDeploymentContext;
-import org.keycloak.adapters.KeycloakDeployment;
-import org.keycloak.adapters.NodesRegistrationManagement;
-import org.keycloak.jaxrs.JaxrsBearerTokenFilterImpl;
-
-import javax.annotation.Priority;
-import javax.ws.rs.Priorities;
-import javax.ws.rs.container.PreMatching;
-
-@PreMatching
-@Priority(Priorities.AUTHENTICATION)
-public class DropwizardBearerTokenFilterImpl extends JaxrsBearerTokenFilterImpl {
-
- public DropwizardBearerTokenFilterImpl(KeycloakDeployment keycloakDeployment) {
- deploymentContext = new AdapterDeploymentContext(keycloakDeployment);
- nodesRegistrationManagement = new NodesRegistrationManagement();
- }
-}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplication.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplication.java
index e331980..52b749a 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplication.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplication.java
@@ -29,6 +29,7 @@ import com.epam.datalab.backendapi.resources.*;
import com.epam.datalab.backendapi.resources.base.KeyResource;
import com.epam.datalab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
import com.epam.datalab.cloud.CloudModule;
+import com.epam.datalab.exceptions.InitializationException;
import com.epam.datalab.process.model.DatalabProcess;
import com.epam.datalab.rest.client.RESTService;
import com.epam.datalab.rest.mappers.JsonProcessingExceptionMapper;
@@ -38,12 +39,12 @@ import com.fasterxml.jackson.databind.InjectableValues;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.inject.Guice;
import com.google.inject.Injector;
-import de.ahus1.keycloak.dropwizard.AbstractKeycloakAuthenticator;
-import de.ahus1.keycloak.dropwizard.KeycloakBundle;
-import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
-import de.thomaskrille.dropwizard_template_config.TemplateConfigBundle;
-import de.thomaskrille.dropwizard_template_config.TemplateConfigBundleConfiguration;
-import io.dropwizard.Application;
+//import de.ahus1.keycloak.dropwizard.AbstractKeycloakAuthenticator;
+//import de.ahus1.keycloak.dropwizard.KeycloakBundle;
+//import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
+//import de.thomaskrille.dropwizard_template_config.TemplateConfigBundle;
+//import de.thomaskrille.dropwizard_template_config.TemplateConfigBundleConfiguration;
+/*import io.dropwizard.Application;
import io.dropwizard.auth.Authenticator;
import io.dropwizard.auth.Authorizer;
import io.dropwizard.forms.MultiPartBundle;
@@ -51,6 +52,7 @@ import io.dropwizard.jersey.setup.JerseyEnvironment;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import org.keycloak.KeycloakSecurityContext;
+*/
/*
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
@@ -59,24 +61,64 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
*/
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.EnvironmentAware;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
+import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.security.Principal;
-
-public class ProvisioningServiceApplication extends Application<ProvisioningServiceApplicationConfiguration> {
-
- public static void main(String[] args) throws Exception {
+import java.util.Arrays;
+
+@SpringBootApplication
+@EnableMongoRepositories
+//@EnableConfigurationProperties(ProvisioningServiceApplicationConfiguration.class)
+public class ProvisioningServiceApplication implements ApplicationRunner{
+//TODO: thrown Exception class has been removed. See the distinguish.
+ //TODO: Double check with Keycloak barear filter impl!!!
+
+ @Autowired//Is it required to proceed with component annotation for ProvisioningServiceApplication
+ //Is there way to get an env from the context
+ private Environment environment;
+
+ @Autowired//TODO: read about autowired abd EnableConfigurationProperties
+ //Is there way to get a configuration from the context
+ private ProvisioningServiceApplicationConfiguration configuration;
+
+ public static void main(String[] args) {
if (ServiceUtils.printAppVersion(ProvisioningServiceApplication.class, args)) {
return;
}
- new ProvisioningServiceApplication().run(args);
+ new SpringApplicationBuilder()
+ .sources(ProvisioningServiceApplication.class)
+ .build()
+ .run(args);
}
@Override
+ public void run(ApplicationArguments arg){
+ DatalabProcess.getInstance().setProcessTimeout(configuration.getProcessTimeout());
+ DatalabProcess.getInstance().setMaxProcessesPerBox(configuration.getProcessMaxThreadsPerJvm());
+ DatalabProcess.getInstance().setMaxProcessesPerUser(configuration.getProcessMaxThreadsPerUser());
+
+ //CloudModule cloudModule = CloudModuleConfigurator.getCloudModule(configuration);
+
+ System.out.println("Docker directory: " + environment.getProperty("dockerLogDirectory"));
+ System.out.println("Cloud provider: " + configuration.getCloudProvider());
+ System.out.println("T/O: " + configuration.getProcessTimeout());
+ }
+ /*
+ @Override
public void initialize(Bootstrap<ProvisioningServiceApplicationConfiguration> bootstrap) {
bootstrap.addBundle(new MultiPartBundle());
bootstrap.addBundle(new TemplateConfigBundle(
@@ -162,4 +204,6 @@ public class ProvisioningServiceApplication extends Application<ProvisioningServ
jersey.register(injector.getInstance(ProvisioningHealthCheckResource.class));
environment.jersey().register(injector.getInstance(BucketResource.class));
}
+
+ */
}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplicationConfiguration.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplicationConfiguration.java
index 84ff288..73bed31 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplicationConfiguration.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplicationConfiguration.java
@@ -25,78 +25,110 @@ import com.epam.datalab.backendapi.core.Directories;
import com.epam.datalab.backendapi.validation.ProvisioningServiceCloudConfigurationSequenceProvider;
import com.epam.datalab.validation.AwsValidation;
import com.fasterxml.jackson.annotation.JsonProperty;
-import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
-import io.dropwizard.util.Duration;
+//import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
+import java.time.Duration;
+import lombok.Setter;
+//import io.dropwizard.util.Duration;
import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.group.GroupSequenceProvider;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+//TODO: overview the configuration annotation
+@Configuration
+//@ConfigurationProperties
@GroupSequenceProvider(ProvisioningServiceCloudConfigurationSequenceProvider.class)
public class ProvisioningServiceApplicationConfiguration extends ServiceConfiguration implements Directories {
@NotEmpty
@JsonProperty
+ @Setter //TODO: Required for spring
private String keyDirectory;
@NotEmpty
@JsonProperty
+ @Setter //TODO: reqs for spring?
private String responseDirectory;
@NotEmpty
@JsonProperty
+ @Setter //TODO: reqs for spring?
private String dockerLogDirectory;
+ @JsonProperty
+ @Setter //TODO: reqs for spring?
+ private String cloudProvider;
+
@NotEmpty
@JsonProperty
+ @Setter //TODO: reqs for spring?
private String handlerDirectory;
@JsonProperty
+ @Setter //TODO: req for spring
private Duration warmupPollTimeout;
@JsonProperty
- private Duration resourceStatusPollTimeout = Duration.minutes(3);
+ @Setter //TODO: reqs for spring?
+ private Duration resourceStatusPollTimeout = Duration.ofMinutes(3);
@JsonProperty
- private Duration keyLoaderPollTimeout = Duration.minutes(2);
+ @Setter //TODO: reqs for spring?
+ private Duration keyLoaderPollTimeout = Duration.ofMinutes(2);
@JsonProperty
- private Duration requestEnvStatusTimeout = Duration.seconds(30);
+ @Setter //TODO: reqs for spring?
+ private Duration requestEnvStatusTimeout = Duration.ofSeconds(30);
@NotEmpty
@JsonProperty
+ @Setter //TODO: reqs for spring?
private String adminKey;
@NotEmpty
@JsonProperty
+ @Setter //TODO: reqs for spring?
private String edgeImage;
@JsonProperty
- private Duration fileLengthCheckDelay = Duration.seconds(3);
+ @Setter //TODO: reqs for spring?
+ private Duration fileLengthCheckDelay = Duration.ofSeconds(3);
@NotEmpty(groups = AwsValidation.class)
@JsonProperty
+ @Setter //TODO: reqs for spring?
private String emrEC2RoleDefault;
@NotEmpty(groups = AwsValidation.class)
@JsonProperty
+ @Setter //TODO: reqs for spring?
private String emrServiceRoleDefault;
@JsonProperty
+ @Setter //TODO: reqs for spring?
private int processMaxThreadsPerJvm = 50;
@JsonProperty
+ @Setter //TODO: reqs for spring?
private int processMaxThreadsPerUser = 5;
@JsonProperty
- private Duration processTimeout = Duration.hours(3);
+ @Setter //TODO: reqs for spring?
+ private Duration processTimeout = Duration.ofHours(3);
+
@JsonProperty
+ @Setter //TODO: reqs for spring?
private String backupScriptPath;
+
@JsonProperty
+ @Setter //TODO: reqs for spring?
private String backupDirectory;
+
@JsonProperty
+ @Setter //TODO: setter is required for spring
private boolean handlersPersistenceEnabled;
- private KeycloakConfiguration keycloakConfiguration = new KeycloakConfiguration();
-
@JsonProperty("cloudProperties")
private CloudConfiguration cloudConfiguration;
@@ -187,10 +219,6 @@ public class ProvisioningServiceApplicationConfiguration extends ServiceConfigur
return handlerDirectory;
}
- public KeycloakConfiguration getKeycloakConfiguration() {
- return keycloakConfiguration;
- }
-
public CloudConfiguration getCloudConfiguration() {
return cloudConfiguration;
}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/conf/SecurityConfiguration.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/conf/SecurityConfiguration.java
new file mode 100644
index 0000000..0f36c3d
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/conf/SecurityConfiguration.java
@@ -0,0 +1,55 @@
+package com.epam.datalab.backendapi.conf;
+
+import org.keycloak.adapters.KeycloakConfigResolver;
+import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
+import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
+import org.keycloak.adapters.springsecurity.KeycloakSecurityComponents;
+import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
+import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.FilterType;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
+import org.springframework.security.core.session.SessionRegistryImpl;
+import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
+import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
+
+@Configuration
+@ComponentScan(
+ basePackageClasses = KeycloakSecurityComponents.class,
+ excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.keycloak.adapters.springsecurity.management.HttpSessionManager"))
+public class SecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter {
+
+ @Autowired
+ public void configureGlobal(AuthenticationManagerBuilder auth) {
+ KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
+ keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
+ auth.authenticationProvider(keycloakAuthenticationProvider);
+ }
+
+ @Bean
+ public KeycloakConfigResolver keycloakConfigResolver() {
+ return new KeycloakSpringBootConfigResolver();
+ }
+
+ @Bean
+ @Override
+ protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
+ return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ super.configure(http);
+ http
+ .anonymous().disable()
+ .authorizeRequests()
+ .anyRequest()
+ .authenticated();
+ }
+
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DockerWarmuper.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DockerWarmuper.java
index eebb032..0893229 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DockerWarmuper.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DockerWarmuper.java
@@ -32,12 +32,14 @@ import com.epam.datalab.process.model.ProcessInfo;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonNode;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
+//import com.google.inject.Inject;
+//import com.google.inject.Singleton;
import io.dropwizard.lifecycle.Managed;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@@ -45,23 +47,23 @@ import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
-@Singleton
+@Scope("singleton")
@Slf4j
-public class DockerWarmuper implements Managed, DockerCommands, MetadataHolder {
+public class DockerWarmuper implements DockerCommands, MetadataHolder {
private static final Logger LOGGER = LoggerFactory.getLogger(DockerWarmuper.class);
public static final String EXPLORATORY_RESPONSE_MARKER = "exploratory_environment_shapes";
- @Inject
+ @Autowired
private ProvisioningServiceApplicationConfiguration configuration;
- @Inject
+ @Autowired
private FolderListenerExecutor folderListenerExecutor;
- @Inject
+ @Autowired
private ICommandExecutor commandExecutor;
+
private final Map<String, String> imageList = new ConcurrentHashMap<>();
private final Set<ImageMetadataDTO> metadataDTOs = ConcurrentHashMap.newKeySet();
- @Override
public void start() throws Exception {
LOGGER.debug("warming up docker");
final ProcessInfo processInfo = commandExecutor.executeSync("warmup", DockerCommands.generateUUID(),
@@ -152,10 +154,6 @@ public class DockerWarmuper implements Managed, DockerCommands, MetadataHolder {
}
}
- @Override
- public void stop() throws Exception {
- //do nothing
- }
@Override
public String getResourceType() {
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/AsyncFileHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/AsyncFileHandler.java
index e2fe9c2..503f853 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/AsyncFileHandler.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/AsyncFileHandler.java
@@ -20,7 +20,8 @@
package com.epam.datalab.backendapi.core.response.folderlistener;
import com.epam.datalab.backendapi.core.FileHandlerCallback;
-import io.dropwizard.util.Duration;
+//import io.dropwizard.util.Duration;
+import java.time.Duration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -127,7 +128,7 @@ public final class AsyncFileHandler implements Supplier<Boolean> {
long after = file.length();
do {
before = after;
- Thread.sleep(fileLengthCheckDelay.toMilliseconds());
+ Thread.sleep(fileLengthCheckDelay.toMillis());
after = file.length();
} while (before != after);
}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListenerExecutor.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListenerExecutor.java
index 7462b80..fa85d84 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListenerExecutor.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListenerExecutor.java
@@ -24,18 +24,24 @@ import com.epam.datalab.backendapi.core.FileHandlerCallback;
import com.epam.datalab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import io.dropwizard.util.Duration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+//import io.dropwizard.util.Duration;
+import java.time.Duration;
import static com.epam.datalab.backendapi.core.response.folderlistener.FolderListener.listen;
/**
* Starts asynchronously of waiting for file creation and processing this file.
*/
-@Singleton
+@Component
+@Scope("singleton")
public class FolderListenerExecutor {
- @Inject
+ @Autowired
private ProvisioningServiceApplicationConfiguration configuration;
- @Inject
+ @Autowired
private CallbackHandlerDao handlerDao;
/**
@@ -49,7 +55,7 @@ public class FolderListenerExecutor {
*/
public void start(String directory, Duration timeout, FileHandlerCallback fileHandlerCallback) {
CallbackHandlerDao dao = configuration.isHandlersPersistenceEnabled() ? handlerDao : null;
- listen(directory, fileHandlerCallback, timeout.toMilliseconds(),
- configuration.getFileLengthCheckDelay().toMilliseconds(), dao);
+ listen(directory, fileHandlerCallback, timeout.toMillis(),
+ configuration.getFileLengthCheckDelay().toMillis(), dao);
}
}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemList.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemList.java
index 76418ae..d8b1a32 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemList.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemList.java
@@ -24,7 +24,8 @@ import com.epam.datalab.backendapi.core.commands.DockerCommands;
import com.epam.datalab.backendapi.core.response.folderlistener.WatchItem.ItemStatus;
import com.epam.datalab.backendapi.core.response.handlers.PersistentFileHandler;
import com.epam.datalab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
-import io.dropwizard.util.Duration;
+//import io.dropwizard.util.Duration;
+import java.time.Duration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -230,7 +231,7 @@ public class WatchItemList {
LOGGER.trace("Process file {} for folder {}", item.getFileName(), directoryFullName);
item.setFuture(CompletableFuture.supplyAsync(
new AsyncFileHandler(item.getFileName(), getDirectoryName(),
- item.getFileHandlerCallback(), Duration.milliseconds(item.getFileLengthCheckDelay()))));
+ item.getFileHandlerCallback(), Duration.ofMillis(item.getFileLengthCheckDelay()))));
}
/**
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalConfigure.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalConfigure.java
index 3cdfcf2..c90a4b2 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalConfigure.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalConfigure.java
@@ -38,23 +38,26 @@ import com.epam.datalab.rest.client.RESTService;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Scope;
import java.util.Objects;
import static com.epam.datalab.backendapi.core.commands.DockerAction.CONFIGURE;
@Slf4j
-@Singleton
+@Scope("singleton")
public class ComputationalConfigure implements DockerCommands {
- @Inject
+ @Autowired
private ProvisioningServiceApplicationConfiguration configuration;
- @Inject
+ @Autowired
private FolderListenerExecutor folderListenerExecutor;
- @Inject
+ @Autowired
private ICommandExecutor commandExecutor;
- @Inject
+ @Autowired
private CommandBuilder commandBuilder;
- @Inject
+ @Autowired
private RESTService selfService;
public String configure(String uuid, ComputationalBase<?> dto) {
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..8346554 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
@@ -24,9 +24,13 @@ import com.epam.datalab.backendapi.core.response.handlers.PersistentFileHandler;
import com.epam.datalab.exceptions.DatalabException;
import com.epam.datalab.util.FileUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
+//import com.google.inject.Inject;
+//import com.google.inject.Singleton;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
@@ -41,13 +45,15 @@ import java.util.stream.Stream;
import static java.util.stream.Collectors.toList;
-@Singleton
+
+@Scope("singleton")
@Slf4j
+@Component
public class FileSystemCallbackHandlerDao implements CallbackHandlerDao {
- @Inject
+ @Autowired
private ProvisioningServiceApplicationConfiguration configuration;
- @Inject
+ @Autowired
private ObjectMapper mapper;
@Override
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/AwsProvisioningModule.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/AwsProvisioningModule.java
index bced6b7..f9eee86 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/AwsProvisioningModule.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/AwsProvisioningModule.java
@@ -23,17 +23,21 @@ import com.epam.datalab.backendapi.resources.aws.ComputationalResourceAws;
import com.epam.datalab.backendapi.resources.aws.EdgeResourceAws;
import com.epam.datalab.backendapi.resources.aws.ExploratoryResourceAws;
import com.epam.datalab.backendapi.resources.aws.InfrastructureResourceAws;
-import com.epam.datalab.cloud.CloudModule;
-import com.google.inject.Injector;
-import io.dropwizard.setup.Environment;
+//import com.epam.datalab.cloud.CloudModule;
+//import com.google.inject.Injector;
+//import io.dropwizard.setup.Environment;
+//import org.springframework.core.env.Environment;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.springframework.stereotype.Component;
-public class AwsProvisioningModule extends CloudModule {
- @Override
- public void init(Environment environment, Injector injector) {
- environment.jersey().register(injector.getInstance(EdgeResourceAws.class));
- environment.jersey().register(injector.getInstance(InfrastructureResourceAws.class));
- environment.jersey().register(injector.getInstance(ExploratoryResourceAws.class));
- environment.jersey().register(injector.getInstance(ComputationalResourceAws.class));
+public class AwsProvisioningModule extends ResourceConfig {
+
+ public AwsProvisioningModule() {
+ register(EdgeResourceAws.class);
+ register(InfrastructureResourceAws.class);
+ register(ExploratoryResourceAws.class);
+ register(ComputationalResourceAws.class);
}
+
}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/CloudModuleConfigurator.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/CloudModuleConfigurator.java
index ba1595b..68aed49 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/CloudModuleConfigurator.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/CloudModuleConfigurator.java
@@ -29,8 +29,8 @@ public class CloudModuleConfigurator {
public static CloudModule getCloudModule(ProvisioningServiceApplicationConfiguration configuration) {
switch (configuration.getCloudProvider()) {
- case AWS:
- return new AwsProvisioningModule();
+// case AWS:
+// return new AwsProvisioningModule();
case AZURE:
return new AzureProvisioningModule();
case GCP:
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/BackupResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/BackupResource.java
index 4b0cce7..b9034f5 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/BackupResource.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/BackupResource.java
@@ -32,6 +32,7 @@ import com.epam.datalab.rest.contracts.BackupAPI;
import com.google.inject.Inject;
import io.dropwizard.auth.Auth;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
@@ -46,13 +47,13 @@ import javax.ws.rs.core.Response;
@Slf4j
public class BackupResource {
- @Inject
+ @Autowired
private ProvisioningServiceApplicationConfiguration configuration;
- @Inject
+ @Autowired
protected FolderListenerExecutor folderListenerExecutor;
- @Inject
+ @Autowired
protected ICommandExecutor commandExecutor;
- @Inject
+ @Autowired
protected RESTService selfService;
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ProvisioningHealthCheckResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ProvisioningHealthCheckResource.java
index 0693c09..959303d 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ProvisioningHealthCheckResource.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ProvisioningHealthCheckResource.java
@@ -23,6 +23,7 @@ import com.epam.datalab.auth.UserInfo;
import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
import com.google.inject.Inject;
import io.dropwizard.auth.Auth;
+import org.springframework.beans.factory.annotation.Autowired;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@@ -33,7 +34,7 @@ import javax.ws.rs.core.Response;
@Path("/healthcheck")
@Produces(MediaType.APPLICATION_JSON)
public class ProvisioningHealthCheckResource {
- @Inject
+ @Autowired
private ProvisioningServiceApplicationConfiguration configuration;
@GET
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ComputationalResourceAws.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ComputationalResourceAws.java
index 9af68b3..de38a34 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ComputationalResourceAws.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ComputationalResourceAws.java
@@ -75,7 +75,8 @@ public class ComputationalResourceAws extends DockerService implements DockerCom
configuration.getResourceStatusPollTimeout(),
getFileHandlerCallback(CREATE, uuid, dto));
try {
- long timeout = configuration.getResourceStatusPollTimeout().toSeconds();
+ //TODO: verify the getSeconds method
+ long timeout = configuration.getResourceStatusPollTimeout().getSeconds();
commandExecutor.executeAsync(
ui.getName(),
uuid,
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java
index 0ff68f0..ab79031 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java
@@ -43,6 +43,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.inject.Inject;
import io.dropwizard.auth.Auth;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
@@ -60,9 +61,9 @@ import static com.epam.datalab.backendapi.core.commands.DockerAction.TERMINATE;
@Slf4j
public class ComputationalResourceGcp extends DockerService implements DockerCommands {
- @Inject
+ @Autowired
private ComputationalConfigure computationalConfigure;
- @Inject
+ @Autowired
private SparkClusterService sparkClusterService;
@POST
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/EdgeResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/EdgeResourceGcp.java
index 654f660..99bd973 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/EdgeResourceGcp.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/EdgeResourceGcp.java
@@ -32,6 +32,7 @@ import com.epam.datalab.util.FileUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.dropwizard.auth.Auth;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
@@ -51,10 +52,11 @@ import static com.epam.datalab.rest.contracts.ApiCallbacks.STATUS_URI;
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Slf4j
+@Component
public class EdgeResourceGcp extends EdgeService {
public EdgeResourceGcp() {
- log.info("{} is initialized", getClass().getSimpleName());
+ log.debug("{} is initialized", getClass().getSimpleName());
}
@POST
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ExploratoryResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ExploratoryResourceGcp.java
index c946ff7..dceb381 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ExploratoryResourceGcp.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ExploratoryResourceGcp.java
@@ -29,6 +29,8 @@ import com.epam.datalab.dto.gcp.exploratory.ExploratoryCreateGcp;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.inject.Inject;
import io.dropwizard.auth.Auth;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
@@ -41,7 +43,7 @@ import javax.ws.rs.core.MediaType;
@Produces(MediaType.APPLICATION_JSON)
public class ExploratoryResourceGcp {
- @Inject
+ @Autowired
private ExploratoryService exploratoryService;
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/InfrastructureResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/InfrastructureResourceGcp.java
index f15f63f..177eb9b 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/InfrastructureResourceGcp.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/InfrastructureResourceGcp.java
@@ -25,6 +25,8 @@ import com.epam.datalab.backendapi.resources.base.InfrastructureService;
import com.epam.datalab.dto.UserEnvironmentResources;
import io.dropwizard.auth.Auth;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
@@ -36,6 +38,7 @@ import javax.ws.rs.core.MediaType;
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Slf4j
+@Component
public class InfrastructureResourceGcp extends InfrastructureService {
public InfrastructureResourceGcp() {
log.info("{} is initialized", getClass().getSimpleName());
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/CheckInactivityServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/CheckInactivityServiceImpl.java
index 1d9aa16..133274c 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/CheckInactivityServiceImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/CheckInactivityServiceImpl.java
@@ -32,11 +32,12 @@ import com.epam.datalab.dto.exploratory.ExploratoryCheckInactivityAction;
import com.epam.datalab.rest.contracts.ApiCallbacks;
import com.google.inject.Singleton;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Scope;
import java.util.Objects;
@Slf4j
-@Singleton
+@Scope("singleton")
public class CheckInactivityServiceImpl extends DockerService implements CheckInactivityService, DockerCommands {
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/DockerService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/DockerService.java
index 4a08f69..254385e 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/DockerService.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/DockerService.java
@@ -25,18 +25,19 @@ import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
import com.epam.datalab.rest.client.RESTService;
import com.google.inject.Inject;
+import org.springframework.beans.factory.annotation.Autowired;
public abstract class DockerService {
- @Inject
+ @Autowired
protected ProvisioningServiceApplicationConfiguration configuration;
- @Inject
+ @Autowired
protected FolderListenerExecutor folderListenerExecutor;
- @Inject
+ @Autowired
protected ICommandExecutor commandExecutor;
- @Inject
+ @Autowired
protected CommandBuilder commandBuilder;
- @Inject
+ @Autowired
protected RESTService selfService;
}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/KeyService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/KeyService.java
index 443d6a4..3fc380a 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/KeyService.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/KeyService.java
@@ -33,6 +33,8 @@ import com.epam.datalab.rest.contracts.ApiCallbacks;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
import java.io.IOException;
@@ -41,14 +43,14 @@ import static java.nio.file.Files.readAllBytes;
import static java.nio.file.Paths.get;
@Slf4j
-@Singleton
+@Scope("singleton")
public class KeyService extends DockerService implements DockerCommands {
private static final String REUPLOAD_KEY_ACTION = "reupload_key";
private final ProvisioningServiceApplicationConfiguration conf;
- @Inject
+ @Autowired
public KeyService(ProvisioningServiceApplicationConfiguration conf) {
this.conf = conf;
}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImpl.java
index 6be8ece..35f7baa 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImpl.java
@@ -35,6 +35,7 @@ import com.epam.datalab.dto.odahu.CreateOdahuDTO;
import com.epam.datalab.rest.client.RESTService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.inject.Inject;
+import org.springframework.beans.factory.annotation.Autowired;
public class OdahuServiceImpl implements OdahuService {
@@ -48,7 +49,7 @@ public class OdahuServiceImpl implements OdahuService {
private final ICommandExecutor commandExecutor;
private final RESTService selfService;
- @Inject
+ @Autowired
public OdahuServiceImpl(ProvisioningServiceApplicationConfiguration configuration,
FolderListenerExecutor folderListenerExecutor, CommandBuilder commandBuilder,
ICommandExecutor commandExecutor, RESTService selfService) {
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 f92e1f4..1e3140c 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
@@ -36,6 +36,9 @@ import com.epam.datalab.rest.client.RESTService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.inject.Inject;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
import java.util.Objects;
@@ -53,7 +56,7 @@ public class ProjectServiceImpl implements ProjectService {
private final ICommandExecutor commandExecutor;
private final CommandBuilder commandBuilder;
- @Inject
+ @Autowired
public ProjectServiceImpl(RESTService selfService, ProvisioningServiceApplicationConfiguration configuration,
FolderListenerExecutor folderListenerExecutor, ICommandExecutor commandExecutor, CommandBuilder commandBuilder) {
this.selfService = selfService;
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/RestoreCallbackHandlerServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/RestoreCallbackHandlerServiceImpl.java
index 4e21d0d..bd3ef49 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/RestoreCallbackHandlerServiceImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/RestoreCallbackHandlerServiceImpl.java
@@ -24,25 +24,26 @@ import com.epam.datalab.backendapi.core.response.handlers.dao.CallbackHandlerDao
import com.epam.datalab.backendapi.service.RestoreCallbackHandlerService;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-import io.dropwizard.lifecycle.Managed;
-import io.dropwizard.util.Duration;
+//TODO: remove the lifecycle dependency
+//import io.dropwizard.lifecycle.Managed;
+//import io.dropwizard.util.Duration;
+import java.time.Duration;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
@Singleton
@Slf4j
-public class RestoreCallbackHandlerServiceImpl implements Managed, RestoreCallbackHandlerService {
+@Service
+public class RestoreCallbackHandlerServiceImpl implements RestoreCallbackHandlerService {
- @Inject
+ @Autowired
private CallbackHandlerDao callbackHandlerDao;
- @Inject
+ @Autowired
private FolderListenerExecutor folderListenerExecutor;
- @Override
- public void start() {
- restore();
- }
+ public void start() {restore();}
- @Override
public void stop() {
log.info("RestoreCallbackHandlerServiceImpl stopped");
}
@@ -51,7 +52,7 @@ public class RestoreCallbackHandlerServiceImpl implements Managed, RestoreCallba
log.info("Restoring callback handlers");
callbackHandlerDao.findAll().forEach(persistentFileHandler ->
folderListenerExecutor.start(persistentFileHandler.getDirectory(),
- Duration.milliseconds(persistentFileHandler.getTimeout()),
+ Duration.ofMillis(persistentFileHandler.getTimeout()),
persistentFileHandler.getHandler()));
log.info("Successfully restored file handlers");
}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/SparkClusterService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/SparkClusterService.java
index 62ae5b1..4ef2dc9 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/SparkClusterService.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/SparkClusterService.java
@@ -38,6 +38,8 @@ import com.epam.datalab.exceptions.DatalabException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
import java.util.Objects;
@@ -47,12 +49,12 @@ import static com.epam.datalab.backendapi.core.commands.DockerAction.START;
import static com.epam.datalab.backendapi.core.commands.DockerAction.STOP;
import static com.epam.datalab.backendapi.core.commands.DockerAction.TERMINATE;
-@Singleton
+@Scope("singleton")
public class SparkClusterService extends DockerService implements DockerCommands {
private static final DataEngineType SPARK_ENGINE = DataEngineType.SPARK_STANDALONE;
- @Inject
+ @Autowired
private ComputationalConfigure computationalConfigure;
public String create(UserInfo ui, ComputationalBase<?> dto) {
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/aws/BucketServiceAwsImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/aws/BucketServiceAwsImpl.java
index 2999df9..8cfdba9 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/aws/BucketServiceAwsImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/aws/BucketServiceAwsImpl.java
@@ -24,6 +24,7 @@ import com.epam.datalab.backendapi.service.BucketService;
import com.epam.datalab.dto.bucket.BucketDTO;
import com.epam.datalab.exceptions.DatalabException;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.core.sync.ResponseTransformer;
import software.amazon.awssdk.services.s3.S3Client;
@@ -42,6 +43,7 @@ import java.util.List;
import java.util.stream.Collectors;
@Slf4j
+@Component
public class BucketServiceAwsImpl implements BucketService {
@Override
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/azure/BucketServiceAzureImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/azure/BucketServiceAzureImpl.java
index 4c56b2c..6b930ea 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/azure/BucketServiceAzureImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/azure/BucketServiceAzureImpl.java
@@ -37,6 +37,9 @@ import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
@@ -53,7 +56,7 @@ public class BucketServiceAzureImpl implements BucketService {
private final AzureAuthFile azureAuthFile;
- @Inject
+ @Autowired
public BucketServiceAzureImpl(ProvisioningServiceApplicationConfiguration configuration) throws Exception {
azureAuthFile = getAzureAuthFile(configuration);
}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
index 65e9fe6..dd732b4 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
@@ -30,6 +30,7 @@ import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
@@ -39,6 +40,7 @@ import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
@Slf4j
+@Component
public class BucketServiceGcpImpl implements BucketService {
@Override
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/process/model/DatalabProcess.java b/services/provisioning-service/src/main/java/com/epam/datalab/process/model/DatalabProcess.java
index 9722ab6..0acc927 100644
--- a/services/provisioning-service/src/main/java/com/epam/datalab/process/model/DatalabProcess.java
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/process/model/DatalabProcess.java
@@ -21,7 +21,8 @@ package com.epam.datalab.process.model;
import com.epam.datalab.process.ProcessConveyor;
import com.epam.datalab.process.builder.ProcessInfoBuilder;
import com.epam.datalab.util.SecurityUtils;
-import io.dropwizard.util.Duration;
+import java.time.Duration;
+//import io.dropwizard.util.Duration;
import lombok.extern.slf4j.Slf4j;
import java.io.PrintWriter;
@@ -161,7 +162,7 @@ public class DatalabProcess {
}
public void setProcessTimeout(Duration duration) {
- this.expirationTime = duration.toMilliseconds();
+ this.expirationTime = duration.toMillis();
}
}
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/DockerWarmuperTest.java b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/DockerWarmuperTest.java
index 191da79..c640fd0 100644
--- a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/DockerWarmuperTest.java
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/DockerWarmuperTest.java
@@ -33,7 +33,8 @@ import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
-import io.dropwizard.util.Duration;
+import java.time.Duration;
+//import io.dropwizard.util.Duration;
import org.junit.Before;
import org.junit.Test;
@@ -115,7 +116,7 @@ public class DockerWarmuperTest {
private ProvisioningServiceApplicationConfiguration createConfiguration() {
ProvisioningServiceApplicationConfiguration result = mock(ProvisioningServiceApplicationConfiguration.class);
when(result.getWarmupDirectory()).thenReturn("/tmp");
- when(result.getWarmupPollTimeout()).thenReturn(Duration.seconds(3));
+ when(result.getWarmupPollTimeout()).thenReturn(Duration.ofMillis(3));
return result;
}
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemTest.java b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemTest.java
index 075523d..25ec2f5 100644
--- a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemTest.java
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemTest.java
@@ -21,7 +21,8 @@ package com.epam.datalab.backendapi.core.response.folderlistener;
import com.epam.datalab.backendapi.core.FileHandlerCallback;
import com.epam.datalab.backendapi.core.response.folderlistener.WatchItem.ItemStatus;
-import io.dropwizard.util.Duration;
+import java.time.Duration;
+//import io.dropwizard.util.Duration;
import org.junit.Test;
import java.util.concurrent.CompletableFuture;
@@ -87,7 +88,7 @@ public class WatchItemTest {
private AsyncFileHandler getSupplier(WatchItem item) {
return new AsyncFileHandler(item.getFileName(), getDirectory(), item.getFileHandlerCallback(),
- Duration.milliseconds(item.getFileLengthCheckDelay()));
+ Duration.ofMillis(item.getFileLengthCheckDelay()));
}
@Test
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/service/RestoreCallbackHandlerServiceImplTest.java b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/service/RestoreCallbackHandlerServiceImplTest.java
index 1df6778..6c0a5f7 100644
--- a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/service/RestoreCallbackHandlerServiceImplTest.java
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/service/RestoreCallbackHandlerServiceImplTest.java
@@ -23,7 +23,8 @@ import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerEx
import com.epam.datalab.backendapi.core.response.handlers.PersistentFileHandler;
import com.epam.datalab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
import com.epam.datalab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
-import io.dropwizard.util.Duration;
+import java.time.Duration;
+//import io.dropwizard.util.Duration;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
@@ -56,9 +57,9 @@ public class RestoreCallbackHandlerServiceImplTest {
restoreCallbackHandlerService.start();
verify(dao).findAll();
- verify(folderListenerExecutor).start(handler1.getDirectory(), Duration.milliseconds(handler1.getTimeout()),
+ verify(folderListenerExecutor).start(handler1.getDirectory(), Duration.ofMillis(handler1.getTimeout()),
handler1.getHandler());
- verify(folderListenerExecutor).start(handler2.getDirectory(), Duration.milliseconds(handler2.getTimeout()),
+ verify(folderListenerExecutor).start(handler2.getDirectory(), Duration.ofMillis(handler2.getTimeout()),
handler2.getHandler());
verifyNoMoreInteractions(dao, folderListenerExecutor);
}
diff --git a/services/self-service/self-service.yml b/services/self-service/self-service.yml
index 9e20bf0..b8b1ed2 100644
--- a/services/self-service/self-service.yml
+++ b/services/self-service/self-service.yml
@@ -19,7 +19,7 @@
#
# ******************************************************************************
-<#include "ssn.yml">
+<#include "infrastructure-provisioning/src/ssn/templates/ssn.yml">
# Minimum and maximum number of slave EMR instances than could be created
minEmrInstanceCount: 2
@@ -46,15 +46,15 @@ checkEnvStatusTimeout: 5m
# Restrict access to DataLab features using roles policy
rolePolicyEnabled: true
# Default access to DataLab features using roles policy
-roleDefaultAccess: false
+roleDefaultAccess: true
# Set to true to enable the scheduler of billing report.
-billingSchedulerEnabled: false
+billingSchedulerEnabled: true
billingPort: 8088
# Set to true to enable audit
auditEnabled: true
# Name of configuration file for billing report.
- <#if DEV_MODE == "true">
+<#if DEV_MODE == "true">
billingConfFile: ${sys['user.dir']}/../billing/billing.yml
<#else>
billingConfFile: ${DATALAB_CONF_DIR}/billing.yml
@@ -146,13 +146,13 @@ schedulers:
cron: "*/20 * * ? * * *"
checkQuoteScheduler:
enabled: true
- cron: "0 2/15 * ? * *"
+ cron: "0 0 * ? * * *"
checkUserQuoteScheduler:
enabled: false
cron: "0 0 * ? * * *"
checkProjectQuoteScheduler:
enabled: true
- cron: "0 4/15 * ? * *"
+ cron: "0 * * ? * * *"
checkEndpointStatusScheduler:
enabled: true
cron: "0 6/15 * ? * *"
@@ -168,16 +168,16 @@ guacamole:
username: datalab-user
keycloakConfiguration:
- redirectUri: KEYCLOAK_REDIRECT_URI
- realm: KEYCLOAK_REALM_NAME
+ redirectUri: https://localhost:8443/
+ realm: DLAB_bhliva
bearer-only: true
- auth-server-url: KEYCLOAK_AUTH_SERVER_URL
+ auth-server-url: http://52.11.45.11:8080/auth
ssl-required: none
register-node-at-startup: true
register-node-period: 600
- resource: KEYCLOAK_CLIENT_NAME
+ resource: sss
credentials:
- secret: KEYCLOAK_CLIENT_SECRET
+ secret: cf5a484b-039b-4161-8707-ad65c0f25962
jerseyClient:
minThreads: 1
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datalab.apache.org
For additional commands, e-mail: commits-help@datalab.apache.org