Example #1
0
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)

        env_files = []

        if parsed_args.environment_directories:
            env_files.extend(
                utils.load_environment_directories(
                    parsed_args.environment_directories))
        if parsed_args.environment_files:
            env_files.extend(parsed_args.environment_files)

        service_filter = self.build_service_filter(env_files,
                                                   parsed_args.roles_file)

        neutron_driver = None
        if service_filter:
            if 'OS::TripleO::Services::OpenDaylightApi' in service_filter:
                neutron_driver = 'odl'
            elif 'OS::TripleO::Services::OVNController' in service_filter:
                neutron_driver = 'ovn'

        subs = {
            'tag': parsed_args.tag,
            'namespace': parsed_args.namespace,
            'name_prefix': parsed_args.prefix,
            'name_suffix': parsed_args.suffix,
            'neutron_driver': neutron_driver,
        }
        self.parse_set_values(subs, parsed_args.set)

        output_images_file = (parsed_args.output_images_file
                              or 'container_images.yaml')

        prepare_data = kolla_builder.container_images_prepare(
            excludes=parsed_args.excludes,
            service_filter=service_filter,
            pull_source=parsed_args.pull_source,
            push_destination=parsed_args.push_destination,
            mapping_args=subs,
            output_env_file=parsed_args.output_env_file,
            output_images_file=output_images_file,
            tag_from_label=parsed_args.tag_from_label)
        if parsed_args.output_env_file:
            params = prepare_data[parsed_args.output_env_file]
            self.write_env_file(params, parsed_args.output_env_file)

        result = prepare_data[output_images_file]
        result_str = yaml.safe_dump({'container_images': result},
                                    default_flow_style=False)
        sys.stdout.write(result_str)

        if parsed_args.output_images_file:
            with os.fdopen(
                    os.open(parsed_args.output_images_file,
                            os.O_CREAT | os.O_TRUNC | os.O_WRONLY, 0o666),
                    'w') as f:
                f.write(result_str)
    def _deploy_tripleo_heat_templates(self, stack, parsed_args, tht_root,
                                       user_tht_root):
        """Deploy the fixed templates in TripleO Heat Templates"""

        plans = plan_management.list_deployment_plans(self.clients)
        generate_passwords = not parsed_args.disable_password_generation

        # TODO(d0ugal): We need to put a more robust strategy in place here to
        #               handle updating plans.
        if parsed_args.stack in plans:
            # Upload the new plan templates to swift to replace the existing
            # templates.
            plan_management.update_plan_from_templates(
                self.clients, parsed_args.stack, tht_root,
                parsed_args.roles_file, generate_passwords,
                parsed_args.plan_environment_file, parsed_args.networks_file,
                type(self)._keep_env_on_update)
        else:
            plan_management.create_plan_from_templates(
                self.clients, parsed_args.stack, tht_root,
                parsed_args.roles_file, generate_passwords,
                parsed_args.plan_environment_file, parsed_args.networks_file)

        # Get any missing (e.g j2 rendered) files from the plan to tht_root
        self._download_missing_files_from_plan(tht_root, parsed_args.stack)

        print("Processing templates in the directory {0}".format(
            os.path.abspath(tht_root)))

        self.log.debug("Creating Environment files")
        env = {}
        created_env_files = []

        if parsed_args.environment_directories:
            created_env_files.extend(
                utils.load_environment_directories(
                    parsed_args.environment_directories))
        parameters = {}
        if stack:
            try:
                # If user environment already exist then keep it
                user_env = yaml.safe_load(
                    self.object_client.get_object(
                        parsed_args.stack, constants.USER_ENVIRONMENT)[1])
                template_utils.deep_update(env, user_env)
            except ClientException:
                pass
        parameters.update(self._update_parameters(parsed_args, stack))
        template_utils.deep_update(
            env,
            self._create_parameters_env(parameters, tht_root,
                                        parsed_args.stack))

        if parsed_args.rhel_reg:
            reg_env_files, reg_env = self._create_registration_env(
                parsed_args, tht_root)
            created_env_files.extend(reg_env_files)
            template_utils.deep_update(env, reg_env)
        if parsed_args.environment_files:
            created_env_files.extend(parsed_args.environment_files)

        self.log.debug("Processing environment files %s" % created_env_files)
        env_files, localenv = utils.process_multiple_environments(
            created_env_files,
            tht_root,
            user_tht_root,
            cleanup=not parsed_args.no_cleanup)
        template_utils.deep_update(env, localenv)

        if stack:
            bp_cleanup = self._create_breakpoint_cleanup_env(
                tht_root, parsed_args.stack)
            template_utils.deep_update(env, bp_cleanup)

        # FIXME(shardy) It'd be better to validate this via mistral
        # e.g part of the plan create/update workflow
        number_controllers = int(parameters.get('ControllerCount', 0))
        if number_controllers > 1:
            if not env.get('parameter_defaults').get('NtpServer'):
                raise exceptions.InvalidConfiguration(
                    'Specify --ntp-server as parameter or NtpServer in '
                    'environments when using multiple controllers '
                    '(with HA).')

        self._try_overcloud_deploy_with_compat_yaml(
            tht_root, stack, parsed_args.stack, parameters, env_files,
            parsed_args.timeout, env, parsed_args.update_plan_only,
            parsed_args.run_validations, parsed_args.skip_deploy_identifier,
            parsed_args.plan_environment_file)
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)

        env_files = []

        if parsed_args.environment_directories:
            env_files.extend(
                utils.load_environment_directories(
                    parsed_args.environment_directories))
        if parsed_args.environment_files:
            env_files.extend(parsed_args.environment_files)

        service_filter = self.build_service_filter(env_files,
                                                   parsed_args.roles_file)

        neutron_driver = None
        if service_filter:
            if 'OS::TripleO::Services::OpenDaylightApi' in service_filter:
                neutron_driver = 'odl'
            elif 'OS::TripleO::Services::OVNController' in service_filter:
                neutron_driver = 'ovn'

        subs = {
            'tag': parsed_args.tag,
            'namespace': parsed_args.namespace,
            'name_prefix': parsed_args.prefix,
            'name_suffix': parsed_args.suffix,
            'neutron_driver': neutron_driver,
        }
        self.parse_set_values(subs, parsed_args.set)

        def ffunc(entry):
            imagename = entry.get('imagename', '')
            for p in parsed_args.excludes:
                if re.search(p, imagename):
                    return None
            if service_filter is not None:
                # check the entry is for a service being deployed
                image_services = set(entry.get('services', []))
                if not service_filter.intersection(image_services):
                    return None
            if parsed_args.pull_source:
                entry['pull_source'] = parsed_args.pull_source
            if parsed_args.push_destination:
                entry['push_destination'] = parsed_args.push_destination
            return entry

        builder = kolla_builder.KollaImageBuilder([parsed_args.template_file])
        result = builder.container_images_from_template(filter=ffunc, **subs)

        params = {}
        for entry in result:
            imagename = entry.get('imagename', '')
            if 'params' in entry:
                for p in entry.pop('params'):
                    params[p] = imagename
            if 'services' in entry:
                del (entry['services'])

        if parsed_args.output_env_file:
            params.update(self.detect_insecure_registries(params))
            self.write_env_file(params, parsed_args.output_env_file)

        result_str = yaml.safe_dump({'container_images': result},
                                    default_flow_style=False)
        sys.stdout.write(result_str)

        if parsed_args.output_images_file:
            with os.fdopen(
                    os.open(parsed_args.output_images_file,
                            os.O_CREAT | os.O_TRUNC | os.O_WRONLY, 0o666),
                    'w') as f:
                f.write(result_str)