aboutsummaryrefslogtreecommitdiffstats
path: root/vnfmarket-be/vnf-sdk-marketplace/src/main/java/org/onap/vtp/scenario/VTPScenarioResource.java
diff options
context:
space:
mode:
Diffstat (limited to 'vnfmarket-be/vnf-sdk-marketplace/src/main/java/org/onap/vtp/scenario/VTPScenarioResource.java')
-rw-r--r--vnfmarket-be/vnf-sdk-marketplace/src/main/java/org/onap/vtp/scenario/VTPScenarioResource.java228
1 files changed, 193 insertions, 35 deletions
diff --git a/vnfmarket-be/vnf-sdk-marketplace/src/main/java/org/onap/vtp/scenario/VTPScenarioResource.java b/vnfmarket-be/vnf-sdk-marketplace/src/main/java/org/onap/vtp/scenario/VTPScenarioResource.java
index 4b319328..274cacd9 100644
--- a/vnfmarket-be/vnf-sdk-marketplace/src/main/java/org/onap/vtp/scenario/VTPScenarioResource.java
+++ b/vnfmarket-be/vnf-sdk-marketplace/src/main/java/org/onap/vtp/scenario/VTPScenarioResource.java
@@ -16,13 +16,22 @@
package org.onap.vtp.scenario;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
import java.io.IOException;
+import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
+import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@@ -30,7 +39,16 @@ import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
+import com.google.common.collect.Maps;
+import org.apache.commons.io.FileUtils;
+import org.apache.cxf.common.util.CollectionUtils;
import org.eclipse.jetty.http.HttpStatus;
+import org.glassfish.jersey.media.multipart.BodyPartEntity;
+import org.glassfish.jersey.media.multipart.FormDataBodyPart;
+import org.glassfish.jersey.media.multipart.FormDataParam;
+import org.onap.vnfsdk.marketplace.common.CommonConstant;
+import org.onap.vnfsdk.marketplace.common.FileUtil;
+import org.onap.vnfsdk.marketplace.common.ToolUtil;
import org.onap.vtp.VTPResource;
import org.onap.vtp.error.VTPError;
import org.onap.vtp.error.VTPError.VTPException;
@@ -67,7 +85,7 @@ public class VTPScenarioResource extends VTPResource{
args.addAll(Arrays.asList(
PRODUCT_ARG, OPEN_CLI, "product-list", FORMAT, "json"
- ));
+ ));
JsonElement results = null;
@@ -81,18 +99,18 @@ public class VTPScenarioResource extends VTPResource{
if (results != null && results.isJsonArray() && results.getAsJsonArray().size()>0) {
JsonArray resultsArray = results.getAsJsonArray();
- for (Iterator<JsonElement> it = resultsArray.iterator(); it.hasNext();) {
- JsonElement jsonElement = it.next();
- JsonObject n = jsonElement.getAsJsonObject();
- if (n.entrySet().iterator().hasNext()) {
- String name = n.get("product").getAsString();
+ for (Iterator<JsonElement> it = resultsArray.iterator(); it.hasNext();) {
+ JsonElement jsonElement = it.next();
+ JsonObject n = jsonElement.getAsJsonObject();
+ if (n.entrySet().iterator().hasNext()) {
+ String name = n.get("product").getAsString();
- if (OPEN_CLI.equalsIgnoreCase(name))
- continue;
+ if (OPEN_CLI.equalsIgnoreCase(name))
+ continue;
- list.getScenarios().add(new VTPTestScenario().setName(name).setDescription(
- n.get(DESCRIPTION).getAsString()));
- }
+ list.getScenarios().add(new VTPTestScenario().setName(name).setDescription(
+ n.get(DESCRIPTION).getAsString()));
+ }
}
}
@@ -116,7 +134,7 @@ public class VTPScenarioResource extends VTPResource{
args.addAll(Arrays.asList(
PRODUCT_ARG, OPEN_CLI, "service-list", PRODUCT_ARG, scenario, FORMAT, "json"
- ));
+ ));
JsonElement results = null;
try {
@@ -129,14 +147,14 @@ public class VTPScenarioResource extends VTPResource{
if (results != null && results.isJsonArray() && results.getAsJsonArray().size()>0) {
JsonArray resultsArray = results.getAsJsonArray();
- for (Iterator<JsonElement> it = resultsArray.iterator(); it.hasNext();) {
- JsonElement jsonElement = it.next();
- JsonObject n = jsonElement.getAsJsonObject();
- if (n.entrySet().iterator().hasNext()) {
- list.getSuites().add(new VTPTestSuite().setName(n.get(SERVICE).getAsString()).setDescription(
- n.get(DESCRIPTION).getAsString()));
- }
+ for (Iterator<JsonElement> it = resultsArray.iterator(); it.hasNext();) {
+ JsonElement jsonElement = it.next();
+ JsonObject n = jsonElement.getAsJsonObject();
+ if (n.entrySet().iterator().hasNext()) {
+ list.getSuites().add(new VTPTestSuite().setName(n.get(SERVICE).getAsString()).setDescription(
+ n.get(DESCRIPTION).getAsString()));
}
+ }
}
return list;
@@ -161,7 +179,7 @@ public class VTPScenarioResource extends VTPResource{
args.addAll(Arrays.asList(
PRODUCT_ARG, OPEN_CLI, "schema-list", PRODUCT_ARG, scenario, FORMAT, "json"
- ));
+ ));
if (testSuiteName != null) {
args.add("--service");
args.add(testSuiteName);
@@ -178,15 +196,15 @@ public class VTPScenarioResource extends VTPResource{
if (results != null && results.isJsonArray() && results.getAsJsonArray().size()>0) {
JsonArray resultsArray = results.getAsJsonArray();
- for (Iterator<JsonElement> it = resultsArray.iterator(); it.hasNext();) {
- JsonElement jsonElement = it.next();
- JsonObject n = jsonElement.getAsJsonObject();
- if (n.entrySet().iterator().hasNext())
- list.getTestCases().add(
- new VTPTestCase().setTestCaseName(
- n.get("command").getAsString()).setTestSuiteName(
- n.get(SERVICE).getAsString()));
- }
+ for (Iterator<JsonElement> it = resultsArray.iterator(); it.hasNext();) {
+ JsonElement jsonElement = it.next();
+ JsonObject n = jsonElement.getAsJsonObject();
+ if (n.entrySet().iterator().hasNext())
+ list.getTestCases().add(
+ new VTPTestCase().setTestCaseName(
+ n.get("command").getAsString()).setTestSuiteName(
+ n.get(SERVICE).getAsString()));
+ }
}
return list;
@@ -201,9 +219,9 @@ public class VTPScenarioResource extends VTPResource{
message = "Failed to perform the operation",
response = VTPError.class) })
public Response listTestcases(
- @ApiParam("Test scenario name") @PathParam("scenario") String scenario,
- @ApiParam("Test suite name") @QueryParam("testSuiteName") String testSuiteName
- ) throws VTPException {
+ @ApiParam("Test scenario name") @PathParam("scenario") String scenario,
+ @ApiParam("Test suite name") @QueryParam("testSuiteName") String testSuiteName
+ ) throws VTPException {
return Response.ok(this.listTestcasesHandler(testSuiteName, scenario).getTestCases().toString(), MediaType.APPLICATION_JSON).build();
}
@@ -212,7 +230,7 @@ public class VTPScenarioResource extends VTPResource{
List<String> args = new ArrayList<>();
args.addAll(Arrays.asList(
PRODUCT_ARG, OPEN_CLI, "schema-show", PRODUCT_ARG, scenario, "--service", testSuiteName, "--command", testCaseName , FORMAT, "json"
- ));
+ ));
JsonElement results = null;
try {
results = this.makeRpcAndGetJson(args);
@@ -279,8 +297,148 @@ public class VTPScenarioResource extends VTPResource{
@ApiParam("Test scenario name") @PathParam("scenario") String scenario,
@ApiParam(value = "Test case name") @PathParam("testSuiteName") String testSuiteName,
@ApiParam(value = "Test case name") @PathParam("testCaseName") String testCaseName)
- throws VTPException {
+ throws VTPException {
return Response.ok(this.getTestcaseHandler(scenario, testSuiteName, testCaseName).toString(), MediaType.APPLICATION_JSON).build();
}
-}
+
+ @Path("/scenarios")
+ @POST
+ @ApiOperation(tags = "VTP Scenario", value = "Create Scenario")
+ @Consumes(MediaType.MULTIPART_FORM_DATA)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Failed to perform the operation", response = VTPError.class)})
+ public Response storageScenarios(@ApiParam(value = "file form data body parts", required = true)
+ @FormDataParam("files") List<FormDataBodyPart> bodyParts) throws VTPException {
+ bodyParts.forEach(bodyPart -> {
+ BodyPartEntity entity = (BodyPartEntity) bodyPart.getEntity();
+ String fileName = bodyPart.getContentDisposition().getFileName();
+ if (!ToolUtil.isYamlFile(new File(fileName))) {
+ LOG.error("The fileName {} is not yaml !!!", fileName);
+ return;
+ }
+ String scenario = fileName.substring(0, fileName.indexOf("-registry"));
+ File scenarioDir = new File(VTP_YAML_STORE, scenario);
+ File yamlFile = new File(VTP_YAML_STORE, fileName);
+
+ // 1、store the scenario yaml file and create the scenario dir
+ try {
+ FileUtils.deleteQuietly(yamlFile);
+ FileUtils.deleteDirectory(scenarioDir);
+ FileUtils.forceMkdir(scenarioDir);
+ FileUtils.copyInputStreamToFile(entity.getInputStream(), yamlFile);
+ } catch (IOException e) {
+ LOG.error("Save yaml {} failed", fileName, e);
+ }
+
+ // 2、create the testsuits dir and copy the testcase to current scenarios by commands
+ try {
+ Map<String, Object> yamlInfos = Maps.newHashMap();
+ try (FileReader fileReader = new FileReader(yamlFile)) {
+ yamlInfos = snakeYaml().load(fileReader);
+ }
+ for (Object service : (List) yamlInfos.get("services")) {
+ Map<String, Object> serviceMap = (Map<String, Object>) service;
+ String testsuite = serviceMap.get("name").toString();
+ File testsuiteDir = new File(scenarioDir, testsuite);
+ FileUtils.forceMkdir(testsuiteDir);
+ if (!serviceMap.containsKey("commands")) {
+ continue;
+ }
+ for (Object cmd : (List) serviceMap.get("commands")) {
+ File source = new File(VTP_YAML_STORE, cmd.toString().replaceAll("::", Matcher.quoteReplacement(File.separator)));
+ if (!source.isFile()) {
+ LOG.error("Source {} is not a yaml file !!!", source.getName());
+ continue;
+ }
+ File dest = new File(testsuiteDir, cmd.toString().substring(cmd.toString().lastIndexOf("::") + 2));
+ FileUtils.copyFile(source, dest);
+
+ // 3、modify the testcase scenario and testsuite
+ Map<String, Object> result = Maps.newHashMap();
+ try (FileReader fileReader = new FileReader(dest)) {
+ result = snakeYaml().load(fileReader);
+ }
+ Map<String, Object> info = (Map<String, Object>) result.get("info");
+ info.put("product", scenario);
+ info.put("service", testsuite);
+ try (FileWriter fileWriter = new FileWriter(dest)) {
+ snakeYaml().dump(result, fileWriter);
+ }
+ }
+ }
+ } catch (Exception e) {
+ LOG.error("Parse testcase yaml failed !!!", e);
+ }
+ });
+ return Response.ok("Save yaml success", MediaType.APPLICATION_JSON).build();
+ }
+
+
+ @Path("/scenarios/{scenarioName}")
+ @DELETE
+ @ApiOperation(tags = "VTP Scenario", value = "Delete yaml string")
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Failed to perform the operation", response = VTPError.class)})
+ public Response deleteScenario(@ApiParam("Test scenario yaml") @PathParam("scenarioName") String scenarioName) throws VTPException {
+ String scenario = scenarioName.substring(0, scenarioName.indexOf("-registry"));
+ File scenarioDir = new File(VTP_YAML_STORE, scenario);
+ List<File> yamls = FileUtil.searchFiles(scenarioDir, CommonConstant.YAML_SUFFIX);
+ if (!CollectionUtils.isEmpty(yamls)) {
+ LOG.error("The scenario yaml {} has sub testcase yamls, delete failed", scenarioName);
+ throw new VTPException(
+ new VTPError().setMessage(MessageFormat.format("The scenario yaml {0} has sub testcase yamls, delete failed !!!", scenarioName))
+ .setHttpStatus(HttpStatus.INTERNAL_SERVER_ERROR_500));
+ }
+
+ try {
+ FileUtils.deleteQuietly(new File(VTP_YAML_STORE, scenarioName));
+ FileUtils.deleteDirectory(scenarioDir);
+ } catch (IOException e) {
+ LOG.error("Delete scenario yaml {} failed", scenarioName, e);
+ throw new VTPException(
+ new VTPError().setMessage("Delete yaml failed !!!").setHttpStatus(HttpStatus.INTERNAL_SERVER_ERROR_500));
+ }
+ return Response.ok("Delete yaml success", MediaType.APPLICATION_JSON).build();
+ }
+
+ @Path("/testcases")
+ @POST
+ @ApiOperation(tags = "VTP Scenario", value = "Create test case")
+ @Consumes(MediaType.MULTIPART_FORM_DATA)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Failed to perform the operation", response = VTPError.class)})
+ public Response storageTestcases(@ApiParam(value = "file form data body parts", required = true)
+ @FormDataParam("files") List<FormDataBodyPart> bodyParts) throws VTPException {
+ bodyParts.forEach(bodyPart -> {
+ BodyPartEntity entity = (BodyPartEntity) bodyPart.getEntity();
+ String fileName = bodyPart.getContentDisposition().getFileName();
+ if (ToolUtil.isYamlFile(new File(fileName))) {
+ // 1、store the testcase yaml file
+ Map<String, Object> result = snakeYaml().load(entity.getInputStream());
+ Map<String, Object> info = (Map<String, Object>) result.get("info");
+
+ File yamlFile = new File(VTP_YAML_STORE, info.get("product") + File.separator + info.get("service") + File.separator + fileName);
+ try {
+ FileUtils.deleteQuietly(yamlFile);
+ FileUtils.copyInputStreamToFile(entity.getInputStream(), yamlFile);
+ } catch (IOException e) {
+ LOG.error("Save testcase yaml {} failed", yamlFile.getName(), e);
+ }
+ } else {
+ // 2、store the testcase script file
+ File scriptFile = new File(VTP_SCRIPT_STORE, fileName);
+ try {
+ FileUtils.deleteQuietly(scriptFile);
+ FileUtils.copyInputStreamToFile(entity.getInputStream(), scriptFile);
+ } catch (IOException e) {
+ LOG.error("Save testcase script {} failed", scriptFile.getName(), e);
+ }
+ }
+ });
+ return Response.ok("Save success", MediaType.APPLICATION_JSON).build();
+ }
+} \ No newline at end of file