when the device is connected all its macs are learnt in one update.
node.merge is called for each local ucast and remote ucast mac.
Now it is called only once.
when a mac update comes its physical locator need not be part of the
same update. If the locator is not available in the same update get
it from the cache ( which got filled from previous locators update msg).
Change-Id: Idbcf0b881b8ac90526f400c5d17d56a825f0a611
Signed-off-by: K.V Suneelu Verma <k.v.suneelu.verma@ericsson.com>
/*
- * Copyright (c) 2015, 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
+ * Copyright (c) 2015, 2017 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
List<LocatorSet> plsList = new ArrayList<>();
for (UUID pLocUUID : plSet.getLocatorsColumn().getData()) {
PhysicalLocator pLoc = updatedPLocRows.get(pLocUUID);
+ if (pLoc == null) {
+ pLoc = (PhysicalLocator) getOvsdbConnectionInstance().
+ getDeviceInfo().getDeviceOperData(TerminationPoint.class, pLocUUID);
+ }
InstanceIdentifier<TerminationPoint> tpIid = HwvtepSouthboundMapper.createInstanceIdentifier(
getOvsdbConnectionInstance().getInstanceIdentifier(), pLoc);
plsList.add(new LocatorSetBuilder()
List<LocatorSet> plsList = new ArrayList<>();
for (UUID pLocUUID : plSet.getLocatorsColumn().getData()) {
PhysicalLocator pLoc = updatedPLocRows.get(pLocUUID);
+ if (pLoc == null) {
+ pLoc = (PhysicalLocator) getOvsdbConnectionInstance().
+ getDeviceInfo().getDeviceOperData(TerminationPoint.class, pLocUUID);
+ }
InstanceIdentifier<TerminationPoint> tpIid = HwvtepSouthboundMapper.createInstanceIdentifier(
getOvsdbConnectionInstance().getInstanceIdentifier(), pLoc);
plsList.add(new LocatorSetBuilder()
/*
- * Copyright (c) 2015, 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
+ * Copyright (c) 2015, 2017 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
import com.google.common.base.Optional;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
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.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class HwvtepUcastMacsLocalUpdateCommand extends AbstractTransactionCommand {
+ private static final Logger LOG = LoggerFactory.getLogger(HwvtepUcastMacsLocalUpdateCommand.class);
private Map<UUID, UcastMacsLocal> updatedUMacsLocalRows;
private Map<UUID, PhysicalLocator> updatedPLocRows;
@Override
public void execute(ReadWriteTransaction transaction) {
- for (UcastMacsLocal ucastMacsLocal : updatedUMacsLocalRows.values()) {
- updateData(transaction, ucastMacsLocal);
- }
+ updateData(transaction, updatedUMacsLocalRows.values());
}
- private void updateData(ReadWriteTransaction transaction, UcastMacsLocal ucml) {
+ private void updateData(ReadWriteTransaction transaction, Collection<UcastMacsLocal> ucml) {
final InstanceIdentifier<Node> connectionIId = getOvsdbConnectionInstance().getInstanceIdentifier();
Optional<Node> connection = HwvtepSouthboundUtil.readNode(transaction, connectionIId);
if (connection.isPresent()) {
}
}
- private Node buildConnectionNode(UcastMacsLocal ucml) {
+ private Node buildConnectionNode(final Collection<UcastMacsLocal> ucml) {
//Update node with UcastMacsLocal reference
NodeBuilder connectionNode = new NodeBuilder();
connectionNode.setNodeId(getOvsdbConnectionInstance().getNodeId());
InstanceIdentifier<Node> nodeIid = getOvsdbConnectionInstance().getInstanceIdentifier();
HwvtepGlobalAugmentationBuilder hgAugmentationBuilder = new HwvtepGlobalAugmentationBuilder();
+ List<LocalUcastMacs> umclList = new ArrayList<>();
+ ucml.forEach( (mac) -> umclList.add(buildLocalUcastMac(mac)));
+ hgAugmentationBuilder.setLocalUcastMacs(umclList);
+ connectionNode.addAugmentation(HwvtepGlobalAugmentation.class, hgAugmentationBuilder.build());
+ return connectionNode.build();
+ }
+
+ private LocalUcastMacs buildLocalUcastMac(final UcastMacsLocal ucml) {
+ InstanceIdentifier<Node> nodeIid = getOvsdbConnectionInstance().getInstanceIdentifier();
LocalUcastMacsBuilder ucmlBuilder = new LocalUcastMacsBuilder();
if (ucml.getIpAddr() != null && !ucml.getIpAddr().isEmpty()) {
ucmlBuilder.setIpaddr(new IpAddress(ucml.getIpAddr().toCharArray()));
if (ucml.getLocatorColumn() != null && ucml.getLocatorColumn().getData() != null) {
UUID plocUUID = ucml.getLocatorColumn().getData();
PhysicalLocator physicalLocator = updatedPLocRows.get(plocUUID);
+ if (physicalLocator == null) {
+ physicalLocator = (PhysicalLocator) getOvsdbConnectionInstance().
+ getDeviceInfo().getDeviceOperData(TerminationPoint.class, plocUUID);
+ }
if (physicalLocator != null) {
InstanceIdentifier<TerminationPoint> plIid =
HwvtepSouthboundMapper.createInstanceIdentifier(nodeIid, physicalLocator);
ucmlBuilder.setLogicalSwitchRef(new HwvtepLogicalSwitchRef(lSwitchIid));
}
}
- List<LocalUcastMacs> umclList = new ArrayList<>();
- umclList.add(ucmlBuilder.build());
- hgAugmentationBuilder.setLocalUcastMacs(umclList);
- connectionNode.addAugmentation(HwvtepGlobalAugmentation.class, hgAugmentationBuilder.build());
- return connectionNode.build();
+ return ucmlBuilder.build();
}
-}
+}
\ No newline at end of file
package org.opendaylight.ovsdb.hwvtepsouthbound.transactions.md;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Optional;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
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 java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
public class HwvtepUcastMacsRemoteUpdateCommand extends AbstractTransactionCommand {
private final Map<UUID, UcastMacsRemote> updatedUMacsRemoteRows;
@Override
public void execute(ReadWriteTransaction transaction) {
- for (UcastMacsRemote ucastMacsRemote : updatedUMacsRemoteRows.values()) {
- updateUcastMacsRemote(transaction, ucastMacsRemote);
- }
+ updateUcastMacsRemote(transaction, updatedUMacsRemoteRows.values());
}
- private void updateUcastMacsRemote(ReadWriteTransaction transaction, UcastMacsRemote ucastMacsRemote) {
+ private void updateUcastMacsRemote(ReadWriteTransaction transaction, Collection<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);
- InstanceIdentifier<RemoteUcastMacs> macIid = getMacIid(connectionIId, connectionNode);
- getOvsdbConnectionInstance().getDeviceInfo().updateDeviceOperData(RemoteUcastMacs.class, macIid,
- ucastMacsRemote.getUuid(), ucastMacsRemote);
//TODO: Handle any deletes
}
}
-
- InstanceIdentifier<RemoteUcastMacs> getMacIid(InstanceIdentifier<Node> connectionIId, Node connectionNode) {
- RemoteUcastMacsKey macsKey =
- connectionNode.getAugmentation(HwvtepGlobalAugmentation.class).getRemoteUcastMacs().get(0).getKey();
- InstanceIdentifier<RemoteUcastMacs> key = connectionIId.augmentation(HwvtepGlobalAugmentation.class).
- child(RemoteUcastMacs.class, macsKey);
- return key;
- }
-
- private Node buildConnectionNode(UcastMacsRemote uMacRemote) {
+ private Node buildConnectionNode(final Collection<UcastMacsRemote> uMacRemotes) {
NodeBuilder connectionNode = new NodeBuilder();
connectionNode.setNodeId(getOvsdbConnectionInstance().getNodeId());
InstanceIdentifier<Node> nodeIid = getOvsdbConnectionInstance().getInstanceIdentifier();
HwvtepGlobalAugmentationBuilder hgAugmentationBuilder = new HwvtepGlobalAugmentationBuilder();
List<RemoteUcastMacs> remoteUMacs = new ArrayList<>();
+ uMacRemotes.forEach( (mac) -> remoteUMacs.add(buildRemoteUcast(mac)));
+ hgAugmentationBuilder.setRemoteUcastMacs(remoteUMacs);
+ connectionNode.addAugmentation(HwvtepGlobalAugmentation.class, hgAugmentationBuilder.build());
+ return connectionNode.build();
+ }
+
+ private RemoteUcastMacs buildRemoteUcast(final UcastMacsRemote uMacRemote) {
+ InstanceIdentifier<Node> nodeIid = getOvsdbConnectionInstance().getInstanceIdentifier();
RemoteUcastMacsBuilder rumBuilder = new RemoteUcastMacsBuilder();
rumBuilder.setMacEntryKey(new MacAddress(uMacRemote.getMac()));
rumBuilder.setMacEntryUuid(new Uuid(uMacRemote.getUuid().toString()));
&& uMacRemote.getLocatorColumn().getData() != null) {
UUID pLocUUID = uMacRemote.getLocatorColumn().getData();
PhysicalLocator physicalLocator = updatedPLocRows.get(pLocUUID);
+ if (physicalLocator == null) {
+ physicalLocator = (PhysicalLocator) getOvsdbConnectionInstance().
+ getDeviceInfo().getDeviceOperData(TerminationPoint.class, pLocUUID);
+ }
if (physicalLocator != null) {
InstanceIdentifier<TerminationPoint> plIid = HwvtepSouthboundMapper.createInstanceIdentifier(nodeIid,
physicalLocator);
rumBuilder.setLogicalSwitchRef(new HwvtepLogicalSwitchRef(lSwitchIid));
}
}
- remoteUMacs.add(rumBuilder.build());
- hgAugmentationBuilder.setRemoteUcastMacs(remoteUMacs);
- connectionNode.addAugmentation(HwvtepGlobalAugmentation.class, hgAugmentationBuilder.build());
- return connectionNode.build();
+ RemoteUcastMacs remoteUcastMacs = rumBuilder.build();
+ InstanceIdentifier<RemoteUcastMacs> macIid = getMacIid(remoteUcastMacs);
+ getOvsdbConnectionInstance().getDeviceInfo().updateDeviceOperData(RemoteUcastMacs.class, macIid,
+ uMacRemote.getUuid(), uMacRemote);
+ return remoteUcastMacs;
}
+ private InstanceIdentifier<RemoteUcastMacs> getMacIid(final RemoteUcastMacs remoteUcastMacs) {
+ return getOvsdbConnectionInstance().getInstanceIdentifier().
+ augmentation(HwvtepGlobalAugmentation.class).child(RemoteUcastMacs.class, remoteUcastMacs.getKey());
+ }
}