Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
    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()
Ejemplo n.º 3
0
    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()
Ejemplo n.º 4
0
    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()
Ejemplo n.º 5
0
    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()
Ejemplo n.º 6
0
    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()
Ejemplo n.º 7
0
    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()
Ejemplo n.º 8
0
    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()
Ejemplo n.º 9
0
    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!')
Ejemplo n.º 10
0
    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()

        '''