From 097c66677803928f2f0de12bc3a6a0506dabed19 Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Mon, 20 Jan 2014 12:57:17 +0400 Subject: [PATCH] Fixed OS::Neutron::Pool creation Resource OS::Neutron::Pool could not be created when cookie_name param for session_persistence is not set. By default params that is not set filled with None as value and passed to the client. This is incorrent behaviour in Neutron case. Neutron require that all fields that is not set should not be passed at all. So we need to fillter out cookie_name param if it's value set to None. Closes-bug: #1270750 Change-Id: Iafb082f69bf1dd7a4f49151f65d5a1b8c69f1337 --- heat/engine/resources/neutron/loadbalancer.py | 6 +++ heat/tests/test_neutron_loadbalancer.py | 40 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/heat/engine/resources/neutron/loadbalancer.py b/heat/engine/resources/neutron/loadbalancer.py index e95191eefb..158079d1e5 100644 --- a/heat/engine/resources/neutron/loadbalancer.py +++ b/heat/engine/resources/neutron/loadbalancer.py @@ -324,6 +324,12 @@ class Pool(neutron.NeutronResource): vip_arguments = self.prepare_properties( vip_properties, '%s.vip' % (self.name,)) + + session_p = vip_arguments.get(self.VIP_SESSION_PERSISTENCE) + if session_p is not None: + prepared_props = self.prepare_properties(session_p, None) + vip_arguments['session_persistence'] = prepared_props + vip_arguments['protocol'] = self.properties[self.PROTOCOL] vip_arguments['subnet_id'] = self.properties[self.SUBNET_ID] vip_arguments['pool_id'] = pool['id'] diff --git a/heat/tests/test_neutron_loadbalancer.py b/heat/tests/test_neutron_loadbalancer.py index c75c54ebbb..9456dfba81 100644 --- a/heat/tests/test_neutron_loadbalancer.py +++ b/heat/tests/test_neutron_loadbalancer.py @@ -489,6 +489,46 @@ class PoolTest(HeatTestCase): self.assertIsNone(resource.validate()) + def test_properties_are_prepared_for_session_persistence(self): + clients.OpenStackClients.keystone().AndReturn( + fakes.FakeKeystoneClient()) + neutronclient.Client.create_pool({ + 'pool': { + 'subnet_id': 'sub123', 'protocol': u'HTTP', + 'name': utils.PhysName('test_stack', 'pool'), + 'lb_method': 'ROUND_ROBIN', 'admin_state_up': True}} + ).AndReturn({'pool': {'id': '5678'}}) + neutronclient.Client.create_vip({ + 'vip': { + 'protocol': u'HTTP', 'name': 'pool.vip', + 'admin_state_up': True, 'subnet_id': u'sub123', + 'pool_id': '5678', 'protocol_port': 80, + 'session_persistence': {'type': 'HTTP_COOKIE'}}} + ).AndReturn({'vip': {'id': 'xyz'}}) + neutronclient.Client.show_pool('5678').AndReturn( + {'pool': {'status': 'ACTIVE'}}) + neutronclient.Client.show_vip('xyz').AndReturn( + {'vip': {'status': 'ACTIVE'}}) + + snippet = template_format.parse(pool_with_session_persistence_template) + pool = snippet['Resources']['pool'] + persistence = pool['Properties']['vip']['session_persistence'] + + #change persistence type to HTTP_COOKIE that not require cookie_name + persistence['type'] = 'HTTP_COOKIE' + del persistence['cookie_name'] + resource = loadbalancer.Pool('pool', pool, utils.parse_stack(snippet)) + + #assert that properties contain cookie_name property with None value + persistence = resource.properties['vip']['session_persistence'] + self.assertIn('cookie_name', persistence) + self.assertIsNone(persistence['cookie_name']) + + self.m.ReplayAll() + scheduler.TaskRunner(resource.create)() + self.assertEqual((resource.CREATE, resource.COMPLETE), resource.state) + self.m.VerifyAll() + def test_delete(self): rsrc = self.create_pool() neutronclient.Client.delete_vip('xyz')