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>
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 {
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";
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 {
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 {
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"));
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();
}
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;
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";
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;
+ }
+
}
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);
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);
}
}
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;
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
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;
}
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));
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())));
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();
}
}
"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}",