You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datalab.apache.org by yk...@apache.org on 2021/02/24 13:51:47 UTC

[incubator-datalab] 01/01: [DATALAB-2228-fix] - fixed bugs, refactoring

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

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

commit 77138cb2ec7f183ec0a41c433d0d3b8aa4d4cdd1
Author: KinashYurii <ur...@gmail.com>
AuthorDate: Wed Feb 24 15:51:12 2021 +0200

    [DATALAB-2228-fix] - fixed bugs, refactoring
---
 services/datalab-webapp-common/pom.xml             |   5 +
 .../datalab/properties}/ChangePropertiesConst.java |  19 +-
 .../properties}/DynamicChangeProperties.java       | 102 +++++------
 .../com/epam/datalab/properties}/RestartForm.java  |   2 +-
 .../java/com/epam/datalab/properties}/YmlDTO.java  |   2 +-
 ...rovisioningServiceApplicationConfiguration.java |   1 +
 .../resources/ChangePropertiesResource.java        |  67 +++++++
 .../datalab/backendapi/SelfServiceApplication.java |   2 +-
 .../resources/ChangePropertiesResource.java        | 125 +++++++++++++
 .../resources/admin/ChangePropertiesResource.java  | 199 ---------------------
 10 files changed, 260 insertions(+), 264 deletions(-)

diff --git a/services/datalab-webapp-common/pom.xml b/services/datalab-webapp-common/pom.xml
index a89c115..b42da46 100644
--- a/services/datalab-webapp-common/pom.xml
+++ b/services/datalab-webapp-common/pom.xml
@@ -65,5 +65,10 @@
             <groupId>com.epam.datalab</groupId>
             <artifactId>common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.4</version>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ChangePropertiesConst.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesConst.java
similarity index 78%
rename from services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ChangePropertiesConst.java
rename to services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesConst.java
index a5b59f7..ded9565 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ChangePropertiesConst.java
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesConst.java
@@ -1,23 +1,26 @@
-package com.epam.datalab.backendapi.modules;
+package com.epam.datalab.properties;
 
 public interface ChangePropertiesConst {
     String GKE_SELF_SERVICE_PATH = "/root/self-service.yaml";
     String GKE_SELF_SERVICE = "self-service.yaml";
     String SELF_SERVICE = "self-service.yml";
-    //    String SELF_SERVICE_PROP_PATH = "services/self-service/self-service.yml";
-    String SELF_SERVICE_PROP_PATH = "/opt/datalab/conf/self-service.yml";
+    String SELF_SERVICE_PROP_PATH = "services/self-service/self-service.yml";
+    //    String SELF_SERVICE_PROP_PATH = "/opt/datalab/conf/self-service.yml";
     String PROVISIONING_SERVICE = "provisioning.yml";
-    //    String PROVISIONING_SERVICE_PROP_PATH = "services/provisioning-service/provisioning.yml";
-    String PROVISIONING_SERVICE_PROP_PATH = "/opt/datalab/conf/provisioning.yml";
+    String PROVISIONING_SERVICE_PROP_PATH = "services/provisioning-service/provisioning.yml";
+//    String PROVISIONING_SERVICE_PROP_PATH = "/opt/datalab/conf/provisioning.yml";
 
     String BILLING_SERVICE = "billing.yml";
     //  String BILLING_SERVICE_PROP_PATH = "services/billing-gcp/billing.yml";
 //      String BILLING_SERVICE_PROP_PATH = "services/billing-azure/billing.yml";
-//    String BILLING_SERVICE_PROP_PATH = "services/billing-aws/billing.yml";
-    String BILLING_SERVICE_PROP_PATH = "/opt/datalab/conf/billing.yml";
+    String BILLING_SERVICE_PROP_PATH = "services/billing-aws/billing.yml";
+    //    String BILLING_SERVICE_PROP_PATH = "/opt/datalab/conf/billing.yml";
     String GKE_BILLING_PATH = "/root/billing.yaml";
     String GKE_BILLING_SERVICE = "billing.yml";
-
+    String RESTART_URL = "api/config/restart";
+    String LOCAL_ENDPOINT_NAME = "local";
+    String BASE_CONFIG_URL = "api/config";
+    String BASE_MULTIPLE_CONFIG_URL = "api/config/multiple/";
 
     String SELF_SERVICE_SUPERVISORCTL_RUN_NAME = " ui ";
     String PROVISIONING_SERVICE_SUPERVISORCTL_RUN_NAME = " provserv ";
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/DynamicChangeProperties.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/DynamicChangeProperties.java
similarity index 63%
rename from services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/DynamicChangeProperties.java
rename to services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/DynamicChangeProperties.java
index 6ed7d15..5ae76bd 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/DynamicChangeProperties.java
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/DynamicChangeProperties.java
@@ -1,16 +1,13 @@
-package com.epam.datalab.backendapi.service.impl;
+package com.epam.datalab.properties;
 
 import com.epam.datalab.auth.UserInfo;
-import com.epam.datalab.backendapi.dao.EndpointDAO;
-import com.epam.datalab.backendapi.domain.EndpointDTO;
-import com.epam.datalab.backendapi.modules.ChangePropertiesConst;
-import com.epam.datalab.backendapi.modules.RestartForm;
-import com.epam.datalab.backendapi.resources.dto.YmlDTO;
+import com.epam.datalab.constants.ServiceConsts;
 import com.epam.datalab.exceptions.DynamicChangePropertiesException;
-import com.epam.datalab.exceptions.ResourceNotFoundException;
 import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.name.Named;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
+import sun.reflect.generics.reflectiveObjects.NotImplementedException;
 
 import javax.inject.Inject;
 import java.io.BufferedWriter;
@@ -28,12 +25,10 @@ import java.util.regex.Pattern;
 @Slf4j
 public class DynamicChangeProperties implements ChangePropertiesConst {
     private final RESTService externalSelfService;
-    private final EndpointDAO endpointDAO;
 
     @Inject
-    public DynamicChangeProperties(RESTService externalSelfService, EndpointDAO endpointDAO) {
+    public DynamicChangeProperties(@Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService externalSelfService) {
         this.externalSelfService = externalSelfService;
-        this.endpointDAO = endpointDAO;
     }
 
     public String getProperties(String path, String name) {
@@ -44,45 +39,38 @@ public class DynamicChangeProperties implements ChangePropertiesConst {
         writeFileFromString(ymlString, name, path);
     }
 
-    public Map<String, String> getPropertiesWithExternal(String endpoint, UserInfo userInfo) {
-        EndpointDTO endpointDTO = findEndpointDTO(endpoint);
+    public Map<String, String> getPropertiesWithExternal(String endpoint, UserInfo userInfo, String url) {
         Map<String, String> properties = new HashMap<>();
-        if (endpoint.equals("local")) {
-            properties.put(SELF_SERVICE, getProperties(SELF_SERVICE_PROP_PATH, SELF_SERVICE));
-            properties.put(PROVISIONING_SERVICE, getProperties(PROVISIONING_SERVICE_PROP_PATH, PROVISIONING_SERVICE));
-            properties.put(BILLING_SERVICE, getProperties(BILLING_SERVICE_PROP_PATH, BILLING_SERVICE));
+        if (endpoint.equals(ChangePropertiesConst.LOCAL_ENDPOINT_NAME)) {
+            properties.put(ChangePropertiesConst.SELF_SERVICE, getProperties(ChangePropertiesConst.SELF_SERVICE_PROP_PATH, ChangePropertiesConst.SELF_SERVICE));
+            properties.put(ChangePropertiesConst.PROVISIONING_SERVICE, getProperties(ChangePropertiesConst.PROVISIONING_SERVICE_PROP_PATH, ChangePropertiesConst.PROVISIONING_SERVICE));
+            properties.put(ChangePropertiesConst.BILLING_SERVICE, getProperties(ChangePropertiesConst.BILLING_SERVICE_PROP_PATH, ChangePropertiesConst.BILLING_SERVICE));
         } else {
             log.info("Trying to read properties, for external endpoint : {} , for user: {}",
                     endpoint, userInfo.getSimpleName());
-            String url = endpointDTO.getUrl() + "/api/config";
-            properties.put(SELF_SERVICE,
-                    externalSelfService.get(url + "/self-service", userInfo.getAccessToken(), String.class));
-            properties.put(PROVISIONING_SERVICE,
+            properties.put(ChangePropertiesConst.SELF_SERVICE, getProperties(ChangePropertiesConst.SELF_SERVICE_PROP_PATH, ChangePropertiesConst.SELF_SERVICE));
+            properties.put(ChangePropertiesConst.PROVISIONING_SERVICE,
                     externalSelfService.get(url + "/provisioning-service", userInfo.getAccessToken(), String.class));
-            properties.put(BILLING_SERVICE,
+            properties.put(ChangePropertiesConst.BILLING_SERVICE,
                     externalSelfService.get(url + "/billing", userInfo.getAccessToken(), String.class));
         }
         return properties;
     }
 
-    public void overwritePropertiesWithExternal(String path, String name, YmlDTO ymlDTO, UserInfo userInfo) {
+    public void overwritePropertiesWithExternal(String path, String name, YmlDTO ymlDTO, UserInfo userInfo,
+                                                String url) {
         log.info("Trying to write {}, for external endpoint : {} , for user: {}",
                 name, ymlDTO.getEndpointName(), userInfo.getSimpleName());
-        EndpointDTO endpoint = findEndpointDTO(ymlDTO.getEndpointName());
-        if (ymlDTO.getEndpointName().equals("local")) {
+        if (ymlDTO.getEndpointName().equals(ChangePropertiesConst.LOCAL_ENDPOINT_NAME)
+                || name.equals(SELF_SERVICE)
+                || name.equals(GKE_SELF_SERVICE)) {
             writeFileFromString(ymlDTO.getYmlString(), name, path);
         } else {
-            String url = endpoint.getUrl() + "/api/config/multiple/" + findMethodName(name);
+            url += findMethodName(name);
             externalSelfService.post(url, ymlDTO.getYmlString(), userInfo.getAccessToken(), String.class);
         }
     }
 
-    private EndpointDTO findEndpointDTO(String endpointName) {
-        return endpointDAO.get(endpointName)
-                .orElseThrow(() -> new ResourceNotFoundException("Endpoint with name " + endpointName
-                        + " not found"));
-    }
-
     public void restart(RestartForm restartForm) {
         try {
             boolean billing = restartForm.isBilling();
@@ -97,12 +85,14 @@ public class DynamicChangeProperties implements ChangePropertiesConst {
         }
     }
 
+    public void restartForExternal(RestartForm restartForm, UserInfo userInfo, String url) {
+        if (restartForm.getEndpoint().equals(LOCAL_ENDPOINT_NAME)) {
+            restart(restartForm);
+        } else {
+            log.info("External request for endpoint {}, for user {}", restartForm.getEndpoint(), userInfo.getSimpleName());
 
-    public void restartForExternal(RestartForm restartForm, UserInfo userInfo) {
-        EndpointDTO endpointDTO = findEndpointDTO(restartForm.getEndpoint());
-        String url = endpointDTO.getUrl() + "/api/config/multiple/restart";
-        log.info("External request for endpoint {}, for user {}", restartForm.getEndpoint(), userInfo.getSimpleName());
-        externalSelfService.post(url, userInfo.getAccessToken(), restartForm, Void.class);
+            externalSelfService.post(url, userInfo.getAccessToken(), restartForm, Void.class);
+        }
     }
 
     private String findMethodName(String name) {
@@ -123,10 +113,10 @@ public class DynamicChangeProperties implements ChangePropertiesConst {
 
 
     private String buildSHRestartCommand(boolean billing, boolean provserv, boolean ui) {
-        StringBuilder stringBuilder = new StringBuilder(SUPERVISORCTL_RESTART_SH_COMMAND);
-        if (billing) stringBuilder.append(BILLING_SERVICE_SUPERVISORCTL_RUN_NAME);
-        if (provserv) stringBuilder.append(PROVISIONING_SERVICE_SUPERVISORCTL_RUN_NAME);
-        if (ui) stringBuilder.append(SELF_SERVICE_SUPERVISORCTL_RUN_NAME);
+        StringBuilder stringBuilder = new StringBuilder(ChangePropertiesConst.SUPERVISORCTL_RESTART_SH_COMMAND);
+        if (billing) stringBuilder.append(ChangePropertiesConst.BILLING_SERVICE_SUPERVISORCTL_RUN_NAME);
+        if (provserv) stringBuilder.append(ChangePropertiesConst.PROVISIONING_SERVICE_SUPERVISORCTL_RUN_NAME);
+        if (ui) stringBuilder.append(ChangePropertiesConst.SELF_SERVICE_SUPERVISORCTL_RUN_NAME);
         return stringBuilder.toString();
     }
 
@@ -142,35 +132,35 @@ public class DynamicChangeProperties implements ChangePropertiesConst {
     }
 
     private String hideSecretsAndRemoveLicence(String currentConf) {
-        Matcher m = Pattern.compile(SECRET_REGEX).matcher(currentConf);
+        Matcher m = Pattern.compile(ChangePropertiesConst.SECRET_REGEX).matcher(currentConf);
         List<String> secrets = new ArrayList<>();
         String confWithReplacedSecretConf = removeLicence(currentConf);
         while (m.find()) {
-            String secret = m.group().split(":")[DEFAULT_VALUE_PLACE];
+            String secret = m.group().split(":")[ChangePropertiesConst.DEFAULT_VALUE_PLACE];
             if (!(secret.isEmpty() || secret.trim().isEmpty()))
                 secrets.add(secret);
         }
         for (String secret : secrets) {
-            confWithReplacedSecretConf = confWithReplacedSecretConf.replace(secret, SECRET_REPLACEMENT_FORMAT);
+            confWithReplacedSecretConf = confWithReplacedSecretConf.replace(secret, ChangePropertiesConst.SECRET_REPLACEMENT_FORMAT);
         }
         return confWithReplacedSecretConf;
     }
 
     private String removeLicence(String conf) {
-        return conf.split(LICENCE_REGEX)[conf.split(LICENCE_REGEX).length - 1];
+        return conf.split(ChangePropertiesConst.LICENCE_REGEX)[conf.split(ChangePropertiesConst.LICENCE_REGEX).length - 1];
     }
 
     private void writeFileFromString(String newPropFile, String serviceName, String servicePath) {
         try {
             String oldFile = FileUtils.readFileToString(new File(servicePath), Charset.defaultCharset());
-            changeCHMODE(serviceName, servicePath, DEFAULT_CHMOD, WRITE_CHMOD);
+            changeCHMODE(serviceName, servicePath, ChangePropertiesConst.DEFAULT_CHMOD, ChangePropertiesConst.WRITE_CHMOD);
             BufferedWriter writer = new BufferedWriter(new FileWriter(servicePath));
             log.info("Trying to overwrite {}, file for path {} :", serviceName, servicePath);
             writer.write(addLicence());
             writer.write(checkAndReplaceSecretIfEmpty(newPropFile, oldFile));
             log.info("{} overwritten successfully", serviceName);
             writer.close();
-            changeCHMODE(serviceName, servicePath, WRITE_CHMOD, DEFAULT_CHMOD);
+            changeCHMODE(serviceName, servicePath, ChangePropertiesConst.WRITE_CHMOD, ChangePropertiesConst.DEFAULT_CHMOD);
         } catch (IOException e) {
             log.error("Failed during overwriting {}", serviceName);
             throw new DynamicChangePropertiesException(String.format("Failed during overwriting %s", serviceName));
@@ -179,7 +169,7 @@ public class DynamicChangeProperties implements ChangePropertiesConst {
 
     private void changeCHMODE(String serviceName, String path, String fromMode, String toMode) throws IOException {
         try {
-            String command = String.format(CHANGE_CHMOD_SH_COMMAND_FORMAT, toMode, path);
+            String command = String.format(ChangePropertiesConst.CHANGE_CHMOD_SH_COMMAND_FORMAT, toMode, path);
             log.info("Trying to change chmod for file {} {}->{}", serviceName, fromMode, toMode);
             log.info("Execute command: {}", command);
             Runtime.getRuntime().exec(command).waitFor();
@@ -189,7 +179,7 @@ public class DynamicChangeProperties implements ChangePropertiesConst {
     }
 
     private String addLicence() {
-        return LICENCE;
+        return ChangePropertiesConst.LICENCE;
     }
 
     private String checkAndReplaceSecretIfEmpty(String newPropFile, String oldProf) {
@@ -199,25 +189,29 @@ public class DynamicChangeProperties implements ChangePropertiesConst {
 
     private String replaceEmptySecret(String newPropFile, String oldProf, Map<String, String> emptySecrets) {
         String fileWithReplacedEmptySecrets = newPropFile;
-        Matcher oldProfMatcher = Pattern.compile(SECRET_REGEX).matcher(oldProf);
+        Matcher oldProfMatcher = Pattern.compile(ChangePropertiesConst.SECRET_REGEX).matcher(oldProf);
         while (oldProfMatcher.find()) {
             String[] s = oldProfMatcher.group().split(":");
-            if (emptySecrets.containsKey(s[DEFAULT_NAME_PLACE])) {
-                fileWithReplacedEmptySecrets = fileWithReplacedEmptySecrets.replace(emptySecrets.get(s[DEFAULT_NAME_PLACE]), oldProfMatcher.group());
+            if (emptySecrets.containsKey(s[ChangePropertiesConst.DEFAULT_NAME_PLACE])) {
+                fileWithReplacedEmptySecrets = fileWithReplacedEmptySecrets.replace(emptySecrets.get(s[ChangePropertiesConst.DEFAULT_NAME_PLACE]), oldProfMatcher.group());
             }
         }
         return fileWithReplacedEmptySecrets;
     }
 
     private Map<String, String> findEmptySecret(String newPropFile) {
-        Matcher newPropFileMatcher = Pattern.compile(SECRET_REGEX).matcher(newPropFile);
+        Matcher newPropFileMatcher = Pattern.compile(ChangePropertiesConst.SECRET_REGEX).matcher(newPropFile);
         Map<String, String> emptySecrets = new HashMap<>();
         while (newPropFileMatcher.find()) {
             String[] s = newPropFileMatcher.group().split(":");
-            if (s[DEFAULT_VALUE_PLACE].equals(SECRET_REPLACEMENT_FORMAT)) {
-                emptySecrets.put(s[DEFAULT_NAME_PLACE], newPropFileMatcher.group());
+            if (s[ChangePropertiesConst.DEFAULT_VALUE_PLACE].equals(ChangePropertiesConst.SECRET_REPLACEMENT_FORMAT)) {
+                emptySecrets.put(s[ChangePropertiesConst.DEFAULT_NAME_PLACE], newPropFileMatcher.group());
             }
         }
         return emptySecrets;
     }
+
+    public void restartForExternalForGKE(UserInfo userInfo, RestartForm restartForm) {
+        throw new NotImplementedException();
+    }
 }
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/RestartForm.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/RestartForm.java
similarity index 79%
rename from services/self-service/src/main/java/com/epam/datalab/backendapi/modules/RestartForm.java
rename to services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/RestartForm.java
index 045260d..c399fb5 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/RestartForm.java
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/RestartForm.java
@@ -1,4 +1,4 @@
-package com.epam.datalab.backendapi.modules;
+package com.epam.datalab.properties;
 
 import lombok.Data;
 
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/YmlDTO.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/YmlDTO.java
similarity index 79%
rename from services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/YmlDTO.java
rename to services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/YmlDTO.java
index 0287882..5fdd64e 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/YmlDTO.java
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/YmlDTO.java
@@ -1,4 +1,4 @@
-package com.epam.datalab.backendapi.resources.dto;
+package com.epam.datalab.properties;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import lombok.Data;
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 25bdfcc..84ff288 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
@@ -194,4 +194,5 @@ public class ProvisioningServiceApplicationConfiguration extends ServiceConfigur
     public CloudConfiguration getCloudConfiguration() {
         return cloudConfiguration;
     }
+
 }
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java
new file mode 100644
index 0000000..7bc319a
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java
@@ -0,0 +1,67 @@
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.properties.ChangePropertiesConst;
+import com.epam.datalab.properties.DynamicChangeProperties;
+import com.epam.datalab.properties.RestartForm;
+import com.epam.datalab.properties.YmlDTO;
+import io.dropwizard.auth.Auth;
+
+import javax.inject.Inject;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("config")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+public class ChangePropertiesResource implements ChangePropertiesConst {
+
+    private final DynamicChangeProperties dynamicChangeProperties;
+
+    @Inject
+    public ChangePropertiesResource(DynamicChangeProperties dynamicChangeProperties,
+                                    ProvisioningServiceApplicationConfiguration conf) {
+        this.dynamicChangeProperties = dynamicChangeProperties;
+    }
+
+    @GET
+    @Path("/provisioning-service")
+    public Response getProvisioningServiceProperties(@Auth UserInfo userInfo) {
+        return Response
+                .ok(dynamicChangeProperties.getProperties(PROVISIONING_SERVICE_PROP_PATH, PROVISIONING_SERVICE))
+                .build();
+    }
+
+    @GET
+    @Path("/billing")
+    public Response getBillingServiceProperties(@Auth UserInfo userInfo) {
+        return Response
+                .ok(dynamicChangeProperties.getProperties(BILLING_SERVICE_PROP_PATH, BILLING_SERVICE))
+                .build();
+    }
+
+    @POST
+    @Path("/provisioning-service")
+    public Response overwriteProvisioningServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
+        dynamicChangeProperties.overwriteProperties(PROVISIONING_SERVICE_PROP_PATH, PROVISIONING_SERVICE,
+                ymlDTO.getYmlString());
+        return Response.ok().build();
+    }
+
+    @POST
+    @Path("/billing")
+    public Response overwriteBillingServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
+        dynamicChangeProperties.overwriteProperties(BILLING_SERVICE_PROP_PATH, BILLING_SERVICE, ymlDTO.getYmlString());
+        return Response.ok().build();
+
+    }
+
+    @POST
+    @Path("/restart")
+    public Response restart(@Auth UserInfo userInfo, RestartForm restartForm) {
+        dynamicChangeProperties.restart(restartForm);
+        return Response.ok().build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/SelfServiceApplication.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/SelfServiceApplication.java
index 9c5f166..08ebf1a 100644
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/SelfServiceApplication.java
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/SelfServiceApplication.java
@@ -46,7 +46,7 @@ import com.epam.datalab.backendapi.resources.SystemInfoResource;
 import com.epam.datalab.backendapi.resources.UserGroupResource;
 import com.epam.datalab.backendapi.resources.UserRoleResource;
 import com.epam.datalab.backendapi.resources.UserSettingsResource;
-import com.epam.datalab.backendapi.resources.admin.ChangePropertiesResource;
+import com.epam.datalab.backendapi.resources.ChangePropertiesResource;
 import com.epam.datalab.backendapi.resources.callback.BackupCallback;
 import com.epam.datalab.backendapi.resources.callback.CheckInactivityCallback;
 import com.epam.datalab.backendapi.resources.callback.ComputationalCallback;
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java
new file mode 100644
index 0000000..e38a2b5
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java
@@ -0,0 +1,125 @@
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.properties.ChangePropertiesConst;
+import com.epam.datalab.properties.DynamicChangeProperties;
+import com.epam.datalab.properties.RestartForm;
+import com.epam.datalab.properties.YmlDTO;
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.EndpointDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import io.dropwizard.auth.Auth;
+
+import javax.inject.Inject;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("config")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+public class ChangePropertiesResource implements ChangePropertiesConst {
+
+    private final EndpointDAO endpointDAO;
+    private final DynamicChangeProperties dynamicChangeProperties;
+    private final String deployedOn;
+
+    @Inject
+    public ChangePropertiesResource(EndpointDAO endpointDAO, DynamicChangeProperties dynamicChangeProperties,
+                                    SelfServiceApplicationConfiguration selfServiceApplicationConfiguration) {
+        this.endpointDAO = endpointDAO;
+        this.dynamicChangeProperties = dynamicChangeProperties;
+        deployedOn = selfServiceApplicationConfiguration.getDeployed();
+    }
+
+    @GET
+    @Path("/multiple")
+    public Response getAllPropertiesForEndpoint(@Auth UserInfo userInfo, @QueryParam("endpoint") String endpoint) {
+        if (UserRoles.isAdmin(userInfo)) {
+            String url = findEndpointDTO(endpoint).getUrl() + ChangePropertiesConst.BASE_CONFIG_URL;
+            return Response
+                    .ok(dynamicChangeProperties.getPropertiesWithExternal(endpoint, userInfo, url))
+                    .build();
+        } else {
+            return Response
+                    .status(Response.Status.FORBIDDEN)
+                    .build();
+        }
+    }
+
+    @POST
+    @Path("/multiple/self-service")
+    public Response overwriteExternalSelfServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
+        if (UserRoles.isAdmin(userInfo)) {
+            if (deployedOn.equals("GKE")) {
+                dynamicChangeProperties.overwritePropertiesWithExternal(GKE_SELF_SERVICE_PATH, GKE_SELF_SERVICE,
+                        ymlDTO, userInfo, null);
+            } else {
+                dynamicChangeProperties.overwritePropertiesWithExternal(SELF_SERVICE_PROP_PATH, SELF_SERVICE,
+                        ymlDTO, userInfo, null);
+            }
+            return Response.status(Response.Status.OK).build();
+        } else {
+            return Response
+                    .status(Response.Status.FORBIDDEN)
+                    .build();
+        }
+    }
+
+    @POST
+    @Path("/multiple/provisioning-service")
+    public Response overwriteExternalProvisioningServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
+        if (UserRoles.isAdmin(userInfo)) {
+            String url = findEndpointDTO(ymlDTO.getEndpointName()).getUrl() + ChangePropertiesConst.BASE_MULTIPLE_CONFIG_URL;
+            dynamicChangeProperties.overwritePropertiesWithExternal(PROVISIONING_SERVICE_PROP_PATH, PROVISIONING_SERVICE,
+                    ymlDTO, userInfo, url);
+            return Response.status(Response.Status.OK).build();
+        } else {
+            return Response
+                    .status(Response.Status.FORBIDDEN)
+                    .build();
+        }
+    }
+
+    @POST
+    @Path("/multiple/billing")
+    public Response overwriteExternalBillingProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
+        if (UserRoles.isAdmin(userInfo)) {
+            String url = findEndpointDTO(ymlDTO.getEndpointName()).getUrl() + ChangePropertiesConst.BASE_MULTIPLE_CONFIG_URL;
+            dynamicChangeProperties.overwritePropertiesWithExternal(BILLING_SERVICE_PROP_PATH, BILLING_SERVICE,
+                    ymlDTO, userInfo, url);
+            return Response.status(Response.Status.OK).build();
+        } else {
+            return Response
+                    .status(Response.Status.FORBIDDEN)
+                    .build();
+        }
+    }
+
+
+    @POST
+    @Path("/multiple/restart")
+    public Response restartWithExternal(@Auth UserInfo userInfo, RestartForm restartForm) {
+        if (UserRoles.isAdmin(userInfo)) {
+            if (deployedOn.equals("GKE")) {
+                dynamicChangeProperties.restartForExternalForGKE(userInfo, restartForm);
+            } else {
+                String url = findEndpointDTO(restartForm.getEndpoint()).getUrl() + ChangePropertiesConst.RESTART_URL;
+                dynamicChangeProperties.restartForExternal(restartForm, userInfo, url);
+            }
+            return Response.ok().build();
+        } else {
+            return Response
+                    .status(Response.Status.FORBIDDEN)
+                    .build();
+        }
+    }
+
+    private EndpointDTO findEndpointDTO(String endpointName) {
+        return endpointDAO.get(endpointName)
+                .orElseThrow(() -> new ResourceNotFoundException("Endpoint with name " + endpointName
+                        + " not found"));
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/admin/ChangePropertiesResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/admin/ChangePropertiesResource.java
deleted file mode 100644
index 133b17e..0000000
--- a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/admin/ChangePropertiesResource.java
+++ /dev/null
@@ -1,199 +0,0 @@
-package com.epam.datalab.backendapi.resources.admin;
-
-import com.epam.datalab.auth.UserInfo;
-import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.datalab.backendapi.modules.ChangePropertiesConst;
-import com.epam.datalab.backendapi.modules.RestartForm;
-import com.epam.datalab.backendapi.resources.dto.YmlDTO;
-import com.epam.datalab.backendapi.roles.UserRoles;
-import com.epam.datalab.backendapi.service.impl.DynamicChangeProperties;
-import io.dropwizard.auth.Auth;
-
-import javax.inject.Inject;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path("config")
-@Produces(MediaType.APPLICATION_JSON)
-@Consumes(MediaType.APPLICATION_JSON)
-public class ChangePropertiesResource implements ChangePropertiesConst {
-
-    private final DynamicChangeProperties dynamicChangeProperties;
-    private final String deployedOn;
-
-    @Inject
-    public ChangePropertiesResource(DynamicChangeProperties dynamicChangeProperties, SelfServiceApplicationConfiguration selfServiceApplicationConfiguration) {
-        this.dynamicChangeProperties = dynamicChangeProperties;
-        deployedOn = selfServiceApplicationConfiguration.getDeployed();
-    }
-
-    @GET
-    @Path("/self-service")
-    public Response getSelfServiceProperties(@Auth UserInfo userInfo) {
-        if (UserRoles.isAdmin(userInfo)) {
-            return Response
-                    .ok(deployedOn.equals("onPremise") ?
-                            dynamicChangeProperties.getProperties(SELF_SERVICE_PROP_PATH, SELF_SERVICE) :
-                            dynamicChangeProperties.getProperties(GKE_SELF_SERVICE_PATH, GKE_SELF_SERVICE))
-                    .build();
-        } else {
-            return Response
-                    .status(Response.Status.FORBIDDEN)
-                    .build();
-        }
-    }
-
-    @GET
-    @Path("/provisioning-service")
-    public Response getProvisioningServiceProperties(@Auth UserInfo userInfo) {
-        if (UserRoles.isAdmin(userInfo)) {
-            return Response
-                    .ok(dynamicChangeProperties.getProperties(PROVISIONING_SERVICE_PROP_PATH, PROVISIONING_SERVICE))
-                    .build();
-        } else {
-            return Response
-                    .status(Response.Status.FORBIDDEN)
-                    .build();
-        }
-    }
-
-    @GET
-    @Path("/billing")
-    public Response getBillingServiceProperties(@Auth UserInfo userInfo) {
-        if (UserRoles.isAdmin(userInfo)) {
-            return Response
-                    .ok(deployedOn.equals("onPremise") ?
-                            dynamicChangeProperties.getProperties(BILLING_SERVICE_PROP_PATH, BILLING_SERVICE) :
-                            dynamicChangeProperties.getProperties(GKE_BILLING_PATH, GKE_BILLING_SERVICE))
-                    .build();
-        } else {
-            return Response
-                    .status(Response.Status.FORBIDDEN)
-                    .build();
-        }
-    }
-
-    @POST
-    @Path("/self-service")
-    public Response overwriteSelfServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
-        if (UserRoles.isAdmin(userInfo)) {
-            dynamicChangeProperties.overwriteProperties(SELF_SERVICE_PROP_PATH, SELF_SERVICE, ymlDTO.getYmlString());
-            return Response.ok().build();
-        } else {
-            return Response
-                    .status(Response.Status.FORBIDDEN)
-                    .build();
-        }
-    }
-
-    @POST
-    @Path("/provisioning-service")
-    public Response overwriteProvisioningServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
-        if (UserRoles.isAdmin(userInfo)) {
-            dynamicChangeProperties.overwriteProperties(PROVISIONING_SERVICE_PROP_PATH, PROVISIONING_SERVICE,
-                    ymlDTO.getYmlString());
-            return Response.ok().build();
-        } else {
-            return Response
-                    .status(Response.Status.FORBIDDEN)
-                    .build();
-        }
-    }
-
-    @POST
-    @Path("/billing")
-    public Response overwriteBillingServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
-        if (UserRoles.isAdmin(userInfo)) {
-            dynamicChangeProperties.overwriteProperties(BILLING_SERVICE_PROP_PATH, BILLING_SERVICE, ymlDTO.getYmlString());
-            return Response.ok().build();
-        } else {
-            return Response
-                    .status(Response.Status.FORBIDDEN)
-                    .build();
-        }
-    }
-
-    @POST
-    @Path("restart")
-    public Response restart(@Auth UserInfo userInfo, RestartForm restartForm) {
-        if (UserRoles.isAdmin(userInfo)) {
-            dynamicChangeProperties.restart(restartForm);
-            return Response.ok().build();
-        } else {
-            return Response
-                    .status(Response.Status.FORBIDDEN)
-                    .build();
-        }
-    }
-
-    @GET
-    @Path("/multiple")
-    public Response getAllPropertiesForEndpoint(@Auth UserInfo userInfo, @QueryParam("endpoint") String endpoint) {
-        if (UserRoles.isAdmin(userInfo)) {
-            return Response
-                    .ok(dynamicChangeProperties.getPropertiesWithExternal(endpoint, userInfo))
-                    .build();
-        } else {
-            return Response
-                    .status(Response.Status.FORBIDDEN)
-                    .build();
-        }
-    }
-
-    @POST
-    @Path("/multiple/self-service")
-    public Response overwriteExternalSelfServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
-        if (UserRoles.isAdmin(userInfo)) {
-            dynamicChangeProperties.overwritePropertiesWithExternal(SELF_SERVICE_PROP_PATH, SELF_SERVICE,
-                    ymlDTO, userInfo);
-            return Response.status(Response.Status.OK).build();
-        } else {
-            return Response
-                    .status(Response.Status.FORBIDDEN)
-                    .build();
-        }
-    }
-
-    @POST
-    @Path("/multiple/provisioning-service")
-    public Response overwriteExternalProvisioningServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
-        if (UserRoles.isAdmin(userInfo)) {
-            dynamicChangeProperties.overwritePropertiesWithExternal(PROVISIONING_SERVICE_PROP_PATH, PROVISIONING_SERVICE,
-                    ymlDTO, userInfo);
-            return Response.status(Response.Status.OK).build();
-        } else {
-            return Response
-                    .status(Response.Status.FORBIDDEN)
-                    .build();
-        }
-    }
-
-    @POST
-    @Path("/multiple/billing")
-    public Response overwriteExternalBillingProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
-        if (UserRoles.isAdmin(userInfo)) {
-            dynamicChangeProperties.overwritePropertiesWithExternal(BILLING_SERVICE_PROP_PATH, BILLING_SERVICE,
-                    ymlDTO, userInfo);
-            return Response.status(Response.Status.OK).build();
-        } else {
-            return Response
-                    .status(Response.Status.FORBIDDEN)
-                    .build();
-        }
-    }
-
-
-    @POST
-    @Path("/multiple/restart")
-    public Response restartWithExternal(@Auth UserInfo userInfo, RestartForm restartForm) {
-        if (UserRoles.isAdmin(userInfo)) {
-            dynamicChangeProperties.restartForExternal(restartForm, userInfo);
-            return Response.ok().build();
-        } else {
-            return Response
-                    .status(Response.Status.FORBIDDEN)
-                    .build();
-        }
-    }
-}
\ No newline at end of file


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