diff --git a/swift/cli/ringbuilder.py b/swift/cli/ringbuilder.py index 5ab6a6f3aa..001919d520 100644 --- a/swift/cli/ringbuilder.py +++ b/swift/cli/ringbuilder.py @@ -544,7 +544,11 @@ swift-ring-builder create 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) diff --git a/swift/common/ring/builder.py b/swift/common/ring/builder.py index e64fe40898..91845070ef 100644 --- a/swift/common/ring/builder.py +++ b/swift/common/ring/builder.py @@ -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,)) diff --git a/test/unit/common/ring/test_builder.py b/test/unit/common/ring/test_builder.py index 74e8acaae3..e1b57be9ee 100644 --- a/test/unit/common/ring/test_builder.py +++ b/test/unit/common/ring/test_builder.py @@ -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: