Use the build_service_filter from kolla_builder
Change-Id: I5cc68be6e04686a3941dc3fb695bcc3f0d9df848 Blueprint: container-prepare-workflow
This commit is contained in:
parent
1086fe110c
commit
a42a9c14b1
|
@ -28,6 +28,11 @@ from tripleoclient.tests.v1.test_plugin import TestPluginV1
|
||||||
from tripleoclient.v1 import container_image
|
from tripleoclient.v1 import container_image
|
||||||
|
|
||||||
|
|
||||||
|
# TODO(sbaker) Remove after a tripleo-common release contains this new function
|
||||||
|
if not hasattr(kolla_builder, 'build_service_filter'):
|
||||||
|
setattr(kolla_builder, 'build_service_filter', mock.Mock())
|
||||||
|
|
||||||
|
|
||||||
class TestContainerImageUpload(TestPluginV1):
|
class TestContainerImageUpload(TestPluginV1):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -98,25 +103,6 @@ class TestContainerImagePrepare(TestPluginV1):
|
||||||
- OS::TripleO::Services::Overwritten
|
- OS::TripleO::Services::Overwritten
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def test_get_enabled_services(self):
|
|
||||||
temp = tempfile.mkdtemp()
|
|
||||||
self.addCleanup(shutil.rmtree, temp)
|
|
||||||
resource_registry = {'parameter_defaults': {
|
|
||||||
'RoleDisabledViaEnvironmentCount': 0,
|
|
||||||
'RoleOverwrittenViaEnvironmentServices': [
|
|
||||||
'OS::TripleO::Services::FromResourceRegistry'
|
|
||||||
]
|
|
||||||
}}
|
|
||||||
roles_file = '/foo/roles_data.yaml'
|
|
||||||
mock_open_context = mock.mock_open(read_data=self.roles_yaml)
|
|
||||||
with mock.patch('six.moves.builtins.open', mock_open_context):
|
|
||||||
enabled_services = self.cmd.get_enabled_services(resource_registry,
|
|
||||||
roles_file)
|
|
||||||
mock_open_context.assert_called_once_with(roles_file)
|
|
||||||
self.assertEqual(set(['OS::TripleO::Services::AodhEvaluator',
|
|
||||||
'OS::TripleO::Services::FromResourceRegistry']),
|
|
||||||
enabled_services)
|
|
||||||
|
|
||||||
@mock.patch('tripleo_common.image.kolla_builder.'
|
@mock.patch('tripleo_common.image.kolla_builder.'
|
||||||
'container_images_prepare_defaults', create=True)
|
'container_images_prepare_defaults', create=True)
|
||||||
@mock.patch('tripleo_common.image.kolla_builder.'
|
@mock.patch('tripleo_common.image.kolla_builder.'
|
||||||
|
@ -144,7 +130,6 @@ class TestContainerImagePrepare(TestPluginV1):
|
||||||
mock_cip.assert_called_with(
|
mock_cip.assert_called_with(
|
||||||
excludes=[],
|
excludes=[],
|
||||||
mapping_args={
|
mapping_args={
|
||||||
'neutron_driver': None,
|
|
||||||
'name_suffix': '',
|
'name_suffix': '',
|
||||||
'tag': 'latest',
|
'tag': 'latest',
|
||||||
'namespace': 'docker.io/tripleomaster',
|
'namespace': 'docker.io/tripleomaster',
|
||||||
|
@ -165,8 +150,10 @@ class TestContainerImagePrepare(TestPluginV1):
|
||||||
'container_images_prepare', create=True)
|
'container_images_prepare', create=True)
|
||||||
@mock.patch('heatclient.common.template_utils.'
|
@mock.patch('heatclient.common.template_utils.'
|
||||||
'process_multiple_environments_and_files')
|
'process_multiple_environments_and_files')
|
||||||
|
@mock.patch('tripleo_common.image.kolla_builder.'
|
||||||
|
'build_service_filter')
|
||||||
@mock.patch('requests.get')
|
@mock.patch('requests.get')
|
||||||
def test_container_image_prepare(self, mock_get, pmef, mock_cip,
|
def test_container_image_prepare(self, mock_get, mock_bsf, pmef, mock_cip,
|
||||||
mock_cipd):
|
mock_cipd):
|
||||||
|
|
||||||
temp = tempfile.mkdtemp()
|
temp = tempfile.mkdtemp()
|
||||||
|
@ -179,6 +166,7 @@ class TestContainerImagePrepare(TestPluginV1):
|
||||||
with open(roles_file, 'w') as f:
|
with open(roles_file, 'w') as f:
|
||||||
f.write(self.roles_yaml)
|
f.write(self.roles_yaml)
|
||||||
mock_get.side_effect = requests.exceptions.SSLError('ouch')
|
mock_get.side_effect = requests.exceptions.SSLError('ouch')
|
||||||
|
mock_bsf.return_value = set(['OS::TripleO::Services::AodhEvaluator'])
|
||||||
|
|
||||||
resource_registry = {'resource_registry': {
|
resource_registry = {'resource_registry': {
|
||||||
'OS::TripleO::Services::AodhEvaluator': aodh_file,
|
'OS::TripleO::Services::AodhEvaluator': aodh_file,
|
||||||
|
@ -244,7 +232,6 @@ class TestContainerImagePrepare(TestPluginV1):
|
||||||
'ceph_tag': 'mytag',
|
'ceph_tag': 'mytag',
|
||||||
'ceph_image': 'mydaemon',
|
'ceph_image': 'mydaemon',
|
||||||
'tag': 'passed-ci',
|
'tag': 'passed-ci',
|
||||||
'neutron_driver': None,
|
|
||||||
'ceph_namespace': 'myceph',
|
'ceph_namespace': 'myceph',
|
||||||
'name_prefix': 'os-'
|
'name_prefix': 'os-'
|
||||||
},
|
},
|
||||||
|
@ -363,107 +350,6 @@ class TestContainerImagePrepare(TestPluginV1):
|
||||||
with open(env_file) as f:
|
with open(env_file) as f:
|
||||||
self.assertEqual(expected_env_contents, yaml.safe_load(f))
|
self.assertEqual(expected_env_contents, yaml.safe_load(f))
|
||||||
|
|
||||||
@mock.patch('tripleo_common.image.kolla_builder.'
|
|
||||||
'container_images_prepare_defaults', create=True)
|
|
||||||
@mock.patch('tripleo_common.image.kolla_builder.'
|
|
||||||
'container_images_prepare', create=True)
|
|
||||||
@mock.patch('heatclient.common.template_utils.'
|
|
||||||
'process_multiple_environments_and_files')
|
|
||||||
@mock.patch('tripleoclient.v1.container_image.PrepareImageFiles.'
|
|
||||||
'get_enabled_services')
|
|
||||||
@mock.patch('requests.get')
|
|
||||||
def test_container_image_prepare_for_odl(self, mock_get, ges, pmef,
|
|
||||||
mock_cip, mock_cipd):
|
|
||||||
arglist = [
|
|
||||||
'-e',
|
|
||||||
'environments/services/neutron-opendaylight.yaml',
|
|
||||||
]
|
|
||||||
|
|
||||||
ges.return_value = (
|
|
||||||
set(['OS::TripleO::Services::NeutronApi',
|
|
||||||
'OS::TripleO::Services::NeutronDhcpAgent',
|
|
||||||
'OS::TripleO::Services::NeutronMetadataAgent',
|
|
||||||
'OS::TripleO::Services::NeutronServer',
|
|
||||||
'OS::TripleO::Services::OpenDaylightApi']))
|
|
||||||
|
|
||||||
pmef_call_args = [
|
|
||||||
'environments/services/neutron-opendaylight.yaml']
|
|
||||||
|
|
||||||
expected_oc_yaml_contents = {
|
|
||||||
'container_images': [{
|
|
||||||
'imagename':
|
|
||||||
'tripleo/os-neutron-server-opendaylightfoo:passed-ci',
|
|
||||||
}, {
|
|
||||||
'imagename': 'tripleo/os-opendaylightfoo:passed-ci',
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
expected_env_contents = {
|
|
||||||
'parameter_defaults': {
|
|
||||||
'DockerNeutronApiImage':
|
|
||||||
'tripleo/os-neutron-server-opendaylightfoo:passed-ci',
|
|
||||||
'DockerNeutronConfigImage':
|
|
||||||
'tripleo/os-neutron-server-opendaylightfoo:passed-ci',
|
|
||||||
'DockerOpendaylightApiImage':
|
|
||||||
'tripleo/os-opendaylightfoo:passed-ci',
|
|
||||||
'DockerOpendaylightConfigImage':
|
|
||||||
'tripleo/os-opendaylightfoo:passed-ci',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self._test_container_image_prepare_helper(
|
|
||||||
pmef, mock_cip, pmef_call_args, arglist, 'odl',
|
|
||||||
expected_oc_yaml_contents, expected_env_contents)
|
|
||||||
|
|
||||||
@mock.patch('tripleo_common.image.kolla_builder.'
|
|
||||||
'container_images_prepare_defaults', create=True)
|
|
||||||
@mock.patch('tripleo_common.image.kolla_builder.'
|
|
||||||
'container_images_prepare', create=True)
|
|
||||||
@mock.patch('heatclient.common.template_utils.'
|
|
||||||
'process_multiple_environments_and_files')
|
|
||||||
@mock.patch('tripleoclient.v1.container_image.PrepareImageFiles.'
|
|
||||||
'get_enabled_services')
|
|
||||||
@mock.patch('requests.get')
|
|
||||||
def test_container_image_prepare_for_ovn(self, mock_get, ges, pmef,
|
|
||||||
mock_cip, mock_cipd):
|
|
||||||
arglist = [
|
|
||||||
'-e',
|
|
||||||
'environments/services/neutron-ovn.yaml',
|
|
||||||
]
|
|
||||||
|
|
||||||
ges.return_value = (
|
|
||||||
set(['OS::TripleO::Services::NeutronApi',
|
|
||||||
'OS::TripleO::Services::NeutronServer',
|
|
||||||
'OS::TripleO::Services::OVNController',
|
|
||||||
'OS::TripleO::Services::OVNDBs']))
|
|
||||||
|
|
||||||
pmef_call_args = [
|
|
||||||
'environments/services/neutron-ovn.yaml']
|
|
||||||
|
|
||||||
expected_oc_yaml_contents = {
|
|
||||||
'container_images': [{
|
|
||||||
'imagename':
|
|
||||||
'tripleo/os-neutron-server-ovnfoo:passed-ci',
|
|
||||||
}, {
|
|
||||||
'imagename': 'tripleo/os-ovn-controllerfoo:passed-ci',
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
expected_env_contents = {
|
|
||||||
'parameter_defaults': {
|
|
||||||
'DockerNeutronApiImage':
|
|
||||||
'tripleo/os-neutron-server-ovnfoo:passed-ci',
|
|
||||||
'DockerNeutronConfigImage':
|
|
||||||
'tripleo/os-neutron-server-ovnfoo:passed-ci',
|
|
||||||
'DockerOvnControllerImage':
|
|
||||||
'tripleo/os-ovn-controllerfoo:passed-ci',
|
|
||||||
'DockerOvnControllerConfigImage':
|
|
||||||
'tripleo/os-ovn-controllerfoo:passed-ci',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self._test_container_image_prepare_helper(
|
|
||||||
pmef, mock_cip, pmef_call_args, arglist, 'ovn',
|
|
||||||
expected_oc_yaml_contents, expected_env_contents)
|
|
||||||
|
|
||||||
|
|
||||||
class TestContainerImageBuild(TestPluginV1):
|
class TestContainerImageBuild(TestPluginV1):
|
||||||
|
|
||||||
|
|
|
@ -348,79 +348,46 @@ class PrepareImageFiles(command.Command):
|
||||||
yaml.safe_dump({'parameter_defaults': params}, f,
|
yaml.safe_dump({'parameter_defaults': params}, f,
|
||||||
default_flow_style=False)
|
default_flow_style=False)
|
||||||
|
|
||||||
def get_enabled_services(self, environment, roles_file):
|
|
||||||
enabled_services = set()
|
|
||||||
try:
|
|
||||||
roles_data = yaml.safe_load(open(roles_file).read())
|
|
||||||
except IOError:
|
|
||||||
return enabled_services
|
|
||||||
|
|
||||||
parameter_defaults = environment.get('parameter_defaults', {})
|
|
||||||
|
|
||||||
for role in roles_data:
|
|
||||||
count = parameter_defaults.get('%sCount' % role['name'],
|
|
||||||
role.get('CountDefault', 0))
|
|
||||||
if count > 0:
|
|
||||||
enabled_services.update(
|
|
||||||
parameter_defaults.get('%sServices' % role['name'],
|
|
||||||
role.get('ServicesDefault', [])))
|
|
||||||
|
|
||||||
return enabled_services
|
|
||||||
|
|
||||||
def build_service_filter(self, environment_files, roles_file):
|
|
||||||
# Do not filter unless asked for it
|
|
||||||
if not environment_files:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def get_env_file(method, path):
|
|
||||||
if not os.path.exists(path):
|
|
||||||
return '{}'
|
|
||||||
env_url = heat_utils.normalise_file_path_to_url(path)
|
|
||||||
return request.urlopen(env_url).read()
|
|
||||||
|
|
||||||
env_files, env = (
|
|
||||||
template_utils.process_multiple_environments_and_files(
|
|
||||||
environment_files, env_path_is_object=lambda path: True,
|
|
||||||
object_request=get_env_file))
|
|
||||||
enabled_services = self.get_enabled_services(env, roles_file)
|
|
||||||
containerized_services = set()
|
|
||||||
for service, env_path in env.get('resource_registry', {}).items():
|
|
||||||
# Use the template path to determine if it represents a
|
|
||||||
# containerized service
|
|
||||||
if '/docker/services/' in env_path:
|
|
||||||
containerized_services.add(service)
|
|
||||||
|
|
||||||
return containerized_services.intersection(enabled_services)
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
self.log.debug("take_action(%s)" % parsed_args)
|
self.log.debug("take_action(%s)" % parsed_args)
|
||||||
|
|
||||||
env_files = []
|
env_files = []
|
||||||
|
|
||||||
|
try:
|
||||||
|
roles_data = yaml.safe_load(open(parsed_args.roles_file).read())
|
||||||
|
except IOError:
|
||||||
|
roles_data = set()
|
||||||
|
|
||||||
if parsed_args.environment_directories:
|
if parsed_args.environment_directories:
|
||||||
env_files.extend(utils.load_environment_directories(
|
env_files.extend(utils.load_environment_directories(
|
||||||
parsed_args.environment_directories))
|
parsed_args.environment_directories))
|
||||||
if parsed_args.environment_files:
|
if parsed_args.environment_files:
|
||||||
env_files.extend(parsed_args.environment_files)
|
env_files.extend(parsed_args.environment_files)
|
||||||
|
|
||||||
service_filter = self.build_service_filter(
|
def get_env_file(method, path):
|
||||||
env_files, parsed_args.roles_file)
|
if not os.path.exists(path):
|
||||||
|
return '{}'
|
||||||
|
env_url = heat_utils.normalise_file_path_to_url(path)
|
||||||
|
return request.urlopen(env_url).read()
|
||||||
|
|
||||||
neutron_driver = None
|
env_f, env = (
|
||||||
if service_filter:
|
template_utils.process_multiple_environments_and_files(
|
||||||
if 'OS::TripleO::Services::OpenDaylightApi' in service_filter:
|
env_files, env_path_is_object=lambda path: True,
|
||||||
neutron_driver = 'odl'
|
object_request=get_env_file))
|
||||||
elif 'OS::TripleO::Services::OVNController' in service_filter:
|
|
||||||
neutron_driver = 'ovn'
|
|
||||||
|
|
||||||
subs = {
|
if env_files:
|
||||||
|
service_filter = kolla_builder.build_service_filter(
|
||||||
|
env, roles_data)
|
||||||
|
else:
|
||||||
|
service_filter = None
|
||||||
|
|
||||||
|
mapping_args = {
|
||||||
'tag': parsed_args.tag,
|
'tag': parsed_args.tag,
|
||||||
'namespace': parsed_args.namespace,
|
'namespace': parsed_args.namespace,
|
||||||
'name_prefix': parsed_args.prefix,
|
'name_prefix': parsed_args.prefix,
|
||||||
'name_suffix': parsed_args.suffix,
|
'name_suffix': parsed_args.suffix,
|
||||||
'neutron_driver': neutron_driver,
|
|
||||||
}
|
}
|
||||||
self.parse_set_values(subs, parsed_args.set)
|
self.parse_set_values(mapping_args, parsed_args.set)
|
||||||
|
|
||||||
output_images_file = (parsed_args.output_images_file
|
output_images_file = (parsed_args.output_images_file
|
||||||
or 'container_images.yaml')
|
or 'container_images.yaml')
|
||||||
|
@ -430,10 +397,10 @@ class PrepareImageFiles(command.Command):
|
||||||
service_filter=service_filter,
|
service_filter=service_filter,
|
||||||
pull_source=parsed_args.pull_source,
|
pull_source=parsed_args.pull_source,
|
||||||
push_destination=parsed_args.push_destination,
|
push_destination=parsed_args.push_destination,
|
||||||
mapping_args=subs,
|
mapping_args=mapping_args,
|
||||||
output_env_file=parsed_args.output_env_file,
|
output_env_file=parsed_args.output_env_file,
|
||||||
output_images_file=output_images_file,
|
output_images_file=output_images_file,
|
||||||
tag_from_label=parsed_args.tag_from_label
|
tag_from_label=parsed_args.tag_from_label,
|
||||||
)
|
)
|
||||||
if parsed_args.output_env_file:
|
if parsed_args.output_env_file:
|
||||||
params = prepare_data[parsed_args.output_env_file]
|
params = prepare_data[parsed_args.output_env_file]
|
||||||
|
|
Loading…
Reference in New Issue