blob: 9d47fa54409eec1ac59cf50c5c1d96754ec37d24 [file] [log] [blame]
Hyunsun Moonc7eb0d02017-03-27 18:13:00 +09001/*
2 * Copyright 2017-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 */
16package org.onosproject.openstacknetworking.impl;
17
18import com.google.common.collect.Lists;
19import org.junit.After;
20import org.junit.Before;
21import org.junit.Test;
22import org.onlab.junit.TestTools;
23import org.onlab.junit.TestUtils;
24import org.onosproject.core.ApplicationId;
25import org.onosproject.core.CoreServiceAdapter;
26import org.onosproject.core.DefaultApplicationId;
27import org.onosproject.event.Event;
28import org.onosproject.openstacknetworking.api.OpenstackRouterEvent;
29import org.onosproject.openstacknetworking.api.OpenstackRouterListener;
30import org.onosproject.store.service.TestStorageService;
31import org.openstack4j.model.network.Router;
32import org.openstack4j.openstack.networking.domain.NeutronRouter;
33
34import java.util.List;
35
36import static org.junit.Assert.assertEquals;
37import static org.junit.Assert.assertTrue;
38import static org.onosproject.openstacknetworking.api.OpenstackRouterEvent.Type.*;
39
40/**
41 * Unit tests for OpenStack router manager.
42 */
43public class OpenstackRouterManagerTest {
44
45 private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
46
47 private static final String UNKNOWN_ID = "unknown_id";
48 private static final String ROUTER_ID = "router_1";
49 private static final String ROUTER_NAME = "router_1";
50 private static final Router ROUTER = NeutronRouter.builder()
51 .id(ROUTER_ID)
52 .name(ROUTER_NAME)
53 .build();
54
55 private final TestOpenstackRouterListener testListener = new TestOpenstackRouterListener();
56
57 private OpenstackRouterManager target;
58 private DistributedOpenstackRouterStore osRouterStore;
59
60 @Before
61 public void setUp() throws Exception {
62 osRouterStore = new DistributedOpenstackRouterStore();
63 TestUtils.setField(osRouterStore, "coreService", new TestCoreService());
64 TestUtils.setField(osRouterStore, "storageService", new TestStorageService());
65 osRouterStore.activate();
66
67 target = new OpenstackRouterManager();
68 target.coreService = new TestCoreService();
69 target.osRouterStore = osRouterStore;
70 target.addListener(testListener);
71 target.activate();
72 }
73
74 @After
75 public void tearDown() {
76 target.removeListener(testListener);
77 osRouterStore.deactivate();
78 target.deactivate();
79 osRouterStore = null;
80 target = null;
81 }
82
83 /**
84 * Tests if getting all routers returns correct set of values.
85 */
86 @Test
87 public void testGetRouters() {
88 createBasicRouters();
89 assertEquals("Number of router did not match", 1, target.routers().size());
90 }
91
92 /**
93 * Tests if getting a router with ID returns correct value.
94 */
95 @Test
96 public void testGetRouterById() {
97 createBasicRouters();
98 assertTrue("Router did not exist", target.router(ROUTER_ID) != null);
99 assertTrue("Router did not exist", target.router(UNKNOWN_ID) == null);
100 }
101
102 /**
103 * Tests creating and removing a router, and checks if proper event is triggered.
104 */
105 @Test
106 public void testCreateAndRemoveRouter() {
107 target.createRouter(ROUTER);
108 assertEquals("Number of router did not match", 1, target.routers().size());
109 assertTrue("Router was not created", target.router(ROUTER_ID) != null);
110
111 target.removeRouter(ROUTER.getId());
112 assertEquals("Number of router did not match", 0, target.routers().size());
113 assertTrue("Router was not removed", target.router(ROUTER_ID) == null);
114
115 validateEvents(OPENSTACK_ROUTER_CREATED, OPENSTACK_ROUTER_REMOVED);
116 }
117
118 /**
119 * Tests creating and updating a router, and checks if proper event is triggered.
120 */
121 @Test
122 public void testCreateAndUpdateRouter() {
123 target.createRouter(ROUTER);
124 assertEquals("Number of router did not match", 1, target.routers().size());
125 assertEquals("Router did not match", ROUTER_NAME, target.router(ROUTER_ID).getName());
126
127 final Router updated = NeutronRouter.builder()
128 .id(ROUTER_ID)
129 .name("updated-name")
130 .build();
131
132 target.updateRouter(updated);
133 assertEquals("Number of router did not match", 1, target.routers().size());
134 assertEquals("Router did not match", "updated-name", target.router(ROUTER_ID).getName());
135
136 validateEvents(OPENSTACK_ROUTER_CREATED, OPENSTACK_ROUTER_UPDATED);
137 }
138
139 /**
140 * Tests adding and removing external gateway to a router, and checks if
141 * proper events are triggered.
142 */
143 @Test
144 public void testAddAndRemoveExternalGateway() {
145 target.createRouter(ROUTER);
146 assertTrue("Router did not match", target.router(ROUTER_ID).getExternalGatewayInfo() == null);
147
148 Router updated = NeutronRouter.builder()
149 .id(ROUTER_ID)
150 .name(ROUTER_NAME)
151 .externalGateway("test-network-id")
152 .build();
153
154 target.updateRouter(updated);
155 assertEquals("Router did not match",
156 "test-network-id",
157 target.router(ROUTER_ID).getExternalGatewayInfo().getNetworkId());
158
159 target.updateRouter(ROUTER);
160 assertTrue("Router did not match", target.router(ROUTER_ID).getExternalGatewayInfo() == null);
161
162 validateEvents(OPENSTACK_ROUTER_CREATED, OPENSTACK_ROUTER_UPDATED,
163 OPENSTACK_ROUTER_GATEWAY_ADDED,
164 OPENSTACK_ROUTER_UPDATED,
165 OPENSTACK_ROUTER_GATEWAY_REMOVED);
166 }
167
168 /**
169 * Tests if creating a router with null value fails with an exception.
170 */
171 @Test(expected = NullPointerException.class)
172 public void testCreateRouterWithNull() {
173 target.createRouter(null);
174 }
175
176 /**
177 * Tests if creating a router with null ID fails with an exception.
178 */
179 @Test(expected = IllegalArgumentException.class)
180 public void testCreateRouterWithNullId() {
181 final Router testRouter = NeutronRouter.builder()
182 .id(null)
183 .name(ROUTER_NAME)
184 .build();
185 target.createRouter(testRouter);
186 }
187
188 /**
189 * Tests if updating a router with null name fails with an exception.
190 */
191 @Test(expected = IllegalArgumentException.class)
192 public void testCreateRouterWithNullName() {
193 final Router testRouter = NeutronRouter.builder()
194 .id(ROUTER_ID)
195 .name(null)
196 .build();
197 target.createRouter(testRouter);
198 }
199
200 /**
201 * Tests if creating a duplicate router fails with an exception.
202 */
203 @Test(expected = IllegalArgumentException.class)
204 public void testCreateDuplicateRouter() {
205 target.createRouter(ROUTER);
206 target.createRouter(ROUTER);
207 }
208
209 /**
210 * Tests if updating a router with null value fails with an exception.
211 */
212 @Test(expected = NullPointerException.class)
213 public void testUpdateRouterWithNull() {
214 target.updateRouter(null);
215 }
216
217 /**
218 * Tests if updating a router with null ID fails with an exception.
219 */
220 @Test(expected = IllegalArgumentException.class)
221 public void testUpdateRouterWithNullId() {
222 final Router testRouter = NeutronRouter.builder()
223 .id(null)
224 .name(ROUTER_NAME)
225 .build();
226 target.updateRouter(testRouter);
227 }
228
229 /**
230 * Tests if updating a router with null name fails with an exception.
231 */
232 @Test(expected = IllegalArgumentException.class)
233 public void testUpdateRouterWithNullName() {
234 final Router testRouter = NeutronRouter.builder()
235 .id(ROUTER_ID)
236 .name(null)
237 .build();
238 target.updateRouter(testRouter);
239 }
240
241 /**
242 * Tests if updating an unregistered router fails with an exception.
243 */
244 @Test(expected = IllegalArgumentException.class)
245 public void testUpdateUnregisteredRouter() {
246 target.updateRouter(ROUTER);
247 }
248
249 // TODO fix openstack4j floating IP data model and add unit tests
250
251 private void createBasicRouters() {
252 target.createRouter(ROUTER);
253 }
254
255 private static class TestCoreService extends CoreServiceAdapter {
256
257 @Override
258 public ApplicationId registerApplication(String name) {
259 return TEST_APP_ID;
260 }
261 }
262
263 private static class TestOpenstackRouterListener implements OpenstackRouterListener {
264 private List<OpenstackRouterEvent> events = Lists.newArrayList();
265
266 @Override
267 public void event(OpenstackRouterEvent event) {
268 events.add(event);
269 }
270 }
271
272 private void validateEvents(Enum... types) {
273 TestTools.assertAfter(100, () -> {
274 int i = 0;
275 assertEquals("Number of events did not match", types.length, testListener.events.size());
276 for (Event event : testListener.events) {
277 assertEquals("Incorrect event received", types[i], event.type());
278 i++;
279 }
280 testListener.events.clear();
281 });
282 }
283}