[Fuego] [PATCH] ftc: implement add-nodes and rm-nodes using python-jenkins

Daniel Sangorrin daniel.sangorrin at toshiba.co.jp
Fri Mar 24 07:47:52 UTC 2017


Note that you can now add/remove multiple nodes at the same
time, or remove all nodes at once. This was not available
in the fuego-create-node and fuego-delete-node scripts.

Signed-off-by: Daniel Sangorrin <daniel.sangorrin at toshiba.co.jp>
---
 engine/scripts/ftc | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 72 insertions(+)

diff --git a/engine/scripts/ftc b/engine/scripts/ftc
index e064016..3a09dbe 100755
--- a/engine/scripts/ftc
+++ b/engine/scripts/ftc
@@ -55,6 +55,7 @@ import getopt
 import shutil
 import tempfile
 import yaml
+import jenkins
 
 # MAJOR, MINOR, REVISION
 VERSION = (1,0,9)
@@ -71,6 +72,7 @@ def pvar(name):
 quiet = 0
 verbose = 0
 use_statusouput = 1
+server = jenkins.Jenkins('http://localhost:8080/fuego')
 
 # keep configuration file in /fuego-ro/conf area
 config_dir = "/fuego-ro/conf"
@@ -82,6 +84,20 @@ TARGET_ENV_VAR="FTC_TARGET"
 
 # format for command_help mapping with: key=name, value=(summary, long description)
 command_help = {
+"rm-nodes":("Removes nodes from Jenkins.",
+    """Usage: ftc rm-nodes [<target1> <target2> ...]
+  Use list-nodes to see the existing nodes.
+
+  If no target is provided all existing nodes will be removed."""),
+
+"add-nodes":("Adds new nodes to Jenkins.",
+    """Usage: ftc add-nodes [-f] <target1> <target2> ...
+  By convention the name of the node and target board is the same. Also,
+  the corresponding board file (<target>.board) must exist. Use list-targets
+  to see available target boards.
+
+  Use -f for "force" mode. This tries to remove the node before adding it"""),
+
 "list-targets":("Show a list of available target boards.",
     """Usage: ftc list-targets [-q]
   Prints target board names and summary information, if any.
@@ -831,6 +847,62 @@ def get_includes(include_filename, conf):
 	inc_vars = parse_shell_file(inc_path, conf)
 	return inc_vars
 
+def do_add_nodes(conf, options):
+	global server
+
+	if '-f' in options:
+		force = True
+		options.remove('-f')
+	else:
+		force = False
+
+	target_list = get_fuego_targets(conf).keys()
+	for board in options:
+		if board not in target_list:
+			raise Exception('No %s.board found.' % board)
+
+	params = { 'command' : 'java -jar /fuego-core/engine/slave.jar'}
+	for board in options:
+		nodes = [node['name'] for node in server.get_nodes()]
+		if board in nodes:
+			if force:
+				server.delete_node(board)
+			else:
+				raise Exception('Node \'%s\' already exists' % board)
+
+		server.create_node(
+			board,
+			numExecutors = 1,
+			launcher = jenkins.LAUNCHER_COMMAND,
+			launcher_params = params
+		)
+		# bug?: it seems enable_node requires two calls
+		server.enable_node(board)
+		server.enable_node(board)
+	sys.exit(0)
+
+def do_rm_nodes(conf, options):
+	global server
+
+	nodes = [node['name'] for node in server.get_nodes()]
+	if not options:
+		options = nodes
+	else:
+		for board in options:
+			if board not in nodes:
+				raise Exception('Node \'%s\' not found.' % board)
+
+	for board in options:
+		nodes = [node['name'] for node in server.get_nodes()]
+		if board not in nodes:
+			# in case the same node is repeated in options
+			continue
+		if board == 'master':
+			# the master node is special in jenkins
+			continue
+		server.delete_node(board)
+	sys.exit(0)
+
 def do_list_nodes(conf):
 	global quiet, verbose
 
-- 
2.7.4




More information about the Fuego mailing list