summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYan Yang <yangyanyj@chinamobile.com>2019-04-09 06:18:33 +0000
committerGerrit Code Review <gerrit@onap.org>2019-04-09 06:18:33 +0000
commit2672b1261e87bff3e6526534bc51b56b97d2e5ab (patch)
tree663b0277e413eccc28c432e828f9b034e2d42f2e
parentf4394959f7803c351543873d038af48eb91075f8 (diff)
parent1995d2e5a0b202d499f59353920a17fc3aa7f4cb (diff)
Merge "Integrate Swagger for REST API"
-rw-r--r--components/datalake-handler/feeder/pom.xml39
-rw-r--r--components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/Application.java3
-rw-r--r--components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/config/SwaggerConfig.java60
-rw-r--r--components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/DbController.java52
-rw-r--r--components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/FeederController.java5
-rw-r--r--components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/TopicController.java38
-rw-r--r--components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/config/SwaggerConfigTest.java46
7 files changed, 193 insertions, 50 deletions
diff --git a/components/datalake-handler/feeder/pom.xml b/components/datalake-handler/feeder/pom.xml
index 5b47a245..d6b50787 100644
--- a/components/datalake-handler/feeder/pom.xml
+++ b/components/datalake-handler/feeder/pom.xml
@@ -17,22 +17,21 @@
<dependencies>
-
+
<dependency>
- <groupId>org.mariadb.jdbc</groupId>
- <artifactId>mariadb-java-client</artifactId>
+ <groupId>org.mariadb.jdbc</groupId>
+ <artifactId>mariadb-java-client</artifactId>
</dependency>
-
+
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
</dependency>
-
+
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
- <version>4.5.6</version>
- </dependency>
+ </dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
@@ -48,12 +47,12 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
-
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-data-jpa</artifactId>
+ </dependency>
+
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-couchbase</artifactId>
@@ -135,6 +134,20 @@
<version>6.0.10.Final</version>
</dependency>
+ <dependency>
+ <groupId>io.springfox</groupId>
+ <artifactId>springfox-swagger2</artifactId>
+ <version>2.9.2</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>io.springfox</groupId>
+ <artifactId>springfox-swagger-ui</artifactId>
+ <version>2.9.2</version>
+ <scope>compile</scope>
+ </dependency>
+
</dependencies>
<build>
diff --git a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/Application.java b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/Application.java
index 8f17937b..83f56b1d 100644
--- a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/Application.java
+++ b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/Application.java
@@ -26,6 +26,8 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
/**
* Entry point of the DataLake feeder application
*
@@ -34,6 +36,7 @@ import org.springframework.context.annotation.Bean;
*/
@SpringBootApplication
+@EnableSwagger2
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
diff --git a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/config/SwaggerConfig.java b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/config/SwaggerConfig.java
new file mode 100644
index 00000000..dcf00a90
--- /dev/null
+++ b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/config/SwaggerConfig.java
@@ -0,0 +1,60 @@
+/*
+* ============LICENSE_START=======================================================
+* ONAP : DATALAKE
+* ================================================================================
+* Copyright 2019 China Mobile
+*=================================================================================
+* 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.onap.datalake.feeder.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * For Swagger integration
+ *
+ * @author Guobiao Mo
+ *
+ */
+
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+ @Bean
+ public Docket produceApi() {
+ return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("org.onap.datalake.feeder")).paths(paths()).build();
+ }
+
+ // Describe your apis
+ private ApiInfo apiInfo() {
+ return new ApiInfoBuilder().title("DataLake Rest APIs").description("This page lists all the rest apis for DataLake.").version("1.0.0-SNAPSHOT").build();
+ }
+
+ // Only select apis that matches the given Predicates.
+ private Predicate<String> paths() {
+ // Match all paths except /error
+ return Predicates.or(PathSelectors.regex("/dbs.*"), PathSelectors.regex("/topics.*"), PathSelectors.regex("/feeder.*"));
+ }
+} \ No newline at end of file
diff --git a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/DbController.java b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/DbController.java
index c34befcc..c4288d93 100644
--- a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/DbController.java
+++ b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/DbController.java
@@ -42,8 +42,14 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+
/**
- * This controller manages the big data storage settings. All the settings are saved in database.
+ * This controller manages the big data storage settings. All the settings are
+ * saved in database.
*
* @author Guobiao Mo
*
@@ -51,19 +57,21 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/dbs", produces = { MediaType.APPLICATION_JSON_VALUE })
+//@Api(value = "db", consumes = "application/json", produces = "application/json")
public class DbController {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
private DbRepository dbRepository;
-
+
@Autowired
private DbService dbService;
//list all dbs
@GetMapping("/")
@ResponseBody
+ @ApiOperation(value="Get all databases' details.")
public Iterable<Db> list() throws IOException {
Iterable<Db> ret = dbRepository.findAll();
return ret;
@@ -71,18 +79,23 @@ public class DbController {
//Read a db
//the topics are missing in the return, since in we use @JsonBackReference on Db's topics
- //need to the the following method to retrieve the topic list
- @GetMapping("/{name}")
+ //need to the the following method to retrieve the topic list
+ @GetMapping("/{dbName}")
@ResponseBody
- public Db getDb(@PathVariable("name") String dbName) throws IOException {
+ @ApiOperation(value="Get a database's details.")
+ public Db getDb(@PathVariable("dbName") String dbName, HttpServletResponse response) throws IOException {
Db db = dbService.getDb(dbName);
+ if (db == null) {
+ sendError(response, 404, "Db not found: " + dbName);
+ }
return db;
}
//Read topics in a DB
- @GetMapping("/{name}/topics")
+ @GetMapping("/{dbName}/topics")
@ResponseBody
- public Set<Topic> getDbTopics(@PathVariable("name") String dbName) throws IOException {
+ @ApiOperation(value="Get a database's all topics.")
+ public Set<Topic> getDbTopics(@PathVariable("dbName") String dbName) throws IOException {
Db db = dbService.getDb(dbName);
Set<Topic> topics = db.getTopics();
return topics;
@@ -91,45 +104,46 @@ public class DbController {
//Update Db
@PutMapping("/")
@ResponseBody
+ @ApiOperation(value="Update a database.")
public Db updateDb(@RequestBody Db db, BindingResult result, HttpServletResponse response) throws IOException {
if (result.hasErrors()) {
- sendError(response, 400, "Error parsing DB: "+result.toString());
- return null;
+ sendError(response, 400, "Error parsing DB: " + result.toString());
+ return null;
}
- Db oldDb = getDb(db.getName());
+ Db oldDb = dbService.getDb(db.getName());
if (oldDb == null) {
- sendError(response, 404, "Db not found: "+db.getName());
- return null;
+ sendError(response, 404, "Db not found: " + db.getName());
+ return null;
} else {
- dbRepository.save(db);
+ dbRepository.save(db);
return db;
}
}
- //create a new Db
@PostMapping("/")
@ResponseBody
+ @ApiOperation(value="Create a new database.")
public Db createDb(@RequestBody Db db, BindingResult result, HttpServletResponse response) throws IOException {
if (result.hasErrors()) {
- sendError(response, 400, "Error parsing DB: "+result.toString());
+ sendError(response, 400, "Error parsing DB: " + result.toString());
return null;
}
- Db oldDb = getDb(db.getName());
+ Db oldDb = dbService.getDb(db.getName());
if (oldDb != null) {
- sendError(response, 400, "Db already exists: "+db.getName());
+ sendError(response, 400, "Db already exists: " + db.getName());
return null;
} else {
- dbRepository.save(db);
+ dbRepository.save(db);
return db;
}
}
private void sendError(HttpServletResponse response, int sc, String msg) throws IOException {
log.info(msg);
- response.sendError(sc, msg);
+ response.sendError(sc, msg);
}
}
diff --git a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/FeederController.java b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/FeederController.java
index 2e13e1af..3d296d5f 100644
--- a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/FeederController.java
+++ b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/FeederController.java
@@ -30,6 +30,8 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+
/**
* This controller controls DL data feeder.
*
@@ -51,6 +53,7 @@ public class FeederController {
* @throws IOException
*/
@GetMapping("/start")
+ @ApiOperation(value="Start pulling data.")
public String start() throws IOException {
log.info("DataLake feeder starting to pull data from DMaaP...");
pullService.start();
@@ -61,6 +64,7 @@ public class FeederController {
* @return message that application stop process is triggered
*/
@GetMapping("/stop")
+ @ApiOperation(value="Stop pulling data.")
public String stop() {
pullService.shutdown();
log.info("DataLake feeder is stopped.");
@@ -70,6 +74,7 @@ public class FeederController {
* @return feeder status
*/
@GetMapping("/status")
+ @ApiOperation(value="Retrieve feeder status.")
public String status() {
String status = "Feeder is running: "+pullService.isRunning();
log.info("senting feeder status ...");//TODO we can send what topics are monitored, how many messages are sent, etc.
diff --git a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/TopicController.java b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/TopicController.java
index c4aec14c..bf9e417f 100644
--- a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/TopicController.java
+++ b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/TopicController.java
@@ -46,6 +46,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+
/**
* This controller manages topic settings.
*
@@ -75,43 +77,43 @@ public class TopicController {
@Autowired
private DbService dbService;
- //list all topics in DMaaP
@GetMapping("/dmaap/")
@ResponseBody
+ @ApiOperation(value="List all topics in DMaaP.")
public List<String> listDmaapTopics() throws IOException {
return dmaapService.getTopics();
}
- //list all topics
@GetMapping("/")
@ResponseBody
+ @ApiOperation(value="List all topics' details.")
public Iterable<Topic> list() throws IOException {
Iterable<Topic> ret = topicRepository.findAll();
return ret;
}
- //Read a topic
- @GetMapping("/{topicname}")
+ @GetMapping("/{topicName}")
@ResponseBody
- public Topic getTopic(@PathVariable("topicname") String topicName) throws IOException {
+ @ApiOperation(value="Get a topic's details.")
+ public Topic getTopic(@PathVariable("topicName") String topicName) throws IOException {
Topic topic = topicService.getTopic(topicName);
return topic;
}
- //Read DBs in a topic
- @GetMapping("/{topicname}/dbs")
+ @GetMapping("/{topicName}/dbs")
@ResponseBody
- public Set<Db> getTopicDbs(@PathVariable("topicname") String topicName) throws IOException {
+ @ApiOperation(value="Get all DBs in a topic.")
+ public Set<Db> getTopicDbs(@PathVariable("topicName") String topicName) throws IOException {
Topic topic = topicService.getTopic(topicName);
Set<Db> dbs = topic.getDbs();
return dbs;
}
- //Update Topic
- //This is not a partial update: old topic is wiped out, and new topic is created base on the input json.
+ //This is not a partial update: old topic is wiped out, and new topic is created based on the input json.
//One exception is that old DBs are kept
@PutMapping("/")
@ResponseBody
+ @ApiOperation(value="Update a topic.")
public Topic updateTopic(@RequestBody Topic topic, BindingResult result, HttpServletResponse response) throws IOException {
if (result.hasErrors()) {
@@ -134,10 +136,10 @@ public class TopicController {
return topic;
}
}
-
- //create a new Topic
+
@PostMapping("/")
@ResponseBody
+ @ApiOperation(value="Create a new topic.")
public Topic createTopic(@RequestBody Topic topic, BindingResult result, HttpServletResponse response) throws IOException {
if (result.hasErrors()) {
@@ -160,10 +162,10 @@ public class TopicController {
}
}
- //delete a db from the topic
- @DeleteMapping("/{topicname}/db/{dbname}")
+ @DeleteMapping("/{topicName}/db/{dbName}")
@ResponseBody
- public Set<Db> deleteDb(@PathVariable("topicname") String topicName, @PathVariable("dbname") String dbName, HttpServletResponse response) throws IOException {
+ @ApiOperation(value="Delete a DB from a topic.")
+ public Set<Db> deleteDb(@PathVariable("topicName") String topicName, @PathVariable("dbName") String dbName, HttpServletResponse response) throws IOException {
Topic topic = topicService.getTopic(topicName);
Set<Db> dbs = topic.getDbs();
dbs.remove(new Db(dbName));
@@ -172,10 +174,10 @@ public class TopicController {
return topic.getDbs();
}
- //add a db to the topic
- @PutMapping("/{topicname}/db/{dbname}")
+ @PutMapping("/{topicName}/db/{dbName}")
@ResponseBody
- public Set<Db> addDb(@PathVariable("topicname") String topicName, @PathVariable("dbname") String dbName, HttpServletResponse response) throws IOException {
+ @ApiOperation(value="Add a DB to a topic.")
+ public Set<Db> addDb(@PathVariable("topicName") String topicName, @PathVariable("dbName") String dbName, HttpServletResponse response) throws IOException {
Topic topic = topicService.getTopic(topicName);
Set<Db> dbs = topic.getDbs();
diff --git a/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/config/SwaggerConfigTest.java b/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/config/SwaggerConfigTest.java
new file mode 100644
index 00000000..4293c698
--- /dev/null
+++ b/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/config/SwaggerConfigTest.java
@@ -0,0 +1,46 @@
+/*
+* ============LICENSE_START=======================================================
+* ONAP : DATALAKE
+* ================================================================================
+* Copyright 2019 China Mobile
+*=================================================================================
+* 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.onap.datalake.feeder.config;
+
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+
+/**
+ * Test Swagger integration
+ *
+ * @author Guobiao Mo
+ *
+ */
+
+public class SwaggerConfigTest {
+
+ @Test
+ public void test() {
+ try {
+ SwaggerConfig config = new SwaggerConfig();
+ config.produceApi();
+ } catch (Exception e) {
+ fail("failed to read configure Swagger.");
+ }
+ }
+
+} \ No newline at end of file