Page Menu
Home
ClusterLabs Projects
Search
Configure Global Search
Log In
Files
F4623645
cib_xml.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
10 KB
Referenced Files
None
Subscribers
None
cib_xml.py
View Options
'''CTS: Cluster Testing System: CIB generator
'''
__copyright__
=
'''
Author: Andrew Beekhof <abeekhof@suse.de>
Copyright (C) 2008 Andrew Beekhof
'''
import
sys
import
string
from
cts.CTSvars
import
*
from
cts.CIB
import
CibBase
class
XmlBase
(
CibBase
):
def
__init__
(
self
,
Factory
,
tag
,
_id
,
**
kwargs
):
CibBase
.
__init__
(
self
,
Factory
,
tag
,
_id
,
**
kwargs
)
def
show
(
self
):
text
=
'''<%s'''
%
self
.
tag
if
self
.
name
:
text
+=
''' id="%s"'''
%
(
self
.
name
)
for
k
in
list
(
self
.
kwargs
.
keys
()):
text
+=
''' %s="%s"'''
%
(
k
,
self
.
kwargs
[
k
])
if
not
self
.
children
:
text
+=
'''/>'''
return
text
text
+=
'''>'''
for
c
in
self
.
children
:
text
+=
c
.
show
()
text
+=
'''</%s>'''
%
self
.
tag
return
text
def
_run
(
self
,
operation
,
xml
,
section
=
"all"
,
options
=
""
):
if
self
.
name
:
label
=
self
.
name
else
:
label
=
"<
%s
>"
%
self
.
tag
self
.
Factory
.
debug
(
"Writing out
%s
"
%
label
)
fixed
=
"HOME=/root CIB_file="
+
self
.
Factory
.
tmpfile
fixed
+=
" cibadmin --
%s
--scope
%s
%s
--xml-text '
%s
'"
%
(
operation
,
section
,
options
,
xml
)
rc
=
self
.
Factory
.
rsh
(
self
.
Factory
.
target
,
fixed
)
if
rc
!=
0
:
self
.
Factory
.
log
(
"Configure call failed: "
+
fixed
)
sys
.
exit
(
1
)
class
InstanceAttributes
(
XmlBase
):
""" Create an <instance_attributes> section with name-value pairs """
def
__init__
(
self
,
Factory
,
name
,
attrs
):
XmlBase
.
__init__
(
self
,
Factory
,
"instance_attributes"
,
name
)
# Create an <nvpair> for each attribute
for
(
attr
,
value
)
in
attrs
.
items
():
self
.
add_child
(
XmlBase
(
Factory
,
"nvpair"
,
"
%s
-
%s
"
%
(
name
,
attr
),
name
=
attr
,
value
=
value
))
class
Node
(
XmlBase
):
""" Create a <node> section with node attributes for one node """
def
__init__
(
self
,
Factory
,
node_name
,
node_id
,
node_attrs
):
XmlBase
.
__init__
(
self
,
Factory
,
"node"
,
node_id
,
uname
=
node_name
)
self
.
add_child
(
InstanceAttributes
(
Factory
,
"
%s
-1"
%
node_name
,
node_attrs
))
class
Nodes
(
XmlBase
):
""" Create a <nodes> section """
def
__init__
(
self
,
Factory
):
XmlBase
.
__init__
(
self
,
Factory
,
"nodes"
,
None
)
def
add_node
(
self
,
node_name
,
node_id
,
node_attrs
):
self
.
add_child
(
Node
(
self
.
Factory
,
node_name
,
node_id
,
node_attrs
))
def
commit
(
self
):
self
.
_run
(
"modify"
,
self
.
show
(),
"configuration"
,
"--allow-create"
)
class
FencingTopology
(
XmlBase
):
def
__init__
(
self
,
Factory
):
XmlBase
.
__init__
(
self
,
Factory
,
"fencing-topology"
,
None
)
def
level
(
self
,
index
,
target
,
devices
,
target_attr
=
None
,
target_value
=
None
):
# Generate XML ID (sanitizing target-by-attribute levels)
if
target
:
xml_id
=
"cts-
%s
.
%d
"
%
(
target
,
index
)
self
.
add_child
(
XmlBase
(
self
.
Factory
,
"fencing-level"
,
xml_id
,
target
=
target
,
index
=
index
,
devices
=
devices
))
else
:
xml_id
=
"
%s
-
%s
.
%d
"
%
(
target_attr
,
target_value
,
index
)
child
=
XmlBase
(
self
.
Factory
,
"fencing-level"
,
xml_id
,
index
=
index
,
devices
=
devices
)
child
[
"target-attribute"
]
=
target_attr
child
[
"target-value"
]
=
target_value
self
.
add_child
(
child
)
def
commit
(
self
):
self
.
_run
(
"create"
,
self
.
show
(),
"configuration"
,
"--allow-create"
)
class
Option
(
XmlBase
):
def
__init__
(
self
,
Factory
,
section
=
"cib-bootstrap-options"
):
XmlBase
.
__init__
(
self
,
Factory
,
"cluster_property_set"
,
section
)
def
__setitem__
(
self
,
key
,
value
):
self
.
add_child
(
XmlBase
(
self
.
Factory
,
"nvpair"
,
"cts-
%s
"
%
key
,
name
=
key
,
value
=
value
))
def
commit
(
self
):
self
.
_run
(
"modify"
,
self
.
show
(),
"crm_config"
,
"--allow-create"
)
class
OpDefaults
(
XmlBase
):
def
__init__
(
self
,
Factory
):
XmlBase
.
__init__
(
self
,
Factory
,
"op_defaults"
,
None
)
self
.
meta
=
XmlBase
(
self
.
Factory
,
"meta_attributes"
,
"cts-op_defaults-meta"
)
self
.
add_child
(
self
.
meta
)
def
__setitem__
(
self
,
key
,
value
):
self
.
meta
.
add_child
(
XmlBase
(
self
.
Factory
,
"nvpair"
,
"cts-op_defaults-
%s
"
%
key
,
name
=
key
,
value
=
value
))
def
commit
(
self
):
self
.
_run
(
"modify"
,
self
.
show
(),
"configuration"
,
"--allow-create"
)
class
Alerts
(
XmlBase
):
def
__init__
(
self
,
Factory
):
XmlBase
.
__init__
(
self
,
Factory
,
"alerts"
,
None
)
self
.
alert_count
=
0
def
add_alert
(
self
,
path
,
recipient
):
self
.
alert_count
=
self
.
alert_count
+
1
alert
=
XmlBase
(
self
.
Factory
,
"alert"
,
"alert-
%d
"
%
self
.
alert_count
,
path
=
path
)
recipient1
=
XmlBase
(
self
.
Factory
,
"recipient"
,
"alert-
%d
-recipient-1"
%
self
.
alert_count
,
value
=
recipient
)
alert
.
add_child
(
recipient1
)
self
.
add_child
(
alert
)
def
commit
(
self
):
self
.
_run
(
"modify"
,
self
.
show
(),
"configuration"
,
"--allow-create"
)
class
Expression
(
XmlBase
):
def
__init__
(
self
,
Factory
,
name
,
attr
,
op
,
value
=
None
):
XmlBase
.
__init__
(
self
,
Factory
,
"expression"
,
name
,
attribute
=
attr
,
operation
=
op
)
if
value
:
self
[
"value"
]
=
value
class
Rule
(
XmlBase
):
def
__init__
(
self
,
Factory
,
name
,
score
,
op
=
"and"
,
expr
=
None
):
XmlBase
.
__init__
(
self
,
Factory
,
"rule"
,
"
%s
"
%
name
)
self
[
"boolean-op"
]
=
op
self
[
"score"
]
=
score
if
expr
:
self
.
add_child
(
expr
)
class
Resource
(
XmlBase
):
def
__init__
(
self
,
Factory
,
name
,
rtype
,
standard
,
provider
=
None
):
XmlBase
.
__init__
(
self
,
Factory
,
"native"
,
name
)
self
.
rtype
=
rtype
self
.
standard
=
standard
self
.
provider
=
provider
self
.
op
=
[]
self
.
meta
=
{}
self
.
param
=
{}
self
.
scores
=
{}
self
.
needs
=
{}
self
.
coloc
=
{}
if
self
.
standard
==
"ocf"
and
not
provider
:
self
.
provider
=
"heartbeat"
elif
self
.
standard
==
"lsb"
:
self
.
provider
=
None
def
__setitem__
(
self
,
key
,
value
):
self
.
add_param
(
key
,
value
)
def
add_op
(
self
,
name
,
interval
,
**
kwargs
):
self
.
op
.
append
(
XmlBase
(
self
.
Factory
,
"op"
,
"
%s
-
%s
"
%
(
name
,
interval
),
name
=
name
,
interval
=
interval
,
**
kwargs
))
def
add_param
(
self
,
name
,
value
):
self
.
param
[
name
]
=
value
def
add_meta
(
self
,
name
,
value
):
self
.
meta
[
name
]
=
value
def
prefer
(
self
,
node
,
score
=
"INFINITY"
,
rule
=
None
):
if
not
rule
:
rule
=
Rule
(
self
.
Factory
,
"prefer-
%s
-r"
%
node
,
score
,
expr
=
Expression
(
self
.
Factory
,
"prefer-
%s
-e"
%
node
,
"#uname"
,
"eq"
,
node
))
self
.
scores
[
node
]
=
rule
def
after
(
self
,
resource
,
kind
=
"Mandatory"
,
first
=
"start"
,
then
=
"start"
,
**
kwargs
):
kargs
=
kwargs
.
copy
()
kargs
[
"kind"
]
=
kind
if
then
:
kargs
[
"first-action"
]
=
"start"
kargs
[
"then-action"
]
=
then
if
first
:
kargs
[
"first-action"
]
=
first
self
.
needs
[
resource
]
=
kargs
def
colocate
(
self
,
resource
,
score
=
"INFINITY"
,
role
=
None
,
withrole
=
None
,
**
kwargs
):
kargs
=
kwargs
.
copy
()
kargs
[
"score"
]
=
score
if
role
:
kargs
[
"rsc-role"
]
=
role
if
withrole
:
kargs
[
"with-rsc-role"
]
=
withrole
self
.
coloc
[
resource
]
=
kargs
def
constraints
(
self
):
text
=
"<constraints>"
for
k
in
list
(
self
.
scores
.
keys
()):
text
+=
'''<rsc_location id="prefer-%s" rsc="%s">'''
%
(
k
,
self
.
name
)
text
+=
self
.
scores
[
k
]
.
show
()
text
+=
'''</rsc_location>'''
for
k
in
list
(
self
.
needs
.
keys
()):
text
+=
'''<rsc_order id="%s-after-%s" first="%s" then="%s"'''
%
(
self
.
name
,
k
,
k
,
self
.
name
)
kargs
=
self
.
needs
[
k
]
for
kw
in
list
(
kargs
.
keys
()):
text
+=
''' %s="%s"'''
%
(
kw
,
kargs
[
kw
])
text
+=
'''/>'''
for
k
in
list
(
self
.
coloc
.
keys
()):
text
+=
'''<rsc_colocation id="%s-with-%s" rsc="%s" with-rsc="%s"'''
%
(
self
.
name
,
k
,
self
.
name
,
k
)
kargs
=
self
.
coloc
[
k
]
for
kw
in
list
(
kargs
.
keys
()):
text
+=
''' %s="%s"'''
%
(
kw
,
kargs
[
kw
])
text
+=
'''/>'''
text
+=
"</constraints>"
return
text
def
show
(
self
):
text
=
'''<primitive id="%s" class="%s" type="%s"'''
%
(
self
.
name
,
self
.
standard
,
self
.
rtype
)
if
self
.
provider
:
text
+=
''' provider="%s"'''
%
(
self
.
provider
)
text
+=
'''>'''
if
len
(
self
.
meta
)
>
0
:
text
+=
'''<meta_attributes id="%s-meta">'''
%
self
.
name
for
p
in
list
(
self
.
meta
.
keys
()):
text
+=
'''<nvpair id="%s-%s" name="%s" value="%s"/>'''
%
(
self
.
name
,
p
,
p
,
self
.
meta
[
p
])
text
+=
'''</meta_attributes>'''
if
len
(
self
.
param
)
>
0
:
text
+=
'''<instance_attributes id="%s-params">'''
%
self
.
name
for
p
in
list
(
self
.
param
.
keys
()):
text
+=
'''<nvpair id="%s-%s" name="%s" value="%s"/>'''
%
(
self
.
name
,
p
,
p
,
self
.
param
[
p
])
text
+=
'''</instance_attributes>'''
if
len
(
self
.
op
)
>
0
:
text
+=
'''<operations>'''
for
o
in
self
.
op
:
key
=
o
.
name
o
.
name
=
"
%s
-
%s
"
%
(
self
.
name
,
key
)
text
+=
o
.
show
()
o
.
name
=
key
text
+=
'''</operations>'''
text
+=
'''</primitive>'''
return
text
def
commit
(
self
):
self
.
_run
(
"create"
,
self
.
show
(),
"resources"
)
self
.
_run
(
"modify"
,
self
.
constraints
())
class
Group
(
Resource
):
def
__init__
(
self
,
Factory
,
name
):
Resource
.
__init__
(
self
,
Factory
,
name
,
None
,
None
)
self
.
tag
=
"group"
def
__setitem__
(
self
,
key
,
value
):
self
.
add_meta
(
key
,
value
)
def
show
(
self
):
text
=
'''<%s id="%s">'''
%
(
self
.
tag
,
self
.
name
)
if
len
(
self
.
meta
)
>
0
:
text
+=
'''<meta_attributes id="%s-meta">'''
%
self
.
name
for
p
in
list
(
self
.
meta
.
keys
()):
text
+=
'''<nvpair id="%s-%s" name="%s" value="%s"/>'''
%
(
self
.
name
,
p
,
p
,
self
.
meta
[
p
])
text
+=
'''</meta_attributes>'''
for
c
in
self
.
children
:
text
+=
c
.
show
()
text
+=
'''</%s>'''
%
self
.
tag
return
text
class
Clone
(
Group
):
def
__init__
(
self
,
Factory
,
name
,
child
=
None
):
Group
.
__init__
(
self
,
Factory
,
name
)
self
.
tag
=
"clone"
if
child
:
self
.
add_child
(
child
)
def
add_child
(
self
,
resource
):
if
not
self
.
children
:
self
.
children
.
append
(
resource
)
else
:
self
.
Factory
.
log
(
"Clones can only have a single child. Ignoring
%s
"
%
resource
.
name
)
class
Master
(
Clone
):
def
__init__
(
self
,
Factory
,
name
,
child
=
None
):
Clone
.
__init__
(
self
,
Factory
,
name
,
child
)
self
.
tag
=
"master"
File Metadata
Details
Attached
Mime Type
text/x-script.python
Expires
Tue, Jul 8, 4:39 PM (1 d, 47 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1987236
Default Alt Text
cib_xml.py (10 KB)
Attached To
Mode
rP Pacemaker
Attached
Detach File
Event Timeline
Log In to Comment