示例#1
0
    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'
        )
示例#2
0
 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')
示例#3
0
    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'
        )
示例#4
0
    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",
        )
示例#5
0
 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')
示例#6
0
 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), "")
示例#7
0
    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"
示例#8
0
    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
示例#9
0
 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), "")
示例#10
0
文件: test_stonith.py 项目: WeiRG/pcs
    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]
示例#11
0
    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]
示例#12
0
    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"
示例#13
0
    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')
示例#14
0
    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
        )
示例#15
0
    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
        )
示例#16
0
    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"
        )
示例#17
0
    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
        ]
示例#18
0
 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')
示例#19
0
    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'
        )
示例#20
0
    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')
示例#21
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")
示例#22
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
        ]
示例#23
0
    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)
示例#24
0
    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)
示例#25
0
    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)
示例#26
0
文件: test_stonith.py 项目: WeiRG/pcs
    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)
示例#27
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)
示例#28
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
        )
示例#29
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
        )
示例#30
0
    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")
示例#31
0
    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')
示例#32
0
    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")
示例#33
0
    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
示例#34
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"
        )
示例#35
0
    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
示例#36
0
    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')
示例#37
0
    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')
示例#38
0
    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
示例#39
0
文件: test_acl.py 项目: WeiRG/pcs
    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
示例#40
0
    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
示例#41
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
示例#42
0
    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
示例#43
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
示例#44
0
    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')
示例#45
0
    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")
示例#46
0
    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,"")
示例#47
0
    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,"")
示例#48
0
    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,"")
示例#49
0
    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]
示例#50
0
    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')
示例#51
0
    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')
示例#52
0
    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"
        )
示例#53
0
    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,"")
示例#54
0
    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, "")
示例#55
0
    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