def testMasterSlaveRemove(self): self.setupClusterA(temp_cib) output, returnVal = pcs( temp_cib, "constraint location ClusterIP5 prefers rh7-1") assert returnVal == 0 assert output == "" output, returnVal = pcs( temp_cib, "constraint location ClusterIP5 prefers rh7-2") assert returnVal == 0 assert output == "" output, returnVal = pcs(temp_cib, "resource delete Master") assert returnVal == 1 assert output == "Error: Master is not a resource (it can be removed with 'resource unmaster Master')\n" output, returnVal = pcs(temp_cib, "resource unmaster Master") assert returnVal == 0 assert output == "" output, returnVal = pcs(temp_cib, "config") assert returnVal == 0 ac( output, 'Cluster Name: test99\nCorosync Nodes:\n rh7-1 rh7-2 \nPacemaker Nodes:\n \n\nResources: \n Resource: ClusterIP6 (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=192.168.0.99 cidr_netmask=32 \n Operations: monitor interval=30s (ClusterIP6-monitor-interval-30s)\n Group: TestGroup1\n Resource: ClusterIP (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=192.168.0.99 cidr_netmask=32 \n Operations: monitor interval=30s (ClusterIP-monitor-interval-30s)\n Group: TestGroup2\n Resource: ClusterIP2 (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=192.168.0.99 cidr_netmask=32 \n Operations: monitor interval=30s (ClusterIP2-monitor-interval-30s)\n Resource: ClusterIP3 (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=192.168.0.99 cidr_netmask=32 \n Operations: monitor interval=30s (ClusterIP3-monitor-interval-30s)\n Clone: ClusterIP4-clone\n Resource: ClusterIP4 (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=192.168.0.99 cidr_netmask=32 \n Operations: monitor interval=30s (ClusterIP4-monitor-interval-30s)\n Resource: ClusterIP5 (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=192.168.0.99 cidr_netmask=32 \n Operations: monitor interval=30s (ClusterIP5-monitor-interval-30s)\n\nStonith Devices: \nFencing Levels: \n\nLocation Constraints:\n Resource: ClusterIP5\n Enabled on: rh7-1 (score:INFINITY) (id:location-ClusterIP5-rh7-1-INFINITY)\n Enabled on: rh7-2 (score:INFINITY) (id:location-ClusterIP5-rh7-2-INFINITY)\nOrdering Constraints:\nColocation Constraints:\n\nCluster Properties:\n' )
def testTotemOptions(self): o,r = pcs("cluster setup --force --local --corosync_conf=corosync.conf.tmp --name test99 rh7-1 rh7-2 --token 20000 --join 20001 --consensus 20002 --miss_count_const 20003 --fail_recv_const 20004") ac(o,"") assert r == 0 with open("corosync.conf.tmp") as f: data = f.read() ac(data,'totem {\nversion: 2\nsecauth: off\ncluster_name: test99\ntransport: udpu\ntoken: 20000\njoin: 20001\nconsensus: 20002\nmiss_count_const: 20003\nfail_recv_const: 20004\n}\n\nnodelist {\n node {\n ring0_addr: rh7-1\n nodeid: 1\n }\n node {\n ring0_addr: rh7-2\n nodeid: 2\n }\n}\n\nquorum {\nprovider: corosync_votequorum\ntwo_node: 1\n}\n\nlogging {\nto_syslog: yes\n}\n')
def testConstraintRules(self): print "WARNING: RULES TEMPORARILY DISABLED" return output, returnVal = pcs( temp_cib, "constraint location D1 rule 222: '#uname' eq c00n03") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs( temp_cib, "constraint location D2 rule -INFINITY: '#uname' eq c00n04") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs( temp_cib, "constraint location D3 rule pingd: defined pingd") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs( temp_cib, "constraint location D4 rule INFINITY: date start=2005-001 operation=gt" ) assert returnVal == 0 assert output == "", [output] output, returnVal = pcs( temp_cib, "constraint location D5 rule INFINITY: date start=2005-001 end=2006-001 operation=in_range" ) assert returnVal == 0 assert output == "", [output] output, returnVal = pcs( temp_cib, "constraint location D6 rule INFINITY: date operation=date_spec years=2005" ) assert returnVal == 0 assert output == "", [output] output, returnVal = pcs( temp_cib, "constraint location D3 rule -INFINITY: not_defined pingd or pingd lte 0" ) assert returnVal == 0 assert output == "", [output] output, returnVal = pcs( temp_cib, "constraint location D3 rule -INFINITY: not_defined pingd and pingd lte 0" ) assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint") assert returnVal == 0 ac( output, 'Location Constraints:\n Resource: D1\n Rule: score=222 \n Expression: #uname eq c00n03 \n Resource: D2\n Rule: score=-INFINITY \n Expression: #uname eq c00n04 \n Resource: D3\n Rule: score-attribute=pingd \n Expression: defined pingd \n Rule: score=-INFINITY boolean-op=or \n Expression: not_defined pingd \n Expression: pingd lte 0 \n Rule: score=-INFINITY boolean-op=and \n Expression: not_defined pingd \n Expression: pingd lte 0 \n Resource: D4\n Rule: score=INFINITY \n Expression: start=2005-001 operation=gt \n Resource: D5\n Rule: score=INFINITY \n Expression: start=2005-001 operation=in_range end=2006-001 \n Resource: D6\n Rule: score=INFINITY \n Expression: operation=date_spec \n Date Spec: years=2005 \nOrdering Constraints:\nColocation Constraints:\n' )
def testAllConstraints(self): output, returnVal = pcs(temp_cib, "constraint location D5 prefers node1") assert returnVal == 0 and output == "", output output, returnVal = pcs(temp_cib, "constraint order Master then D5") assert ( returnVal == 0 and output == "Adding Master D5 (kind: Mandatory) (Options: first-action=start then-action=start)\n" ), output output, returnVal = pcs(temp_cib, "constraint colocation add Master with D5") assert returnVal == 0 and output == "", output output, returnVal = pcs(temp_cib, "constraint --full") assert returnVal == 0 ac( output, "Location Constraints:\n Resource: D5\n Enabled on: node1 (score:INFINITY) (id:location-D5-node1-INFINITY)\nOrdering Constraints:\n start Master then start D5 (Mandatory) (id:order-Master-D5-mandatory)\nColocation Constraints:\n Master with D5 (INFINITY) (id:colocation-Master-D5-INFINITY)\n", ) output, returnVal = pcs(temp_cib, "constraint show --full") assert returnVal == 0 ac( output, "Location Constraints:\n Resource: D5\n Enabled on: node1 (score:INFINITY) (id:location-D5-node1-INFINITY)\nOrdering Constraints:\n start Master then start D5 (Mandatory) (id:order-Master-D5-mandatory)\nColocation Constraints:\n Master with D5 (INFINITY) (id:colocation-Master-D5-INFINITY)\n", )
def testIPV6(self): o,r = pcs("cluster setup --force --local --corosync_conf=corosync.conf.tmp --name cnam rh7-1 rh7-2 --ipv6") ac(o,"") assert r == 0 with open("corosync.conf.tmp") as f: data = f.read() ac(data,'totem {\nversion: 2\nsecauth: off\ncluster_name: cnam\ntransport: udpu\nip_version: ipv6\n}\n\nnodelist {\n node {\n ring0_addr: rh7-1\n nodeid: 1\n }\n node {\n ring0_addr: rh7-2\n nodeid: 2\n }\n}\n\nquorum {\nprovider: corosync_votequorum\ntwo_node: 1\n}\n\nlogging {\nto_syslog: yes\n}\n')
def test_empty_section(self): section = corosync_conf.Section("mySection") self.assertEqual(section.parent, None) self.assertEqual(section.get_root(), section) self.assertEqual(section.name, "mySection") self.assertEqual(section.get_attributes(), []) self.assertEqual(section.get_sections(), []) ac(str(section), "")
def testNodeStandby(self): output, returnVal = pcs(temp_cib, "cluster standby rh7-1") ac(output, "") assert returnVal == 0 output, returnVal = pcs(temp_cib, "cluster standby nonexistant-node") assert returnVal == 1 assert output == "Error: node 'nonexistant-node' does not appear to exist in configuration\n"
def testMissingRole(self): os.system("CIB_file="+temp_cib+" cibadmin -R --scope nodes --xml-text '<nodes><node id=\"1\" uname=\"rh7-1\"/><node id=\"2\" uname=\"rh7-2\"/></nodes>'") o,r = pcs("resource create stateful0 Stateful --master") os.system("CIB_file="+temp_cib+" cibadmin -R --scope constraints --xml-text '<constraints><rsc_location id=\"cli-prefer-stateful0-master\" role=\"Master\" rsc=\"stateful0-master\" node=\"rh7-1\" score=\"INFINITY\"/><rsc_location id=\"cli-ban-stateful0-master-on-rh7-1\" rsc=\"stateful0-master\" role=\"Slave\" node=\"rh7-1\" score=\"-INFINITY\"/></constraints>'") o,r = pcs("constraint") ac(o,"Location Constraints:\n Resource: stateful0-master\n Enabled on: rh7-1 (score:INFINITY) (role: Master)\n Disabled on: rh7-1 (score:-INFINITY) (role: Slave)\nOrdering Constraints:\nColocation Constraints:\n") assert r == 0
def testPcmkHostList(self): output, returnVal = pcs(temp_cib, "stonith create F1 fence_apc 'pcmk_host_list=nodea nodeb' --force") assert returnVal == 0 ac(output,"") output, returnVal = pcs(temp_cib, "stonith show F1") assert returnVal == 0 assert output == ' Resource: F1 (class=stonith type=fence_apc)\n Attributes: pcmk_host_list="nodea nodeb" \n Operations: monitor interval=60s (F1-monitor-interval-60s)\n',[output]
def testPcmkHostList(self): output, returnVal = pcs(temp_cib, "stonith create F1 fence_apc 'pcmk_host_list=nodea nodeb'") assert returnVal == 0 ac(output,"Warning: missing required option(s): 'ipaddr, login, port, action' for resource type: stonith:fence_apc\n") output, returnVal = pcs(temp_cib, "stonith show F1") assert returnVal == 0 assert output == ' Resource: F1 (class=stonith type=fence_apc)\n Attributes: pcmk_host_list="nodea nodeb" \n Operations: monitor interval=60s (F1-monitor-interval-60s)\n',[output]
def testAdvancedConstraintRule(self): o,r = pcs(temp_cib, "constraint location D1 rule score=INFINITY not_defined pingd or pingd lte 0") ac(o,"") assert r == 0 output, returnVal = pcs(temp_cib, "constraint --full") assert returnVal == 0 ac (output,'Location Constraints:\n Resource: D1\n Constraint: location-D1\n Rule: score=INFINITY boolean-op=or (id:location-D1-rule) \n Expression: not_defined pingd (id:location-D1-rule-expr-1) \n Expression: pingd lte 0 (id:location-D1-rule-expr-2) \nOrdering Constraints:\nColocation Constraints:\n')
def test_comment(self): string= """\ # junk1 name1: value1 #junk2 name2: value2#junk3 name3: value3 #junk4 name4 # junk5: value4 #junk6 name5: value5 #junk7 """ parsed = """\ name1: value1 name2: value2#junk3 name3: value3 #junk4 name4 # junk5: value4 """ ac(str(corosync_conf.parse_string(string)), parsed) string= """\ # junk1 section1 { # junk2 } section2 # junk2 { } section3 { } #junk3 """ parsed = """\ section1 { } section2 # junk2 { } section3 { } """ ac(str(corosync_conf.parse_string(string)), parsed) string = """\ section { #} """ self.assertRaises( corosync_conf.ParseErrorException, corosync_conf.parse_string, string ) string = """\ #section { } """ self.assertRaises( corosync_conf.ParseErrorException, corosync_conf.parse_string, string )
def testRemoteNode(self): o, r = pcs(temp_cib, "resource create D1 Dummy --no-default-ops") assert r == 0 and o == "" o, r = pcs(temp_cib, "resource create D2 Dummy --no-default-ops") assert r == 0 and o == "" o, r = pcs(temp_cib, "cluster remote-node rh7-2 D1") assert r == 1 and o.startswith("\nUsage: pcs cluster remote-node") o, r = pcs(temp_cib, "cluster remote-node add rh7-2 D1") assert r == 0 and o == "" o, r = pcs( temp_cib, "cluster remote-node add rh7-1 D2 remote-port=100 remote-addr=400 remote-connect-timeout=50" ) assert r == 0 and o == "" o, r = pcs(temp_cib, "resource --full") assert r == 0 ac( o, " Resource: D1 (class=ocf provider=heartbeat type=Dummy)\n Meta Attrs: remote-node=rh7-2 \n Operations: monitor interval=60s (D1-monitor-interval-60s)\n Resource: D2 (class=ocf provider=heartbeat type=Dummy)\n Meta Attrs: remote-node=rh7-1 remote-port=100 remote-addr=400 remote-connect-timeout=50 \n Operations: monitor interval=60s (D2-monitor-interval-60s)\n" ) o, r = pcs(temp_cib, "cluster remote-node remove") assert r == 1 and o.startswith("\nUsage: pcs cluster remote-node") o, r = pcs(temp_cib, "cluster remote-node remove rh7-2") assert r == 0 and o == "" o, r = pcs(temp_cib, "cluster remote-node add rh7-2 NOTARESOURCE") assert r == 1 ac(o, "Error: unable to find resource 'NOTARESOURCE'\n") o, r = pcs(temp_cib, "cluster remote-node remove rh7-2") assert r == 1 ac(o, "Error: unable to remove: cannot find remote-node 'rh7-2'\n") o, r = pcs(temp_cib, "resource --full") assert r == 0 ac( o, " Resource: D1 (class=ocf provider=heartbeat type=Dummy)\n Operations: monitor interval=60s (D1-monitor-interval-60s)\n Resource: D2 (class=ocf provider=heartbeat type=Dummy)\n Meta Attrs: remote-node=rh7-1 remote-port=100 remote-addr=400 remote-connect-timeout=50 \n Operations: monitor interval=60s (D2-monitor-interval-60s)\n" ) o, r = pcs(temp_cib, "cluster remote-node remove rh7-1") assert r == 0 and o == "" o, r = pcs(temp_cib, "resource --full") assert r == 0 ac( o, " Resource: D1 (class=ocf provider=heartbeat type=Dummy)\n Operations: monitor interval=60s (D1-monitor-interval-60s)\n Resource: D2 (class=ocf provider=heartbeat type=Dummy)\n Operations: monitor interval=60s (D2-monitor-interval-60s)\n" )
def testLocationConstraintRule(self): print "WARNING RULES TEMPORARILY DISABLED" return o, r = pcs(temp_cib, "constraint location D1 prefers rh7-1") assert r == 0 and o == "", o o, r = pcs(temp_cib, "constraint location D2 prefers rh7-2") assert r == 0 and o == "", o o, r = pcs( temp_cib, "constraint rule add location-D1-rh7-1-INFINITY attribute=#uname operation=eq" ) assert r == 0 and o == "", o o, r = pcs( temp_cib, "constraint rule add location-D1-rh7-1-INFINITY attribute=#uname operation=eq" ) assert r == 0 and o == "", o o, r = pcs( temp_cib, "constraint rule add location-D1-rh7-1-INFINITY attribute=#uname operation=eq" ) assert r == 0 and o == "", o o, r = pcs(temp_cib, "constraint --all") assert r == 0 ac( o, 'Location Constraints:\n Resource: D2\n Enabled on: rh7-2 (score:INFINITY) (id:location-D2-rh7-2-INFINITY)\n Resource: D1\n Location Constraint: Resource D1 (id:location-D1-rh7-1-INFINITY)\n Rule: score=INFINITY (id:location-D1-rh7-1-INFINITY-rule) \n Expression: attribute=#uname operation=eq (id:location-D1-rh7-1-INFINITY-rule-expr) \n Rule: score=INFINITY (id:location-D1-rh7-1-INFINITY-rule-1) \n Expression: attribute=#uname operation=eq (id:location-D1-rh7-1-INFINITY-rule-1-expr) \n Rule: score=INFINITY (id:location-D1-rh7-1-INFINITY-rule-2) \n Expression: attribute=#uname operation=eq (id:location-D1-rh7-1-INFINITY-rule-2-expr) \nOrdering Constraints:\nColocation Constraints:\n' ) o, r = pcs(temp_cib, "constraint rule rm location-D1-rh7-1-INFINITY-rule-1") assert r == 0 ac(o, "Removing Rule: location-D1-rh7-1-INFINITY-rule-1\n") o, r = pcs(temp_cib, "constraint rule rm location-D1-rh7-1-INFINITY-rule-2") assert r == 0 and o == "Removing Rule: location-D1-rh7-1-INFINITY-rule-2\n", o o, r = pcs(temp_cib, "constraint --all") assert r == 0 and o == 'Location Constraints:\n Resource: D2\n Enabled on: rh7-2 (score:INFINITY) (id:location-D2-rh7-2-INFINITY)\n Resource: D1\n Location Constraint: Resource D1 (id:location-D1-rh7-1-INFINITY)\n Rule: score=INFINITY (id:location-D1-rh7-1-INFINITY-rule) \n Expression: attribute=#uname operation=eq (id:location-D1-rh7-1-INFINITY-rule-expr) \nOrdering Constraints:\nColocation Constraints:\n', [ o ] o, r = pcs(temp_cib, "constraint rule rm location-D1-rh7-1-INFINITY-rule") assert r == 0 and o == "Removing Constraint: location-D1-rh7-1-INFINITY\n", o o, r = pcs(temp_cib, "constraint --all") assert r == 0 and o == 'Location Constraints:\n Resource: D2\n Enabled on: rh7-2 (score:INFINITY) (id:location-D2-rh7-2-INFINITY)\nOrdering Constraints:\nColocation Constraints:\n', [ o ]
def testIPV6(self): if utils.is_rhel6(): print "WARNING: not testing IPV6 due to RHEL6" return o,r = pcs("cluster setup --force --local --corosync_conf=corosync.conf.tmp --name cnam rh7-1 rh7-2 --ipv6") ac(o,"") assert r == 0 with open("corosync.conf.tmp") as f: data = f.read() ac(data,'totem {\nversion: 2\nsecauth: off\ncluster_name: cnam\ntransport: udpu\nip_version: ipv6\n}\n\nnodelist {\n node {\n ring0_addr: rh7-1\n nodeid: 1\n }\n node {\n ring0_addr: rh7-2\n nodeid: 2\n }\n}\n\nquorum {\nprovider: corosync_votequorum\ntwo_node: 1\n}\n\nlogging {\nto_syslog: yes\n}\n')
def testConstraintRules(self): output, returnVal = pcs( temp_cib, "constraint location D1 rule score=222 '#uname' eq c00n03") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs( temp_cib, "constraint location D2 rule score=-INFINITY '#uname' eq c00n04") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs( temp_cib, "constraint location D3 rule score=pingd defined pingd") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs( temp_cib, "constraint location D4 rule score=INFINITY date start=2005-001 gt" ) assert returnVal == 0 assert output == "", [output] output, returnVal = pcs( temp_cib, "constraint location D5 rule score=INFINITY date start=2005-001 end=2006-001 in_range" ) assert returnVal == 0 assert output == "", [output] output, returnVal = pcs( temp_cib, "constraint location D6 rule score=INFINITY date-spec operation=date_spec years=2005" ) assert returnVal == 0 assert output == "", [output] # We don't support and/or yet # output, returnVal = pcs(temp_cib, "constraint location D3 rule score=-INFINITY not_defined pingd or pingd lte 0") # assert returnVal == 0 # assert output == "", [output] # output, returnVal = pcs(temp_cib, "constraint location D3 rule score=-INFINITY not_defined pingd and pingd lte 0") # assert returnVal == 0 # assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint --full") assert returnVal == 0 ac( output, 'Location Constraints:\n Resource: D1\n Rule: score=222 (id:location-D1-rule) \n Expression: #uname eq c00n03 (id:location-D1-rule-expr) \n Resource: D2\n Rule: score=-INFINITY (id:location-D2-rule) \n Expression: #uname eq c00n04 (id:location-D2-rule-expr) \n Resource: D3\n Rule: score-attribute=pingd (id:location-D3-rule) \n Expression: defined pingd (id:location-D3-rule-expr) \n Resource: D4\n Rule: score=INFINITY (id:location-D4-rule) \n Expression: start=2005-001 operation=gt (id:location-D4-rule-expr) \n Resource: D5\n Rule: score=INFINITY (id:location-D5-rule) \n Expression: start=2005-001 operation=in_range end=2006-001 (id:location-D5-rule-expr) \n Resource: D6\n Rule: score=INFINITY (id:location-D6-rule) \n Expression: (id:location-D6-rule-expr) \n Date Spec: years=2005 (id:location-D6-rule-expr-datespec) \nOrdering Constraints:\nColocation Constraints:\n' )
def testTotemOptions(self): if utils.is_rhel6(): print "WARNING: Not testing totem options due to RHEL6" return o,r = pcs("cluster setup --force --local --corosync_conf=corosync.conf.tmp --name test99 rh7-1 rh7-2 --token 20000 --join 20001 --consensus 20002 --miss_count_const 20003 --fail_recv_const 20004 --token_coefficient 20005") ac(o,"") assert r == 0 with open("corosync.conf.tmp") as f: data = f.read() ac(data,'totem {\nversion: 2\nsecauth: off\ncluster_name: test99\ntransport: udpu\ntoken: 20000\ntoken_coefficient: 20005\njoin: 20001\nconsensus: 20002\nmiss_count_const: 20003\nfail_recv_const: 20004\n}\n\nnodelist {\n node {\n ring0_addr: rh7-1\n nodeid: 1\n }\n node {\n ring0_addr: rh7-2\n nodeid: 2\n }\n}\n\nquorum {\nprovider: corosync_votequorum\ntwo_node: 1\n}\n\nlogging {\nto_syslog: yes\n}\n')
def testDescribe(self): output, returnVal = pcs(temp_cib, "resource describe bad_resource") assert returnVal == 1 assert output == "Error: Unable to find resource: bad_resource\n" output, returnVal = pcs(temp_cib, "resource describe ocf:heartbeat:Dummy") assert returnVal == 0 ac(output,"Resource options for: ocf:heartbeat:Dummy\n state: Location to store the resource state in.\n fake: Fake attribute that can be changed to cause a reload\n") output, returnVal = pcs(temp_cib, "resource describe Dummy") assert returnVal == 0 ac(output,"Resource options for: ocf:heartbeat:Dummy\n state: Location to store the resource state in.\n fake: Fake attribute that can be changed to cause a reload\nResource options for: ocf:pacemaker:Dummy\n state: Location to store the resource state in.\n fake: Fake attribute that can be changed to cause a reload\n op_sleep: Number of seconds to sleep during operations. This can be used to\n test how the cluster reacts to operation timeouts.\n")
def testPcmkHostList(self): output, returnVal = pcs( temp_cib, "stonith create F1 fence_apc 'pcmk_host_list=nodea nodeb' --force") assert returnVal == 0 ac(output, "") output, returnVal = pcs(temp_cib, "stonith show F1") assert returnVal == 0 assert output == ' Resource: F1 (class=stonith type=fence_apc)\n Attributes: pcmk_host_list="nodea nodeb" \n Operations: monitor interval=60s (F1-monitor-interval-60s)\n', [ output ]
def test_attributes(self): string = """\ name:value\ """ parsed = """\ name: value """ ac(str(corosync_conf.parse_string(string)), parsed) string = """\ name:value name:value """ parsed = """\ name: value name: value """ ac(str(corosync_conf.parse_string(string)), parsed) string = """\ name1:value1 name2 :value2 name3: value3 name4 : value4 """ parsed = """\ name1: value1 name2: value2 name3: value3 name4: value4 """ ac(str(corosync_conf.parse_string(string)), parsed) string = """\ name:foo:value """ parsed = """\ name: foo:value """ root = corosync_conf.parse_string(string) self.assertEqual(root.get_attributes(), [["name", "foo:value"]]) ac(str(root), parsed) string = """\ name : """ parsed = """\ name: """ root = corosync_conf.parse_string(string) self.assertEqual(root.get_attributes(), [["name", ""]]) ac(str(root), parsed)
def test_stonith_create_provides_unfencing_rhel6(self): if not utils.is_rhel6(): return output, returnVal = pcs( temp_cib, "stonith create f1 fence_mpath key=abc" ) ac(output, "") self.assertEqual(0, returnVal) output, returnVal = pcs( temp_cib, "stonith create f2 fence_mpath key=abc meta provides=unfencing" ) ac(output, "") self.assertEqual(0, returnVal) output, returnVal = pcs( temp_cib, "stonith create f3 fence_mpath key=abc meta provides=something" ) ac(output, "") self.assertEqual(0, returnVal) output, returnVal = pcs( temp_cib, "stonith create f4 fence_xvm meta provides=something" ) ac(output, "") self.assertEqual(0, returnVal) output, returnVal = pcs(temp_cib, "stonith show --full") ac(output, """\ Resource: f1 (class=stonith type=fence_mpath) Attributes: key=abc Meta Attrs: provides=unfencing Operations: monitor interval=60s (f1-monitor-interval-60s) Resource: f2 (class=stonith type=fence_mpath) Attributes: key=abc Meta Attrs: provides=unfencing Operations: monitor interval=60s (f2-monitor-interval-60s) Resource: f3 (class=stonith type=fence_mpath) Attributes: key=abc Meta Attrs: provides=unfencing Operations: monitor interval=60s (f3-monitor-interval-60s) Resource: f4 (class=stonith type=fence_xvm) Meta Attrs: provides=something Operations: monitor interval=60s (f4-monitor-interval-60s) """) self.assertEqual(0, returnVal)
def testPcmkHostAllowsMissingPort(self): # Test that port is not required when pcmk_host_argument or # pcmk_host_list or pcmk_host_map is specified output, returnVal = pcs( temp_cib, 'stonith create apc-1 fence_apc params ipaddr="ip" login="******" action="reboot"' ) ac(output, """\ Error: missing required option(s): 'port' for resource type: stonith:fence_apc (use --force to override) """) self.assertEquals(returnVal, 1) output, returnVal = pcs( temp_cib, 'stonith create apc-2 fence_apc params ipaddr="ip" login="******" action="reboot" pcmk_host_map="buzz-01:1;buzz-02:2"' ) ac(output, "") self.assertEquals(returnVal, 0) output, returnVal = pcs( temp_cib, 'stonith create apc-3 fence_apc params ipaddr="ip" login="******" action="reboot" pcmk_host_list="buzz-01,buzz-02"' ) ac(output, "") self.assertEquals(returnVal, 0) output, returnVal = pcs( temp_cib, 'stonith create apc-4 fence_apc params ipaddr="ip" login="******" action="reboot" pcmk_host_argument="buzz-01"' ) ac(output, "") self.assertEquals(returnVal, 0)
def testPcmkHostAllowsMissingPort(self): # Test that port is not required when pcmk_host_argument or # pcmk_host_list or pcmk_host_map is specified output, returnVal = pcs( temp_cib, 'stonith create apc-1 fence_apc params ipaddr="ip" login="******" action="reboot"' ) ac( output, """\ Error: missing required option(s): 'port' for resource type: stonith:fence_apc (use --force to override) """) self.assertEquals(returnVal, 1) output, returnVal = pcs( temp_cib, 'stonith create apc-2 fence_apc params ipaddr="ip" login="******" action="reboot" pcmk_host_map="buzz-01:1;buzz-02:2"' ) ac(output, "") self.assertEquals(returnVal, 0) output, returnVal = pcs( temp_cib, 'stonith create apc-3 fence_apc params ipaddr="ip" login="******" action="reboot" pcmk_host_list="buzz-01,buzz-02"' ) ac(output, "") self.assertEquals(returnVal, 0) output, returnVal = pcs( temp_cib, 'stonith create apc-4 fence_apc params ipaddr="ip" login="******" action="reboot" pcmk_host_argument="buzz-01"' ) ac(output, "") self.assertEquals(returnVal, 0)
def test_section_add(self): root = corosync_conf.Section("root") child1 = corosync_conf.Section("child1") child1a = corosync_conf.Section("child1a") child2 = corosync_conf.Section("child2") root.add_section(child1) child1.add_section(child1a) root.add_section(child2) self.assertEqual(root.parent, None) self.assertEqual(child1.parent.name, "root") self.assertEqual(child1a.parent.name, "child1") self.assertEqual(child2.parent.name, "root") ac(str(root), """\ child1 { child1a { } } child2 { } """) child2.add_section(child1a) self.assertEqual(child1a.parent.name, "child2") ac(str(root), """\ child1 { } child2 { child1a { } } """) self.assertRaises( corosync_conf.CircularParentshipException, child1a.add_section, child1a ) self.assertRaises( corosync_conf.CircularParentshipException, child1a.add_section, child2 ) self.assertRaises( corosync_conf.CircularParentshipException, child1a.add_section, root )
def testAllConstraints(self): output, returnVal = pcs(temp_cib, "constraint location D5 prefers node1") assert returnVal == 0 and output == "", output output, returnVal = pcs(temp_cib, "constraint order Master then D5") assert returnVal == 0 and output == "Adding Master D5 (kind: Mandatory) (Options: first-action=start then-action=start)\n", output output, returnVal = pcs(temp_cib, "constraint colocation add Master with D5") assert returnVal == 0 and output == "", output output, returnVal = pcs(temp_cib, "constraint --full") assert returnVal == 0 ac (output,"Location Constraints:\n Resource: D5\n Enabled on: node1 (score:INFINITY) (id:location-D5-node1-INFINITY)\nOrdering Constraints:\n start Master then start D5 (kind:Mandatory) (id:order-Master-D5-mandatory)\nColocation Constraints:\n Master with D5 (score:INFINITY) (id:colocation-Master-D5-INFINITY)\n") output, returnVal = pcs(temp_cib, "constraint show --full") assert returnVal == 0 ac(output,"Location Constraints:\n Resource: D5\n Enabled on: node1 (score:INFINITY) (id:location-D5-node1-INFINITY)\nOrdering Constraints:\n start Master then start D5 (kind:Mandatory) (id:order-Master-D5-mandatory)\nColocation Constraints:\n Master with D5 (score:INFINITY) (id:colocation-Master-D5-INFINITY)\n")
def testConstraintRules(self): output, returnVal = pcs(temp_cib, "constraint location D1 rule score=222 '#uname' eq c00n03") assert output == "", [output] assert returnVal == 0 output, returnVal = pcs(temp_cib, "constraint location D2 rule score=-INFINITY '#uname' eq c00n04") assert returnVal == 0 assert output == "", [output] o, r = pcs(temp_cib, "resource create C1 Dummy --group C1-group") assert r == 0 and o == "", o output, returnVal = pcs(temp_cib, "constraint location C1-group rule score=pingd defined pingd") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D3 rule score=pingd defined pingd") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D4 rule score=INFINITY date start=2005-001 gt") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D5 rule score=INFINITY date start=2005-001 end=2006-001 in_range") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D6 rule score=INFINITY date-spec operation=date_spec years=2005") assert output == "", [output] assert returnVal == 0 output, returnVal = pcs(temp_cib, "constraint location D3 rule score=-INFINITY not_defined pingd or pingd lte 0") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D3 rule score=-INFINITY not_defined pingd and pingd lte 0") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint --full") assert returnVal == 0 ac (output,'Location Constraints:\n Resource: C1-group\n Constraint: location-C1-group\n Rule: score-attribute=pingd (id:location-C1-group-rule) \n Expression: defined pingd (id:location-C1-group-rule-expr-1) \n Resource: D1\n Constraint: location-D1\n Rule: score=222 (id:location-D1-rule) \n Expression: #uname eq c00n03 (id:location-D1-rule-expr-1) \n Resource: D2\n Constraint: location-D2\n Rule: score=-INFINITY (id:location-D2-rule) \n Expression: #uname eq c00n04 (id:location-D2-rule-expr-1) \n Resource: D3\n Constraint: location-D3-2\n Rule: score=-INFINITY boolean-op=and (id:location-D3-2-rule) \n Expression: not_defined pingd (id:location-D3-2-rule-expr-1) \n Expression: pingd lte 0 (id:location-D3-2-rule-expr-2) \n Constraint: location-D3-1\n Rule: score=-INFINITY boolean-op=or (id:location-D3-1-rule) \n Expression: not_defined pingd (id:location-D3-1-rule-expr-1) \n Expression: pingd lte 0 (id:location-D3-1-rule-expr-2) \n Constraint: location-D3\n Rule: score-attribute=pingd (id:location-D3-rule) \n Expression: defined pingd (id:location-D3-rule-expr-1) \n Resource: D4\n Constraint: location-D4\n Rule: score=INFINITY (id:location-D4-rule) \n Expression: start=2005-001 operation=gt (id:location-D4-rule-expr-1) \n Resource: D5\n Constraint: location-D5\n Rule: score=INFINITY (id:location-D5-rule) \n Expression: start=2005-001 operation=in_range end=2006-001 (id:location-D5-rule-expr-1) \n Resource: D6\n Constraint: location-D6\n Rule: score=INFINITY (id:location-D6-rule) \n Expression: (id:location-D6-rule-expr-1) \n Date Spec: years=2005 (id:location-D6-rule-expr-1-datespec) \nOrdering Constraints:\nColocation Constraints:\n') o,r = pcs("constraint remove location-C1-group") ac(o,"") assert r == 0 o,r = pcs("constraint remove location-D4-rule") ac(o,"") assert r == 0 output, returnVal = pcs(temp_cib, "constraint --full") assert returnVal == 0 ac (output,'Location Constraints:\n Resource: D1\n Constraint: location-D1\n Rule: score=222 (id:location-D1-rule) \n Expression: #uname eq c00n03 (id:location-D1-rule-expr-1) \n Resource: D2\n Constraint: location-D2\n Rule: score=-INFINITY (id:location-D2-rule) \n Expression: #uname eq c00n04 (id:location-D2-rule-expr-1) \n Resource: D3\n Constraint: location-D3-2\n Rule: score=-INFINITY boolean-op=and (id:location-D3-2-rule) \n Expression: not_defined pingd (id:location-D3-2-rule-expr-1) \n Expression: pingd lte 0 (id:location-D3-2-rule-expr-2) \n Constraint: location-D3-1\n Rule: score=-INFINITY boolean-op=or (id:location-D3-1-rule) \n Expression: not_defined pingd (id:location-D3-1-rule-expr-1) \n Expression: pingd lte 0 (id:location-D3-1-rule-expr-2) \n Constraint: location-D3\n Rule: score-attribute=pingd (id:location-D3-rule) \n Expression: defined pingd (id:location-D3-rule-expr-1) \n Resource: D5\n Constraint: location-D5\n Rule: score=INFINITY (id:location-D5-rule) \n Expression: start=2005-001 operation=in_range end=2006-001 (id:location-D5-rule-expr-1) \n Resource: D6\n Constraint: location-D6\n Rule: score=INFINITY (id:location-D6-rule) \n Expression: (id:location-D6-rule-expr-1) \n Date Spec: years=2005 (id:location-D6-rule-expr-1-datespec) \nOrdering Constraints:\nColocation Constraints:\n')
def testRemoteNode(self): o,r = pcs(temp_cib, "resource create D1 Dummy --no-default-ops") assert r==0 and o=="" o,r = pcs(temp_cib, "resource create D2 Dummy --no-default-ops") assert r==0 and o=="" o,r = pcs(temp_cib, "cluster remote-node rh7-2 D1") assert r==1 and o.startswith("\nUsage: pcs cluster remote-node") o,r = pcs(temp_cib, "cluster remote-node add rh7-2 D1") assert r==0 and o=="" o,r = pcs(temp_cib, "cluster remote-node add rh7-1 D2 remote-port=100 remote-addr=400 remote-connect-timeout=50") assert r==0 and o=="" o,r = pcs(temp_cib, "resource --full") assert r==0 ac(o," Resource: D1 (class=ocf provider=heartbeat type=Dummy)\n Meta Attrs: remote-node=rh7-2 \n Operations: monitor interval=60s (D1-monitor-interval-60s)\n Resource: D2 (class=ocf provider=heartbeat type=Dummy)\n Meta Attrs: remote-node=rh7-1 remote-port=100 remote-addr=400 remote-connect-timeout=50 \n Operations: monitor interval=60s (D2-monitor-interval-60s)\n") o,r = pcs(temp_cib, "cluster remote-node remove") assert r==1 and o.startswith("\nUsage: pcs cluster remote-node") o,r = pcs(temp_cib, "cluster remote-node remove rh7-2") assert r==0 and o=="" o,r = pcs(temp_cib, "cluster remote-node add rh7-2 NOTARESOURCE") assert r==1 ac(o,"Error: unable to find resource 'NOTARESOURCE'\n") o,r = pcs(temp_cib, "cluster remote-node remove rh7-2") assert r==1 ac(o,"Error: unable to remove: cannot find remote-node 'rh7-2'\n") o,r = pcs(temp_cib, "resource --full") assert r==0 ac(o," Resource: D1 (class=ocf provider=heartbeat type=Dummy)\n Operations: monitor interval=60s (D1-monitor-interval-60s)\n Resource: D2 (class=ocf provider=heartbeat type=Dummy)\n Meta Attrs: remote-node=rh7-1 remote-port=100 remote-addr=400 remote-connect-timeout=50 \n Operations: monitor interval=60s (D2-monitor-interval-60s)\n") o,r = pcs(temp_cib, "cluster remote-node remove rh7-1") assert r==0 and o=="" o,r = pcs(temp_cib, "resource --full") assert r==0 ac(o," Resource: D1 (class=ocf provider=heartbeat type=Dummy)\n Operations: monitor interval=60s (D1-monitor-interval-60s)\n Resource: D2 (class=ocf provider=heartbeat type=Dummy)\n Operations: monitor interval=60s (D2-monitor-interval-60s)\n")
def testMissingRole(self): os.system( "CIB_file=" + temp_cib + ' cibadmin -R --scope nodes --xml-text \'<nodes><node id="1" uname="rh7-1"/><node id="2" uname="rh7-2"/></nodes>\'' ) o, r = pcs("resource create stateful0 Stateful --master") os.system( "CIB_file=" + temp_cib + ' cibadmin -R --scope constraints --xml-text \'<constraints><rsc_location id="cli-prefer-stateful0-master" role="Master" rsc="stateful0-master" node="rh7-1" score="INFINITY"/><rsc_location id="cli-ban-stateful0-master-on-rh7-1" rsc="stateful0-master" role="Slave" node="rh7-1" score="-INFINITY"/></constraints>\'' ) o, r = pcs("constraint") ac( o, "Location Constraints:\n Resource: stateful0-master\n Enabled on: rh7-1 (role: Master)\n Disabled on: rh7-1 (role: Slave)\nOrdering Constraints:\nColocation Constraints:\n", ) assert r == 0
def testDescribe(self): output, returnVal = pcs(temp_cib, "resource describe bad_resource") assert returnVal == 1 assert output == "Error: Unable to find resource: bad_resource\n" output, returnVal = pcs(temp_cib, "resource describe ocf:heartbeat:Dummy") assert returnVal == 0 ac( output, "Resource options for: ocf:heartbeat:Dummy\n state: Location to store the resource state in.\n fake: Fake attribute that can be changed to cause a reload\n" ) output, returnVal = pcs(temp_cib, "resource describe Dummy") assert returnVal == 0 ac( output, "Resource options for: ocf:heartbeat:Dummy\n state: Location to store the resource state in.\n fake: Fake attribute that can be changed to cause a reload\nResource options for: ocf:pacemaker:Dummy\n state: Location to store the resource state in.\n fake: Fake attribute that can be changed to cause a reload\n op_sleep: Number of seconds to sleep during operations. This can be used to\n test how the cluster reacts to operation timeouts.\n" )
def testLocationConstraints(self): output, returnVal = pcs(temp_cib, "constraint location D5 prefers node1") assert returnVal == 0 and output == "", output output, returnVal = pcs(temp_cib, "constraint location D5 avoids node1") assert returnVal == 0 and output == "", output output, returnVal = pcs(temp_cib, "constraint location D5 prefers node1") assert returnVal == 0 and output == "", output output, returnVal = pcs(temp_cib, "constraint location D5 avoids node2") assert returnVal == 0 and output == "", output output, returnVal = pcs(temp_cib, "constraint") assert returnVal == 0 ac(output, "Location Constraints:\n Resource: D5\n Enabled on: node1 (score:INFINITY)\n Disabled on: node2 (score:-INFINITY)\nOrdering Constraints:\nColocation Constraints:\n") output, returnVal = pcs(temp_cib, "constraint location add location-D5-node1-INFINITY ") assert returnVal == 1 assert output.startswith("\nUsage: pcs constraint"), output
def testDefaults(self): output, returnVal = pcs(temp_cib, "property --defaults") prop_defaults = output assert returnVal == 0, 'Unable to list resources' assert output.startswith('Cluster Properties:\n batch-limit') output, returnVal = pcs(temp_cib, "property --all") assert returnVal == 0, 'Unable to list resources' assert output.startswith('Cluster Properties:\n batch-limit') ac(output, prop_defaults) output, returnVal = pcs(temp_cib, "property set blahblah=blah") assert returnVal == 1 assert output == "Error: unknown cluster property: 'blahblah', (use --force to override)\n", [ output ] output, returnVal = pcs(temp_cib, "property set blahblah=blah --force") assert returnVal == 0, output assert output == "", output output, returnVal = pcs(temp_cib, "property set stonith-enabled=false") assert returnVal == 0, output assert output == "", output output, returnVal = pcs(temp_cib, "property") assert returnVal == 0 assert output == "Cluster Properties:\n blahblah: blah\n stonith-enabled: false\n", [ output ] output, returnVal = pcs(temp_cib, "property --defaults") assert returnVal == 0, 'Unable to list resources' assert output.startswith('Cluster Properties:\n batch-limit') ac(output, prop_defaults) output, returnVal = pcs(temp_cib, "property --all") assert returnVal == 0, 'Unable to list resources' assert "blahblah: blah" in output assert "stonith-enabled: false" in output assert output.startswith('Cluster Properties:\n batch-limit')
def testMasterSlaveRemove(self): self.setupClusterA(temp_cib) output, returnVal = pcs(temp_cib, "constraint location ClusterIP5 prefers rh7-1") assert returnVal == 0 assert output == "" output, returnVal = pcs(temp_cib, "constraint location ClusterIP5 prefers rh7-2") assert returnVal == 0 assert output == "" output, returnVal = pcs(temp_cib, "resource delete Master") assert returnVal == 1 assert output == "Error: Master is not a resource (it can be removed with 'resource unmaster Master')\n" output, returnVal = pcs(temp_cib, "resource unmaster Master") assert returnVal == 0 assert output == "" output, returnVal = pcs(temp_cib, "config") assert returnVal == 0 ac(output,'Cluster Name: test99\nCorosync Nodes:\n rh7-1 rh7-2 \nPacemaker Nodes:\n \n\nResources: \n Resource: ClusterIP6 (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=192.168.0.99 cidr_netmask=32 \n Operations: monitor interval=30s (ClusterIP6-monitor-interval-30s)\n Group: TestGroup1\n Resource: ClusterIP (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=192.168.0.99 cidr_netmask=32 \n Operations: monitor interval=30s (ClusterIP-monitor-interval-30s)\n Group: TestGroup2\n Resource: ClusterIP2 (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=192.168.0.99 cidr_netmask=32 \n Operations: monitor interval=30s (ClusterIP2-monitor-interval-30s)\n Resource: ClusterIP3 (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=192.168.0.99 cidr_netmask=32 \n Operations: monitor interval=30s (ClusterIP3-monitor-interval-30s)\n Clone: ClusterIP4-clone\n Resource: ClusterIP4 (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=192.168.0.99 cidr_netmask=32 \n Operations: monitor interval=30s (ClusterIP4-monitor-interval-30s)\n Resource: ClusterIP5 (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=192.168.0.99 cidr_netmask=32 \n Operations: monitor interval=30s (ClusterIP5-monitor-interval-30s)\n\nStonith Devices: \nFencing Levels: \n\nLocation Constraints:\n Resource: ClusterIP5\n Enabled on: rh7-1 (score:INFINITY) (id:location-ClusterIP5-rh7-1-INFINITY)\n Enabled on: rh7-2 (score:INFINITY) (id:location-ClusterIP5-rh7-2-INFINITY)\nOrdering Constraints:\nColocation Constraints:\n\nCluster Properties:\n')
def testClusterUpgrade(self): if not isMinimumPacemakerVersion(1,1,11): print "WARNING: Unable to test cluster upgrade because pacemaker is older than 1.1.11" return with open(temp_cib) as myfile: data = myfile.read() assert data.find("pacemaker-1.2") != -1 assert data.find("pacemaker-2.0") == -1 o,r = pcs("cluster cib-upgrade") ac(o,"Cluster CIB has been upgraded to latest version\n") assert r == 0 with open(temp_cib) as myfile: data = myfile.read() assert data.find("pacemaker-1.2") == -1 assert data.find("pacemaker-2.0") != -1 o,r = pcs("cluster cib-upgrade") ac(o,"Cluster CIB has been upgraded to latest version\n") assert r == 0
def testAutoUpgradeofCIB(self): old_temp_cib = temp_cib + "-old" shutil.copy(old_cib, old_temp_cib) o,r = pcs(old_temp_cib, "acl show") ac(o,"ACLs are disabled, run 'pcs acl enable' to enable\n\n") assert r == 0 with open(old_temp_cib) as myfile: data = myfile.read() assert data.find("pacemaker-1.2") != -1 assert data.find("pacemaker-2.") == -1 o,r = pcs(old_temp_cib, "acl role create test_role read xpath my_xpath") ac(o,"Cluster CIB has been upgraded to latest version\n") assert r == 0 with open(old_temp_cib) as myfile: data = myfile.read() assert data.find("pacemaker-1.2") == -1 assert data.find("pacemaker-2.") != -1
def testClusterUpgrade(self): if not isMinimumPacemakerVersion(1,1,11): print "WARNING: Unable to test cluster upgrade because pacemaker is older than 1.1.11" return with open(temp_cib) as myfile: data = myfile.read() assert data.find("pacemaker-1.2") != -1 assert data.find("pacemaker-2.") == -1 o,r = pcs("cluster cib-upgrade") ac(o,"Cluster CIB has been upgraded to latest version\n") assert r == 0 with open(temp_cib) as myfile: data = myfile.read() assert data.find("pacemaker-1.2") == -1 assert data.find("pacemaker-2.") != -1 o,r = pcs("cluster cib-upgrade") ac(o,"Cluster CIB has been upgraded to latest version\n") assert r == 0
def testAutoUpgradeofCIB(self): old_temp_cib = temp_cib + "-old" shutil.copy(old_cib, old_temp_cib) o,r = pcs(old_temp_cib, "acl show") ac(o,"") assert r == 0 with open(old_temp_cib) as myfile: data = myfile.read() assert data.find("pacemaker-1.2") != -1 assert data.find("pacemaker-2.") == -1 o,r = pcs(old_temp_cib, "acl role create test_role read xpath my_xpath") ac(o,"Cluster CIB has been upgraded to latest version\n") assert r == 0 with open(old_temp_cib) as myfile: data = myfile.read() assert data.find("pacemaker-1.2") == -1 assert data.find("pacemaker-2.") != -1
def testNoStonithWarning(self): o, r = pcs("status") assert "WARNING: no stonith devices and " in o assert r == 0 o, r = pcs("stonith create test_stonith fence_apc") ac( o, "Warning: missing required option(s): 'ipaddr, login, port, action' for resource type: stonith:fence_apc\n" ) assert r == 0 o, r = pcs("status") assert "WARNING: no stonith devices and " not in o assert r == 0 o, r = pcs("stonith delete test_stonith") ac(o, "Deleting Resource - test_stonith\n") assert r == 0 o, r = pcs("stonith create test_stonith fence_apc --clone") ac( o, "Warning: missing required option(s): 'ipaddr, login, port, action' for resource type: stonith:fence_apc\n" ) assert r == 0 o, r = pcs("status") assert "WARNING: no stonith devices and " not in o assert r == 0
def testNoStonithWarning(self): o, r = pcs(temp_cib, "status") assert "WARNING: no stonith devices and " in o o, r = pcs( temp_cib, "stonith create test_stonith fence_apc ipaddr=ip login=lgn, action=reboot, pcmk_host_argument=node1" ) ac(o, "") assert r == 0 o, r = pcs(temp_cib, "status") assert "WARNING: no stonith devices and " not in o o, r = pcs(temp_cib, "stonith delete test_stonith") ac(o, "Deleting Resource - test_stonith\n") assert r == 0 o, r = pcs( temp_cib, "stonith create test_stonith fence_apc ipaddr=ip login=lgn, action=reboot, pcmk_host_argument=node1 --clone" ) ac(o, "") assert r == 0 o, r = pcs(temp_cib, "status") assert "WARNING: no stonith devices and " not in o
def testConstraintRules(self): print "WARNING: RULES TEMPORARILY DISABLED" return output, returnVal = pcs(temp_cib, "constraint location D1 rule 222: '#uname' eq c00n03") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D2 rule -INFINITY: '#uname' eq c00n04") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D3 rule pingd: defined pingd") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D4 rule INFINITY: date start=2005-001 operation=gt") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D5 rule INFINITY: date start=2005-001 end=2006-001 operation=in_range") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D6 rule INFINITY: date operation=date_spec years=2005") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D3 rule -INFINITY: not_defined pingd or pingd lte 0") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D3 rule -INFINITY: not_defined pingd and pingd lte 0") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint") assert returnVal == 0 ac (output,'Location Constraints:\n Resource: D1\n Rule: score=222 \n Expression: #uname eq c00n03 \n Resource: D2\n Rule: score=-INFINITY \n Expression: #uname eq c00n04 \n Resource: D3\n Rule: score-attribute=pingd \n Expression: defined pingd \n Rule: score=-INFINITY boolean-op=or \n Expression: not_defined pingd \n Expression: pingd lte 0 \n Rule: score=-INFINITY boolean-op=and \n Expression: not_defined pingd \n Expression: pingd lte 0 \n Resource: D4\n Rule: score=INFINITY \n Expression: start=2005-001 operation=gt \n Resource: D5\n Rule: score=INFINITY \n Expression: start=2005-001 operation=in_range end=2006-001 \n Resource: D6\n Rule: score=INFINITY \n Expression: operation=date_spec \n Date Spec: years=2005 \nOrdering Constraints:\nColocation Constraints:\n')
def testCaseInsensitive(self): o,r = pcs(temp_cib, "resource create D1 dummy") assert r == 0 ac(o,'') o,r = pcs(temp_cib, "resource create D2 DUMMY") assert r == 0 ac(o,'') o,r = pcs(temp_cib, "resource create D3 ipaddr2") assert r == 0 ac(o,'') o,r = pcs(temp_cib, "resource create D4 ipaddr3") assert r == 1 ac(o,"Error: Unable to create resource 'ipaddr3', it is not installed on this system (use --force to override)\n")
def testBadProperties(self): o,r = pcs("property set xxxx=zzzz") assert r==1 ac(o,"Error: unknown cluster property: 'xxxx', (use --force to override)\n") output, returnVal = pcs("property set 1234=5678 --force") ac(output, "Error: invalid property name '1234', '1' is not a valid first character for a property name\n") assert returnVal == 1 o,r = pcs("property unset zzzzz") assert r==1 ac(o,"Error: can't remove property: 'zzzzz' that doesn't exist\n") o,r = pcs("property unset zzzz --force") assert r==0 ac(o,"")
def testBadProperties(self): o,r = pcs("property set xxxx=zzzz") assert r==1 ac(o,"Error: unknown cluster property: 'xxxx', (use --force to override)\n") output, returnVal = pcs("property set =5678 --force") ac(output, "Error: property name cannot be empty\n") assert returnVal == 1 o,r = pcs("property unset zzzzz") assert r==1 ac(o,"Error: can't remove property: 'zzzzz' that doesn't exist\n") o,r = pcs("property unset zzzz --force") assert r==0 ac(o,"")
def testLocationConstraintRule(self): print "WARNING RULES TEMPORARILY DISABLED" return o, r = pcs(temp_cib, "constraint location D1 prefers rh7-1") assert r == 0 and o == "", o o, r = pcs(temp_cib, "constraint location D2 prefers rh7-2") assert r == 0 and o == "", o o, r = pcs(temp_cib, "constraint rule add location-D1-rh7-1-INFINITY attribute=#uname operation=eq") assert r == 0 and o == "", o o, r = pcs(temp_cib, "constraint rule add location-D1-rh7-1-INFINITY attribute=#uname operation=eq") assert r == 0 and o == "", o o, r = pcs(temp_cib, "constraint rule add location-D1-rh7-1-INFINITY attribute=#uname operation=eq") assert r == 0 and o == "", o o, r = pcs(temp_cib, "constraint --all") assert r == 0 ac(o,'Location Constraints:\n Resource: D2\n Enabled on: rh7-2 (score:INFINITY) (id:location-D2-rh7-2-INFINITY)\n Resource: D1\n Location Constraint: Resource D1 (id:location-D1-rh7-1-INFINITY)\n Rule: score=INFINITY (id:location-D1-rh7-1-INFINITY-rule) \n Expression: attribute=#uname operation=eq (id:location-D1-rh7-1-INFINITY-rule-expr) \n Rule: score=INFINITY (id:location-D1-rh7-1-INFINITY-rule-1) \n Expression: attribute=#uname operation=eq (id:location-D1-rh7-1-INFINITY-rule-1-expr) \n Rule: score=INFINITY (id:location-D1-rh7-1-INFINITY-rule-2) \n Expression: attribute=#uname operation=eq (id:location-D1-rh7-1-INFINITY-rule-2-expr) \nOrdering Constraints:\nColocation Constraints:\n') o, r = pcs(temp_cib, "constraint rule rm location-D1-rh7-1-INFINITY-rule-1") assert r == 0 ac(o,"Removing Rule: location-D1-rh7-1-INFINITY-rule-1\n") o, r = pcs(temp_cib, "constraint rule rm location-D1-rh7-1-INFINITY-rule-2") assert r == 0 and o == "Removing Rule: location-D1-rh7-1-INFINITY-rule-2\n", o o, r = pcs(temp_cib, "constraint --all") assert r == 0 and o == 'Location Constraints:\n Resource: D2\n Enabled on: rh7-2 (score:INFINITY) (id:location-D2-rh7-2-INFINITY)\n Resource: D1\n Location Constraint: Resource D1 (id:location-D1-rh7-1-INFINITY)\n Rule: score=INFINITY (id:location-D1-rh7-1-INFINITY-rule) \n Expression: attribute=#uname operation=eq (id:location-D1-rh7-1-INFINITY-rule-expr) \nOrdering Constraints:\nColocation Constraints:\n', [o] o, r = pcs(temp_cib, "constraint rule rm location-D1-rh7-1-INFINITY-rule") assert r == 0 and o == "Removing Constraint: location-D1-rh7-1-INFINITY\n", o o, r = pcs(temp_cib, "constraint --all") assert r == 0 and o == 'Location Constraints:\n Resource: D2\n Enabled on: rh7-2 (score:INFINITY) (id:location-D2-rh7-2-INFINITY)\nOrdering Constraints:\nColocation Constraints:\n', [o]
def testDefaults(self): output, returnVal = pcs(temp_cib, "property --defaults") prop_defaults = output assert returnVal == 0, 'Unable to list resources' assert output.startswith('Cluster Properties:\n batch-limit') output, returnVal = pcs(temp_cib, "property --all") assert returnVal == 0, 'Unable to list resources' assert output.startswith('Cluster Properties:\n batch-limit') ac(output,prop_defaults) output, returnVal = pcs(temp_cib, "property set blahblah=blah") assert returnVal == 1 assert output == "Error: unknown cluster property: 'blahblah', (use --force to override)\n",[output] output, returnVal = pcs(temp_cib, "property set blahblah=blah --force") assert returnVal == 0,output assert output == "",output output, returnVal = pcs(temp_cib, "property set stonith-enabled=false") assert returnVal == 0,output assert output == "",output output, returnVal = pcs(temp_cib, "property") assert returnVal == 0 assert output == "Cluster Properties:\n blahblah: blah\n stonith-enabled: false\n", [output] output, returnVal = pcs(temp_cib, "property --defaults") assert returnVal == 0, 'Unable to list resources' assert output.startswith('Cluster Properties:\n batch-limit') ac(output,prop_defaults) output, returnVal = pcs(temp_cib, "property --all") assert returnVal == 0, 'Unable to list resources' assert "blahblah: blah" in output assert "stonith-enabled: false" in output assert output.startswith('Cluster Properties:\n batch-limit')
def testConstraintRules(self): output, returnVal = pcs(temp_cib, "constraint location D1 rule score=222 '#uname' eq c00n03") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D2 rule score=-INFINITY '#uname' eq c00n04") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D3 rule score=pingd defined pingd") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D4 rule score=INFINITY date start=2005-001 gt") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D5 rule score=INFINITY date start=2005-001 end=2006-001 in_range") assert returnVal == 0 assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint location D6 rule score=INFINITY date-spec operation=date_spec years=2005") assert returnVal == 0 assert output == "", [output] # We don't support and/or yet # output, returnVal = pcs(temp_cib, "constraint location D3 rule score=-INFINITY not_defined pingd or pingd lte 0") # assert returnVal == 0 # assert output == "", [output] # output, returnVal = pcs(temp_cib, "constraint location D3 rule score=-INFINITY not_defined pingd and pingd lte 0") # assert returnVal == 0 # assert output == "", [output] output, returnVal = pcs(temp_cib, "constraint --full") assert returnVal == 0 ac (output,'Location Constraints:\n Resource: D1\n Rule: score=222 (id:location-D1-rule) \n Expression: #uname eq c00n03 (id:location-D1-rule-expr) \n Resource: D2\n Rule: score=-INFINITY (id:location-D2-rule) \n Expression: #uname eq c00n04 (id:location-D2-rule-expr) \n Resource: D3\n Rule: score-attribute=pingd (id:location-D3-rule) \n Expression: defined pingd (id:location-D3-rule-expr) \n Resource: D4\n Rule: score=INFINITY (id:location-D4-rule) \n Expression: start=2005-001 operation=gt (id:location-D4-rule-expr) \n Resource: D5\n Rule: score=INFINITY (id:location-D5-rule) \n Expression: start=2005-001 operation=in_range end=2006-001 (id:location-D5-rule-expr) \n Resource: D6\n Rule: score=INFINITY (id:location-D6-rule) \n Expression: (id:location-D6-rule-expr) \n Date Spec: years=2005 (id:location-D6-rule-expr-datespec) \nOrdering Constraints:\nColocation Constraints:\n')
def testCaseInsensitive(self): o, r = pcs(temp_cib, "resource create D1 dummy") assert r == 0 ac(o, '') o, r = pcs(temp_cib, "resource create D2 DUMMY") assert r == 0 ac(o, '') o, r = pcs(temp_cib, "resource create D3 ipaddr2") assert r == 0 ac(o, '') o, r = pcs(temp_cib, "resource create D4 ipaddr3") assert r == 1 ac( o, "Error: Unable to create resource 'ipaddr3', it is not installed on this system (use --force to override)\n" )
def testBadProperties(self): o,r = pcs("property set xxxx=zzzz") assert r==1 ac(o,"Error: unknown cluster property: 'xxxx', (use --force to override)\n") o,r = pcs("property unset zzzzz") assert r==1 ac(o,"Error: can't remove property: 'zzzzz' that doesn't exist\n") o,r = pcs("property unset zzzz --force") assert r==0 ac(o,"")
def testBadProperties(self): o, r = pcs("property set xxxx=zzzz") assert r == 1 ac( o, "Error: unknown cluster property: 'xxxx', (use --force to override)\n" ) output, returnVal = pcs("property set =5678 --force") ac(output, "Error: property name cannot be empty\n") assert returnVal == 1 o, r = pcs("property unset zzzzz") assert r == 1 ac(o, "Error: can't remove property: 'zzzzz' that doesn't exist\n") o, r = pcs("property unset zzzz --force") assert r == 0 ac(o, "")
def testMultipleOrderConstraints(self): o,r = pcs("constraint order stop D1 then stop D2") ac(o,"Adding D1 D2 (kind: Mandatory) (Options: first-action=stop then-action=stop)\n") assert r == 0 o,r = pcs("constraint order start D1 then start D2") ac(o,"Adding D1 D2 (kind: Mandatory) (Options: first-action=start then-action=start)\n") assert r == 0 o,r = pcs("constraint --full") ac(o,"Location Constraints:\nOrdering Constraints:\n stop D1 then stop D2 (kind:Mandatory) (id:order-D1-D2-mandatory)\n start D1 then start D2 (kind:Mandatory) (id:order-D1-D2-mandatory-1)\nColocation Constraints:\n") assert r == 0