Committed by
Gerrit Code Review
Support to query available resources from remote node
Change-Id: I465327143b5959b9e18daac9481ffea332f889c8
Showing
9 changed files
with
117 additions
and
19 deletions
... | @@ -15,6 +15,8 @@ | ... | @@ -15,6 +15,8 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.cpman; | 16 | package org.onosproject.cpman; |
17 | 17 | ||
18 | +import com.google.common.collect.ImmutableSet; | ||
19 | +import org.onlab.util.Tools; | ||
18 | import org.onosproject.cluster.NodeId; | 20 | import org.onosproject.cluster.NodeId; |
19 | import org.onosproject.net.DeviceId; | 21 | import org.onosproject.net.DeviceId; |
20 | 22 | ||
... | @@ -30,6 +32,8 @@ import static org.onosproject.cpman.ControlResource.Type; | ... | @@ -30,6 +32,8 @@ import static org.onosproject.cpman.ControlResource.Type; |
30 | */ | 32 | */ |
31 | public interface ControlPlaneMonitorService { | 33 | public interface ControlPlaneMonitorService { |
32 | 34 | ||
35 | + long TIMEOUT_MILLIS = 2000; | ||
36 | + | ||
33 | /** | 37 | /** |
34 | * Adds a new control metric value with a certain update interval. | 38 | * Adds a new control metric value with a certain update interval. |
35 | * | 39 | * |
... | @@ -116,8 +120,22 @@ public interface ControlPlaneMonitorService { | ... | @@ -116,8 +120,22 @@ public interface ControlPlaneMonitorService { |
116 | /** | 120 | /** |
117 | * Obtains a list of names of available resources. | 121 | * Obtains a list of names of available resources. |
118 | * | 122 | * |
123 | + * @param nodeId node identifier | ||
124 | + * @param resourceType resource type | ||
125 | + * @return completable future object of a collection of available resource names | ||
126 | + */ | ||
127 | + CompletableFuture<Set<String>> availableResources(NodeId nodeId, Type resourceType); | ||
128 | + | ||
129 | + /** | ||
130 | + * Synchronous version of availableResource. | ||
131 | + * Obtains a list of names of available resources. | ||
132 | + * | ||
133 | + * @param nodeId node identifier | ||
119 | * @param resourceType resource type | 134 | * @param resourceType resource type |
120 | - * @return a collection of names of available resources | 135 | + * @return a collection of available resource names |
121 | */ | 136 | */ |
122 | - Set<String> availableResources(Type resourceType); | 137 | + default Set<String> availableResourcesSync(NodeId nodeId, Type resourceType) { |
138 | + return Tools.futureGetOrElse(availableResources(nodeId, resourceType), | ||
139 | + TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, ImmutableSet.of()); | ||
140 | + } | ||
123 | } | 141 | } |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
1 | +/* | ||
2 | + * Copyright 2016-present 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 | +package org.onosproject.cpman; | ||
17 | + | ||
18 | +import com.google.common.base.MoreObjects; | ||
19 | + | ||
20 | +import java.util.Objects; | ||
21 | + | ||
22 | +import static com.google.common.base.MoreObjects.toStringHelper; | ||
23 | + | ||
24 | +/** | ||
25 | + * A container class that is used to request available resource of remote node. | ||
26 | + */ | ||
27 | +public class ControlResourceRequest { | ||
28 | + private final ControlResource.Type type; | ||
29 | + | ||
30 | + /** | ||
31 | + * Instantiates a new control resource request of the control resource type. | ||
32 | + * | ||
33 | + * @param type control resource type | ||
34 | + */ | ||
35 | + public ControlResourceRequest(ControlResource.Type type) { | ||
36 | + this.type = type; | ||
37 | + } | ||
38 | + | ||
39 | + /** | ||
40 | + * Obtains control resource type. | ||
41 | + * | ||
42 | + * @return control resource type | ||
43 | + */ | ||
44 | + public ControlResource.Type getType() { | ||
45 | + return type; | ||
46 | + } | ||
47 | + | ||
48 | + @Override | ||
49 | + public int hashCode() { | ||
50 | + return Objects.hash(type); | ||
51 | + } | ||
52 | + | ||
53 | + @Override | ||
54 | + public boolean equals(Object obj) { | ||
55 | + if (this == obj) { | ||
56 | + return true; | ||
57 | + } | ||
58 | + if (obj instanceof ControlResourceRequest) { | ||
59 | + final ControlResourceRequest other = (ControlResourceRequest) obj; | ||
60 | + return Objects.equals(this.type, other.type); | ||
61 | + } | ||
62 | + return false; | ||
63 | + } | ||
64 | + | ||
65 | + @Override | ||
66 | + public String toString() { | ||
67 | + MoreObjects.ToStringHelper helper; | ||
68 | + helper = toStringHelper(this) | ||
69 | + .add("type", type); | ||
70 | + return helper.toString(); | ||
71 | + } | ||
72 | +} |
... | @@ -21,6 +21,7 @@ import org.apache.karaf.shell.console.completer.ArgumentCompleter; | ... | @@ -21,6 +21,7 @@ import org.apache.karaf.shell.console.completer.ArgumentCompleter; |
21 | import org.apache.karaf.shell.console.completer.StringsCompleter; | 21 | import org.apache.karaf.shell.console.completer.StringsCompleter; |
22 | import org.onosproject.cli.AbstractCompleter; | 22 | import org.onosproject.cli.AbstractCompleter; |
23 | import org.onosproject.cli.AbstractShellCommand; | 23 | import org.onosproject.cli.AbstractShellCommand; |
24 | +import org.onosproject.cluster.NodeId; | ||
24 | import org.onosproject.cpman.ControlPlaneMonitorService; | 25 | import org.onosproject.cpman.ControlPlaneMonitorService; |
25 | import org.onosproject.cpman.ControlResource; | 26 | import org.onosproject.cpman.ControlResource; |
26 | import org.slf4j.Logger; | 27 | import org.slf4j.Logger; |
... | @@ -40,7 +41,7 @@ public class ResourceNameCompleter extends AbstractCompleter { | ... | @@ -40,7 +41,7 @@ public class ResourceNameCompleter extends AbstractCompleter { |
40 | private static final String NETWORK = "network"; | 41 | private static final String NETWORK = "network"; |
41 | private static final String DISK = "disk"; | 42 | private static final String DISK = "disk"; |
42 | private static final String CONTROL_MESSAGE = "control_message"; | 43 | private static final String CONTROL_MESSAGE = "control_message"; |
43 | - Set<String> resourceTypes = ImmutableSet.of(NETWORK, DISK, CONTROL_MESSAGE); | 44 | + private final Set<String> resourceTypes = ImmutableSet.of(NETWORK, DISK, CONTROL_MESSAGE); |
44 | private static final String INVALID_MSG = "Invalid type name"; | 45 | private static final String INVALID_MSG = "Invalid type name"; |
45 | 46 | ||
46 | 47 | ||
... | @@ -51,7 +52,8 @@ public class ResourceNameCompleter extends AbstractCompleter { | ... | @@ -51,7 +52,8 @@ public class ResourceNameCompleter extends AbstractCompleter { |
51 | 52 | ||
52 | // Resource type is the second argument. | 53 | // Resource type is the second argument. |
53 | ArgumentCompleter.ArgumentList list = getArgumentList(); | 54 | ArgumentCompleter.ArgumentList list = getArgumentList(); |
54 | - String type = list.getArguments()[1]; | 55 | + String nodeId = list.getArguments()[1]; |
56 | + String type = list.getArguments()[2]; | ||
55 | 57 | ||
56 | if (resourceTypes.contains(type)) { | 58 | if (resourceTypes.contains(type)) { |
57 | ControlPlaneMonitorService monitorService = | 59 | ControlPlaneMonitorService monitorService = |
... | @@ -60,13 +62,16 @@ public class ResourceNameCompleter extends AbstractCompleter { | ... | @@ -60,13 +62,16 @@ public class ResourceNameCompleter extends AbstractCompleter { |
60 | Set<String> set = Sets.newHashSet(); | 62 | Set<String> set = Sets.newHashSet(); |
61 | switch (type) { | 63 | switch (type) { |
62 | case NETWORK: | 64 | case NETWORK: |
63 | - set = monitorService.availableResources(ControlResource.Type.NETWORK); | 65 | + set = monitorService.availableResourcesSync(NodeId.nodeId(nodeId), |
66 | + ControlResource.Type.NETWORK); | ||
64 | break; | 67 | break; |
65 | case DISK: | 68 | case DISK: |
66 | - set = monitorService.availableResources(ControlResource.Type.DISK); | 69 | + set = monitorService.availableResourcesSync(NodeId.nodeId(nodeId), |
70 | + ControlResource.Type.DISK); | ||
67 | break; | 71 | break; |
68 | case CONTROL_MESSAGE: | 72 | case CONTROL_MESSAGE: |
69 | - set = monitorService.availableResources(ControlResource.Type.CONTROL_MESSAGE); | 73 | + set = monitorService.availableResourcesSync(NodeId.nodeId(nodeId), |
74 | + ControlResource.Type.CONTROL_MESSAGE); | ||
70 | break; | 75 | break; |
71 | default: | 76 | default: |
72 | log.warn(INVALID_MSG); | 77 | log.warn(INVALID_MSG); |
... | @@ -76,7 +81,7 @@ public class ResourceNameCompleter extends AbstractCompleter { | ... | @@ -76,7 +81,7 @@ public class ResourceNameCompleter extends AbstractCompleter { |
76 | SortedSet<String> strings = delegate.getStrings(); | 81 | SortedSet<String> strings = delegate.getStrings(); |
77 | 82 | ||
78 | if (set.size() != 0) { | 83 | if (set.size() != 0) { |
79 | - set.forEach(s -> strings.add(s)); | 84 | + set.forEach(strings::add); |
80 | } | 85 | } |
81 | } | 86 | } |
82 | 87 | ... | ... |
... | @@ -25,6 +25,7 @@ import org.apache.commons.lang.ArrayUtils; | ... | @@ -25,6 +25,7 @@ import org.apache.commons.lang.ArrayUtils; |
25 | import org.apache.commons.lang3.StringUtils; | 25 | import org.apache.commons.lang3.StringUtils; |
26 | import org.joda.time.LocalDateTime; | 26 | import org.joda.time.LocalDateTime; |
27 | import org.onosproject.cluster.ClusterService; | 27 | import org.onosproject.cluster.ClusterService; |
28 | +import org.onosproject.cluster.NodeId; | ||
28 | import org.onosproject.cpman.ControlLoadSnapshot; | 29 | import org.onosproject.cpman.ControlLoadSnapshot; |
29 | import org.onosproject.cpman.ControlMetricType; | 30 | import org.onosproject.cpman.ControlMetricType; |
30 | import org.onosproject.cpman.ControlPlaneMonitorService; | 31 | import org.onosproject.cpman.ControlPlaneMonitorService; |
... | @@ -96,10 +97,11 @@ public class CpmanViewMessageHandler extends UiMessageHandler { | ... | @@ -96,10 +97,11 @@ public class CpmanViewMessageHandler extends UiMessageHandler { |
96 | ControlPlaneMonitorService cpms = get(ControlPlaneMonitorService.class); | 97 | ControlPlaneMonitorService cpms = get(ControlPlaneMonitorService.class); |
97 | ClusterService cs = get(ClusterService.class); | 98 | ClusterService cs = get(ClusterService.class); |
98 | DeviceService ds = get(DeviceService.class); | 99 | DeviceService ds = get(DeviceService.class); |
100 | + NodeId localNodeId = cs.getLocalNode().id(); | ||
99 | 101 | ||
100 | if (!Strings.isNullOrEmpty(uri)) { | 102 | if (!Strings.isNullOrEmpty(uri)) { |
101 | DeviceId deviceId = DeviceId.deviceId(uri); | 103 | DeviceId deviceId = DeviceId.deviceId(uri); |
102 | - if (cpms.availableResources(CONTROL_MESSAGE).contains(deviceId.toString())) { | 104 | + if (cpms.availableResourcesSync(localNodeId, CONTROL_MESSAGE).contains(deviceId.toString())) { |
103 | Map<ControlMetricType, Long[]> data = generateMatrix(cpms, cs, deviceId); | 105 | Map<ControlMetricType, Long[]> data = generateMatrix(cpms, cs, deviceId); |
104 | LocalDateTime ldt = new LocalDateTime(timestamp * MILLI_CONV_UNIT); | 106 | LocalDateTime ldt = new LocalDateTime(timestamp * MILLI_CONV_UNIT); |
105 | 107 | ||
... | @@ -110,7 +112,7 @@ public class CpmanViewMessageHandler extends UiMessageHandler { | ... | @@ -110,7 +112,7 @@ public class CpmanViewMessageHandler extends UiMessageHandler { |
110 | attachDeviceList(cm, deviceIds); | 112 | attachDeviceList(cm, deviceIds); |
111 | } | 113 | } |
112 | } else { | 114 | } else { |
113 | - Set<String> deviceIds = cpms.availableResources(CONTROL_MESSAGE); | 115 | + Set<String> deviceIds = cpms.availableResourcesSync(localNodeId, CONTROL_MESSAGE); |
114 | for (String deviceId : deviceIds) { | 116 | for (String deviceId : deviceIds) { |
115 | Map<ControlMetricType, Long> data = | 117 | Map<ControlMetricType, Long> data = |
116 | populateDeviceMetrics(cpms, cs, DeviceId.deviceId(deviceId)); | 118 | populateDeviceMetrics(cpms, cs, DeviceId.deviceId(deviceId)); | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -54,7 +54,7 @@ import static org.onosproject.cpman.ControlResource.Type.NETWORK; | ... | @@ -54,7 +54,7 @@ import static org.onosproject.cpman.ControlResource.Type.NETWORK; |
54 | public class ControlMetricsWebResource extends AbstractWebResource { | 54 | public class ControlMetricsWebResource extends AbstractWebResource { |
55 | 55 | ||
56 | private final ControlPlaneMonitorService monitorService = | 56 | private final ControlPlaneMonitorService monitorService = |
57 | - get(ControlPlaneMonitorService.class); | 57 | + get(ControlPlaneMonitorService.class); |
58 | private final ClusterService clusterService = get(ClusterService.class); | 58 | private final ClusterService clusterService = get(ClusterService.class); |
59 | private final NodeId localNodeId = clusterService.getLocalNode().id(); | 59 | private final NodeId localNodeId = clusterService.getLocalNode().id(); |
60 | private final ObjectNode root = mapper().createObjectNode(); | 60 | private final ObjectNode root = mapper().createObjectNode(); |
... | @@ -72,7 +72,7 @@ public class ControlMetricsWebResource extends AbstractWebResource { | ... | @@ -72,7 +72,7 @@ public class ControlMetricsWebResource extends AbstractWebResource { |
72 | public Response controlMessageMetrics() { | 72 | public Response controlMessageMetrics() { |
73 | 73 | ||
74 | ArrayNode deviceNodes = root.putArray("devices"); | 74 | ArrayNode deviceNodes = root.putArray("devices"); |
75 | - monitorService.availableResources(CONTROL_MESSAGE).forEach(name -> { | 75 | + monitorService.availableResourcesSync(localNodeId, CONTROL_MESSAGE).forEach(name -> { |
76 | ObjectNode deviceNode = mapper().createObjectNode(); | 76 | ObjectNode deviceNode = mapper().createObjectNode(); |
77 | ObjectNode valueNode = mapper().createObjectNode(); | 77 | ObjectNode valueNode = mapper().createObjectNode(); |
78 | 78 | ||
... | @@ -147,7 +147,7 @@ public class ControlMetricsWebResource extends AbstractWebResource { | ... | @@ -147,7 +147,7 @@ public class ControlMetricsWebResource extends AbstractWebResource { |
147 | public Response diskMetrics() { | 147 | public Response diskMetrics() { |
148 | 148 | ||
149 | ArrayNode diskNodes = root.putArray("disks"); | 149 | ArrayNode diskNodes = root.putArray("disks"); |
150 | - monitorService.availableResources(DISK).forEach(name -> { | 150 | + monitorService.availableResourcesSync(localNodeId, DISK).forEach(name -> { |
151 | ObjectNode diskNode = mapper().createObjectNode(); | 151 | ObjectNode diskNode = mapper().createObjectNode(); |
152 | ObjectNode valueNode = mapper().createObjectNode(); | 152 | ObjectNode valueNode = mapper().createObjectNode(); |
153 | 153 | ||
... | @@ -173,7 +173,7 @@ public class ControlMetricsWebResource extends AbstractWebResource { | ... | @@ -173,7 +173,7 @@ public class ControlMetricsWebResource extends AbstractWebResource { |
173 | public Response networkMetrics() { | 173 | public Response networkMetrics() { |
174 | 174 | ||
175 | ArrayNode networkNodes = root.putArray("networks"); | 175 | ArrayNode networkNodes = root.putArray("networks"); |
176 | - monitorService.availableResources(NETWORK).forEach(name -> { | 176 | + monitorService.availableResourcesSync(localNodeId, NETWORK).forEach(name -> { |
177 | ObjectNode networkNode = mapper().createObjectNode(); | 177 | ObjectNode networkNode = mapper().createObjectNode(); |
178 | ObjectNode valueNode = mapper().createObjectNode(); | 178 | ObjectNode valueNode = mapper().createObjectNode(); |
179 | 179 | ... | ... |
... | @@ -240,7 +240,7 @@ public class ControlPlaneMonitorTest { | ... | @@ -240,7 +240,7 @@ public class ControlPlaneMonitorTest { |
240 | networkSet.forEach(network -> NETWORK_METRICS.forEach(cmt -> | 240 | networkSet.forEach(network -> NETWORK_METRICS.forEach(cmt -> |
241 | testUpdateMetricWithResource(cmt, mv, network))); | 241 | testUpdateMetricWithResource(cmt, mv, network))); |
242 | 242 | ||
243 | - assertThat(monitor.availableResources(Type.DISK), is(diskSet)); | 243 | + assertThat(monitor.availableResourcesSync(nodeId, Type.DISK), is(diskSet)); |
244 | - assertThat(monitor.availableResources(Type.NETWORK), is(networkSet)); | 244 | + assertThat(monitor.availableResourcesSync(nodeId, Type.NETWORK), is(networkSet)); |
245 | } | 245 | } |
246 | } | 246 | } | ... | ... |
... | @@ -75,7 +75,8 @@ public class ControlPlaneMonitorServiceAdaptor implements ControlPlaneMonitorSer | ... | @@ -75,7 +75,8 @@ public class ControlPlaneMonitorServiceAdaptor implements ControlPlaneMonitorSer |
75 | } | 75 | } |
76 | 76 | ||
77 | @Override | 77 | @Override |
78 | - public Set<String> availableResources(ControlResource.Type resourceType) { | 78 | + public CompletableFuture<Set<String>> availableResources(NodeId nodeId, |
79 | + ControlResource.Type resourceType) { | ||
79 | return null; | 80 | return null; |
80 | } | 81 | } |
81 | } | 82 | } | ... | ... |
... | @@ -166,7 +166,7 @@ public class ControlMetricsResourceTest extends ResourceTest { | ... | @@ -166,7 +166,7 @@ public class ControlMetricsResourceTest extends ResourceTest { |
166 | */ | 166 | */ |
167 | @Test | 167 | @Test |
168 | public void testResourceEmptyArray() { | 168 | public void testResourceEmptyArray() { |
169 | - expect(mockControlPlaneMonitorService.availableResources(anyObject())) | 169 | + expect(mockControlPlaneMonitorService.availableResourcesSync(anyObject(), anyObject())) |
170 | .andReturn(ImmutableSet.of()).once(); | 170 | .andReturn(ImmutableSet.of()).once(); |
171 | replay(mockControlPlaneMonitorService); | 171 | replay(mockControlPlaneMonitorService); |
172 | final WebTarget wt = target(); | 172 | final WebTarget wt = target(); |
... | @@ -181,7 +181,7 @@ public class ControlMetricsResourceTest extends ResourceTest { | ... | @@ -181,7 +181,7 @@ public class ControlMetricsResourceTest extends ResourceTest { |
181 | */ | 181 | */ |
182 | @Test | 182 | @Test |
183 | public void testResourcePopulatedArray() { | 183 | public void testResourcePopulatedArray() { |
184 | - expect(mockControlPlaneMonitorService.availableResources(anyObject())) | 184 | + expect(mockControlPlaneMonitorService.availableResourcesSync(anyObject(), anyObject())) |
185 | .andReturn(resourceSet).once(); | 185 | .andReturn(resourceSet).once(); |
186 | expect(mockControlPlaneMonitorService.getLoad(anyObject(), anyObject(), | 186 | expect(mockControlPlaneMonitorService.getLoad(anyObject(), anyObject(), |
187 | anyString())).andReturn(null).times(4); | 187 | anyString())).andReturn(null).times(4); | ... | ... |
-
Please register or login to post a comment