blob: 9f8cdf02832c9bd69fb905095c25d121b06ca8ee [file] [log] [blame]
Hyunsun Moon44aac662017-02-18 02:07:01 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Hyunsun Moon44aac662017-02-18 02:07:01 +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.openstacknetworking.impl;
17
18import com.google.common.base.Strings;
19import org.apache.felix.scr.annotations.Activate;
20import org.apache.felix.scr.annotations.Component;
21import org.apache.felix.scr.annotations.Deactivate;
22import org.apache.felix.scr.annotations.Reference;
23import org.apache.felix.scr.annotations.ReferenceCardinality;
24import org.onlab.packet.Ethernet;
25import org.onlab.packet.IpAddress;
26import org.onlab.packet.MacAddress;
daniel parkee8700b2017-05-11 15:50:03 +090027import org.onlab.packet.VlanId;
Hyunsun Moon44aac662017-02-18 02:07:01 +090028import org.onosproject.cluster.ClusterService;
29import org.onosproject.cluster.LeadershipService;
30import org.onosproject.cluster.NodeId;
31import org.onosproject.core.ApplicationId;
32import org.onosproject.core.CoreService;
33import org.onosproject.net.PortNumber;
34import org.onosproject.net.device.DeviceService;
35import org.onosproject.net.flow.DefaultTrafficSelector;
36import org.onosproject.net.flow.DefaultTrafficTreatment;
37import org.onosproject.net.flow.TrafficSelector;
38import org.onosproject.net.flow.TrafficTreatment;
Hyunsun Moon44aac662017-02-18 02:07:01 +090039import org.onosproject.openstacknetworking.api.Constants;
40import org.onosproject.openstacknetworking.api.InstancePort;
41import org.onosproject.openstacknetworking.api.InstancePortService;
sanghodc375372017-06-08 10:41:30 +090042import org.onosproject.openstacknetworking.api.OpenstackFlowRuleService;
43import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
Hyunsun Moon44aac662017-02-18 02:07:01 +090044import org.onosproject.openstacknetworking.api.OpenstackRouterEvent;
45import org.onosproject.openstacknetworking.api.OpenstackRouterListener;
46import org.onosproject.openstacknetworking.api.OpenstackRouterService;
Hyunsun Moon0d457362017-06-27 17:19:41 +090047import org.onosproject.openstacknode.api.OpenstackNode;
48import org.onosproject.openstacknode.api.OpenstackNodeEvent;
49import org.onosproject.openstacknode.api.OpenstackNodeListener;
50import org.onosproject.openstacknode.api.OpenstackNodeService;
Hyunsun Moon44aac662017-02-18 02:07:01 +090051import org.openstack4j.model.network.NetFloatingIP;
52import org.openstack4j.model.network.Network;
daniel parkee8700b2017-05-11 15:50:03 +090053import org.openstack4j.model.network.NetworkType;
Hyunsun Moon44aac662017-02-18 02:07:01 +090054import org.openstack4j.model.network.Port;
55import org.slf4j.Logger;
56import org.slf4j.LoggerFactory;
57
58import java.util.Objects;
Hyunsun Moon44aac662017-02-18 02:07:01 +090059import java.util.concurrent.ExecutorService;
60
61import static java.util.concurrent.Executors.newSingleThreadExecutor;
62import static org.onlab.util.Tools.groupedThreads;
sanghodc375372017-06-08 10:41:30 +090063import static org.onosproject.openstacknetworking.api.Constants.GW_COMMON_TABLE;
64import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
65import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_FLOATING_EXTERNAL;
66import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_FLOATING_INTERNAL;
Hyunsun Moon44aac662017-02-18 02:07:01 +090067import static org.onosproject.openstacknetworking.impl.RulePopulatorUtil.buildExtension;
Hyunsun Moon0d457362017-06-27 17:19:41 +090068import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
Hyunsun Moon44aac662017-02-18 02:07:01 +090069
70/**
71 * Handles OpenStack floating IP events.
72 */
73@Component(immediate = true)
74public class OpenstackRoutingFloatingIpHandler {
75
76 private final Logger log = LoggerFactory.getLogger(getClass());
77
78 private static final String ERR_FLOW = "Failed set flows for floating IP %s: ";
daniel parkee8700b2017-05-11 15:50:03 +090079 private static final String ERR_UNSUPPORTED_NET_TYPE = "Unsupported network type";
Hyunsun Moon44aac662017-02-18 02:07:01 +090080
81 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
82 protected CoreService coreService;
83
84 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
85 protected DeviceService deviceService;
86
87 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Hyunsun Moon44aac662017-02-18 02:07:01 +090088 protected LeadershipService leadershipService;
89
90 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
91 protected ClusterService clusterService;
92
93 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
94 protected OpenstackNodeService osNodeService;
95
96 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
97 protected InstancePortService instancePortService;
98
99 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
100 protected OpenstackRouterService osRouterService;
101
102 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
103 protected OpenstackNetworkService osNetworkService;
104
sanghodc375372017-06-08 10:41:30 +0900105 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
106 protected OpenstackFlowRuleService osFlowRuleService;
107
Hyunsun Moon44aac662017-02-18 02:07:01 +0900108 private final ExecutorService eventExecutor = newSingleThreadExecutor(
109 groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
Hyunsun Moon0d457362017-06-27 17:19:41 +0900110 private final OpenstackRouterListener floatingIpLisener = new InternalFloatingIpListener();
Hyunsun Moon44aac662017-02-18 02:07:01 +0900111 private final OpenstackNodeListener osNodeListener = new InternalNodeListener();
112
113 private ApplicationId appId;
114 private NodeId localNodeId;
115
116 @Activate
117 protected void activate() {
118 appId = coreService.registerApplication(OPENSTACK_NETWORKING_APP_ID);
119 localNodeId = clusterService.getLocalNode().id();
120 leadershipService.runForLeadership(appId.name());
121 osRouterService.addListener(floatingIpLisener);
122 osNodeService.addListener(osNodeListener);
123
124 log.info("Started");
125 }
126
127 @Deactivate
128 protected void deactivate() {
129 osNodeService.removeListener(osNodeListener);
130 osRouterService.removeListener(floatingIpLisener);
131 leadershipService.withdraw(appId.name());
132 eventExecutor.shutdown();
133
134 log.info("Stopped");
135 }
136
Hyunsun Moon44aac662017-02-18 02:07:01 +0900137 private void setFloatingIpRules(NetFloatingIP floatingIp, Port osPort,
138 boolean install) {
139 Network osNet = osNetworkService.network(osPort.getNetworkId());
140 if (osNet == null) {
141 final String error = String.format(ERR_FLOW + "no network(%s) exists",
142 floatingIp.getFloatingIpAddress(),
143 osPort.getNetworkId());
144 throw new IllegalStateException(error);
145 }
146
147 MacAddress srcMac = MacAddress.valueOf(osPort.getMacAddress());
148 InstancePort instPort = instancePortService.instancePort(srcMac);
149 if (instPort == null) {
150 final String error = String.format(ERR_FLOW + "no host(MAC:%s) found",
151 floatingIp.getFloatingIpAddress(), srcMac);
152 throw new IllegalStateException(error);
153 }
154
155 setDownstreamRules(floatingIp, osNet, instPort, install);
156 setUpstreamRules(floatingIp, osNet, instPort, install);
157 }
158
159 private void setDownstreamRules(NetFloatingIP floatingIp, Network osNet,
160 InstancePort instPort, boolean install) {
Hyunsun Moon0d457362017-06-27 17:19:41 +0900161 OpenstackNode cNode = osNodeService.node(instPort.deviceId());
162 if (cNode == null) {
163 final String error = String.format("Cannot find openstack node for device %s",
164 instPort.deviceId());
165 throw new IllegalStateException(error);
166 }
167 if (osNet.getNetworkType() == NetworkType.VXLAN && cNode.dataIp() == null) {
168 final String error = String.format(ERR_FLOW +
169 "VXLAN mode is not ready for %s", floatingIp, cNode.hostname());
170 throw new IllegalStateException(error);
171 }
172 if (osNet.getNetworkType() == NetworkType.VLAN && cNode.vlanIntf() == null) {
173 final String error = String.format(ERR_FLOW +
174 "VLAN mode is not ready for %s", floatingIp, cNode.hostname());
175 throw new IllegalStateException(error);
Hyunsun Moon44aac662017-02-18 02:07:01 +0900176 }
177
178 IpAddress floating = IpAddress.valueOf(floatingIp.getFloatingIpAddress());
179 TrafficSelector externalSelector = DefaultTrafficSelector.builder()
180 .matchEthType(Ethernet.TYPE_IPV4)
181 .matchIPDst(floating.toIpPrefix())
182 .build();
183
Hyunsun Moon0d457362017-06-27 17:19:41 +0900184 osNodeService.completeNodes(GATEWAY).forEach(gNode -> {
daniel parkee8700b2017-05-11 15:50:03 +0900185 TrafficTreatment.Builder externalBuilder = DefaultTrafficTreatment.builder()
Hyunsun Moon44aac662017-02-18 02:07:01 +0900186 .setEthSrc(Constants.DEFAULT_GATEWAY_MAC)
187 .setEthDst(instPort.macAddress())
daniel parkee8700b2017-05-11 15:50:03 +0900188 .setIpDst(instPort.ipAddress().getIp4Address());
189
190 switch (osNet.getNetworkType()) {
191 case VXLAN:
192 externalBuilder.setTunnelId(Long.valueOf(osNet.getProviderSegID()))
193 .extension(buildExtension(
194 deviceService,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900195 gNode.intgBridge(),
196 cNode.dataIp().getIp4Address()),
197 gNode.intgBridge())
198 .setOutput(gNode.tunnelPortNum());
daniel parkee8700b2017-05-11 15:50:03 +0900199 break;
200 case VLAN:
201 externalBuilder.pushVlan()
202 .setVlanId(VlanId.vlanId(osNet.getProviderSegID()))
Hyunsun Moon0d457362017-06-27 17:19:41 +0900203 .setOutput(gNode.vlanPortNum());
daniel parkee8700b2017-05-11 15:50:03 +0900204 break;
205 default:
Hyunsun Moon0d457362017-06-27 17:19:41 +0900206 final String error = String.format(ERR_UNSUPPORTED_NET_TYPE + "%s",
207 osNet.getNetworkType());
daniel parkee8700b2017-05-11 15:50:03 +0900208 throw new IllegalStateException(error);
209 }
Hyunsun Moon44aac662017-02-18 02:07:01 +0900210
sanghodc375372017-06-08 10:41:30 +0900211 osFlowRuleService.setRule(
Hyunsun Moon44aac662017-02-18 02:07:01 +0900212 appId,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900213 gNode.intgBridge(),
Hyunsun Moon44aac662017-02-18 02:07:01 +0900214 externalSelector,
daniel parkee8700b2017-05-11 15:50:03 +0900215 externalBuilder.build(),
Hyunsun Moon44aac662017-02-18 02:07:01 +0900216 PRIORITY_FLOATING_EXTERNAL,
sanghodc375372017-06-08 10:41:30 +0900217 GW_COMMON_TABLE,
Hyunsun Moon44aac662017-02-18 02:07:01 +0900218 install);
219
Hyunsun Moon0d457362017-06-27 17:19:41 +0900220 // access from one VM to the others via floating IP
Hyunsun Moon44aac662017-02-18 02:07:01 +0900221 TrafficSelector internalSelector = DefaultTrafficSelector.builder()
222 .matchEthType(Ethernet.TYPE_IPV4)
223 .matchIPDst(floating.toIpPrefix())
Hyunsun Moon0d457362017-06-27 17:19:41 +0900224 .matchInPort(gNode.tunnelPortNum())
Hyunsun Moon44aac662017-02-18 02:07:01 +0900225 .build();
226
daniel parkee8700b2017-05-11 15:50:03 +0900227 TrafficTreatment.Builder internalBuilder = DefaultTrafficTreatment.builder()
Hyunsun Moon44aac662017-02-18 02:07:01 +0900228 .setEthSrc(Constants.DEFAULT_GATEWAY_MAC)
229 .setEthDst(instPort.macAddress())
daniel parkee8700b2017-05-11 15:50:03 +0900230 .setIpDst(instPort.ipAddress().getIp4Address());
231
232 switch (osNet.getNetworkType()) {
233 case VXLAN:
234 internalBuilder.setTunnelId(Long.valueOf(osNet.getProviderSegID()))
235 .extension(buildExtension(
236 deviceService,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900237 gNode.intgBridge(),
238 cNode.dataIp().getIp4Address()),
239 gNode.intgBridge())
daniel parkee8700b2017-05-11 15:50:03 +0900240 .setOutput(PortNumber.IN_PORT);
241 break;
242 case VLAN:
243 internalBuilder.pushVlan()
244 .setVlanId(VlanId.vlanId(osNet.getProviderSegID()))
245 .setOutput(PortNumber.IN_PORT);
246 break;
247 default:
Hyunsun Moon0d457362017-06-27 17:19:41 +0900248 final String error = String.format(ERR_UNSUPPORTED_NET_TYPE + "%s",
249 osNet.getNetworkType());
daniel parkee8700b2017-05-11 15:50:03 +0900250 throw new IllegalStateException(error);
251 }
Hyunsun Moon44aac662017-02-18 02:07:01 +0900252
sanghodc375372017-06-08 10:41:30 +0900253 osFlowRuleService.setRule(
Hyunsun Moon44aac662017-02-18 02:07:01 +0900254 appId,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900255 gNode.intgBridge(),
Hyunsun Moon44aac662017-02-18 02:07:01 +0900256 internalSelector,
daniel parkee8700b2017-05-11 15:50:03 +0900257 internalBuilder.build(),
Hyunsun Moon44aac662017-02-18 02:07:01 +0900258 PRIORITY_FLOATING_INTERNAL,
sanghodc375372017-06-08 10:41:30 +0900259 GW_COMMON_TABLE,
Hyunsun Moon44aac662017-02-18 02:07:01 +0900260 install);
261 });
262 }
263
264 private void setUpstreamRules(NetFloatingIP floatingIp, Network osNet,
265 InstancePort instPort, boolean install) {
266 IpAddress floating = IpAddress.valueOf(floatingIp.getFloatingIpAddress());
daniel parkee8700b2017-05-11 15:50:03 +0900267 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
Hyunsun Moon44aac662017-02-18 02:07:01 +0900268 .matchEthType(Ethernet.TYPE_IPV4)
daniel parkee8700b2017-05-11 15:50:03 +0900269 .matchIPSrc(instPort.ipAddress().toIpPrefix());
270
271 switch (osNet.getNetworkType()) {
272 case VXLAN:
273 sBuilder.matchTunnelId(Long.valueOf(osNet.getProviderSegID()));
274 break;
275 case VLAN:
276 sBuilder.matchVlanId(VlanId.vlanId(osNet.getProviderSegID()));
277 break;
278 default:
Hyunsun Moon0d457362017-06-27 17:19:41 +0900279 final String error = String.format(ERR_UNSUPPORTED_NET_TYPE + "%s",
280 osNet.getNetworkType());
daniel parkee8700b2017-05-11 15:50:03 +0900281 throw new IllegalStateException(error);
282 }
Hyunsun Moon44aac662017-02-18 02:07:01 +0900283
Hyunsun Moon0d457362017-06-27 17:19:41 +0900284 osNodeService.completeNodes(GATEWAY).forEach(gNode -> {
daniel parkee8700b2017-05-11 15:50:03 +0900285 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
Hyunsun Moon44aac662017-02-18 02:07:01 +0900286 .setIpSrc(floating.getIp4Address())
287 .setEthSrc(Constants.DEFAULT_GATEWAY_MAC)
daniel parkee8700b2017-05-11 15:50:03 +0900288 .setEthDst(Constants.DEFAULT_EXTERNAL_ROUTER_MAC);
289
290 if (osNet.getNetworkType().equals(NetworkType.VLAN)) {
291 tBuilder.popVlan();
292 }
Hyunsun Moon44aac662017-02-18 02:07:01 +0900293
sanghodc375372017-06-08 10:41:30 +0900294 osFlowRuleService.setRule(
Hyunsun Moon44aac662017-02-18 02:07:01 +0900295 appId,
Hyunsun Moon0d457362017-06-27 17:19:41 +0900296 gNode.intgBridge(),
daniel parkee8700b2017-05-11 15:50:03 +0900297 sBuilder.build(),
Hyunsun Moon0d457362017-06-27 17:19:41 +0900298 tBuilder.setOutput(gNode.patchPortNum()).build(),
Hyunsun Moon44aac662017-02-18 02:07:01 +0900299 PRIORITY_FLOATING_EXTERNAL,
sanghodc375372017-06-08 10:41:30 +0900300 GW_COMMON_TABLE,
Hyunsun Moon44aac662017-02-18 02:07:01 +0900301 install);
302 });
303 }
304
Hyunsun Moon0d457362017-06-27 17:19:41 +0900305 private class InternalFloatingIpListener implements OpenstackRouterListener {
Hyunsun Moon44aac662017-02-18 02:07:01 +0900306
307 @Override
308 public boolean isRelevant(OpenstackRouterEvent event) {
309 // do not allow to proceed without leadership
310 NodeId leader = leadershipService.getLeader(appId.name());
311 if (!Objects.equals(localNodeId, leader)) {
312 return false;
313 }
314 return event.floatingIp() != null;
315 }
316
317 @Override
318 public void event(OpenstackRouterEvent event) {
319 switch (event.type()) {
320 case OPENSTACK_FLOATING_IP_ASSOCIATED:
Hyunsun Moon7a5f9042017-05-11 18:19:01 +0900321 eventExecutor.execute(() -> {
Hyunsun Moonb720e632017-05-16 15:41:36 +0900322 NetFloatingIP osFip = event.floatingIp();
323 associateFloatingIp(osFip);
324 log.info("Associated floating IP {}:{}",
325 osFip.getFloatingIpAddress(), osFip.getFixedIpAddress());
Hyunsun Moon7a5f9042017-05-11 18:19:01 +0900326 });
327 break;
Hyunsun Moon44aac662017-02-18 02:07:01 +0900328 case OPENSTACK_FLOATING_IP_DISASSOCIATED:
329 eventExecutor.execute(() -> {
Hyunsun Moonb720e632017-05-16 15:41:36 +0900330 NetFloatingIP osFip = event.floatingIp();
331 disassociateFloatingIp(osFip, event.portId());
332 log.info("Disassociated floating IP {}:{}",
333 osFip.getFloatingIpAddress(), osFip.getFixedIpAddress());
Hyunsun Moon7a5f9042017-05-11 18:19:01 +0900334 });
335 break;
336 case OPENSTACK_FLOATING_IP_REMOVED:
337 eventExecutor.execute(() -> {
Hyunsun Moonb720e632017-05-16 15:41:36 +0900338 NetFloatingIP osFip = event.floatingIp();
339 if (!Strings.isNullOrEmpty(osFip.getPortId())) {
340 disassociateFloatingIp(osFip, osFip.getPortId());
Hyunsun Moon7a5f9042017-05-11 18:19:01 +0900341 }
Hyunsun Moonb720e632017-05-16 15:41:36 +0900342 log.info("Removed floating IP {}", osFip.getFloatingIpAddress());
Hyunsun Moon44aac662017-02-18 02:07:01 +0900343 });
344 break;
345 case OPENSTACK_FLOATING_IP_CREATED:
Hyunsun Moonb720e632017-05-16 15:41:36 +0900346 eventExecutor.execute(() -> {
347 NetFloatingIP osFip = event.floatingIp();
348 if (!Strings.isNullOrEmpty(osFip.getPortId())) {
349 associateFloatingIp(event.floatingIp());
350 }
351 log.info("Created floating IP {}", osFip.getFloatingIpAddress());
352 });
353 break;
Hyunsun Moon44aac662017-02-18 02:07:01 +0900354 case OPENSTACK_FLOATING_IP_UPDATED:
Hyunsun Moon44aac662017-02-18 02:07:01 +0900355 case OPENSTACK_ROUTER_CREATED:
356 case OPENSTACK_ROUTER_UPDATED:
357 case OPENSTACK_ROUTER_REMOVED:
358 case OPENSTACK_ROUTER_INTERFACE_ADDED:
359 case OPENSTACK_ROUTER_INTERFACE_UPDATED:
360 case OPENSTACK_ROUTER_INTERFACE_REMOVED:
361 default:
362 // do nothing for the other events
363 break;
364 }
365 }
Hyunsun Moonb720e632017-05-16 15:41:36 +0900366
367 private void associateFloatingIp(NetFloatingIP osFip) {
368 Port osPort = osNetworkService.port(osFip.getPortId());
369 if (osPort == null) {
370 final String error = String.format(ERR_FLOW + "port(%s) not found",
371 osFip.getFloatingIpAddress(), osFip.getPortId());
372 throw new IllegalStateException(error);
373 }
374 // set floating IP rules only if the port is associated to a VM
375 if (!Strings.isNullOrEmpty(osPort.getDeviceId())) {
376 setFloatingIpRules(osFip, osPort, true);
377 }
378 }
379
380 private void disassociateFloatingIp(NetFloatingIP osFip, String portId) {
381 Port osPort = osNetworkService.port(portId);
382 if (osPort == null) {
383 // FIXME when a port with floating IP removed without
384 // disassociation step, it can reach here
385 return;
386 }
387 // set floating IP rules only if the port is associated to a VM
388 if (!Strings.isNullOrEmpty(osPort.getDeviceId())) {
389 setFloatingIpRules(osFip, osPort, false);
390 }
391 }
Hyunsun Moon44aac662017-02-18 02:07:01 +0900392 }
393
394 private class InternalNodeListener implements OpenstackNodeListener {
395
396 @Override
397 public boolean isRelevant(OpenstackNodeEvent event) {
398 // do not allow to proceed without leadership
399 NodeId leader = leadershipService.getLeader(appId.name());
400 if (!Objects.equals(localNodeId, leader)) {
401 return false;
402 }
403 return event.subject().type() == GATEWAY;
404 }
405
406 @Override
407 public void event(OpenstackNodeEvent event) {
Hyunsun Moon44aac662017-02-18 02:07:01 +0900408
409 switch (event.type()) {
Hyunsun Moon0d457362017-06-27 17:19:41 +0900410 case OPENSTACK_NODE_COMPLETE:
Hyunsun Moon44aac662017-02-18 02:07:01 +0900411 eventExecutor.execute(() -> {
Hyunsun Moon7a5f9042017-05-11 18:19:01 +0900412 for (NetFloatingIP fip : osRouterService.floatingIps()) {
413 if (Strings.isNullOrEmpty(fip.getPortId())) {
414 continue;
415 }
416 Port osPort = osNetworkService.port(fip.getPortId());
417 if (osPort == null) {
418 log.warn("Failed to set floating IP {}", fip.getId());
419 continue;
420 }
421 setFloatingIpRules(fip, osPort, true);
422 }
Hyunsun Moon44aac662017-02-18 02:07:01 +0900423 });
424 break;
Hyunsun Moon0d457362017-06-27 17:19:41 +0900425 case OPENSTACK_NODE_CREATED:
426 case OPENSTACK_NODE_UPDATED:
427 case OPENSTACK_NODE_REMOVED:
428 case OPENSTACK_NODE_INCOMPLETE:
Hyunsun Moon44aac662017-02-18 02:07:01 +0900429 default:
Hyunsun Moon0d457362017-06-27 17:19:41 +0900430 // do nothing
Hyunsun Moon44aac662017-02-18 02:07:01 +0900431 break;
432 }
433 }
434 }
435}