From: Michal Cmarada Date: Tue, 29 Nov 2016 12:59:24 +0000 (+0100) Subject: Fix for Neutron Port update for VPP X-Git-Tag: release/carbon~70 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=aed74c1bec15e3b6a0328a44d4438c0a95bb2b2e;p=groupbasedpolicy.git Fix for Neutron Port update for VPP Change-Id: I1baf4e77b797d5f9d3e79dd619b6ee6e0ff4a1ed Signed-off-by: Michal Cmarada --- diff --git a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAware.java b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAware.java index 454b4dea3..01b92e1e3 100644 --- a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAware.java +++ b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAware.java @@ -100,8 +100,11 @@ public class NeutronPortAware implements NeutronAware { this.epRegistrator = checkNotNull(epRegistrator); } - @Override - public void onCreated(Port port, Neutron neutron) { + @Override public void onCreated(Port createdItem, Neutron neutron) { + onCreated(createdItem, neutron, true); + } + + public void onCreated(Port port, Neutron neutron, boolean addBaseEpMapping) { LOG.trace("created port - {}", port); if (PortUtils.isRouterInterfacePort(port)) { LOG.trace("Port is router interface port: {}", port.getUuid().getValue()); @@ -149,7 +152,7 @@ public class NeutronPortAware implements NeutronAware { createEndpointRegFromPort( port, ipWithSubnet, networkContainment, epgsFromSecGroups, neutron); registerBaseEndpointAndStoreMapping( - ImmutableList.of(l2BaseEp.build(), l3BaseEp.build()), port, rwTx); + ImmutableList.of(l2BaseEp.build(), l3BaseEp.build()), port, rwTx, addBaseEpMapping); registerEndpointAndStoreMapping(epInBuilder.build(), port, rwTx); } @@ -205,7 +208,7 @@ public class NeutronPortAware implements NeutronAware { ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction(); registerBaseEndpointAndStoreMapping( - ImmutableList.of(l2BaseEp.build(), l3BaseEp.build()), port, rwTx); + ImmutableList.of(l2BaseEp.build(), l3BaseEp.build()), port, rwTx, addBaseEpMapping); registerEndpointAndStoreMapping(epInBuilder.build(), port, rwTx); DataStoreHelper.submitToDs(rwTx); } else if (PortUtils.isNormalPort(port)) { @@ -236,7 +239,7 @@ public class NeutronPortAware implements NeutronAware { baseEpRegs.add(l3BaseEp.build()); } ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction(); - registerBaseEndpointAndStoreMapping(baseEpRegs, port, rwTx); + registerBaseEndpointAndStoreMapping(baseEpRegs, port, rwTx, addBaseEpMapping); registerEndpointAndStoreMapping(epInBuilder.build(), port, rwTx); DataStoreHelper.submitToDs(rwTx); } else if (PortUtils.isRouterGatewayPort(port)) { @@ -485,7 +488,7 @@ public class NeutronPortAware implements NeutronAware { } private void registerBaseEndpointAndStoreMapping(List addrEpRegs, Port port, - WriteTransaction wTx) { + WriteTransaction wTx, boolean addBaseEpMappings) { RegisterEndpointInput regBaseEpInput = new RegisterEndpointInputBuilder().setAddressEndpointReg(addrEpRegs) .build(); @@ -495,7 +498,7 @@ public class NeutronPortAware implements NeutronAware { return; } for (AddressEndpointReg addrEpReg : addrEpRegs) { - if (MappingUtils.L2_BRDIGE_DOMAIN.equals(addrEpReg.getContextType())) { + if (MappingUtils.L2_BRDIGE_DOMAIN.equals(addrEpReg.getContextType()) && addBaseEpMappings) { UniqueId portId = new UniqueId(port.getUuid().getValue()); LOG.trace("Adding Port-BaseEndpoint mapping for port {} (device owner {}) and endpoint {}", port.getUuid()); @@ -517,7 +520,7 @@ public class NeutronPortAware implements NeutronAware { } private void unregisterEndpointAndRemoveMapping(UnregisterEndpointInput baseEpUnreg, Port port, - ReadWriteTransaction rwTx) { + ReadWriteTransaction rwTx, boolean removeBaseEpMappings) { boolean isUnregisteredBaseEndpoint = epRegistrator.unregisterEndpoint(baseEpUnreg); if (isUnregisteredBaseEndpoint) { UniqueId portId = new UniqueId(port.getUuid().getValue()); @@ -525,7 +528,9 @@ public class NeutronPortAware implements NeutronAware { MacAddressType.class, new ContextId(port.getNetworkId().getValue()), MappingUtils.L2_BRDIGE_DOMAIN); LOG.trace("Removing Port-BaseEndpoint mapping for port {} (device owner {}) and endpoint {}", port.getUuid().getValue(), port.getDeviceOwner(), portByBaseEndpointKey); - removeBaseEndpointMappings(portByBaseEndpointKey, portId, rwTx); + if (removeBaseEpMappings) { + removeBaseEndpointMappings(portByBaseEndpointKey, portId, rwTx); + } } } @@ -539,12 +544,15 @@ public class NeutronPortAware implements NeutronAware { @Override public void onUpdated(Port oldPort, Port newPort, Neutron oldNeutron, Neutron newNeutron) { LOG.trace("updated port - OLD: {}\nNEW: {}", oldPort, newPort); - onDeleted(oldPort, oldNeutron, newNeutron); - onCreated(newPort, newNeutron); + onDeleted(oldPort, oldNeutron, newNeutron, false); + onCreated(newPort, newNeutron, false); } - @Override - public void onDeleted(Port port, Neutron oldNeutron, Neutron newNeutron) { + @Override public void onDeleted(Port deletedItem, Neutron oldNeutron, Neutron newNeutron) { + onDeleted(deletedItem, oldNeutron, newNeutron, true); + } + + public void onDeleted(Port port, Neutron oldNeutron, Neutron newNeutron, boolean removeBaseEpMapping) { LOG.trace("deleted port - {}", port); if (PortUtils.isRouterInterfacePort(port)) { LOG.trace("Port is router interface port: {}", port.getUuid().getValue()); @@ -589,13 +597,13 @@ public class NeutronPortAware implements NeutronAware { LOG.trace("Port is DHCP port: {}", port.getUuid().getValue()); ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction(); unregisterEndpointAndRemoveMapping(createUnregisterEndpointInput(port, oldNeutron), port, rwTx); - unregisterEndpointAndRemoveMapping(createUnregisterBaseEndpointInput(port, oldNeutron), port, rwTx); + unregisterEndpointAndRemoveMapping(createUnregisterBaseEndpointInput(port, oldNeutron), port, rwTx, removeBaseEpMapping); DataStoreHelper.submitToDs(rwTx); } else if (PortUtils.isNormalPort(port)) { LOG.trace("Port is normal port: {}", port.getUuid().getValue()); ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction(); unregisterEndpointAndRemoveMapping(createUnregisterEndpointInput(port, oldNeutron), port, rwTx); - unregisterEndpointAndRemoveMapping(createUnregisterBaseEndpointInput(port, oldNeutron), port, rwTx); + unregisterEndpointAndRemoveMapping(createUnregisterBaseEndpointInput(port, oldNeutron), port, rwTx, removeBaseEpMapping); DataStoreHelper.submitToDs(rwTx); } else if (PortUtils.isRouterGatewayPort(port)) { // do nothing because actual trigger is detaching of port from router diff --git a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortAware.java b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortAware.java index 8746b33bc..df44f2cfa 100644 --- a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortAware.java +++ b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortAware.java @@ -19,10 +19,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gb import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.base.endpoints.by.ports.BaseEndpointByPort; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class PortAware extends DataTreeChangeHandler implements MappingProvider { + private static final Logger LOG = LoggerFactory.getLogger(PortAware.class); private final PortHandler portHandler; protected PortAware(PortHandler portHandler, DataBroker dataProvider) { @@ -43,16 +46,19 @@ public class PortAware extends DataTreeChangeHandler impleme @Override public void processCreatedNeutronDto(Port port) { + LOG.trace("Neutron port created: {}", port); portHandler.processCreated(port); } @Override public void processUpdatedNeutronDto(Port original, Port delta) { + LOG.trace("Neutron port updated: {}, delta {}", original, delta); portHandler.processUpdated(original, delta); } @Override public void processDeletedNeutronDto(Port port) { + LOG.trace("Neutron port deleted: {}", port); // handled by BaseEndpointByPort removal } diff --git a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandler.java b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandler.java index 560d15566..434da171c 100644 --- a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandler.java +++ b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandler.java @@ -38,6 +38,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_render import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.TapCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.VhostUserCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetails; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.Routers; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.RouterKey; @@ -64,6 +65,8 @@ import org.slf4j.LoggerFactory; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; +import javax.annotation.Nullable; +import java.util.Collections; import java.util.List; public class PortHandler implements TransactionChainListener { @@ -140,6 +143,12 @@ public class PortHandler implements TransactionChainListener { } void processUpdated(Port original, Port delta) { + if (!isUpdateNeeded(original, delta)){ + LOG.trace("Port update skipped, port didn`t change. before {}, after: {}" , original, delta); + return; + } + + LOG.trace("Updating port before: {}, after: {}" , original, delta); if (isValidVhostUser(original)) { ReadOnlyTransaction rTx = transactionChain.newReadOnlyTransaction(); Optional optBebp = DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL, @@ -148,12 +157,40 @@ public class PortHandler implements TransactionChainListener { if (!optBebp.isPresent()) { return; } + LOG.trace("Updating port - deleting old port {}" , optBebp.get().getPortId()); processDeleted(optBebp.get()); } + LOG.trace("Updating port - creating new port {}" , delta.getUuid()); processCreated(delta); } + private boolean isUpdateNeeded(Port oldPort, Port newPort) { + //TODO fix this to better support update of ports for VPP + PortBindingExtension oldPortAugmentation = oldPort.getAugmentation(PortBindingExtension.class); + PortBindingExtension newPortAugmentation = newPort.getAugmentation(PortBindingExtension.class); + + List vifDetails = oldPortAugmentation.getVifDetails(); + + if (newPortAugmentation == null) { + LOG.trace("Port {} is no longer a vhost type port, updating port..."); + return true; + } + + if (!oldPortAugmentation.getHostId().equals(newPortAugmentation.getHostId()) || + nullToEmpty(vifDetails).size() != nullToEmpty(newPortAugmentation.getVifDetails()).size()) { + return true; + } + + for (VifDetails vifDetail : nullToEmpty(vifDetails)) { + //check if vhostuser_socket, vhostuser_mode and port_filter are changed + if (!newPortAugmentation.getVifDetails().contains(vifDetail)) + return true; + } + return false; + } + void processDeleted(BaseEndpointByPort bebp) { + LOG.trace("Deleting vpp-endpoint by BaseEndpointByPort {}" , bebp); VppEndpointKey vppEpKey = new VppEndpointKey(bebp.getAddress(), bebp.getAddressType(), bebp.getContextId(), bebp.getContextType()); InstanceIdentifier vppEpIid = createVppEndpointIid(vppEpKey); @@ -340,4 +377,8 @@ public class PortHandler implements TransactionChainListener { public void onTransactionChainSuccessful(TransactionChain chain) { LOG.trace("Transaction chain was successful. {}", chain); } + + private List nullToEmpty(@Nullable List list) { + return list == null ? Collections.emptyList() : list; + } }