blob: af392ba514a18100d55f3b334631b765cef8c955 [file] [log] [blame]
Jian Li7d180c52016-02-01 21:53:08 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Jian Li7d180c52016-02-01 21:53:08 -08003 *
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 */
16package org.onosproject.cpman.impl;
17
18import com.google.common.collect.ImmutableSet;
19import org.junit.Before;
20import org.junit.Test;
21import org.onlab.packet.IpAddress;
22import org.onosproject.cluster.ClusterService;
23import org.onosproject.cluster.ControllerNode;
24import org.onosproject.cluster.NodeId;
25import org.onosproject.cpman.ControlMetric;
26import org.onosproject.cpman.ControlMetricType;
27import org.onosproject.cpman.MetricValue;
28import org.onosproject.net.DeviceId;
Jian Li23906cc2016-03-31 11:16:44 -070029import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
30import org.onosproject.store.cluster.messaging.ClusterCommunicationServiceAdapter;
Jian Li7d180c52016-02-01 21:53:08 -080031
32import java.util.Optional;
Jian Li85060ac2016-02-04 09:58:56 -080033import java.util.Set;
Jian Li67e1e152016-04-18 17:52:58 -070034import java.util.concurrent.ExecutionException;
Jian Li7d180c52016-02-01 21:53:08 -080035
36import static org.easymock.EasyMock.anyObject;
37import static org.easymock.EasyMock.createMock;
38import static org.easymock.EasyMock.expect;
39import static org.easymock.EasyMock.replay;
40import static org.hamcrest.Matchers.is;
41import static org.junit.Assert.assertThat;
Jian Li23906cc2016-03-31 11:16:44 -070042import static org.onosproject.cpman.ControlResource.CONTROL_MESSAGE_METRICS;
43import static org.onosproject.cpman.ControlResource.CPU_METRICS;
44import static org.onosproject.cpman.ControlResource.DISK_METRICS;
45import static org.onosproject.cpman.ControlResource.MEMORY_METRICS;
46import static org.onosproject.cpman.ControlResource.NETWORK_METRICS;
47import static org.onosproject.cpman.ControlResource.Type;
Jian Li7d180c52016-02-01 21:53:08 -080048
49/**
50 * Unit test of control plane monitoring service.
51 */
52public class ControlPlaneMonitorTest {
53
54 private ControlPlaneMonitor monitor;
55 private static final Integer UPDATE_INTERVAL = 1;
56 private ClusterService mockClusterService;
57 private ControllerNode mockControllerNode;
Jian Li23906cc2016-03-31 11:16:44 -070058 private ClusterCommunicationService mockCommunicationService;
Jian Li7d180c52016-02-01 21:53:08 -080059 private NodeId nodeId;
Jian Li7d180c52016-02-01 21:53:08 -080060
Jian Li85060ac2016-02-04 09:58:56 -080061 /**
62 * Sets up the services required by control plane monitor.
63 */
Jian Li7d180c52016-02-01 21:53:08 -080064 @Before
Jian Li85060ac2016-02-04 09:58:56 -080065 public void setup() {
Jian Li7d180c52016-02-01 21:53:08 -080066 monitor = new ControlPlaneMonitor();
Jian Li23906cc2016-03-31 11:16:44 -070067
68 mockCommunicationService = new ClusterCommunicationServiceAdapter();
69 monitor.communicationService = mockCommunicationService;
Jian Li7d180c52016-02-01 21:53:08 -080070
71 nodeId = new NodeId("1");
72 mockControllerNode = new MockControllerNode(nodeId);
73 mockClusterService = createMock(ClusterService.class);
74 monitor.clusterService = mockClusterService;
75
76 expect(mockClusterService.getNode(anyObject()))
77 .andReturn(mockControllerNode).anyTimes();
78 expect(mockClusterService.getLocalNode())
79 .andReturn(mockControllerNode).anyTimes();
80 replay(mockClusterService);
Jian Li23906cc2016-03-31 11:16:44 -070081
82 monitor.activate();
Jian Li7d180c52016-02-01 21:53:08 -080083 }
84
85 /**
86 * Mock class for a controller node.
87 */
88 private static class MockControllerNode implements ControllerNode {
89 final NodeId id;
90
91 public MockControllerNode(NodeId id) {
92 this.id = id;
93 }
94
95 @Override
96 public NodeId id() {
97 return this.id;
98 }
99
100 @Override
101 public IpAddress ip() {
102 return null;
103 }
104
105 @Override
106 public int tcpPort() {
107 return 0;
108 }
109 }
110
111 private void testUpdateMetricWithoutId(ControlMetricType cmt, MetricValue mv) {
112 ControlMetric cm = new ControlMetric(cmt, mv);
Jian Li67e1e152016-04-18 17:52:58 -0700113 monitor.updateMetric(cm, UPDATE_INTERVAL, Optional.empty());
Jian Li7d180c52016-02-01 21:53:08 -0800114 }
115
Jian Li67e1e152016-04-18 17:52:58 -0700116 private void testLoadMetric(NodeId nodeId, ControlMetricType cmt, MetricValue mv) {
117 try {
118 assertThat(monitor.getLoad(nodeId, cmt, Optional.empty()).get().latest(), is(mv.getLoad()));
119 } catch (InterruptedException e) {
120 e.printStackTrace();
121 } catch (ExecutionException e) {
122 e.printStackTrace();
123 }
Jian Li7d180c52016-02-01 21:53:08 -0800124 }
125
Jian Li85060ac2016-02-04 09:58:56 -0800126 private void testUpdateMetricWithResource(ControlMetricType cmt, MetricValue mv, String resourceName) {
Jian Li7d180c52016-02-01 21:53:08 -0800127 ControlMetric cm = new ControlMetric(cmt, mv);
Jian Li85060ac2016-02-04 09:58:56 -0800128 monitor.updateMetric(cm, UPDATE_INTERVAL, resourceName);
Jian Li7d180c52016-02-01 21:53:08 -0800129 }
130
Jian Li67e1e152016-04-18 17:52:58 -0700131 private void testLoadMetricWithResource(NodeId nodeId, ControlMetricType cmt, MetricValue mv, String resourceName) {
132 try {
133 assertThat(monitor.getLoad(nodeId, cmt, resourceName).get().latest(), is(mv.getLoad()));
134 } catch (InterruptedException e) {
135 e.printStackTrace();
136 } catch (ExecutionException e) {
137 e.printStackTrace();
138 }
Jian Li7d180c52016-02-01 21:53:08 -0800139 }
140
141 private void testUpdateMetricWithId(ControlMetricType cmt, MetricValue mv, DeviceId did) {
142 ControlMetric cm = new ControlMetric(cmt, mv);
143 monitor.updateMetric(cm, UPDATE_INTERVAL, Optional.of(did));
144 }
145
Jian Li67e1e152016-04-18 17:52:58 -0700146 private void testLoadMetricWithId(NodeId nodeId, ControlMetricType cmt, MetricValue mv, DeviceId did) {
147 try {
148 assertThat(monitor.getLoad(nodeId, cmt, Optional.of(did)).get().latest(), is(mv.getLoad()));
149 } catch (InterruptedException e) {
150 e.printStackTrace();
151 } catch (ExecutionException e) {
152 e.printStackTrace();
153 }
Jian Li7d180c52016-02-01 21:53:08 -0800154 }
155
Jian Li85060ac2016-02-04 09:58:56 -0800156 /**
157 * Tests cpu metric update and load function.
158 */
Jian Li7d180c52016-02-01 21:53:08 -0800159 @Test
160 public void testCpuMetric() {
161 MetricValue mv = new MetricValue.Builder().load(30).add();
162
163 CPU_METRICS.forEach(cmt -> testUpdateMetricWithoutId(cmt, mv));
Jian Li67e1e152016-04-18 17:52:58 -0700164 CPU_METRICS.forEach(cmt -> testLoadMetric(nodeId, cmt, mv));
Jian Li7d180c52016-02-01 21:53:08 -0800165 }
166
Jian Li85060ac2016-02-04 09:58:56 -0800167 /**
168 * Tests memory metric update and load function.
169 */
Jian Li7d180c52016-02-01 21:53:08 -0800170 @Test
171 public void testMemoryMetric() {
172 MetricValue mv = new MetricValue.Builder().load(40).add();
173
174 MEMORY_METRICS.forEach(cmt -> testUpdateMetricWithoutId(cmt, mv));
Jian Li67e1e152016-04-18 17:52:58 -0700175 MEMORY_METRICS.forEach(cmt -> testLoadMetric(nodeId, cmt, mv));
Jian Li7d180c52016-02-01 21:53:08 -0800176 }
177
Jian Li85060ac2016-02-04 09:58:56 -0800178 /**
179 * Tests disk metric update and load function.
180 */
Jian Li7d180c52016-02-01 21:53:08 -0800181 @Test
182 public void testDiskMetric() {
183 MetricValue mv = new MetricValue.Builder().load(50).add();
184
Jian Li85060ac2016-02-04 09:58:56 -0800185 Set<String> set = ImmutableSet.of("disk1", "disk2");
Jian Li7d180c52016-02-01 21:53:08 -0800186
187 set.forEach(disk -> DISK_METRICS.forEach(cmt ->
188 testUpdateMetricWithResource(cmt, mv, disk)));
189
190 set.forEach(disk -> DISK_METRICS.forEach(cmt ->
Jian Li67e1e152016-04-18 17:52:58 -0700191 testLoadMetricWithResource(nodeId, cmt, mv, disk)));
Jian Li7d180c52016-02-01 21:53:08 -0800192 }
193
Jian Li85060ac2016-02-04 09:58:56 -0800194 /**
195 * Tests network metric update and load function.
196 */
Jian Li7d180c52016-02-01 21:53:08 -0800197 @Test
198 public void testNetworkMetric() {
199 MetricValue mv = new MetricValue.Builder().load(10).add();
200
Jian Li85060ac2016-02-04 09:58:56 -0800201 Set<String> set = ImmutableSet.of("eth0", "eth1");
Jian Li7d180c52016-02-01 21:53:08 -0800202
203 set.forEach(network -> NETWORK_METRICS.forEach(cmt ->
204 testUpdateMetricWithResource(cmt, mv, network)));
205
206 set.forEach(network -> NETWORK_METRICS.forEach(cmt ->
Jian Li67e1e152016-04-18 17:52:58 -0700207 testLoadMetricWithResource(nodeId, cmt, mv, network)));
Jian Li7d180c52016-02-01 21:53:08 -0800208 }
209
Jian Li85060ac2016-02-04 09:58:56 -0800210 /**
211 * Tests control message update and load function.
212 */
Jian Li7d180c52016-02-01 21:53:08 -0800213 @Test
Jian Li85060ac2016-02-04 09:58:56 -0800214 public void testControlMessage() {
Jian Li7d180c52016-02-01 21:53:08 -0800215 MetricValue mv = new MetricValue.Builder().load(10).add();
Jian Li85060ac2016-02-04 09:58:56 -0800216 Set<DeviceId> set = ImmutableSet.of(DeviceId.deviceId("of:0000000000000001"),
217 DeviceId.deviceId("of:0000000000000002"));
Jian Li7d180c52016-02-01 21:53:08 -0800218
Jian Li85060ac2016-02-04 09:58:56 -0800219 set.forEach(devId -> CONTROL_MESSAGE_METRICS.forEach(cmt ->
220 testUpdateMetricWithId(cmt, mv, devId)));
Jian Li7d180c52016-02-01 21:53:08 -0800221
Jian Li85060ac2016-02-04 09:58:56 -0800222 set.forEach(devId -> CONTROL_MESSAGE_METRICS.forEach(cmt ->
Jian Li67e1e152016-04-18 17:52:58 -0700223 testLoadMetricWithId(nodeId, cmt, mv, devId)));
Jian Li85060ac2016-02-04 09:58:56 -0800224 }
Jian Li7d180c52016-02-01 21:53:08 -0800225
Jian Li85060ac2016-02-04 09:58:56 -0800226 /**
227 * Tests available resource update and load function.
228 */
229 @Test
230 public void testAvailableResources() {
231 MetricValue mv = new MetricValue.Builder().load(50).add();
232
233 Set<String> diskSet = ImmutableSet.of("disk1", "disk2");
234
235 diskSet.forEach(disk -> DISK_METRICS.forEach(cmt ->
236 testUpdateMetricWithResource(cmt, mv, disk)));
237
238 Set<String> networkSet = ImmutableSet.of("eth0", "eth1");
239
240 networkSet.forEach(network -> NETWORK_METRICS.forEach(cmt ->
241 testUpdateMetricWithResource(cmt, mv, network)));
242
Jian Li89eeccd2016-05-06 02:10:33 -0700243 assertThat(monitor.availableResourcesSync(nodeId, Type.DISK), is(diskSet));
244 assertThat(monitor.availableResourcesSync(nodeId, Type.NETWORK), is(networkSet));
Jian Li7d180c52016-02-01 21:53:08 -0800245 }
246}