blob: a81004ff3c27c2a71fecffc27f61e4dd6f31eb42 [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
55import java.util.Collections;
Jordi Ortizaa8de492016-12-01 00:21:36 +010056import java.util.HashSet;
alshabibe1248b62015-08-20 17:21:55 -070057import java.util.Map;
58import java.util.Set;
59
60import static org.hamcrest.Matchers.is;
Jordi Ortizaa8de492016-12-01 00:21:36 +010061import static org.junit.Assert.*;
alshabibe1248b62015-08-20 17:21:55 -070062import static org.onosproject.net.NetTestTools.APP_ID;
63import static org.onosproject.net.NetTestTools.did;
64import static org.onosproject.net.NetTestTools.injectEventDispatcher;
65
66/**
67 * Meter manager tests.
68 */
69public class MeterManagerTest {
70
71 private static final ProviderId PID = new ProviderId("of", "foo");
72 private static final NodeId NID_LOCAL = new NodeId("local");
73 private static final IpAddress LOCALHOST = IpAddress.valueOf("127.0.0.1");
74
75 private MeterService service;
76 private MeterManager manager;
77 private DistributedMeterStore meterStore;
78 private MeterProviderRegistry registry;
79 private MeterProviderService providerService;
80
81 private TestProvider provider;
82
83 private ApplicationId appId;
84
85
86 private Meter m1;
87 private Meter m2;
88 private MeterRequest.Builder m1Request;
89 private MeterRequest.Builder m2Request;
90
91 private Map<MeterId, Meter> meters = Maps.newHashMap();
92
93 @Before
94 public void setup() throws Exception {
95 meterStore = new DistributedMeterStore();
96 TestUtils.setField(meterStore, "storageService", new TestStorageService());
97 TestUtils.setField(meterStore, "clusterService", new TestClusterService());
98 TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
99 meterStore.activate();
Jordi Ortizaa8de492016-12-01 00:21:36 +0100100 meterStore.storeMeterFeatures(DefaultMeterFeatures.builder().forDevice(did("1"))
101 .withMaxMeters(255L)
102 .withBandTypes(new HashSet<>())
103 .withUnits(new HashSet<>())
104 .hasStats(false)
105 .hasBurst(false)
106 .withMaxBands((byte) 0)
107 .withMaxColors((byte) 0)
108 .build());
109 meterStore.storeMeterFeatures(DefaultMeterFeatures.builder().forDevice(did("2"))
110 .withMaxMeters(2)
111 .withBandTypes(new HashSet<>())
112 .withUnits(new HashSet<>())
113 .hasBurst(false)
114 .hasStats(false)
115 .withMaxBands((byte) 0)
116 .withMaxColors((byte) 0)
117 .build());
alshabibe1248b62015-08-20 17:21:55 -0700118
119 manager = new MeterManager();
120 manager.store = meterStore;
121 TestUtils.setField(manager, "storageService", new TestStorageService());
122 injectEventDispatcher(manager, new TestEventDispatcher());
123 service = manager;
124 registry = manager;
125
126 manager.activate();
127
128 provider = new TestProvider(PID);
129 providerService = registry.register(provider);
130
131 appId = new TestApplicationId(0, "MeterManagerTest");
132
133 assertTrue("provider should be registered",
134 registry.getProviders().contains(provider.id()));
135
136 Band band = DefaultBand.builder()
137 .ofType(Band.Type.DROP)
138 .withRate(500)
139 .build();
140
141 m1 = DefaultMeter.builder()
142 .forDevice(did("1"))
143 .fromApp(APP_ID)
144 .withId(MeterId.meterId(1))
145 .withUnit(Meter.Unit.KB_PER_SEC)
146 .withBands(Collections.singletonList(band))
147 .build();
148
149 m2 = DefaultMeter.builder()
150 .forDevice(did("2"))
151 .fromApp(APP_ID)
alshabib70aaa1b2015-09-25 14:30:59 -0700152 .withId(MeterId.meterId(1))
alshabibe1248b62015-08-20 17:21:55 -0700153 .withUnit(Meter.Unit.KB_PER_SEC)
154 .withBands(Collections.singletonList(band))
155 .build();
156
157 m1Request = DefaultMeterRequest.builder()
158 .forDevice(did("1"))
159 .fromApp(APP_ID)
160 .withUnit(Meter.Unit.KB_PER_SEC)
161 .withBands(Collections.singletonList(band));
162
163 m2Request = DefaultMeterRequest.builder()
164 .forDevice(did("2"))
165 .fromApp(APP_ID)
166 .withUnit(Meter.Unit.KB_PER_SEC)
167 .withBands(Collections.singletonList(band));
168
169
170 }
171
172 @After
173 public void tearDown() {
174 registry.unregister(provider);
175 assertFalse("provider should not be registered",
176 registry.getProviders().contains(provider.id()));
177
178 manager.deactivate();
179 injectEventDispatcher(manager, null);
180
181 }
182
183 @Test
184 public void testAddition() {
185 manager.submit(m1Request.add());
186
187 assertTrue("The meter was not added", manager.getAllMeters().size() == 1);
188
alshabib70aaa1b2015-09-25 14:30:59 -0700189 assertThat(manager.getMeter(did("1"), MeterId.meterId(1)), is(m1));
alshabibe1248b62015-08-20 17:21:55 -0700190 }
191
192 @Test
193 public void testRemove() {
194 manager.submit(m1Request.add());
195 manager.withdraw(m1Request.remove(), m1.id());
196
alshabib70aaa1b2015-09-25 14:30:59 -0700197 assertThat(manager.getMeter(did("1"), MeterId.meterId(1)).state(),
alshabibe1248b62015-08-20 17:21:55 -0700198 is(MeterState.PENDING_REMOVE));
199
200 providerService.pushMeterMetrics(m1.deviceId(), Collections.emptyList());
201
202 assertTrue("The meter was not removed", manager.getAllMeters().size() == 0);
203
204 }
205
alshabib70aaa1b2015-09-25 14:30:59 -0700206 @Test
207 public void testMultipleDevice() {
208 manager.submit(m1Request.add());
209 manager.submit(m2Request.add());
alshabibe1248b62015-08-20 17:21:55 -0700210
alshabib70aaa1b2015-09-25 14:30:59 -0700211 assertTrue("The meters were not added", manager.getAllMeters().size() == 2);
212
213 assertThat(manager.getMeter(did("1"), MeterId.meterId(1)), is(m1));
214 assertThat(manager.getMeter(did("2"), MeterId.meterId(1)), is(m2));
215 }
alshabibe1248b62015-08-20 17:21:55 -0700216
Jordi Ortizaa8de492016-12-01 00:21:36 +0100217 @Test
218 public void testMeterFeatures() {
219 assertEquals(meterStore.getMaxMeters(MeterFeaturesKey.key(did("1"))), 255L);
220 assertEquals(meterStore.getMaxMeters(MeterFeaturesKey.key(did("2"))), 2);
221 }
222
223
224
alshabibe1248b62015-08-20 17:21:55 -0700225 public class TestApplicationId extends DefaultApplicationId {
226 public TestApplicationId(int id, String name) {
227 super(id, name);
228 }
229 }
230
231 private class TestProvider extends AbstractProvider implements MeterProvider {
232
233 protected TestProvider(ProviderId id) {
234 super(PID);
235 }
236
237 @Override
238 public void performMeterOperation(DeviceId deviceId, MeterOperations meterOps) {
239 //Currently unused.
240 }
241
242 @Override
243 public void performMeterOperation(DeviceId deviceId, MeterOperation meterOp) {
244 meters.put(meterOp.meter().id(), meterOp.meter());
245 }
246 }
247
248 private final class TestClusterService extends ClusterServiceAdapter {
249
250 ControllerNode local = new DefaultControllerNode(NID_LOCAL, LOCALHOST);
251
252 @Override
253 public ControllerNode getLocalNode() {
254 return local;
255 }
256
257 @Override
258 public Set<ControllerNode> getNodes() {
259 return Sets.newHashSet();
260 }
261
262 }
263
264 private class TestMastershipService extends MastershipServiceAdapter {
265 @Override
266 public NodeId getMasterFor(DeviceId deviceId) {
267 return NID_LOCAL;
268 }
269 }
270}