294ecd7d1c1e15b59d38526e7900fefec9f0150b
[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             e.printStackTrace();\r
104         }\r
105         if (result.isPresent()){\r
106             LOG.info("getUser  OK");\r
107             return (result.get());\r
108 \r
109         }else{\r
110             LOG.info("getUser  ERROR");\r
111             return  null;\r
112         }\r
113     }\r
114 \r
115     /**\r
116      *\r
117      * @param userId\r
118      * @return\r
119      */\r
120     private  VirtualNetwork getVirtualNetwork(UserId userId) {\r
121 \r
122         VirtualNetworkId virtualNetworkId = new VirtualNetworkId(userId.getValue());\r
123         VirtualNetworkKey virtualNetworkKey = new VirtualNetworkKey(virtualNetworkId);\r
124 \r
125         ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
126         InstanceIdentifier<VirtualNetwork> virtualNetworkIid = InstanceIdentifier\r
127                 .builder(VirtualNetworks.class)\r
128                 .child(VirtualNetwork.class, virtualNetworkKey)\r
129                 .build();\r
130         Optional<VirtualNetwork> result = null;\r
131 \r
132         try {\r
133             result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, virtualNetworkIid).get();\r
134 \r
135         } catch (Exception e) {\r
136             e.printStackTrace();\r
137         }\r
138         if (result.isPresent()) {\r
139             LOG.info("getVirtualNetwork  OK");\r
140             return (result.get());\r
141 \r
142         }else{\r
143             LOG.info("getVirtualNetwork  ERROR");\r
144             return  null;\r
145         }\r
146     }\r
147 \r
148     /**\r
149      *\r
150      * @param userId\r
151      * @return\r
152      */\r
153     private  UserIntentVnMapping getUserIntentVnMapping(UserId userId) {\r
154 \r
155         ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
156         InstanceIdentifier<UserIntentVnMapping> userIntentVnMappingIid = InstanceIdentifier\r
157                 .builder(IntentVnMappingResults.class)\r
158                 .child(UserIntentVnMapping.class, new UserIntentVnMappingKey(userId))\r
159                 .build();\r
160         Optional<UserIntentVnMapping> result = null;\r
161         try {\r
162             result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, userIntentVnMappingIid).get();\r
163         } catch (Exception e) {\r
164             e.printStackTrace();\r
165         }\r
166         if (result.isPresent()) {\r
167             LOG.info("getUserIntentVnMapping  OK");\r
168             return (result.get());\r
169 \r
170         }else{\r
171             LOG.info("getUserIntentVnMapping  ERROR");\r
172             return  null;\r
173         }\r
174     }\r
175 \r
176     /**\r
177      *\r
178      * @return\r
179      */\r
180     private PhysicalNetwork getPhysicalNetwork() {\r
181 \r
182         ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
183         InstanceIdentifier<PhysicalNetwork> physicalNetworkIid = InstanceIdentifier\r
184                 .builder(PhysicalNetwork.class)\r
185                 .build();\r
186         Optional<PhysicalNetwork> result = null;\r
187         try {\r
188             result = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, physicalNetworkIid).get();\r
189         } catch (Exception e) {\r
190             e.printStackTrace();\r
191         }\r
192         if (result.isPresent()) {\r
193             LOG.info("getPhysicalNetwork  OK");\r
194             return (result.get());\r
195 \r
196         }else{\r
197             LOG.info("getPhysicalNetwork  ERROR");\r
198             return  null;\r
199         }\r
200     }\r
201 \r
202 \r
203     /**\r
204      * A listener implementation.\r
205      */\r
206     private class UserVnPnMappingChangeListener implements DataChangeListener {\r
207 \r
208         @Override\r
209         public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
210             if ( null == change ) {\r
211                 return;\r
212             }\r
213             System.out.println();\r
214             System.out.println("Data changed for UserVnPnMapping.");\r
215             System.out.println();\r
216 \r
217             Map<InstanceIdentifier<?>, DataObject> createdData = change.getCreatedData();\r
218             if ( null != createdData && !createdData.isEmpty() ) {\r
219                 for ( DataObject dataObject : createdData.values() ) {\r
220                     if ( dataObject instanceof UserVnPnMapping ) {\r
221 \r
222                         LOG.info("Ready to call function to generate cli execution sequences for related devices.");\r
223 \r
224                         UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
225                         UserId userId = userVnPnMapping.getUserId();\r
226 \r
227                         User user = getUser(userId);\r
228                         VirtualNetwork virtualNetwork = getVirtualNetwork(userId);\r
229                         UserIntentVnMapping userIntentVnMapping = getUserIntentVnMapping(userId);\r
230                         PhysicalNetwork physicalNetwork = getPhysicalNetwork();\r
231                         if(null == physicalNetwork)\r
232                         {\r
233                             LOG.info("Physical Network data are not present.");\r
234                             return;\r
235                         }\r
236                         PhysicalNodes physicalNodes= physicalNetwork.getPhysicalNodes();\r
237                         List<PhysicalNode> physicalNodeList = physicalNodes.getPhysicalNode();\r
238                         cliBuilder.init(physicalNodeList);\r
239 \r
240                         cliBuilder.updateCliExecutionSequence(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
241 \r
242                         LOG.info("Already call cliBuilder.updateCliExecutionSequence().");\r
243                     }\r
244                 }\r
245             }\r
246 \r
247             Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
248             if ( null != updatedData && !updatedData.isEmpty() ) {\r
249                 for ( DataObject dataObject : updatedData.values() ) {\r
250                     if ( dataObject instanceof UserVnPnMapping ) {\r
251 \r
252                         LOG.info("Ready to call function to generate cli execution sequences for related devices.");\r
253 \r
254                         UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
255                         UserId userId = userVnPnMapping.getUserId();\r
256 \r
257                         // TODO: flowUtils.deleteFlowEntries(userId);??????\r
258 \r
259                         User user = getUser(userId);\r
260                         VirtualNetwork virtualNetwork = getVirtualNetwork(userId);\r
261                         UserIntentVnMapping userIntentVnMapping = getUserIntentVnMapping(userId);\r
262                         PhysicalNetwork physicalNetwork = getPhysicalNetwork();\r
263                         if(physicalNetwork == null)\r
264                         {\r
265                             LOG.info("Physical Network data are not present.");\r
266                             return;\r
267                         }\r
268 \r
269                         cliBuilder.updateCliExecutionSequence(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
270 \r
271                         LOG.info("Already call cliBuilder.updateCliExecutionSequence().");\r
272                     }\r
273                 }\r
274             }\r
275 \r
276             Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
277             Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
278             if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
279                 DataObject dataObject;\r
280 \r
281                 for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
282                     dataObject = originalData.get(instanceId);\r
283                     if ( null != dataObject && dataObject instanceof UserVnPnMapping ) {\r
284                         UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
285 \r
286                         // TODO\r
287                         // flowUtils.deleteFlowEntries(userVnPnMapping.getUserId());\r
288                     }\r
289                 }\r
290             }\r
291 \r
292             return;\r
293         }\r
294     }\r
295 \r
296     @Override\r
297     public void close() throws Exception {\r
298         if ( null != this.userVnPnMappingChangeListenerReg ) {\r
299             this.userVnPnMappingChangeListenerReg.close();\r
300         }\r
301 \r
302         if(null != this.cliBuilder){\r
303             this.cliBuilder.close();\r
304         }\r
305 \r
306                 return;\r
307     }\r
308 }\r