ssyoon90
Committed by Gerrit Code Review

[Emu] openTAM: FlowStatisticManager, DistributedFlowStatisticStore, get-flow-sta…

…ts CLI Implementation and NewAdaptiveFlowStatsCollector update and typo

 - GetFlowStatistics.java
   .Fixed function name typo: immediateLoad()
 - SummaryFlowEntryWithLoad.java
   .Added javadoc
 - TypedFlowEntryWithLoad.java
   .Added javadoc,
   .and replace checknotnull and throw NullPointerException in typedPollInterval() at line 104

Change-Id: I23d2eaf234d0affeb5f927275148d9165c66c774
...@@ -25,6 +25,8 @@ import org.onosproject.net.ElementId; ...@@ -25,6 +25,8 @@ import org.onosproject.net.ElementId;
25 import org.onosproject.net.Port; 25 import org.onosproject.net.Port;
26 import org.onosproject.net.flow.FlowRule; 26 import org.onosproject.net.flow.FlowRule;
27 import org.onosproject.net.group.Group; 27 import org.onosproject.net.group.Group;
28 +
29 +import org.onosproject.net.statistic.TypedFlowEntryWithLoad;
28 import org.onosproject.net.topology.TopologyCluster; 30 import org.onosproject.net.topology.TopologyCluster;
29 31
30 import java.util.Comparator; 32 import java.util.Comparator;
...@@ -115,4 +117,12 @@ public final class Comparators { ...@@ -115,4 +117,12 @@ public final class Comparators {
115 public static final Comparator<Interface> INTERFACES_COMPARATOR = (intf1, intf2) -> 117 public static final Comparator<Interface> INTERFACES_COMPARATOR = (intf1, intf2) ->
116 CONNECT_POINT_COMPARATOR.compare(intf1.connectPoint(), intf2.connectPoint()); 118 CONNECT_POINT_COMPARATOR.compare(intf1.connectPoint(), intf2.connectPoint());
117 119
120 + public static final Comparator<TypedFlowEntryWithLoad> TYPEFLOWENTRY_WITHLOAD_COMPARATOR =
121 + new Comparator<TypedFlowEntryWithLoad>() {
122 + @Override
123 + public int compare(TypedFlowEntryWithLoad fe1, TypedFlowEntryWithLoad fe2) {
124 + long delta = fe1.load().rate() - fe2.load().rate();
125 + return delta == 0 ? 0 : (delta > 0 ? -1 : +1);
126 + }
127 + };
118 } 128 }
......
This diff is collapsed. Click to expand it.
...@@ -222,6 +222,12 @@ ...@@ -222,6 +222,12 @@
222 </completers> 222 </completers>
223 </command> 223 </command>
224 <command> 224 <command>
225 + <action class="org.onosproject.cli.net.GetFlowStatistics"/>
226 + <completers>
227 + <ref component-id="deviceIdCompleter"/>
228 + </completers>
229 + </command>
230 + <command>
225 <action class="org.onosproject.cli.net.AddMultiPointToSinglePointIntentCommand"/> 231 <action class="org.onosproject.cli.net.AddMultiPointToSinglePointIntentCommand"/>
226 <completers> 232 <completers>
227 <ref component-id="connectPointCompleter"/> 233 <ref component-id="connectPointCompleter"/>
...@@ -333,7 +339,6 @@ ...@@ -333,7 +339,6 @@
333 <command> 339 <command>
334 <action class="org.onosproject.cli.net.InterfacesListCommand"/> 340 <action class="org.onosproject.cli.net.InterfacesListCommand"/>
335 </command> 341 </command>
336 -
337 <command> 342 <command>
338 <action class="org.onosproject.cli.net.GroupsListCommand"/> 343 <action class="org.onosproject.cli.net.GroupsListCommand"/>
339 </command> 344 </command>
......
1 +/*
2 + * Copyright 2015 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.net.statistic;
18 +
19 +import org.onosproject.net.ConnectPoint;
20 +import org.onosproject.net.Device;
21 +import org.onosproject.net.PortNumber;
22 +import org.onosproject.net.flow.TypedStoredFlowEntry;
23 +import org.onosproject.net.flow.instructions.Instruction;
24 +
25 +import java.util.List;
26 +import java.util.Map;
27 +
28 +/**
29 + * Service for obtaining individual flow statistic information about device and link in the system.
30 + * Basic statistics are obtained from the StatisticService
31 + */
32 +public interface FlowStatisticService {
33 +
34 + /**
35 + * Obtain the summary load list for the device with the given link.
36 + *
37 + * @param device the Device to query.
38 + * @return map of summary flow entry load
39 + */
40 + Map<ConnectPoint, SummaryFlowEntryWithLoad> loadSummary(Device device);
41 +
42 + /**
43 + * Obtain the summary load for the device with the given link or port.
44 + *
45 + * @param device the Device to query.
46 + * @param pNumber the port number to query.
47 + * @return summary flow entry load
48 + */
49 + SummaryFlowEntryWithLoad loadSummary(Device device, PortNumber pNumber);
50 +
51 + /**
52 + * Obtain the set of the flow type and load list for the device with the given link.
53 + *
54 + * @param device the Device to query.
55 + * @param liveType the FlowLiveType to filter, null means no filtering .
56 + * @param instType the InstructionType to filter, null means no filtering.
57 + * @return map of flow entry load
58 + */
59 + Map<ConnectPoint, List<TypedFlowEntryWithLoad>> loadAllByType(Device device,
60 + TypedStoredFlowEntry.FlowLiveType liveType,
61 + Instruction.Type instType);
62 +
63 + /**
64 + * Obtain the flow type and load list for the device with the given link or port.
65 + *
66 + * @param device the Device to query.
67 + * @param pNumber the port number of the Device to query
68 + * @param liveType the FlowLiveType to filter, null means no filtering .
69 + * @param instType the InstructionType to filter, null means no filtering.
70 + * @return list of flow entry load
71 + */
72 + List<TypedFlowEntryWithLoad> loadAllByType(Device device, PortNumber pNumber,
73 + TypedStoredFlowEntry.FlowLiveType liveType,
74 + Instruction.Type instType);
75 +
76 + /**
77 + * Obtain the set of the flow type and load topn list for the device with the given link.
78 + *
79 + * @param device the Device to query.
80 + * @param liveType the FlowLiveType to filter, null means no filtering .
81 + * @param instType the InstructionType to filter, null means no filtering.
82 + * @param topn the top number to filter, null means no filtering.
83 + * @return map of flow entry load
84 + */
85 + Map<ConnectPoint, List<TypedFlowEntryWithLoad>> loadTopnByType(Device device,
86 + TypedStoredFlowEntry.FlowLiveType liveType,
87 + Instruction.Type instType,
88 + int topn);
89 +
90 + /**
91 + * Obtain the flow type and load topn list for the device with the given link or port.
92 + *
93 + * @param device the Device to query.
94 + * @param pNumber the port number of the Device to query
95 + * @param liveType the FlowLiveType to filter, null means no filtering .
96 + * @param instType the InstructionType to filter, null means no filtering.
97 + * @return list of flow entry load
98 + */
99 + List<TypedFlowEntryWithLoad> loadTopnByType(Device device, PortNumber pNumber,
100 + TypedStoredFlowEntry.FlowLiveType liveType,
101 + Instruction.Type instType,
102 + int topn);
103 +}
104 +
105 +
1 +/*
2 + * Copyright 2015 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.net.statistic;
18 +
19 +import org.onosproject.net.ConnectPoint;
20 +import org.onosproject.net.flow.FlowEntry;
21 +import org.onosproject.net.flow.FlowRule;
22 +
23 +import java.util.Set;
24 +
25 +/**
26 + * Flow Store to house the computed statistics.
27 + */
28 +public interface FlowStatisticStore {
29 + /**
30 + * Remove entries associated with this rule.
31 + *
32 + * @param rule {@link org.onosproject.net.flow.FlowRule}
33 + */
34 + void removeFlowStatistic(FlowRule rule);
35 +
36 + /**
37 + * Adds a flow stats observation for a flow rule. The previous flow will be removed.
38 + *
39 + * @param rule a {@link org.onosproject.net.flow.FlowEntry}
40 + */
41 + void addFlowStatistic(FlowEntry rule);
42 +
43 + /**
44 + * Updates a stats observation for a flow rule. The old flow stats will be moved to previous stats.
45 + *
46 + * @param rule a {@link org.onosproject.net.flow.FlowEntry}
47 + */
48 + void updateFlowStatistic(FlowEntry rule);
49 +
50 + /**
51 + * Fetches the current observed flow stats values.
52 + *
53 + * @param connectPoint the port to fetch information for
54 + * @return set of current flow rules
55 + */
56 + Set<FlowEntry> getCurrentFlowStatistic(ConnectPoint connectPoint);
57 +
58 + /**
59 + * Fetches the current observed flow stats values.
60 + *
61 + * @param connectPoint the port to fetch information for
62 + * @return set of current values
63 + */
64 + Set<FlowEntry> getPreviousFlowStatistic(ConnectPoint connectPoint);
65 +}
1 +/*
2 + * Copyright 2015 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.net.statistic;
18 +
19 +import org.onosproject.net.ConnectPoint;
20 +
21 +/**
22 + * Summary Load classified by flow live type.
23 + */
24 +public class SummaryFlowEntryWithLoad {
25 + private ConnectPoint cp;
26 + private Load totalLoad;
27 + private Load immediateLoad;
28 + private Load shortLoad;
29 + private Load midLoad;
30 + private Load longLoad;
31 + private Load unknownLoad;
32 +
33 + /**
34 + * Creates a new summary flow entry having load for the given connect point and total load.
35 + *
36 + * @param cp connect point
37 + * @param totalLoad total load
38 + */
39 + public SummaryFlowEntryWithLoad(ConnectPoint cp, Load totalLoad) {
40 + this.cp = cp;
41 + this.totalLoad = totalLoad;
42 + this.immediateLoad = new DefaultLoad();
43 + this.shortLoad = new DefaultLoad();
44 + this.midLoad = new DefaultLoad();
45 + this.longLoad = new DefaultLoad();
46 + this.unknownLoad = new DefaultLoad();
47 + }
48 +
49 + /**
50 + * Creates a new summary flow entry having load for the given connect point
51 + * and total, immediate, short, mid, and long load.
52 + *
53 + * @param cp connect point
54 + * @param totalLoad total load
55 + * @param immediateLoad immediate load
56 + * @param shortLoad short load
57 + * @param midLoad mid load
58 + * @param longLoad long load
59 + */
60 + public SummaryFlowEntryWithLoad(ConnectPoint cp,
61 + Load totalLoad, Load immediateLoad, Load shortLoad, Load midLoad, Load longLoad) {
62 + this.cp = cp;
63 + this.totalLoad = totalLoad;
64 + this.immediateLoad = immediateLoad;
65 + this.shortLoad = shortLoad;
66 + this.midLoad = midLoad;
67 + this.longLoad = longLoad;
68 + this.unknownLoad = new DefaultLoad();
69 + }
70 +
71 + /**
72 + * Creates a new summary flow entry having load for the given connect point
73 + * and total, immediate, short, mid, long, and unknown load.
74 + *
75 + * @param cp connect point
76 + * @param totalLoad total load
77 + * @param immediateLoad immediate load
78 + * @param shortLoad short load
79 + * @param midLoad mid load
80 + * @param longLoad long load
81 + * @param unknownLoad long load
82 + */
83 + public SummaryFlowEntryWithLoad(ConnectPoint cp,
84 + Load totalLoad, Load immediateLoad,
85 + Load shortLoad, Load midLoad, Load longLoad, Load unknownLoad) {
86 + this.cp = cp;
87 + this.totalLoad = totalLoad;
88 + this.immediateLoad = immediateLoad;
89 + this.shortLoad = shortLoad;
90 + this.midLoad = midLoad;
91 + this.longLoad = longLoad;
92 + this.unknownLoad = unknownLoad;
93 + }
94 +
95 + /**
96 + * Returns connect point.
97 + */
98 + public ConnectPoint connectPoint() {
99 + return cp;
100 + }
101 +
102 + /**
103 + * Returns total load of connect point.
104 + */
105 + public Load totalLoad() {
106 + return totalLoad;
107 + }
108 +
109 + /**
110 + * Returns immediate load of connect point.
111 + */
112 + public Load immediateLoad() {
113 + return immediateLoad;
114 + }
115 +
116 + /**
117 + * Returns short load of connect point.
118 + */
119 + public Load shortLoad() {
120 + return shortLoad;
121 + }
122 +
123 + /**
124 + * Returns mid load of connect point.
125 + */
126 + public Load midLoad() {
127 + return midLoad;
128 + }
129 +
130 + /**
131 + * Returns long load of connect point.
132 + */
133 + public Load longLoad() {
134 + return longLoad;
135 + }
136 +
137 + /**
138 + * Returns unknown load of connect point.
139 + */
140 + public Load unknownLoad() {
141 + return unknownLoad;
142 + }
143 +}
1 +/*
2 + * Copyright 2015 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.net.statistic;
18 +
19 +import org.onosproject.net.ConnectPoint;
20 +import org.onosproject.net.flow.FlowEntry;
21 +import org.onosproject.net.flow.TypedStoredFlowEntry;
22 +import org.onosproject.net.flow.DefaultTypedFlowEntry;
23 +
24 +import static com.google.common.base.Preconditions.checkNotNull;
25 +
26 +/**
27 + * Load of flow entry of flow live type.
28 + */
29 +public class TypedFlowEntryWithLoad {
30 + private ConnectPoint cp;
31 + private TypedStoredFlowEntry tfe;
32 + private Load load;
33 +
34 + //TODO: make this variables class, and share with NewAdaptivceFlowStatsCollector class
35 + private static final int CAL_AND_POLL_INTERVAL = 5; // means SHORT_POLL_INTERVAL
36 + private static final int MID_POLL_INTERVAL = 10;
37 + private static final int LONG_POLL_INTERVAL = 15;
38 +
39 +
40 + public TypedFlowEntryWithLoad(ConnectPoint cp, TypedStoredFlowEntry tfe, Load load) {
41 + this.cp = cp;
42 + this.tfe = tfe;
43 + this.load = load;
44 + }
45 +
46 + public TypedFlowEntryWithLoad(ConnectPoint cp, TypedStoredFlowEntry tfe) {
47 + this.cp = cp;
48 + this.tfe = tfe;
49 + this.load = new DefaultLoad(tfe.bytes(), 0, typedPollInterval(tfe));
50 + }
51 +
52 + public TypedFlowEntryWithLoad(ConnectPoint cp, FlowEntry fe) {
53 + this.cp = cp;
54 + this.tfe = newTypedStoredFlowEntry(fe);
55 + this.load = new DefaultLoad(fe.bytes(), 0, typedPollInterval(this.tfe));
56 + }
57 +
58 + public ConnectPoint connectPoint() {
59 + return cp;
60 + }
61 + public TypedStoredFlowEntry typedStoredFlowEntry() {
62 + return tfe;
63 + }
64 + public Load load() {
65 + return load;
66 + }
67 + public void setLoad(Load load) {
68 + this.load = load;
69 + }
70 +
71 + /**
72 + * Returns short polling interval.
73 + */
74 + public static int shortPollInterval() {
75 + return CAL_AND_POLL_INTERVAL;
76 + }
77 +
78 + /**
79 + * Returns mid polling interval.
80 + */
81 + public static int midPollInterval() {
82 + return MID_POLL_INTERVAL;
83 + }
84 +
85 + /**
86 + * Returns long polling interval.
87 + */
88 + public static int longPollInterval() {
89 + return LONG_POLL_INTERVAL;
90 + }
91 +
92 + /**
93 + * Returns average polling interval.
94 + */
95 + public static int avgPollInterval() {
96 + return (CAL_AND_POLL_INTERVAL + MID_POLL_INTERVAL + LONG_POLL_INTERVAL) / 3;
97 + }
98 +
99 + /**
100 + * Returns current typed flow entry's polling interval.
101 + *
102 + * @param tfe typed flow entry
103 + */
104 + public static long typedPollInterval(TypedStoredFlowEntry tfe) {
105 + checkNotNull(tfe, "TypedStoredFlowEntry cannot be null");
106 +
107 + switch (tfe.flowLiveType()) {
108 + case LONG_FLOW:
109 + return LONG_POLL_INTERVAL;
110 + case MID_FLOW:
111 + return MID_POLL_INTERVAL;
112 + case SHORT_FLOW:
113 + case IMMEDIATE_FLOW:
114 + default:
115 + return CAL_AND_POLL_INTERVAL;
116 + }
117 + }
118 +
119 + /**
120 + * Creates a new typed flow entry with the given flow entry fe.
121 + *
122 + * @param fe flow entry
123 + */
124 + public static TypedStoredFlowEntry newTypedStoredFlowEntry(FlowEntry fe) {
125 + if (fe == null) {
126 + return null;
127 + }
128 +
129 + long life = fe.life();
130 +
131 + if (life >= LONG_POLL_INTERVAL) {
132 + return new DefaultTypedFlowEntry(fe, TypedStoredFlowEntry.FlowLiveType.LONG_FLOW);
133 + } else if (life >= MID_POLL_INTERVAL) {
134 + return new DefaultTypedFlowEntry(fe, TypedStoredFlowEntry.FlowLiveType.MID_FLOW);
135 + } else if (life >= CAL_AND_POLL_INTERVAL) {
136 + return new DefaultTypedFlowEntry(fe, TypedStoredFlowEntry.FlowLiveType.SHORT_FLOW);
137 + } else if (life >= 0) {
138 + return new DefaultTypedFlowEntry(fe, TypedStoredFlowEntry.FlowLiveType.IMMEDIATE_FLOW);
139 + } else { // life < 0
140 + return new DefaultTypedFlowEntry(fe, TypedStoredFlowEntry.FlowLiveType.UNKNOWN_FLOW);
141 + }
142 + }
143 +}
...@@ -52,6 +52,20 @@ ...@@ -52,6 +52,20 @@
52 52
53 <dependency> 53 <dependency>
54 <groupId>org.onosproject</groupId> 54 <groupId>org.onosproject</groupId>
55 + <version>${project.version}</version>
56 + <artifactId>onos-cli</artifactId>
57 + </dependency>
58 +
59 + <dependency>
60 + <groupId>org.onosproject</groupId>
61 + <artifactId>onos-cli</artifactId>
62 + <version>${project.version}</version>
63 + <classifier>tests</classifier>
64 + <scope>test</scope>
65 + </dependency>
66 +
67 + <dependency>
68 + <groupId>org.onosproject</groupId>
55 <artifactId>onos-core-common</artifactId> 69 <artifactId>onos-core-common</artifactId>
56 <version>${project.version}</version> 70 <version>${project.version}</version>
57 <classifier>tests</classifier> 71 <classifier>tests</classifier>
......
...@@ -717,25 +717,9 @@ public class NewAdaptiveFlowStatsCollector { ...@@ -717,25 +717,9 @@ public class NewAdaptiveFlowStatsCollector {
717 long curTime = (cTime > 0 ? cTime : System.currentTimeMillis()); 717 long curTime = (cTime > 0 ? cTime : System.currentTimeMillis());
718 // For latency adjustment(default=500 millisecond) between FlowStatsRequest and Reply 718 // For latency adjustment(default=500 millisecond) between FlowStatsRequest and Reply
719 long fromLastSeen = ((curTime - fe.lastSeen() + latencyFlowStatsRequestAndReplyMillis) / 1000); 719 long fromLastSeen = ((curTime - fe.lastSeen() + latencyFlowStatsRequestAndReplyMillis) / 1000);
720 -
721 // fe.life() unit is SECOND! 720 // fe.life() unit is SECOND!
722 long liveTime = fe.life() + fromLastSeen; 721 long liveTime = fe.life() + fromLastSeen;
723 722
724 - // check flow timeout
725 - if (fe.timeout() > calAndPollInterval && fromLastSeen > fe.timeout()) {
726 - if (!fe.isPermanent()) {
727 - log.debug("checkAndMoveLiveFlowInternal, FlowId=" + Long.toHexString(fe.id().value())
728 - + ", liveType=" + fe.flowLiveType()
729 - + ", liveTime=" + liveTime
730 - + ", life=" + fe.life()
731 - + ", fromLastSeen=" + fromLastSeen
732 - + ", timeout=" + fe.timeout()
733 - + ", isPermanent=" + fe.isPermanent()
734 - + " AdaptiveStats collection thread for {}",
735 - sw.getStringId());
736 - return false;
737 - }
738 - }
739 723
740 switch (fe.flowLiveType()) { 724 switch (fe.flowLiveType()) {
741 case IMMEDIATE_FLOW: 725 case IMMEDIATE_FLOW:
......