Merge "Neutron LBaaS: Member Behaviors"
This commit is contained in:
commit
388dadbf36
|
@ -14,5 +14,99 @@ See the License for the specific language governing permissions and
|
|||
limitations under the License.
|
||||
"""
|
||||
|
||||
from cafe.engine.behaviors import BaseBehavior
|
||||
from cloudcafe.networking.lbaas.common.behaviors import \
|
||||
BaseLoadBalancersBehaviors
|
||||
|
||||
|
||||
class MemberBehaviors(BaseLoadBalancersBehaviors):
|
||||
|
||||
OBJECT_MODEL = 'member'
|
||||
|
||||
def __init__(self, members_client, config):
|
||||
super(MemberBehaviors, self).__init__(
|
||||
lbaas_client_type=members_client, config=config)
|
||||
|
||||
def create_active_member(
|
||||
self, subnet_id, tenant_id, address, protocol_port,
|
||||
weight=None, admin_state_up=None):
|
||||
"""
|
||||
@summary: Creates a member and waits for it to become active
|
||||
@param subnet_id: Subnet in which to access this member.
|
||||
@type subnet_id: str
|
||||
@param tenant_id: Tenant to which this member is owned.
|
||||
@type tenant_id: str
|
||||
@param address: IP address of pool member.
|
||||
@type address: str
|
||||
@param protocol_port: TCP or UDP port
|
||||
@type protocol_port: int
|
||||
@param weight: Positive integer indicating relative portion of
|
||||
traffic from pool this member should receive (e.g., a member with
|
||||
a weight of 10 will receive five times as much traffic as a
|
||||
member with weight 2)
|
||||
Default: 1
|
||||
@type weight: int
|
||||
@param admin_state_up: If set to False, member will be created in an
|
||||
administratively down state
|
||||
Default: True
|
||||
@type admin_state_up: bool
|
||||
@return: Response object containing response and the member
|
||||
domain object
|
||||
@rtype: requests.Response
|
||||
"""
|
||||
kwargs = {'subnet_id': subnet_id, 'tenant_id': tenant_id,
|
||||
'address': address, 'protocol_port': protocol_port,
|
||||
'weight': weight, 'admin_state_up': admin_state_up}
|
||||
resp = self.create_active_lbaas_object(
|
||||
lbaas_model_type=self.OBJECT_MODEL,
|
||||
kwargs=kwargs)
|
||||
return resp
|
||||
|
||||
def update_member_and_wait_for_active(self, weight=None,
|
||||
admin_state_up=None):
|
||||
"""
|
||||
@summary: Updates a member and waits for it to become active
|
||||
@param weight: Positive integer indicating relative portion of
|
||||
traffic from pool this member should receive (e.g., a member with
|
||||
a weight of 10 will receive five times as much traffic as a
|
||||
member with weight 2)
|
||||
Default: 1
|
||||
@type weight: int
|
||||
@param admin_state_up: If set to False, member will be created in an
|
||||
administratively down state
|
||||
Default: True
|
||||
@type admin_state_up: bool
|
||||
@return: Response object containing response and the member
|
||||
domain object
|
||||
@rtype: requests.Response
|
||||
"""
|
||||
kwargs = {'weight': weight, 'admin_state_up': admin_state_up}
|
||||
resp = self.update_lbaas_object_and_wait_for_active(
|
||||
lbaas_model_type=self.OBJECT_MODEL,
|
||||
kwargs=kwargs)
|
||||
return resp
|
||||
|
||||
def wait_for_member_status(self, member_id, desired_status,
|
||||
interval_time=None, timeout=None):
|
||||
"""
|
||||
@summary: Waits for a member to reach a desired status
|
||||
@param member_id: The id of the member
|
||||
@type member_id: String
|
||||
@param desired_status: The desired final status of the member
|
||||
@type desired_status: String
|
||||
@param interval_time: The amount of time in seconds to wait
|
||||
between polling
|
||||
@type interval_time: Integer
|
||||
@param interval_time: The amount of time in seconds to wait
|
||||
before aborting
|
||||
@type interval_time: Integer
|
||||
@return: Response object containing response and the member
|
||||
domain object
|
||||
@rtype: requests.Response
|
||||
"""
|
||||
kwargs = {'member_id': member_id,
|
||||
'desired_status': desired_status,
|
||||
'interval_time': interval_time,
|
||||
'timeout': timeout}
|
||||
resp = self.wait_for_lbaas_object_status(
|
||||
lbaas_model_type=self.OBJECT_MODEL, **kwargs)
|
||||
return resp
|
||||
|
|
|
@ -14,5 +14,99 @@ See the License for the specific language governing permissions and
|
|||
limitations under the License.
|
||||
"""
|
||||
|
||||
from cafe.engine.behaviors import BaseBehavior
|
||||
import mock
|
||||
import unittest
|
||||
|
||||
from cloudcafe.networking.lbaas.lbaas_api.member.behaviors \
|
||||
import MemberBehaviors
|
||||
from cloudcafe.networking.lbaas.lbaas_api.member.client \
|
||||
import MembersClient
|
||||
|
||||
|
||||
class MemberBehaviorsFixture(unittest.TestCase):
|
||||
"""
|
||||
@summary: Health Monitor Behaviors Tests
|
||||
"""
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(MemberBehaviorsFixture, cls).setUpClass()
|
||||
|
||||
cls.auth_token = "fake_auth_token"
|
||||
cls.url = "http://fake.url.endpoint"
|
||||
cls.member_id = "12345"
|
||||
cls.subnet_id = "SUBNET_ID"
|
||||
cls.tenant_id = "453105b9-1754-413f-aab1-55f1af620750"
|
||||
cls.address = "192.0.2.14"
|
||||
cls.protocol_port = 8080
|
||||
cls.weight = 7
|
||||
cls.admin_state_up = True
|
||||
|
||||
cls.desired_status = "ACTIVE"
|
||||
cls.interval_time = 20
|
||||
cls.timeout = 120
|
||||
|
||||
cls.members_client = MembersClient(
|
||||
url=cls.url,
|
||||
auth_token=cls.auth_token,
|
||||
serialize_format=cls.SERIALIZE,
|
||||
deserialize_format=cls.DESERIALIZE)
|
||||
|
||||
cls.member_behaviors = MemberBehaviors(
|
||||
members_client=cls.members_client, config=None)
|
||||
|
||||
|
||||
class MemberBehaviorsTests(object):
|
||||
|
||||
@mock.patch.object(MemberBehaviors, 'create_active_member',
|
||||
autospec=True)
|
||||
def test_create_active_member(self, mock_request):
|
||||
create_active_member_kwargs = (
|
||||
{'subnet_id': self.subnet_id,
|
||||
'tenant_id': self.tenant_id,
|
||||
'address': self.address,
|
||||
'protocol_port': self.protocol_port,
|
||||
'weight': self.weight,
|
||||
'admin_state_up': self.admin_state_up})
|
||||
self.member_behaviors.create_active_member(
|
||||
**create_active_member_kwargs)
|
||||
mock_request.assert_called_once_with(
|
||||
self.member_behaviors,
|
||||
**create_active_member_kwargs)
|
||||
|
||||
@mock.patch.object(MemberBehaviors, 'update_member_and_wait_for_active',
|
||||
autospec=True)
|
||||
def test_update_member_and_wait_for_active(self, mock_request):
|
||||
update_member_and_wait_for_active_kwargs = (
|
||||
{'weight': self.weight,
|
||||
'admin_state_up': self.admin_state_up})
|
||||
self.member_behaviors.update_member_and_wait_for_active(
|
||||
**update_member_and_wait_for_active_kwargs)
|
||||
mock_request.assert_called_once_with(
|
||||
self.member_behaviors,
|
||||
**update_member_and_wait_for_active_kwargs)
|
||||
|
||||
@mock.patch.object(MemberBehaviors, 'wait_for_member_status',
|
||||
autospec=True)
|
||||
def test_wait_for_member_status(self, mock_request):
|
||||
wait_for_member_status_kwargs = (
|
||||
{'member_id': self.member_id,
|
||||
'desired_status': self.desired_status,
|
||||
'interval_time': self.interval_time,
|
||||
'timeout': self.timeout})
|
||||
self.member_behaviors.wait_for_member_status(
|
||||
**wait_for_member_status_kwargs)
|
||||
mock_request.assert_called_once_with(
|
||||
self.member_behaviors,
|
||||
**wait_for_member_status_kwargs)
|
||||
|
||||
|
||||
class MembersClientTestsXML(MemberBehaviorsFixture,
|
||||
MemberBehaviorsTests):
|
||||
SERIALIZE = 'xml'
|
||||
DESERIALIZE = 'xml'
|
||||
|
||||
|
||||
class MembersClientTestsJSON(MemberBehaviorsFixture,
|
||||
MemberBehaviorsTests):
|
||||
SERIALIZE = 'json'
|
||||
DESERIALIZE = 'json'
|
||||
|
|
Loading…
Reference in New Issue