Exemplo n.º 1
0
    def task(self, logger, nodeName, task):
        nodes = self.getNodes()
        if not nodeName in nodes:
            logger.log("Node {0} does not exist.".format(nodeName), "error")
            return
        taskFn = getattr(self.tasksModule, task, None)
        if not taskFn:
            logger.log("Task {0} does not exist.".format(task), "error")
            return;

        node = nodes[nodeName]
        deployer = Deployer(node.externalIp, username=node.user, keyFile=node.keyFile)
        deployer.runTask(taskFn)
Exemplo n.º 2
0
    def provision(self, logger):
        status = {}
        if isfile(self.statusFile):
            status = yaml.load(open(self.statusFile).read())
        self.driver.provision(logger)
        if self.DNSDriver:
            self.DNSDriver.provision(self.getNodes(), logger)
        # Run tasks
        if self.tasksModule:
            logger.log("Running tasks.")
            nodes = self.getNodes().items()
            # Create a host list that can be used by fabric scripts.
            hostList = {}
            for name, node in nodes:
                hostList[name] = node.externalIp

            # Always take the management server first, if it is available.
            # This is necessary since the other nodes could depend on the management server being in place.
            if "managementServer" in self.data:
                mgmt = self.data["managementServer"]
                def sortNodes(item1, item2):
                    if item1[0] == mgmt:
                        return -1
                    return 0
                nodes = sorted(nodes, sortNodes)

            for name, node in nodes:
                if node.user:
                    logger.log("Running tasks for {0}".format(name))
                    deployer = Deployer(node.externalIp, username=node.user, keyFile=node.keyFile, hostList = hostList)
                    meisterFile = "/home/{0}/.meister".format(node.user)
                    status = self.getTaskStatus(deployer, logger, meisterFile)
                    # Filter out tasks that has already been run.
                    tasks = filter(lambda task: task not in status["tasks"], node.tasks)
                    for task in tasks:
                        if isinstance(task, dict):
                            taskFnName = task["name"]
                            args = task["arguments"]
                        else:
                            taskFnName = task
                            args = []
                        taskFn = getattr(self.tasksModule, taskFnName, None)
                        if taskFn:
                            deployer.runTask(taskFn, args)
                            status["tasks"].append(task)
                            self.putTaskStatus(status, deployer, logger, meisterFile)