+ if (!overlayHelper.isMetadataPort(addressEp)) {
+ configureInterfaceForFlatOverlay(addressEp);
+ addStaticArp(addressEp);
+ addStaticRoute(addressEp);
+ } else {
+ Ipv4Address metadataIp = overlayHelper.getInterfaceIp(addressEp);
+ Ipv4Prefix metadataIpPrefix = overlayHelper.getInterfaceIpAsPrefix(addressEp);
+ addressEp.getRelativeLocations().getExternalLocation().forEach(externalLocation -> {
+ String hostName = overlayHelper.getHostName(externalLocation).get();
+ String metadataInterfaceName = overlayHelper.getInterfaceName(externalLocation).get();
+
+ long vrf = getVni(addressEp.getTenant().getValue());
+
+ if (!hostIdToMetadataInterfaceMapper.isMetadataInterfaceConfigured(hostName, metadataInterfaceName)) {
+ DataBroker vppDataBroker = overlayHelper.getPotentialExternalDataBroker(externalLocation).get();
+ addInterfaceInVrf(vppDataBroker, metadataInterfaceName, vrf);
+ String physicalAddress = resolvePhysicalAddress(hostName, metadataInterfaceName);
+ addStaticArp(vppDataBroker, hostName, metadataInterfaceName, physicalAddress, metadataIp);
+ addStaticRoute(vppDataBroker, hostName, vrf, metadataIp, metadataIpPrefix, metadataInterfaceName);
+ hostIdToMetadataInterfaceMapper.addMetadataInterfaceInHost(hostName, metadataInterfaceName);
+ }
+ });
+ }
+ }
+
+ private String resolvePhysicalAddress(String hostName, String metadataInterfaceName) {
+ String physAddress = null;
+ Optional<Config> configOptional =
+ DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getVppRendererConfig(),
+ dataBroker.newReadOnlyTransaction());
+ if (configOptional.isPresent() && configOptional.get().getVppEndpoint() != null) {
+ java.util.Optional<VppEndpoint> vppEndpointOptional = configOptional.get().getVppEndpoint().stream()
+ .filter(vppEndpoint -> vppEndpoint.getVppNodeId().getValue().equals(hostName))
+ .filter(vppEndpoint -> vppEndpoint.getVppInterfaceName().equals(metadataInterfaceName))
+ .findFirst();
+ if (vppEndpointOptional.isPresent() && vppEndpointOptional.get()
+ .getInterfaceTypeChoice() instanceof TapCase) {
+ TapCase tapCase = (TapCase) vppEndpointOptional.get().getInterfaceTypeChoice();
+ physAddress = tapCase.getPhysicalAddress().getValue();
+ LOG.trace("Resolved PhysicalAddress : {} for metadataInterfaceName: {}, on node: {}", physAddress
+ , metadataInterfaceName, hostName);
+ } else {
+ LOG.warn("PhysicalAddress was not resolved for metadataInterfaceName: {}, on node: {}",
+ metadataInterfaceName, hostName);
+ }
+ }
+
+ return physAddress;