]> review.fuel-infra Code Review - tools/sustaining.git/commitdiff
[Jenkins] Allow to autoupdate fuel after install 13/27013/2
authorAnton Chevychalov <achevychalov@mirantis.com>
Thu, 29 Sep 2016 10:54:23 +0000 (13:54 +0300)
committerAnton Chevychalov <achevychalov@mirantis.com>
Thu, 29 Sep 2016 11:44:44 +0000 (14:44 +0300)
New checkbox (false by default) that allow to update fuel
to latest MU. MOS7 and MOS8 supported only in current moment.

Change-Id: Ibb009ccbd39a34adddd689d24408ca628892620e

jenkins/build_cluster/build_cluster.py
jenkins/build_cluster/build_cluster_test.py [new file with mode: 0755]
jenkins/build_cluster/config.xml
jenkins/build_cluster/update_helper.sh [new file with mode: 0755]

index b8dfb6ba596c8a61b4b93c966bbcb769abc2b47c..089e651b7ecd57e056de219cc78938efd141ad1c 100755 (executable)
@@ -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 (executable)
index 0000000..d09ff58
--- /dev/null
@@ -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()
index 2731ecd7b2acbd3e16eb616309f79daa4ede00ae..49fd4f7a52542321eda7f2645e642b07671860c6 100644 (file)
           <description>Check it to predefine cluster config</description>
           <defaultValue>true</defaultValue>
         </hudson.model.BooleanParameterDefinition>
+        <hudson.model.BooleanParameterDefinition>
+          <name>UPDATE_FUEL</name>
+          <description>Update fuel version to latest MU (7.0 and 8.0 only)</description>
+          <defaultValue>false</defaultValue>
+        </hudson.model.BooleanParameterDefinition>
         <hudson.model.ChoiceParameterDefinition>
           <name>NETWORK_TYPE</name>
           <description>Choose a network type or leave it empty</description>
 export ENV_NAME=${BUILD_USER_ID}-${BUILD_NUMBER}
 export PYTHONUNBUFFERED=1
 curl -o ./build_cluster.py &quot;https://raw.githubusercontent.com/Mirantis/tools-sustaining/master/jenkins/build_cluster/build_cluster.py&quot;
+curl -o ./update_helper.sh &quot;https://raw.githubusercontent.com/Mirantis/tools-sustaining/master/jenkins/build_cluster/update_helper.sh&quot;
 curl -o ./scancodes.py &quot;https://raw.githubusercontent.com/Mirantis/tools-sustaining/master/jenkins/build_cluster/scancodes.py&quot;
 
 python build_cluster.py
@@ -157,4 +163,4 @@ python build_cluster.py --destroy
     </org.jenkinsci.plugins.buildnamesetter.BuildNameSetter>
     <org.jenkinsci.plugins.builduser.BuildUser plugin="build-user-vars-plugin@1.4"/>
   </buildWrappers>
-</project>
\ No newline at end of file
+</project>
diff --git a/jenkins/build_cluster/update_helper.sh b/jenkins/build_cluster/update_helper.sh
new file mode 100755 (executable)
index 0000000..bb29a9b
--- /dev/null
@@ -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