From a9aacccd32313c8d53f74aa81043722038171326 Mon Sep 17 00:00:00 2001 From: Peng Zhang Date: Fri, 4 Dec 2015 22:41:30 +0800 Subject: [PATCH] Create UcastMacs by Listening DS Changes PathSet 1: 1. create UcastMacsLocal/Remote command 2. add UcastMacs restconf api to postman collection 3. delete physical locator update/remove command PatchSet 2: 1. change according review comments PathSet 3: 1. change according review comments Change-Id: If926651a84d4ae4bac496eb9ca76b36f67b0a3f3 Signed-off-by: Peng Zhang --- .../transact/HwvtepOperationalState.java | 104 ++++++++- .../PhysicalLocatorRemoveCommand.java | 31 --- .../PhysicalLocatorUpdateCommand.java | 32 --- .../transact/TransactCommandAggregator.java | 2 - .../transact/TransactUtils.java | 48 ++++ .../transact/UcastMacsLocalUpdateCommand.java | 185 ++++++++++++++- .../UcastMacsRemoteUpdateCommand.java | 184 ++++++++++++++- ...thbound-Collection.json.postman_collection | 218 +++++++++++++++++- 8 files changed, 734 insertions(+), 70 deletions(-) delete mode 100644 hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/PhysicalLocatorRemoveCommand.java delete mode 100644 hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/PhysicalLocatorUpdateCommand.java diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/HwvtepOperationalState.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/HwvtepOperationalState.java index b09a5d9a0..e3ad78a43 100644 --- a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/HwvtepOperationalState.java +++ b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/HwvtepOperationalState.java @@ -25,8 +25,16 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hw 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.HwvtepPhysicalPortAugmentation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalMcastMacs; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalMcastMacsKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalUcastMacs; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalUcastMacsKey; 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.LogicalSwitchesKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacs; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacsKey; +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.RemoteUcastMacsKey; 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.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; @@ -36,15 +44,17 @@ import org.slf4j.LoggerFactory; import com.google.common.base.Optional; import com.google.common.base.Preconditions; +//TODO: need to be optimized, get entry by iid not name public class HwvtepOperationalState { private static final Logger LOG = LoggerFactory.getLogger(HwvtepOperationalState.class); private Map, Node> operationalNodes = new HashMap<>(); + ReadWriteTransaction transaction; public HwvtepOperationalState(DataBroker db, Collection> changes) { Map, Node> nodeCreateOrUpdate = TransactUtils.extractCreatedOrUpdatedOrRemoved(changes, Node.class); if (nodeCreateOrUpdate != null) { - final ReadWriteTransaction transaction = db.newReadWriteTransaction(); + transaction = db.newReadWriteTransaction(); for (Entry, Node> entry: nodeCreateOrUpdate.entrySet()) { Optional readNode = HwvtepSouthboundUtil.readNode(transaction, entry.getKey()); //add related globalNode or physicalSwitchNode to operationalNodes map @@ -161,4 +171,96 @@ public class HwvtepOperationalState { } return Optional.absent(); } + + public Optional getLocalMcastMacs(InstanceIdentifier iid, LocalMcastMacsKey key) { + Preconditions.checkNotNull(iid); + Optional nodeOptional = getHwvtepGlobalAugmentation(iid); + if (nodeOptional.isPresent()) { + HwvtepGlobalAugmentation hgAugmentation = nodeOptional.get(); + List macList = null; + if (hgAugmentation != null) { + macList = hgAugmentation.getLocalMcastMacs(); + } + if (macList != null) { + for (LocalMcastMacs mac: macList) { + if (mac.getKey().equals(key)) { + return Optional.fromNullable(mac); + } + } + } + } + return Optional.absent(); + } + + public Optional getRemoteMcastMacs(InstanceIdentifier iid, RemoteMcastMacsKey key) { + Preconditions.checkNotNull(iid); + Optional nodeOptional = getHwvtepGlobalAugmentation(iid); + if (nodeOptional.isPresent()) { + HwvtepGlobalAugmentation hgAugmentation = nodeOptional.get(); + List macList = null; + if (hgAugmentation != null) { + macList = hgAugmentation.getRemoteMcastMacs(); + } + if (macList != null) { + for (RemoteMcastMacs mac: macList) { + if (mac.getKey().equals(key)) { + return Optional.fromNullable(mac); + } + } + } + } + return Optional.absent(); + } + + public Optional getLocalUcastMacs(InstanceIdentifier iid, LocalUcastMacsKey key) { + Preconditions.checkNotNull(iid); + Optional nodeOptional = getHwvtepGlobalAugmentation(iid); + if (nodeOptional.isPresent()) { + HwvtepGlobalAugmentation hgAugmentation = nodeOptional.get(); + List macList = null; + if (hgAugmentation != null) { + macList = hgAugmentation.getLocalUcastMacs(); + } + if (macList != null) { + for (LocalUcastMacs mac: macList) { + if (mac.getKey().equals(key)) { + return Optional.fromNullable(mac); + } + } + } + } + return Optional.absent(); + } + + public Optional getRemoteUcastMacs(InstanceIdentifier iid, RemoteUcastMacsKey key) { + Preconditions.checkNotNull(iid); + Optional nodeOptional = getHwvtepGlobalAugmentation(iid); + if (nodeOptional.isPresent()) { + HwvtepGlobalAugmentation hgAugmentation = nodeOptional.get(); + List macList = null; + if (hgAugmentation != null) { + macList = hgAugmentation.getRemoteUcastMacs(); + } + if (macList != null) { + for (RemoteUcastMacs mac: macList) { + if (mac.getKey().equals(key)) { + return Optional.fromNullable(mac); + } + } + } + } + return Optional.absent(); + } + + public Optional getPhysicalLocatorAugmentation(InstanceIdentifier iid) { + Optional tp = HwvtepSouthboundUtil.readNode(transaction, iid); + if (tp.isPresent()) { + return Optional.fromNullable(tp.get().getAugmentation(HwvtepPhysicalLocatorAugmentation.class)); + } + return Optional.absent(); + } + + public ReadWriteTransaction getReadWriteTransaction() { + return transaction; + } } diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/PhysicalLocatorRemoveCommand.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/PhysicalLocatorRemoveCommand.java deleted file mode 100644 index 8206b4caf..000000000 --- a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/PhysicalLocatorRemoveCommand.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2015 China Telecom Beijing Research Institute 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, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.ovsdb.hwvtepsouthbound.transact; - -import java.util.Collection; - -import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; -import org.opendaylight.ovsdb.lib.operations.TransactionBuilder; -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PhysicalLocatorRemoveCommand extends AbstractTransactCommand { - private static final Logger LOG = LoggerFactory.getLogger(PhysicalLocatorRemoveCommand.class); - - public PhysicalLocatorRemoveCommand(HwvtepOperationalState state, - Collection> changes) { - super(state, changes); - } - - @Override - public void execute(TransactionBuilder transaction) { - //TODO - } -} diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/PhysicalLocatorUpdateCommand.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/PhysicalLocatorUpdateCommand.java deleted file mode 100644 index 113d78b0a..000000000 --- a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/PhysicalLocatorUpdateCommand.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2015 China Telecom Beijing Research Institute 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, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.ovsdb.hwvtepsouthbound.transact; - -import java.util.Collection; - -import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; -import org.opendaylight.ovsdb.lib.operations.TransactionBuilder; -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PhysicalLocatorUpdateCommand extends AbstractTransactCommand { - private static final Logger LOG = LoggerFactory.getLogger(PhysicalLocatorUpdateCommand.class); - - public PhysicalLocatorUpdateCommand(HwvtepOperationalState state, - Collection> changes) { - super(state, changes); - } - - @Override - public void execute(TransactionBuilder transaction) { - //TODO - } - -} diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/TransactCommandAggregator.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/TransactCommandAggregator.java index 0055cf326..cd1c79c86 100644 --- a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/TransactCommandAggregator.java +++ b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/TransactCommandAggregator.java @@ -27,8 +27,6 @@ public class TransactCommandAggregator implements TransactCommand { commands.add(new LogicalSwitchRemoveCommand(state,changes)); commands.add(new PhysicalPortUpdateCommand(state,changes)); commands.add(new PhysicalPortRemoveCommand(state,changes)); - commands.add(new PhysicalLocatorUpdateCommand(state,changes)); - commands.add(new PhysicalLocatorRemoveCommand(state,changes)); commands.add(new McastMacsRemoteUpdateCommand(state,changes)); commands.add(new McastMacsRemoteRemoveCommand(state,changes)); commands.add(new McastMacsLocalUpdateCommand(state,changes)); diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/TransactUtils.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/TransactUtils.java index a62175069..43e5617ec 100644 --- a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/TransactUtils.java +++ b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/TransactUtils.java @@ -7,18 +7,33 @@ */ package org.opendaylight.ovsdb.hwvtepsouthbound.transact; +import static org.opendaylight.ovsdb.lib.operations.Operations.op; + import java.util.Collection; import java.util.HashMap; import java.util.Map; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; 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.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.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorAugmentation; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Optional; + public class TransactUtils { private static final Logger LOG = LoggerFactory.getLogger(TransactUtils.class); @@ -123,4 +138,37 @@ public class TransactUtils { } */ + public static Optional readNodeFromConfig( + ReadWriteTransaction transaction, final InstanceIdentifier connectionIid) { + Optional node = Optional.absent(); + try { + node = transaction.read(LogicalDatastoreType.CONFIGURATION, connectionIid).checkedGet(); + } catch (final ReadFailedException e) { + LOG.warn("Read Configration/DS for Node failed! {}", connectionIid, e); + } + return node; + } + + public static UUID createPhysicalLocator(TransactionBuilder transaction, HwvtepPhysicalLocatorAugmentation inputLocator) { + LOG.debug("Creating a physical locator: {}", inputLocator.getDstIp()); + PhysicalLocator physicalLocator = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), PhysicalLocator.class); + setEncapsulationType(physicalLocator, inputLocator); + setDstIp(physicalLocator, inputLocator); + String locatorUuid = "PhysicalLocator_" + HwvtepSouthboundMapper.getRandomUUID(); + transaction.add(op.insert(physicalLocator).withId(locatorUuid)); + return new UUID(locatorUuid); + } + + private static final void setEncapsulationType(PhysicalLocator physicalLocator, HwvtepPhysicalLocatorAugmentation inputLocator) { + if (inputLocator.getEncapsulationType() != null) { + String encapType = HwvtepSouthboundConstants.ENCAPS_TYPE_MAP.get(HwvtepSouthboundMapper.createEncapsulationType("")); + physicalLocator.setEncapsulationType(encapType); + } + } + + private static final void setDstIp(PhysicalLocator physicalLocator, HwvtepPhysicalLocatorAugmentation inputLocator) { + if (inputLocator.getDstIp() != null) { + physicalLocator.setDstIp(inputLocator.getDstIp().getIpv4Address().getValue()); + } + } } diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/UcastMacsLocalUpdateCommand.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/UcastMacsLocalUpdateCommand.java index 183bd7e34..ee1106b33 100644 --- a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/UcastMacsLocalUpdateCommand.java +++ b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/UcastMacsLocalUpdateCommand.java @@ -8,14 +8,35 @@ package org.opendaylight.ovsdb.hwvtepsouthbound.transact; +import static org.opendaylight.ovsdb.lib.operations.Operations.op; + import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; +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.UcastMacsLocal; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid; +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.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.hwvtep.global.attributes.LocalUcastMacs; +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.LogicalSwitchesKey; 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; +import com.google.common.base.Optional; + public class UcastMacsLocalUpdateCommand extends AbstractTransactCommand { private static final Logger LOG = LoggerFactory.getLogger(PhysicalPortRemoveCommand.class); @@ -26,6 +47,166 @@ public class UcastMacsLocalUpdateCommand extends AbstractTransactCommand { @Override public void execute(TransactionBuilder transaction) { - //TODO + Map, List> createds = + extractCreated(getChanges(),LocalUcastMacs.class); + if (!createds.isEmpty()) { + for (Entry, List> created: + createds.entrySet()) { + updateUcastMacsLocal(transaction, created.getKey(), created.getValue()); + } + } + Map, List> updateds = + extractUpdated(getChanges(),LocalUcastMacs.class); + if (!updateds.isEmpty()) { + for (Entry, List> updated: + updateds.entrySet()) { + updateUcastMacsLocal(transaction, updated.getKey(), updated.getValue()); + } + } + } + + private void updateUcastMacsLocal(TransactionBuilder transaction, + InstanceIdentifier instanceIdentifier, List localUcastMacs) { + for (LocalUcastMacs localUcastMac: localUcastMacs) { + LOG.debug("Creating localUcastMacs, mac address: {}", localUcastMac.getMacEntryKey().getValue()); + Optional operationalMacOptional = + getOperationalState().getLocalUcastMacs(instanceIdentifier, localUcastMac.getKey()); + UcastMacsLocal ucastMacsLocal = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), UcastMacsLocal.class); + setIpAddress(ucastMacsLocal, localUcastMac); + setLocator(transaction, ucastMacsLocal, localUcastMac); + setLogicalSwitch(instanceIdentifier, ucastMacsLocal, localUcastMac); + if (!operationalMacOptional.isPresent()) { + setMac(ucastMacsLocal, localUcastMac, operationalMacOptional); + transaction.add(op.insert(ucastMacsLocal)); + } else { + LocalUcastMacs updatedMac = operationalMacOptional.get(); + String existingMac = updatedMac.getMacEntryKey().getValue(); + UcastMacsLocal extraMac = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), UcastMacsLocal.class); + extraMac.setMac("");; + transaction.add(op.update(ucastMacsLocal) + .where(extraMac.getMacColumn().getSchema().opEqual(existingMac)) + .build()); + } + } + } + + private void setLogicalSwitch(InstanceIdentifier iid, UcastMacsLocal ucastMacsLocal, LocalUcastMacs inputMac) { + if (inputMac.getLogicalSwitchRef() != null) { + HwvtepNodeName lswitchName = new HwvtepNodeName(inputMac.getLogicalSwitchRef().getValue()); + Optional operationalSwitchOptional = + getOperationalState().getLogicalSwitches(iid, new LogicalSwitchesKey(lswitchName)); + if (operationalSwitchOptional.isPresent()) { + Uuid logicalSwitchUuid = operationalSwitchOptional.get().getLogicalSwitchUuid(); + UUID logicalSwitchUUID = new UUID(logicalSwitchUuid.getValue()); + ucastMacsLocal.setLogicalSwitch(logicalSwitchUUID); + } else { + LOG.warn("Create or update localUcastMacs: No logical switch named {} found in operational datastore!", + lswitchName); + } + } + } + + private void setLocator(TransactionBuilder transaction, UcastMacsLocal ucastMacsLocal, LocalUcastMacs inputMac) { + //get UUID by locatorRef + if (inputMac.getLocatorRef() != null) { + UUID locatorUuid = null; + @SuppressWarnings("unchecked") + InstanceIdentifier iid = (InstanceIdentifier) inputMac.getLocatorRef().getValue(); + //try to find locator in operational DS + Optional operationalLocatorOptional = + getOperationalState().getPhysicalLocatorAugmentation(iid); + if (operationalLocatorOptional.isPresent()) { + //if exist, get uuid + HwvtepPhysicalLocatorAugmentation locatorAugmentation = operationalLocatorOptional.get(); + locatorUuid = new UUID(locatorAugmentation.getPhysicalLocatorUuid().getValue()); + } else { + //if no, get it from config DS and create id + Optional configLocatorOptional = + TransactUtils.readNodeFromConfig(getOperationalState().getReadWriteTransaction(), iid); + if (configLocatorOptional.isPresent()) { + HwvtepPhysicalLocatorAugmentation locatorAugmentation = + configLocatorOptional.get().getAugmentation(HwvtepPhysicalLocatorAugmentation.class); + locatorUuid = TransactUtils.createPhysicalLocator(transaction, locatorAugmentation); + } else { + LOG.warn("Create or update localUcastMac: No physical locator found in operational datastore!" + + "Its indentifier is {}", inputMac.getLocatorRef().getValue()); + } + } + if (locatorUuid != null) { + ucastMacsLocal.setLocator(locatorUuid); + } + } + } + + private void setIpAddress(UcastMacsLocal ucastMacsLocal, LocalUcastMacs inputMac) { + if (inputMac.getIpaddr() != null) { + ucastMacsLocal.setIpAddress(inputMac.getIpaddr().getIpv4Address().getValue()); + } + } + + private void setMac(UcastMacsLocal ucastMacsLocal, LocalUcastMacs inputMac, + Optional inputSwitchOptional) { + if (inputMac.getMacEntryKey() != null) { + ucastMacsLocal.setMac(inputMac.getMacEntryKey().getValue()); + } else if (inputSwitchOptional.isPresent() && inputSwitchOptional.get().getMacEntryKey() != null) { + ucastMacsLocal.setMac(inputSwitchOptional.get().getMacEntryKey().getValue()); + } + } + + private Map, List> extractCreated( + Collection> changes, Class class1) { + Map, List> result + = new HashMap, List>(); + if (changes != null && !changes.isEmpty()) { + for (DataTreeModification change : changes) { + final InstanceIdentifier key = change.getRootPath().getRootIdentifier(); + final DataObjectModification mod = change.getRootNode(); + Node created = TransactUtils.getCreated(mod); + if (created != null) { + List macListUpdated = null; + HwvtepGlobalAugmentation hgAugmentation = created.getAugmentation(HwvtepGlobalAugmentation.class); + if (hgAugmentation != null) { + macListUpdated = hgAugmentation.getLocalUcastMacs(); + } + if (macListUpdated != null) { + result.put(key, macListUpdated); + } + } + } + } + return result; + } + + private Map, List> extractUpdated( + Collection> changes, Class class1) { + Map, List> result + = new HashMap, List>(); + if (changes != null && !changes.isEmpty()) { + for (DataTreeModification change : changes) { + final InstanceIdentifier key = change.getRootPath().getRootIdentifier(); + final DataObjectModification mod = change.getRootNode(); + Node updated = TransactUtils.getUpdated(mod); + Node before = mod.getDataBefore(); + if (updated != null && before != null) { + List macListUpdated = null; + List macListBefore = null; + HwvtepGlobalAugmentation hgUpdated = updated.getAugmentation(HwvtepGlobalAugmentation.class); + if (hgUpdated != null) { + macListUpdated = hgUpdated.getLocalUcastMacs(); + } + HwvtepGlobalAugmentation hgBefore = before.getAugmentation(HwvtepGlobalAugmentation.class); + if (hgBefore != null) { + macListBefore = hgBefore.getLocalUcastMacs(); + } + if (macListUpdated != null) { + if (macListBefore != null) { + macListUpdated.removeAll(macListBefore); + } + result.put(key, macListUpdated); + } + } + } + } + return result; } -} \ No newline at end of file +} diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/UcastMacsRemoteUpdateCommand.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/UcastMacsRemoteUpdateCommand.java index 0363fd679..2de4177ea 100644 --- a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/UcastMacsRemoteUpdateCommand.java +++ b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/UcastMacsRemoteUpdateCommand.java @@ -8,14 +8,35 @@ package org.opendaylight.ovsdb.hwvtepsouthbound.transact; +import static org.opendaylight.ovsdb.lib.operations.Operations.op; + import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; +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.UcastMacsRemote; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid; +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.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.hwvtep.global.attributes.LogicalSwitches; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitchesKey; +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.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; +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 AbstractTransactCommand { private static final Logger LOG = LoggerFactory.getLogger(PhysicalPortRemoveCommand.class); @@ -26,6 +47,167 @@ public class UcastMacsRemoteUpdateCommand extends AbstractTransactCommand { @Override public void execute(TransactionBuilder transaction) { - //TODO + Map, List> createds = + extractCreated(getChanges(),RemoteUcastMacs.class); + if (!createds.isEmpty()) { + for (Entry, List> created: + createds.entrySet()) { + updateUcastMacsRemote(transaction, created.getKey(), created.getValue()); + } + } + Map, List> updateds = + extractUpdated(getChanges(),RemoteUcastMacs.class); + if (!updateds.isEmpty()) { + for (Entry, List> updated: + updateds.entrySet()) { + updateUcastMacsRemote(transaction, updated.getKey(), updated.getValue()); + } + } + } + + private void updateUcastMacsRemote(TransactionBuilder transaction, + InstanceIdentifier instanceIdentifier, List remoteUcastMacs) { + for (RemoteUcastMacs remoteUcastMac: remoteUcastMacs) { + LOG.debug("Creating remoteUcastMacs, mac address: {}", remoteUcastMac.getMacEntryKey().getValue()); + Optional operationalMacOptional = + getOperationalState().getRemoteUcastMacs(instanceIdentifier, remoteUcastMac.getKey()); + UcastMacsRemote ucastMacsRemote = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), UcastMacsRemote.class); + setIpAddress(ucastMacsRemote, remoteUcastMac); + setLocator(transaction, ucastMacsRemote, remoteUcastMac); + setLogicalSwitch(instanceIdentifier, ucastMacsRemote, remoteUcastMac); + if (!operationalMacOptional.isPresent()) { + setMac(ucastMacsRemote, remoteUcastMac, operationalMacOptional); + transaction.add(op.insert(ucastMacsRemote)); + } else { + RemoteUcastMacs updatedMac = operationalMacOptional.get(); + String existingMac = updatedMac.getMacEntryKey().getValue(); + UcastMacsRemote extraMac = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), UcastMacsRemote.class); + extraMac.setMac("");; + transaction.add(op.update(ucastMacsRemote) + .where(extraMac.getMacColumn().getSchema().opEqual(existingMac)) + .build()); + } + } + } + + private void setLogicalSwitch(InstanceIdentifier iid, UcastMacsRemote ucastMacsRemote, RemoteUcastMacs inputMac) { + if (inputMac.getLogicalSwitchRef() != null) { + HwvtepNodeName lswitchName = new HwvtepNodeName(inputMac.getLogicalSwitchRef().getValue()); + Optional operationalSwitchOptional = + getOperationalState().getLogicalSwitches(iid, new LogicalSwitchesKey(lswitchName)); + if (operationalSwitchOptional.isPresent()) { + Uuid logicalSwitchUuid = operationalSwitchOptional.get().getLogicalSwitchUuid(); + UUID logicalSwitchUUID = new UUID(logicalSwitchUuid.getValue()); + ucastMacsRemote.setLogicalSwitch(logicalSwitchUUID); + } else { + LOG.warn("Create or update remoteUcastMac: No logical switch named {} found in operational datastore!", + lswitchName); + } + } + } + + private void setLocator(TransactionBuilder transaction, UcastMacsRemote ucastMacsRemote, RemoteUcastMacs inputMac) { + //get UUID by locatorRef + if (inputMac.getLocatorRef() != null) { + UUID locatorUuid = null; + @SuppressWarnings("unchecked") + InstanceIdentifier iid = (InstanceIdentifier) inputMac.getLocatorRef().getValue(); + //try to find locator in operational DS + Optional operationalLocatorOptional = + getOperationalState().getPhysicalLocatorAugmentation(iid); + if (operationalLocatorOptional.isPresent()) { + //if exist, get uuid + HwvtepPhysicalLocatorAugmentation locatorAugmentation = operationalLocatorOptional.get(); + locatorUuid = new UUID(locatorAugmentation.getPhysicalLocatorUuid().getValue()); + } else { + //TODO: need to optimize by eliminating reading Configuration datastore + //if no, get it from config DS and create id + Optional configLocatorOptional = + TransactUtils.readNodeFromConfig(getOperationalState().getReadWriteTransaction(), iid); + if (configLocatorOptional.isPresent()) { + HwvtepPhysicalLocatorAugmentation locatorAugmentation = + configLocatorOptional.get().getAugmentation(HwvtepPhysicalLocatorAugmentation.class); + locatorUuid = TransactUtils.createPhysicalLocator(transaction, locatorAugmentation); + } else { + LOG.warn("Create or update remoteUcastMac: No physical locator found in operational datastore!" + + "Its indentifier is {}", inputMac.getLocatorRef().getValue()); + } + } + if (locatorUuid != null) { + ucastMacsRemote.setLocator(locatorUuid); + } + } + } + + private void setIpAddress(UcastMacsRemote ucastMacsRemote, RemoteUcastMacs inputMac) { + if (inputMac.getIpaddr() != null) { + ucastMacsRemote.setIpAddress(inputMac.getIpaddr().getIpv4Address().getValue()); + } + } + + private void setMac(UcastMacsRemote ucastMacsRemote, RemoteUcastMacs inputMac, + Optional inputSwitchOptional) { + if (inputMac.getMacEntryKey() != null) { + ucastMacsRemote.setMac(inputMac.getMacEntryKey().getValue()); + } else if (inputSwitchOptional.isPresent() && inputSwitchOptional.get().getMacEntryKey() != null) { + ucastMacsRemote.setMac(inputSwitchOptional.get().getMacEntryKey().getValue()); + } + } + + private Map, List> extractCreated( + Collection> changes, Class class1) { + Map, List> result + = new HashMap, List>(); + if (changes != null && !changes.isEmpty()) { + for (DataTreeModification change : changes) { + final InstanceIdentifier key = change.getRootPath().getRootIdentifier(); + final DataObjectModification mod = change.getRootNode(); + Node created = TransactUtils.getCreated(mod); + if (created != null) { + List macListUpdated = null; + HwvtepGlobalAugmentation hgAugmentation = created.getAugmentation(HwvtepGlobalAugmentation.class); + if (hgAugmentation != null) { + macListUpdated = hgAugmentation.getRemoteUcastMacs(); + } + if (macListUpdated != null) { + result.put(key, macListUpdated); + } + } + } + } + return result; + } + + private Map, List> extractUpdated( + Collection> changes, Class class1) { + Map, List> result + = new HashMap, List>(); + if (changes != null && !changes.isEmpty()) { + for (DataTreeModification change : changes) { + final InstanceIdentifier key = change.getRootPath().getRootIdentifier(); + final DataObjectModification mod = change.getRootNode(); + Node updated = TransactUtils.getUpdated(mod); + Node before = mod.getDataBefore(); + if (updated != null && before != null) { + List macListUpdated = null; + List macListBefore = null; + HwvtepGlobalAugmentation hgUpdated = updated.getAugmentation(HwvtepGlobalAugmentation.class); + if (hgUpdated != null) { + macListUpdated = hgUpdated.getRemoteUcastMacs(); + } + HwvtepGlobalAugmentation hgBefore = before.getAugmentation(HwvtepGlobalAugmentation.class); + if (hgBefore != null) { + macListBefore = hgBefore.getRemoteUcastMacs(); + } + if (macListUpdated != null) { + if (macListBefore != null) { + macListUpdated.removeAll(macListBefore); + } + result.put(key, macListUpdated); + } + } + } + } + return result; } } \ No newline at end of file diff --git a/resources/commons/Ovsdb-HwvtepSouthbound-Collection.json.postman_collection b/resources/commons/Ovsdb-HwvtepSouthbound-Collection.json.postman_collection index 9a08d1793..bd634b0f3 100755 --- a/resources/commons/Ovsdb-HwvtepSouthbound-Collection.json.postman_collection +++ b/resources/commons/Ovsdb-HwvtepSouthbound-Collection.json.postman_collection @@ -21,12 +21,23 @@ "f6d300f7-380a-d090-0d4a-2b2ddefe5104", "f9f71d74-a49d-b190-d929-b6772ce0ba73", "18032e93-3bc5-9976-4525-fe1e77e98207", + "6f6addb7-6d48-e1ef-8cc2-c5841d71c2e5", + "20e8b57b-a5e7-a52f-01d6-7b66ea551078", + "7714d521-baf0-2dc2-e8ca-4f6228270099", + "92bb5645-1804-8174-5e73-2b0780feecfa", + "3c387234-5ae9-e589-2fe0-11666b00fec9", + "d01abaee-9f84-d625-4dc8-56da031255a1", + "6329fb56-9e3b-647f-141a-dad277c303fd", + "51384eb0-05f8-7636-90d8-6d55605f80e6", + "dd1cd03e-ab78-b6da-5cd8-271e1c6f9c75", "22354294-1d01-cebf-180c-d609747be9bc", "c8e8f3fd-3bfb-aafa-e3ec-a671a942f426", "d362ddc4-1c5f-67d5-e354-c2a8d2ba9d79", "538c71b3-e3e6-f01b-cc4c-d2b686686aa8", "a13e6877-997e-84e1-c8e8-e83ef5e9a002", - "3c86ab7c-a7ee-6b71-3ec1-da7d20f97d1a" + "3c86ab7c-a7ee-6b71-3ec1-da7d20f97d1a", + "4602c331-5850-0813-c276-d4ec3ae7b3d6", + "3b8a86df-fe33-5104-2da7-5e0cbdb7a881" ], "owner":0, "sharedWithTeam":false, @@ -410,6 +421,211 @@ "time": 1448718837283, "name": "Get Specific Operational Physical Port", "description": "" + }, + { + "collectionId": "19f6b1a8-4d54-62f8-6bd6-f52e0b6e40b8", + "id": "20e8b57b-a5e7-a52f-01d6-7b66ea551078", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://{{controllerHost}}:8181/restconf/config/network-topology:network-topology/topology/hwvtep:1/node/hwvtep:%2F%2F{{hwvtepNodeIp}}:6640", + "preRequestScript": "", + "pathVariables": {}, + "method": "POST", + "data": [], + "dataMode": "raw", + "version": 2, + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1449132978312, + "name": "Create Specific Config UcastMacRemote", + "description": "", + "rawModeData": "{\n \"remote-ucast-macs\": [\n {\n \"mac-entry-key\": \"11:11:11:11:11:11\",\n \"logical-switch-ref\": \"ls0\",\n \"ipaddr\": \"1.1.1.1\",\n \"locator-ref\": \"/network-topology:network-topology/network-topology:topology[network-topology:topology-id='hwvtep:1']/network-topology:node[network-topology:node-id='hwvtep://{{hwvtepNodeIp}}:6640']/network-topology:termination-point[network-topology:tp-id='vxlan_over_ipv4:{{LocatorIp}}']\" \n }\n ]\n}" + }, + { + "collectionId": "19f6b1a8-4d54-62f8-6bd6-f52e0b6e40b8", + "id": "7714d521-baf0-2dc2-e8ca-4f6228270099", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://{{controllerHost}}:8181/restconf/config/network-topology:network-topology/topology/hwvtep:1/node/hwvtep:%2F%2F{{hwvtepNodeIp}}:6640/remote-ucast-macs/11:11:11:11:11:11", + "preRequestScript": "", + "pathVariables": {}, + "method": "PUT", + "data": [], + "dataMode": "raw", + "version": 2, + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1449310821724, + "name": "Update Specific Config UcastMacRemote", + "description": "", + "rawModeData": "{\n \"remote-ucast-macs\": [\n {\n \"mac-entry-key\": \"11:11:11:11:11:11\",\n \"logical-switch-ref\": \"ls0\",\n \"ipaddr\": \"1.1.1.1\",\n \"locator-ref\": \"/network-topology:network-topology/network-topology:topology[network-topology:topology-id='hwvtep:1']/network-topology:node[network-topology:node-id='hwvtep://{{hwvtepNodeIp}}:6640']/network-topology:termination-point[network-topology:tp-id='vxlan_over_ipv4:{{LocatorIp}}']\"\n }\n ]\n}" + }, + { + "collectionId": "19f6b1a8-4d54-62f8-6bd6-f52e0b6e40b8", + "id": "92bb5645-1804-8174-5e73-2b0780feecfa", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://{{controllerHost}}:8181/restconf/config/network-topology:network-topology/topology/hwvtep:1/node/hwvtep:%2F%2F{{hwvtepNodeIp}}:6640/remote-ucast-macs/11:11:11:11:11:11", + "preRequestScript": "", + "pathVariables": {}, + "method": "GET", + "data": [], + "dataMode": "params", + "version": 2, + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1449311389212, + "name": "Get Specific Config UcastMacRemote", + "description": "" + }, + { + "collectionId": "19f6b1a8-4d54-62f8-6bd6-f52e0b6e40b8", + "id": "3c387234-5ae9-e589-2fe0-11666b00fec9", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://{{controllerHost}}:8181/restconf/config/network-topology:network-topology/topology/hwvtep:1/node/hwvtep:%2F%2F{{hwvtepNodeIp}}:6640/remote-ucast-macs/11:11:11:11:11:11", + "preRequestScript": "", + "pathVariables": {}, + "method": "DELETE", + "data": [], + "dataMode": "raw", + "version": 2, + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1449311417267, + "name": "Delete Specific Config UcastMacRemote", + "description": "", + "rawModeData": "" + }, + { + "collectionId": "19f6b1a8-4d54-62f8-6bd6-f52e0b6e40b8", + "id": "4602c331-5850-0813-c276-d4ec3ae7b3d6", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://{{controllerHost}}:8181/operational/config/network-topology:network-topology/topology/hwvtep:1/node/hwvtep:%2F%2F{{hwvtepNodeIp}}:6640/remote-ucast-macs/11:11:11:11:11:11", + "preRequestScript": "", + "pathVariables": {}, + "method": "GET", + "data": [], + "dataMode": "params", + "version": 2, + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1449314879742, + "name": "Get Specific Operational UcastMacRemote", + "description": "" + }, + { + "collectionId": "19f6b1a8-4d54-62f8-6bd6-f52e0b6e40b8", + "id": "6f6addb7-6d48-e1ef-8cc2-c5841d71c2e5", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://{{controllerHost}}:8181/restconf/config/network-topology:network-topology/topology/hwvtep:1/node/hwvtep:%2F%2F{{hwvtepNodeIp}}:6640", + "preRequestScript": "", + "pathVariables": {}, + "method": "POST", + "data": [], + "dataMode": "raw", + "version": 2, + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1448972198808, + "name": "Create Specific Config Locator", + "description": "", + "rawModeData": "{\n \"termination-point\": [\n {\n \"tp-id\": \"vxlan_over_ipv4:{{LocatorIp}}\",\n \"encapsulation-type\": \"encapsulation-type-vxlan-over-ipv4\",\n \t\"dst-ip\": \"{{LocatorIp}}\"\n\t\t}\n ]\n}" + }, + { + "collectionId": "19f6b1a8-4d54-62f8-6bd6-f52e0b6e40b8", + "id": "d01abaee-9f84-d625-4dc8-56da031255a1", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://{{controllerHost}}:8181/restconf/config/network-topology:network-topology/topology/hwvtep:1/node/hwvtep:%2F%2F{{hwvtepNodeIp}}:6640", + "preRequestScript": "", + "pathVariables": {}, + "method": "POST", + "data": [], + "dataMode": "raw", + "version": 2, + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1449286080233, + "name": "Create Specific Config UcastMacLocal", + "description": "", + "rawModeData": "{\n \"local-ucast-macs\": [\n {\n \"mac-entry-key\": \"22:22:22:22:22:22\",\n \"logical-switch-ref\": \"ls0\",\n \"ipaddr\": \"2.2.2.2\",\n \"locator-ref\": \"/network-topology:network-topology/network-topology:topology[network-topology:topology-id='hwvtep:1']/network-topology:node[network-topology:node-id='hwvtep://{{hwvtepNodeIp}}:6640']/network-topology:termination-point[network-topology:tp-id='vxlan_over_ipv4:{{LocatorIp}}']\" \n }\n ]\n}" + }, + { + "collectionId": "19f6b1a8-4d54-62f8-6bd6-f52e0b6e40b8", + "id": "6329fb56-9e3b-647f-141a-dad277c303fd", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://{{controllerHost}}:8181/restconf/config/network-topology:network-topology/topology/hwvtep:1/node/hwvtep:%2F%2F{{hwvtepNodeIp}}:6640/local-ucast-macs/22:11:11:11:11:11", + "preRequestScript": "", + "pathVariables": {}, + "method": "PUT", + "data": [], + "dataMode": "raw", + "version": 2, + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1449310498424, + "name": "Update Specific Config UcastMacLocal", + "description": "", + "rawModeData": "{\n \"local-ucast-macs\": [\n {\n \"mac-entry-key\": \"22:22:22:22:22:22\",\n \"logical-switch-ref\": \"ls0\",\n \"ipaddr\": \"2.2.2.2\",\n \"locator-ref\": \"/network-topology:network-topology/network-topology:topology[network-topology:topology-id='hwvtep:1']/network-topology:node[network-topology:node-id='hwvtep://{{hwvtepNodeIp}}:6640']/network-topology:termination-point[network-topology:tp-id='vxlan_over_ipv4:{{LocatorIp}}']\"\n }\n ]\n}" + }, + { + "collectionId": "19f6b1a8-4d54-62f8-6bd6-f52e0b6e40b8", + "id": "51384eb0-05f8-7636-90d8-6d55605f80e6", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://{{controllerHost}}:8181/restconf/config/network-topology:network-topology/topology/hwvtep:1/node/hwvtep:%2F%2F{{hwvtepNodeIp}}:6640/local-ucast-macs/22:22:22:22:22:22", + "preRequestScript": "", + "pathVariables": {}, + "method": "GET", + "data": [], + "dataMode": "params", + "version": 2, + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1449311223998, + "name": "Get Specific Config UcastMacLocal ", + "description": "" + }, + { + "collectionId": "19f6b1a8-4d54-62f8-6bd6-f52e0b6e40b8", + "id": "dd1cd03e-ab78-b6da-5cd8-271e1c6f9c75", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://{{controllerHost}}:8181/restconf/config/network-topology:network-topology/topology/hwvtep:1/node/hwvtep:%2F%2F{{hwvtepNodeIp}}:6640/local-ucast-macs/22:22:22:22:22:22", + "preRequestScript": "", + "pathVariables": {}, + "method": "DELETE", + "data": [], + "dataMode": "raw", + "version": 2, + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1449311421493, + "name": "Delete Specific Config UcastMacLocal", + "description": "", + "rawModeData": "" + }, + { + "collectionId": "19f6b1a8-4d54-62f8-6bd6-f52e0b6e40b8", + "id": "3b8a86df-fe33-5104-2da7-5e0cbdb7a881", + "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n", + "url": "http://{{controllerHost}}:8181/restconf/operational/network-topology:network-topology/topology/hwvtep:1/node/hwvtep:%2F%2F{{hwvtepNodeIp}}:6640/local-ucast-macs/22:22:22:22:22:22", + "preRequestScript": "", + "pathVariables": {}, + "method": "GET", + "data": [], + "dataMode": "params", + "version": 2, + "tests": "", + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1449315928725, + "name": "Get Specific Operational UcastMacLocal ", + "description": "" } ] } -- 2.36.6