Looking for host-id of router port 54/52654/15
authorMichal Cmarada <mcmarada@cisco.com>
Tue, 21 Mar 2017 10:42:02 +0000 (11:42 +0100)
committerMichal Cmarada <mcmarada@cisco.com>
Tue, 21 Mar 2017 10:42:02 +0000 (11:42 +0100)
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 <tcechval@cisco.com>
Signed-off-by: Michal Cmarada <mcmarada@cisco.com>
neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandler.java

index 1b49ffca563d736f3ae9a8356f82b29f8320cc7e..11d7df4f8f67b7e462fb70248c68f768e5ebe848 100644 (file)
@@ -64,6 +64,7 @@ import org.slf4j.LoggerFactory;
 \r
 import com.google.common.annotations.VisibleForTesting;\r
 import com.google.common.base.Optional;\r
+import com.google.common.base.Strings;\r
 \r
 import javax.annotation.Nonnull;\r
 public class PortHandler implements TransactionChainListener {\r
@@ -116,8 +117,15 @@ public class PortHandler implements TransactionChainListener {
 \r
     @VisibleForTesting\r
     void processCreatedData(Port port, BaseEndpointByPort bebp) {\r
-        if (isValidVhostUser(port)) {\r
+        if (isValidVhostUser(port)\r
+                // this is a hack for vpp router port\r
+                // Openstack does not send binding details yet\r
+                || isValidVppRouterPort(port)) {\r
             VppEndpoint vppEp = buildVppEndpoint(port, bebp);\r
+            if (vppEp == null) {\r
+                LOG.warn("Cannot create vpp-endpoint from neutron port {}", port);\r
+                return;\r
+            }\r
             writeVppEndpoint(createVppEndpointIid(vppEp.getKey()), vppEp);\r
             LOG.debug("Created vpp-endpoint {}", vppEp);\r
         }\r
@@ -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.",\r
                         port);\r
                 vppEpBuilder.setVppNodeId(routingNode);\r
+            } else if (port.getDeviceId() != null) {\r
+                LOG.debug("Resolving host-id for unbound router port {}", port.getUuid());\r
+                ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction();\r
+                Optional<Ports> optPorts = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                        InstanceIdentifier.builder(Neutron.class).child(Ports.class).build(), readTx);\r
+                readTx.close();\r
+                if (optPorts.isPresent() && optPorts.get().getPort() != null) {\r
+                    java.util.Optional<Port> optPortOnTheSameNode = optPorts.get()\r
+                        .getPort()\r
+                        .stream()\r
+                        .filter(p -> !p.getUuid().equals(port.getUuid()))\r
+                        .filter(p -> p.getAugmentation(PortBindingExtension.class) != null)\r
+                        .filter(p -> p.getDeviceOwner().contains(DHCP_OWNER))\r
+                        .findFirst();\r
+                    if (optPortOnTheSameNode.isPresent()) {\r
+                        PortBindingExtension binding =\r
+                                optPortOnTheSameNode.get().getAugmentation(PortBindingExtension.class);\r
+                        if (binding != null && binding.getHostId() != null) {\r
+                            vppEpBuilder.setVppNodeId(new NodeId(binding.getHostId()));\r
+                        } else {\r
+                            LOG.warn("Cannot resolve location of router-port {}", port.getUuid());\r
+                            return null;\r
+                        }\r
+                    }\r
+                }\r
             }\r
             vppEpBuilder.addAugmentation(ExcludeFromPolicy.class,\r
                     new ExcludeFromPolicyBuilder().setExcludeFromPolicy(true).build());\r
@@ -329,6 +362,9 @@ public class PortHandler implements TransactionChainListener {
     }\r
 \r
     private Optional<Router> getRouterOptional(Port port) {\r
+        if (Strings.isNullOrEmpty(port.getDeviceId())) {\r
+            return Optional.absent();\r
+        }\r
         ReadOnlyTransaction rTx = transactionChain.newReadOnlyTransaction();\r
         InstanceIdentifier<Router> routerIid = InstanceIdentifier.builder(Neutron.class)\r
             .child(Routers.class)\r