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
Showing
1 changed file
with
28 additions
and
31 deletions
... | @@ -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; | ... | ... |
-
Please register or login to post a comment