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)
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)
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)
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)
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)
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)
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)
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)
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
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)
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)
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)
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'))
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', ))
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
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)
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', ))