*/
package org.opendaylight.genius.itm.confighelpers;
-import java.math.BigInteger;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.ArrayList;
import java.util.List;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import java.util.Map;
+import java.util.Objects;
+import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.genius.itm.globals.ITMConstants;
import org.opendaylight.genius.itm.impl.ItmUtils;
import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.util.Datastore;
+import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunner;
+import org.opendaylight.mdsal.binding.util.TypedWriteTransaction;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.NotHostedTransportZones;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZones;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.not.hosted.transport.zones.TepsInNotHostedTransportZone;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.not.hosted.transport.zones.tepsinnothostedtransportzone.UnknownVtepsKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Subnets;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.SubnetsKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.Vteps;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.VtepsKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Vteps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.VtepsKey;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Uint64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger LOG = LoggerFactory.getLogger(OvsdbTepRemoveConfigHelper.class);
- private OvsdbTepRemoveConfigHelper() { }
+ private OvsdbTepRemoveConfigHelper() {
+
+ }
/**
* Removes the TEP from ITM configuration/operational Datastore in one of the following cases.
* @param strDpnId bridge datapath ID in string
* @param tzName transport zone name in string
* @param dataBroker data broker handle to perform operations on config/operational datastore
- * @param wrTx WriteTransaction object
+ * @param txRunner ManagedNewTransactionRunner object
*/
-
- public static void removeTepReceivedFromOvsdb(String tepIp, String strDpnId, String tzName,
- DataBroker dataBroker, WriteTransaction wrTx) {
- BigInteger dpnId = BigInteger.valueOf(0);
-
+ public static List<? extends ListenableFuture<?>> removeTepReceivedFromOvsdb(String tepIp, String strDpnId,
+ String tzName, DataBroker dataBroker,
+ ManagedNewTransactionRunner txRunner) {
+ List<ListenableFuture<?>> futures = new ArrayList<>();
+ Uint64 dpnId = Uint64.ZERO;
LOG.trace("Remove TEP: TEP-IP: {}, TZ name: {}, DPID: {}", tepIp, tzName, strDpnId);
if (strDpnId != null && !strDpnId.isEmpty()) {
dpnId = MDSALUtil.getDpnId(strDpnId);
}
-
// Get tep IP
IpAddress tepIpAddress = IpAddressBuilder.getDefaultInstance(tepIp);
- TransportZone transportZone = null;
+ TransportZone transportZone;
// Case: TZ name is not given from OVS's other_config parameters.
if (tzName == null) {
transportZone = ItmUtils.getTransportZoneFromConfigDS(tzName, dataBroker);
if (transportZone == null) {
LOG.error("Error: default-transport-zone is not yet created.");
- return;
+ return futures;
}
LOG.trace("Remove TEP from default-transport-zone.");
} else {
// Case: Add TEP into corresponding TZ created from Northbound.
transportZone = ItmUtils.getTransportZoneFromConfigDS(tzName, dataBroker);
+ String name = tzName;
+ Uint64 id = dpnId;
if (transportZone == null) {
// Case: TZ is not configured from Northbound, then add TEP into
// "teps-in-not-hosted-transport-zone"
LOG.trace("Removing TEP from teps-in-not-hosted-transport-zone list.");
- removeUnknownTzTepFromTepsNotHosted(tzName, tepIpAddress, dpnId, dataBroker, wrTx);
- return;
+ futures.add(txRunner.callWithNewWriteOnlyTransactionAndSubmit(Datastore.OPERATIONAL,
+ tx -> removeUnknownTzTepFromTepsNotHosted(name, tepIpAddress, id, dataBroker, tx)));
+ return futures;
} else {
LOG.trace("Remove TEP from transport-zone already configured by Northbound.");
}
// Remove TEP from (default transport-zone) OR (transport-zone already configured by Northbound)
- // Get subnet list of corresponding TZ created from Northbound.
- List<Subnets> subnetList = transportZone.getSubnets();
-
- if (subnetList == null || subnetList.isEmpty()) {
- LOG.trace("No subnet list in transport-zone. Nothing to do.");
+ @Nullable Map<VtepsKey, Vteps> vtepList = transportZone.getVteps();
+ if (vtepList == null || vtepList.isEmpty()) {
+ // case: vtep list does not exist or it has no elements
+ LOG.trace("No vtep list in subnet list of transport-zone. Nothing to do.");
} else {
- IpPrefix subnetMaskObj = ItmUtils.getDummySubnet();
-
- List<Vteps> vtepList = null;
-
- // subnet list already exists case; check for dummy-subnet
- for (Subnets subnet : subnetList) {
- if (subnet.key().getPrefix().equals(subnetMaskObj)) {
- LOG.trace("Subnet exists in the subnet list of transport-zone {}.", tzName);
- // get vtep list of existing subnet
- vtepList = subnet.getVteps();
+ // case: vtep list has elements
+ boolean vtepFound = false;
+ Vteps oldVtep = null;
+
+ for (Vteps vtep : vtepList.values()) {
+ if (Objects.equals(vtep.getDpnId(), dpnId)) {
+ vtepFound = true;
+ oldVtep = vtep;
break;
}
}
-
- if (vtepList == null || vtepList.isEmpty()) {
- // case: vtep list does not exist or it has no elements
- LOG.trace("No vtep list in subnet list of transport-zone. Nothing to do.");
+ if (vtepFound) {
+ // vtep is found, update it with tep-ip
+ LOG.trace("Remove TEP from vtep list in subnet list of transport-zone.");
+ dpnId = oldVtep.getDpnId();
+ String name = tzName;
+ Uint64 id = dpnId;
+ futures.add(txRunner.callWithNewWriteOnlyTransactionAndSubmit(Datastore.CONFIGURATION,
+ tx -> removeVtepFromTZConfig(name, id, tx)));
} else {
- // case: vtep list has elements
- boolean vtepFound = false;
- Vteps oldVtep = null;
-
- for (Vteps vtep : vtepList) {
- if (vtep.getDpnId().equals(dpnId)) {
- vtepFound = true;
- oldVtep = vtep;
- break;
- }
- }
- if (vtepFound) {
- // vtep is found, update it with tep-ip
- LOG.trace("Remove TEP from vtep list in subnet list of transport-zone.");
- dpnId = oldVtep.getDpnId();
- String portName = oldVtep.getPortname();
- removeVtepFromTZConfig(subnetMaskObj, tzName, dpnId, portName, wrTx);
- } else {
- LOG.trace(
+ LOG.trace(
"TEP is not found in the vtep list in subnet list of transport-zone. Nothing to do.");
- }
}
}
+ return futures;
}
/**
* Removes the TEP from subnet list in the transport zone list
* from ITM configuration Datastore by delete operation with write transaction.
*
- * @param subnetMaskObj subnet mask in IpPrefix object
- * @param dpnId bridge datapath ID in BigInteger
+ * @param dpnId bridge datapath ID
* @param tzName transport zone name in string
- * @param portName port name as a part of VtepsKey
- * @param wrTx WriteTransaction object
+ * @param tx TypedWriteTransaction object
*/
- private static void removeVtepFromTZConfig(IpPrefix subnetMaskObj, String tzName, BigInteger dpnId,
- String portName, WriteTransaction wrTx) {
- SubnetsKey subnetsKey = new SubnetsKey(subnetMaskObj);
- VtepsKey vtepkey = new VtepsKey(dpnId, portName);
+ private static void removeVtepFromTZConfig(String tzName, Uint64 dpnId,
+ TypedWriteTransaction<Datastore.Configuration> tx) {
+
+ VtepsKey vtepkey = new VtepsKey(dpnId);
InstanceIdentifier<Vteps> vtepPath = InstanceIdentifier.builder(TransportZones.class)
- .child(TransportZone.class, new TransportZoneKey(tzName))
- .child(Subnets.class, subnetsKey).child(Vteps.class, vtepkey).build();
+ .child(TransportZone.class, new TransportZoneKey(tzName))
+ .child(Vteps.class, vtepkey).build();
- LOG.trace("Removing TEP from (TZ: {} Subnet: {} DPN-ID: {}) inside ITM Config DS.",
- tzName, subnetMaskObj, dpnId);
+ LOG.trace("Removing TEP from (TZ: {} DPN-ID: {}) inside ITM Config DS.",
+ tzName, dpnId);
// remove vtep
- wrTx.delete(LogicalDatastoreType.CONFIGURATION, vtepPath);
+ tx.delete(vtepPath);
}
/**
*
* @param tzName transport zone name in string
* @param tepIpAddress TEP IP address in IpAddress object
- * @param dpnId bridge datapath ID in BigInteger
+ * @param dpnId bridge datapath ID
* @param dataBroker data broker handle to perform operations on operational datastore
- * @param wrTx WriteTransaction object
+ * @param tx TypedWriteTransaction object
*/
public static void removeUnknownTzTepFromTepsNotHosted(String tzName, IpAddress tepIpAddress,
- BigInteger dpnId, DataBroker dataBroker,
- WriteTransaction wrTx) {
- List<UnknownVteps> vtepList = null;
-
+ Uint64 dpnId, DataBroker dataBroker,
+ TypedWriteTransaction<Datastore.Operational> tx) {
+ Map<UnknownVtepsKey, UnknownVteps> vtepList;
TepsInNotHostedTransportZone tepsInNotHostedTransportZone =
- ItmUtils.getUnknownTransportZoneFromITMOperDS(tzName, dataBroker);
+ ItmUtils.getUnknownTransportZoneFromITMOperDS(tzName, dataBroker);
if (tepsInNotHostedTransportZone == null) {
LOG.trace("Unhosted TransportZone ({}) does not exist in OperDS. Nothing to do for TEP removal.", tzName);
return;
} else {
// case: vtep list has elements
boolean vtepFound = false;
- UnknownVteps foundVtep = null;
- for (UnknownVteps vtep : vtepList) {
- if (vtep.getDpnId().equals(dpnId)) {
+ for (UnknownVteps vtep : vtepList.values()) {
+ if (Objects.equals(vtep.getDpnId(), dpnId)) {
vtepFound = true;
- foundVtep = vtep;
break;
}
}
if (vtepFound) {
// vtep is found, update it with tep-ip
LOG.trace(
- "Remove TEP with IP ({}) from unhosted TZ ({}) inside not-hosted-transport-zones list.",
- tepIpAddress, tzName);
+ "Remove TEP with IP ({}) from unhosted TZ ({}) inside not-hosted-transport-zones list.",
+ tepIpAddress, tzName);
if (vtepList.size() == 1) {
- removeTzFromTepsNotHosted(tzName, wrTx);
+ removeTzFromTepsNotHosted(tzName, tx);
} else {
- removeVtepFromTepsNotHosted(tzName, dpnId, wrTx);
+ removeVtepFromTepsNotHosted(tzName, dpnId, tx);
}
- vtepList.remove(foundVtep);
}
}
}
* from ITM operational Datastore by delete operation with write transaction.
*
* @param tzName transport zone name in string
- * @param dpnId bridge datapath ID in BigInteger
- * @param wrTx WriteTransaction object
+ * @param dpnId bridge datapath ID
+ * @param tx TypedWriteTransaction object
*/
- private static void removeVtepFromTepsNotHosted(String tzName, BigInteger dpnId,
- WriteTransaction wrTx) {
-
- UnknownVtepsKey unknownVtepkey = new UnknownVtepsKey(dpnId);
+ private static void removeVtepFromTepsNotHosted(String tzName, Uint64 dpnId,
+ TypedWriteTransaction<Datastore.Operational> tx) {
InstanceIdentifier<UnknownVteps> vtepPath = InstanceIdentifier.builder(NotHostedTransportZones.class)
- .child(TepsInNotHostedTransportZone.class, new TepsInNotHostedTransportZoneKey(tzName))
- .child(UnknownVteps.class, unknownVtepkey).build();
-
- LOG.trace("Removing TEP from unhosted (TZ: {}, DPID: {}) inside ITM Oper DS.",
- tzName, dpnId);
- // remove vtep
- wrTx.delete(LogicalDatastoreType.OPERATIONAL, vtepPath);
+ .child(TepsInNotHostedTransportZone.class, new TepsInNotHostedTransportZoneKey(tzName))
+ .child(UnknownVteps.class, new UnknownVtepsKey(dpnId)).build();
+ LOG.trace("Removing TEP from unhosted (TZ: {}, DPID: {}) inside ITM Oper DS.", tzName, dpnId);
+ tx.delete(vtepPath);
}
/**
* from ITM operational Datastore by delete operation with write transaction.
*
* @param tzName transport zone name in string
- * @param wrTx WriteTransaction object
+ * @param tx TypedWriteTransaction object
*/
- private static void removeTzFromTepsNotHosted(String tzName, WriteTransaction wrTx) {
+ private static void removeTzFromTepsNotHosted(String tzName, TypedWriteTransaction<Datastore.Operational> tx) {
InstanceIdentifier<TepsInNotHostedTransportZone> tepsInNotHostedTransportZoneIid =
- InstanceIdentifier.builder(NotHostedTransportZones.class)
- .child(TepsInNotHostedTransportZone.class,
- new TepsInNotHostedTransportZoneKey(tzName)).build();
-
+ InstanceIdentifier.builder(NotHostedTransportZones.class).child(TepsInNotHostedTransportZone.class,
+ new TepsInNotHostedTransportZoneKey(tzName)).build();
LOG.trace("Removing TZ ({})from not-hosted-transport-zones list inside ITM Oper DS.", tzName);
- // remove TZ from TepsNotHosted list
- wrTx.delete(LogicalDatastoreType.OPERATIONAL, tepsInNotHostedTransportZoneIid);
+ tx.delete(tepsInNotHostedTransportZoneIid);
}
}