Bug 5077: Codes break the security rules
[nemo.git] / nemo-renderers / openflow-renderer / src / main / java / org / opendaylight / nemo / renderer / openflow / FlowTableManager.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.openflow;\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.nemo.renderer.openflow.physicalnetwork.PhyConfigLoader;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalNodes;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.VirtualNetworks;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetwork;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetworkKey;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.IntentVnMappingResults;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.VnPnMappingResults;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMapping;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMappingKey;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMapping;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNetworkId;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.Users;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.UserKey;\r
36 import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
37 import org.opendaylight.yangtools.yang.binding.DataObject;\r
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
39 import org.slf4j.Logger;\r
40 import org.slf4j.LoggerFactory;\r
41 \r
42 import java.util.List;\r
43 import java.util.Map;\r
44 import java.util.Set;\r
45 \r
46 public class FlowTableManager implements AutoCloseable {\r
47     private static final Logger LOG = LoggerFactory.getLogger(FlowTableManager.class);\r
48 \r
49     private final DataBroker dataProvider;\r
50     private final PacketProcessingService packetProcessingService;\r
51 \r
52     private ListenerRegistration<DataChangeListener> userVnPnMappingChangeListenerReg;\r
53 \r
54     private FlowUtils flowUtils = null;\r
55 \r
56     public FlowTableManager(DataBroker dataProvider,\r
57                             PacketProcessingService packetProcessingService,\r
58                             PhyConfigLoader phyConfigLoader) {\r
59         super();\r
60 \r
61         this.dataProvider = dataProvider;\r
62         this.packetProcessingService = packetProcessingService;\r
63 \r
64         LOG.debug("Initialized FlowTableManager.");\r
65 \r
66         flowUtils = new FlowUtils(dataProvider, packetProcessingService, phyConfigLoader);\r
67 \r
68         // Register listener;\r
69         registerUserVnPnMappingListener();\r
70     }\r
71 \r
72     protected FlowUtils getFlowUtils() {\r
73         return flowUtils;\r
74     }\r
75 \r
76     private void registerUserVnPnMappingListener() {\r
77 \r
78         //build userVnPnMappingIid\r
79         InstanceIdentifier<UserVnPnMapping> userVnPnMappingIid = InstanceIdentifier\r
80                 .builder(VnPnMappingResults.class)\r
81                 .child(UserVnPnMapping.class)\r
82                 .build();\r
83         //register\r
84         userVnPnMappingChangeListenerReg = dataProvider.registerDataChangeListener(\r
85                 LogicalDatastoreType.CONFIGURATION, userVnPnMappingIid,\r
86                 new UserVnPnMappingChangeListener(), DataChangeScope.BASE);\r
87     }\r
88 \r
89 \r
90     private User getUser(UserId userId) {\r
91 \r
92         ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
93         InstanceIdentifier<User> userIid = InstanceIdentifier.builder(Users.class)\r
94                 .child(User.class, new UserKey(userId))\r
95                 .build();\r
96         Optional<User> result = null;\r
97 \r
98         try {\r
99             result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, userIid).get();\r
100         } catch (Exception e) {\r
101             // TODO Auto-generated catch block\r
102             LOG.error("Exception:",e);\r
103         }\r
104         if (result.isPresent()){\r
105             LOG.debug("getUser  OK");\r
106             return (result.get());\r
107 \r
108         }else{\r
109             LOG.debug("getUser  ERROR");\r
110             return  null;\r
111         }\r
112     }\r
113 \r
114 \r
115     private  VirtualNetwork getVirtualNetwork(UserId userId) {\r
116 \r
117         VirtualNetworkId virtualNetworkId = new VirtualNetworkId(userId.getValue());\r
118         VirtualNetworkKey virtualNetworkKey = new VirtualNetworkKey(virtualNetworkId);\r
119 \r
120         ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
121         InstanceIdentifier<VirtualNetwork> virtualNetworkIid = InstanceIdentifier\r
122                 .builder(VirtualNetworks.class)\r
123                 .child(VirtualNetwork.class, virtualNetworkKey)\r
124                 .build();\r
125         Optional<VirtualNetwork> result = null;\r
126 \r
127         try {\r
128             result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, virtualNetworkIid).get();\r
129 \r
130         } catch (Exception e) {\r
131             // TODO Auto-generated catch block\r
132             LOG.error("Exception:",e);\r
133         }\r
134         if (result.isPresent()) {\r
135             LOG.debug("getVirtualNetwork  OK");\r
136             return (result.get());\r
137 \r
138         }else{\r
139             LOG.debug("getVirtualNetwork  ERROR");\r
140             return  null;\r
141         }\r
142     }\r
143 \r
144     private  UserIntentVnMapping getUserIntentVnMapping(UserId userId) {\r
145 \r
146         ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
147         InstanceIdentifier<UserIntentVnMapping> userIntentVnMappingIid = InstanceIdentifier\r
148                 .builder(IntentVnMappingResults.class)\r
149                 .child(UserIntentVnMapping.class, new UserIntentVnMappingKey(userId))\r
150                 .build();\r
151         Optional<UserIntentVnMapping> result = null;\r
152         try {\r
153             result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, userIntentVnMappingIid).get();\r
154         } catch (Exception e) {\r
155             // TODO Auto-generated catch block\r
156             LOG.error("Exception:",e);\r
157         }\r
158         if (result.isPresent()) {\r
159             LOG.debug("getUserIntentVnMapping  OK");\r
160             return (result.get());\r
161 \r
162         }else{\r
163             LOG.debug("getUserIntentVnMapping  ERROR");\r
164             return  null;\r
165         }\r
166     }\r
167 \r
168     private PhysicalNetwork getPhysicalNetwork() {\r
169 \r
170         ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
171         InstanceIdentifier<PhysicalNetwork> physicalNetworkIid = InstanceIdentifier\r
172                 .builder(PhysicalNetwork.class)\r
173                 .build();\r
174         Optional<PhysicalNetwork> result = null;\r
175         try {\r
176             result = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, physicalNetworkIid).get();\r
177         } catch (Exception e) {\r
178             // TODO Auto-generated catch block\r
179             LOG.error("Exception:",e);\r
180         }\r
181         if (result.isPresent()) {\r
182             LOG.debug("getPhysicalNetwork  OK");\r
183             return (result.get());\r
184 \r
185         }else{\r
186             LOG.debug("getPhysicalNetwork  ERROR");\r
187             return  null;\r
188         }\r
189     }\r
190 \r
191 \r
192     //A listener implementation\r
193     private class UserVnPnMappingChangeListener implements DataChangeListener {\r
194 \r
195         @Override\r
196         public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
197             if ( null == change ) {\r
198                 return;\r
199             }\r
200 \r
201             Map<InstanceIdentifier<?>, DataObject> createdData = change.getCreatedData();\r
202             if ( null != createdData && !createdData.isEmpty() ) {\r
203                 for ( DataObject dataObject : createdData.values() ) {\r
204                     if ( dataObject instanceof UserVnPnMapping ) {\r
205                         LOG.debug("Ready to update flow table.");\r
206                         UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
207                         UserId userId = userVnPnMapping.getUserId();\r
208 \r
209                         User user = getUser(userId);\r
210                         VirtualNetwork virtualNetwork = getVirtualNetwork(userId);\r
211                         UserIntentVnMapping userIntentVnMapping = getUserIntentVnMapping(userId);\r
212                         PhysicalNetwork physicalNetwork = getPhysicalNetwork();\r
213                         if(physicalNetwork == null)\r
214                         {\r
215                             LOG.debug("Physical Network data are not present.");\r
216                             return;\r
217                         }\r
218                         PhysicalNodes physicalNodes= physicalNetwork.getPhysicalNodes();\r
219                         List<PhysicalNode> physicalNodeList = physicalNodes.getPhysicalNode();\r
220                         flowUtils.init(physicalNodeList);\r
221 \r
222                         flowUtils.updateFlowTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
223                         LOG.debug("Already call flowUtils.updateFlowTable().");\r
224                     }\r
225                 }\r
226             }\r
227 \r
228             Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
229             if ( null != updatedData && !updatedData.isEmpty() ) {\r
230                 for ( DataObject dataObject : updatedData.values() ) {\r
231                     if ( dataObject instanceof UserVnPnMapping ) {\r
232                         UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
233                         UserId userId = userVnPnMapping.getUserId();\r
234 \r
235                         flowUtils.deleteFlowEntries(userId);\r
236 \r
237                         User user = getUser(userId);\r
238                         VirtualNetwork virtualNetwork = getVirtualNetwork(userId);\r
239                         UserIntentVnMapping userIntentVnMapping = getUserIntentVnMapping(userId);\r
240                         PhysicalNetwork physicalNetwork = getPhysicalNetwork();\r
241                         if(physicalNetwork == null)\r
242                         {\r
243                             LOG.debug("Physical Network data are not present.");\r
244                             return;\r
245                         }\r
246 \r
247                         flowUtils.updateFlowTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
248                     }\r
249                 }\r
250             }\r
251 \r
252             Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
253             Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
254             if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
255                 DataObject dataObject;\r
256 \r
257                 for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
258                     dataObject = originalData.get(instanceId);\r
259                     if ( null != dataObject && dataObject instanceof UserVnPnMapping ) {\r
260                         UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
261                         flowUtils.deleteFlowEntries(userVnPnMapping.getUserId());\r
262                     }\r
263                 }\r
264             }\r
265             return;\r
266         }\r
267     }\r
268 \r
269     @Override\r
270     public void close() throws Exception {\r
271 \r
272         if ( null != userVnPnMappingChangeListenerReg ) {\r
273             userVnPnMappingChangeListenerReg.close();\r
274         }\r
275         if ( null != flowUtils ) {\r
276             flowUtils.close();\r
277         }\r
278     }\r
279 }\r