diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/api/CordService.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/api/CordService.java index be2b810722..604e707779 100644 --- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/api/CordService.java +++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/api/CordService.java @@ -176,7 +176,7 @@ public final class CordService { * @param netName network name * @return network type, or PRIVATE if it doesn't match any type */ - public static ServiceType getServiceType(String netName) { + private ServiceType getServiceType(String netName) { checkNotNull(netName); String name = netName.toUpperCase(); diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/impl/CordVtn.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/impl/CordVtn.java index f7039c3871..0a7b77d155 100644 --- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/impl/CordVtn.java +++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/impl/CordVtn.java @@ -30,7 +30,6 @@ import org.onlab.packet.IpAddress; import org.onlab.packet.MacAddress; import org.onlab.packet.VlanId; import org.onosproject.cordvtn.api.CordService; -import org.onosproject.cordvtn.api.CordService.ServiceType; import org.onosproject.cordvtn.api.CordServiceId; import org.onosproject.cordvtn.api.CordVtnConfig; import org.onosproject.cordvtn.api.CordVtnNode; @@ -88,7 +87,6 @@ import java.util.stream.StreamSupport; import static com.google.common.base.Preconditions.checkNotNull; import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; import static org.onlab.util.Tools.groupedThreads; -import static org.onosproject.cordvtn.api.CordService.getServiceType; import static org.slf4j.LoggerFactory.getLogger; /** @@ -234,7 +232,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro } log.info("Service dependency from {} to {} created.", tService.id().id(), pService.id().id()); - ruleInstaller.populateServiceDependencyRules(tService, pService, isBidirectional); + ruleInstaller.populateServiceDependencyRules(tService, pService, isBidirectional, true); } @Override @@ -248,7 +246,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro } log.info("Service dependency from {} to {} removed.", tService.id().id(), pService.id().id()); - ruleInstaller.removeServiceDependencyRules(tService, pService); + ruleInstaller.populateServiceDependencyRules(tService, pService, true, false); } @Override @@ -434,10 +432,9 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro CordServiceId serviceId = CordServiceId.of(osNet.getId()); // here it assumes all cord service networks has only one subnet Subnet osSubnet = osNet.getNeutronSubnets().stream() - .findFirst() - .orElse(null); + .findFirst().orElse(null); if (osSubnet == null) { - log.warn("Couldn't find OpenStack subnet for service {}", serviceId.id()); + log.warn("Couldn't find OpenStack subnet for network {}", serviceId.id()); return null; } @@ -445,12 +442,11 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro .stream() .collect(Collectors.toMap(host -> host, this::getTunnelIp)); - ServiceType serviceType = getServiceType(osNet.getName()); // allows working without XOS for now Set tServices = Sets.newHashSet(); Set pServices = Sets.newHashSet(); - if (xosClient.access() != null && serviceType != ServiceType.MANAGEMENT) { + if (xosClient.access() != null) { tServices = xosClient.vtnServiceApi().getTenantServices(serviceId.id()) .stream() .map(CordServiceId::of) @@ -561,27 +557,17 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro virtualSubscriberGatewayAdded(host, serviceVlan); } - String osNetId = host.annotations().value(SERVICE_ID); - if (osNetId == null) { - // ignore this host, it is not the service VM, or it's a vSG + String serviceId = host.annotations().value(SERVICE_ID); + if (serviceId == null) { + // ignore this host, it is not a service VM return; } - OSClient osClient = OSFactory.clientFromAccess(osAccess); - Network osNet = osClient.networking().network().get(osNetId); - if (osNet == null) { - log.warn("Failed to get OpenStack network {} for VM {}.", - osNetId, host.id()); - return; - } + log.info("VM is detected, MAC: {} IP: {}", host.mac(), host.ipAddresses()); - log.info("VM is detected, MAC: {} IP: {}", - host.mac(), - host.ipAddresses().stream().findFirst().get()); - - CordService service = getCordService(osNet); + CordService service = getCordService(CordServiceId.of(serviceId)); if (service == null) { - log.warn("Failed to get CordService for {}", osNet.getName()); + log.warn("Failed to get CordService for {}", serviceId); return; } @@ -599,7 +585,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro service.providerServices().stream().forEach( pServiceId -> createServiceDependency(service.id(), pServiceId, true)); - ruleInstaller.updateServiceGroup(service); + ruleInstaller.updateProviderServiceGroup(service); // sends gratuitous ARP here for the case of adding existing VMs // when ONOS or cordvtn app is restarted arpProxy.sendGratuitousArpForGateway(service.serviceIp(), Sets.newHashSet(host)); @@ -607,7 +593,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro } registerDhcpLease(host, service); - ruleInstaller.populateBasicConnectionRules(host, getTunnelIp(host), osNet); + ruleInstaller.populateBasicConnectionRules(host, service, true); } /** @@ -618,52 +604,45 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro private void serviceVmRemoved(Host host) { checkNotNull(osAccess, "OpenStack access is not set"); - String serviceVlan = host.annotations().value(S_TAG); - if (serviceVlan != null) { + if (host.annotations().value(S_TAG) != null) { virtualSubscriberGatewayRemoved(host); } - String osNetId = host.annotations().value(SERVICE_ID); - if (osNetId == null) { - // ignore it, it's not the service VM or it's a vSG + String serviceId = host.annotations().value(SERVICE_ID); + if (serviceId == null) { + // ignore it, it's not a service VM return; } - OSClient osClient = OSFactory.clientFromAccess(osAccess); - Network osNet = osClient.networking().network().get(osNetId); - if (osNet == null) { - log.warn("Failed to get OpenStack network {} for VM {}", - osNetId, host.id()); - return; - } + log.info("VM is vanished, MAC: {} IP: {}", host.mac(), host.ipAddresses()); - log.info("VM is vanished, MAC: {} IP: {}", - host.mac(), - host.ipAddresses().stream().findFirst().get()); - - ruleInstaller.removeBasicConnectionRules(host); - dhcpService.removeStaticMapping(host.mac()); - - CordService service = getCordService(osNet); + CordService service = getCordService(CordServiceId.of(serviceId)); if (service == null) { + log.warn("Failed to get CORD service for {}", serviceId); return; } + // TODO need to consider the case that the network is removed also switch (service.serviceType()) { case MANAGEMENT: - ruleInstaller.removeManagementNetworkRules(host, service); break; case PRIVATE: - if (getHostsWithOpenstackNetwork(osNet).isEmpty()) { + if (service.hosts().isEmpty()) { arpProxy.removeGateway(service.serviceIp()); } case PUBLIC: default: if (!service.tenantServices().isEmpty()) { - ruleInstaller.updateServiceGroup(service); + ruleInstaller.updateProviderServiceGroup(service); + } + if (!service.providerServices().isEmpty()) { + ruleInstaller.updateTenantServiceVm(host, service); } break; } + + dhcpService.removeStaticMapping(host.mac()); + ruleInstaller.populateBasicConnectionRules(host, service, false); } diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/impl/CordVtnRuleInstaller.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/impl/CordVtnRuleInstaller.java index 823a5b139b..ada68a949c 100644 --- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/impl/CordVtnRuleInstaller.java +++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/impl/CordVtnRuleInstaller.java @@ -53,15 +53,12 @@ import org.onosproject.net.flow.FlowRuleService; import org.onosproject.net.flow.TrafficSelector; import org.onosproject.net.flow.TrafficTreatment; import org.onosproject.net.flow.criteria.Criterion; -import org.onosproject.net.flow.criteria.EthCriterion; import org.onosproject.net.flow.criteria.IPCriterion; -import org.onosproject.net.flow.criteria.PortCriterion; import org.onosproject.net.flow.instructions.ExtensionPropertyException; import org.onosproject.net.flow.instructions.ExtensionTreatment; import org.onosproject.net.flow.instructions.Instruction; import org.onosproject.net.flow.instructions.Instructions; import org.onosproject.net.flow.instructions.L2ModificationInstruction; -import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction; import org.onosproject.net.group.DefaultGroupBucket; import org.onosproject.net.group.DefaultGroupDescription; import org.onosproject.net.group.DefaultGroupKey; @@ -71,8 +68,6 @@ import org.onosproject.net.group.GroupBuckets; import org.onosproject.net.group.GroupDescription; import org.onosproject.net.group.GroupKey; import org.onosproject.net.group.GroupService; -import org.openstack4j.model.network.Network; -import org.openstack4j.model.network.Subnet; import org.slf4j.Logger; import java.util.ArrayList; @@ -83,11 +78,8 @@ import java.util.Set; import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkNotNull; -import static org.onosproject.net.flow.criteria.Criterion.Type.IN_PORT; import static org.onosproject.net.flow.criteria.Criterion.Type.IPV4_DST; -import static org.onosproject.net.flow.criteria.Criterion.Type.IPV4_SRC; import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST; -import static org.onosproject.net.flow.instructions.L2ModificationInstruction.L2SubType.ETH_DST; import static org.onosproject.net.flow.instructions.L2ModificationInstruction.L2SubType.VLAN_PUSH; import static org.slf4j.LoggerFactory.getLogger; @@ -118,6 +110,7 @@ public class CordVtnRuleInstaller { private static final String PORT_NAME = "portName"; private static final String DATA_PLANE_INTF = "dataPlaneIntf"; + private static final String DATA_PLANE_IP = "dataPlaneIp"; private static final String S_TAG = "stag"; private final ApplicationId appId; @@ -181,93 +174,45 @@ public class CordVtnRuleInstaller { * Populates basic rules that connect a VM to the other VMs in the system. * * @param host host - * @param tunnelIp tunnel ip - * @param osNet openstack network + * @param service cord service + * @param install true to install or false to remove */ - public void populateBasicConnectionRules(Host host, IpAddress tunnelIp, Network osNet) { + public void populateBasicConnectionRules(Host host, CordService service, boolean install) { checkNotNull(host); - checkNotNull(osNet); + checkNotNull(service); DeviceId deviceId = host.location().deviceId(); PortNumber inPort = host.location().port(); MacAddress dstMac = host.mac(); IpAddress hostIp = host.ipAddresses().stream().findFirst().get(); - long tunnelId = Long.parseLong(osNet.getProviderSegID()); - Subnet osSubnet = osNet.getNeutronSubnets().stream() - .findFirst() - .orElse(null); + long tunnelId = service.segmentationId(); + Ip4Prefix serviceIpRange = service.serviceIpRange().getIp4Prefix(); - if (osSubnet == null) { - log.error("Failed to get subnet for {}", host.id()); - return; + populateLocalInPortRule(deviceId, inPort, hostIp, install); + populateDstIpRule(deviceId, inPort, dstMac, hostIp, tunnelId, getTunnelIp(host), install); + populateTunnelInRule(deviceId, inPort, dstMac, tunnelId, install); + + if (install) { + populateDirectAccessRule(serviceIpRange, serviceIpRange, true); + populateServiceIsolationRule(serviceIpRange, true); + } else if (service.hosts().isEmpty()) { + // removes network related rules only if there's no hosts left in this network + populateDirectAccessRule(serviceIpRange, serviceIpRange, false); + populateServiceIsolationRule(serviceIpRange, false); } - Ip4Prefix cidr = Ip4Prefix.valueOf(osSubnet.getCidr()); - - populateLocalInPortRule(deviceId, inPort, hostIp); - populateDirectAccessRule(cidr, cidr); - populateServiceIsolationRule(cidr); - populateDstIpRule(deviceId, inPort, dstMac, hostIp, tunnelId, tunnelIp); - populateTunnelInRule(deviceId, inPort, dstMac, tunnelId); } /** - * Removes all rules related to a given service VM host. - * - * @param host host to be removed - */ - public void removeBasicConnectionRules(Host host) { - checkNotNull(host); - - DeviceId deviceId = host.location().deviceId(); - MacAddress mac = host.mac(); - PortNumber port = host.location().port(); - IpAddress ip = host.ipAddresses().stream().findFirst().orElse(null); - - for (FlowRule flowRule : flowRuleService.getFlowRulesById(appId)) { - if (flowRule.deviceId().equals(deviceId)) { - PortNumber inPort = getInPort(flowRule); - if (inPort != null && inPort.equals(port)) { - processFlowRule(false, flowRule); - continue; - } - - PortNumber output = getOutputFromTreatment(flowRule); - if (output != null && output.equals(host.location().port())) { - processFlowRule(false, flowRule); - } - } - - MacAddress dstMac = getDstMacFromTreatment(flowRule); - if (dstMac != null && dstMac.equals(mac)) { - processFlowRule(false, flowRule); - continue; - } - - dstMac = getDstMacFromSelector(flowRule); - if (dstMac != null && dstMac.equals(mac)) { - processFlowRule(false, flowRule); - continue; - } - - IpPrefix dstIp = getDstIpFromSelector(flowRule); - if (dstIp != null && dstIp.equals(ip.toIpPrefix())) { - processFlowRule(false, flowRule); - } - } - - // TODO uninstall same network access rule in access table if no vm exists in the network - } - - /** - * Populates service dependency rules. + * Creates provider service group and populates service dependency rules. * * @param tService tenant cord service * @param pService provider cord service * @param isBidirectional true to enable bidirectional connection between two services + * @param install true to install or false to remove */ public void populateServiceDependencyRules(CordService tService, CordService pService, - boolean isBidirectional) { + boolean isBidirectional, boolean install) { checkNotNull(tService); checkNotNull(pService); @@ -290,66 +235,12 @@ public class CordVtnRuleInstaller { inPorts.put(deviceId, tServiceVms); }); - populateIndirectAccessRule(srcRange, serviceIp, outGroups); - populateDirectAccessRule(srcRange, dstRange); + populateIndirectAccessRule(srcRange, serviceIp, outGroups, install); + populateDirectAccessRule(srcRange, dstRange, install); if (isBidirectional) { - populateDirectAccessRule(dstRange, srcRange); + populateDirectAccessRule(dstRange, srcRange, install); } - populateInServiceRule(inPorts, outGroups); - } - - /** - * Removes service dependency rules. - * - * @param tService tenant cord service - * @param pService provider cord service - */ - public void removeServiceDependencyRules(CordService tService, CordService pService) { - checkNotNull(tService); - checkNotNull(pService); - - Ip4Prefix srcRange = tService.serviceIpRange().getIp4Prefix(); - Ip4Prefix dstRange = pService.serviceIpRange().getIp4Prefix(); - IpPrefix serviceIp = pService.serviceIp().toIpPrefix(); - - Map outGroups = Maps.newHashMap(); - GroupKey groupKey = new DefaultGroupKey(pService.id().id().getBytes()); - - getVirtualSwitches().stream().forEach(deviceId -> { - Group group = groupService.getGroup(deviceId, groupKey); - if (group != null) { - outGroups.put(deviceId, group.id()); - } - }); - - for (FlowRule flowRule : flowRuleService.getFlowRulesById(appId)) { - IpPrefix dstIp = getDstIpFromSelector(flowRule); - IpPrefix srcIp = getSrcIpFromSelector(flowRule); - - if (dstIp != null && dstIp.equals(serviceIp)) { - processFlowRule(false, flowRule); - continue; - } - - if (dstIp != null && srcIp != null) { - if (dstIp.equals(dstRange) && srcIp.equals(srcRange)) { - processFlowRule(false, flowRule); - continue; - } - - if (dstIp.equals(srcRange) && srcIp.equals(dstRange)) { - processFlowRule(false, flowRule); - continue; - } - } - - GroupId groupId = getGroupIdFromTreatment(flowRule); - if (groupId != null && groupId.equals(outGroups.get(flowRule.deviceId()))) { - processFlowRule(false, flowRule); - } - } - - // TODO remove the group if it is not in use + populateInServiceRule(inPorts, outGroups, install); } /** @@ -357,7 +248,7 @@ public class CordVtnRuleInstaller { * * @param service cord service */ - public void updateServiceGroup(CordService service) { + public void updateProviderServiceGroup(CordService service) { checkNotNull(service); GroupKey groupKey = getGroupKey(service.id()); @@ -399,6 +290,30 @@ public class CordVtnRuleInstaller { } } + /** + * Updates tenant service indirect access rules when VM is created or removed. + * + * @param host removed vm + * @param service tenant service + */ + public void updateTenantServiceVm(Host host, CordService service) { + checkNotNull(host); + checkNotNull(service); + + DeviceId deviceId = host.location().deviceId(); + PortNumber inPort = host.location().port(); + + service.providerServices().stream().forEach(pServiceId -> { + Map> inPorts = Maps.newHashMap(); + Map outGroups = Maps.newHashMap(); + + inPorts.put(deviceId, Sets.newHashSet(inPort)); + outGroups.put(deviceId, getGroupId(pServiceId, deviceId)); + + populateInServiceRule(inPorts, outGroups, false); + }); + } + /** * Populates flow rules for management network access. * @@ -498,17 +413,6 @@ public class CordVtnRuleInstaller { processFlowRule(true, flowRule); } - /** - * Removes management network access rules. - * - * @param host host to be removed - * @param mService service for management network - */ - public void removeManagementNetworkRules(Host host, CordService mService) { - checkNotNull(mService); - // TODO remove management network specific rules - } - /** * Populates rules for vSG VM. * @@ -897,8 +801,10 @@ public class CordVtnRuleInstaller { * @param deviceId device id to install the rules * @param inPort in port * @param srcIp source ip + * @param install true to install or false to remove */ - private void populateLocalInPortRule(DeviceId deviceId, PortNumber inPort, IpAddress srcIp) { + private void populateLocalInPortRule(DeviceId deviceId, PortNumber inPort, IpAddress srcIp, + boolean install) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchInPort(inPort) .matchEthType(Ethernet.TYPE_IPV4) @@ -920,7 +826,7 @@ public class CordVtnRuleInstaller { .makePermanent() .build(); - processFlowRule(true, flowRule); + processFlowRule(install, flowRule); selector = DefaultTrafficSelector.builder() .matchInPort(inPort) @@ -940,7 +846,7 @@ public class CordVtnRuleInstaller { .makePermanent() .build(); - processFlowRule(true, flowRule); + processFlowRule(install, flowRule); } /** @@ -949,8 +855,9 @@ public class CordVtnRuleInstaller { * * @param srcRange source ip range * @param dstRange destination ip range + * @param install true to install or false to remove */ - private void populateDirectAccessRule(Ip4Prefix srcRange, Ip4Prefix dstRange) { + private void populateDirectAccessRule(Ip4Prefix srcRange, Ip4Prefix dstRange, boolean install) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchEthType(Ethernet.TYPE_IPV4) .matchIPSrc(srcRange) @@ -973,7 +880,7 @@ public class CordVtnRuleInstaller { .makePermanent() .build(); - processFlowRule(true, flowRuleDirect); + processFlowRule(install, flowRuleDirect); }); } @@ -982,8 +889,9 @@ public class CordVtnRuleInstaller { * destination to a different service network in ACCESS_TYPE table. * * @param dstRange destination ip range + * @param install true to install or false to remove */ - private void populateServiceIsolationRule(Ip4Prefix dstRange) { + private void populateServiceIsolationRule(Ip4Prefix dstRange, boolean install) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchEthType(Ethernet.TYPE_IPV4) .matchIPDst(dstRange) @@ -1004,7 +912,7 @@ public class CordVtnRuleInstaller { .makePermanent() .build(); - processFlowRule(true, flowRuleDirect); + processFlowRule(install, flowRuleDirect); }); } @@ -1015,9 +923,10 @@ public class CordVtnRuleInstaller { * @param srcRange source range * @param serviceIp service ip * @param outGroups list of output group + * @param install true to install or false to remove */ private void populateIndirectAccessRule(Ip4Prefix srcRange, Ip4Address serviceIp, - Map outGroups) { + Map outGroups, boolean install) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchEthType(Ethernet.TYPE_IPV4) .matchIPSrc(srcRange) @@ -1039,7 +948,7 @@ public class CordVtnRuleInstaller { .makePermanent() .build(); - processFlowRule(true, flowRule); + processFlowRule(install, flowRule); } } @@ -1048,8 +957,10 @@ public class CordVtnRuleInstaller { * * @param inPorts list of inports related to the service for each device * @param outGroups set of output groups + * @param install true to install or false to remove */ - private void populateInServiceRule(Map> inPorts, Map outGroups) { + private void populateInServiceRule(Map> inPorts, + Map outGroups, boolean install) { checkNotNull(inPorts); checkNotNull(outGroups); @@ -1081,7 +992,7 @@ public class CordVtnRuleInstaller { .makePermanent() .build(); - processFlowRule(true, flowRule); + processFlowRule(install, flowRule); }); } } @@ -1095,9 +1006,11 @@ public class CordVtnRuleInstaller { * @param dstIp destination ip * @param tunnelId tunnel id * @param tunnelIp tunnel remote ip + * @param install true to install or false to remove */ private void populateDstIpRule(DeviceId deviceId, PortNumber inPort, MacAddress dstMac, - IpAddress dstIp, long tunnelId, IpAddress tunnelIp) { + IpAddress dstIp, long tunnelId, IpAddress tunnelIp, + boolean install) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchEthType(Ethernet.TYPE_IPV4) .matchIPDst(dstIp.toIpPrefix()) @@ -1118,7 +1031,7 @@ public class CordVtnRuleInstaller { .makePermanent() .build(); - processFlowRule(true, flowRule); + processFlowRule(install, flowRule); for (DeviceId vSwitchId : getVirtualSwitches()) { if (vSwitchId.equals(deviceId)) { @@ -1147,7 +1060,7 @@ public class CordVtnRuleInstaller { .makePermanent() .build(); - processFlowRule(true, flowRule); + processFlowRule(install, flowRule); } } @@ -1158,8 +1071,10 @@ public class CordVtnRuleInstaller { * @param inPort in port * @param mac mac address * @param tunnelId tunnel id + * @param install true to install or false to remove */ - private void populateTunnelInRule(DeviceId deviceId, PortNumber inPort, MacAddress mac, long tunnelId) { + private void populateTunnelInRule(DeviceId deviceId, PortNumber inPort, MacAddress mac, + long tunnelId, boolean install) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchTunnelId(tunnelId) .matchEthDst(mac) @@ -1179,7 +1094,7 @@ public class CordVtnRuleInstaller { .makePermanent() .build(); - processFlowRule(true, flowRule); + processFlowRule(install, flowRule); } /** @@ -1252,58 +1167,16 @@ public class CordVtnRuleInstaller { } /** - * Returns the inport from a given flow rule if the rule contains the match of it. + * Returns IP address for tunneling for a given host. * - * @param flowRule flow rule - * @return port number, or null if the rule doesn't have inport match + * @param host host + * @return ip address, or null */ - private PortNumber getInPort(FlowRule flowRule) { - Criterion criterion = flowRule.selector().getCriterion(IN_PORT); - if (criterion != null && criterion instanceof PortCriterion) { - PortCriterion port = (PortCriterion) criterion; - return port.port(); - } else { - return null; - } + private IpAddress getTunnelIp(Host host) { + String ip = host.annotations().value(DATA_PLANE_IP); + return ip == null ? null : IpAddress.valueOf(ip); } - /** - * Returns the destination mac address from a given flow rule if the rule - * contains the instruction of it. - * - * @param flowRule flow rule - * @return mac address, or null if the rule doesn't have destination mac instruction - */ - private MacAddress getDstMacFromTreatment(FlowRule flowRule) { - Instruction instruction = flowRule.treatment().allInstructions().stream() - .filter(inst -> inst instanceof ModEtherInstruction && - ((ModEtherInstruction) inst).subtype().equals(ETH_DST)) - .findFirst() - .orElse(null); - - if (instruction == null) { - return null; - } - - return ((ModEtherInstruction) instruction).mac(); - } - - /** - * Returns the destination mac address from a given flow rule if the rule - * contains the match of it. - * - * @param flowRule flow rule - * @return mac address, or null if the rule doesn't have destination mac match - */ - private MacAddress getDstMacFromSelector(FlowRule flowRule) { - Criterion criterion = flowRule.selector().getCriterion(Criterion.Type.ETH_DST); - if (criterion != null && criterion instanceof EthCriterion) { - EthCriterion eth = (EthCriterion) criterion; - return eth.mac(); - } else { - return null; - } - } /** * Returns the destination IP from a given flow rule if the rule contains @@ -1322,43 +1195,6 @@ public class CordVtnRuleInstaller { } } - /** - * Returns the source IP from a given flow rule if the rule contains - * the match of it. - * - * @param flowRule flow rule - * @return ip prefix, or null if the rule doesn't have ip match - */ - private IpPrefix getSrcIpFromSelector(FlowRule flowRule) { - Criterion criterion = flowRule.selector().getCriterion(IPV4_SRC); - if (criterion != null && criterion instanceof IPCriterion) { - IPCriterion ip = (IPCriterion) criterion; - return ip.ip(); - } else { - return null; - } - } - - /** - * Returns the group ID from a given flow rule if the rule contains the - * treatment of it. - * - * @param flowRule flow rule - * @return group id, or null if the rule doesn't have group instruction - */ - private GroupId getGroupIdFromTreatment(FlowRule flowRule) { - Instruction instruction = flowRule.treatment().allInstructions().stream() - .filter(inst -> inst instanceof Instructions.GroupInstruction) - .findFirst() - .orElse(null); - - if (instruction == null) { - return null; - } - - return ((Instructions.GroupInstruction) instruction).groupId(); - } - /** * Returns the output port number from a given flow rule. * @@ -1413,7 +1249,8 @@ public class CordVtnRuleInstaller { return groupId; } - GroupBuckets buckets = getServiceGroupBuckets(deviceId, service.segmentationId(), service.hosts()); + GroupBuckets buckets = getServiceGroupBuckets( + deviceId, service.segmentationId(), service.hosts()); GroupDescription groupDescription = new DefaultGroupDescription( deviceId, GroupDescription.Type.SELECT, @@ -1435,7 +1272,8 @@ public class CordVtnRuleInstaller { * @param hosts list of host * @return group buckets */ - private GroupBuckets getServiceGroupBuckets(DeviceId deviceId, long tunnelId, Map hosts) { + private GroupBuckets getServiceGroupBuckets(DeviceId deviceId, long tunnelId, + Map hosts) { List buckets = Lists.newArrayList(); for (Map.Entry entry : hosts.entrySet()) {