Blob Blame History Raw
--- pcs-0.9.115/pcs/resource.py.cloneonestepfix	2015-01-20 14:02:56.312974531 -0600
+++ pcs-0.9.115/pcs/resource.py	2015-01-20 15:45:56.066239316 -0600
@@ -379,26 +379,34 @@ def resource_create(ra_id, ra_type, ra_v
                     % (", ".join(bad_opts), get_full_ra_type(ra_type, True)))
         if len(missing_req_opts) != 0:
             print "Warning: missing required option(s): '%s' for resource type: %s" % (", ".join(missing_req_opts),get_full_ra_type(ra_type,True))
-    xml_resource_string = create_xml_string("primitive", primitive_values, instance_attributes + op_attributes + meta_attributes)
-    args = ["cibadmin"]
-    args = args  + ["-o", "resources", "-C", "-X", xml_resource_string]
-    output,retval = utils.run(args)
-    if retval != 0:
-        utils.err ("Unable to create resource/fence device\n" + output)
+
+    resource_elem = create_xml_element("primitive", primitive_values, instance_attributes + op_attributes + meta_attributes)
+
+    dom = utils.get_cib_dom()
+    dom.getElementsByTagName("resources")[0].appendChild(resource_elem)
 
     if "--clone" in utils.pcs_options or len(clone_opts) > 0:
-        resource_clone_create([ra_id] + clone_opts)
+        dom = resource_clone_create_dom(dom, [ra_id] + clone_opts)
         if "--group" in utils.pcs_options:
             print "Warning: --group ignored when creating a clone"
         if "--master" in utils.pcs_options:
             print "Warning: --master ignored when creating a clone"
     elif "--master" in utils.pcs_options:
-        resource_master_create([ra_id+"-master",ra_id]+ master_meta_values)
+        dom = resource_master_create_dom(dom, [ra_id+"-master",ra_id]+ master_meta_values)
         if "--group" in utils.pcs_options:
             print "Warning: --group ignored when creating a master"
     elif "--group" in utils.pcs_options:
         groupname = utils.pcs_options["--group"]
-        resource_group_add(groupname,[ra_id])
+        dom = resource_group_add_dom(dom, groupname,[ra_id])
+
+    xml_resource_string = dom.documentElement.getElementsByTagName("resources")[0].toprettyxml()
+    args = ["cibadmin"]
+    args = args  + ["-o", "resources", "-M", "-X", xml_resource_string]
+    output,retval = utils.run(args)
+    if retval != 0:
+        utils.err ("Unable to create resource/fence device\n" + output)
+
+#    utils.replace_cib_configuration(dom)
 
 def resource_move(argv,clear=False,ban=False):
     other_options = []
@@ -1087,6 +1095,57 @@ def resource_clone_create(argv, update =
     if retval != 0:
         utils.err("unable to create clone\n" + output)
 
+def resource_clone_create_dom(cib_dom, argv, update = False):
+    name = argv.pop(0)
+    element = None
+    dom = 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:
+        utils.err("unable to find group or resource: %s" % name)
+
+    if utils.is_resource_clone(name):
+        utils.err("%s is already a clone resource" % name)
+
+    if utils.is_group_clone(name):
+        utils.err("cannot clone a group that has already been cloned")
+
+    if utils.is_resource_masterslave(name):
+        utils.err("%s is already a master/slave resource" % name)
+
+    # If element is currently in a group and it's the last member, we get rid of the group
+    if element.parentNode.tagName == "group" and element.parentNode.getElementsByTagName("primitive").length <= 1:
+        element.parentNode.parentNode.removeChild(element.parentNode)
+
+    if update == True:
+        if element.parentNode.tagName != "clone":
+            utils.err("%s is not currently a clone" % name)
+        clone = element.parentNode
+        for ma in clone.getElementsByTagName("meta_attributes"):
+            clone.removeChild(ma)
+    else:
+        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)
+
+    return dom
+
 def resource_clone_master_remove(argv):
     if len(argv) != 1:
         usage.resource()
@@ -1218,6 +1277,90 @@ def resource_master_create(argv, update=
     if not update:
         constraint.constraint_resource_update(rg_id)
 
+def resource_master_create_dom(dom, argv, update=False):
+    non_option_args_count = 0
+    for arg in argv:
+        if arg.find("=") == -1:
+            non_option_args_count += 1
+    
+    if (non_option_args_count < 1):
+        usage.resource()
+        sys.exit(1)
+
+    if non_option_args_count == 1 and not update:
+        argv.insert(0,argv[0]+"-master")
+
+    master_id = argv.pop(0)
+
+    if (update):
+        master_found = False
+        for master in dom.getElementsByTagName("master"):
+            if master.getAttribute("id") == master_id:
+                master_element = master
+                master_found = True
+                break
+        if not master_found:
+            utils.err("Unable to find multi-state resource with id %s" % master_id)
+    else:
+        rg_id = argv.pop(0)
+        if utils.does_id_exist(dom, master_id):
+            utils.err("%s already exists in the cib" % master_id)
+
+        if utils.is_resource_clone(rg_id):
+            utils.err("%s is already a clone resource" % rg_id)
+
+        if utils.is_resource_masterslave(rg_id):
+            utils.err("%s is already a master/slave resource" % rg_id)
+
+        resources = dom.getElementsByTagName("resources")[0]
+        rg_found = False
+        for resource in (resources.getElementsByTagName("primitive") +
+            resources.getElementsByTagName("group")):
+            if resource.getAttribute("id") == rg_id:
+                rg_found = True
+                break
+        if not rg_found:
+            utils.err("Unable to find resource or group with id %s" % rg_id)
+        # If the resource elements parent is a group, and it's the last
+        # element in the group, we remove the group
+        if resource.parentNode.tagName == "group" and resource.parentNode.getElementsByTagName("primitive").length <= 1:
+            resource.parentNode.parentNode.removeChild(resource.parentNode)
+        
+        master_element = dom.createElement("master")
+        master_element.setAttribute("id", master_id)
+        resource.parentNode.removeChild(resource)
+        master_element.appendChild(resource)
+        resources.appendChild(master_element)
+
+    if len(argv) > 0:
+        meta = None
+        for child in master_element.childNodes:
+            if child.nodeType != xml.dom.Node.ELEMENT_NODE:
+                continue
+            if child.tagName == "meta_attributes":
+                meta = child
+        if meta == None:
+            meta = dom.createElement("meta_attributes")
+            meta.setAttribute("id", master_id + "-meta_attributes")
+            master_element.appendChild(meta)
+
+        for arg in convert_args_to_tuples(argv):
+            for nvpair in meta.getElementsByTagName("nvpair"):
+                if nvpair.getAttribute("name") == arg[0]:
+                    meta.removeChild(nvpair)
+                    break
+            if arg[1] == "":
+                continue
+            nvpair = dom.createElement("nvpair")
+            nvpair.setAttribute("id", meta.getAttribute("id") + "-" + arg[0])
+            nvpair.setAttribute("name", arg[0])
+            nvpair.setAttribute("value", arg[1])
+            meta.appendChild(nvpair)
+        if len(meta.getElementsByTagName("nvpair")) == 0:
+            master_element.removeChild(meta)
+
+    return dom
+
 def resource_master_remove(argv):
     if len(argv) < 1:
         usage.resource()
@@ -1465,6 +1608,65 @@ def resource_group_add(group_name, resou
     else:
         utils.err("No resources to add.")
 
+def resource_group_add_dom(dom, group_name, resource_ids):
+    top_element = dom.documentElement
+    resources_element = top_element.getElementsByTagName("resources")[0]
+    group_found = False
+
+    if group_name == "":
+        utils.err("group name cannot be empty")
+
+    for resource in top_element.getElementsByTagName("primitive"):
+        if resource.getAttribute("id") == group_name:
+            utils.err("Error: %s is already a resource" % group_name)
+
+    for group in top_element.getElementsByTagName("group"):
+        if group.getAttribute("id") == group_name:
+            group_found = True
+            mygroup = group
+
+    if group_found == False:
+        mygroup = dom.createElement("group")
+        mygroup.setAttribute("id", group_name)
+        resources_element.appendChild(mygroup)
+
+
+    resources_to_move = []
+    for resource_id in resource_ids:
+        already_exists = False
+        for resource in mygroup.getElementsByTagName("primitive"):
+            # If resource already exists in group then we skip
+            if resource.getAttribute("id") == resource_id:
+                utils.err(resource_id + " already exists in " + group_name)
+
+        resource_found = False
+        for resource in resources_element.getElementsByTagName("primitive"):
+            if resource.nodeType == xml.dom.minidom.Node.TEXT_NODE:
+                continue
+            if resource.getAttribute("id") == resource_id:
+                if resource.parentNode.tagName == "master":
+                    utils.err("cannot group master/slave resources")
+                if resource.parentNode.tagName == "clone":
+                    utils.err("cannot group clone resources")
+                resources_to_move.append(resource)
+                resource_found = True
+                break
+
+        if resource_found == False:
+            utils.err("Unable to find resource: " + resource_id)
+            continue
+
+    if resources_to_move:
+        for resource in resources_to_move:
+            oldParent = resource.parentNode
+            mygroup.appendChild(resource)
+            if oldParent.tagName == "group" and len(oldParent.getElementsByTagName("primitive")) == 0:
+                oldParent.parentNode.removeChild(oldParent)
+        
+        return dom
+    else:
+        utils.err("No resources to add.")
+
 def resource_group_list(argv):
     group_xpath = "//group"
     group_xml = utils.get_cib_xpath(group_xpath)