summaryrefslogtreecommitdiffstats
path: root/fuel/deploy/deploy.py
diff options
context:
space:
mode:
authorJonas Bjurel <jonas.bjurel@ericsson.com>2015-05-20 13:19:56 +0000
committerGerrit Code Review <gerrit@172.30.200.206>2015-05-20 13:19:56 +0000
commit13f4399c1d0958d3c1943d75269e47058b521c9e (patch)
treec8452efff0376f58050cf8c2019efb95d8f3df2c /fuel/deploy/deploy.py
parent14674941d0e504a942886d36749a0f64490e4ade (diff)
parent945dca48c0b1fd93fec43513afb6680a8d828e33 (diff)
Merge "Autodeploy inspired on Prototype #2"
Diffstat (limited to 'fuel/deploy/deploy.py')
-rw-r--r--fuel/deploy/deploy.py199
1 files changed, 199 insertions, 0 deletions
diff --git a/fuel/deploy/deploy.py b/fuel/deploy/deploy.py
new file mode 100644
index 0000000..9d1a3d2
--- /dev/null
+++ b/fuel/deploy/deploy.py
@@ -0,0 +1,199 @@
+import sys
+import os
+import shutil
+import io
+import re
+import netaddr
+
+from dea import DeploymentEnvironmentAdapter
+from dha import DeploymentHardwareAdapter
+from install_fuel_master import InstallFuelMaster
+from deploy_env import CloudDeploy
+import common
+
+log = common.log
+exec_cmd = common.exec_cmd
+err = common.err
+check_file_exists = common.check_file_exists
+check_if_root = common.check_if_root
+
+FUEL_VM = 'fuel'
+TMP_DIR = '%s/fueltmp' % os.getenv('HOME')
+PATCH_DIR = 'fuel_patch'
+WORK_DIR = 'deploy'
+
+class cd:
+ def __init__(self, new_path):
+ self.new_path = os.path.expanduser(new_path)
+
+ def __enter__(self):
+ self.saved_path = os.getcwd()
+ os.chdir(self.new_path)
+
+ def __exit__(self, etype, value, traceback):
+ os.chdir(self.saved_path)
+
+
+class AutoDeploy(object):
+
+ def __init__(self, without_fuel, iso_file, dea_file, dha_file):
+ self.without_fuel = without_fuel
+ self.iso_file = iso_file
+ self.dea_file = dea_file
+ self.dha_file = dha_file
+ self.dea = DeploymentEnvironmentAdapter(dea_file)
+ self.dha = DeploymentHardwareAdapter(dha_file)
+ self.fuel_conf = {}
+ self.fuel_node_id = self.dha.get_fuel_node_id()
+ self.fuel_custom = self.dha.use_fuel_custom_install()
+ self.fuel_username, self.fuel_password = self.dha.get_fuel_access()
+
+ def setup_dir(self, dir):
+ self.cleanup_dir(dir)
+ os.makedirs(dir)
+
+ def cleanup_dir(self, dir):
+ if os.path.isdir(dir):
+ shutil.rmtree(dir)
+
+ def power_off_blades(self):
+ node_ids = self.dha.get_all_node_ids()
+ node_ids = list(set(node_ids) - set([self.fuel_node_id]))
+ for node_id in node_ids:
+ self.dha.node_power_off(node_id)
+
+ def modify_ip(self, ip_addr, index, val):
+ ip_str = str(netaddr.IPAddress(ip_addr))
+ decimal_list = map(int, ip_str.split('.'))
+ decimal_list[index] = val
+ return '.'.join(map(str, decimal_list))
+
+ def collect_fuel_info(self):
+ self.fuel_conf['ip'] = self.dea.get_fuel_ip()
+ self.fuel_conf['gw'] = self.dea.get_fuel_gateway()
+ self.fuel_conf['dns1'] = self.dea.get_fuel_dns()
+ self.fuel_conf['netmask'] = self.dea.get_fuel_netmask()
+ self.fuel_conf['hostname'] = self.dea.get_fuel_hostname()
+ self.fuel_conf['showmenu'] = 'yes'
+
+ def install_fuel_master(self):
+ if self.without_fuel:
+ log('Not Installing Fuel Master')
+ return
+ log('Install Fuel Master')
+ new_iso = '%s/deploy-%s' % (TMP_DIR, os.path.basename(self.iso_file))
+ self.patch_iso(new_iso)
+ self.iso_file = new_iso
+ self.install_iso()
+
+ def install_iso(self):
+ fuel = InstallFuelMaster(self.dea_file, self.dha_file,
+ self.fuel_conf['ip'], self.fuel_username,
+ self.fuel_password, self.fuel_node_id,
+ self.iso_file, WORK_DIR)
+ if self.fuel_custom:
+ log('Custom Fuel install')
+ fuel.custom_install()
+ else:
+ log('Ordinary Fuel install')
+ fuel.install()
+
+ def patch_iso(self, new_iso):
+ tmp_orig_dir = '%s/origiso' % TMP_DIR
+ tmp_new_dir = '%s/newiso' % TMP_DIR
+ self.copy(tmp_orig_dir, tmp_new_dir)
+ self.patch(tmp_new_dir, new_iso)
+
+ def copy(self, tmp_orig_dir, tmp_new_dir):
+ log('Copying...')
+ self.setup_dir(tmp_orig_dir)
+ self.setup_dir(tmp_new_dir)
+ exec_cmd('fuseiso %s %s' % (self.iso_file, tmp_orig_dir))
+ with cd(tmp_orig_dir):
+ exec_cmd('find . | cpio -pd %s' % tmp_new_dir)
+ with cd(tmp_new_dir):
+ exec_cmd('fusermount -u %s' % tmp_orig_dir)
+ shutil.rmtree(tmp_orig_dir)
+ exec_cmd('chmod -R 755 %s' % tmp_new_dir)
+
+ def patch(self, tmp_new_dir, new_iso):
+ log('Patching...')
+ patch_dir = '%s/%s' % (os.getcwd(), PATCH_DIR)
+ ks_path = '%s/ks.cfg.patch' % patch_dir
+
+ with cd(tmp_new_dir):
+ exec_cmd('cat %s | patch -p0' % ks_path)
+ shutil.rmtree('.rr_moved')
+ isolinux = 'isolinux/isolinux.cfg'
+ log('isolinux.cfg before: %s'
+ % exec_cmd('grep netmask %s' % isolinux))
+ self.update_fuel_isolinux(isolinux)
+ log('isolinux.cfg after: %s'
+ % exec_cmd('grep netmask %s' % isolinux))
+
+ 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))
+
+ def update_fuel_isolinux(self, file):
+ with io.open(file) as f:
+ data = f.read()
+ for key, val in self.fuel_conf.iteritems():
+ pattern = r'%s=[^ ]\S+' % key
+ replace = '%s=%s' % (key, val)
+ data = re.sub(pattern, replace, data)
+ with io.open(file, 'w') as f:
+ f.write(data)
+
+ def deploy_env(self):
+ dep = CloudDeploy(self.dha, self.fuel_conf['ip'], self.fuel_username,
+ self.fuel_password, self.dea_file, WORK_DIR)
+ dep.deploy()
+
+ def deploy(self):
+ check_if_root()
+ self.setup_dir(TMP_DIR)
+ self.collect_fuel_info()
+ self.power_off_blades()
+ self.install_fuel_master()
+ self.cleanup_dir(TMP_DIR)
+ self.deploy_env()
+
+def usage():
+ print '''
+ Usage:
+ python deploy.py [-nf] <isofile> <deafile> <dhafile>
+
+ Optional arguments:
+ -nf Do not install Fuel master
+ '''
+
+def parse_arguments():
+ if (len(sys.argv) < 4 or len(sys.argv) > 5
+ or (len(sys.argv) == 5 and sys.argv[1] != '-nf')):
+ log('Incorrect number of arguments')
+ usage()
+ sys.exit(1)
+ without_fuel = False
+ if len(sys.argv) == 5 and sys.argv[1] == '-nf':
+ without_fuel = True
+ iso_file = sys.argv[-3]
+ dea_file = sys.argv[-2]
+ dha_file = sys.argv[-1]
+ check_file_exists(iso_file)
+ check_file_exists(dea_file)
+ check_file_exists(dha_file)
+ return (without_fuel, iso_file, dea_file, dha_file)
+
+def main():
+
+ without_fuel, iso_file, dea_file, dha_file = parse_arguments()
+
+ d = AutoDeploy(without_fuel, iso_file, dea_file, dha_file)
+ d.deploy()
+
+if __name__ == '__main__':
+ main() \ No newline at end of file