From c6106efb538b33eff3e4aa133deb08fcfa0b41e3 Mon Sep 17 00:00:00 2001 From: Michal Cmarada Date: Tue, 21 Mar 2017 11:42:02 +0100 Subject: [PATCH] Looking for host-id of router port Reading host-id for router bvi interface from DHCP port host ID. It is assumed that they are located on one node. This is a workaround for unbound interfaces for L3 scenario. Change-Id: I62e56ec33ba8dc234db2bbd42d77113645d7920e Signed-off-by: Tomas Cechvala Signed-off-by: Michal Cmarada --- .../vpp/mapper/processors/PortHandler.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) 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 1b49ffca5..11d7df4f8 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 @@ -64,6 +64,7 @@ import org.slf4j.LoggerFactory; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; +import com.google.common.base.Strings; import javax.annotation.Nonnull; public class PortHandler implements TransactionChainListener { @@ -116,8 +117,15 @@ public class PortHandler implements TransactionChainListener { @VisibleForTesting void processCreatedData(Port port, BaseEndpointByPort bebp) { - if (isValidVhostUser(port)) { + if (isValidVhostUser(port) + // this is a hack for vpp router port + // Openstack does not send binding details yet + || isValidVppRouterPort(port)) { VppEndpoint vppEp = buildVppEndpoint(port, bebp); + if (vppEp == null) { + LOG.warn("Cannot create vpp-endpoint from neutron port {}", port); + return; + } writeVppEndpoint(createVppEndpointIid(vppEp.getKey()), vppEp); LOG.debug("Created vpp-endpoint {}", vppEp); } @@ -263,6 +271,31 @@ public class PortHandler implements TransactionChainListener { "Host-id changed by ODL for port {}. This is a supplementary workaround for choosing a routing node.", port); vppEpBuilder.setVppNodeId(routingNode); + } else if (port.getDeviceId() != null) { + LOG.debug("Resolving host-id for unbound router port {}", port.getUuid()); + ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction(); + Optional optPorts = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, + InstanceIdentifier.builder(Neutron.class).child(Ports.class).build(), readTx); + readTx.close(); + if (optPorts.isPresent() && optPorts.get().getPort() != null) { + java.util.Optional optPortOnTheSameNode = optPorts.get() + .getPort() + .stream() + .filter(p -> !p.getUuid().equals(port.getUuid())) + .filter(p -> p.getAugmentation(PortBindingExtension.class) != null) + .filter(p -> p.getDeviceOwner().contains(DHCP_OWNER)) + .findFirst(); + if (optPortOnTheSameNode.isPresent()) { + PortBindingExtension binding = + optPortOnTheSameNode.get().getAugmentation(PortBindingExtension.class); + if (binding != null && binding.getHostId() != null) { + vppEpBuilder.setVppNodeId(new NodeId(binding.getHostId())); + } else { + LOG.warn("Cannot resolve location of router-port {}", port.getUuid()); + return null; + } + } + } } vppEpBuilder.addAugmentation(ExcludeFromPolicy.class, new ExcludeFromPolicyBuilder().setExcludeFromPolicy(true).build()); @@ -329,6 +362,9 @@ public class PortHandler implements TransactionChainListener { } private Optional getRouterOptional(Port port) { + if (Strings.isNullOrEmpty(port.getDeviceId())) { + return Optional.absent(); + } ReadOnlyTransaction rTx = transactionChain.newReadOnlyTransaction(); InstanceIdentifier routerIid = InstanceIdentifier.builder(Neutron.class) .child(Routers.class) -- 2.36.6