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: {}