blob: bf5d3371566f40e459395992dcfff24f9787b5af [file] [log] [blame]
Jian Li3defa842019-02-12 00:31:35 +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.k8snode.codec;
17
18import com.fasterxml.jackson.databind.JsonNode;
19import com.fasterxml.jackson.databind.ObjectMapper;
20import com.fasterxml.jackson.databind.node.ObjectNode;
Jian Lie2a04ce2020-07-01 19:07:02 +090021import com.google.common.collect.ImmutableSet;
Jian Li3defa842019-02-12 00:31:35 +090022import org.junit.Before;
23import org.junit.Test;
24import org.onlab.packet.IpAddress;
Jian Lie2a04ce2020-07-01 19:07:02 +090025import org.onlab.packet.IpPrefix;
Jian Li3defa842019-02-12 00:31:35 +090026import org.onosproject.codec.CodecContext;
27import org.onosproject.codec.JsonCodec;
28import org.onosproject.codec.impl.CodecManager;
29import org.onosproject.core.CoreService;
Jian Lie2a04ce2020-07-01 19:07:02 +090030import org.onosproject.k8snode.api.DefaultHostNodesInfo;
Jian Li3defa842019-02-12 00:31:35 +090031import org.onosproject.k8snode.api.DefaultK8sApiConfig;
Jian Lie2a04ce2020-07-01 19:07:02 +090032import org.onosproject.k8snode.api.HostNodesInfo;
Jian Li3defa842019-02-12 00:31:35 +090033import org.onosproject.k8snode.api.K8sApiConfig;
34
35import java.io.IOException;
36import java.io.InputStream;
37import java.util.HashMap;
38import java.util.Map;
Jian Lie2a04ce2020-07-01 19:07:02 +090039import java.util.Set;
Jian Li3defa842019-02-12 00:31:35 +090040
41import static junit.framework.TestCase.assertEquals;
Jian Lic2242bd2020-09-03 13:12:14 +090042import static junit.framework.TestCase.assertTrue;
Jian Li3defa842019-02-12 00:31:35 +090043import static org.easymock.EasyMock.createMock;
44import static org.easymock.EasyMock.expect;
45import static org.easymock.EasyMock.replay;
46import static org.hamcrest.MatcherAssert.assertThat;
47import static org.hamcrest.Matchers.notNullValue;
Jian Li1cee9882019-02-13 11:25:25 +090048import static org.onosproject.k8snode.api.K8sApiConfig.State.CONNECTED;
Jian Li3defa842019-02-12 00:31:35 +090049import static org.onosproject.k8snode.codec.K8sApiConfigJsonMatcher.matchesK8sApiConfig;
50import static org.onosproject.net.NetTestTools.APP_ID;
51
52/**
53 * Unit tests for kubernetes API config codec.
54 */
55public class K8sApiConfigCodecTest {
56
57 MockCodecContext context;
58
59 JsonCodec<K8sApiConfig> k8sApiConfigCodec;
Jian Lie2a04ce2020-07-01 19:07:02 +090060 JsonCodec<HostNodesInfo> hostNodesInfoCodec;
Jian Li3defa842019-02-12 00:31:35 +090061
62 final CoreService mockCoreService = createMock(CoreService.class);
63 private static final String REST_APP_ID = "org.onosproject.rest";
64
65 /**
66 * Initial setup for this unit test.
67 */
68 @Before
69 public void setUp() {
70 context = new MockCodecContext();
71 k8sApiConfigCodec = new K8sApiConfigCodec();
Jian Lie2a04ce2020-07-01 19:07:02 +090072 hostNodesInfoCodec = new HostNodesInfoCodec();
Jian Li3defa842019-02-12 00:31:35 +090073
74 assertThat(k8sApiConfigCodec, notNullValue());
Jian Lie2a04ce2020-07-01 19:07:02 +090075 assertThat(hostNodesInfoCodec, notNullValue());
Jian Li3defa842019-02-12 00:31:35 +090076
77 expect(mockCoreService.registerApplication(REST_APP_ID))
78 .andReturn(APP_ID).anyTimes();
79 replay(mockCoreService);
80 context.registerService(CoreService.class, mockCoreService);
81 }
82
83 /**
84 * Tests the kubernetes API config encoding.
85 */
86 @Test
87 public void testK8sApiConfigEncode() {
Jian Lie2a04ce2020-07-01 19:07:02 +090088 HostNodesInfo info = new DefaultHostNodesInfo.Builder()
89 .hostIp(IpAddress.valueOf("192.168.10.10"))
90 .nodes(ImmutableSet.of("master", "worker"))
91 .build();
92
Jian Li3defa842019-02-12 00:31:35 +090093 K8sApiConfig config = DefaultK8sApiConfig.builder()
Jian Lie2a04ce2020-07-01 19:07:02 +090094 .clusterName("kubernetes")
95 .segmentId(1)
96 .extNetworkCidr(IpPrefix.valueOf("192.168.200.0/24"))
97 .mode(K8sApiConfig.Mode.NORMAL)
Jian Li3defa842019-02-12 00:31:35 +090098 .scheme(K8sApiConfig.Scheme.HTTPS)
99 .ipAddress(IpAddress.valueOf("10.10.10.23"))
100 .port(6443)
Jian Li1cee9882019-02-13 11:25:25 +0900101 .state(CONNECTED)
Jian Li3defa842019-02-12 00:31:35 +0900102 .token("token")
103 .caCertData("caCertData")
104 .clientCertData("clientCertData")
105 .clientKeyData("clientKeyData")
Jian Lie2a04ce2020-07-01 19:07:02 +0900106 .infos(ImmutableSet.of(info))
Jian Lic2242bd2020-09-03 13:12:14 +0900107 .dvr(true)
Jian Li3defa842019-02-12 00:31:35 +0900108 .build();
109
110 ObjectNode configJson = k8sApiConfigCodec.encode(config, context);
111 assertThat(configJson, matchesK8sApiConfig(config));
112 }
113
114 /**
115 * Tests the kubernetes API config decoding.
116 *
117 * @throws IOException IO exception
118 */
119 @Test
120 public void testK8sApiConfigDecode() throws IOException {
121 K8sApiConfig config = getK8sApiConfig("K8sApiConfig.json");
122
Jian Lie2a04ce2020-07-01 19:07:02 +0900123 assertEquals("kubernetes", config.clusterName());
124 assertEquals(1, config.segmentId());
125 assertEquals("192.168.200.0/24", config.extNetworkCidr().toString());
126 assertEquals("NORMAL", config.mode().name());
Jian Li3defa842019-02-12 00:31:35 +0900127 assertEquals("HTTPS", config.scheme().name());
128 assertEquals("10.134.34.223", config.ipAddress().toString());
129 assertEquals(6443, config.port());
130 assertEquals("token", config.token());
131 assertEquals("caCertData", config.caCertData());
132 assertEquals("clientCertData", config.clientCertData());
133 assertEquals("clientKeyData", config.clientKeyData());
Jian Lic2242bd2020-09-03 13:12:14 +0900134 assertTrue(config.dvr());
Jian Lie2a04ce2020-07-01 19:07:02 +0900135
136 Set<HostNodesInfo> infos = config.infos();
137 assertEquals(1, infos.size());
Jian Li3defa842019-02-12 00:31:35 +0900138 }
139
140 private K8sApiConfig getK8sApiConfig(String resourceName) throws IOException {
141 InputStream jsonStream = K8sNodeCodecTest.class.getResourceAsStream(resourceName);
142 JsonNode json = context.mapper().readTree(jsonStream);
143 assertThat(json, notNullValue());
144 K8sApiConfig config = k8sApiConfigCodec.decode((ObjectNode) json, context);
145 assertThat(config, notNullValue());
146 return config;
147 }
148
149 private class MockCodecContext implements CodecContext {
150 private final ObjectMapper mapper = new ObjectMapper();
151 private final CodecManager manager = new CodecManager();
152 private final Map<Class<?>, Object> services = new HashMap<>();
153
154 /**
155 * Constructs a new mock codec context.
156 */
157 public MockCodecContext() {
158 manager.activate();
159 }
160
161 @Override
162 public ObjectMapper mapper() {
163 return mapper;
164 }
165
166 @Override
167 @SuppressWarnings("unchecked")
168 public <T> JsonCodec<T> codec(Class<T> entityClass) {
169 if (entityClass == K8sApiConfig.class) {
170 return (JsonCodec<T>) k8sApiConfigCodec;
171 }
Jian Lie2a04ce2020-07-01 19:07:02 +0900172 if (entityClass == HostNodesInfo.class) {
173 return (JsonCodec<T>) hostNodesInfoCodec;
174 }
Jian Li3defa842019-02-12 00:31:35 +0900175 return manager.getCodec(entityClass);
176 }
177
178 @SuppressWarnings("unchecked")
179 @Override
180 public <T> T getService(Class<T> serviceClass) {
181 return (T) services.get(serviceClass);
182 }
183
184 // for registering mock services
185 public <T> void registerService(Class<T> serviceClass, T impl) {
186 services.put(serviceClass, impl);
187 }
188 }
189}