Daniel Park
Committed by Gerrit Code Review

[ONOS-3948] Seperate mgmt and data network in OpenstackSwitching/RoutingService

- Supports the seperation of management and data network

Change-Id: I178dbe2af241123c5181f94a7b46fc15b4cb37c7
...@@ -15,13 +15,13 @@ ...@@ -15,13 +15,13 @@
15 */ 15 */
16 package org.onosproject.openstackinterface; 16 package org.onosproject.openstackinterface;
17 17
18 +import com.google.common.collect.ImmutableMap;
18 import com.google.common.collect.Maps; 19 import com.google.common.collect.Maps;
19 import org.onlab.packet.Ip4Address; 20 import org.onlab.packet.Ip4Address;
20 import org.onlab.packet.IpAddress; 21 import org.onlab.packet.IpAddress;
21 import org.onlab.packet.MacAddress; 22 import org.onlab.packet.MacAddress;
22 23
23 import java.util.Collection; 24 import java.util.Collection;
24 -import java.util.HashMap;
25 import java.util.Map; 25 import java.util.Map;
26 26
27 import static com.google.common.base.Preconditions.checkNotNull; 27 import static com.google.common.base.Preconditions.checkNotNull;
...@@ -40,31 +40,31 @@ public final class OpenstackPort { ...@@ -40,31 +40,31 @@ public final class OpenstackPort {
40 40
41 private PortStatus status; 41 private PortStatus status;
42 private String name; 42 private String name;
43 - private Map<IpAddress, MacAddress> allowedAddressPairs; 43 + private ImmutableMap<IpAddress, MacAddress> allowedAddressPairs;
44 private boolean adminStateUp; 44 private boolean adminStateUp;
45 private String networkId; 45 private String networkId;
46 private String tenantId; 46 private String tenantId;
47 private String deviceOwner; 47 private String deviceOwner;
48 private MacAddress macAddress; 48 private MacAddress macAddress;
49 // <subnet id, ip address> 49 // <subnet id, ip address>
50 - private HashMap<String, Ip4Address> fixedIps; 50 + private ImmutableMap<String, Ip4Address> fixedIps;
51 private String id; 51 private String id;
52 private Collection<String> securityGroups; 52 private Collection<String> securityGroups;
53 private String deviceId; 53 private String deviceId;
54 54
55 private OpenstackPort(PortStatus status, String name, Map<IpAddress, MacAddress> allowedAddressPairs, 55 private OpenstackPort(PortStatus status, String name, Map<IpAddress, MacAddress> allowedAddressPairs,
56 boolean adminStateUp, String networkId, String tenantId, 56 boolean adminStateUp, String networkId, String tenantId,
57 - String deviceOwner, MacAddress macAddress, HashMap fixedIps, 57 + String deviceOwner, MacAddress macAddress, Map<String, Ip4Address> fixedIps,
58 String id, Collection<String> securityGroups, String deviceId) { 58 String id, Collection<String> securityGroups, String deviceId) {
59 this.status = status; 59 this.status = status;
60 this.name = name; 60 this.name = name;
61 - this.allowedAddressPairs = checkNotNull(allowedAddressPairs); 61 + this.allowedAddressPairs = checkNotNull(ImmutableMap.copyOf(allowedAddressPairs));
62 this.adminStateUp = adminStateUp; 62 this.adminStateUp = adminStateUp;
63 this.networkId = checkNotNull(networkId); 63 this.networkId = checkNotNull(networkId);
64 this.tenantId = checkNotNull(tenantId); 64 this.tenantId = checkNotNull(tenantId);
65 this.deviceOwner = deviceOwner; 65 this.deviceOwner = deviceOwner;
66 this.macAddress = checkNotNull(macAddress); 66 this.macAddress = checkNotNull(macAddress);
67 - this.fixedIps = checkNotNull(fixedIps); 67 + this.fixedIps = checkNotNull(ImmutableMap.copyOf(fixedIps));
68 this.id = checkNotNull(id); 68 this.id = checkNotNull(id);
69 this.securityGroups = securityGroups; 69 this.securityGroups = securityGroups;
70 this.deviceId = deviceId; 70 this.deviceId = deviceId;
...@@ -149,7 +149,7 @@ public final class OpenstackPort { ...@@ -149,7 +149,7 @@ public final class OpenstackPort {
149 * 149 *
150 * @return fixed IP info 150 * @return fixed IP info
151 */ 151 */
152 - public HashMap fixedIps() { 152 + public Map<String, Ip4Address> fixedIps() {
153 return fixedIps; 153 return fixedIps;
154 } 154 }
155 155
...@@ -194,7 +194,7 @@ public final class OpenstackPort { ...@@ -194,7 +194,7 @@ public final class OpenstackPort {
194 private String deviceOwner; 194 private String deviceOwner;
195 private MacAddress macAddress; 195 private MacAddress macAddress;
196 // list of hash map <subnet id, ip address> 196 // list of hash map <subnet id, ip address>
197 - private HashMap<String, Ip4Address> fixedIps; 197 + private Map<String, Ip4Address> fixedIps;
198 private String id; 198 private String id;
199 private Collection<String> securityGroups; 199 private Collection<String> securityGroups;
200 private String deviceId; 200 private String deviceId;
...@@ -305,7 +305,7 @@ public final class OpenstackPort { ...@@ -305,7 +305,7 @@ public final class OpenstackPort {
305 * @param fixedIpList Fixed IP info 305 * @param fixedIpList Fixed IP info
306 * @return Builder object 306 * @return Builder object
307 */ 307 */
308 - public Builder fixedIps(HashMap<String, Ip4Address> fixedIpList) { 308 + public Builder fixedIps(Map<String, Ip4Address> fixedIpList) {
309 fixedIps.putAll(fixedIpList); 309 fixedIps.putAll(fixedIpList);
310 310
311 return this; 311 return this;
......
...@@ -30,7 +30,6 @@ import org.slf4j.Logger; ...@@ -30,7 +30,6 @@ import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory; 30 import org.slf4j.LoggerFactory;
31 31
32 import java.util.Collection; 32 import java.util.Collection;
33 -import java.util.HashMap;
34 import java.util.Map; 33 import java.util.Map;
35 34
36 import static com.google.common.base.Preconditions.checkNotNull; 35 import static com.google.common.base.Preconditions.checkNotNull;
...@@ -64,7 +63,7 @@ public class OpenstackPortCodec extends JsonCodec<OpenstackPort> { ...@@ -64,7 +63,7 @@ public class OpenstackPortCodec extends JsonCodec<OpenstackPort> {
64 public OpenstackPort decode(ObjectNode json, CodecContext context) { 63 public OpenstackPort decode(ObjectNode json, CodecContext context) {
65 64
66 checkNotNull(json); 65 checkNotNull(json);
67 - HashMap<String, Ip4Address> fixedIpMap = new HashMap<>(); 66 + Map<String, Ip4Address> fixedIpMap = Maps.newHashMap();
68 JsonNode portInfo = json.get(PORT); 67 JsonNode portInfo = json.get(PORT);
69 if (portInfo == null) { 68 if (portInfo == null) {
70 portInfo = json; 69 portInfo = json;
......
...@@ -2,10 +2,42 @@ ...@@ -2,10 +2,42 @@
2 "apps" : { 2 "apps" : {
3 "org.onosproject.openstackrouting" : { 3 "org.onosproject.openstackrouting" : {
4 "openstackrouting" : { 4 "openstackrouting" : {
5 - "physicalRouterMac" : "2a:a1:8a:89:dd:a4", 5 + "physicalRouterMac" : "36:e3:f7:7b:cc:52",
6 "gatewayBridgeId" : "of:0000000000000003", 6 "gatewayBridgeId" : "of:0000000000000003",
7 "gatewayExternalInterfaceName" : "veth0", 7 "gatewayExternalInterfaceName" : "veth0",
8 - "gatewayExternalInterfaceMac" : "be:15:c6:b0:df:9f" 8 + "gatewayExternalInterfaceMac" : "96:87:bc:64:99:ad",
9 + "nodes" : [
10 + {
11 + "dataPlaneIp" : "192.168.57.103",
12 + "bridgeId" : "of:0000000000000001"
13 + },
14 + {
15 + "dataPlaneIp" : "192.168.57.104",
16 + "bridgeId" : "of:0000000000000002"
17 + },
18 + {
19 + "dataPlaneIp" : "192.168.57.105",
20 + "bridgeId" : "of:0000000000000003"
21 + }
22 + ]
23 + }
24 + },
25 + "org.onosproject.openstackswitching" : {
26 + "openstackswitching" : {
27 + "nodes" : [
28 + {
29 + "dataPlaneIp" : "192.168.57.103",
30 + "bridgeId" : "of:0000000000000001"
31 + },
32 + {
33 + "dataPlaneIp" : "192.168.57.104",
34 + "bridgeId" : "of:0000000000000002"
35 + },
36 + {
37 + "dataPlaneIp" : "192.168.57.105",
38 + "bridgeId" : "of:0000000000000003"
39 + }
40 + ]
9 } 41 }
10 }, 42 },
11 "org.onosproject.openstacknode" : { 43 "org.onosproject.openstacknode" : {
...@@ -13,14 +45,14 @@ ...@@ -13,14 +45,14 @@
13 "nodes" : [ 45 "nodes" : [
14 { 46 {
15 "hostname" : "compute-01", 47 "hostname" : "compute-01",
16 - "ovsdbIp" : "192.168.56.112", 48 + "ovsdbIp" : "192.168.56.121",
17 "ovsdbPort" : "6640", 49 "ovsdbPort" : "6640",
18 "bridgeId" : "of:0000000000000001", 50 "bridgeId" : "of:0000000000000001",
19 "openstackNodeType" : "COMPUTENODE" 51 "openstackNodeType" : "COMPUTENODE"
20 }, 52 },
21 { 53 {
22 "hostname" : "compute-02", 54 "hostname" : "compute-02",
23 - "ovsdbIp" : "192.168.56.113", 55 + "ovsdbIp" : "192.168.56.122",
24 "ovsdbPort" : "6640", 56 "ovsdbPort" : "6640",
25 "bridgeId" : "of:0000000000000002", 57 "bridgeId" : "of:0000000000000002",
26 "openstackNodeType" : "COMPUTENODE" 58 "openstackNodeType" : "COMPUTENODE"
...@@ -32,17 +64,17 @@ ...@@ -32,17 +64,17 @@
32 "bridgeId" : "of:0000000000000003", 64 "bridgeId" : "of:0000000000000003",
33 "openstackNodeType" : "GATEWAYNODE", 65 "openstackNodeType" : "GATEWAYNODE",
34 "gatewayExternalInterfaceName" : "veth0", 66 "gatewayExternalInterfaceName" : "veth0",
35 - "gatewayExternalInterfaceMac" : "be:15:c6:b0:df:9f" 67 + "gatewayExternalInterfaceMac" : "96:87:bc:64:99:ad"
36 } 68 }
37 ] 69 ]
38 } 70 }
39 }, 71 },
40 "org.onosproject.openstackinterface" : { 72 "org.onosproject.openstackinterface" : {
41 "openstackinterface" : { 73 "openstackinterface" : {
42 - "neutron_server" : "http://192.168.56.111:9696/v2.0/", 74 + "neutron_server" : "http://192.168.56.118:9696/v2.0/",
43 - "keystone_server" : "http://192.168.56.111:5000/v2.0/", 75 + "keystone_server" : "http://192.168.56.118:5000/v2.0/",
44 "user_name" : "admin", 76 "user_name" : "admin",
45 - "password" : "nova" 77 + "password" : "rocks"
46 } 78 }
47 } 79 }
48 }, 80 },
......
...@@ -15,10 +15,16 @@ ...@@ -15,10 +15,16 @@
15 */ 15 */
16 package org.onosproject.openstacknetworking.routing; 16 package org.onosproject.openstacknetworking.routing;
17 17
18 +import com.fasterxml.jackson.databind.JsonNode;
19 +import com.google.common.collect.Maps;
20 +import org.onlab.packet.Ip4Address;
18 import org.onosproject.core.ApplicationId; 21 import org.onosproject.core.ApplicationId;
22 +import org.onosproject.net.DeviceId;
19 import org.onosproject.net.config.Config; 23 import org.onosproject.net.config.Config;
20 import org.slf4j.Logger; 24 import org.slf4j.Logger;
21 25
26 +import java.util.Map;
27 +
22 import static org.slf4j.LoggerFactory.getLogger; 28 import static org.slf4j.LoggerFactory.getLogger;
23 29
24 /** 30 /**
...@@ -31,6 +37,35 @@ public class OpenstackRoutingConfig extends Config<ApplicationId> { ...@@ -31,6 +37,35 @@ public class OpenstackRoutingConfig extends Config<ApplicationId> {
31 public static final String GATEWAY_BRIDGE_ID = "gatewayBridgeId"; 37 public static final String GATEWAY_BRIDGE_ID = "gatewayBridgeId";
32 public static final String GATEWAY_EXTERNAL_INTERFACE_NAME = "gatewayExternalInterfaceName"; 38 public static final String GATEWAY_EXTERNAL_INTERFACE_NAME = "gatewayExternalInterfaceName";
33 public static final String GATEWAY_EXTERNAL_INTERFACE_MAC = "gatewayExternalInterfaceMac"; 39 public static final String GATEWAY_EXTERNAL_INTERFACE_MAC = "gatewayExternalInterfaceMac";
40 + public static final String NODES = "nodes";
41 + public static final String DATAPLANE_IP = "dataPlaneIp";
42 + public static final String BRIDGE_ID = "bridgeId";
43 +
44 +
45 + /**
46 + * Returns the data plane IP map of nodes read from network config.
47 + *
48 + * @return data plane IP map
49 + */
50 + public Map<DeviceId, Ip4Address> nodes() {
51 + Map<DeviceId, Ip4Address> nodeMap = Maps.newHashMap();
52 +
53 + JsonNode jsonNodes = object.get(NODES);
54 + if (jsonNodes == null) {
55 + log.error("There's no node information");
56 + return null;
57 + }
58 +
59 + jsonNodes.forEach(jsonNode -> {
60 + try {
61 + nodeMap.putIfAbsent(DeviceId.deviceId(jsonNode.path(BRIDGE_ID).asText()),
62 + Ip4Address.valueOf(jsonNode.path(DATAPLANE_IP).asText()));
63 + } catch (IllegalArgumentException | NullPointerException e) {
64 + log.error("Failed to read {}", e.toString());
65 + }
66 + });
67 + return nodeMap;
68 + }
34 69
35 /** 70 /**
36 * Returns physical router mac. 71 * Returns physical router mac.
...@@ -38,7 +73,7 @@ public class OpenstackRoutingConfig extends Config<ApplicationId> { ...@@ -38,7 +73,7 @@ public class OpenstackRoutingConfig extends Config<ApplicationId> {
38 * @return physical router mac 73 * @return physical router mac
39 */ 74 */
40 public String physicalRouterMac() { 75 public String physicalRouterMac() {
41 - return this.get("physicalRouterMac", ""); 76 + return this.get(PHYSICAL_ROUTER_MAC, "");
42 } 77 }
43 78
44 /** 79 /**
...@@ -47,7 +82,7 @@ public class OpenstackRoutingConfig extends Config<ApplicationId> { ...@@ -47,7 +82,7 @@ public class OpenstackRoutingConfig extends Config<ApplicationId> {
47 * @return bridge id 82 * @return bridge id
48 */ 83 */
49 public String gatewayBridgeId() { 84 public String gatewayBridgeId() {
50 - return this.get("gatewayBridgeId", ""); 85 + return this.get(GATEWAY_BRIDGE_ID, "");
51 } 86 }
52 87
53 /** 88 /**
...@@ -56,7 +91,7 @@ public class OpenstackRoutingConfig extends Config<ApplicationId> { ...@@ -56,7 +91,7 @@ public class OpenstackRoutingConfig extends Config<ApplicationId> {
56 * @return external interface name 91 * @return external interface name
57 */ 92 */
58 public String gatewayExternalInterfaceName() { 93 public String gatewayExternalInterfaceName() {
59 - return this.get("gatewayExternalInterfaceName", ""); 94 + return this.get(GATEWAY_EXTERNAL_INTERFACE_NAME, "");
60 } 95 }
61 96
62 /** 97 /**
...@@ -65,6 +100,6 @@ public class OpenstackRoutingConfig extends Config<ApplicationId> { ...@@ -65,6 +100,6 @@ public class OpenstackRoutingConfig extends Config<ApplicationId> {
65 * @return external interface mac 100 * @return external interface mac
66 */ 101 */
67 public String gatewayExternalInterfaceMac() { 102 public String gatewayExternalInterfaceMac() {
68 - return this.get("gatewayExternalInterfaceMac", ""); 103 + return this.get(GATEWAY_EXTERNAL_INTERFACE_MAC, "");
69 } 104 }
70 } 105 }
......
...@@ -62,6 +62,8 @@ import org.slf4j.LoggerFactory; ...@@ -62,6 +62,8 @@ import org.slf4j.LoggerFactory;
62 62
63 import java.util.Collection; 63 import java.util.Collection;
64 import java.util.List; 64 import java.util.List;
65 +import java.util.Map;
66 +import java.util.Optional;
65 import java.util.concurrent.ExecutorService; 67 import java.util.concurrent.ExecutorService;
66 import java.util.concurrent.Executors; 68 import java.util.concurrent.Executors;
67 import java.util.stream.Collectors; 69 import java.util.stream.Collectors;
...@@ -108,6 +110,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { ...@@ -108,6 +110,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService {
108 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 110 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
109 protected StorageService storageService; 111 protected StorageService storageService;
110 112
113 +
111 private ApplicationId appId; 114 private ApplicationId appId;
112 private ConsistentMap<Integer, String> tpPortNumMap; // Map<PortNum, allocated VM`s Mac & destionation Ip address> 115 private ConsistentMap<Integer, String> tpPortNumMap; // Map<PortNum, allocated VM`s Mac & destionation Ip address>
113 private ConsistentMap<String, OpenstackFloatingIP> floatingIpMap; // Map<FloatingIp`s Id, FloatingIp object> 116 private ConsistentMap<String, OpenstackFloatingIP> floatingIpMap; // Map<FloatingIp`s Id, FloatingIp object>
...@@ -117,6 +120,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { ...@@ -117,6 +120,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService {
117 private static final String DEVICE_OWNER_ROUTER_INTERFACE = "network:router_interface"; 120 private static final String DEVICE_OWNER_ROUTER_INTERFACE = "network:router_interface";
118 private static final String FLOATING_IP_MAP_NAME = "openstackrouting-floatingip"; 121 private static final String FLOATING_IP_MAP_NAME = "openstackrouting-floatingip";
119 private static final String TP_PORT_MAP_NAME = "openstackrouting-portnum"; 122 private static final String TP_PORT_MAP_NAME = "openstackrouting-portnum";
123 + private static final String COLON = ":";
120 private static final int PNAT_PORT_EXPIRE_TIME = 1200 * 1000; 124 private static final int PNAT_PORT_EXPIRE_TIME = 1200 * 1000;
121 private static final int TP_PORT_MINIMUM_NUM = 1024; 125 private static final int TP_PORT_MINIMUM_NUM = 1024;
122 private static final int TP_PORT_MAXIMUM_NUM = 65535; 126 private static final int TP_PORT_MAXIMUM_NUM = 65535;
...@@ -154,6 +158,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { ...@@ -154,6 +158,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService {
154 private OpenstackIcmpHandler openstackIcmpHandler; 158 private OpenstackIcmpHandler openstackIcmpHandler;
155 private OpenstackRoutingArpHandler openstackArpHandler; 159 private OpenstackRoutingArpHandler openstackArpHandler;
156 private OpenstackRoutingRulePopulator rulePopulator; 160 private OpenstackRoutingRulePopulator rulePopulator;
161 + private Map<DeviceId, Ip4Address> computeNodeMap;
157 162
158 @Activate 163 @Activate
159 protected void activate() { 164 protected void activate() {
...@@ -314,7 +319,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { ...@@ -314,7 +319,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService {
314 } 319 }
315 320
316 private void reloadInitL3Rules() { 321 private void reloadInitL3Rules() {
317 - l3EventExecutorService.submit(() -> 322 + l3EventExecutorService.execute(() ->
318 openstackService.ports() 323 openstackService.ports()
319 .stream() 324 .stream()
320 .filter(p -> p.deviceOwner().equals(DEVICE_OWNER_ROUTER_INTERFACE)) 325 .filter(p -> p.deviceOwner().equals(DEVICE_OWNER_ROUTER_INTERFACE))
...@@ -359,7 +364,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { ...@@ -359,7 +364,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService {
359 switch (iPacket.getProtocol()) { 364 switch (iPacket.getProtocol()) {
360 case IPv4.PROTOCOL_ICMP: 365 case IPv4.PROTOCOL_ICMP:
361 366
362 - icmpEventExecutorService.submit(() -> 367 + icmpEventExecutorService.execute(() ->
363 openstackIcmpHandler.processIcmpPacket(context, ethernet)); 368 openstackIcmpHandler.processIcmpPacket(context, ethernet));
364 break; 369 break;
365 case IPv4.PROTOCOL_UDP: 370 case IPv4.PROTOCOL_UDP:
...@@ -371,20 +376,21 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { ...@@ -371,20 +376,21 @@ public class OpenstackRoutingManager implements OpenstackRoutingService {
371 } 376 }
372 default: 377 default:
373 int portNum = getPortNum(ethernet.getSourceMAC(), iPacket.getDestinationAddress()); 378 int portNum = getPortNum(ethernet.getSourceMAC(), iPacket.getDestinationAddress());
374 - Port port = 379 + Optional<Port> port =
375 getExternalPort(pkt.receivedFrom().deviceId(), config.gatewayExternalInterfaceName()); 380 getExternalPort(pkt.receivedFrom().deviceId(), config.gatewayExternalInterfaceName());
376 - if (port == null) { 381 +
382 + if (!port.isPresent()) {
377 log.warn("There`s no external interface"); 383 log.warn("There`s no external interface");
378 - break; 384 + } else {
379 - }
380 OpenstackPort openstackPort = getOpenstackPort(ethernet.getSourceMAC(), 385 OpenstackPort openstackPort = getOpenstackPort(ethernet.getSourceMAC(),
381 Ip4Address.valueOf(iPacket.getSourceAddress())); 386 Ip4Address.valueOf(iPacket.getSourceAddress()));
382 l3EventExecutorService.execute(new OpenstackPnatHandler(rulePopulator, context, 387 l3EventExecutorService.execute(new OpenstackPnatHandler(rulePopulator, context,
383 - portNum, openstackPort, port, config)); 388 + portNum, openstackPort, port.get(), config));
389 + }
384 break; 390 break;
385 } 391 }
386 } else if (ethernet.getEtherType() == Ethernet.TYPE_ARP) { 392 } else if (ethernet.getEtherType() == Ethernet.TYPE_ARP) {
387 - arpEventExecutorService.submit(() -> 393 + arpEventExecutorService.execute(() ->
388 openstackArpHandler.processArpPacketFromRouter(context, ethernet)); 394 openstackArpHandler.processArpPacketFromRouter(context, ethernet));
389 } 395 }
390 } 396 }
...@@ -395,7 +401,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { ...@@ -395,7 +401,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService {
395 clearPortNumMap(); 401 clearPortNumMap();
396 portNum = findUnusedPortNum(); 402 portNum = findUnusedPortNum();
397 } 403 }
398 - tpPortNumMap.put(portNum, sourceMac.toString().concat(":").concat(String.valueOf(destinationAddress))); 404 + tpPortNumMap.put(portNum, sourceMac.toString().concat(COLON).concat(String.valueOf(destinationAddress)));
399 return portNum; 405 return portNum;
400 } 406 }
401 407
...@@ -418,12 +424,11 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { ...@@ -418,12 +424,11 @@ public class OpenstackRoutingManager implements OpenstackRoutingService {
418 }); 424 });
419 } 425 }
420 426
421 - private Port getExternalPort(DeviceId deviceId, String interfaceName) { 427 + private Optional<Port> getExternalPort(DeviceId deviceId, String interfaceName) {
422 return deviceService.getPorts(deviceId) 428 return deviceService.getPorts(deviceId)
423 .stream() 429 .stream()
424 .filter(p -> p.annotations().value(PORT_NAME).equals(interfaceName)) 430 .filter(p -> p.annotations().value(PORT_NAME).equals(interfaceName))
425 - .findAny() 431 + .findAny();
426 - .orElse(null);
427 } 432 }
428 433
429 private void checkExternalConnection(OpenstackRouter router, 434 private void checkExternalConnection(OpenstackRouter router,
...@@ -436,33 +441,26 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { ...@@ -436,33 +441,26 @@ public class OpenstackRoutingManager implements OpenstackRoutingService {
436 log.debug("Not satisfied to set pnat configuration"); 441 log.debug("Not satisfied to set pnat configuration");
437 return; 442 return;
438 } 443 }
439 - if (router.id() == null) { 444 + interfaces.forEach(this::initiateL3Rule);
440 - interfaces.forEach(i -> initiateL3Rule(getRouterfromExternalIp(externalIp), i));
441 - } else {
442 - interfaces.forEach(i -> initiateL3Rule(router, i));
443 - }
444 -
445 } 445 }
446 446
447 - private OpenstackRouter getRouterfromExternalIp(Ip4Address externalIp) { 447 + private Optional<OpenstackRouter> getRouterfromExternalIp(Ip4Address externalIp) {
448 - OpenstackRouter router = getExternalRouter(true) 448 + return getExternalRouter(true)
449 .stream() 449 .stream()
450 .filter(r -> r.gatewayExternalInfo() 450 .filter(r -> r.gatewayExternalInfo()
451 .externalFixedIps() 451 .externalFixedIps()
452 .values() 452 .values()
453 .stream() 453 .stream()
454 - .findFirst()
455 - .orElse(null)
456 - .equals(externalIp))
457 .findAny() 454 .findAny()
458 - .orElse(null); 455 + .get()
459 - return checkNotNull(router); 456 + .equals(externalIp))
457 + .findAny();
460 } 458 }
461 459
462 - private void initiateL3Rule(OpenstackRouter router, OpenstackRouterInterface routerInterface) { 460 + private void initiateL3Rule(OpenstackRouterInterface routerInterface) {
463 long vni = Long.parseLong(openstackService.network(openstackService 461 long vni = Long.parseLong(openstackService.network(openstackService
464 .port(routerInterface.portId()).networkId()).segmentId()); 462 .port(routerInterface.portId()).networkId()).segmentId());
465 - rulePopulator.populateExternalRules(vni, router, routerInterface); 463 + rulePopulator.populateExternalRules(vni);
466 } 464 }
467 465
468 private Collection<OpenstackRouterInterface> getOpenstackRouterInterface(OpenstackRouter router) { 466 private Collection<OpenstackRouterInterface> getOpenstackRouterInterface(OpenstackRouter router) {
...@@ -472,8 +470,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { ...@@ -472,8 +470,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService {
472 .filter(p -> p.deviceOwner().equals(DEVICE_OWNER_ROUTER_INTERFACE)) 470 .filter(p -> p.deviceOwner().equals(DEVICE_OWNER_ROUTER_INTERFACE))
473 .filter(p -> p.deviceId().equals(router.id())) 471 .filter(p -> p.deviceId().equals(router.id()))
474 .forEach(p -> { 472 .forEach(p -> {
475 - OpenstackRouterInterface routerInterface = portToRouterInterface(p); 473 + interfaces.add(portToRouterInterface(p));
476 - interfaces.add(routerInterface);
477 }); 474 });
478 return interfaces; 475 return interfaces;
479 } 476 }
...@@ -529,9 +526,6 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { ...@@ -529,9 +526,6 @@ public class OpenstackRoutingManager implements OpenstackRoutingService {
529 if (event.type().equals(NetworkConfigEvent.Type.CONFIG_ADDED) || 526 if (event.type().equals(NetworkConfigEvent.Type.CONFIG_ADDED) ||
530 event.type().equals(NetworkConfigEvent.Type.CONFIG_UPDATED)) { 527 event.type().equals(NetworkConfigEvent.Type.CONFIG_UPDATED)) {
531 l3EventExecutorService.execute(OpenstackRoutingManager.this::readConfiguration); 528 l3EventExecutorService.execute(OpenstackRoutingManager.this::readConfiguration);
532 - rulePopulator = new OpenstackRoutingRulePopulator(appId,
533 - openstackService, flowObjectiveService, deviceService, driverService, config);
534 -
535 } 529 }
536 } 530 }
537 } 531 }
......
...@@ -49,7 +49,6 @@ import org.onosproject.net.flowobjective.ForwardingObjective; ...@@ -49,7 +49,6 @@ import org.onosproject.net.flowobjective.ForwardingObjective;
49 import org.onosproject.net.packet.InboundPacket; 49 import org.onosproject.net.packet.InboundPacket;
50 import org.onosproject.openstackinterface.OpenstackInterfaceService; 50 import org.onosproject.openstackinterface.OpenstackInterfaceService;
51 import org.onosproject.openstackinterface.OpenstackPort; 51 import org.onosproject.openstackinterface.OpenstackPort;
52 -import org.onosproject.openstackinterface.OpenstackRouter;
53 import org.onosproject.openstackinterface.OpenstackRouterInterface; 52 import org.onosproject.openstackinterface.OpenstackRouterInterface;
54 import org.onosproject.openstackinterface.OpenstackSubnet; 53 import org.onosproject.openstackinterface.OpenstackSubnet;
55 import org.onosproject.openstackinterface.OpenstackFloatingIP; 54 import org.onosproject.openstackinterface.OpenstackFloatingIP;
...@@ -82,11 +81,11 @@ public class OpenstackRoutingRulePopulator { ...@@ -82,11 +81,11 @@ public class OpenstackRoutingRulePopulator {
82 private static final String PORTNOTNULL = "Port can not be null"; 81 private static final String PORTNOTNULL = "Port can not be null";
83 private static final String DEVICENOTNULL = "Device can not be null"; 82 private static final String DEVICENOTNULL = "Device can not be null";
84 private static final String TUNNEL_DESTINATION = "tunnelDst"; 83 private static final String TUNNEL_DESTINATION = "tunnelDst";
85 - private static final String DEVICE_ANNOTATION_CHANNELID = "channelId";
86 private static final int ROUTING_RULE_PRIORITY = 25000; 84 private static final int ROUTING_RULE_PRIORITY = 25000;
87 private static final int FLOATING_RULE_PRIORITY = 42000; 85 private static final int FLOATING_RULE_PRIORITY = 42000;
88 private static final int PNAT_RULE_PRIORITY = 26000; 86 private static final int PNAT_RULE_PRIORITY = 26000;
89 private static final int PNAT_TIMEOUT = 120; 87 private static final int PNAT_TIMEOUT = 120;
88 + private static final int PREFIX_LENGTH = 32;
90 private static final MacAddress GATEWAYMAC = MacAddress.valueOf("1f:1f:1f:1f:1f:1f"); 89 private static final MacAddress GATEWAYMAC = MacAddress.valueOf("1f:1f:1f:1f:1f:1f");
91 90
92 private InboundPacket inboundPacket; 91 private InboundPacket inboundPacket;
...@@ -94,8 +93,6 @@ public class OpenstackRoutingRulePopulator { ...@@ -94,8 +93,6 @@ public class OpenstackRoutingRulePopulator {
94 private int portNum; 93 private int portNum;
95 private MacAddress externalInterface; 94 private MacAddress externalInterface;
96 private MacAddress externalRouter; 95 private MacAddress externalRouter;
97 - private OpenstackRouter router;
98 - private OpenstackRouterInterface routerInterface;
99 96
100 /** 97 /**
101 * The constructor of openstackRoutingRulePopulator. 98 * The constructor of openstackRoutingRulePopulator.
...@@ -247,7 +244,7 @@ public class OpenstackRoutingRulePopulator { ...@@ -247,7 +244,7 @@ public class OpenstackRoutingRulePopulator {
247 244
248 private Ip4Address getHostIpfromOpenstackPort(OpenstackPort openstackPort) { 245 private Ip4Address getHostIpfromOpenstackPort(OpenstackPort openstackPort) {
249 Device device = getDevicefromOpenstackPort(openstackPort); 246 Device device = getDevicefromOpenstackPort(openstackPort);
250 - return getIPAddressforDevice(device); 247 + return config.nodes().get(device.id());
251 } 248 }
252 249
253 private Device getDevicefromOpenstackPort(OpenstackPort openstackPort) { 250 private Device getDevicefromOpenstackPort(OpenstackPort openstackPort) {
...@@ -266,7 +263,7 @@ public class OpenstackRoutingRulePopulator { ...@@ -266,7 +263,7 @@ public class OpenstackRoutingRulePopulator {
266 .filter(p -> p.isEnabled() && p.annotations().value(PORTNAME).equals(openstackPortName)) 263 .filter(p -> p.isEnabled() && p.annotations().value(PORTNAME).equals(openstackPortName))
267 .findAny() 264 .findAny()
268 .orElse(null); 265 .orElse(null);
269 - return port != null ? true : false; 266 + return port != null;
270 } 267 }
271 268
272 /** 269 /**
...@@ -317,13 +314,8 @@ public class OpenstackRoutingRulePopulator { ...@@ -317,13 +314,8 @@ public class OpenstackRoutingRulePopulator {
317 * Populates flow rules from openstackComputeNode to GatewayNode. 314 * Populates flow rules from openstackComputeNode to GatewayNode.
318 * 315 *
319 * @param vni Target network 316 * @param vni Target network
320 - * @param router corresponding router
321 - * @param routerInterface corresponding routerInterface
322 */ 317 */
323 - public void populateExternalRules(long vni, OpenstackRouter router, 318 + public void populateExternalRules(long vni) {
324 - OpenstackRouterInterface routerInterface) {
325 - this.router = router;
326 - this.routerInterface = routerInterface;
327 319
328 // 1. computeNode to gateway 320 // 1. computeNode to gateway
329 populateComputeNodeRules(vni); 321 populateComputeNodeRules(vni);
...@@ -367,7 +359,7 @@ public class OpenstackRoutingRulePopulator { ...@@ -367,7 +359,7 @@ public class OpenstackRoutingRulePopulator {
367 sBuilder.matchEthType(Ethernet.TYPE_IPV4) 359 sBuilder.matchEthType(Ethernet.TYPE_IPV4)
368 .matchTunnelId(vni) 360 .matchTunnelId(vni)
369 .matchEthDst(GATEWAYMAC); 361 .matchEthDst(GATEWAYMAC);
370 - tBuilder.extension(buildNiciraExtenstion(d.id(), getIPAddressforDevice(gatewayDevice)), d.id()) 362 + tBuilder.extension(buildNiciraExtenstion(d.id(), config.nodes().get(gatewayDevice.id())), d.id())
371 .setOutput(getTunnelPort(d.id())); 363 .setOutput(getTunnelPort(d.id()));
372 364
373 ForwardingObjective fo = DefaultForwardingObjective.builder() 365 ForwardingObjective fo = DefaultForwardingObjective.builder()
...@@ -381,10 +373,6 @@ public class OpenstackRoutingRulePopulator { ...@@ -381,10 +373,6 @@ public class OpenstackRoutingRulePopulator {
381 flowObjectiveService.forward(d.id(), fo); 373 flowObjectiveService.forward(d.id(), fo);
382 } 374 }
383 375
384 - private Ip4Address getIPAddressforDevice(Device device) {
385 - return Ip4Address.valueOf(device.annotations().value(DEVICE_ANNOTATION_CHANNELID).split(":")[0]);
386 - }
387 -
388 private Device getGatewayNode() { 376 private Device getGatewayNode() {
389 return checkNotNull(deviceService.getDevice(DeviceId.deviceId(config.gatewayBridgeId()))); 377 return checkNotNull(deviceService.getDevice(DeviceId.deviceId(config.gatewayBridgeId())));
390 } 378 }
...@@ -411,11 +399,10 @@ public class OpenstackRoutingRulePopulator { ...@@ -411,11 +399,10 @@ public class OpenstackRoutingRulePopulator {
411 399
412 StreamSupport.stream(deviceService.getDevices().spliterator(), false) 400 StreamSupport.stream(deviceService.getDevices().spliterator(), false)
413 .forEach(d -> { 401 .forEach(d -> {
414 - if (checkGatewayNode(d.id())) { 402 + ForwardingObjective.Flag flag = checkGatewayNode(d.id()) ?
415 - removeRule(d.id(), sBuilder, ForwardingObjective.Flag.VERSATILE, ROUTING_RULE_PRIORITY); 403 + ForwardingObjective.Flag.VERSATILE : ForwardingObjective.Flag.SPECIFIC;
416 - } else { 404 +
417 - removeRule(d.id(), sBuilder, ForwardingObjective.Flag.SPECIFIC, ROUTING_RULE_PRIORITY); 405 + removeRule(d.id(), sBuilder, flag, ROUTING_RULE_PRIORITY);
418 - }
419 }); 406 });
420 407
421 } 408 }
...@@ -457,13 +444,14 @@ public class OpenstackRoutingRulePopulator { ...@@ -457,13 +444,14 @@ public class OpenstackRoutingRulePopulator {
457 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder(); 444 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
458 445
459 sBuilder.matchEthType(Ethernet.TYPE_IPV4) 446 sBuilder.matchEthType(Ethernet.TYPE_IPV4)
460 - .matchIPDst(IpPrefix.valueOf(floatingIP.floatingIpAddress(), 32)); 447 + .matchIPDst(IpPrefix.valueOf(floatingIP.floatingIpAddress(), PREFIX_LENGTH));
461 448
462 tBuilder.setEthSrc(MacAddress.valueOf(config.gatewayExternalInterfaceMac())) 449 tBuilder.setEthSrc(MacAddress.valueOf(config.gatewayExternalInterfaceMac()))
463 .setEthDst(port.macAddress()) 450 .setEthDst(port.macAddress())
464 .setIpDst(floatingIP.fixedIpAddress()) 451 .setIpDst(floatingIP.fixedIpAddress())
465 .setTunnelId(getVni(port.networkId())) 452 .setTunnelId(getVni(port.networkId()))
466 - .extension(buildNiciraExtenstion(gatewayNode.id(), getIPAddressforDevice(portNode)), gatewayNode.id()) 453 + .extension(buildNiciraExtenstion(gatewayNode.id(),
454 + config.nodes().get(portNode.id())), gatewayNode.id())
467 .setOutput(getTunnelPort(gatewayNode.id())); 455 .setOutput(getTunnelPort(gatewayNode.id()));
468 456
469 ForwardingObjective fo = DefaultForwardingObjective.builder() 457 ForwardingObjective fo = DefaultForwardingObjective.builder()
...@@ -516,10 +504,10 @@ public class OpenstackRoutingRulePopulator { ...@@ -516,10 +504,10 @@ public class OpenstackRoutingRulePopulator {
516 504
517 sOutgoingBuilder.matchEthType(Ethernet.TYPE_IPV4) 505 sOutgoingBuilder.matchEthType(Ethernet.TYPE_IPV4)
518 .matchTunnelId(portInfo.vni()) 506 .matchTunnelId(portInfo.vni())
519 - .matchIPSrc(IpPrefix.valueOf(portInfo.ip(), 32)); 507 + .matchIPSrc(IpPrefix.valueOf(portInfo.ip(), PREFIX_LENGTH));
520 508
521 sIncomingBuilder.matchEthType(Ethernet.TYPE_IPV4) 509 sIncomingBuilder.matchEthType(Ethernet.TYPE_IPV4)
522 - .matchIPDst(IpPrefix.valueOf(floatingIP.floatingIpAddress(), 32)); 510 + .matchIPDst(IpPrefix.valueOf(floatingIP.floatingIpAddress(), PREFIX_LENGTH));
523 511
524 removeRule(getGatewayNode().id(), sOutgoingBuilder, ForwardingObjective.Flag.VERSATILE, FLOATING_RULE_PRIORITY); 512 removeRule(getGatewayNode().id(), sOutgoingBuilder, ForwardingObjective.Flag.VERSATILE, FLOATING_RULE_PRIORITY);
525 removeRule(getGatewayNode().id(), sIncomingBuilder, ForwardingObjective.Flag.VERSATILE, FLOATING_RULE_PRIORITY); 513 removeRule(getGatewayNode().id(), sIncomingBuilder, ForwardingObjective.Flag.VERSATILE, FLOATING_RULE_PRIORITY);
......
1 -{
2 - "apps" : {
3 - "org.onosproject.openstackswitching" : {
4 - "openstackswitching" : {
5 - "do_not_push_flows" : "false",
6 - "neutron_server" : "http://10.40.101.209:9696/v2.0/",
7 - "keystone_server" : "http://10.40.101.209:5000/v2.0/",
8 - "user_name" : "admin",
9 - "password" : "nova"
10 - }
11 - },
12 - "org.onosproject.dhcp" : {
13 - "dhcp" : {
14 - "ip": "10.0.0.1",
15 - "mac": "1a:2b:3c:4e:5e:6f",
16 - "subnet": "255.0.0.0",
17 - "broadcast": "10.255.255.255",
18 - "router": "10.0.0.1",
19 - "domain": "10.0.0.1",
20 - "ttl": "63",
21 - "lease": "300",
22 - "renew": "150",
23 - "rebind": "200",
24 - "delay": "3",
25 - "timeout": "150",
26 - "startip": "10.0.0.110",
27 - "endip": "10.0.0.130"
28 - }
29 - },
30 - "org.onosproject.cordvtn" : {
31 - "cordvtn" : {
32 - "nodes" : [
33 - {
34 - "hostname" : "compute-01",
35 - "ovsdbIp" : "10.40.101.208",
36 - "ovsdbPort" : "6640",
37 - "bridgeId" : "of:0000000000000001"
38 - },
39 - {
40 - "hostname" : "compute-02",
41 - "ovsdbIp" : "10.40.101.227",
42 - "ovsdbPort" : "6640",
43 - "bridgeId" : "of:0000000000000002"
44 - },
45 - {
46 - "hostname" : "network",
47 - "ovsdbIp" : "10.40.101.209",
48 - "ovsdbPort" : "6640",
49 - "bridgeId" : "of:0000000000000003"
50 - }
51 - ]
52 - }
53 - }
54 - },
55 - "devices" : {
56 - "of:0000000000000001" : {
57 - "basic" : {
58 - "driver" : "sona"
59 - }
60 - },
61 - "of:0000000000000002" : {
62 - "basic" : {
63 - "driver" : "sona"
64 - }
65 - },
66 - "of:0000000000000003" : {
67 - "basic" : {
68 - "driver" : "sona"
69 - }
70 - }
71 - }
72 -}
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.switching;
17 +
18 +import com.fasterxml.jackson.databind.JsonNode;
19 +import com.google.common.collect.Maps;
20 +import org.onlab.packet.Ip4Address;
21 +import org.onosproject.core.ApplicationId;
22 +import org.onosproject.net.DeviceId;
23 +import org.onosproject.net.config.Config;
24 +import org.slf4j.Logger;
25 +
26 +import java.util.Map;
27 +
28 +import static org.slf4j.LoggerFactory.getLogger;
29 +
30 +/**
31 + * Configuration object for OpenstackSwitching service.
32 + */
33 +public class OpenstackSwitchingConfig extends Config<ApplicationId> {
34 +
35 + protected final Logger log = getLogger(getClass());
36 +
37 + public static final String NODES = "nodes";
38 + public static final String DATAPLANE_IP = "dataPlaneIp";
39 + public static final String BRIDGE_ID = "bridgeId";
40 +
41 + /**
42 + * Returns the data plane IP map of nodes read from network config.
43 + *
44 + * @return data plane IP map
45 + */
46 + public Map<DeviceId, Ip4Address> nodes() {
47 + Map<DeviceId, Ip4Address> nodeMap = Maps.newHashMap();
48 +
49 + JsonNode jsonNodes = object.get(NODES);
50 + if (jsonNodes == null) {
51 + log.error("There's no node information");
52 + return null;
53 + }
54 +
55 + jsonNodes.forEach(jsonNode -> {
56 + try {
57 + nodeMap.putIfAbsent(DeviceId.deviceId(jsonNode.path(BRIDGE_ID).asText()),
58 + Ip4Address.valueOf(jsonNode.path(DATAPLANE_IP).asText()));
59 + } catch (IllegalArgumentException | NullPointerException e) {
60 + log.error("Failed to read {}", e.getMessage());
61 + }
62 + });
63 + return nodeMap;
64 + }
65 +}
...@@ -59,11 +59,13 @@ public class OpenstackSwitchingRulePopulator { ...@@ -59,11 +59,13 @@ public class OpenstackSwitchingRulePopulator {
59 .getLogger(OpenstackSwitchingRulePopulator.class); 59 .getLogger(OpenstackSwitchingRulePopulator.class);
60 private static final int SWITCHING_RULE_PRIORITY = 30000; 60 private static final int SWITCHING_RULE_PRIORITY = 30000;
61 private static final int TUNNELTAG_RULE_PRIORITY = 30000; 61 private static final int TUNNELTAG_RULE_PRIORITY = 30000;
62 - 62 + private static final String PORT_NAME = "portName";
63 + private static final String TUNNEL_DST = "tunnelDst";
63 private FlowObjectiveService flowObjectiveService; 64 private FlowObjectiveService flowObjectiveService;
64 private DriverService driverService; 65 private DriverService driverService;
65 private DeviceService deviceService; 66 private DeviceService deviceService;
66 private ApplicationId appId; 67 private ApplicationId appId;
68 + private OpenstackSwitchingConfig config;
67 69
68 private Collection<OpenstackNetwork> openstackNetworkList; 70 private Collection<OpenstackNetwork> openstackNetworkList;
69 private Collection<OpenstackPort> openstackPortList; 71 private Collection<OpenstackPort> openstackPortList;
...@@ -76,16 +78,19 @@ public class OpenstackSwitchingRulePopulator { ...@@ -76,16 +78,19 @@ public class OpenstackSwitchingRulePopulator {
76 * @param deviceService DeviceService reference 78 * @param deviceService DeviceService reference
77 * @param openstackService openstack interface service 79 * @param openstackService openstack interface service
78 * @param driverService DriverService reference 80 * @param driverService DriverService reference
81 + * @param config OpenstackRoutingConfig
79 */ 82 */
80 public OpenstackSwitchingRulePopulator(ApplicationId appId, 83 public OpenstackSwitchingRulePopulator(ApplicationId appId,
81 FlowObjectiveService flowObjectiveService, 84 FlowObjectiveService flowObjectiveService,
82 DeviceService deviceService, 85 DeviceService deviceService,
83 OpenstackInterfaceService openstackService, 86 OpenstackInterfaceService openstackService,
84 - DriverService driverService) { 87 + DriverService driverService,
88 + OpenstackSwitchingConfig config) {
85 this.flowObjectiveService = flowObjectiveService; 89 this.flowObjectiveService = flowObjectiveService;
86 this.deviceService = deviceService; 90 this.deviceService = deviceService;
87 this.driverService = driverService; 91 this.driverService = driverService;
88 this.appId = appId; 92 this.appId = appId;
93 + this.config = config;
89 94
90 openstackNetworkList = openstackService.networks(); 95 openstackNetworkList = openstackService.networks();
91 openstackPortList = openstackService.ports(); 96 openstackPortList = openstackService.ports();
...@@ -111,8 +116,8 @@ public class OpenstackSwitchingRulePopulator { ...@@ -111,8 +116,8 @@ public class OpenstackSwitchingRulePopulator {
111 * @param port port info of the VM 116 * @param port port info of the VM
112 */ 117 */
113 private void populateFlowRulesForTunnelTag(Device device, Port port) { 118 private void populateFlowRulesForTunnelTag(Device device, Port port) {
114 - Ip4Address vmIp = getFixedIpAddressForPort(port.annotations().value("portName")); 119 + Ip4Address vmIp = getFixedIpAddressForPort(port.annotations().value(PORT_NAME));
115 - String portName = port.annotations().value("portName"); 120 + String portName = port.annotations().value(PORT_NAME);
116 String vni = getVniForPort(portName); 121 String vni = getVniForPort(portName);
117 122
118 if (vmIp != null) { 123 if (vmIp != null) {
...@@ -148,8 +153,8 @@ public class OpenstackSwitchingRulePopulator { ...@@ -148,8 +153,8 @@ public class OpenstackSwitchingRulePopulator {
148 * @param port port info of the VM 153 * @param port port info of the VM
149 */ 154 */
150 private void populateFlowRulesForTrafficToSameCnode(Device device, Port port) { 155 private void populateFlowRulesForTrafficToSameCnode(Device device, Port port) {
151 - Ip4Address vmIp = getFixedIpAddressForPort(port.annotations().value("portName")); 156 + Ip4Address vmIp = getFixedIpAddressForPort(port.annotations().value(PORT_NAME));
152 - String portName = port.annotations().value("portName"); 157 + String portName = port.annotations().value(PORT_NAME);
153 String vni = getVniForPort(portName); 158 String vni = getVniForPort(portName);
154 159
155 if (vmIp != null) { 160 if (vmIp != null) {
...@@ -197,24 +202,27 @@ public class OpenstackSwitchingRulePopulator { ...@@ -197,24 +202,27 @@ public class OpenstackSwitchingRulePopulator {
197 * @param port port information of the VM 202 * @param port port information of the VM
198 */ 203 */
199 private void populateFlowRulesForTrafficToDifferentCnode(Device device, Port port) { 204 private void populateFlowRulesForTrafficToDifferentCnode(Device device, Port port) {
200 - String portName = port.annotations().value("portName"); 205 + String portName = port.annotations().value(PORT_NAME);
201 - String channelId = device.annotations().value("channelId");
202 - Ip4Address hostIpAddress = Ip4Address.valueOf(channelId.split(":")[0]);
203 Ip4Address fixedIp = getFixedIpAddressForPort(portName); 206 Ip4Address fixedIp = getFixedIpAddressForPort(portName);
204 String vni = getVniForPort(portName); 207 String vni = getVniForPort(portName);
208 + Ip4Address hostDpIpAddress = config.nodes().get(device.id());
209 +
210 + if (hostDpIpAddress == null) {
211 + log.debug("There's no openstack node information for device id {}", device.id().toString());
212 + return;
213 + }
214 +
205 deviceService.getAvailableDevices().forEach(d -> { 215 deviceService.getAvailableDevices().forEach(d -> {
206 if (!d.equals(device)) { 216 if (!d.equals(device)) {
207 deviceService.getPorts(d.id()).forEach(p -> { 217 deviceService.getPorts(d.id()).forEach(p -> {
208 - String pName = p.annotations().value("portName"); 218 + String pName = p.annotations().value(PORT_NAME);
209 if (!p.equals(port) && vni.equals(getVniForPort(pName))) { 219 if (!p.equals(port) && vni.equals(getVniForPort(pName))) {
210 - String cidx = d.annotations().value("channelId"); 220 + Ip4Address hostxDpIpAddress = config.nodes().get(d.id());
211 - Ip4Address hostIpx = Ip4Address.valueOf(cidx.split(":")[0]); 221 +
212 Ip4Address fixedIpx = getFixedIpAddressForPort(pName); 222 Ip4Address fixedIpx = getFixedIpAddressForPort(pName);
213 - if (port.isEnabled() || 223 + if (port.isEnabled()) {
214 - port.annotations().value("portName").startsWith( 224 + setVxLanFlowRule(vni, device.id(), hostxDpIpAddress, fixedIpx);
215 - OpenstackSwitchingManager.PORTNAME_PREFIX_ROUTER)) { 225 + setVxLanFlowRule(vni, d.id(), hostDpIpAddress, fixedIp);
216 - setVxLanFlowRule(vni, device.id(), hostIpx, fixedIpx);
217 - setVxLanFlowRule(vni, d.id(), hostIpAddress, fixedIp);
218 } 226 }
219 } 227 }
220 }); 228 });
...@@ -259,7 +267,7 @@ public class OpenstackSwitchingRulePopulator { ...@@ -259,7 +267,7 @@ public class OpenstackSwitchingRulePopulator {
259 * @return OpenstackPort reference, or null when not found 267 * @return OpenstackPort reference, or null when not found
260 */ 268 */
261 public OpenstackPort openstackPort(Port port) { 269 public OpenstackPort openstackPort(Port port) {
262 - String uuid = port.annotations().value("portName").substring(3); 270 + String uuid = port.annotations().value(PORT_NAME).substring(3);
263 return openstackPortList.stream().filter(p -> p.id().startsWith(uuid)) 271 return openstackPortList.stream().filter(p -> p.id().startsWith(uuid))
264 .findAny().orElse(null); 272 .findAny().orElse(null);
265 } 273 }
...@@ -273,7 +281,7 @@ public class OpenstackSwitchingRulePopulator { ...@@ -273,7 +281,7 @@ public class OpenstackSwitchingRulePopulator {
273 public void removeSwitchingRules(Port removedPort, Map<String, 281 public void removeSwitchingRules(Port removedPort, Map<String,
274 OpenstackPortInfo> openstackPortInfoMap) { 282 OpenstackPortInfo> openstackPortInfoMap) {
275 OpenstackPortInfo openstackPortInfo = openstackPortInfoMap 283 OpenstackPortInfo openstackPortInfo = openstackPortInfoMap
276 - .get(removedPort.annotations().value("portName")); 284 + .get(removedPort.annotations().value(PORT_NAME));
277 285
278 DeviceId deviceId = openstackPortInfo.deviceId(); 286 DeviceId deviceId = openstackPortInfo.deviceId();
279 Ip4Address vmIp = openstackPortInfo.ip(); 287 Ip4Address vmIp = openstackPortInfo.ip();
...@@ -397,7 +405,7 @@ public class OpenstackSwitchingRulePopulator { ...@@ -397,7 +405,7 @@ public class OpenstackSwitchingRulePopulator {
397 Map<String, OpenstackPortInfo> openstackPortInfoMap) { 405 Map<String, OpenstackPortInfo> openstackPortInfoMap) {
398 406
399 for (Map.Entry<String, OpenstackPortInfo> entry : openstackPortInfoMap.entrySet()) { 407 for (Map.Entry<String, OpenstackPortInfo> entry : openstackPortInfoMap.entrySet()) {
400 - if (!removedPort.annotations().value("portName").equals(entry.getKey())) { 408 + if (!removedPort.annotations().value(PORT_NAME).equals(entry.getKey())) {
401 if (entry.getValue().vni() == vni && entry.getValue().deviceId().equals(deviceId)) { 409 if (entry.getValue().vni() == vni && entry.getValue().deviceId().equals(deviceId)) {
402 return true; 410 return true;
403 } 411 }
...@@ -469,7 +477,7 @@ public class OpenstackSwitchingRulePopulator { ...@@ -469,7 +477,7 @@ public class OpenstackSwitchingRulePopulator {
469 ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST.type()); 477 ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST.type());
470 478
471 try { 479 try {
472 - extensionInstruction.setPropertyValue("tunnelDst", hostIp); 480 + extensionInstruction.setPropertyValue(TUNNEL_DST, hostIp);
473 } catch (ExtensionPropertyException e) { 481 } catch (ExtensionPropertyException e) {
474 log.error("Error setting Nicira extension setting {}", e); 482 log.error("Error setting Nicira extension setting {}", e);
475 } 483 }
...@@ -479,7 +487,7 @@ public class OpenstackSwitchingRulePopulator { ...@@ -479,7 +487,7 @@ public class OpenstackSwitchingRulePopulator {
479 487
480 private PortNumber getTunnelPort(DeviceId deviceId) { 488 private PortNumber getTunnelPort(DeviceId deviceId) {
481 Port port = deviceService.getPorts(deviceId).stream() 489 Port port = deviceService.getPorts(deviceId).stream()
482 - .filter(p -> p.annotations().value("portName").equals( 490 + .filter(p -> p.annotations().value(PORT_NAME).equals(
483 OpenstackSwitchingManager.PORTNAME_PREFIX_TUNNEL)) 491 OpenstackSwitchingManager.PORTNAME_PREFIX_TUNNEL))
484 .findAny().orElse(null); 492 .findAny().orElse(null);
485 493
......