Hyunsun Moon
Committed by Gerrit Code Review

Refactored OpenstackRouting to support multiple gateway nodes

Change-Id: I6870ca9a4fd6f6b1cf2d2be72f52ef87827e1d2c
Showing 23 changed files with 334 additions and 247 deletions
...@@ -20,7 +20,7 @@ import java.util.Objects; ...@@ -20,7 +20,7 @@ import java.util.Objects;
20 import static com.google.common.base.Preconditions.checkNotNull; 20 import static com.google.common.base.Preconditions.checkNotNull;
21 21
22 /** 22 /**
23 - * An Openstack Neutron Router Interface Model. 23 + * An OpenStack Neutron router interface model.
24 */ 24 */
25 public final class OpenstackRouterInterface { 25 public final class OpenstackRouterInterface {
26 private final String id; 26 private final String id;
...@@ -37,9 +37,9 @@ public final class OpenstackRouterInterface { ...@@ -37,9 +37,9 @@ public final class OpenstackRouterInterface {
37 } 37 }
38 38
39 /** 39 /**
40 - * Returns Router Interface ID. 40 + * Returns router interface ID.
41 * 41 *
42 - * @return router interface ID 42 + * @return router interface id
43 */ 43 */
44 public String id() { 44 public String id() {
45 return id; 45 return id;
...@@ -48,7 +48,7 @@ public final class OpenstackRouterInterface { ...@@ -48,7 +48,7 @@ public final class OpenstackRouterInterface {
48 /** 48 /**
49 * Returns tenant ID. 49 * Returns tenant ID.
50 * 50 *
51 - * @return tenant ID 51 + * @return tenant id
52 */ 52 */
53 public String tenantId() { 53 public String tenantId() {
54 return tenantId; 54 return tenantId;
...@@ -57,7 +57,7 @@ public final class OpenstackRouterInterface { ...@@ -57,7 +57,7 @@ public final class OpenstackRouterInterface {
57 /** 57 /**
58 * Returns subnet ID. 58 * Returns subnet ID.
59 * 59 *
60 - * @return subnet ID 60 + * @return subnet id
61 */ 61 */
62 public String subnetId() { 62 public String subnetId() {
63 return subnetId; 63 return subnetId;
...@@ -66,7 +66,7 @@ public final class OpenstackRouterInterface { ...@@ -66,7 +66,7 @@ public final class OpenstackRouterInterface {
66 /** 66 /**
67 * Returns port ID. 67 * Returns port ID.
68 * 68 *
69 - * @return port ID 69 + * @return port id
70 */ 70 */
71 public String portId() { 71 public String portId() {
72 return portId; 72 return portId;
...@@ -96,7 +96,16 @@ public final class OpenstackRouterInterface { ...@@ -96,7 +96,16 @@ public final class OpenstackRouterInterface {
96 } 96 }
97 97
98 /** 98 /**
99 - * An Openstack Router Interface Builder class. 99 + * Returns OpenStack router interface builder.
100 + *
101 + * @return openstack router interface builder
102 + */
103 + public static Builder builder() {
104 + return new Builder();
105 + }
106 +
107 + /**
108 + * An OpenStack Router interface builder class.
100 */ 109 */
101 public static final class Builder { 110 public static final class Builder {
102 private String id; 111 private String id;
...@@ -105,10 +114,10 @@ public final class OpenstackRouterInterface { ...@@ -105,10 +114,10 @@ public final class OpenstackRouterInterface {
105 private String portId; 114 private String portId;
106 115
107 /** 116 /**
108 - * Sets Router Interface ID. 117 + * Sets router interface ID.
109 * 118 *
110 - * @param id router interface ID 119 + * @param id router interface id
111 - * @return Builder object 120 + * @return builder object
112 */ 121 */
113 public Builder id(String id) { 122 public Builder id(String id) {
114 this.id = id; 123 this.id = id;
...@@ -119,7 +128,7 @@ public final class OpenstackRouterInterface { ...@@ -119,7 +128,7 @@ public final class OpenstackRouterInterface {
119 * Sets tenant ID. 128 * Sets tenant ID.
120 * 129 *
121 * @param tenantId tenant ID 130 * @param tenantId tenant ID
122 - * @return Builder object 131 + * @return builder object
123 */ 132 */
124 public Builder tenantId(String tenantId) { 133 public Builder tenantId(String tenantId) {
125 this.tenantId = tenantId; 134 this.tenantId = tenantId;
...@@ -130,7 +139,7 @@ public final class OpenstackRouterInterface { ...@@ -130,7 +139,7 @@ public final class OpenstackRouterInterface {
130 * Sets subnet ID. 139 * Sets subnet ID.
131 * 140 *
132 * @param subnetId subnet ID 141 * @param subnetId subnet ID
133 - * @return Builder object 142 + * @return builder object
134 */ 143 */
135 public Builder subnetId(String subnetId) { 144 public Builder subnetId(String subnetId) {
136 this.subnetId = subnetId; 145 this.subnetId = subnetId;
...@@ -141,7 +150,7 @@ public final class OpenstackRouterInterface { ...@@ -141,7 +150,7 @@ public final class OpenstackRouterInterface {
141 * Sets port ID. 150 * Sets port ID.
142 * 151 *
143 * @param portId port ID 152 * @param portId port ID
144 - * @return Builder object 153 + * @return builder object
145 */ 154 */
146 public Builder portId(String portId) { 155 public Builder portId(String portId) {
147 this.portId = portId; 156 this.portId = portId;
...@@ -149,14 +158,13 @@ public final class OpenstackRouterInterface { ...@@ -149,14 +158,13 @@ public final class OpenstackRouterInterface {
149 } 158 }
150 159
151 /** 160 /**
152 - * Builds an Openstack Router Interface object. 161 + * Builds an OpenStack router interface object.
153 * 162 *
154 - * @return OpenstackRouterInterface object 163 + * @return openstack router interface object
155 */ 164 */
156 public OpenstackRouterInterface build() { 165 public OpenstackRouterInterface build() {
157 return new OpenstackRouterInterface(checkNotNull(id), checkNotNull(tenantId), 166 return new OpenstackRouterInterface(checkNotNull(id), checkNotNull(tenantId),
158 checkNotNull(subnetId), checkNotNull(portId)); 167 checkNotNull(subnetId), checkNotNull(portId));
159 } 168 }
160 -
161 } 169 }
162 } 170 }
......
...@@ -13,20 +13,18 @@ ...@@ -13,20 +13,18 @@
13 * See the License for the specific language governing permissions and 13 * See the License for the specific language governing permissions and
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 -package org.onosproject.openstacknetworking.switching; 16 +package org.onosproject.openstacknetworking;
17 17
18 import org.onlab.osgi.DefaultServiceDirectory; 18 import org.onlab.osgi.DefaultServiceDirectory;
19 import org.onlab.osgi.ServiceDirectory; 19 import org.onlab.osgi.ServiceDirectory;
20 import org.onlab.packet.Ip4Address; 20 import org.onlab.packet.Ip4Address;
21 import org.onlab.util.Tools; 21 import org.onlab.util.Tools;
22 -import org.onosproject.core.ApplicationId;
23 import org.onosproject.core.CoreService; 22 import org.onosproject.core.CoreService;
24 import org.onosproject.mastership.MastershipService; 23 import org.onosproject.mastership.MastershipService;
25 import org.onosproject.net.Host; 24 import org.onosproject.net.Host;
26 import org.onosproject.net.host.HostEvent; 25 import org.onosproject.net.host.HostEvent;
27 import org.onosproject.net.host.HostListener; 26 import org.onosproject.net.host.HostListener;
28 import org.onosproject.net.host.HostService; 27 import org.onosproject.net.host.HostService;
29 -import org.onosproject.openstacknetworking.Constants;
30 import org.slf4j.Logger; 28 import org.slf4j.Logger;
31 29
32 import java.util.Objects; 30 import java.util.Objects;
...@@ -53,7 +51,6 @@ public abstract class AbstractVmHandler { ...@@ -53,7 +51,6 @@ public abstract class AbstractVmHandler {
53 protected MastershipService mastershipService; 51 protected MastershipService mastershipService;
54 protected HostService hostService; 52 protected HostService hostService;
55 53
56 - protected ApplicationId appId;
57 protected HostListener hostListener = new InternalHostListener(); 54 protected HostListener hostListener = new InternalHostListener();
58 55
59 protected void activate() { 56 protected void activate() {
...@@ -61,8 +58,6 @@ public abstract class AbstractVmHandler { ...@@ -61,8 +58,6 @@ public abstract class AbstractVmHandler {
61 coreService = services.get(CoreService.class); 58 coreService = services.get(CoreService.class);
62 mastershipService = services.get(MastershipService.class); 59 mastershipService = services.get(MastershipService.class);
63 hostService = services.get(HostService.class); 60 hostService = services.get(HostService.class);
64 -
65 - appId = coreService.registerApplication(Constants.APP_ID);
66 hostService.addListener(hostListener); 61 hostService.addListener(hostListener);
67 62
68 log.info("Started"); 63 log.info("Started");
...@@ -75,9 +70,19 @@ public abstract class AbstractVmHandler { ...@@ -75,9 +70,19 @@ public abstract class AbstractVmHandler {
75 log.info("Stopped"); 70 log.info("Stopped");
76 } 71 }
77 72
78 - abstract void hostDetected(Host host); 73 + /**
79 - 74 + * Performs any action when a host is detected.
80 - abstract void hostRemoved(Host host); 75 + *
76 + * @param host detected host
77 + */
78 + protected abstract void hostDetected(Host host);
79 +
80 + /**
81 + * Performs any action when a host is removed.
82 + *
83 + * @param host removed host
84 + */
85 + protected abstract void hostRemoved(Host host);
81 86
82 protected boolean isValidHost(Host host) { 87 protected boolean isValidHost(Host host) {
83 return !host.ipAddresses().isEmpty() && 88 return !host.ipAddresses().isEmpty() &&
......
...@@ -28,23 +28,27 @@ public final class Constants { ...@@ -28,23 +28,27 @@ public final class Constants {
28 private Constants() { 28 private Constants() {
29 } 29 }
30 30
31 - public static final String APP_ID = "org.onosproject.openstackswitching"; 31 + public static final String SWITCHING_APP_ID = "org.onosproject.openstackswitching";
32 + public static final String ROUTING_APP_ID = "org.onosproject.openstackrouting";
32 33
33 - public static final String PORTNAME_PREFIX_VM = "tap"; 34 + public static final String DEVICE_OWNER_ROUTER_INTERFACE = "network:router_interface";
34 - public static final String PORTNAME_PREFIX_ROUTER = "qr-"; 35 + public static final String DEVICE_OWNER_ROUTER_GATEWAY = "network:router_gateway";
35 - public static final String PORTNAME_PREFIX_TUNNEL = "vxlan"; 36 + public static final String DEVICE_OWNER_FLOATING_IP = "network:floatingip";
36 37
37 - public static final MacAddress GATEWAY_MAC = MacAddress.valueOf("1f:1f:1f:1f:1f:1f"); 38 + public static final String PORT_NAME_PREFIX_VM = "tap";
39 + public static final String PORT_NAME_PREFIX_TUNNEL = "vxlan";
38 40
39 - // TODO: Please change these valuses following the way vrouter is implemented 41 + public static final String DEFAULT_GATEWAY_MAC_STR = "fe:00:00:00:00:02";
40 - public static final MacAddress GW_EXT_INT_MAC = MacAddress.valueOf("56:e6:30:a6:8c:e5"); 42 + public static final MacAddress DEFAULT_GATEWAY_MAC = MacAddress.valueOf(DEFAULT_GATEWAY_MAC_STR);
41 - public static final MacAddress PHY_ROUTER_MAC = MacAddress.valueOf("00:00:00:00:01:01"); 43 + // TODO make this configurable
44 + public static final MacAddress DEFAULT_EXTERNAL_ROUTER_MAC = MacAddress.valueOf("fe:00:00:00:00:01");
42 45
43 public static final Ip4Address DNS_SERVER_IP = Ip4Address.valueOf("8.8.8.8"); 46 public static final Ip4Address DNS_SERVER_IP = Ip4Address.valueOf("8.8.8.8");
44 public static final IpPrefix IP_PREFIX_ANY = Ip4Prefix.valueOf("0.0.0.0/0"); 47 public static final IpPrefix IP_PREFIX_ANY = Ip4Prefix.valueOf("0.0.0.0/0");
45 public static final int DHCP_INFINITE_LEASE = -1; 48 public static final int DHCP_INFINITE_LEASE = -1;
46 49
47 public static final String NETWORK_ID = "networkId"; 50 public static final String NETWORK_ID = "networkId";
51 + public static final String SUBNET_ID = "subnetId";
48 public static final String PORT_ID = "portId"; 52 public static final String PORT_ID = "portId";
49 public static final String VXLAN_ID = "vxlanId"; 53 public static final String VXLAN_ID = "vxlanId";
50 public static final String TENANT_ID = "tenantId"; 54 public static final String TENANT_ID = "tenantId";
...@@ -55,4 +59,8 @@ public final class Constants { ...@@ -55,4 +59,8 @@ public final class Constants {
55 public static final int TUNNELTAG_RULE_PRIORITY = 30000; 59 public static final int TUNNELTAG_RULE_PRIORITY = 30000;
56 public static final int ACL_RULE_PRIORITY = 30000; 60 public static final int ACL_RULE_PRIORITY = 30000;
57 61
62 + public static final int ROUTING_RULE_PRIORITY = 25000;
63 + public static final int FLOATING_RULE_PRIORITY = 42000;
64 + public static final int PNAT_RULE_PRIORITY = 26000;
65 + public static final int PNAT_TIMEOUT = 120;
58 } 66 }
...\ No newline at end of file ...\ No newline at end of file
......
1 +/*
2 + * Copyright 2016-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 +package org.onosproject.openstacknetworking;
17 +
18 +import org.onosproject.openstackinterface.OpenstackFloatingIP;
19 +
20 +/**
21 + * Handles floating IP update requests from OpenStack.
22 + */
23 +public interface OpenstackFloatingIpService {
24 +
25 + enum Action {
26 + ASSOCIATE,
27 + DISSASSOCIATE
28 + }
29 +
30 + /**
31 + * Handles floating IP create request from OpenStack.
32 + *
33 + * @param floatingIp floating IP information
34 + */
35 + void createFloatingIp(OpenstackFloatingIP floatingIp);
36 +
37 + /**
38 + * Handles floating IP update request from OpenStack.
39 + *
40 + * @param floatingIp floating IP information
41 + */
42 + void updateFloatingIp(OpenstackFloatingIP floatingIp);
43 +
44 + /**
45 + * Handles floating IP remove request from OpenStack.
46 + *
47 + * @param floatingIpId floating ip identifier
48 + */
49 + void deleteFloatingIp(String floatingIpId);
50 +}
...@@ -15,76 +15,49 @@ ...@@ -15,76 +15,49 @@
15 */ 15 */
16 package org.onosproject.openstacknetworking; 16 package org.onosproject.openstacknetworking;
17 17
18 -import org.onosproject.openstackinterface.OpenstackFloatingIP;
19 import org.onosproject.openstackinterface.OpenstackRouter; 18 import org.onosproject.openstackinterface.OpenstackRouter;
20 import org.onosproject.openstackinterface.OpenstackRouterInterface; 19 import org.onosproject.openstackinterface.OpenstackRouterInterface;
21 20
22 /** 21 /**
23 - * Supports L3 management REST API for openstack. 22 + * Handles router update requests from OpenStack.
24 */ 23 */
25 public interface OpenstackRoutingService { 24 public interface OpenstackRoutingService {
26 25
27 /** 26 /**
28 - * Stores the floating IP information created by openstack. 27 + * Handles the router create request from OpenStack.
29 * 28 *
30 - * @param openstackFloatingIp Floating IP information 29 + * @param osRouter router information
31 */ 30 */
32 - void createFloatingIP(OpenstackFloatingIP openstackFloatingIp); 31 + void createRouter(OpenstackRouter osRouter);
33 32
34 /** 33 /**
35 - * Updates flow rules corresponding to the floating IP information updated by openstack. 34 + * Handles the router update request from OpenStack.
35 + * Update router is called when the name, administrative state, or the external
36 + * gateway setting is updated. The external gateway update is the only case
37 + * that openstack routing service cares.
36 * 38 *
37 - * @param openstackFloatingIp Floating IP information 39 + * @param osRouter router information
38 */ 40 */
39 - void updateFloatingIP(OpenstackFloatingIP openstackFloatingIp); 41 + void updateRouter(OpenstackRouter osRouter);
40 42
41 /** 43 /**
42 - * Removes flow rules corresponding to floating IP information removed by openstack. 44 + * Handles the router remove request from OpenStack.
43 * 45 *
44 - * @param id Deleted Floating IP`s ID 46 + * @param osRouterId identifier of the router
45 */ 47 */
46 - void deleteFloatingIP(String id); 48 + void removeRouter(String osRouterId);
47 49
48 /** 50 /**
49 - * Stores the router information created by openstack. 51 + * Handles router interface add request from OpenStack.
50 * 52 *
51 - * @param openstackRouter Router information 53 + * @param osInterface router interface information
52 */ 54 */
53 - void createRouter(OpenstackRouter openstackRouter); 55 + void addRouterInterface(OpenstackRouterInterface osInterface);
54 56
55 /** 57 /**
56 - * Updates flow rules corresponding to the router information updated by openstack. 58 + * Handles router interface remove request from OpenStack.
57 * 59 *
58 - * @param openstackRouter Router information 60 + * @param osInterface router interface information
59 */ 61 */
60 - void updateRouter(OpenstackRouter openstackRouter); 62 + void removeRouterInterface(OpenstackRouterInterface osInterface);
61 -
62 - /**
63 - * Removes flow rules corresponding to the router information removed by openstack.
64 - *
65 - * @param id Deleted router`s ID
66 - */
67 - void deleteRouter(String id);
68 -
69 - /**
70 - * Updates flow rules corresponding to the router information updated by openstack.
71 - *
72 - * @param openstackRouterInterface Router interface information
73 - */
74 - void updateRouterInterface(OpenstackRouterInterface openstackRouterInterface);
75 -
76 - /**
77 - * Removes flow rules corresponding to the router information removed by openstack.
78 - *
79 - * @param openstackRouterInterface Router interface information
80 - */
81 - void removeRouterInterface(OpenstackRouterInterface openstackRouterInterface);
82 -
83 - /**
84 - * Returns network id for routerInterface.
85 - *
86 - * @param portId routerInterface`s port id
87 - * @return network id
88 - */
89 - String networkIdForRouterInterface(String portId);
90 } 63 }
......
1 +/*
2 + * Copyright 2016-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 +package org.onosproject.openstacknetworking;
17 +
18 +import org.onlab.packet.Ip4Address;
19 +import org.onosproject.core.ApplicationId;
20 +import org.onosproject.net.Device;
21 +import org.onosproject.net.DeviceId;
22 +import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
23 +import org.onosproject.net.device.DeviceService;
24 +import org.onosproject.net.flow.DefaultTrafficTreatment;
25 +import org.onosproject.net.flow.TrafficSelector;
26 +import org.onosproject.net.flow.instructions.ExtensionPropertyException;
27 +import org.onosproject.net.flow.instructions.ExtensionTreatment;
28 +import org.onosproject.net.flowobjective.DefaultForwardingObjective;
29 +import org.onosproject.net.flowobjective.FlowObjectiveService;
30 +import org.onosproject.net.flowobjective.ForwardingObjective;
31 +import org.slf4j.Logger;
32 +
33 +import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST;
34 +import static org.slf4j.LoggerFactory.getLogger;
35 +
36 +/**
37 + * Provides common methods to help populating flow rules for SONA applications.
38 + */
39 +public final class RulePopulatorUtil {
40 +
41 + protected static final Logger log = getLogger(RulePopulatorUtil.class);
42 +
43 + private static final String TUNNEL_DST = "tunnelDst";
44 +
45 + private RulePopulatorUtil() {
46 + }
47 +
48 + /**
49 + * Returns tunnel destination extension treatment object.
50 + *
51 + * @param deviceService driver service
52 + * @param deviceId device id to apply this treatment
53 + * @param remoteIp tunnel destination ip address
54 + * @return extension treatment
55 + */
56 + public static ExtensionTreatment buildExtension(DeviceService deviceService,
57 + DeviceId deviceId,
58 + Ip4Address remoteIp) {
59 + Device device = deviceService.getDevice(deviceId);
60 + if (device != null && !device.is(ExtensionTreatmentResolver.class)) {
61 + log.error("The extension treatment is not supported");
62 + return null;
63 + }
64 +
65 + ExtensionTreatmentResolver resolver = device.as(ExtensionTreatmentResolver.class);
66 + ExtensionTreatment treatment = resolver.getExtensionInstruction(NICIRA_SET_TUNNEL_DST.type());
67 + try {
68 + treatment.setPropertyValue(TUNNEL_DST, remoteIp);
69 + return treatment;
70 + } catch (ExtensionPropertyException e) {
71 + log.warn("Failed to get tunnelDst extension treatment for {}", deviceId);
72 + return null;
73 + }
74 + }
75 +
76 + /**
77 + * Removes flow rules with the supplied information.
78 + *
79 + * @param flowObjectiveService flow objective service
80 + * @param appId application id
81 + * @param deviceId device id to remove this flow rule
82 + * @param selector traffic selector
83 + * @param flag flag
84 + * @param priority priority
85 + */
86 + public static void removeRule(FlowObjectiveService flowObjectiveService,
87 + ApplicationId appId,
88 + DeviceId deviceId,
89 + TrafficSelector selector,
90 + ForwardingObjective.Flag flag,
91 + int priority) {
92 + ForwardingObjective fo = DefaultForwardingObjective.builder()
93 + .withSelector(selector)
94 + .withTreatment(DefaultTrafficTreatment.builder().build())
95 + .withFlag(flag)
96 + .withPriority(priority)
97 + .fromApp(appId)
98 + .remove();
99 +
100 + flowObjectiveService.forward(deviceId, fo);
101 + }
102 +}
1 -/*
2 - * Copyright 2016-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 -package org.onosproject.openstacknetworking.routing;
17 -
18 -import org.onosproject.net.Host;
19 -import org.onosproject.openstackinterface.OpenstackFloatingIP;
20 -
21 -/**
22 - * Handle FloatingIP Event for Managing Flow Rules In Openstack Nodes.
23 - */
24 -public class OpenstackFloatingIPHandler implements Runnable {
25 -
26 - public enum Action {
27 - ASSOCIATE,
28 - DISSASSOCIATE
29 - }
30 -
31 - private final OpenstackFloatingIP floatingIP;
32 - private final OpenstackRoutingRulePopulator rulePopulator;
33 - private final Host host;
34 - private final Action action;
35 -
36 -
37 - OpenstackFloatingIPHandler(OpenstackRoutingRulePopulator rulePopulator,
38 - OpenstackFloatingIP openstackFloatingIP, Action action, Host host) {
39 - this.floatingIP = openstackFloatingIP;
40 - this.rulePopulator = rulePopulator;
41 - this.action = action;
42 - this.host = host;
43 - }
44 -
45 - @Override
46 - public void run() {
47 - if (action == Action.ASSOCIATE) {
48 - rulePopulator.populateFloatingIpRules(floatingIP);
49 - } else {
50 - rulePopulator.removeFloatingIpRules(floatingIP, host);
51 - }
52 - }
53 -}
...@@ -15,99 +15,74 @@ ...@@ -15,99 +15,74 @@
15 */ 15 */
16 package org.onosproject.openstacknetworking.routing; 16 package org.onosproject.openstacknetworking.routing;
17 17
18 -import com.google.common.collect.Lists; 18 +import org.apache.felix.scr.annotations.Activate;
19 +import org.apache.felix.scr.annotations.Component;
20 +import org.apache.felix.scr.annotations.Deactivate;
21 +import org.apache.felix.scr.annotations.Reference;
22 +import org.apache.felix.scr.annotations.ReferenceCardinality;
19 import org.onlab.packet.ARP; 23 import org.onlab.packet.ARP;
20 -import org.onlab.packet.EthType;
21 import org.onlab.packet.Ethernet; 24 import org.onlab.packet.Ethernet;
22 import org.onlab.packet.Ip4Address; 25 import org.onlab.packet.Ip4Address;
23 import org.onlab.packet.IpAddress; 26 import org.onlab.packet.IpAddress;
24 import org.onlab.packet.MacAddress; 27 import org.onlab.packet.MacAddress;
25 -import org.onosproject.core.ApplicationId;
26 -import org.onosproject.net.DeviceId;
27 -import org.onosproject.net.flow.DefaultTrafficSelector;
28 import org.onosproject.net.flow.DefaultTrafficTreatment; 28 import org.onosproject.net.flow.DefaultTrafficTreatment;
29 -import org.onosproject.net.flow.TrafficSelector;
30 import org.onosproject.net.flow.TrafficTreatment; 29 import org.onosproject.net.flow.TrafficTreatment;
31 import org.onosproject.net.packet.DefaultOutboundPacket; 30 import org.onosproject.net.packet.DefaultOutboundPacket;
31 +import org.onosproject.net.packet.InboundPacket;
32 import org.onosproject.net.packet.PacketContext; 32 import org.onosproject.net.packet.PacketContext;
33 -import org.onosproject.net.packet.PacketPriority; 33 +import org.onosproject.net.packet.PacketProcessor;
34 import org.onosproject.net.packet.PacketService; 34 import org.onosproject.net.packet.PacketService;
35 import org.onosproject.openstackinterface.OpenstackInterfaceService; 35 import org.onosproject.openstackinterface.OpenstackInterfaceService;
36 import org.onosproject.openstackinterface.OpenstackPort; 36 import org.onosproject.openstackinterface.OpenstackPort;
37 import org.onosproject.scalablegateway.api.ScalableGatewayService; 37 import org.onosproject.scalablegateway.api.ScalableGatewayService;
38 import org.onosproject.openstacknetworking.Constants; 38 import org.onosproject.openstacknetworking.Constants;
39 -import org.onosproject.openstacknode.OpenstackNodeService;
40 import org.slf4j.Logger; 39 import org.slf4j.Logger;
41 40
42 import java.nio.ByteBuffer; 41 import java.nio.ByteBuffer;
43 -import java.util.List; 42 +import java.util.concurrent.ExecutorService;
44 -import java.util.Optional;
45 43
46 -import static com.google.common.base.Preconditions.checkNotNull; 44 +import static java.util.concurrent.Executors.newSingleThreadExecutor;
45 +import static org.onlab.util.Tools.groupedThreads;
46 +import static org.onosproject.openstacknetworking.Constants.DEVICE_OWNER_FLOATING_IP;
47 +import static org.onosproject.openstacknetworking.Constants.DEVICE_OWNER_ROUTER_GATEWAY;
47 import static org.slf4j.LoggerFactory.getLogger; 48 import static org.slf4j.LoggerFactory.getLogger;
48 49
49 /** 50 /**
50 - * Handle ARP packet sent from Openstack Gateway nodes. 51 + * Handle ARP, ICMP and NAT packets from gateway nodes.
51 */ 52 */
53 +@Component(immediate = true)
52 public class OpenstackRoutingArpHandler { 54 public class OpenstackRoutingArpHandler {
53 - protected final Logger log = getLogger(getClass()); 55 + private final Logger log = getLogger(getClass());
54 -
55 - private final PacketService packetService;
56 - private final OpenstackInterfaceService openstackService;
57 - private final ScalableGatewayService gatewayService;
58 - private final OpenstackNodeService nodeService;
59 - private static final String NETWORK_ROUTER_GATEWAY = "network:router_gateway";
60 - private static final String NETWORK_FLOATING_IP = "network:floatingip";
61 -
62 - /**
63 - * Default constructor.
64 - *
65 - * @param packetService packet service
66 - * @param openstackService openstackInterface service
67 - * @param gatewayService gateway service
68 - * @param nodeService openstackNodeService
69 - */
70 - OpenstackRoutingArpHandler(PacketService packetService, OpenstackInterfaceService openstackService,
71 - OpenstackNodeService nodeService, ScalableGatewayService gatewayService) {
72 - this.packetService = packetService;
73 - this.openstackService = checkNotNull(openstackService);
74 - this.nodeService = nodeService;
75 - this.gatewayService = gatewayService;
76 - }
77 56
78 - /** 57 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
79 - * Requests ARP packet to GatewayNode. 58 + protected PacketService packetService;
80 - *
81 - * @param appId application id
82 - */
83 - public void requestPacket(ApplicationId appId) {
84 59
85 - TrafficSelector arpSelector = DefaultTrafficSelector.builder() 60 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
86 - .matchEthType(EthType.EtherType.ARP.ethType().toShort()) 61 + protected OpenstackInterfaceService openstackService;
87 - .build();
88 62
89 - getExternalInfo().forEach(deviceId -> 63 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
90 - packetService.requestPackets(arpSelector, 64 + protected ScalableGatewayService gatewayService;
91 - PacketPriority.CONTROL,
92 - appId,
93 - Optional.of(deviceId))
94 - );
95 - }
96 65
97 - /** 66 + private final ExecutorService executorService =
98 - * Handles ARP packet. 67 + newSingleThreadExecutor(groupedThreads("onos/openstackrouting", "packet-event", log));
99 - *
100 - * @param context packet context
101 - * @param ethernet ethernet
102 - */
103 - public void processArpPacketFromRouter(PacketContext context, Ethernet ethernet) {
104 - checkNotNull(context, "context can not be null");
105 - checkNotNull(ethernet, "ethernet can not be null");
106 68
69 + private final InternalPacketProcessor packetProcessor = new InternalPacketProcessor();
107 70
108 - ARP arp = (ARP) ethernet.getPayload(); 71 + @Activate
72 + protected void activate() {
73 + packetService.addProcessor(packetProcessor, PacketProcessor.director(1));
74 + log.info("Started");
75 + }
109 76
110 - log.debug("arpEvent called from {} to {}", 77 + @Deactivate
78 + protected void deactivate() {
79 + packetService.removeProcessor(packetProcessor);
80 + log.info("Stopped");
81 + }
82 +
83 + private void processArpPacket(PacketContext context, Ethernet ethernet) {
84 + ARP arp = (ARP) ethernet.getPayload();
85 + log.trace("arpEvent called from {} to {}",
111 Ip4Address.valueOf(arp.getSenderProtocolAddress()).toString(), 86 Ip4Address.valueOf(arp.getSenderProtocolAddress()).toString(),
112 Ip4Address.valueOf(arp.getTargetProtocolAddress()).toString()); 87 Ip4Address.valueOf(arp.getTargetProtocolAddress()).toString());
113 88
...@@ -116,13 +91,11 @@ public class OpenstackRoutingArpHandler { ...@@ -116,13 +91,11 @@ public class OpenstackRoutingArpHandler {
116 } 91 }
117 92
118 IpAddress targetIp = Ip4Address.valueOf(arp.getTargetProtocolAddress()); 93 IpAddress targetIp = Ip4Address.valueOf(arp.getTargetProtocolAddress());
119 -
120 if (getTargetMacForTargetIp(targetIp.getIp4Address()) == MacAddress.NONE) { 94 if (getTargetMacForTargetIp(targetIp.getIp4Address()) == MacAddress.NONE) {
121 - return; 95 + return;
122 } 96 }
123 - // FIXME: Set the correct gateway
124 - MacAddress targetMac = Constants.GW_EXT_INT_MAC;
125 97
98 + MacAddress targetMac = Constants.DEFAULT_EXTERNAL_ROUTER_MAC;
126 Ethernet ethReply = ARP.buildArpReply(targetIp.getIp4Address(), 99 Ethernet ethReply = ARP.buildArpReply(targetIp.getIp4Address(),
127 targetMac, ethernet); 100 targetMac, ethernet);
128 101
...@@ -136,22 +109,35 @@ public class OpenstackRoutingArpHandler { ...@@ -136,22 +109,35 @@ public class OpenstackRoutingArpHandler {
136 ByteBuffer.wrap(ethReply.serialize()))); 109 ByteBuffer.wrap(ethReply.serialize())));
137 } 110 }
138 111
112 + private class InternalPacketProcessor implements PacketProcessor {
113 +
114 + @Override
115 + public void process(PacketContext context) {
116 + if (context.isHandled()) {
117 + return;
118 + } else if (!gatewayService.getGatewayDeviceIds().contains(
119 + context.inPacket().receivedFrom().deviceId())) {
120 + // return if the packet is not from gateway nodes
121 + return;
122 + }
123 +
124 + InboundPacket pkt = context.inPacket();
125 + Ethernet ethernet = pkt.parsed();
126 + if (ethernet != null &&
127 + ethernet.getEtherType() == Ethernet.TYPE_ARP) {
128 + executorService.execute(() -> processArpPacket(context, ethernet));
129 + }
130 + }
131 + }
132 +
133 + // TODO make a cache for the MAC, not a good idea to REST call every time it gets ARP request
139 private MacAddress getTargetMacForTargetIp(Ip4Address targetIp) { 134 private MacAddress getTargetMacForTargetIp(Ip4Address targetIp) {
140 OpenstackPort port = openstackService.ports().stream() 135 OpenstackPort port = openstackService.ports().stream()
141 - .filter(p -> p.deviceOwner().equals(NETWORK_ROUTER_GATEWAY) || 136 + .filter(p -> p.deviceOwner().equals(DEVICE_OWNER_ROUTER_GATEWAY) ||
142 - p.deviceOwner().equals(NETWORK_FLOATING_IP)) 137 + p.deviceOwner().equals(DEVICE_OWNER_FLOATING_IP))
143 .filter(p -> p.fixedIps().containsValue(targetIp.getIp4Address())) 138 .filter(p -> p.fixedIps().containsValue(targetIp.getIp4Address()))
144 .findAny().orElse(null); 139 .findAny().orElse(null);
145 140
146 - if (port == null) { 141 + return port == null ? MacAddress.NONE : port.macAddress();
147 - return MacAddress.NONE;
148 - }
149 - return port.macAddress();
150 - }
151 -
152 - private List<DeviceId> getExternalInfo() {
153 - List<DeviceId> externalInfoList = Lists.newArrayList();
154 - gatewayService.getGatewayDeviceIds().forEach(externalInfoList::add);
155 - return externalInfoList;
156 } 142 }
157 } 143 }
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
15 */ 15 */
16 16
17 /** 17 /**
18 - * Application for OpenstackRouting. 18 + * Implements OpenStack L3 service plugin, which routes packets between subnets,
19 + * forwards packets from internal networks to external ones, and accesses instances
20 + * from external networks through floating IPs.
19 */ 21 */
20 -package org.onosproject.openstacknetworking.routing;
...\ No newline at end of file ...\ No newline at end of file
22 +package org.onosproject.openstacknetworking.routing;
......
...@@ -30,6 +30,7 @@ import org.onlab.packet.Ip4Address; ...@@ -30,6 +30,7 @@ import org.onlab.packet.Ip4Address;
30 import org.onlab.packet.IpPrefix; 30 import org.onlab.packet.IpPrefix;
31 import org.onlab.packet.TpPort; 31 import org.onlab.packet.TpPort;
32 import org.onlab.util.Tools; 32 import org.onlab.util.Tools;
33 +import org.onosproject.core.ApplicationId;
33 import org.onosproject.net.DeviceId; 34 import org.onosproject.net.DeviceId;
34 import org.onosproject.net.Host; 35 import org.onosproject.net.Host;
35 import org.onosproject.net.flow.DefaultTrafficSelector; 36 import org.onosproject.net.flow.DefaultTrafficSelector;
...@@ -43,6 +44,7 @@ import org.onosproject.openstackinterface.OpenstackPort; ...@@ -43,6 +44,7 @@ import org.onosproject.openstackinterface.OpenstackPort;
43 import org.onosproject.openstackinterface.OpenstackSecurityGroup; 44 import org.onosproject.openstackinterface.OpenstackSecurityGroup;
44 import org.onosproject.openstackinterface.OpenstackSecurityGroupRule; 45 import org.onosproject.openstackinterface.OpenstackSecurityGroupRule;
45 import org.onosproject.openstacknetworking.OpenstackSecurityGroupService; 46 import org.onosproject.openstacknetworking.OpenstackSecurityGroupService;
47 +import org.onosproject.openstacknetworking.AbstractVmHandler;
46 import org.slf4j.Logger; 48 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory; 49 import org.slf4j.LoggerFactory;
48 50
...@@ -60,7 +62,7 @@ import static org.onosproject.openstacknetworking.Constants.*; ...@@ -60,7 +62,7 @@ import static org.onosproject.openstacknetworking.Constants.*;
60 */ 62 */
61 @Component(immediate = true) 63 @Component(immediate = true)
62 @Service 64 @Service
63 -public class OpenstackSecurityGroupRulePopulator extends AbstractVmHandler 65 +public class OpenstackSecurityGroupManager extends AbstractVmHandler
64 implements OpenstackSecurityGroupService { 66 implements OpenstackSecurityGroupService {
65 67
66 private final Logger log = LoggerFactory.getLogger(getClass()); 68 private final Logger log = LoggerFactory.getLogger(getClass());
...@@ -77,10 +79,12 @@ public class OpenstackSecurityGroupRulePopulator extends AbstractVmHandler ...@@ -77,10 +79,12 @@ public class OpenstackSecurityGroupRulePopulator extends AbstractVmHandler
77 private static final String ETHTYPE_IPV4 = "IPV4"; 79 private static final String ETHTYPE_IPV4 = "IPV4";
78 80
79 private final Map<Host, Set<SecurityGroupRule>> securityGroupRuleMap = Maps.newConcurrentMap(); 81 private final Map<Host, Set<SecurityGroupRule>> securityGroupRuleMap = Maps.newConcurrentMap();
82 + private ApplicationId appId;
80 83
81 @Activate 84 @Activate
82 protected void activate() { 85 protected void activate() {
83 super.activate(); 86 super.activate();
87 + appId = coreService.registerApplication(SWITCHING_APP_ID);
84 } 88 }
85 89
86 @Deactivate 90 @Deactivate
...@@ -96,7 +100,7 @@ public class OpenstackSecurityGroupRulePopulator extends AbstractVmHandler ...@@ -96,7 +100,7 @@ public class OpenstackSecurityGroupRulePopulator extends AbstractVmHandler
96 100
97 Optional<Host> host = getVmByPortId(osPort.id()); 101 Optional<Host> host = getVmByPortId(osPort.id());
98 if (!host.isPresent()) { 102 if (!host.isPresent()) {
99 - log.warn("No host found with {}", osPort); 103 + log.debug("No host found with {}", osPort.id());
100 return; 104 return;
101 } 105 }
102 eventExecutor.execute(() -> updateSecurityGroupRules(host.get(), true)); 106 eventExecutor.execute(() -> updateSecurityGroupRules(host.get(), true));
......
...@@ -40,6 +40,7 @@ import org.onosproject.net.packet.PacketService; ...@@ -40,6 +40,7 @@ import org.onosproject.net.packet.PacketService;
40 import org.onosproject.openstackinterface.OpenstackInterfaceService; 40 import org.onosproject.openstackinterface.OpenstackInterfaceService;
41 import org.onosproject.openstackinterface.OpenstackNetwork; 41 import org.onosproject.openstackinterface.OpenstackNetwork;
42 import org.onosproject.openstackinterface.OpenstackPort; 42 import org.onosproject.openstackinterface.OpenstackPort;
43 +import org.onosproject.openstacknetworking.AbstractVmHandler;
43 import org.osgi.service.component.ComponentContext; 44 import org.osgi.service.component.ComponentContext;
44 import org.slf4j.Logger; 45 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory; 46 import org.slf4j.LoggerFactory;
...@@ -54,12 +55,11 @@ import static org.onosproject.openstacknetworking.Constants.*; ...@@ -54,12 +55,11 @@ import static org.onosproject.openstacknetworking.Constants.*;
54 * Handles ARP packet from VMs. 55 * Handles ARP packet from VMs.
55 */ 56 */
56 @Component(immediate = true) 57 @Component(immediate = true)
57 -public final class OpenstackArpHandler extends AbstractVmHandler { 58 +public final class OpenstackSwitchingArpHandler extends AbstractVmHandler {
58 59
59 private final Logger log = LoggerFactory.getLogger(getClass()); 60 private final Logger log = LoggerFactory.getLogger(getClass());
60 61
61 private static final String GATEWAY_MAC = "gatewayMac"; 62 private static final String GATEWAY_MAC = "gatewayMac";
62 - private static final String DEFAULT_GATEWAY_MAC = "1f:1f:1f:1f:1f:1f";
63 63
64 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 64 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
65 protected PacketService packetService; 65 protected PacketService packetService;
...@@ -67,9 +67,9 @@ public final class OpenstackArpHandler extends AbstractVmHandler { ...@@ -67,9 +67,9 @@ public final class OpenstackArpHandler extends AbstractVmHandler {
67 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 67 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
68 protected OpenstackInterfaceService openstackService; 68 protected OpenstackInterfaceService openstackService;
69 69
70 - @Property(name = GATEWAY_MAC, value = DEFAULT_GATEWAY_MAC, 70 + @Property(name = GATEWAY_MAC, value = DEFAULT_GATEWAY_MAC_STR,
71 label = "Fake MAC address for virtual network subnet gateway") 71 label = "Fake MAC address for virtual network subnet gateway")
72 - private String gatewayMac = DEFAULT_GATEWAY_MAC; 72 + private String gatewayMac = DEFAULT_GATEWAY_MAC_STR;
73 73
74 private final InternalPacketProcessor packetProcessor = new InternalPacketProcessor(); 74 private final InternalPacketProcessor packetProcessor = new InternalPacketProcessor();
75 private final Set<Ip4Address> gateways = Sets.newConcurrentHashSet(); 75 private final Set<Ip4Address> gateways = Sets.newConcurrentHashSet();
......
...@@ -126,7 +126,7 @@ public class OpensatckRouterWebResource extends AbstractWebResource { ...@@ -126,7 +126,7 @@ public class OpensatckRouterWebResource extends AbstractWebResource {
126 126
127 OpenstackRoutingService routingService 127 OpenstackRoutingService routingService
128 = getService(OpenstackRoutingService.class); 128 = getService(OpenstackRoutingService.class);
129 - routingService.updateRouterInterface(openstackRouterInterface); 129 + routingService.addRouterInterface(openstackRouterInterface);
130 130
131 log.debug("REST API AddRouterInterface is called from router {} portId: {}, subnetId: {}, tenantId: {}", 131 log.debug("REST API AddRouterInterface is called from router {} portId: {}, subnetId: {}, tenantId: {}",
132 openstackRouterInterface.id(), openstackRouterInterface.portId(), 132 openstackRouterInterface.id(), openstackRouterInterface.portId(),
...@@ -147,7 +147,7 @@ public class OpensatckRouterWebResource extends AbstractWebResource { ...@@ -147,7 +147,7 @@ public class OpensatckRouterWebResource extends AbstractWebResource {
147 checkNotNull(id); 147 checkNotNull(id);
148 OpenstackRoutingService routingService 148 OpenstackRoutingService routingService
149 = getService(OpenstackRoutingService.class); 149 = getService(OpenstackRoutingService.class);
150 - routingService.deleteRouter(id); 150 + routingService.removeRouter(id);
151 151
152 log.debug("REST API DELETE routers is called {}", id); 152 log.debug("REST API DELETE routers is called {}", id);
153 return Response.noContent().build(); 153 return Response.noContent().build();
......
...@@ -20,7 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; ...@@ -20,7 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
20 import com.fasterxml.jackson.databind.node.ObjectNode; 20 import com.fasterxml.jackson.databind.node.ObjectNode;
21 import org.onosproject.openstackinterface.OpenstackFloatingIP; 21 import org.onosproject.openstackinterface.OpenstackFloatingIP;
22 import org.onosproject.openstackinterface.web.OpenstackFloatingIpCodec; 22 import org.onosproject.openstackinterface.web.OpenstackFloatingIpCodec;
23 -import org.onosproject.openstacknetworking.OpenstackRoutingService; 23 +import org.onosproject.openstacknetworking.OpenstackFloatingIpService;
24 import org.onosproject.rest.AbstractWebResource; 24 import org.onosproject.rest.AbstractWebResource;
25 import org.slf4j.Logger; 25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory; 26 import org.slf4j.LoggerFactory;
...@@ -45,8 +45,7 @@ import static com.google.common.base.Preconditions.checkNotNull; ...@@ -45,8 +45,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
45 public class OpenstackFloatingIpWebResource extends AbstractWebResource { 45 public class OpenstackFloatingIpWebResource extends AbstractWebResource {
46 private final Logger log = LoggerFactory.getLogger(getClass()); 46 private final Logger log = LoggerFactory.getLogger(getClass());
47 47
48 - private static final OpenstackFloatingIpCodec FLOATING_IP_CODEC 48 + private static final OpenstackFloatingIpCodec FLOATING_IP_CODEC = new OpenstackFloatingIpCodec();
49 - = new OpenstackFloatingIpCodec();
50 49
51 /** 50 /**
52 * Create FloatingIP. 51 * Create FloatingIP.
...@@ -64,20 +63,15 @@ public class OpenstackFloatingIpWebResource extends AbstractWebResource { ...@@ -64,20 +63,15 @@ public class OpenstackFloatingIpWebResource extends AbstractWebResource {
64 ObjectMapper mapper = new ObjectMapper(); 63 ObjectMapper mapper = new ObjectMapper();
65 ObjectNode floatingIpNode = (ObjectNode) mapper.readTree(input); 64 ObjectNode floatingIpNode = (ObjectNode) mapper.readTree(input);
66 65
67 - OpenstackFloatingIP osFloatingIp = 66 + OpenstackFloatingIP osFloatingIp = FLOATING_IP_CODEC.decode(floatingIpNode, this);
68 - FLOATING_IP_CODEC.decode(floatingIpNode, this); 67 + OpenstackFloatingIpService floatingIpService =
69 - 68 + getService(OpenstackFloatingIpService.class);
70 - OpenstackRoutingService routingService = 69 + floatingIpService.createFloatingIp(osFloatingIp);
71 - getService(OpenstackRoutingService.class);
72 -
73 - routingService.createFloatingIP(osFloatingIp);
74 70
75 log.debug("REST API CREATE floatingip called"); 71 log.debug("REST API CREATE floatingip called");
76 -
77 return Response.status(Response.Status.OK).build(); 72 return Response.status(Response.Status.OK).build();
78 } catch (Exception e) { 73 } catch (Exception e) {
79 log.error("createFloatingIp failed with {}", e.toString()); 74 log.error("createFloatingIp failed with {}", e.toString());
80 -
81 return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.toString()) 75 return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.toString())
82 .build(); 76 .build();
83 } 77 }
...@@ -102,20 +96,15 @@ public class OpenstackFloatingIpWebResource extends AbstractWebResource { ...@@ -102,20 +96,15 @@ public class OpenstackFloatingIpWebResource extends AbstractWebResource {
102 ObjectMapper mapper = new ObjectMapper(); 96 ObjectMapper mapper = new ObjectMapper();
103 ObjectNode floatingIpNode = (ObjectNode) mapper.readTree(input); 97 ObjectNode floatingIpNode = (ObjectNode) mapper.readTree(input);
104 98
105 - OpenstackFloatingIP osFloatingIp = 99 + OpenstackFloatingIP osFloatingIp = FLOATING_IP_CODEC.decode(floatingIpNode, this);
106 - FLOATING_IP_CODEC.decode(floatingIpNode, this); 100 + OpenstackFloatingIpService floatingIpService =
107 - 101 + getService(OpenstackFloatingIpService.class);
108 - OpenstackRoutingService routingService = 102 + floatingIpService.updateFloatingIp(osFloatingIp);
109 - getService(OpenstackRoutingService.class);
110 -
111 - routingService.updateFloatingIP(osFloatingIp);
112 103
113 log.debug("REST API UPDATE floatingip called {}", id); 104 log.debug("REST API UPDATE floatingip called {}", id);
114 -
115 return Response.status(Response.Status.OK).build(); 105 return Response.status(Response.Status.OK).build();
116 } catch (Exception e) { 106 } catch (Exception e) {
117 log.error("updateFloatingIp failed with {}", e.toString()); 107 log.error("updateFloatingIp failed with {}", e.toString());
118 -
119 return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.toString()) 108 return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.toString())
120 .build(); 109 .build();
121 } 110 }
...@@ -133,12 +122,11 @@ public class OpenstackFloatingIpWebResource extends AbstractWebResource { ...@@ -133,12 +122,11 @@ public class OpenstackFloatingIpWebResource extends AbstractWebResource {
133 public Response deleteFloatingIp(@PathParam("id") String id) { 122 public Response deleteFloatingIp(@PathParam("id") String id) {
134 checkNotNull(id); 123 checkNotNull(id);
135 124
136 - OpenstackRoutingService routingService = 125 + OpenstackFloatingIpService floatingIpService =
137 - getService(OpenstackRoutingService.class); 126 + getService(OpenstackFloatingIpService.class);
138 - routingService.deleteFloatingIP(id); 127 + floatingIpService.deleteFloatingIp(id);
139 128
140 log.debug("REST API DELETE floatingip is called {}", id); 129 log.debug("REST API DELETE floatingip is called {}", id);
141 -
142 return Response.noContent().build(); 130 return Response.noContent().build();
143 } 131 }
144 132
......
...@@ -79,7 +79,6 @@ public class OpenstackPortWebResource extends AbstractWebResource { ...@@ -79,7 +79,6 @@ public class OpenstackPortWebResource extends AbstractWebResource {
79 sgService.updateSecurityGroup(osPort); 79 sgService.updateSecurityGroup(osPort);
80 80
81 return Response.status(Response.Status.OK).build(); 81 return Response.status(Response.Status.OK).build();
82 -
83 } catch (IOException e) { 82 } catch (IOException e) {
84 log.error("UpdatePort post process failed due to {}", e.getMessage()); 83 log.error("UpdatePort post process failed due to {}", e.getMessage());
85 84
......
...@@ -28,6 +28,7 @@ import java.util.Optional; ...@@ -28,6 +28,7 @@ import java.util.Optional;
28 28
29 import static com.google.common.base.Preconditions.checkArgument; 29 import static com.google.common.base.Preconditions.checkArgument;
30 import static com.google.common.base.Preconditions.checkNotNull; 30 import static com.google.common.base.Preconditions.checkNotNull;
31 +import static org.onosproject.openstacknode.Constants.PATCH_INTG_BRIDGE;
31 import static org.onosproject.openstacknode.OpenstackNodeEvent.NodeState.INIT; 32 import static org.onosproject.openstacknode.OpenstackNodeEvent.NodeState.INIT;
32 33
33 /** 34 /**
...@@ -182,6 +183,20 @@ public final class OpenstackNode { ...@@ -182,6 +183,20 @@ public final class OpenstackNode {
182 return DeviceId.deviceId("ovsdb:" + managementIp.toString()); 183 return DeviceId.deviceId("ovsdb:" + managementIp.toString());
183 } 184 }
184 185
186 + /**
187 + * Returns the name of the port connected to the external network.
188 + * It returns valid value only if the node is gateway node.
189 + *
190 + * @return external port name
191 + */
192 + public Optional<String> externalPortName() {
193 + if (type == NodeType.GATEWAY) {
194 + return Optional.of(PATCH_INTG_BRIDGE);
195 + } else {
196 + return Optional.empty();
197 + }
198 + }
199 +
185 @Override 200 @Override
186 public boolean equals(Object obj) { 201 public boolean equals(Object obj) {
187 if (this == obj) { 202 if (this == obj) {
......