blob: 045f270103bf79d3eb1d53f8e7848ff10eee4e3b [file] [log] [blame]
alshabibe1248b62015-08-20 17:21:55 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
alshabibe1248b62015-08-20 17:21:55 -07003 *
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.incubator.net.meter.impl;
17
18import com.google.common.collect.Maps;
19import com.google.common.collect.Sets;
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.junit.TestUtils;
24import org.onlab.packet.IpAddress;
25import org.onosproject.cluster.ClusterServiceAdapter;
26import org.onosproject.cluster.ControllerNode;
27import org.onosproject.cluster.DefaultControllerNode;
28import org.onosproject.cluster.NodeId;
29import org.onosproject.common.event.impl.TestEventDispatcher;
30import org.onosproject.core.ApplicationId;
31import org.onosproject.core.DefaultApplicationId;
32import org.onosproject.incubator.store.meter.impl.DistributedMeterStore;
33import org.onosproject.mastership.MastershipServiceAdapter;
34import org.onosproject.net.DeviceId;
35import org.onosproject.net.meter.Band;
36import org.onosproject.net.meter.DefaultBand;
37import org.onosproject.net.meter.DefaultMeter;
Jordi Ortizaa8de492016-12-01 00:21:36 +010038import org.onosproject.net.meter.DefaultMeterFeatures;
alshabibe1248b62015-08-20 17:21:55 -070039import org.onosproject.net.meter.DefaultMeterRequest;
40import org.onosproject.net.meter.Meter;
Jordi Ortizaa8de492016-12-01 00:21:36 +010041import org.onosproject.net.meter.MeterFeaturesKey;
alshabibe1248b62015-08-20 17:21:55 -070042import org.onosproject.net.meter.MeterId;
43import org.onosproject.net.meter.MeterOperation;
44import org.onosproject.net.meter.MeterOperations;
45import org.onosproject.net.meter.MeterProvider;
46import org.onosproject.net.meter.MeterProviderRegistry;
47import org.onosproject.net.meter.MeterProviderService;
48import org.onosproject.net.meter.MeterRequest;
49import org.onosproject.net.meter.MeterService;
50import org.onosproject.net.meter.MeterState;
51import org.onosproject.net.provider.AbstractProvider;
52import org.onosproject.net.provider.ProviderId;
53import org.onosproject.store.service.TestStorageService;
54
Jordi Ortiz6c847762017-01-30 17:13:05 +010055import java.util.Collection;
alshabibe1248b62015-08-20 17:21:55 -070056import java.util.Collections;
Jordi Ortizaa8de492016-12-01 00:21:36 +010057import java.util.HashSet;
alshabibe1248b62015-08-20 17:21:55 -070058import java.util.Map;
59import java.util.Set;
60
61import static org.hamcrest.Matchers.is;
Jordi Ortizaa8de492016-12-01 00:21:36 +010062import static org.junit.Assert.*;
alshabibe1248b62015-08-20 17:21:55 -070063import static org.onosproject.net.NetTestTools.APP_ID;
64import static org.onosproject.net.NetTestTools.did;
65import static org.onosproject.net.NetTestTools.injectEventDispatcher;
66
67/**
68 * Meter manager tests.
69 */
70public class MeterManagerTest {
71
72 private static final ProviderId PID = new ProviderId("of", "foo");
73 private static final NodeId NID_LOCAL = new NodeId("local");
74 private static final IpAddress LOCALHOST = IpAddress.valueOf("127.0.0.1");
75
76 private MeterService service;
77 private MeterManager manager;
78 private DistributedMeterStore meterStore;
79 private MeterProviderRegistry registry;
80 private MeterProviderService providerService;
81
82 private TestProvider provider;
83
84 private ApplicationId appId;
85
86
87 private Meter m1;
88 private Meter m2;
89 private MeterRequest.Builder m1Request;
90 private MeterRequest.Builder m2Request;
Jordi Ortiz6c847762017-01-30 17:13:05 +010091 private MeterRequest.Builder m3Request;
alshabibe1248b62015-08-20 17:21:55 -070092
93 private Map<MeterId, Meter> meters = Maps.newHashMap();
94
95 @Before
96 public void setup() throws Exception {
97 meterStore = new DistributedMeterStore();
98 TestUtils.setField(meterStore, "storageService", new TestStorageService());
99 TestUtils.setField(meterStore, "clusterService", new TestClusterService());
100 TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
101 meterStore.activate();
Jordi Ortizaa8de492016-12-01 00:21:36 +0100102 meterStore.storeMeterFeatures(DefaultMeterFeatures.builder().forDevice(did("1"))
103 .withMaxMeters(255L)
104 .withBandTypes(new HashSet<>())
105 .withUnits(new HashSet<>())
106 .hasStats(false)
107 .hasBurst(false)
108 .withMaxBands((byte) 0)
109 .withMaxColors((byte) 0)
110 .build());
111 meterStore.storeMeterFeatures(DefaultMeterFeatures.builder().forDevice(did("2"))
112 .withMaxMeters(2)
113 .withBandTypes(new HashSet<>())
114 .withUnits(new HashSet<>())
115 .hasBurst(false)
116 .hasStats(false)
117 .withMaxBands((byte) 0)
118 .withMaxColors((byte) 0)
119 .build());
alshabibe1248b62015-08-20 17:21:55 -0700120
121 manager = new MeterManager();
122 manager.store = meterStore;
123 TestUtils.setField(manager, "storageService", new TestStorageService());
124 injectEventDispatcher(manager, new TestEventDispatcher());
125 service = manager;
126 registry = manager;
127
128 manager.activate();
129
130 provider = new TestProvider(PID);
131 providerService = registry.register(provider);
132
133 appId = new TestApplicationId(0, "MeterManagerTest");
134
135 assertTrue("provider should be registered",
136 registry.getProviders().contains(provider.id()));
137
138 Band band = DefaultBand.builder()
139 .ofType(Band.Type.DROP)
140 .withRate(500)
141 .build();
142
143 m1 = DefaultMeter.builder()
144 .forDevice(did("1"))
145 .fromApp(APP_ID)
146 .withId(MeterId.meterId(1))
147 .withUnit(Meter.Unit.KB_PER_SEC)
148 .withBands(Collections.singletonList(band))
149 .build();
150
151 m2 = DefaultMeter.builder()
152 .forDevice(did("2"))
153 .fromApp(APP_ID)
alshabib70aaa1b2015-09-25 14:30:59 -0700154 .withId(MeterId.meterId(1))
alshabibe1248b62015-08-20 17:21:55 -0700155 .withUnit(Meter.Unit.KB_PER_SEC)
156 .withBands(Collections.singletonList(band))
157 .build();
158
159 m1Request = DefaultMeterRequest.builder()
160 .forDevice(did("1"))
161 .fromApp(APP_ID)
162 .withUnit(Meter.Unit.KB_PER_SEC)
163 .withBands(Collections.singletonList(band));
164
165 m2Request = DefaultMeterRequest.builder()
166 .forDevice(did("2"))
167 .fromApp(APP_ID)
168 .withUnit(Meter.Unit.KB_PER_SEC)
169 .withBands(Collections.singletonList(band));
170
Jordi Ortiz6c847762017-01-30 17:13:05 +0100171 m3Request = DefaultMeterRequest.builder()
172 .forDevice(did("1"))
173 .fromApp(APP_ID)
174 .withUnit(Meter.Unit.KB_PER_SEC)
175 .withBands(Collections.singletonList(band));
alshabibe1248b62015-08-20 17:21:55 -0700176
177 }
178
179 @After
180 public void tearDown() {
181 registry.unregister(provider);
182 assertFalse("provider should not be registered",
183 registry.getProviders().contains(provider.id()));
184
185 manager.deactivate();
186 injectEventDispatcher(manager, null);
187
188 }
189
190 @Test
191 public void testAddition() {
192 manager.submit(m1Request.add());
193
194 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
195
alshabib70aaa1b2015-09-25 14:30:59 -0700196 assertThat(manager.getMeter(did("1"), MeterId.meterId(1)), is(m1));
alshabibe1248b62015-08-20 17:21:55 -0700197 }
198
199 @Test
200 public void testRemove() {
201 manager.submit(m1Request.add());
202 manager.withdraw(m1Request.remove(), m1.id());
203
alshabib70aaa1b2015-09-25 14:30:59 -0700204 assertThat(manager.getMeter(did("1"), MeterId.meterId(1)).state(),
alshabibe1248b62015-08-20 17:21:55 -0700205 is(MeterState.PENDING_REMOVE));
206
207 providerService.pushMeterMetrics(m1.deviceId(), Collections.emptyList());
208
209 assertTrue("The meter was not removed", manager.getAllMeters().size() == 0);
210
211 }
212
alshabib70aaa1b2015-09-25 14:30:59 -0700213 @Test
214 public void testMultipleDevice() {
215 manager.submit(m1Request.add());
216 manager.submit(m2Request.add());
alshabibe1248b62015-08-20 17:21:55 -0700217
alshabib70aaa1b2015-09-25 14:30:59 -0700218 assertTrue("The meters were not added", manager.getAllMeters().size() == 2);
219
220 assertThat(manager.getMeter(did("1"), MeterId.meterId(1)), is(m1));
221 assertThat(manager.getMeter(did("2"), MeterId.meterId(1)), is(m2));
222 }
alshabibe1248b62015-08-20 17:21:55 -0700223
Jordi Ortizaa8de492016-12-01 00:21:36 +0100224 @Test
225 public void testMeterFeatures() {
226 assertEquals(meterStore.getMaxMeters(MeterFeaturesKey.key(did("1"))), 255L);
227 assertEquals(meterStore.getMaxMeters(MeterFeaturesKey.key(did("2"))), 2);
228 }
229
Jordi Ortiz6c847762017-01-30 17:13:05 +0100230 @Test
231 public void testMeterReuse() {
232 manager.submit(m1Request.add());
233 manager.submit(m3Request.add());
234 Collection<Meter> meters = manager.getMeters(did("1"));
235 Meter m = meters.iterator().next();
236 MeterRequest mr = DefaultMeterRequest.builder()
237 .forDevice(m.deviceId())
238 .fromApp(m.appId())
239 .withBands(m.bands())
240 .withUnit(m.unit())
241 .remove();
242 manager.withdraw(mr, m.id());
243 mr = DefaultMeterRequest.builder()
244 .forDevice(m.deviceId())
245 .fromApp(m.appId())
246 .withBands(m.bands())
247 .withUnit(m.unit())
248 .add();
249 Meter meter = manager.submit(mr);
250 assertTrue("Meter id not reused", m.id().equals(meter.id()));
251
252 }
253
Jordi Ortizaa8de492016-12-01 00:21:36 +0100254
255
alshabibe1248b62015-08-20 17:21:55 -0700256 public class TestApplicationId extends DefaultApplicationId {
257 public TestApplicationId(int id, String name) {
258 super(id, name);
259 }
260 }
261
262 private class TestProvider extends AbstractProvider implements MeterProvider {
263
264 protected TestProvider(ProviderId id) {
265 super(PID);
266 }
267
268 @Override
269 public void performMeterOperation(DeviceId deviceId, MeterOperations meterOps) {
270 //Currently unused.
271 }
272
273 @Override
274 public void performMeterOperation(DeviceId deviceId, MeterOperation meterOp) {
275 meters.put(meterOp.meter().id(), meterOp.meter());
276 }
277 }
278
279 private final class TestClusterService extends ClusterServiceAdapter {
280
281 ControllerNode local = new DefaultControllerNode(NID_LOCAL, LOCALHOST);
282
283 @Override
284 public ControllerNode getLocalNode() {
285 return local;
286 }
287
288 @Override
289 public Set<ControllerNode> getNodes() {
290 return Sets.newHashSet();
291 }
292
293 }
294
295 private class TestMastershipService extends MastershipServiceAdapter {
296 @Override
297 public NodeId getMasterFor(DeviceId deviceId) {
298 return NID_LOCAL;
299 }
300 }
301}