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
|
||||
|
||||
|
||||
# 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):
|
||||
|
||||
def setUp(self):
|
||||
|
@ -98,25 +103,6 @@ class TestContainerImagePrepare(TestPluginV1):
|
|||
- 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.'
|
||||
'container_images_prepare_defaults', create=True)
|
||||
@mock.patch('tripleo_common.image.kolla_builder.'
|
||||
|
@ -144,7 +130,6 @@ class TestContainerImagePrepare(TestPluginV1):
|
|||
mock_cip.assert_called_with(
|
||||
excludes=[],
|
||||
mapping_args={
|
||||
'neutron_driver': None,
|
||||
'name_suffix': '',
|
||||
'tag': 'latest',
|
||||
'namespace': 'docker.io/tripleomaster',
|
||||
|
@ -165,8 +150,10 @@ class TestContainerImagePrepare(TestPluginV1):
|
|||
'container_images_prepare', create=True)
|
||||
@mock.patch('heatclient.common.template_utils.'
|
||||
'process_multiple_environments_and_files')
|
||||
@mock.patch('tripleo_common.image.kolla_builder.'
|
||||
'build_service_filter')
|
||||
@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):
|
||||
|
||||
temp = tempfile.mkdtemp()
|
||||
|
@ -179,6 +166,7 @@ class TestContainerImagePrepare(TestPluginV1):
|
|||
with open(roles_file, 'w') as f:
|
||||
f.write(self.roles_yaml)
|
||||
mock_get.side_effect = requests.exceptions.SSLError('ouch')
|
||||
mock_bsf.return_value = set(['OS::TripleO::Services::AodhEvaluator'])
|
||||
|
||||
resource_registry = {'resource_registry': {
|
||||
'OS::TripleO::Services::AodhEvaluator': aodh_file,
|
||||
|
@ -244,7 +232,6 @@ class TestContainerImagePrepare(TestPluginV1):
|
|||
'ceph_tag': 'mytag',
|
||||
'ceph_image': 'mydaemon',
|
||||
'tag': 'passed-ci',
|
||||
'neutron_driver': None,
|
||||
'ceph_namespace': 'myceph',
|
||||
'name_prefix': 'os-'
|
||||
},
|
||||
|
@ -363,107 +350,6 @@ class TestContainerImagePrepare(TestPluginV1):
|
|||
with open(env_file) as 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):
|
||||
|
||||
|
|
|
@ -348,79 +348,46 @@ class PrepareImageFiles(command.Command):
|
|||
yaml.safe_dump({'parameter_defaults': params}, f,
|
||||
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):
|
||||
self.log.debug("take_action(%s)" % parsed_args)
|
||||
|
||||
env_files = []
|
||||
|
||||
try:
|
||||
roles_data = yaml.safe_load(open(parsed_args.roles_file).read())
|
||||
except IOError:
|
||||
roles_data = set()
|
||||
|
||||
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)
|
||||
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()
|
||||
|
||||
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'
|
||||
env_f, env = (
|
||||
template_utils.process_multiple_environments_and_files(
|
||||
env_files, env_path_is_object=lambda path: True,
|
||||
object_request=get_env_file))
|
||||
|
||||
subs = {
|
||||
if env_files:
|
||||
service_filter = kolla_builder.build_service_filter(
|
||||
env, roles_data)
|
||||
else:
|
||||
service_filter = None
|
||||
|
||||
mapping_args = {
|
||||
'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)
|
||||
self.parse_set_values(mapping_args, parsed_args.set)
|
||||
|
||||
output_images_file = (parsed_args.output_images_file
|
||||
or 'container_images.yaml')
|
||||
|
@ -430,10 +397,10 @@ class PrepareImageFiles(command.Command):
|
|||
service_filter=service_filter,
|
||||
pull_source=parsed_args.pull_source,
|
||||
push_destination=parsed_args.push_destination,
|
||||
mapping_args=subs,
|
||||
mapping_args=mapping_args,
|
||||
output_env_file=parsed_args.output_env_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:
|
||||
params = prepare_data[parsed_args.output_env_file]
|
||||
|
|
Loading…
Reference in New Issue