def test_bad_add(self):
        base = {
            'replicas': 3, 'part_power': 8, 'random_seed': 123, 'overload': 0}

        # no dev
        busted = dict(base, rounds=[[['add']]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))

        # no weight
        busted = dict(base, rounds=[[['add', 'r1z2-1.2.3.4:6200/d7']]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))

        # too many fields
        busted = dict(base, rounds=[[['add', 'r1z2-1.2.3.4:6200/d7', 1, 2]]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))

        # can't parse
        busted = dict(base, rounds=[[['add', 'not a good value', 100]]])
        # N.B. the ValueError's coming out of ring.utils.parse_add_value
        # are already pretty good
        expected = "Invalid device specifier (round 0, command 0): " \
            "Invalid add value: not a good value"
        try:
            parse_scenario(json.dumps(busted))
        except ValueError as err:
            self.assertEqual(str(err), expected)

        # negative weight
        busted = dict(base, rounds=[[['add', 'r1z2-1.2.3.4:6200/d7', -1]]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))
    def test_bad_set_weight(self):
        base = {
            'replicas': 3, 'part_power': 8, 'random_seed': 123, 'overload': 0}

        # no dev
        busted = dict(base, rounds=[[['set_weight']]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))

        # no weight
        busted = dict(base, rounds=[[['set_weight', 0]]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))

        # bad dev id
        busted = dict(base, rounds=[[['set_weight', 'not an int', 90]]])
        expected = "Invalid device ID in set_weight (round 0, command 0): " \
            "invalid literal for int() with base 10: 'not an int'"
        try:
            parse_scenario(json.dumps(busted))
        except ValueError as e:
            self.assertEqual(str(e), expected)

        # negative weight
        busted = dict(base, rounds=[[['set_weight', 1, -1]]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))

        # bogus weight
        busted = dict(base, rounds=[[['set_weight', 1, 'bogus']]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))
    def test_bad_set_weight(self):
        base = {
            'replicas': 3,
            'part_power': 8,
            'random_seed': 123,
            'overload': 0
        }

        # no dev
        busted = dict(base, rounds=[[['set_weight']]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))

        # no weight
        busted = dict(base, rounds=[[['set_weight', 0]]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))

        # bad dev id
        busted = dict(base, rounds=[[['set_weight', 'not an int', 90]]])
        expected = "Invalid device ID in set_weight (round 0, command 0): " \
            "invalid literal for int() with base 10: 'not an int'"
        try:
            parse_scenario(json.dumps(busted))
        except ValueError as e:
            self.assertEqual(str(e), expected)

        # negative weight
        busted = dict(base, rounds=[[['set_weight', 1, -1]]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))

        # bogus weight
        busted = dict(base, rounds=[[['set_weight', 1, 'bogus']]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))
    def test_bad_add(self):
        base = {
            'replicas': 3,
            'part_power': 8,
            'random_seed': 123,
            'overload': 0
        }

        # no dev
        busted = dict(base, rounds=[[['add']]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))

        # no weight
        busted = dict(base, rounds=[[['add', 'r1z2-1.2.3.4:6000/d7']]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))

        # too many fields
        busted = dict(base, rounds=[[['add', 'r1z2-1.2.3.4:6000/d7', 1, 2]]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))

        # can't parse
        busted = dict(base, rounds=[[['add', 'not a good value', 100]]])
        # N.B. the ValueError's coming out of ring.utils.parse_add_value
        # are already pretty good
        expected = "Invalid device specifier (round 0, command 0): " \
            "Invalid add value: not a good value"
        try:
            parse_scenario(json.dumps(busted))
        except ValueError as err:
            self.assertEqual(str(err), expected)

        # negative weight
        busted = dict(base, rounds=[[['add', 'r1z2-1.2.3.4:6000/d7', -1]]])
        self.assertRaises(ValueError, parse_scenario, json.dumps(busted))
    def test_good(self):
        scenario = {
            'replicas': 3, 'part_power': 8, 'random_seed': 123, 'overload': 0,
            'rounds': [[['add', 'r1z2-3.4.5.6:7/sda8', 100],
                        ['add', 'z2-3.4.5.6:7/sda9', 200]],
                       [['set_weight', 0, 150]],
                       [['remove', 1]]]}
        parsed = parse_scenario(json.dumps(scenario))

        self.assertEqual(parsed['replicas'], 3)
        self.assertEqual(parsed['part_power'], 8)
        self.assertEqual(parsed['random_seed'], 123)
        self.assertEqual(parsed['overload'], 0)
        self.assertEqual(parsed['rounds'], [
            [['add', {'device': 'sda8',
                      'ip': '3.4.5.6',
                      'meta': '',
                      'port': 7,
                      'region': 1,
                      'replication_ip': '3.4.5.6',
                      'replication_port': 7,
                      'weight': 100.0,
                      'zone': 2}],
             ['add', {'device': u'sda9',
                      'ip': u'3.4.5.6',
                      'meta': '',
                      'port': 7,
                      'region': 1,
                      'replication_ip': '3.4.5.6',
                      'replication_port': 7,
                      'weight': 200.0,
                      'zone': 2}]],
            [['set_weight', 0, 150.0]],
            [['remove', 1]]])
    def test_it_runs(self, tempdir):
        builder_path = os.path.join(tempdir, 'test.builder')
        scenario = {
            'replicas':
            3,
            'part_power':
            8,
            'random_seed':
            123,
            'overload':
            0,
            'rounds': [[['add', 'r1z2-3.4.5.6:7/sda8', 100],
                        ['add', 'z2-3.4.5.6:7/sda9', 200],
                        ['add', 'z2-3.4.5.6:7/sda10', 200],
                        ['add', 'z2-3.4.5.6:7/sda11', 200]],
                       [['set_weight', 0, 150]], [['remove', 1]],
                       [['save', builder_path]]]
        }
        parsed = parse_scenario(json.dumps(scenario))

        fake_stdout = StringIO()
        with mock.patch('sys.stdout', fake_stdout):
            run_scenario(parsed)

        # Just test that it produced some output as it ran; the fact that
        # this doesn't crash and produces output that resembles something
        # useful is good enough.
        self.assertTrue('Rebalance' in fake_stdout.getvalue())
        self.assertTrue(os.path.exists(builder_path))
Beispiel #7
0
    def test_good(self):
        scenario = {
            'replicas': 3, 'part_power': 8, 'random_seed': 123, 'overload': 0,
            'rounds': [[['add', 'r1z2-3.4.5.6:7/sda8', 100],
                        ['add', 'z2-3.4.5.6:7/sda9', 200]],
                       [['set_weight', 0, 150]],
                       [['remove', 1]]]}
        parsed = parse_scenario(json.dumps(scenario))

        self.assertEqual(parsed['replicas'], 3)
        self.assertEqual(parsed['part_power'], 8)
        self.assertEqual(parsed['random_seed'], 123)
        self.assertEqual(parsed['overload'], 0)
        self.assertEqual(parsed['rounds'], [
            [['add', {'device': 'sda8',
                      'ip': '3.4.5.6',
                      'meta': '',
                      'port': 7,
                      'region': 1,
                      'replication_ip': '3.4.5.6',
                      'replication_port': 7,
                      'weight': 100.0,
                      'zone': 2}],
             ['add', {'device': u'sda9',
                      'ip': u'3.4.5.6',
                      'meta': '',
                      'port': 7,
                      'region': 1,
                      'replication_ip': '3.4.5.6',
                      'replication_port': 7,
                      'weight': 200.0,
                      'zone': 2}]],
            [['set_weight', 0, 150.0]],
            [['remove', 1]]])
    def test_it_runs(self):
        scenario = {
            'replicas': 3, 'part_power': 8, 'random_seed': 123, 'overload': 0,
            'rounds': [[['add', 'r1z2-3.4.5.6:7/sda8', 100],
                        ['add', 'z2-3.4.5.6:7/sda9', 200]],
                       [['set_weight', 0, 150]],
                       [['remove', 1]]]}
        parsed = parse_scenario(json.dumps(scenario))

        fake_stdout = StringIO()
        with mock.patch('sys.stdout', fake_stdout):
            run_scenario(parsed)

        # Just test that it produced some output as it ran; the fact that
        # this doesn't crash and produces output that resembles something
        # useful is good enough.
        self.assertTrue('Rebalance' in fake_stdout.getvalue())