blob: 547443335ac60d1c79cec76b474adf3973fa1ec4 [file] [log] [blame]
Jian Li8fe714d2021-01-11 02:35:06 +09001/*
2 * Copyright 2021-present Open Networking Foundation
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.kubevirtnetworking.impl;
17
18import com.google.common.collect.ImmutableSet;
19import com.google.common.collect.Lists;
20import com.google.common.util.concurrent.MoreExecutors;
21import org.junit.After;
22import org.junit.Before;
23import org.junit.Test;
24import org.onlab.junit.TestUtils;
25import org.onlab.packet.IpAddress;
26import org.onosproject.core.ApplicationId;
27import org.onosproject.core.CoreServiceAdapter;
28import org.onosproject.core.DefaultApplicationId;
29import org.onosproject.event.Event;
30import org.onosproject.kubevirtnetworking.api.DefaultKubevirtNetwork;
31import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
32import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
33import org.onosproject.kubevirtnetworking.api.KubevirtNetworkEvent;
34import org.onosproject.kubevirtnetworking.api.KubevirtNetworkListener;
35import org.onosproject.store.service.TestStorageService;
36
37import java.util.List;
38
39import static org.junit.Assert.assertEquals;
40import static org.junit.Assert.assertNotNull;
41import static org.junit.Assert.assertNull;
42import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.VXLAN;
43import static org.onosproject.kubevirtnetworking.api.KubevirtNetworkEvent.Type.KUBEVIRT_NETWORK_CREATED;
44import static org.onosproject.kubevirtnetworking.api.KubevirtNetworkEvent.Type.KUBEVIRT_NETWORK_REMOVED;
45import static org.onosproject.kubevirtnetworking.api.KubevirtNetworkEvent.Type.KUBEVIRT_NETWORK_UPDATED;
46
47/**
48 * Unit tests for kubevirt network manager.
49 */
50public class KubevirtNetworkManagerTest {
51
52 private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
53
54 private static final String UNKNOWN_ID = "unknown_id";
55 private static final String UPDATED_NAME = "updated_name";
56
57 private static final String NETWORK_ID = "network_id";
58 private static final String NETWORK_NAME = "network_name";
59
60 private static final KubevirtNetwork.Type TYPE = VXLAN;
61 private static final Integer MTU = 1500;
62 private static final String SEGMENT_ID = "1";
63 private static final IpAddress GATEWAY_IP = IpAddress.valueOf("10.10.10.1");
Jian Lie2abe812021-08-12 18:03:30 +090064 private static final boolean DEFAULT_ROUTE = true;
Jian Li8fe714d2021-01-11 02:35:06 +090065 private static final String CIDR = "10.10.10.0/24";
66 private static final IpAddress IP_POOL_START = IpAddress.valueOf("10.10.10.100");
67 private static final IpAddress IP_POOL_END = IpAddress.valueOf("10.10.10.200");
68
69 private static final KubevirtNetwork NETWORK = DefaultKubevirtNetwork.builder()
70 .networkId(NETWORK_ID)
71 .name(NETWORK_NAME)
72 .type(TYPE)
73 .mtu(MTU)
74 .segmentId(SEGMENT_ID)
75 .gatewayIp(GATEWAY_IP)
Jian Lie2abe812021-08-12 18:03:30 +090076 .defaultRoute(DEFAULT_ROUTE)
Jian Li8fe714d2021-01-11 02:35:06 +090077 .cidr(CIDR)
78 .ipPool(new KubevirtIpPool(IP_POOL_START, IP_POOL_END))
79 .hostRoutes(ImmutableSet.of())
80 .build();
81
82 private static final KubevirtNetwork NETWORK_UPDATED = DefaultKubevirtNetwork.builder()
83 .networkId(NETWORK_ID)
84 .name(UPDATED_NAME)
85 .type(TYPE)
86 .mtu(MTU)
87 .segmentId(SEGMENT_ID)
88 .gatewayIp(GATEWAY_IP)
Jian Lie2abe812021-08-12 18:03:30 +090089 .defaultRoute(DEFAULT_ROUTE)
Jian Li8fe714d2021-01-11 02:35:06 +090090 .cidr(CIDR)
91 .ipPool(new KubevirtIpPool(IP_POOL_START, IP_POOL_END))
92 .hostRoutes(ImmutableSet.of())
93 .build();
94
95 private final TestKubevirtnetworkListener testListener = new TestKubevirtnetworkListener();
96
97 private KubevirtNetworkManager target;
98 private DistributedKubevirtNetworkStore networkStore;
99
100 @Before
101 public void setUp() throws Exception {
102 networkStore = new DistributedKubevirtNetworkStore();
103 TestUtils.setField(networkStore, "coreService", new TestCoreService());
104 TestUtils.setField(networkStore, "storageService", new TestStorageService());
105 TestUtils.setField(networkStore, "eventExecutor", MoreExecutors.newDirectExecutorService());
106 networkStore.activate();
107
108 target = new KubevirtNetworkManager();
109 TestUtils.setField(target, "coreService", new TestCoreService());
110 target.networkStore = networkStore;
111 target.addListener(testListener);
112 target.activate();
113 }
114
115 @After
116 public void tearDown() {
117 target.removeListener(testListener);
118 networkStore.deactivate();
119 target.deactivate();
120 networkStore = null;
121 target = null;
122 }
123
124 /**
125 * Tests if getting all networks returns the correct set of networks.
126 */
127 @Test
128 public void testGetNetworks() {
129 createBasicNetworks();
130 assertEquals("Number of network did not match", 1, target.networks().size());
131 }
132
133 /**
134 * Tests if getting a network with ID returns the correct network.
135 */
136 @Test
137 public void testGetNetworkById() {
138 createBasicNetworks();
139 assertNotNull("Network did not match", target.network(NETWORK_ID));
140 assertNull("Network did not match", target.network(UNKNOWN_ID));
141 }
142
143 /**
144 * Tests creating and removing a network, and checks if it triggers proper events.
145 */
146 @Test
147 public void testCreateAndRemoveNetwork() {
148 target.createNetwork(NETWORK);
149 assertEquals("Number of networks did not match", 1, target.networks().size());
150 assertNotNull("Network was not created", target.network(NETWORK_ID));
151
152 target.removeNetwork(NETWORK_ID);
153 assertEquals("Number of networks did not match", 0, target.networks().size());
154 assertNull("Network was not removed", target.network(NETWORK_ID));
155
156 validateEvents(KUBEVIRT_NETWORK_CREATED, KUBEVIRT_NETWORK_REMOVED);
157 }
158
159 /**
160 * Tests updating a network, and checks if it triggers proper events.
161 */
162 @Test
163 public void testCreateAndUpdateNetwork() {
164 target.createNetwork(NETWORK);
165 assertEquals("Number of networks did not match", 1, target.networks().size());
166 assertEquals("Network did not match", NETWORK_NAME, target.network(NETWORK_ID).name());
167
168 target.updateNetwork(NETWORK_UPDATED);
169
170 assertEquals("Number of networks did not match", 1, target.networks().size());
171 assertEquals("Network did not match", UPDATED_NAME, target.network(NETWORK_ID).name());
172 validateEvents(KUBEVIRT_NETWORK_CREATED, KUBEVIRT_NETWORK_UPDATED);
173 }
174
175 /**
176 * Tests if creating a null network fails with an exception.
177 */
178 @Test(expected = NullPointerException.class)
179 public void testCreateNullNetwork() {
180 target.createNetwork(null);
181 }
182
183 /**
184 * Tests if creating a duplicate network fails with an exception.
185 */
186 @Test(expected = IllegalArgumentException.class)
187 public void testCreateDuplicateNetwork() {
188 target.createNetwork(NETWORK);
189 target.createNetwork(NETWORK);
190 }
191
192 /**
193 * Tests if removing network with null ID fails with an exception.
194 */
195 @Test(expected = IllegalArgumentException.class)
196 public void testRemoveNetworkWithNull() {
197 target.removeNetwork(null);
198 }
199
200 /**
201 * Tests if updating an unregistered network fails with an exception.
202 */
203 @Test(expected = IllegalArgumentException.class)
204 public void testUpdateUnregisteredNetwork() {
205 target.updateNetwork(NETWORK);
206 }
207
208 private void createBasicNetworks() {
209 target.createNetwork(NETWORK);
210 }
211
212 private static class TestCoreService extends CoreServiceAdapter {
213
214 @Override
215 public ApplicationId registerApplication(String name) {
216 return TEST_APP_ID;
217 }
218 }
219
220 private static class TestKubevirtnetworkListener implements KubevirtNetworkListener {
221 private List<KubevirtNetworkEvent> events = Lists.newArrayList();
222
223 @Override
224 public void event(KubevirtNetworkEvent event) {
225 events.add(event);
226 }
227 }
228
229 private void validateEvents(Enum... types) {
230 int i = 0;
231 assertEquals("Number of events did not match", types.length, testListener.events.size());
232 for (Event event : testListener.events) {
233 assertEquals("Incorrect event received", types[i], event.type());
234 i++;
235 }
236 testListener.events.clear();
237 }
238}