def location_rule(argv): if len(argv) < 3: usage.constraint("location rule") sys.exit(1) res_name = argv.pop(0) resource_valid, resource_error = utils.validate_constraint_resource( utils.get_cib_dom(), res_name ) if not resource_valid: utils.err(resource_error) argv.pop(0) cib = utils.get_cib_dom() constraints = cib.getElementsByTagName("constraints")[0] lc = cib.createElement("rsc_location") constraints.appendChild(lc) lc_id = utils.find_unique_id(cib, "location-" + res_name) lc.setAttribute("id", lc_id) lc.setAttribute("rsc", res_name) rule_utils.dom_rule_add(lc, argv) utils.replace_cib_configuration(cib)
def location_rule(argv): if len(argv) < 3: usage.constraint(["location", "rule"]) sys.exit(1) res_name = argv.pop(0) resource_valid, resource_error, correct_id \ = utils.validate_constraint_resource(utils.get_cib_dom(), res_name) if "--autocorrect" in utils.pcs_options and correct_id: res_name = correct_id elif not resource_valid: utils.err(resource_error) argv.pop(0) # pop "rule" options, rule_argv = rule_utils.parse_argv(argv, { "constraint-id": None, "resource-discovery": None, }) # If resource-discovery is specified, we use it with the rsc_location # element not the rule if "resource-discovery" in options and options["resource-discovery"]: utils.checkAndUpgradeCIB(2, 2, 0) cib, constraints = getCurrentConstraints(utils.get_cib_dom()) lc = cib.createElement("rsc_location") lc.setAttribute("resource-discovery", options.pop("resource-discovery")) else: cib, constraints = getCurrentConstraints(utils.get_cib_dom()) lc = cib.createElement("rsc_location") constraints.appendChild(lc) if options.get("constraint-id"): id_valid, id_error = utils.validate_xml_id(options["constraint-id"], 'constraint id') if not id_valid: utils.err(id_error) if utils.does_id_exist(cib, options["constraint-id"]): utils.err("id '%s' is already in use, please specify another one" % options["constraint-id"]) lc.setAttribute("id", options["constraint-id"]) del options["constraint-id"] else: lc.setAttribute("id", utils.find_unique_id(cib, "location-" + res_name)) lc.setAttribute("rsc", res_name) rule_utils.dom_rule_add(lc, options, rule_argv) location_rule_check_duplicates(constraints, lc) utils.replace_cib_configuration(cib)
def location_rule(argv): if len(argv) < 3: usage.constraint(["location", "rule"]) sys.exit(1) res_name = argv.pop(0) resource_valid, resource_error, correct_id \ = utils.validate_constraint_resource(utils.get_cib_dom(), res_name) if "--autocorrect" in utils.pcs_options and correct_id: res_name = correct_id elif not resource_valid: utils.err(resource_error) argv.pop(0) # pop "rule" options, rule_argv = rule_utils.parse_argv(argv, {"constraint-id": None, "resource-discovery": None,}) # If resource-discovery is specified, we use it with the rsc_location # element not the rule if "resource-discovery" in options and options["resource-discovery"]: utils.checkAndUpgradeCIB(2,2,0) cib, constraints = getCurrentConstraints(utils.get_cib_dom()) lc = cib.createElement("rsc_location") lc.setAttribute("resource-discovery", options.pop("resource-discovery")) else: cib, constraints = getCurrentConstraints(utils.get_cib_dom()) lc = cib.createElement("rsc_location") constraints.appendChild(lc) if options.get("constraint-id"): id_valid, id_error = utils.validate_xml_id( options["constraint-id"], 'constraint id' ) if not id_valid: utils.err(id_error) if utils.does_id_exist(cib, options["constraint-id"]): utils.err( "id '%s' is already in use, please specify another one" % options["constraint-id"] ) lc.setAttribute("id", options["constraint-id"]) del options["constraint-id"] else: lc.setAttribute("id", utils.find_unique_id(cib, "location-" + res_name)) lc.setAttribute("rsc", res_name) rule_utils.dom_rule_add(lc, options, rule_argv) location_rule_check_duplicates(constraints, lc) utils.replace_cib_configuration(cib)
def constraint_resource_update(old_id, passed_dom=None): dom = utils.get_cib_dom() if passed_dom is None else passed_dom resources = dom.getElementsByTagName("primitive") found_resource = None for res in resources: if res.getAttribute("id") == old_id: found_resource = res break new_id = None if found_resource: if found_resource.parentNode.tagName == "master" or found_resource.parentNode.tagName == "clone": new_id = found_resource.parentNode.getAttribute("id") if new_id: constraints = dom.getElementsByTagName("rsc_location") constraints += dom.getElementsByTagName("rsc_order") constraints += dom.getElementsByTagName("rsc_colocation") attrs_to_update=["rsc","first","then", "with-rsc"] for constraint in constraints: for attr in attrs_to_update: if constraint.getAttribute(attr) == old_id: constraint.setAttribute(attr, new_id) if passed_dom is None: utils.replace_cib_configuration(dom) if passed_dom: return dom
def order_set(argv): setoptions = [] for i in range(len(argv)): if argv[i] == "setoptions": setoptions = argv[i + 1:] argv[i:] = [] break argv.insert(0, "set") resource_sets = set_args_into_array(argv) if not check_empty_resource_sets(resource_sets): usage.constraint(["order set"]) sys.exit(1) cib, constraints = getCurrentConstraints(utils.get_cib_dom()) attributes = [] id_specified = False for opt in setoptions: if "=" not in opt: utils.err("missing value of '%s' option" % opt) name, value = opt.split("=", 1) if name == "id": id_valid, id_error = utils.validate_xml_id(value, 'constraint id') if not id_valid: utils.err(id_error) if utils.does_id_exist(cib, value): utils.err( "id '%s' is already in use, please specify another one" % value) id_specified = True attributes.append((name, value)) elif name == "kind": normalized_value = value.lower().capitalize() if normalized_value not in OPTIONS_KIND: utils.err("invalid kind value '%s', allowed values are: %s" % (value, ", ".join(OPTIONS_KIND))) attributes.append((name, normalized_value)) elif name == "symmetrical": if value.lower() not in OPTIONS_SYMMETRICAL: utils.err( "invalid symmetrical value '%s', allowed values are: %s" % (value, ", ".join(OPTIONS_SYMMETRICAL))) attributes.append((name, value.lower())) else: utils.err("invalid option '%s', allowed options are: %s" % (name, "kind, symmetrical, id")) if not id_specified: order_id = "pcs_rsc_order" for a in argv: if "=" not in a: order_id += "_" + a attributes.append(("id", utils.find_unique_id(cib, order_id))) rsc_order = cib.createElement("rsc_order") for name, value in attributes: rsc_order.setAttribute(name, value) set_add_resource_sets(rsc_order, resource_sets, cib) constraints.appendChild(rsc_order) utils.replace_cib_configuration(cib)
def resource_clone_remove(argv): if len(argv) != 1: usage.resource() sys.exit(1) name = argv.pop() dom = utils.get_cib_dom() re = dom.documentElement.getElementsByTagName("resources")[0] found = False for res in re.getElementsByTagName("primitive") + re.getElementsByTagName("group"): if res.getAttribute("id") == name: clone = res.parentNode if clone.tagName != "clone": print "Error: %s is not in a clone" % name sys.exit(1) clone.parentNode.appendChild(res) clone.parentNode.removeChild(clone) found = True break if found == False: print "Error: could not find resource or group: %s" % name sys.exit(1) xml_resource_string = re.toxml() args = ["cibadmin", "-o", "resources", "-R", "-X", xml_resource_string] output, retval = utils.run(args) if retval != 0: print output sys.exit(1)
def constraint_resource_update(old_id): dom = utils.get_cib_dom() resources = dom.getElementsByTagName("primitive") found_resource = None for res in resources: if res.getAttribute("id") == old_id: found_resource = res break new_id = None if found_resource: if found_resource.parentNode.tagName == "master" or found_resource.parentNode.tagName == "clone": new_id = found_resource.parentNode.getAttribute("id") if new_id: constraints = dom.getElementsByTagName("rsc_location") constraints += dom.getElementsByTagName("rsc_order") constraints += dom.getElementsByTagName("rsc_colocation") attrs_to_update=["rsc","first","then", "with-rsc"] for constraint in constraints: for attr in attrs_to_update: if constraint.getAttribute(attr) == old_id: constraint.setAttribute(attr, new_id) update = dom.getElementsByTagName("constraints")[0].toxml() output, retval = utils.run(["cibadmin", "--replace", "-o", "constraints", "-X", update])
def constraint_resource_update(old_id): dom = utils.get_cib_dom() resources = dom.getElementsByTagName("primitive") found_resource = None for res in resources: if res.getAttribute("id") == old_id: found_resource = res break new_id = None if found_resource: if found_resource.parentNode.tagName == "master" or found_resource.parentNode.tagName == "clone": new_id = found_resource.parentNode.getAttribute("id") if new_id: constraints = dom.getElementsByTagName("rsc_location") constraints += dom.getElementsByTagName("rsc_order") constraints += dom.getElementsByTagName("rsc_colocation") attrs_to_update = ["rsc", "first", "then", "with-rsc"] for constraint in constraints: for attr in attrs_to_update: if constraint.getAttribute(attr) == old_id: constraint.setAttribute(attr, new_id) update = dom.getElementsByTagName("constraints")[0].toxml() output, retval = utils.run( ["cibadmin", "--replace", "-o", "constraints", "-X", update])
def find_constraints_containing(resource_id): dom = utils.get_cib_dom() constraints_found = [] resources = dom.getElementsByTagName("primitive") resource_match = None for res in resources: if res.getAttribute("id") == resource_id: resource_match = res break if resource_match: if resource_match.parentNode.tagName == "master" or resource_match.parentNode.tagName == "clone": constraints_found = find_constraints_containing( resource_match.parentNode.getAttribute("id")) constraints = dom.getElementsByTagName("constraints") if len(constraints) == 0: return [] else: constraints = constraints[0] myConstraints = constraints.getElementsByTagName("rsc_colocation") myConstraints += constraints.getElementsByTagName("rsc_location") myConstraints += constraints.getElementsByTagName("rsc_order") attr_to_match = ["rsc", "first", "then", "with-rsc", "first", "then"] for c in myConstraints: for attr in attr_to_match: if c.getAttribute(attr) == resource_id: constraints_found.append(c.getAttribute("id")) break return constraints_found
def stonith_level_add(level, node, devices): dom = utils.get_cib_dom() if not "--force" in utils.pcs_options: for dev in devices.split(","): if not utils.is_stonith_resource(dev): utils.err("%s is not a stonith id (use --force to override)" % dev) if not utils.is_corosync_node(node): utils.err("%s is not currently a node (use --force to override)" % node) ft = dom.getElementsByTagName("fencing-topology") if len(ft) == 0: conf = dom.getElementsByTagName("configuration")[0] ft = dom.createElement("fencing-topology") conf.appendChild(ft) else: ft = ft[0] fls = ft.getElementsByTagName("fencing-level") for fl in fls: if fl.getAttribute("target") == node and fl.getAttribute("index") == level and fl.getAttribute("devices") == devices: utils.err("unable to add fencing level, fencing level for node: %s, at level: %s, with device: %s already exists" % (node,level,devices)) new_fl = dom.createElement("fencing-level") ft.appendChild(new_fl) new_fl.setAttribute("target", node) new_fl.setAttribute("index", level) new_fl.setAttribute("devices", devices) new_fl.setAttribute("id", utils.find_unique_id(dom, "fl-" + node +"-" + level)) utils.replace_cib_configuration(dom)
def acl_permission(argv): if len(argv) < 1: usage.acl("permission") sys.exit(1) dom = utils.get_cib_dom() dom, acls = get_acls(dom) command = argv.pop(0) if command == "add": if len(argv) < 4: usage.acl("permission add") sys.exit(1) role_id = argv.pop(0) found = False for role in dom.getElementsByTagName("acl_role"): if role.getAttribute("id") == role_id: found = True break if found == False: acl_role(["create", role_id] + argv) return while len(argv) >= 3: kind = argv.pop(0) se = dom.createElement("acl_permission") se.setAttribute("id", utils.find_unique_id(dom, role_id + "-" + kind)) se.setAttribute("kind", kind) xp_id = argv.pop(0) if xp_id == "xpath": xpath_query = argv.pop(0) se.setAttribute("xpath",xpath_query) elif xp_id == "id": acl_ref = argv.pop(0) se.setAttribute("reference",acl_ref) else: usage.acl("permission add") role.appendChild(se) utils.replace_cib_configuration(dom) elif command == "delete": if len(argv) < 1: usage.acl("permission delete") sys.exit(1) perm_id = argv.pop(0) found = False for elem in dom.getElementsByTagName("acl_permission"): if elem.getAttribute("id") == perm_id: elem.parentNode.removeChild(elem) found = True if not found: utils.err("Unable to find permission with id: %s" % perm_id) utils.replace_cib_configuration(dom) else: usage.acl("permission") sys.exit(1)
def resource_master_remove(argv): if len(argv) < 1: usage.resource() sys.exit(1) dom = utils.get_cib_dom() master_id = argv.pop(0) master_found = False # Check to see if there's a resource/group with the master_id if so, we remove the parent for rg in (dom.getElementsByTagName("primitive") + dom.getElementsByTagName("group")): if rg.getAttribute("id") == master_id and rg.parentNode.tagName == "master": master_id = rg.parentNode.getAttribute("id") resources_to_cleanup = [] for master in dom.getElementsByTagName("master"): if master.getAttribute("id") == master_id: childNodes = master.getElementsByTagName("primitive") for child in childNodes: resources_to_cleanup.append(child.getAttribute("id")) master_found = True break if not master_found: print "Error: Unable to find multi-state resource with id %s" % master_id sys.exit(1) master.parentNode.removeChild(master) utils.replace_cib_configuration(dom) if (not utils.usefile): for r in resources_to_cleanup: args = ["crm_resource","-C","-r",r] cmdoutput, retVal = utils.run(args)
def cluster_remote_node(argv): if len(argv) < 1: usage.cluster(["remote-node"]) sys.exit(1) command = argv.pop(0) if command == "add": if len(argv) < 2: usage.cluster(["remote-node"]) sys.exit(1) hostname = argv.pop(0) rsc = argv.pop(0) if not utils.is_resource(rsc): utils.err("unable to find resource '%s'", rsc) resource.resource_update(rsc, ["meta", "remote-node="+hostname] + argv) elif command in ["remove","delete"]: if len(argv) < 1: usage.cluster(["remote-node"]) sys.exit(1) hostname = argv.pop(0) dom = utils.get_cib_dom() nvpairs = dom.getElementsByTagName("nvpair") nvpairs_to_remove = [] for nvpair in nvpairs: if nvpair.getAttribute("name") == "remote-node" and nvpair.getAttribute("value") == hostname: for np in nvpair.parentNode.getElementsByTagName("nvpair"): if np.getAttribute("name").startswith("remote-"): nvpairs_to_remove.append(np) for nvpair in nvpairs_to_remove[:]: nvpair.parentNode.removeChild(nvpair) utils.replace_cib_configuration(dom) else: usage.cluster(["remote-node"]) sys.exit(1)
def cluster_remote_node(argv): if len(argv) < 1: usage.cluster(["remote-node"]) sys.exit(1) command = argv.pop(0) if command == "add": if len(argv) < 2: usage.cluster(["remote-node"]) sys.exit(1) hostname = argv.pop(0) rsc = argv.pop(0) if not utils.is_resource(rsc): utils.err("unable to find resource '%s'", rsc) resource.resource_update(rsc, ["meta", "remote-node="+hostname] + argv) elif command == "remove": if len(argv) < 1: usage.cluster(["remote-node"]) sys.exit(1) hostname = argv.pop(0) dom = utils.get_cib_dom() nvpairs = dom.getElementsByTagName("nvpair") nvpairs_to_remove = [] for nvpair in nvpairs: if nvpair.getAttribute("name") == "remote-node" and nvpair.getAttribute("value") == hostname: for np in nvpair.parentNode.getElementsByTagName("nvpair"): if np.getAttribute("name").startswith("remote-"): nvpairs_to_remove.append(np) for nvpair in nvpairs_to_remove[:]: nvpair.parentNode.removeChild(nvpair) utils.replace_cib_configuration(dom) else: usage.cluster(["remote-node"]) sys.exit(1)
def stonith_level_show(): dom = utils.get_cib_dom() node_levels = {} fls = dom.getElementsByTagName("fencing-level") for fl in fls: node = fl.getAttribute("target") level = fl.getAttribute("index") devices = fl.getAttribute("devices") if node in node_levels: node_levels[node].append((level,devices)) else: node_levels[node] = [(level,devices)] if len(node_levels.keys()) == 0: return nodes = node_levels.keys() nodes.sort() for node in nodes: print " Node: " + node node_levels[node].sort() for level in node_levels[node]: print " Level " + level[0] + " - " + level[1]
def stonith_level_show(): dom = utils.get_cib_dom() node_levels = {} fls = dom.getElementsByTagName("fencing-level") for fl in fls: node = fl.getAttribute("target") level = fl.getAttribute("index") devices = fl.getAttribute("devices") if node in node_levels: node_levels[node].append((level, devices)) else: node_levels[node] = [(level, devices)] if len(list(node_levels.keys())) == 0: return nodes = list(node_levels.keys()) nodes.sort() for node in nodes: print(" Node: " + node) for level in sorted(node_levels[node], key=lambda x: int(x[0])): print(" Level " + level[0] + " - " + level[1])
def find_constraints_containing(resource_id): dom = utils.get_cib_dom() constraints_found = [] resources = dom.getElementsByTagName("primitive") resource_match = None for res in resources: if res.getAttribute("id") == resource_id: resource_match = res break if resource_match: if resource_match.parentNode.tagName == "master" or resource_match.parentNode.tagName == "clone": constraints_found = find_constraints_containing(resource_match.parentNode.getAttribute("id")) constraints = dom.getElementsByTagName("constraints") if len(constraints) == 0: return [] else: constraints = constraints[0] myConstraints = constraints.getElementsByTagName("rsc_colocation") myConstraints += constraints.getElementsByTagName("rsc_location") myConstraints += constraints.getElementsByTagName("rsc_order") attr_to_match = ["rsc", "first", "then", "with-rsc", "first", "then"] for c in myConstraints: for attr in attr_to_match: if c.getAttribute(attr) == resource_id: constraints_found.append(c.getAttribute("id")) break return constraints_found
def constraint_rule(argv): if len(argv) < 2: usage.constraint("rule") sys.exit(1) found = False command = argv.pop(0) constraint_id = None rule_id = None if command == "add": constraint_id = argv.pop(0) cib = utils.get_cib_dom() constraint = utils.dom_get_element_with_id( cib.getElementsByTagName("constraints")[0], "rsc_location", constraint_id ) if not constraint: utils.err("Unable to find constraint: " + constraint_id) options, rule_argv = rule_utils.parse_argv(argv) rule_utils.dom_rule_add(constraint, options, rule_argv) location_rule_check_duplicates(cib, constraint) utils.replace_cib_configuration(cib) elif command in ["remove","delete"]: cib = utils.get_cib_etree() temp_id = argv.pop(0) constraints = cib.find('.//constraints') loc_cons = cib.findall(str('.//rsc_location')) rules = cib.findall(str('.//rule')) for loc_con in loc_cons: for rule in loc_con: if rule.get("id") == temp_id: if len(loc_con) > 1: print("Removing Rule: {0}".format(rule.get("id"))) loc_con.remove(rule) found = True break else: print( "Removing Constraint: {0}".format(loc_con.get("id")) ) constraints.remove(loc_con) found = True break if found == True: break if found: utils.replace_cib_configuration(cib) else: utils.err("unable to find rule with id: %s" % temp_id) else: usage.constraint("rule") sys.exit(1)
def stonith_level_add(level, node, devices): dom = utils.get_cib_dom() if not "--force" in utils.pcs_options: for dev in devices.split(","): if not utils.is_stonith_resource(dev): utils.err("%s is not a stonith id (use --force to override)" % dev) if not utils.is_pacemaker_node(node) and not utils.is_corosync_node(node): utils.err("%s is not currently a node (use --force to override)" % node) ft = dom.getElementsByTagName("fencing-topology") if len(ft) == 0: conf = dom.getElementsByTagName("configuration")[0] ft = dom.createElement("fencing-topology") conf.appendChild(ft) else: ft = ft[0] fls = ft.getElementsByTagName("fencing-level") for fl in fls: if fl.getAttribute("target") == node and fl.getAttribute("index") == level and fl.getAttribute("devices") == devices: utils.err("unable to add fencing level, fencing level for node: %s, at level: %s, with device: %s already exists" % (node,level,devices)) new_fl = dom.createElement("fencing-level") ft.appendChild(new_fl) new_fl.setAttribute("target", node) new_fl.setAttribute("index", level) new_fl.setAttribute("devices", devices) new_fl.setAttribute("id", utils.find_unique_id(dom, "fl-" + node +"-" + level)) utils.replace_cib_configuration(dom)
def print_node_utilization(node): cib = utils.get_cib_dom() node_el = utils.dom_get_node(cib, node) if node_el is None: utils.err("Unable to find a node: {0}".format(node)) utilization = utils.get_utilization_str(node_el) print("Node Utilization:") print(" {0}: {1}".format(node, utilization))
def location_add(argv, rm=False): if len(argv) != 4 and (rm == False or len(argv) < 1): usage.constraint() sys.exit(1) constraint_id = argv.pop(0) # If we're removing, we only care about the id if (rm == True): resource_name = "" node = "" score = "" else: id_valid, id_error = utils.validate_xml_id(constraint_id, 'constraint id') if not id_valid: utils.err(id_error) resource_name = argv.pop(0) node = argv.pop(0) score = argv.pop(0) resource_valid, resource_error = utils.validate_constraint_resource( utils.get_cib_dom(), resource_name) if not resource_valid: utils.err(resource_error) if not utils.is_score(score): utils.err( "invalid score '%s', use integer or INFINITY or -INFINITY" % score) # Verify current constraint doesn't already exist # If it does we replace it with the new constraint (dom, constraintsElement) = getCurrentConstraints() elementsToRemove = [] # If the id matches, or the rsc & node match, then we replace/remove for rsc_loc in constraintsElement.getElementsByTagName('rsc_location'): if (constraint_id == rsc_loc.getAttribute("id")) or \ (rsc_loc.getAttribute("rsc") == resource_name and \ rsc_loc.getAttribute("node") == node and not rm): elementsToRemove.append(rsc_loc) for etr in elementsToRemove: constraintsElement.removeChild(etr) if (rm == True and len(elementsToRemove) == 0): utils.err("resource location id: " + constraint_id + " not found.") if (not rm): element = dom.createElement("rsc_location") element.setAttribute("id", constraint_id) element.setAttribute("rsc", resource_name) element.setAttribute("node", node) element.setAttribute("score", score) constraintsElement.appendChild(element) utils.replace_cib_configuration(dom)
def stonith_cmd(argv): if len(argv) == 0: argv = ["show"] sub_cmd = argv.pop(0) if (sub_cmd == "help"): usage.stonith(argv) elif (sub_cmd == "list"): stonith_list_available(argv) elif (sub_cmd == "describe"): if len(argv) == 1: stonith_list_options(argv[0]) else: usage.stonith() sys.exit(1) elif (sub_cmd == "create"): if len(argv) < 2: usage.stonith() sys.exit(1) stn_id = argv.pop(0) stn_type = "stonith:"+argv.pop(0) st_values, op_values, meta_values = resource.parse_resource_options( argv, with_clone=False ) resource.resource_create(stn_id, stn_type, st_values, op_values, meta_values) elif (sub_cmd == "update"): stn_id = argv.pop(0) resource.resource_update(stn_id,argv) elif (sub_cmd == "delete"): if len(argv) == 1: stn_id = argv.pop(0) utils.replace_cib_configuration( stonith_level_rm_device(utils.get_cib_dom(), stn_id) ) resource.resource_remove(stn_id) else: usage.stonith(["delete"]) sys.exit(1) elif (sub_cmd == "show"): resource.resource_show(argv, True) stonith_level([]) elif (sub_cmd == "level"): stonith_level(argv) elif (sub_cmd == "fence"): stonith_fence(argv) elif (sub_cmd == "cleanup"): if len(argv) == 0: resource.resource_cleanup_all() else: res_id = argv.pop(0) resource.resource_cleanup(res_id) elif (sub_cmd == "confirm"): stonith_confirm(argv) else: usage.stonith() sys.exit(1)
def stonith_level_rm(level, node, devices): dom = utils.get_cib_dom() if devices != "": node_devices_combo = node + "," + devices else: node_devices_combo = node ft = dom.getElementsByTagName("fencing-topology") if len(ft) == 0: utils.err( "unable to remove fencing level, fencing level for node: %s, at level: %s, with device: %s doesn't exist" % (node, level, devices)) else: ft = ft[0] fls = ft.getElementsByTagName("fencing-level") fls_to_remove = [] if node != "": if devices != "": found = False for fl in fls: if fl.getAttribute("target") == node and fl.getAttribute( "index") == level and fl.getAttribute( "devices") == devices: found = True break if fl.getAttribute("index") == level and fl.getAttribute( "devices") == node_devices_combo: found = True break if found == False: utils.err( "unable to remove fencing level, fencing level for node: %s, at level: %s, with device: %s doesn't exist" % (node, level, devices)) fl.parentNode.removeChild(fl) else: for fl in fls: if fl.getAttribute("index") == level and ( fl.getAttribute("target") == node or fl.getAttribute("devices") == node): fl.parentNode.removeChild(fl) else: for fl in fls: if fl.getAttribute("index") == level: parent = fl.parentNode parent.removeChild(fl) if len(parent.getElementsByTagName("fencing-level")) == 0: parent.parentNode.removeChild(parent) break utils.replace_cib_configuration(dom)
def print_nodes_utilization(): cib = utils.get_cib_dom() utilization = {} for node_el in cib.getElementsByTagName("node"): u = utils.get_utilization_str(node_el) if u: utilization[node_el.getAttribute("uname")] = u print("Node Utilization:") for node in sorted(utilization): print(" {0}: {1}".format(node, utilization[node]))
def set_node_utilization(node, argv): cib = utils.get_cib_dom() node_el = utils.dom_get_node(cib, node) if node_el is None: utils.err("Unable to find a node: {0}".format(node)) utils.dom_update_utilization( node_el, utils.convert_args_to_tuples(argv), "nodes-" ) utils.replace_cib_configuration(cib)
def acl_target(argv,group=False): if len(argv) < 2: if group: usage.acl("group") sys.exit(1) else: usage.acl("target") sys.exit(1) dom = utils.get_cib_dom() dom, acls = get_acls(dom) command = argv.pop(0) tug_id = argv.pop(0) if command == "create": if utils.does_id_exist(dom,tug_id): utils.err(tug_id + " already exists in cib") if group: element = dom.createElement("acl_group") else: element = dom.createElement("acl_target") element.setAttribute("id", tug_id) acls.appendChild(element) for role in argv: r = dom.createElement("role") r.setAttribute("id", role) element.appendChild(r) utils.replace_cib_configuration(dom) elif command == "delete": found = False if group: elist = dom.getElementsByTagName("acl_group") else: elist = dom.getElementsByTagName("acl_target") for elem in elist: if elem.getAttribute("id") == tug_id: found = True elem.parentNode.removeChild(elem) break if not found: if group: utils.err("unable to find acl group: %s" % tug_id) else: utils.err("unable to find acl target/user: %s" % tug_id) utils.replace_cib_configuration(dom) else: if group: usage.acl("group") else: usage.acl("target") sys.exit(1)
def acl_target(argv, group=False): if len(argv) < 2: if group: usage.acl("group") sys.exit(1) else: usage.acl("target") sys.exit(1) dom = utils.get_cib_dom() dom, acls = get_acls(dom) command = argv.pop(0) tug_id = argv.pop(0) if command == "create": if utils.does_id_exist(dom, tug_id): utils.err(tug_id + " already exists in cib") if group: element = dom.createElement("acl_group") else: element = dom.createElement("acl_target") element.setAttribute("id", tug_id) acls.appendChild(element) for role in argv: r = dom.createElement("role") r.setAttribute("id", role) element.appendChild(r) utils.replace_cib_configuration(dom) elif command == "delete": found = False if group: elist = dom.getElementsByTagName("acl_group") else: elist = dom.getElementsByTagName("acl_target") for elem in elist: if elem.getAttribute("id") == tug_id: found = True elem.parentNode.removeChild(elem) break if not found: if group: utils.err("unable to find acl group: %s" % tug_id) else: utils.err("unable to find acl target/user: %s" % tug_id) utils.replace_cib_configuration(dom) else: if group: usage.acl("group") else: usage.acl("target") sys.exit(1)
def stonith_cmd(argv): if len(argv) == 0: argv = ["show"] sub_cmd = argv.pop(0) if (sub_cmd == "help"): usage.stonith(argv) elif (sub_cmd == "list"): stonith_list_available(argv) elif (sub_cmd == "describe"): if len(argv) == 1: stonith_list_options(argv[0]) else: usage.stonith() sys.exit(1) elif (sub_cmd == "create"): if len(argv) < 2: usage.stonith() sys.exit(1) stn_id = argv.pop(0) stn_type = "stonith:" + argv.pop(0) st_values, op_values, meta_values = resource.parse_resource_options( argv, with_clone=False) resource.resource_create(stn_id, stn_type, st_values, op_values, meta_values) elif (sub_cmd == "update"): stn_id = argv.pop(0) resource.resource_update(stn_id, argv) elif (sub_cmd == "delete"): if len(argv) == 1: stn_id = argv.pop(0) utils.replace_cib_configuration( stonith_level_rm_device(utils.get_cib_dom(), stn_id)) resource.resource_remove(stn_id) else: usage.stonith(["delete"]) sys.exit(1) elif (sub_cmd == "show"): resource.resource_show(argv, True) stonith_level([]) elif (sub_cmd == "level"): stonith_level(argv) elif (sub_cmd == "fence"): stonith_fence(argv) elif (sub_cmd == "cleanup"): if len(argv) == 0: resource.resource_cleanup_all() else: res_id = argv.pop(0) resource.resource_cleanup(res_id) elif (sub_cmd == "confirm"): stonith_confirm(argv) else: usage.stonith() sys.exit(1)
def constraint_rule(argv): if len(argv) < 2: usage.constraint("rule") sys.exit(1) found = False command = argv.pop(0) constraint_id = None rule_id = None if command == "add": constraint_id = argv.pop(0) cib = utils.get_cib_dom() constraint = utils.dom_get_element_with_id( cib.getElementsByTagName("constraints")[0], "rsc_location", constraint_id) if not constraint: utils.err("Unable to find constraint: " + constraint_id) options, rule_argv = rule_utils.parse_argv(argv) rule_utils.dom_rule_add(constraint, options, rule_argv) location_rule_check_duplicates(cib, constraint) utils.replace_cib_configuration(cib) elif command in ["remove", "delete"]: cib = utils.get_cib_etree() temp_id = argv.pop(0) constraints = cib.find('.//constraints') loc_cons = cib.findall('.//rsc_location') rules = cib.findall('.//rule') for loc_con in loc_cons: for rule in loc_con: if rule.get("id") == temp_id: if len(loc_con) > 1: print("Removing Rule:", rule.get("id")) loc_con.remove(rule) found = True break else: print("Removing Constraint:", loc_con.get("id")) constraints.remove(loc_con) found = True break if found == True: break if found: utils.replace_cib_configuration(cib) else: utils.err("unable to find rule with id: %s" % temp_id) else: usage.constraint("rule") sys.exit(1)
def location_add(argv,rm=False): if len(argv) != 4 and (rm == False or len(argv) < 1): usage.constraint() sys.exit(1) constraint_id = argv.pop(0) # If we're removing, we only care about the id if (rm == True): resource_name = "" node = "" score = "" else: id_valid, id_error = utils.validate_xml_id(constraint_id, 'constraint id') if not id_valid: utils.err(id_error) resource_name = argv.pop(0) node = argv.pop(0) score = argv.pop(0) resource_valid, resource_error = utils.validate_constraint_resource( utils.get_cib_dom(), resource_name ) if not resource_valid: utils.err(resource_error) if not utils.is_score(score): utils.err("invalid score '%s', use integer or INFINITY or -INFINITY" % score) # Verify current constraint doesn't already exist # If it does we replace it with the new constraint (dom,constraintsElement) = getCurrentConstraints() elementsToRemove = [] # If the id matches, or the rsc & node match, then we replace/remove for rsc_loc in constraintsElement.getElementsByTagName('rsc_location'): if (constraint_id == rsc_loc.getAttribute("id")) or \ (rsc_loc.getAttribute("rsc") == resource_name and \ rsc_loc.getAttribute("node") == node and not rm): elementsToRemove.append(rsc_loc) for etr in elementsToRemove: constraintsElement.removeChild(etr) if (rm == True and len(elementsToRemove) == 0): utils.err("resource location id: " + constraint_id + " not found.") if (not rm): element = dom.createElement("rsc_location") element.setAttribute("id",constraint_id) element.setAttribute("rsc",resource_name) element.setAttribute("node",node) element.setAttribute("score",score) constraintsElement.appendChild(element) utils.replace_cib_configuration(dom)
def unset_property(argv): if len(argv) < 1: usage.property() sys.exit(1) if "--node" in utils.pcs_options: for arg in argv: utils.set_node_attribute(arg, "",utils.pcs_options["--node"]) else: cib_dom = utils.get_cib_dom() for arg in argv: utils.set_cib_property(arg, "", cib_dom) utils.replace_cib_configuration(cib_dom)
def stonith_level_verify(): dom = utils.get_cib_dom() fls = dom.getElementsByTagName("fencing-level") for fl in fls: node = fl.getAttribute("target") level = fl.getAttribute("index") devices = fl.getAttribute("devices") for dev in devices.split(","): if not utils.is_stonith_resource(dev): utils.err("%s is not a stonith id" % dev) if not utils.is_corosync_node(node): utils.err("%s is not currently a node" % node)
def stonith_level_verify(): dom = utils.get_cib_dom() fls = dom.getElementsByTagName("fencing-level") for fl in fls: node = fl.getAttribute("target") level = fl.getAttribute("index") devices = fl.getAttribute("devices") for dev in devices.split(","): if not utils.is_stonith_resource(dev): utils.err("%s is not a stonith id" % dev) if not utils.is_corosync_node(node) and not utils.is_pacemaker_node(node): utils.err("%s is not currently a node" % node)
def order_set(argv): current_set = set_args_into_array(argv) order_id = "pcs_rsc_order" for a in argv: if a.find('=') == -1: order_id = order_id + "_" + a cib, constraints = getCurrentConstraints(utils.get_cib_dom()) rsc_order = cib.createElement("rsc_order") constraints.appendChild(rsc_order) rsc_order.setAttribute("id", utils.find_unique_id(cib, order_id)) set_add_resource_sets(rsc_order, current_set, cib) utils.replace_cib_configuration(cib)
def acl_show(argv): dom = utils.get_cib_dom() properties = prop.get_set_properties(defaults=prop.get_default_properties()) acl_enabled = properties.get("enable-acl", "").lower() if utils.is_cib_true(acl_enabled): print("ACLs are enabled") else: print("ACLs are disabled, run 'pcs acl enable' to enable") print() print_targets(dom) print_groups(dom) print_roles(dom)
def acl_permission(argv): if len(argv) < 1: usage.acl(["permission"]) sys.exit(1) dom = utils.get_cib_dom() dom, acls = get_acls(dom) command = argv.pop(0) if command == "add": if len(argv) < 4: usage.acl(["permission add"]) sys.exit(1) role_id = argv.pop(0) found = False for role in dom.getElementsByTagName("acl_role"): if role.getAttribute("id") == role_id: found = True break if found == False: acl_role(["create", role_id] + argv) return if not argv: usage.acl(["permission add"]) sys.exit(1) if not add_permissions_to_role(role, argv): usage.acl(["permission add"]) sys.exit(1) utils.replace_cib_configuration(dom) elif command == "delete": if len(argv) < 1: usage.acl(["permission delete"]) sys.exit(1) perm_id = argv.pop(0) found = False for elem in dom.getElementsByTagName("acl_permission"): if elem.getAttribute("id") == perm_id: elem.parentNode.removeChild(elem) found = True if not found: utils.err("Unable to find permission with id: %s" % perm_id) utils.replace_cib_configuration(dom) else: usage.acl(["permission"]) sys.exit(1)
def location_rule(argv): if len(argv) < 3: usage.constraint("location rule") sys.exit(1) res_name = argv.pop(0) resource_valid, resource_error = utils.validate_constraint_resource( utils.get_cib_dom(), res_name) if not resource_valid: utils.err(resource_error) argv.pop(0) cib = utils.get_cib_dom() constraints = cib.getElementsByTagName("constraints")[0] lc = cib.createElement("rsc_location") constraints.appendChild(lc) lc_id = utils.find_unique_id(cib, "location-" + res_name) lc.setAttribute("id", lc_id) lc.setAttribute("rsc", res_name) rule_utils.dom_rule_add(lc, argv) utils.replace_cib_configuration(cib)
def acl_show(argv): dom = utils.get_cib_dom() properties = prop.get_set_properties( defaults=prop.get_default_properties()) acl_enabled = properties.get("enable-acl", "").lower() if utils.is_cib_true(acl_enabled): print "ACLs are enabled" else: print "ACLs are disabled, run 'pcs acl enable' to enable" print print_targets(dom) print_groups(dom) print_roles(dom)
def resource_clone_create(argv, update = False): name = argv.pop(0) element = None dom = utils.get_cib_dom() re = dom.documentElement.getElementsByTagName("resources")[0] for res in re.getElementsByTagName("primitive") + re.getElementsByTagName("group"): if res.getAttribute("id") == name: element = res break if element == None: print "Error: unable to find group or resource: %s" % name sys.exit(1) if update == True: if element.parentNode.tagName != "clone": print "Error: %s is not currently a clone" % name sys.exit(1) clone = element.parentNode for ma in clone.getElementsByTagName("meta_attributes"): clone.removeChild(ma) else: for c in re.getElementsByTagName("clone"): if c.getAttribute("id") == name + "-clone": print "Error: clone already exists for: %s" % name sys.exit(1) clone = dom.createElement("clone") clone.setAttribute("id",name + "-clone") clone.appendChild(element) re.appendChild(clone) meta = dom.createElement("meta_attributes") meta.setAttribute("id",name + "-clone-meta") args = convert_args_to_tuples(argv) for arg in args: nvpair = dom.createElement("nvpair") nvpair.setAttribute("id", name+"-"+arg[0]) nvpair.setAttribute("name", arg[0]) nvpair.setAttribute("value", arg[1]) meta.appendChild(nvpair) clone.appendChild(meta) xml_resource_string = re.toxml() args = ["cibadmin", "-o", "resources", "-R", "-X", xml_resource_string] output, retval = utils.run(args) if retval != 0: print output sys.exit(1)
def set_property(argv): prop_def_dict = utils.get_cluster_properties_definition() nodes_attr = "--node" in utils.pcs_options failed = False forced = "--force" in utils.pcs_options properties = {} for arg in argv: args = arg.split('=') if len(args) != 2: utils.err("invalid property format: '{0}'".format(arg), False) failed = True elif not args[0]: utils.err("empty property name: '{0}'".format(arg), False) failed = True elif nodes_attr or forced or args[1].strip() == "": properties[args[0]] = args[1] else: try: if utils.is_valid_cluster_property( prop_def_dict, args[0], args[1] ): properties[args[0]] = args[1] else: utils.err( "invalid value of property: '{0}', (use --force to " "override)".format(arg), False ) failed = True except utils.UnknownPropertyException: utils.err( "unknown cluster property: '{0}', (use --force to " "override)".format(args[0]), False ) failed = True if failed: sys.exit(1) if nodes_attr: for prop, value in properties.items(): utils.set_node_attribute(prop, value, utils.pcs_options["--node"]) else: cib_dom = utils.get_cib_dom() for prop, value in properties.items(): utils.set_cib_property(prop, value, cib_dom) utils.replace_cib_configuration(cib_dom)
def show_defaults(def_type): dom = utils.get_cib_dom() defs = dom.getElementsByTagName(def_type) if len(defs) > 0: defs = defs[0] else: print "No defaults set" return foundDefault = False for d in defs.getElementsByTagName("nvpair"): print d.getAttribute("name") + ": " + d.getAttribute("value") foundDefault = True if not foundDefault: print "No defaults set"
def stonith_level_rm(level, node, devices): dom = utils.get_cib_dom() if devices != "": node_devices_combo = node + "," + devices else: node_devices_combo = node ft = dom.getElementsByTagName("fencing-topology") if len(ft) == 0: utils.err("unable to remove fencing level, fencing level for node: %s, at level: %s, with device: %s doesn't exist" % (node,level,devices)) else: ft = ft[0] fls = ft.getElementsByTagName("fencing-level") fls_to_remove = [] if node != "": if devices != "": found = False for fl in fls: if fl.getAttribute("target") == node and fl.getAttribute("index") == level and fl.getAttribute("devices") == devices: found = True break if fl.getAttribute("index") == level and fl.getAttribute("devices") == node_devices_combo: found = True break if found == False: utils.err("unable to remove fencing level, fencing level for node: %s, at level: %s, with device: %s doesn't exist" % (node,level,devices)) fl.parentNode.removeChild(fl) else: for fl in fls: if fl.getAttribute("index") == level and (fl.getAttribute("target") == node or fl.getAttribute("devices") == node): fl.parentNode.removeChild(fl) else: for fl in fls: if fl.getAttribute("index") == level: parent = fl.parentNode parent.removeChild(fl) if len(parent.getElementsByTagName("fencing-level")) == 0: parent.parentNode.removeChild(parent) break utils.replace_cib_configuration(dom)
def resource_operation_add(res_id, argv): if len(argv) < 1: usage.resource() sys.exit(1) op_name = argv.pop(0) dom = utils.get_cib_dom() resource_found = False for resource in dom.getElementsByTagName("primitive"): if resource.getAttribute("id") == res_id: resource_found = True break if not resource_found: print "Unable to find resource: %s" % res_id sys.exit(1) op_properties = convert_args_to_tuples(argv) op_properties.sort(key=lambda a:a[0]) op_properties.insert(0,('name', op_name)) found_match = False op = dom.createElement("op") op_id = res_id + "-" for prop in op_properties: op.setAttribute(prop[0], prop[1]) op_id += prop[0] + "-" + prop[1] + "-" op_id = op_id[:-1] op_id = utils.find_unique_id(dom, op_id) op.setAttribute("id", op_id) operations = resource.getElementsByTagName("operations") if len(operations) == 0: operations = dom.createElement("operations") resource.appendChild(operations) else: operations = operations[0] if utils.operation_exists(operations,op): print "Error: identical operation already exists for %s" % res_id sys.exit(1) operations.appendChild(op) utils.replace_cib_configuration(dom)
def find_constraints_containing(resource_id, passed_dom=None): if passed_dom: dom = passed_dom else: dom = utils.get_cib_dom() constraints_found = [] set_constraints = [] resources = dom.getElementsByTagName("primitive") resource_match = None for res in resources: if res.getAttribute("id") == resource_id: resource_match = res break if resource_match: if resource_match.parentNode.tagName == "master" or resource_match.parentNode.tagName == "clone": constraints_found, set_constraints = find_constraints_containing( resource_match.parentNode.getAttribute("id"), dom) constraints = dom.getElementsByTagName("constraints") if len(constraints) == 0: return [], [] else: constraints = constraints[0] myConstraints = constraints.getElementsByTagName("rsc_colocation") myConstraints += constraints.getElementsByTagName("rsc_location") myConstraints += constraints.getElementsByTagName("rsc_order") attr_to_match = ["rsc", "first", "then", "with-rsc", "first", "then"] for c in myConstraints: for attr in attr_to_match: if c.getAttribute(attr) == resource_id: constraints_found.append(c.getAttribute("id")) break setConstraints = constraints.getElementsByTagName("resource_ref") for c in setConstraints: if c.getAttribute("id") == resource_id: set_constraints.append(c.parentNode.parentNode.getAttribute("id")) # Remove duplicates set_constraints = list(set(set_constraints)) return constraints_found, set_constraints
def find_constraints_containing(resource_id, passed_dom=None): if passed_dom: dom = passed_dom else: dom = utils.get_cib_dom() constraints_found = [] set_constraints = [] resources = dom.getElementsByTagName("primitive") resource_match = None for res in resources: if res.getAttribute("id") == resource_id: resource_match = res break if resource_match: if resource_match.parentNode.tagName == "master" or resource_match.parentNode.tagName == "clone": constraints_found,set_constraints = find_constraints_containing(resource_match.parentNode.getAttribute("id"), dom) constraints = dom.getElementsByTagName("constraints") if len(constraints) == 0: return [],[] else: constraints = constraints[0] myConstraints = constraints.getElementsByTagName("rsc_colocation") myConstraints += constraints.getElementsByTagName("rsc_location") myConstraints += constraints.getElementsByTagName("rsc_order") attr_to_match = ["rsc", "first", "then", "with-rsc", "first", "then"] for c in myConstraints: for attr in attr_to_match: if c.getAttribute(attr) == resource_id: constraints_found.append(c.getAttribute("id")) break setConstraints = constraints.getElementsByTagName("resource_ref") for c in setConstraints: if c.getAttribute("id") == resource_id: set_constraints.append(c.parentNode.parentNode.getAttribute("id")) # Remove duplicates set_constraints = list(set(set_constraints)) return constraints_found,set_constraints
def resource_operation_remove(res_id, argv): if len(argv) < 1: usage.resource() sys.exit(1) original_argv = " ".join(argv) op_name = argv.pop(0) dom = utils.get_cib_dom() resource_found = False for resource in dom.getElementsByTagName("primitive"): if resource.getAttribute("id") == res_id: resource_found = True break if not resource_found: print "Unable to find resource: %s" % res_id sys.exit(1) op_properties = convert_args_to_tuples(argv) op_properties.append(('name', op_name)) found_match = False for op in resource.getElementsByTagName("op"): temp_properties = [] for attrName in op.attributes.keys(): if attrName == "id": continue temp_properties.append((attrName,op.attributes.get(attrName).nodeValue)) if len(set(op_properties) ^ set(temp_properties)) == 0: found_match = True parent = op.parentNode parent.removeChild(op) if len(parent.getElementsByTagName("op")) == 0: parent.parentNode.removeChild(parent) break if not found_match: print "Unable to find operation matching: %s" % original_argv sys.exit(1) utils.replace_cib_configuration(dom)
def resource_operation_add(res_id, argv): if len(argv) < 1: usage.resource() sys.exit(1) op_name = argv.pop(0) dom = utils.get_cib_dom() resource_found = False for resource in dom.getElementsByTagName("primitive"): if resource.getAttribute("id") == res_id: resource_found = True break if not resource_found: print "Unable to find resource: %s" % res_id sys.exit(1) op_properties = convert_args_to_tuples(argv) op_properties.sort(key=lambda a:a[0]) op_properties.insert(0,('name', op_name)) found_match = False op = dom.createElement("op") op_id = res_id + "-" for prop in op_properties: op.setAttribute(prop[0], prop[1]) op_id += prop[0] + "-" + prop[1] + "-" op_id = op_id[:-1] op.setAttribute("id", op_id) operations = resource.getElementsByTagName("operations") if len(operations) == 0: operations = dom.createElement("operations") resource.appendChild(operations) else: operations = operations[0] operations.appendChild(op) utils.replace_cib_configuration(dom)
def stonith_level_clear(node = None): dom = utils.get_cib_dom() ft = dom.getElementsByTagName("fencing-topology") if len(ft) == 0: return if node == None: ft = ft[0] childNodes = ft.childNodes[:] for node in childNodes: node.parentNode.removeChild(node) else: fls = dom.getElementsByTagName("fencing-level") if len(fls) == 0: return for fl in fls: if fl.getAttribute("target") == node or fl.getAttribute("devices") == node: fl.parentNode.removeChild(fl) utils.replace_cib_configuration(dom)
def resource_group_rm(group_name, resource_ids): resource_id = resource_ids[0] dom = utils.get_cib_dom() dom = dom.getElementsByTagName("configuration")[0] group_match = None for group in dom.getElementsByTagName("group"): if group.getAttribute("id") == group_name: group_match = group break if not group_match: print "ERROR: Group '%s' does not exist" % group_name sys.exit(1) resources_to_move = [] for resource_id in resource_ids: found_resource = False for resource in group_match.getElementsByTagName("primitive"): if resource.getAttribute("id") == resource_id: found_resource = True resources_to_move.append(resource) break if not found_resource: print "ERROR Resource '%s' does not exist in group '%s'" % (resource_id, group_name) sys.exit(1) for resource in resources_to_move: parent = resource.parentNode resource.parentNode.removeChild(resource) parent.parentNode.appendChild(resource) if len(group_match.getElementsByTagName("primitive")) == 0: group_match.parentNode.removeChild(group_match) utils.replace_cib_configuration(dom) return True
def constraint_resource_update(old_id, passed_dom=None): dom = utils.get_cib_dom() if passed_dom is None else passed_dom new_id = None clone_ms_parent = utils.dom_get_resource_clone_ms_parent(dom, old_id) if clone_ms_parent: new_id = clone_ms_parent.getAttribute("id") if new_id: constraints = dom.getElementsByTagName("rsc_location") constraints += dom.getElementsByTagName("rsc_order") constraints += dom.getElementsByTagName("rsc_colocation") attrs_to_update = ["rsc", "first", "then", "with-rsc"] for constraint in constraints: for attr in attrs_to_update: if constraint.getAttribute(attr) == old_id: constraint.setAttribute(attr, new_id) if passed_dom is None: utils.replace_cib_configuration(dom) if passed_dom: return dom
def colocation_set(argv): setoptions = [] for i in range(len(argv)): if argv[i] == "setoptions": setoptions = argv[i + 1:] argv[i:] = [] break current_set = set_args_into_array(argv) colocation_id = "pcs_rsc_colocation" for a in argv: if a.find('=') == -1: colocation_id = colocation_id + "_" + a cib, constraints = getCurrentConstraints(utils.get_cib_dom()) rsc_colocation = cib.createElement("rsc_colocation") constraints.appendChild(rsc_colocation) rsc_colocation.setAttribute("id", utils.find_unique_id(cib, colocation_id)) rsc_colocation.setAttribute("score", "INFINITY") score_options = ("score", "score-attribute", "score-attribute-mangle") score_specified = False for opt in setoptions: if opt.find("=") != -1: name, value = opt.split("=") if name not in score_options: utils.err("invalid option '%s', allowed options are: %s" % (name, ", ".join(score_options))) if score_specified: utils.err("you cannot specify multiple score options") score_specified = True if name == "score" and not utils.is_score(value): utils.err( "invalid score '%s', use integer or INFINITY or -INFINITY" % value) rsc_colocation.setAttribute(name, value) set_add_resource_sets(rsc_colocation, current_set, cib) utils.replace_cib_configuration(cib)
def order_add(argv,returnElementOnly=False): if len(argv) < 2: usage.constraint() sys.exit(1) resource1 = argv.pop(0) resource2 = argv.pop(0) if not utils.is_valid_constraint_resource(resource1): utils.err("Resource '" + resource1 + "' does not exist") if not utils.is_valid_constraint_resource(resource2): utils.err("Resource '" + resource2 + "' does not exist") sym = "true" if (len(argv) == 0 or argv[0] != "nonsymmetrical") else "false" order_options = [] if len(argv) != 0: if argv[0] == "nonsymmetrical" or argv[0] == "symmetrical": argv.pop(0) for arg in argv: if arg.count("=") == 1: mysplit = arg.split("=") order_options.append((mysplit[0],mysplit[1])) if len(argv) != 0: options = " (Options: " + " ".join(argv)+")" else: options = "" scorekind = "kind: Mandatory" id_suffix = "mandatory" for opt in order_options: if opt[0] == "score": scorekind = "score: " + opt[1] id_suffix = opt[1] break if opt[0] == "kind": scorekind = "kind: " + opt[1] id_suffix = opt[1] break print "Adding " + resource1 + " " + resource2 + " ("+scorekind+")" + options order_id = "order-" + resource1 + "-" + resource2 + "-" + id_suffix order_id = utils.find_unique_id(utils.get_cib_dom(), order_id) (dom,constraintsElement) = getCurrentConstraints() element = dom.createElement("rsc_order") element.setAttribute("id",order_id) element.setAttribute("first",resource1) element.setAttribute("then",resource2) for order_opt in order_options: element.setAttribute(order_opt[0], order_opt[1]) if (sym == "false"): element.setAttribute("symmetrical", "false") constraintsElement.appendChild(element) if returnElementOnly == False: utils.replace_cib_configuration(dom) else: return element.toxml()