def take_action(self, parsed_args): if not parsed_args.update: self.app.stdout.write('%s\n' % config.script_path) return config['ScriptPath'] = parsed_args.update config.save()
def take_action(self, parsed_args): if not parsed_args.update: self.app.stdout.write('%s\n' % config.get('Domain', '<<Domain not set!>>')) return config['Domain'] = parsed_args.update config.save()
def add(self, name): instance_type = self.get_instance_type() image = self.get_image(return_key=True) key = self.get_key() zone = self.get_zone() security_groups = self.get_security_groups(return_names=True) user_data = self.get_user_data(return_name=True) upgrade_options = [{'text': 'Skip Step'}, {'text': 'upgrade'}, {'text': 'dist-upgrade'}] upgrade_option = self.question_maker('Select upgrade option', 'upgrade', upgrade_options, start_at=0) if config.groups: groups = config.groups group_options = [{'text': 'Skip Step'}] group_options.extend([{'text': item} for item in groups.keys()]) group_option = self.question_maker('Select group to install', 'group', group_options, start_at=0) else: group_option = 'Skip Step' if config.python_bundles: bundles = config.python_bundles bundle_options = [{'text': 'Skip Step'}] bundle_options.extend([{'text': item} for item in bundles.keys()]) bundle_option = self.question_maker('Select python bundle to install', 'bundle', bundle_options, start_at=0) else: bundle_option = 'Skip Step' suffix = raw_input('Optional short suffix (i.e. www,db,lb,mq)? ') build = OrderedDict() build['Size'] = instance_type build['Image'] = image build['Key'] = key.name build['SecurityGroups'] = security_groups if hasattr(zone, 'name'): build['Zone'] = zone.name if user_data: build['UserData'] = user_data if suffix: build['Suffix'] = suffix if upgrade_option != 'Skip Step': build['Upgrade'] = upgrade_option if group_option != 'Skip Step': build['Group'] = group_option if bundle_option != 'Skip Step': build['PyGroup'] = bundle_option config.builds[name] = build config.save()
def take_action(self, parsed_args): if not parsed_args.aws and not parsed_args.pub: self.app.stdout.write('aws: %s\n' % config.aws_key_path) self.app.stdout.write('pub: %s\n' % config.pub_key_path) return if parsed_args.aws: config['AwsKeyPath'] = parsed_args.aws if parsed_args.pub: config['PubKeyPath'] = parsed_args.pub config.save()
def take_action(self, parsed_args): name = parsed_args.bundle_name section = 'Bundles' if not parsed_args.is_py_bundle else 'PythonBundles' if section not in config: config[section] = OrderedDict() if parsed_args.add: if name in config[section]: raise RuntimeError('%s already exists!' % name) packages = raw_input('Enter package names: ') if not packages: raise RuntimeError('No package names given!\n') config[section][name] = packages config.save() else: if name not in config[section]: raise RuntimeError('No %s %s found!' % (name, section[:-1])) if parsed_args.show: self.app.stdout.write(config[section][name] + '\n') elif parsed_args.update: packages = raw_input('Enter package names: ') if not packages: raise RuntimeError('No package names given!\n') config[section][name] = packages config.save() elif parsed_args.remove: del(config[section][name]) config.save()
def add(self, name): project = OrderedDict() project['Builds'] = [] build_items = [{'text': 'Skip Step'}] + [{'text': bld} for bld in config.builds.keys()] while True: build = self.question_maker('Select Build', 'build', build_items, start_at=0) if not build: continue if build == 'Skip Step': break num = raw_input('How many instances? ') if not num.isdigit(): raise RuntimeError('Invalid number!') _dict = OrderedDict() _dict['Build'] = build _dict['Num'] = int(num) project['Builds'].append(_dict) if project['Builds']: config.projects[name] = project config.save()
def take_action(self, parsed_args): name = parsed_args.group_name section = 'Groups' if section not in config: config[section] = OrderedDict() if parsed_args.add: if name in config[section]: raise RuntimeError('%s already exists!' % name) group_items = self.get_group_items() if not group_items: raise RuntimeError('Nothing to save!\n') config[section][name] = group_items config.save() else: if name not in config[section]: raise RuntimeError('No %s %s found!' % (name, section[:-1])) if parsed_args.show: for item in config[section][name]: self.app.stdout.write('[%s] %s\n' % (item['Type'], item['Value'])) elif parsed_args.update: group_items = self.get_group_items() if not group_items: raise RuntimeError('Nothing to save!\n') config[section][name] = group_items config.save() elif parsed_args.remove: del(config[section][name]) config.save()
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()
def take_action(self, parsed_args): if parsed_args.add: image = self.app.ec2_conn.get_image(parsed_args.add) if not image: raise RuntimeError('Image not found!') self.app.stdout.write('Found the following image:\n') self.app.stdout.write(' Name: %s\n' % image.name) self.app.stdout.write(' Desc: %s\n' % image.description) login = raw_input('Enter login: '******'Login required!') name = raw_input('Enter nickname of image: ') if not name: raise RuntimeError('Nickname required!') if name in config.images: raise RuntimeError('Nickname already in use!') img = OrderedDict() img['Id'] = image.id img['Login'] = login img['Name'] = image.name config.images[name] = img config['Images'] = OrderedDict(sorted(config.images.items(), key=lambda i: i[0].lower())) config.save() elif parsed_args.remove: images = config.images if not images: raise RuntimeError('No Images found!') items = [{'text': '%s - %s' % (key, images[key]['Id']), 'obj': key} for key in images.keys()] image = self.question_maker('Available Images', 'image', items) if self.sure_check(): del(images[image]) config.save() elif parsed_args.update: r = requests.get('https://cloud-images.ubuntu.com/locator/ec2/releasesTable') txt = r.text.replace('"],\n]', '"]\n]') aaData = json.loads(txt)['aaData'] for image_key in config.images: image = config.images[image_key] if 'Meta' in image: meta = image['Meta'] imgs = [a[6] for a in aaData if a[0] == meta['Zone'] and a[1] == meta['Name'] and a[2] == meta['Version'] and a[3] == meta['Arch'] and a[4] == meta['InstanceType']] if len(imgs) == 1: ami_id = imgs[0] m = re.search('(?<=ami-)\w+', ami_id) ami_id = 'ami-' + m.group(0) ec2_image = self.app.ec2_conn.get_image(ami_id) if image['Id'] != ami_id: self.app.stdout.write('Image: %s Current ami_id: %s New ami_id: %s Updating...\n' % (image_key, image['Id'], ami_id)) image['Id'] = ami_id image['Name'] = ec2_image.name config.save() else: self.app.stdout.write('More than 1 image found, skipping') else: raise RuntimeError('Use -a <ami_id> to add, -r to remove an image and -u to update ubuntu images!')
def take_action(self, parsed_args): if parsed_args.add: if parsed_args.project_name in config.projects: raise RuntimeError('A project already exists by that name!') self.add(parsed_args.project_name) return if parsed_args.project_name not in config.projects: raise RuntimeError('Project not found!') if parsed_args.remove: del(config.projects[parsed_args.project_name]) config.save() return project = config.projects[parsed_args.project_name] if 'Builds' not in project or not project['Builds']: raise RuntimeError('No Builds in project!') tag_name = raw_input('Enter Tag:Name Value (%s): ' % parsed_args.project_name) if not tag_name: tag_name = parsed_args.project_name if '[' in tag_name or ']' in tag_name: self.app.stdout.write('Clifford Tag Names may not include brackets') return if not self.sure_check(): return total = sum(b['Num'] for b in project['Builds']) pool = Pool(processes=total) m = Manager() q = m.Queue(total) results = [] counter = 0 for project_build in project['Builds']: build = config.builds[project_build['Build']] image = config.images[build['Image']] kwargs = { 'build_name': project_build['Build'], 'build': build, 'image': image, 'project_name': parsed_args.project_name, 'project': project, 'num': project_build['Num'], 'counter': counter, 'q': q } results.append(pool.apply_async(launcher, [tag_name, config.aws_key_path, config.script_path], kwargs)) counter += project_build['Num'] launch_results = self.process_results(q, results) tasks = [] for lr in launch_results: if lr.build.get('Upgrade', '') in ['upgrade', 'dist-upgrade']: for inst_id in lr.instance_ids: tasks.append(Task(lr.build, lr.image, inst_id, [])) self.run_activity(pool, upgrade, tasks) self.app.stdout.write('Upgrade Finished\n') ''' instances = [] for lr in launch_results: if lr.build.get('Upgrade', '') in ['upgrade', 'dist-upgrade']: reservations = self.app.ec2_conn.get_all_instances(instance_ids=lr.instance_ids) for res in reservations: for inst in res.instances: instances.append(inst) for lr in launch_results: reservations = self.app.ec2_conn.get_all_instances(instance_ids=lr.instance_ids) if 'Upgrade' in lr.build and lr.build['Upgrade'] in ['upgrade', 'dist-upgrade']: self.run_activity(lr.reservation, pool, upgrade, [lr.image['Login'], lr.build['Upgrade'], config.aws_key_path]) if 'Group' in lr.build and lr.build['Group'] in config.groups: bundles = [] self.get_bundles(lr.build['Group'], bundles) self.run_activity(reservation, pool, group_installer, [lr.image['Login'], bundles, config.aws_key_path]) self.app.stdout.write('Group Installer Finished\n') time.sleep(10) if 'PyGroup' in lr.build and lr.build['PyGroup'] in config.python_bundles: python_packages = config.python_bundles[lr.build['PyGroup']] self.app.stdout.write('python: %s [%s]\n' % (lr.build['PyGroup'], python_packages)) self.run_activity(reservation, pool, py_installer, [lr.image['Login'], python_packages, config.aws_key_path]) self.app.stdout.write('Python Installer Finished\n') time.sleep(10) if 'Script' in lr.build: self.run_activity(reservation, pool, script_runner, [lr.image['Login'], os.path.join(config.script_path, lr.build['Script']), config.aws_key_path]) ''' pool.close() pool.join() '''