blob: f32033047d78183bcc5cac5c70bcc4d73a6b50b1 [file] [log] [blame]
sanghoshinf25d2e02015-11-11 23:07:17 +09001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
sanghoshinf25d2e02015-11-11 23:07:17 +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 Moon0dba61f2016-03-03 14:05:21 -080016package org.onosproject.openstackinterface.impl;
sanghoshinf25d2e02015-11-11 23:07:17 +090017
18import com.fasterxml.jackson.databind.ObjectMapper;
19import com.fasterxml.jackson.databind.node.ArrayNode;
20import com.fasterxml.jackson.databind.node.ObjectNode;
sangho93447f12016-02-24 00:33:22 +090021import com.google.common.collect.ImmutableSet;
sanghoshinf25d2e02015-11-11 23:07:17 +090022import com.google.common.collect.Lists;
sangho0c2a3da2016-02-16 13:39:07 +090023import org.apache.felix.scr.annotations.Activate;
24import org.apache.felix.scr.annotations.Component;
25import org.apache.felix.scr.annotations.Deactivate;
26import org.apache.felix.scr.annotations.Reference;
27import org.apache.felix.scr.annotations.ReferenceCardinality;
28import org.apache.felix.scr.annotations.Service;
29import org.onosproject.core.ApplicationId;
30import org.onosproject.core.CoreService;
31import org.onosproject.net.Port;
sangho93447f12016-02-24 00:33:22 +090032import org.onosproject.net.config.ConfigFactory;
33import org.onosproject.net.config.NetworkConfigEvent;
34import org.onosproject.net.config.NetworkConfigListener;
35import org.onosproject.net.config.NetworkConfigRegistry;
sanghod177f8f2016-06-29 21:52:23 +090036import org.onosproject.openstackinterface.OpenstackFloatingIP;
Hyunsun Moon0dba61f2016-03-03 14:05:21 -080037import org.onosproject.openstackinterface.OpenstackInterfaceService;
38import org.onosproject.openstackinterface.OpenstackNetwork;
sangho48907542016-03-28 16:07:07 +090039import org.onosproject.openstackinterface.OpenstackInterfaceConfig;
Hyunsun Moon0dba61f2016-03-03 14:05:21 -080040import org.onosproject.openstackinterface.OpenstackPort;
41import org.onosproject.openstackinterface.OpenstackRouter;
42import org.onosproject.openstackinterface.OpenstackSecurityGroup;
43import org.onosproject.openstackinterface.OpenstackSubnet;
sanghod177f8f2016-06-29 21:52:23 +090044import org.onosproject.openstackinterface.web.OpenstackFloatingIpCodec;
sangho93447f12016-02-24 00:33:22 +090045import org.onosproject.openstackinterface.web.OpenstackNetworkCodec;
46import org.onosproject.openstackinterface.web.OpenstackPortCodec;
47import org.onosproject.openstackinterface.web.OpenstackRouterCodec;
48import org.onosproject.openstackinterface.web.OpenstackSecurityGroupCodec;
49import org.onosproject.openstackinterface.web.OpenstackSubnetCodec;
sanghoshinf25d2e02015-11-11 23:07:17 +090050import org.slf4j.Logger;
Jian Li9d616492016-03-09 10:52:49 -080051
52import javax.ws.rs.client.Client;
53import javax.ws.rs.client.ClientBuilder;
54import javax.ws.rs.client.Entity;
55import javax.ws.rs.client.Invocation;
56import javax.ws.rs.client.WebTarget;
sanghoshinf25d2e02015-11-11 23:07:17 +090057import javax.ws.rs.core.MediaType;
58import java.io.IOException;
sangho9f189ec2016-04-05 14:22:17 +090059import java.text.ParseException;
60import java.text.SimpleDateFormat;
61import java.util.Calendar;
sanghoshinf25d2e02015-11-11 23:07:17 +090062import java.util.Collection;
Hyunsun Moonf7895202016-01-12 12:21:48 -080063import java.util.Collections;
sangho9f189ec2016-04-05 14:22:17 +090064import java.util.Date;
sanghoshinf25d2e02015-11-11 23:07:17 +090065import java.util.List;
sangho93447f12016-02-24 00:33:22 +090066import java.util.Set;
67import java.util.concurrent.ExecutorService;
68import java.util.concurrent.Executors;
sangho0c2a3da2016-02-16 13:39:07 +090069import java.util.stream.Collectors;
sanghoshinf25d2e02015-11-11 23:07:17 +090070
71import static com.google.common.base.Preconditions.checkNotNull;
72import static com.google.common.net.MediaType.JSON_UTF_8;
sangho93447f12016-02-24 00:33:22 +090073import static org.onlab.util.Tools.groupedThreads;
74import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
sanghoshinf25d2e02015-11-11 23:07:17 +090075import static org.slf4j.LoggerFactory.getLogger;
76
77/**
78 * Handles REST Calls to Openstack Neutron.
79 *
80 */
sangho0c2a3da2016-02-16 13:39:07 +090081@Service
82@Component(immediate = true)
sangho93447f12016-02-24 00:33:22 +090083public class OpenstackInterfaceManager implements OpenstackInterfaceService {
sanghoshinf25d2e02015-11-11 23:07:17 +090084
sangho5db8e052016-01-29 16:08:23 +090085 private static final String URI_NETWORKS = "networks";
86 private static final String URI_PORTS = "ports";
87 private static final String URI_SUBNETS = "subnets";
88 private static final String URI_SECURITY_GROUPS = "security-groups";
sanghod177f8f2016-06-29 21:52:23 +090089 private static final String URI_FLOATINGIPS = "floatingips";
sangho5db8e052016-01-29 16:08:23 +090090 private static final String URI_TOKENS = "tokens";
91
Daniel Park3a06c522016-01-28 20:51:12 +090092 private static final String PATH_ROUTERS = "routers";
sangho5db8e052016-01-29 16:08:23 +090093 private static final String PATH_NETWORKS = "networks";
94 private static final String PATH_PORTS = "ports";
95 private static final String PATH_SUBNETS = "subnets";
sanghod177f8f2016-06-29 21:52:23 +090096 private static final String PATH_FLOATINGIPS = "floatingips";
sangho5db8e052016-01-29 16:08:23 +090097 private static final String PATH_ACCESS = "access";
98 private static final String PATH_TOKEN = "token";
99 private static final String PATH_ID = "id";
sangho9f189ec2016-04-05 14:22:17 +0900100 private static final String PATH_EXPIRES = "expires";
sangho5db8e052016-01-29 16:08:23 +0900101
102 private static final String HEADER_AUTH_TOKEN = "X-Auth-Token";
sangho9f189ec2016-04-05 14:22:17 +0900103 private static final String TOKEN_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
sangho5db8e052016-01-29 16:08:23 +0900104
sanghoshinf25d2e02015-11-11 23:07:17 +0900105 private final Logger log = getLogger(getClass());
106 private String neutronUrl;
107 private String keystoneUrl;
108 private String tokenId;
sangho9f189ec2016-04-05 14:22:17 +0900109 private String tokenExpires;
sanghoshinf25d2e02015-11-11 23:07:17 +0900110 private String userName;
111 private String pass;
112
sangho0c2a3da2016-02-16 13:39:07 +0900113 private static final String PORT_NAME = "portName";
114
115 private ApplicationId appId;
116
117 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
118 protected CoreService coreService;
119
120 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
sangho93447f12016-02-24 00:33:22 +0900121 protected NetworkConfigRegistry cfgService;
sangho0c2a3da2016-02-16 13:39:07 +0900122
sangho93447f12016-02-24 00:33:22 +0900123 private InternalConfigListener internalConfigListener = new InternalConfigListener();
124 private ExecutorService networkEventExcutorService =
125 Executors.newSingleThreadExecutor(groupedThreads("onos/openstackinterface", "config-event"));
126
127 private final Set<ConfigFactory> factories = ImmutableSet.of(
sangho48907542016-03-28 16:07:07 +0900128 new ConfigFactory<ApplicationId, OpenstackInterfaceConfig>(APP_SUBJECT_FACTORY,
129 OpenstackInterfaceConfig.class,
sangho93447f12016-02-24 00:33:22 +0900130 "openstackinterface") {
131 @Override
sangho48907542016-03-28 16:07:07 +0900132 public OpenstackInterfaceConfig createConfig() {
133 return new OpenstackInterfaceConfig();
sangho93447f12016-02-24 00:33:22 +0900134 }
135 }
136 );
137
sangho0c2a3da2016-02-16 13:39:07 +0900138
139 @Activate
140 protected void activate() {
141 appId = coreService
sangho93447f12016-02-24 00:33:22 +0900142 .registerApplication("org.onosproject.openstackinterface");
143
144 factories.forEach(cfgService::registerConfigFactory);
145 cfgService.addListener(internalConfigListener);
sangho0c2a3da2016-02-16 13:39:07 +0900146
147 log.info("started");
148 }
149
150 @Deactivate
151 protected void deactivate() {
sangho93447f12016-02-24 00:33:22 +0900152 cfgService.removeListener(internalConfigListener);
153 factories.forEach(cfgService::unregisterConfigFactory);
sangho0c2a3da2016-02-16 13:39:07 +0900154 log.info("stopped");
sanghoshinf25d2e02015-11-11 23:07:17 +0900155 }
156
157 /**
158 * Returns network information stored in Neutron.
159 *
160 * @return List of OpenstackNetwork
161 */
162 public Collection<OpenstackNetwork> getNetworks() {
163
Jian Li9d616492016-03-09 10:52:49 -0800164 Invocation.Builder builder = getClientBuilder(neutronUrl + URI_NETWORKS);
sanghoshinf25d2e02015-11-11 23:07:17 +0900165 String response = builder.accept(MediaType.APPLICATION_JSON_TYPE).
sangho5db8e052016-01-29 16:08:23 +0900166 header(HEADER_AUTH_TOKEN, getToken()).get(String.class);
sanghoshinf25d2e02015-11-11 23:07:17 +0900167
Hyunsun Moonf7895202016-01-12 12:21:48 -0800168 log.debug("networks response:" + response);
169
sanghoshinf25d2e02015-11-11 23:07:17 +0900170 ObjectMapper mapper = new ObjectMapper();
171 List<OpenstackNetwork> openstackNetworks = Lists.newArrayList();
172 try {
173 ObjectNode node = (ObjectNode) mapper.readTree(response);
sangho5db8e052016-01-29 16:08:23 +0900174 ArrayNode networkList = (ArrayNode) node.path(PATH_NETWORKS);
sanghoshinf25d2e02015-11-11 23:07:17 +0900175 OpenstackNetworkCodec networkCodec = new OpenstackNetworkCodec();
176 networkList.forEach(n -> openstackNetworks.add(networkCodec.decode((ObjectNode) n, null)));
177 } catch (IOException e) {
Ray Milkey4fd3ceb2015-12-10 14:43:08 -0800178 log.warn("getNetworks()", e);
sanghoshinf25d2e02015-11-11 23:07:17 +0900179 }
180
Hyunsun Moonf7895202016-01-12 12:21:48 -0800181 openstackNetworks.removeAll(Collections.singleton(null));
sanghoshinf25d2e02015-11-11 23:07:17 +0900182 openstackNetworks.forEach(n -> log.debug("network ID: {}", n.id()));
183
184 return openstackNetworks;
185 }
186
187 /**
188 * Returns port information stored in Neutron.
189 *
190 * @return List of OpenstackPort
191 */
192 public Collection<OpenstackPort> getPorts() {
193
Jian Li9d616492016-03-09 10:52:49 -0800194 Invocation.Builder builder = getClientBuilder(neutronUrl + URI_PORTS);
sanghoshinf25d2e02015-11-11 23:07:17 +0900195 String response = builder.accept(MediaType.APPLICATION_JSON_TYPE).
sangho5db8e052016-01-29 16:08:23 +0900196 header(HEADER_AUTH_TOKEN, getToken()).get(String.class);
sanghoshinf25d2e02015-11-11 23:07:17 +0900197
198 ObjectMapper mapper = new ObjectMapper();
199 List<OpenstackPort> openstackPorts = Lists.newArrayList();
200 try {
201 ObjectNode node = (ObjectNode) mapper.readTree(response);
sangho5db8e052016-01-29 16:08:23 +0900202 ArrayNode portList = (ArrayNode) node.path(PATH_PORTS);
sanghoshinf25d2e02015-11-11 23:07:17 +0900203 OpenstackPortCodec portCodec = new OpenstackPortCodec();
204 portList.forEach(p -> openstackPorts.add(portCodec.decode((ObjectNode) p, null)));
205 } catch (IOException e) {
Ray Milkey4fd3ceb2015-12-10 14:43:08 -0800206 log.warn("getPorts()", e);
sanghoshinf25d2e02015-11-11 23:07:17 +0900207 }
208
209 log.debug("port response:" + response);
210 openstackPorts.forEach(n -> log.debug("port ID: {}", n.id()));
211
212 return openstackPorts;
213 }
214
Daniel Park3a06c522016-01-28 20:51:12 +0900215 public Collection<OpenstackRouter> getRouters() {
Jian Li9d616492016-03-09 10:52:49 -0800216 Invocation.Builder builder = getClientBuilder(neutronUrl + PATH_ROUTERS);
Daniel Park3a06c522016-01-28 20:51:12 +0900217 String response = builder.accept(MediaType.APPLICATION_JSON_TYPE).
218 header(HEADER_AUTH_TOKEN, getToken()).get(String.class);
219
220 ObjectMapper mapper = new ObjectMapper();
221 List<OpenstackRouter> openstackRouters = Lists.newArrayList();
222
223 try {
224 ObjectNode node = (ObjectNode) mapper.readTree(response);
225 ArrayNode routerList = (ArrayNode) node.path(PATH_ROUTERS);
226 OpenstackRouterCodec openstackRouterCodec = new OpenstackRouterCodec();
227 routerList.forEach(r -> openstackRouters
228 .add(openstackRouterCodec.decode((ObjectNode) r, null)));
229 } catch (IOException e) {
230 log.warn("getRouters()", e);
231 }
232
233 log.debug("router response:" + response);
234 openstackRouters.forEach(r -> log.debug("router ID: {}", r.id()));
235
236 return openstackRouters;
237 }
238
sanghoshinf25d2e02015-11-11 23:07:17 +0900239 /**
240 * Returns Subnet information in Neutron.
241 *
242 * @return List of OpenstackSubnet
243 */
244 public Collection<OpenstackSubnet> getSubnets() {
Jian Li9d616492016-03-09 10:52:49 -0800245 Invocation.Builder builder = getClientBuilder(neutronUrl + URI_SUBNETS);
sanghoshinf25d2e02015-11-11 23:07:17 +0900246 String response = builder.accept(MediaType.APPLICATION_JSON_TYPE).
sangho5db8e052016-01-29 16:08:23 +0900247 header(HEADER_AUTH_TOKEN, getToken()).get(String.class);
sanghoshinf25d2e02015-11-11 23:07:17 +0900248
249 ObjectMapper mapper = new ObjectMapper();
250 List<OpenstackSubnet> subnets = Lists.newArrayList();
251 try {
252 ObjectNode node = (ObjectNode) mapper.readTree(response);
sangho5db8e052016-01-29 16:08:23 +0900253 ArrayNode subnetList = (ArrayNode) node.path(PATH_SUBNETS);
sanghoshinf25d2e02015-11-11 23:07:17 +0900254 OpenstackSubnetCodec subnetCodec = new OpenstackSubnetCodec();
255 subnetList.forEach(s -> subnets.add(subnetCodec.decode((ObjectNode) s, null)));
256 } catch (IOException e) {
Ray Milkey4fd3ceb2015-12-10 14:43:08 -0800257 log.warn("getSubnets()", e);
sanghoshinf25d2e02015-11-11 23:07:17 +0900258 }
259
260 log.debug("subnets response:" + response);
261 subnets.forEach(s -> log.debug("subnet ID: {}", s.id()));
262
263 return subnets;
264 }
265
sangho5db8e052016-01-29 16:08:23 +0900266 /**
267 * Extracts OpenstackSecurityGroup information for the ID.
268 *
269 * @param id Security Group ID
270 * @return OpenstackSecurityGroup object or null if fails
271 */
sanghod177f8f2016-06-29 21:52:23 +0900272 public OpenstackSecurityGroup securityGroup(String id) {
Jian Li9d616492016-03-09 10:52:49 -0800273 Invocation.Builder builder = getClientBuilder(neutronUrl + URI_SECURITY_GROUPS + "/" + id);
sangho5db8e052016-01-29 16:08:23 +0900274 String response = builder.accept(MediaType.APPLICATION_JSON_TYPE).
275 header(HEADER_AUTH_TOKEN, getToken()).get(String.class);
276
277 ObjectMapper mapper = new ObjectMapper();
278 OpenstackSecurityGroup securityGroup = null;
279 try {
280 ObjectNode node = (ObjectNode) mapper.readTree(response);
281 OpenstackSecurityGroupCodec sgCodec = new OpenstackSecurityGroupCodec();
282 securityGroup = sgCodec.decode(node, null);
283 } catch (IOException e) {
sanghod177f8f2016-06-29 21:52:23 +0900284 log.warn("securityGroup()", e);
sangho5db8e052016-01-29 16:08:23 +0900285 }
286
287 return securityGroup;
288 }
289
Jian Li9d616492016-03-09 10:52:49 -0800290 private Invocation.Builder getClientBuilder(String uri) {
291 Client client = ClientBuilder.newClient();
292 WebTarget wt = client.target(uri);
293 return wt.request(JSON_UTF_8.toString());
sanghoshinf25d2e02015-11-11 23:07:17 +0900294 }
295
296 private String getToken() {
sangho9f189ec2016-04-05 14:22:17 +0900297 if (!isTokenValid()) {
sanghoshinf25d2e02015-11-11 23:07:17 +0900298 String request = "{\"auth\": {\"tenantName\": \"admin\", " +
299 "\"passwordCredentials\": {\"username\": \"" +
300 userName + "\",\"password\": \"" + pass + "\"}}}";
Jian Li9d616492016-03-09 10:52:49 -0800301 Invocation.Builder builder = getClientBuilder(keystoneUrl + URI_TOKENS);
302 String response = builder.accept(MediaType.APPLICATION_JSON).post(Entity.json(request), String.class);
sanghoshinf25d2e02015-11-11 23:07:17 +0900303
304 ObjectMapper mapper = new ObjectMapper();
305 try {
306 ObjectNode node = (ObjectNode) mapper.readTree(response);
sangho5db8e052016-01-29 16:08:23 +0900307 tokenId = node.path(PATH_ACCESS).path(PATH_TOKEN).path(PATH_ID).asText();
sangho9f189ec2016-04-05 14:22:17 +0900308 tokenExpires = node.path(PATH_ACCESS).path(PATH_TOKEN).path(PATH_EXPIRES).asText();
sanghoshinf25d2e02015-11-11 23:07:17 +0900309 } catch (IOException e) {
Ray Milkey4fd3ceb2015-12-10 14:43:08 -0800310 log.warn("getToken()", e);
sanghoshinf25d2e02015-11-11 23:07:17 +0900311 }
312 log.debug("token response:" + response);
313 }
314
315 return tokenId;
316 }
317
sangho9f189ec2016-04-05 14:22:17 +0900318 private boolean isTokenValid() {
319
320 if (tokenExpires == null || tokenId == null || tokenExpires.isEmpty()) {
321 return false;
322 }
323
324 try {
325 SimpleDateFormat dateFormat = new SimpleDateFormat(TOKEN_DATE_FORMAT);
326 Date exireDate = dateFormat.parse(tokenExpires);
327
328 Calendar today = Calendar.getInstance();
329 if (exireDate.after(today.getTime())) {
330 return true;
331 }
332 } catch (ParseException e) {
333 log.error("Token parse exception error : {}", e.getMessage());
334 return false;
335 }
336
337 log.debug("token is Invalid");
338 return false;
sanghoshinf25d2e02015-11-11 23:07:17 +0900339 }
340
sangho0c2a3da2016-02-16 13:39:07 +0900341 @Override
342 public Collection<OpenstackPort> ports(String networkId) {
343 return getPorts().stream()
344 .filter(port -> port.networkId().equals(networkId))
345 .collect(Collectors.toList());
346 }
347
348 @Override
349 public Collection<OpenstackPort> ports() {
350 return getPorts();
351 }
352
353 @Override
354 public OpenstackPort port(Port port) {
355 String uuid = port.annotations().value(PORT_NAME).substring(3);
356 return getPorts().stream()
357 .filter(p -> p.id().startsWith(uuid))
358 .findAny().orElse(null);
359 }
360
361 @Override
362 public OpenstackPort port(String portId) {
363 return getPorts().stream()
364 .filter(p -> p.id().equals(portId))
365 .findAny().orElse(null);
366 }
367
368 @Override
369 public OpenstackNetwork network(String networkId) {
Hyunsun Moonb0f09be2016-02-23 04:21:42 -0800370 Collection<OpenstackSubnet> subnets = getSubnets().stream()
371 .filter(s -> s.networkId().equals(networkId))
372 .collect(Collectors.toList());
373
374 OpenstackNetwork openstackNetwork = getNetworks().stream()
sangho0c2a3da2016-02-16 13:39:07 +0900375 .filter(n -> n.id().equals(networkId))
376 .findAny().orElse(null);
Hyunsun Moonb0f09be2016-02-23 04:21:42 -0800377
378 if (openstackNetwork == null) {
379 return null;
380 }
381
382 return OpenstackNetwork.builder()
383 .id(openstackNetwork.id())
384 .name(openstackNetwork.name())
385 .networkType(openstackNetwork.networkType())
386 .segmentId(openstackNetwork.segmentId())
387 .tenantId(openstackNetwork.tenantId())
388 .subnets(subnets)
389 .build();
sangho0c2a3da2016-02-16 13:39:07 +0900390 }
391
392 @Override
393 public Collection<OpenstackNetwork> networks() {
394 return getNetworks();
395 }
396
397 @Override
398 public OpenstackSubnet subnet(String subnetId) {
399 return getSubnets().stream()
400 .filter(subnet -> subnet.id().equals(subnetId))
401 .findAny().orElse(null);
402 }
403
404 @Override
405 public Collection<OpenstackSubnet> subnets() {
406 return getSubnets();
407 }
408
409 @Override
410 public Collection<OpenstackRouter> routers() {
411 return getRouters();
412 }
413
414 @Override
415 public OpenstackRouter router(String routerId) {
416 return getRouters().stream()
417 .filter(router -> router.id().equals(routerId))
418 .findAny().orElse(null);
419 }
420
sanghod177f8f2016-06-29 21:52:23 +0900421 @Override
422 public Collection<OpenstackFloatingIP> floatingIps() {
423 Invocation.Builder builder = getClientBuilder(neutronUrl + URI_FLOATINGIPS);
424 String response = builder.accept(MediaType.APPLICATION_JSON_TYPE).
425 header(HEADER_AUTH_TOKEN, getToken()).get(String.class);
426
427 log.debug("floatingIps response:" + response);
428
429 ObjectMapper mapper = new ObjectMapper();
430 List<OpenstackFloatingIP> openstackFloatingIPs = Lists.newArrayList();
431 try {
432 ObjectNode node = (ObjectNode) mapper.readTree(response);
433 ArrayNode floatingIpList = (ArrayNode) node.path(PATH_FLOATINGIPS);
434 OpenstackFloatingIpCodec fipCodec = new OpenstackFloatingIpCodec();
435 floatingIpList.forEach(f -> openstackFloatingIPs.add(fipCodec.decode((ObjectNode) f, null)));
436 } catch (IOException e) {
437 log.warn("floatingIps()", e);
438 }
439
440 openstackFloatingIPs.removeAll(Collections.singleton(null));
441
442 return openstackFloatingIPs;
443 }
444
sangho93447f12016-02-24 00:33:22 +0900445 private class InternalConfigListener implements NetworkConfigListener {
sangho0c2a3da2016-02-16 13:39:07 +0900446
sangho93447f12016-02-24 00:33:22 +0900447 public void configureNetwork() {
sangho48907542016-03-28 16:07:07 +0900448 OpenstackInterfaceConfig cfg =
449 cfgService.getConfig(appId, OpenstackInterfaceConfig.class);
sangho93447f12016-02-24 00:33:22 +0900450 if (cfg == null) {
451 log.error("There is no openstack server information in config.");
452 return;
453 }
454
455 neutronUrl = checkNotNull(cfg.neutronServer());
456 keystoneUrl = checkNotNull(cfg.keystoneServer());
457 userName = checkNotNull(cfg.userName());
458 pass = checkNotNull(cfg.password());
459 }
460
461 @Override
462 public void event(NetworkConfigEvent event) {
463 if (((event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
464 event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)) &&
sangho48907542016-03-28 16:07:07 +0900465 event.configClass().equals(OpenstackInterfaceConfig.class)) {
sangho93447f12016-02-24 00:33:22 +0900466
467 log.info("Network configuration changed");
468 networkEventExcutorService.execute(this::configureNetwork);
469 }
470 }
sangho0c2a3da2016-02-16 13:39:07 +0900471 }
Jian Li9d616492016-03-09 10:52:49 -0800472}