Merge lp:~jjo/charms/trusty/swift-proxy/fix-multiple-devices-per-node_lp1479938 into lp:~openstack-charmers-archive/charms/trusty/swift-proxy/next

Proposed by JuanJo Ciarlante
Status: Merged
Merged at revision: 120
Proposed branch: lp:~jjo/charms/trusty/swift-proxy/fix-multiple-devices-per-node_lp1479938
Merge into: lp:~openstack-charmers-archive/charms/trusty/swift-proxy/next
Diff against target: 121 lines (+82/-6)
2 files modified
hooks/swift_utils.py (+11/-6)
unit_tests/test_swift_utils.py (+71/-0)
To merge this branch: bzr merge lp:~jjo/charms/trusty/swift-proxy/fix-multiple-devices-per-node_lp1479938
Reviewer Review Type Date Requested Status
OpenStack Charmers Pending
Review via email: mp+266462@code.launchpad.net

Commit message

[jjo, r=] also consider blockdev in exists_in_ring(), fixes lp#1479938

To post a comment you must log in.
Revision history for this message
JuanJo Ciarlante (jjo) wrote :

Sorry for not providing tests also, please use is as a reference
for a possible lp#1479938 fix.

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_lint_check #7295 swift-proxy-next for jjo mp266462
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/7295/

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_unit_test #6749 swift-proxy-next for jjo mp266462
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/6749/

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_lint_check #7296 swift-proxy-next for jjo mp266462
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/7296/

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_unit_test #6750 swift-proxy-next for jjo mp266462
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/6750/

103. By JuanJo Ciarlante

add unittest: test_update_rings_multiple_devs()

Revision history for this message
JuanJo Ciarlante (jjo) wrote :

FYI, added unittests at r103.

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_lint_check #7297 swift-proxy-next for jjo mp266462
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/7297/

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_unit_test #6751 swift-proxy-next for jjo mp266462
    UNIT FAIL: unit-test failed

UNIT Results (max last 2 lines):
make: *** [unit_test] Error 1
ERROR:root:Make target returned non-zero.

Full unit test output: http://paste.ubuntu.com/11969573/
Build: http://10.245.162.77:8080/job/charm_unit_test/6751/

104. By JuanJo Ciarlante

improve test_update_rings_multiple_devs() by comparing added devices with requested ones

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_lint_check #7298 swift-proxy-next for jjo mp266462
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/7298/

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_unit_test #6752 swift-proxy-next for jjo mp266462
    UNIT FAIL: unit-test failed

UNIT Results (max last 2 lines):
make: *** [unit_test] Error 1
ERROR:root:Make target returned non-zero.

Full unit test output: http://paste.ubuntu.com/11969743/
Build: http://10.245.162.77:8080/job/charm_unit_test/6752/

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_amulet_test #5509 swift-proxy-next for jjo mp266462
    AMULET OK: passed

Build: http://10.245.162.77:8080/job/charm_amulet_test/5509/

105. By JuanJo Ciarlante

add a basic-enough mock_ring class, to avoid the need for swift.common.ring library

Revision history for this message
JuanJo Ciarlante (jjo) wrote :

r105 should now pass both unittest, and amulet ones (already ok for the latter).

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_lint_check #7299 swift-proxy-next for jjo mp266462
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/7299/

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_unit_test #6753 swift-proxy-next for jjo mp266462
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/6753/

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_amulet_test #5533 swift-proxy-next for jjo mp266462
    AMULET OK: passed

Build: http://10.245.162.77:8080/job/charm_amulet_test/5533/

Revision history for this message
David Ames (thedac) wrote :

Juan Jo, I have superseded this MP with https://code.launchpad.net/~thedac/charms/trusty/swift-proxy/multiple-device-per-node/+merge/274192

I wanted to see a slightly different approach and it did not make sense to ask you to do it. I have merged your MP into mine so it is included for historical sake.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'hooks/swift_utils.py'
--- hooks/swift_utils.py 2015-03-26 18:37:57 +0000
+++ hooks/swift_utils.py 2015-07-30 23:13:39 +0000
@@ -398,13 +398,18 @@
398 _write_ring(ring, path)398 _write_ring(ring, path)
399399
400400
401def exists_in_ring(ring_path, node):401def exists_in_ring(ring_path, node, blockdev):
402 ring = _load_builder(ring_path).to_dict()402 ring = _load_builder(ring_path).to_dict()
403 node['port'] = ring_port(ring_path, node)403 node['port'] = ring_port(ring_path, node)
404 # Make a nodecopy dict, to add a 'device' key for the purpose
405 # of below comparison, as it doesn't have a single-valued 'device'
406 # but a list as e.g. 'devices': ['sdb', 'sdc', ...]
407 nodecopy = {k: v for k, v in node.items()}
408 nodecopy['device'] = blockdev
404409
405 for dev in ring['devs']:410 for dev in ring['devs']:
406 d = [(i, dev[i]) for i in dev if i in node and i != 'zone']411 d = [(i, dev[i]) for i in dev if i in nodecopy and i != 'zone']
407 n = [(i, node[i]) for i in node if i in dev and i != 'zone']412 n = [(i, nodecopy[i]) for i in nodecopy if i in dev and i != 'zone']
408 if sorted(d) == sorted(n):413 if sorted(d) == sorted(n):
409414
410 log('Node already exists in ring (%s).' % ring_path, level=INFO)415 log('Node already exists in ring (%s).' % ring_path, level=INFO)
@@ -812,10 +817,10 @@
812 balance_required = True817 balance_required = True
813818
814 if node_settings:819 if node_settings:
815 for dev in node_settings.get('devices', []):820 for blockdev in node_settings.get('devices', []):
816 for ring in SWIFT_RINGS.itervalues():821 for ring in SWIFT_RINGS.itervalues():
817 if not exists_in_ring(ring, node_settings):822 if not exists_in_ring(ring, node_settings, blockdev):
818 add_to_ring(ring, node_settings, dev)823 add_to_ring(ring, node_settings, blockdev)
819 balance_required = True824 balance_required = True
820825
821 if balance_required:826 if balance_required:
822827
=== modified file 'unit_tests/test_swift_utils.py'
--- unit_tests/test_swift_utils.py 2014-12-18 11:58:28 +0000
+++ unit_tests/test_swift_utils.py 2015-07-30 23:13:39 +0000
@@ -76,6 +76,77 @@
76 self.assertTrue(mock_set_min_hours.called)76 self.assertTrue(mock_set_min_hours.called)
77 self.assertTrue(mock_balance_rings.called)77 self.assertTrue(mock_balance_rings.called)
7878
79 @mock.patch('swift_utils._load_builder')
80 @mock.patch('swift_utils.initialize_ring')
81 @mock.patch('swift_utils.get_broker_token')
82 @mock.patch('swift_utils.update_www_rings')
83 @mock.patch('swift_utils.get_builders_checksum')
84 @mock.patch('swift_utils.get_rings_checksum')
85 @mock.patch('swift_utils.balance_rings')
86 @mock.patch('swift_utils.log')
87 @mock.patch('swift_utils.is_elected_leader')
88 def test_update_rings_multiple_devs(self,
89 mock_is_elected_leader,
90 mock_log, mock_balance_rings,
91 mock_get_rings_checksum,
92 mock_get_builders_checksum,
93 mock_update_www_rings,
94 mock_get_broker_token,
95 mock_initialize_ring,
96 mock_load_builder,
97 ):
98 # To avoid the need for swift.common.ring library, mock a basic
99 # rings dictionary, keyed by path.
100 # Each ring has enough logic to hold a dictionary with a single 'devs'
101 # key, which stores the list of passed dev(s) by add_dev().
102 #
103 # If swift (actual) ring representation diverges (see _load_builder),
104 # this mock will need to be adapted.
105 mock_rings = {}
106
107 def mock_load_builder_fn(path):
108 class mock_ring(object):
109 def __init__(self, path):
110 self.path = path
111
112 def to_dict(self):
113 return mock_rings[self.path]
114
115 def add_dev(self, dev):
116 mock_rings[self.path]['devs'].append(dev)
117 return mock_ring(path)
118
119 def mock_initialize_ring_fn(path, *args):
120 mock_rings.setdefault(path, {'devs': []})
121
122 mock_load_builder.side_effect = mock_load_builder_fn
123 mock_initialize_ring.side_effect = mock_initialize_ring_fn
124
125 init_ring_paths(tempfile.mkdtemp())
126 devices = ['sdb', 'sdc']
127 node_settings = {
128 'object_port': 6000,
129 'container_port': 6001,
130 'account_port': 6002,
131 'zone': 1,
132 'ip': '1.2.3.4',
133 'devices': devices
134 }
135 for path in swift_utils.SWIFT_RINGS.itervalues():
136 swift_utils.initialize_ring(path, 8, 3, 0)
137
138 # verify all devices added to each ring
139 swift_utils.update_rings(node_settings)
140 for path in swift_utils.SWIFT_RINGS.itervalues():
141 devs = swift_utils._load_builder(path).to_dict()['devs']
142 added_devices = [dev['device'] for dev in devs]
143 self.assertEqual(devices, added_devices)
144
145 # try re-adding, assert add_to_ring was not called
146 with mock.patch('swift_utils.add_to_ring') as mock_add_to_ring:
147 swift_utils.update_rings(node_settings)
148 self.assertFalse(mock_add_to_ring.called)
149
79 @mock.patch('swift_utils.get_broker_token')150 @mock.patch('swift_utils.get_broker_token')
80 @mock.patch('swift_utils.balance_rings')151 @mock.patch('swift_utils.balance_rings')
81 @mock.patch('swift_utils.log')152 @mock.patch('swift_utils.log')

Subscribers

People subscribed via source and target branches