Add data persistence 55/103555/3
authorDan Timoney <dtimoney@att.com>
Wed, 11 Mar 2020 19:54:10 +0000 (15:54 -0400)
committerDan Timoney <dtimoney@att.com>
Thu, 12 Mar 2020 15:34:33 +0000 (11:34 -0400)
Add code to persist MD-SAL data (test-results)

Change-Id: I2c6d3e94e9e46ccbfad479c6d89507ec37939496
Issue-ID: CCSDK-2096
Signed-off-by: Dan Timoney <dtimoney@att.com>
sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/App.java
sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/data/TestResultConfig.java [new file with mode: 0644]
sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/data/TestResultOperational.java [new file with mode: 0644]
sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/data/TestResultsConfigRepository.java [new file with mode: 0644]
sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/data/TestResultsOperationalRepository.java [new file with mode: 0644]
sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/swagger/RestconfApiController.java
sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/core/ServletFilters.java
sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/core/WebConfig.java
sliapi/springboot/src/main/resources/application.properties
sliapi/springboot/src/test/java/org/onap/ccsdk/sli/core/sliapi/springboot/RestconfApiControllerTest.java

index 67f5491..ed3ee04 100644 (file)
@@ -22,8 +22,13 @@ package org.onap.ccsdk.sli.core.sliapi.springboot;
 \r
 import org.springframework.boot.SpringApplication;\r
 import org.springframework.boot.autoconfigure.SpringBootApplication;\r
+import org.springframework.context.annotation.ComponentScan;\r
+import springfox.documentation.swagger2.annotations.EnableSwagger2;\r
 \r
 @SpringBootApplication\r
+@EnableSwagger2\r
+@ComponentScan(basePackages = { "org.onap.ccsdk.sli.core.sliapi.springboot.*" })\r
+\r
 public class App {\r
 \r
   public static void main(String[] args) throws Exception {\r
diff --git a/sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/data/TestResultConfig.java b/sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/data/TestResultConfig.java
new file mode 100644 (file)
index 0000000..f8ed1b4
--- /dev/null
@@ -0,0 +1,50 @@
+package org.onap.ccsdk.sli.core.sliapi.springboot.controllers.data;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+@Entity
+public class TestResultConfig {
+
+
+    @Id
+    @GeneratedValue(strategy= GenerationType.AUTO)
+    private Long id;
+
+    private String testIdentifier;
+    private String results;
+
+    public TestResultConfig()
+    {
+
+    }
+    public TestResultConfig(String testIdentifier, String results) {
+        this.testIdentifier = testIdentifier;
+        this.results = results;
+    }
+
+    public String getTestIdentifier() {
+        return testIdentifier;
+    }
+
+    public void setTestIdentifier(String testIdentifier) {
+        this.testIdentifier = testIdentifier;
+    }
+
+    public String getResults() {
+        return results;
+    }
+
+    public void setResults(String results) {
+        this.results = results;
+    }
+
+
+
+
+}
diff --git a/sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/data/TestResultOperational.java b/sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/data/TestResultOperational.java
new file mode 100644 (file)
index 0000000..4c3709e
--- /dev/null
@@ -0,0 +1,51 @@
+package org.onap.ccsdk.sli.core.sliapi.springboot.controllers.data;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+@Entity
+public class TestResultOperational {
+
+
+    @Id
+    @GeneratedValue(strategy= GenerationType.AUTO)
+    private Long id;
+
+    private String testIdentifier;
+    private String results;
+
+    public TestResultOperational()
+    {
+
+    }
+
+    public TestResultOperational(String testIdentifier, String results) {
+        this.testIdentifier = testIdentifier;
+        this.results = results;
+    }
+
+    public String getTestIdentifier() {
+        return testIdentifier;
+    }
+
+    public void setTestIdentifier(String testIdentifier) {
+        this.testIdentifier = testIdentifier;
+    }
+
+    public String getResults() {
+        return results;
+    }
+
+    public void setResults(String results) {
+        this.results = results;
+    }
+
+
+
+
+}
diff --git a/sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/data/TestResultsConfigRepository.java b/sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/data/TestResultsConfigRepository.java
new file mode 100644 (file)
index 0000000..1a73b3f
--- /dev/null
@@ -0,0 +1,12 @@
+package org.onap.ccsdk.sli.core.sliapi.springboot.controllers.data;
+
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.List;
+
+public interface TestResultsConfigRepository extends CrudRepository<TestResultConfig, Long> {
+
+    List<TestResultConfig> findByTestIdentifier(String testIdentifier);
+
+
+}
diff --git a/sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/data/TestResultsOperationalRepository.java b/sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/controllers/data/TestResultsOperationalRepository.java
new file mode 100644 (file)
index 0000000..d81c02b
--- /dev/null
@@ -0,0 +1,12 @@
+package org.onap.ccsdk.sli.core.sliapi.springboot.controllers.data;
+
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.List;
+
+public interface TestResultsOperationalRepository extends CrudRepository<TestResultOperational, Long> {
+
+    List<TestResultOperational> findByTestIdentifier(String testIdentifier);
+
+
+}
index 2972cd7..aa9a9d7 100644 (file)
 
 package org.onap.ccsdk.sli.core.sliapi.springboot.controllers.swagger;
 
-import java.util.Map;
-import java.util.Optional;
-import java.util.Properties;
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
 import org.onap.ccsdk.sli.core.sli.SvcLogicException;
 import org.onap.ccsdk.sli.core.sli.provider.base.SvcLogicServiceBase;
 import org.onap.ccsdk.sli.core.sliapi.model.ExecuteGraphInput;
 import org.onap.ccsdk.sli.core.sliapi.model.ResponseFields;
-import org.onap.ccsdk.sli.core.sliapi.springboot.controllers.swagger.RestconfApi;
+import org.onap.ccsdk.sli.core.sliapi.model.TestResult;
+import org.onap.ccsdk.sli.core.sliapi.model.TestResults;
+import org.onap.ccsdk.sli.core.sliapi.springboot.controllers.data.TestResultConfig;
+import org.onap.ccsdk.sli.core.sliapi.springboot.controllers.data.TestResultsConfigRepository;
+import org.onap.ccsdk.sli.core.sliapi.springboot.controllers.data.TestResultsOperationalRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.annotation.ComponentScan;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.util.*;
 
 @javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-02-20T12:50:11.207-05:00")
 
 @Controller
+@ComponentScan(basePackages = {"org.onap.ccsdk.sli.core.sliapi.springboot.*"})
+@EntityScan("org.onap.ccsdk.sli.core.sliapi.springboot.*")
 public class RestconfApiController implements RestconfApi {
 
        private final ObjectMapper objectMapper;
        private final HttpServletRequest request;
 
-  @Autowired
-  protected SvcLogicServiceBase svc;
+    @Autowired
+    protected SvcLogicServiceBase svc;
+
+    @Autowired
+       private TestResultsConfigRepository testResultsConfigRepository;
+
+    @Autowired
+       private TestResultsOperationalRepository testResultsOperationalRepository;
+
        private static final Logger log = LoggerFactory.getLogger(RestconfApiController.class);
 
        @org.springframework.beans.factory.annotation.Autowired
@@ -175,6 +190,158 @@ public class RestconfApiController implements RestconfApi {
                }
        }
 
+       @Override
+       public ResponseEntity<Void> deleteTestResult(String testIdentifier) {
+
+               List<TestResultConfig> testResultConfigs = testResultsConfigRepository.findByTestIdentifier(testIdentifier);
+
+               if (testResultConfigs != null) {
+                       Iterator<TestResultConfig> testResultConfigIterator = testResultConfigs.iterator();
+                       while (testResultConfigIterator.hasNext()) {
+                               testResultsConfigRepository.delete(testResultConfigIterator.next());
+                       }
+               }
+
+               return (new ResponseEntity<>(HttpStatus.OK));
+       }
+
+       @Override
+       public ResponseEntity<Void> deleteTestResults() {
+
+               testResultsConfigRepository.deleteAll();
+
+               return (new ResponseEntity<>(HttpStatus.OK));
+       }
+
+       @Override
+       public ResponseEntity<TestResults> gETTestResults() {
+
+               TestResults results = new TestResults();
+
+               testResultsOperationalRepository.findAll().forEach(testResult -> {
+                       TestResult item = null;
+                       try {
+                               item = objectMapper.readValue(testResult.getResults(), TestResult.class);
+                               results.addTestResultsItem(item);
+                       } catch (JsonProcessingException e) {
+                               log.error("Could not convert testResult", e);
+                       }
+               });
+
+
+               return new ResponseEntity<>(results, HttpStatus.OK);
+       }
+
+       @Override
+       public ResponseEntity<TestResult> getTestResult(String testIdentifier) {
+               List<TestResultConfig> testResultConfigs = testResultsConfigRepository.findByTestIdentifier(testIdentifier);
+
+               if ((testResultConfigs == null) || (testResultConfigs.size() == 0)) {
+                       return new ResponseEntity<>(HttpStatus.NOT_FOUND);
+               } else {
+                       TestResultConfig testResultConfig = testResultConfigs.get(0);
+                       TestResult testResult = null;
+                       try {
+                               testResult = objectMapper.readValue(testResultConfig.getResults(), TestResult.class);
+                       } catch (JsonProcessingException e) {
+                               log.error("Cannot convert test result", e);
+                               return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+                       }
+
+
+                       return new ResponseEntity<>(testResult, HttpStatus.OK);
+               }
+       }
+
+       @Override
+       public ResponseEntity<TestResults> getTestResults() {
+               if(getObjectMapper().isPresent() && getAcceptHeader().isPresent()) {
+               } else {
+                       log.warn("ObjectMapper or HttpServletRequest not configured in default RestconfApi interface so no example is generated");
+               }
+
+               TestResults results = new TestResults();
+
+               testResultsConfigRepository.findAll().forEach(testResult -> {
+                       TestResult item = null;
+                       try {
+                               item = objectMapper.readValue(testResult.getResults(), TestResult.class);
+                               results.addTestResultsItem(item);
+                       } catch (JsonProcessingException e) {
+                               log.error("Could not convert testResult", e);
+                       }
+               });
+
+
+               return new ResponseEntity<>(results, HttpStatus.OK);
+       }
+
+       @Override
+       public ResponseEntity<TestResult> pUTTestResult(String testIdentifier, @Valid TestResult testResult) {
+               if(getObjectMapper().isPresent() && getAcceptHeader().isPresent()) {
+               } else {
+                       log.warn("ObjectMapper or HttpServletRequest not configured in default RestconfApi interface so no example is generated");
+               }
+
+               List<TestResultConfig> testResultConfigs = testResultsConfigRepository.findByTestIdentifier(testIdentifier);
+               Iterator<TestResultConfig> testResultIter = testResultConfigs.iterator();
+               while (testResultIter.hasNext()) {
+                       testResultsConfigRepository.delete(testResultIter.next());
+               }
+
+               TestResultConfig testResultConfig = null;
+               try {
+                       testResultConfig = new TestResultConfig(testResult.getTestIdentifier(), objectMapper.writeValueAsString(testResult));
+                       testResultsConfigRepository.save(testResultConfig);
+               } catch (JsonProcessingException e) {
+                       log.error("Could not save test result", e);
+                       return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+               }
+
+               return new ResponseEntity<>(testResult, HttpStatus.OK);
+       }
+
+       @Override
+       public ResponseEntity<TestResults> postTestResults(@Valid TestResults testResults) {
+               List<TestResult> resultList = testResults.getTestResults();
+
+               Iterator<TestResult> resultIterator = resultList.iterator();
+
+               while (resultIterator.hasNext()) {
+                       TestResult curResult = resultIterator.next();
+                       try {
+                               testResultsConfigRepository.save(new TestResultConfig(curResult.getTestIdentifier(), objectMapper.writeValueAsString(curResult)));
+                       } catch (JsonProcessingException e) {
+                               log.error("Could not save test result", e);
+                               return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+                       }
+               }
+
+               return new ResponseEntity<>(testResults, HttpStatus.OK);
+       }
+
+       @Override
+       public ResponseEntity<TestResults> putTestResults(@Valid TestResults testResults) {
+               testResultsConfigRepository.deleteAll();
+
+               List<TestResult> resultList = testResults.getTestResults();
+
+               Iterator<TestResult> resultIterator = resultList.iterator();
+
+
+               while (resultIterator.hasNext()) {
+                       TestResult curResult = resultIterator.next();
+                       try {
+                               testResultsConfigRepository.save(new TestResultConfig(curResult.getTestIdentifier(), objectMapper.writeValueAsString(curResult)));
+                       } catch (JsonProcessingException e) {
+                               log.error("Could not save test result", e);
+                               return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+                       }
+               }
+
+               return new ResponseEntity<>(testResults, HttpStatus.OK);
+       }
+
        public static String propsToJson(Properties props, String root)
        {
                StringBuffer sbuff = new StringBuffer();
index c56cf3b..bfec1c9 100644 (file)
@@ -30,7 +30,7 @@ import org.springframework.context.annotation.Configuration;
 @Configuration\r
 public class ServletFilters {\r
 \r
-       @Bean\r
+/*     @Bean\r
        public FilterRegistrationBean<PayloadLoggingServletFilter> payloadFilterRegistration() throws ServletException {\r
                FilterRegistrationBean<PayloadLoggingServletFilter> registration = new FilterRegistrationBean<PayloadLoggingServletFilter>();\r
                registration.setFilter(new PayloadLoggingServletFilter());\r
@@ -38,5 +38,5 @@ public class ServletFilters {
                registration.setName("payloadFilter");\r
                registration.setOrder(0);\r
                return registration;\r
-       }\r
+       }*/\r
 }
\ No newline at end of file
index fb4fe08..41d3791 100644 (file)
 package org.onap.ccsdk.sli.core.sliapi.springboot.core;\r
 \r
 import org.onap.logging.filter.spring.LoggingInterceptor;\r
+import org.springframework.boot.autoconfigure.domain.EntityScan;\r
 import org.springframework.context.annotation.Bean;\r
+import org.springframework.context.annotation.ComponentScan;\r
 import org.springframework.context.annotation.Configuration;\r
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;\r
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;\r
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;\r
+import org.springframework.orm.jpa.JpaTransactionManager;\r
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;\r
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;\r
+import org.springframework.transaction.PlatformTransactionManager;\r
+import org.springframework.transaction.annotation.EnableTransactionManagement;\r
 import org.springframework.web.servlet.config.annotation.EnableWebMvc;\r
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;\r
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\r
 \r
+import javax.persistence.EntityManagerFactory;\r
+import javax.sql.DataSource;\r
+\r
 @EnableWebMvc\r
 @Configuration\r
+@EnableJpaRepositories("org.onap.ccsdk.sli.core.sliapi.springboot.*")\r
+@ComponentScan(basePackages = {"org.onap.ccsdk.sli.core.sliapi.springboot.*"})\r
+@EntityScan("org.onap.ccsdk.sli.core.sliapi.springboot.*")\r
+@EnableTransactionManagement\r
 public class WebConfig implements WebMvcConfigurer {\r
 \r
-       @Bean\r
+/*     @Bean\r
        LoggingInterceptor loggingInterceptor() {\r
                return new LoggingInterceptor();\r
        }\r
 \r
        public void addInterceptors(InterceptorRegistry registry) {     \r
                registry.addInterceptor(loggingInterceptor()); // handles audit log entries\r
+       }*/\r
+\r
+       @Bean\r
+       public DataSource dataSource() {\r
+\r
+               EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();\r
+               builder.setName("sdnctl");\r
+               return builder.setType(EmbeddedDatabaseType.DERBY).build();\r
+       }\r
+\r
+       @Bean\r
+       public EntityManagerFactory entityManagerFactory() {\r
+\r
+               HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();\r
+               vendorAdapter.setGenerateDdl(true);\r
+\r
+               LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();\r
+               factory.setJpaVendorAdapter(vendorAdapter);\r
+               factory.setPackagesToScan("org.onap.ccsdk.sli.core.sliapi.springboot.*");\r
+               factory.setDataSource(dataSource());\r
+               factory.afterPropertiesSet();\r
+\r
+               return factory.getObject();\r
        }\r
 \r
+       @Bean\r
+       public PlatformTransactionManager transactionManager() {\r
+\r
+               JpaTransactionManager txManager = new JpaTransactionManager();\r
+               txManager.setEntityManagerFactory(entityManagerFactory());\r
+               return txManager;\r
+       }\r
 }
\ No newline at end of file
index 851488b..6a4acc7 100644 (file)
@@ -3,7 +3,7 @@ server.contextPath=/restconf
 server.port=8080
 spring.jackson.date-format=org.onap.ccsdk.sli.core.sliapi.springboot.controllers.swagger.RFC3339DateFormat
 spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
-spring.datasource.url=jdbc:derby:sdnctl;create=true
+spring.datasource.url=jdbc:derby:memory:datasource
 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DerbyTenSevenDialect
 spring.jpa.hibernate.ddl-auto=update
 logging.level.com.att=TRACE
index a61a470..b4c6290 100644 (file)
@@ -118,6 +118,34 @@ public class RestconfApiControllerTest {
 
   }
 
+  @Test
+  public void testTestResultAdd() throws Exception {
+    String url = "/restconf/config/SLI-API:test-results";
+
+    MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get(url)).andReturn();
+
+    assertEquals(200, mvcResult.getResponse().getStatus());
+
+    String jsonString = "{\n" +
+            "  \"test-results\" : [\n" +
+            "        {\n" +
+            "           \"test-identifier\" : \"test-1\",\n" +
+            "           \"results\" : [\"test result 1\"]\n" +
+            "        }\n" +
+            "   ]\n" +
+            "}";
+
+    mvcResult =  mvc.perform(MockMvcRequestBuilders.post(url).contentType(MediaType.APPLICATION_JSON_VALUE).content(jsonString))
+            .andReturn();
+
+    assertEquals(200, mvcResult.getResponse().getStatus());
+
+    mvcResult = mvc.perform(MockMvcRequestBuilders.get(url)).andReturn();
+
+    assertEquals(200, mvcResult.getResponse().getStatus());
+    assertEquals(jsonString.replaceAll("\\s+",""), mvcResult.getResponse().getContentAsString().replaceAll("\\s+",""));
+  }
+
   private String mapToJson(Object obj) throws JsonProcessingException {
     ObjectMapper objectMapper = new ObjectMapper();
     return objectMapper.writeValueAsString(obj);