From: Sam Hague Date: Mon, 16 Nov 2015 17:48:02 +0000 (+0000) Subject: Merge "Added code for PhysicalPort, LogicalSwitch" X-Git-Tag: release/beryllium-sr2~268 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=835b3e1353e780e109ba431c3da8c315a0d1fbf9;hp=4d73c98289dd1ecc87c40f3283b5aacb160fc40e;p=netvirt.git Merge "Added code for PhysicalPort, LogicalSwitch" --- diff --git a/openstack/net-virt-sfc/features/production/pom.xml b/openstack/net-virt-sfc/features/production/pom.xml index d80b40b001..684d59a55f 100644 --- a/openstack/net-virt-sfc/features/production/pom.xml +++ b/openstack/net-virt-sfc/features/production/pom.xml @@ -130,14 +130,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL xml runtime - - org.opendaylight.sfc - features-sfcofl2 - ${sfc.version} - features - xml - runtime - ${project.groupId} openstack.net-virt-sfc-impl diff --git a/openstack/net-virt-sfc/features/production/src/main/features/features.xml b/openstack/net-virt-sfc/features/production/src/main/features/features.xml index dc73264661..cf65c97d01 100644 --- a/openstack/net-virt-sfc/features/production/src/main/features/features.xml +++ b/openstack/net-virt-sfc/features/production/src/main/features/features.xml @@ -19,8 +19,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html mvn:org.opendaylight.ovsdb/features-ovsdb/${project.version}/xml/features mvn:org.opendaylight.ovsdb/southbound-features/${project.version}/xml/features mvn:org.opendaylight.sfc/features-sfc/${sfc.version}/xml/features - - mvn:org.opendaylight.sfc/features-sfcofl2/${sfc.version}/xml/features mvn:org.opendaylight.yangtools/features-yangtools/${yangtools.version}/xml/features odl-mdsal-models diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/NorthboundEvent.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/NorthboundEvent.java index 209e292b0a..88a9ebc073 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/NorthboundEvent.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/NorthboundEvent.java @@ -16,6 +16,7 @@ import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronNetwork; import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronPort; import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronRouter; import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronRouter_Interface; +import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronSecurityRule; import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronSubnet; import org.opendaylight.ovsdb.openstack.netvirt.api.Action; @@ -30,6 +31,7 @@ public class NorthboundEvent extends AbstractEvent { private NeutronLoadBalancer loadBalancer; private NeutronLoadBalancerPool loadBalancerPool; private NeutronLoadBalancerPoolMember loadBalancerPoolMember; + private NeutronSecurityRule neutronSecurityRule; NorthboundEvent(NeutronPort port, Action action) { super(HandlerType.NEUTRON_PORT, action); @@ -77,6 +79,11 @@ public class NorthboundEvent extends AbstractEvent { this.loadBalancerPoolMember = loadBalancerPoolMember; } + NorthboundEvent(NeutronSecurityRule neutronSecurityRule, Action action) { + super(HandlerType.NEUTRON_PORT_SECURITY, action); + this.neutronSecurityRule = neutronSecurityRule; + } + public NeutronPort getPort() { return port; } @@ -104,6 +111,9 @@ public class NorthboundEvent extends AbstractEvent { public NeutronLoadBalancerPoolMember getLoadBalancerPoolMember() { return loadBalancerPoolMember; } + public NeutronSecurityRule getNeutronSecurityRule() { + return neutronSecurityRule; + } @Override public String toString() { @@ -118,6 +128,7 @@ public class NorthboundEvent extends AbstractEvent { + ", loadBalancer=" + loadBalancer + ", loadBalancerPool=" + loadBalancerPool + ", loadBalancerPoolMember=" + loadBalancerPoolMember + + ", neutronsecurityRule=" + neutronSecurityRule + "]"; } @@ -131,6 +142,7 @@ public class NorthboundEvent extends AbstractEvent { result = prime * result + ((routerInterface == null) ? 0 : routerInterface.hashCode()); result = prime * result + ((neutronFloatingIP == null) ? 0 : neutronFloatingIP.hashCode()); result = prime * result + ((neutronNetwork == null) ? 0 : neutronNetwork.hashCode()); + result = prime * result + ((neutronSecurityRule == null) ? 0 : neutronSecurityRule.hashCode()); return result; } @@ -212,6 +224,13 @@ public class NorthboundEvent extends AbstractEvent { } else if (!loadBalancerPoolMember.equals(other.loadBalancerPoolMember)) { return false; } + if (neutronSecurityRule == null) { + if (other.neutronSecurityRule != null) { + return false; + } + } else if (!neutronSecurityRule.equals(other.neutronSecurityRule)) { + return false; + } return true; } } diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/PortSecurityHandler.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/PortSecurityHandler.java index e6568000a9..646693cd26 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/PortSecurityHandler.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/PortSecurityHandler.java @@ -9,12 +9,19 @@ package org.opendaylight.ovsdb.openstack.netvirt; import java.net.HttpURLConnection; +import java.util.ArrayList; +import java.util.List; +import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronPort; import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronSecurityGroup; import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronSecurityRule; +import org.opendaylight.ovsdb.openstack.netvirt.translator.Neutron_IPs; +import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronPortCRUD; import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.INeutronSecurityGroupAware; import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.INeutronSecurityRuleAware; +import org.opendaylight.ovsdb.openstack.netvirt.api.Action; import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher; +import org.opendaylight.ovsdb.openstack.netvirt.api.SecurityServicesManager; import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper; import org.osgi.framework.ServiceReference; import org.slf4j.Logger; @@ -27,6 +34,8 @@ public class PortSecurityHandler extends AbstractHandler implements INeutronSecurityGroupAware, INeutronSecurityRuleAware, ConfigInterface { private static final Logger LOG = LoggerFactory.getLogger(PortSecurityHandler.class); + private volatile INeutronPortCRUD neutronPortCache; + private volatile SecurityServicesManager securityServicesManager; @Override public int canCreateNeutronSecurityGroup(NeutronSecurityGroup neutronSecurityGroup) { @@ -80,10 +89,7 @@ public class PortSecurityHandler extends AbstractHandler @Override public void neutronSecurityRuleCreated(NeutronSecurityRule neutronSecurityRule) { - int result = canCreateNeutronSecurityRule(neutronSecurityRule); - if (result != HttpURLConnection.HTTP_CREATED) { - LOG.debug("Neutron Security Group creation failed {} ", result); - } + enqueueEvent(new NorthboundEvent(neutronSecurityRule, Action.ADD)); } @Override @@ -103,10 +109,7 @@ public class PortSecurityHandler extends AbstractHandler @Override public void neutronSecurityRuleDeleted(NeutronSecurityRule neutronSecurityRule) { - int result = canDeleteNeutronSecurityRule(neutronSecurityRule); - if (result != HttpURLConnection.HTTP_OK) { - LOG.error(" delete Neutron Security Rule validation failed for result - {} ", result); - } + enqueueEvent(new NorthboundEvent(neutronSecurityRule, Action.DELETE)); } /** @@ -123,19 +126,71 @@ public class PortSecurityHandler extends AbstractHandler } NorthboundEvent ev = (NorthboundEvent) abstractEvent; switch (ev.getAction()) { - // TODO: add handling of events here, once callbacks do something - // other than logging. + case ADD: + processNeutronSecurityRuleAdded(ev.getNeutronSecurityRule()); + break; + case DELETE: + processNeutronSecurityRuleDeleted(ev.getNeutronSecurityRule()); + break; default: LOG.warn("Unable to process event action {}", ev.getAction()); break; } } + private void processNeutronSecurityRuleAdded(NeutronSecurityRule neutronSecurityRule) { + List portList = getPortWithSecurityGroup(neutronSecurityRule.getSecurityRuleGroupID()); + for (NeutronPort port:portList) { + syncSecurityGroup(neutronSecurityRule,port,neutronSecurityRule.getSecurityRuleGroupID(),true); + } + } + + private void processNeutronSecurityRuleDeleted(NeutronSecurityRule neutronSecurityRule) { + List portList = getPortWithSecurityGroup(neutronSecurityRule.getSecurityRuleGroupID()); + for (NeutronPort port:portList) { + syncSecurityGroup(neutronSecurityRule,port,neutronSecurityRule.getSecurityRuleGroupID(),false); + } + } + + private void syncSecurityGroup(NeutronSecurityRule securityRule,NeutronPort port, + String neutronSecurityGroupId,boolean write) { + + if (null != securityRule.getSecurityRemoteGroupID()) { + List vmIpList = securityServicesManager + .getVmListForSecurityGroup(port.getID(), neutronSecurityGroupId); + for (Neutron_IPs vmIp :vmIpList ) { + securityServicesManager.syncSecurityRule(port, securityRule, vmIp, write); + } + } else { + securityServicesManager.syncSecurityRule(port, securityRule, null, write); + } + } + + private List getPortWithSecurityGroup(String securityGroupUuid) { + + List neutronPortList = neutronPortCache.getAllPorts(); + List neutronPortInSG = new ArrayList(); + for (NeutronPort neutronPort:neutronPortList) { + List securityGroupList = neutronPort.getSecurityGroups(); + for (NeutronSecurityGroup neutronSecurityGroup:securityGroupList) { + if (neutronSecurityGroup.getID().equals(securityGroupUuid)) { + neutronPortInSG.add(neutronPort); + break; + } + } + } + return neutronPortInSG; + } + @Override public void setDependencies(ServiceReference serviceReference) { eventDispatcher = (EventDispatcher) ServiceHelper.getGlobalInstance(EventDispatcher.class, this); eventDispatcher.eventHandlerAdded(serviceReference, this); + neutronPortCache = + (INeutronPortCRUD) ServiceHelper.getGlobalInstance(INeutronPortCRUD.class, this); + securityServicesManager = + (SecurityServicesManager) ServiceHelper.getGlobalInstance(SecurityServicesManager.class, this); } @Override diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbInventoryServiceImpl.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbInventoryServiceImpl.java index 60388974f2..530fee8311 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbInventoryServiceImpl.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbInventoryServiceImpl.java @@ -22,6 +22,7 @@ import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl.NeutronFl import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl.NeutronNetworkChangeListener; import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl.NeutronPortChangeListener; import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl.NeutronRouterChangeListener; +import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl.NeutronSecurityRuleDataChangeListener; import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl.NeutronSubnetChangeListener; import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl.NeutronLoadBalancerPoolChangeListener; import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl.NeutronLoadBalancerPoolMemberChangeListener; @@ -104,6 +105,7 @@ public class OvsdbInventoryServiceImpl implements ConfigInterface, OvsdbInventor new NeutronFloatingIPChangeListener(db); new NeutronLoadBalancerPoolChangeListener(db); new NeutronLoadBalancerPoolMemberChangeListener(db); + new NeutronSecurityRuleDataChangeListener(db); } } diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronSecurityRuleDataChangeListener.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronSecurityRuleDataChangeListener.java index 488b32d885..6f09a7fa5c 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronSecurityRuleDataChangeListener.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronSecurityRuleDataChangeListener.java @@ -23,10 +23,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.EthertypeV4; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.EthertypeV6; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolBase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolHttp; -import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolHttps; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolIcmp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolIcmpV6; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolTcp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolUdp; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.security.rules.attributes.SecurityRules; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.security.rules.attributes.security.rules.SecurityRule; @@ -43,20 +43,20 @@ public class NeutronSecurityRuleDataChangeListener implements DataChangeListener private static final Logger LOG = LoggerFactory.getLogger(NeutronSecurityRuleDataChangeListener.class); private static final ImmutableBiMap, String> DIRECTION_MAP - = new ImmutableBiMap.Builder, String>() - .put(DirectionEgress.class, "egress") - .put(DirectionIngress.class, "ingress").build(); - private static final ImmutableBiMap, String> PROTOCOL_MAP - = new ImmutableBiMap.Builder, String>() - .put(ProtocolHttp.class, "HTTP") - .put(ProtocolHttps.class, "HTTPS") - .put(ProtocolIcmp.class, "ICMP") - .put(ProtocolTcp.class, "TCP") + = new ImmutableBiMap.Builder, String>() + .put(DirectionEgress.class, "egress") + .put(DirectionIngress.class, "ingress").build(); + private static final ImmutableBiMap,String> PROTOCOL_MAP + = new ImmutableBiMap.Builder,String>() + .put(ProtocolIcmp.class,"icmp") + .put(ProtocolTcp.class,"tcp") + .put(ProtocolUdp.class,"udp") + .put(ProtocolIcmpV6.class,"icmpv6") .build(); - private static final ImmutableBiMap, String> ETHERTYPE_MAP - = new ImmutableBiMap.Builder, String>() - .put(EthertypeV4.class, "v4") - .put(EthertypeV6.class, "v6") + private static final ImmutableBiMap,String> ETHERTYPE_MAP + = new ImmutableBiMap.Builder,String>() + .put(EthertypeV4.class,"IPv4") + .put(EthertypeV6.class,"IPv6") .build(); private ListenerRegistration registration; diff --git a/openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/PortSecurityHandlerTest.java b/openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/PortSecurityHandlerTest.java index b00c7a5029..660aad3614 100644 --- a/openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/PortSecurityHandlerTest.java +++ b/openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/PortSecurityHandlerTest.java @@ -21,6 +21,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Mockito; import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronSecurityGroup; import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronSecurityRule; @@ -40,6 +41,7 @@ public class PortSecurityHandlerTest { @InjectMocks private PortSecurityHandler portSecurityHandler; private PortSecurityHandler posrtSecurityHandlerSpy; + @Mock EventDispatcher eventDispatcher; @Before public void setUp() { @@ -72,7 +74,7 @@ public class PortSecurityHandlerTest { assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_CREATED, portSecurityHandler.canCreateNeutronSecurityRule(mock(NeutronSecurityRule.class))); posrtSecurityHandlerSpy.neutronSecurityRuleCreated(any(NeutronSecurityRule.class)); - verify(posrtSecurityHandlerSpy, times(1)).canCreateNeutronSecurityRule(any(NeutronSecurityRule.class)); + verify(posrtSecurityHandlerSpy, times(1)).enqueueEvent(any(AbstractEvent.class)); } @Test @@ -85,7 +87,7 @@ public class PortSecurityHandlerTest { assertEquals("Error, did not return the correct HTTP flag", HttpURLConnection.HTTP_OK, portSecurityHandler.canDeleteNeutronSecurityRule(mock(NeutronSecurityRule.class))); posrtSecurityHandlerSpy.neutronSecurityRuleDeleted(any(NeutronSecurityRule.class)); - verify(posrtSecurityHandlerSpy, times(1)).canDeleteNeutronSecurityRule(any(NeutronSecurityRule.class)); + verify(posrtSecurityHandlerSpy, times(1)).enqueueEvent(any(AbstractEvent.class)); } @Test