Added values.yaml

Some simplifications of structure

Change-Id: Id1369ebc1e7ecc3d43ebe49411e875bc6404b97c
diff --git a/rapp-manager/src/main/java/org/oransc/rappmanager/controller/AppController.java b/rapp-manager/src/main/java/org/oransc/rappmanager/controller/AppController.java
index dcdc166..56809fe 100644
--- a/rapp-manager/src/main/java/org/oransc/rappmanager/controller/AppController.java
+++ b/rapp-manager/src/main/java/org/oransc/rappmanager/controller/AppController.java
@@ -23,10 +23,17 @@
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 
+import java.io.IOException;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
 import org.oransc.rappmanager.exception.ServiceException;
 import org.oransc.rappmanager.service.App;
 import org.oransc.rappmanager.service.AppList;
 import org.oransc.rappmanager.service.AppService;
+import org.oransc.rappmanager.service.ChartService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
@@ -37,57 +44,80 @@
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 
 @RestController("rAppController")
 @RequestMapping("rms")
-@Api(tags = {"rapp"})
+@Api(tags = { "rapp" })
 public class AppController {
 
     @Autowired
     private AppService appService;
 
+    @Autowired
+    private ChartService chartService;
+    private static Gson gson = new GsonBuilder().create();
+
     @GetMapping(path = "/apps", produces = MediaType.APPLICATION_JSON_VALUE)
     @ApiOperation(value = "Return all Apps")
-    @ApiResponses(value = {@ApiResponse(code = 200, message = "rApp List")})
+    @ApiResponses(value = { @ApiResponse(code = 200, message = "rApp List") })
     public ResponseEntity<AppList> getAllApps() throws ServiceException {
         return new ResponseEntity<>(appService.getAllApps(), HttpStatus.OK);
     }
 
     @GetMapping(path = "/apps/{name}", produces = MediaType.APPLICATION_JSON_VALUE)
     @ApiOperation(value = "Return a App")
-    @ApiResponses(value = {@ApiResponse(code = 200, message = "rApp")})
+    @ApiResponses(value = { @ApiResponse(code = 200, message = "rApp") })
     public ResponseEntity<App> getApp(@PathVariable("name") String name) throws ServiceException {
         return new ResponseEntity<>(appService.getApp(name), HttpStatus.OK);
     }
 
-    @GetMapping(path = "/apps/{name}/status", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Return the status of an App")
-    @ApiResponses(value = {@ApiResponse(code = 200, message = "rApp")})
-    public ResponseEntity<App> getAppStatus(@PathVariable("name") String name) throws ServiceException {
-        return new ResponseEntity<>(appService.getAppStatus(name), HttpStatus.OK);
-    }
-
-    @PostMapping(
-        path = "/apps",
-        consumes = MediaType.APPLICATION_JSON_VALUE,
-        produces = MediaType.APPLICATION_JSON_VALUE)
+    @PostMapping(path = "/install", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
     @ApiOperation(value = "Install the rApp")
-    @ApiResponses(value = {@ApiResponse(code = 201, message = "rApp Installed")})
-    public ResponseEntity<Object> installApp(@RequestBody App app) throws ServiceException {
+    @ApiResponses(value = { @ApiResponse(code = 201, message = "rApp Installed") })
+    public ResponseEntity<Object> installApp(@RequestBody InstallationInfo info) throws ServiceException {
+        App app = App.builder().name(info.getName()).namespace(info.getNamespace()).version(info.getVersion()).build();
         appService.installApp(app);
         return new ResponseEntity<>(HttpStatus.CREATED);
     }
 
-    @DeleteMapping(path = "/apps/{name}/{version}", produces = MediaType.APPLICATION_JSON_VALUE)
+    @DeleteMapping(path = "/install/{name}/{version}", produces = MediaType.APPLICATION_JSON_VALUE)
     @ApiOperation(value = "Uninstall the App")
-    @ApiResponses(value = {@ApiResponse(code = 201, message = "rApp Uninstalled")})
+    @ApiResponses(value = { @ApiResponse(code = 201, message = "rApp Uninstalled") })
     public ResponseEntity<Object> deleteApp( //
-        @PathVariable("name") String name, //
-        @PathVariable("version") String version) throws ServiceException {
+            @PathVariable("name") String name, //
+            @PathVariable("version") String version) throws ServiceException {
         App app = appService.getApp(name);
         appService.uninstallApp(app);
         return new ResponseEntity<>(HttpStatus.OK);
     }
 
+    @PostMapping(path = "/apps", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "Onboard the Chart")
+    @ApiResponses(value = { @ApiResponse(code = 201, message = "Chart Onboarded") })
+    public ResponseEntity<String> onboardChart( //
+            @RequestPart("chart") MultipartFile chartFile, //
+            @RequestPart("values") MultipartFile overrideFile, //
+            @RequestParam("info") String infoJson) throws ServiceException, IOException {
+
+        AppInfo info = gson.fromJson(infoJson, AppInfo.class);
+        appService.saveApp(info, chartFile, overrideFile);
+        return new ResponseEntity<>(HttpStatus.OK);
+    }
+
+    @DeleteMapping(path = "/charts/{name}/{version}")
+    @ApiOperation(value = "Delete the Chart")
+    @ApiResponses(value = { @ApiResponse(code = 204, message = "Chart Deleted") })
+    public ResponseEntity<Object> deleteChart(@PathVariable("name") String name,
+            @PathVariable("version") String version) throws ServiceException {
+        chartService.deleteChart(name, version);
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+    }
+
 }
diff --git a/rapp-manager/src/main/java/org/oransc/rappmanager/controller/Chart.java b/rapp-manager/src/main/java/org/oransc/rappmanager/controller/Chart.java
deleted file mode 100644
index 46666d3..0000000
--- a/rapp-manager/src/main/java/org/oransc/rappmanager/controller/Chart.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*-
- * ========================LICENSE_START=================================
- * Copyright (C) 2021 Nordix Foundation. All rights reserved.
- * ======================================================================
- * Licensed 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.
- * ========================LICENSE_END===================================
- */
-
-package org.oransc.rappmanager.controller;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.gson.annotations.SerializedName;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import java.util.Collection;
-import java.util.LinkedList;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import org.immutables.gson.Gson;
-
-@Schema(name = "Chart", description = "Chart Information")
-@Getter
-@Setter
-@JsonInclude(Include.NON_NULL)
-@Gson.TypeAdapters
-public class Chart {
-
-    @Schema(name = "name", description = "name", required = true)
-    @JsonProperty(value = "name", required = true)
-    @SerializedName("name")
-    private String name = "";
-
-    private String version = "";
-    private String description = "";
-    private String apiVersion = "";
-    private Collection<String> urls = new LinkedList<>();
-    private String digest = "";
-    @JsonProperty(required = false)
-    private boolean upgrade = false;
-}
diff --git a/rapp-manager/src/main/java/org/oransc/rappmanager/controller/ChartController.java b/rapp-manager/src/main/java/org/oransc/rappmanager/controller/ChartController.java
deleted file mode 100644
index 799488d..0000000
--- a/rapp-manager/src/main/java/org/oransc/rappmanager/controller/ChartController.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*-
- * ========================LICENSE_START=================================
- * Copyright (C) 2021 Nordix Foundation. All rights reserved.
- * ======================================================================
- * Licensed 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.
- * ========================LICENSE_END===================================
- */
-
-package org.oransc.rappmanager.controller;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-
-import java.io.IOException;
-import java.util.Map;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-
-import org.oransc.rappmanager.exception.ServiceException;
-import org.oransc.rappmanager.service.ChartService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RequestPart;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.MultipartFile;
-
-@RestController("chartController")
-@RequestMapping("rms")
-@Api(tags = {"chart"})
-public class ChartController {
-
-    @Autowired
-    private ChartService chartService;
-    private static Gson gson = new GsonBuilder().create();
-
-    @GetMapping(path = "/charts", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Return all Charts")
-    @ApiResponses(value = {@ApiResponse(code = 200, message = "Chart List")})
-    public ResponseEntity<Map<String, Chart[]>> getCharts() throws ServiceException {
-        return new ResponseEntity<>(chartService.getCharts(), HttpStatus.OK);
-    }
-
-    @GetMapping(path = "/charts/{name}", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Return a chart")
-    @ApiResponses(value = {@ApiResponse(code = 200, message = "Chart")})
-    public ResponseEntity<Chart[]> getChart(@PathVariable("name") String name) throws ServiceException {
-        return new ResponseEntity<>(chartService.getChart(name), HttpStatus.OK);
-    }
-
-    @PostMapping(
-        path = "/charts",
-        consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
-        produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Onboard the Chart")
-    @ApiResponses(value = {@ApiResponse(code = 201, message = "Chart Onboarded")})
-    public ResponseEntity<String> onboardChart(@RequestPart("file") @Valid @NotNull @NotBlank MultipartFile file,
-        @RequestParam("chart") String chartJson) throws ServiceException, IOException {
-        // TODO the json is a string here, but it should be Chart
-        Chart chart = gson.fromJson(chartJson, Chart.class);
-        chartService.saveChart(chart, file);
-        return new ResponseEntity<>(HttpStatus.OK);
-    }
-
-    @DeleteMapping(path = "/charts/{name}/{version}")
-    @ApiOperation(value = "Delete the Chart")
-    @ApiResponses(value = {@ApiResponse(code = 204, message = "Chart Deleted")})
-    public ResponseEntity<Object> deleteChart(@PathVariable("name") String name,
-        @PathVariable("version") String version) throws ServiceException {
-        chartService.deleteChart(name, version);
-        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
-    }
-}
diff --git a/rapp-manager/src/main/java/org/oransc/rappmanager/service/AppService.java b/rapp-manager/src/main/java/org/oransc/rappmanager/service/AppService.java
index f80ef47..b2c6ada 100644
--- a/rapp-manager/src/main/java/org/oransc/rappmanager/service/AppService.java
+++ b/rapp-manager/src/main/java/org/oransc/rappmanager/service/AppService.java
@@ -18,10 +18,18 @@
 
 package org.oransc.rappmanager.service;
 
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.oransc.rappmanager.configuration.ApplicationConfig;
+import org.oransc.rappmanager.controller.AppInfo;
 import org.oransc.rappmanager.exception.ServiceException;
 import org.oransc.rappmanager.helm.HelmClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 @Service
 public class AppService {
@@ -32,6 +40,9 @@
     @Autowired
     private HelmClient helmClient;
 
+    @Autowired
+    ApplicationConfig appConfig;
+
     public AppList getAllApps() throws ServiceException {
         // Call Kubernetes api to get the apps- pod, deplyment, statefulset, job?
         // Get the apps list this ms managing.
@@ -42,9 +53,12 @@
         return appStore.getApp(name);
     }
 
-    public App getAppStatus(String name) throws ServiceException {
-        // Check the app status in the kubernetes cluster
-        return appStore.getApp(name);
+    public void saveApp(AppInfo appInfo, MultipartFile chartFile, MultipartFile overrideFile) throws IOException {
+        Path appPath = getAppPath(appInfo);
+        Files.createDirectories(appPath);
+
+        chartFile.transferTo(new File(appPath.toFile(), "chart.tgz"));
+        overrideFile.transferTo(new File(appPath.toFile(), "values.yaml"));
     }
 
     public void installApp(App app) throws ServiceException {
@@ -60,6 +74,14 @@
         // call the kubernetes api to delete objects (helm call)
         helmClient.uninstallApp(app);
         appStore.deleteApp(app.getName());
-
     }
+
+    private Path getAppPath(AppInfo chart) {
+        return Path.of(getDatabaseDirectory(), chart.getName(), chart.getVersion());
+    }
+
+    private String getDatabaseDirectory() {
+        return appConfig.getVardataDirectory() + "/database";
+    }
+
 }
diff --git a/rapp-manager/src/main/java/org/oransc/rappmanager/service/ChartService.java b/rapp-manager/src/main/java/org/oransc/rappmanager/service/ChartService.java
index 9c519d7..3730acf 100644
--- a/rapp-manager/src/main/java/org/oransc/rappmanager/service/ChartService.java
+++ b/rapp-manager/src/main/java/org/oransc/rappmanager/service/ChartService.java
@@ -32,7 +32,7 @@
 import org.oransc.rappmanager.client.AsyncRestClient;
 import org.oransc.rappmanager.client.AsyncRestClientFactory;
 import org.oransc.rappmanager.configuration.ApplicationConfig;
-import org.oransc.rappmanager.controller.Chart;
+import org.oransc.rappmanager.controller.AppInfo;
 import org.oransc.rappmanager.exception.ServiceException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -60,7 +60,7 @@
         this.appConfig = appConfig;
     }
 
-    public Map<String, Chart[]> getCharts() throws ServiceException {
+    public Map<String, AppInfo[]> getCharts() throws ServiceException {
         ResponseEntity<String> rsp = chartClient.getForEntity(basePath).block();
         if (rsp.getStatusCodeValue() != 200) {
             throw new ServiceException("Error Getting Charts");
@@ -69,23 +69,24 @@
         return parseChart(rsp.getBody());
     }
 
-    public Chart[] getChart(String name) throws ServiceException {
+    public AppInfo[] getChart(String name) throws ServiceException {
         ResponseEntity<String> rsp = chartClient.getForEntity(basePath + "/" + name).block();
         if (!rsp.getStatusCode().is2xxSuccessful()) {
             throw new ServiceException("Error Getting Chart " + name);
         }
         logger.debug("Sucessfully fetched the chart");
-        return gson.fromJson(rsp.getBody(), Chart[].class);
+        return gson.fromJson(rsp.getBody(), AppInfo[].class);
     }
 
-    public void saveChart(Chart chart, MultipartFile chartFile) throws IOException {
+    public void saveChart(AppInfo chart, MultipartFile chartFile, MultipartFile overrideFile) throws IOException {
         Path appPath = getAppPath(chart);
         Files.createDirectories(appPath);
-        File outFile = new File(appPath.toFile(), "chart.tgz");
-        chartFile.transferTo(outFile);
+
+        chartFile.transferTo(new File(appPath.toFile(), "chart.tgz"));
+        overrideFile.transferTo(new File(appPath.toFile(), "values.yaml"));
     }
 
-    private Path getAppPath(Chart chart) {
+    private Path getAppPath(AppInfo chart) {
         return Path.of(getDatabaseDirectory(), chart.getName(), chart.getVersion());
     }
 
@@ -101,8 +102,9 @@
         logger.debug("Sucessfully deleted the chart");
     }
 
-    private Map<String, Chart[]> parseChart(String json) {
-        Type mapType = new TypeToken<Map<String, Chart[]>>() {}.getType();
+    private Map<String, AppInfo[]> parseChart(String json) {
+        Type mapType = new TypeToken<Map<String, AppInfo[]>>() {
+        }.getType();
         return gson.fromJson(json, mapType);
     }
 
diff --git a/rapp-manager/src/test/java/org/oransc/rappmanager/controller/ChartControllerTest.java b/rapp-manager/src/test/java/org/oransc/rappmanager/controller/ChartControllerTest.java
index 4c14cb9..46c28fc 100644
--- a/rapp-manager/src/test/java/org/oransc/rappmanager/controller/ChartControllerTest.java
+++ b/rapp-manager/src/test/java/org/oransc/rappmanager/controller/ChartControllerTest.java
@@ -56,12 +56,11 @@
 @RunWith(SpringRunner.class)
 @ExtendWith(SpringExtension.class)
 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
-@TestPropertySource(
-    properties = { //
+@TestPropertySource(properties = { //
         "server.ssl.key-store=./config/keystore.jks", //
         "app.webclient.trust-store=./config/truststore.jks", //
         "app.vardata-directory=./target" //
-    })
+})
 public class ChartControllerTest {
     private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
     private static Gson gson = new GsonBuilder().serializeNulls().create();
@@ -75,7 +74,7 @@
     @Autowired
     ApplicationConfig applicationConfig;
 
-    private Map<String, Chart[]> charts = new HashMap<>();
+    private Map<String, AppInfo[]> charts = new HashMap<>();
 
     static class Microk8sHelmClient extends HelmClient {
         public Microk8sHelmClient(@Autowired ApplicationConfig appConfig) {
@@ -85,8 +84,8 @@
         @Override
         public ProcessBuilder prepareInstallCommand(App app) {
             List<String> helmArguments = Arrays.asList("microk8s.helm", //
-                "install", getChartFileName(app), //
-                "--name", releaseName(app));
+                    "install", getChartFileName(app), //
+                    "--name", releaseName(app));
 
             ProcessBuilder processBuilder = new ProcessBuilder();
             return processBuilder.command(helmArguments);
@@ -126,76 +125,60 @@
         }
     }
 
-    // @Test
-    // public void testGetCharts() throws Exception {
-    // chartList();
-    // given(chartService.getCharts()).willReturn(charts);
-    // mvc.perform(get("/rms/charts").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
-    // .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
-    // .andExpect(jsonPath("$.helloworldApp.[0].name", is("helloworldApp")));
-    // }
-
     @Test
-    public void testPostChart_InstallApp_DeleteApp() {
+    public void testPostApp_InstallApp_DeleteApp() {
 
         AsyncRestClient client = restClient();
         {
-            // POST Chart
-            String url = "/rms/charts";
-            Chart chart = new Chart();
-            chart.setName("test-application");
-            chart.setVersion("1.0.0");
+            // onboard APP
+            String url = "/rms/apps";
+            AppInfo appInfo = AppInfo.builder().name("test-application").version("1.0.0").build();
 
             File chartFile = new File(getClass().getClassLoader().getResource("testchart-0.1.0.tgz").getFile());
-            MultipartInserter body = createPostChartBody(chartFile, chart);
+            File overrideFile = new File(getClass().getClassLoader().getResource("testValues.yaml").getFile());
+            MultipartInserter body = createPostAppBody(chartFile, appInfo, overrideFile);
             ResponseEntity<String> e = client.postForEntity(url, body, MediaType.MULTIPART_FORM_DATA).block();
 
             assertThat(e.getStatusCode()).isEqualTo(HttpStatus.OK);
         }
         {
             // Install App
-            App app = App.builder().name("test-application").version("1.0.0").namespace("").build();
+            InstallationInfo app = InstallationInfo.builder().name("test-application").version("1.0.0")
+                    .namespace("test-application-namespace").build();
             String body = gson.toJson(app);
-            String url = "/rms/apps";
+            String url = "/rms/install";
             ResponseEntity<String> e = client.postForEntity(url, body).block();
             assertThat(e.getStatusCode()).isEqualTo(HttpStatus.CREATED);
         }
         {
-            // Delete App
-            String url = "/rms/apps/test-application/1.0.0";
+            // Uninstall App
+            String url = "/rms/install/test-application/1.0.0";
             ResponseEntity<String> e = client.deleteForEntity(url).block();
             assertThat(e.getStatusCode()).isEqualTo(HttpStatus.OK);
         }
 
     }
 
-    private MultipartInserter createPostChartBody(File file, Chart chart) {
+    private MultipartInserter createPostAppBody(File chartFile, AppInfo appInfo, File overrideFile) {
         MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
-        bodyBuilder.part("file", new FileSystemResource(file));
-        bodyBuilder.part("chart", chart);
+        bodyBuilder.part("chart", new FileSystemResource(chartFile));
+        bodyBuilder.part("values", new FileSystemResource(overrideFile));
+        bodyBuilder.part("info", appInfo);
         return BodyInserters.fromMultipartData(bodyBuilder.build());
     }
 
-    private void chartList() {
-        Chart chart = new Chart();
-        chart.setName("helloworldApp");
-        Chart[] chartArray = new Chart[1];
-        chartArray[0] = chart;
-        charts.put("helloworldApp", chartArray);
-    }
-
     private AsyncRestClient restClient(String baseUrl, boolean useTrustValidation) {
         WebClientConfig config = this.applicationConfig.getWebClientConfig();
         config = ImmutableWebClientConfig.builder() //
-            .keyStoreType(config.keyStoreType()) //
-            .keyStorePassword(config.keyStorePassword()) //
-            .keyStore(config.keyStore()) //
-            .keyPassword(config.keyPassword()) //
-            .isTrustStoreUsed(useTrustValidation) //
-            .trustStore(config.trustStore()) //
-            .trustStorePassword(config.trustStorePassword()) //
-            .httpProxyConfig(config.httpProxyConfig()) //
-            .build();
+                .keyStoreType(config.keyStoreType()) //
+                .keyStorePassword(config.keyStorePassword()) //
+                .keyStore(config.keyStore()) //
+                .keyPassword(config.keyPassword()) //
+                .isTrustStoreUsed(useTrustValidation) //
+                .trustStore(config.trustStore()) //
+                .trustStorePassword(config.trustStorePassword()) //
+                .httpProxyConfig(config.httpProxyConfig()) //
+                .build();
 
         AsyncRestClientFactory f = new AsyncRestClientFactory(config);
         return f.createRestClientNoHttpProxy(baseUrl);
diff --git a/rapp-manager/src/test/resources/testValues.yaml b/rapp-manager/src/test/resources/testValues.yaml
new file mode 100644
index 0000000..89a27b8
--- /dev/null
+++ b/rapp-manager/src/test/resources/testValues.yaml
@@ -0,0 +1,67 @@
+# Default values for buildachart.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 1
+
+image:
+  repository: nginx
+  tag: stable
+  pullPolicy: Always
+
+imagePullSecrets: []
+nameOverride: "cherry-awesome-app"
+fullnameOverride: "cherry-chart"
+
+serviceAccount:
+  # Specifies whether a service account should be created
+  create: true
+  # The name of the service account to use.
+  # If not set and create is true, a name is generated using the fullname template
+  name: cherrybomb
+
+podSecurityContext: {}
+  # fsGroup: 2000
+
+securityContext: {}
+  # capabilities:
+  #   drop:
+  #   - ALL
+  # readOnlyRootFilesystem: true
+  # runAsNonRoot: true
+  # runAsUser: 1000
+
+service:
+  type: NodePort
+  port: 80
+
+ingress:
+  enabled: false
+  annotations: {}
+    # kubernetes.io/ingress.class: nginx
+    # kubernetes.io/tls-acme: "true"
+  hosts:
+    - host: chart-example.local
+      paths: []
+
+  tls: []
+  #  - secretName: chart-example-tls
+  #    hosts:
+  #      - chart-example.local
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+limits:
+  cpu: 100m
+  memory: 128Mi
+requests:
+  cpu: 100m
+  memory: 128Mi
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}