Use the build_service_filter from kolla_builder

Change-Id: I5cc68be6e04686a3941dc3fb695bcc3f0d9df848
Blueprint: container-prepare-workflow
This commit is contained in:
Steve Baker 2018-03-21 11:49:32 +13:00 committed by Emilien Macchi
parent 1086fe110c
commit a42a9c14b1
2 changed files with 33 additions and 180 deletions

View File

@ -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):

View File

@ -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]