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());
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);
}
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)) {
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)) {
}
private void registerBaseEndpointAndStoreMapping(List<AddressEndpointReg> addrEpRegs, Port port,
- WriteTransaction wTx) {
+ WriteTransaction wTx, boolean addBaseEpMappings) {
RegisterEndpointInput regBaseEpInput = new RegisterEndpointInputBuilder().setAddressEndpointReg(addrEpRegs)
.build();
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());
}
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());
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);
+ }
}
}
@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());
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
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.TapCaseBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.VhostUserCaseBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtension;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetails;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.Routers;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.RouterKey;\r
import com.google.common.annotations.VisibleForTesting;\r
import com.google.common.base.Optional;\r
\r
+import javax.annotation.Nullable;\r
+import java.util.Collections;\r
import java.util.List;\r
\r
public class PortHandler implements TransactionChainListener {\r
}\r
\r
void processUpdated(Port original, Port delta) {\r
+ if (!isUpdateNeeded(original, delta)){\r
+ LOG.trace("Port update skipped, port didn`t change. before {}, after: {}" , original, delta);\r
+ return;\r
+ }\r
+\r
+ LOG.trace("Updating port before: {}, after: {}" , original, delta);\r
if (isValidVhostUser(original)) {\r
ReadOnlyTransaction rTx = transactionChain.newReadOnlyTransaction();\r
Optional<BaseEndpointByPort> optBebp = DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL,\r
if (!optBebp.isPresent()) {\r
return;\r
}\r
+ LOG.trace("Updating port - deleting old port {}" , optBebp.get().getPortId());\r
processDeleted(optBebp.get());\r
}\r
+ LOG.trace("Updating port - creating new port {}" , delta.getUuid());\r
processCreated(delta);\r
}\r
\r
+ private boolean isUpdateNeeded(Port oldPort, Port newPort) {\r
+ //TODO fix this to better support update of ports for VPP\r
+ PortBindingExtension oldPortAugmentation = oldPort.getAugmentation(PortBindingExtension.class);\r
+ PortBindingExtension newPortAugmentation = newPort.getAugmentation(PortBindingExtension.class);\r
+\r
+ List<VifDetails> vifDetails = oldPortAugmentation.getVifDetails();\r
+\r
+ if (newPortAugmentation == null) {\r
+ LOG.trace("Port {} is no longer a vhost type port, updating port...");\r
+ return true;\r
+ }\r
+\r
+ if (!oldPortAugmentation.getHostId().equals(newPortAugmentation.getHostId()) ||\r
+ nullToEmpty(vifDetails).size() != nullToEmpty(newPortAugmentation.getVifDetails()).size()) {\r
+ return true;\r
+ }\r
+\r
+ for (VifDetails vifDetail : nullToEmpty(vifDetails)) {\r
+ //check if vhostuser_socket, vhostuser_mode and port_filter are changed\r
+ if (!newPortAugmentation.getVifDetails().contains(vifDetail))\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
void processDeleted(BaseEndpointByPort bebp) {\r
+ LOG.trace("Deleting vpp-endpoint by BaseEndpointByPort {}" , bebp);\r
VppEndpointKey vppEpKey = new VppEndpointKey(bebp.getAddress(), bebp.getAddressType(), bebp.getContextId(),\r
bebp.getContextType());\r
InstanceIdentifier<VppEndpoint> vppEpIid = createVppEndpointIid(vppEpKey);\r
public void onTransactionChainSuccessful(TransactionChain<?, ?> chain) {\r
LOG.trace("Transaction chain was successful. {}", chain);\r
}\r
+\r
+ private <T> List<T> nullToEmpty(@Nullable List<T> list) {\r
+ return list == null ? Collections.emptyList() : list;\r
+ }\r
}\r