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)
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)