blob: b5deb387faabf74f4bca18b9c6301e6606ba9f93 [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;
42import static org.easymock.EasyMock.createMock;
43import static org.easymock.EasyMock.expect;
44import static org.easymock.EasyMock.replay;
45import static org.hamcrest.MatcherAssert.assertThat;
46import static org.hamcrest.Matchers.notNullValue;
Jian Li1cee9882019-02-13 11:25:25 +090047import static org.onosproject.k8snode.api.K8sApiConfig.State.CONNECTED;
Jian Li3defa842019-02-12 00:31:35 +090048import static org.onosproject.k8snode.codec.K8sApiConfigJsonMatcher.matchesK8sApiConfig;
49import static org.onosproject.net.NetTestTools.APP_ID;
50
51/**
52 * Unit tests for kubernetes API config codec.
53 */
54public class K8sApiConfigCodecTest {
55
56 MockCodecContext context;
57
58 JsonCodec<K8sApiConfig> k8sApiConfigCodec;
Jian Lie2a04ce2020-07-01 19:07:02 +090059 JsonCodec<HostNodesInfo> hostNodesInfoCodec;
Jian Li3defa842019-02-12 00:31:35 +090060
61 final CoreService mockCoreService = createMock(CoreService.class);
62 private static final String REST_APP_ID = "org.onosproject.rest";
63
64 /**
65 * Initial setup for this unit test.
66 */
67 @Before
68 public void setUp() {
69 context = new MockCodecContext();
70 k8sApiConfigCodec = new K8sApiConfigCodec();
Jian Lie2a04ce2020-07-01 19:07:02 +090071 hostNodesInfoCodec = new HostNodesInfoCodec();
Jian Li3defa842019-02-12 00:31:35 +090072
73 assertThat(k8sApiConfigCodec, notNullValue());
Jian Lie2a04ce2020-07-01 19:07:02 +090074 assertThat(hostNodesInfoCodec, notNullValue());
Jian Li3defa842019-02-12 00:31:35 +090075
76 expect(mockCoreService.registerApplication(REST_APP_ID))
77 .andReturn(APP_ID).anyTimes();
78 replay(mockCoreService);
79 context.registerService(CoreService.class, mockCoreService);
80 }
81
82 /**
83 * Tests the kubernetes API config encoding.
84 */
85 @Test
86 public void testK8sApiConfigEncode() {
Jian Lie2a04ce2020-07-01 19:07:02 +090087 HostNodesInfo info = new DefaultHostNodesInfo.Builder()
88 .hostIp(IpAddress.valueOf("192.168.10.10"))
89 .nodes(ImmutableSet.of("master", "worker"))
90 .build();
91
Jian Li3defa842019-02-12 00:31:35 +090092 K8sApiConfig config = DefaultK8sApiConfig.builder()
Jian Lie2a04ce2020-07-01 19:07:02 +090093 .clusterName("kubernetes")
94 .segmentId(1)
95 .extNetworkCidr(IpPrefix.valueOf("192.168.200.0/24"))
96 .mode(K8sApiConfig.Mode.NORMAL)
Jian Li3defa842019-02-12 00:31:35 +090097 .scheme(K8sApiConfig.Scheme.HTTPS)
98 .ipAddress(IpAddress.valueOf("10.10.10.23"))
99 .port(6443)
Jian Li1cee9882019-02-13 11:25:25 +0900100 .state(CONNECTED)
Jian Li3defa842019-02-12 00:31:35 +0900101 .token("token")
102 .caCertData("caCertData")
103 .clientCertData("clientCertData")
104 .clientKeyData("clientKeyData")
Jian Lie2a04ce2020-07-01 19:07:02 +0900105 .infos(ImmutableSet.of(info))
Jian Li3defa842019-02-12 00:31:35 +0900106 .build();
107
108 ObjectNode configJson = k8sApiConfigCodec.encode(config, context);
109 assertThat(configJson, matchesK8sApiConfig(config));
110 }
111
112 /**
113 * Tests the kubernetes API config decoding.
114 *
115 * @throws IOException IO exception
116 */
117 @Test
118 public void testK8sApiConfigDecode() throws IOException {
119 K8sApiConfig config = getK8sApiConfig("K8sApiConfig.json");
120
Jian Lie2a04ce2020-07-01 19:07:02 +0900121 assertEquals("kubernetes", config.clusterName());
122 assertEquals(1, config.segmentId());
123 assertEquals("192.168.200.0/24", config.extNetworkCidr().toString());
124 assertEquals("NORMAL", config.mode().name());
Jian Li3defa842019-02-12 00:31:35 +0900125 assertEquals("HTTPS", config.scheme().name());
126 assertEquals("10.134.34.223", config.ipAddress().toString());
127 assertEquals(6443, config.port());
128 assertEquals("token", config.token());
129 assertEquals("caCertData", config.caCertData());
130 assertEquals("clientCertData", config.clientCertData());
131 assertEquals("clientKeyData", config.clientKeyData());
Jian Lie2a04ce2020-07-01 19:07:02 +0900132
133 Set<HostNodesInfo> infos = config.infos();
134 assertEquals(1, infos.size());
Jian Li3defa842019-02-12 00:31:35 +0900135 }
136
137 private K8sApiConfig getK8sApiConfig(String resourceName) throws IOException {
138 InputStream jsonStream = K8sNodeCodecTest.class.getResourceAsStream(resourceName);
139 JsonNode json = context.mapper().readTree(jsonStream);
140 assertThat(json, notNullValue());
141 K8sApiConfig config = k8sApiConfigCodec.decode((ObjectNode) json, context);
142 assertThat(config, notNullValue());
143 return config;
144 }
145
146 private class MockCodecContext implements CodecContext {
147 private final ObjectMapper mapper = new ObjectMapper();
148 private final CodecManager manager = new CodecManager();
149 private final Map<Class<?>, Object> services = new HashMap<>();
150
151 /**
152 * Constructs a new mock codec context.
153 */
154 public MockCodecContext() {
155 manager.activate();
156 }
157
158 @Override
159 public ObjectMapper mapper() {
160 return mapper;
161 }
162
163 @Override
164 @SuppressWarnings("unchecked")
165 public <T> JsonCodec<T> codec(Class<T> entityClass) {
166 if (entityClass == K8sApiConfig.class) {
167 return (JsonCodec<T>) k8sApiConfigCodec;
168 }
Jian Lie2a04ce2020-07-01 19:07:02 +0900169 if (entityClass == HostNodesInfo.class) {
170 return (JsonCodec<T>) hostNodesInfoCodec;
171 }
Jian Li3defa842019-02-12 00:31:35 +0900172 return manager.getCodec(entityClass);
173 }
174
175 @SuppressWarnings("unchecked")
176 @Override
177 public <T> T getService(Class<T> serviceClass) {
178 return (T) services.get(serviceClass);
179 }
180
181 // for registering mock services
182 public <T> void registerService(Class<T> serviceClass, T impl) {
183 services.put(serviceClass, impl);
184 }
185 }
186}