diff --git a/master/buildbot/worker/openstack.py b/master/buildbot/worker/openstack.py
index ce0ec1af4..f4b7e4c1f 100644
--- a/master/buildbot/worker/openstack.py
+++ b/master/buildbot/worker/openstack.py
@@ -250,6 +250,15 @@ class OpenStackLatentWorker(CompatibleLatentWorkerMixin,
nova_args = yield build.render(self.nova_args)
meta = yield build.render(self.meta)
+ worker_meta = {
+ 'BUILDBOT:instance': self.masterhash,
+ }
+
+ if meta is None:
+ meta = worker_meta
+ else:
+ meta.update(worker_meta)
+
if self.block_devices is not None:
block_devices = []
for bd in self.block_devices:
@@ -270,6 +279,8 @@ class OpenStackLatentWorker(CompatibleLatentWorkerMixin,
return res
def _start_instance(self, image_uuid, flavor_uuid, block_devices, nova_args, meta):
+ # ensure existing, potentially duplicated, workers are stopped
+ self._stop_all_instances()
boot_args = [self.workername, image_uuid, flavor_uuid]
boot_kwargs = dict(
meta=meta,
@@ -330,6 +341,14 @@ class OpenStackLatentWorker(CompatibleLatentWorkerMixin,
self._stop_instance(instance, fast)
return None
+ def _stop_all_instances(self):
+ instances = self.novaclient.servers.findall(name=self.name)
+ if not instance:
+ return
+ for instance in instances:
+ if instance.metadata.get("BUILDBOT:instance", "") == self.masterhash:
+ self._stop_instance(instance, True)
+
def _stop_instance(self, instance, fast):
try:
instance = self.novaclient.servers.get(instance.id)