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:*'), ])
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:*'), ])
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), ])
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), ])
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, ), ])
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, ), ])
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:*'), ])