63c2d1718eed43890ab5284510a6d8c975aec476
7 import xml
.etree
.ElementTree
12 def get_argument_parser():
13 parser
= argparse
.ArgumentParser(
14 prog
="update_jenkins_node.py",
15 description
="Create, update, or delete Jenkins nodes",
18 "-u", "--url", default
=None, help="Jenkins server URL including protocol"
20 parser
.add_argument("--user", default
=None, help="Jenkins username")
21 parser
.add_argument("--password", default
=None, help="Jenkins password")
27 help="The name of the node to manage in Jenkins",
34 help="An equals-separated set path=value[=attrib]. When attrib is not set, text is assumed",
40 type=argparse
.FileType("r"),
41 help="An INI config file as used by jenkins_jobs",
47 choices
=["online", "offline", "absent"],
48 help="The state of the Jenkins node",
54 help="A message to set for the offline reason of a node",
60 help="Additional config in a json dictionary which will be appended after -c items",
65 def manage_node(url
, user
, password
, node
, state
, offline_message
="", config
={}):
66 server
= jenkins
.Jenkins(url
, username
=user
, password
=password
)
67 exists
= server
.node_exists(node
)
70 if exists
and state
== "absent":
71 server
.delete_node(node
)
73 if not exists
and state
!= "absent":
77 remoteFS
="/home/jenkins",
78 launcher
=jenkins
.LAUNCHER_SSH
,
84 node_config
= xml
.etree
.ElementTree
.fromstring(server
.get_node_config(node
))
85 for key
, value
in config
.items():
86 element
= node_config
.find(key
)
89 while element
is None:
90 head
= key
.rsplit("/", 1)[0] if "/" in current_key
else None
91 tail
= key
.rsplit("/", 1)[1] if "/" in current_key
else current_key
92 e
= xml
.etree
.ElementTree
.Element(tail
)
93 if new_element
is not None:
98 element
= node_config
.find(key
)
100 parent
= node_config
.find(head
)
103 element
= node_config
.find(key
)
109 if value
["attrib"] is None:
110 if element
.text
!= value
["value"]:
112 element
.text
= value
["value"]
115 if element
.attrib
[value
["attrib"]] != value
["value"]:
117 element
.attrib
[value
["attrib"]] = value
["value"]
119 element
.attrib
[value
["attrib"]] = value
["value"]
122 xml_string
= xml
.etree
.ElementTree
.tostring(
123 node_config
, xml_declaration
=True, encoding
="unicode"
125 server
.reconfig_node(node
, xml_string
)
128 node_info
= server
.get_node_info(node
)
129 if node_info
["offline"] and state
== "online":
130 server
.enable_node(node
)
132 if not node_info
["offline"] and state
== "offline":
133 server
.disable_node(node
, offline_message
)
138 if __name__
== "__main__":
139 parser
= get_argument_parser()
140 args
= parser
.parse_args()
141 if args
.config_file
is not None:
142 config
= configparser
.ConfigParser()
143 config
.read_file(args
.config_file
)
144 if "jenkins" not in config
.sections():
145 print("[jenkins] section not found")
148 args
.url
= config
.get("jenkins", "url")
149 if args
.user
is None:
150 args
.user
= config
["jenkins"]["user"]
151 if args
.password
is None:
152 args
.password
= config
["jenkins"]["password"]
153 assert args
.user
is not None
154 assert args
.url
is not None
155 assert args
.password
is not None
157 for entry
in args
.node_config
:
158 key
, value
= entry
.split("=", 1)
160 "attrib": value
.split("=", 1)[1] if "=" in value
else None,
161 "value": value
.split("=", 1)[0] if "=" in value
else value
,
164 for key
, value
in json
.loads(args
.json
).items():
166 "attrib": value
.split("=", 1)[1] if "=" in value
else None,
167 "value": value
.split("=", 1)[0] if "=" in value
else value
,
This page took 0.035051 seconds and 5 git commands to generate.