ring-builder: require part_power>=0, give better error messages

Closes-Bug: #1697860
Change-Id: I500a86de390b24b9d08a478d695a7d62c447e779
This commit is contained in:
Tim Burke
2023-02-17 13:47:53 -08:00
parent 8778b2c132
commit 7f5576d3e6
3 changed files with 14 additions and 1 deletions

View File

@@ -544,7 +544,11 @@ swift-ring-builder <builder_file> create <part_power> <replicas>
if len(argv) < 6:
print(Commands.create.__doc__.strip())
exit(EXIT_ERROR)
builder = RingBuilder(int(argv[3]), float(argv[4]), int(argv[5]))
try:
builder = RingBuilder(int(argv[3]), float(argv[4]), int(argv[5]))
except ValueError as e:
print(e)
exit(EXIT_ERROR)
backup_dir = pathjoin(dirname(builder_file), 'backups')
try:
mkdir(backup_dir)

View File

@@ -87,6 +87,9 @@ class RingBuilder(object):
if part_power > 32:
raise ValueError("part_power must be at most 32 (was %d)"
% (part_power,))
if part_power < 0:
raise ValueError("part_power must be at least 0 (was %d)"
% (part_power,))
if replicas < 1:
raise ValueError("replicas must be at least 1 (was %.6f)"
% (replicas,))

View File

@@ -85,6 +85,12 @@ class TestRingBuilder(unittest.TestCase):
ring.RingBuilder(33, 3, 1)
self.assertEqual(str(ctx.exception), expected_msg)
def test_oversmall_part_powers(self):
expected_msg = 'part_power must be at least 0 (was -1)'
with self.assertRaises(ValueError) as ctx:
ring.RingBuilder(-1, 3, 1)
self.assertEqual(str(ctx.exception), expected_msg)
def test_insufficient_replicas(self):
expected_msg = 'replicas must be at least 1 (was 0.999000)'
with self.assertRaises(ValueError) as ctx: