Search in sources :

Example 1 with GroupId

use of org.onosproject.core.GroupId in project onos by opennetworkinglab.

the class K8sServiceHandler method setStatefulGroupFlowRules.

private void setStatefulGroupFlowRules(DeviceId deviceId, long ctState, long ctMask, Service service, boolean install) {
    List<GroupBucket> buckets = Lists.newArrayList();
    String serviceName = service.getMetadata().getName();
    String serviceIp = service.getSpec().getClusterIP();
    // TODO: multi-ports case should be addressed
    Integer servicePort = service.getSpec().getPorts().get(0).getPort();
    String serviceProtocol = service.getSpec().getPorts().get(0).getProtocol();
    String svcStr = servicePortStr(serviceIp, servicePort, serviceProtocol);
    int groupId = svcStr.hashCode();
    List<Endpoints> endpointses = k8sEndpointsService.endpointses().stream().filter(ep -> serviceName.equals(ep.getMetadata().getName())).collect(Collectors.toList());
    Map<String, String> nodeIpGatewayIpMap = nodeIpGatewayIpMap(k8sNodeService, k8sNetworkService);
    for (Endpoints endpoints : endpointses) {
        for (EndpointSubset endpointSubset : endpoints.getSubsets()) {
            List<EndpointPort> ports = endpointSubset.getPorts().stream().filter(p -> p.getProtocol().equals(TCP)).collect(Collectors.toList());
            for (EndpointAddress address : endpointSubset.getAddresses()) {
                String podIp = nodeIpGatewayIpMap.containsKey(address.getIp()) ? nodeIpGatewayIpMap.get(address.getIp()) : address.getIp();
                NiciraConnTrackTreatmentBuilder connTreatmentBuilder = niciraConnTrackTreatmentBuilder(driverService, deviceId).commit(true).natAction(true).natIp(IpAddress.valueOf(podIp)).natFlag(CT_NAT_DST_FLAG);
                ports.forEach(p -> {
                    ExtensionTreatment ctNatTreatment = connTreatmentBuilder.natPortMin(TpPort.tpPort(p.getPort())).natPortMax(TpPort.tpPort(p.getPort())).build();
                    ExtensionTreatment resubmitTreatment = buildResubmitExtension(deviceService.getDevice(deviceId), ACL_TABLE);
                    TrafficTreatment treatment = DefaultTrafficTreatment.builder().extension(ctNatTreatment, deviceId).extension(resubmitTreatment, deviceId).build();
                    buckets.add(buildGroupBucket(treatment, SELECT, (short) -1));
                });
            }
        }
    }
    if (!buckets.isEmpty()) {
        k8sGroupRuleService.setRule(appId, deviceId, groupId, SELECT, buckets, install);
        setTrackNew(deviceId, ctState, ctMask, IpAddress.valueOf(serviceIp), TpPort.tpPort(servicePort), NAT_TABLE, groupId, PRIORITY_CT_RULE, install);
    }
}
Also used : DeviceService(org.onosproject.net.device.DeviceService) NODE_IP_PREFIX(org.onosproject.k8snetworking.api.Constants.NODE_IP_PREFIX) RulePopulatorUtil.niciraConnTrackTreatmentBuilder(org.onosproject.k8snetworking.util.RulePopulatorUtil.niciraConnTrackTreatmentBuilder) PRIORITY_CIDR_RULE(org.onosproject.k8snetworking.api.Constants.PRIORITY_CIDR_RULE) NiciraConnTrackTreatmentBuilder(org.onosproject.k8snetworking.util.RulePopulatorUtil.NiciraConnTrackTreatmentBuilder) K8sEndpointsEvent(org.onosproject.k8snetworking.api.K8sEndpointsEvent) DriverService(org.onosproject.net.driver.DriverService) DefaultTrafficTreatment(org.onosproject.net.flow.DefaultTrafficTreatment) StorageService(org.onosproject.store.service.StorageService) ROUTING_TABLE(org.onosproject.k8snetworking.api.Constants.ROUTING_TABLE) Map(java.util.Map) ApplicationId(org.onosproject.core.ApplicationId) RulePopulatorUtil.buildResubmitExtension(org.onosproject.k8snetworking.util.RulePopulatorUtil.buildResubmitExtension) NAT_STATEFUL(org.onosproject.k8snetworking.api.Constants.NAT_STATEFUL) SELECT(org.onosproject.net.group.GroupDescription.Type.SELECT) K8sEndpointsListener(org.onosproject.k8snetworking.api.K8sEndpointsListener) PRIORITY_CT_RULE(org.onosproject.k8snetworking.api.Constants.PRIORITY_CT_RULE) Deactivate(org.osgi.service.component.annotations.Deactivate) Set(java.util.Set) EndpointAddress(io.fabric8.kubernetes.api.model.EndpointAddress) PRIORITY_INTER_ROUTING_RULE(org.onosproject.k8snetworking.api.Constants.PRIORITY_INTER_ROUTING_RULE) SERVICE_IP_NAT_MODE(org.onosproject.k8snetworking.impl.OsgiPropertyConstants.SERVICE_IP_NAT_MODE) TUN_ENTRY_TABLE(org.onosproject.k8snetworking.api.Constants.TUN_ENTRY_TABLE) DeviceId(org.onosproject.net.DeviceId) Dictionary(java.util.Dictionary) Tools(org.onlab.util.Tools) K8sServiceService(org.onosproject.k8snetworking.api.K8sServiceService) ACL_TABLE(org.onosproject.k8snetworking.api.Constants.ACL_TABLE) ComponentContext(org.osgi.service.component.ComponentContext) K8sNetworkingUtil.portNumberByName(org.onosproject.k8snetworking.util.K8sNetworkingUtil.portNumberByName) GROUPING_TABLE(org.onosproject.k8snetworking.api.Constants.GROUPING_TABLE) Component(org.osgi.service.component.annotations.Component) Lists(com.google.common.collect.Lists) TrafficSelector(org.onosproject.net.flow.TrafficSelector) K8sNetworkEvent(org.onosproject.k8snetworking.api.K8sNetworkEvent) K8sNodeEvent(org.onosproject.k8snode.api.K8sNodeEvent) DefaultTrafficSelector(org.onosproject.net.flow.DefaultTrafficSelector) K8S_NETWORKING_APP_ID(org.onosproject.k8snetworking.api.Constants.K8S_NETWORKING_APP_ID) TpPort(org.onlab.packet.TpPort) ComponentConfigService(org.onosproject.cfg.ComponentConfigService) Endpoints(io.fabric8.kubernetes.api.model.Endpoints) EndpointSubset(io.fabric8.kubernetes.api.model.EndpointSubset) Pod(io.fabric8.kubernetes.api.model.Pod) RulePopulatorUtil.computeCtMaskFlag(org.onosproject.k8snetworking.util.RulePopulatorUtil.computeCtMaskFlag) SERVICE_IP_NAT_MODE_DEFAULT(org.onosproject.k8snetworking.impl.OsgiPropertyConstants.SERVICE_IP_NAT_MODE_DEFAULT) IPv4(org.onlab.packet.IPv4) GroupId(org.onosproject.core.GroupId) ExtensionSelector(org.onosproject.net.flow.criteria.ExtensionSelector) B_CLASS(org.onosproject.k8snetworking.api.Constants.B_CLASS) MacAddress(org.onlab.packet.MacAddress) RulePopulatorUtil.buildLoadExtension(org.onosproject.k8snetworking.util.RulePopulatorUtil.buildLoadExtension) K8sNodeService(org.onosproject.k8snode.api.K8sNodeService) LeadershipService(org.onosproject.cluster.LeadershipService) POD_TABLE(org.onosproject.k8snetworking.api.Constants.POD_TABLE) CT_NAT_DST_FLAG(org.onosproject.k8snetworking.util.RulePopulatorUtil.CT_NAT_DST_FLAG) SERVICE_FAKE_MAC_STR(org.onosproject.k8snetworking.api.Constants.SERVICE_FAKE_MAC_STR) CoreService(org.onosproject.core.CoreService) Tools.groupedThreads(org.onlab.util.Tools.groupedThreads) ServicePort(io.fabric8.kubernetes.api.model.ServicePort) K8sNodeListener(org.onosproject.k8snode.api.K8sNodeListener) NAMESPACE_TABLE(org.onosproject.k8snetworking.api.Constants.NAMESPACE_TABLE) K8sNetworkListener(org.onosproject.k8snetworking.api.K8sNetworkListener) NAT_STATELESS(org.onosproject.k8snetworking.api.Constants.NAT_STATELESS) Ethernet(org.onlab.packet.Ethernet) STAT_EGRESS_TABLE(org.onosproject.k8snetworking.api.Constants.STAT_EGRESS_TABLE) A_CLASS(org.onosproject.k8snetworking.api.Constants.A_CLASS) SERVICE_IP_CIDR_DEFAULT(org.onosproject.k8snetworking.impl.OsgiPropertyConstants.SERVICE_IP_CIDR_DEFAULT) K8sNetworkingUtil.podByIp(org.onosproject.k8snetworking.util.K8sNetworkingUtil.podByIp) K8sPodService(org.onosproject.k8snetworking.api.K8sPodService) K8sServiceEvent(org.onosproject.k8snetworking.api.K8sServiceEvent) NodeId(org.onosproject.cluster.NodeId) SERVICE_CIDR(org.onosproject.k8snetworking.impl.OsgiPropertyConstants.SERVICE_CIDR) DST(org.onosproject.k8snetworking.api.Constants.DST) RulePopulatorUtil.computeCtStateFlag(org.onosproject.k8snetworking.util.RulePopulatorUtil.computeCtStateFlag) K8sFlowRuleService(org.onosproject.k8snetworking.api.K8sFlowRuleService) Executors.newSingleThreadExecutor(java.util.concurrent.Executors.newSingleThreadExecutor) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) List(java.util.List) ClusterService(org.onosproject.cluster.ClusterService) PRIORITY_NAT_RULE(org.onosproject.k8snetworking.api.Constants.PRIORITY_NAT_RULE) IpPrefix(org.onlab.packet.IpPrefix) SRC(org.onosproject.k8snetworking.api.Constants.SRC) GroupBucket(org.onosproject.net.group.GroupBucket) K8sNetworkService(org.onosproject.k8snetworking.api.K8sNetworkService) K8sNetworkingUtil.getBclassIpPrefixFromCidr(org.onosproject.k8snetworking.util.K8sNetworkingUtil.getBclassIpPrefixFromCidr) K8sServiceListener(org.onosproject.k8snetworking.api.K8sServiceListener) Activate(org.osgi.service.component.annotations.Activate) Service(io.fabric8.kubernetes.api.model.Service) K8sNode(org.onosproject.k8snode.api.K8sNode) ExecutorService(java.util.concurrent.ExecutorService) IpAddress(org.onlab.packet.IpAddress) TrafficTreatment(org.onosproject.net.flow.TrafficTreatment) Logger(org.slf4j.Logger) RulePopulatorUtil(org.onosproject.k8snetworking.util.RulePopulatorUtil) SHIFTED_IP_PREFIX(org.onosproject.k8snetworking.api.Constants.SHIFTED_IP_PREFIX) EndpointPort(io.fabric8.kubernetes.api.model.EndpointPort) NAT_TABLE(org.onosproject.k8snetworking.api.Constants.NAT_TABLE) ExtensionTreatment(org.onosproject.net.flow.instructions.ExtensionTreatment) K8sGroupRuleService(org.onosproject.k8snetworking.api.K8sGroupRuleService) Maps(com.google.common.collect.Maps) SERVICE_TABLE(org.onosproject.k8snetworking.api.Constants.SERVICE_TABLE) K8sNetworkingUtil.nodeIpGatewayIpMap(org.onosproject.k8snetworking.util.K8sNetworkingUtil.nodeIpGatewayIpMap) ReferenceCardinality(org.osgi.service.component.annotations.ReferenceCardinality) RulePopulatorUtil.buildGroupBucket(org.onosproject.k8snetworking.util.RulePopulatorUtil.buildGroupBucket) K8sEndpointsService(org.onosproject.k8snetworking.api.K8sEndpointsService) SHIFTED_IP_CIDR(org.onosproject.k8snetworking.api.Constants.SHIFTED_IP_CIDR) K8sNetwork(org.onosproject.k8snetworking.api.K8sNetwork) Modified(org.osgi.service.component.annotations.Modified) LoggerFactory.getLogger(org.slf4j.LoggerFactory.getLogger) Reference(org.osgi.service.component.annotations.Reference) EndpointPort(io.fabric8.kubernetes.api.model.EndpointPort) DefaultTrafficTreatment(org.onosproject.net.flow.DefaultTrafficTreatment) TrafficTreatment(org.onosproject.net.flow.TrafficTreatment) Endpoints(io.fabric8.kubernetes.api.model.Endpoints) NiciraConnTrackTreatmentBuilder(org.onosproject.k8snetworking.util.RulePopulatorUtil.NiciraConnTrackTreatmentBuilder) EndpointSubset(io.fabric8.kubernetes.api.model.EndpointSubset) GroupBucket(org.onosproject.net.group.GroupBucket) RulePopulatorUtil.buildGroupBucket(org.onosproject.k8snetworking.util.RulePopulatorUtil.buildGroupBucket) ExtensionTreatment(org.onosproject.net.flow.instructions.ExtensionTreatment) EndpointAddress(io.fabric8.kubernetes.api.model.EndpointAddress)

Example 2 with GroupId

use of org.onosproject.core.GroupId in project onos by opennetworkinglab.

the class OFAgentVirtualGroupBucketEntryBuilder method build.

/**
 * Builds a GroupBuckets.
 *
 * @return GroupBuckets object, a list of GroupBuckets
 */
public GroupBuckets build() {
    List<GroupBucket> bucketList = Lists.newArrayList();
    for (OFBucket bucket : ofBuckets) {
        TrafficTreatment treatment = buildTreatment(bucket.getActions());
        // TODO: Use GroupBucketEntry
        GroupBucket groupBucket = null;
        switch(type) {
            case INDIRECT:
                groupBucket = DefaultGroupBucket.createIndirectGroupBucket(treatment);
                break;
            case SELECT:
                groupBucket = DefaultGroupBucket.createSelectGroupBucket(treatment, (short) bucket.getWeight());
                break;
            case FF:
                PortNumber port = PortNumber.portNumber(bucket.getWatchPort().getPortNumber());
                GroupId groupId = new GroupId(bucket.getWatchGroup().getGroupNumber());
                groupBucket = DefaultGroupBucket.createFailoverGroupBucket(treatment, port, groupId);
                break;
            case ALL:
                groupBucket = DefaultGroupBucket.createAllGroupBucket(treatment);
                break;
            default:
                log.error("Unsupported Group type : {}", type);
        }
        if (groupBucket != null) {
            bucketList.add(groupBucket);
        }
    }
    return new GroupBuckets(bucketList);
}
Also used : OFBucket(org.projectfloodlight.openflow.protocol.OFBucket) GroupBucket(org.onosproject.net.group.GroupBucket) DefaultGroupBucket(org.onosproject.net.group.DefaultGroupBucket) TrafficTreatment(org.onosproject.net.flow.TrafficTreatment) DefaultTrafficTreatment(org.onosproject.net.flow.DefaultTrafficTreatment) PortNumber(org.onosproject.net.PortNumber) GroupBuckets(org.onosproject.net.group.GroupBuckets) GroupId(org.onosproject.core.GroupId)

Example 3 with GroupId

use of org.onosproject.core.GroupId in project onos by opennetworkinglab.

the class SimpleVirtualGroupStore method storeGroupDescriptionInternal.

private void storeGroupDescriptionInternal(NetworkId networkId, GroupDescription groupDesc) {
    // Check if a group is existing with the same key
    if (getGroup(networkId, groupDesc.deviceId(), groupDesc.appCookie()) != null) {
        return;
    }
    GroupId id = null;
    if (groupDesc.givenGroupId() == null) {
        // Get a new group identifier
        id = new GroupId(getFreeGroupIdValue(networkId, groupDesc.deviceId()));
    } else {
        id = new GroupId(groupDesc.givenGroupId());
    }
    // Create a group entry object
    StoredGroupEntry group = new DefaultGroup(id, groupDesc);
    // Insert the newly created group entry into concurrent key and id maps
    ConcurrentMap<GroupKey, StoredGroupEntry> keyTable = getGroupKeyTable(networkId, groupDesc.deviceId());
    keyTable.put(groupDesc.appCookie(), group);
    ConcurrentMap<GroupId, StoredGroupEntry> idTable = getGroupIdTable(networkId, groupDesc.deviceId());
    idTable.put(id, group);
    notifyDelegate(networkId, new GroupEvent(GroupEvent.Type.GROUP_ADD_REQUESTED, group));
}
Also used : DefaultGroup(org.onosproject.net.group.DefaultGroup) GroupKey(org.onosproject.net.group.GroupKey) StoredGroupEntry(org.onosproject.net.group.StoredGroupEntry) GroupEvent(org.onosproject.net.group.GroupEvent) GroupId(org.onosproject.core.GroupId)

Example 4 with GroupId

use of org.onosproject.core.GroupId in project onos by opennetworkinglab.

the class SimpleVirtualGroupStore method removeGroupEntry.

@Override
public void removeGroupEntry(NetworkId networkId, Group group) {
    StoredGroupEntry existing = null;
    if (groupEntriesById.get(networkId) != null && groupEntriesById.get(networkId).get(group.deviceId()) != null) {
        existing = groupEntriesById.get(networkId).get(group.deviceId()).get(group.id());
    }
    if (existing != null) {
        ConcurrentMap<GroupKey, StoredGroupEntry> keyTable = getGroupKeyTable(networkId, existing.deviceId());
        ConcurrentMap<GroupId, StoredGroupEntry> idTable = getGroupIdTable(networkId, existing.deviceId());
        idTable.remove(existing.id());
        keyTable.remove(existing.appCookie());
        notifyDelegate(networkId, new GroupEvent(GroupEvent.Type.GROUP_REMOVED, existing));
    }
}
Also used : GroupKey(org.onosproject.net.group.GroupKey) StoredGroupEntry(org.onosproject.net.group.StoredGroupEntry) GroupEvent(org.onosproject.net.group.GroupEvent) GroupId(org.onosproject.core.GroupId)

Example 5 with GroupId

use of org.onosproject.core.GroupId in project onos by opennetworkinglab.

the class SimpleVirtualGroupStore method groupOperationFailed.

@Override
public void groupOperationFailed(NetworkId networkId, DeviceId deviceId, GroupOperation operation) {
    StoredGroupEntry existing = null;
    if (groupEntriesById.get(networkId) != null && groupEntriesById.get(networkId).get(deviceId) != null) {
        existing = groupEntriesById.get(networkId).get(deviceId).get(operation.groupId());
    }
    if (existing == null) {
        log.warn("No group entry with ID {} found ", operation.groupId());
        return;
    }
    switch(operation.opType()) {
        case ADD:
            notifyDelegate(networkId, new GroupEvent(GroupEvent.Type.GROUP_ADD_FAILED, existing));
            break;
        case MODIFY:
            notifyDelegate(networkId, new GroupEvent(GroupEvent.Type.GROUP_UPDATE_FAILED, existing));
            break;
        case DELETE:
            notifyDelegate(networkId, new GroupEvent(GroupEvent.Type.GROUP_REMOVE_FAILED, existing));
            break;
        default:
            log.warn("Unknown group operation type {}", operation.opType());
    }
    ConcurrentMap<GroupKey, StoredGroupEntry> keyTable = getGroupKeyTable(networkId, existing.deviceId());
    ConcurrentMap<GroupId, StoredGroupEntry> idTable = getGroupIdTable(networkId, existing.deviceId());
    idTable.remove(existing.id());
    keyTable.remove(existing.appCookie());
}
Also used : GroupKey(org.onosproject.net.group.GroupKey) StoredGroupEntry(org.onosproject.net.group.StoredGroupEntry) GroupEvent(org.onosproject.net.group.GroupEvent) GroupId(org.onosproject.core.GroupId)

Aggregations

GroupId (org.onosproject.core.GroupId)59 GroupBucket (org.onosproject.net.group.GroupBucket)30 GroupKey (org.onosproject.net.group.GroupKey)29 TrafficTreatment (org.onosproject.net.flow.TrafficTreatment)26 GroupBuckets (org.onosproject.net.group.GroupBuckets)26 DefaultTrafficTreatment (org.onosproject.net.flow.DefaultTrafficTreatment)25 DefaultGroupBucket (org.onosproject.net.group.DefaultGroupBucket)24 DefaultGroupKey (org.onosproject.net.group.DefaultGroupKey)21 DefaultGroupDescription (org.onosproject.net.group.DefaultGroupDescription)19 GroupDescription (org.onosproject.net.group.GroupDescription)19 DefaultGroup (org.onosproject.net.group.DefaultGroup)18 Group (org.onosproject.net.group.Group)17 GroupEvent (org.onosproject.net.group.GroupEvent)12 ArrayList (java.util.ArrayList)11 PortNumber (org.onosproject.net.PortNumber)11 Instruction (org.onosproject.net.flow.instructions.Instruction)10 L2ModificationInstruction (org.onosproject.net.flow.instructions.L2ModificationInstruction)10 StoredGroupEntry (org.onosproject.net.group.StoredGroupEntry)10 OfdpaGroupHandlerUtility.l2MulticastGroupKey (org.onosproject.driver.pipeline.ofdpa.OfdpaGroupHandlerUtility.l2MulticastGroupKey)9 MacAddress (org.onlab.packet.MacAddress)8