tom

Reworked intent states to the new set of states.

Separate intent state from intent event type.
Implemented new state transitions in IntentManager.
Implemented ObjectiveTracker.
Re-route now works.
Showing 28 changed files with 431 additions and 369 deletions
...@@ -24,7 +24,7 @@ public class IntentIdCompleter implements Completer { ...@@ -24,7 +24,7 @@ public class IntentIdCompleter implements Completer {
24 Iterator<Intent> it = service.getIntents().iterator(); 24 Iterator<Intent> it = service.getIntents().iterator();
25 SortedSet<String> strings = delegate.getStrings(); 25 SortedSet<String> strings = delegate.getStrings();
26 while (it.hasNext()) { 26 while (it.hasNext()) {
27 - strings.add(it.next().getId().toString()); 27 + strings.add(it.next().id().toString());
28 } 28 }
29 29
30 // Now let the completer do the work for figuring out what to offer. 30 // Now let the completer do the work for figuring out what to offer.
......
...@@ -17,8 +17,8 @@ public class IntentsListCommand extends AbstractShellCommand { ...@@ -17,8 +17,8 @@ public class IntentsListCommand extends AbstractShellCommand {
17 protected void execute() { 17 protected void execute() {
18 IntentService service = get(IntentService.class); 18 IntentService service = get(IntentService.class);
19 for (Intent intent : service.getIntents()) { 19 for (Intent intent : service.getIntents()) {
20 - IntentState state = service.getIntentState(intent.getId()); 20 + IntentState state = service.getIntentState(intent.id());
21 - print("%s %s %s", intent.getId(), state, intent); 21 + print("%s %s %s", intent.id(), state, intent);
22 } 22 }
23 } 23 }
24 24
......
...@@ -34,7 +34,7 @@ public class WipeOutCommand extends ClustersListCommand { ...@@ -34,7 +34,7 @@ public class WipeOutCommand extends ClustersListCommand {
34 34
35 IntentService intentService = get(IntentService.class); 35 IntentService intentService = get(IntentService.class);
36 for (Intent intent : intentService.getIntents()) { 36 for (Intent intent : intentService.getIntents()) {
37 - if (intentService.getIntentState(intent.getId()) == IntentState.INSTALLED) { 37 + if (intentService.getIntentState(intent.id()) == IntentState.INSTALLED) {
38 intentService.withdraw(intent); 38 intentService.withdraw(intent);
39 } 39 }
40 } 40 }
......
...@@ -24,7 +24,7 @@ public abstract class AbstractIntent implements Intent { ...@@ -24,7 +24,7 @@ public abstract class AbstractIntent implements Intent {
24 } 24 }
25 25
26 @Override 26 @Override
27 - public IntentId getId() { 27 + public IntentId id() {
28 return id; 28 return id;
29 } 29 }
30 30
......
...@@ -53,7 +53,7 @@ public abstract class ConnectivityIntent extends AbstractIntent { ...@@ -53,7 +53,7 @@ public abstract class ConnectivityIntent extends AbstractIntent {
53 * 53 *
54 * @return traffic match 54 * @return traffic match
55 */ 55 */
56 - public TrafficSelector getTrafficSelector() { 56 + public TrafficSelector selector() {
57 return selector; 57 return selector;
58 } 58 }
59 59
...@@ -62,7 +62,7 @@ public abstract class ConnectivityIntent extends AbstractIntent { ...@@ -62,7 +62,7 @@ public abstract class ConnectivityIntent extends AbstractIntent {
62 * 62 *
63 * @return applied action 63 * @return applied action
64 */ 64 */
65 - public TrafficTreatment getTrafficTreatment() { 65 + public TrafficTreatment treatment() {
66 return treatment; 66 return treatment;
67 } 67 }
68 68
......
...@@ -80,9 +80,9 @@ public class HostToHostIntent extends ConnectivityIntent { ...@@ -80,9 +80,9 @@ public class HostToHostIntent extends ConnectivityIntent {
80 @Override 80 @Override
81 public String toString() { 81 public String toString() {
82 return MoreObjects.toStringHelper(getClass()) 82 return MoreObjects.toStringHelper(getClass())
83 - .add("id", getId()) 83 + .add("id", id())
84 - .add("selector", getTrafficSelector()) 84 + .add("selector", selector())
85 - .add("treatment", getTrafficTreatment()) 85 + .add("treatment", treatment())
86 .add("one", one) 86 .add("one", one)
87 .add("two", two) 87 .add("two", two)
88 .toString(); 88 .toString();
......
...@@ -11,5 +11,5 @@ public interface Intent extends BatchOperationTarget { ...@@ -11,5 +11,5 @@ public interface Intent extends BatchOperationTarget {
11 * 11 *
12 * @return intent identifier 12 * @return intent identifier
13 */ 13 */
14 - IntentId getId(); 14 + IntentId id();
15 } 15 }
......
1 package org.onlab.onos.net.intent; 1 package org.onlab.onos.net.intent;
2 2
3 -import com.google.common.base.MoreObjects;
4 import org.onlab.onos.event.AbstractEvent; 3 import org.onlab.onos.event.AbstractEvent;
5 4
6 -import java.util.Objects;
7 -
8 -import static com.google.common.base.Preconditions.checkNotNull;
9 -
10 /** 5 /**
11 * A class to represent an intent related event. 6 * A class to represent an intent related event.
12 */ 7 */
13 -public class IntentEvent extends AbstractEvent<IntentState, Intent> { 8 +public class IntentEvent extends AbstractEvent<IntentEvent.Type, Intent> {
14 -
15 - // TODO: determine a suitable parent class; if one does not exist, consider
16 - // introducing one
17 9
18 - private final long time; 10 + public enum Type {
19 - private final Intent intent; 11 + /**
20 - private final IntentState state; 12 + * Signifies that a new intent has been submitted to the system.
21 - private final IntentState previous; 13 + */
14 + SUBMITTED,
22 15
23 /** 16 /**
24 - * Creates an event describing a state change of an intent. 17 + * Signifies that an intent has been successfully installed.
25 - *
26 - * @param intent subject intent
27 - * @param state new intent state
28 - * @param previous previous intent state
29 - * @param time time the event created in milliseconds since start of epoch
30 - * @throws NullPointerException if the intent or state is null
31 */ 18 */
32 - public IntentEvent(Intent intent, IntentState state, IntentState previous, long time) { 19 + INSTALLED,
33 - super(state, intent);
34 - this.intent = checkNotNull(intent);
35 - this.state = checkNotNull(state);
36 - this.previous = previous;
37 - this.time = time;
38 - }
39 20
40 /** 21 /**
41 - * Returns the state of the intent which caused the event. 22 + * Signifies that an intent has failed compilation or installation.
42 - *
43 - * @return the state of the intent
44 */ 23 */
45 - public IntentState getState() { 24 + FAILED,
46 - return state;
47 - }
48 25
49 /** 26 /**
50 - * Returns the previous state of the intent which caused the event. 27 + * Signifies that an intent has been withdrawn from the system.
51 - *
52 - * @return the previous state of the intent
53 */ 28 */
54 - public IntentState getPreviousState() { 29 + WITHDRAWN
55 - return previous;
56 } 30 }
57 31
58 /** 32 /**
59 - * Returns the intent associated with the event. 33 + * Creates an event of a given type and for the specified intent and the
34 + * current time.
60 * 35 *
61 - * @return the intent 36 + * @param type event type
37 + * @param intent subject intent
38 + * @param time time the event created in milliseconds since start of epoch
62 */ 39 */
63 - public Intent getIntent() { 40 + public IntentEvent(Type type, Intent intent, long time) {
64 - return intent; 41 + super(type, intent, time);
65 } 42 }
66 43
67 /** 44 /**
68 - * Returns the time at which the event was created. 45 + * Creates an event of a given type and for the specified intent and the
46 + * current time.
69 * 47 *
70 - * @return the time in milliseconds since start of epoch 48 + * @param type event type
49 + * @param intent subject intent
71 */ 50 */
72 - public long getTime() { 51 + public IntentEvent(Type type, Intent intent) {
73 - return time; 52 + super(type, intent);
74 - }
75 -
76 - @Override
77 - public boolean equals(Object o) {
78 - if (this == o) {
79 - return true;
80 - }
81 - if (o == null || getClass() != o.getClass()) {
82 - return false;
83 } 53 }
84 54
85 - IntentEvent that = (IntentEvent) o;
86 - return Objects.equals(this.intent, that.intent)
87 - && Objects.equals(this.state, that.state)
88 - && Objects.equals(this.previous, that.previous)
89 - && Objects.equals(this.time, that.time);
90 - }
91 -
92 - @Override
93 - public int hashCode() {
94 - return Objects.hash(intent, state, previous, time);
95 - }
96 -
97 - @Override
98 - public String toString() {
99 - return MoreObjects.toStringHelper(getClass())
100 - .add("intent", intent)
101 - .add("state", state)
102 - .add("previous", previous)
103 - .add("time", time)
104 - .toString();
105 - }
106 } 55 }
......
1 package org.onlab.onos.net.intent; 1 package org.onlab.onos.net.intent;
2 2
3 /** 3 /**
4 - * This class represents the states of an intent. 4 + * Representation of the phases an intent may attain during its lifecycle.
5 - *
6 - * <p>
7 - * Note: The state is expressed as enum, but there is possibility
8 - * in the future that we define specific class instead of enum to improve
9 - * the extensibility of state definition.
10 - * </p>
11 */ 5 */
12 public enum IntentState { 6 public enum IntentState {
13 - // FIXME: requires discussion on State vs. EventType and a solid state-transition diagram 7 +
14 - // TODO: consider the impact of conflict detection
15 - // TODO: consider the impact that external events affect an installed intent
16 /** 8 /**
17 - * The beginning state. 9 + * Signifies that the intent has been submitted and will start compiling
18 - * 10 + * shortly. However, this compilation may not necessarily occur on the
11 + * local controller instance.
12 + * <p/>
19 * All intent in the runtime take this state first. 13 * All intent in the runtime take this state first.
20 */ 14 */
21 SUBMITTED, 15 SUBMITTED,
22 16
23 /** 17 /**
24 - * The intent compilation has been completed. 18 + * Signifies that the intent is being compiled into installable intents.
25 - * 19 + * This is a transitional state after which the intent will enter either
26 - * An intent translation graph (tree) is completely created. 20 + * {@link #FAILED} state or {@link #INSTALLING} state.
27 - * Leaves of the graph are installable intent type. 21 + */
22 + COMPILING,
23 +
24 + /**
25 + * Signifies that the resulting installable intents are being installed
26 + * into the network environment. This is a transitional state after which
27 + * the intent will enter either {@link #INSTALLED} state or
28 + * {@link #RECOMPILING} state.
28 */ 29 */
29 - COMPILED, 30 + INSTALLING,
30 31
31 /** 32 /**
32 - * The intent has been successfully installed. 33 + * The intent has been successfully installed. This is a state where the
34 + * intent may remain parked until it is withdrawn by the application or
35 + * until the network environment changes in some way to make the original
36 + * set of installable intents untenable.
33 */ 37 */
34 INSTALLED, 38 INSTALLED,
35 39
36 /** 40 /**
37 - * The intent is being withdrawn. 41 + * Signifies that the intent is being recompiled into installable intents
38 - * 42 + * as an attempt to adapt to an anomaly in the network environment.
39 - * When {@link IntentService#withdraw(Intent)} is called, 43 + * This is a transitional state after which the intent will enter either
40 - * the intent takes this state first. 44 + * {@link #FAILED} state or {@link #INSTALLING} state.
45 + * <p/>
46 + * Exit to the {@link #FAILED} state may be caused by failure to compile
47 + * or by compiling into the same set of installable intents which have
48 + * previously failed to be installed.
49 + */
50 + RECOMPILING,
51 +
52 + /**
53 + * Indicates that the intent is being withdrawn. This is a transitional
54 + * state, triggered by invocation of the
55 + * {@link IntentService#withdraw(Intent)} but one with only one outcome,
56 + * which is the the intent being placed in the {@link #WITHDRAWN} state.
41 */ 57 */
42 WITHDRAWING, 58 WITHDRAWING,
43 59
44 /** 60 /**
45 - * The intent has been successfully withdrawn. 61 + * Indicates that the intent has been successfully withdrawn.
46 */ 62 */
47 WITHDRAWN, 63 WITHDRAWN,
48 64
49 /** 65 /**
50 - * The intent has failed to be compiled, installed, or withdrawn. 66 + * Signifies that the intent has failed compiling, installing or
51 - * 67 + * recompiling states.
52 - * When the intent failed to be withdrawn, it is still, at least partially installed.
53 */ 68 */
54 - FAILED, 69 + FAILED
55 } 70 }
......
...@@ -10,10 +10,16 @@ import java.util.List; ...@@ -10,10 +10,16 @@ import java.util.List;
10 public interface IntentStore extends Store<IntentEvent, IntentStoreDelegate> { 10 public interface IntentStore extends Store<IntentEvent, IntentStoreDelegate> {
11 11
12 /** 12 /**
13 - * Creates a new intent. 13 + * Submits a new intent into the store. If the returned event is not
14 + * null, the manager is expected to dispatch the event and then to kick
15 + * off intent compilation process. Otherwise, another node has been elected
16 + * to perform the compilation process and the node will learn about
17 + * the submittal and results of the intent compilation via the delegate
18 + * mechanism.
14 * 19 *
15 - * @param intent intent 20 + * @param intent intent to be submitted
16 - * @return appropriate event or null if no change resulted 21 + * @return event indicating the intent was submitted or null if no
22 + * change resulted, e.g. duplicate intent
17 */ 23 */
18 IntentEvent createIntent(Intent intent); 24 IntentEvent createIntent(Intent intent);
19 25
...@@ -68,9 +74,8 @@ public interface IntentStore extends Store<IntentEvent, IntentStoreDelegate> { ...@@ -68,9 +74,8 @@ public interface IntentStore extends Store<IntentEvent, IntentStoreDelegate> {
68 * 74 *
69 * @param intentId original intent identifier 75 * @param intentId original intent identifier
70 * @param installableIntents compiled installable intents 76 * @param installableIntents compiled installable intents
71 - * @return compiled state transition event
72 */ 77 */
73 - IntentEvent addInstallableIntents(IntentId intentId, 78 + void addInstallableIntents(IntentId intentId,
74 List<InstallableIntent> installableIntents); 79 List<InstallableIntent> installableIntents);
75 80
76 /** 81 /**
......
1 package org.onlab.onos.net.intent; 1 package org.onlab.onos.net.intent;
2 2
3 -import static com.google.common.base.Preconditions.checkArgument; 3 +import com.google.common.base.MoreObjects;
4 -import static com.google.common.base.Preconditions.checkNotNull; 4 +import com.google.common.collect.Sets;
5 -
6 -import java.util.Objects;
7 -import java.util.Set;
8 -
9 import org.onlab.onos.net.ConnectPoint; 5 import org.onlab.onos.net.ConnectPoint;
10 import org.onlab.onos.net.flow.TrafficSelector; 6 import org.onlab.onos.net.flow.TrafficSelector;
11 import org.onlab.onos.net.flow.TrafficTreatment; 7 import org.onlab.onos.net.flow.TrafficTreatment;
12 8
13 -import com.google.common.base.MoreObjects; 9 +import java.util.Objects;
14 -import com.google.common.collect.Sets; 10 +import java.util.Set;
11 +
12 +import static com.google.common.base.Preconditions.checkArgument;
13 +import static com.google.common.base.Preconditions.checkNotNull;
15 14
16 /** 15 /**
17 * Abstraction of multiple source to single destination connectivity intent. 16 * Abstraction of multiple source to single destination connectivity intent.
18 */ 17 */
19 public class MultiPointToSinglePointIntent extends ConnectivityIntent { 18 public class MultiPointToSinglePointIntent extends ConnectivityIntent {
20 19
21 - private final Set<ConnectPoint> ingressPorts; 20 + private final Set<ConnectPoint> ingressPoints;
22 - private final ConnectPoint egressPort; 21 + private final ConnectPoint egressPoint;
23 22
24 /** 23 /**
25 * Creates a new multi-to-single point connectivity intent for the specified 24 * Creates a new multi-to-single point connectivity intent for the specified
...@@ -28,25 +27,25 @@ public class MultiPointToSinglePointIntent extends ConnectivityIntent { ...@@ -28,25 +27,25 @@ public class MultiPointToSinglePointIntent extends ConnectivityIntent {
28 * @param id intent identifier 27 * @param id intent identifier
29 * @param match traffic match 28 * @param match traffic match
30 * @param action action 29 * @param action action
31 - * @param ingressPorts set of ports from which ingress traffic originates 30 + * @param ingressPoints set of ports from which ingress traffic originates
32 - * @param egressPort port to which traffic will egress 31 + * @param egressPoint port to which traffic will egress
33 - * @throws NullPointerException if {@code ingressPorts} or 32 + * @throws NullPointerException if {@code ingressPoints} or
34 - * {@code egressPort} is null. 33 + * {@code egressPoint} is null.
35 - * @throws IllegalArgumentException if the size of {@code ingressPorts} is 34 + * @throws IllegalArgumentException if the size of {@code ingressPoints} is
36 * not more than 1 35 * not more than 1
37 */ 36 */
38 public MultiPointToSinglePointIntent(IntentId id, TrafficSelector match, 37 public MultiPointToSinglePointIntent(IntentId id, TrafficSelector match,
39 TrafficTreatment action, 38 TrafficTreatment action,
40 - Set<ConnectPoint> ingressPorts, 39 + Set<ConnectPoint> ingressPoints,
41 - ConnectPoint egressPort) { 40 + ConnectPoint egressPoint) {
42 super(id, match, action); 41 super(id, match, action);
43 42
44 - checkNotNull(ingressPorts); 43 + checkNotNull(ingressPoints);
45 - checkArgument(!ingressPorts.isEmpty(), 44 + checkArgument(!ingressPoints.isEmpty(),
46 "there should be at least one ingress port"); 45 "there should be at least one ingress port");
47 46
48 - this.ingressPorts = Sets.newHashSet(ingressPorts); 47 + this.ingressPoints = Sets.newHashSet(ingressPoints);
49 - this.egressPort = checkNotNull(egressPort); 48 + this.egressPoint = checkNotNull(egressPoint);
50 } 49 }
51 50
52 /** 51 /**
...@@ -54,8 +53,8 @@ public class MultiPointToSinglePointIntent extends ConnectivityIntent { ...@@ -54,8 +53,8 @@ public class MultiPointToSinglePointIntent extends ConnectivityIntent {
54 */ 53 */
55 protected MultiPointToSinglePointIntent() { 54 protected MultiPointToSinglePointIntent() {
56 super(); 55 super();
57 - this.ingressPorts = null; 56 + this.ingressPoints = null;
58 - this.egressPort = null; 57 + this.egressPoint = null;
59 } 58 }
60 59
61 /** 60 /**
...@@ -64,8 +63,8 @@ public class MultiPointToSinglePointIntent extends ConnectivityIntent { ...@@ -64,8 +63,8 @@ public class MultiPointToSinglePointIntent extends ConnectivityIntent {
64 * 63 *
65 * @return set of ingress ports 64 * @return set of ingress ports
66 */ 65 */
67 - public Set<ConnectPoint> getIngressPorts() { 66 + public Set<ConnectPoint> ingressPoints() {
68 - return ingressPorts; 67 + return ingressPoints;
69 } 68 }
70 69
71 /** 70 /**
...@@ -73,8 +72,8 @@ public class MultiPointToSinglePointIntent extends ConnectivityIntent { ...@@ -73,8 +72,8 @@ public class MultiPointToSinglePointIntent extends ConnectivityIntent {
73 * 72 *
74 * @return egress port 73 * @return egress port
75 */ 74 */
76 - public ConnectPoint getEgressPort() { 75 + public ConnectPoint egressPoint() {
77 - return egressPort; 76 + return egressPoint;
78 } 77 }
79 78
80 @Override 79 @Override
...@@ -90,23 +89,23 @@ public class MultiPointToSinglePointIntent extends ConnectivityIntent { ...@@ -90,23 +89,23 @@ public class MultiPointToSinglePointIntent extends ConnectivityIntent {
90 } 89 }
91 90
92 MultiPointToSinglePointIntent that = (MultiPointToSinglePointIntent) o; 91 MultiPointToSinglePointIntent that = (MultiPointToSinglePointIntent) o;
93 - return Objects.equals(this.ingressPorts, that.ingressPorts) 92 + return Objects.equals(this.ingressPoints, that.ingressPoints)
94 - && Objects.equals(this.egressPort, that.egressPort); 93 + && Objects.equals(this.egressPoint, that.egressPoint);
95 } 94 }
96 95
97 @Override 96 @Override
98 public int hashCode() { 97 public int hashCode() {
99 - return Objects.hash(super.hashCode(), ingressPorts, egressPort); 98 + return Objects.hash(super.hashCode(), ingressPoints, egressPoint);
100 } 99 }
101 100
102 @Override 101 @Override
103 public String toString() { 102 public String toString() {
104 return MoreObjects.toStringHelper(getClass()) 103 return MoreObjects.toStringHelper(getClass())
105 - .add("id", getId()) 104 + .add("id", id())
106 - .add("match", getTrafficSelector()) 105 + .add("match", selector())
107 - .add("action", getTrafficTreatment()) 106 + .add("action", treatment())
108 - .add("ingressPorts", getIngressPorts()) 107 + .add("ingressPoints", ingressPoints())
109 - .add("egressPort", getEgressPort()) 108 + .add("egressPoint", egressPoint())
110 .toString(); 109 .toString();
111 } 110 }
112 } 111 }
......
...@@ -46,7 +46,7 @@ public class PathIntent extends PointToPointIntent implements InstallableIntent ...@@ -46,7 +46,7 @@ public class PathIntent extends PointToPointIntent implements InstallableIntent
46 * 46 *
47 * @return traversed links 47 * @return traversed links
48 */ 48 */
49 - public Path getPath() { 49 + public Path path() {
50 return path; 50 return path;
51 } 51 }
52 52
...@@ -79,11 +79,11 @@ public class PathIntent extends PointToPointIntent implements InstallableIntent ...@@ -79,11 +79,11 @@ public class PathIntent extends PointToPointIntent implements InstallableIntent
79 @Override 79 @Override
80 public String toString() { 80 public String toString() {
81 return MoreObjects.toStringHelper(getClass()) 81 return MoreObjects.toStringHelper(getClass())
82 - .add("id", getId()) 82 + .add("id", id())
83 - .add("match", getTrafficSelector()) 83 + .add("match", selector())
84 - .add("action", getTrafficTreatment()) 84 + .add("action", treatment())
85 - .add("ingressPort", getIngressPort()) 85 + .add("ingressPort", ingressPoint())
86 - .add("egressPort", getEgressPort()) 86 + .add("egressPort", egressPoint())
87 .add("path", path) 87 .add("path", path)
88 .toString(); 88 .toString();
89 } 89 }
......
...@@ -14,8 +14,8 @@ import static com.google.common.base.Preconditions.checkNotNull; ...@@ -14,8 +14,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
14 */ 14 */
15 public class PointToPointIntent extends ConnectivityIntent { 15 public class PointToPointIntent extends ConnectivityIntent {
16 16
17 - private final ConnectPoint ingressPort; 17 + private final ConnectPoint ingressPoint;
18 - private final ConnectPoint egressPort; 18 + private final ConnectPoint egressPoint;
19 19
20 /** 20 /**
21 * Creates a new point-to-point intent with the supplied ingress/egress 21 * Creates a new point-to-point intent with the supplied ingress/egress
...@@ -24,17 +24,17 @@ public class PointToPointIntent extends ConnectivityIntent { ...@@ -24,17 +24,17 @@ public class PointToPointIntent extends ConnectivityIntent {
24 * @param id intent identifier 24 * @param id intent identifier
25 * @param selector traffic selector 25 * @param selector traffic selector
26 * @param treatment treatment 26 * @param treatment treatment
27 - * @param ingressPort ingress port 27 + * @param ingressPoint ingress port
28 - * @param egressPort egress port 28 + * @param egressPoint egress port
29 - * @throws NullPointerException if {@code ingressPort} or {@code egressPort} is null. 29 + * @throws NullPointerException if {@code ingressPoint} or {@code egressPoints} is null.
30 */ 30 */
31 public PointToPointIntent(IntentId id, TrafficSelector selector, 31 public PointToPointIntent(IntentId id, TrafficSelector selector,
32 TrafficTreatment treatment, 32 TrafficTreatment treatment,
33 - ConnectPoint ingressPort, 33 + ConnectPoint ingressPoint,
34 - ConnectPoint egressPort) { 34 + ConnectPoint egressPoint) {
35 super(id, selector, treatment); 35 super(id, selector, treatment);
36 - this.ingressPort = checkNotNull(ingressPort); 36 + this.ingressPoint = checkNotNull(ingressPoint);
37 - this.egressPort = checkNotNull(egressPort); 37 + this.egressPoint = checkNotNull(egressPoint);
38 } 38 }
39 39
40 /** 40 /**
...@@ -42,8 +42,8 @@ public class PointToPointIntent extends ConnectivityIntent { ...@@ -42,8 +42,8 @@ public class PointToPointIntent extends ConnectivityIntent {
42 */ 42 */
43 protected PointToPointIntent() { 43 protected PointToPointIntent() {
44 super(); 44 super();
45 - this.ingressPort = null; 45 + this.ingressPoint = null;
46 - this.egressPort = null; 46 + this.egressPoint = null;
47 } 47 }
48 48
49 /** 49 /**
...@@ -52,8 +52,8 @@ public class PointToPointIntent extends ConnectivityIntent { ...@@ -52,8 +52,8 @@ public class PointToPointIntent extends ConnectivityIntent {
52 * 52 *
53 * @return ingress port 53 * @return ingress port
54 */ 54 */
55 - public ConnectPoint getIngressPort() { 55 + public ConnectPoint ingressPoint() {
56 - return ingressPort; 56 + return ingressPoint;
57 } 57 }
58 58
59 /** 59 /**
...@@ -61,8 +61,8 @@ public class PointToPointIntent extends ConnectivityIntent { ...@@ -61,8 +61,8 @@ public class PointToPointIntent extends ConnectivityIntent {
61 * 61 *
62 * @return egress port 62 * @return egress port
63 */ 63 */
64 - public ConnectPoint getEgressPort() { 64 + public ConnectPoint egressPoint() {
65 - return egressPort; 65 + return egressPoint;
66 } 66 }
67 67
68 @Override 68 @Override
...@@ -78,23 +78,23 @@ public class PointToPointIntent extends ConnectivityIntent { ...@@ -78,23 +78,23 @@ public class PointToPointIntent extends ConnectivityIntent {
78 } 78 }
79 79
80 PointToPointIntent that = (PointToPointIntent) o; 80 PointToPointIntent that = (PointToPointIntent) o;
81 - return Objects.equals(this.ingressPort, that.ingressPort) 81 + return Objects.equals(this.ingressPoint, that.ingressPoint)
82 - && Objects.equals(this.egressPort, that.egressPort); 82 + && Objects.equals(this.egressPoint, that.egressPoint);
83 } 83 }
84 84
85 @Override 85 @Override
86 public int hashCode() { 86 public int hashCode() {
87 - return Objects.hash(super.hashCode(), ingressPort, egressPort); 87 + return Objects.hash(super.hashCode(), ingressPoint, egressPoint);
88 } 88 }
89 89
90 @Override 90 @Override
91 public String toString() { 91 public String toString() {
92 return MoreObjects.toStringHelper(getClass()) 92 return MoreObjects.toStringHelper(getClass())
93 - .add("id", getId()) 93 + .add("id", id())
94 - .add("match", getTrafficSelector()) 94 + .add("match", selector())
95 - .add("action", getTrafficTreatment()) 95 + .add("action", treatment())
96 - .add("ingressPort", ingressPort) 96 + .add("ingressPoint", ingressPoint)
97 - .add("egressPort", egressPort) 97 + .add("egressPoints", egressPoint)
98 .toString(); 98 .toString();
99 } 99 }
100 100
......
...@@ -17,8 +17,8 @@ import static com.google.common.base.Preconditions.checkNotNull; ...@@ -17,8 +17,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
17 */ 17 */
18 public class SinglePointToMultiPointIntent extends ConnectivityIntent { 18 public class SinglePointToMultiPointIntent extends ConnectivityIntent {
19 19
20 - private final ConnectPoint ingressPort; 20 + private final ConnectPoint ingressPoint;
21 - private final Set<ConnectPoint> egressPorts; 21 + private final Set<ConnectPoint> egressPoints;
22 22
23 /** 23 /**
24 * Creates a new single-to-multi point connectivity intent. 24 * Creates a new single-to-multi point connectivity intent.
...@@ -26,25 +26,25 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent { ...@@ -26,25 +26,25 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent {
26 * @param id intent identifier 26 * @param id intent identifier
27 * @param selector traffic selector 27 * @param selector traffic selector
28 * @param treatment treatment 28 * @param treatment treatment
29 - * @param ingressPort port on which traffic will ingress 29 + * @param ingressPoint port on which traffic will ingress
30 - * @param egressPorts set of ports on which traffic will egress 30 + * @param egressPoints set of ports on which traffic will egress
31 - * @throws NullPointerException if {@code ingressPort} or 31 + * @throws NullPointerException if {@code ingressPoint} or
32 - * {@code egressPorts} is null 32 + * {@code egressPoints} is null
33 - * @throws IllegalArgumentException if the size of {@code egressPorts} is 33 + * @throws IllegalArgumentException if the size of {@code egressPoints} is
34 * not more than 1 34 * not more than 1
35 */ 35 */
36 public SinglePointToMultiPointIntent(IntentId id, TrafficSelector selector, 36 public SinglePointToMultiPointIntent(IntentId id, TrafficSelector selector,
37 TrafficTreatment treatment, 37 TrafficTreatment treatment,
38 - ConnectPoint ingressPort, 38 + ConnectPoint ingressPoint,
39 - Set<ConnectPoint> egressPorts) { 39 + Set<ConnectPoint> egressPoints) {
40 super(id, selector, treatment); 40 super(id, selector, treatment);
41 41
42 - checkNotNull(egressPorts); 42 + checkNotNull(egressPoints);
43 - checkArgument(!egressPorts.isEmpty(), 43 + checkArgument(!egressPoints.isEmpty(),
44 "there should be at least one egress port"); 44 "there should be at least one egress port");
45 45
46 - this.ingressPort = checkNotNull(ingressPort); 46 + this.ingressPoint = checkNotNull(ingressPoint);
47 - this.egressPorts = Sets.newHashSet(egressPorts); 47 + this.egressPoints = Sets.newHashSet(egressPoints);
48 } 48 }
49 49
50 /** 50 /**
...@@ -52,8 +52,8 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent { ...@@ -52,8 +52,8 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent {
52 */ 52 */
53 protected SinglePointToMultiPointIntent() { 53 protected SinglePointToMultiPointIntent() {
54 super(); 54 super();
55 - this.ingressPort = null; 55 + this.ingressPoint = null;
56 - this.egressPorts = null; 56 + this.egressPoints = null;
57 } 57 }
58 58
59 /** 59 /**
...@@ -61,8 +61,8 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent { ...@@ -61,8 +61,8 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent {
61 * 61 *
62 * @return ingress port 62 * @return ingress port
63 */ 63 */
64 - public ConnectPoint getIngressPort() { 64 + public ConnectPoint ingressPoint() {
65 - return ingressPort; 65 + return ingressPoint;
66 } 66 }
67 67
68 /** 68 /**
...@@ -70,8 +70,8 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent { ...@@ -70,8 +70,8 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent {
70 * 70 *
71 * @return set of egress ports 71 * @return set of egress ports
72 */ 72 */
73 - public Set<ConnectPoint> getEgressPorts() { 73 + public Set<ConnectPoint> egressPoints() {
74 - return egressPorts; 74 + return egressPoints;
75 } 75 }
76 76
77 @Override 77 @Override
...@@ -87,23 +87,23 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent { ...@@ -87,23 +87,23 @@ public class SinglePointToMultiPointIntent extends ConnectivityIntent {
87 } 87 }
88 88
89 SinglePointToMultiPointIntent that = (SinglePointToMultiPointIntent) o; 89 SinglePointToMultiPointIntent that = (SinglePointToMultiPointIntent) o;
90 - return Objects.equals(this.ingressPort, that.ingressPort) 90 + return Objects.equals(this.ingressPoint, that.ingressPoint)
91 - && Objects.equals(this.egressPorts, that.egressPorts); 91 + && Objects.equals(this.egressPoints, that.egressPoints);
92 } 92 }
93 93
94 @Override 94 @Override
95 public int hashCode() { 95 public int hashCode() {
96 - return Objects.hash(super.hashCode(), ingressPort, egressPorts); 96 + return Objects.hash(super.hashCode(), ingressPoint, egressPoints);
97 } 97 }
98 98
99 @Override 99 @Override
100 public String toString() { 100 public String toString() {
101 return MoreObjects.toStringHelper(getClass()) 101 return MoreObjects.toStringHelper(getClass())
102 - .add("id", getId()) 102 + .add("id", id())
103 - .add("match", getTrafficSelector()) 103 + .add("match", selector())
104 - .add("action", getTrafficTreatment()) 104 + .add("action", treatment())
105 - .add("ingressPort", ingressPort) 105 + .add("ingressPoint", ingressPoint)
106 - .add("egressPort", egressPorts) 106 + .add("egressPort", egressPoints)
107 .toString(); 107 .toString();
108 } 108 }
109 109
......
...@@ -40,8 +40,7 @@ public class FakeIntentManager implements TestableIntentService { ...@@ -40,8 +40,7 @@ public class FakeIntentManager implements TestableIntentService {
40 @Override 40 @Override
41 public void run() { 41 public void run() {
42 try { 42 try {
43 - List<InstallableIntent> installable = compileIntent(intent); 43 + executeCompilingPhase(intent);
44 - installIntents(intent, installable);
45 } catch (IntentException e) { 44 } catch (IntentException e) {
46 exceptions.add(e); 45 exceptions.add(e);
47 } 46 }
...@@ -55,8 +54,8 @@ public class FakeIntentManager implements TestableIntentService { ...@@ -55,8 +54,8 @@ public class FakeIntentManager implements TestableIntentService {
55 @Override 54 @Override
56 public void run() { 55 public void run() {
57 try { 56 try {
58 - List<InstallableIntent> installable = getInstallable(intent.getId()); 57 + List<InstallableIntent> installable = getInstallable(intent.id());
59 - uninstallIntents(intent, installable); 58 + executeWithdrawingPhase(intent, installable);
60 } catch (IntentException e) { 59 } catch (IntentException e) {
61 exceptions.add(e); 60 exceptions.add(e);
62 } 61 }
...@@ -84,53 +83,60 @@ public class FakeIntentManager implements TestableIntentService { ...@@ -84,53 +83,60 @@ public class FakeIntentManager implements TestableIntentService {
84 return installer; 83 return installer;
85 } 84 }
86 85
87 - private <T extends Intent> List<InstallableIntent> compileIntent(T intent) { 86 + private <T extends Intent> void executeCompilingPhase(T intent) {
87 + setState(intent, IntentState.COMPILING);
88 try { 88 try {
89 // For the fake, we compile using a single level pass 89 // For the fake, we compile using a single level pass
90 List<InstallableIntent> installable = new ArrayList<>(); 90 List<InstallableIntent> installable = new ArrayList<>();
91 for (Intent compiled : getCompiler(intent).compile(intent)) { 91 for (Intent compiled : getCompiler(intent).compile(intent)) {
92 installable.add((InstallableIntent) compiled); 92 installable.add((InstallableIntent) compiled);
93 } 93 }
94 - setState(intent, IntentState.COMPILED); 94 + executeInstallingPhase(intent, installable);
95 - return installable; 95 +
96 } catch (IntentException e) { 96 } catch (IntentException e) {
97 setState(intent, IntentState.FAILED); 97 setState(intent, IntentState.FAILED);
98 - throw e; 98 + dispatch(new IntentEvent(IntentEvent.Type.FAILED, intent));
99 } 99 }
100 } 100 }
101 101
102 - private void installIntents(Intent intent, List<InstallableIntent> installable) { 102 + private void executeInstallingPhase(Intent intent,
103 + List<InstallableIntent> installable) {
104 + setState(intent, IntentState.INSTALLING);
103 try { 105 try {
104 for (InstallableIntent ii : installable) { 106 for (InstallableIntent ii : installable) {
105 registerSubclassInstallerIfNeeded(ii); 107 registerSubclassInstallerIfNeeded(ii);
106 getInstaller(ii).install(ii); 108 getInstaller(ii).install(ii);
107 } 109 }
108 setState(intent, IntentState.INSTALLED); 110 setState(intent, IntentState.INSTALLED);
109 - putInstallable(intent.getId(), installable); 111 + putInstallable(intent.id(), installable);
112 + dispatch(new IntentEvent(IntentEvent.Type.INSTALLED, intent));
113 +
110 } catch (IntentException e) { 114 } catch (IntentException e) {
111 setState(intent, IntentState.FAILED); 115 setState(intent, IntentState.FAILED);
112 - throw e; 116 + dispatch(new IntentEvent(IntentEvent.Type.FAILED, intent));
113 } 117 }
114 } 118 }
115 119
116 - private void uninstallIntents(Intent intent, List<InstallableIntent> installable) { 120 + private void executeWithdrawingPhase(Intent intent,
121 + List<InstallableIntent> installable) {
122 + setState(intent, IntentState.WITHDRAWING);
117 try { 123 try {
118 for (InstallableIntent ii : installable) { 124 for (InstallableIntent ii : installable) {
119 getInstaller(ii).uninstall(ii); 125 getInstaller(ii).uninstall(ii);
120 } 126 }
127 + removeInstallable(intent.id());
121 setState(intent, IntentState.WITHDRAWN); 128 setState(intent, IntentState.WITHDRAWN);
122 - removeInstallable(intent.getId()); 129 + dispatch(new IntentEvent(IntentEvent.Type.WITHDRAWN, intent));
123 } catch (IntentException e) { 130 } catch (IntentException e) {
131 + // FIXME: Do we really want to do this?
124 setState(intent, IntentState.FAILED); 132 setState(intent, IntentState.FAILED);
125 - throw e; 133 + dispatch(new IntentEvent(IntentEvent.Type.FAILED, intent));
126 } 134 }
127 } 135 }
128 136
129 // Sets the internal state for the given intent and dispatches an event 137 // Sets the internal state for the given intent and dispatches an event
130 private void setState(Intent intent, IntentState state) { 138 private void setState(Intent intent, IntentState state) {
131 - IntentState previous = intentStates.get(intent.getId()); 139 + intentStates.put(intent.id(), state);
132 - intentStates.put(intent.getId(), state);
133 - dispatch(new IntentEvent(intent, state, previous, System.currentTimeMillis()));
134 } 140 }
135 141
136 private void putInstallable(IntentId id, List<InstallableIntent> installable) { 142 private void putInstallable(IntentId id, List<InstallableIntent> installable) {
...@@ -152,15 +158,15 @@ public class FakeIntentManager implements TestableIntentService { ...@@ -152,15 +158,15 @@ public class FakeIntentManager implements TestableIntentService {
152 158
153 @Override 159 @Override
154 public void submit(Intent intent) { 160 public void submit(Intent intent) {
155 - intents.put(intent.getId(), intent); 161 + intents.put(intent.id(), intent);
156 setState(intent, IntentState.SUBMITTED); 162 setState(intent, IntentState.SUBMITTED);
163 + dispatch(new IntentEvent(IntentEvent.Type.SUBMITTED, intent));
157 executeSubmit(intent); 164 executeSubmit(intent);
158 } 165 }
159 166
160 @Override 167 @Override
161 public void withdraw(Intent intent) { 168 public void withdraw(Intent intent) {
162 - intents.remove(intent.getId()); 169 + intents.remove(intent.id());
163 - setState(intent, IntentState.WITHDRAWING);
164 executeWithdraw(intent); 170 executeWithdraw(intent);
165 } 171 }
166 172
......
...@@ -10,11 +10,9 @@ import java.util.Collections; ...@@ -10,11 +10,9 @@ import java.util.Collections;
10 import java.util.Iterator; 10 import java.util.Iterator;
11 import java.util.List; 11 import java.util.List;
12 12
13 -import static org.onlab.onos.net.intent.IntentState.*;
14 import static org.junit.Assert.*; 13 import static org.junit.Assert.*;
14 +import static org.onlab.onos.net.intent.IntentEvent.Type.*;
15 15
16 -// TODO: consider make it categorized as integration test when it become
17 -// slow test or fragile test
18 /** 16 /**
19 * Suite of tests for the intent service contract. 17 * Suite of tests for the intent service contract.
20 */ 18 */
...@@ -64,13 +62,13 @@ public class IntentServiceTest { ...@@ -64,13 +62,13 @@ public class IntentServiceTest {
64 TestTools.assertAfter(GRACE_MS, new Runnable() { 62 TestTools.assertAfter(GRACE_MS, new Runnable() {
65 @Override 63 @Override
66 public void run() { 64 public void run() {
67 - assertEquals("incorrect intent state", INSTALLED, 65 + assertEquals("incorrect intent state", IntentState.INSTALLED,
68 - service.getIntentState(intent.getId())); 66 + service.getIntentState(intent.id()));
69 } 67 }
70 }); 68 });
71 69
72 // Make sure that all expected events have been emitted 70 // Make sure that all expected events have been emitted
73 - validateEvents(intent, SUBMITTED, COMPILED, INSTALLED); 71 + validateEvents(intent, SUBMITTED, INSTALLED);
74 72
75 // Make sure there is just one intent (and is ours) 73 // Make sure there is just one intent (and is ours)
76 assertEquals("incorrect intent count", 1, service.getIntentCount()); 74 assertEquals("incorrect intent count", 1, service.getIntentCount());
...@@ -85,19 +83,19 @@ public class IntentServiceTest { ...@@ -85,19 +83,19 @@ public class IntentServiceTest {
85 TestTools.assertAfter(GRACE_MS, new Runnable() { 83 TestTools.assertAfter(GRACE_MS, new Runnable() {
86 @Override 84 @Override
87 public void run() { 85 public void run() {
88 - assertEquals("incorrect intent state", WITHDRAWN, 86 + assertEquals("incorrect intent state", IntentState.WITHDRAWN,
89 - service.getIntentState(intent.getId())); 87 + service.getIntentState(intent.id()));
90 } 88 }
91 }); 89 });
92 90
93 // Make sure that all expected events have been emitted 91 // Make sure that all expected events have been emitted
94 - validateEvents(intent, WITHDRAWING, WITHDRAWN); 92 + validateEvents(intent, WITHDRAWN);
95 93
96 // TODO: discuss what is the fate of intents after they have been withdrawn 94 // TODO: discuss what is the fate of intents after they have been withdrawn
97 // Make sure that the intent is no longer in the system 95 // Make sure that the intent is no longer in the system
98 // assertEquals("incorrect intent count", 0, service.getIntents().size()); 96 // assertEquals("incorrect intent count", 0, service.getIntents().size());
99 -// assertNull("intent should not be found", service.getIntent(intent.getId())); 97 +// assertNull("intent should not be found", service.getIntent(intent.id()));
100 -// assertNull("intent state should not be found", service.getIntentState(intent.getId())); 98 +// assertNull("intent state should not be found", service.getIntentState(intent.id()));
101 } 99 }
102 100
103 @Test 101 @Test
...@@ -113,8 +111,8 @@ public class IntentServiceTest { ...@@ -113,8 +111,8 @@ public class IntentServiceTest {
113 TestTools.assertAfter(GRACE_MS, new Runnable() { 111 TestTools.assertAfter(GRACE_MS, new Runnable() {
114 @Override 112 @Override
115 public void run() { 113 public void run() {
116 - assertEquals("incorrect intent state", FAILED, 114 + assertEquals("incorrect intent state", IntentState.FAILED,
117 - service.getIntentState(intent.getId())); 115 + service.getIntentState(intent.id()));
118 } 116 }
119 }); 117 });
120 118
...@@ -136,13 +134,13 @@ public class IntentServiceTest { ...@@ -136,13 +134,13 @@ public class IntentServiceTest {
136 TestTools.assertAfter(GRACE_MS, new Runnable() { 134 TestTools.assertAfter(GRACE_MS, new Runnable() {
137 @Override 135 @Override
138 public void run() { 136 public void run() {
139 - assertEquals("incorrect intent state", FAILED, 137 + assertEquals("incorrect intent state", IntentState.FAILED,
140 - service.getIntentState(intent.getId())); 138 + service.getIntentState(intent.id()));
141 } 139 }
142 }); 140 });
143 141
144 // Make sure that all expected events have been emitted 142 // Make sure that all expected events have been emitted
145 - validateEvents(intent, SUBMITTED, COMPILED, FAILED); 143 + validateEvents(intent, SUBMITTED, FAILED);
146 } 144 }
147 145
148 /** 146 /**
...@@ -151,23 +149,23 @@ public class IntentServiceTest { ...@@ -151,23 +149,23 @@ public class IntentServiceTest {
151 * considered. 149 * considered.
152 * 150 *
153 * @param intent intent subject 151 * @param intent intent subject
154 - * @param states list of states for which events are expected 152 + * @param types list of event types for which events are expected
155 */ 153 */
156 - protected void validateEvents(Intent intent, IntentState... states) { 154 + protected void validateEvents(Intent intent, IntentEvent.Type... types) {
157 Iterator<IntentEvent> events = listener.events.iterator(); 155 Iterator<IntentEvent> events = listener.events.iterator();
158 - for (IntentState state : states) { 156 + for (IntentEvent.Type type : types) {
159 IntentEvent event = events.hasNext() ? events.next() : null; 157 IntentEvent event = events.hasNext() ? events.next() : null;
160 if (event == null) { 158 if (event == null) {
161 - fail("expected event not found: " + state); 159 + fail("expected event not found: " + type);
162 - } else if (intent.equals(event.getIntent())) { 160 + } else if (intent.equals(event.subject())) {
163 - assertEquals("incorrect state", state, event.getState()); 161 + assertEquals("incorrect state", type, event.type());
164 } 162 }
165 } 163 }
166 164
167 // Remainder of events should not apply to this intent; make sure. 165 // Remainder of events should not apply to this intent; make sure.
168 while (events.hasNext()) { 166 while (events.hasNext()) {
169 assertFalse("unexpected event for intent", 167 assertFalse("unexpected event for intent",
170 - intent.equals(events.next().getIntent())); 168 + intent.equals(events.next().subject()));
171 } 169 }
172 } 170 }
173 171
...@@ -228,8 +226,8 @@ public class IntentServiceTest { ...@@ -228,8 +226,8 @@ public class IntentServiceTest {
228 TestTools.assertAfter(GRACE_MS, new Runnable() { 226 TestTools.assertAfter(GRACE_MS, new Runnable() {
229 @Override 227 @Override
230 public void run() { 228 public void run() {
231 - assertEquals("incorrect intent state", INSTALLED, 229 + assertEquals("incorrect intent state", IntentState.INSTALLED,
232 - service.getIntentState(intent.getId())); 230 + service.getIntentState(intent.id()));
233 } 231 }
234 }); 232 });
235 233
......
...@@ -12,10 +12,10 @@ public class MultiPointToSinglePointIntentTest extends ConnectivityIntentTest { ...@@ -12,10 +12,10 @@ public class MultiPointToSinglePointIntentTest extends ConnectivityIntentTest {
12 @Test 12 @Test
13 public void basics() { 13 public void basics() {
14 MultiPointToSinglePointIntent intent = createOne(); 14 MultiPointToSinglePointIntent intent = createOne();
15 - assertEquals("incorrect id", IID, intent.getId()); 15 + assertEquals("incorrect id", IID, intent.id());
16 - assertEquals("incorrect match", MATCH, intent.getTrafficSelector()); 16 + assertEquals("incorrect match", MATCH, intent.selector());
17 - assertEquals("incorrect ingress", PS1, intent.getIngressPorts()); 17 + assertEquals("incorrect ingress", PS1, intent.ingressPoints());
18 - assertEquals("incorrect egress", P2, intent.getEgressPort()); 18 + assertEquals("incorrect egress", P2, intent.egressPoint());
19 } 19 }
20 20
21 @Override 21 @Override
......
...@@ -16,12 +16,12 @@ public class PathIntentTest extends ConnectivityIntentTest { ...@@ -16,12 +16,12 @@ public class PathIntentTest extends ConnectivityIntentTest {
16 @Test 16 @Test
17 public void basics() { 17 public void basics() {
18 PathIntent intent = createOne(); 18 PathIntent intent = createOne();
19 - assertEquals("incorrect id", IID, intent.getId()); 19 + assertEquals("incorrect id", IID, intent.id());
20 - assertEquals("incorrect match", MATCH, intent.getTrafficSelector()); 20 + assertEquals("incorrect match", MATCH, intent.selector());
21 - assertEquals("incorrect action", NOP, intent.getTrafficTreatment()); 21 + assertEquals("incorrect action", NOP, intent.treatment());
22 - assertEquals("incorrect ingress", P1, intent.getIngressPort()); 22 + assertEquals("incorrect ingress", P1, intent.ingressPoint());
23 - assertEquals("incorrect egress", P2, intent.getEgressPort()); 23 + assertEquals("incorrect egress", P2, intent.egressPoint());
24 - assertEquals("incorrect path", PATH1, intent.getPath()); 24 + assertEquals("incorrect path", PATH1, intent.path());
25 } 25 }
26 26
27 @Override 27 @Override
......
...@@ -12,10 +12,10 @@ public class PointToPointIntentTest extends ConnectivityIntentTest { ...@@ -12,10 +12,10 @@ public class PointToPointIntentTest extends ConnectivityIntentTest {
12 @Test 12 @Test
13 public void basics() { 13 public void basics() {
14 PointToPointIntent intent = createOne(); 14 PointToPointIntent intent = createOne();
15 - assertEquals("incorrect id", IID, intent.getId()); 15 + assertEquals("incorrect id", IID, intent.id());
16 - assertEquals("incorrect match", MATCH, intent.getTrafficSelector()); 16 + assertEquals("incorrect match", MATCH, intent.selector());
17 - assertEquals("incorrect ingress", P1, intent.getIngressPort()); 17 + assertEquals("incorrect ingress", P1, intent.ingressPoint());
18 - assertEquals("incorrect egress", P2, intent.getEgressPort()); 18 + assertEquals("incorrect egress", P2, intent.egressPoint());
19 } 19 }
20 20
21 @Override 21 @Override
......
...@@ -12,10 +12,10 @@ public class SinglePointToMultiPointIntentTest extends ConnectivityIntentTest { ...@@ -12,10 +12,10 @@ public class SinglePointToMultiPointIntentTest extends ConnectivityIntentTest {
12 @Test 12 @Test
13 public void basics() { 13 public void basics() {
14 SinglePointToMultiPointIntent intent = createOne(); 14 SinglePointToMultiPointIntent intent = createOne();
15 - assertEquals("incorrect id", IID, intent.getId()); 15 + assertEquals("incorrect id", IID, intent.id());
16 - assertEquals("incorrect match", MATCH, intent.getTrafficSelector()); 16 + assertEquals("incorrect match", MATCH, intent.selector());
17 - assertEquals("incorrect ingress", P1, intent.getIngressPort()); 17 + assertEquals("incorrect ingress", P1, intent.ingressPoint());
18 - assertEquals("incorrect egress", PS2, intent.getEgressPorts()); 18 + assertEquals("incorrect egress", PS2, intent.egressPoints());
19 } 19 }
20 20
21 @Override 21 @Override
......
...@@ -71,11 +71,11 @@ public class HostToHostIntentCompiler ...@@ -71,11 +71,11 @@ public class HostToHostIntentCompiler
71 private Intent createPathIntent(Path path, Host src, Host dst, 71 private Intent createPathIntent(Path path, Host src, Host dst,
72 HostToHostIntent intent) { 72 HostToHostIntent intent) {
73 73
74 - TrafficSelector selector = builder(intent.getTrafficSelector()) 74 + TrafficSelector selector = builder(intent.selector())
75 .matchEthSrc(src.mac()).matchEthDst(dst.mac()).build(); 75 .matchEthSrc(src.mac()).matchEthDst(dst.mac()).build();
76 76
77 return new PathIntent(intentIdGenerator.getNewId(), 77 return new PathIntent(intentIdGenerator.getNewId(),
78 - selector, intent.getTrafficTreatment(), 78 + selector, intent.treatment(),
79 path.src(), path.dst(), path); 79 path.src(), path.dst(), path);
80 } 80 }
81 81
......
...@@ -28,11 +28,15 @@ import org.slf4j.Logger; ...@@ -28,11 +28,15 @@ import org.slf4j.Logger;
28 import java.util.ArrayList; 28 import java.util.ArrayList;
29 import java.util.List; 29 import java.util.List;
30 import java.util.Map; 30 import java.util.Map;
31 +import java.util.Objects;
31 import java.util.concurrent.ConcurrentHashMap; 32 import java.util.concurrent.ConcurrentHashMap;
32 import java.util.concurrent.ConcurrentMap; 33 import java.util.concurrent.ConcurrentMap;
34 +import java.util.concurrent.ExecutorService;
33 35
34 import static com.google.common.base.Preconditions.checkNotNull; 36 import static com.google.common.base.Preconditions.checkNotNull;
37 +import static java.util.concurrent.Executors.newSingleThreadExecutor;
35 import static org.onlab.onos.net.intent.IntentState.*; 38 import static org.onlab.onos.net.intent.IntentState.*;
39 +import static org.onlab.util.Tools.namedThreads;
36 import static org.slf4j.LoggerFactory.getLogger; 40 import static org.slf4j.LoggerFactory.getLogger;
37 41
38 /** 42 /**
...@@ -56,6 +60,8 @@ public class IntentManager ...@@ -56,6 +60,8 @@ public class IntentManager
56 private final AbstractListenerRegistry<IntentEvent, IntentListener> 60 private final AbstractListenerRegistry<IntentEvent, IntentListener>
57 listenerRegistry = new AbstractListenerRegistry<>(); 61 listenerRegistry = new AbstractListenerRegistry<>();
58 62
63 + private ExecutorService executor = newSingleThreadExecutor(namedThreads("onos-intents"));
64 +
59 private final IntentStoreDelegate delegate = new InternalStoreDelegate(); 65 private final IntentStoreDelegate delegate = new InternalStoreDelegate();
60 private final TopologyChangeDelegate topoDelegate = new InternalTopoChangeDelegate(); 66 private final TopologyChangeDelegate topoDelegate = new InternalTopoChangeDelegate();
61 67
...@@ -63,7 +69,7 @@ public class IntentManager ...@@ -63,7 +69,7 @@ public class IntentManager
63 protected IntentStore store; 69 protected IntentStore store;
64 70
65 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 71 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
66 - protected FlowTrackerService trackerService; 72 + protected ObjectiveTrackerService trackerService;
67 73
68 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 74 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
69 protected EventDeliveryService eventDispatcher; 75 protected EventDeliveryService eventDispatcher;
...@@ -89,21 +95,16 @@ public class IntentManager ...@@ -89,21 +95,16 @@ public class IntentManager
89 checkNotNull(intent, INTENT_NULL); 95 checkNotNull(intent, INTENT_NULL);
90 registerSubclassCompilerIfNeeded(intent); 96 registerSubclassCompilerIfNeeded(intent);
91 IntentEvent event = store.createIntent(intent); 97 IntentEvent event = store.createIntent(intent);
92 - processStoreEvent(event); 98 + if (event != null) {
99 + eventDispatcher.post(event);
100 + executor.execute(new IntentTask(COMPILING, intent));
101 + }
93 } 102 }
94 103
95 @Override 104 @Override
96 public void withdraw(Intent intent) { 105 public void withdraw(Intent intent) {
97 checkNotNull(intent, INTENT_NULL); 106 checkNotNull(intent, INTENT_NULL);
98 - IntentEvent event = store.setState(intent, WITHDRAWING); 107 + executor.execute(new IntentTask(WITHDRAWING, intent));
99 - List<InstallableIntent> installables = store.getInstallableIntents(intent.getId());
100 - if (installables != null) {
101 - for (InstallableIntent installable : installables) {
102 - trackerService.removeTrackedResources(intent.getId(),
103 - installable.requiredLinks());
104 - }
105 - }
106 - processStoreEvent(event);
107 } 108 }
108 109
109 // FIXME: implement this method 110 // FIXME: implement this method
...@@ -207,56 +208,122 @@ public class IntentManager ...@@ -207,56 +208,122 @@ public class IntentManager
207 } 208 }
208 209
209 /** 210 /**
210 - * Compiles an intent. 211 + * Compiles the specified intent.
211 * 212 *
212 - * @param intent intent 213 + * @param intent intent to be compiled
213 */ 214 */
214 - private void compileIntent(Intent intent) { 215 + private void executeCompilingPhase(Intent intent) {
216 + // Indicate that the intent is entering the compiling phase.
217 + store.setState(intent, COMPILING);
218 +
219 + try {
220 + // Compile the intent into installable derivatives.
221 + List<InstallableIntent> installable = compileIntent(intent);
222 +
223 + // If all went well, associate the resulting list of installable
224 + // intents with the top-level intent and proceed to install.
225 + store.addInstallableIntents(intent.id(), installable);
226 + executeInstallingPhase(intent);
227 +
228 + } catch (Exception e) {
229 + // If compilation failed, mark the intent as failed.
230 + store.setState(intent, FAILED);
231 + }
232 + }
233 +
215 // FIXME: To make SDN-IP workable ASAP, only single level compilation is implemented 234 // FIXME: To make SDN-IP workable ASAP, only single level compilation is implemented
216 // TODO: implement compilation traversing tree structure 235 // TODO: implement compilation traversing tree structure
236 + private List<InstallableIntent> compileIntent(Intent intent) {
217 List<InstallableIntent> installable = new ArrayList<>(); 237 List<InstallableIntent> installable = new ArrayList<>();
218 for (Intent compiled : getCompiler(intent).compile(intent)) { 238 for (Intent compiled : getCompiler(intent).compile(intent)) {
219 InstallableIntent installableIntent = (InstallableIntent) compiled; 239 InstallableIntent installableIntent = (InstallableIntent) compiled;
220 installable.add(installableIntent); 240 installable.add(installableIntent);
221 - trackerService.addTrackedResources(intent.getId(), 241 + trackerService.addTrackedResources(intent.id(),
222 installableIntent.requiredLinks()); 242 installableIntent.requiredLinks());
223 } 243 }
224 - IntentEvent event = store.addInstallableIntents(intent.getId(), installable); 244 + return installable;
225 - processStoreEvent(event);
226 } 245 }
227 246
228 /** 247 /**
229 - * Installs an intent. 248 + * Installs all installable intents associated with the specified top-level
249 + * intent.
230 * 250 *
231 - * @param intent intent 251 + * @param intent intent to be installed
232 */ 252 */
233 - private void installIntent(Intent intent) { 253 + private void executeInstallingPhase(Intent intent) {
234 - List<InstallableIntent> installables = store.getInstallableIntents(intent.getId()); 254 + // Indicate that the intent is entering the installing phase.
255 + store.setState(intent, INSTALLING);
256 +
257 + try {
258 + List<InstallableIntent> installables = store.getInstallableIntents(intent.id());
235 if (installables != null) { 259 if (installables != null) {
236 for (InstallableIntent installable : installables) { 260 for (InstallableIntent installable : installables) {
237 registerSubclassInstallerIfNeeded(installable); 261 registerSubclassInstallerIfNeeded(installable);
238 getInstaller(installable).install(installable); 262 getInstaller(installable).install(installable);
239 } 263 }
240 } 264 }
241 - IntentEvent event = store.setState(intent, INSTALLED); 265 + eventDispatcher.post(store.setState(intent, INSTALLED));
242 - processStoreEvent(event);
243 266
267 + } catch (Exception e) {
268 + // If compilation failed, kick off the recompiling phase.
269 + executeRecompilingPhase(intent);
270 + }
244 } 271 }
245 272
246 /** 273 /**
247 - * Uninstalls an intent. 274 + * Recompiles the specified intent.
248 * 275 *
249 - * @param intent intent 276 + * @param intent intent to be recompiled
277 + */
278 + private void executeRecompilingPhase(Intent intent) {
279 + // Indicate that the intent is entering the recompiling phase.
280 + store.setState(intent, RECOMPILING);
281 +
282 + try {
283 + // Compile the intent into installable derivatives.
284 + List<InstallableIntent> installable = compileIntent(intent);
285 +
286 + // If all went well, compare the existing list of installable
287 + // intents with the newly compiled list. If they are the same,
288 + // bail, out since the previous approach was determined not to
289 + // be viable.
290 + List<InstallableIntent> originalInstallable =
291 + store.getInstallableIntents(intent.id());
292 +
293 + if (Objects.equals(originalInstallable, installable)) {
294 + eventDispatcher.post(store.setState(intent, FAILED));
295 + } else {
296 + // Otherwise, re-associate the newly compiled installable intents
297 + // with the top-level intent and kick off installing phase.
298 + store.addInstallableIntents(intent.id(), installable);
299 + executeInstallingPhase(intent);
300 + }
301 + } catch (Exception e) {
302 + // If compilation failed, mark the intent as failed.
303 + eventDispatcher.post(store.setState(intent, FAILED));
304 + }
305 + }
306 +
307 + /**
308 + * Uninstalls the specified intent by uninstalling all of its associated
309 + * installable derivatives.
310 + *
311 + * @param intent intent to be installed
250 */ 312 */
251 - private void uninstallIntent(Intent intent) { 313 + private void executeWithdrawingPhase(Intent intent) {
252 - List<InstallableIntent> installables = store.getInstallableIntents(intent.getId()); 314 + // Indicate that the intent is being withdrawn.
315 + store.setState(intent, WITHDRAWING);
316 + List<InstallableIntent> installables = store.getInstallableIntents(intent.id());
253 if (installables != null) { 317 if (installables != null) {
254 for (InstallableIntent installable : installables) { 318 for (InstallableIntent installable : installables) {
255 getInstaller(installable).uninstall(installable); 319 getInstaller(installable).uninstall(installable);
256 } 320 }
257 } 321 }
258 - store.removeInstalledIntents(intent.getId()); 322 +
259 - store.setState(intent, WITHDRAWN); 323 + // If all went well, disassociate the top-level intent with its
324 + // installable derivatives and mark it as withdrawn.
325 + store.removeInstalledIntents(intent.id());
326 + eventDispatcher.post(store.setState(intent, WITHDRAWN));
260 } 327 }
261 328
262 /** 329 /**
...@@ -309,55 +376,58 @@ public class IntentManager ...@@ -309,55 +376,58 @@ public class IntentManager
309 } 376 }
310 } 377 }
311 378
312 - /**
313 - * Handles state transition of submitted intents.
314 - */
315 - private void processStoreEvent(IntentEvent event) {
316 - eventDispatcher.post(event);
317 - Intent intent = event.getIntent();
318 - try {
319 - switch (event.getState()) {
320 - case SUBMITTED:
321 - compileIntent(intent);
322 - break;
323 - case COMPILED:
324 - installIntent(intent);
325 - break;
326 - case INSTALLED:
327 - break;
328 - case WITHDRAWING:
329 - uninstallIntent(intent);
330 - break;
331 - case WITHDRAWN:
332 - break;
333 - case FAILED:
334 - break;
335 - default:
336 - throw new IllegalStateException("the state of IntentEvent is illegal: " +
337 - event.getState());
338 - }
339 - } catch (IntentException e) {
340 - store.setState(intent, FAILED);
341 - }
342 -
343 - }
344 -
345 // Store delegate to re-post events emitted from the store. 379 // Store delegate to re-post events emitted from the store.
346 private class InternalStoreDelegate implements IntentStoreDelegate { 380 private class InternalStoreDelegate implements IntentStoreDelegate {
347 @Override 381 @Override
348 public void notify(IntentEvent event) { 382 public void notify(IntentEvent event) {
349 - processStoreEvent(event); 383 + eventDispatcher.post(event);
384 + if (event.type() == IntentEvent.Type.SUBMITTED) {
385 + executor.execute(new IntentTask(COMPILING, event.subject()));
386 + }
350 } 387 }
351 } 388 }
352 389
353 // Topology change delegate 390 // Topology change delegate
354 private class InternalTopoChangeDelegate implements TopologyChangeDelegate { 391 private class InternalTopoChangeDelegate implements TopologyChangeDelegate {
355 @Override 392 @Override
356 - public void bumpIntents(Iterable<IntentId> intentIds) { 393 + public void triggerCompile(Iterable<IntentId> intentIds,
394 + boolean compileAllFailed) {
395 + // Attempt recompilation of the specified intents first.
357 for (IntentId intentId : intentIds) { 396 for (IntentId intentId : intentIds) {
358 - compileIntent(getIntent(intentId)); 397 + executeRecompilingPhase(getIntent(intentId));
398 + }
399 +
400 + if (compileAllFailed) {
401 + // If required, compile all currently failed intents.
402 + for (Intent intent : getIntents()) {
403 + if (getIntentState(intent.id()) == FAILED) {
404 + executeCompilingPhase(intent);
405 + }
406 + }
407 + }
359 } 408 }
360 } 409 }
361 410
411 + // Auxiliary runnable to perform asynchronous tasks.
412 + private class IntentTask implements Runnable {
413 + private final IntentState state;
414 + private final Intent intent;
415 +
416 + public IntentTask(IntentState state, Intent intent) {
417 + this.state = state;
418 + this.intent = intent;
419 + }
420 +
421 + @Override
422 + public void run() {
423 + if (state == COMPILING) {
424 + executeCompilingPhase(intent);
425 + } else if (state == RECOMPILING) {
426 + executeRecompilingPhase(intent);
427 + } else if (state == WITHDRAWING) {
428 + executeWithdrawingPhase(intent);
362 } 429 }
430 + }
431 + }
432 +
363 } 433 }
......
...@@ -19,12 +19,15 @@ import org.onlab.onos.net.topology.TopologyService; ...@@ -19,12 +19,15 @@ import org.onlab.onos.net.topology.TopologyService;
19 import org.slf4j.Logger; 19 import org.slf4j.Logger;
20 20
21 import java.util.Collection; 21 import java.util.Collection;
22 +import java.util.HashSet;
23 +import java.util.Set;
22 import java.util.concurrent.ExecutorService; 24 import java.util.concurrent.ExecutorService;
23 25
24 import static com.google.common.base.Preconditions.checkArgument; 26 import static com.google.common.base.Preconditions.checkArgument;
25 import static com.google.common.base.Preconditions.checkNotNull; 27 import static com.google.common.base.Preconditions.checkNotNull;
26 import static com.google.common.collect.Multimaps.synchronizedSetMultimap; 28 import static com.google.common.collect.Multimaps.synchronizedSetMultimap;
27 import static java.util.concurrent.Executors.newSingleThreadExecutor; 29 import static java.util.concurrent.Executors.newSingleThreadExecutor;
30 +import static org.onlab.onos.net.link.LinkEvent.Type.LINK_REMOVED;
28 import static org.onlab.util.Tools.namedThreads; 31 import static org.onlab.util.Tools.namedThreads;
29 import static org.slf4j.LoggerFactory.getLogger; 32 import static org.slf4j.LoggerFactory.getLogger;
30 33
...@@ -34,7 +37,7 @@ import static org.slf4j.LoggerFactory.getLogger; ...@@ -34,7 +37,7 @@ import static org.slf4j.LoggerFactory.getLogger;
34 */ 37 */
35 @Component 38 @Component
36 @Service 39 @Service
37 -public class FlowTracker implements FlowTrackerService { 40 +public class ObjectiveTracker implements ObjectiveTrackerService {
38 41
39 private final Logger log = getLogger(getClass()); 42 private final Logger log = getLogger(getClass());
40 43
...@@ -110,15 +113,27 @@ public class FlowTracker implements FlowTrackerService { ...@@ -110,15 +113,27 @@ public class FlowTracker implements FlowTrackerService {
110 @Override 113 @Override
111 public void run() { 114 public void run() {
112 if (event.reasons() == null) { 115 if (event.reasons() == null) {
113 - delegate.bumpIntents(intentsByLink.values()); 116 + delegate.triggerCompile(null, false);
117 +
114 } else { 118 } else {
119 + Set<IntentId> toBeRecompiled = new HashSet<>();
120 + boolean recompileOnly = true;
121 +
122 + // Scan through the list of reasons and keep accruing all
123 + // intents that need to be recompiled.
115 for (Event reason : event.reasons()) { 124 for (Event reason : event.reasons()) {
116 if (reason instanceof LinkEvent) { 125 if (reason instanceof LinkEvent) {
117 LinkEvent linkEvent = (LinkEvent) reason; 126 LinkEvent linkEvent = (LinkEvent) reason;
118 - delegate.bumpIntents(intentsByLink.get(new LinkKey(linkEvent.subject()))); 127 + if (linkEvent.type() == LINK_REMOVED) {
128 + Set<IntentId> intentIds = intentsByLink.get(new LinkKey(linkEvent.subject()));
129 + toBeRecompiled.addAll(intentIds);
119 } 130 }
131 + recompileOnly = recompileOnly && linkEvent.type() == LINK_REMOVED;
120 } 132 }
121 } 133 }
134 +
135 + delegate.triggerCompile(toBeRecompiled, !recompileOnly);
136 + }
122 } 137 }
123 } 138 }
124 139
......
...@@ -9,7 +9,7 @@ import java.util.Collection; ...@@ -9,7 +9,7 @@ import java.util.Collection;
9 * Auxiliary service for tracking intent path flows and for notifying the 9 * Auxiliary service for tracking intent path flows and for notifying the
10 * intent service of environment changes via topology change delegate. 10 * intent service of environment changes via topology change delegate.
11 */ 11 */
12 -public interface FlowTrackerService { 12 +public interface ObjectiveTrackerService {
13 13
14 /** 14 /**
15 * Sets a topology change delegate. 15 * Sets a topology change delegate.
......
...@@ -49,8 +49,8 @@ public class PathIntentInstaller implements IntentInstaller<PathIntent> { ...@@ -49,8 +49,8 @@ public class PathIntentInstaller implements IntentInstaller<PathIntent> {
49 @Override 49 @Override
50 public void install(PathIntent intent) { 50 public void install(PathIntent intent) {
51 TrafficSelector.Builder builder = 51 TrafficSelector.Builder builder =
52 - DefaultTrafficSelector.builder(intent.getTrafficSelector()); 52 + DefaultTrafficSelector.builder(intent.selector());
53 - Iterator<Link> links = intent.getPath().links().iterator(); 53 + Iterator<Link> links = intent.path().links().iterator();
54 ConnectPoint prev = links.next().dst(); 54 ConnectPoint prev = links.next().dst();
55 55
56 while (links.hasNext()) { 56 while (links.hasNext()) {
...@@ -70,8 +70,8 @@ public class PathIntentInstaller implements IntentInstaller<PathIntent> { ...@@ -70,8 +70,8 @@ public class PathIntentInstaller implements IntentInstaller<PathIntent> {
70 @Override 70 @Override
71 public void uninstall(PathIntent intent) { 71 public void uninstall(PathIntent intent) {
72 TrafficSelector.Builder builder = 72 TrafficSelector.Builder builder =
73 - DefaultTrafficSelector.builder(intent.getTrafficSelector()); 73 + DefaultTrafficSelector.builder(intent.selector());
74 - Iterator<Link> links = intent.getPath().links().iterator(); 74 + Iterator<Link> links = intent.path().links().iterator();
75 ConnectPoint prev = links.next().dst(); 75 ConnectPoint prev = links.next().dst();
76 76
77 while (links.hasNext()) { 77 while (links.hasNext()) {
......
...@@ -9,10 +9,14 @@ public interface TopologyChangeDelegate { ...@@ -9,10 +9,14 @@ public interface TopologyChangeDelegate {
9 9
10 /** 10 /**
11 * Notifies that topology has changed in such a way that the specified 11 * Notifies that topology has changed in such a way that the specified
12 - * intents should be recompiled. 12 + * intents should be recompiled. If the {@code compileAllFailed} parameter
13 + * is true, the all intents in {@link org.onlab.onos.net.intent.IntentState#FAILED}
14 + * state should be compiled as well.
13 * 15 *
14 * @param intentIds intents that should be recompiled 16 * @param intentIds intents that should be recompiled
17 + * @param compileAllFailed true implies full compile is required; false for
18 + * selective recompile only
15 */ 19 */
16 - void bumpIntents(Iterable<IntentId> intentIds); 20 + void triggerCompile(Iterable<IntentId> intentIds, boolean compileAllFailed);
17 21
18 } 22 }
......
1 package org.onlab.onos.store.trivial.impl; 1 package org.onlab.onos.store.trivial.impl;
2 2
3 -import static org.onlab.onos.net.intent.IntentState.COMPILED; 3 +import com.google.common.collect.ImmutableSet;
4 -import static org.slf4j.LoggerFactory.getLogger;
5 -
6 -import java.util.HashMap;
7 -import java.util.List;
8 -import java.util.Map;
9 -
10 import org.apache.felix.scr.annotations.Activate; 4 import org.apache.felix.scr.annotations.Activate;
11 import org.apache.felix.scr.annotations.Component; 5 import org.apache.felix.scr.annotations.Component;
12 import org.apache.felix.scr.annotations.Deactivate; 6 import org.apache.felix.scr.annotations.Deactivate;
...@@ -21,7 +15,12 @@ import org.onlab.onos.net.intent.IntentStoreDelegate; ...@@ -21,7 +15,12 @@ import org.onlab.onos.net.intent.IntentStoreDelegate;
21 import org.onlab.onos.store.AbstractStore; 15 import org.onlab.onos.store.AbstractStore;
22 import org.slf4j.Logger; 16 import org.slf4j.Logger;
23 17
24 -import com.google.common.collect.ImmutableSet; 18 +import java.util.HashMap;
19 +import java.util.List;
20 +import java.util.Map;
21 +
22 +import static org.onlab.onos.net.intent.IntentState.*;
23 +import static org.slf4j.LoggerFactory.getLogger;
25 24
26 @Component(immediate = true) 25 @Component(immediate = true)
27 @Service 26 @Service
...@@ -46,7 +45,7 @@ public class SimpleIntentStore ...@@ -46,7 +45,7 @@ public class SimpleIntentStore
46 45
47 @Override 46 @Override
48 public IntentEvent createIntent(Intent intent) { 47 public IntentEvent createIntent(Intent intent) {
49 - intents.put(intent.getId(), intent); 48 + intents.put(intent.id(), intent);
50 return this.setState(intent, IntentState.SUBMITTED); 49 return this.setState(intent, IntentState.SUBMITTED);
51 } 50 }
52 51
...@@ -54,7 +53,7 @@ public class SimpleIntentStore ...@@ -54,7 +53,7 @@ public class SimpleIntentStore
54 public IntentEvent removeIntent(IntentId intentId) { 53 public IntentEvent removeIntent(IntentId intentId) {
55 Intent intent = intents.remove(intentId); 54 Intent intent = intents.remove(intentId);
56 installable.remove(intentId); 55 installable.remove(intentId);
57 - IntentEvent event = this.setState(intent, IntentState.WITHDRAWN); 56 + IntentEvent event = this.setState(intent, WITHDRAWN);
58 states.remove(intentId); 57 states.remove(intentId);
59 return event; 58 return event;
60 } 59 }
...@@ -79,19 +78,21 @@ public class SimpleIntentStore ...@@ -79,19 +78,21 @@ public class SimpleIntentStore
79 return states.get(id); 78 return states.get(id);
80 } 79 }
81 80
82 - // TODO return dispatch event here... replace with state transition methods
83 @Override 81 @Override
84 - public IntentEvent setState(Intent intent, IntentState newState) { 82 + public IntentEvent setState(Intent intent, IntentState state) {
85 - IntentId id = intent.getId(); 83 + IntentId id = intent.id();
86 - IntentState oldState = states.get(id); 84 + states.put(id, state);
87 - states.put(id, newState); 85 + IntentEvent.Type type = (state == SUBMITTED ? IntentEvent.Type.SUBMITTED :
88 - return new IntentEvent(intent, newState, oldState, System.currentTimeMillis()); 86 + (state == INSTALLED ? IntentEvent.Type.INSTALLED :
87 + (state == FAILED ? IntentEvent.Type.FAILED :
88 + state == WITHDRAWN ? IntentEvent.Type.WITHDRAWN :
89 + null)));
90 + return type == null ? null : new IntentEvent(type, intent);
89 } 91 }
90 92
91 @Override 93 @Override
92 - public IntentEvent addInstallableIntents(IntentId intentId, List<InstallableIntent> result) { 94 + public void addInstallableIntents(IntentId intentId, List<InstallableIntent> result) {
93 installable.put(intentId, result); 95 installable.put(intentId, result);
94 - return this.setState(intents.get(intentId), COMPILED);
95 } 96 }
96 97
97 @Override 98 @Override
......
...@@ -89,5 +89,5 @@ function spy { ...@@ -89,5 +89,5 @@ function spy {
89 } 89 }
90 90
91 function nuke { 91 function nuke {
92 - spy | cut -c7-11 | xargs kill 92 + spy "$@" | cut -c7-11 | xargs kill
93 } 93 }
......