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/service/GraphServiceImpl.java | 154 +++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/GraphServiceImpl.java (limited to 'mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/GraphServiceImpl.java') 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); + } + +} -- cgit 1.2.3-korg