blob: 9dfa929f3845aedaf21ff927e4c8880b688b8004 [file] [log] [blame]
Hyunsun Moone9d75992015-09-15 22:39:16 -07001/*
Brian O'Connor8e57fd52016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
Hyunsun Moone9d75992015-09-15 22:39:16 -07003 *
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 */
Hyunsun Moonfd5a24e2016-10-19 19:15:48 -070016package org.opencord.cordvtn.api.config;
Hyunsun Moone9d75992015-09-15 22:39:16 -070017
18import com.fasterxml.jackson.databind.JsonNode;
Hyunsun Moon153db182016-08-04 14:06:40 -070019import com.fasterxml.jackson.databind.node.ObjectNode;
Hyunsun Moon81a13562016-08-04 13:48:08 -070020import com.google.common.base.Strings;
Hyunsun Moonb5f92e52016-02-17 15:02:06 -080021import com.google.common.collect.Maps;
Hyunsun Moone9d75992015-09-15 22:39:16 -070022import com.google.common.collect.Sets;
Hyunsun Moonb5f92e52016-02-17 15:02:06 -080023import org.onlab.packet.IpAddress;
Hyunsun Moon3fc17f72016-01-24 21:47:06 -080024import org.onlab.packet.MacAddress;
Hyunsun Moone9d75992015-09-15 22:39:16 -070025import org.onlab.packet.TpPort;
26import org.onosproject.core.ApplicationId;
27import org.onosproject.net.config.Config;
Hyunsun Moonfd5a24e2016-10-19 19:15:48 -070028import org.opencord.cordvtn.api.node.CordVtnNode;
29import org.opencord.cordvtn.api.node.NetworkAddress;
30import org.opencord.cordvtn.api.node.SshAccessInfo;
Hyunsun Moon3fc17f72016-01-24 21:47:06 -080031import org.slf4j.Logger;
Hyunsun Moone9d75992015-09-15 22:39:16 -070032
Hyunsun Moonb5f92e52016-02-17 15:02:06 -080033import java.util.Map;
Hyunsun Moone9d75992015-09-15 22:39:16 -070034import java.util.Set;
35
Hyunsun Moon153db182016-08-04 14:06:40 -070036import static org.onosproject.net.config.Config.FieldPresence.MANDATORY;
37import static org.onosproject.net.config.Config.FieldPresence.OPTIONAL;
Hyunsun Moon3fc17f72016-01-24 21:47:06 -080038import static org.slf4j.LoggerFactory.getLogger;
Hyunsun Moone9d75992015-09-15 22:39:16 -070039
40/**
Hyunsun Moon9661d642015-09-23 13:24:35 -070041 * Configuration object for CordVtn service.
Hyunsun Moone9d75992015-09-15 22:39:16 -070042 */
43public class CordVtnConfig extends Config<ApplicationId> {
44
Hyunsun Moon3fc17f72016-01-24 21:47:06 -080045 protected final Logger log = getLogger(getClass());
46
Hyunsun Moon60a10672016-06-12 17:39:12 -070047 private static final String PRIVATE_GATEWAY_MAC = "privateGatewayMac";
48 private static final String PUBLIC_GATEWAYS = "publicGateways";
49 private static final String GATEWAY_IP = "gatewayIp";
50 private static final String GATEWAY_MAC = "gatewayMac";
51 private static final String LOCAL_MANAGEMENT_IP = "localManagementIp";
52 private static final String OVSDB_PORT = "ovsdbPort";
Hyunsun Moond05b32e2016-03-02 19:27:26 -080053
Hyunsun Moon60a10672016-06-12 17:39:12 -070054 private static final String CORDVTN_NODES = "nodes";
55 private static final String HOSTNAME = "hostname";
56 private static final String HOST_MANAGEMENT_IP = "hostManagementIp";
Hyunsun Moon81a13562016-08-04 13:48:08 -070057 private static final String HOST_MANAGEMENT_IFACE = "hostManagementIface";
58 private static final String DATA_IP = "dataPlaneIp";
59 private static final String DATA_IFACE = "dataPlaneIntf";
60 private static final String INTEGRATION_BRIDGE_ID = "bridgeId";
Hyunsun Moone9d75992015-09-15 22:39:16 -070061
Hyunsun Moon60a10672016-06-12 17:39:12 -070062 private static final String SSH = "ssh";
63 private static final String SSH_PORT = "sshPort";
64 private static final String SSH_USER = "sshUser";
65 private static final String SSH_KEY_FILE = "sshKeyFile";
Hyunsun Moon61e79ee2016-04-14 19:04:23 -070066
Hyunsun Moon60a10672016-06-12 17:39:12 -070067 private static final String OPENSTACK = "openstack";
68 private static final String XOS = "xos";
Hyunsun Moonb9c366e2016-04-24 17:43:32 -070069
Hyunsun Moon60a10672016-06-12 17:39:12 -070070 private static final String ENDPOINT = "endpoint";
71 private static final String TENANT = "tenant";
72 private static final String USER = "user";
73 private static final String PASSWORD = "password";
Hyunsun Moon61e79ee2016-04-14 19:04:23 -070074
Hyunsun Moon81a13562016-08-04 13:48:08 -070075 // TODO implement isValid
Hyunsun Moon153db182016-08-04 14:06:40 -070076 @Override
77 public boolean isValid() {
78 // check only allowed fields are present
79 boolean result = hasOnlyFields(
80 PRIVATE_GATEWAY_MAC,
81 PUBLIC_GATEWAYS,
82 LOCAL_MANAGEMENT_IP,
83 OVSDB_PORT,
84 SSH,
85 OPENSTACK,
86 XOS,
87 CORDVTN_NODES);
88
89 if (object.get(CORDVTN_NODES) == null || object.get(CORDVTN_NODES).size() < 1) {
90 final String msg = "No node is present";
91 throw new IllegalArgumentException(msg);
92 }
93
94 // check all mandatory fields are present and valid
95 result = result && isMacAddress(PRIVATE_GATEWAY_MAC, MANDATORY);
96 result = result && isIpPrefix(LOCAL_MANAGEMENT_IP, MANDATORY);
97
98 for (JsonNode node : object.get(CORDVTN_NODES)) {
99 ObjectNode vtnNode = (ObjectNode) node;
100 result = result && hasFields(
101 vtnNode,
102 HOSTNAME,
103 HOST_MANAGEMENT_IP,
104 DATA_IP,
105 DATA_IFACE,
106 INTEGRATION_BRIDGE_ID);
107 result = result && isIpPrefix(vtnNode, HOST_MANAGEMENT_IP, MANDATORY);
108 result = result && isIpPrefix(vtnNode, DATA_IP, MANDATORY);
109
110 NetworkAddress localMgmt = NetworkAddress.valueOf(get(LOCAL_MANAGEMENT_IP, ""));
111 NetworkAddress hostsMgmt = NetworkAddress.valueOf(getConfig(vtnNode, HOST_MANAGEMENT_IP));
112 if (hostsMgmt.prefix().contains(localMgmt.prefix()) ||
113 localMgmt.prefix().contains(hostsMgmt.prefix())) {
114 final String msg = "Host and local management network IP conflict";
115 throw new IllegalArgumentException(msg);
116 }
117 }
118
119 result = result && hasFields(
120 (ObjectNode) object.get(SSH),
121 SSH_PORT,
122 SSH_USER,
123 SSH_KEY_FILE);
124 result = result && isTpPort(
125 (ObjectNode) object.get(SSH),
126 SSH_PORT,
127 MANDATORY);
128
129 result = result && hasFields(
130 (ObjectNode) object.get(OPENSTACK),
131 ENDPOINT,
132 TENANT,
133 USER,
134 PASSWORD);
135
136 result = result && hasFields(
137 (ObjectNode) object.get(XOS),
138 ENDPOINT,
139 USER,
140 PASSWORD);
141
142 // check all optional fields are valid
143 result = result && isTpPort(OVSDB_PORT, OPTIONAL);
144
145 if (object.get(PUBLIC_GATEWAYS) != null && object.get(PUBLIC_GATEWAYS).isArray()) {
146 for (JsonNode node : object.get(PUBLIC_GATEWAYS)) {
147 ObjectNode gateway = (ObjectNode) node;
148 result = result && isIpAddress(gateway, GATEWAY_IP, MANDATORY);
149 result = result && isMacAddress(gateway, GATEWAY_MAC, MANDATORY);
150 }
151 }
152 return result;
153 }
Hyunsun Moon81a13562016-08-04 13:48:08 -0700154
Hyunsun Moone9d75992015-09-15 22:39:16 -0700155 /**
Hyunsun Moon4edb0172015-11-07 22:08:43 -0800156 * Returns the set of nodes read from network config.
Hyunsun Moone9d75992015-09-15 22:39:16 -0700157 *
Hyunsun Moon58ddbdc2016-03-07 16:37:17 -0800158 * @return set of CordVtnNodeConfig or empty set
Hyunsun Moone9d75992015-09-15 22:39:16 -0700159 */
Hyunsun Moond05b32e2016-03-02 19:27:26 -0800160 public Set<CordVtnNode> cordVtnNodes() {
Hyunsun Moond05b32e2016-03-02 19:27:26 -0800161 Set<CordVtnNode> nodes = Sets.newHashSet();
Hyunsun Moon61e79ee2016-04-14 19:04:23 -0700162 JsonNode sshNode = object.get(SSH);
Hyunsun Moon153db182016-08-04 14:06:40 -0700163 String ovsdbPort = getConfig(object, OVSDB_PORT);
Hyunsun Moon61e79ee2016-04-14 19:04:23 -0700164
Hyunsun Moon153db182016-08-04 14:06:40 -0700165 object.get(CORDVTN_NODES).forEach(vtnNode -> {
166 NetworkAddress localMgmt = NetworkAddress.valueOf(get(LOCAL_MANAGEMENT_IP, ""));
167 NetworkAddress hostsMgmt = NetworkAddress.valueOf(getConfig(vtnNode, HOST_MANAGEMENT_IP));
Hyunsun Moon0592c3d2016-06-23 14:47:52 -0700168
Hyunsun Moon81a13562016-08-04 13:48:08 -0700169 SshAccessInfo sshInfo = new SshAccessInfo(
Hyunsun Moon153db182016-08-04 14:06:40 -0700170 hostsMgmt.ip().getIp4Address(),
Hyunsun Moon81a13562016-08-04 13:48:08 -0700171 TpPort.tpPort(Integer.parseInt(getConfig(sshNode, SSH_PORT))),
Hyunsun Moon153db182016-08-04 14:06:40 -0700172 getConfig(sshNode, SSH_USER),
173 getConfig(sshNode, SSH_KEY_FILE));
Hyunsun Moon81a13562016-08-04 13:48:08 -0700174
175 CordVtnNode.Builder nodeBuilder = CordVtnNode.builder()
Hyunsun Moon153db182016-08-04 14:06:40 -0700176 .hostname(getConfig(vtnNode, HOSTNAME))
177 .hostMgmtIp(hostsMgmt)
Hyunsun Moon81a13562016-08-04 13:48:08 -0700178 .localMgmtIp(localMgmt)
Hyunsun Moon153db182016-08-04 14:06:40 -0700179 .dataIp(getConfig(vtnNode, DATA_IP))
Hyunsun Moon81a13562016-08-04 13:48:08 -0700180 .sshInfo(sshInfo)
Hyunsun Moon153db182016-08-04 14:06:40 -0700181 .integrationBridgeId(getConfig(vtnNode, INTEGRATION_BRIDGE_ID))
182 .dataIface(getConfig(vtnNode, DATA_IFACE));
Hyunsun Moon81a13562016-08-04 13:48:08 -0700183
Hyunsun Moon81a13562016-08-04 13:48:08 -0700184 if (!Strings.isNullOrEmpty(ovsdbPort)) {
185 nodeBuilder.ovsdbPort(Integer.parseInt(ovsdbPort));
186 }
187
Hyunsun Moon153db182016-08-04 14:06:40 -0700188 String hostMgmtIface = getConfig(vtnNode, HOST_MANAGEMENT_IFACE);
Hyunsun Moon81a13562016-08-04 13:48:08 -0700189 if (!Strings.isNullOrEmpty(hostMgmtIface)) {
190 nodeBuilder.hostMgmtIface(hostMgmtIface);
191 }
192
193 nodes.add(nodeBuilder.build());
Hyunsun Moon153db182016-08-04 14:06:40 -0700194 });
195
Hyunsun Moon4edb0172015-11-07 22:08:43 -0800196 return nodes;
Hyunsun Moone9d75992015-09-15 22:39:16 -0700197 }
198
199 /**
Hyunsun Moon153db182016-08-04 14:06:40 -0700200 * Gets the specified property as a string.
Hyunsun Moond05b32e2016-03-02 19:27:26 -0800201 *
Hyunsun Moon153db182016-08-04 14:06:40 -0700202 * @param jsonNode node whose fields to get
203 * @param path property to get
204 * @return value as a string
Hyunsun Moond05b32e2016-03-02 19:27:26 -0800205 */
206 private String getConfig(JsonNode jsonNode, String path) {
207 jsonNode = jsonNode.path(path);
Hyunsun Moon153db182016-08-04 14:06:40 -0700208 return jsonNode.asText();
Hyunsun Moond05b32e2016-03-02 19:27:26 -0800209 }
210
211 /**
Hyunsun Moonb5f92e52016-02-17 15:02:06 -0800212 * Returns private network gateway MAC address.
Hyunsun Moon3fc17f72016-01-24 21:47:06 -0800213 *
Hyunsun Moon153db182016-08-04 14:06:40 -0700214 * @return mac address
Hyunsun Moon3fc17f72016-01-24 21:47:06 -0800215 */
Hyunsun Moonb5f92e52016-02-17 15:02:06 -0800216 public MacAddress privateGatewayMac() {
217 JsonNode jsonNode = object.get(PRIVATE_GATEWAY_MAC);
Hyunsun Moon153db182016-08-04 14:06:40 -0700218 return MacAddress.valueOf(jsonNode.asText());
Hyunsun Moon3fc17f72016-01-24 21:47:06 -0800219 }
220
221 /**
Hyunsun Moonb5f92e52016-02-17 15:02:06 -0800222 * Returns public network gateway IP and MAC address pairs.
223 *
224 * @return map of ip and mac address
225 */
226 public Map<IpAddress, MacAddress> publicGateways() {
227 JsonNode jsonNodes = object.get(PUBLIC_GATEWAYS);
Hyunsun Moon153db182016-08-04 14:06:40 -0700228 Map<IpAddress, MacAddress> publicGateways = Maps.newHashMap();
229
Hyunsun Moonb5f92e52016-02-17 15:02:06 -0800230 if (jsonNodes == null) {
Hyunsun Moon153db182016-08-04 14:06:40 -0700231 return publicGateways;
Hyunsun Moonb5f92e52016-02-17 15:02:06 -0800232 }
233
Hyunsun Moon153db182016-08-04 14:06:40 -0700234 jsonNodes.forEach(jsonNode -> publicGateways.put(
235 IpAddress.valueOf(jsonNode.path(GATEWAY_IP).asText()),
236 MacAddress.valueOf(jsonNode.path(GATEWAY_MAC).asText())));
Hyunsun Moonb5f92e52016-02-17 15:02:06 -0800237 return publicGateways;
238 }
Hyunsun Moond05b32e2016-03-02 19:27:26 -0800239
Hyunsun Mooneaf75e62016-09-27 16:40:23 -0700240 // TODO add methods to get XOS and OpenStack API access
Hyunsun Moon61e79ee2016-04-14 19:04:23 -0700241}