Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 27 additions & 17 deletions pyrax/autoscale.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,15 +129,15 @@ def update_launch_metadata(self, metadata):
return self.manager.update_launch_metadata(self, metadata)


def add_policy(self, name, policy_type, cooldown, change, is_percent=False,
desired_capacity=None, args=None):
def add_policy(self, name, policy_type, cooldown, change=None,
is_percent=False, desired_capacity=None, args=None):
"""
Adds a policy with the given values to this scaling group. The
'change' parameter is treated as an absolute amount, unless
'is_percent' is True, in which case it is treated as a percentage.
"""
return self.manager.add_policy(self, name, policy_type, cooldown,
change, is_percent=is_percent,
change=change, is_percent=is_percent,
desired_capacity=desired_capacity, args=args)


Expand Down Expand Up @@ -441,19 +441,20 @@ def update_launch_metadata(self, scaling_group, metadata):
return self.update_launch_config(scaling_group, metadata=curr_meta)


def add_policy(self, scaling_group, name, policy_type, cooldown, change,
is_percent=False, desired_capacity=None, args=None):
def add_policy(self, scaling_group, name, policy_type, cooldown,
change=None, is_percent=False, desired_capacity=None, args=None):
"""
Adds a policy with the given values to the specified scaling group. The
'change' parameter is treated as an absolute amount, unless
'is_percent' is True, in which case it is treated as a percentage.
"""
uri = "/%s/%s/policies" % (self.uri_base, utils.get_id(scaling_group))
body = {"name": name, "cooldown": cooldown, "type": policy_type}
if is_percent:
body["changePercent"] = change
else:
body["change"] = change
if change is not None:
if is_percent:
body["changePercent"] = change
else:
body["change"] = change
if desired_capacity is not None:
body["desiredCapacity"] = desired_capacity
if args is not None:
Expand Down Expand Up @@ -502,12 +503,21 @@ def update_policy(self, scaling_group, policy, name=None, policy_type=None,
"type": policy_type or policy.type,
"cooldown": cooldown or policy.cooldown,
}
if is_percent:
body["changePercent"] = change or policy.changePercent
if desired_capacity is not None or change is not None:
if desired_capacity is not None:
body["desiredCapacity"] = desired_capacity
elif change is not None:
if is_percent:
body["changePercent"] = change
else:
body["change"] = change
else:
body["change"] = change or policy.change
if desired_capacity is not None:
body["desiredCapacity"] = desired_capacity
if getattr(policy, 'changePercent', None) is not None:
body["changePercent"] = policy.changePercent
elif getattr(policy, 'change', None) is not None:
body["change"] = policy.change
elif getattr(policy, 'desiredCapacity', None) is not None:
body["desiredCapacity"] = policy.desiredCapacity
if args is not None:
body["args"] = args
resp, resp_body = self.api.method_put(uri, body=body)
Expand Down Expand Up @@ -935,15 +945,15 @@ def update_launch_metadata(self, scaling_group, metadata):
return self._manager.update_launch_metadata(scaling_group, metadata)


def add_policy(self, scaling_group, name, policy_type, cooldown, change,
is_percent=False, desired_capacity=None, args=None):
def add_policy(self, scaling_group, name, policy_type, cooldown,
change=None, is_percent=False, desired_capacity=None, args=None):
"""
Adds a policy with the given values to the specified scaling group. The
'change' parameter is treated as an absolute amount, unless
'is_percent' is True, in which case it is treated as a percentage.
"""
return self._manager.add_policy(scaling_group, name, policy_type,
cooldown, change, is_percent=is_percent,
cooldown, change=change, is_percent=is_percent,
desired_capacity=desired_capacity, args=args)


Expand Down
132 changes: 130 additions & 2 deletions tests/unit/test_autoscale.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ def test_add_policy(self):
is_percent=is_percent, desired_capacity=desired_capacity,
args=args)
mgr.add_policy.assert_called_once_with(sg, name, policy_type, cooldown,
change, is_percent=is_percent,
change=change, is_percent=is_percent,
desired_capacity=desired_capacity, args=args)

def test_list_policies(self):
Expand Down Expand Up @@ -506,6 +506,25 @@ def test_mgr_add_policy(self):
mgr.api.method_post.assert_called_with(uri, body=[post_body])
self.assert_(isinstance(ret, AutoScalePolicy))

def test_mgr_add_policy_desired_capacity(self):
sg = self.scaling_group
mgr = sg.manager
ret_body = {"policies": [{}]}
mgr.api.method_post = Mock(return_value=(None, ret_body))
uri = "/%s/%s/policies" % (mgr.uri_base, sg.id)
name = utils.random_name()
ptype = utils.random_name()
cooldown = utils.random_name()
desired_capacity = utils.random_name()
post_body = {"name": name,
"cooldown": cooldown,
"type": ptype,
"desiredCapacity": desired_capacity}
ret = mgr.add_policy(sg, name, ptype, cooldown,
desired_capacity=desired_capacity)
mgr.api.method_post.assert_called_with(uri, body=[post_body])
self.assert_(isinstance(ret, AutoScalePolicy))

def test_mgr_list_policies(self):
sg = self.scaling_group
mgr = sg.manager
Expand Down Expand Up @@ -551,6 +570,115 @@ def test_mgr_update_policy(self):
args=args)
mgr.api.method_put.assert_called_with(uri, body=put_body)

def test_mgr_update_policy_desired_to_desired(self):
sg = self.scaling_group
mgr = sg.manager
pol = utils.random_name()
name = utils.random_name()
ptype = utils.random_name()
cooldown = utils.random_name()
change = utils.random_name()
args = utils.random_name()
new_desired_capacity = 10
old_info = {"desiredCapacity": 0}
mgr.get_policy = Mock(
return_value=fakes.FakeAutoScalePolicy(mgr, old_info, sg))
mgr.api.method_put = Mock(return_value=(None, None))
uri = "/%s/%s/policies/%s" % (mgr.uri_base, sg.id, pol)
put_body = {"name": name, "cooldown": cooldown, "type": ptype,
"desiredCapacity": new_desired_capacity}
ret = mgr.update_policy(sg, pol, name=name, policy_type=ptype,
cooldown=cooldown, desired_capacity=new_desired_capacity)
mgr.api.method_put.assert_called_with(uri, body=put_body)

def test_mgr_update_policy_change_to_desired(self):
sg = self.scaling_group
mgr = sg.manager
pol = utils.random_name()
name = utils.random_name()
ptype = utils.random_name()
cooldown = utils.random_name()
change = utils.random_name()
args = utils.random_name()
new_desired_capacity = 10
old_info = {"change": -1}
mgr.get_policy = Mock(
return_value=fakes.FakeAutoScalePolicy(mgr, old_info, sg))
mgr.api.method_put = Mock(return_value=(None, None))
uri = "/%s/%s/policies/%s" % (mgr.uri_base, sg.id, pol)
put_body = {"name": name, "cooldown": cooldown, "type": ptype,
"desiredCapacity": new_desired_capacity}
ret = mgr.update_policy(sg, pol, name=name, policy_type=ptype,
cooldown=cooldown, desired_capacity=new_desired_capacity)
mgr.api.method_put.assert_called_with(uri, body=put_body)

def test_mgr_update_policy_desired_to_change(self):
sg = self.scaling_group
mgr = sg.manager
pol = utils.random_name()
name = utils.random_name()
ptype = utils.random_name()
cooldown = utils.random_name()
change = utils.random_name()
args = utils.random_name()
new_change = 1
old_info = {"desiredCapacity": 0}
mgr.get_policy = Mock(
return_value=fakes.FakeAutoScalePolicy(mgr, old_info, sg))
mgr.api.method_put = Mock(return_value=(None, None))
uri = "/%s/%s/policies/%s" % (mgr.uri_base, sg.id, pol)
put_body = {"name": name, "cooldown": cooldown, "type": ptype,
"change": new_change}
ret = mgr.update_policy(sg, pol, name=name, policy_type=ptype,
cooldown=cooldown, change=new_change)
mgr.api.method_put.assert_called_with(uri, body=put_body)

def test_mgr_update_policy_maintain_desired_capacity(self):
sg = self.scaling_group
mgr = sg.manager
pol = utils.random_name()
name = utils.random_name()
ptype = utils.random_name()
cooldown = utils.random_name()
change = utils.random_name()
args = utils.random_name()
new_name = utils.random_name()
old_capacity = 0
old_info = {"type": ptype,
"desiredCapacity": old_capacity,
"cooldown": cooldown}
mgr.get_policy = Mock(
return_value=fakes.FakeAutoScalePolicy(mgr, old_info, sg))
mgr.api.method_put = Mock(return_value=(None, None))
uri = "/%s/%s/policies/%s" % (mgr.uri_base, sg.id, pol)
put_body = {"name": new_name, "cooldown": cooldown, "type": ptype,
"desiredCapacity": old_capacity}
ret = mgr.update_policy(sg, pol, name=new_name)
mgr.api.method_put.assert_called_with(uri, body=put_body)

def test_mgr_update_policy_maintain_is_percent(self):
sg = self.scaling_group
mgr = sg.manager
pol = utils.random_name()
name = utils.random_name()
ptype = utils.random_name()
cooldown = utils.random_name()
change = utils.random_name()
args = utils.random_name()
new_name = utils.random_name()
old_percent = 10
old_info = {"type": ptype,
"changePercent": old_percent,
"cooldown": cooldown}
mgr.get_policy = Mock(
return_value=fakes.FakeAutoScalePolicy(mgr, old_info, sg))
mgr.api.method_put = Mock(return_value=(None, None))
uri = "/%s/%s/policies/%s" % (mgr.uri_base, sg.id, pol)
put_body = {"name": new_name, "cooldown": cooldown, "type": ptype,
"changePercent": old_percent}
ret = mgr.update_policy(sg, pol, name=new_name)
mgr.api.method_put.assert_called_with(uri, body=put_body)

def test_mgr_execute_policy(self):
sg = self.scaling_group
mgr = sg.manager
Expand Down Expand Up @@ -1008,7 +1136,7 @@ def test_clt_add_policy(self):
is_percent=is_percent, desired_capacity=desired_capacity,
args=args)
mgr.add_policy.assert_called_once_with(sg, name, policy_type, cooldown,
change, is_percent=is_percent,
change=change, is_percent=is_percent,
desired_capacity=desired_capacity, args=args)

def test_clt_list_policies(self):
Expand Down