Hyunsun Moon
Committed by Gerrit Code Review

Ensure only one instance installs flow rules

By making all flow rule installation triggered by HOST event.
Also removed unnecessary host annotation.

Change-Id: Ib6d230f2fbbac4ad7d66628d7465e69450ef1a26
...@@ -140,12 +140,12 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro ...@@ -140,12 +140,12 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
140 140
141 private static final String DEFAULT_TUNNEL = "vxlan"; 141 private static final String DEFAULT_TUNNEL = "vxlan";
142 private static final String SERVICE_ID = "serviceId"; 142 private static final String SERVICE_ID = "serviceId";
143 - private static final String OPENSTACK_VM_ID = "openstackVmId";
144 private static final String OPENSTACK_PORT_ID = "openstackPortId"; 143 private static final String OPENSTACK_PORT_ID = "openstackPortId";
145 private static final String DATA_PLANE_IP = "dataPlaneIp"; 144 private static final String DATA_PLANE_IP = "dataPlaneIp";
146 private static final String DATA_PLANE_INTF = "dataPlaneIntf"; 145 private static final String DATA_PLANE_INTF = "dataPlaneIntf";
147 private static final String S_TAG = "stag"; 146 private static final String S_TAG = "stag";
148 private static final String VSG_HOST_ID = "vsgHostId"; 147 private static final String VSG_HOST_ID = "vsgHostId";
148 + private static final String CREATED_TIME = "createdTime";
149 149
150 private static final Ip4Address DEFAULT_DNS = Ip4Address.valueOf("8.8.8.8"); 150 private static final Ip4Address DEFAULT_DNS = Ip4Address.valueOf("8.8.8.8");
151 151
...@@ -188,7 +188,6 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro ...@@ -188,7 +188,6 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
188 188
189 configRegistry.registerConfigFactory(configFactory); 189 configRegistry.registerConfigFactory(configFactory);
190 configService.addListener(configListener); 190 configService.addListener(configListener);
191 - readConfiguration();
192 191
193 log.info("Started"); 192 log.info("Started");
194 } 193 }
...@@ -256,26 +255,26 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro ...@@ -256,26 +255,26 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
256 MacAddress mac = vPort.macAddress(); 255 MacAddress mac = vPort.macAddress();
257 HostId hostId = HostId.hostId(mac); 256 HostId hostId = HostId.hostId(mac);
258 257
259 - Host host = hostService.getHost(hostId); 258 + Host existingHost = hostService.getHost(hostId);
260 - if (host != null) { 259 + if (existingHost != null) {
261 - // Host is already known to the system, no HOST_ADDED event is triggered in this case. 260 + String serviceId = existingHost.annotations().value(SERVICE_ID);
262 - // It happens when the application is restarted. 261 + if (serviceId == null || !serviceId.equals(vPort.networkId())) {
263 - String vmId = host.annotations().value(OPENSTACK_VM_ID); 262 + // this host is not injected by cordvtn or a stale host, remove it
264 - if (vmId != null && vmId.equals(vPort.deviceId())) { 263 + hostProvider.hostVanished(existingHost.id());
265 - serviceVmAdded(host);
266 - return;
267 - } else {
268 - hostProvider.hostVanished(host.id());
269 } 264 }
270 } 265 }
271 266
267 + // Included CREATED_TIME to annotation intentionally to trigger HOST_UPDATED
268 + // event so that the flow rule population for this host can happen.
269 + // This ensures refreshing data plane by pushing network config always make
270 + // the data plane synced.
272 Set<IpAddress> fixedIp = Sets.newHashSet(vPort.fixedIps().values()); 271 Set<IpAddress> fixedIp = Sets.newHashSet(vPort.fixedIps().values());
273 DefaultAnnotations.Builder annotations = DefaultAnnotations.builder() 272 DefaultAnnotations.Builder annotations = DefaultAnnotations.builder()
274 .set(SERVICE_ID, vPort.networkId()) 273 .set(SERVICE_ID, vPort.networkId())
275 - .set(OPENSTACK_VM_ID, vPort.deviceId())
276 .set(OPENSTACK_PORT_ID, vPort.id()) 274 .set(OPENSTACK_PORT_ID, vPort.id())
277 .set(DATA_PLANE_IP, node.dpIp().ip().toString()) 275 .set(DATA_PLANE_IP, node.dpIp().ip().toString())
278 - .set(DATA_PLANE_INTF, node.dpIntf()); 276 + .set(DATA_PLANE_INTF, node.dpIntf())
277 + .set(CREATED_TIME, String.valueOf(System.currentTimeMillis()));
279 278
280 String serviceVlan = getServiceVlan(vPort); 279 String serviceVlan = getServiceVlan(vPort);
281 if (serviceVlan != null) { 280 if (serviceVlan != null) {
...@@ -341,7 +340,8 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro ...@@ -341,7 +340,8 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
341 HostId hostId = HostId.hostId(vSgMac); 340 HostId hostId = HostId.hostId(vSgMac);
342 DefaultAnnotations.Builder annotations = DefaultAnnotations.builder() 341 DefaultAnnotations.Builder annotations = DefaultAnnotations.builder()
343 .set(S_TAG, serviceVlan) 342 .set(S_TAG, serviceVlan)
344 - .set(VSG_HOST_ID, vSgHost.id().toString()); 343 + .set(VSG_HOST_ID, vSgHost.id().toString())
344 + .set(CREATED_TIME, String.valueOf(System.currentTimeMillis()));
345 345
346 HostDescription hostDesc = new DefaultHostDescription( 346 HostDescription hostDesc = new DefaultHostDescription(
347 vSgMac, 347 vSgMac,
...@@ -537,14 +537,12 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro ...@@ -537,14 +537,12 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
537 537
538 OpenstackNetwork vNet = openstackService.network(vNetId); 538 OpenstackNetwork vNet = openstackService.network(vNetId);
539 if (vNet == null) { 539 if (vNet == null) {
540 - log.warn("Failed to get OpenStack network {} for VM {}({}).", 540 + log.warn("Failed to get OpenStack network {} for VM {}.",
541 - vNetId, host.id(), 541 + vNetId, host.id());
542 - host.annotations().value(OPENSTACK_VM_ID));
543 return; 542 return;
544 } 543 }
545 544
546 - log.info("VM {} is detected, MAC: {} IP: {}", 545 + log.info("VM is detected, MAC: {} IP: {}",
547 - host.annotations().value(OPENSTACK_VM_ID),
548 host.mac(), 546 host.mac(),
549 host.ipAddresses().stream().findFirst().get()); 547 host.ipAddresses().stream().findFirst().get());
550 548
...@@ -592,14 +590,12 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro ...@@ -592,14 +590,12 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
592 590
593 OpenstackNetwork vNet = openstackService.network(vNetId); 591 OpenstackNetwork vNet = openstackService.network(vNetId);
594 if (vNet == null) { 592 if (vNet == null) {
595 - log.warn("Failed to get OpenStack network {} for VM {}({}).", 593 + log.warn("Failed to get OpenStack network {} for VM {}",
596 - vNetId, host.id(), 594 + vNetId, host.id());
597 - host.annotations().value(OPENSTACK_VM_ID));
598 return; 595 return;
599 } 596 }
600 597
601 - log.info("VM {} is vanished, MAC: {} IP: {}", 598 + log.info("VM is vanished, MAC: {} IP: {}",
602 - host.annotations().value(OPENSTACK_VM_ID),
603 host.mac(), 599 host.mac(),
604 host.ipAddresses().stream().findFirst().get()); 600 host.ipAddresses().stream().findFirst().get());
605 601
...@@ -747,17 +743,18 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro ...@@ -747,17 +743,18 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
747 @Override 743 @Override
748 public void event(HostEvent event) { 744 public void event(HostEvent event) {
749 Host host = event.subject(); 745 Host host = event.subject();
746 + if (!mastershipService.isLocalMaster(host.location().deviceId())) {
747 + // do not allow to proceed without mastership
748 + return;
749 + }
750 750
751 switch (event.type()) { 751 switch (event.type()) {
752 + case HOST_UPDATED:
752 case HOST_ADDED: 753 case HOST_ADDED:
753 - if (mastershipService.isLocalMaster(host.location().deviceId())) { 754 + eventExecutor.submit(() -> serviceVmAdded(host));
754 - eventExecutor.submit(() -> serviceVmAdded(host));
755 - }
756 break; 755 break;
757 case HOST_REMOVED: 756 case HOST_REMOVED:
758 - if (mastershipService.isLocalMaster(host.location().deviceId())) { 757 + eventExecutor.submit(() -> serviceVmRemoved(host));
759 - eventExecutor.submit(() -> serviceVmRemoved(host));
760 - }
761 break; 758 break;
762 default: 759 default:
763 break; 760 break;
......