X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=deploy%2Fdeploy.py;h=057a0579c5011fadb0ce14aa79ee7f2bdc0d27c1;hb=7161058d87d2012074eb37109396a20651b586bc;hp=841b7015b76bbd513a383ff961ff0cc6de61af74;hpb=86adfdbd4341706bac2ac840b977a637d1f2017e;p=fuel.git diff --git a/deploy/deploy.py b/deploy/deploy.py index 841b7015b..057a0579c 100755 --- a/deploy/deploy.py +++ b/deploy/deploy.py @@ -14,7 +14,6 @@ import io import re import sys import yaml -import errno import signal import netaddr @@ -30,6 +29,7 @@ from common import ( err, warn, check_file_exists, + check_dir_exists, create_dir_if_not_exists, delete, check_if_root, @@ -61,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, deploy_log): self.no_fuel = no_fuel self.fuel_only = fuel_only self.no_health_check = no_health_check @@ -75,6 +75,9 @@ 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.deploy_log = deploy_log self.dea = (DeploymentEnvironmentAdapter(dea_file) if not cleanup_only else None) self.dha = DeploymentHardwareAdapter(dha_file) @@ -105,6 +108,20 @@ class AutoDeploy(object): self.iso_file = new_iso self.install_iso() + def delete_old_fuel_env(self): + log('Delete old Fuel Master environments if present') + try: + old_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, + self.deploy_timeout, + self.no_deploy_environment, self.deploy_log) + with old_dep.ssh: + old_dep.check_previous_installation() + except Exception as e: + log('Could not delete old env: %s' % str(e)) + def install_iso(self): fuel = InstallFuelMaster(self.dea_file, self.dha_file, self.fuel_conf['ip'], self.fuel_username, @@ -148,10 +165,10 @@ 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) @@ -160,14 +177,17 @@ class AutoDeploy(object): exec_cmd('mkisofs -quiet -r -J -R -b %s ' '-no-emul-boot -boot-load-size 4 ' '-boot-info-table -hide-rr-moved ' + '-joliet-long ' '-x "lost+found:" -V %s -o %s .' % (iso_linux_bin, iso_label, new_iso)) + delete(tmp_new_dir) + 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 custom + # skip replacing these keys, as the format is different if key in ['ip', 'gw', 'netmask', 'hostname']: continue @@ -185,28 +205,9 @@ class AutoDeploy(object): data = re.sub(r'ip=[^ ]\S+', 'ip=%s' % ip, 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: ' @@ -216,7 +217,8 @@ class AutoDeploy(object): 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, self.deploy_log) return dep.deploy() def setup_execution_environment(self): @@ -237,12 +239,14 @@ class AutoDeploy(object): def deploy(self): self.collect_fuel_info() if not self.no_fuel: + self.delete_old_fuel_env() self.setup_execution_environment() self.create_tmp_dir() 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() @@ -253,9 +257,16 @@ 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): + # Assume that bridges on remote nodes exists, we could ssh but + # the remote user might not have a login shell. + if os.environ.get('LIBVIRT_DEFAULT_URI'): + return + with io.open(dha_path) as yaml_file: dha_struct = yaml.load(yaml_file) if dha_struct['adapter'] != 'libvirt': @@ -322,8 +333,8 @@ def parse_arguments(): parser.add_argument('-s', dest='storage_dir', action='store', default='%s/images' % CWD, help='Storage Directory [default: images]') - parser.add_argument('-b', dest='pxe_bridge', action='store', - default='pxebr', + parser.add_argument('-b', dest='pxe_bridge', action='append', + default=[], help='Linux Bridge for booting up the Fuel Master VM ' '[default: pxebr]') parser.add_argument('-p', dest='fuel_plugins_dir', action='store', @@ -332,32 +343,52 @@ 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')) + parser.add_argument('-log', dest='deploy_log', + action='store', default='../ci/.', + help=('Path and name of the deployment log archive')) args = parser.parse_args() log(args) + if not args.pxe_bridge: + args.pxe_bridge = ['pxebr'] + check_file_exists(args.dha_file) + check_dir_exists(os.path.dirname(args.deploy_log)) + if not args.cleanup_only: check_file_exists(args.dea_file) check_fuel_plugins_dir(args.fuel_plugins_dir) + iso_abs_path = os.path.abspath(args.iso_file) if not args.no_fuel and not args.cleanup_only: - log('Using OPNFV ISO file: %s' % args.iso_file) - check_file_exists(args.iso_file) + log('Using OPNFV ISO file: %s' % iso_abs_path) + check_file_exists(iso_abs_path) log('Using image directory: %s' % args.storage_dir) create_dir_if_not_exists(args.storage_dir) - check_bridge(args.pxe_bridge, args.dha_file) + for bridge in args.pxe_bridge: + check_bridge(bridge, args.dha_file) + kwargs = {'no_fuel': args.no_fuel, 'fuel_only': args.fuel_only, 'no_health_check': args.no_health_check, 'cleanup_only': args.cleanup_only, 'cleanup': args.cleanup, 'storage_dir': args.storage_dir, 'pxe_bridge': args.pxe_bridge, - 'iso_file': args.iso_file, 'dea_file': args.dea_file, + 'iso_file': iso_abs_path, 'dea_file': args.dea_file, '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, + 'deploy_log': args.deploy_log} return kwargs