/* * Copyright 2014-2015 Open Networking Laboratory * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onosproject.net.intent; import com.google.common.annotations.Beta; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import org.onosproject.core.ApplicationId; import org.onosproject.net.Link; import org.onosproject.net.NetworkResource; import org.onosproject.net.flow.DefaultTrafficSelector; import org.onosproject.net.flow.DefaultTrafficTreatment; import org.onosproject.net.flow.TrafficSelector; import org.onosproject.net.flow.TrafficTreatment; import java.util.Collection; import java.util.Collections; import java.util.List; import static com.google.common.base.Preconditions.checkNotNull; /** * Abstraction of connectivity intent for traffic matching some criteria. */ @Beta public abstract class ConnectivityIntent extends Intent { // TODO: other forms of intents should be considered for this family: // point-to-point with constraints (waypoints/obstacles) // multi-to-single point with constraints (waypoints/obstacles) // single-to-multi point with constraints (waypoints/obstacles) // concrete path (with alternate) // ... private final TrafficSelector selector; private final TrafficTreatment treatment; private final List constraints; /** * Creates a connectivity intent that matches on the specified selector * and applies the specified treatment. *

* Path will be optimized based on the first constraint if one is given. *

* * @param appId application identifier * @param key explicit key to use for intent * @param resources required network resources (optional) * @param selector traffic selector * @param treatment treatment * @param constraints optional prioritized list of constraints * @param priority priority to use for flows generated by this intent * @throws NullPointerException if the selector or treatment is null */ protected ConnectivityIntent(ApplicationId appId, Key key, Collection resources, TrafficSelector selector, TrafficTreatment treatment, List constraints, int priority) { super(appId, key, resources, priority); this.selector = checkNotNull(selector); this.treatment = checkNotNull(treatment); this.constraints = checkNotNull(constraints); } /** * Constructor for serializer. */ protected ConnectivityIntent() { super(); this.selector = null; this.treatment = null; this.constraints = Collections.emptyList(); } /** * Abstract builder for connectivity intents. */ public abstract static class Builder extends Intent.Builder { protected TrafficSelector selector = DefaultTrafficSelector.emptySelector(); protected TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment(); protected List constraints = ImmutableList.of(); @Override public Builder appId(ApplicationId appId) { return (Builder) super.appId(appId); } @Override public Builder key(Key key) { return (Builder) super.key(key); } @Override public Builder priority(int priority) { return (Builder) super.priority(priority); } /** * Sets the traffic selector for the intent that will be built. * * @param selector selector to use for built intent * @return this builder */ public Builder selector(TrafficSelector selector) { this.selector = selector; return this; } /** * Sets the traffic treatment for the intent that will be built. * * @param treatment treatment to use for built intent * @return this builder */ public Builder treatment(TrafficTreatment treatment) { this.treatment = treatment; return this; } /** * Sets the constraints for the intent that will be built. * * @param constraints constraints to use for built intent * @return this builder */ public Builder constraints(List constraints) { this.constraints = ImmutableList.copyOf(constraints); return this; } } /** * Returns the match specifying the type of traffic. * * @return traffic match */ public TrafficSelector selector() { return selector; } /** * Returns the action applied to the traffic. * * @return applied action */ public TrafficTreatment treatment() { return treatment; } /** * Returns the set of connectivity constraints. * * @return list of intent constraints */ public List constraints() { return constraints; } /** * Produces a collection of network resources from the given links. * * @param links collection of links * @return collection of link resources */ protected static Collection resources(Collection links) { return ImmutableSet.copyOf(links); } }