import com.google.common.util.concurrent.CheckedFuture;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.base.Optional;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException;
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.concurrent.Future;
/**
* initialization / clean up methods.
*/
-public class VnfApiProvider implements AutoCloseable, VNFAPIService, DataChangeListener {
+public class VnfApiProvider implements AutoCloseable, VNFAPIService {
protected DataBroker dataBroker;
protected NotificationPublishService notificationService;
protected RpcProviderRegistry rpcRegistry;
private static final String INVALID_INPUT_VNF_INSTANCE_STR = "invalid input, null or empty vnf-instance-id";
private VNFSDNSvcLogicServiceClient svcLogicClient;
-
+
public VnfApiProvider(DataBroker dataBroker2, NotificationPublishService notificationPublishService,
RpcProviderRegistry rpcProviderRegistry, VNFSDNSvcLogicServiceClient client) {
log.info("Creating provider for " + APP_NAME);
log.info("Successfully closed provider for " + APP_NAME);
}
- // On data change not used
- @Override
- public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-
- log.info(" IN ON DATA CHANGE: ");
-
- boolean changed = false;
- WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
- DataObject updatedSubTree = change.getUpdatedSubtree();
-
- if (updatedSubTree != null) {
- if (log.isDebugEnabled()) {
- log.debug("updatedSubTree was non-null:" + updatedSubTree);
- }
- if (updatedSubTree instanceof Vnfs) {
- changed = isChanged(changed, (Vnfs) updatedSubTree);
- }
- if (updatedSubTree instanceof PreloadVnfs) {
- changed = isChanged(changed, (PreloadVnfs) updatedSubTree);
- }
- //1610
- if (updatedSubTree instanceof PreloadVnfInstances) {
- changed = isChanged(changed, (PreloadVnfInstances) updatedSubTree);
- }
- //1610
- if (updatedSubTree instanceof VnfInstances) {
- changed = isChanged(changed, (VnfInstances) updatedSubTree);
- }
- //1610
- if (updatedSubTree instanceof PreloadVfModules) {
- changed = isChanged(changed, (PreloadVfModules) updatedSubTree);
- }
- //1610
- if (updatedSubTree instanceof VfModules) {
- changed = isChanged(changed, (VfModules) updatedSubTree);
- }
- }
-
- // Do the write transaction only if something changed.
- if (changed) {
- CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = writeTransaction.submit();
- Futures.addCallback(checkedFuture, new FutureCallback<Void>() {
-
- @Override
- public void onSuccess(Void arg0) {
- log.debug("Successfully updated Service Status");
- }
-
- @Override
- public void onFailure(Throwable e) {
- log.debug("Failed updating Service Status", e);
- }
- }, executor);
- }
- }
-
- private boolean isChanged(boolean changed, VfModules updatedSubTree) {
- ArrayList<VfModuleList> vfModuleList =
- (ArrayList<VfModuleList>) updatedSubTree.getVfModuleList();
- if (vfModuleList != null) {
- for (VfModuleList entry : vfModuleList) {
- VfModuleServiceData vfModuleServiceData = entry.getVfModuleServiceData();
- ServiceStatus serviceStatus = entry.getServiceStatus();
- if (vfModuleServiceData != null && serviceStatus != null) {
- // VfModuleServiceData change detected, check the AckFinal indicator and request-status to
- // see if we need to proceed.
- return isChanged(changed, serviceStatus);
- }
- }
- }
- return changed;
- }
-
- private boolean isChanged(boolean changed, PreloadVfModules updatedSubTree) {
- ArrayList<VfModulePreloadList> vnfInstanceList =
- (ArrayList<VfModulePreloadList>) updatedSubTree.getVfModulePreloadList();
- if (vnfInstanceList != null) {
- for (VfModulePreloadList entry : vnfInstanceList) {
- VfModulePreloadData vnfInstancePreloadData = entry.getVfModulePreloadData();
- if (vnfInstancePreloadData != null) {
- return true;
- }
- }
- }
- return changed;
- }
-
- private boolean isChanged(boolean changed, VnfInstances updatedSubTree) {
- ArrayList<VnfInstanceList> vnfInstanceList =
- (ArrayList<VnfInstanceList>) updatedSubTree.getVnfInstanceList();
- if (vnfInstanceList != null) {
- for (VnfInstanceList entry : vnfInstanceList) {
- VnfInstanceServiceData vnfInstanceServiceData = entry.getVnfInstanceServiceData();
- ServiceStatus serviceStatus = entry.getServiceStatus();
- if (vnfInstanceServiceData != null && serviceStatus != null) {
- // VnfInstanceServiceData change detected, check the AckFinal indicator and request-status
- // to see if we need to proceed.
- return isChanged(changed, serviceStatus);
- }
- }
- }
- return changed;
- }
-
- private boolean isChanged(boolean changed, PreloadVnfInstances updatedSubTree) {
- ArrayList<VnfInstancePreloadList> vnfInstanceList =
- (ArrayList<VnfInstancePreloadList>) updatedSubTree
- .getVnfInstancePreloadList();
- if (vnfInstanceList != null) {
- for (VnfInstancePreloadList entry : vnfInstanceList) {
- VnfInstancePreloadData vnfInstancePreloadData = entry.getVnfInstancePreloadData();
- if (vnfInstancePreloadData != null) {
- return true;
- }
- }
- }
- return changed;
- }
-
- private boolean isChanged(boolean changed, PreloadVnfs updatedSubTree) {
- ArrayList<VnfPreloadList> vnfList =
- (ArrayList<VnfPreloadList>) updatedSubTree.getVnfPreloadList();
- if (vnfList != null) {
- for (VnfPreloadList entry : vnfList) {
- PreloadData preloadData = entry.getPreloadData();
- if (preloadData != null) {
- return true;
- }
- }
- }
- return changed;
- }
-
- private boolean isChanged(boolean changed, Vnfs updatedSubTree) {
- ArrayList<VnfList> vnfList = (ArrayList<VnfList>) updatedSubTree.getVnfList();
- if (vnfList != null) {
- for (VnfList entry : vnfList) {
- ServiceData serviceData = entry.getServiceData();
- ServiceStatus serviceStatus = entry.getServiceStatus();
- if (serviceData != null && serviceStatus != null) {
- //
- // ServiceData change detected, check the AckFinal indicator and request-status to see if we need to proceed.
- //
- return isChanged(changed, serviceStatus);
- }
- }
- }
- return changed;
- }
- private boolean isChanged(boolean changed, ServiceStatus serviceStatus) {
- if ((!"Y".equals(serviceStatus.getFinalIndicator())) && (RequestStatus.Synccomplete
- .equals(serviceStatus.getRequestStatus()))) {
- if (log.isDebugEnabled()) {
- log.debug("Final Indicator is not Y, calling handleServiceDataUpdated");
- }
- return true;
- }
- return changed;
- }
private static class Iso8601Util {
// Each entry will be identifiable by a unique key, we have to create that identifier
InstanceIdentifier<VnfList> path = InstanceIdentifier
.builder(Vnfs.class)
- .child(VnfList.class, entry.getKey())
+ .child(VnfList.class, entry.key())
.build();
int optimisticLockTries = 2;
tryAgain = true;
} catch (final TransactionCommitFailedException e) {
-
- if (e.getCause() instanceof ModifiedNodeDoesNotExistException) {
- log.debug("Ignoring MpdifiedNodeDoesNotExistException");
+ Throwable eCause = e.getCause();
+
+
+ if (eCause instanceof org.opendaylight.mdsal.common.api.TransactionCommitFailedException) {
+ log.debug("Nested TransactionCommitFailed exception - getting next cause");
+ eCause = eCause.getCause();
+ } else {
+ log.debug("Got TransactionCommitFailedException, caused by {}", eCause.getClass().getName());
+ }
+
+ if (eCause instanceof ModifiedNodeDoesNotExistException) {
+ log.debug("Ignoring ModifiedNodeDoesNotExistException");
break;
}
- log.debug("Delete DataStore failed");
+ log.debug("Delete DataStore failed due to exception", eCause);
throw new IllegalStateException(e);
}
}
// Each entry will be identifiable by a unique key, we have to create that identifier
InstanceIdentifier<VnfList> path = InstanceIdentifier
.builder(Vnfs.class)
- .child(VnfList.class, entry.getKey())
+ .child(VnfList.class, entry.key())
.build();
tryUpdateDataStore(entry, merge, storeType, path);
// Each entry will be identifiable by a unique key, we have to create that identifier
InstanceIdentifier<VnfInstanceList> path = InstanceIdentifier
.builder(VnfInstances.class)
- .child(VnfInstanceList.class, entry.getKey())
+ .child(VnfInstanceList.class, entry.key())
.build();
tryUpdateDataStore(entry, merge, storeType, path);
// Each entry will be identifiable by a unique key, we have to create that identifier
InstanceIdentifier<VfModuleList> path = InstanceIdentifier
.builder(VfModules.class)
- .child(VfModuleList.class, entry.getKey())
+ .child(VfModuleList.class, entry.key())
.build();
tryUpdateDataStore(entry, merge, storeType, path);
// Each entry will be identifiable by a unique key, we have to create that identifier
InstanceIdentifier<VnfPreloadList> path = InstanceIdentifier
.builder(PreloadVnfs.class)
- .child(VnfPreloadList.class, entry.getKey())
+ .child(VnfPreloadList.class, entry.key())
.build();
tryUpdateDataStore(entry, merge, storeType, path);
// Each entry will be identifiable by a unique key, we have to create that identifier
InstanceIdentifier<VnfInstancePreloadList> path = InstanceIdentifier
.builder(PreloadVnfInstances.class)
- .child(VnfInstancePreloadList.class, entry.getKey())
+ .child(VnfInstancePreloadList.class, entry.key())
.build();
tryUpdateDataStore(entry, merge, storeType, path);
// Each entry will be identifiable by a unique key, we have to create that identifier
InstanceIdentifier<VfModulePreloadList> path = InstanceIdentifier
.builder(PreloadVfModules.class)
- .child(VfModulePreloadList.class, entry.getKey())
+ .child(VfModulePreloadList.class, entry.key())
.build();
tryUpdateDataStore(entry, merge, storeType, path);
&& input.getVnfInstanceRequestInformation().getVnfInstanceId().length() != 0;
}
- private Future<RpcResult<VnfInstanceTopologyOperationOutput>> buildVnfInstanceTopologyOperationOutputWithtError(
+ private ListenableFuture<RpcResult<VnfInstanceTopologyOperationOutput>> buildVnfInstanceTopologyOperationOutputWithtError(
String responseCode, String responseMessage, String ackFinalIndicator) {
VnfInstanceTopologyOperationOutputBuilder responseBuilder = new VnfInstanceTopologyOperationOutputBuilder();
responseBuilder.setResponseCode(responseCode);
}
@Override
- public Future<RpcResult<VnfInstanceTopologyOperationOutput>> vnfInstanceTopologyOperation(
+ public ListenableFuture<RpcResult<VnfInstanceTopologyOperationOutput>> vnfInstanceTopologyOperation(
VnfInstanceTopologyOperationInput input) {
final String svcOperation = "vnf-instance-topology-operation";
//1610 vf-module-topology-operation
@Override
- public Future<RpcResult<VfModuleTopologyOperationOutput>> vfModuleTopologyOperation(
+ public ListenableFuture<RpcResult<VfModuleTopologyOperationOutput>> vfModuleTopologyOperation(
VfModuleTopologyOperationInput input) {
final String svcOperation = "vf-module-topology-operation";
}
@Override
- public Future<RpcResult<VnfTopologyOperationOutput>> vnfTopologyOperation(VnfTopologyOperationInput input) {
+ public ListenableFuture<RpcResult<VnfTopologyOperationOutput>> vnfTopologyOperation(VnfTopologyOperationInput input) {
final String svcOperation = "vnf-topology-operation";
ServiceData serviceData;
ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
}
@Override
- public Future<RpcResult<NetworkTopologyOperationOutput>> networkTopologyOperation(
+ public ListenableFuture<RpcResult<NetworkTopologyOperationOutput>> networkTopologyOperation(
NetworkTopologyOperationInput input) {
final String svcOperation = "network-topology-operation";
}
@Override
- public Future<RpcResult<PreloadVnfTopologyOperationOutput>> preloadVnfTopologyOperation(
+ public ListenableFuture<RpcResult<PreloadVnfTopologyOperationOutput>> preloadVnfTopologyOperation(
PreloadVnfTopologyOperationInput input) {
final String svcOperation = "preload-vnf-topology-operation";
//1610 preload-vnf-instance-topology-operation
@Override
- public Future<RpcResult<PreloadVnfInstanceTopologyOperationOutput>> preloadVnfInstanceTopologyOperation(
+ public ListenableFuture<RpcResult<PreloadVnfInstanceTopologyOperationOutput>> preloadVnfInstanceTopologyOperation(
PreloadVnfInstanceTopologyOperationInput input) {
final String svcOperation = "preload-vnf-instance-topology-operation";
//1610 preload-vf-module-topology-operation
@Override
- public Future<RpcResult<PreloadVfModuleTopologyOperationOutput>> preloadVfModuleTopologyOperation(
+ public ListenableFuture<RpcResult<PreloadVfModuleTopologyOperationOutput>> preloadVfModuleTopologyOperation(
PreloadVfModuleTopologyOperationInput input) {
final String svcOperation = "preload-vf-module-topology-operation";
@Override
- public Future<RpcResult<PreloadNetworkTopologyOperationOutput>> preloadNetworkTopologyOperation(
+ public ListenableFuture<RpcResult<PreloadNetworkTopologyOperationOutput>> preloadNetworkTopologyOperation(
PreloadNetworkTopologyOperationInput input) {
final String svcOperation = "preload-network-topology-operation";
.build();
return Futures.immediateFuture(rpcResult);
}
+
+
}