# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from oslo_log import log as logging from tempest import config from tempest.lib import decorators from tempest.lib import exceptions as ex from vmware_nsx_tempest_plugin.tests.nsxv.api.lbaas import base CONF = config.CONF LOG = logging.getLogger(__name__) class MemberTest(base.BaseTestCase): """Test the following operations in Neutron-LBaaS API using the REST client for members: list members of a pool create a member of a Pool update a pool member delete a member """ @classmethod def resource_setup(cls): super(MemberTest, cls).resource_setup() # core network setup is moved to base class cls.load_balancer = cls._create_active_load_balancer( tenant_id=cls.tenant_id, vip_subnet_id=cls.subnet.get('id')) cls.load_balancer_id = cls.load_balancer.get("id") cls.listener = cls._create_listener( loadbalancer_id=cls.load_balancer.get('id'), protocol='HTTP', protocol_port=80) cls.listener_id = cls.listener.get('id') cls.pool = cls._create_pool(protocol='HTTP', tenant_id=cls.tenant_id, lb_algorithm='ROUND_ROBIN', listener_id=cls.listener_id) cls.pool_id = cls.pool.get('id') @classmethod def resource_cleanup(cls): super(MemberTest, cls).resource_cleanup() @decorators.attr(type='smoke') @decorators.idempotent_id('6dcdc53c-52cf-4b6e-aeec-d13df68ed001') def test_list_empty_members(self): """Test that pool members are empty.""" members = self._list_members(self.pool_id) self.assertEmpty(members, msg='Initial pool was supposed to be empty') @decorators.attr(type='smoke') @decorators.idempotent_id('346e49ce-0665-4995-a03a-b007052d3619') def test_list_3_members(self): """Test that we can list members. """ member_ips_exp = set([u"127.0.0.0", u"127.0.0.1", u"127.0.0.2"]) for ip in member_ips_exp: member_opts = self.build_member_opts() member_opts["address"] = ip member = self._create_member(self.pool_id, **member_opts) self.addCleanup(self._delete_member, self.pool_id, member['id']) members = self._list_members(self.pool_id) self.assertEqual(3, len(members)) for member in members: self.assertEqual(member["tenant_id"], self.tenant_id) self.assertEqual(member["protocol_port"], 80) self.assertEqual(member["subnet_id"], self.subnet_id) found_member_ips = set([m["address"] for m in members]) self.assertEqual(found_member_ips, member_ips_exp) @decorators.attr(type='smoke') @decorators.idempotent_id('3121bbdc-81e4-40e3-bf66-3ceefd72a0f5') def test_add_member(self): """Test that we can add a single member.""" expect_empty_members = self._list_members(self.pool_id) self.assertEmpty(expect_empty_members) member_opts = self.build_member_opts() member = self._create_member(self.pool_id, **member_opts) member_id = member.get("id") self.addCleanup(self._delete_member, self.pool_id, member_id) self.assertEqual(member_opts["address"], member["address"]) self.assertEqual(self.tenant_id, member["tenant_id"]) self.assertEqual(80, member["protocol_port"]) self.assertEqual(self.subnet_id, member["subnet_id"]) # Should have default values for admin_state_up and weight self.assertEqual(True, member["admin_state_up"]) self.assertEqual(1, member["weight"]) @decorators.attr(type='smoke') @decorators.idempotent_id('fc513a45-4c24-42ea-8807-a9b86a81ee56') def test_get_member(self): """Test that we can fetch a member by id.""" member_opts = self.build_member_opts() member_id = self._create_member(self.pool_id, **member_opts)["id"] self.addCleanup(self._delete_member, self.pool_id, member_id) member = self._show_member(self.pool_id, member_id) self.assertEqual(member_id, member["id"]) self.assertEqual(member_opts["address"], member["address"]) self.assertEqual(member_opts["tenant_id"], member["tenant_id"]) self.assertEqual(member_opts["protocol_port"], member["protocol_port"]) self.assertEqual(member_opts["subnet_id"], member["subnet_id"]) @decorators.attr(type='smoke') @decorators.idempotent_id('2cead036-5a63-43a4-9d9d-03c9b744c101') def test_create_member_missing_required_field_tenant_id(self): """Test if a non_admin user can create a member_opts with tenant_id missing """ member_opts = {} member_opts['address'] = "127.0.0.1" member_opts['protocol_port'] = 80 member_opts['subnet_id'] = self.subnet_id member = self._create_member(self.pool_id, **member_opts) self.addCleanup(self._delete_member, self.pool_id, member['id']) @decorators.attr(type='negative') @decorators.idempotent_id('d7ed0870-a065-4fbd-8d95-0ea4d12063c2') def test_create_member_missing_required_field_address(self): """Test create a member with missing field address""" member_opts = {} member_opts['protocol_port'] = 80 member_opts['subnet_id'] = self.subnet_id self.assertRaises(ex.BadRequest, self._create_member, self.pool_id, **member_opts) @decorators.attr(type='negative') @decorators.idempotent_id('8d2b9a53-aac7-4fb9-b068-47647289aa21') def test_create_member_missing_required_field_protocol_port(self): """Test create a member with missing field protocol_port""" member_opts = {} member_opts['address'] = "127.0.0.1" member_opts['subnet_id'] = self.subnet_id self.assertRaises(ex.BadRequest, self._create_member, self.pool_id, **member_opts) @decorators.attr(type='negative') @decorators.idempotent_id('9710cd4c-aac0-4b71-b295-82a88c67b0b8') def test_create_member_missing_required_field_subnet_id(self): """Test create a member with missing field subnet_id """ member_opts = {} member_opts['protocol_port'] = 80 member_opts['address'] = "127.0.0.1" self.assertRaises(ex.BadRequest, self._create_member, self.pool_id, **member_opts) @decorators.attr(type='negative') @decorators.idempotent_id('a6814c49-758d-490a-9557-ef03f0d78c44') def test_raises_BadRequest_when_missing_attrs_during_member_create(self): """Test failure on missing attributes on member create.""" member_opts = {} self.assertRaises(ex.BadRequest, self._create_member, self.pool_id, **member_opts) @decorators.attr(type='negative') @decorators.idempotent_id('840bfa84-1d16-4149-a863-6f7afec1682f') def test_create_member_invalid_tenant_id(self): """Test create member with invalid tenant_id""" member_opts = {} member_opts['address'] = "127.0.0.1" member_opts['protocol_port'] = 80 member_opts['subnet_id'] = self.subnet_id member_opts['tenant_id'] = "$232!$pw" self.assertRaises(ex.BadRequest, self._create_member, self.pool_id, **member_opts) @decorators.attr(type='negative') @decorators.idempotent_id('a99dbd0a-5f8c-4c96-8900-1a7d297d913b') def test_create_member_invalid_address(self): """Test create member with invalid address""" member_opts = {} member_opts['address'] = "127$%