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

Bird, Timothy Tim.Bird at sony.com
Fri Mar 24 17:55:40 UTC 2017


Looks good.  I merged these from your next branch.

It might be nice to request user confirmation before
removing all nodes.

The python-jenkins library makes these operations look simple.

Thanks.
 -- Tim


> -----Original Message-----
> From: Daniel Sangorrin on Friday, March 24, 2017 1:04 AM
>
> 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 | 87
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 87 insertions(+)
> 
> diff --git a/engine/scripts/ftc b/engine/scripts/ftc
> index e064016..6c4a500 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
> 
> @@ -2525,6 +2597,7 @@ def main():
>      global verbose
>      global quiet
>      global use_statusoutput
> +    global server
> 
>      if len(sys.argv)<2:
>          error_out('Missing command\nUse "ftc help" to get usage help.', 1)
> @@ -2586,6 +2659,20 @@ def main():
>      # read config
>      conf = config_class(config_dir + os.sep + CONFIG_FILE)
> 
> +    if command=="add-nodes":
> +        # adds a Jenkins node
> +        try:
> +            do_add_nodes(conf, options)
> +        except Exception as e:
> +            sys.exit(str(e) + '\n' + command_help['add-nodes'][1])
> +
> +    if command=="rm-nodes":
> +        # removes a Jenkins node
> +        try:
> +            do_rm_nodes(conf, options)
> +        except Exception as e:
> +            sys.exit(str(e) + '\n' + command_help['rm-nodes'][1])
> +
>      if command=="list-targets":
>          # shows fuego targets (boards)
>          do_list_targets(conf)
> --
> 2.7.4
> 
> 
> _______________________________________________
> Fuego mailing list
> Fuego at lists.linuxfoundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/fuego


More information about the Fuego mailing list