def take_action(self, parsed_args): if '[' in parsed_args.tag_name or ']' in parsed_args.tag_name: self.app.stdout.write('Clifford Tag Names may not include brackets') return instance_type = self.get_instance_type() image_key = self.get_image(return_key=True) key = self.get_key() zone = self.get_zone() security_group_ids = self.get_security_groups() user_data = self.get_user_data(return_name=True) raw_num = raw_input('Number of instances to launch (1)? ') if not raw_num or not raw_num.isdigit(): num = 1 else: num = int(raw_num) if num < 1: raise RuntimeError('Need to launch at least 1!') build = { 'Size': instance_type, 'Image': image_key, 'Key': key.name, 'SecurityGroups': security_group_ids, } if hasattr(zone, 'name'): build['Zone'] = zone.name if user_data: build['UserData'] = user_data if not self.sure_check(): raise RuntimeError('Instance(s) not created!') image = config.images[image_key] launcher(parsed_args.tag_name, config.aws_key_path, config.script_path, build=build, image=image, num=num, out=self.app.stdout)
def take_action(self, parsed_args): if parsed_args.add: if parsed_args.build_name in config.builds: raise RuntimeError('A build already exists by that name!') self.add(parsed_args.build_name) return if parsed_args.build_name not in config.builds: raise RuntimeError('Build not found!') if parsed_args.remove: del(config.builds[parsed_args.build_name]) config.save() return if parsed_args.update: aws_images = self.app.ec2_conn.get_all_images(image_ids=[parsed_args.update]) if aws_images: config.builds[parsed_args.build_name]['Image'] = parsed_args.update config.save() return else: raise RuntimeError('Image not found!') tag_name = raw_input('Enter Tag:Name Value (%s): ' % parsed_args.build_name) if not tag_name: tag_name = parsed_args.build_name if not tag_name.isalnum(): raise RuntimeError('Keep names simple alpha-numeric!') if not self.sure_check(): return build = config.builds[parsed_args.build_name] image = config.images[build['Image']] q = Queue() launcher(tag_name, config.aws_key_path, config.script_path, build_name=parsed_args.build_name, build=build, image=image, num=parsed_args.num, q=q, out=self.app.stdout) lr = q.get() self.app.stdout.write('Allowing server to come up...\n') wait_for_ok([inst_id for inst_id in lr.instance_ids]) # begin the mutliprocessing pool = Pool(processes=len(lr.instance_ids)) if build.get('Upgrade', '') in ['upgrade', 'dist-upgrade']: tasks = [Task(build, image, inst_id, []) for inst_id in lr.instance_ids] self.run_activity(pool, upgrade, tasks) self.app.stdout.write('Upgrade Finished\n') if build.get('Upgrade') == 'dist-upgrade': self.app.stdout.write('Rebooting after dist-upgrade...\n') wait_for_ok([inst_id for inst_id in lr.instance_ids]) if build.get('Group', '') in config.groups: bundles = [] self.get_bundles(build['Group'], bundles) if bundles: tasks = [Task(build, image, inst_id, [bundles]) for inst_id in lr.instance_ids] self.run_activity(pool, group_installer, tasks) self.app.stdout.write('Group Installer Finished\n') time.sleep(10) if build.get('PyGroup', '') in config.python_bundles: python_packages = config.python_bundles[build['PyGroup']] if python_packages: tasks = [Task(build, image, inst_id, [config['PythonInstaller'], python_packages]) for inst_id in lr.instance_ids] self.run_activity(pool, py_installer, tasks) self.app.stdout.write('Python Installer Finished\n') time.sleep(10) if 'Script' in build: tasks = [Task(build, image, inst_id, [image['Login'], os.path.join(config.script_path, build['Script']), False]) for inst_id in lr.instance_ids] self.run_activity(pool, script_runner, tasks) self.app.stdout.write('Script Runner Finished\n') time.sleep(10) if 'Adduser' in build: tasks = [Task(build, image, inst_id, [config.pub_key_path]) for inst_id in lr.instance_ids] self.run_activity(pool, add_user, tasks) self.app.stdout.write('Adduser Finished\n') time.sleep(10) if 'Script' in build['Adduser']: tasks = [Task(build, image, inst_id, [build['Adduser']['User'], os.path.join(config.script_path, build['Adduser']['Script']), True]) for inst_id in lr.instance_ids] self.run_activity(pool, script_runner, tasks) self.app.stdout.write('User Script Runner Finished\n') time.sleep(10) if 'ElasticIP' in build: tasks = [Task(build, image, inst_id, []) for inst_id in lr.instance_ids] self.run_activity(pool, elastic_ip, tasks) self.app.stdout.write('ElasticIP Finished\n') time.sleep(10) elif 'StaticHost' not in build or build['StaticHost'] != 'skip': tasks = [Task(build, image, inst_id, [tag_name]) for inst_id in lr.instance_ids] self.run_activity(pool, static_host, tasks) self.app.stdout.write('Static Host Finished\n') time.sleep(10) pool.close() pool.join()