return self._get_builder("SELECT * FROM builders \
WHERE name = %s AND deleted IS FALSE", name)
+ @property
+ def connected(self):
+ """
+ Returns all connected builders
+ """
+ # We do this so that we get a fresh builder object just in case
+ # some configuration has changed in the database.
+ for builder in self:
+ # Skip disabled builders
+ if not builder.enabled:
+ continue
+
+ # Skip all builders that don't have an open connection
+ if not builder in self.connections:
+ continue
+
+ yield builder
+
async def sync(self, *args, **kwargs):
"""
Synchronize any state with AWS
max_jobs = property(get_max_jobs, set_max_jobs)
+ def is_full(self):
+ """
+ Returns True if the builder has enough jobs running
+ """
+ return len(self.jobs) >= self.max_jobs
+
@property
def name(self):
return self.data.name
def host_key_id(self):
return self.data.host_key_id
- def is_ready(self):
- # If the builder is not enabled, we are obviously not ready
- if not self.enabled:
- return False
-
- # Does this builder have reached its job limit?
- if len(self.jobs) >= self.max_jobs:
- return False
-
- # Looks like we are ready
- return True
-
# AWS
@property
builders = queue.SimpleQueue()
# Add all builders to the queue in ascending order of running jobs
- for builder in sorted(self.backend.builders.connections, key=lambda b: len(b.jobs)):
- # Skip builders that are not ready
- if not builder.is_ready():
+ for builder in sorted(self.backend.builders.connected, key=lambda b: len(b.jobs)):
+ # Skip builders that are already full
+ if builder.is_full():
continue
builders.put(builder)
# If the builder has not any free slots remaining, we put it back in the
# queue to fill it up, but we give priority to builders who have fewer
# jobs to run.
- if len(builder.jobs) < builder.max_jobs:
+ if not builder.is_full():
builders.put(builder)
# Auto-scale builders