yang changes, PhysicalLocator and UcastMacsRemote 03/30203/2
authorVishal Thapar <vishal.thapar@ericsson.com>
Wed, 25 Nov 2015 14:30:30 +0000 (20:00 +0530)
committerVishal Thapar <vishal.thapar@ericsson.com>
Wed, 25 Nov 2015 16:11:57 +0000 (21:41 +0530)
1. Added PhysicalLocator and UCastMacsRemote Update code.
2. Yang: Modified logical-switch-ref to correct type based on recent
changes
3. Yang: Moved all mac attributes to Global node from PhysicalSwitch.

Change-Id: I1a51ea9a4423144892488d9de6d01e7b5271d18b
Signed-off-by: Vishal Thapar <vishal.thapar@ericsson.com>
hwvtepsouthbound/hwvtepsouthbound-api/src/main/yang/hwvtep.yang
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepSouthboundConstants.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepSouthboundMapper.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/PhysicalLocatorUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/PhysicalPortUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/UcastMacsRemoteUpdateCommand.java
resources/commons/Ovsdb-HwvtepSouthbound-Collection.json.postman_collection

index cadfe227ca7d6ff1135baf141388000d22f5e479..2686b1e36fff362f78b68228cf9d5f4bb258e824 100644 (file)
@@ -20,7 +20,7 @@ module hwvtep {
 
     typedef hwvtep-logical-switch-ref {
         description "A reference to a logical switch in hwvtep based switches";
-        type instance-identifier;
+        type hwvtep-node-name;
     }
 
     typedef hwvtep-physical-locator-ref {
@@ -56,7 +56,7 @@ module hwvtep {
     grouping hwvtep-mac-table-generic-attributes {
         leaf mac-entry-key {
             description "MAC address entry";
-            type string;
+            type yang:mac-address;
         }
         leaf logical-switch-ref {
             description "The logical switch to which this mapping applies";
@@ -126,26 +126,6 @@ module hwvtep {
         list tunnels {
             uses hwvtep-tunnel-attributes ;
         }
-        list ucast-macs-local {
-            key "mac-entry-key";
-            uses hwvtep-mac-table-generic-attributes;
-            uses hwvtep-ucast-mac-table-attributes;
-        }
-        list ucast-macs-remote {
-            key "mac-entry-key";
-            uses hwvtep-mac-table-generic-attributes;
-            uses hwvtep-ucast-mac-table-attributes;
-        }
-        list mcast-macs-local {
-            key "mac-entry-key";
-            uses hwvtep-mac-table-generic-attributes;
-            uses hwvtep-mcast-mac-table-attributes;
-        }
-        list mcast-macs-remote {
-            key "mac-entry-key";
-            uses hwvtep-mac-table-generic-attributes;
-            uses hwvtep-mcast-mac-table-attributes;
-        }
     }
 
     grouping hwvtep-connection-info-attributes {
@@ -212,6 +192,26 @@ module hwvtep {
             key "hwvtep-node-name";
             uses hwvtep-logical-switch-attributes;
         }
+        list local-ucast-macs {
+            key "mac-entry-key";
+            uses hwvtep-mac-table-generic-attributes;
+            uses hwvtep-ucast-mac-table-attributes;
+        }
+        list remote-ucast-macs {
+            key "mac-entry-key";
+            uses hwvtep-mac-table-generic-attributes;
+            uses hwvtep-ucast-mac-table-attributes;
+        }
+        list local-mcast-macs {
+            key "mac-entry-key";
+            uses hwvtep-mac-table-generic-attributes;
+            uses hwvtep-mcast-mac-table-attributes;
+        }
+        list remote-mcast-macs{
+            key "mac-entry-key";
+            uses hwvtep-mac-table-generic-attributes;
+            uses hwvtep-mcast-mac-table-attributes;
+        }
     }
 
     identity encapsulation-type-base {
index 57ee2fc543e2050af19af9c806e73628d12d84ca..ee79c9444533d4c4de5ffac9bbb46622733df5b0 100644 (file)
@@ -9,8 +9,12 @@
 package org.opendaylight.ovsdb.hwvtepsouthbound;
 
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.EncapsulationTypeBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.EncapsulationTypeVxlanOverIpv4;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
 
+import com.google.common.collect.ImmutableBiMap;
+
 public class HwvtepSouthboundConstants {
 
     public static final TopologyId HWVTEP_TOPOLOGY_ID = new TopologyId(new Uri("hwvtep:1"));
@@ -18,4 +22,8 @@ public class HwvtepSouthboundConstants {
     public static final Integer DEFAULT_OVSDB_PORT = 6640;
     public static final String IID_OTHER_CONFIG_KEY = "opendaylight-iid";
     public static final String UUID = "uuid";
+    public static final ImmutableBiMap<Class<? extends EncapsulationTypeBase>,String> ENCAPS_TYPE_MAP
+    = new ImmutableBiMap.Builder<Class<? extends EncapsulationTypeBase>,String>()
+        .put(EncapsulationTypeVxlanOverIpv4.class,"vxlan-over-ipv4")
+        .build();
 }
index 1c87b838c623ae4e7d170da441d8182b3c924a85..55f4e76c85047c1d770e06b1a20f02a118e13a5b 100644 (file)
@@ -16,6 +16,7 @@ import java.net.UnknownHostException;
 import org.opendaylight.ovsdb.lib.OvsdbClient;
 import org.opendaylight.ovsdb.schema.hardwarevtep.Global;
 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalSwitch;
+import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalLocator;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalSwitch;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
@@ -23,17 +24,25 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.ConnectionInfo;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.EncapsulationTypeBase;
+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.hwvtep.global.attributes.ConnectionInfoBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 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.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableBiMap;
+
 public class HwvtepSouthboundMapper {
     private static final Logger LOG = LoggerFactory.getLogger(HwvtepSouthboundMapper.class);
     private static final String N_CONNECTIONS_STR = "n_connections";
@@ -158,4 +167,30 @@ public class HwvtepSouthboundMapper {
         return iid;
     }
 
+    public static Class<? extends EncapsulationTypeBase> createEncapsulationType(String type) {
+        Preconditions.checkNotNull(type);
+        if (type.isEmpty()) {
+            return EncapsulationTypeVxlanOverIpv4.class;
+        } else {
+            ImmutableBiMap<String, Class<? extends EncapsulationTypeBase>> mapper =
+                    HwvtepSouthboundConstants.ENCAPS_TYPE_MAP.inverse();
+            return mapper.get(type);
+        }
+    }
+
+    public static InstanceIdentifier<TerminationPoint> createInstanceIdentifier(InstanceIdentifier<Node> nodeIid,
+                    PhysicalLocator physicalLocator) {
+        return nodeIid.child(TerminationPoint.class, getTerminationPointKey(physicalLocator));
+    }
+
+    public static TerminationPointKey getTerminationPointKey(PhysicalLocator pLoc) {
+        TerminationPointKey tpKey = null;
+        if(pLoc.getEncapsulationTypeColumn().getData() != null &&
+                        pLoc.getDstIpColumn().getData() != null) {
+            String tpKeyStr = pLoc.getEncapsulationTypeColumn().getData()+':'+pLoc.getDstIpColumn().getData();
+            tpKey = new TerminationPointKey(new TpId(tpKeyStr));
+        }
+        return tpKey;
+    }
+
 }
index 307da2d811a68776d56814540fd2dfccdcabbffa..045377e0437531a82f0c068abe2f91cde82e2375 100644 (file)
@@ -9,17 +9,37 @@
 package org.opendaylight.ovsdb.hwvtepsouthbound.transactions.md;
 
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
+import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
+import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalLocator;
+import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalPort;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+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.HwvtepPhysicalLocatorAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
+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.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Optional;
+
 public class PhysicalLocatorUpdateCommand extends AbstractTransactionCommand {
 
     private static final Logger LOG = LoggerFactory.getLogger(PhysicalLocatorUpdateCommand.class);
@@ -30,12 +50,60 @@ public class PhysicalLocatorUpdateCommand extends AbstractTransactionCommand {
             DatabaseSchema dbSchema) {
         super(key, updates, dbSchema);
         updatedPLocRows = TyperUtils.extractRowsUpdated(PhysicalLocator.class, getUpdates(),getDbSchema());
-        updatedPLocRows = TyperUtils.extractRowsOld(PhysicalLocator.class, getUpdates(),getDbSchema());
+        oldPLocRows = TyperUtils.extractRowsOld(PhysicalLocator.class, getUpdates(),getDbSchema());
     }
 
     @Override
     public void execute(ReadWriteTransaction transaction) {
-        // TODO Auto-generated method stub
+        final InstanceIdentifier<Node> connectionIId = getOvsdbConnectionInstance().getInstanceIdentifier();
+        if ( updatedPLocRows == null
+                || updatedPLocRows.isEmpty()) {
+            return;
+        }
+        LOG.trace("PhysicalLocatorTable updated: {}", updatedPLocRows);
+        Optional<Node> node = HwvtepSouthboundUtil.readNode(transaction, connectionIId);
+        if (node.isPresent()) {
+            updateTerminationPoints(transaction, node.get());
+        }
+    }
+
+    private void updateTerminationPoints(ReadWriteTransaction transaction, Node node) {
+        for (Entry<UUID, PhysicalLocator> pLocUpdate : updatedPLocRows.entrySet()) {
+            PhysicalLocator pLoc = pLocUpdate.getValue();
+            InstanceIdentifier<Node> nodeIid = HwvtepSouthboundMapper.createInstanceIdentifier(node.getNodeId());
+            TerminationPointKey tpKey = HwvtepSouthboundMapper.getTerminationPointKey(pLoc);
+            if (nodeIid != null && tpKey != null) {
+                TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
+                tpBuilder.setKey(tpKey);
+                tpBuilder.setTpId(tpKey.getTpId());
+                InstanceIdentifier<TerminationPoint> tpPath =
+                        HwvtepSouthboundMapper.createInstanceIdentifier(nodeIid, pLoc);
+                HwvtepPhysicalLocatorAugmentationBuilder tpAugmentationBuilder =
+                        new HwvtepPhysicalLocatorAugmentationBuilder();
+                setEncapsType(tpAugmentationBuilder, pLoc);
+                setDstIp(tpAugmentationBuilder, pLoc);
+                tpBuilder.addAugmentation(HwvtepPhysicalPortAugmentation.class, tpAugmentationBuilder.build());
+                if (oldPLocRows.containsKey(pLocUpdate.getKey())) {
+                    transaction.merge(LogicalDatastoreType.OPERATIONAL,
+                            tpPath, tpBuilder.build());
+                } else {
+                    transaction.put(LogicalDatastoreType.OPERATIONAL,
+                            tpPath, tpBuilder.build());
+                }
+            }
+        }
+    }
+
+    private void setEncapsType(HwvtepPhysicalLocatorAugmentationBuilder tpAugmentationBuilder, PhysicalLocator pLoc) {
+        String encapsType = pLoc.getEncapsulationTypeColumn().getData();
+        if(HwvtepSouthboundMapper.createEncapsulationType(encapsType) != null){
+            tpAugmentationBuilder.setEncapsulationType(HwvtepSouthboundMapper.createEncapsulationType(encapsType));
+        }
+    }
+
+    private void setDstIp(HwvtepPhysicalLocatorAugmentationBuilder tpAugmentationBuilder, PhysicalLocator pLoc) {
+        IpAddress ip =  new IpAddress(pLoc.getDstIpColumn().getData().toCharArray());
+        tpAugmentationBuilder.setDstIp(ip);
     }
 
 }
index 258d3d62720838bb3314ca176dfc4c43ea8f3b33..36a805bb93fcfd643ff9e6b7a6ba2cd886971daa 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
+import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
@@ -74,7 +75,7 @@ public class PhysicalPortUpdateCommand extends AbstractTransactionCommand {
             return;
         }
         LOG.trace("PhysicalPortTable updated: {}", updatedPPRows);
-        Optional<Node> node = readNode(transaction, connectionIId);
+        Optional<Node> node = HwvtepSouthboundUtil.readNode(transaction, connectionIId);
         if (node.isPresent()) {
             updateTerminationPoints(transaction, node.get());
             //TODO: Handle Deletion of VLAN Bindings
@@ -160,11 +161,7 @@ public class PhysicalPortUpdateCommand extends AbstractTransactionCommand {
 
     private HwvtepLogicalSwitchRef getLogicalSwitchRef( UUID switchUUID, UUID portUUID) {
             if (lSwitchUpdatedRows.get(switchUUID) != null) {
-                Optional<InstanceIdentifier<Node>> optSwitchIid = Optional.of(HwvtepSouthboundMapper.createInstanceIdentifier(getOvsdbConnectionInstance(),
-                        this.lSwitchUpdatedRows.get(switchUUID)));
-                if(optSwitchIid.isPresent()) {
-                    return new HwvtepLogicalSwitchRef(optSwitchIid.get());
-                }
+                return new HwvtepLogicalSwitchRef(lSwitchUpdatedRows.get(switchUUID).getName());
             }
         return null;
     }
@@ -185,7 +182,7 @@ public class PhysicalPortUpdateCommand extends AbstractTransactionCommand {
                 List<Switches> switchNodes = hwvtepNode.getSwitches();
                 for ( Switches managedNodeEntry : switchNodes ) {
                     @SuppressWarnings("unchecked")
-                    Node switchNode = readNode(transaction,
+                    Node switchNode = HwvtepSouthboundUtil.readNode(transaction,
                             (InstanceIdentifier<Node>)managedNodeEntry.getSwitchRef().getValue()).get();
                     TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
                     TerminationPointKey tpKey = new TerminationPointKey(new TpId(tpName));
@@ -200,19 +197,6 @@ public class PhysicalPortUpdateCommand extends AbstractTransactionCommand {
                 return Optional.absent();
             }
 
-    private Optional<Node> readNode(final ReadWriteTransaction transaction, final InstanceIdentifier<Node> nodePath) {
-        Optional<Node> node = Optional.absent();
-        try {
-            node = transaction.read(
-                    LogicalDatastoreType.OPERATIONAL, nodePath)
-                    .checkedGet();
-        } catch (final ReadFailedException e) {
-            LOG.warn("Read Operational/DS for Node fail! {}",
-                    nodePath, e);
-        }
-        return node;
-    }
-
     private InstanceIdentifier<TerminationPoint> getInstanceIdentifier(InstanceIdentifier<Node> switchIid,
                     PhysicalPort pPort) {
         return switchIid.child(TerminationPoint.class, new TerminationPointKey(new TpId(pPort.getName())));
index cac4a0af38a66a951d288d990556377065f6ffe9..6c7abc39f137b5e16a301f8984cdca7d1a995423 100644 (file)
 
 package org.opendaylight.ovsdb.hwvtepsouthbound.transactions.md;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
+import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
+import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
+import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalSwitch;
+import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalLocator;
+import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalSwitch;
 import org.opendaylight.ovsdb.schema.hardwarevtep.UcastMacsRemote;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepLogicalSwitchRef;
+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.HwvtepPhysicalLocatorRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalSwitchRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Switches;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.SwitchesBuilder;
+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.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Optional;
+
 public class UcastMacsRemoteUpdateCommand extends AbstractTransactionCommand {
 
     private static final Logger LOG = LoggerFactory.getLogger(UcastMacsRemoteUpdateCommand.class);
     private Map<UUID, UcastMacsRemote> updatedUMacsRemoteRows;
     private Map<UUID, UcastMacsRemote> oldUMacsRemoteRows;
+    private Map<UUID, PhysicalLocator> updatedPLocRows;
+    private Map<UUID, LogicalSwitch> updatedLSRows;
 
     public UcastMacsRemoteUpdateCommand(HwvtepConnectionInstance key, TableUpdates updates,
             DatabaseSchema dbSchema) {
         super(key, updates, dbSchema);
         updatedUMacsRemoteRows = TyperUtils.extractRowsUpdated(UcastMacsRemote.class, getUpdates(),getDbSchema());
         oldUMacsRemoteRows = TyperUtils.extractRowsOld(UcastMacsRemote.class, getUpdates(),getDbSchema());
+        updatedPLocRows = TyperUtils.extractRowsUpdated(PhysicalLocator.class, getUpdates(),getDbSchema());
+        updatedLSRows = TyperUtils.extractRowsUpdated(LogicalSwitch.class, getUpdates(),getDbSchema());
     }
 
     @Override
     public void execute(ReadWriteTransaction transaction) {
-        // TODO Auto-generated method stub
+        if (updatedUMacsRemoteRows != null || !updatedUMacsRemoteRows.isEmpty()) {
+            for (Entry<UUID, UcastMacsRemote> umrUpdate : updatedUMacsRemoteRows.entrySet()) {
+                updateUcastMacsRemote(transaction, umrUpdate.getValue());
+            }
+        }
+    }
+
+    private void updateUcastMacsRemote(ReadWriteTransaction transaction, UcastMacsRemote ucastMacsRemote) {
+        final InstanceIdentifier<Node> connectionIId = getOvsdbConnectionInstance().getInstanceIdentifier();
+        Optional<Node> connection = HwvtepSouthboundUtil.readNode(transaction, connectionIId);
+        if(connection.isPresent()) {
+            Node connectionNode = buildConnectionNode(ucastMacsRemote);
+            transaction.merge(LogicalDatastoreType.OPERATIONAL, connectionIId, connectionNode);
+            //TODO: Handle any deletes
+        }
+    }
+
+    private Node buildConnectionNode(UcastMacsRemote uMacRemote) {
+        NodeBuilder connectionNode = new NodeBuilder();
+        connectionNode.setNodeId(getOvsdbConnectionInstance().getNodeId());
+        InstanceIdentifier<Node> nodeIid = getOvsdbConnectionInstance().getInstanceIdentifier();
+        HwvtepGlobalAugmentationBuilder hgAugmentationBuilder = new HwvtepGlobalAugmentationBuilder();
+
+        List<RemoteUcastMacs> remoteUMacs = new ArrayList<>();
+        RemoteUcastMacsBuilder rumBuilder = new RemoteUcastMacsBuilder();
+        rumBuilder.setMacEntryKey(new MacAddress(uMacRemote.getMac()));
+        if(uMacRemote.getIpAddr() != null && !uMacRemote.getIpAddr().isEmpty()) {
+            rumBuilder.setIpaddr(new IpAddress(uMacRemote.getIpAddr().toCharArray()));
+        }
+        if(uMacRemote.getLocatorColumn() != null 
+                        && uMacRemote.getLocatorColumn().getData() != null) {
+            UUID pLocUUID = uMacRemote.getLocatorColumn().getData();
+            if(updatedPLocRows.get(pLocUUID) != null) {
+                InstanceIdentifier<TerminationPoint> plIid = HwvtepSouthboundMapper.createInstanceIdentifier(nodeIid, updatedPLocRows.get(pLocUUID));
+                rumBuilder.setLocatorRef(new HwvtepPhysicalLocatorRef(plIid));
+            }
+        }
+        if(uMacRemote.getLogicalSwitchColumn() != null 
+                        && uMacRemote.getLogicalSwitchColumn().getData() != null) {
+            UUID lsUUID = uMacRemote.getLogicalSwitchColumn().getData();
+            if(updatedLSRows.get(lsUUID) != null) {
+                
+                rumBuilder.setLogicalSwitchRef(new HwvtepLogicalSwitchRef(updatedLSRows.get(lsUUID).getName()));
+            }
+        }
+        remoteUMacs.add(rumBuilder.build());
+        hgAugmentationBuilder.setRemoteUcastMacs(remoteUMacs );
+        connectionNode.addAugmentation(HwvtepGlobalAugmentation.class, hgAugmentationBuilder.build());
+
+        LOG.debug("Update node with UcastMacsRemote {}", remoteUMacs);
+        return connectionNode.build();
     }
 
 }
index 7c98745706c4ecfe68e6aa76d9a51258f7b4e7ae..45fd82f5f1f9e5c1c2fed7421fefadd7fc4cdf44 100755 (executable)
             "id":"ee151670-85a0-30ec-b22b-5defe7b66e0b",
             "name":"Get Config  Hwvtep Topology",
             "description":"Fetch the config hwvtep topology from configuration data store.",
-            "url":"http://{{controllerHost}}:8181/restconf/config/network-topology:network-topology/hwvtep:1/",
+            "url":"http://{{controllerHost}}:8181/restconf/config/network-topology:network-topology/topology/hwvtep:1/",
             "method":"GET",
             "headers":"Authorization: Basic YWRtaW46YWRtaW4=\n",
             "data":"{\n  \"network-topology:node\": [\n        {\n            \"node-id\": \"hwvtep://{{hwvtepNodeIp}}:6640\",\n            \"connection-info\": {\n              \"hwvtep:remote-port\": 6640,\n              \"hwvtep:remote-ip\": \"{{hwvtepNodeIp}}\"\n            }\n        }\n    ]\n}",