From cc9d389bf197c1a365e669b407ea781f2bc87fd4 Mon Sep 17 00:00:00 2001 From: Michael Hwang Date: Wed, 20 Nov 2019 12:32:48 -0500 Subject: Add mod/runtimeapi Change-Id: I6c0a45ddf460a63a1e4b9284e19bf4ab111bd463 Issue-ID: DCAEGEN2-1860 Signed-off-by: Michael Hwang --- .../dcae/runtime/web/RuntimeapiApplication.java | 32 +++++ .../web/configuration/BlueprintCreatorConfig.java | 110 +++++++++++++++ .../runtime/web/configuration/PropertyConfig.java | 50 +++++++ .../runtime/web/configuration/SwaggerConfig.java | 53 +++++++ .../runtime/web/controllers/GraphController.java | 91 ++++++++++++ .../web/exception/ActionsNotDefinedException.java | 24 ++++ .../web/exception/AppExceptionsHandler.java | 38 +++++ .../exception/MainGraphAlreadyExistException.java | 25 ++++ .../web/exception/MainGraphNotFoundException.java | 21 +++ .../org/onap/dcae/runtime/web/models/Action.java | 66 +++++++++ .../dcae/runtime/web/models/DashboardConfig.java | 49 +++++++ .../runtime/web/models/DistributeGraphRequest.java | 40 ++++++ .../onap/dcae/runtime/web/models/GraphRequest.java | 76 ++++++++++ .../runtime/web/service/BlueprintInventory.java | 86 ++++++++++++ .../dcae/runtime/web/service/GraphService.java | 38 +++++ .../dcae/runtime/web/service/GraphServiceImpl.java | 154 +++++++++++++++++++++ .../onap/dcae/runtime/web/service/SSLUtils.java | 67 +++++++++ 17 files changed, 1020 insertions(+) create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/RuntimeapiApplication.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/configuration/BlueprintCreatorConfig.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/configuration/PropertyConfig.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/configuration/SwaggerConfig.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/controllers/GraphController.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/ActionsNotDefinedException.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/AppExceptionsHandler.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/MainGraphAlreadyExistException.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/MainGraphNotFoundException.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/Action.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/DashboardConfig.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/DistributeGraphRequest.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/GraphRequest.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/BlueprintInventory.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/GraphService.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/GraphServiceImpl.java create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/SSLUtils.java (limited to 'mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web') diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/RuntimeapiApplication.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/RuntimeapiApplication.java new file mode 100644 index 0000000..f22c7e7 --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/RuntimeapiApplication.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@SpringBootApplication +@EnableSwagger2 +public class RuntimeapiApplication { + + public static void main(String[] args) { + SpringApplication.run(RuntimeapiApplication.class, args); + } + +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/configuration/BlueprintCreatorConfig.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/configuration/BlueprintCreatorConfig.java new file mode 100644 index 0000000..8c535c7 --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/configuration/BlueprintCreatorConfig.java @@ -0,0 +1,110 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.configuration; + +import org.onap.dcae.runtime.core.FlowGraphParser; +import org.onap.dcae.runtime.core.blueprint_creator.BlueprintCreatorOnapDublin; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; +import org.springframework.core.env.Environment; +import org.yaml.snakeyaml.Yaml; + +import java.io.IOException; +import java.nio.file.FileAlreadyExistsException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Configuration +public class BlueprintCreatorConfig { + + @Autowired + Environment env; + + @Value("${onapDublin.topicUrl}") + String onapDublinTopicUrl; + + @Value("${onapDublin.import.cloudifyPlugin}") + String onapDublinImportCloudifyPlugin; + + @Value("${onapDublin.import.k8sPlugin}") + String onapDublinImportK8sPlugin; + + @Value("${onapDublin.import.policyPlugin}") + String onapDublinImportPolicyPlugin; + + + @Profile("onap_dublin") + @Primary + @Bean + public FlowGraphParser getFlowGraphParserForOnapDublin(){ + BlueprintCreatorOnapDublin blueprintCreatorOnapDublin = new BlueprintCreatorOnapDublin(); + blueprintCreatorOnapDublin.setTopicUrl(onapDublinTopicUrl); + blueprintCreatorOnapDublin.setImportFilePath(writeImportsTofile()); + FlowGraphParser flowGraphParser = new FlowGraphParser(blueprintCreatorOnapDublin); + return flowGraphParser; + } + + private String writeImportsTofile() { + String contentToWrite = getContentToWrite(); + String fielPath = ""; + try { + Path path = createDataImportDirAndImportFile(); + fielPath = Files.write(path,contentToWrite.getBytes()).toString(); + new String(Files.readAllBytes(path)); + } catch (IOException e) { + e.printStackTrace(); + } + System.out.println(fielPath); + return fielPath; + } + + private Path createDataImportDirAndImportFile() { + Path importDirPath = Paths.get("./data/imports").toAbsolutePath().normalize(); + Path onapDublinImportFilePath = Paths.get("./data/imports/onapDublinImports.yaml").toAbsolutePath().normalize(); + try { + Files.createDirectories(importDirPath); + Files.createFile(onapDublinImportFilePath); + } + catch (FileAlreadyExistsException ignored){ + } + catch (IOException e) { + e.printStackTrace(); + } + return onapDublinImportFilePath; + } + + private String getContentToWrite() { + Map result = new HashMap(); + List importList = new ArrayList(); + importList.add(onapDublinImportCloudifyPlugin); + importList.add(onapDublinImportK8sPlugin); + importList.add(onapDublinImportPolicyPlugin); + result.put("imports",importList); + return new Yaml().dump(result); + } + +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/configuration/PropertyConfig.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/configuration/PropertyConfig.java new file mode 100644 index 0000000..2cfe198 --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/configuration/PropertyConfig.java @@ -0,0 +1,50 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.configuration; + +import org.onap.dcae.runtime.web.models.DashboardConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +@Configuration +public class PropertyConfig { + + @Autowired + Environment env; + + @Value("${dashboard.url}") + String dashboardUrl; + + @Value("${dashboard.username}") + String dashboardUser; + + @Value("${dashboard.password}") + String dashboardPassword; + + @Bean + public DashboardConfig getDashboardConfig(){ + DashboardConfig dashboardConfig = new DashboardConfig(); + dashboardConfig.setUrl(this.dashboardUrl); + dashboardConfig.setUsername(this.dashboardUser); + dashboardConfig.setPassword(this.dashboardPassword); + return dashboardConfig; + } +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/configuration/SwaggerConfig.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/configuration/SwaggerConfig.java new file mode 100644 index 0000000..3f53599 --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/configuration/SwaggerConfig.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +import java.util.ArrayList; + +@Configuration +public class SwaggerConfig { + + @Bean + public Docket swaggerConfiguration(){ + // return a prepared Docket instance + return new Docket(DocumentationType.SWAGGER_2) + .select() + //.paths(PathSelectors.ant("/api/*")) + .apis(RequestHandlerSelectors.basePackage("org.onap.dcae.runtime.web")) + .build() + .apiInfo(apiDetails()); + } + + private ApiInfo apiDetails() { + Contact DEFAULT_CONTACT = new Contact("", "", ""); + return new ApiInfo( + "DCAE MOD Runtime API", + "Runtime API for NiFi instance in MOD", + "1.0.0" + ,"", DEFAULT_CONTACT, "", "", new ArrayList() + ); + } +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/controllers/GraphController.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/controllers/GraphController.java new file mode 100644 index 0000000..fc222f2 --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/controllers/GraphController.java @@ -0,0 +1,91 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.controllers; + +import org.onap.dcae.runtime.core.Edge; +import org.onap.dcae.runtime.core.FlowGraph; +import org.onap.dcae.runtime.core.Node; +import org.onap.dcae.runtime.core.FlowGraphParser.BlueprintVessel; +import org.onap.dcae.runtime.web.exception.MainGraphNotFoundException; +import org.onap.dcae.runtime.web.models.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.onap.dcae.runtime.web.models.DistributeGraphRequest; +import org.onap.dcae.runtime.web.models.GraphRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.onap.dcae.runtime.web.service.GraphServiceImpl; + +import javax.validation.Valid; +import java.util.Map; +import java.util.HashMap; +import java.util.List; + +@RestController +@RequestMapping(value = "/api/graph") +@Api(tags = "Graph", description = "API to manage Graph") +public class GraphController { + + @Autowired + private GraphServiceImpl graphService; + + Logger logger = LoggerFactory.getLogger(GraphController.class); + + @RequestMapping(method = RequestMethod.GET,value = "/main") + @ApiOperation("Get main graph") + public FlowGraph getMainGraph(){ + return graphService.getMainGraph(); + } + + @PostMapping(value = "/main") + @ApiOperation("Initialize a main graph") + public ResponseEntity initializeGraph(@RequestBody @Valid GraphRequest graphRequest){ + logger.info(graphRequest.toString()); + graphService.initializeMainGraph(graphRequest); + return new ResponseEntity(HttpStatus.CREATED); + } + + @PostMapping(value = "/{id}/distribute") + @ApiOperation("Submit actions on a given graph and distribute blueprints to the inventory") + public ResponseEntity> distributeGraph(@PathVariable(value = "id") String id, + @RequestBody @Valid DistributeGraphRequest distributeGraphRequest){ + logger.info(distributeGraphRequest.getActions().toString()); + List blueprints = graphService.distribute(distributeGraphRequest); + + Map response = new HashMap<>(); + for (BlueprintVessel bpv : blueprints) { + response.put(String.format("%s_%d", bpv.name, bpv.version), bpv.blueprint); + } + return new ResponseEntity>(response, HttpStatus.OK); + } + + @DeleteMapping(value = "/main") + @ApiOperation("Remove the main graph") + public String deleteMainGraph(){ + graphService.deleteMainGraph(); + return "Main Graph has been deleted."; + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.NOT_FOUND) + private void graphNotFoundHandler(MainGraphNotFoundException ex){} +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/ActionsNotDefinedException.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/ActionsNotDefinedException.java new file mode 100644 index 0000000..5a7ded1 --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/ActionsNotDefinedException.java @@ -0,0 +1,24 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.exception; + +public class ActionsNotDefinedException extends RuntimeException { + public ActionsNotDefinedException(String message){ + super(message); + } +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/AppExceptionsHandler.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/AppExceptionsHandler.java new file mode 100644 index 0000000..b1500f7 --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/AppExceptionsHandler.java @@ -0,0 +1,38 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.request.WebRequest; + +@ControllerAdvice +public class AppExceptionsHandler { + + @ExceptionHandler(value = {MainGraphAlreadyExistException.class}) + public ResponseEntity handleMainGraphAlreadyExistException(MainGraphAlreadyExistException ex, WebRequest request){ + return new ResponseEntity(HttpStatus.CONFLICT); + } + + @ExceptionHandler(value = {MainGraphNotFoundException.class}) + public ResponseEntity handleMainGraphNotFoundException(MainGraphNotFoundException ex, WebRequest request){ + return new ResponseEntity(HttpStatus.NOT_FOUND); + } +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/MainGraphAlreadyExistException.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/MainGraphAlreadyExistException.java new file mode 100644 index 0000000..0d99caf --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/MainGraphAlreadyExistException.java @@ -0,0 +1,25 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.exception; + +public class MainGraphAlreadyExistException extends RuntimeException{ + + public MainGraphAlreadyExistException(String message) { + super(message); + } +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/MainGraphNotFoundException.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/MainGraphNotFoundException.java new file mode 100644 index 0000000..4b020dc --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/exception/MainGraphNotFoundException.java @@ -0,0 +1,21 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.exception; + +public class MainGraphNotFoundException extends RuntimeException{ +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/Action.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/Action.java new file mode 100644 index 0000000..6601b7d --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/Action.java @@ -0,0 +1,66 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.models; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotBlank; +import java.util.Map; + +@ApiModel(description = "Class representing Action which can be perform on a graph") +public class Action { + + @NotBlank + @ApiModelProperty(notes = "command to perform on graph", + allowableValues = "addnode,removenode,renamenode,changenode,addedge,removeedge,changeedge,addgroup,removegroup,renamegroup,changegroup", + required = true) + String command; + + @NotBlank + @ApiModelProperty(notes = "Targeted graph id",required = true) + String target_graph_id; + + @NotBlank + @ApiModelProperty(notes = "payload",required = true) + Map payload; + + public String getCommand() { + return command; + } + + public void setCommand(String command) { + this.command = command; + } + + public String getTarget_graph_id() { + return target_graph_id; + } + + public void setTarget_graph_id(String target_graph_id) { + this.target_graph_id = target_graph_id; + } + + public Map getPayload() { + return payload; + } + + public void setPayload(Map payload) { + this.payload = payload; + } +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/DashboardConfig.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/DashboardConfig.java new file mode 100644 index 0000000..37bdcee --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/DashboardConfig.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.models; + +public class DashboardConfig { + + private String url; + private String username; + private String password; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/DistributeGraphRequest.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/DistributeGraphRequest.java new file mode 100644 index 0000000..a6fe3a7 --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/DistributeGraphRequest.java @@ -0,0 +1,40 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.models; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@ApiModel(description = "Class representing DistributeGraph request object") +public class DistributeGraphRequest { + + @NotNull + @ApiModelProperty(notes = "List of actions to be performed",required = true) + private List actions; + + public List getActions() { + return actions; + } + + public void setActions(List actions) { + this.actions = actions; + } +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/GraphRequest.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/GraphRequest.java new file mode 100644 index 0000000..92b87c3 --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/models/GraphRequest.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.models; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel(description = "Class representing main Graph creation request object") +public class GraphRequest { + + @NotBlank + @ApiModelProperty(notes = "this id is same as stored in NiFi", required = true, position = 0) + String id; + + @NotBlank + @ApiModelProperty(notes = "Name of the graph", required = true, position = 0) + String name; + + @NotNull + @ApiModelProperty(notes = "if the graph is main or a subgraph", required = true, position = 0) + boolean isMain; + + @ApiModelProperty(notes = "description of the graph", required = true, position = 0) + String description; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isMain() { + return isMain; + } + + public void setMain(boolean main) { + isMain = main; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/BlueprintInventory.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/BlueprintInventory.java new file mode 100644 index 0000000..bb6839c --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/BlueprintInventory.java @@ -0,0 +1,86 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.service; + +import org.onap.dcae.runtime.core.FlowGraphParser.BlueprintVessel; +import org.onap.dcae.runtime.web.models.DashboardConfig; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +@Service +public class BlueprintInventory { + + @Autowired + DashboardConfig dashboardConfig; + + Logger logger = LoggerFactory.getLogger(BlueprintInventory.class); + + public void distributeToInventory(List blueprints) { + for (BlueprintVessel bpv : blueprints) { + JSONObject body = prepareBlueprintJsonObject(bpv.name, bpv.version, bpv.blueprint); + postToDashboard(body); + logger.info(String.format("Distributed: %s", bpv.toString())); + //System.out.println(bpv.blueprint); + } + } + + // Should work with inventory too! + private boolean postToDashboard(JSONObject blueprintJsonObject){ + //1. setup + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + // NOTE: This commented out line is to be used for dcae dashboard api and not inventory + //headers.setBasicAuth(dashboardConfig.getUsername(),dashboardConfig.getPassword()); + + //2. request + HttpEntity request = new HttpEntity(blueprintJsonObject.toString(), headers); + try{ + SSLUtils.turnOffSslChecking(); + String response = restTemplate.postForObject(dashboardConfig.getUrl(),request,String.class); + logger.info(response); + return true; + }catch (Exception e) { + logger.error("failed to push on inventory"); + logger.error(e.getMessage()); + return false; + } + } + + private JSONObject prepareBlueprintJsonObject(String blueprintName, int version, String blueprintContent) { + JSONObject blueprintJsonObject = new JSONObject(); + blueprintJsonObject.put("owner","dcae_mod"); + blueprintJsonObject.put("typeName",blueprintName); + blueprintJsonObject.put("typeVersion",version); + blueprintJsonObject.put("blueprintTemplate",blueprintContent); + blueprintJsonObject.put("application","DCAE"); + blueprintJsonObject.put("component","dcae"); + return blueprintJsonObject; + } + + +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/GraphService.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/GraphService.java new file mode 100644 index 0000000..b368786 --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/GraphService.java @@ -0,0 +1,38 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.service; + +import org.onap.dcae.runtime.core.Edge; +import org.onap.dcae.runtime.core.FlowGraph; +import org.onap.dcae.runtime.core.Node; +import org.onap.dcae.runtime.web.models.DistributeGraphRequest; +import org.onap.dcae.runtime.web.models.GraphRequest; +import org.onap.dcae.runtime.core.FlowGraphParser.BlueprintVessel; + +import java.util.List; + +public interface GraphService { + + FlowGraph getMainGraph(); + + boolean initializeMainGraph(GraphRequest mainGraph); + + List distribute(DistributeGraphRequest distributeGraphRequest); + + void deleteMainGraph(); +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/GraphServiceImpl.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/GraphServiceImpl.java new file mode 100644 index 0000000..f1329c1 --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/GraphServiceImpl.java @@ -0,0 +1,154 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.service; + +import org.onap.dcae.runtime.core.*; +import org.onap.dcae.runtime.core.FlowGraphParser.BlueprintVessel; +import org.onap.dcae.runtime.web.exception.ActionsNotDefinedException; +import org.onap.dcae.runtime.web.exception.MainGraphAlreadyExistException; +import org.onap.dcae.runtime.web.exception.MainGraphNotFoundException; +import org.onap.dcae.runtime.web.models.Action; +import org.onap.dcae.runtime.web.models.DistributeGraphRequest; +import org.onap.dcae.runtime.web.models.GraphRequest; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class GraphServiceImpl implements GraphService{ + + @Autowired + BlueprintInventory blueprintInventory; + + private FlowGraph mainFlowGraph; + + Logger logger = LoggerFactory.getLogger(GraphServiceImpl.class); + + @Autowired + private FlowGraphParser flowGraphParser; + + @Override + public FlowGraph getMainGraph() { + if(mainFlowGraph == null){ + throw new MainGraphNotFoundException(); + } + return mainFlowGraph; + } + + @Override + public boolean initializeMainGraph(GraphRequest mainGraphRequest) { + if(mainFlowGraph != null){ + throw new MainGraphAlreadyExistException("Can not initialize the main graph, it already exists"); + } + mainFlowGraph = new FlowGraph(mainGraphRequest.getId(),mainGraphRequest.getName(), + true, mainGraphRequest.getDescription()); + mainFlowGraph.addNode(getDummyNode()); + flowGraphParser.parse(mainFlowGraph); + return true; + } + + private Node getDummyNode() { + return new Node("dummy_id","dummy_name","dummy_compspec"); + } + + @Override + public List distribute(DistributeGraphRequest distributeGraphRequest) { + //1.Iterate through list of actions + logger.info("applying actions to graph"); + applyActionsToGraph(distributeGraphRequest); + + //2. generate blueprint from compspec of the node + logger.info("generating blueprints for the affected nodes"); + List blueprints = generateBlueprintsForAffectedNodes(distributeGraphRequest); + + //3a. Push blueprints to the inventory + logger.info("pushing bluepirnts to the dashboard inventrory"); + blueprintInventory.distributeToInventory(blueprints); + //3b. return blueprint map + return blueprints; + } + + @Override + public void deleteMainGraph() { + if(mainFlowGraph == null){ + throw new MainGraphNotFoundException(); + } + mainFlowGraph = null; + } + + private List generateBlueprintsForAffectedNodes(DistributeGraphRequest distributeGraphRequest) { + return flowGraphParser.createAndProcessBlueprints(); + } + + private void applyActionsToGraph(DistributeGraphRequest distributeGraphRequest) { + if(distributeGraphRequest.getActions() == null){ + throw new ActionsNotDefinedException("Action(s) must be defined in the request"); + } + for(Action action : distributeGraphRequest.getActions()){ + if(action.getCommand().equals("addnode")){ + Node node = prepareNodeFromAddNAddNodeAction(action); + mainFlowGraph.addNode(node); + } + else if(action.getCommand().equals("addedge")) { + Edge edge = prepareEdgeFromAddEdgeAction(action); + Node srcNode = flowGraphParser.getNodeFromId(edge.getSrc().getNode()); + Node tgtNode = flowGraphParser.getNodeFromId(edge.getTgt().getNode()); + srcNode = fillPlaceholderIfNodeIsEmpty(srcNode); + tgtNode =fillPlaceholderIfNodeIsEmpty(tgtNode); + mainFlowGraph.addEdge(srcNode,tgtNode,edge); + } + } + } + + private Node fillPlaceholderIfNodeIsEmpty(Node node) { + if (node == null) { + node = flowGraphParser.getNodeFromId("dummy_id"); + } + return node; + } + + + private Edge prepareEdgeFromAddEdgeAction(Action action) { + ObjectMapper objectMapper = new ObjectMapper(); + Edge edge = objectMapper.convertValue(action.getPayload(),Edge.class); + return edge; + } + + private void fillPlaceholderIfLocaionsAreEmpty(Edge edge) { + if(edge.getSrc().getNode() == null && edge.getSrc().getPort() == null){ + EdgeLocation src = new EdgeLocation("node-id-placeholder", "node-port-placeholder"); + edge.setSrc(src); + } + if(edge.getTgt().getNode() == null && edge.getTgt().getPort() == null){ + EdgeLocation tgt = new EdgeLocation("node-id-placeholder", "node-port-placeholder"); + edge.setTgt(tgt); + } + } + + private Node prepareNodeFromAddNAddNodeAction(Action action) { + String componentId = (String) action.getPayload().get("component_id"); + String componentName = (String) action.getPayload().get("name"); + String componentSpec = (String) action.getPayload().get("component_spec"); + return new Node(componentId,componentName,componentSpec); + } + +} diff --git a/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/SSLUtils.java b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/SSLUtils.java new file mode 100644 index 0000000..16501af --- /dev/null +++ b/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/SSLUtils.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.runtime.web.service; + +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +public final class SSLUtils { + + static { + // for localhost testing only + javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() { + public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) { + return true; + } + }); + } + + private static final TrustManager[] UNQUESTIONING_TRUST_MANAGER = new TrustManager[] { new X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + + public void checkClientTrusted(X509Certificate[] certs, String authType) { + } + + public void checkServerTrusted(X509Certificate[] certs, String authType) { + } + } }; + + public static void turnOffSslChecking() throws NoSuchAlgorithmException, KeyManagementException { + // Install the all-trusting trust manager + final SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, UNQUESTIONING_TRUST_MANAGER, null); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + public static void turnOnSslChecking() throws KeyManagementException, NoSuchAlgorithmException { + // Return it to the initial state (discovered by reflection, now hardcoded) + SSLContext.getInstance("SSL").init(null, null, null); + } + + private SSLUtils() { + throw new UnsupportedOperationException("Do not instantiate libraries."); + } +} \ No newline at end of file -- cgit 1.2.3-korg