blob: b7da2a012b1ed8233a3e399c4eef388672c9b8ff [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.node.ObjectNode;
Jian Lid47c0122019-12-31 00:55:54 +090020import org.apache.commons.lang.StringUtils;
Jian Li3defa842019-02-12 00:31:35 +090021import org.onlab.packet.IpAddress;
22import org.onosproject.codec.CodecContext;
23import org.onosproject.codec.JsonCodec;
24import org.onosproject.k8snode.api.DefaultK8sApiConfig;
25import org.onosproject.k8snode.api.K8sApiConfig;
26import org.onosproject.k8snode.api.K8sApiConfig.Scheme;
27
28import static org.onlab.util.Tools.nullIsIllegal;
29import static org.onosproject.k8snode.api.K8sApiConfig.Scheme.HTTPS;
Jian Li1cee9882019-02-13 11:25:25 +090030import static org.onosproject.k8snode.api.K8sApiConfig.State.DISCONNECTED;
Jian Li3defa842019-02-12 00:31:35 +090031
32/**
33 * Kubernetes API server config codec used for serializing and de-serializing JSON string.
34 */
35public final class K8sApiConfigCodec extends JsonCodec<K8sApiConfig> {
36
37 private static final String SCHEME = "scheme";
38 private static final String IP_ADDRESS = "ipAddress";
39 private static final String PORT = "port";
Jian Li1cee9882019-02-13 11:25:25 +090040 private static final String STATE = "state";
Jian Li3defa842019-02-12 00:31:35 +090041 private static final String TOKEN = "token";
42 private static final String CA_CERT_DATA = "caCertData";
43 private static final String CLIENT_CERT_DATA = "clientCertData";
44 private static final String CLIENT_KEY_DATA = "clientKeyData";
45
46 private static final String MISSING_MESSAGE = " is required in K8sApiConfig";
47
48 @Override
49 public ObjectNode encode(K8sApiConfig entity, CodecContext context) {
50 ObjectNode node = context.mapper().createObjectNode()
51 .put(SCHEME, entity.scheme().name())
52 .put(IP_ADDRESS, entity.ipAddress().toString())
Jian Li1cee9882019-02-13 11:25:25 +090053 .put(PORT, entity.port())
54 .put(STATE, entity.state().name());
Jian Li3defa842019-02-12 00:31:35 +090055
56 if (entity.scheme() == HTTPS) {
Jian Lid47c0122019-12-31 00:55:54 +090057 node.put(CA_CERT_DATA, entity.caCertData())
Jian Li3defa842019-02-12 00:31:35 +090058 .put(CLIENT_CERT_DATA, entity.clientCertData())
59 .put(CLIENT_KEY_DATA, entity.clientKeyData());
Jian Lid47c0122019-12-31 00:55:54 +090060
61 if (entity.token() != null) {
62 node.put(TOKEN, entity.token());
63 }
64
Jian Li3defa842019-02-12 00:31:35 +090065 } else {
66 if (entity.token() != null) {
67 node.put(TOKEN, entity.token());
68 }
69
70 if (entity.caCertData() != null) {
71 node.put(CA_CERT_DATA, entity.caCertData());
72 }
73
74 if (entity.clientCertData() != null) {
75 node.put(CLIENT_CERT_DATA, entity.clientCertData());
76 }
77
78 if (entity.clientKeyData() != null) {
79 node.put(CLIENT_KEY_DATA, entity.clientKeyData());
80 }
81 }
82
83 return node;
84 }
85
86 @Override
87 public K8sApiConfig decode(ObjectNode json, CodecContext context) {
88 if (json == null || !json.isObject()) {
89 return null;
90 }
91
92 Scheme scheme = Scheme.valueOf(nullIsIllegal(
93 json.get(SCHEME).asText(), SCHEME + MISSING_MESSAGE));
94 IpAddress ipAddress = IpAddress.valueOf(nullIsIllegal(
95 json.get(IP_ADDRESS).asText(), IP_ADDRESS + MISSING_MESSAGE));
96 int port = json.get(PORT).asInt();
97
98 K8sApiConfig.Builder builder = DefaultK8sApiConfig.builder()
99 .scheme(scheme)
100 .ipAddress(ipAddress)
Jian Li1cee9882019-02-13 11:25:25 +0900101 .port(port)
102 .state(DISCONNECTED);
Jian Li3defa842019-02-12 00:31:35 +0900103
104 JsonNode tokenJson = json.get(TOKEN);
105 JsonNode caCertDataJson = json.get(CA_CERT_DATA);
106 JsonNode clientCertDataJson = json.get(CLIENT_CERT_DATA);
107 JsonNode clientKeyDataJson = json.get(CLIENT_KEY_DATA);
108
109 String token = "";
110 String caCertData = "";
111 String clientCertData = "";
112 String clientKeyData = "";
113
114 if (scheme == HTTPS) {
Jian Li3defa842019-02-12 00:31:35 +0900115 caCertData = nullIsIllegal(caCertDataJson.asText(),
116 CA_CERT_DATA + MISSING_MESSAGE);
117 clientCertData = nullIsIllegal(clientCertDataJson.asText(),
118 CLIENT_CERT_DATA + MISSING_MESSAGE);
119 clientKeyData = nullIsIllegal(clientKeyDataJson.asText(),
120 CLIENT_KEY_DATA + MISSING_MESSAGE);
121
Jian Lid47c0122019-12-31 00:55:54 +0900122 if (tokenJson != null) {
123 token = tokenJson.asText();
124 }
125
Jian Li3defa842019-02-12 00:31:35 +0900126 } else {
127 if (tokenJson != null) {
128 token = tokenJson.asText();
129 }
130
131 if (caCertDataJson != null) {
132 caCertData = caCertDataJson.asText();
133 }
134
135 if (clientCertDataJson != null) {
136 clientCertData = clientCertDataJson.asText();
137 }
138
139 if (clientKeyDataJson != null) {
140 clientKeyData = clientKeyDataJson.asText();
141 }
142 }
143
Jian Lid47c0122019-12-31 00:55:54 +0900144 if (StringUtils.isNotEmpty(token)) {
145 builder.token(token);
146 }
147
148 if (StringUtils.isNotEmpty(caCertData)) {
149 builder.caCertData(caCertData);
150 }
151
152 if (StringUtils.isNotEmpty(clientCertData)) {
153 builder.clientCertData(clientCertData);
154 }
155
156 if (StringUtils.isNotEmpty(clientKeyData)) {
157 builder.clientKeyData(clientKeyData);
158 }
159
160 return builder.build();
Jian Li3defa842019-02-12 00:31:35 +0900161 }
162}