def start_nodes(self): self.log.debug("Starting nodes for cluster '%s'", self.name) def restart_if_needed(node): if node.state == NodeState.RUNNING: self.log.debug("Node '%s' running", node.name) return if node.state == NodeState.REBOOTING: self.log.debug("Node '%s' rebooting", node.name) return if node.state == NodeState.PENDING: self.log.debug("Node '%s' is being created", node.name) return error_states = { NodeState.TERMINATED, NodeState.ERROR, NodeState.UNKNOWN } if node.state in error_states: raise Exception("Node '%s' cannot be restarted" % (node.name,)) self.log.debug("Rebooting node '%s'", node.name) self.provider.reboot_node(node) utils.parallel((restart_if_needed, node) for node in self.nodes) self.log.debug("%s: Waiting for nodes ...", self.name) nodes = self.provider.wait_until_running(*self.nodes) self.log.debug("start_nodes(): Nodes up: %s", nodes)
def start_nodes(self): self.log.debug("Starting nodes for cluster '%s'", self.name) def restart_if_needed(node): if node.state == NodeState.RUNNING: self.log.debug("Node '%s' running", node.name) return if node.state == NodeState.REBOOTING: self.log.debug("Node '%s' rebooting", node.name) return if node.state == NodeState.PENDING: self.log.debug("Node '%s' is being created", node.name) return error_states = { NodeState.TERMINATED, NodeState.ERROR, NodeState.UNKNOWN } if node.state in error_states: raise Exception("Node '%s' cannot be restarted" % (node.name, )) self.log.debug("Rebooting node '%s'", node.name) self.provider.reboot_node(node) utils.parallel((restart_if_needed, node) for node in self.nodes) self.log.debug("%s: Waiting for nodes ...", self.name) nodes = self.provider.wait_until_running(*self.nodes) self.log.debug("start_nodes(): Nodes up: %s", nodes)
def provision_nodes(self): try: utils.parallel((self.provider.provision_node, n) for n in self.nodes) except Exception as exc: self.log.debug("Cluster provisioning failed: %s", exc, exc_info=True) raise
def provision_nodes(self): try: utils.parallel( (self.provider.provision_node, n) for n in self.nodes) except Exception as exc: self.log.debug("Cluster provisioning failed: %s", exc, exc_info=True) raise
def nodes(self): if not self._nodes: self.log.debug("Creating nodes for cluster '%s'", self.name) etcd_nodes = [] master_node = None worker_nodes = [] nodes_data = self.config.clusters[self.name]["nodes"] for n in nodes_data: node_type = n["type"] if node_type == "etcd": etcd_nodes.append(n) elif node_type == "master": master_node = n elif node_type == "worker": worker_nodes.append(n) else: raise TypeError("Invalid node type '%s' for node %s" % (node_type, n)) # Start first the `etcd` nodes, since the etcd endpoint is needed in # all other nodes, and it will not be known until the `etcd` nodes # are up. self._nodes = utils.parallel((self.provider.ensure_node, n["name"], NODE_TYPES[n["type"]], n["size"], self, self.config) for n in etcd_nodes) self._etcd_endpoint = make_etcd_endpoint(self._nodes) # Start now the master node, since its address is needed in all # worker nodes, and it will not be known until the master node is # up. n = master_node self._nodes.append(self.provider.ensure_node(n["name"], MasterNode, n["size"], self, self.config)) self._master_ip = make_master_ip(self._nodes) # Start now all worker nodes. self._nodes.extend(utils.parallel((self.provider.ensure_node, n["name"], NODE_TYPES[n["type"]], n["size"], self, self.config) for n in worker_nodes)) return self._nodes
def test_errors_in_parallel(): def divide_by_zero(n): return n / 0 def key_error(k): return {}[k] try: divide_by_zero(42) except ZeroDivisionError as err: divide_by_zero_err = str(err) with pytest.raises(utils.MultipleError) as err: utils.parallel(((utils.run, "echo foo"), (key_error, "no-such-key"), (divide_by_zero, 42), (utils.run, "echo bar"))) errors = set(str(exc) for exc in err.value) assert errors == set(("'no-such-key'", divide_by_zero_err))
def nodes(self): if not self._nodes: self.log.debug("Creating nodes for cluster '%s'", self.name) etcd_nodes = [] master_node = None worker_nodes = [] nodes_data = self.config.clusters[self.name]["nodes"] for n in nodes_data: node_type = n["type"] if node_type == "etcd": etcd_nodes.append(n) elif node_type == "master": master_node = n elif node_type == "worker": worker_nodes.append(n) else: raise TypeError("Invalid node type '%s' for node %s" % (node_type, n)) # Start first the `etcd` nodes, since the etcd endpoint is needed in # all other nodes, and it will not be known until the `etcd` nodes # are up. self._nodes = utils.parallel( (self.provider.ensure_node, n["name"], NODE_TYPES[n["type"]], n["size"], self, self.config) for n in etcd_nodes) self._etcd_endpoint = make_etcd_endpoint(self._nodes) # Start now the master node, since its address is needed in all # worker nodes, and it will not be known until the master node is # up. n = master_node self._nodes.append( self.provider.ensure_node(n["name"], MasterNode, n["size"], self, self.config)) self._master_ip = make_master_ip(self._nodes) # Start now all worker nodes. self._nodes.extend( utils.parallel( (self.provider.ensure_node, n["name"], NODE_TYPES[n["type"]], n["size"], self, self.config) for n in worker_nodes)) return self._nodes