X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=elanmanager%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Felan%2Finternal%2FElanServiceProvider.java;h=d5cd91fea24d1151597e09d6310fba751b780feb;hb=refs%2Fchanges%2F35%2F91835%2F21;hp=5f811558963b3076a20052f954d5b7261ec365c4;hpb=2f0569ed75ef8a1fb60f992d19c8bbdf92ff45bf;p=netvirt.git diff --git a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java index 5f81155896..d5cd91fea2 100644 --- a/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java +++ b/elanmanager/impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java @@ -8,12 +8,14 @@ package org.opendaylight.netvirt.elan.internal; -import static java.util.Collections.emptyList; +import static java.util.Collections.emptyMap; +import static org.opendaylight.mdsal.binding.util.Datastore.CONFIGURATION; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -26,9 +28,6 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.genius.infra.Datastore; -import org.opendaylight.genius.infra.ManagedNewTransactionRunner; -import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl; import org.opendaylight.genius.interfacemanager.exceptions.InterfaceAlreadyExistsException; import org.opendaylight.genius.interfacemanager.globals.IfmConstants; import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager; @@ -40,6 +39,8 @@ import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants; import org.opendaylight.infrautils.inject.AbstractLifecycle; import org.opendaylight.infrautils.utils.concurrent.LoggingFutures; import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunner; +import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunnerImpl; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.eos.binding.api.Entity; import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipCandidateRegistration; @@ -83,7 +84,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.elan._interface.StaticMacEntriesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.state.Elan; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntryKey; 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.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.Uint32; @@ -218,7 +221,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi ElanInstance updateElanInstance = new ElanInstanceBuilder().setElanInstanceName(elanInstanceName) .setDescription(description).setMacTimeout(macTimeout) .withKey(new ElanInstanceKey(elanInstanceName)) - .addAugmentation(EtreeInstance.class, etreeInstance).build(); + .addAugmentation(etreeInstance).build(); MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION, ElanHelper.getElanInstanceConfigurationDataPath(elanInstanceName), updateElanInstance); LOG.debug("Updating the Etree Instance {} with MAC TIME-OUT {} and Description {} ", @@ -229,7 +232,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi ElanInstance elanInstance = new ElanInstanceBuilder().setElanInstanceName(elanInstanceName) .setMacTimeout(macTimeout).setDescription(description) .withKey(new ElanInstanceKey(elanInstanceName)) - .addAugmentation(EtreeInstance.class, etreeInstance).build(); + .addAugmentation(etreeInstance).build(); MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION, ElanHelper.getElanInstanceConfigurationDataPath(elanInstanceName), elanInstance); LOG.debug("Creating the new Etree Instance {}", elanInstance); @@ -287,14 +290,14 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi if (staticMacAddresses == null) { elanInterface = new ElanInterfaceBuilder().setElanInstanceName(etreeInstanceName) .setDescription(description).setName(interfaceName).withKey(new ElanInterfaceKey(interfaceName)) - .addAugmentation(EtreeInterface.class, etreeInterface).build(); + .addAugmentation(etreeInterface).build(); } else { List staticMacEntries = ElanUtils.getStaticMacEntries(staticMacAddresses); elanInterface = new ElanInterfaceBuilder().setElanInstanceName(etreeInstanceName) .setDescription(description).setName(interfaceName) .setStaticMacEntries(staticMacEntries) .withKey(new ElanInterfaceKey(interfaceName)) - .addAugmentation(EtreeInterface.class, etreeInterface).build(); + .addAugmentation(etreeInterface).build(); } MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION, ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName), elanInterface); @@ -392,7 +395,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi ElanInterfaceMac elanInterfaceMac = elanUtils.getElanInterfaceMacByInterfaceName(elanInterface); if (elanInterfaceMac != null && elanInterfaceMac.getMacEntry() != null && elanInterfaceMac.getMacEntry().size() > 0) { - macAddress.addAll(elanInterfaceMac.getMacEntry()); + macAddress.addAll(elanInterfaceMac.nonnullMacEntry().values()); } } } @@ -412,8 +415,8 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi for (String elanInterface : elanInterfaces) { ElanInterfaceMac elanInterfaceMac = elanUtils.getElanInterfaceMacByInterfaceName(elanInterface); if (elanInterfaceMac.getMacEntry() != null && elanInterfaceMac.getMacEntry().size() > 0) { - List macEntries = elanInterfaceMac.getMacEntry(); - for (MacEntry macEntry : macEntries) { + Map macEntries = elanInterfaceMac.nonnullMacEntry(); + for (MacEntry macEntry : macEntries.values()) { deleteStaticMacAddress(elanInterface, macEntry.getMacAddress().getValue()); } } @@ -431,8 +434,8 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi public List getElanInstances() { InstanceIdentifier elanInstancesIdentifier = InstanceIdentifier.builder(ElanInstances.class) .build(); - return ElanUtils.read(broker, LogicalDatastoreType.CONFIGURATION, elanInstancesIdentifier).map( - ElanInstances::getElanInstance).orElse(emptyList()); + return new ArrayList<>(ElanUtils.read(broker, LogicalDatastoreType.CONFIGURATION, elanInstancesIdentifier).map( + ElanInstances::nonnullElanInstance).orElse(emptyMap()).values()); } @Override @@ -446,8 +449,8 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi if (!elanInterfacesOptional.isPresent()) { return elanInterfaces; } - List elanInterfaceList = elanInterfacesOptional.get().nonnullElanInterface(); - for (ElanInterface elanInterface : elanInterfaceList) { + Map elanInterfaceList = elanInterfacesOptional.get().nonnullElanInterface(); + for (ElanInterface elanInterface : elanInterfaceList.values()) { if (Objects.equals(elanInterface.getElanInstanceName(), elanInstanceName)) { elanInterfaces.add(elanInterface.getName()); } @@ -810,14 +813,14 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi return; } - List nodes = southboundUtils.getOvsdbNodes(); + Map nodes = southboundUtils.getOvsdbNodes(); if (nodes == null || nodes.isEmpty()) { LOG.trace("No OVS nodes found while creating external network for ELAN {}", elanInstance.getElanInstanceName()); return; } - for (Node node : nodes) { + for (Node node : nodes.values()) { if (bridgeMgr.isIntegrationBridge(node)) { if (update && !elanInstance.isExternal()) { DpnInterfaces dpnInterfaces = elanUtils.getElanInterfaceInfoByElanDpn(elanInstanceName, @@ -869,13 +872,22 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi return; } String flowId = ArpResponderUtil.getFlowId(lportTag, ipAddress); + Map + arpResponderInputInstructionsMap = new HashMap<>(); + int instructionKey = 0; + for (org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction + instructionObj : arpResponderInput.getInstructions()) { + arpResponderInputInstructionsMap.put(new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types + .rev131026.instruction.list.InstructionKey(++instructionKey), instructionObj); + } Flow flowEntity = MDSALUtil.buildFlowNew(NwConstants.ARP_RESPONDER_TABLE, flowId, NwConstants.DEFAULT_ARP_FLOW_PRIORITY, flowId, 0, 0, ArpResponderUtil.generateCookie(lportTag, ipAddress), ArpResponderUtil.getMatchCriteria(lportTag, elanInstance, ipAddress), - arpResponderInput.getInstructions()); - LoggingFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(Datastore.CONFIGURATION, + arpResponderInputInstructionsMap); + LoggingFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx -> mdsalManager.addFlow(tx, dpnId, flowEntity)), LOG, "Error adding flow {}", flowEntity); LOG.info("Installed the ARP Responder flow for Interface {}", ingressInterfaceName); } @@ -897,13 +909,24 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi int lportTag = arpResponderInput.getLportTag(); String flowId = ArpResponderUtil.getFlowId(lportTag, ipAddress); + + Map + arpResponderInputInstructionsMap = new HashMap<>(); + int instructionKey = 0; + for (org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction + instructionObj : arpResponderInput.getInstructions()) { + arpResponderInputInstructionsMap.put(new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types + .rev131026.instruction.list.InstructionKey(++instructionKey), instructionObj); + } + Flow flowEntity = MDSALUtil.buildFlowNew(NwConstants.ARP_RESPONDER_TABLE, flowId, NwConstants.DEFAULT_ARP_FLOW_PRIORITY, flowId, 0, 0, ArpResponderUtil.generateCookie(lportTag, ipAddress), ArpResponderUtil.getMatchCriteria(lportTag, elanInstance, ipAddress), - arpResponderInput.getInstructions()); - LoggingFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(Datastore.CONFIGURATION, + arpResponderInputInstructionsMap); + LoggingFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx -> mdsalManager.addFlow(tx, dpnId, flowEntity)), LOG, "Error adding flow {}", flowEntity); LOG.trace("Installed the ExternalTunnel ARP Responder flow for ElanInstance {}", elanInstanceName); }