def load_schedulers(self, tree_config, errback=lambda *args: 0): schedulers = tree_config["schedulers"] overcommit = tree_config["overcommit"] if "root_config" in tree_config: root_config = tree_config["root_config"] else: root_config = None # Load all schedulers sys.stdout.write("Loading schedulers...") sys.stdout.flush() for (i, scheduler) in enumerate(schedulers): id = scheduler['id'] role = scheduler['role'] children = [] if 'children' in scheduler: children = scheduler['children'] if id in self.schedulers: errback("duplicated id '%d'" % id) continue if scheduler['role'] not in self.ROLES: errback("invalid role '%s', should be among %s" % (role, self.ROLES)) continue if role in FakeBranchScheduler.ROLES: if role == 'root': self.schedulers[id] = FakeBranchScheduler(id, role, children, root_config) if self.root_scheduler is None: self.root_scheduler = self.schedulers[id] else: errback("duplicated root scheduler '%d'" % id) else: self.schedulers[id] = FakeBranchScheduler(id, role, children) elif role == FakeLeafScheduler.ROLE: self.schedulers[id] = FakeLeafScheduler(id, children) elif role == Host.ROLE: from psim.universe import Universe cpu = self._get_key(scheduler, 'cpu') disk = self._get_key(scheduler, 'disk') mem = self._get_key(scheduler, 'mem') constraint_list = self._get_key(scheduler, 'constraints') constraint_set = set() for c in constraint_list: type = RCT._NAMES_TO_VALUES[c['type']] c_id = c['values'][0] if type == RCT.DATASTORE: ds_uuid = Universe.get_ds_uuid(c_id) if ds_uuid not in Universe.datastores.keys(): raise ValueError("Invalid Datastore: " + c_id) constraint_set.add( ResourceConstraint(type=type, values=[c_id])) self.schedulers[id] = SchedulerTree.create_host( id, cpu, mem, disk, constraint_set, overcommit) # configure schedulers self.root_scheduler.update() print "Done." print "Loaded %d schedulers." % len(schedulers)