Add 'set-weight' action.
This patchset adds the 'set-weight' action which can be used to set weight of device(s) based on the search pattern. Change-Id: I6bbc71f66d948e97d2dd6a5174dedb3212503a3f Closes-Bug: 1821697
This commit is contained in:
parent
3c8a676f3b
commit
3809df73fb
25
actions.yaml
25
actions.yaml
@ -58,3 +58,28 @@ remove-devices:
|
|||||||
required:
|
required:
|
||||||
- ring
|
- ring
|
||||||
- search-value
|
- search-value
|
||||||
|
set-weight:
|
||||||
|
description: Sets the device's weight.
|
||||||
|
params:
|
||||||
|
ring:
|
||||||
|
type: string
|
||||||
|
description: |
|
||||||
|
Swift ring to set the weight for. Valid options are 'account',
|
||||||
|
'container', 'object' or 'all'.
|
||||||
|
search-value:
|
||||||
|
type: string
|
||||||
|
description: |
|
||||||
|
The search-value can be of the form:
|
||||||
|
.
|
||||||
|
d<device_id>r<region>z<zone>-<ip>:<port>R<r_ip>:<r_port>/
|
||||||
|
<device_name>_<meta>
|
||||||
|
.
|
||||||
|
Where <r_ip> and <r_port> are replication ip and port. Any part is
|
||||||
|
optional, but you must include at least one part.
|
||||||
|
weight:
|
||||||
|
type: number
|
||||||
|
description: The device's weight
|
||||||
|
required:
|
||||||
|
- ring
|
||||||
|
- search-value
|
||||||
|
- weight
|
||||||
|
@ -51,6 +51,7 @@ from lib.swift_utils import (
|
|||||||
balance_rings,
|
balance_rings,
|
||||||
remove_from_ring,
|
remove_from_ring,
|
||||||
services,
|
services,
|
||||||
|
set_weight_in_ring,
|
||||||
SWIFT_CONF_DIR,
|
SWIFT_CONF_DIR,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -147,10 +148,36 @@ def remove_devices(args):
|
|||||||
balance_rings()
|
balance_rings()
|
||||||
|
|
||||||
|
|
||||||
|
def set_weight(args):
|
||||||
|
""" Sets the device's weight.
|
||||||
|
|
||||||
|
Sets the device's weight based on the search pattern.
|
||||||
|
|
||||||
|
:raises SwiftProxyCharmException: if pattern action_get('search-value')
|
||||||
|
doesn't match any device in the ring.
|
||||||
|
"""
|
||||||
|
rings_valid = ['account', 'container', 'object', 'all']
|
||||||
|
ring = action_get('ring')
|
||||||
|
if ring not in rings_valid:
|
||||||
|
action_fail('Invalid ring name.')
|
||||||
|
return
|
||||||
|
if ring == 'all':
|
||||||
|
rings_to_update = ['account', 'container', 'object']
|
||||||
|
else:
|
||||||
|
rings_to_update = [ring]
|
||||||
|
for ring_to_update in rings_to_update:
|
||||||
|
ring_to_update_builder = ring_to_update + '.builder'
|
||||||
|
ring_to_update_path = os.path.join(SWIFT_CONF_DIR,
|
||||||
|
ring_to_update_builder)
|
||||||
|
set_weight_in_ring(ring_to_update_path, action_get('search-value'),
|
||||||
|
str(action_get('weight')))
|
||||||
|
balance_rings()
|
||||||
|
|
||||||
|
|
||||||
# A dictionary of all the defined actions to callables (which take
|
# A dictionary of all the defined actions to callables (which take
|
||||||
# parsed arguments).
|
# parsed arguments).
|
||||||
ACTIONS = {"pause": pause, "resume": resume, 'diskusage': diskusage,
|
ACTIONS = {"pause": pause, "resume": resume, 'diskusage': diskusage,
|
||||||
'remove-devices': remove_devices}
|
'remove-devices': remove_devices, 'set-weight': set_weight}
|
||||||
|
|
||||||
|
|
||||||
def main(argv):
|
def main(argv):
|
||||||
|
1
actions/set-weight
Symbolic link
1
actions/set-weight
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
actions.py
|
@ -524,6 +524,29 @@ def remove_from_ring(ring_path, search_value):
|
|||||||
"{}".format(search_value, ring_path, e))
|
"{}".format(search_value, ring_path, e))
|
||||||
|
|
||||||
|
|
||||||
|
def set_weight_in_ring(ring_path, search_value, weight):
|
||||||
|
""" Resets the device's weight.
|
||||||
|
|
||||||
|
Resets the device's weight based on the search pattern.
|
||||||
|
|
||||||
|
:param ring_path: path to the ring
|
||||||
|
:type ring_path: str
|
||||||
|
:param search_value: search pattern
|
||||||
|
:type search_value: str
|
||||||
|
:param weight: the device's weight
|
||||||
|
:type weight: str
|
||||||
|
:raises: SwiftProxyCharmException
|
||||||
|
"""
|
||||||
|
cmd = ['swift-ring-builder', ring_path, 'set_weight', search_value, weight]
|
||||||
|
try:
|
||||||
|
subprocess.check_call(cmd)
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
raise SwiftProxyCharmException(
|
||||||
|
"Failed to set {} weight for {} pattern on {}".format(weight,
|
||||||
|
search_value,
|
||||||
|
ring_path))
|
||||||
|
|
||||||
|
|
||||||
def _ring_port(ring_path, node):
|
def _ring_port(ring_path, node):
|
||||||
"""Determine correct port from relation settings for a given ring file."""
|
"""Determine correct port from relation settings for a given ring file."""
|
||||||
for name in ['account', 'object', 'container']:
|
for name in ['account', 'object', 'container']:
|
||||||
|
@ -335,3 +335,27 @@ class RemoveDevicesTestCase(CharmTestCase):
|
|||||||
self.action_fail.assert_called()
|
self.action_fail.assert_called()
|
||||||
self.remove_from_ring.assert_not_called()
|
self.remove_from_ring.assert_not_called()
|
||||||
self.balance_rings.assert_not_called()
|
self.balance_rings.assert_not_called()
|
||||||
|
|
||||||
|
|
||||||
|
class SetWeightTestCase(CharmTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(SetWeightTestCase, self).setUp(
|
||||||
|
actions.actions, ["action_fail",
|
||||||
|
"action_get",
|
||||||
|
"set_weight_in_ring",
|
||||||
|
"balance_rings"])
|
||||||
|
|
||||||
|
def test_ring_valid(self):
|
||||||
|
self.action_get.side_effect = ['account', 'd1', '0.0']
|
||||||
|
actions.actions.set_weight([])
|
||||||
|
self.set_weight_in_ring.assert_called_once_with(
|
||||||
|
'/etc/swift/account.builder', 'd1', '0.0')
|
||||||
|
self.balance_rings.assert_called_once()
|
||||||
|
|
||||||
|
def test_ring_invalid(self):
|
||||||
|
self.action_get.side_effect = ['other', 'd1', '0.0']
|
||||||
|
actions.actions.set_weight([])
|
||||||
|
self.action_fail.assert_called()
|
||||||
|
self.set_weight_in_ring.assert_not_called()
|
||||||
|
self.balance_rings.assert_not_called()
|
||||||
|
@ -437,6 +437,15 @@ class SwiftUtilsTestCase(unittest.TestCase):
|
|||||||
'remove',
|
'remove',
|
||||||
'd1'])
|
'd1'])
|
||||||
|
|
||||||
|
@mock.patch.object(subprocess, 'check_call')
|
||||||
|
def test_set_weight_in_ring(self, check_call):
|
||||||
|
swift_utils.set_weight_in_ring('/etc/swift/account.builder', 'd1', 0.0)
|
||||||
|
check_call.assert_called_once_with(['swift-ring-builder',
|
||||||
|
'/etc/swift/account.builder',
|
||||||
|
'set_weight',
|
||||||
|
'd1',
|
||||||
|
0.0])
|
||||||
|
|
||||||
@mock.patch('lib.swift_utils.config')
|
@mock.patch('lib.swift_utils.config')
|
||||||
@mock.patch('lib.swift_utils.set_os_workload_status')
|
@mock.patch('lib.swift_utils.set_os_workload_status')
|
||||||
@mock.patch('lib.swift_utils.SwiftRingContext.__call__')
|
@mock.patch('lib.swift_utils.SwiftRingContext.__call__')
|
||||||
|
Loading…
Reference in New Issue
Block a user