X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=deploy%2Fdeploy.py;h=f86f2be129adb87fe68676e2503f8a79cff939a8;hb=refs%2Fheads%2Fstable%2Fbrahmaputra;hp=8a4bfc40ae9e250de3ec8461ab3583349dcb2488;hpb=e9dade97d97f0d80fef3dd7d73b83cbe84eebf31;p=fuel.git diff --git a/deploy/deploy.py b/deploy/deploy.py index 8a4bfc40a..f86f2be12 100755 --- a/deploy/deploy.py +++ b/deploy/deploy.py @@ -13,8 +13,10 @@ import os import io import re import sys -import netaddr import yaml +import errno +import signal +import netaddr from dea import DeploymentEnvironmentAdapter from dha import DeploymentHardwareAdapter @@ -38,6 +40,7 @@ FUEL_VM = 'fuel' PATCH_DIR = 'fuel_patch' WORK_DIR = '~/deploy' CWD = os.getcwd() +MOUNT_STATE_VAR = 'AUTODEPLOY_ISO_MOUNTED' class cd: @@ -58,7 +61,7 @@ class AutoDeploy(object): def __init__(self, no_fuel, fuel_only, no_health_check, cleanup_only, cleanup, storage_dir, pxe_bridge, iso_file, dea_file, dha_file, fuel_plugins_dir, fuel_plugins_conf_dir, - no_plugins): + no_plugins, deploy_timeout, no_deploy_environment): self.no_fuel = no_fuel self.fuel_only = fuel_only self.no_health_check = no_health_check @@ -72,6 +75,8 @@ class AutoDeploy(object): self.fuel_plugins_dir = fuel_plugins_dir self.fuel_plugins_conf_dir = fuel_plugins_conf_dir self.no_plugins = no_plugins + self.deploy_timeout = deploy_timeout + self.no_deploy_environment = no_deploy_environment self.dea = (DeploymentEnvironmentAdapter(dea_file) if not cleanup_only else None) self.dha = DeploymentHardwareAdapter(dha_file) @@ -118,6 +123,7 @@ class AutoDeploy(object): self.patch(tmp_new_dir, new_iso) except Exception as e: exec_cmd('fusermount -u %s' % tmp_orig_dir, False) + os.environ.pop(MOUNT_STATE_VAR, None) delete(self.tmp_dir) err(e) @@ -126,9 +132,11 @@ class AutoDeploy(object): os.makedirs(tmp_orig_dir) os.makedirs(tmp_new_dir) exec_cmd('fuseiso %s %s' % (self.iso_file, tmp_orig_dir)) + os.environ[MOUNT_STATE_VAR] = tmp_orig_dir with cd(tmp_orig_dir): exec_cmd('find . | cpio -pd %s' % tmp_new_dir) exec_cmd('fusermount -u %s' % tmp_orig_dir) + os.environ.pop(MOUNT_STATE_VAR, None) delete(tmp_orig_dir) exec_cmd('chmod -R 755 %s' % tmp_new_dir) @@ -142,33 +150,57 @@ class AutoDeploy(object): delete('.rr_moved') isolinux = 'isolinux/isolinux.cfg' log('isolinux.cfg before: %s' - % exec_cmd('grep netmask %s' % isolinux)) + % exec_cmd('grep ip= %s' % isolinux)) self.update_fuel_isolinux(isolinux) log('isolinux.cfg after: %s' - % exec_cmd('grep netmask %s' % isolinux)) + % exec_cmd('grep ip= %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: data = f.read() for key, val in self.fuel_conf.iteritems(): + # skip replacing these keys, as the format is different + if key in ['ip', 'gw', 'netmask', 'hostname']: + continue + pattern = r'%s=[^ ]\S+' % key replace = '%s=%s' % (key, val) data = re.sub(pattern, replace, data) + + # process networking parameters + ip = ':'.join([self.fuel_conf['ip'], + '', + self.fuel_conf['gw'], + self.fuel_conf['netmask'], + self.fuel_conf['hostname'], + 'eth0:off:::']) + + data = re.sub(r'ip=[^ ]\S+', 'ip=%s' % ip, data) + with io.open(file, 'w') as f: f.write(data) + 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, self.dea_file, self.fuel_plugins_conf_dir, - WORK_DIR, self.no_health_check) + WORK_DIR, self.no_health_check, self.deploy_timeout, + self.no_deploy_environment) return dep.deploy() def setup_execution_environment(self): @@ -194,7 +226,8 @@ class AutoDeploy(object): self.install_fuel_master() if not self.fuel_only: return self.deploy_env() - return True + # Exit status + return 0 def run(self): check_if_root() @@ -205,7 +238,9 @@ class AutoDeploy(object): if self.cleanup: self.cleanup_execution_environment() return deploy_success - return True + # Exit status + return 0 + def check_bridge(pxe_bridge, dha_path): with io.open(dha_path) as yaml_file: @@ -284,6 +319,12 @@ def parse_arguments(): help='Fuel Plugins Configuration directory') parser.add_argument('-np', dest='no_plugins', action='store_true', default=False, help='Do not install Fuel Plugins') + parser.add_argument('-dt', dest='deploy_timeout', action='store', + default=240, help='Deployment timeout (in minutes) ' + '[default: 240]') + parser.add_argument('-nde', dest='no_deploy_environment', + action='store_true', default=False, + help=('Do not launch environment deployment')) args = parser.parse_args() log(args) @@ -309,11 +350,34 @@ def parse_arguments(): 'dha_file': args.dha_file, 'fuel_plugins_dir': args.fuel_plugins_dir, 'fuel_plugins_conf_dir': args.fuel_plugins_conf_dir, - 'no_plugins': args.no_plugins} + 'no_plugins': args.no_plugins, + 'deploy_timeout': args.deploy_timeout, + 'no_deploy_environment': args.no_deploy_environment} return kwargs +def handle_signals(signal_num, frame): + signal.signal(signal.SIGINT, signal.SIG_IGN) + signal.signal(signal.SIGTERM, signal.SIG_IGN) + + log('Caught signal %s, cleaning up and exiting.' % signal_num) + + mount_point = os.environ.get(MOUNT_STATE_VAR) + if mount_point: + log('Unmounting ISO from "%s"' % mount_point) + # Prevent 'Device or resource busy' errors when unmounting + os.chdir('/') + exec_cmd('fusermount -u %s' % mount_point, True) + # Be nice and remove our environment variable, even though the OS would + # would clean it up anyway + os.environ.pop(MOUNT_STATE_VAR) + + sys.exit(1) + + def main(): + signal.signal(signal.SIGINT, handle_signals) + signal.signal(signal.SIGTERM, handle_signals) kwargs = parse_arguments() d = AutoDeploy(**kwargs) sys.exit(d.run())