Flow Objective implementation
Provides an abstraction which isolates the application from any pipeline
knowledge. By using the provided objectives applications can express
their forwarding desires in a pipeline agnostic way. The objectives
are then consumed by a driver for the specific device who converts them
into the appropriate pipeline coherent flows.
Change-Id: I74a68b4971c367c0cd5b7de9d877abdd117afa98
diff --git a/core/api/src/main/java/org/onosproject/net/flowobjective/DefaultForwardingObjective.java b/core/api/src/main/java/org/onosproject/net/flowobjective/DefaultForwardingObjective.java
index d110e07..6489bea 100644
--- a/core/api/src/main/java/org/onosproject/net/flowobjective/DefaultForwardingObjective.java
+++ b/core/api/src/main/java/org/onosproject/net/flowobjective/DefaultForwardingObjective.java
@@ -20,6 +20,7 @@
import org.onosproject.net.flow.TrafficTreatment;
import java.util.Objects;
+import java.util.Optional;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -38,6 +39,7 @@
private final int nextId;
private final TrafficTreatment treatment;
private final Operation op;
+ private final Optional<ObjectiveContext> context;
private final int id;
@@ -55,6 +57,29 @@
this.nextId = nextId;
this.treatment = treatment;
this.op = op;
+ this.context = Optional.empty();
+
+ this.id = Objects.hash(selector, flag, permanent,
+ timeout, appId, priority, nextId,
+ treatment, op);
+ }
+
+ private DefaultForwardingObjective(TrafficSelector selector,
+ Flag flag, boolean permanent,
+ int timeout, ApplicationId appId,
+ int priority, int nextId,
+ TrafficTreatment treatment,
+ ObjectiveContext context, Operation op) {
+ this.selector = selector;
+ this.flag = flag;
+ this.permanent = permanent;
+ this.timeout = timeout;
+ this.appId = appId;
+ this.priority = priority;
+ this.nextId = nextId;
+ this.treatment = treatment;
+ this.op = op;
+ this.context = Optional.ofNullable(context);
this.id = Objects.hash(selector, flag, permanent,
timeout, appId, priority, nextId,
@@ -113,6 +138,11 @@
return op;
}
+ @Override
+ public Optional<ObjectiveContext> context() {
+ return context;
+ }
+
/**
* Returns a new builder.
*
@@ -186,7 +216,7 @@
public ForwardingObjective add() {
checkNotNull(selector, "Must have a selector");
checkNotNull(flag, "A flag must be set");
- checkArgument(nextId != null && treatment != null, "Must supply at " +
+ checkArgument(nextId != null || treatment != null, "Must supply at " +
"least a treatment and/or a nextId");
checkNotNull(appId, "Must supply an application id");
return new DefaultForwardingObjective(selector, flag, permanent,
@@ -198,12 +228,38 @@
public ForwardingObjective remove() {
checkNotNull(selector, "Must have a selector");
checkNotNull(flag, "A flag must be set");
- checkArgument(nextId != null && treatment != null, "Must supply at " +
+ checkArgument(nextId != null || treatment != null, "Must supply at " +
"least a treatment and/or a nextId");
checkNotNull(appId, "Must supply an application id");
return new DefaultForwardingObjective(selector, flag, permanent,
timeout, appId, priority,
nextId, treatment, Operation.REMOVE);
}
+
+ @Override
+ public ForwardingObjective add(ObjectiveContext context) {
+ checkNotNull(selector, "Must have a selector");
+ checkNotNull(flag, "A flag must be set");
+ checkArgument(nextId != null || treatment != null, "Must supply at " +
+ "least a treatment and/or a nextId");
+ checkNotNull(appId, "Must supply an application id");
+ return new DefaultForwardingObjective(selector, flag, permanent,
+ timeout, appId, priority,
+ nextId, treatment,
+ context, Operation.ADD);
+ }
+
+ @Override
+ public ForwardingObjective remove(ObjectiveContext context) {
+ checkNotNull(selector, "Must have a selector");
+ checkNotNull(flag, "A flag must be set");
+ checkArgument(nextId != null || treatment != null, "Must supply at " +
+ "least a treatment and/or a nextId");
+ checkNotNull(appId, "Must supply an application id");
+ return new DefaultForwardingObjective(selector, flag, permanent,
+ timeout, appId, priority,
+ nextId, treatment,
+ context, Operation.REMOVE);
+ }
}
}