\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
\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
"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
}\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