def _test_container_images_yaml_in_sync_helper(self,
                                                   neutron_driver=None,
                                                   remove_images=[]):
        '''Confirm overcloud_containers.tpl.yaml equals overcloud_containers.yaml

        TODO(sbaker) remove when overcloud_containers.yaml is deleted
        '''
        mod_dir = os.path.dirname(sys.modules[__name__].__file__)
        project_dir = os.path.abspath(os.path.join(mod_dir, '../../../'))
        files_dir = os.path.join(project_dir, 'container-images')

        oc_tmpl_file = os.path.join(files_dir, 'overcloud_containers.yaml.j2')
        tmpl_builder = kb.KollaImageBuilder([oc_tmpl_file])

        def ffunc(entry):
            if 'params' in entry:
                del (entry['params'])
            if 'services' in entry:
                del (entry['services'])
            return entry

        result = tmpl_builder.container_images_from_template(
            filter=ffunc, neutron_driver=neutron_driver)

        oc_yaml_file = os.path.join(files_dir, 'overcloud_containers.yaml')
        yaml_builder = kb.KollaImageBuilder([oc_yaml_file])
        container_images = yaml_builder.load_config_files(
            yaml_builder.CONTAINER_IMAGES)

        # remove image references from overcloud_containers.yaml specified
        # in remove_images param.
        for image in remove_images:
            container_images.remove(image)

        self.assertSequenceEqual(container_images, result)
Exemplo n.º 2
0
    def test_container_images_from_template_filter(self):
        builder = kb.KollaImageBuilder(self.filelist)

        def filter(entry):

            # do not want heat-agents image
            if 'heat-docker-agents' in entry.get('imagename'):
                return

            # set source and destination on all entries
            entry['push_destination'] = 'localhost:8787'
            return entry

        result = builder.container_images_from_template(filter=filter,
                                                        tag='liberty')
        container_images = [{
            'imagename': 'docker.io/tripleomaster/'
            'centos-binary-nova-compute:liberty',
            'push_destination': 'localhost:8787',
            'uploader': 'docker'
        }, {
            'imagename': 'docker.io/tripleomaster/'
            'centos-binary-nova-libvirt:liberty',
            'push_destination': 'localhost:8787',
            'uploader': 'docker'
        }, {
            'imagename': 'docker.io/tripleomaster/image-with-missing-tag',
            'push_destination': 'localhost:8787'
        }]
        self.assertEqual(container_images, result)
Exemplo n.º 3
0
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)

        fd, path = tempfile.mkstemp(prefix='kolla_conf_')
        with os.fdopen(fd, 'w') as tmp:
            tmp.write('[DEFAULT]\n')
            if parsed_args.list_images or parsed_args.list_dependencies:
                tmp.write('list_dependencies=true')
        kolla_config_files = list(parsed_args.kolla_config_files)
        kolla_config_files.append(path)

        try:
            builder = kolla_builder.KollaImageBuilder(parsed_args.config_files)
            result = builder.build_images(kolla_config_files)
            if parsed_args.list_dependencies:
                deps = json.loads(result)
                yaml.safe_dump(deps,
                               self.app.stdout,
                               indent=2,
                               default_flow_style=False)
            elif parsed_args.list_images:
                deps = json.loads(result)
                images = []
                BuildImage.images_from_deps(images, deps)
                yaml.safe_dump(images,
                               self.app.stdout,
                               default_flow_style=False)
            elif result:
                self.app.stdout.write(result)
        finally:
            os.remove(path)
Exemplo n.º 4
0
 def test_container_images_from_template(self):
     builder = kb.KollaImageBuilder(self.filelist)
     result = builder.container_images_from_template(
         push_destination='localhost:8787', tag='liberty')
     # template substitution on the container_images_template section should
     # be identical to the container_images section
     container_images = yaml.safe_load(filedata)['container_images']
     self.assertEqual(container_images, result)
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)

        fd, path = tempfile.mkstemp(prefix='kolla_conf_')
        with os.fdopen(fd, 'w') as tmp:
            tmp.write('[DEFAULT]\n')
            if parsed_args.list_images or parsed_args.list_dependencies:
                tmp.write('list_dependencies=true')
        kolla_config_files = list(parsed_args.kolla_config_files)
        kolla_config_files.append(path)
        # Generate an unique work directory so we can keep configs and logs
        # each time we run the command; they'll be stored in work_dir.
        kolla_work_dir = os.path.join(parsed_args.work_dir, str(uuid.uuid4()))

        # Make sure the unique work directory exists
        if not os.path.exists(kolla_work_dir):
            self.log.debug("Creating container builds "
                           "workspace in: %s" % kolla_work_dir)
            os.makedirs(kolla_work_dir)

        builder = kolla_builder.KollaImageBuilder(parsed_args.config_files)
        result = builder.build_images(kolla_config_files,
                                      parsed_args.excludes,
                                      parsed_args.use_buildah,
                                      kolla_work_dir)

        if parsed_args.use_buildah:
            deps = json.loads(result)
            kolla_cfg = utils.get_read_config(kolla_config_files)
            bb = buildah.BuildahBuilder(
                kolla_work_dir, deps,
                utils.get_from_cfg(kolla_cfg, "base"),
                utils.get_from_cfg(kolla_cfg, "type"),
                utils.get_from_cfg(kolla_cfg, "tag"),
                utils.get_from_cfg(kolla_cfg, "namespace"),
                utils.get_from_cfg(kolla_cfg, "registry"),
                utils.getboolean_from_cfg(kolla_cfg, "push"))
            bb.build_all()
        elif parsed_args.list_dependencies:
            deps = json.loads(result)
            yaml.safe_dump(
                deps,
                self.app.stdout,
                indent=2,
                default_flow_style=False
            )
        elif parsed_args.list_images:
            deps = json.loads(result)
            images = []
            BuildImage.images_from_deps(images, deps)
            yaml.safe_dump(
                images,
                self.app.stdout,
                default_flow_style=False
            )
        elif result:
            self.app.stdout.write(result)
Exemplo n.º 6
0
    def test_build_images_no_conf(self, mock_popen):
        process = mock.Mock()
        process.returncode = 0
        mock_popen.return_value = process

        builder = kb.KollaImageBuilder([])
        builder.build_images([])
        env = os.environ.copy()
        mock_popen.assert_called_once_with([
            'kolla-build',
        ], env=env)
Exemplo n.º 7
0
    def test_build_images_no_conf(self, mock_popen):
        process = mock.Mock()
        process.returncode = 0
        process.communicate.return_value = 'done', ''
        mock_popen.return_value = process

        builder = kb.KollaImageBuilder([])
        self.assertEqual('done', builder.build_images([]))
        env = os.environ.copy()
        mock_popen.assert_called_once_with([
            'kolla-build',
        ], env=env, stdout=-1)
Exemplo n.º 8
0
    def test_build_images_fail(self, mock_popen):
        process = mock.Mock()
        process.returncode = 1
        mock_popen.return_value = process

        builder = kb.KollaImageBuilder([])
        self.assertRaises(subprocess.CalledProcessError, builder.build_images,
                          [])
        env = os.environ.copy()
        mock_popen.assert_called_once_with([
            'kolla-build',
        ], env=env)
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)

        fd, path = tempfile.mkstemp(prefix='kolla_conf_')
        with os.fdopen(fd, 'w') as tmp:
            tmp.write('[DEFAULT]\n')
            if parsed_args.list_images or parsed_args.list_dependencies:
                tmp.write('list_dependencies=true')
        kolla_config_files = list(parsed_args.kolla_config_files)
        kolla_config_files.append(path)
        kolla_tmp_dir = None
        if parsed_args.use_buildah:
            # A temporary directory is needed to let Kolla generates the
            # Dockerfiles that will be used by Buildah to build the images.
            kolla_tmp_dir = tempfile.mkdtemp(prefix='kolla-')

        try:
            builder = kolla_builder.KollaImageBuilder(parsed_args.config_files)
            result = builder.build_images(kolla_config_files,
                                          parsed_args.excludes,
                                          parsed_args.use_buildah,
                                          kolla_tmp_dir)

            if parsed_args.use_buildah:
                deps = json.loads(result)
                kolla_cfg = utils.get_read_config(kolla_config_files)
                bb = buildah.BuildahBuilder(
                    kolla_tmp_dir, deps, utils.get_from_cfg(kolla_cfg, "base"),
                    utils.get_from_cfg(kolla_cfg, "type"),
                    utils.get_from_cfg(kolla_cfg, "tag"),
                    utils.get_from_cfg(kolla_cfg, "namespace"),
                    utils.get_from_cfg(kolla_cfg, "registry"),
                    utils.getboolean_from_cfg(kolla_cfg, "push"))
                bb.build_all()
            elif parsed_args.list_dependencies:
                deps = json.loads(result)
                yaml.safe_dump(deps,
                               self.app.stdout,
                               indent=2,
                               default_flow_style=False)
            elif parsed_args.list_images:
                deps = json.loads(result)
                images = []
                BuildImage.images_from_deps(images, deps)
                yaml.safe_dump(images,
                               self.app.stdout,
                               default_flow_style=False)
            elif result:
                self.app.stdout.write(result)
        finally:
            os.remove(path)
Exemplo n.º 10
0
    def test_container_images_yaml_in_sync(self):
        '''Confirm overcloud_containers.tpl.yaml equals overcloud_containers.yaml

        TODO(sbaker) remove when overcloud_containers.yaml is deleted
        '''
        mod_dir = os.path.dirname(sys.modules[__name__].__file__)
        project_dir = os.path.abspath(os.path.join(mod_dir, '../../../'))
        files_dir = os.path.join(project_dir, 'container-images')

        oc_tmpl_file = os.path.join(files_dir, 'overcloud_containers.yaml.j2')
        tmpl_builder = kb.KollaImageBuilder([oc_tmpl_file])

        def ffunc(entry):
            if 'params' in entry:
                del(entry['params'])
            return entry

        result = tmpl_builder.container_images_from_template(filter=ffunc)

        oc_yaml_file = os.path.join(files_dir, 'overcloud_containers.yaml')
        yaml_builder = kb.KollaImageBuilder([oc_yaml_file])
        container_images = yaml_builder.load_config_files(
            yaml_builder.CONTAINER_IMAGES)
        self.assertSequenceEqual(container_images, result)
Exemplo n.º 11
0
def default_image_params():
    def ffunc(entry):
        return entry

    template_file = os.path.join(sys.prefix, 'share', 'tripleo-common',
                                 'container-images',
                                 'tripleo_containers.yaml.j2')
    builder = kolla_builder.KollaImageBuilder([template_file])
    result = builder.container_images_from_template(filter=ffunc)

    params = {}
    for entry in result:
        imagename = entry.get('imagename', '')
        if 'params' in entry:
            for p in entry.pop('params'):
                params[p] = imagename
    return params
Exemplo n.º 12
0
    def test_build_images(self, mock_popen, mock_path):
        process = mock.Mock()
        process.returncode = 0
        mock_popen.return_value = process

        builder = kb.KollaImageBuilder(self.filelist)
        builder.build_images(['kolla-config.conf'])
        env = os.environ.copy()
        mock_popen.assert_called_once_with([
            'kolla-build',
            '--config-file',
            'kolla-config.conf',
            'nova-compute',
            'nova-libvirt',
            'heat-docker-agents-centos',
        ],
                                           env=env)
Exemplo n.º 13
0
    def test_build_images(self, mock_popen, mock_path):
        process = mock.Mock()
        process.returncode = 0
        process.communicate.return_value = 'done', ''
        mock_popen.return_value = process

        builder = kb.KollaImageBuilder(self.filelist)
        self.assertEqual('done', builder.build_images(['kolla-config.conf']))
        env = os.environ.copy()
        mock_popen.assert_called_once_with([
            'kolla-build',
            '--config-file',
            'kolla-config.conf',
            'nova-compute',
            'nova-libvirt',
            'heat-docker-agents-centos',
            'image-with-missing-tag',
        ], env=env, stdout=-1)
Exemplo n.º 14
0
    def test_build_images_template_only(self, mock_popen, mock_path):
        process = mock.Mock()
        process.returncode = 0
        process.communicate.return_value = 'done', ''
        mock_popen.return_value = process

        builder = kb.KollaImageBuilder(self.filelist)
        self.assertEqual(
            'done',
            builder.build_images(['kolla-config.conf'], [], True,
                                 '/tmp/kolla'))
        env = os.environ.copy()
        call1 = mock.call([
            'kolla-build',
            '--config-file',
            'kolla-config.conf',
            'nova-compute',
            'nova-libvirt',
            'heat-docker-agents-centos',
            'image-with-missing-tag',
            '--template-only',
            '--work-dir',
            '/tmp/kolla',
        ],
                          env=env,
                          stdout=-1,
                          universal_newlines=True)
        call2 = mock.call([
            'kolla-build',
            '--config-file',
            'kolla-config.conf',
            'nova-compute',
            'nova-libvirt',
            'heat-docker-agents-centos',
            'image-with-missing-tag',
            '--list-dependencies',
        ],
                          env=env,
                          stdout=-1,
                          stderr=-1,
                          universal_newlines=True)
        calls = [call1, call2]
        mock_popen.assert_has_calls(calls, any_order=True)
Exemplo n.º 15
0
    def test_container_images_template_inputs(self):
        builder = kb.KollaImageBuilder(self.filelist)
        self.assertEqual(kb.CONTAINER_IMAGES_DEFAULTS,
                         builder.container_images_template_inputs())

        self.assertEqual(
            {
                'namespace': 'docker.io/tripleomaster',
                'ceph_namespace': 'docker.io/ceph',
                'ceph_image': 'daemon',
                'ceph_tag': 'tag-stable-3.0-luminous-centos-7',
                'logging': 'files',
                'name_prefix': 'centos-binary-',
                'name_suffix': '',
                'tag': 'current-tripleo',
                'neutron_driver': None
            }, builder.container_images_template_inputs())

        self.assertEqual(
            {
                'namespace': '192.0.2.0:5000/tripleomaster',
                'ceph_namespace': 'docker.io/cephh',
                'ceph_image': 'ceph-daemon',
                'ceph_tag': 'latest',
                'logging': 'stdout',
                'name_prefix': 'prefix-',
                'name_suffix': '-suffix',
                'tag': 'master',
                'neutron_driver': 'ovn'
            },
            builder.container_images_template_inputs(
                namespace='192.0.2.0:5000/tripleomaster',
                ceph_namespace='docker.io/cephh',
                ceph_image='ceph-daemon',
                ceph_tag='latest',
                name_prefix='prefix',
                name_suffix='suffix',
                tag='master',
                neutron_driver='ovn',
                logging='stdout'))
Exemplo n.º 16
0
    def run(self, context):

        def ffunc(entry):
            return entry

        template_file = os.path.join(sys.prefix, 'share', 'tripleo-common',
                                     'container-images',
                                     'overcloud_containers.yaml.j2')

        builder = kolla_builder.KollaImageBuilder([template_file])
        result = builder.container_images_from_template(filter=ffunc)

        params = {}
        for entry in result:
            imagename = entry.get('imagename', '')
            if 'params' in entry:
                for p in entry.pop('params'):
                    params[p] = imagename
        swift = self.get_object_client(context)
        try:
            swift.put_object(
                self.container,
                constants.CONTAINER_DEFAULTS_ENVIRONMENT,
                yaml.safe_dump(
                    {'parameter_defaults': params},
                    default_flow_style=False
                )
            )
        except swiftexceptions.ClientException as err:
            err_msg = ("Error updating %s for plan %s: %s" % (
                constants.CONTAINER_DEFAULTS_ENVIRONMENT,
                self.container, err))
            LOG.exception(err_msg)
            return actions.Result(error=err_msg)

        environments = {constants.CONTAINER_DEFAULTS_ENVIRONMENT: True}

        update_action = heat_capabilities.UpdateCapabilitiesAction(
            environments, container=self.container)
        return update_action.run(context)
    def test_container_images_template_inputs(self):
        builder = kb.KollaImageBuilder(self.filelist)
        self.assertEqual(kb.CONTAINER_IMAGES_DEFAULTS,
                         builder.container_images_template_inputs())

        self.assertEqual(
            {
                'namespace': 'docker.io/tripleomaster',
                'ceph_namespace': 'docker.io/ceph',
                'ceph_image': 'daemon',
                'ceph_tag': 'v3.0.3-stable-3.0-luminous-centos-7-x86_64',
                'name_prefix': 'centos-binary-',
                'name_suffix': '',
                'tag': 'current-tripleo',
                'neutron_driver': None,
                'openshift_namespace': 'docker.io/openshift',
                'openshift_tag': 'v3.9.0',
                'openshift_base_image': 'origin',
                'openshift_cockpit_namespace': 'docker.io/cockpit',
                'openshift_cockpit_image': 'kubernetes',
                'openshift_cockpit_tag': 'latest',
                'openshift_etcd_namespace': 'registry.fedoraproject.org'
                '/latest',
                'openshift_etcd_image': 'etcd',
                'openshift_etcd_tag': 'latest',
                'openshift_gluster_namespace': 'docker.io/gluster',
                'openshift_gluster_image': 'gluster-centos',
                'openshift_gluster_block_image': 'glusterblock-provisioner',
                'openshift_gluster_tag': 'latest',
                'openshift_heketi_namespace': 'docker.io/heketi',
                'openshift_heketi_image': 'heketi',
                'openshift_heketi_tag': 'latest',
            }, builder.container_images_template_inputs())

        self.assertEqual(
            {
                'namespace': '192.0.2.0:5000/tripleomaster',
                'ceph_namespace': 'docker.io/cephh',
                'ceph_image': 'ceph-daemon',
                'ceph_tag': 'latest',
                'name_prefix': 'prefix-',
                'name_suffix': '-suffix',
                'tag': 'master',
                'neutron_driver': 'ovn',
                'openshift_namespace': 'docker.io/openshift3',
                'openshift_tag': 'v3.10.0',
                'openshift_base_image': 'ose',
                'openshift_cockpit_namespace': 'docker.io/openshift-cockpit',
                'openshift_cockpit_image': 'cockpit',
                'openshift_cockpit_tag': 'cockpit-tag',
                'openshift_etcd_namespace': 'registry.access.redhat.com/rhel7',
                'openshift_etcd_image': 'openshift-etcd',
                'openshift_etcd_tag': 'etcd-tag',
                'openshift_gluster_namespace':
                'registry.access.redhat.com/rhgs3',
                'openshift_gluster_image': 'rhgs-server-rhel7',
                'openshift_gluster_block_image':
                'rhgs-gluster-block-prov-rhel7',
                'openshift_gluster_tag': 'gluster-tag',
                'openshift_heketi_namespace':
                'registry.access.redhat.com/rhgs3',
                'openshift_heketi_image': 'rhgs-volmanager-rhel7',
                'openshift_heketi_tag': 'heketi-tag',
            },
            builder.container_images_template_inputs(
                namespace='192.0.2.0:5000/tripleomaster',
                ceph_namespace='docker.io/cephh',
                ceph_image='ceph-daemon',
                ceph_tag='latest',
                name_prefix='prefix',
                name_suffix='suffix',
                tag='master',
                neutron_driver='ovn',
                openshift_namespace='docker.io/openshift3',
                openshift_tag='v3.10.0',
                openshift_base_image='ose',
                openshift_cockpit_namespace='docker.io/openshift-cockpit',
                openshift_cockpit_image='cockpit',
                openshift_cockpit_tag='cockpit-tag',
                openshift_etcd_namespace='registry.access.redhat.com/rhel7',
                openshift_etcd_image='openshift-etcd',
                openshift_etcd_tag='etcd-tag',
                openshift_gluster_namespace='registry.access.redhat.com/rhgs3',
                openshift_gluster_image='rhgs-server-rhel7',
                openshift_gluster_block_image='rhgs-gluster-block-prov-rhel7',
                openshift_gluster_tag='gluster-tag',
                openshift_heketi_namespace='registry.access.redhat.com/rhgs3',
                openshift_heketi_image='rhgs-volmanager-rhel7',
                openshift_heketi_tag='heketi-tag',
            ))
Exemplo n.º 18
0
    def get_parser(self, prog_name):
        parser = super(PrepareImageFiles, self).get_parser(prog_name)
        template_file = os.path.join(sys.prefix, 'share', 'tripleo-common',
                                     'container-images',
                                     'overcloud_containers.yaml.j2')
        roles_file = os.path.join(constants.TRIPLEO_HEAT_TEMPLATES,
                                  constants.OVERCLOUD_ROLES_FILE)

        builder = kolla_builder.KollaImageBuilder([template_file])
        defaults = builder.container_images_template_inputs()

        parser.add_argument(
            "--template-file",
            dest="template_file",
            default=template_file,
            metavar='<yaml template file>',
            help=_("YAML template file which the images config file will be "
                   "built from.\n"
                   "Default: %s") % template_file,
        )
        parser.add_argument(
            "--pull-source",
            dest="pull_source",
            metavar='<location>',
            help=_("Location of image registry to pull images from. "
                   "(DEPRECATED. Include the registry in --namespace)"),
        )
        parser.add_argument(
            "--push-destination",
            dest="push_destination",
            metavar='<location>',
            help=_("Location of image registry to push images to. "
                   "If specified, a push_destination will be set for every "
                   "image entry."),
        )
        parser.add_argument(
            "--tag",
            dest="tag",
            default=defaults['tag'],
            metavar='<tag>',
            help=_("Override the default tag substitution.\n"
                   "Default: %s") % defaults['tag'],
        )
        parser.add_argument(
            "--namespace",
            dest="namespace",
            default=defaults['namespace'],
            metavar='<namespace>',
            help=_("Override the default namespace substitution.\n"
                   "Default: %s") % defaults['namespace'],
        )
        parser.add_argument(
            "--prefix",
            dest="prefix",
            default=defaults['name_prefix'],
            metavar='<prefix>',
            help=_("Override the default name prefix substitution.\n"
                   "Default: %s") % defaults['name_prefix'],
        )
        parser.add_argument(
            "--suffix",
            dest="suffix",
            default=defaults['name_suffix'],
            metavar='<suffix>',
            help=_("Override the default name suffix substitution.\n"
                   "Default: %s") % defaults['name_suffix'],
        )
        parser.add_argument(
            '--set',
            metavar='<variable=value>',
            action='append',
            help=_('Set the value of a variable in the template, even if it '
                   'has no dedicated argument such as "--suffix".'))
        parser.add_argument(
            "--exclude",
            dest="excludes",
            metavar='<regex>',
            default=[],
            action="append",
            help=_("Pattern to match against resulting imagename entries to "
                   "exclude from the final output. Can be specified multiple "
                   "times."),
        )
        parser.add_argument(
            "--images-file",
            dest="output_images_file",
            metavar='<file path>',
            help=_("File to write resulting image entries to, as well as "
                   "stdout. Any existing file will be overwritten."
                   "(DEPRECATED. Use --output-images-file instead)"),
        )
        parser.add_argument(
            "--output-images-file",
            dest="output_images_file",
            metavar='<file path>',
            help=_("File to write resulting image entries to, as well as "
                   "stdout. Any existing file will be overwritten."),
        )
        parser.add_argument(
            '--service-environment-file',
            metavar='<file path>',
            action='append',
            dest='environment_files',
            help=_('Environment files specifying which services are '
                   'containerized. Entries will be filtered to only contain '
                   'images used by containerized services. (Can be specified '
                   'more than once.)'
                   "(DEPRECATED. Use --environment-file instead)"),
        )
        parser.add_argument(
            '--environment-file',
            '-e',
            metavar='<file path>',
            action='append',
            dest='environment_files',
            help=_('Environment files specifying which services are '
                   'containerized. Entries will be filtered to only contain '
                   'images used by containerized services. (Can be specified '
                   'more than once.)'))
        parser.add_argument(
            '--environment-directory',
            metavar='<HEAT ENVIRONMENT DIRECTORY>',
            action='append',
            dest='environment_directories',
            default=[os.path.expanduser(constants.DEFAULT_ENV_DIRECTORY)],
            help=_('Environment file directories that are automatically '
                   'added to the update command. Entries will be filtered '
                   'to only contain images used by containerized services. '
                   'Can be specified more than once. Files in directories are '
                   'loaded in ascending sort order.'))
        parser.add_argument(
            "--env-file",
            dest="output_env_file",
            metavar='<file path>',
            help=_("File to write heat environment file which specifies all "
                   "image parameters. Any existing file will be overwritten."
                   "(DEPRECATED. Use --output-env-file instead)"),
        )
        parser.add_argument(
            "--output-env-file",
            dest="output_env_file",
            metavar='<file path>',
            help=_("File to write heat environment file which specifies all "
                   "image parameters. Any existing file will be overwritten."),
        )
        parser.add_argument('--roles-file',
                            '-r',
                            dest='roles_file',
                            default=roles_file,
                            help=_('Roles file, overrides the default %s') %
                            constants.OVERCLOUD_ROLES_FILE)
        return parser
Exemplo n.º 19
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)

        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)
Exemplo n.º 20
0
    def test_container_images_template_inputs(self):
        builder = kb.KollaImageBuilder(self.filelist)
        self.assertEqual(kb.CONTAINER_IMAGES_DEFAULTS,
                         builder.container_images_template_inputs())

        self.assertEqual(
            {
                'namespace': 'docker.io/tripleomaster',
                'ceph_namespace': 'docker.io/ceph',
                'ceph_image': 'daemon',
                'ceph_tag': 'v4.0.8-stable-4.0-nautilus-centos-7-x86_64',
                'ceph_grafana_namespace': 'docker.io/grafana',
                'ceph_grafana_image': 'grafana',
                'ceph_grafana_tag': '5.2.4',
                'ceph_prometheus_namespace': 'docker.io/prom',
                'ceph_prometheus_image': 'prometheus',
                'ceph_prometheus_tag': 'v2.7.2',
                'ceph_alertmanager_namespace': 'docker.io/prom',
                'ceph_alertmanager_image': 'alertmanager',
                'ceph_alertmanager_tag': 'v0.16.2',
                'ceph_node_exporter_namespace': 'docker.io/prom',
                'ceph_node_exporter_image': 'node-exporter',
                'ceph_node_exporter_tag': 'v0.17.0',
                'name_prefix': 'centos-binary-',
                'name_suffix': '',
                'tag': 'current-tripleo',
                'rhel_containers': False,
                'neutron_driver': 'ovn',
            }, builder.container_images_template_inputs())

        self.assertEqual(
            {
                'namespace': '192.0.2.0:5000/tripleomaster',
                'ceph_namespace': 'docker.io/cephh',
                'ceph_image': 'ceph-daemon',
                'ceph_tag': 'latest',
                'ceph_grafana_namespace': 'docker.io/grafana',
                'ceph_grafana_image': 'grafana',
                'ceph_grafana_tag': '5.2.4',
                'ceph_prometheus_namespace': 'docker.io/prom',
                'ceph_prometheus_image': 'prometheus',
                'ceph_prometheus_tag': 'v2.7.2',
                'ceph_alertmanager_namespace': 'docker.io/prom',
                'ceph_alertmanager_image': 'alertmanager',
                'ceph_alertmanager_tag': 'v0.16.2',
                'ceph_node_exporter_namespace': 'docker.io/prom',
                'ceph_node_exporter_image': 'node-exporter',
                'ceph_node_exporter_tag': 'v0.17.0',
                'name_prefix': 'prefix-',
                'name_suffix': '-suffix',
                'tag': 'master',
                'rhel_containers': False,
                'neutron_driver': 'ovn',
            },
            builder.container_images_template_inputs(
                namespace='192.0.2.0:5000/tripleomaster',
                ceph_namespace='docker.io/cephh',
                ceph_image='ceph-daemon',
                ceph_tag='latest',
                name_prefix='prefix',
                name_suffix='suffix',
                tag='master',
                rhel_containers=False,
                neutron_driver='ovn',
            ))