コード例 #1
0
ファイル: launch.py プロジェクト: jserver/clifford
    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)
コード例 #2
0
ファイル: build.py プロジェクト: jserver/clifford
    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()