summaryrefslogtreecommitdiffstats
path: root/mod/runtimeapi/runtime-web/src/main/java/org/onap/dcae/runtime/web/service/GraphServiceImpl.java
blob: f1329c14f1bb87352a4841adc8c426161f2e4dbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
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<Node, Edge> mainFlowGraph;

    Logger logger = LoggerFactory.getLogger(GraphServiceImpl.class);

    @Autowired
    private FlowGraphParser flowGraphParser;

    @Override
    public FlowGraph<Node, Edge> 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<Node,Edge>(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<BlueprintVessel> 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<BlueprintVessel> 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<BlueprintVessel> 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);
    }

}