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/DefaultNextObjective.java b/core/api/src/main/java/org/onosproject/net/flowobjective/DefaultNextObjective.java
index 4ab79ff..cc316fe 100644
--- a/core/api/src/main/java/org/onosproject/net/flowobjective/DefaultNextObjective.java
+++ b/core/api/src/main/java/org/onosproject/net/flowobjective/DefaultNextObjective.java
@@ -21,6 +21,7 @@
import java.util.Collection;
import java.util.List;
+import java.util.Optional;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -34,13 +35,28 @@
private final ApplicationId appId;
private final Type type;
private final Integer id;
+ private final Operation op;
+ private final Optional<ObjectiveContext> context;
private DefaultNextObjective(Integer id, List<TrafficTreatment> treatments,
- ApplicationId appId, Type type) {
+ ApplicationId appId, Type type, Operation op) {
this.treatments = treatments;
this.appId = appId;
this.type = type;
this.id = id;
+ this.op = op;
+ this.context = Optional.empty();
+ }
+
+ private DefaultNextObjective(Integer id, List<TrafficTreatment> treatments,
+ ApplicationId appId, ObjectiveContext context,
+ Type type, Operation op) {
+ this.treatments = treatments;
+ this.appId = appId;
+ this.type = type;
+ this.id = id;
+ this.op = op;
+ this.context = Optional.ofNullable(context);
}
@Override
@@ -80,7 +96,12 @@
@Override
public Operation op() {
- throw new UnsupportedOperationException("Next Objective has no operation");
+ return op;
+ }
+
+ @Override
+ public Optional<ObjectiveContext> context() {
+ return context;
}
/**
@@ -101,8 +122,6 @@
private final ImmutableList.Builder<TrafficTreatment> listBuilder
= ImmutableList.builder();
-
-
@Override
public NextObjective.Builder withId(int nextId) {
this.id = nextId;
@@ -143,7 +162,7 @@
}
@Override
- public Builder fromApp(ApplicationId appId) {
+ public NextObjective.Builder fromApp(ApplicationId appId) {
this.appId = appId;
return this;
}
@@ -160,14 +179,49 @@
}
@Override
- public NextObjective build() {
+ public NextObjective add() {
List<TrafficTreatment> treatments = listBuilder.build();
checkNotNull(appId, "Must supply an application id");
checkNotNull(id, "id cannot be null");
checkNotNull(type, "The type cannot be null");
checkArgument(!treatments.isEmpty(), "Must have at least one treatment");
- return new DefaultNextObjective(id, treatments, appId, type);
+ return new DefaultNextObjective(id, treatments, appId, type, Operation.ADD);
+ }
+
+ @Override
+ public NextObjective remove() {
+ List<TrafficTreatment> treatments = listBuilder.build();
+ checkNotNull(appId, "Must supply an application id");
+ checkNotNull(id, "id cannot be null");
+ checkNotNull(type, "The type cannot be null");
+ checkArgument(!treatments.isEmpty(), "Must have at least one treatment");
+
+ return new DefaultNextObjective(id, treatments, appId, type, Operation.REMOVE);
+ }
+
+ @Override
+ public NextObjective add(ObjectiveContext context) {
+ List<TrafficTreatment> treatments = listBuilder.build();
+ checkNotNull(appId, "Must supply an application id");
+ checkNotNull(id, "id cannot be null");
+ checkNotNull(type, "The type cannot be null");
+ checkArgument(!treatments.isEmpty(), "Must have at least one treatment");
+
+ return new DefaultNextObjective(id, treatments, appId,
+ context, type, Operation.ADD);
+ }
+
+ @Override
+ public NextObjective remove(ObjectiveContext context) {
+ List<TrafficTreatment> treatments = listBuilder.build();
+ checkNotNull(appId, "Must supply an application id");
+ checkNotNull(id, "id cannot be null");
+ checkNotNull(type, "The type cannot be null");
+ checkArgument(!treatments.isEmpty(), "Must have at least one treatment");
+
+ return new DefaultNextObjective(id, treatments, appId,
+ context, type, Operation.REMOVE);
}
}
}