blob: 9b90c9401c95789f71039063eb1a6cc7c5429d63 [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;
Jian Lie2a04ce2020-07-01 19:07:02 +090019import com.fasterxml.jackson.databind.node.ArrayNode;
Jian Li3defa842019-02-12 00:31:35 +090020import com.fasterxml.jackson.databind.node.ObjectNode;
Jian Li0a117e32019-12-31 00:55:54 +090021import org.apache.commons.lang.StringUtils;
Jian Li3defa842019-02-12 00:31:35 +090022import org.onlab.packet.IpAddress;
Jian Lie2a04ce2020-07-01 19:07:02 +090023import org.onlab.packet.IpPrefix;
Jian Li3defa842019-02-12 00:31:35 +090024import org.onosproject.codec.CodecContext;
25import org.onosproject.codec.JsonCodec;
26import org.onosproject.k8snode.api.DefaultK8sApiConfig;
Jian Lie2a04ce2020-07-01 19:07:02 +090027import org.onosproject.k8snode.api.HostNodesInfo;
Jian Li3defa842019-02-12 00:31:35 +090028import org.onosproject.k8snode.api.K8sApiConfig;
Jian Lie2a04ce2020-07-01 19:07:02 +090029import org.onosproject.k8snode.api.K8sApiConfig.Mode;
Jian Li3defa842019-02-12 00:31:35 +090030import org.onosproject.k8snode.api.K8sApiConfig.Scheme;
31
Jian Lie2a04ce2020-07-01 19:07:02 +090032import java.util.HashSet;
33import java.util.Set;
34
Jian Li3defa842019-02-12 00:31:35 +090035import static org.onlab.util.Tools.nullIsIllegal;
Jian Lie2a04ce2020-07-01 19:07:02 +090036import static org.onosproject.k8snode.api.Constants.DEFAULT_CLUSTER_NAME;
37import static org.onosproject.k8snode.api.Constants.DEFAULT_CONFIG_MODE;
38import static org.onosproject.k8snode.api.Constants.DEFAULT_SEGMENT_ID;
Jian Li3defa842019-02-12 00:31:35 +090039import static org.onosproject.k8snode.api.K8sApiConfig.Scheme.HTTPS;
Jian Li1cee9882019-02-13 11:25:25 +090040import static org.onosproject.k8snode.api.K8sApiConfig.State.DISCONNECTED;
Jian Li3defa842019-02-12 00:31:35 +090041
42/**
43 * Kubernetes API server config codec used for serializing and de-serializing JSON string.
44 */
45public final class K8sApiConfigCodec extends JsonCodec<K8sApiConfig> {
46
Jian Lie2a04ce2020-07-01 19:07:02 +090047 private static final String CLUSTER_NAME = "clusterName";
48 private static final String SEGMENT_ID = "segmentId";
49 private static final String EXT_NETWORK_CIDR = "extNetworkCidr";
Jian Li3defa842019-02-12 00:31:35 +090050 private static final String SCHEME = "scheme";
Jian Lie2a04ce2020-07-01 19:07:02 +090051 private static final String MODE = "mode";
Jian Li3defa842019-02-12 00:31:35 +090052 private static final String IP_ADDRESS = "ipAddress";
53 private static final String PORT = "port";
Jian Li1cee9882019-02-13 11:25:25 +090054 private static final String STATE = "state";
Jian Li3defa842019-02-12 00:31:35 +090055 private static final String TOKEN = "token";
56 private static final String CA_CERT_DATA = "caCertData";
57 private static final String CLIENT_CERT_DATA = "clientCertData";
58 private static final String CLIENT_KEY_DATA = "clientKeyData";
Jian Lie2a04ce2020-07-01 19:07:02 +090059 private static final String HOST_NODES_INFO = "hostNodesInfo";
Jian Lic2242bd2020-09-03 13:12:14 +090060 private static final String DVR = "dvr";
Jian Li3defa842019-02-12 00:31:35 +090061
62 private static final String MISSING_MESSAGE = " is required in K8sApiConfig";
63
64 @Override
65 public ObjectNode encode(K8sApiConfig entity, CodecContext context) {
66 ObjectNode node = context.mapper().createObjectNode()
Jian Lie2a04ce2020-07-01 19:07:02 +090067 .put(CLUSTER_NAME, entity.clusterName())
68 .put(SEGMENT_ID, entity.segmentId())
69 .put(MODE, entity.mode().name())
Jian Li3defa842019-02-12 00:31:35 +090070 .put(SCHEME, entity.scheme().name())
71 .put(IP_ADDRESS, entity.ipAddress().toString())
Jian Li1cee9882019-02-13 11:25:25 +090072 .put(PORT, entity.port())
Jian Lic2242bd2020-09-03 13:12:14 +090073 .put(STATE, entity.state().name())
74 .put(DVR, entity.dvr());
Jian Li3defa842019-02-12 00:31:35 +090075
76 if (entity.scheme() == HTTPS) {
Jian Li0a117e32019-12-31 00:55:54 +090077 node.put(CA_CERT_DATA, entity.caCertData())
Jian Li3defa842019-02-12 00:31:35 +090078 .put(CLIENT_CERT_DATA, entity.clientCertData())
79 .put(CLIENT_KEY_DATA, entity.clientKeyData());
Jian Li0a117e32019-12-31 00:55:54 +090080
81 if (entity.token() != null) {
82 node.put(TOKEN, entity.token());
83 }
84
Jian Li3defa842019-02-12 00:31:35 +090085 } else {
86 if (entity.token() != null) {
87 node.put(TOKEN, entity.token());
88 }
89
90 if (entity.caCertData() != null) {
91 node.put(CA_CERT_DATA, entity.caCertData());
92 }
93
94 if (entity.clientCertData() != null) {
95 node.put(CLIENT_CERT_DATA, entity.clientCertData());
96 }
97
98 if (entity.clientKeyData() != null) {
99 node.put(CLIENT_KEY_DATA, entity.clientKeyData());
100 }
101 }
102
Jian Lie2a04ce2020-07-01 19:07:02 +0900103 if (entity.extNetworkCidr() != null) {
104 node.put(EXT_NETWORK_CIDR, entity.extNetworkCidr().toString());
105 }
106
107 ArrayNode infos = context.mapper().createArrayNode();
108 entity.infos().forEach(info -> {
109 ObjectNode infoJson = context.codec(HostNodesInfo.class).encode(info, context);
110 infos.add(infoJson);
111 });
112 node.set(HOST_NODES_INFO, infos);
113
Jian Li3defa842019-02-12 00:31:35 +0900114 return node;
115 }
116
117 @Override
118 public K8sApiConfig decode(ObjectNode json, CodecContext context) {
119 if (json == null || !json.isObject()) {
120 return null;
121 }
122
Jian Lie2a04ce2020-07-01 19:07:02 +0900123 JsonNode clusterNameJson = json.get(CLUSTER_NAME);
124 String clusterNameStr = "";
125
126 if (clusterNameJson == null) {
127 clusterNameStr = DEFAULT_CLUSTER_NAME;
128 } else {
129 clusterNameStr = clusterNameJson.asText();
130 }
131
132 JsonNode segmentIdJson = json.get(SEGMENT_ID);
133 int segmentId = DEFAULT_SEGMENT_ID;
134
135 if (segmentIdJson != null) {
136 segmentId = segmentIdJson.asInt();
137 }
138
139 JsonNode modeJson = json.get(MODE);
140 String modeStr = "";
141 if (modeJson == null) {
142 modeStr = DEFAULT_CONFIG_MODE;
143 } else {
144 modeStr = modeJson.asText();
145 }
146
147 Mode mode = Mode.valueOf(modeStr);
148
Jian Li3defa842019-02-12 00:31:35 +0900149 Scheme scheme = Scheme.valueOf(nullIsIllegal(
150 json.get(SCHEME).asText(), SCHEME + MISSING_MESSAGE));
151 IpAddress ipAddress = IpAddress.valueOf(nullIsIllegal(
152 json.get(IP_ADDRESS).asText(), IP_ADDRESS + MISSING_MESSAGE));
153 int port = json.get(PORT).asInt();
154
155 K8sApiConfig.Builder builder = DefaultK8sApiConfig.builder()
Jian Lie2a04ce2020-07-01 19:07:02 +0900156 .clusterName(clusterNameStr)
157 .segmentId(segmentId)
158 .mode(mode)
Jian Li3defa842019-02-12 00:31:35 +0900159 .scheme(scheme)
160 .ipAddress(ipAddress)
Jian Li1cee9882019-02-13 11:25:25 +0900161 .port(port)
162 .state(DISCONNECTED);
Jian Li3defa842019-02-12 00:31:35 +0900163
Jian Lic2242bd2020-09-03 13:12:14 +0900164 JsonNode dvrJson = json.get(DVR);
165 if (dvrJson != null) {
166 builder.dvr(dvrJson.asBoolean());
167 }
168
Jian Li3defa842019-02-12 00:31:35 +0900169 JsonNode tokenJson = json.get(TOKEN);
170 JsonNode caCertDataJson = json.get(CA_CERT_DATA);
171 JsonNode clientCertDataJson = json.get(CLIENT_CERT_DATA);
172 JsonNode clientKeyDataJson = json.get(CLIENT_KEY_DATA);
173
174 String token = "";
175 String caCertData = "";
176 String clientCertData = "";
177 String clientKeyData = "";
178
179 if (scheme == HTTPS) {
Jian Li3defa842019-02-12 00:31:35 +0900180 caCertData = nullIsIllegal(caCertDataJson.asText(),
181 CA_CERT_DATA + MISSING_MESSAGE);
182 clientCertData = nullIsIllegal(clientCertDataJson.asText(),
183 CLIENT_CERT_DATA + MISSING_MESSAGE);
184 clientKeyData = nullIsIllegal(clientKeyDataJson.asText(),
185 CLIENT_KEY_DATA + MISSING_MESSAGE);
186
Jian Li0a117e32019-12-31 00:55:54 +0900187 if (tokenJson != null) {
188 token = tokenJson.asText();
189 }
190
Jian Li3defa842019-02-12 00:31:35 +0900191 } else {
192 if (tokenJson != null) {
193 token = tokenJson.asText();
194 }
195
196 if (caCertDataJson != null) {
197 caCertData = caCertDataJson.asText();
198 }
199
200 if (clientCertDataJson != null) {
201 clientCertData = clientCertDataJson.asText();
202 }
203
204 if (clientKeyDataJson != null) {
205 clientKeyData = clientKeyDataJson.asText();
206 }
207 }
208
Jian Li0a117e32019-12-31 00:55:54 +0900209 if (StringUtils.isNotEmpty(token)) {
210 builder.token(token);
211 }
212
213 if (StringUtils.isNotEmpty(caCertData)) {
214 builder.caCertData(caCertData);
215 }
216
217 if (StringUtils.isNotEmpty(clientCertData)) {
218 builder.clientCertData(clientCertData);
219 }
220
221 if (StringUtils.isNotEmpty(clientKeyData)) {
222 builder.clientKeyData(clientKeyData);
223 }
224
Jian Lie2a04ce2020-07-01 19:07:02 +0900225 JsonNode extNetworkCidrJson = json.get(EXT_NETWORK_CIDR);
226 if (extNetworkCidrJson != null) {
227 builder.extNetworkCidr(IpPrefix.valueOf(extNetworkCidrJson.asText()));
228 }
229
230 Set<HostNodesInfo> infos = new HashSet<>();
231 ArrayNode infosJson = (ArrayNode) json.get(HOST_NODES_INFO);
232 if (infosJson != null) {
233 for (JsonNode infoJson : infosJson) {
234 HostNodesInfo info = context.codec(HostNodesInfo.class)
235 .decode((ObjectNode) infoJson, context);
236 infos.add(info);
237 }
238 builder.infos(infos);
239 }
240
Jian Li0a117e32019-12-31 00:55:54 +0900241 return builder.build();
Jian Li3defa842019-02-12 00:31:35 +0900242 }
243}