1 package org.opendaylight.controller.packetcable.provider;
3 import java.util.Iterator;
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;
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;
71 import com.google.common.collect.Lists;
72 import com.google.common.util.concurrent.FutureCallback;
73 import com.google.common.util.concurrent.Futures;
75 @SuppressWarnings("unused")
76 public class OpendaylightPacketcableProvider implements
77 PacketcableServiceService, PacketcableProviderRuntimeMXBean,
78 DataChangeListener, AutoCloseable {
80 private static final Logger logger = LoggerFactory.getLogger(OpendaylightPacketcableProvider.class);
81 private NotificationProviderService notificationProvider;
82 private DataBroker dataProvider;
84 private final ExecutorService executor;
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<>();
90 private List<InstanceIdentifier<CmtsInstance>> cmtsInstances;
92 public OpendaylightPacketcableProvider() {
93 executor = Executors.newCachedThreadPool();
94 cmtsInstances = Lists.newArrayList();
98 public void setNotificationProvider(final NotificationProviderService salService) {
99 this.notificationProvider = salService;
102 public void setDataProvider(final DataBroker salDataProvider) {
103 this.dataProvider = salDataProvider;
107 * Implemented from the AutoCloseable interface.
110 public void close() throws ExecutionException, InterruptedException {
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>() {
118 public void onSuccess(final Void result) {
119 logger.debug("Delete commit result: " + result);
123 public void onFailure(final Throwable t) {
124 logger.error("Delete operation failed", t);
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();
144 * Implemented from the DataChangeListener interface.
147 public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
148 DataObject dataObject = change.getUpdatedSubtree();
149 logger.debug("OpendaylightPacketcableProvider.onDataChanged() :" + dataObject);
153 public Boolean getConnectionState() {
158 public void closeCmtsConnection() {
159 for (Iterator<InstanceIdentifier<CmtsInstance>> iter = cmtsInstances.iterator(); iter.hasNext();) {
161 // notificationProvider.publish(paramNotification)
162 // iter.next().getId()
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());
176 return Futures.immediateFuture(RpcResultBuilder.<CmtsAddOutput> failed().build());
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());
189 return Futures.immediateFuture(RpcResultBuilder.<CmtsRemoveOutput> failed().build());
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());
202 return Futures.immediateFuture(RpcResultBuilder.<CmtsUpdateOutput> failed().build());
207 public Future<RpcResult<TrafficProfileGetDefaultsBestEffortOutput>> trafficProfileGetDefaultsBestEffort(TrafficProfileGetDefaultsBestEffortInput input) {
208 // TODO Auto-generated method stub
213 public Future<RpcResult<TrafficProfileGetDefaultsDownstreamServiceOutput>> trafficProfileGetDefaultsDownstreamService(TrafficProfileGetDefaultsDownstreamServiceInput input) {
214 // TODO Auto-generated method stub
219 public Future<RpcResult<TrafficProfileGetDefaultsFlowspecOutput>> trafficProfileGetDefaultsFlowspec(TrafficProfileGetDefaultsFlowspecInput input) {
220 // TODO Auto-generated method stub
225 public Future<RpcResult<TrafficProfileGetDefaultsNonRealTimePollingServiceOutput>> trafficProfileGetDefaultsNonRealTimePollingService(TrafficProfileGetDefaultsNonRealTimePollingServiceInput input) {
226 // TODO Auto-generated method stub
231 public Future<RpcResult<TrafficProfileGetDefaultsRealTimePollingServiceOutput>> trafficProfileGetDefaultsRealTimePollingService(TrafficProfileGetDefaultsRealTimePollingServiceInput input) {
232 // TODO Auto-generated method stub
237 public Future<RpcResult<TrafficProfileGetDefaultsUnsolicitedGrantServiceOutput>> trafficProfileGetDefaultsUnsolicitedGrantService(TrafficProfileGetDefaultsUnsolicitedGrantServiceInput input) {
238 // TODO Auto-generated method stub
243 public Future<RpcResult<TrafficProfileGetDefaultsUnsolicitedGrantServiceWithActivityDetectionOutput>> trafficProfileGetDefaultsUnsolicitedGrantServiceWithActivityDetection(TrafficProfileGetDefaultsUnsolicitedGrantServiceWithActivityDetectionInput input) {
244 // TODO Auto-generated method stub
249 public Future<RpcResult<TrafficProfileUpdateDefaultsBestEffortOutput>> trafficProfileUpdateDefaultsBestEffort(TrafficProfileUpdateDefaultsBestEffortInput input) {
250 // TODO Auto-generated method stub
255 public Future<RpcResult<TrafficProfileUpdateDefaultsDownstreamServiceOutput>> trafficProfileUpdateDefaultsDownstreamService(TrafficProfileUpdateDefaultsDownstreamServiceInput input) {
256 // TODO Auto-generated method stub
261 public Future<RpcResult<TrafficProfileUpdateDefaultsFlowspecOutput>> trafficProfileUpdateDefaultsFlowspec(TrafficProfileUpdateDefaultsFlowspecInput input) {
262 // TODO Auto-generated method stub
267 public Future<RpcResult<TrafficProfileUpdateDefaultsNonRealTimePollingServiceOutput>> trafficProfileUpdateDefaultsNonRealTimePollingService(TrafficProfileUpdateDefaultsNonRealTimePollingServiceInput input) {
268 // TODO Auto-generated method stub
273 public Future<RpcResult<TrafficProfileUpdateDefaultsRealTimePollingServiceOutput>> trafficProfileUpdateDefaultsRealTimePollingService(TrafficProfileUpdateDefaultsRealTimePollingServiceInput input) {
274 // TODO Auto-generated method stub
279 public Future<RpcResult<TrafficProfileUpdateDefaultsUnsolicitedGrantServiceOutput>> trafficProfileUpdateDefaultsUnsolicitedGrantService(TrafficProfileUpdateDefaultsUnsolicitedGrantServiceInput input) {
280 // TODO Auto-generated method stub
285 public Future<RpcResult<TrafficProfileUpdateDefaultsUnsolicitedGrantServiceWithActivityDetectionOutput>> trafficProfileUpdateDefaultsUnsolicitedGrantServiceWithActivityDetection(TrafficProfileUpdateDefaultsUnsolicitedGrantServiceWithActivityDetectionInput input) {
286 // TODO Auto-generated method stub