Exemplo n.º 1
0
    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)