blob: 7664429d2a37c1448749bfad4beb20276ca15d4f [file] [log] [blame]
sangho6a9ff0d2017-03-27 11:23:37 +09001/*
2* Copyright 2017-present 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*/
16
17package org.onosproject.openstacknetworking.impl;
18
19import com.google.common.base.Strings;
20import org.apache.felix.scr.annotations.Activate;
21import org.apache.felix.scr.annotations.Component;
22import org.apache.felix.scr.annotations.Deactivate;
sangho0248ca22017-05-31 13:22:47 +090023import org.apache.felix.scr.annotations.Modified;
24import org.apache.felix.scr.annotations.Property;
sangho6a9ff0d2017-03-27 11:23:37 +090025import org.apache.felix.scr.annotations.Reference;
26import org.apache.felix.scr.annotations.ReferenceCardinality;
27import org.onlab.packet.Ethernet;
28import org.onlab.packet.IPv4;
29import org.onlab.packet.Ip4Address;
30import org.onlab.packet.Ip4Prefix;
31import org.onlab.packet.IpPrefix;
32import org.onlab.packet.TpPort;
sangho0248ca22017-05-31 13:22:47 +090033import org.onlab.util.Tools;
34import org.onosproject.cfg.ComponentConfigService;
sangho6a9ff0d2017-03-27 11:23:37 +090035import org.onosproject.core.ApplicationId;
36import org.onosproject.core.CoreService;
37import org.onosproject.mastership.MastershipService;
38import org.onosproject.net.flow.DefaultTrafficSelector;
39import org.onosproject.net.flow.DefaultTrafficTreatment;
40import org.onosproject.net.flow.TrafficSelector;
sanghodc375372017-06-08 10:41:30 +090041import org.onosproject.net.flow.TrafficTreatment;
sangho6a9ff0d2017-03-27 11:23:37 +090042import org.onosproject.openstacknetworking.api.InstancePort;
43import org.onosproject.openstacknetworking.api.InstancePortEvent;
44import org.onosproject.openstacknetworking.api.InstancePortListener;
45import org.onosproject.openstacknetworking.api.InstancePortService;
sanghodc375372017-06-08 10:41:30 +090046import org.onosproject.openstacknetworking.api.OpenstackFlowRuleService;
sangho6a9ff0d2017-03-27 11:23:37 +090047import org.onosproject.openstacknetworking.api.OpenstackNetworkEvent;
48import org.onosproject.openstacknetworking.api.OpenstackNetworkListener;
49import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
50import org.onosproject.openstacknetworking.api.OpenstackSecurityGroupEvent;
51import org.onosproject.openstacknetworking.api.OpenstackSecurityGroupListener;
52import org.onosproject.openstacknetworking.api.OpenstackSecurityGroupService;
53import org.openstack4j.model.network.Port;
54import org.openstack4j.model.network.SecurityGroup;
55import org.openstack4j.model.network.SecurityGroupRule;
56import org.openstack4j.openstack.networking.domain.NeutronSecurityGroupRule;
sangho0248ca22017-05-31 13:22:47 +090057import org.osgi.service.component.ComponentContext;
sangho6a9ff0d2017-03-27 11:23:37 +090058import org.slf4j.Logger;
59
sangho6a9ff0d2017-03-27 11:23:37 +090060import java.util.Collections;
sangho0248ca22017-05-31 13:22:47 +090061import java.util.Dictionary;
sangho6a9ff0d2017-03-27 11:23:37 +090062import java.util.Objects;
63import java.util.Set;
64import java.util.concurrent.ExecutorService;
65import java.util.stream.Collectors;
66
67import static java.util.concurrent.Executors.newSingleThreadExecutor;
68import static org.onlab.util.Tools.groupedThreads;
sanghodc375372017-06-08 10:41:30 +090069import static org.onosproject.openstacknetworking.api.Constants.ACL_TABLE;
70import static org.onosproject.openstacknetworking.api.Constants.JUMP_TABLE;
sangho6a9ff0d2017-03-27 11:23:37 +090071import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
72import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ACL_RULE;
73import static org.slf4j.LoggerFactory.getLogger;
74
75/**
76 * Populates flow rules to handle OpenStack SecurityGroups.
77 */
78@Component(immediate = true)
79public class OpenstackSecurityGroupHandler {
80
81 private final Logger log = getLogger(getClass());
82
sangho0248ca22017-05-31 13:22:47 +090083 private static final boolean USE_SECURITY_GROUP = false;
84
85 @Property(name = "useSecurityGroup", boolValue = USE_SECURITY_GROUP,
86 label = "Apply OpenStack security group rule for VM traffic")
87 private boolean useSecurityGroup = USE_SECURITY_GROUP;
88
sangho6a9ff0d2017-03-27 11:23:37 +090089 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
90 protected CoreService coreService;
91
92 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
93 protected InstancePortService instancePortService;
94
95 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
96 protected MastershipService mastershipService;
97
98 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Hyunsun Moonae51e732017-04-25 17:46:21 +090099 protected OpenstackNetworkService osNetService;
sangho6a9ff0d2017-03-27 11:23:37 +0900100
101 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
102 protected OpenstackSecurityGroupService securityGroupService;
103
104 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
sanghodc375372017-06-08 10:41:30 +0900105 protected OpenstackFlowRuleService osFlowRuleService;
sangho6a9ff0d2017-03-27 11:23:37 +0900106
sangho0248ca22017-05-31 13:22:47 +0900107 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
108 protected ComponentConfigService configService;
109
sangho6a9ff0d2017-03-27 11:23:37 +0900110 private final InstancePortListener instancePortListener = new InternalInstancePortListener();
111 private final OpenstackNetworkListener portListener = new InternalOpenstackPortListener();
112 private final OpenstackSecurityGroupListener securityGroupListener = new InternalSecurityGroupListener();
113 private ApplicationId appId;
114
115 private final ExecutorService eventExecutor = newSingleThreadExecutor(
116 groupedThreads(this.getClass().getSimpleName(), "event-handler"));
117
118 private static final String PROTO_ICMP = "ICMP";
119 private static final String PROTO_TCP = "TCP";
120 private static final String PROTO_UDP = "UDP";
121 private static final String ETHTYPE_IPV4 = "IPV4";
122 private static final String EGRESS = "EGRESS";
123 private static final String INGRESS = "INGRESS";
124 private static final IpPrefix IP_PREFIX_ANY = Ip4Prefix.valueOf("0.0.0.0/0");
125
126 @Activate
127 protected void activate() {
128 appId = coreService.registerApplication(OPENSTACK_NETWORKING_APP_ID);
129 instancePortService.addListener(instancePortListener);
130 securityGroupService.addListener(securityGroupListener);
Hyunsun Moonae51e732017-04-25 17:46:21 +0900131 osNetService.addListener(portListener);
sangho0248ca22017-05-31 13:22:47 +0900132 configService.registerProperties(getClass());
sangho6a9ff0d2017-03-27 11:23:37 +0900133
134 log.info("Started");
135 }
136
137 @Deactivate
138 protected void deactivate() {
139 instancePortService.removeListener(instancePortListener);
140 securityGroupService.removeListener(securityGroupListener);
Hyunsun Moonae51e732017-04-25 17:46:21 +0900141 osNetService.removeListener(portListener);
sangho0248ca22017-05-31 13:22:47 +0900142 configService.unregisterProperties(getClass(), false);
sangho6a9ff0d2017-03-27 11:23:37 +0900143 eventExecutor.shutdown();
144
145 log.info("Stopped");
146 }
147
sangho0248ca22017-05-31 13:22:47 +0900148 @Modified
149 protected void modified(ComponentContext context) {
150 Dictionary<?, ?> properties = context.getProperties();
151 Boolean flag;
152
153 flag = Tools.isPropertyEnabled(properties, "useSecurityGroup");
154 if (flag == null) {
155 log.info("useSecurityGroup is not configured, " +
156 "using current value of {}", useSecurityGroup);
157 } else {
158 useSecurityGroup = flag;
159 log.info("Configured. useSecurityGroup is {}",
160 useSecurityGroup ? "enabled" : "disabled");
161 }
162
163 resetSecurityGroupRules();
164 }
165
sangho6a9ff0d2017-03-27 11:23:37 +0900166 private void setSecurityGroupRules(InstancePort instPort, Port port, boolean install) {
167 port.getSecurityGroups().forEach(sgId -> {
sangho6a9ff0d2017-03-27 11:23:37 +0900168 SecurityGroup sg = securityGroupService.securityGroup(sgId);
169 if (sg == null) {
170 log.error("Security Group Not Found : {}", sgId);
171 return;
172 }
173 sg.getRules().forEach(sgRule -> updateSecurityGroupRule(instPort, port, sgRule, install));
Hyunsun Moonae51e732017-04-25 17:46:21 +0900174 final String action = install ? "Installed " : "Removed ";
175 log.debug(action + "security group rule ID : " + sgId);
sangho6a9ff0d2017-03-27 11:23:37 +0900176 });
177 }
178
179 private void updateSecurityGroupRule(InstancePort instPort, Port port, SecurityGroupRule sgRule, boolean install) {
180 if (sgRule.getRemoteGroupId() != null && !sgRule.getRemoteGroupId().isEmpty()) {
181 getRemoteInstPorts(port.getTenantId(), sgRule.getRemoteGroupId())
182 .forEach(rInstPort -> {
183 populateSecurityGroupRule(sgRule, instPort, rInstPort.ipAddress().toIpPrefix(), install);
184 populateSecurityGroupRule(sgRule, rInstPort, instPort.ipAddress().toIpPrefix(), install);
185
186 SecurityGroupRule rSgRule = new NeutronSecurityGroupRule.SecurityGroupRuleConcreteBuilder()
187 .from(sgRule)
188 .direction(sgRule.getDirection().toUpperCase().equals(EGRESS) ? INGRESS : EGRESS).build();
189 populateSecurityGroupRule(rSgRule, instPort, rInstPort.ipAddress().toIpPrefix(), install);
190 populateSecurityGroupRule(rSgRule, rInstPort, instPort.ipAddress().toIpPrefix(), install);
191 });
192 } else {
193 populateSecurityGroupRule(sgRule, instPort, sgRule.getRemoteIpPrefix() == null ? IP_PREFIX_ANY :
194 IpPrefix.valueOf(sgRule.getRemoteIpPrefix()), install);
195 }
196 }
197
198 private void populateSecurityGroupRule(SecurityGroupRule sgRule, InstancePort instPort,
199 IpPrefix remoteIp, boolean install) {
sanghodc375372017-06-08 10:41:30 +0900200 Ip4Address vmIp = Ip4Address.valueOf(instPort.ipAddress().toInetAddress());
201 if (remoteIp != null && remoteIp.equals(IpPrefix.valueOf(vmIp, 32))) {
202 // do nothing if the remote IP is my IP
sangho6a9ff0d2017-03-27 11:23:37 +0900203 return;
204 }
205
sanghodc375372017-06-08 10:41:30 +0900206 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
207 buildMatchs(sBuilder, sgRule, vmIp, remoteIp);
208
209 TrafficTreatment treatment = DefaultTrafficTreatment.builder().transition(JUMP_TABLE).build();
210
211 osFlowRuleService.setRule(appId,
212 instPort.deviceId(),
213 sBuilder.build(),
214 treatment,
215 PRIORITY_ACL_RULE,
216 ACL_TABLE,
217 install);
sangho6a9ff0d2017-03-27 11:23:37 +0900218 }
219
220 /**
221 * Returns a set of host IP addresses engaged with supplied security group ID.
222 * It only searches a VM in the same tenant boundary.
223 *
224 * @param tenantId tenant id
225 * @param sgId security group id
226 * @return set of ip addresses
227 */
228 private Set<InstancePort> getRemoteInstPorts(String tenantId, String sgId) {
229 Set<InstancePort> remoteInstPorts;
230
Hyunsun Moonae51e732017-04-25 17:46:21 +0900231 remoteInstPorts = osNetService.ports().stream()
sangho6a9ff0d2017-03-27 11:23:37 +0900232 .filter(port -> port.getTenantId().equals(tenantId))
233 .filter(port -> port.getSecurityGroups().contains(sgId))
234 .map(port -> instancePortService.instancePort(port.getId()))
235 .filter(instPort -> instPort != null && instPort.ipAddress() != null)
236 .collect(Collectors.toSet());
237
238 return Collections.unmodifiableSet(remoteInstPorts);
239 }
240
sangho6a9ff0d2017-03-27 11:23:37 +0900241 private void buildMatchs(TrafficSelector.Builder sBuilder, SecurityGroupRule sgRule,
242 Ip4Address vmIp, IpPrefix remoteIp) {
243 buildMatchEthType(sBuilder, sgRule.getEtherType());
244 buildMatchDirection(sBuilder, sgRule.getDirection(), vmIp);
245 buildMatchProto(sBuilder, sgRule.getProtocol());
246 buildMatchPort(sBuilder, sgRule.getProtocol(), sgRule.getDirection(),
247 sgRule.getPortRangeMax() == null ? 0 : sgRule.getPortRangeMax(),
248 sgRule.getPortRangeMin() == null ? 0 : sgRule.getPortRangeMin());
249 buildMatchRemoteIp(sBuilder, remoteIp, sgRule.getDirection());
250 if (sgRule.getRemoteGroupId() != null && sgRule.getRemoteGroupId().isEmpty()) {
251 buildMatchRemoteIp(sBuilder, remoteIp, sgRule.getDirection());
252 }
253 }
254
255 private void buildMatchDirection(TrafficSelector.Builder sBuilder,
256 String direction,
257 Ip4Address vmIp) {
258 if (direction.toUpperCase().equals(EGRESS)) {
259 sBuilder.matchIPSrc(IpPrefix.valueOf(vmIp, 32));
260 } else {
261 sBuilder.matchIPDst(IpPrefix.valueOf(vmIp, 32));
262 }
263 }
264
265 private void buildMatchEthType(TrafficSelector.Builder sBuilder, String etherType) {
266 // Either IpSrc or IpDst (or both) is set by default, and we need to set EthType as IPv4.
267 sBuilder.matchEthType(Ethernet.TYPE_IPV4);
268 if (etherType != null && !Objects.equals(etherType, "null") &&
269 !etherType.toUpperCase().equals(ETHTYPE_IPV4)) {
270 log.debug("EthType {} is not supported yet in Security Group", etherType);
271 }
272 }
273
274 private void buildMatchRemoteIp(TrafficSelector.Builder sBuilder, IpPrefix remoteIpPrefix, String direction) {
275 if (remoteIpPrefix != null && !remoteIpPrefix.getIp4Prefix().equals(IP_PREFIX_ANY)) {
276 if (direction.toUpperCase().equals(EGRESS)) {
277 sBuilder.matchIPDst(remoteIpPrefix);
278 } else {
279 sBuilder.matchIPSrc(remoteIpPrefix);
280 }
281 }
282 }
283
284 private void buildMatchProto(TrafficSelector.Builder sBuilder, String protocol) {
285 if (protocol != null) {
286 switch (protocol.toUpperCase()) {
287 case PROTO_ICMP:
288 sBuilder.matchIPProtocol(IPv4.PROTOCOL_ICMP);
289 break;
290 case PROTO_TCP:
291 sBuilder.matchIPProtocol(IPv4.PROTOCOL_TCP);
292 break;
293 case PROTO_UDP:
294 sBuilder.matchIPProtocol(IPv4.PROTOCOL_UDP);
295 break;
296 default:
297 }
298 }
299 }
300
301 private void buildMatchPort(TrafficSelector.Builder sBuilder, String protocol, String direction,
302 int portMin, int portMax) {
303 if (portMin > 0 && portMax > 0 && portMin == portMax) {
304 if (protocol.toUpperCase().equals(PROTO_TCP)) {
305 if (direction.toUpperCase().equals(EGRESS)) {
306 sBuilder.matchTcpSrc(TpPort.tpPort(portMax));
307 } else {
308 sBuilder.matchTcpDst(TpPort.tpPort(portMax));
309 }
310 } else if (protocol.toUpperCase().equals(PROTO_UDP)) {
311 if (direction.toUpperCase().equals(EGRESS)) {
312 sBuilder.matchUdpSrc(TpPort.tpPort(portMax));
313 } else {
314 sBuilder.matchUdpDst(TpPort.tpPort(portMax));
315 }
316 }
317 }
318 }
319
sangho0248ca22017-05-31 13:22:47 +0900320 private void resetSecurityGroupRules() {
321
322 if (useSecurityGroup) {
323 securityGroupService.securityGroups().forEach(securityGroup ->
324 securityGroup.getRules().forEach(this::securityGroupRuleAdded));
325 } else {
326 securityGroupService.securityGroups().forEach(securityGroup ->
327 securityGroup.getRules().forEach(this::securityGroupRuleRemoved));
328 }
329
330 log.info("Reset security group info " + (useSecurityGroup ? " with " : " without") + " Security Group");
331 }
332
333 private void securityGroupRuleAdded(SecurityGroupRule sgRule) {
334 osNetService.ports().stream()
335 .filter(port -> port.getSecurityGroups().contains(sgRule.getSecurityGroupId()))
336 .forEach(port -> {
337 updateSecurityGroupRule(
338 instancePortService.instancePort(port.getId()),
339 port, sgRule, true);
340 log.debug("Applied security group rule {} to port {}",
341 sgRule.getId(), port.getId());
342 });
343 }
344
345 private void securityGroupRuleRemoved(SecurityGroupRule sgRule) {
346 osNetService.ports().stream()
347 .filter(port -> port.getSecurityGroups().contains(sgRule.getSecurityGroupId()))
348 .forEach(port -> {
349 updateSecurityGroupRule(
350 instancePortService.instancePort(port.getId()),
351 port, sgRule, false);
352 log.debug("Removed security group rule {} from port {}",
353 sgRule.getId(), port.getId());
354 });
355 }
356
sangho6a9ff0d2017-03-27 11:23:37 +0900357 private class InternalInstancePortListener implements InstancePortListener {
358
359 @Override
360 public boolean isRelevant(InstancePortEvent event) {
361 InstancePort instPort = event.subject();
sangho0248ca22017-05-31 13:22:47 +0900362 if (!useSecurityGroup) {
363 return false;
364 }
sangho6a9ff0d2017-03-27 11:23:37 +0900365 return mastershipService.isLocalMaster(instPort.deviceId());
366 }
367
368 @Override
369 public void event(InstancePortEvent event) {
370 InstancePort instPort = event.subject();
371 switch (event.type()) {
372 case OPENSTACK_INSTANCE_PORT_UPDATED:
373 case OPENSTACK_INSTANCE_PORT_DETECTED:
Hyunsun Moonae51e732017-04-25 17:46:21 +0900374 log.debug("Instance port detected MAC:{} IP:{}",
375 instPort.macAddress(),
376 instPort.ipAddress());
sangho6a9ff0d2017-03-27 11:23:37 +0900377 eventExecutor.execute(() -> {
Hyunsun Moonae51e732017-04-25 17:46:21 +0900378 setSecurityGroupRules(instPort,
379 osNetService.port(event.subject().portId()),
380 true);
sangho6a9ff0d2017-03-27 11:23:37 +0900381 });
382 break;
383 case OPENSTACK_INSTANCE_PORT_VANISHED:
Hyunsun Moonae51e732017-04-25 17:46:21 +0900384 log.debug("Instance port vanished MAC:{} IP:{}",
385 instPort.macAddress(),
386 instPort.ipAddress());
sangho6a9ff0d2017-03-27 11:23:37 +0900387 eventExecutor.execute(() -> {
Hyunsun Moonae51e732017-04-25 17:46:21 +0900388 setSecurityGroupRules(instPort,
389 osNetService.port(event.subject().portId()),
390 false);
sangho6a9ff0d2017-03-27 11:23:37 +0900391 });
392 break;
393 default:
394 break;
395 }
396 }
sangho6a9ff0d2017-03-27 11:23:37 +0900397 }
398
399 private class InternalOpenstackPortListener implements OpenstackNetworkListener {
400
401 @Override
402 public boolean isRelevant(OpenstackNetworkEvent event) {
Hyunsun Moonae51e732017-04-25 17:46:21 +0900403 if (event.port() == null || !Strings.isNullOrEmpty(event.port().getId())) {
sangho6a9ff0d2017-03-27 11:23:37 +0900404 return false;
405 }
Hyunsun Moonae51e732017-04-25 17:46:21 +0900406 if (event.securityGroupId() == null ||
407 securityGroupService.securityGroup(event.securityGroupId()) == null) {
408 return false;
409 }
410 if (instancePortService.instancePort(event.port().getId()) == null) {
411 return false;
412 }
sangho0248ca22017-05-31 13:22:47 +0900413 if (!useSecurityGroup) {
414 return false;
415 }
Hyunsun Moonae51e732017-04-25 17:46:21 +0900416 return true;
sangho6a9ff0d2017-03-27 11:23:37 +0900417 }
418
419 @Override
420 public void event(OpenstackNetworkEvent event) {
Hyunsun Moonae51e732017-04-25 17:46:21 +0900421 Port osPort = event.port();
422 InstancePort instPort = instancePortService.instancePort(osPort.getId());
423 SecurityGroup osSg = securityGroupService.securityGroup(event.securityGroupId());
424
sangho6a9ff0d2017-03-27 11:23:37 +0900425 switch (event.type()) {
Hyunsun Moonae51e732017-04-25 17:46:21 +0900426 case OPENSTACK_PORT_SECURITY_GROUP_ADDED:
427 eventExecutor.execute(() -> {
428 osSg.getRules().forEach(sgRule -> {
429 updateSecurityGroupRule(instPort, osPort, sgRule, true);
430 });
431 log.info("Added security group {} to port {}",
432 event.securityGroupId(), event.port().getId());
433 });
sangho6a9ff0d2017-03-27 11:23:37 +0900434 break;
Hyunsun Moonae51e732017-04-25 17:46:21 +0900435 case OPENSTACK_PORT_SECURITY_GROUP_REMOVED:
436 eventExecutor.execute(() -> {
437 osSg.getRules().forEach(sgRule -> {
438 updateSecurityGroupRule(instPort, osPort, sgRule, false);
439 });
440 log.info("Removed security group {} from port {}",
441 event.securityGroupId(), event.port().getId());
442 });
sangho6a9ff0d2017-03-27 11:23:37 +0900443 break;
444 default:
Hyunsun Moonae51e732017-04-25 17:46:21 +0900445 // do nothing for the other events
sangho6a9ff0d2017-03-27 11:23:37 +0900446 break;
447 }
448 }
sangho6a9ff0d2017-03-27 11:23:37 +0900449 }
450
451 private class InternalSecurityGroupListener implements OpenstackSecurityGroupListener {
452
453 @Override
sangho0248ca22017-05-31 13:22:47 +0900454 public boolean isRelevant(OpenstackSecurityGroupEvent event) {
455 if (!useSecurityGroup) {
456 return false;
457 }
458 return true;
459 }
460
461 @Override
sangho6a9ff0d2017-03-27 11:23:37 +0900462 public void event(OpenstackSecurityGroupEvent event) {
463 switch (event.type()) {
sangho6a9ff0d2017-03-27 11:23:37 +0900464 case OPENSTACK_SECURITY_GROUP_RULE_CREATED:
465 SecurityGroupRule securityGroupRuleToAdd = event.securityGroupRule();
466 eventExecutor.execute(() -> {
sangho6a9ff0d2017-03-27 11:23:37 +0900467 securityGroupRuleAdded(securityGroupRuleToAdd);
Hyunsun Moonae51e732017-04-25 17:46:21 +0900468 log.info("Applied new security group rule {} to ports",
469 securityGroupRuleToAdd.getId());
sangho6a9ff0d2017-03-27 11:23:37 +0900470 });
471 break;
472
473 case OPENSTACK_SECURITY_GROUP_RULE_REMOVED:
474 SecurityGroupRule securityGroupRuleToRemove = event.securityGroupRule();
475 eventExecutor.execute(() -> {
sangho6a9ff0d2017-03-27 11:23:37 +0900476 securityGroupRuleRemoved(securityGroupRuleToRemove);
Hyunsun Moonae51e732017-04-25 17:46:21 +0900477 log.info("Removed security group rule {} from ports",
478 securityGroupRuleToRemove.getId());
sangho6a9ff0d2017-03-27 11:23:37 +0900479 });
480 break;
Hyunsun Moonae51e732017-04-25 17:46:21 +0900481 case OPENSTACK_SECURITY_GROUP_CREATED:
482 case OPENSTACK_SECURITY_GROUP_REMOVED:
sangho6a9ff0d2017-03-27 11:23:37 +0900483 default:
Hyunsun Moonae51e732017-04-25 17:46:21 +0900484 // do nothing
485 break;
sangho6a9ff0d2017-03-27 11:23:37 +0900486 }
487 }
sangho6a9ff0d2017-03-27 11:23:37 +0900488 }
489}