blob: 842e9fe9f9ef1c970f5dc3eb6161352e9f8905a0 [file] [log] [blame]
sanghoshinf25d2e02015-11-11 23:07:17 +09001/*
2 * Copyright 2015 Open Networking Laboratory
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.openstackswitching;
17
18import com.fasterxml.jackson.databind.ObjectMapper;
19import com.fasterxml.jackson.databind.node.ArrayNode;
20import com.fasterxml.jackson.databind.node.ObjectNode;
21import com.google.common.collect.Lists;
22import com.sun.jersey.api.client.Client;
23import com.sun.jersey.api.client.WebResource;
24import org.onosproject.openstackswitching.web.OpenstackNetworkCodec;
25import org.onosproject.openstackswitching.web.OpenstackPortCodec;
26import org.onosproject.openstackswitching.web.OpenstackSubnetCodec;
27import org.slf4j.Logger;
28import javax.ws.rs.core.MediaType;
29import java.io.IOException;
30import java.util.Collection;
Hyunsun Moonf7895202016-01-12 12:21:48 -080031import java.util.Collections;
sanghoshinf25d2e02015-11-11 23:07:17 +090032import java.util.List;
33
34import static com.google.common.base.Preconditions.checkNotNull;
35import static com.google.common.net.MediaType.JSON_UTF_8;
36import static org.slf4j.LoggerFactory.getLogger;
37
38/**
39 * Handles REST Calls to Openstack Neutron.
40 *
41 */
42public class OpenstackRestHandler {
43
44 private final Logger log = getLogger(getClass());
45 private String neutronUrl;
46 private String keystoneUrl;
47 private String tokenId;
48 private String userName;
49 private String pass;
50
51 /**
52 * Creates OpenstackRestHandler instance.
53 *
54 * @param cfg OpenstackSwitchingConfig reference
55 */
56 public OpenstackRestHandler(OpenstackSwitchingConfig cfg) {
57 this.neutronUrl = checkNotNull(cfg.neutronServer());
58 this.keystoneUrl = checkNotNull(cfg.keystoneServer());
59 this.userName = checkNotNull(cfg.userName());
60 this.pass = checkNotNull(cfg.password());
61 }
62
63 /**
64 * Returns network information stored in Neutron.
65 *
66 * @return List of OpenstackNetwork
67 */
68 public Collection<OpenstackNetwork> getNetworks() {
69
70 WebResource.Builder builder = getClientBuilder(neutronUrl + "networks");
71 String response = builder.accept(MediaType.APPLICATION_JSON_TYPE).
72 header("X-Auth-Token", getToken()).get(String.class);
73
Hyunsun Moonf7895202016-01-12 12:21:48 -080074 log.debug("networks response:" + response);
75
sanghoshinf25d2e02015-11-11 23:07:17 +090076 ObjectMapper mapper = new ObjectMapper();
77 List<OpenstackNetwork> openstackNetworks = Lists.newArrayList();
78 try {
79 ObjectNode node = (ObjectNode) mapper.readTree(response);
80 ArrayNode networkList = (ArrayNode) node.path("networks");
81 OpenstackNetworkCodec networkCodec = new OpenstackNetworkCodec();
82 networkList.forEach(n -> openstackNetworks.add(networkCodec.decode((ObjectNode) n, null)));
83 } catch (IOException e) {
Ray Milkey4fd3ceb2015-12-10 14:43:08 -080084 log.warn("getNetworks()", e);
sanghoshinf25d2e02015-11-11 23:07:17 +090085 }
86
Hyunsun Moonf7895202016-01-12 12:21:48 -080087 openstackNetworks.removeAll(Collections.singleton(null));
sanghoshinf25d2e02015-11-11 23:07:17 +090088 openstackNetworks.forEach(n -> log.debug("network ID: {}", n.id()));
89
90 return openstackNetworks;
91 }
92
93 /**
94 * Returns port information stored in Neutron.
95 *
96 * @return List of OpenstackPort
97 */
98 public Collection<OpenstackPort> getPorts() {
99
100 WebResource.Builder builder = getClientBuilder(neutronUrl + "ports");
101 String response = builder.accept(MediaType.APPLICATION_JSON_TYPE).
102 header("X-Auth-Token", getToken()).get(String.class);
103
104 ObjectMapper mapper = new ObjectMapper();
105 List<OpenstackPort> openstackPorts = Lists.newArrayList();
106 try {
107 ObjectNode node = (ObjectNode) mapper.readTree(response);
108 ArrayNode portList = (ArrayNode) node.path("ports");
109 OpenstackPortCodec portCodec = new OpenstackPortCodec();
110 portList.forEach(p -> openstackPorts.add(portCodec.decode((ObjectNode) p, null)));
111 } catch (IOException e) {
Ray Milkey4fd3ceb2015-12-10 14:43:08 -0800112 log.warn("getPorts()", e);
sanghoshinf25d2e02015-11-11 23:07:17 +0900113 }
114
115 log.debug("port response:" + response);
116 openstackPorts.forEach(n -> log.debug("port ID: {}", n.id()));
117
118 return openstackPorts;
119 }
120
121 /**
122 * Returns Subnet information in Neutron.
123 *
124 * @return List of OpenstackSubnet
125 */
126 public Collection<OpenstackSubnet> getSubnets() {
127
128 WebResource.Builder builder = getClientBuilder(neutronUrl + "subnets");
129 String response = builder.accept(MediaType.APPLICATION_JSON_TYPE).
130 header("X-Auth-Token", getToken()).get(String.class);
131
132 ObjectMapper mapper = new ObjectMapper();
133 List<OpenstackSubnet> subnets = Lists.newArrayList();
134 try {
135 ObjectNode node = (ObjectNode) mapper.readTree(response);
136 ArrayNode subnetList = (ArrayNode) node.path("subnets");
137 OpenstackSubnetCodec subnetCodec = new OpenstackSubnetCodec();
138 subnetList.forEach(s -> subnets.add(subnetCodec.decode((ObjectNode) s, null)));
139 } catch (IOException e) {
Ray Milkey4fd3ceb2015-12-10 14:43:08 -0800140 log.warn("getSubnets()", e);
sanghoshinf25d2e02015-11-11 23:07:17 +0900141 }
142
143 log.debug("subnets response:" + response);
144 subnets.forEach(s -> log.debug("subnet ID: {}", s.id()));
145
146 return subnets;
147 }
148
149 private WebResource.Builder getClientBuilder(String uri) {
150 Client client = Client.create();
151 WebResource resource = client.resource(uri);
152 return resource.accept(JSON_UTF_8.toString())
153 .type(JSON_UTF_8.toString());
154 }
155
156 private String getToken() {
157 if (isTokenInvalid()) {
158 String request = "{\"auth\": {\"tenantName\": \"admin\", " +
159 "\"passwordCredentials\": {\"username\": \"" +
160 userName + "\",\"password\": \"" + pass + "\"}}}";
161 WebResource.Builder builder = getClientBuilder(keystoneUrl + "tokens");
162 String response = builder.accept(MediaType.APPLICATION_JSON).post(String.class, request);
163
164 ObjectMapper mapper = new ObjectMapper();
165 try {
166 ObjectNode node = (ObjectNode) mapper.readTree(response);
167 tokenId = node.path("access").path("token").path("id").asText();
168 } catch (IOException e) {
Ray Milkey4fd3ceb2015-12-10 14:43:08 -0800169 log.warn("getToken()", e);
sanghoshinf25d2e02015-11-11 23:07:17 +0900170 }
171 log.debug("token response:" + response);
172 }
173
174 return tokenId;
175 }
176
177 private boolean isTokenInvalid() {
178 //TODO: validation check for the existing token
179 return true;
180 }
181
182}