blob: 774342ae46a61d67e8a1acd1f0efb1d4f30f1de7 [file] [log] [blame]
Daniel Parka7d6e9f2016-01-18 17:54:14 +09001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Daniel Parka7d6e9f2016-01-18 17:54:14 +09003 *
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 Moon0d457362017-06-27 17:19:41 +090016package org.onosproject.openstacknode.api;
Daniel Parka7d6e9f2016-01-18 17:54:14 +090017
18
19import com.fasterxml.jackson.databind.JsonNode;
Hyunsun Moon34bbe172016-06-28 19:18:40 -070020import com.fasterxml.jackson.databind.node.ObjectNode;
Daniel Parka7d6e9f2016-01-18 17:54:14 +090021import com.google.common.collect.Sets;
Hyunsun Moon34bbe172016-06-28 19:18:40 -070022import org.onlab.packet.IpAddress;
Daniel Parka7d6e9f2016-01-18 17:54:14 +090023import org.onosproject.core.ApplicationId;
24import org.onosproject.net.DeviceId;
Daniel Parka7d6e9f2016-01-18 17:54:14 +090025import org.onosproject.net.config.Config;
Hyunsun Moon0d457362017-06-27 17:19:41 +090026import org.onosproject.openstacknode.impl.DefaultOpenstackNode;
27
28import java.util.Set;
Hyunsun Moon34bbe172016-06-28 19:18:40 -070029
30import static org.onosproject.net.config.Config.FieldPresence.MANDATORY;
daniel park917beb42017-03-16 18:07:15 +090031import static org.onosproject.net.config.Config.FieldPresence.OPTIONAL;
Hyunsun Moon0d457362017-06-27 17:19:41 +090032import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
Daniel Parka7d6e9f2016-01-18 17:54:14 +090033
34/**
35 * Configuration object for OpensatckNode service.
36 */
Hyunsun Moon34bbe172016-06-28 19:18:40 -070037public final class OpenstackNodeConfig extends Config<ApplicationId> {
Daniel Parka7d6e9f2016-01-18 17:54:14 +090038
Hyunsun Moon34bbe172016-06-28 19:18:40 -070039 private static final String NODES = "nodes";
40 private static final String HOST_NAME = "hostname";
41 private static final String TYPE = "type";
42 private static final String MANAGEMENT_IP = "managementIp";
43 private static final String DATA_IP = "dataIp";
44 private static final String INTEGRATION_BRIDGE = "integrationBridge";
Hyunsun Moon052c71f2016-07-11 18:56:18 -070045
46 // GATEWAY node specific fields
Hyunsun Moon34bbe172016-06-28 19:18:40 -070047 private static final String ROUTER_BRIDGE = "routerBridge";
Hyunsun Moon0d457362017-06-27 17:19:41 +090048 private static final String VLAN_INTF_NAME = "vlanPort";
Daniel Parka7d6e9f2016-01-18 17:54:14 +090049
Hyunsun Moon34bbe172016-06-28 19:18:40 -070050 @Override
51 public boolean isValid() {
52 boolean result = hasOnlyFields(NODES);
Hyunsun Moon34bbe172016-06-28 19:18:40 -070053 if (object.get(NODES) == null || object.get(NODES).size() < 1) {
Hyunsun Moon0d457362017-06-27 17:19:41 +090054 return true;
Hyunsun Moon34bbe172016-06-28 19:18:40 -070055 }
56
57 for (JsonNode node : object.get(NODES)) {
Hyunsun Moon0d457362017-06-27 17:19:41 +090058 if (get(node, DATA_IP) == null && get(node, VLAN_INTF_NAME) == null) {
daniel park917beb42017-03-16 18:07:15 +090059 final String msg = "There is neither tunnel interface nor vlan port";
60 throw new IllegalArgumentException(msg);
61 }
Hyunsun Moon34bbe172016-06-28 19:18:40 -070062 ObjectNode osNode = (ObjectNode) node;
63 result &= hasOnlyFields(osNode,
64 HOST_NAME,
65 TYPE,
66 MANAGEMENT_IP,
67 DATA_IP,
68 INTEGRATION_BRIDGE,
Hyunsun Moon052c71f2016-07-11 18:56:18 -070069 ROUTER_BRIDGE,
Hyunsun Moon0d457362017-06-27 17:19:41 +090070 VLAN_INTF_NAME
Hyunsun Moon34bbe172016-06-28 19:18:40 -070071 );
72
73 result &= isString(osNode, HOST_NAME, MANDATORY);
74 result &= isString(osNode, TYPE, MANDATORY);
75 result &= isIpAddress(osNode, MANAGEMENT_IP, MANDATORY);
Hyunsun Moon34bbe172016-06-28 19:18:40 -070076 result &= isString(osNode, INTEGRATION_BRIDGE, MANDATORY);
Hyunsun Moon0d457362017-06-27 17:19:41 +090077 result &= isString(osNode, VLAN_INTF_NAME, OPTIONAL);
daniel park917beb42017-03-16 18:07:15 +090078 result &= isIpAddress(osNode, DATA_IP, OPTIONAL);
Hyunsun Moon34bbe172016-06-28 19:18:40 -070079
80 DeviceId.deviceId(osNode.get(INTEGRATION_BRIDGE).asText());
Hyunsun Moon0d457362017-06-27 17:19:41 +090081 OpenstackNode.NodeType.valueOf(osNode.get(TYPE).asText());
Hyunsun Moon34bbe172016-06-28 19:18:40 -070082
83 if (osNode.get(TYPE).asText().equals(GATEWAY.name())) {
84 result &= isString(osNode, ROUTER_BRIDGE, MANDATORY);
85 DeviceId.deviceId(osNode.get(ROUTER_BRIDGE).asText());
86 }
87 }
88 return result;
89 }
Daniel Parka7d6e9f2016-01-18 17:54:14 +090090
91 /**
92 * Returns the set of nodes read from network config.
93 *
Hyunsun Moon34bbe172016-06-28 19:18:40 -070094 * @return set of openstack nodes
Daniel Parka7d6e9f2016-01-18 17:54:14 +090095 */
96 public Set<OpenstackNode> openstackNodes() {
Daniel Parka7d6e9f2016-01-18 17:54:14 +090097 Set<OpenstackNode> nodes = Sets.newHashSet();
Hyunsun Moon34bbe172016-06-28 19:18:40 -070098 for (JsonNode node : object.get(NODES)) {
Hyunsun Moon0d457362017-06-27 17:19:41 +090099 OpenstackNode.NodeType type = OpenstackNode.NodeType.valueOf(get(node, TYPE));
100 OpenstackNode.Builder nodeBuilder = DefaultOpenstackNode.builder()
101 .intgBridge(DeviceId.deviceId(get(node, INTEGRATION_BRIDGE)))
Hyunsun Moon34bbe172016-06-28 19:18:40 -0700102 .managementIp(IpAddress.valueOf(get(node, MANAGEMENT_IP)))
103 .type(type)
Hyunsun Moon0d457362017-06-27 17:19:41 +0900104 .hostname(get(node, HOST_NAME))
105 .state(NodeState.INIT);
Daniel Parka7d6e9f2016-01-18 17:54:14 +0900106
daniel park917beb42017-03-16 18:07:15 +0900107 if (get(node, DATA_IP) != null) {
108 nodeBuilder.dataIp(IpAddress.valueOf(get(node, DATA_IP)));
109 }
Hyunsun Moon0d457362017-06-27 17:19:41 +0900110 if (get(node, VLAN_INTF_NAME) != null) {
111 nodeBuilder.vlanIntf(get(node, VLAN_INTF_NAME));
daniel park917beb42017-03-16 18:07:15 +0900112 }
Hyunsun Moon34bbe172016-06-28 19:18:40 -0700113 if (type.equals(GATEWAY)) {
Hyunsun Moon0d457362017-06-27 17:19:41 +0900114 nodeBuilder.routerBridge(DeviceId.deviceId(get(node, ROUTER_BRIDGE)));
Daniel Parka7d6e9f2016-01-18 17:54:14 +0900115 }
Hyunsun Moon34bbe172016-06-28 19:18:40 -0700116 nodes.add(nodeBuilder.build());
117 }
Daniel Parka7d6e9f2016-01-18 17:54:14 +0900118 return nodes;
119 }
Hyunsun Moon34bbe172016-06-28 19:18:40 -0700120
121 private String get(JsonNode jsonNode, String path) {
daniel park917beb42017-03-16 18:07:15 +0900122 JsonNode jNode = jsonNode.get(path);
123 if (jNode == null || jNode.isMissingNode()) {
124 return null;
125 }
126 return jNode.asText();
Hyunsun Moon34bbe172016-06-28 19:18:40 -0700127 }
Daniel Parka7d6e9f2016-01-18 17:54:14 +0900128}