blob: 5b8c05e92837894d13b74b4c4753d5f7578a0ff2 [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 Li3defa842019-02-12 00:31:35 +090060
61 private static final String MISSING_MESSAGE = " is required in K8sApiConfig";
62
63 @Override
64 public ObjectNode encode(K8sApiConfig entity, CodecContext context) {
65 ObjectNode node = context.mapper().createObjectNode()
Jian Lie2a04ce2020-07-01 19:07:02 +090066 .put(CLUSTER_NAME, entity.clusterName())
67 .put(SEGMENT_ID, entity.segmentId())
68 .put(MODE, entity.mode().name())
Jian Li3defa842019-02-12 00:31:35 +090069 .put(SCHEME, entity.scheme().name())
70 .put(IP_ADDRESS, entity.ipAddress().toString())
Jian Li1cee9882019-02-13 11:25:25 +090071 .put(PORT, entity.port())
72 .put(STATE, entity.state().name());
Jian Li3defa842019-02-12 00:31:35 +090073
74 if (entity.scheme() == HTTPS) {
Jian Li0a117e32019-12-31 00:55:54 +090075 node.put(CA_CERT_DATA, entity.caCertData())
Jian Li3defa842019-02-12 00:31:35 +090076 .put(CLIENT_CERT_DATA, entity.clientCertData())
77 .put(CLIENT_KEY_DATA, entity.clientKeyData());
Jian Li0a117e32019-12-31 00:55:54 +090078
79 if (entity.token() != null) {
80 node.put(TOKEN, entity.token());
81 }
82
Jian Li3defa842019-02-12 00:31:35 +090083 } else {
84 if (entity.token() != null) {
85 node.put(TOKEN, entity.token());
86 }
87
88 if (entity.caCertData() != null) {
89 node.put(CA_CERT_DATA, entity.caCertData());
90 }
91
92 if (entity.clientCertData() != null) {
93 node.put(CLIENT_CERT_DATA, entity.clientCertData());
94 }
95
96 if (entity.clientKeyData() != null) {
97 node.put(CLIENT_KEY_DATA, entity.clientKeyData());
98 }
99 }
100
Jian Lie2a04ce2020-07-01 19:07:02 +0900101 if (entity.extNetworkCidr() != null) {
102 node.put(EXT_NETWORK_CIDR, entity.extNetworkCidr().toString());
103 }
104
105 ArrayNode infos = context.mapper().createArrayNode();
106 entity.infos().forEach(info -> {
107 ObjectNode infoJson = context.codec(HostNodesInfo.class).encode(info, context);
108 infos.add(infoJson);
109 });
110 node.set(HOST_NODES_INFO, infos);
111
Jian Li3defa842019-02-12 00:31:35 +0900112 return node;
113 }
114
115 @Override
116 public K8sApiConfig decode(ObjectNode json, CodecContext context) {
117 if (json == null || !json.isObject()) {
118 return null;
119 }
120
Jian Lie2a04ce2020-07-01 19:07:02 +0900121 JsonNode clusterNameJson = json.get(CLUSTER_NAME);
122 String clusterNameStr = "";
123
124 if (clusterNameJson == null) {
125 clusterNameStr = DEFAULT_CLUSTER_NAME;
126 } else {
127 clusterNameStr = clusterNameJson.asText();
128 }
129
130 JsonNode segmentIdJson = json.get(SEGMENT_ID);
131 int segmentId = DEFAULT_SEGMENT_ID;
132
133 if (segmentIdJson != null) {
134 segmentId = segmentIdJson.asInt();
135 }
136
137 JsonNode modeJson = json.get(MODE);
138 String modeStr = "";
139 if (modeJson == null) {
140 modeStr = DEFAULT_CONFIG_MODE;
141 } else {
142 modeStr = modeJson.asText();
143 }
144
145 Mode mode = Mode.valueOf(modeStr);
146
Jian Li3defa842019-02-12 00:31:35 +0900147 Scheme scheme = Scheme.valueOf(nullIsIllegal(
148 json.get(SCHEME).asText(), SCHEME + MISSING_MESSAGE));
149 IpAddress ipAddress = IpAddress.valueOf(nullIsIllegal(
150 json.get(IP_ADDRESS).asText(), IP_ADDRESS + MISSING_MESSAGE));
151 int port = json.get(PORT).asInt();
152
153 K8sApiConfig.Builder builder = DefaultK8sApiConfig.builder()
Jian Lie2a04ce2020-07-01 19:07:02 +0900154 .clusterName(clusterNameStr)
155 .segmentId(segmentId)
156 .mode(mode)
Jian Li3defa842019-02-12 00:31:35 +0900157 .scheme(scheme)
158 .ipAddress(ipAddress)
Jian Li1cee9882019-02-13 11:25:25 +0900159 .port(port)
160 .state(DISCONNECTED);
Jian Li3defa842019-02-12 00:31:35 +0900161
162 JsonNode tokenJson = json.get(TOKEN);
163 JsonNode caCertDataJson = json.get(CA_CERT_DATA);
164 JsonNode clientCertDataJson = json.get(CLIENT_CERT_DATA);
165 JsonNode clientKeyDataJson = json.get(CLIENT_KEY_DATA);
166
167 String token = "";
168 String caCertData = "";
169 String clientCertData = "";
170 String clientKeyData = "";
171
172 if (scheme == HTTPS) {
Jian Li3defa842019-02-12 00:31:35 +0900173 caCertData = nullIsIllegal(caCertDataJson.asText(),
174 CA_CERT_DATA + MISSING_MESSAGE);
175 clientCertData = nullIsIllegal(clientCertDataJson.asText(),
176 CLIENT_CERT_DATA + MISSING_MESSAGE);
177 clientKeyData = nullIsIllegal(clientKeyDataJson.asText(),
178 CLIENT_KEY_DATA + MISSING_MESSAGE);
179
Jian Li0a117e32019-12-31 00:55:54 +0900180 if (tokenJson != null) {
181 token = tokenJson.asText();
182 }
183
Jian Li3defa842019-02-12 00:31:35 +0900184 } else {
185 if (tokenJson != null) {
186 token = tokenJson.asText();
187 }
188
189 if (caCertDataJson != null) {
190 caCertData = caCertDataJson.asText();
191 }
192
193 if (clientCertDataJson != null) {
194 clientCertData = clientCertDataJson.asText();
195 }
196
197 if (clientKeyDataJson != null) {
198 clientKeyData = clientKeyDataJson.asText();
199 }
200 }
201
Jian Li0a117e32019-12-31 00:55:54 +0900202 if (StringUtils.isNotEmpty(token)) {
203 builder.token(token);
204 }
205
206 if (StringUtils.isNotEmpty(caCertData)) {
207 builder.caCertData(caCertData);
208 }
209
210 if (StringUtils.isNotEmpty(clientCertData)) {
211 builder.clientCertData(clientCertData);
212 }
213
214 if (StringUtils.isNotEmpty(clientKeyData)) {
215 builder.clientKeyData(clientKeyData);
216 }
217
Jian Lie2a04ce2020-07-01 19:07:02 +0900218 JsonNode extNetworkCidrJson = json.get(EXT_NETWORK_CIDR);
219 if (extNetworkCidrJson != null) {
220 builder.extNetworkCidr(IpPrefix.valueOf(extNetworkCidrJson.asText()));
221 }
222
223 Set<HostNodesInfo> infos = new HashSet<>();
224 ArrayNode infosJson = (ArrayNode) json.get(HOST_NODES_INFO);
225 if (infosJson != null) {
226 for (JsonNode infoJson : infosJson) {
227 HostNodesInfo info = context.codec(HostNodesInfo.class)
228 .decode((ObjectNode) infoJson, context);
229 infos.add(info);
230 }
231 builder.infos(infos);
232 }
233
Jian Li0a117e32019-12-31 00:55:54 +0900234 return builder.build();
Jian Li3defa842019-02-12 00:31:35 +0900235 }
236}