summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alvarez <pedro.alvarez@codethink.co.uk>2016-03-07 17:48:43 +0000
committerPedro Alvarez <pedro.alvarez@codethink.co.uk>2016-03-27 11:53:02 +0000
commit90404c48e011f0cf9e715359290ce1b4f7c9e02b (patch)
treee3ab5e75657aa8df9a1ed8e258e3eea373dc4f63
parent2cf7d80e432e1ae527f1b810ecd3e2cd9b0c2dcb (diff)
downloadmorph-90404c48e011f0cf9e715359290ce1b4f7c9e02b.tar.gz
Find unbuilt artifacts
Change-Id: If6116eee783ad2d5018395cbcea9361bd8924164
-rw-r--r--gear/client.py39
1 files changed, 31 insertions, 8 deletions
diff --git a/gear/client.py b/gear/client.py
index 17202cdd..ad1b0fc4 100644
--- a/gear/client.py
+++ b/gear/client.py
@@ -17,7 +17,7 @@ gear.Server()
class theController():
def __init__(self):
- self.graph_client = aGearmanClient(self)
+ self.graph_client = BuildGraphClient(self)
self.artifact = None
def _process_build_graph(self, packet):
@@ -57,37 +57,56 @@ class theController():
mapped_components.append(a)
return result, mapped_components
+ def find_artifacts_that_are_ready_to_build(self, root_artifact, components=[]):
+ '''Return unbuilt artifacts whose dependencies are all built.
-class aGearmanClient(gear.Client):
+ The 'root_artifact' parameter is expected to be a tree of ArtifactReference
+ objects. These must have the 'state' attribute set to BUILT or UNBUILT. If
+ 'components' is passed, then only those artifacts and their dependencies
+ will be built.
+
+ '''
+ def is_ready_to_build(artifact):
+ return (artifact.state == UNBUILT and
+ all(a.state == BUILT
+ for a in artifact.dependencies))
+
+ artifacts, _ = self._map_build_graph(root_artifact, lambda a: a,
+ components)
+ return [a for a in artifacts if is_ready_to_build(a)]
+
+
+
+class BuildGraphClient(gear.Client):
def __init__(self, controller):
- super(aGearmanClient, self).__init__()
+ super(BuildGraphClient, self).__init__()
self.controller = controller
self.finished = False
def handleWorkComplete(self, packet):
- job = super(aGearmanClient, self).handleWorkComplete(packet)
+ job = super(BuildGraphClient, self).handleWorkComplete(packet)
print "workcomplete"
self.controller._process_build_graph(packet)
return job
def handleWorkData(self, packet):
- job = super(aGearmanClient, self).handleWorkData(packet)
+ job = super(BuildGraphClient, self).handleWorkData(packet)
print job.data[-1]
job.data = []
return job
def handleWorkFail(self, packet):
- job = super(aGearmanClient, self).handleWorkFail(packet)
+ job = super(BuildGraphClient, self).handleWorkFail(packet)
print "workfail"
return job
def handleWorkException(self, packet):
- job = super(aGearmanClient, self).handleWorkException(packet)
+ job = super(BuildGraphClient, self).handleWorkException(packet)
print "workexception"
return job
def handleDisconnect(self, job):
- job = super(aGearmanClient, self).handleDisconnect(job)
+ job = super(BuildGraphClient, self).handleDisconnect(job)
print "disconnect"
@@ -117,3 +136,7 @@ client.submitJob(job)
while True:
import time
time.sleep(2)
+ if controller.artifact != None:
+ to_build = controller.find_artifacts_that_are_ready_to_build(controller.artifact)
+ print to_build
+ exit(0)