if (neutronPort != null) {
LOG.debug("Clean up the NeutronPortCache ");
neutronL3Adapter.removePortFromCleanupCache(neutronPort);
+ neutronL3Adapter.removeNetworkFromCleanupCache(neutronPort.getNetworkUUID());
} else {
LOG.trace("Nothing to Clean up in the NeutronPortCache ");
}
import java.util.List;
import com.google.common.base.Preconditions;
+
import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
import org.opendaylight.ovsdb.openstack.netvirt.api.ArpProvider;
import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
private volatile INeutronNetworkCRUD neutronNetworkCache;
private volatile INeutronPortCRUD neutronPortCache;
private volatile ArpProvider arpProvider;
+ private volatile NeutronL3Adapter neutronL3Adapter;
private Southbound southbound;
private Boolean flgDistributedARPEnabled = true;
private void handleNeutornPortForArp(NeutronPort neutronPort, Action action) {
final String networkUUID = neutronPort.getNetworkUUID();
- final NeutronNetwork neutronNetwork = neutronNetworkCache.getNetwork(networkUUID);
+ NeutronNetwork neutronNetwork = neutronNetworkCache.getNetwork(networkUUID);
+ if (null == neutronNetwork) {
+ neutronNetwork = neutronL3Adapter.getNetworkFromCleanupCache(networkUUID);
+ }
final String providerSegmentationId = neutronNetwork != null ?
neutronNetwork.getProviderSegmentationID() : null;
final String tenantMac = neutronPort.getMacAddress();
(NodeCacheManager) ServiceHelper.getGlobalInstance(NodeCacheManager.class, this);
southbound =
(Southbound) ServiceHelper.getGlobalInstance(Southbound.class, this);
+ neutronL3Adapter =
+ (NeutronL3Adapter) ServiceHelper.getGlobalInstance(NeutronL3Adapter.class, this);
initMembers();
}
private String externalRouterMac;
private Boolean enabled = false;
private Boolean isCachePopulationDone = false;
- private Set<NeutronPort> portCleanupCache;
+ private Map<String, NeutronPort> portCleanupCache;
+ private Map<String, NeutronNetwork> networkCleanupCache;
private Southbound southbound;
private DistributedArpService distributedArpService;
} else {
LOG.debug("OVSDB L3 forwarding is disabled");
}
- this.portCleanupCache = new HashSet<>();
+ this.portCleanupCache = new HashMap<>();
+ this.networkCleanupCache = new HashMap<>();
}
//
*/
public void handleNeutronSubnetEvent(final NeutronSubnet subnet, Action action) {
LOG.debug("Neutron subnet {} event : {}", action, subnet.toString());
+ if (action == Action.ADD) {
+ this.storeNetworkInCleanupCache(neutronNetworkCache.getNetwork(subnet.getNetworkUUID()));
+ }
}
/**
this.triggerGatewayMacResolver(neutronPort);
}else{
NeutronNetwork externalNetwork = neutronNetworkCache.getNetwork(neutronPort.getNetworkUUID());
+ if (null == externalNetwork) {
+ externalNetwork = this.getNetworkFromCleanupCache(neutronPort.getNetworkUUID());
+ }
if (externalNetwork != null && externalNetwork.isRouterExternal()) {
final NeutronSubnet externalSubnet = getExternalNetworkSubnet(neutronPort);
*/
public void handleNeutronNetworkEvent(final NeutronNetwork neutronNetwork, Action action) {
LOG.debug("neutronNetwork {}: network: {}", action, neutronNetwork);
+ if (action == Action.UPDATE) {
+ this.updateNetworkInCleanupCache(neutronNetwork);
+ }
}
//
private void storePortInCleanupCache(NeutronPort port) {
- this.portCleanupCache.add(port);
+ this.portCleanupCache.put(port.getPortUUID(),port);
}
}
public void removePortFromCleanupCache(NeutronPort port) {
- this.portCleanupCache.remove(port);
+ this.portCleanupCache.remove(port.getPortUUID());
}
- public Set<NeutronPort> getPortCleanupCache() {
+ public Map<String, NeutronPort> getPortCleanupCache() {
return this.portCleanupCache;
}
public NeutronPort getPortFromCleanupCache(String portid) {
- for (NeutronPort neutronPort : this.portCleanupCache) {
- if (neutronPort.getPortUUID() != null ) {
- if (neutronPort.getPortUUID().equals(portid)) {
- LOG.info("getPortFromCleanupCache: Matching NeutronPort found {}", portid);
- return neutronPort;
- }
+ for (String neutronPortUuid : this.portCleanupCache.keySet()) {
+ if (neutronPortUuid.equals(portid)) {
+ LOG.info("getPortFromCleanupCache: Matching NeutronPort found {}", portid);
+ return this.portCleanupCache.get(neutronPortUuid);
}
}
return null;
}
+ private void storeNetworkInCleanupCache(NeutronNetwork network) {
+ this.networkCleanupCache.put(network.getNetworkUUID(), network);
+ }
+
+
+ private void updateNetworkInCleanupCache(NeutronNetwork network) {
+ for (String neutronNetworkUuid:this.networkCleanupCache.keySet()) {
+ if (neutronNetworkUuid.equals(network.getNetworkUUID())) {
+ this.networkCleanupCache.remove(neutronNetworkUuid);
+ }
+ }
+ this.networkCleanupCache.put(network.getNetworkUUID(), network);
+ }
+
+ public void removeNetworkFromCleanupCache(String networkid) {
+ NeutronNetwork network = null;
+ for (String neutronNetworkUuid:this.networkCleanupCache.keySet()) {
+ if (neutronNetworkUuid.equals(networkid)) {
+ network = networkCleanupCache.get(neutronNetworkUuid);
+ break;
+ }
+ }
+ if (network != null) {
+ for (String neutronPortUuid:this.portCleanupCache.keySet()) {
+ if (this.portCleanupCache.get(neutronPortUuid).getNetworkUUID().equals(network.getNetworkUUID())) {
+ LOG.info("This network is used by another port", network);
+ return;
+ }
+ }
+ this.networkCleanupCache.remove(network.getNetworkUUID());
+ }
+ }
+
+ public Map<String, NeutronNetwork> getNetworkCleanupCache() {
+ return this.networkCleanupCache;
+ }
+
+ public NeutronNetwork getNetworkFromCleanupCache(String networkid) {
+ for (String neutronNetworkUuid:this.networkCleanupCache.keySet()) {
+ if (neutronNetworkUuid.equals(networkid)) {
+ LOG.info("getPortFromCleanupCache: Matching NeutronPort found {}", networkid);
+ return networkCleanupCache.get(neutronNetworkUuid);
+ }
+ }
+ return null;
+ }
/**
* Return String that represents OF port with marker explicitly provided (reverse of MatchUtils:parseExplicitOFPort)
*
public static String encodeExcplicitOFPort(Long ofPort) {
return "OFPort|" + ofPort.toString();
}
-
+ private void initNetworkCleanUpCache() {
+ if (this.neutronNetworkCache != null) {
+ for (NeutronNetwork neutronNetwork : neutronNetworkCache.getAllNetworks()) {
+ networkCleanupCache.put(neutronNetwork.getNetworkUUID(), neutronNetwork);
+ }
+ }
+ }
+ private void initPortCleanUpCache() {
+ if (this.neutronPortCache != null) {
+ for (NeutronPort neutronPort : neutronPortCache.getAllPorts()) {
+ portCleanupCache.put(neutronPort.getPortUUID(), neutronPort);
+ }
+ }
+ }
@Override
public void setDependencies(ServiceReference serviceReference) {
eventDispatcher =
public void setDependencies(Object impl) {
if (impl instanceof INeutronNetworkCRUD) {
neutronNetworkCache = (INeutronNetworkCRUD)impl;
+ initNetworkCleanUpCache();
} else if (impl instanceof INeutronPortCRUD) {
neutronPortCache = (INeutronPortCRUD)impl;
+ initPortCleanUpCache();
} else if (impl instanceof INeutronSubnetCRUD) {
neutronSubnetCache = (INeutronSubnetCRUD)impl;
} else if (impl instanceof INeutronFloatingIPCRUD) {
/*For every port check whether security grouplist contains the current
* security group.*/
try {
- for (NeutronPort neutronPort:neutronL3Adapter.getPortCleanupCache()) {
+ for (String neutronPortUuid:neutronL3Adapter.getPortCleanupCache().keySet()) {
+ NeutronPort neutronPort = neutronL3Adapter.getPortCleanupCache().get(neutronPortUuid);
if (!neutronPort.getDeviceOwner().contains("compute")) {
LOG.debug("getVMListForSecurityGroup : the port {} is not "
+ "compute port belongs to {}", neutronPort.getID(), neutronPort.getDeviceOwner());
return;
}
NeutronNetwork neutronNetwork = neutronNetworkCache.getNetwork(port.getNetworkUUID());
+ if (null == neutronNetwork) {
+ neutronNetwork = neutronL3Adapter.getNetworkFromCleanupCache(port.getNetworkUUID());
+ }
if (neutronNetwork == null) {
return;
}
return;
}
NeutronNetwork neutronNetwork = neutronNetworkCache.getNetwork(port.getNetworkUUID());
+ if (null == neutronNetwork) {
+ neutronNetwork = neutronL3Adapter.getNetworkFromCleanupCache(port.getNetworkUUID());
+ }
if (neutronNetwork == null) {
return;
}
import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-
import org.osgi.framework.ServiceReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private INeutronPortCRUD neutronPortCache;
private VlanConfigurationCache vlanConfigurationCache;
private Southbound southbound;
+ private volatile NeutronL3Adapter neutronL3Adapter;
@Override
public int getInternalVlan(Node node, String networkId) {
return network.getNetworkUUID();
}
}
+ for (String networkUuid : neutronL3Adapter.getNetworkCleanupCache().keySet()) {
+ NeutronNetwork network = neutronL3Adapter.getNetworkFromCleanupCache(networkUuid);
+ if (network.getProviderSegmentationID() != null &&
+ network.getProviderSegmentationID().equalsIgnoreCase(segmentationId)) {
+ return network.getNetworkUUID();
+ }
+ }
return null;
}
Constants.EXTERNAL_ID_INTERFACE_ID);
if (neutronPortId != null) {
NeutronPort neutronPort = neutronPortCache.getPort(neutronPortId);
+ if ( null == neutronPort) {
+ LOG.debug("neutronPort is null, checking the clean up cache.");
+ neutronPort = neutronL3Adapter.getPortFromCleanupCache(neutronPortId);
+ }
if (neutronPort != null) {
neutronNetwork = neutronNetworkCache.getNetwork(neutronPort.getNetworkUUID());
+ if (null == neutronNetwork) {
+ neutronNetwork = neutronL3Adapter.getNetworkFromCleanupCache(neutronPort.getNetworkUUID());
+ }
if (neutronNetwork != null) {
LOG.debug("mapped to {}", neutronNetwork);
} else {
Constants.EXTERNAL_ID_INTERFACE_ID);
if (neutronPortId != null) {
neutronPort = neutronPortCache.getPort(neutronPortId);
+ if (null == neutronPort) {
+ LOG.debug("neutronPort is null checking the clean up cache.");
+ neutronPort = neutronL3Adapter.getPortFromCleanupCache(neutronPortId);
+ }
}
if (neutronPort != null) {
LOG.debug("mapped to {}", neutronPort);
private boolean isInterfacePresentInTenantNetwork (String portId, String networkId) {
NeutronPort neutronPort = neutronPortCache.getPort(portId);
+ if (null == neutronPort) {
+ LOG.debug("neutronPort is null checking the clean up cache.");
+ neutronPort = neutronL3Adapter.getPortFromCleanupCache(portId);
+ }
return neutronPort != null && neutronPort.getNetworkUUID().equalsIgnoreCase(networkId);
}
(VlanConfigurationCache) ServiceHelper.getGlobalInstance(VlanConfigurationCache.class, this);
southbound =
(Southbound) ServiceHelper.getGlobalInstance(Southbound.class, this);
+ neutronL3Adapter =
+ (NeutronL3Adapter) ServiceHelper.getGlobalInstance(NeutronL3Adapter.class, this);
}
@Override
@Test
public void testhandleNeutronSubnetEvent() throws Exception {
- // Nothing to be done here
+ Map<String,NeutronNetwork> networkCleanupCache = new HashMap<>();
+ INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
+ NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
+ when(neutronNetworkCache.getNetwork(anyString())).thenReturn(neutronNetwork);
+ // Mock variables
+ MemberModifier.field(NeutronL3Adapter.class, "networkCleanupCache").set(neutronL3Adapter , networkCleanupCache);
+ MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
neutronL3Adapter.handleNeutronSubnetEvent(mock(NeutronSubnet.class), Action.ADD);
}
@Test
public void testHandleNeutronPortEvent() throws Exception {
Map<String, NeutronRouter_Interface> subnetIdToRouterInterfaceCache = new HashMap<>();
- Set<NeutronPort> portCleanupCache = new HashSet<>();
+ Map<String,NeutronPort> portCleanupCache = new HashMap<>();
// Mock variables
Neutron_IPs neutronIP = mock(Neutron_IPs.class);
when(neutronIP.getSubnetUUID()).thenReturn(UUID);
@Test
public void testHandleNeutronNetworkEvent() throws Exception {
// Nothing to be done here
+ Map<String,NeutronNetwork> networkCleanupCache = new HashMap<>();
+ // Mock variables
+ MemberModifier.field(NeutronL3Adapter.class, "networkCleanupCache").set(neutronL3Adapter , networkCleanupCache);
Whitebox.invokeMethod(neutronL3Adapter, "handleNeutronNetworkEvent", mock(NeutronNetwork.class), Action.ADD);
}
@Test
public void testSetDependencies() throws Exception {
+ Map<String,NeutronNetwork> networkCleanupCache = new HashMap<>();
+ INeutronNetworkCRUD neutronNetworkCache = mock(INeutronNetworkCRUD.class);
+ NeutronNetwork neutronNetwork = mock(NeutronNetwork.class);
+ List <NeutronNetwork> neutronNetworkList = new ArrayList<NeutronNetwork>();
+ neutronNetworkList.add(neutronNetwork);
+ when(neutronNetworkCache.getAllNetworks()).thenReturn(neutronNetworkList);
+
+ Map<String,NeutronPort> portCleanupCache = new HashMap<>();
+ INeutronPortCRUD neutronPortCache = mock(INeutronPortCRUD.class);
+ NeutronPort neutronPort = mock(NeutronPort.class);
+ List <NeutronPort> neutronPortList = new ArrayList<NeutronPort>();
+ neutronPortList.add(neutronPort);
+ when(neutronPortCache.getAllPorts()).thenReturn(neutronPortList);
+ // Mock variables
+ MemberModifier.field(NeutronL3Adapter.class, "networkCleanupCache").set(neutronL3Adapter , networkCleanupCache);
+ MemberModifier.field(NeutronL3Adapter.class, "neutronNetworkCache").set(neutronL3Adapter , neutronNetworkCache);
+ MemberModifier.field(NeutronL3Adapter.class, "portCleanupCache").set(neutronL3Adapter , portCleanupCache);
+ MemberModifier.field(NeutronL3Adapter.class, "neutronPortCache").set(neutronL3Adapter , neutronPortCache);
+
+
+ when(neutronPort.getDeviceOwner()).thenReturn(OWNER_ROUTER_INTERFACE);
+ MemberModifier.field(NeutronL3Adapter.class, "portCleanupCache").set(neutronL3Adapter , portCleanupCache);
+
+
+
EventDispatcher eventDispatcher = mock(EventDispatcher.class);
TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
ConfigurationService configurationService = mock(ConfigurationService.class);
import java.lang.reflect.Field;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import org.junit.Before;
import org.junit.Test;
*/
@Test
public void testGetVmListForSecurityGroup() {
- List<NeutronPort> portList = new ArrayList<>();
- portList.add(neutronPort_Vm1);
- portList.add(neutronPort_Vm2);
- portList.add(neutronPort_Vm3);
- portList.add(neutronPort_Dhcp);
- when(neutronL3Adapter.getPortCleanupCache()).thenReturn(new HashSet<NeutronPort>(portList));
+ Map<String,NeutronPort> portMap = new HashMap<>();
+ portMap.put("Uuid1",neutronPort_Vm1);
+ portMap.put("Uuid2",neutronPort_Vm2);
+ portMap.put("Uuid3",neutronPort_Vm3);
+ portMap.put("Uuid4",neutronPort_Dhcp);
+ when(neutronL3Adapter.getPortCleanupCache()).thenReturn(portMap);
List<Neutron_IPs> ipList = securityServicesImpl.getVmListForSecurityGroup(NEUTRON_PORT_ID_VM_1, SECURITY_GROUP_ID_2);
assertEquals(ipList,neutron_IPs_2);
}