Add layout config object to model

Store the results of the configuration (pipelines, jobs, and all)
in a new Layout object.  Return such an object from the parseConfig
method in the scheduler.  This is a first step to reloading the
configuration on the fly -- it supports holding multiple
configurations in memory at once.

Change-Id: Ide56cddecbdbecdc4ed77b917d0b9bb24b1753d5
Reviewed-on: https://review.openstack.org/35323
Reviewed-by: Jeremy Stanley <fungi@yuggoth.org>
Reviewed-by: Clark Boylan <clark.boylan@gmail.com>
Approved: James E. Blair <corvus@inaugust.com>
Tested-by: Jenkins
diff --git a/tests/test_scheduler.py b/tests/test_scheduler.py
index 4de5d05..6f70c63 100644
--- a/tests/test_scheduler.py
+++ b/tests/test_scheduler.py
@@ -860,7 +860,7 @@
 
     def registerJobs(self):
         count = 0
-        for job in self.sched.jobs.keys():
+        for job in self.sched.layout.jobs.keys():
             self.worker.registerFunction('build:' + job)
             count += 1
         self.worker.registerFunction('stop:' + self.worker.worker_id)
@@ -1003,7 +1003,7 @@
 
     def assertEmptyQueues(self):
         # Make sure there are no orphaned jobs
-        for pipeline in self.sched.pipelines.values():
+        for pipeline in self.sched.layout.pipelines.values():
             for queue in pipeline.queues:
                 if len(queue.queue) != 0:
                     print 'pipeline %s queue %s contents %s' % (
@@ -1396,7 +1396,7 @@
         # TODO: move to test_gerrit (this is a unit test!)
         A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
         a = self.sched.trigger.getChange(1, 2)
-        mgr = self.sched.pipelines['gate'].manager
+        mgr = self.sched.layout.pipelines['gate'].manager
         assert not self.sched.trigger.canMerge(a, mgr.getSubmitAllowNeeds())
 
         A.addApproval('CRVW', 2)