Add CLI in verigraph.
[parser.git] / verigraph / src / it / polito / verigraph / tosca / converter / grpc / GrpcToYaml.java
1 /*******************************************************************************\r
2  * Copyright (c) 2018 Politecnico di Torino and others.\r
3  *\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
10 \r
11 import java.io.IOException;\r
12 import java.util.HashMap;\r
13 import java.util.List;\r
14 \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
22 \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
62 \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
67 \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
71 \r
72         for(NodeTemplateGrpc node : topologyGrpc.getNodeTemplateList()) {\r
73             NodeTemplateYaml nodeTemplate = new NodeTemplateYaml();\r
74             try {\r
75                 nodeTemplate = mapNodeYaml(node);\r
76             } catch (IOException e) {\r
77                 throw new BadRequestException("Error while mapping a Node in Yaml object.");\r
78             }\r
79             topologyYaml.getNode_templates().put(String.valueOf(node.getId()), nodeTemplate);\r
80             //shall we catch NumberFormatException?\r
81         }\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
85         }\r
86 \r
87         serviceYaml.getMetadata().put("template_id", String.valueOf(topologyGrpc.getId()));\r
88         serviceYaml.setTopology_template(topologyYaml);\r
89         return serviceYaml;\r
90     }\r
91 \r
92 \r
93     private static NodeTemplateYaml mapNodeYaml(NodeTemplateGrpc node) throws JsonParseException, JsonMappingException, IOException {\r
94 \r
95         ObjectMapper mapper = new ObjectMapper(new YAMLFactory());\r
96         SimpleModule module = new SimpleModule();\r
97         String stringConfig = null;\r
98         try {\r
99             stringConfig = node.getConfiguration().getConfiguration();\r
100         } catch (NullPointerException e) {\r
101             throw new NullPointerException("A NodeTemplateGrpc does not contain the configuration.");\r
102         }\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
107 \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
114 \r
115 \r
116         FunctionalTypes nodeType = FunctionalTypes.valueOf(node.getType().toString().toUpperCase());\r
117         switch(nodeType) {\r
118         case ANTISPAM:\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
126 \r
127         case CACHE:\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
134             return cacheNode;\r
135 \r
136         case DPI:\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
143             return dpiNode;\r
144 \r
145         case ENDHOST:\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
153 \r
154         case ENDPOINT:\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
162 \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
171 \r
172         case FIREWALL:\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
180 \r
181         case MAILCLIENT:\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
189 \r
190         case MAILSERVER:\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
198 \r
199         case NAT:\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
206             return natNode;\r
207 \r
208         case VPNACCESS:\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
216 \r
217         case VPNEXIT:\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
225 \r
226         case WEBCLIENT:\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
234 \r
235         case WEBSERVER:\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
243 \r
244         default:\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
250         }\r
251 \r
252     }\r
253 \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
259         int check = 0;\r
260 \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
264 \r
265         for(NodeTemplateGrpc node : nodeList) {\r
266             if(node.getId().equals(relat.getIdSourceNodeTemplate())) {\r
267                 sourceNode = node.getName();\r
268                 check++;\r
269             }\r
270             if(node.getId().equals(relat.getIdTargetNodeTemplate())) {\r
271                 targetNode = node.getName();\r
272                 check++;\r
273             }\r
274         }\r
275 \r
276         if(check!=2)\r
277             throw new BadRequestException("A RelationshipTemplateGrpc must contain both source and target node ID.");\r
278 \r
279         relationship.getProperties().put("name", sourceNode+"To"+targetNode);\r
280 \r
281         return relationship;\r
282     }\r
283 }\r
284 \r