From: Anton Chevychalov Date: Thu, 29 Sep 2016 10:54:23 +0000 (+0300) Subject: [Jenkins] Allow to autoupdate fuel after install X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=9807d33e0cc22f1c299f5bf16563d2067723bd54;p=tools%2Fsustaining.git [Jenkins] Allow to autoupdate fuel after install New checkbox (false by default) that allow to update fuel to latest MU. MOS7 and MOS8 supported only in current moment. Change-Id: Ibb009ccbd39a34adddd689d24408ca628892620e --- diff --git a/jenkins/build_cluster/build_cluster.py b/jenkins/build_cluster/build_cluster.py index b8dfb6b..089e651 100755 --- a/jenkins/build_cluster/build_cluster.py +++ b/jenkins/build_cluster/build_cluster.py @@ -14,6 +14,9 @@ import netaddr import scancodes +# CONST +UPDATE_HELPER="update_helper.sh" + cfg = dict() is_new = False @@ -54,6 +57,7 @@ if cfg["ISO_URL"]: is_new = any(v in cfg["ISO_URL"] for v in new_versions) cfg["PREPARE_CLUSTER"] = os.getenv("PREPARE_CLUSTER") +cfg["UPDATE_FUEL"] = os.getenv("UPDATE_FUEL") cfg["RELEASE"] = os.getenv("RELEASE") cfg["HA"] = os.getenv("HA") cfg["NETWORK_TYPE"] = os.getenv("NETWORK_TYPE") @@ -69,7 +73,6 @@ try: except: dnl = None - def pprint_dict(subj): if not isinstance(subj, dict): return False @@ -440,6 +443,49 @@ def inject_ifconfig_ssh(): print("{0}...".format(retries), end='') time.sleep(60) +def sshpass_admin_node(psw,ssh_cmd): + cmd = [ + "sshpass", + "-p", + psw, + ] + ssh_cmd + + print (cmd) + + proc = subprocess.Popen( + cmd, + stdin=dnl, + ) + + proc.wait() + + if proc.returncode == 0: + return True + else: + return False + +def admin_ssh_conn_line(usr,subnet): + admip = str(subnet.ip + 2) + return "{usr}@{admip}".format(usr=usr, admip=admip) + +def copy_update_helper(conn_line,psw): + return sshpass_admin_node (psw,ssh_cmd=[ + "scp", + "-o", + "UserKnownHostsFile=/dev/null", + "-o", + "StrictHostKeyChecking=no", + "./"+UPDATE_HELPER, + conn_line+":/tmp/",]) + +def do_update(conn_line,psw): + if copy_update_helper(conn_line,psw): + return sshpass_admin_node( + psw=psw, + ssh_cmd=["ssh",conn_line,"/tmp/"+UPDATE_HELPER,],) + else: + print ("ERROR: Unable to copy update script to admin node") + return False def start_slaves(): for num in range(cfg["NODES_COUNT"]): @@ -447,7 +493,6 @@ def start_slaves(): print ("Starting: {0}".format(name)) start_node(name) - def wait_for_api_is_ready(): cmd = ["sshpass", "-p", cfg["FUEL_SSH_PASSWORD"], "ssh", "-o" "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", @@ -652,6 +697,14 @@ def main(): inject_ifconfig_ssh() + if cfg["UPDATE_FUEL"]=="true": + if do_update( + admin_ssh_conn_line(usr = cfg["FUEL_SSH_USERNAME"],subnet=cfg["ADMIN_SUBNET"]), + psw = cfg["FUEL_SSH_PASSWORD"],): + print("fuel update complete") + else: + print("ERROR: unable to update fuel") + start_slaves() wait_for_api_is_ready() diff --git a/jenkins/build_cluster/build_cluster_test.py b/jenkins/build_cluster/build_cluster_test.py new file mode 100755 index 0000000..d09ff58 --- /dev/null +++ b/jenkins/build_cluster/build_cluster_test.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +import build_cluster + + +CONNECT_LINE = "root@621_admin" +PSWD= "r00tme" + +def test_bool(name,func): + if func: + print "\033[32mOK\033[00m - "+name + else: + print "\033[31mOK\033[00m - "+name + +def main(): + + test_bool("sshpass_admin_node", + build_cluster.sshpass_admin_node ( + psw=PSWD, + ssh_cmd=["ssh", CONNECT_LINE , "hostname"] + ) + ) + + test_bool("sshpass_admin_node fail exit code", + not build_cluster.sshpass_admin_node ( + psw=PSWD, + ssh_cmd=["ssh", CONNECT_LINE , "exit 1"] + ) + ) + + test_bool("copy_update_helper", + build_cluster.copy_update_helper (CONNECT_LINE, PSWD) + ) + +# NOTE: can take to many time... +# test_bool("do update", +# build_cluster.do_update (CONNECT_LINE, PSWD) +# ) + +if __name__ == "__main__": + main() diff --git a/jenkins/build_cluster/config.xml b/jenkins/build_cluster/config.xml index 2731ecd..49fd4f7 100644 --- a/jenkins/build_cluster/config.xml +++ b/jenkins/build_cluster/config.xml @@ -54,6 +54,11 @@ Check it to predefine cluster config true + + UPDATE_FUEL + Update fuel version to latest MU (7.0 and 8.0 only) + false + NETWORK_TYPE Choose a network type or leave it empty @@ -116,6 +121,7 @@ export ENV_NAME=${BUILD_USER_ID}-${BUILD_NUMBER} export PYTHONUNBUFFERED=1 curl -o ./build_cluster.py "https://raw.githubusercontent.com/Mirantis/tools-sustaining/master/jenkins/build_cluster/build_cluster.py" +curl -o ./update_helper.sh "https://raw.githubusercontent.com/Mirantis/tools-sustaining/master/jenkins/build_cluster/update_helper.sh" curl -o ./scancodes.py "https://raw.githubusercontent.com/Mirantis/tools-sustaining/master/jenkins/build_cluster/scancodes.py" python build_cluster.py @@ -157,4 +163,4 @@ python build_cluster.py --destroy - \ No newline at end of file + diff --git a/jenkins/build_cluster/update_helper.sh b/jenkins/build_cluster/update_helper.sh new file mode 100755 index 0000000..bb29a9b --- /dev/null +++ b/jenkins/build_cluster/update_helper.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +upgrade_log="/tmp/upgrade.log" + +RUN_WITH_LOGGER () { + echo '##################################################'>> $upgrade_log 2>&1 + echo $* >> $upgrade_log 2>&1 + echo '##################################################'>> $upgrade_log 2>&1 + $* >> $upgrade_log 2>&1 + return $? +} + +get_fuel_version () { + # Note we are not using fuel --fuel-version here because it requere + # api up and running + if [[ -f /etc/fuel_release ]]; then + # That file exist in version >= 8.0 + cat /etc/fuel_release + return 0 + else + echo "notice: /etc/fuel_release not found we are low than MOS8" >&2 + + # tring to gues from rpm + if rpm -qa | awk -F '-' ' BEGIN {ok=0} + /^fuel-[0-9]/ {print $2; ok=1; exit 0;} + END {exit ok?0:1;}'; + then + return 0 + else + echo "unknown" + return 1 + fi + fi +} + +upgrade_with_docker () { + RUN_WITH_LOGGER "yum update -y" || return 1 + RUN_WITH_LOGGER "docker load -i /var/www/nailgun/docker/images/fuel-images.tar" || return 1 + RUN_WITH_LOGGER "dockerctl destroy all" || return 1 + RUN_WITH_LOGGER "dockerctl start all" || return 1 +} + +crap () { + echo $1 >&2 + exit ${2:-1} +} + + +version=$(get_fuel_version) || crap "error: can't get fuel version" + +case $version in + 7.0.0|8.0) + upgrade_with_docker || crap "error: upgrade failed for version $version. See log $upgrade_log on master node." + ;; + *) + crap "error: upgrade procedure for version $version not implemented" + ;; +esac