blob: c20e678a327ccd0648f15a2b023f0f991fd4f95c [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 */
16package org.onosproject.openstacknode;
17
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;
Hyunsun Moon34bbe172016-06-28 19:18:40 -070025import org.onosproject.openstacknode.OpenstackNodeService.NodeType;
Daniel Parka7d6e9f2016-01-18 17:54:14 +090026import java.util.Set;
27import org.onosproject.net.config.Config;
Hyunsun Moon34bbe172016-06-28 19:18:40 -070028
29import static org.onosproject.net.config.Config.FieldPresence.MANDATORY;
30import static org.onosproject.openstacknode.OpenstackNodeService.NodeType.GATEWAY;
Daniel Parka7d6e9f2016-01-18 17:54:14 +090031
32/**
33 * Configuration object for OpensatckNode service.
34 */
Hyunsun Moon34bbe172016-06-28 19:18:40 -070035public final class OpenstackNodeConfig extends Config<ApplicationId> {
Daniel Parka7d6e9f2016-01-18 17:54:14 +090036
Hyunsun Moon34bbe172016-06-28 19:18:40 -070037 private static final String NODES = "nodes";
38 private static final String HOST_NAME = "hostname";
39 private static final String TYPE = "type";
40 private static final String MANAGEMENT_IP = "managementIp";
41 private static final String DATA_IP = "dataIp";
42 private static final String INTEGRATION_BRIDGE = "integrationBridge";
Hyunsun Moon052c71f2016-07-11 18:56:18 -070043
44 // GATEWAY node specific fields
Hyunsun Moon34bbe172016-06-28 19:18:40 -070045 private static final String ROUTER_BRIDGE = "routerBridge";
Hyunsun Moon052c71f2016-07-11 18:56:18 -070046 private static final String UPLINK_PORT_NAME = "uplinkPort";
47 // TODO remove this when vRouter supports multiple switches
48 private static final String ROUTER_CONTROLLER = "routerController";
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);
Daniel Parka7d6e9f2016-01-18 17:54:14 +090053
Hyunsun Moon34bbe172016-06-28 19:18:40 -070054 if (object.get(NODES) == null || object.get(NODES).size() < 1) {
55 final String msg = "No node is present";
56 throw new IllegalArgumentException(msg);
57 }
58
59 for (JsonNode node : object.get(NODES)) {
60 ObjectNode osNode = (ObjectNode) node;
61 result &= hasOnlyFields(osNode,
62 HOST_NAME,
63 TYPE,
64 MANAGEMENT_IP,
65 DATA_IP,
66 INTEGRATION_BRIDGE,
Hyunsun Moon052c71f2016-07-11 18:56:18 -070067 ROUTER_BRIDGE,
68 UPLINK_PORT_NAME,
69 ROUTER_CONTROLLER
Hyunsun Moon34bbe172016-06-28 19:18:40 -070070 );
71
72 result &= isString(osNode, HOST_NAME, MANDATORY);
73 result &= isString(osNode, TYPE, MANDATORY);
74 result &= isIpAddress(osNode, MANAGEMENT_IP, MANDATORY);
75 result &= result && isIpAddress(osNode, DATA_IP, MANDATORY);
76 result &= isString(osNode, INTEGRATION_BRIDGE, MANDATORY);
77
78 DeviceId.deviceId(osNode.get(INTEGRATION_BRIDGE).asText());
79 NodeType.valueOf(osNode.get(TYPE).asText());
80
81 if (osNode.get(TYPE).asText().equals(GATEWAY.name())) {
82 result &= isString(osNode, ROUTER_BRIDGE, MANDATORY);
83 DeviceId.deviceId(osNode.get(ROUTER_BRIDGE).asText());
Hyunsun Moon052c71f2016-07-11 18:56:18 -070084 result &= isString(osNode, UPLINK_PORT_NAME, MANDATORY);
85 result &= isIpAddress(osNode, ROUTER_CONTROLLER, MANDATORY);
Hyunsun Moon34bbe172016-06-28 19:18:40 -070086 }
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();
98
Hyunsun Moon34bbe172016-06-28 19:18:40 -070099 for (JsonNode node : object.get(NODES)) {
100 NodeType type = NodeType.valueOf(get(node, TYPE));
101 OpenstackNode.Builder nodeBuilder = OpenstackNode.builder()
102 .integrationBridge(DeviceId.deviceId(get(node, INTEGRATION_BRIDGE)))
103 .dataIp(IpAddress.valueOf(get(node, DATA_IP)))
104 .managementIp(IpAddress.valueOf(get(node, MANAGEMENT_IP)))
105 .type(type)
106 .hostname(get(node, HOST_NAME));
Daniel Parka7d6e9f2016-01-18 17:54:14 +0900107
Hyunsun Moon34bbe172016-06-28 19:18:40 -0700108 if (type.equals(GATEWAY)) {
Hyunsun Moon052c71f2016-07-11 18:56:18 -0700109 nodeBuilder.routerBridge(DeviceId.deviceId(get(node, ROUTER_BRIDGE)))
110 .uplink(get(node, UPLINK_PORT_NAME))
111 .routerController(IpAddress.valueOf(get(node, ROUTER_CONTROLLER)));
Daniel Parka7d6e9f2016-01-18 17:54:14 +0900112 }
Hyunsun Moon34bbe172016-06-28 19:18:40 -0700113 nodes.add(nodeBuilder.build());
114 }
Daniel Parka7d6e9f2016-01-18 17:54:14 +0900115 return nodes;
116 }
Hyunsun Moon34bbe172016-06-28 19:18:40 -0700117
118 private String get(JsonNode jsonNode, String path) {
119 return jsonNode.get(path).asText();
120 }
Daniel Parka7d6e9f2016-01-18 17:54:14 +0900121}