Committed by
Gerrit Code Review
[ONOS-3946] Implement IcmpHandler for OpenstackRoutingService
- Process Icmp packet sent from Host to external network for OpenstackGateway Node - Process Arp packet sent from physical router to gateway Change-Id: Ifcde71a9ca10180682811c9e1bcf58f991b36443
Showing
9 changed files
with
324 additions
and
68 deletions
... | @@ -68,7 +68,6 @@ public class OpenstackRouterCodec extends JsonCodec<OpenstackRouter> { | ... | @@ -68,7 +68,6 @@ public class OpenstackRouterCodec extends JsonCodec<OpenstackRouter> { |
68 | String tenantId = checkNotNull(routerInfo.path(TENANT_ID).asText()); | 68 | String tenantId = checkNotNull(routerInfo.path(TENANT_ID).asText()); |
69 | String id = checkNotNull(routerInfo.path(ID).asText()); | 69 | String id = checkNotNull(routerInfo.path(ID).asText()); |
70 | String name = checkNotNull(routerInfo.path(NAME).asText()); | 70 | String name = checkNotNull(routerInfo.path(NAME).asText()); |
71 | - String status = checkNotNull(routerInfo.path(STATUS).asText()); | ||
72 | String adminStateUp = checkNotNull(routerInfo.path(ADMIN_STATE_UP).asText()); | 71 | String adminStateUp = checkNotNull(routerInfo.path(ADMIN_STATE_UP).asText()); |
73 | 72 | ||
74 | OpenstackExternalGateway.Builder osExtBuiler = new OpenstackExternalGateway.Builder(); | 73 | OpenstackExternalGateway.Builder osExtBuiler = new OpenstackExternalGateway.Builder(); |
... | @@ -98,7 +97,7 @@ public class OpenstackRouterCodec extends JsonCodec<OpenstackRouter> { | ... | @@ -98,7 +97,7 @@ public class OpenstackRouterCodec extends JsonCodec<OpenstackRouter> { |
98 | .tenantId(tenantId) | 97 | .tenantId(tenantId) |
99 | .id(id) | 98 | .id(id) |
100 | .name(name) | 99 | .name(name) |
101 | - .status(OpenstackRouter.RouterStatus.valueOf(status)) | 100 | + .status(OpenstackRouter.RouterStatus.ACTIVE) |
102 | .adminStateUp(Boolean.valueOf(adminStateUp)) | 101 | .adminStateUp(Boolean.valueOf(adminStateUp)) |
103 | .gatewayExternalInfo(osExtBuiler.build()); | 102 | .gatewayExternalInfo(osExtBuiler.build()); |
104 | 103 | ... | ... |
... | @@ -27,12 +27,13 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -27,12 +27,13 @@ import static com.google.common.base.Preconditions.checkNotNull; |
27 | /** | 27 | /** |
28 | * Contains OpenstackPort Information. | 28 | * Contains OpenstackPort Information. |
29 | */ | 29 | */ |
30 | -public class OpenstackPortInfo { | 30 | +public final class OpenstackPortInfo { |
31 | private final Ip4Address hostIp; | 31 | private final Ip4Address hostIp; |
32 | private final MacAddress hostMac; | 32 | private final MacAddress hostMac; |
33 | private final DeviceId deviceId; | 33 | private final DeviceId deviceId; |
34 | private final long vni; | 34 | private final long vni; |
35 | private final Ip4Address gatewayIP; | 35 | private final Ip4Address gatewayIP; |
36 | + private final String networkId; | ||
36 | private final Collection<String> securityGroups; | 37 | private final Collection<String> securityGroups; |
37 | 38 | ||
38 | /** | 39 | /** |
... | @@ -46,12 +47,13 @@ public class OpenstackPortInfo { | ... | @@ -46,12 +47,13 @@ public class OpenstackPortInfo { |
46 | * @param securityGroups security group list | 47 | * @param securityGroups security group list |
47 | */ | 48 | */ |
48 | public OpenstackPortInfo(Ip4Address hostIp, MacAddress hostMac, DeviceId deviceId, long vni, | 49 | public OpenstackPortInfo(Ip4Address hostIp, MacAddress hostMac, DeviceId deviceId, long vni, |
49 | - Ip4Address gatewayIP, Collection<String> securityGroups) { | 50 | + Ip4Address gatewayIP, String networkId, Collection<String> securityGroups) { |
50 | this.hostIp = hostIp; | 51 | this.hostIp = hostIp; |
51 | this.hostMac = hostMac; | 52 | this.hostMac = hostMac; |
52 | this.deviceId = deviceId; | 53 | this.deviceId = deviceId; |
53 | this.vni = vni; | 54 | this.vni = vni; |
54 | this.gatewayIP = gatewayIP; | 55 | this.gatewayIP = gatewayIP; |
56 | + this.networkId = networkId; | ||
55 | this.securityGroups = securityGroups; | 57 | this.securityGroups = securityGroups; |
56 | } | 58 | } |
57 | 59 | ||
... | @@ -101,6 +103,15 @@ public class OpenstackPortInfo { | ... | @@ -101,6 +103,15 @@ public class OpenstackPortInfo { |
101 | } | 103 | } |
102 | 104 | ||
103 | /** | 105 | /** |
106 | + * Returns network ID. | ||
107 | + * | ||
108 | + * @return network ID | ||
109 | + */ | ||
110 | + public String networkId() { | ||
111 | + return networkId; | ||
112 | + } | ||
113 | + | ||
114 | + /** | ||
104 | * Returns Security Group ID list. | 115 | * Returns Security Group ID list. |
105 | * | 116 | * |
106 | * @return list of Security Group ID | 117 | * @return list of Security Group ID |
... | @@ -129,11 +140,12 @@ public class OpenstackPortInfo { | ... | @@ -129,11 +140,12 @@ public class OpenstackPortInfo { |
129 | private long vni; | 140 | private long vni; |
130 | private Ip4Address gatewayIP; | 141 | private Ip4Address gatewayIP; |
131 | private Collection<String> securityGroups; | 142 | private Collection<String> securityGroups; |
143 | + private String networkId; | ||
132 | 144 | ||
133 | /** | 145 | /** |
134 | * Sets the IP address of the port. | 146 | * Sets the IP address of the port. |
135 | * | 147 | * |
136 | - * @param gatewayIP | 148 | + * @param gatewayIP gateway IP |
137 | * @return Builder reference | 149 | * @return Builder reference |
138 | */ | 150 | */ |
139 | public Builder setGatewayIP(Ip4Address gatewayIP) { | 151 | public Builder setGatewayIP(Ip4Address gatewayIP) { |
... | @@ -142,6 +154,17 @@ public class OpenstackPortInfo { | ... | @@ -142,6 +154,17 @@ public class OpenstackPortInfo { |
142 | } | 154 | } |
143 | 155 | ||
144 | /** | 156 | /** |
157 | + * Sets the network ID. | ||
158 | + * | ||
159 | + * @param networkId network id | ||
160 | + * @return Builder reference | ||
161 | + */ | ||
162 | + public Builder setNetworkId(String networkId) { | ||
163 | + this.networkId = checkNotNull(networkId, "networkId cannot be null"); | ||
164 | + return this; | ||
165 | + } | ||
166 | + | ||
167 | + /** | ||
145 | * Sets the host IP address of the port. | 168 | * Sets the host IP address of the port. |
146 | * | 169 | * |
147 | * @param hostIp host IP address | 170 | * @param hostIp host IP address |
... | @@ -202,16 +225,7 @@ public class OpenstackPortInfo { | ... | @@ -202,16 +225,7 @@ public class OpenstackPortInfo { |
202 | * @return OpenstackPortInfo reference | 225 | * @return OpenstackPortInfo reference |
203 | */ | 226 | */ |
204 | public OpenstackPortInfo build() { | 227 | public OpenstackPortInfo build() { |
205 | - return new OpenstackPortInfo(this); | 228 | + return new OpenstackPortInfo(hostIp, hostMac, deviceId, vni, gatewayIP, networkId, securityGroups); |
206 | } | 229 | } |
207 | } | 230 | } |
208 | - | ||
209 | - private OpenstackPortInfo(Builder builder) { | ||
210 | - hostIp = builder.hostIp; | ||
211 | - hostMac = builder.hostMac; | ||
212 | - deviceId = builder.deviceId; | ||
213 | - vni = builder.vni; | ||
214 | - gatewayIP = builder.gatewayIP; | ||
215 | - securityGroups = builder.securityGroups; | ||
216 | - } | ||
217 | } | 231 | } | ... | ... |
1 | { | 1 | { |
2 | "apps" : { | 2 | "apps" : { |
3 | - "org.onosproject.openstackswitching" : { | 3 | + "org.onosproject.openstackrouting" : { |
4 | - "openstackswitching" : { | 4 | + "openstackrouting" : { |
5 | - "do_not_push_flows" : "false", | 5 | + "physicalRouterMac" : "2a:a1:8a:89:dd:a4", |
6 | - "neutron_server" : "http://192.168.56.103:9696/v2.0/", | 6 | + "gatewayBridgeId" : "of:0000000000000003", |
7 | - "keystone_server" : "http://192.168.56.103:5000/v2.0/", | 7 | + "gatewayExternalInterfaceName" : "veth0", |
8 | - "user_name" : "admin", | 8 | + "gatewayExternalInterfaceMac" : "be:15:c6:b0:df:9f" |
9 | - "password" : "nova", | 9 | + } |
10 | - "physicalRouterMac" : "00:00:00:00:00:20", | 10 | + }, |
11 | + "org.onosproject.openstacknode" : { | ||
12 | + "openstacknode" : { | ||
11 | "nodes" : [ | 13 | "nodes" : [ |
12 | - { | 14 | + { |
13 | - "hostname" : "compute-01", | 15 | + "hostname" : "compute-01", |
14 | - "ovsdbIp" : "192.168.56.102", | 16 | + "ovsdbIp" : "192.168.56.112", |
15 | - "ovsdbPort" : "6640", | 17 | + "ovsdbPort" : "6640", |
16 | - "bridgeId" : "of:0000000000000001", | 18 | + "bridgeId" : "of:0000000000000001", |
17 | - "openstackNodeType" : "COMPUTENODE" | 19 | + "openstackNodeType" : "COMPUTENODE" |
18 | - }, | 20 | + }, |
19 | - { | 21 | + { |
20 | - "hostname" : "compute-02", | 22 | + "hostname" : "compute-02", |
21 | - "ovsdbIp" : "192.168.56.101", | 23 | + "ovsdbIp" : "192.168.56.113", |
22 | - "ovsdbPort" : "6640", | 24 | + "ovsdbPort" : "6640", |
23 | - "bridgeId" : "of:0000000000000002", | 25 | + "bridgeId" : "of:0000000000000002", |
24 | - "openstackNodeType" : "COMPUTENODE" | 26 | + "openstackNodeType" : "COMPUTENODE" |
25 | - }, | 27 | + }, |
26 | - { | 28 | + { |
27 | - "hostname" : "network", | 29 | + "hostname" : "network", |
28 | - "ovsdbIp" : "192.168.56.106", | 30 | + "ovsdbIp" : "192.168.56.114", |
29 | - "ovsdbPort" : "6640", | 31 | + "ovsdbPort" : "6640", |
30 | - "bridgeId" : "of:0000000000000003", | 32 | + "bridgeId" : "of:0000000000000003", |
31 | - "openstackNodeType" : "GATEWAYNODE", | 33 | + "openstackNodeType" : "GATEWAYNODE", |
32 | - "externalIfName" : "eth3", | 34 | + "gatewayExternalInterfaceName" : "veth0", |
33 | - "externalIfMacAddress" : "00:00:00:00:00:11" | 35 | + "gatewayExternalInterfaceMac" : "be:15:c6:b0:df:9f" |
34 | - } | 36 | + } |
35 | ] | 37 | ] |
36 | - } | 38 | + } |
37 | - } | 39 | + }, |
40 | + "org.onosproject.openstackinterface" : { | ||
41 | + "openstackinterface" : { | ||
42 | + "neutron_server" : "http://192.168.56.111:9696/v2.0/", | ||
43 | + "keystone_server" : "http://192.168.56.111:5000/v2.0/", | ||
44 | + "user_name" : "admin", | ||
45 | + "password" : "nova" | ||
46 | + } | ||
47 | + } | ||
38 | }, | 48 | }, |
39 | "devices" : { | 49 | "devices" : { |
40 | "of:0000000000000001" : { | 50 | "of:0000000000000001" : { |
... | @@ -49,3 +59,4 @@ | ... | @@ -49,3 +59,4 @@ |
49 | } | 59 | } |
50 | } | 60 | } |
51 | } | 61 | } |
62 | + | ... | ... |
This diff is collapsed. Click to expand it.
1 | +/* | ||
2 | + * Copyright 2016 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.onlab.packet.ARP; | ||
19 | +import org.onlab.packet.EthType; | ||
20 | +import org.onlab.packet.Ethernet; | ||
21 | +import org.onlab.packet.IPv4; | ||
22 | +import org.onlab.packet.Ip4Address; | ||
23 | +import org.onlab.packet.IpAddress; | ||
24 | +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; | ||
29 | +import org.onosproject.net.flow.TrafficSelector; | ||
30 | +import org.onosproject.net.flow.TrafficTreatment; | ||
31 | +import org.onosproject.net.packet.DefaultOutboundPacket; | ||
32 | +import org.onosproject.net.packet.PacketContext; | ||
33 | +import org.onosproject.net.packet.PacketPriority; | ||
34 | +import org.onosproject.net.packet.PacketService; | ||
35 | +import org.onosproject.openstackinterface.OpenstackInterfaceService; | ||
36 | +import org.onosproject.openstackinterface.OpenstackPort; | ||
37 | +import org.slf4j.Logger; | ||
38 | + | ||
39 | +import java.nio.ByteBuffer; | ||
40 | +import java.util.Optional; | ||
41 | + | ||
42 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
43 | +import static org.slf4j.LoggerFactory.getLogger; | ||
44 | + | ||
45 | +/** | ||
46 | + * Handle ARP packet sent from Openstack Gateway nodes. | ||
47 | + */ | ||
48 | +public class OpenstackRoutingArpHandler { | ||
49 | + protected final Logger log = getLogger(getClass()); | ||
50 | + | ||
51 | + private final PacketService packetService; | ||
52 | + private final OpenstackInterfaceService openstackService; | ||
53 | + private final OpenstackRoutingConfig config; | ||
54 | + private static final String NETWORK_ROUTER_GATEWAY = "network:router_gateway"; | ||
55 | + | ||
56 | + /** | ||
57 | + * Default constructor. | ||
58 | + * | ||
59 | + * @param packetService packet service | ||
60 | + * @param openstackService openstackInterface service | ||
61 | + * @param config openstackRoutingConfig | ||
62 | + */ | ||
63 | + OpenstackRoutingArpHandler(PacketService packetService, OpenstackInterfaceService openstackService, | ||
64 | + OpenstackRoutingConfig config) { | ||
65 | + this.packetService = packetService; | ||
66 | + this.openstackService = checkNotNull(openstackService); | ||
67 | + this.config = checkNotNull(config); | ||
68 | + } | ||
69 | + | ||
70 | + /** | ||
71 | + * Requests ARP packet to GatewayNode. | ||
72 | + * | ||
73 | + * @param appId application id | ||
74 | + */ | ||
75 | + public void requestPacket(ApplicationId appId) { | ||
76 | + | ||
77 | + TrafficSelector arpSelector = DefaultTrafficSelector.builder() | ||
78 | + .matchEthType(EthType.EtherType.ARP.ethType().toShort()) | ||
79 | + .build(); | ||
80 | + | ||
81 | + packetService.requestPackets(arpSelector, | ||
82 | + PacketPriority.CONTROL, | ||
83 | + appId, | ||
84 | + Optional.of(DeviceId.deviceId(config.gatewayBridgeId()))); | ||
85 | + } | ||
86 | + | ||
87 | + /** | ||
88 | + * Handles ARP packet. | ||
89 | + * | ||
90 | + * @param context packet context | ||
91 | + * @param ethernet ethernet | ||
92 | + */ | ||
93 | + public void processArpPacketFromRouter(PacketContext context, Ethernet ethernet) { | ||
94 | + checkNotNull(context, "context can not be null"); | ||
95 | + checkNotNull(ethernet, "ethernet can not be null"); | ||
96 | + | ||
97 | + log.info("arpEvent called from {} to {}", | ||
98 | + Ip4Address.valueOf(((IPv4) ethernet.getPayload()).getSourceAddress()).toString(), | ||
99 | + Ip4Address.valueOf(((IPv4) ethernet.getPayload()).getDestinationAddress()).toString()); | ||
100 | + ARP arp = (ARP) ethernet.getPayload(); | ||
101 | + | ||
102 | + if (arp.getOpCode() != ARP.OP_REQUEST) { | ||
103 | + return; | ||
104 | + } | ||
105 | + | ||
106 | + IpAddress targetIp = Ip4Address.valueOf(arp.getTargetProtocolAddress()); | ||
107 | + MacAddress targetMac = getTargetMacForTargetIp(targetIp.getIp4Address()); | ||
108 | + | ||
109 | + if (targetMac == MacAddress.NONE) { | ||
110 | + return; | ||
111 | + } | ||
112 | + | ||
113 | + Ethernet ethReply = ARP.buildArpReply(targetIp.getIp4Address(), | ||
114 | + targetMac, ethernet); | ||
115 | + | ||
116 | + TrafficTreatment treatment = DefaultTrafficTreatment.builder() | ||
117 | + .setOutput(context.inPacket().receivedFrom().port()) | ||
118 | + .build(); | ||
119 | + | ||
120 | + packetService.emit(new DefaultOutboundPacket( | ||
121 | + context.inPacket().receivedFrom().deviceId(), | ||
122 | + treatment, | ||
123 | + ByteBuffer.wrap(ethReply.serialize()))); | ||
124 | + } | ||
125 | + | ||
126 | + private MacAddress getTargetMacForTargetIp(Ip4Address targetIp) { | ||
127 | + OpenstackPort port = openstackService.ports().stream() | ||
128 | + .filter(p -> p.deviceOwner().equals(NETWORK_ROUTER_GATEWAY)) | ||
129 | + .filter(p -> p.fixedIps().containsValue(targetIp.getIp4Address())) | ||
130 | + .findAny().orElse(null); | ||
131 | + | ||
132 | + if (port == null) { | ||
133 | + return MacAddress.NONE; | ||
134 | + } | ||
135 | + return port.macAddress(); | ||
136 | + } | ||
137 | +} |
1 | +/* | ||
2 | + * Copyright 2016 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.core.ApplicationId; | ||
19 | +import org.onosproject.net.config.Config; | ||
20 | +import org.slf4j.Logger; | ||
21 | + | ||
22 | +import static org.slf4j.LoggerFactory.getLogger; | ||
23 | + | ||
24 | +/** | ||
25 | + * Configuration object for OpenstackRouting service. | ||
26 | + */ | ||
27 | +public class OpenstackRoutingConfig extends Config<ApplicationId> { | ||
28 | + protected final Logger log = getLogger(getClass()); | ||
29 | + | ||
30 | + public static final String PHYSICAL_ROUTER_MAC = "physicalRouterMac"; | ||
31 | + public static final String GATEWAY_BRIDGE_ID = "gatewayBridgeId"; | ||
32 | + public static final String GATEWAY_EXTERNAL_INTERFACE_NAME = "gatewayExternalInterfaceName"; | ||
33 | + public static final String GATEWAY_EXTERNAL_INTERFACE_MAC = "gatewayExternalInterfaceMac"; | ||
34 | + | ||
35 | + /** | ||
36 | + * Returns physical router mac. | ||
37 | + * | ||
38 | + * @return physical router mac | ||
39 | + */ | ||
40 | + public String physicalRouterMac() { | ||
41 | + return this.get("physicalRouterMac", ""); | ||
42 | + } | ||
43 | + | ||
44 | + /** | ||
45 | + * Returns gateway's bridge id. | ||
46 | + * | ||
47 | + * @return bridge id | ||
48 | + */ | ||
49 | + public String gatewayBridgeId() { | ||
50 | + return this.get("gatewayBridgeId", ""); | ||
51 | + } | ||
52 | + | ||
53 | + /** | ||
54 | + * Returns gateway's external interface name. | ||
55 | + * | ||
56 | + * @return external interface name | ||
57 | + */ | ||
58 | + public String gatewayExternalInterfaceName() { | ||
59 | + return this.get("gatewayExternalInterfaceName", ""); | ||
60 | + } | ||
61 | + | ||
62 | + /** | ||
63 | + * Returns gateway's external interface mac. | ||
64 | + * | ||
65 | + * @return external interface mac | ||
66 | + */ | ||
67 | + public String gatewayExternalInterfaceMac() { | ||
68 | + return this.get("gatewayExternalInterfaceMac", ""); | ||
69 | + } | ||
70 | +} |
This diff is collapsed. Click to expand it.
... | @@ -71,6 +71,7 @@ public class OpenstackRoutingRulePopulator { | ... | @@ -71,6 +71,7 @@ public class OpenstackRoutingRulePopulator { |
71 | private final OpenstackInterfaceService openstackService; | 71 | private final OpenstackInterfaceService openstackService; |
72 | private final DeviceService deviceService; | 72 | private final DeviceService deviceService; |
73 | private final DriverService driverService; | 73 | private final DriverService driverService; |
74 | + private final OpenstackRoutingConfig config; | ||
74 | 75 | ||
75 | private static final String PORTNAME_PREFIX_VM = "tap"; | 76 | private static final String PORTNAME_PREFIX_VM = "tap"; |
76 | private static final String PORTNAME_PREFIX_ROUTER = "qr"; | 77 | private static final String PORTNAME_PREFIX_ROUTER = "qr"; |
... | @@ -93,9 +94,6 @@ public class OpenstackRoutingRulePopulator { | ... | @@ -93,9 +94,6 @@ public class OpenstackRoutingRulePopulator { |
93 | private OpenstackRouter router; | 94 | private OpenstackRouter router; |
94 | private OpenstackRouterInterface routerInterface; | 95 | private OpenstackRouterInterface routerInterface; |
95 | 96 | ||
96 | - // TODO: This will be replaced to get the information from openstackswitchingservice. | ||
97 | - private static final String EXTERNAL_INTERFACE_NAME = "veth0"; | ||
98 | - | ||
99 | /** | 97 | /** |
100 | * The constructor of openstackRoutingRulePopulator. | 98 | * The constructor of openstackRoutingRulePopulator. |
101 | * | 99 | * |
... | @@ -104,20 +102,23 @@ public class OpenstackRoutingRulePopulator { | ... | @@ -104,20 +102,23 @@ public class OpenstackRoutingRulePopulator { |
104 | * @param flowObjectiveService FlowObjectiveService | 102 | * @param flowObjectiveService FlowObjectiveService |
105 | * @param deviceService DeviceService | 103 | * @param deviceService DeviceService |
106 | * @param driverService DriverService | 104 | * @param driverService DriverService |
105 | + * @param config OpenstackRoutingConfig | ||
107 | */ | 106 | */ |
108 | public OpenstackRoutingRulePopulator(ApplicationId appId, OpenstackInterfaceService openstackService, | 107 | public OpenstackRoutingRulePopulator(ApplicationId appId, OpenstackInterfaceService openstackService, |
109 | - FlowObjectiveService flowObjectiveService, | 108 | + FlowObjectiveService flowObjectiveService, DeviceService deviceService, |
110 | - DeviceService deviceService, DriverService driverService) { | 109 | + DriverService driverService, OpenstackRoutingConfig config) { |
111 | this.appId = appId; | 110 | this.appId = appId; |
112 | this.flowObjectiveService = flowObjectiveService; | 111 | this.flowObjectiveService = flowObjectiveService; |
113 | - this.openstackService = openstackService; | 112 | + this.openstackService = checkNotNull(openstackService); |
114 | this.deviceService = deviceService; | 113 | this.deviceService = deviceService; |
115 | this.driverService = driverService; | 114 | this.driverService = driverService; |
115 | + this.config = config; | ||
116 | } | 116 | } |
117 | 117 | ||
118 | /** | 118 | /** |
119 | * Populates flow rules for Pnat configurations. | 119 | * Populates flow rules for Pnat configurations. |
120 | - * @param inboundPacket Packet-in event packet | 120 | + * |
121 | + * @param inboundPacket Packet-in event packet | ||
121 | * @param openstackPort Target VM information | 122 | * @param openstackPort Target VM information |
122 | * @param portNum Pnat port number | 123 | * @param portNum Pnat port number |
123 | * @param externalIp external ip address | 124 | * @param externalIp external ip address |
... | @@ -168,6 +169,7 @@ public class OpenstackRoutingRulePopulator { | ... | @@ -168,6 +169,7 @@ public class OpenstackRoutingRulePopulator { |
168 | tBuilder.setUdpSrc(TpPort.tpPort(portNum)); | 169 | tBuilder.setUdpSrc(TpPort.tpPort(portNum)); |
169 | break; | 170 | break; |
170 | default: | 171 | default: |
172 | + log.debug("Unsupported IPv4 protocol {}"); | ||
171 | break; | 173 | break; |
172 | } | 174 | } |
173 | 175 | ||
... | @@ -188,7 +190,7 @@ public class OpenstackRoutingRulePopulator { | ... | @@ -188,7 +190,7 @@ public class OpenstackRoutingRulePopulator { |
188 | 190 | ||
189 | private Port getPortNumOfExternalInterface() { | 191 | private Port getPortNumOfExternalInterface() { |
190 | return deviceService.getPorts(inboundPacket.receivedFrom().deviceId()).stream() | 192 | return deviceService.getPorts(inboundPacket.receivedFrom().deviceId()).stream() |
191 | - .filter(p -> p.annotations().value(PORTNAME).equals(EXTERNAL_INTERFACE_NAME)) | 193 | + .filter(p -> p.annotations().value(PORTNAME).equals(config.gatewayExternalInterfaceName())) |
192 | .findAny().orElse(null); | 194 | .findAny().orElse(null); |
193 | } | 195 | } |
194 | 196 | ||
... | @@ -239,7 +241,15 @@ public class OpenstackRoutingRulePopulator { | ... | @@ -239,7 +241,15 @@ public class OpenstackRoutingRulePopulator { |
239 | flowObjectiveService.forward(inboundPacket.receivedFrom().deviceId(), fo); | 241 | flowObjectiveService.forward(inboundPacket.receivedFrom().deviceId(), fo); |
240 | } | 242 | } |
241 | 243 | ||
242 | - private ExtensionTreatment buildNiciraExtenstion(DeviceId id, Ip4Address hostIp) { | 244 | + /** |
245 | + * Returns NiciraExtension treatment. | ||
246 | + * | ||
247 | + * @param id device id | ||
248 | + * @param hostIp host ip | ||
249 | + * @return NiciraExtension treatment | ||
250 | + */ | ||
251 | + | ||
252 | + public ExtensionTreatment buildNiciraExtenstion(DeviceId id, Ip4Address hostIp) { | ||
243 | Driver driver = driverService.getDriver(id); | 253 | Driver driver = driverService.getDriver(id); |
244 | DriverHandler driverHandler = new DefaultDriverHandler(new DefaultDriverData(driver, id)); | 254 | DriverHandler driverHandler = new DefaultDriverHandler(new DefaultDriverData(driver, id)); |
245 | ExtensionTreatmentResolver resolver = driverHandler.behaviour(ExtensionTreatmentResolver.class); | 255 | ExtensionTreatmentResolver resolver = driverHandler.behaviour(ExtensionTreatmentResolver.class); |
... | @@ -257,7 +267,13 @@ public class OpenstackRoutingRulePopulator { | ... | @@ -257,7 +267,13 @@ public class OpenstackRoutingRulePopulator { |
257 | return extensionInstruction; | 267 | return extensionInstruction; |
258 | } | 268 | } |
259 | 269 | ||
260 | - private PortNumber getTunnelPort(DeviceId deviceId) { | 270 | + /** |
271 | + * Returns port number of vxlan tunnel. | ||
272 | + * | ||
273 | + * @param deviceId device id | ||
274 | + * @return port number of vxlan tunnel | ||
275 | + */ | ||
276 | + public PortNumber getTunnelPort(DeviceId deviceId) { | ||
261 | Port port = deviceService.getPorts(deviceId).stream() | 277 | Port port = deviceService.getPorts(deviceId).stream() |
262 | .filter(p -> p.annotations().value(PORTNAME).equals(PORTNAME_PREFIX_TUNNEL)) | 278 | .filter(p -> p.annotations().value(PORTNAME).equals(PORTNAME_PREFIX_TUNNEL)) |
263 | .findAny().orElse(null); | 279 | .findAny().orElse(null); |
... | @@ -343,16 +359,11 @@ public class OpenstackRoutingRulePopulator { | ... | @@ -343,16 +359,11 @@ public class OpenstackRoutingRulePopulator { |
343 | } | 359 | } |
344 | 360 | ||
345 | private Device getGatewayNode() { | 361 | private Device getGatewayNode() { |
346 | - return checkNotNull(StreamSupport.stream(deviceService.getAvailableDevices().spliterator(), false) | 362 | + return checkNotNull(deviceService.getDevice(DeviceId.deviceId(config.gatewayBridgeId()))); |
347 | - .filter(d -> checkGatewayNode(d.id())) | ||
348 | - .findAny() | ||
349 | - .orElse(null)); | ||
350 | } | 363 | } |
351 | 364 | ||
352 | private boolean checkGatewayNode(DeviceId deviceId) { | 365 | private boolean checkGatewayNode(DeviceId deviceId) { |
353 | - return !deviceService.getPorts(deviceId).stream().anyMatch(port -> | 366 | + return deviceId.toString().equals(config.gatewayBridgeId()); |
354 | - port.annotations().value(PORTNAME).startsWith(PORTNAME_PREFIX_ROUTER) || | ||
355 | - port.annotations().value(PORTNAME).startsWith(PORTNAME_PREFIX_VM)); | ||
356 | } | 367 | } |
357 | 368 | ||
358 | private long getVni(OpenstackPort openstackPort) { | 369 | private long getVni(OpenstackPort openstackPort) { | ... | ... |
... | @@ -94,6 +94,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -94,6 +94,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
94 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 94 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
95 | protected DriverService driverService; | 95 | protected DriverService driverService; |
96 | 96 | ||
97 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
97 | protected OpenstackInterfaceService openstackService; | 98 | protected OpenstackInterfaceService openstackService; |
98 | 99 | ||
99 | public static final String PORTNAME_PREFIX_VM = "tap"; | 100 | public static final String PORTNAME_PREFIX_VM = "tap"; |
... | @@ -126,6 +127,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -126,6 +127,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
126 | packetService.addProcessor(internalPacketProcessor, PacketProcessor.director(1)); | 127 | packetService.addProcessor(internalPacketProcessor, PacketProcessor.director(1)); |
127 | deviceService.addListener(internalDeviceListener); | 128 | deviceService.addListener(internalDeviceListener); |
128 | hostService.addListener(internalHostListener); | 129 | hostService.addListener(internalHostListener); |
130 | + arpHandler = new OpenstackArpHandler(openstackService, packetService, hostService); | ||
129 | 131 | ||
130 | arpHandler = new OpenstackArpHandler(openstackService, packetService, hostService); | 132 | arpHandler = new OpenstackArpHandler(openstackService, packetService, hostService); |
131 | sgRulePopulator = new OpenstackSecurityGroupRulePopulator(appId, openstackService, flowObjectiveService); | 133 | sgRulePopulator = new OpenstackSecurityGroupRulePopulator(appId, openstackService, flowObjectiveService); |
... | @@ -204,10 +206,12 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -204,10 +206,12 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
204 | 206 | ||
205 | @Override | 207 | @Override |
206 | public void createNetwork(OpenstackNetwork openstackNetwork) { | 208 | public void createNetwork(OpenstackNetwork openstackNetwork) { |
209 | + //TODO | ||
207 | } | 210 | } |
208 | 211 | ||
209 | @Override | 212 | @Override |
210 | public void createSubnet(OpenstackSubnet openstackSubnet) { | 213 | public void createSubnet(OpenstackSubnet openstackSubnet) { |
214 | + //TODO | ||
211 | } | 215 | } |
212 | 216 | ||
213 | @Override | 217 | @Override |
... | @@ -296,9 +300,17 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -296,9 +300,17 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
296 | 300 | ||
297 | private void updatePortMap(DeviceId deviceId, String portName, Collection<OpenstackNetwork> networks, | 301 | private void updatePortMap(DeviceId deviceId, String portName, Collection<OpenstackNetwork> networks, |
298 | Collection<OpenstackSubnet> subnets, OpenstackPort openstackPort) { | 302 | Collection<OpenstackSubnet> subnets, OpenstackPort openstackPort) { |
299 | - long vni = Long.parseLong(networks.stream() | 303 | + long vni; |
304 | + OpenstackNetwork openstackNetwork = networks.stream() | ||
300 | .filter(n -> n.id().equals(openstackPort.networkId())) | 305 | .filter(n -> n.id().equals(openstackPort.networkId())) |
301 | - .findAny().orElse(null).segmentId()); | 306 | + .findAny().orElse(null); |
307 | + if (openstackNetwork != null) { | ||
308 | + vni = Long.parseLong(openstackNetwork.segmentId()); | ||
309 | + } else { | ||
310 | + log.debug("updatePortMap failed because there's no OpenstackNetwork matches {}", openstackPort.networkId()); | ||
311 | + return; | ||
312 | + } | ||
313 | + | ||
302 | 314 | ||
303 | OpenstackSubnet openstackSubnet = subnets.stream() | 315 | OpenstackSubnet openstackSubnet = subnets.stream() |
304 | .filter(n -> n.networkId().equals(openstackPort.networkId())) | 316 | .filter(n -> n.networkId().equals(openstackPort.networkId())) |
... | @@ -312,6 +324,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -312,6 +324,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
312 | .setHostMac(openstackPort.macAddress()) | 324 | .setHostMac(openstackPort.macAddress()) |
313 | .setVni(vni) | 325 | .setVni(vni) |
314 | .setGatewayIP(gatewayIPAddress) | 326 | .setGatewayIP(gatewayIPAddress) |
327 | + .setNetworkId(openstackPort.networkId()) | ||
315 | .setSecurityGroups(openstackPort.securityGroups()); | 328 | .setSecurityGroups(openstackPort.securityGroups()); |
316 | 329 | ||
317 | openstackPortInfoMap.put(portName, portBuilder.build()); | 330 | openstackPortInfoMap.put(portName, portBuilder.build()); |
... | @@ -321,7 +334,6 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -321,7 +334,6 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
321 | securityGroupMap.put(sgId, openstackService.getSecurityGroup(sgId)); | 334 | securityGroupMap.put(sgId, openstackService.getSecurityGroup(sgId)); |
322 | } | 335 | } |
323 | }); | 336 | }); |
324 | - | ||
325 | } | 337 | } |
326 | 338 | ||
327 | private void processHostRemoved(Host host) { | 339 | private void processHostRemoved(Host host) { |
... | @@ -440,6 +452,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -440,6 +452,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
440 | processPortRemoved((Device) deviceEvent.subject(), deviceEvent.port()); | 452 | processPortRemoved((Device) deviceEvent.subject(), deviceEvent.port()); |
441 | break; | 453 | break; |
442 | default: | 454 | default: |
455 | + log.debug("Unsupported deviceEvent type {}", deviceEvent.type().toString()); | ||
443 | break; | 456 | break; |
444 | } | 457 | } |
445 | } else if (event instanceof HostEvent) { | 458 | } else if (event instanceof HostEvent) { |
... | @@ -450,6 +463,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -450,6 +463,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
450 | processHostRemoved((Host) hostEvent.subject()); | 463 | processHostRemoved((Host) hostEvent.subject()); |
451 | break; | 464 | break; |
452 | default: | 465 | default: |
466 | + log.debug("Unsupported hostEvent type {}", hostEvent.type().toString()); | ||
453 | break; | 467 | break; |
454 | } | 468 | } |
455 | } | 469 | } | ... | ... |
-
Please register or login to post a comment