Add neutron_driver value to prepare command

OpenDaylight/OVN is not enabled by default in overcloud. A logic needs to be
implemented to create ODL image reference when ODL needs to be deployed and
the same for OVN. This patch adds neutron driver value set depending on the
environment file specified to image prepare command.

Co-Authored-By: Numan Siddique <nusiddiq@redhat.com>
Change-Id: I3e395986ad777b1d6b057bb33fac8d5ed2d3d26a
Partial-Bug: #1713685
Partial-bug: #1699085
This commit is contained in:
Janki Chhatbar 2017-08-29 15:49:28 +05:30 committed by Numan Siddique
parent 4e366ec76c
commit d66114a440
2 changed files with 223 additions and 4 deletions

View File

@ -130,6 +130,7 @@ class TestContainerImagePrepare(TestPluginV1):
name_prefix='centos-binary-',
name_suffix='',
namespace='docker.io/tripleoupstream',
neutron_driver=None,
tag='latest'
)
@ -209,7 +210,8 @@ class TestContainerImagePrepare(TestPluginV1):
tag='passed-ci',
ceph_image='mydaemon',
ceph_namespace='myceph',
ceph_tag='mytag'
ceph_tag='mytag',
neutron_driver=None
)
ci_data = {
'container_images': [{
@ -231,6 +233,214 @@ class TestContainerImagePrepare(TestPluginV1):
with open(env_file) as f:
self.assertEqual(env_data, yaml.safe_load(f))
def _test_container_image_prepare_helper(
self, pmef, mock_builder, pmef_call_args,
arg_list, neutron_driver, expected_container_template_params,
expected_oc_yaml_contents, expected_env_contents):
temp = tempfile.mkdtemp()
self.addCleanup(shutil.rmtree, temp)
images_file = os.path.join(temp, 'overcloud_containers.yaml')
env_file = os.path.join(temp, 'containers_env.yaml')
tmpl_file = os.path.join(temp, 'overcloud_containers.yaml.j2')
resource_registry = {}
if neutron_driver == 'odl':
odlapi_file = os.path.join(temp, 'docker', 'services',
'opendaylight.yaml')
resource_registry = {'resource_registry': {
'OS::TripleO::Services::OpenDaylightApi': odlapi_file
}}
elif neutron_driver == 'ovn':
ovnapi_file = os.path.join(temp, 'docker', 'services',
'overcloud_containers.yaml.j2')
resource_registry = {'resource_registry': {
'OS::TripleO::Services::OVNController': ovnapi_file
}}
pmef.return_value = None, resource_registry
cmd_arglist = [
'--template-file',
tmpl_file,
'--tag',
'passed-ci',
'--namespace',
'tripleo',
'--prefix',
'os-',
'--suffix',
'foo',
'--images-file',
images_file,
'--env-file',
env_file,
]
cmd_arglist.extend(arg_list)
self.cmd.app.command_options = cmd_arglist
verifylist = []
cift = mock.MagicMock()
cift.return_value = expected_container_template_params
mock_builder.return_value.container_images_from_template = cift
parsed_args = self.check_parser(self.cmd, cmd_arglist, verifylist)
self.cmd.take_action(parsed_args)
mock_builder.assert_called_once_with([tmpl_file])
pmef.assert_called_once_with(pmef_call_args)
cift.assert_called_once_with(
filter=mock.ANY,
name_prefix='os-',
name_suffix='foo',
namespace='tripleo',
tag='passed-ci',
neutron_driver=neutron_driver,
)
with open(images_file) as f:
self.assertEqual(expected_oc_yaml_contents, yaml.safe_load(f))
with open(env_file) as f:
self.assertEqual(expected_env_contents, yaml.safe_load(f))
@mock.patch('tripleo_common.image.kolla_builder.KollaImageBuilder')
@mock.patch('heatclient.common.template_utils.'
'process_multiple_environments_and_files')
@mock.patch('tripleoclient.v1.container_image.PrepareImageFiles.'
'get_enabled_services')
def test_container_image_prepare_for_odl(self, ges, pmef, mock_builder):
arglist = [
'-e',
'environments/services-docker/neutron-opendaylight.yaml',
]
expected_container_template_params = [{
'imagename':
'tripleo/os-neutron-server-opendaylightfoo:passed-ci',
'params':
['DockerNeutronApiImage', 'DockerNeutronConfigImage'],
'services': [
'OS::TripleO::Services::NeutronApi',
'OS::TripleO::Services::NeutronDhcpAgent',
'OS::TripleO::Services::NeutronMetadataAgent',
'OS::TripleO::Services::NeutronServer',
'OS::TripleO::Services::OpenDaylightApi',
],
}, {
'imagename': 'tripleo/os-opendaylightfoo:passed-ci',
'params':
['DockerOpendaylightApiImage',
'DockerOpendaylightConfigImage'],
'services': [
'OS::TripleO::Services::OpenDaylightApi',
],
}
]
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-docker/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_builder, pmef_call_args, arglist, 'odl',
expected_container_template_params, expected_oc_yaml_contents,
expected_env_contents)
@mock.patch('tripleo_common.image.kolla_builder.KollaImageBuilder')
@mock.patch('heatclient.common.template_utils.'
'process_multiple_environments_and_files')
@mock.patch('tripleoclient.v1.container_image.PrepareImageFiles.'
'get_enabled_services')
def test_container_image_prepare_for_ovn(self, ges, pmef, mock_builder):
arglist = [
'-e',
'environments/services-docker/neutron-ovn.yaml',
]
expected_container_template_params = [{
'imagename':
'tripleo/os-neutron-server-ovnfoo:passed-ci',
'params':
['DockerNeutronApiImage', 'DockerNeutronConfigImage'],
'services': [
'OS::TripleO::Services::NeutronApi',
'OS::TripleO::Services::NeutronServer',
'OS::TripleO::Services::OVNController',
'OS::TripleO::Services::OVNDBs',
],
}, {
'imagename': 'tripleo/os-ovn-controllerfoo:passed-ci',
'params':
['DockerOvnControllerImage',
'DockerOvnControllerConfigImage'],
'services': [
'OS::TripleO::Services::OVNController',
],
}
]
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-docker/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_builder, pmef_call_args, arglist, 'ovn',
expected_container_template_params, expected_oc_yaml_contents,
expected_env_contents)
class TestContainerImageBuild(TestPluginV1):

View File

@ -334,17 +334,26 @@ class PrepareImageFiles(command.Command):
def take_action(self, parsed_args):
self.log.debug("take_action(%s)" % parsed_args)
service_filter = self.build_service_filter(
parsed_args.environment_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)
service_filter = self.build_service_filter(
parsed_args.environment_files, parsed_args.roles_file)
def ffunc(entry):
imagename = entry.get('imagename', '')
for p in parsed_args.excludes: