diff --git a/confluent_client/bin/nodedeploy b/confluent_client/bin/nodedeploy new file mode 100755 index 00000000..fcc1593e --- /dev/null +++ b/confluent_client/bin/nodedeploy @@ -0,0 +1,67 @@ +#!/usr/bin/python3 + +import argparse +import os +import sys +path = os.path.dirname(os.path.realpath(__file__)) +path = os.path.realpath(os.path.join(path, '..', 'lib', 'python')) +if path.startswith('/opt'): + sys.path.append(path) + +import confluent.client as client + +def armonce(nr, cli): + nodes = set([]) + for rsp in cli.read('/noderange/{0}/attributes/current'.format(nr)): + for node in rsp.get('databynode', {}): + nodeinfo = rsp['databynode'][node] + for attr in nodeinfo: + if attr == 'deployment.apiarmed': + curr = nodeinfo[attr].get('value', '') + if curr == 'continuous': + nodes.add(node) + noderange = nr + if nodes: + noderange += ',-({0})'.format(','.join(nodes)) + for rsp in cli.update('/noderange/{0}/attributes/current'.format(noderange), + {'deployment.apiarmed': 'once'}): + pass + +def setpending(nr, profile, cli): + for rsp in cli.update('/noderange/{0}/attributes/current'.format(nr), + {'deployment.pendingprofile': profile}): + pass + + +def main(args): + ap = argparse.ArgumentParser(description='Deploy OS to nodes') + ap.add_argument('-n', '--network', help='Initiate deployment over PXE', action='store_true') + ap.add_argument('-m', '--maxnodes', help='Specifiy a maximum nodes to be deployed') + ap.add_argument('noderange', help='Set of nodes to deploy') + ap.add_argument('profile', help='Profile name to deploy') + args = ap.parse_args(args) + if not args.network: + sys.stderr.write('Currently only network (-n) deployment is supported\n') + return 1 + c = client.Command() + c.stop_if_noderange_over(args.noderange, args.maxnodes) + armonce(args.noderange, c) + setpending(args.noderange, args.profile, c) + errnodes = set([]) + rc = c.simple_noderange_command(args.noderange, '/boot/nextdevice', 'network', + bootmode='uefi', + persistent=False, + errnodes=errnodes) + if errnodes: + sys.stderr.write( + 'Unable to set boot device for following nodes: {0}\n'.format( + ','.join(errnodes))) + return 1 + rc |= c.simple_noderange_command(args.noderange, '/power/state', 'boot') + return rc + + + return 0 + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/confluent_client/confluent_env.sh b/confluent_client/confluent_env.sh index f9b06644..2355918c 100644 --- a/confluent_client/confluent_env.sh +++ b/confluent_client/confluent_env.sh @@ -19,6 +19,7 @@ alias nodebmcreset='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export alias nodeboot='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodeboot' alias nodeconfig='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodeconfig' alias nodeconsole='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodeconsole' +alias nodedeploy='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodedeploy' alias nodedefine='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodedefine' alias nodeeventlog='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodeeventlog' alias nodefirmware='CURRENT_CMDLINE=$(HISTTIMEFORMAT= builtin history 1); export CURRENT_CMDLINE; nodefirmware' @@ -137,6 +138,19 @@ _confluent_nodefirmware_completion() fi } +_confluent_nodedeploy_completion() +{ + _confluent_get_args + if [ $NUMARGS -gt 2 ]; then + COMPREPLY=($(compgen -W "-n $(confetty show /deployment/profiles|sed -e 's/\///')" -- "${COMP_WORDS[COMP_CWORD]}")) + return + fi + if [ $NUMARGS -lt 3 ]; then + _confluent_nr_completion + return; + fi +} + _confluent_nodeshell_completion() { _confluent_get_args @@ -266,6 +280,8 @@ complete -F _confluent_nr_completion nodeconfig complete -F _confluent_nn_completion nodeconsole complete -F _confluent_nr_completion nodeeventlog complete -F _confluent_nodefirmware_completion nodefirmware +complete -F _confluent_nodedeploy_completion nodedeploy +complete -F _confluent_osimage osimage complete -F _confluent_ng_completion nodegroupattrib complete -F _confluent_ng_completion nodegroupremove complete -F _confluent_nr_completion nodehealth