Fixed traffic selector builder to allow only one criterion.
Temporarily disabled flow rule time-out.
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java
index d792c7e..31c53a8 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java
@@ -1,36 +1,43 @@
package org.onlab.onos.net.flow;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Objects;
-import java.util.Set;
-
+import com.google.common.collect.ImmutableSet;
import org.onlab.onos.net.PortNumber;
import org.onlab.onos.net.flow.criteria.Criteria;
import org.onlab.onos.net.flow.criteria.Criterion;
import org.onlab.packet.IpPrefix;
import org.onlab.packet.MacAddress;
import org.onlab.packet.VlanId;
-import org.slf4j.Logger;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Default traffic selector implementation.
+ */
public final class DefaultTrafficSelector implements TrafficSelector {
- private final Set<Criterion> selector;
+ private final Set<Criterion> criteria;
- private DefaultTrafficSelector(Set<Criterion> selector) {
- this.selector = Collections.unmodifiableSet(selector);
+ /**
+ * Creates a new traffic selector with the specified criteria.
+ *
+ * @param criteria criteria
+ */
+ private DefaultTrafficSelector(Set<Criterion> criteria) {
+ this.criteria = Collections.unmodifiableSet(criteria);
}
@Override
public Set<Criterion> criteria() {
- return selector;
+ return criteria;
}
@Override
public int hashCode() {
- return Objects.hash(selector);
+ return Objects.hash(criteria);
}
@Override
@@ -40,23 +47,50 @@
}
if (obj instanceof DefaultTrafficSelector) {
DefaultTrafficSelector that = (DefaultTrafficSelector) obj;
- return Objects.equals(selector, that.selector);
+ return Objects.equals(criteria, that.criteria);
}
return false;
}
+ /**
+ * Returns a new traffic selector builder.
+ *
+ * @return traffic selector builder
+ */
+ public static TrafficSelector.Builder builder() {
+ return new Builder();
+ }
+ /**
+ * Returns a new traffic selector builder primed to produce entities
+ * patterned after the supplied selector.
+ *
+ * @return traffic selector builder
+ */
+ public static TrafficSelector.Builder builder(TrafficSelector selector) {
+ return new Builder(selector);
+ }
- public static class Builder implements TrafficSelector.Builder {
+ /**
+ * Builder of traffic selector entities.
+ */
+ public static final class Builder implements TrafficSelector.Builder {
- private final Logger log = getLogger(getClass());
+ private final Map<Criterion.Type, Criterion> selector = new HashMap<>();
- private final Set<Criterion> selector = new HashSet<>();
+ private Builder() {
+ }
+
+ private Builder(TrafficSelector selector) {
+ for (Criterion c : selector.criteria()) {
+ add(c);
+ }
+ }
@Override
public Builder add(Criterion criterion) {
- selector.add(criterion);
+ selector.put(criterion.type(), criterion);
return this;
}
@@ -107,7 +141,7 @@
@Override
public TrafficSelector build() {
- return new DefaultTrafficSelector(selector);
+ return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values()));
}
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficTreatment.java b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficTreatment.java
index 2ce233f..3f43598 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficTreatment.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficTreatment.java
@@ -1,11 +1,5 @@
package org.onlab.onos.net.flow;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
import org.onlab.onos.net.PortNumber;
import org.onlab.onos.net.flow.instructions.Instruction;
import org.onlab.onos.net.flow.instructions.Instructions;
@@ -14,10 +8,24 @@
import org.onlab.packet.VlanId;
import org.slf4j.Logger;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Default traffic treatment implementation.
+ */
public final class DefaultTrafficTreatment implements TrafficTreatment {
private final List<Instruction> instructions;
+ /**
+ * Creates a new traffic treatment from the specified list of instructions.
+ *
+ * @param instructions treatment instructions
+ */
private DefaultTrafficTreatment(List<Instruction> instructions) {
this.instructions = Collections.unmodifiableList(instructions);
}
@@ -28,12 +36,19 @@
}
/**
+ * Returns a new traffic treatment builder.
+ *
+ * @return traffic treatment builder
+ */
+ public static TrafficTreatment.Builder builder() {
+ return new Builder();
+ }
+
+ /**
* Builds a list of treatments following the following order.
* Modifications -> Group -> Output (including drop)
- *
*/
-
- public static class Builder implements TrafficTreatment.Builder {
+ public static final class Builder implements TrafficTreatment.Builder {
private final Logger log = getLogger(getClass());
@@ -47,27 +62,31 @@
// TODO: should be a list of instructions based on modification objects
List<Instruction> modifications = new LinkedList<>();
+ // Creates a new builder
+ private Builder() {
+ }
+
public Builder add(Instruction instruction) {
if (drop) {
return this;
}
switch (instruction.type()) {
- case DROP:
- drop = true;
- break;
- case OUTPUT:
- outputs.add(instruction);
- break;
- case L2MODIFICATION:
- case L3MODIFICATION:
- // TODO: enforce modification order if any
- modifications.add(instruction);
- break;
- case GROUP:
- groups.add(instruction);
- break;
- default:
- log.warn("Unknown instruction type {}", instruction.type());
+ case DROP:
+ drop = true;
+ break;
+ case OUTPUT:
+ outputs.add(instruction);
+ break;
+ case L2MODIFICATION:
+ case L3MODIFICATION:
+ // TODO: enforce modification order if any
+ modifications.add(instruction);
+ break;
+ case GROUP:
+ groups.add(instruction);
+ break;
+ default:
+ log.warn("Unknown instruction type {}", instruction.type());
}
return this;
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultPacketContext.java b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultPacketContext.java
index 6f1b708..75100c6 100644
--- a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultPacketContext.java
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultPacketContext.java
@@ -24,7 +24,7 @@
this.inPkt = inPkt;
this.outPkt = outPkt;
this.block = new AtomicBoolean(block);
- this.builder = new DefaultTrafficTreatment.Builder();
+ this.builder = DefaultTrafficTreatment.builder();
}
@Override
diff --git a/core/api/src/test/java/org/onlab/onos/net/intent/ConnectivityIntentTest.java b/core/api/src/test/java/org/onlab/onos/net/intent/ConnectivityIntentTest.java
index fb1efee..10a0069 100644
--- a/core/api/src/test/java/org/onlab/onos/net/intent/ConnectivityIntentTest.java
+++ b/core/api/src/test/java/org/onlab/onos/net/intent/ConnectivityIntentTest.java
@@ -16,8 +16,8 @@
public abstract class ConnectivityIntentTest extends IntentTest {
public static final IntentId IID = new IntentId(123);
- public static final TrafficSelector MATCH = (new DefaultTrafficSelector.Builder()).build();
- public static final TrafficTreatment NOP = (new DefaultTrafficTreatment.Builder()).build();
+ public static final TrafficSelector MATCH = DefaultTrafficSelector.builder().build();
+ public static final TrafficTreatment NOP = DefaultTrafficTreatment.builder().build();
public static final ConnectPoint P1 = new ConnectPoint(DeviceId.deviceId("111"), PortNumber.portNumber(0x1));
public static final ConnectPoint P2 = new ConnectPoint(DeviceId.deviceId("222"), PortNumber.portNumber(0x2));