blob: a78f5148da9f36dcced722e872e7fe0ed68edc18 [file] [log] [blame]
Jian Li965de272019-02-19 15:35:55 +09001/*
2 * Copyright 2019-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.k8snetworking.impl;
17
18import com.google.common.collect.Lists;
19import com.google.common.util.concurrent.MoreExecutors;
20import io.fabric8.kubernetes.api.model.ObjectMeta;
21import io.fabric8.kubernetes.api.model.Service;
22import org.junit.After;
23import org.junit.Before;
24import org.junit.Test;
25import org.onlab.junit.TestUtils;
26import org.onosproject.core.ApplicationId;
27import org.onosproject.core.CoreServiceAdapter;
28import org.onosproject.core.DefaultApplicationId;
29import org.onosproject.event.Event;
30import org.onosproject.k8snetworking.api.K8sServiceEvent;
31import org.onosproject.k8snetworking.api.K8sServiceListener;
32import org.onosproject.store.service.TestStorageService;
33
34import java.util.List;
35
36import static org.junit.Assert.assertEquals;
37import static org.junit.Assert.assertNotNull;
38import static org.junit.Assert.assertNull;
39import static org.onosproject.k8snetworking.api.K8sServiceEvent.Type.K8S_SERVICE_CREATED;
40import static org.onosproject.k8snetworking.api.K8sServiceEvent.Type.K8S_SERVICE_REMOVED;
41import static org.onosproject.k8snetworking.api.K8sServiceEvent.Type.K8S_SERVICE_UPDATED;
42
43/**
44 * Unit tests for kubernetes service manager.
45 */
46public class K8sServiceManagerTest {
47
48 private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
49
50 private static final String UNKNOWN_UID = "unknown_uid";
51 private static final String UPDATED_UID = "updated_uid";
52 private static final String UPDATED_NAME = "updated_name";
53
54 private static final String SERVICE_UID = "service_uid";
55 private static final String SERVICE_NAME = "service_name_1";
56
57 private static final Service SERVICE = createK8sService(SERVICE_UID, SERVICE_NAME);
58 private static final Service SERVICE_UPDATED =
59 createK8sService(SERVICE_UID, UPDATED_NAME);
60
61
62 private final TestK8sServiceListener testListener = new TestK8sServiceListener();
63
64 private K8sServiceManager target;
65 private DistributedK8sServiceStore k8sServiceStore;
66
67 @Before
68 public void setUp() throws Exception {
69 k8sServiceStore = new DistributedK8sServiceStore();
70 TestUtils.setField(k8sServiceStore, "coreService", new TestCoreService());
71 TestUtils.setField(k8sServiceStore, "storageService", new TestStorageService());
72 TestUtils.setField(k8sServiceStore, "eventExecutor", MoreExecutors.newDirectExecutorService());
73 k8sServiceStore.activate();
74
75 target = new K8sServiceManager();
76 TestUtils.setField(target, "coreService", new TestCoreService());
77 target.k8sServiceStore = k8sServiceStore;
78 target.addListener(testListener);
79 target.activate();
80 }
81
82 @After
83 public void tearDown() {
84 target.removeListener(testListener);
85 k8sServiceStore.deactivate();
86 target.deactivate();
87 k8sServiceStore = null;
88 target = null;
89 }
90
91 /**
92 * Tests if getting all services return correct set of services.
93 */
94 @Test
95 public void testGetServices() {
96 createBasicServices();
97 assertEquals("Number of service did not match", 1, target.services().size());
98 }
99
100 /**
101 * Tests if getting a service with UID returns the correct service.
102 */
103 @Test
104 public void testGetServiceByUid() {
105 createBasicServices();
106 assertNotNull("Service did not match", target.service(SERVICE_UID));
107 assertNull("Service did not match", target.service(UNKNOWN_UID));
108 }
109
110 /**
111 * Tests creating and removing a service, and checks if it triggers proper events.
112 */
113 @Test
114 public void testCreateAndRemoveService() {
115 target.createService(SERVICE);
116 assertEquals("Number of services did not match", 1, target.services().size());
117 assertNotNull("Service was not created", target.service(SERVICE_UID));
118
119 target.removeService(SERVICE_UID);
120 assertEquals("Number of services did not match", 0, target.services().size());
121 assertNull("Service was not removed", target.service(SERVICE_UID));
122
123 validateEvents(K8S_SERVICE_CREATED, K8S_SERVICE_REMOVED);
124 }
125
126 /**
127 * Tests updating a service, and checks if it triggers proper events.
128 */
129 @Test
130 public void testCreateAndUpdateService() {
131 target.createService(SERVICE);
132 assertEquals("Number of services did not match", 1, target.services().size());
133 assertEquals("Service did not match", SERVICE_NAME,
134 target.service(SERVICE_UID).getMetadata().getName());
135
136 target.updateService(SERVICE_UPDATED);
137
138 assertEquals("Number of services did not match", 1, target.services().size());
139 assertEquals("Service did not match", UPDATED_NAME,
140 target.service(SERVICE_UID).getMetadata().getName());
141 validateEvents(K8S_SERVICE_CREATED, K8S_SERVICE_UPDATED);
142 }
143
144 /**
145 * Tests if creating a null service fails with an exception.
146 */
147 @Test(expected = NullPointerException.class)
148 public void testCreateNullService() {
149 target.createService(null);
150 }
151
152 /**
153 * Tests if creating a duplicate service fails with an exception.
154 */
155 @Test(expected = IllegalArgumentException.class)
156 public void testCreateDuplicateService() {
157 target.createService(SERVICE);
158 target.createService(SERVICE);
159 }
160
161 /**
162 * Tests if removing service with null ID fails with an exception.
163 */
164 @Test(expected = IllegalArgumentException.class)
165 public void testRemoveServiceWithNull() {
166 target.removeService(null);
167 }
168
169 /**
170 * Tests if updating an unregistered service fails with an exception.
171 */
172 @Test(expected = IllegalArgumentException.class)
173 public void testUpdateUnregisteredService() {
174 target.updateService(SERVICE);
175 }
176
177 private void createBasicServices() {
178 target.createService(SERVICE);
179 }
180
181 private static Service createK8sService(String uid, String name) {
182 ObjectMeta meta = new ObjectMeta();
183 meta.setUid(uid);
184 meta.setName(name);
185
186 Service service = new Service();
187 service.setApiVersion("v1");
188 service.setKind("service");
189 service.setMetadata(meta);
190
191 return service;
192 }
193
194 private static class TestCoreService extends CoreServiceAdapter {
195
196 @Override
197 public ApplicationId registerApplication(String name) {
198 return TEST_APP_ID;
199 }
200 }
201
202 private static class TestK8sServiceListener implements K8sServiceListener {
203 private List<K8sServiceEvent> events = Lists.newArrayList();
204
205 @Override
206 public void event(K8sServiceEvent event) {
207 events.add(event);
208 }
209 }
210
211 private void validateEvents(Enum... types) {
212 int i = 0;
213 assertEquals("Number of events did not match", types.length, testListener.events.size());
214 for (Event event : testListener.events) {
215 assertEquals("Incorrect event received", types[i], event.type());
216 i++;
217 }
218 testListener.events.clear();
219 }
220}