Add pool_id param for pool_member related proxy methods

pool_id is needed for generating url of Neutron LBaaS pool_member
resource. This patch added this parameter to all pool_member
related methods in proxy layer.

Change-Id: I95b094b25f1367770de035c93c4fe88428eef8dc
This commit is contained in:
yanyanhu
2015-06-12 04:37:14 -04:00
parent ee3ff704a6
commit 3091af659a
5 changed files with 95 additions and 41 deletions

View File

@@ -18,7 +18,7 @@ from openstack.network.v2 import load_balancer
from openstack.network.v2 import metering_label
from openstack.network.v2 import metering_label_rule
from openstack.network.v2 import network
from openstack.network.v2 import pool
from openstack.network.v2 import pool as _pool
from openstack.network.v2 import pool_member
from openstack.network.v2 import port
from openstack.network.v2 import quota
@@ -580,7 +580,7 @@ class Proxy(proxy.BaseProxy):
:returns: The results of pool creation
:rtype: :class:`~openstack.network.v2.pool.Pool`
"""
return self._create(pool.Pool, **attrs)
return self._create(_pool.Pool, **attrs)
def delete_pool(self, value, ignore_missing=True):
"""Delete a pool
@@ -595,7 +595,7 @@ class Proxy(proxy.BaseProxy):
:returns: ``None``
"""
self._delete(pool.Pool, value, ignore_missing=ignore_missing)
self._delete(_pool.Pool, value, ignore_missing=ignore_missing)
def find_pool(self, name_or_id):
"""Find a single pool
@@ -603,7 +603,7 @@ class Proxy(proxy.BaseProxy):
:param name_or_id: The name or ID of a pool.
:returns: One :class:`~openstack.network.v2.pool.Pool` or None
"""
return pool.Pool.find(self.session, name_or_id)
return _pool.Pool.find(self.session, name_or_id)
def get_pool(self, value):
"""Get a single pool
@@ -615,7 +615,7 @@ class Proxy(proxy.BaseProxy):
:raises: :class:`~openstack.exceptions.ResourceNotFound`
when no resource can be found.
"""
return self._get(pool.Pool, value)
return self._get(_pool.Pool, value)
def pools(self):
"""Return a generator of pools
@@ -623,7 +623,7 @@ class Proxy(proxy.BaseProxy):
:returns: A generator of pool objects
:rtype: :class:`~openstack.network.v2.pool.Pool`
"""
return self._list(pool.Pool, paginated=False)
return self._list(_pool.Pool, paginated=False)
def update_pool(self, value, **attrs):
"""Update a pool
@@ -636,7 +636,7 @@ class Proxy(proxy.BaseProxy):
:returns: The updated pool
:rtype: :class:`~openstack.network.v2.pool.Pool`
"""
return self._update(pool.Pool, value, **attrs)
return self._update(_pool.Pool, value, **attrs)
def create_pool_member(self, **attrs):
"""Create a new pool member from attributes
@@ -650,12 +650,15 @@ class Proxy(proxy.BaseProxy):
"""
return self._create(pool_member.PoolMember, **attrs)
def delete_pool_member(self, value, ignore_missing=True):
def delete_pool_member(self, member, pool, ignore_missing=True):
"""Delete a pool member
:param value: The value can be either the ID of a pool member or a
:class:`~openstack.network.v2.pool_member.PoolMember`
instance.
:param member: The member can be either the ID of a pool member or a
:class:`~openstack.network.v2.pool_member.PoolMember`
instance.
:param pool: The pool can be either the ID of a pool or a
:class:`~openstack.network.v2.pool.Pool` instance that
the member belongs to.
:param bool ignore_missing: When set to ``False``
:class:`~openstack.exceptions.ResourceNotFound` will be
raised when the pool member does not exist.
@@ -664,52 +667,70 @@ class Proxy(proxy.BaseProxy):
:returns: ``None``
"""
self._delete(pool_member.PoolMember, value,
pool = _pool.Pool.from_id(pool)
self._delete(pool_member.PoolMember, member,
path_args={'pool_id': pool.id},
ignore_missing=ignore_missing)
def find_pool_member(self, name_or_id):
def find_pool_member(self, member, pool):
"""Find a single pool member
:param name_or_id: The name or ID of a pool member.
:param member: The name or ID of a pool member.
:param pool: The pool can be either the ID of a pool or a
:class:`~openstack.network.v2.pool.Pool` instance that
the member belongs to.
:returns: One :class:`~openstack.network.v2.pool_member.PoolMember`
or None
"""
return pool_member.PoolMember.find(self.session, name_or_id)
pool = _pool.Pool.from_id(pool)
return pool_member.PoolMember.find(self.session, member,
path_args={'pool_id': pool.id})
def get_pool_member(self, value):
def get_pool_member(self, member, pool):
"""Get a single pool member
:param value: The value can be the ID of a pool member or a
:class:`~openstack.network.v2.pool_member.PoolMember`
instance.
:param member: The member can be the ID of a pool member or a
:class:`~openstack.network.v2.pool_member.PoolMember`
instance.
:param pool: The pool can be either the ID of a pool or a
:class:`~openstack.network.v2.pool.Pool` instance that
the member belongs to.
:returns: One :class:`~openstack.network.v2.pool_member.PoolMember`
:raises: :class:`~openstack.exceptions.ResourceNotFound`
when no resource can be found.
"""
return self._get(pool_member.PoolMember, value)
pool = _pool.Pool.from_id(pool)
return self._get(pool_member.PoolMember, member,
path_args={'pool_id': pool.id})
def pool_members(self):
def pool_members(self, pool):
"""Return a generator of pool members
:param pool: The pool can be either the ID of a pool or a
:class:`~openstack.network.v2.pool.Pool` instance that
the member belongs to.
:returns: A generator of pool member objects
:rtype: :class:`~openstack.network.v2.pool_member.PoolMember`
"""
return self._list(pool_member.PoolMember, paginated=False)
pool = _pool.Pool.from_id(pool)
return self._list(pool_member.PoolMember,
path_args={'pool_id': pool.id}, paginated=False)
def update_pool_member(self, value, **attrs):
def update_pool_member(self, member, **attrs):
"""Update a pool member
:param value: Either the id of a pool member or a
:class:`~openstack.network.v2.pool_member.PoolMember`
instance.
:param member: Either the ID of a pool member or a
:class:`~openstack.network.v2.pool_member.PoolMember`
instance.
:attrs kwargs: The attributes to update on the pool member represented
by ``value``.
:returns: The updated pool member
:rtype: :class:`~openstack.network.v2.pool_member.PoolMember`
"""
return self._update(pool_member.PoolMember, value, **attrs)
return self._update(pool_member.PoolMember, member, **attrs)
def create_port(self, **attrs):
"""Create a new port from attributes

View File

@@ -17,7 +17,7 @@ from openstack import resource
class PoolMember(resource.Resource):
resource_key = 'member'
resources_key = 'members'
base_path = '/pools/%(pool_id)s/members'
base_path = '/lbaas/pools/%(pool_id)s/members'
service = network_service.NetworkService()
# capabilities
@@ -28,12 +28,21 @@ class PoolMember(resource.Resource):
allow_list = True
# Properties
# TODO(briancurtin): I can't find where this is documented.
#: The IP address of the pool member.
address = resource.prop('address')
#: The administrative state of the pool member, which is up ``True`` or
#: down ``False``. *Type: bool*
admin_state_up = resource.prop('admin_state_up', type=bool)
#: The project this pool member is associated with.
project_id = resource.prop('tenant_id')
#: The port on which the application is hosted.
protocol_port = resource.prop('protocol_port', type=int)
pool_id = resource.prop('pool_id')
#: The status of the member. Indicates whether the member is operational.
status = resource.prop('status')
#: Subnet in which to access this pool member.
subnet_id = resource.prop('subnet_id')
#: A positive integer value that indicates the relative portion of traffic
#: that this member should receive from the pool. For example, a member
#: with a weight of 10 receives five times as much traffic as a member
#: with weight of 2.
weight = resource.prop('weight', type=int)

View File

@@ -33,7 +33,7 @@ class TestPoolMember(testtools.TestCase):
sot = pool_member.PoolMember()
self.assertEqual('member', sot.resource_key)
self.assertEqual('members', sot.resources_key)
self.assertEqual('/pools/%(pool_id)s/members', sot.base_path)
self.assertEqual('/lbaas/pools/%(pool_id)s/members', sot.base_path)
self.assertEqual('network', sot.service.service_type)
self.assertTrue(sot.allow_create)
self.assertTrue(sot.allow_retrieve)

View File

@@ -267,26 +267,31 @@ class TestNetworkProxy(test_proxy_base.TestProxyBase):
def test_pool_member_delete(self):
self.verify_delete(self.proxy.delete_pool_member,
pool_member.PoolMember, False)
pool_member.PoolMember, False,
{"pool": "test_id"}, {"pool_id": "test_id"})
def test_pool_member_delete_ignore(self):
self.verify_delete(self.proxy.delete_pool_member,
pool_member.PoolMember, True)
pool_member.PoolMember, True,
{"pool": "test_id"}, {"pool_id": "test_id"})
def test_pool_member_find(self):
self.verify_find('openstack.network.v2.pool_member.PoolMember.find',
self.proxy.find_pool_member)
self.verify_find2('openstack.network.v2.pool_member.PoolMember.find',
self.proxy.find_pool_member, {"pool_id": "test_id"})
def test_pool_member_get(self):
self.verify_get2('openstack.proxy.BaseProxy._get',
self.proxy.get_pool_member,
method_args=["resource_or_id"],
method_args=["resource_or_id", "test_id"],
expected_args=[pool_member.PoolMember,
"resource_or_id"])
"resource_or_id"],
expected_kwargs={"path_args": {"pool_id": "test_id"}})
def test_pool_members(self):
self.verify_list(self.proxy.pool_members, pool_member.PoolMember,
paginated=False)
paginated=False, method_args=["test_id"],
expected_kwargs={"path_args": {
"pool_id": "test_id"}})
def test_pool_member_update(self):
self.verify_update(self.proxy.update_pool_member,

View File

@@ -85,12 +85,20 @@ class TestProxyBase(base.TestCase):
**kwargs)
def verify_delete(self, test_method, resource_type, ignore,
input_path_args=None, expected_path_args=None,
mock_method="openstack.proxy.BaseProxy._delete"):
method_kwargs = {"ignore_missing": ignore}
if isinstance(input_path_args, dict):
for key in input_path_args:
method_kwargs[key] = input_path_args[key]
expected_kwargs = {"ignore_missing": ignore}
if expected_path_args:
expected_kwargs["path_args"] = expected_path_args
self._verify2(mock_method, test_method,
method_args=["resource_or_id"],
method_kwargs={"ignore_missing": ignore},
method_kwargs=method_kwargs,
expected_args=[resource_type, "resource_or_id"],
expected_kwargs={"ignore_missing": ignore})
expected_kwargs=expected_kwargs)
def verify_get(self, mock_method, test_method, **kwargs):
self._verify(mock_method, test_method, expected_result="result",
@@ -125,11 +133,22 @@ class TestProxyBase(base.TestCase):
expected_args=["name_or_id"], expected_result="result",
**kwargs)
def verify_find2(self, mock_method, test_method, path_args, **kwargs):
method_args = ["name_or_id"]
for key in path_args:
method_args.append(path_args[key])
self._verify(mock_method, test_method,
method_args=method_args,
expected_args=["name_or_id"],
expected_kwargs={"path_args": path_args},
expected_result="result",
**kwargs)
def verify_list(self, test_method, resource_type, paginated=False,
**kwargs):
expected_kwargs = kwargs.pop("expected_kwargs", {})
expected_kwargs.update({"paginated": paginated})
self._verify2("openstack.proxy.BaseProxy._list",
test_method,
expected_args=[resource_type],