def start_cluster(argv): wait = False wait_timeout = None if "--wait" in utils.pcs_options: wait_timeout = utils.validate_wait_get_timeout(False) wait = True if len(argv) > 0: nodes = set(argv) # unique start_cluster_nodes(nodes) if wait: wait_for_nodes_started(nodes, wait_timeout) return print("Starting Cluster...") service_list = ["corosync"] if utils.need_to_handle_qdevice_service(): service_list.append("corosync-qdevice") service_list.append("pacemaker") for service in service_list: output, retval = utils.start_service(service) if retval != 0: print(output) utils.err("unable to start {0}".format(service)) if wait: wait_for_nodes_started([], wait_timeout)
def start_cluster_all(): wait = False wait_timeout = None if "--wait" in utils.pcs_options: wait_timeout = utils.validate_wait_get_timeout(False) wait = True all_nodes = utils.get_corosync_conf_facade().get_nodes_names() start_cluster_nodes(all_nodes) if wait: wait_for_nodes_started(all_nodes, wait_timeout)
def cluster_push(argv): if len(argv) > 2: usage.cluster(["cib-push"]) sys.exit(1) filename = None scope = None timeout = None diff_against = None if "--wait" in utils.pcs_options: timeout = utils.validate_wait_get_timeout() for arg in argv: if "=" not in arg: filename = arg else: arg_name, arg_value = arg.split("=", 1) if arg_name == "scope": if "--config" in utils.pcs_options: utils.err("Cannot use both scope and --config") if not utils.is_valid_cib_scope(arg_value): utils.err("invalid CIB scope '%s'" % arg_value) else: scope = arg_value elif arg_name == "diff-against": diff_against = arg_value else: usage.cluster(["cib-push"]) sys.exit(1) if "--config" in utils.pcs_options: scope = "configuration" if diff_against and scope: utils.err("Cannot use both scope and diff-against") if not filename: usage.cluster(["cib-push"]) sys.exit(1) try: new_cib_dom = xml.dom.minidom.parse(filename) if scope and not new_cib_dom.getElementsByTagName(scope): utils.err("unable to push cib, scope '%s' not present in new cib" % scope) except (EnvironmentError, xml.parsers.expat.ExpatError) as e: utils.err("unable to parse new cib: %s" % e) if diff_against: try: xml.dom.minidom.parse(diff_against) except (EnvironmentError, xml.parsers.expat.ExpatError) as e: utils.err("unable to parse original cib: %s" % e) runner = utils.cmd_runner() command = [ "crm_diff", "--original", diff_against, "--new", filename, "--no-version" ] patch, error, dummy_retval = runner.run(command) # dummy_retval == 1 means one of two things: # a) an error has occured # b) --original and --new differ # therefore it's of no use to see if an error occurred if error.strip(): utils.err("unable to diff the CIBs:\n" + error) if not patch.strip(): print( "The new CIB is the same as the original CIB, nothing to push." ) sys.exit(0) command = ["cibadmin", "--patch", "--xml-pipe"] output, error, retval = runner.run(command, patch) if retval != 0: utils.err("unable to push cib\n" + error + output) else: command = ["cibadmin", "--replace", "--xml-file", filename] if scope: command.append("--scope=%s" % scope) output, retval = utils.run(command) if retval != 0: utils.err("unable to push cib\n" + output) print("CIB updated") if "--wait" not in utils.pcs_options: return cmd = ["crm_resource", "--wait"] if timeout: cmd.extend(["--timeout", str(timeout)]) output, retval = utils.run(cmd) if retval != 0: msg = [] if retval == settings.pacemaker_wait_timeout_status: msg.append("waiting timeout") if output: msg.append("\n" + output) utils.err("\n".join(msg).strip())