Пример #1
0
    def test_configured_class(self):
        db = FakeDatabase({'limit-class:spam': 'lim_class'})
        midware = FakeMiddleware(db, [])
        environ = {
            'nova.context': FakeObject(project_id='spam'),
            }
        nova_limits.nova_preprocess(midware, environ)

        self.assertEqual(environ['turnstile.nova.tenant'], 'spam')
        self.assertEqual(environ['turnstile.nova.limitclass'], 'lim_class')
        self.assertEqual(environ['nova.limits'], [])
        self.assertEqual(db.actions, [
                ('get', 'limit-class:spam'),
                ('keys', 'bucket:*'),
                ])
Пример #2
0
    def test_basic(self):
        db = FakeDatabase()
        midware = FakeMiddleware(db, [])
        environ = {}
        nova_limits.nova_preprocess(midware, environ)

        self.assertEqual(environ, {
                'turnstile.nova.tenant': '<NONE>',
                'turnstile.nova.limitclass': 'default',
                'nova.limits': [],
                })
        self.assertEqual(db.actions, [
                ('get', 'limit-class:<NONE>'),
                ('keys', 'bucket:*'),
                ])
Пример #3
0
    def test_basic(self, mock_time):
        db = mock.Mock(**{'get.return_value': None})
        midware = mock.Mock(db=db)
        environ = {}

        nova_limits.nova_preprocess(midware, environ)

        self.assertDictContainsSubset({
            'turnstile.nova.tenant': '<NONE>',
            'turnstile.nova.limitclass': 'default',
            'turnstile.bucket_set': 'bucket_set:<NONE>',
        }, environ)
        db.assert_has_calls([
            mock.call.get('limit-class:<NONE>'),
            mock.call.zremrangebyscore('bucket_set:<NONE>', 0, 1000000.0),
        ])
Пример #4
0
    def test_configured_class(self, mock_time):
        db = mock.Mock(**{'get.return_value': 'lim_class'})
        midware = mock.Mock(db=db)
        environ = {
            'nova.context': mock.Mock(project_id='spam', spec=['project_id']),
        }

        nova_limits.nova_preprocess(midware, environ)

        self.assertDictContainsSubset({
            'turnstile.nova.tenant': 'spam',
            'turnstile.nova.limitclass': 'lim_class',
            'turnstile.bucket_set': 'bucket_set:spam',
        }, environ)
        db.assert_has_calls([
            mock.call.get('limit-class:spam'),
            mock.call.zremrangebyscore('bucket_set:spam', 0, 1000000.0),
        ])
Пример #5
0
    def test_filter_by_tenant(self):
        db = FakeDatabase({
                'limit-class:spam': 'lim_class',
                'limit-class:foo': 'lim_class',
                'bucket:uuid/{"tenant": "foo"}': dict(
                    messages=3,
                    expire=999999999,
                    ),
                'bucket:uuid/{"tenant": "spam"}': dict(
                    messages=0,
                    expire=1000000005,
                    ),
                }, 'bucket:uuid4/{"param": "baz"}', 'bucket:uuid6')
        midware = FakeMiddleware(db, [
                FakeLimit(
                    uuid='uuid',
                    queries=[],
                    verbs=['GET'],
                    unit='minute',
                    uri='/{tenant}/{uri}',
                    value=5),
                ])
        environ = {
            'nova.context': FakeObject(project_id='spam'),
            }
        nova_limits.nova_preprocess(midware, environ)

        self.assertEqual(environ['turnstile.nova.tenant'], 'spam')
        self.assertEqual(environ['turnstile.nova.limitclass'], 'lim_class')
        self.assertEqual(environ['nova.limits'], [
                dict(
                    verb='GET',
                    URI='/spam/{uri}',
                    regex='/spam/{uri}',
                    value=5,
                    unit='MINUTE',
                    remaining=0,
                    resetTime=1000000005,
                    ),
                ])
Пример #6
0
    def test_limits_with_buckets(self):
        db = FakeDatabase({
                'limit-class:spam': 'lim_class',
                'bucket:uuid': dict(
                    messages=2,
                    expire=1000000001,
                    ),
                'bucket:uuid2/{"unused": "foo"}': dict(
                    messages=5,
                    expire=999999999,
                    ),
                'bucket:uuid3/{"param": "foo"}': dict(
                    messages=10,
                    expire=1000000005,
                    ),
                'bucket:uuid3/{"param": "bar"}': dict(
                    messages=5,
                    expire=1000000001,
                    ),
                }, 'bucket:uuid4/{"param": "baz"}', 'bucket:uuid6')
        midware = FakeMiddleware(db, [
                FakeLimit(
                    uuid='uuid',
                    queries=[],
                    verbs=['GET'],
                    unit='minute',
                    uri='/spam/{uri}',
                    value=7),
                FakeLimit(
                    uuid='uuid2',
                    queries=[],
                    verbs=['GET'],
                    unit='minute',
                    uri='/spam/{uri2}/{used}',
                    value=20),
                FakeLimit(
                    uuid='uuid3',
                    queries=[],
                    verbs=['GET'],
                    unit='minute',
                    uri='/spam/{uri3}/{param}',
                    value=50),
                FakeLimit(
                    uuid='uuid4',
                    queries=[],
                    verbs=['GET'],
                    unit='minute',
                    uri='/spam/{uri4}/{param}',
                    value=50),
                FakeLimit(
                    uuid='uuid5',
                    queries=[],
                    verbs=['GET'],
                    unit='minute',
                    uri='/spam/{uri5}',
                    value=10),
                ])
        environ = {
            'nova.context': FakeObject(project_id='spam'),
            }
        nova_limits.nova_preprocess(midware, environ)

        self.assertEqual(environ['turnstile.nova.tenant'], 'spam')
        self.assertEqual(environ['turnstile.nova.limitclass'], 'lim_class')
        self.assertEqual(environ['nova.limits'], [
                dict(
                    verb='GET',
                    URI='/spam/{uri}',
                    regex='/spam/{uri}',
                    value=7,
                    unit='MINUTE',
                    remaining=2,
                    resetTime=1000000001,
                    ),
                dict(
                    verb='GET',
                    URI='/spam/{uri2}/{used}',
                    regex='/spam/{uri2}/{used}',
                    value=20,
                    unit='MINUTE',
                    remaining=5,
                    resetTime=999999999,
                    ),
                dict(
                    verb='GET',
                    URI='/spam/{uri3}/foo',
                    regex='/spam/{uri3}/foo',
                    value=50,
                    unit='MINUTE',
                    remaining=10,
                    resetTime=1000000005,
                    ),
                dict(
                    verb='GET',
                    URI='/spam/{uri3}/bar',
                    regex='/spam/{uri3}/bar',
                    value=50,
                    unit='MINUTE',
                    remaining=5,
                    resetTime=1000000001,
                    ),
                dict(
                    verb='GET',
                    URI='/spam/{uri3}/{param}',
                    regex='/spam/{uri3}/{param}',
                    value=50,
                    unit='MINUTE',
                    remaining=5,
                    resetTime=1000000005,
                    ),
                dict(
                    verb='GET',
                    URI='/spam/{uri4}/{param}',
                    regex='/spam/{uri4}/{param}',
                    value=50,
                    unit='MINUTE',
                    remaining=50,
                    resetTime=1000000000,
                    ),
                dict(
                    verb='GET',
                    URI='/spam/{uri5}',
                    regex='/spam/{uri5}',
                    value=10,
                    unit='MINUTE',
                    remaining=10,
                    resetTime=1000000000,
                    ),
                ])
Пример #7
0
    def test_limits(self):
        db = FakeDatabase({'limit-class:spam': 'lim_class'})
        midware = FakeMiddleware(db, [
                FakeObject(
                    uuid='uuid',
                    queries=[],
                    verbs=['GET', 'PUT'],
                    unit='minute',
                    uri='/spam/uri',
                    value=23),
                FakeObject(
                    uuid='uuid2',
                    queries=[],
                    verbs=[],
                    unit='second',
                    uri='/spam/uri2',
                    value=18),
                FakeObject(
                    uuid='uuid3',
                    rate_class='spam',
                    queries=[],
                    verbs=['GET'],
                    unit='hour',
                    uri='/spam/uri3',
                    value=17),
                FakeObject(
                    uuid='uuid4',
                    rate_class='lim_class',
                    queries=[],
                    verbs=['GET'],
                    unit='day',
                    uri='/spam/uri4',
                    value=1),
                FakeObject(
                    uuid='uuid5',
                    queries=[],
                    verbs=['GET'],
                    unit='1234',
                    uri='/spam/uri5',
                    value=183),
                FakeObject(
                    uuid='uuid6',
                    queries=['bravo', 'alfa'],
                    verbs=['GET'],
                    unit='day',
                    uri='/spam/uri6',
                    value=1),
                ])
        environ = {
            'nova.context': FakeObject(project_id='spam'),
            }
        nova_limits.nova_preprocess(midware, environ)

        self.assertEqual(environ['turnstile.nova.tenant'], 'spam')
        self.assertEqual(environ['turnstile.nova.limitclass'], 'lim_class')
        self.assertEqual(environ['nova.limits'], [
                dict(
                    verb='GET',
                    URI='/spam/uri',
                    regex='/spam/uri',
                    value=23,
                    unit='MINUTE',
                    remaining=23,
                    resetTime=1000000000,
                    ),
                dict(
                    verb='PUT',
                    URI='/spam/uri',
                    regex='/spam/uri',
                    value=23,
                    unit='MINUTE',
                    remaining=23,
                    resetTime=1000000000,
                    ),
                dict(
                    verb='GET',
                    URI='/spam/uri2',
                    regex='/spam/uri2',
                    value=18,
                    unit='SECOND',
                    remaining=18,
                    resetTime=1000000000,
                    ),
                dict(
                    verb='HEAD',
                    URI='/spam/uri2',
                    regex='/spam/uri2',
                    value=18,
                    unit='SECOND',
                    remaining=18,
                    resetTime=1000000000,
                    ),
                dict(
                    verb='POST',
                    URI='/spam/uri2',
                    regex='/spam/uri2',
                    value=18,
                    unit='SECOND',
                    remaining=18,
                    resetTime=1000000000,
                    ),
                dict(
                    verb='PUT',
                    URI='/spam/uri2',
                    regex='/spam/uri2',
                    value=18,
                    unit='SECOND',
                    remaining=18,
                    resetTime=1000000000,
                    ),
                dict(
                    verb='DELETE',
                    URI='/spam/uri2',
                    regex='/spam/uri2',
                    value=18,
                    unit='SECOND',
                    remaining=18,
                    resetTime=1000000000,
                    ),
                dict(
                    verb='GET',
                    URI='/spam/uri4',
                    regex='/spam/uri4',
                    value=1,
                    unit='DAY',
                    remaining=1,
                    resetTime=1000000000,
                    ),
                dict(
                    verb='GET',
                    URI='/spam/uri5',
                    regex='/spam/uri5',
                    value=183,
                    unit='UNKNOWN',
                    remaining=183,
                    resetTime=1000000000,
                    ),
                dict(
                    verb='GET',
                    URI='/spam/uri6?alfa={alfa}&bravo={bravo}',
                    regex='/spam/uri6?alfa={alfa}&bravo={bravo}',
                    value=1,
                    unit='DAY',
                    remaining=1,
                    resetTime=1000000000,
                    ),
                ])
        self.assertEqual(db.actions, [
                ('get', 'limit-class:spam'),
                ('keys', 'bucket:*'),
                ])