Merge "Use Fuel 8 CLI compatible commands" into stable/brahmaputra
authorStefan Berg <stefan.k.berg@ericsson.com>
Fri, 29 Jan 2016 13:30:56 +0000 (13:30 +0000)
committerGerrit Code Review <gerrit@172.30.200.206>
Fri, 29 Jan 2016 13:30:56 +0000 (13:30 +0000)
17 files changed:
build/Makefile
build/cache.sh
build/f_isoroot/Makefile
build/f_isoroot/f_bgpvpn-pluginbuild/Makefile
build/f_isoroot/f_bootstrap/bootstrap_admin_node.sh
build/f_isoroot/f_bootstrap/bootstrap_admin_node.sh.orig
build/f_isoroot/f_odlpluginbuild/Makefile
build/f_isoroot/f_onosfwpluginbuild/Makefile
build/f_isoroot/f_ovs-nsh-dpdk-pluginbuild/Makefile
build/f_isoroot/f_ovsnfv-dpdk-pluginbuild/Makefile
build/f_isoroot/f_qemupluginbuild/Makefile
build/f_isoroot/f_repobuild/Makefile
build/f_isoroot/f_vsperfpluginbuild/Makefile
deploy/README
deploy/deploy.py
deploy/fuel_patch/ks.cfg.patch
deploy/install_fuel_master.py

index 550f360..6c61714 100644 (file)
@@ -115,15 +115,16 @@ $(ISOCACHE):
        # cd /tmp/fuel-main && patch -f -p0 < $(TOPDIR)/fuel-main_docker_dns.patch
        #
        cd /tmp/fuel-main && ./prepare-build-env.sh
+       # Verify that Docker is alive
+       sudo docker info
        cd /tmp/fuel-main && make repos
        $(REPOINFO) -r /tmp/fuel-main > gitinfo_fuel.txt
        # Repeat build up to ten times
        sudo ./fuel_build_loop
        cp /tmp/fuel-main/build/artifacts/fuel*.iso .
-
-       # Attempt to store ISO in cache to speed up the next
-       # build attempt. If cache is not enabled no harm is done.
-       $(MAKE) -f Makefile put-cache
+       # Store artifact in cache straight away if caching is enabled
+       # (no .cacheid will be present unless this is a cached build)
+       test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0
 
 .PHONY: mount-origiso umount-origiso
 mount-origiso: $(ISOCACHE)
index 07361d2..7c2f210 100755 (executable)
@@ -19,7 +19,6 @@ exit_trap() {
 trap exit_trap EXIT
 
 CACHETRANSPORT=${CACHETRANSPORT:-"curl --silent"}
-CACHEBASE=${CACHEBASE:-"file://${HOME}/cache"}
 CACHEMAXAGE=${CACHEMAXAGE:-$[14*24*3600]}
 CACHEDEBUG=${CACHEDEBUG:-1}
 
@@ -132,6 +131,12 @@ getcommitid() {
     fi
 }
 
+
+
+if [ -z "$CACHEBASE" ]; then
+  errorexit "CACHEBASE not set - exiting..."
+fi
+
 case $1 in
     getcommitid)
         if [ $# -ne 3 ]; then
index ec0db48..babb5d6 100644 (file)
@@ -9,7 +9,8 @@
 ##############################################################################
 
 # Add Fuel plugin build targets here
-PLUGINS = f_odlpluginbuild f_qemupluginbuild f_ovs-nsh-dpdk-pluginbuild f_onosfwpluginbuild f_bgpvpn-pluginbuild f_ovsnfv-dpdk-pluginbuild f_vsperfpluginbuild
+PLUGINS = f_odlpluginbuild
+#NON_8-0_REBASED_PLUGINS = f_qemupluginbuild f_ovs-nsh-dpdk-pluginbuild f_onosfwpluginbuild f_bgpvpn-pluginbuild f_ovsnfv-dpdk-pluginbuild f_vsperfpluginbuild
 
 # If the BUILD_FUEL_PLUGINS environment variable is set, only build the plugins
 # indicated therein.
index a99a426..71f2771 100644 (file)
@@ -51,6 +51,9 @@ release:.bgpvpnbuild
        $(REPOINFO) -r . > gitinfo_bgpvpnplugin.txt
        rm -rf fuel-plugin-bgpvpn
        touch .bgpvpnbuild
+       # Store artifact in cache straight away if caching is enabled
+       # (no .cacheid will be present unless this is a cached build)
+       test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0
 
 #############################################################################
 # Cache operations - only used when building through ci/build.sh
index 6318c5d..35d107a 100755 (executable)
@@ -1,5 +1,56 @@
 #!/bin/bash
-FUEL_RELEASE=$(grep release: /etc/fuel/version.yaml | cut -d: -f2 | tr -d '" ')
+mkdir -p /var/log/puppet
+exec > >(tee -i /var/log/puppet/bootstrap_admin_node.log)
+exec 2>&1
+
+FUEL_RELEASE=$(cat /etc/fuel_release)
+ASTUTE_YAML='/etc/fuel/astute.yaml'
+BOOTSTRAP_NODE_CONFIG="/etc/fuel/bootstrap_admin_node.conf"
+bs_build_log='/var/log/fuel-bootstrap-image-build.log'
+bs_status=0
+# Backup network configs to this folder. Folder will be created only if
+# backup process actually will be.
+bup_folder="/var/bootstrap_admin_node_bup_$(date +%Y-%m-%d-%H-%M-%S)/"
+### Long messages inside code makes them more complicated to read...
+# bootstrap messages
+# FIXME fix help links
+bs_skip_message="WARNING: Ubuntu bootstrap build has been skipped. \
+Please build and activate bootstrap manually with CLI command \
+\`fuel-bootstrap build --activate\`. \
+While you don't activate any bootstrap - new nodes cannot be discovered \
+and added to cluster. \
+For more information please visit \
+https://docs.mirantis.com/openstack/fuel/fuel-master/"
+bs_error_message="WARNING: Failed to build the bootstrap image, see $bs_build_log \
+for details. Perhaps your Internet connection is broken. Please fix the \
+problem and run \`fuel-bootstrap build --activate\`. \
+While you don\'t activate any bootstrap - new nodes cannot be discovered \
+and added to cluster. \
+For more information please visit \
+https://docs.mirantis.com/openstack/fuel/fuel-master/"
+bs_progress_message="There is no active bootstrap. Bootstrap image building \
+is in progress. Usually it takes 15-20 minutes. It depends on your internet \
+connection and hardware performance. Please reboot failed to discover nodes \
+after bootstrap image become available."
+bs_done_message="Default bootstrap image building done. Now you can boot new \
+nodes over PXE, they will be discovered and become available for installing \
+OpenStack on them"
+bs_centos_message="WARNING: Deprecated Centos bootstrap has been chosen \
+and activated. Now you can boot new nodes over PXE, they will be discovered \
+and become available for installing OpenStack on them."
+# Update issues messages
+update_warn_message="There is an issue connecting to the Fuel update repository. \
+Please fix your connection prior to applying any updates. \
+Once the connection is fixed, we recommend reviewing and applying \
+Maintenance Updates for this release of Mirantis OpenStack: \
+https://docs.mirantis.com/openstack/fuel/fuel-${FUEL_RELEASE}/\
+release-notes.html#maintenance-updates"
+update_done_message="We recommend reviewing and applying Maintenance Updates \
+for this release of Mirantis OpenStack: \
+https://docs.mirantis.com/openstack/fuel/fuel-${FUEL_RELEASE}/\
+release-notes.html#maintenance-updates"
+fuelmenu_fail_message="Fuelmenu was not able to generate '/etc/fuel/astute.yaml' file! \
+Please, restart it manualy using 'fuelmenu' command."
 
 function countdown() {
   local i
@@ -40,6 +91,10 @@ done
 shopt -u nullglob
 ### OPNFV addition END
 
+# Enable sshd
+systemctl enable sshd
+systemctl start sshd
+
 if [[ "$showmenu" == "yes" || "$showmenu" == "YES" ]]; then
   fuelmenu
   else
@@ -61,6 +116,25 @@ if [[ "$showmenu" == "yes" || "$showmenu" == "YES" ]]; then
   fi
 fi
 
+systemctl reload sshd
+
+# Enable iptables
+systemctl enable iptables.service
+systemctl start iptables.service
+
+
+if [ ! -f "${ASTUTE_YAML}" ]; then
+  echo ${fuelmenu_fail_message}
+  fail
+fi
+
+systemctl reload sshd
+
+# Enable iptables
+systemctl enable iptables.service
+systemctl start iptables.service
+
+
 if [ "$wait_for_external_config" == "yes" ]; then
   wait_timeout=3000
   pidfile=/var/lock/wait_for_external_config
@@ -101,11 +175,30 @@ make_ubuntu_bootstrap_stub () {
 }
 
 get_bootstrap_flavor () {
-       local ASTUTE_YAML='/etc/fuel/astute.yaml'
        python <<-EOF
-       from fuelmenu.fuelmenu import Settings
-       conf = Settings().read("$ASTUTE_YAML").get('BOOTSTRAP', {})
-       print(conf.get('flavor', 'centos'))
+       from yaml import safe_load
+       with open("$ASTUTE_YAML", 'r') as f:
+           conf = safe_load(f).get('BOOTSTRAP', {})
+       print(conf.get('flavor', 'centos').lower())
+       EOF
+}
+
+get_bootstrap_skip () {
+       python <<-EOF
+       from yaml import safe_load
+       with open("$ASTUTE_YAML", 'r') as f:
+           conf = safe_load(f).get('BOOTSTRAP', {})
+       print(conf.get('skip_default_img_build', False))
+       EOF
+}
+
+set_ui_bootstrap_error () {
+        # This notify can't be closed or removed by user.
+        # For remove notify - send empty string.
+        local message=$1
+        python <<-EOF
+       from fuel_bootstrap.utils import notifier
+       notifier.notify_webui('${message}')
        EOF
 }
 
@@ -114,10 +207,7 @@ build_ubuntu_bootstrap () {
         local ret=1
         echo ${bs_progress_message} >&2
         set_ui_bootstrap_error "${bs_progress_message}" >&2
-# OPNFV modification to turn off biosdevname on the line below (extend-kopts)
-        if fuel-bootstrap -v --debug build --activate \
-        --extend-kopts "biosdevname=0 net.ifnames=0 debug ignore_loglevel log_buf_len=10M print_fatal_signals=1 LOGLEVEL=8" \
-        >>"$bs_build_log" 2>&1; then
+        if fuel-bootstrap -v --debug build --activate >>"$bs_build_log" 2>&1; then
           ret=0
           fuel notify --topic "done" --send "${bs_done_message}"
         else
index 1bc3493..e637c7b 100755 (executable)
@@ -1,5 +1,56 @@
 #!/bin/bash
-FUEL_RELEASE=$(grep release: /etc/fuel/version.yaml | cut -d: -f2 | tr -d '" ')
+mkdir -p /var/log/puppet
+exec > >(tee -i /var/log/puppet/bootstrap_admin_node.log)
+exec 2>&1
+
+FUEL_RELEASE=$(cat /etc/fuel_release)
+ASTUTE_YAML='/etc/fuel/astute.yaml'
+BOOTSTRAP_NODE_CONFIG="/etc/fuel/bootstrap_admin_node.conf"
+bs_build_log='/var/log/fuel-bootstrap-image-build.log'
+bs_status=0
+# Backup network configs to this folder. Folder will be created only if
+# backup process actually will be.
+bup_folder="/var/bootstrap_admin_node_bup_$(date +%Y-%m-%d-%H-%M-%S)/"
+### Long messages inside code makes them more complicated to read...
+# bootstrap messages
+# FIXME fix help links
+bs_skip_message="WARNING: Ubuntu bootstrap build has been skipped. \
+Please build and activate bootstrap manually with CLI command \
+\`fuel-bootstrap build --activate\`. \
+While you don't activate any bootstrap - new nodes cannot be discovered \
+and added to cluster. \
+For more information please visit \
+https://docs.mirantis.com/openstack/fuel/fuel-master/"
+bs_error_message="WARNING: Failed to build the bootstrap image, see $bs_build_log \
+for details. Perhaps your Internet connection is broken. Please fix the \
+problem and run \`fuel-bootstrap build --activate\`. \
+While you don\'t activate any bootstrap - new nodes cannot be discovered \
+and added to cluster. \
+For more information please visit \
+https://docs.mirantis.com/openstack/fuel/fuel-master/"
+bs_progress_message="There is no active bootstrap. Bootstrap image building \
+is in progress. Usually it takes 15-20 minutes. It depends on your internet \
+connection and hardware performance. Please reboot failed to discover nodes \
+after bootstrap image become available."
+bs_done_message="Default bootstrap image building done. Now you can boot new \
+nodes over PXE, they will be discovered and become available for installing \
+OpenStack on them"
+bs_centos_message="WARNING: Deprecated Centos bootstrap has been chosen \
+and activated. Now you can boot new nodes over PXE, they will be discovered \
+and become available for installing OpenStack on them."
+# Update issues messages
+update_warn_message="There is an issue connecting to the Fuel update repository. \
+Please fix your connection prior to applying any updates. \
+Once the connection is fixed, we recommend reviewing and applying \
+Maintenance Updates for this release of Mirantis OpenStack: \
+https://docs.mirantis.com/openstack/fuel/fuel-${FUEL_RELEASE}/\
+release-notes.html#maintenance-updates"
+update_done_message="We recommend reviewing and applying Maintenance Updates \
+for this release of Mirantis OpenStack: \
+https://docs.mirantis.com/openstack/fuel/fuel-${FUEL_RELEASE}/\
+release-notes.html#maintenance-updates"
+fuelmenu_fail_message="Fuelmenu was not able to generate '/etc/fuel/astute.yaml' file! \
+Please, restart it manualy using 'fuelmenu' command."
 
 function countdown() {
   local i
@@ -51,6 +102,20 @@ if [[ "$showmenu" == "yes" || "$showmenu" == "YES" ]]; then
   fi
 fi
 
+if [ ! -f "${ASTUTE_YAML}" ]; then
+  echo ${fuelmenu_fail_message}
+  fail
+fi
+
+# Enable sshd
+systemctl enable sshd
+systemctl start sshd
+
+# Enable iptables
+systemctl enable iptables.service
+systemctl start iptables.service
+
+
 if [ "$wait_for_external_config" == "yes" ]; then
   wait_timeout=3000
   pidfile=/var/lock/wait_for_external_config
@@ -91,11 +156,30 @@ make_ubuntu_bootstrap_stub () {
 }
 
 get_bootstrap_flavor () {
-       local ASTUTE_YAML='/etc/fuel/astute.yaml'
        python <<-EOF
-       from fuelmenu.fuelmenu import Settings
-       conf = Settings().read("$ASTUTE_YAML").get('BOOTSTRAP', {})
-       print(conf.get('flavor', 'centos'))
+       from yaml import safe_load
+       with open("$ASTUTE_YAML", 'r') as f:
+           conf = safe_load(f).get('BOOTSTRAP', {})
+       print(conf.get('flavor', 'centos').lower())
+       EOF
+}
+
+get_bootstrap_skip () {
+       python <<-EOF
+       from yaml import safe_load
+       with open("$ASTUTE_YAML", 'r') as f:
+           conf = safe_load(f).get('BOOTSTRAP', {})
+       print(conf.get('skip_default_img_build', False))
+       EOF
+}
+
+set_ui_bootstrap_error () {
+        # This notify can't be closed or removed by user.
+        # For remove notify - send empty string.
+        local message=$1
+        python <<-EOF
+       from fuel_bootstrap.utils import notifier
+       notifier.notify_webui('${message}')
        EOF
 }
 
index 18fbb9e..024cd4a 100644 (file)
@@ -32,11 +32,15 @@ release:.odlbuild
        sudo gem install fpm
        sudo pip install fuel-plugin-builder
        git clone -b $(ODL_BRANCH) $(ODL_REPO)
-       fpb --debug --build fuel-plugin-opendaylight/
+       # Temporary location of working Be snapshot
+       ODL_TARBALL_LOCATION=http://devel.opt.im/distribution-karaf-0.4.0-20160118.091622-3555.tar.gz fpb --debug --build fuel-plugin-opendaylight/
        mv fuel-plugin-opendaylight/opendaylight*.rpm .
        $(REPOINFO) -r . > gitinfo_odlplugin.txt
        rm -rf fuel-plugin-opendaylight
        touch .odlbuild
+       # Store artifact in cache straight away if caching is enabled
+       # (no .cacheid will be present unless this is a cached build)
+       test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0
 
 #############################################################################
 # Cache operations - only used when building through ci/build.sh
index 0cf290c..9516e3d 100644 (file)
@@ -49,6 +49,9 @@ release:.onosbuild
        $(REPOINFO) -r . > gitinfo_onos-plugin.txt
        @rm -rf fuel-plugin-onos
        @touch .onosbuild
+       # Store artifact in cache straight away if caching is enabled
+       # (no .cacheid will be present unless this is a cached build)
+       test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0
 
 #############################################################################
 # Cache operations - only used when building through ci/build.sh
index 700a93c..f89f8d9 100644 (file)
@@ -50,6 +50,9 @@ release:.ovsbuild
        $(REPOINFO) -r . > gitinfo_ovs-nsh-dpdk-plugin.txt
        @rm -rf fuel-plugin-ovs
        @touch .ovsbuild
+       # Store artifact in cache straight away if caching is enabled
+       # (no .cacheid will be present unless this is a cached build)
+       test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0
 
 #############################################################################
 # Cache operations - only used when building through ci/build.sh
index 70fd224..a746873 100644 (file)
@@ -50,6 +50,9 @@ release:.ovsnfvbuild
        $(REPOINFO) -r . > gitinfo_ovsnfv-dpdk-plugin.txt
        @rm -rf fuel-plugin-ovsnfv
        @touch .ovsnfvbuild
+       # Store artifact in cache straight away if caching is enabled
+       # (no .cacheid will be present unless this is a cached build)
+       test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0
 
 #############################################################################
 # Cache operations - only used when building through ci/build.sh
index 126e205..0f245ae 100644 (file)
@@ -50,6 +50,9 @@ release:.qemubuild
        $(REPOINFO) -r . > gitinfo_qemu-plugin.txt
        @rm -rf fuel-plugin-qemu
        @touch .qemubuild
+       # Store artifact in cache straight away if caching is enabled
+       # (no .cacheid will be present unless this is a cached build)
+       test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0
 
 #############################################################################
 # Cache operations - only used when building through ci/build.sh
index 522722e..1fc7030 100644 (file)
@@ -45,6 +45,9 @@ nailgun:
        sudo su - -c /opt/fuel-createmirror-*/fuel-createmirror
        sudo chmod -R 755 /var/www/nailgun
        cp -Rp /var/www/nailgun .
+       # Store artifact in cache straight away if caching is enabled
+       # (no .cacheid will be present unless this is a cached build)
+       test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0
 
 .PHONY: clean
 clean:
index ccf596a..c9653d7 100644 (file)
@@ -50,6 +50,9 @@ release:.vsperfbuild
        $(REPOINFO) -r . > gitinfo_vsperf-plugin.txt
        @rm -rf fuel-plugin-vsperf
        @touch .vsperfbuild
+       # Store artifact in cache straight away if caching is enabled
+       # (no .cacheid will be present unless this is a cached build)
+       test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0
 
 #############################################################################
 # Cache operations - only used when building through ci/build.sh
index 167078b..7a3e09d 100644 (file)
@@ -5,7 +5,7 @@ the following dependencies and python modules are required to be installed:
 
 - for Ubuntu:
 
-sudo apt-get install -y libvirt-bin qemu-kvm python-pip fuseiso mkisofs
+sudo apt-get install -y libvirt-bin qemu-kvm python-pip fuseiso mkisofs genisoimage
 sudo apt-get install -y python-dev libz-dev libxml2-dev libxslt-dev
 sudo pip install pyyaml netaddr paramiko lxml scp pycrypto ecdsa
 
index 8a4bfc4..7635ced 100755 (executable)
@@ -147,12 +147,15 @@ class AutoDeploy(object):
             log('isolinux.cfg after: %s'
                 % exec_cmd('grep netmask %s' % isolinux))
 
+            iso_label = self.parse_iso_volume_label(self.iso_file)
+            log('Volume label: %s' % iso_label)
+
             iso_linux_bin = 'isolinux/isolinux.bin'
             exec_cmd('mkisofs -quiet -r -J -R -b %s '
                      '-no-emul-boot -boot-load-size 4 '
                      '-boot-info-table -hide-rr-moved '
-                     '-x "lost+found:" -o %s .'
-                     % (iso_linux_bin, new_iso))
+                     '-x "lost+found:" -V %s -o %s .'
+                     % (iso_linux_bin, iso_label, new_iso))
 
     def update_fuel_isolinux(self, file):
         with io.open(file) as f:
@@ -161,9 +164,34 @@ class AutoDeploy(object):
             pattern = r'%s=[^ ]\S+' % key
             replace = '%s=%s' % (key, val)
             data = re.sub(pattern, replace, data)
+
+        netmask = self.fuel_conf['netmask']
+        data = self.append_kernel_param(data, 'netmask=%s' % netmask)
+
         with io.open(file, 'w') as f:
             f.write(data)
 
+    def append_kernel_param(self, data, kernel_param):
+        """Append the specified kernel parameter to a list of kernel
+        parameters. Do it only if it isn't already there.
+        """
+        data_final = ''
+        key = re.match(r'(.+?=)', kernel_param).group()
+
+        for line in data.splitlines():
+            data_final += line
+            if (re.search(r'append ', line) and
+                not re.search(key, line)):
+                data_final += ' ' + kernel_param
+            data_final += '\n'
+
+        return data_final
+
+    def parse_iso_volume_label(self, iso_filename):
+        label_line = exec_cmd('isoinfo -d -i %s | grep -i "Volume id: "' % iso_filename)
+        # cut leading text: 'Volume id: '
+        return label_line[11:]
+
     def deploy_env(self):
         dep = CloudDeploy(self.dea, self.dha, self.fuel_conf['ip'],
                           self.fuel_username, self.fuel_password,
index 1896957..8c9cebc 100644 (file)
@@ -1,19 +1,19 @@
-*** ks.cfg.orig        Wed Apr 15 21:47:09 2015
---- ks.cfg     Wed Apr 15 21:47:24 2015
+*** ks.cfg.orig        2016-01-25 08:56:16.406241267 +0100
+--- ks.cfg     2016-01-25 14:31:11.417761494 +0100
 ***************
-*** 35,41 ****
+*** 98,104 ****
   default_drive=`echo ${drives} ${removable_drives} | awk '{print $1}'`
   
-  installdrive="undefined"
-! forceformat="no"
-  for I in `cat /proc/cmdline`; do case "$I" in *=*) eval $I;; esac ; done
-  
-  set ${drives} ${removable_drives}
---- 35,41 ----
+  installdrive=${installdrive:-undefined}
+! forceformat=${forceformat:-no}
+  for I in $(cat /proc/cmdline); do
+    case "$I" in
+      *=*)
+--- 98,104 ----
   default_drive=`echo ${drives} ${removable_drives} | awk '{print $1}'`
   
-  installdrive="undefined"
-! forceformat="yes"
-  for I in `cat /proc/cmdline`; do case "$I" in *=*) eval $I;; esac ; done
-  
-  set ${drives} ${removable_drives}
+  installdrive=${installdrive:-undefined}
+! forceformat=${forceformat:-yes}
+  for I in $(cat /proc/cmdline); do
+    case "$I" in
+      *=*)
index e3a7327..4f6a052 100644 (file)
@@ -87,7 +87,7 @@ class InstallFuelMaster(object):
         log('Found FUEL menu as PID %s, now killing it' % fuel_menu_pid)
         self.ssh_exec_cmd('kill %s' % fuel_menu_pid, False)
 
-        log('Wait until installation complete')
+        log('Wait until installation is complete')
         self.wait_until_installation_completed()
 
         log('Waiting for one minute for Fuel to stabilize')
@@ -117,6 +117,7 @@ class InstallFuelMaster(object):
         plugin_files = []
         with self.ssh as s:
             for plugin_location in [PLUGINS_DIR, LOCAL_PLUGIN_FOLDER]:
+                s.exec_cmd('mkdir -p %s' % plugin_location)
                 r = s.exec_cmd('find %s -type f -name \'*.rpm\''
                                % plugin_location)
                 plugin_files.extend(r.splitlines())
@@ -130,7 +131,7 @@ class InstallFuelMaster(object):
                                     'failed: %s' % (f, e))
 
     def wait_for_node_up(self):
-        WAIT_LOOP = 60
+        WAIT_LOOP = 240
         SLEEP_TIME = 10
         success = False
         for i in range(WAIT_LOOP):