Service Catalog - json schema reference 61/82361/3
authorakanshad <akansha.dua@amdocs.com>
Thu, 14 Mar 2019 12:49:26 +0000 (18:19 +0530)
committerakanshad <akansha.dua@amdocs.com>
Fri, 15 Mar 2019 11:35:41 +0000 (17:05 +0530)
Issue-ID: EXTAPI-105

Change-Id: I4877636508135a2f7a77dab86dbe6a126070e9ff
Signed-off-by: akanshad <akansha.dua@amdocs.com>
pom.xml
src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationDBManager.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationResource.java
src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationService.java
src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java
src/main/java/org/onap/nbi/apis/servicecatalog/model/ServiceSpecification.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/servicecatalog/model/SpecificationInputSchema.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/servicecatalog/repositories/ServiceSpecificationRepository.java [new file with mode: 0644]
src/main/java/org/onap/nbi/apis/servicecatalog/repositories/SpecificationInputSchemaRepository.java [new file with mode: 0644]
src/test/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessorTest.java
src/test/resources/karatetest/features/00--ServiceCatalog.feature

diff --git a/pom.xml b/pom.xml
index 790c5e7..f3e0ab4 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -7,8 +7,8 @@
        OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
        the specific language governing permissions and limitations under the License. -->
 <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xmlns="http://maven.apache.org/POM/4.0.0"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.onap.externalapi-nbi</groupId>
       <version>1.5.18</version>
     </dependency>
 
+    <!-- swagger core -->
+    <dependency>
+      <groupId>io.swagger</groupId>
+      <artifactId>swagger-core</artifactId>
+      <version>1.5.18</version>
+    </dependency>
+
     <!-- jackson -->
 
     <dependency>
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
-      <scope>test</scope>     
+      <scope>test</scope>
     </dependency>
 
     <!-- test h2 -->
         <configuration>
           <includes>
             <include>org/onap/nbi/test/KarateApiTest.java</include>
-             <include>org/onap/nbi/test/ExecutionTaskTest.java</include>
+            <include>org/onap/nbi/test/ExecutionTaskTest.java</include>
             <include>org/onap/nbi/test/ServiceOrderRepositoryTest.java</include>
             <include>org/onap/nbi/apis/servicecatalog/ToscaInfosProcessorTest.java</include>
           </includes>
         <artifactId>sonar-maven-plugin</artifactId>
         <version>3.2</version>
       </plugin>
-<!--       <plugin> -->
-<!--         <groupId>org.jacoco</groupId> -->
-<!--         <artifactId>jacoco-maven-plugin</artifactId> -->
-<!--         <version>0.8.1</version> -->
-<!--         <configuration> -->
-<!--           <dumpOnExit>true</dumpOnExit> -->
-<!--           <includes> -->
-<!--             <include>org.onap.nbi.*</include> -->
-<!--           </includes> -->
-<!--           <excludes> -->
-<!--             <exclude>**/model/**/*</exclude> -->
-<!--           </excludes> -->
-<!--         </configuration> -->
-<!--         <executions> -->
-<!--           <execution> -->
-<!--             <id>pre-unit-test</id> -->
-<!--             <goals> -->
-<!--               <goal>prepare-agent</goal> -->
-<!--             </goals> -->
-<!--             <configuration> -->
-<!--               <destFile>${project.build.directory}/coverage-reports/jacoco.exec</destFile> -->
-<!--               <append>true</append> -->
-<!--             </configuration> -->
-<!--           </execution> -->
-<!--           <execution> -->
-<!--             <id>pre-integration-test</id> -->
-<!--             <phase>pre-integration-test</phase> -->
-<!--             <goals> -->
-<!--               <goal>prepare-agent</goal> -->
-<!--             </goals> -->
-<!--             <configuration> -->
-<!--               <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile> -->
-<!--               <append>true</append> -->
-<!--             </configuration> -->
-<!--           </execution> -->
-<!--           <execution> -->
-<!--             <goals> -->
-<!--               <goal>merge</goal> -->
-<!--             </goals> -->
-<!--             <phase>post-integration-test</phase> -->
-<!--             <configuration> -->
-<!--               <fileSets> -->
-<!--                 <fileSet -->
-<!--                   implementation="org.apache.maven.shared.model.fileset.FileSet"> -->
-<!--                   <directory>${project.build.directory}/coverage-reports</directory> -->
-<!--                   <includes> -->
-<!--                     <include>*.exec</include> -->
-<!--                   </includes> -->
-<!--                 </fileSet> -->
-<!--               </fileSets> -->
-<!--               <destFile>${project.build.directory}/jacoco-dev.exec</destFile> -->
-<!--             </configuration> -->
-<!--           </execution> -->
-<!--         </executions> -->
-<!--       </plugin> -->
+      <!--       <plugin> -->
+      <!--         <groupId>org.jacoco</groupId> -->
+      <!--         <artifactId>jacoco-maven-plugin</artifactId> -->
+      <!--         <version>0.8.1</version> -->
+      <!--         <configuration> -->
+      <!--           <dumpOnExit>true</dumpOnExit> -->
+      <!--           <includes> -->
+      <!--             <include>org.onap.nbi.*</include> -->
+      <!--           </includes> -->
+      <!--           <excludes> -->
+      <!--             <exclude>**/model/**/*</exclude> -->
+      <!--           </excludes> -->
+      <!--         </configuration> -->
+      <!--         <executions> -->
+      <!--           <execution> -->
+      <!--             <id>pre-unit-test</id> -->
+      <!--             <goals> -->
+      <!--               <goal>prepare-agent</goal> -->
+      <!--             </goals> -->
+      <!--             <configuration> -->
+      <!--               <destFile>${project.build.directory}/coverage-reports/jacoco.exec</destFile> -->
+      <!--               <append>true</append> -->
+      <!--             </configuration> -->
+      <!--           </execution> -->
+      <!--           <execution> -->
+      <!--             <id>pre-integration-test</id> -->
+      <!--             <phase>pre-integration-test</phase> -->
+      <!--             <goals> -->
+      <!--               <goal>prepare-agent</goal> -->
+      <!--             </goals> -->
+      <!--             <configuration> -->
+      <!--               <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile> -->
+      <!--               <append>true</append> -->
+      <!--             </configuration> -->
+      <!--           </execution> -->
+      <!--           <execution> -->
+      <!--             <goals> -->
+      <!--               <goal>merge</goal> -->
+      <!--             </goals> -->
+      <!--             <phase>post-integration-test</phase> -->
+      <!--             <configuration> -->
+      <!--               <fileSets> -->
+      <!--                 <fileSet -->
+      <!--                   implementation="org.apache.maven.shared.model.fileset.FileSet"> -->
+      <!--                   <directory>${project.build.directory}/coverage-reports</directory> -->
+      <!--                   <includes> -->
+      <!--                     <include>*.exec</include> -->
+      <!--                   </includes> -->
+      <!--                 </fileSet> -->
+      <!--               </fileSets> -->
+      <!--               <destFile>${project.build.directory}/jacoco-dev.exec</destFile> -->
+      <!--             </configuration> -->
+      <!--           </execution> -->
+      <!--         </executions> -->
+      <!--       </plugin> -->
       <plugin>
         <artifactId>maven-source-plugin</artifactId>
         <executions>
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationDBManager.java b/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationDBManager.java
new file mode 100644 (file)
index 0000000..466611d
--- /dev/null
@@ -0,0 +1,87 @@
+/**
+ *     Copyright (c) 2019 Amdocs
+ *
+ *     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.
+ */
+package org.onap.nbi.apis.servicecatalog;
+
+import org.onap.nbi.apis.servicecatalog.model.ServiceSpecification;
+import org.onap.nbi.apis.servicecatalog.model.SpecificationInputSchema;
+import org.onap.nbi.apis.servicecatalog.repositories.ServiceSpecificationRepository;
+import org.onap.nbi.apis.servicecatalog.repositories.SpecificationInputSchemaRepository;
+import org.onap.nbi.exceptions.TechnicalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Optional;
+
+@Service
+public class ServiceSpecificationDBManager {
+
+    @Autowired
+    ServiceSpecificationRepository serviceSpecificationRepository;
+
+    @Autowired
+    SpecificationInputSchemaRepository specificationInputSchemaRepository;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ServiceSpecificationService.class);
+
+    public void saveCatalogResponse(LinkedHashMap serviceCatalogResponse) {
+
+        ServiceSpecification serviceSpecification = new ServiceSpecification();
+        serviceSpecification.setId((String) serviceCatalogResponse.get("id"));
+        serviceSpecification.setCatalogResponse(serviceCatalogResponse);
+        serviceSpecificationRepository.save(serviceSpecification);
+
+   }
+
+    public boolean checkServiceSpecExistence(String serviceSpecId) {
+
+        return serviceSpecificationRepository.existsById(serviceSpecId);
+    }
+
+    public Map getServiceSpecification(String serviceSpecId) {
+
+       Optional<ServiceSpecification> optionalServiceSpecification = serviceSpecificationRepository.findById(serviceSpecId);
+       if(!optionalServiceSpecification.isPresent()) {
+           throw new TechnicalException("Unable get service specification");
+       }else {
+           return  optionalServiceSpecification.get().getCatalogResponse();
+       }
+    }
+
+    public boolean checkInputSchemaExistence(String serviceSpecId) {
+        return  specificationInputSchemaRepository.existsById(serviceSpecId);
+    }
+
+    public String getInputSchema(String serviceSpecId) {
+        Optional<SpecificationInputSchema> optionalSpecificationInputSchema = specificationInputSchemaRepository.findById(serviceSpecId);
+        if(!optionalSpecificationInputSchema.isPresent()) {
+            throw new TechnicalException("Unable get specification input schema");
+        }else {
+            return  optionalSpecificationInputSchema.get().getSpecificationSchemaJson();
+        }
+    }
+
+    public void saveSpecificationInputSchema(String svcCharacteristicsJson, Map serviceCatalogResponse) {
+            SpecificationInputSchema specificationInputSchema = new SpecificationInputSchema();
+            specificationInputSchema.setId((String) serviceCatalogResponse.get("id"));
+            specificationInputSchema.setSpecificationSchemaJson(svcCharacteristicsJson);
+            specificationInputSchemaRepository.save(specificationInputSchema);
+
+    }
+}
index e8ef9e3..6484672 100644 (file)
@@ -40,7 +40,7 @@ public class ServiceSpecificationResource extends ResourceManagement {
 
     @GetMapping(value = "/{serviceSpecId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public ResponseEntity<Object> getServiceSpecification(@PathVariable String serviceSpecId,
-            @RequestParam MultiValueMap<String, String> params) {
+                                                          @RequestParam MultiValueMap<String, String> params) {
         Map response = serviceSpecificationService.get(serviceSpecId);
         JsonRepresentation filter = new JsonRepresentation(params);
         if (response.get("serviceSpecCharacteristic") != null) {
@@ -58,4 +58,12 @@ public class ServiceSpecificationResource extends ResourceManagement {
         return this.findResponse(response, filter, null);
     }
 
+    @GetMapping(value = "/{serviceSpecId}/specificationInputSchema", produces =  MediaType.APPLICATION_JSON_VALUE)
+    public ResponseEntity<Object> findSpecificationInputSchema(@PathVariable String serviceSpecId,
+                                                               @RequestParam MultiValueMap<String,String> params) {
+        String response = serviceSpecificationService.getInputSchema(serviceSpecId);
+        JsonRepresentation filter = new JsonRepresentation(params);
+        return this.getResponse(response, filter);
+    }
+
 }
index 5e3e4cf..8f0829b 100644 (file)
@@ -50,33 +50,39 @@ public class ServiceSpecificationService {
   @Autowired
   private ServiceCatalogUrl serviceCatalogUrl;
 
+  @Autowired
+  ServiceSpecificationDBManager serviceSpecificationDBManager;
 
   private static final Logger LOGGER = LoggerFactory.getLogger(ServiceSpecificationService.class);
 
-
   public Map get(String serviceSpecId) {
-    Map sdcResponse = sdcClient.callGet(serviceSpecId);
-    LinkedHashMap serviceCatalogResponse =
-        (LinkedHashMap) getServiceSpecJsonTransformer.transform(sdcResponse);
-    String toscaModelUrl = (String) sdcResponse.get("toscaModelURL");
-    String serviceId = (String) sdcResponse.get("id");
-    File toscaFile = sdcClient.callGetWithAttachment(toscaModelUrl);
-    Path pathToToscaCsar = toscaFile.toPath().toAbsolutePath();
-    try {
-      toscaInfosProcessor.buildResponseWithSdcToscaParser(pathToToscaCsar, serviceCatalogResponse);
-    } catch (SdcToscaParserException e) {
-      LOGGER.debug("unable to build response from tosca csar using sdc-parser, partial response : "
-          + pathToToscaCsar.toString() + " " + e.getMessage());
-    }
-    try {
-      if (toscaFile != null) {
-        LOGGER.debug("deleting tosca archive : " + toscaFile.getName());
-        FileUtils.forceDelete(toscaFile);
+    if(serviceSpecificationDBManager.checkServiceSpecExistence(serviceSpecId)) {
+      return serviceSpecificationDBManager.getServiceSpecification(serviceSpecId);
+    }else {
+      Map sdcResponse = sdcClient.callGet(serviceSpecId);
+      LinkedHashMap serviceCatalogResponse =
+              (LinkedHashMap) getServiceSpecJsonTransformer.transform(sdcResponse);
+      String toscaModelUrl = (String) sdcResponse.get("toscaModelURL");
+      String serviceId = (String) sdcResponse.get("id");
+      File toscaFile = sdcClient.callGetWithAttachment(toscaModelUrl);
+      Path pathToToscaCsar = toscaFile.toPath().toAbsolutePath();
+      try {
+        toscaInfosProcessor.buildAndSaveResponseWithSdcToscaParser(pathToToscaCsar, serviceCatalogResponse);
+        serviceSpecificationDBManager.saveCatalogResponse(serviceCatalogResponse);
+      } catch (SdcToscaParserException e) {
+        LOGGER.debug("unable to build response from tosca csar using sdc-parser, partial response : "
+                + pathToToscaCsar.toString() + " " + e.getMessage());
+      }
+      try {
+        if (toscaFile != null) {
+          LOGGER.debug("deleting tosca archive : " + toscaFile.getName());
+          FileUtils.forceDelete(toscaFile);
+        }
+      } catch (IOException e) {
+        LOGGER.error("unable to delete temp directory tosca file for id : " + serviceId, e);
       }
-    } catch (IOException e) {
-      LOGGER.error("unable to delete temp directory tosca file for id : " + serviceId, e);
+      return serviceCatalogResponse;
     }
-    return serviceCatalogResponse;
   }
 
   public List<LinkedHashMap> find(MultiValueMap<String, String> parametersMap) {
@@ -87,4 +93,11 @@ public class ServiceSpecificationService {
     }
     return serviceCatalogResponse;
   }
+  public String getInputSchema(String serviceSpecId) {
+    if(serviceSpecificationDBManager.checkInputSchemaExistence(serviceSpecId)) {
+      return serviceSpecificationDBManager.getInputSchema(serviceSpecId);
+    } else {
+      return null;
+    }
+  }
 }
index fff4444..fc0494f 100644 (file)
 package org.onap.nbi.apis.servicecatalog;
 
 import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+
+import io.swagger.util.Json;
 import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
 import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException;
 import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory;
@@ -29,6 +28,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import io.swagger.models.Model;
+import io.swagger.models.ModelImpl;
+import io.swagger.models.properties.Property;
+import io.swagger.models.properties.PropertyBuilder;
 
 @Service
 public class ToscaInfosProcessor {
@@ -36,14 +39,15 @@ public class ToscaInfosProcessor {
   @Autowired
   SdcClient sdcClient;
 
+  @Autowired
+  private ServiceSpecificationDBManager serviceSpecificationDBManager;
+
   final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
 
   private static final Logger LOGGER = LoggerFactory.getLogger(ToscaInfosProcessor.class);
 
-
-
   public void buildResponseWithSdcToscaParser(Path path, Map serviceCatalogResponse)
-      throws SdcToscaParserException {
+          throws SdcToscaParserException {
 
     SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();
     ISdcCsarHelper sdcCsarHelper = factory.getSdcCsarHelper(path.toFile().getAbsolutePath(), false);
@@ -62,7 +66,7 @@ public class ToscaInfosProcessor {
         // If this Input has a default value, then put it in serviceSpecCharacteristicValue
         if (input.getDefault() != null) {
           List<LinkedHashMap> serviceSpecCharacteristicValues =
-              buildServiceSpecCharacteristicsValuesFromSdc(input);
+                  buildServiceSpecCharacteristicsValuesFromSdc(input);
           mapParameter.put("serviceSpecCharacteristicValue", serviceSpecCharacteristicValues);
         }
         serviceSpecCharacteristic.add(mapParameter);
@@ -72,7 +76,7 @@ public class ToscaInfosProcessor {
     List<NodeTemplate> nodeTemplates = sdcCsarHelper.getServiceNodeTemplates();
 
     List<LinkedHashMap> resourceSpecifications =
-        (List<LinkedHashMap>) serviceCatalogResponse.get("resourceSpecification");
+            (List<LinkedHashMap>) serviceCatalogResponse.get("resourceSpecification");
     for (LinkedHashMap resourceSpecification : resourceSpecifications) {
       if (resourceSpecification.get("id") != null) {
         String id = (String) resourceSpecification.get("id");
@@ -87,12 +91,11 @@ public class ToscaInfosProcessor {
         if (nodeTemplate == null)
           continue;
         resourceSpecification.put("modelCustomizationId",
-            sdcCsarHelper.getNodeTemplateCustomizationUuid(nodeTemplate));
+                sdcCsarHelper.getNodeTemplateCustomizationUuid(nodeTemplate));
       }
     }
   }
 
-
   private List<LinkedHashMap> buildServiceSpecCharacteristicsValuesFromSdc(Input input) {
 
     List<LinkedHashMap> serviceSpecCharacteristicValues = new ArrayList<>();
@@ -106,4 +109,67 @@ public class ToscaInfosProcessor {
     return serviceSpecCharacteristicValues;
   }
 
+  public void buildAndSaveResponseWithSdcToscaParser(Path path, Map serviceCatalogResponse) throws SdcToscaParserException {
+
+    SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();
+    ISdcCsarHelper sdcCsarHelper = factory.getSdcCsarHelper(path.toFile().getAbsolutePath(), false);
+    List<Input> inputs = sdcCsarHelper.getServiceInputs();
+
+    Map<String, Model> definitions = new HashMap<String,Model>();
+    Model model = new ModelImpl();
+
+    if (inputs != null && inputs.size() > 0) {
+      for (Input input : inputs) {
+        Property property = PropertyBuilder.build(input.getType(), null, null);
+        property.setDescription(input.getDescription());
+        property.setRequired(input.isRequired());
+
+        if (input.getDefault() != null) {
+          property.setDefault(input.getDefault().toString());
+        }
+        ((ModelImpl) model).addProperty(input.getName(), property);
+      }
+      definitions.put("ServiceCharacteristics", model);
+
+    }
+
+    String svcCharacteristicsJson = Json.pretty(definitions);
+    serviceSpecificationDBManager.saveSpecificationInputSchema(svcCharacteristicsJson,serviceCatalogResponse);
+
+    LinkedHashMap inputSchemaRef = new LinkedHashMap();
+    inputSchemaRef.put("valueType","Object");
+    inputSchemaRef.put("@schemaLocation","/serviceSpecification/"+serviceCatalogResponse.get("id")+"/specificationInputSchema");
+    inputSchemaRef.put("@type",serviceCatalogResponse.get("name") + "_ServiceCharacteristic");
+
+    LinkedHashMap serviceSpecCharacteristic = new LinkedHashMap();
+    serviceSpecCharacteristic.put("name",serviceCatalogResponse.get("name") + "_ServiceCharacteristics");
+    serviceSpecCharacteristic.put("description","This object describes all the inputs needed from the client to interact with the " + serviceCatalogResponse.get("name") + " Service Topology");
+    serviceSpecCharacteristic.put("valueType", "Object");
+    serviceSpecCharacteristic.put("@type","ONAPServiceCharacteristic");
+    serviceSpecCharacteristic.put("@schemaLocation", "null");
+    serviceSpecCharacteristic.put("serviceSpecCharacteristicValue",inputSchemaRef);
+
+    serviceCatalogResponse.put("serviceSpecCharacteristic",serviceSpecCharacteristic);
+
+    List<NodeTemplate> nodeTemplates = sdcCsarHelper.getServiceNodeTemplates();
+    List<LinkedHashMap> resourceSpecifications =
+            (List<LinkedHashMap>) serviceCatalogResponse.get("resourceSpecification");
+    for (LinkedHashMap resourceSpecification : resourceSpecifications) {
+      if (resourceSpecification.get("id") != null) {
+        String id = (String) resourceSpecification.get("id");
+        LOGGER.debug("get tosca infos for service id: {}", id);
+        NodeTemplate nodeTemplate = null;
+        for (NodeTemplate node : nodeTemplates) {
+          if (node.getMetaData().getValue("UUID").equals(id)) {
+            nodeTemplate = node;
+            break;
+          }
+        }
+        if (nodeTemplate == null)
+          continue;
+        resourceSpecification.put("modelCustomizationId", sdcCsarHelper.getNodeTemplateCustomizationUuid(nodeTemplate));
+      }
+    }
+  }
+
 }
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/model/ServiceSpecification.java b/src/main/java/org/onap/nbi/apis/servicecatalog/model/ServiceSpecification.java
new file mode 100644 (file)
index 0000000..c88cc65
--- /dev/null
@@ -0,0 +1,56 @@
+/**
+ *     Copyright (c) 2019 Amdocs
+ *
+ *     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.
+ */
+package org.onap.nbi.apis.servicecatalog.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.nbi.commons.Resource;
+import org.springframework.data.annotation.Id;
+
+import java.util.Map;
+
+@ApiModel
+public class ServiceSpecification implements Resource {
+
+    @Id
+    @JsonProperty("id")
+    private String id = null;
+
+    @JsonProperty("catalogResponse")
+    private Map catalogResponse = null;
+
+    @Override
+    @JsonProperty("id")
+    @ApiModelProperty(required = true, value = "uuid for the service specification")
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @JsonProperty("catalogResponse")
+    @ApiModelProperty(required = true, value = "catalogResponse for the corresponding service uuid")
+    public Map getCatalogResponse() {
+        return catalogResponse;
+    }
+
+    public void setCatalogResponse(Map catalogResponse) {
+        this.catalogResponse = catalogResponse;
+    }
+}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/model/SpecificationInputSchema.java b/src/main/java/org/onap/nbi/apis/servicecatalog/model/SpecificationInputSchema.java
new file mode 100644 (file)
index 0000000..e4e85d7
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ *     Copyright (c) 2019 Amdocs
+ *
+ *     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.
+ */
+package org.onap.nbi.apis.servicecatalog.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.nbi.commons.Resource;
+import org.springframework.data.annotation.Id;
+
+@ApiModel
+ public class SpecificationInputSchema implements Resource {
+
+
+        @Id
+        @JsonProperty("id")
+        private String id = null;
+
+        @JsonProperty("schema")
+        private String specificationSchemaJson = null;
+
+        @Override
+        @JsonProperty("id")
+        @ApiModelProperty(required = true, value = "uuid for the specification input schema")
+        public String getId() {
+            return id;
+        }
+        public void setId(String id) {
+            this.id = id;
+        }
+
+        @JsonProperty("schema")
+        @ApiModelProperty(required = true, value = "Input schema for the service")
+        public String getSpecificationSchemaJson() {
+            return specificationSchemaJson;
+        }
+
+        public void setSpecificationSchemaJson(String specificationSchemaJson) {
+            this.specificationSchemaJson = specificationSchemaJson;
+        }
+}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/repositories/ServiceSpecificationRepository.java b/src/main/java/org/onap/nbi/apis/servicecatalog/repositories/ServiceSpecificationRepository.java
new file mode 100644 (file)
index 0000000..f46e008
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ *     Copyright (c) 2019 Amdocs
+ *
+ *     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.
+ */
+package org.onap.nbi.apis.servicecatalog.repositories;
+
+import org.onap.nbi.apis.servicecatalog.model.ServiceSpecification;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+public interface ServiceSpecificationRepository extends MongoRepository<ServiceSpecification, String> {
+}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/repositories/SpecificationInputSchemaRepository.java b/src/main/java/org/onap/nbi/apis/servicecatalog/repositories/SpecificationInputSchemaRepository.java
new file mode 100644 (file)
index 0000000..56adbd3
--- /dev/null
@@ -0,0 +1,24 @@
+/**
+ *     Copyright (c) 2019 Amdocs
+ *
+ *     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.
+ */
+package org.onap.nbi.apis.servicecatalog.repositories;
+
+import org.onap.nbi.apis.servicecatalog.model.SpecificationInputSchema;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+public interface SpecificationInputSchemaRepository extends MongoRepository<SpecificationInputSchema, String> {
+
+
+}
index 8849607..68a955f 100644 (file)
@@ -20,26 +20,35 @@ import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.onap.nbi.exceptions.TechnicalException;
 import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
 
 
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
+@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
+@ActiveProfiles("test")
 public class ToscaInfosProcessorTest {
 
+  @Autowired
+  ToscaInfosProcessor toscaInfosProcessor;
   final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
 
-  ToscaInfosProcessor toscaInfosProcessor = new ToscaInfosProcessor();
-
-
 
   @Test
   public void buildResponseWithSdcToscaParser() {
 
     ClassLoader classLoader = getClass().getClassLoader();
     Path path = new File(
-        classLoader.getResource("toscafile/service-Sdwanvpninfraservice-csar.csar").getFile())
+            classLoader.getResource("toscafile/service-Sdwanvpninfraservice-csar.csar").getFile())
             .toPath().toAbsolutePath();
     List<LinkedHashMap> resources = new ArrayList<>();
     LinkedHashMap resource1 = new LinkedHashMap();
@@ -55,22 +64,22 @@ public class ToscaInfosProcessorTest {
       toscaInfosProcessor.buildResponseWithSdcToscaParser(path, response);
     } catch (SdcToscaParserException e) {
       throw new TechnicalException("unable to build response from tosca csar using sdc-parser : "
-          + path.toString() + " " + e.getMessage());
+              + path.toString() + " " + e.getMessage());
     }
     resources = (List<LinkedHashMap>) response.get("resourceSpecification");
     List<LinkedHashMap> serviceSpecCharacteristic = new ArrayList<>();
     serviceSpecCharacteristic = (List<LinkedHashMap>) response.get("serviceSpecCharacteristic");
     assertThat(serviceSpecCharacteristic.get(0).get("name"))
-        .isEqualTo("sdwanconnectivity0_topology");
+            .isEqualTo("sdwanconnectivity0_topology");
     assertThat(serviceSpecCharacteristic.get(1).get("valueType")).isEqualTo("string");
     assertThat(serviceSpecCharacteristic.get(0).get("required")).isEqualTo(true);
     assertThat(serviceSpecCharacteristic.get(1).get("name")).isEqualTo("sdwanconnectivity0_name");
     assertThat(serviceSpecCharacteristic.get(1).get("valueType")).isEqualTo("string");
     assertThat(serviceSpecCharacteristic.get(1).get("required")).isEqualTo(true);
     assertThat(resources.get(0).get("modelCustomizationId"))
-        .isEqualTo("94ec574b-2306-4cbd-8214-09662b040f73");
+            .isEqualTo("94ec574b-2306-4cbd-8214-09662b040f73");
     assertThat(resources.get(1).get("modelCustomizationId"))
-        .isEqualTo("a7baba5d-6ac3-42b5-b47d-070841303ab1");
+            .isEqualTo("a7baba5d-6ac3-42b5-b47d-070841303ab1");
 
   }
 
@@ -79,7 +88,7 @@ public class ToscaInfosProcessorTest {
 
     ClassLoader classLoader = getClass().getClassLoader();
     Path path = new File(
-        classLoader.getResource("toscafile/service-Sotnvpninfraservice-csar.csar").getFile())
+            classLoader.getResource("toscafile/service-Sotnvpninfraservice-csar.csar").getFile())
             .toPath().toAbsolutePath();
     List<LinkedHashMap> resources = new ArrayList<>();
     LinkedHashMap resource1 = new LinkedHashMap();
@@ -95,15 +104,15 @@ public class ToscaInfosProcessorTest {
       toscaInfosProcessor.buildResponseWithSdcToscaParser(path, response);
     } catch (SdcToscaParserException e) {
       throw new TechnicalException("unable to build response from tosca csar using sdc-parser : "
-          + path.toString() + " " + e.getMessage());
+              + path.toString() + " " + e.getMessage());
     }
     resources = (List<LinkedHashMap>) response.get("resourceSpecification");
     List<LinkedHashMap> serviceSpecCharacteristic = new ArrayList<>();
     serviceSpecCharacteristic = (List<LinkedHashMap>) response.get("serviceSpecCharacteristic");
     assertThat(resources.get(0).get("modelCustomizationId"))
-        .isEqualTo("b44071c8-04fd-4d6b-b6af-772cbfaa1129");
+            .isEqualTo("b44071c8-04fd-4d6b-b6af-772cbfaa1129");
     assertThat(resources.get(1).get("modelCustomizationId"))
-        .isEqualTo("c3612284-6c67-4d8c-8b41-b699cc90e76d");
+            .isEqualTo("c3612284-6c67-4d8c-8b41-b699cc90e76d");
     assertThat(serviceSpecCharacteristic.get(12).get("serviceSpecCharacteristicValue")).isNull();
     assertThat(serviceSpecCharacteristic.get(13).get("serviceSpecCharacteristicValue")).isNotNull();
   }
@@ -113,7 +122,7 @@ public class ToscaInfosProcessorTest {
 
     ClassLoader classLoader = getClass().getClassLoader();
     Path path = new File(
-        classLoader.getResource("toscafile/service-Sdwanvpninfraservice-csar.csar").getFile())
+            classLoader.getResource("toscafile/service-Sdwanvpninfraservice-csar.csar").getFile())
             .toPath().toAbsolutePath();
     List<LinkedHashMap> resources = new ArrayList<>();
     LinkedHashMap resource1 = new LinkedHashMap();
@@ -129,13 +138,13 @@ public class ToscaInfosProcessorTest {
       toscaInfosProcessor.buildResponseWithSdcToscaParser(path, response);
     } catch (SdcToscaParserException e) {
       throw new TechnicalException("unable to build response from tosca csar using sdc-parser : "
-          + path.toString() + " " + e.getMessage());
+              + path.toString() + " " + e.getMessage());
     }
     resources = (List<LinkedHashMap>) response.get("resourceSpecification");
     List<LinkedHashMap> serviceSpecCharacteristic = new ArrayList<>();
     serviceSpecCharacteristic = (List<LinkedHashMap>) response.get("serviceSpecCharacteristic");
     assertThat(serviceSpecCharacteristic.get(0).get("name"))
-        .isEqualTo("sdwanconnectivity0_topology");
+            .isEqualTo("sdwanconnectivity0_topology");
     assertThat(serviceSpecCharacteristic.get(1).get("valueType")).isEqualTo("string");
     assertThat(serviceSpecCharacteristic.get(0).get("required")).isEqualTo(true);
     assertThat(serviceSpecCharacteristic.get(1).get("name")).isEqualTo("sdwanconnectivity0_name");
@@ -146,4 +155,46 @@ public class ToscaInfosProcessorTest {
     assertThat(resources.get(1).get("modelCustomizationId")).isNull();
 
   }
+
+  @Test
+  public void testBuildAndSaveResponseWithSdcToscaParser() {
+
+    ClassLoader classLoader = getClass().getClassLoader();
+    Path path = new File(classLoader.getResource("toscafile/service-Sotnvpninfraservice-csar.csar").getFile()).toPath().toAbsolutePath();
+
+    LinkedHashMap response = new LinkedHashMap();
+    response.put("version", "1.0");
+    response.put("name", "Service_vMME");
+    response.put("description", "some service characteristics schema");
+    response.put("id", "7f5e5139-768d-4410-a871-c41430785214");
+
+    List<LinkedHashMap> resources = new ArrayList<>();
+    LinkedHashMap resource1 = new LinkedHashMap();
+    resource1.put("id", "7baa7742-3a13-4288-8330-868015adc340");
+    resources.add(resource1);
+    LinkedHashMap resource2 = new LinkedHashMap();
+    resource2.put("id", "81b9430b-8abe-45d6-8bf9-f41a8f5c735f");
+    resources.add(resource2);
+
+    response.put("resourceSpecification", resources);
+
+    LinkedHashMap serviceSpecCharacteristicValue = new LinkedHashMap();
+    serviceSpecCharacteristicValue.put("valueType","Object");
+    serviceSpecCharacteristicValue.put("@schemaLocation","/serviceSpecification/7f5e5139-768d-4410-a871-c41430785214/specificationInputSchema");
+    serviceSpecCharacteristicValue.put("@type","Service_vMME_ServiceCharacteristic");
+
+    LinkedHashMap serviceSpecCharacteristic = new LinkedHashMap();
+    serviceSpecCharacteristic.put("name","Service_vMME_ServiceCharacteristics");
+    serviceSpecCharacteristic.put("description", "This object describes all the inputs needed from the client to interact with the Service_vMME Service Topology");
+    serviceSpecCharacteristic.put("valueType","Object");
+    serviceSpecCharacteristic.put("@type","ONAPServiceCharacteristic");
+    serviceSpecCharacteristic.put("@schemaLocation","null");
+    serviceSpecCharacteristic.put("serviceSpecCharacteristicValue",serviceSpecCharacteristicValue);
+    try {
+      toscaInfosProcessor.buildAndSaveResponseWithSdcToscaParser(path, response);
+    } catch (SdcToscaParserException ex) {
+      throw new TechnicalException("unable to build response " + ex.getMessage());
+    }
+    assertThat(response.get("serviceSpecCharacteristic")).isEqualTo(serviceSpecCharacteristic);
+  }
 }
index 2a40526..27807ac 100644 (file)
@@ -23,7 +23,22 @@ Given path 'serviceSpecification','462f84e5-f0e5-44c5-ab95-38fb4bf77064'
 When method get
 Then status 200
 And match $ contains { id : '462f84e5-f0e5-44c5-ab95-38fb4bf77064' , name : 'vFW' , invariantUUID : 'b58a118e-eeb9-4f6e-bdca-e292f84d17df' , toscaModelURL : '/sdc/v1/catalog/services/462f84e5-f0e5-44c5-ab95-38fb4bf77064/toscaModel' , distributionStatus : 'DISTRIBUTED' , version : '2.0' , lifecycleStatus : 'CERTIFIED' , @type : 'ONAPservice' , attachment : '#array' , relatedParty : '#notnull' , resourceSpecification : '#array' }
-And match $.serviceSpecCharacteristic[0] contains { name : 'sdwanconnectivity0_topology', description : 'full mesh, hub-spoke', valueType : 'string', required : '#boolean', serviceSpecCharacteristicValue : '#null' }
+And match $.serviceSpecCharacteristic contains
+"""
+{
+    name : 'vFW_ServiceCharacteristics',
+    description : 'This object describes all the inputs needed from the client to interact with the vFW Service Topology',
+    valueType : 'Object',
+    @type : 'ONAPServiceCharacteristic',
+    @schemaLocation : 'null',
+    serviceSpecCharacteristicValue :
+    {
+       valueType : 'Object',
+       @schemaLocation : '/serviceSpecification/462f84e5-f0e5-44c5-ab95-38fb4bf77064/specificationInputSchema',
+       @type : 'vFW_ServiceCharacteristic',
+    }
+}
+"""
 
 Scenario: findServiceCatalog
 Given path 'serviceSpecification'