Bug 5077: Codes break the security rules
[nemo.git] / nemo-renderers / cli-renderer / src / main / java / org / opendaylight / nemo / renderer / cli / CliTrigger.java
1 /*\r
2  * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.nemo.renderer.cli;\r
10 \r
11 import com.google.common.base.Optional;\r
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
13 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
14 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
15 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;\r
16 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;\r
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalNodes;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.VirtualNetworks;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetwork;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetworkKey;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.IntentVnMappingResults;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.VnPnMappingResults;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMapping;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMappingKey;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMapping;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNetworkId;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.Users;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.UserKey;\r
34 import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
35 import org.opendaylight.yangtools.yang.binding.DataObject;\r
36 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
37 import org.slf4j.Logger;\r
38 import org.slf4j.LoggerFactory;\r
39 \r
40 import java.util.List;\r
41 import java.util.Map;\r
42 import java.util.Set;\r
43 \r
44 /**\r
45  *\r
46  * @author Shixing Liu\r
47  */\r
48 public class CliTrigger implements AutoCloseable {\r
49     private static final Logger LOG = LoggerFactory.getLogger(CliTrigger.class);\r
50 \r
51     private final DataBroker dataProvider;\r
52     private ListenerRegistration<DataChangeListener> userVnPnMappingChangeListenerReg;\r
53     private final CliBuilder cliBuilder;\r
54 \r
55     /**\r
56      *\r
57      * @param dataProvider\r
58      */\r
59     public CliTrigger(DataBroker dataProvider) {\r
60         super();\r
61 \r
62         this.dataProvider = dataProvider;\r
63         cliBuilder = new CliBuilder(dataProvider);\r
64 \r
65         // Register listener\r
66         registerUserVnPnMappingListener();\r
67 \r
68         LOG.info("Initialized CliTrigger.");\r
69     }\r
70 \r
71     /**\r
72      *\r
73      */\r
74     private void registerUserVnPnMappingListener() {\r
75 \r
76         //build userVnPnMappingIid\r
77         InstanceIdentifier<UserVnPnMapping> userVnPnMappingIid = InstanceIdentifier\r
78                 .builder(VnPnMappingResults.class)\r
79                 .child(UserVnPnMapping.class)\r
80                 .build();\r
81         //register\r
82         userVnPnMappingChangeListenerReg = dataProvider.registerDataChangeListener(\r
83                 LogicalDatastoreType.CONFIGURATION, userVnPnMappingIid,\r
84                 new UserVnPnMappingChangeListener(), DataChangeScope.BASE);\r
85     }\r
86 \r
87     /**\r
88      *\r
89      * @param userId\r
90      * @return\r
91      */\r
92     private User getUser(UserId userId) {\r
93 \r
94         ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
95         InstanceIdentifier<User> userIid = InstanceIdentifier.builder(Users.class)\r
96                 .child(User.class, new UserKey(userId))\r
97                 .build();\r
98         Optional<User> result = null;\r
99 \r
100         try {\r
101             result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, userIid).get();\r
102         } catch (Exception e) {\r
103             // TODO Auto-generated catch block\r
104             LOG.error("Exception:",e);\r
105         }\r
106         if (result.isPresent()){\r
107             LOG.info("getUser  OK");\r
108             return (result.get());\r
109 \r
110         }else{\r
111             LOG.info("getUser  ERROR");\r
112             return  null;\r
113         }\r
114     }\r
115 \r
116     /**\r
117      *\r
118      * @param userId\r
119      * @return\r
120      */\r
121     private  VirtualNetwork getVirtualNetwork(UserId userId) {\r
122 \r
123         VirtualNetworkId virtualNetworkId = new VirtualNetworkId(userId.getValue());\r
124         VirtualNetworkKey virtualNetworkKey = new VirtualNetworkKey(virtualNetworkId);\r
125 \r
126         ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
127         InstanceIdentifier<VirtualNetwork> virtualNetworkIid = InstanceIdentifier\r
128                 .builder(VirtualNetworks.class)\r
129                 .child(VirtualNetwork.class, virtualNetworkKey)\r
130                 .build();\r
131         Optional<VirtualNetwork> result = null;\r
132 \r
133         try {\r
134             result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, virtualNetworkIid).get();\r
135 \r
136         } catch (Exception e) {\r
137             // TODO Auto-generated catch block\r
138             LOG.error("Exception:",e);\r
139         }\r
140         if (result.isPresent()) {\r
141             LOG.info("getVirtualNetwork  OK");\r
142             return (result.get());\r
143 \r
144         }else{\r
145             LOG.info("getVirtualNetwork  ERROR");\r
146             return  null;\r
147         }\r
148     }\r
149 \r
150     /**\r
151      *\r
152      * @param userId\r
153      * @return\r
154      */\r
155     private  UserIntentVnMapping getUserIntentVnMapping(UserId userId) {\r
156 \r
157         ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
158         InstanceIdentifier<UserIntentVnMapping> userIntentVnMappingIid = InstanceIdentifier\r
159                 .builder(IntentVnMappingResults.class)\r
160                 .child(UserIntentVnMapping.class, new UserIntentVnMappingKey(userId))\r
161                 .build();\r
162         Optional<UserIntentVnMapping> result = null;\r
163         try {\r
164             result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, userIntentVnMappingIid).get();\r
165         } catch (Exception e) {\r
166             // TODO Auto-generated catch block\r
167             LOG.error("Exception:",e);\r
168         }\r
169         if (result.isPresent()) {\r
170             LOG.info("getUserIntentVnMapping  OK");\r
171             return (result.get());\r
172 \r
173         }else{\r
174             LOG.info("getUserIntentVnMapping  ERROR");\r
175             return  null;\r
176         }\r
177     }\r
178 \r
179     /**\r
180      *\r
181      * @return\r
182      */\r
183     private PhysicalNetwork getPhysicalNetwork() {\r
184 \r
185         ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
186         InstanceIdentifier<PhysicalNetwork> physicalNetworkIid = InstanceIdentifier\r
187                 .builder(PhysicalNetwork.class)\r
188                 .build();\r
189         Optional<PhysicalNetwork> result = null;\r
190         try {\r
191             result = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, physicalNetworkIid).get();\r
192         } catch (Exception e) {\r
193             // TODO Auto-generated catch block\r
194             LOG.error("Exception:",e);\r
195         }\r
196         if (result.isPresent()) {\r
197             LOG.info("getPhysicalNetwork  OK");\r
198             return (result.get());\r
199 \r
200         }else{\r
201             LOG.info("getPhysicalNetwork  ERROR");\r
202             return  null;\r
203         }\r
204     }\r
205 \r
206 \r
207     /**\r
208      * A listener implementation.\r
209      */\r
210     private class UserVnPnMappingChangeListener implements DataChangeListener {\r
211 \r
212         @Override\r
213         public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
214             if ( null == change ) {\r
215                 return;\r
216             }\r
217             System.out.println();\r
218             System.out.println("Data changed for UserVnPnMapping.");\r
219             System.out.println();\r
220 \r
221             Map<InstanceIdentifier<?>, DataObject> createdData = change.getCreatedData();\r
222             if ( null != createdData && !createdData.isEmpty() ) {\r
223                 for ( DataObject dataObject : createdData.values() ) {\r
224                     if ( dataObject instanceof UserVnPnMapping ) {\r
225 \r
226                         LOG.info("Ready to call function to generate cli execution sequences for related devices.");\r
227 \r
228                         UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
229                         UserId userId = userVnPnMapping.getUserId();\r
230 \r
231                         User user = getUser(userId);\r
232                         VirtualNetwork virtualNetwork = getVirtualNetwork(userId);\r
233                         UserIntentVnMapping userIntentVnMapping = getUserIntentVnMapping(userId);\r
234                         PhysicalNetwork physicalNetwork = getPhysicalNetwork();\r
235                         if(null == physicalNetwork)\r
236                         {\r
237                             LOG.info("Physical Network data are not present.");\r
238                             return;\r
239                         }\r
240                         PhysicalNodes physicalNodes= physicalNetwork.getPhysicalNodes();\r
241                         List<PhysicalNode> physicalNodeList = physicalNodes.getPhysicalNode();\r
242                         cliBuilder.init(physicalNodeList);\r
243 \r
244                         cliBuilder.updateCliExecutionSequence(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
245 \r
246                         LOG.info("Already call cliBuilder.updateCliExecutionSequence().");\r
247                     }\r
248                 }\r
249             }\r
250 \r
251             Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
252             if ( null != updatedData && !updatedData.isEmpty() ) {\r
253                 for ( DataObject dataObject : updatedData.values() ) {\r
254                     if ( dataObject instanceof UserVnPnMapping ) {\r
255 \r
256                         LOG.info("Ready to call function to generate cli execution sequences for related devices.");\r
257 \r
258                         UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
259                         UserId userId = userVnPnMapping.getUserId();\r
260 \r
261                         // TODO: flowUtils.deleteFlowEntries(userId);??????\r
262 \r
263                         User user = getUser(userId);\r
264                         VirtualNetwork virtualNetwork = getVirtualNetwork(userId);\r
265                         UserIntentVnMapping userIntentVnMapping = getUserIntentVnMapping(userId);\r
266                         PhysicalNetwork physicalNetwork = getPhysicalNetwork();\r
267                         if(physicalNetwork == null)\r
268                         {\r
269                             LOG.info("Physical Network data are not present.");\r
270                             return;\r
271                         }\r
272 \r
273                         cliBuilder.updateCliExecutionSequence(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
274 \r
275                         LOG.info("Already call cliBuilder.updateCliExecutionSequence().");\r
276                     }\r
277                 }\r
278             }\r
279 \r
280             Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
281             Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
282             if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
283                 DataObject dataObject;\r
284 \r
285                 for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
286                     dataObject = originalData.get(instanceId);\r
287                     if ( null != dataObject && dataObject instanceof UserVnPnMapping ) {\r
288                         UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
289 \r
290                         // TODO\r
291                         // flowUtils.deleteFlowEntries(userVnPnMapping.getUserId());\r
292                     }\r
293                 }\r
294             }\r
295 \r
296             return;\r
297         }\r
298     }\r
299 \r
300     @Override\r
301     public void close() throws Exception {\r
302         if ( null != this.userVnPnMappingChangeListenerReg ) {\r
303             this.userVnPnMappingChangeListenerReg.close();\r
304         }\r
305 \r
306         if(null != this.cliBuilder){\r
307             this.cliBuilder.close();\r
308         }\r
309 \r
310                 return;\r
311     }\r
312 }\r