MD-SAL API integration
[ovsdb.git] / hwvtepsouthbound / hwvtepsouthbound-impl / src / main / java / org / opendaylight / ovsdb / hwvtepsouthbound / transact / TransactUtils.java
index 41c15053c9bfc23dcf876bcb2d3fb342631def0d..854af78a7ad312a5f1dda1fcb0430ca2771b7162 100644 (file)
@@ -9,9 +9,7 @@ package org.opendaylight.ovsdb.hwvtepsouthbound.transact;
 
 import static org.opendaylight.ovsdb.lib.operations.Operations.op;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
-
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -19,66 +17,63 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepDeviceInfo;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundConstants;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
-import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalLocator;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalLocatorSet;
-import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.ovsdb.utils.mdsal.utils.ControllerMdsalUtils;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.EncapsulationTypeVxlanOverIpv4;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepNodeName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorAugmentationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.locator.set.attributes.LocatorSet;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Acls;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalRouters;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Acls;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.locator.set.attributes.LocatorSet;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TransactUtils {
+public final class TransactUtils {
     private static final Logger LOG = LoggerFactory.getLogger(TransactUtils.class);
 
     private TransactUtils(){
     }
 
-    public static Node getCreated(DataObjectModification<Node> mod) {
-        if((mod.getModificationType() == ModificationType.WRITE)
-                        && (mod.getDataBefore() == null)){
+    public static Node getCreated(final DataObjectModification<Node> mod) {
+        if (mod.getModificationType() == ModificationType.WRITE
+                        && mod.getDataBefore() == null) {
             return mod.getDataAfter();
         }
         return null;
     }
 
-    public static Node getRemoved(DataObjectModification<Node> mod) {
-        if(mod.getModificationType() == ModificationType.DELETE){
+    public static Node getRemoved(final DataObjectModification<Node> mod) {
+        if (mod.getModificationType() == ModificationType.DELETE) {
             return mod.getDataBefore();
         }
         return null;
     }
 
-    public static Node getUpdated(DataObjectModification<Node> mod) {
+    public static Node getUpdated(final DataObjectModification<Node> mod) {
         Node node = null;
-        switch(mod.getModificationType()) {
+        switch (mod.getModificationType()) {
             case SUBTREE_MODIFIED:
                 node = mod.getDataAfter();
                 break;
             case WRITE:
-                if(mod.getDataBefore() !=  null) {
+                if (mod.getDataBefore() != null) {
                     node = mod.getDataAfter();
                 }
                 break;
@@ -88,20 +83,18 @@ public class TransactUtils {
         return node;
     }
 
-    public static Node getOriginal(DataObjectModification<Node> mod) {
+    public static Node getOriginal(final DataObjectModification<Node> mod) {
         Node node = null;
-        switch(mod.getModificationType()) {
+        switch (mod.getModificationType()) {
             case SUBTREE_MODIFIED:
+            case DELETE:
                 node = mod.getDataBefore();
                 break;
             case WRITE:
-                if(mod.getDataBefore() !=  null) {
+                if (mod.getDataBefore() !=  null) {
                     node = mod.getDataBefore();
                 }
                 break;
-            case DELETE:
-                node = mod.getDataBefore();
-                break;
             default:
                 break;
         }
@@ -110,9 +103,9 @@ public class TransactUtils {
 
     //TODO: change this function to be generic
     public static Map<InstanceIdentifier<Node>, Node> extractCreatedOrUpdatedOrRemoved(
-            Collection<DataTreeModification<Node>> changes, Class<Node> class1) {
+            final Collection<DataTreeModification<Node>> changes, final Class<Node> class1) {
         Map<InstanceIdentifier<Node>, Node> result = new HashMap<>();
-        for(DataTreeModification<Node> change : changes) {
+        for (DataTreeModification<Node> change : changes) {
             final InstanceIdentifier<Node> key = change.getRootPath().getRootIdentifier();
             final DataObjectModification<Node> mod = change.getRootNode();
             Node created = getCreated(mod);
@@ -131,25 +124,33 @@ public class TransactUtils {
         return result;
     }
 
-    public static UUID createPhysicalLocatorSet(HwvtepOperationalState hwvtepOperationalState, TransactionBuilder transaction, List<LocatorSet> locatorList) {
-        Set<UUID> locators = new HashSet<UUID>();
+    public static UUID createPhysicalLocatorSet(final HwvtepOperationalState hwvtepOperationalState,
+            final TransactionBuilder transaction, final List<LocatorSet> locatorList) {
+        Set<UUID> locators = new HashSet<>();
+        Set<String> locatorsInfo = new HashSet<>();
         for (LocatorSet locator: locatorList) {
             @SuppressWarnings("unchecked")
-            InstanceIdentifier<TerminationPoint> iid =(InstanceIdentifier<TerminationPoint>) locator.getLocatorRef().getValue();
+            InstanceIdentifier<TerminationPoint> iid =
+                    (InstanceIdentifier<TerminationPoint>) locator.getLocatorRef().getValue();
             UUID locatorUuid = createPhysicalLocator(transaction, hwvtepOperationalState, iid);
             if (locatorUuid != null) {
                 locators.add(locatorUuid);
+                addLocatorToTransactionHistory(hwvtepOperationalState, locatorsInfo, iid);
             }
         }
-        PhysicalLocatorSet physicalLocatorSet = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), PhysicalLocatorSet.class);
+        PhysicalLocatorSet physicalLocatorSet = transaction.getTypedRowWrapper(PhysicalLocatorSet.class);
         physicalLocatorSet.setLocators(locators);
         String locatorSetUuid = "PhysicalLocatorSet_" + HwvtepSouthboundMapper.getRandomUUID();
         transaction.add(op.insert(physicalLocatorSet).withId(locatorSetUuid));
+        hwvtepOperationalState.getDeviceInfo().addToControllerTx(TransactionType.ADD,
+                new StringBuilder(physicalLocatorSet.toString()).append(" Uuid ").append(locatorSetUuid)
+                        .append(" ").append(locatorsInfo.toString()));
         return new UUID(locatorSetUuid);
     }
 
-    public static UUID createPhysicalLocator(TransactionBuilder transaction, HwvtepOperationalState operationalState,
-                                             InstanceIdentifier<TerminationPoint> iid) {
+    public static UUID createPhysicalLocator(final TransactionBuilder transaction,
+                                             final HwvtepOperationalState operationalState,
+                                             final InstanceIdentifier<TerminationPoint> iid) {
         UUID locatorUuid = null;
         HwvtepDeviceInfo.DeviceData deviceData = operationalState.getDeviceInfo().getDeviceOperData(
                 TerminationPoint.class, iid);
@@ -165,54 +166,61 @@ public class TransactUtils {
         HwvtepPhysicalLocatorAugmentation locatorAugmentation = null;
         builder.setEncapsulationType(EncapsulationTypeVxlanOverIpv4.class);
         String tepKey = iid.firstKeyOf(TerminationPoint.class).getTpId().getValue();
-        String ip = tepKey.substring(tepKey.indexOf(":")+1);
-        builder.setDstIp(new IpAddress(ip.toCharArray()));
+        String ip = tepKey.substring(tepKey.indexOf(":") + 1);
+        builder.setDstIp(IpAddressBuilder.getDefaultInstance(ip));
         locatorAugmentation = builder.build();
-        locatorUuid = TransactUtils.createPhysicalLocator(transaction, locatorAugmentation);
+        locatorUuid = TransactUtils.createPhysicalLocator(transaction, locatorAugmentation, operationalState);
         operationalState.updateCurrentTxData(TerminationPoint.class, iid, locatorUuid);
         operationalState.getDeviceInfo().markKeyAsInTransit(TerminationPoint.class, iid);
         return locatorUuid;
     }
 
-    public static UUID createPhysicalLocator(TransactionBuilder transaction, HwvtepPhysicalLocatorAugmentation inputLocator) {
+    public static UUID createPhysicalLocator(final TransactionBuilder transaction,
+                                             final HwvtepPhysicalLocatorAugmentation inputLocator,
+                                             final HwvtepOperationalState hwvtepOperationalState) {
         LOG.debug("Creating a physical locator: {}", inputLocator.getDstIp());
-        PhysicalLocator physicalLocator = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), PhysicalLocator.class);
+        PhysicalLocator physicalLocator = transaction.getTypedRowWrapper(PhysicalLocator.class);
         setEncapsulationType(physicalLocator, inputLocator);
         setDstIp(physicalLocator, inputLocator);
         String locatorUuid = "PhysicalLocator_" + HwvtepSouthboundMapper.getRandomUUID();
         transaction.add(op.insert(physicalLocator).withId(locatorUuid));
+        hwvtepOperationalState.getDeviceInfo().addToControllerTx(TransactionType.ADD,
+                new StringBuilder(physicalLocator.toString()).append(" Uuid ").append(locatorUuid));
         return new UUID(locatorUuid);
     }
 
-    private static final void setEncapsulationType(PhysicalLocator physicalLocator, HwvtepPhysicalLocatorAugmentation inputLocator) {
+    private static void setEncapsulationType(final PhysicalLocator physicalLocator,
+            final HwvtepPhysicalLocatorAugmentation inputLocator) {
         if (inputLocator.getEncapsulationType() != null) {
-            String encapType = HwvtepSouthboundConstants.ENCAPS_TYPE_MAP.get(HwvtepSouthboundMapper.createEncapsulationType(""));
+            String encapType = HwvtepSouthboundConstants.ENCAPS_TYPE_MAP.get(
+                    HwvtepSouthboundMapper.createEncapsulationType(""));
             physicalLocator.setEncapsulationType(encapType);
         }
     }
 
-    private static final void setDstIp(PhysicalLocator physicalLocator, HwvtepPhysicalLocatorAugmentation inputLocator) {
+    private static void setDstIp(final PhysicalLocator physicalLocator,
+            final HwvtepPhysicalLocatorAugmentation inputLocator) {
         if (inputLocator.getDstIp() != null) {
             physicalLocator.setDstIp(inputLocator.getDstIp().getIpv4Address().getValue());
         }
     }
 
-    static String sanitizeUUID(HwvtepNodeName hwvtepNodeName) {
+    static String sanitizeUUID(final HwvtepNodeName hwvtepNodeName) {
         return sanitizeUUID(hwvtepNodeName.getValue());
     }
 
-    static String sanitizeUUID(String nodeName) {
+    static String sanitizeUUID(final String nodeName) {
         //ovs is not accepting '-' in the named uuids
         return nodeName.replaceAll("-", "_");
     }
 
-    public static String getLogicalSwitchId(LogicalSwitches lswitch){
+    public static String getLogicalSwitchId(final LogicalSwitches lswitch) {
         return HwvtepSouthboundConstants.LOGICALSWITCH_UUID_PREFIX + sanitizeUUID(lswitch.getHwvtepNodeName());
     }
 
-    public static UUID getLogicalSwitchUUID(InstanceIdentifier<LogicalSwitches> lswitchIid){
-        return new UUID(HwvtepSouthboundConstants.LOGICALSWITCH_UUID_PREFIX +
-                sanitizeUUID(lswitchIid.firstKeyOf(LogicalSwitches.class).getHwvtepNodeName()));
+    public static UUID getLogicalSwitchUUID(final InstanceIdentifier<LogicalSwitches> lswitchIid) {
+        return new UUID(HwvtepSouthboundConstants.LOGICALSWITCH_UUID_PREFIX
+                sanitizeUUID(lswitchIid.firstKeyOf(LogicalSwitches.class).getHwvtepNodeName()));
     }
 
     public static UUID getLogicalSwitchUUID(final TransactionBuilder transaction,
@@ -229,8 +237,8 @@ public class TransactUtils {
             }
             return null;
         }
-        LogicalSwitchUpdateCommand cmd = new LogicalSwitchUpdateCommand(operationalState, Collections.EMPTY_LIST);
-        MdsalUtils mdsalUtils = new MdsalUtils(operationalState.getDataBroker());
+        LogicalSwitchUpdateCommand cmd = new LogicalSwitchUpdateCommand(operationalState, Collections.emptyList());
+        ControllerMdsalUtils mdsalUtils = new ControllerMdsalUtils(operationalState.getDataBroker());
         LogicalSwitches ls = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION, lswitchIid);
         if (ls != null) {
             cmd.updateLogicalSwitch(transaction, lswitchIid.firstIdentifierOf(Node.class), Lists.newArrayList(ls));
@@ -241,12 +249,33 @@ public class TransactUtils {
         return getLogicalSwitchUUID(lswitchIid);
     }
 
-    public static String getLogicalRouterId(final LogicalRouters lrouter){
+    public static String getLogicalRouterId(final LogicalRouters lrouter) {
         return HwvtepSouthboundConstants.LOGICALROUTER_UUID_PREFIX + sanitizeUUID(lrouter.getHwvtepNodeName());
     }
 
-    public static UUID getAclUUID(final InstanceIdentifier<Acls> aclIid){
-        return new UUID(HwvtepSouthboundConstants.ACL_UUID_PREFIX +
-                sanitizeUUID(aclIid.firstKeyOf(Acls.class).getAclName()));
+    public static UUID getAclUUID(final InstanceIdentifier<Acls> aclIid) {
+        return new UUID(HwvtepSouthboundConstants.ACL_UUID_PREFIX
+                + sanitizeUUID(aclIid.firstKeyOf(Acls.class).getAclName()));
+    }
+
+    @SuppressWarnings("checkstyle:IllegalCatch")
+    private static void addLocatorToTransactionHistory(final HwvtepOperationalState hwvtepOperationalState,
+            final Set<String> locatorsInfo, final InstanceIdentifier<TerminationPoint> iid) {
+        try {
+            HwvtepDeviceInfo.DeviceData deviceData = hwvtepOperationalState.getDeviceInfo().getDeviceOperData(
+                    TerminationPoint.class, iid);
+            if (deviceData != null) {
+                Object data = deviceData.getData();
+                if (data instanceof PhysicalLocator) {
+                    PhysicalLocator locator = (PhysicalLocator) data;
+                    locatorsInfo.add(new StringBuilder(locator.getUuid().toString()).append(" ")
+                            .append(locator.getDstIpColumn().getData()).toString());
+                } else {
+                    LOG.debug("Ignoring unknown data {}", data);
+                }
+            }
+        } catch (Exception exp) {
+            LOG.warn("Failed to add to Transaction History", exp);
+        }
     }
 }