From 00b6cd9953dc71d0f286f53d55dd9a049a6b14dc Mon Sep 17 00:00:00 2001 From: Daneyon Hansen Date: Fri, 13 Nov 2015 00:10:41 +0000 Subject: [PATCH] Adds Magnum Container Network Model to Swarm 1. Updates network-driver API validation. 2. Updates AtomicSwarm template definition for swarm, flannel and labels. 3. Adds initial unit test. Partially-Implements: blueprint extend-baymodel-net-attributes Partially-Implements: blueprint conductor-template-net-update Change-Id: Ia80f239bcbd29ae14de25ae3e915a49d9b9bafd1 --- magnum/api/validation.py | 4 ++-- magnum/conductor/template_definition.py | 8 ++++++++ magnum/tests/functional/common/datagen.py | 2 +- .../handlers/test_swarm_bay_conductor.py | 20 ++++++++++++++----- .../conductor/test_template_definition.py | 9 ++++++++- 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/magnum/api/validation.py b/magnum/api/validation.py index 2facebf3b4..02c6b48e53 100644 --- a/magnum/api/validation.py +++ b/magnum/api/validation.py @@ -36,7 +36,7 @@ baymodel_opts = [ help="Allowed network drivers for docker swarm baymodels. " "Use 'all' keyword to allow all drivers supported " "for swarm baymodels. Supported network drivers " - "include docker."), + "include docker and flannel."), cfg.StrOpt('swarm_default_network_driver', default='docker', help="Default network driver for docker swarm baymodels."), @@ -156,7 +156,7 @@ class K8sValidator(Validator): class SwarmValidator(Validator): - supported_drivers = ['docker'] + supported_drivers = ['docker', 'flannel'] allowed_drivers = cfg.CONF.baymodel.swarm_allowed_network_drivers default_driver = cfg.CONF.baymodel.swarm_default_network_driver diff --git a/magnum/conductor/template_definition.py b/magnum/conductor/template_definition.py index 0f710be2d1..243c55a98c 100644 --- a/magnum/conductor/template_definition.py +++ b/magnum/conductor/template_definition.py @@ -565,6 +565,8 @@ class AtomicSwarmTemplateDefinition(BaseTemplateDefinition): self.add_parameter('external_network', baymodel_attr='external_network_id', required=True) + self.add_parameter('network_driver', + baymodel_attr='network_driver') self.add_parameter('tls_disabled', baymodel_attr='tls_disabled', required=True) @@ -608,6 +610,12 @@ class AtomicSwarmTemplateDefinition(BaseTemplateDefinition): extra_params['user_token'] = self._get_user_token(context, osc, bay) extra_params['magnum_url'] = osc.magnum_url() + label_list = ['flannel_network_cidr', 'flannel_use_vxlan', + 'flannel_network_subnetlen'] + + for label in label_list: + extra_params[label] = baymodel.labels.get(label) + return super(AtomicSwarmTemplateDefinition, self).get_params(context, baymodel, bay, extra_params=extra_params, diff --git a/magnum/tests/functional/common/datagen.py b/magnum/tests/functional/common/datagen.py index 5b6496df28..700bc1323f 100644 --- a/magnum/tests/functional/common/datagen.py +++ b/magnum/tests/functional/common/datagen.py @@ -49,7 +49,7 @@ def generate_random_coe(): def generate_random_coe_dep_network_driver(coe): allowed_driver_types = { 'kubernetes': ['flannel', None], - 'swarm': ['docker', None], + 'swarm': ['docker', 'flannel', None], 'mesos': ['docker', None], } driver_types = allowed_driver_types[coe] diff --git a/magnum/tests/unit/conductor/handlers/test_swarm_bay_conductor.py b/magnum/tests/unit/conductor/handlers/test_swarm_bay_conductor.py index 4b5e9e9032..e6cfaaf226 100644 --- a/magnum/tests/unit/conductor/handlers/test_swarm_bay_conductor.py +++ b/magnum/tests/unit/conductor/handlers/test_swarm_bay_conductor.py @@ -39,7 +39,11 @@ class TestBayConductorWithSwarm(base.TestCase): 'https_proxy': 'https_proxy', 'no_proxy': 'no_proxy', 'tls_disabled': False, - 'server_type': 'vm' + 'server_type': 'vm', + 'network_driver': 'network_driver', + 'labels': {'flannel_network_cidr': '10.101.0.0/16', + 'flannel_network_subnetlen': '26', + 'flannel_use_vxlan': 'yes'} } self.bay_dict = { 'id': 1, @@ -89,8 +93,11 @@ class TestBayConductorWithSwarm(base.TestCase): 'user_token': 'fake_token', 'bay_uuid': 'some_uuid', 'magnum_url': self.mock_osc.magnum_url.return_value, - 'tls_disabled': False - + 'tls_disabled': False, + 'network_driver': 'network_driver', + 'flannel_network_cidr': '10.101.0.0/16', + 'flannel_network_subnetlen': '26', + 'flannel_use_vxlan': 'yes' } self.assertEqual(expected, definition) @@ -101,7 +108,7 @@ class TestBayConductorWithSwarm(base.TestCase): not_required = ['image_id', 'flavor_id', 'dns_nameserver', 'docker_volume_size', 'fixed_network', 'http_proxy', - 'https_proxy', 'no_proxy'] + 'https_proxy', 'no_proxy', 'network_driver'] for key in not_required: self.baymodel_dict[key] = None self.bay_dict['discovery_url'] = 'https://discovery.etcd.io/test' @@ -122,7 +129,10 @@ class TestBayConductorWithSwarm(base.TestCase): 'user_token': 'fake_token', 'bay_uuid': 'some_uuid', 'magnum_url': self.mock_osc.magnum_url.return_value, - 'tls_disabled': False + 'tls_disabled': False, + 'flannel_network_cidr': u'10.101.0.0/16', + 'flannel_network_subnetlen': u'26', + 'flannel_use_vxlan': u'yes' } self.assertEqual(expected, definition) diff --git a/magnum/tests/unit/conductor/test_template_definition.py b/magnum/tests/unit/conductor/test_template_definition.py index 9e72672ae1..bcbead0179 100644 --- a/magnum/tests/unit/conductor/test_template_definition.py +++ b/magnum/tests/unit/conductor/test_template_definition.py @@ -397,6 +397,10 @@ class AtomicSwarmTemplateDefinitionTestCase(base.TestCase): mock_context.user_name = 'fake_user' mock_context.tenant = 'fake_tenant' + flannel_cidr = mock_baymodel.labels.get('flannel_network_cidr') + flannel_subnet = mock_baymodel.labels.get('flannel_network_subnetlen') + flannel_vxlan = mock_baymodel.labels.get('flannel_use_vxlan') + swarm_def = tdef.AtomicSwarmTemplateDefinition() swarm_def.get_params(mock_context, mock_baymodel, mock_bay) @@ -404,7 +408,10 @@ class AtomicSwarmTemplateDefinitionTestCase(base.TestCase): expected_kwargs = {'extra_params': { 'discovery_url': 'fake_discovery_url', 'user_token': mock_context.auth_token, - 'magnum_url': mock_osc.magnum_url.return_value}} + 'magnum_url': mock_osc.magnum_url.return_value, + 'flannel_network_cidr': flannel_cidr, + 'flannel_use_vxlan': flannel_subnet, + 'flannel_network_subnetlen': flannel_vxlan}} mock_get_params.assert_called_once_with(mock_context, mock_baymodel, mock_bay, **expected_kwargs)