1 /*******************************************************************************
\r
2 * Copyright (c) 2018 Politecnico di Torino and others.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Apache License, Version 2.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.apache.org/licenses/LICENSE-2.0
\r
8 *******************************************************************************/
\r
9 package it.polito.verigraph.tosca.converter.grpc;
\r
11 import java.io.IOException;
\r
12 import java.util.HashMap;
\r
13 import java.util.List;
\r
15 import com.fasterxml.jackson.core.JsonParseException;
\r
16 import com.fasterxml.jackson.databind.InjectableValues;
\r
17 import com.fasterxml.jackson.databind.JsonMappingException;
\r
18 import com.fasterxml.jackson.databind.JsonNode;
\r
19 import com.fasterxml.jackson.databind.ObjectMapper;
\r
20 import com.fasterxml.jackson.databind.module.SimpleModule;
\r
21 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
\r
23 import it.polito.neo4j.jaxb.FunctionalTypes;
\r
24 import it.polito.verigraph.exception.BadRequestException;
\r
25 import it.polito.verigraph.grpc.NodeTemplateGrpc;
\r
26 import it.polito.verigraph.grpc.RelationshipTemplateGrpc;
\r
27 import it.polito.verigraph.grpc.TopologyTemplateGrpc;
\r
28 import it.polito.verigraph.tosca.deserializer.YamlConfigurationDeserializer;
\r
29 import it.polito.verigraph.tosca.yaml.beans.AntispamConfigurationYaml;
\r
30 import it.polito.verigraph.tosca.yaml.beans.AntispamNode;
\r
31 import it.polito.verigraph.tosca.yaml.beans.CacheConfigurationYaml;
\r
32 import it.polito.verigraph.tosca.yaml.beans.CacheNode;
\r
33 import it.polito.verigraph.tosca.yaml.beans.ConfigurationYaml;
\r
34 import it.polito.verigraph.tosca.yaml.beans.DpiConfigurationYaml;
\r
35 import it.polito.verigraph.tosca.yaml.beans.DpiNode;
\r
36 import it.polito.verigraph.tosca.yaml.beans.EndhostConfigurationYaml;
\r
37 import it.polito.verigraph.tosca.yaml.beans.EndhostNode;
\r
38 import it.polito.verigraph.tosca.yaml.beans.EndpointConfigurationYaml;
\r
39 import it.polito.verigraph.tosca.yaml.beans.EndpointNode;
\r
40 import it.polito.verigraph.tosca.yaml.beans.FieldModifierConfigurationYaml;
\r
41 import it.polito.verigraph.tosca.yaml.beans.FieldModifierNode;
\r
42 import it.polito.verigraph.tosca.yaml.beans.FirewallConfigurationYaml;
\r
43 import it.polito.verigraph.tosca.yaml.beans.FirewallNode;
\r
44 import it.polito.verigraph.tosca.yaml.beans.MailClientConfigurationYaml;
\r
45 import it.polito.verigraph.tosca.yaml.beans.MailClientNode;
\r
46 import it.polito.verigraph.tosca.yaml.beans.MailServerConfigurationYaml;
\r
47 import it.polito.verigraph.tosca.yaml.beans.MailServerNode;
\r
48 import it.polito.verigraph.tosca.yaml.beans.NatConfigurationYaml;
\r
49 import it.polito.verigraph.tosca.yaml.beans.NatNode;
\r
50 import it.polito.verigraph.tosca.yaml.beans.NodeTemplateYaml;
\r
51 import it.polito.verigraph.tosca.yaml.beans.RelationshipTemplateYaml;
\r
52 import it.polito.verigraph.tosca.yaml.beans.ServiceTemplateYaml;
\r
53 import it.polito.verigraph.tosca.yaml.beans.TopologyTemplateYaml;
\r
54 import it.polito.verigraph.tosca.yaml.beans.VpnAccessConfigurationYaml;
\r
55 import it.polito.verigraph.tosca.yaml.beans.VpnAccessNode;
\r
56 import it.polito.verigraph.tosca.yaml.beans.VpnExitConfigurationYaml;
\r
57 import it.polito.verigraph.tosca.yaml.beans.VpnExitNode;
\r
58 import it.polito.verigraph.tosca.yaml.beans.WebClientConfigurationYaml;
\r
59 import it.polito.verigraph.tosca.yaml.beans.WebClientNode;
\r
60 import it.polito.verigraph.tosca.yaml.beans.WebServerConfigurationYaml;
\r
61 import it.polito.verigraph.tosca.yaml.beans.WebServerNode;
\r
63 public class GrpcToYaml {
\r
64 public static ServiceTemplateYaml mapGraphYaml(TopologyTemplateGrpc topologyGrpc) {
\r
65 ServiceTemplateYaml serviceYaml = new ServiceTemplateYaml();
\r
66 TopologyTemplateYaml topologyYaml = new TopologyTemplateYaml();
\r
68 topologyYaml.setNode_templates(new HashMap<String,NodeTemplateYaml>());
\r
69 topologyYaml.setRelationship_templates(new HashMap<String,RelationshipTemplateYaml>());
\r
70 serviceYaml.setMetadata(new HashMap<String,String>());
\r
72 for(NodeTemplateGrpc node : topologyGrpc.getNodeTemplateList()) {
\r
73 NodeTemplateYaml nodeTemplate = new NodeTemplateYaml();
\r
75 nodeTemplate = mapNodeYaml(node);
\r
76 } catch (IOException e) {
\r
77 throw new BadRequestException("Error while mapping a Node in Yaml object.");
\r
79 topologyYaml.getNode_templates().put(String.valueOf(node.getId()), nodeTemplate);
\r
80 //shall we catch NumberFormatException?
\r
82 for(RelationshipTemplateGrpc relationship : topologyGrpc.getRelationshipTemplateList()) {
\r
83 RelationshipTemplateYaml rel = mapRelationshipYaml(relationship, topologyGrpc.getNodeTemplateList());
\r
84 topologyYaml.getRelationship_templates().put(String.valueOf(relationship.getId()), rel);
\r
87 serviceYaml.getMetadata().put("template_id", String.valueOf(topologyGrpc.getId()));
\r
88 serviceYaml.setTopology_template(topologyYaml);
\r
93 private static NodeTemplateYaml mapNodeYaml(NodeTemplateGrpc node) throws JsonParseException, JsonMappingException, IOException {
\r
95 ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
\r
96 SimpleModule module = new SimpleModule();
\r
97 String stringConfig = null;
\r
99 stringConfig = node.getConfiguration().getConfiguration();
\r
100 } catch (NullPointerException e) {
\r
101 throw new NullPointerException("A NodeTemplateGrpc does not contain the configuration.");
\r
103 JsonNode nodeConfig = mapper.readTree(stringConfig);
\r
104 //Passing the configuration type to the Deserializer context
\r
105 module.addDeserializer(ConfigurationYaml.class, new YamlConfigurationDeserializer());
\r
106 mapper.registerModule(module);
\r
108 if(node.getType() == null)
\r
109 throw new NullPointerException("A NodeTemplateGrpc does not contain a type.");
\r
110 ConfigurationYaml yamlConfig = mapper
\r
111 .reader(new InjectableValues.Std().addValue("type", node.getType().toString().toLowerCase()))
\r
112 .forType(ConfigurationYaml.class)
\r
113 .readValue(nodeConfig);
\r
116 FunctionalTypes nodeType = FunctionalTypes.valueOf(node.getType().toString().toUpperCase());
\r
119 AntispamNode antispamNode = new AntispamNode();
\r
120 antispamNode.setName(node.getName());
\r
121 antispamNode.setType("verigraph.nodeTypes." +
\r
122 node.getType().toString().substring(0, 1).toUpperCase() +
\r
123 node.getType().toString().substring(1));
\r
124 antispamNode.setProperties((AntispamConfigurationYaml) yamlConfig);
\r
125 return antispamNode;
\r
128 CacheNode cacheNode = new CacheNode();
\r
129 cacheNode.setName(node.getName());
\r
130 cacheNode.setType("verigraph.nodeTypes." +
\r
131 node.getType().toString().substring(0, 1).toUpperCase() +
\r
132 node.getType().toString().substring(1));
\r
133 cacheNode.setProperties((CacheConfigurationYaml) yamlConfig);
\r
137 DpiNode dpiNode = new DpiNode();
\r
138 dpiNode.setName(node.getName());
\r
139 dpiNode.setType("verigraph.nodeTypes." +
\r
140 node.getType().toString().substring(0, 1).toUpperCase() +
\r
141 node.getType().toString().substring(1));
\r
142 dpiNode.setProperties((DpiConfigurationYaml) yamlConfig);
\r
146 EndhostNode endhostNode = new EndhostNode();
\r
147 endhostNode.setName(node.getName());
\r
148 endhostNode.setType("verigraph.nodeTypes." +
\r
149 node.getType().toString().substring(0, 1).toUpperCase() +
\r
150 node.getType().toString().substring(1));
\r
151 endhostNode.setProperties((EndhostConfigurationYaml) yamlConfig);
\r
152 return endhostNode;
\r
155 EndpointNode endpointNode = new EndpointNode();
\r
156 endpointNode.setName(node.getName());
\r
157 endpointNode.setType("verigraph.nodeTypes." +
\r
158 node.getType().toString().substring(0, 1).toUpperCase() +
\r
159 node.getType().toString().substring(1));
\r
160 endpointNode.setProperties((EndpointConfigurationYaml) yamlConfig);
\r
161 return endpointNode;
\r
163 case FIELDMODIFIER:
\r
164 FieldModifierNode fieldmodifierNode = new FieldModifierNode();
\r
165 fieldmodifierNode.setName(node.getName());
\r
166 fieldmodifierNode.setType("verigraph.nodeTypes." +
\r
167 node.getType().toString().substring(0, 1).toUpperCase() +
\r
168 node.getType().toString().substring(1));
\r
169 fieldmodifierNode.setProperties((FieldModifierConfigurationYaml) yamlConfig);
\r
170 return fieldmodifierNode;
\r
173 FirewallNode firewallNode = new FirewallNode();
\r
174 firewallNode.setName(node.getName());
\r
175 firewallNode.setType("verigraph.nodeTypes." +
\r
176 node.getType().toString().substring(0, 1).toUpperCase() +
\r
177 node.getType().toString().substring(1));
\r
178 firewallNode.setProperties((FirewallConfigurationYaml) yamlConfig);
\r
179 return firewallNode;
\r
182 MailClientNode mailclientNode = new MailClientNode();
\r
183 mailclientNode.setName(node.getName());
\r
184 mailclientNode.setType("verigraph.nodeTypes." +
\r
185 node.getType().toString().substring(0, 1).toUpperCase() +
\r
186 node.getType().toString().substring(1));
\r
187 mailclientNode.setProperties((MailClientConfigurationYaml) yamlConfig);
\r
188 return mailclientNode;
\r
191 MailServerNode mailserverNode = new MailServerNode();
\r
192 mailserverNode.setName(node.getName());
\r
193 mailserverNode.setType("verigraph.nodeTypes." +
\r
194 node.getType().toString().substring(0, 1).toUpperCase() +
\r
195 node.getType().toString().substring(1));
\r
196 mailserverNode.setProperties((MailServerConfigurationYaml) yamlConfig);
\r
197 return mailserverNode;
\r
200 NatNode natNode = new NatNode();
\r
201 natNode.setName(node.getName());
\r
202 natNode.setType("verigraph.nodeTypes." +
\r
203 node.getType().toString().substring(0, 1).toUpperCase() +
\r
204 node.getType().toString().substring(1));
\r
205 natNode.setProperties((NatConfigurationYaml) yamlConfig);
\r
209 VpnAccessNode vpnaccessNode = new VpnAccessNode();
\r
210 vpnaccessNode.setName(node.getName());
\r
211 vpnaccessNode.setType("verigraph.nodeTypes." +
\r
212 node.getType().toString().substring(0, 1).toUpperCase() +
\r
213 node.getType().toString().substring(1));
\r
214 vpnaccessNode.setProperties((VpnAccessConfigurationYaml) yamlConfig);
\r
215 return vpnaccessNode;
\r
218 VpnExitNode vpnexitNode = new VpnExitNode();
\r
219 vpnexitNode.setName(node.getName());
\r
220 vpnexitNode.setType("verigraph.nodeTypes." +
\r
221 node.getType().toString().substring(0, 1).toUpperCase() +
\r
222 node.getType().toString().substring(1));
\r
223 vpnexitNode.setProperties((VpnExitConfigurationYaml) yamlConfig);
\r
224 return vpnexitNode;
\r
227 WebClientNode webclientNode = new WebClientNode();
\r
228 webclientNode.setName(node.getName());
\r
229 webclientNode.setType("verigraph.nodeTypes." +
\r
230 node.getType().toString().substring(0, 1).toUpperCase() +
\r
231 node.getType().toString().substring(1));
\r
232 webclientNode.setProperties((WebClientConfigurationYaml) yamlConfig);
\r
233 return webclientNode;
\r
236 WebServerNode webserverNode = new WebServerNode();
\r
237 webserverNode.setName(node.getName());
\r
238 webserverNode.setType("verigraph.nodeTypes." +
\r
239 node.getType().toString().substring(0, 1).toUpperCase() +
\r
240 node.getType().toString().substring(1));
\r
241 webserverNode.setProperties((WebServerConfigurationYaml) yamlConfig);
\r
242 return webserverNode;
\r
245 FieldModifierNode defaultNode = new FieldModifierNode();
\r
246 defaultNode.setName(node.getName());
\r
247 defaultNode.setType("verigraph.nodeTypes.Fieldmodifier");
\r
248 defaultNode.setProperties(new FieldModifierConfigurationYaml());
\r
249 return defaultNode;
\r
254 private static RelationshipTemplateYaml mapRelationshipYaml(RelationshipTemplateGrpc relat, List<NodeTemplateGrpc> nodeList) {
\r
255 RelationshipTemplateYaml relationship = new RelationshipTemplateYaml();
\r
256 relationship.setProperties(new HashMap<String,String>());
\r
257 String sourceNode = null;
\r
258 String targetNode = null;
\r
261 relationship.setType("verigraph.relationshipType.generic");
\r
262 relationship.getProperties().put("source_id", String.valueOf(relat.getIdSourceNodeTemplate())); //to be catched?
\r
263 relationship.getProperties().put("target_id", String.valueOf(relat.getIdTargetNodeTemplate()));
\r
265 for(NodeTemplateGrpc node : nodeList) {
\r
266 if(node.getId().equals(relat.getIdSourceNodeTemplate())) {
\r
267 sourceNode = node.getName();
\r
270 if(node.getId().equals(relat.getIdTargetNodeTemplate())) {
\r
271 targetNode = node.getName();
\r
277 throw new BadRequestException("A RelationshipTemplateGrpc must contain both source and target node ID.");
\r
279 relationship.getProperties().put("name", sourceNode+"To"+targetNode);
\r
281 return relationship;
\r