85d0d2ee3a81c31ca128602854c6bd13efeedecb
[packetcable.git] / packetcable-provider / src / main / java / org / opendaylight / controller / packetcable / provider / OpendaylightPacketcableProvider.java
1 package org.opendaylight.controller.packetcable.provider;
2
3 import java.util.Iterator;
4 import java.util.List;
5 import java.util.concurrent.ExecutionException;
6 import java.util.concurrent.ExecutorService;
7 import java.util.concurrent.Executors;
8 import java.util.concurrent.Future;
9 import java.util.concurrent.atomic.AtomicReference;
10
11 import org.opendaylight.controller.config.yang.config.packetcable_provider.impl.PacketcableProviderRuntimeMXBean;
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
14 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
15 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.cmts.rev140120.CmtsInstance;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsAddInput;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsAddOutput;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsAddOutputBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsAdded;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsAddedBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsRemoveInput;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsRemoveOutput;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsRemoveOutputBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsRemoved;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsRemovedBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsUpdateInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsUpdateOutput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsUpdateOutputBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsUpdated;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.CmtsUpdatedBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.PacketcableServiceService;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsBestEffortInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsBestEffortOutput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsDownstreamServiceInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsDownstreamServiceOutput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsFlowspecInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsFlowspecOutput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsNonRealTimePollingServiceInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsNonRealTimePollingServiceOutput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsRealTimePollingServiceInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsRealTimePollingServiceOutput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsUnsolicitedGrantServiceInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsUnsolicitedGrantServiceOutput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsUnsolicitedGrantServiceWithActivityDetectionInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileGetDefaultsUnsolicitedGrantServiceWithActivityDetectionOutput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsBestEffortInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsBestEffortOutput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsDownstreamServiceInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsDownstreamServiceOutput;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsFlowspecInput;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsFlowspecOutput;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsNonRealTimePollingServiceInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsNonRealTimePollingServiceOutput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsRealTimePollingServiceInput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsRealTimePollingServiceOutput;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsUnsolicitedGrantServiceInput;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsUnsolicitedGrantServiceOutput;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsUnsolicitedGrantServiceWithActivityDetectionInput;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.packetcable.service.rev140120.TrafficProfileUpdateDefaultsUnsolicitedGrantServiceWithActivityDetectionOutput;
64 import org.opendaylight.yangtools.yang.binding.DataObject;
65 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
66 import org.opendaylight.yangtools.yang.common.RpcResult;
67 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
68 import org.slf4j.Logger;
69 import org.slf4j.LoggerFactory;
70
71 import com.google.common.collect.Lists;
72 import com.google.common.util.concurrent.FutureCallback;
73 import com.google.common.util.concurrent.Futures;
74
75 @SuppressWarnings("unused")
76 public class OpendaylightPacketcableProvider implements
77                 PacketcableServiceService, PacketcableProviderRuntimeMXBean,
78                 DataChangeListener, AutoCloseable {
79
80         private static final Logger logger = LoggerFactory.getLogger(OpendaylightPacketcableProvider.class);
81         private NotificationProviderService notificationProvider;
82         private DataBroker dataProvider;
83
84         private final ExecutorService executor;
85
86         // The following holds the Future for the current make toast task.
87         // This is used to cancel the current toast.
88         private final AtomicReference<Future<?>> currentConnectionsTasks = new AtomicReference<>();
89
90         private List<InstanceIdentifier<CmtsInstance>> cmtsInstances;
91
92         public OpendaylightPacketcableProvider() {
93                 executor = Executors.newCachedThreadPool();
94                 cmtsInstances = Lists.newArrayList();
95
96         }
97
98         public void setNotificationProvider(final NotificationProviderService salService) {
99                 this.notificationProvider = salService;
100         }
101
102         public void setDataProvider(final DataBroker salDataProvider) {
103                 this.dataProvider = salDataProvider;
104         }
105
106         /**
107          * Implemented from the AutoCloseable interface.
108          */
109         @Override
110         public void close() throws ExecutionException, InterruptedException {
111                 executor.shutdown();
112                 if (dataProvider != null) {
113                         for (Iterator<InstanceIdentifier<CmtsInstance>> iter = cmtsInstances.iterator(); iter.hasNext();) {
114                                 WriteTransaction tx = dataProvider.newWriteOnlyTransaction();
115                                 tx.delete(LogicalDatastoreType.OPERATIONAL, iter.next());
116                                 Futures.addCallback(tx.submit(), new FutureCallback<Void>() {
117                                         @Override
118                                         public void onSuccess(final Void result) {
119                                                 logger.debug("Delete commit result: " + result);
120                                         }
121
122                                         @Override
123                                         public void onFailure(final Throwable t) {
124                                                 logger.error("Delete operation failed", t);
125                                         }
126                                 });
127                         }
128                 }
129         }
130
131         // private CmtsInstance buildCmtsConnection(final String host) {
132         // InetAddress address = InetAddress.getByName(host);
133         // IpAddress ipAddress =
134         // IpAddressBuilder.getDefaultInstance(address.getHostAddress());
135         // PcmmConfigurationBuilder pcmmConfigurationBuilder = new
136         // PcmmConfigurationBuilder().setIpAddress(ipAddress);
137         // org.opendaylight.yang.gen.v1.urn.opendaylight.node.cmts.rev140120.cmts.instance.ConfigurationPointsBuilder
138         // configurationPointsBuilder = new
139         // org.opendaylight.yang.gen.v1.urn.opendaylight.node.cmts.rev140120.cmts.instance.ConfigurationPointsBuilder().build();
140         // return new CmtsAddedBuilder().setConfigurationPoints().build();
141         // }
142
143         /**
144          * Implemented from the DataChangeListener interface.
145          */
146         @Override
147         public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
148                 DataObject dataObject = change.getUpdatedSubtree();
149                 logger.debug("OpendaylightPacketcableProvider.onDataChanged() :" + dataObject);
150         }
151
152         @Override
153         public Boolean getConnectionState() {
154                 return null;
155         }
156
157         @Override
158         public void closeCmtsConnection() {
159                 for (Iterator<InstanceIdentifier<CmtsInstance>> iter = cmtsInstances.iterator(); iter.hasNext();) {
160
161                         // notificationProvider.publish(paramNotification)
162                         // iter.next().getId()
163                 }
164         }
165
166         @Override
167         public Future<RpcResult<CmtsAddOutput>> cmtsAdd(CmtsAddInput input) {
168                 //TODO how to get this transaction id ???
169                 TransactionId transactionId = null;
170                 if (transactionId != null) {
171                         CmtsAdded cmtsAdded = new CmtsAddedBuilder().setCmtsRef(input.getCmtsRef()).setId(input.getId()).setConfigurationPoints(input.getConfigurationPoints()).setTransactionUri(input.getTransactionUri()).setTransactionId(transactionId).setNode(input.getNode()).setManagedCableModemSubscribers(input.getManagedCableModemSubscribers()).build();
172                         notificationProvider.publish(cmtsAdded);
173                         CmtsAddOutput output = new CmtsAddOutputBuilder().setTransactionId(transactionId).build();
174                         return Futures.immediateFuture(RpcResultBuilder.success(output).build());
175                 } else {
176                         return Futures.immediateFuture(RpcResultBuilder.<CmtsAddOutput> failed().build());
177                 }
178         }
179
180         @Override
181         public Future<RpcResult<CmtsRemoveOutput>> cmtsRemove(CmtsRemoveInput input) {
182                 TransactionId transactionId = null;
183                 if (transactionId != null) {
184                         CmtsRemoved cmtsRemoved = new CmtsRemovedBuilder().setCmtsRef(input.getCmtsRef()).setId(input.getId()).setConfigurationPoints(input.getConfigurationPoints()).setTransactionUri(input.getTransactionUri()).setTransactionId(transactionId).setNode(input.getNode()).setManagedCableModemSubscribers(input.getManagedCableModemSubscribers()).build();
185                         notificationProvider.publish(cmtsRemoved);
186                         CmtsRemoveOutput output = new CmtsRemoveOutputBuilder().setTransactionId(transactionId).build();
187                         return Futures.immediateFuture(RpcResultBuilder.success(output).build());
188                 } else {
189                         return Futures.immediateFuture(RpcResultBuilder.<CmtsRemoveOutput> failed().build());
190                 }
191         }
192
193         @Override
194         public Future<RpcResult<CmtsUpdateOutput>> cmtsUpdate(CmtsUpdateInput input) {
195                 TransactionId transactionId = null;
196                 if (transactionId != null) {
197                         CmtsUpdated cmtsUpdated = new CmtsUpdatedBuilder().setCmtsRef(input.getCmtsRef()).setId(input.getOriginalCmts().getId()).setConfigurationPoints(input.getOriginalCmts().getConfigurationPoints()).setTransactionUri(input.getTransactionUri()).setTransactionId(transactionId).setNode(input.getNode()).setManagedCableModemSubscribers(input.getOriginalCmts().getManagedCableModemSubscribers()).build();
198                         notificationProvider.publish(cmtsUpdated);
199                         CmtsUpdateOutput output = new CmtsUpdateOutputBuilder().setTransactionId(transactionId).build();
200                         return Futures.immediateFuture(RpcResultBuilder.success(output).build());
201                 } else {
202                         return Futures.immediateFuture(RpcResultBuilder.<CmtsUpdateOutput> failed().build());
203                 }
204         }
205
206         @Override
207         public Future<RpcResult<TrafficProfileGetDefaultsBestEffortOutput>> trafficProfileGetDefaultsBestEffort(TrafficProfileGetDefaultsBestEffortInput input) {
208                 // TODO Auto-generated method stub
209                 return null;
210         }
211
212         @Override
213         public Future<RpcResult<TrafficProfileGetDefaultsDownstreamServiceOutput>> trafficProfileGetDefaultsDownstreamService(TrafficProfileGetDefaultsDownstreamServiceInput input) {
214                 // TODO Auto-generated method stub
215                 return null;
216         }
217
218         @Override
219         public Future<RpcResult<TrafficProfileGetDefaultsFlowspecOutput>> trafficProfileGetDefaultsFlowspec(TrafficProfileGetDefaultsFlowspecInput input) {
220                 // TODO Auto-generated method stub
221                 return null;
222         }
223
224         @Override
225         public Future<RpcResult<TrafficProfileGetDefaultsNonRealTimePollingServiceOutput>> trafficProfileGetDefaultsNonRealTimePollingService(TrafficProfileGetDefaultsNonRealTimePollingServiceInput input) {
226                 // TODO Auto-generated method stub
227                 return null;
228         }
229
230         @Override
231         public Future<RpcResult<TrafficProfileGetDefaultsRealTimePollingServiceOutput>> trafficProfileGetDefaultsRealTimePollingService(TrafficProfileGetDefaultsRealTimePollingServiceInput input) {
232                 // TODO Auto-generated method stub
233                 return null;
234         }
235
236         @Override
237         public Future<RpcResult<TrafficProfileGetDefaultsUnsolicitedGrantServiceOutput>> trafficProfileGetDefaultsUnsolicitedGrantService(TrafficProfileGetDefaultsUnsolicitedGrantServiceInput input) {
238                 // TODO Auto-generated method stub
239                 return null;
240         }
241
242         @Override
243         public Future<RpcResult<TrafficProfileGetDefaultsUnsolicitedGrantServiceWithActivityDetectionOutput>> trafficProfileGetDefaultsUnsolicitedGrantServiceWithActivityDetection(TrafficProfileGetDefaultsUnsolicitedGrantServiceWithActivityDetectionInput input) {
244                 // TODO Auto-generated method stub
245                 return null;
246         }
247
248         @Override
249         public Future<RpcResult<TrafficProfileUpdateDefaultsBestEffortOutput>> trafficProfileUpdateDefaultsBestEffort(TrafficProfileUpdateDefaultsBestEffortInput input) {
250                 // TODO Auto-generated method stub
251                 return null;
252         }
253
254         @Override
255         public Future<RpcResult<TrafficProfileUpdateDefaultsDownstreamServiceOutput>> trafficProfileUpdateDefaultsDownstreamService(TrafficProfileUpdateDefaultsDownstreamServiceInput input) {
256                 // TODO Auto-generated method stub
257                 return null;
258         }
259
260         @Override
261         public Future<RpcResult<TrafficProfileUpdateDefaultsFlowspecOutput>> trafficProfileUpdateDefaultsFlowspec(TrafficProfileUpdateDefaultsFlowspecInput input) {
262                 // TODO Auto-generated method stub
263                 return null;
264         }
265
266         @Override
267         public Future<RpcResult<TrafficProfileUpdateDefaultsNonRealTimePollingServiceOutput>> trafficProfileUpdateDefaultsNonRealTimePollingService(TrafficProfileUpdateDefaultsNonRealTimePollingServiceInput input) {
268                 // TODO Auto-generated method stub
269                 return null;
270         }
271
272         @Override
273         public Future<RpcResult<TrafficProfileUpdateDefaultsRealTimePollingServiceOutput>> trafficProfileUpdateDefaultsRealTimePollingService(TrafficProfileUpdateDefaultsRealTimePollingServiceInput input) {
274                 // TODO Auto-generated method stub
275                 return null;
276         }
277
278         @Override
279         public Future<RpcResult<TrafficProfileUpdateDefaultsUnsolicitedGrantServiceOutput>> trafficProfileUpdateDefaultsUnsolicitedGrantService(TrafficProfileUpdateDefaultsUnsolicitedGrantServiceInput input) {
280                 // TODO Auto-generated method stub
281                 return null;
282         }
283
284         @Override
285         public Future<RpcResult<TrafficProfileUpdateDefaultsUnsolicitedGrantServiceWithActivityDetectionOutput>> trafficProfileUpdateDefaultsUnsolicitedGrantServiceWithActivityDetection(TrafficProfileUpdateDefaultsUnsolicitedGrantServiceWithActivityDetectionInput input) {
286                 // TODO Auto-generated method stub
287                 return null;
288         }
289
290 }