15
15
# License for the specific language governing permissions and limitations
16
16
# under the License.
20
from nova.api.openstack import limited
21
from nova.api.openstack import RateLimitingMiddleware
22
from nova.tests.api.fakes import APIStub
21
from nova import context
22
from nova import flags
23
from nova.api.openstack.ratelimiting import RateLimitingMiddleware
24
from nova.api.openstack.common import limited
25
from nova.tests.api.openstack import fakes
23
26
from webob import Request
26
36
class RateLimitingMiddlewareTest(unittest.TestCase):
28
38
def test_get_action_name(self):
29
middleware = RateLimitingMiddleware(APIStub())
39
middleware = RateLimitingMiddleware(simple_wsgi)
31
41
def verify(method, url, action_name):
32
42
req = Request.blank(url)
46
56
def exhaust(self, middleware, method, url, username, times):
47
57
req = Request.blank(url, dict(REQUEST_METHOD=method),
48
58
headers={'X-Auth-User': username})
59
req.environ['nova.context'] = context.RequestContext(username,
49
61
for i in range(times):
50
62
resp = req.get_response(middleware)
51
63
self.assertEqual(resp.status_int, 200)
54
66
self.assertTrue('Retry-After' in resp.headers)
56
68
def test_single_action(self):
57
middleware = RateLimitingMiddleware(APIStub())
69
middleware = RateLimitingMiddleware(simple_wsgi)
58
70
self.exhaust(middleware, 'DELETE', '/servers/4', 'usr1', 100)
59
71
self.exhaust(middleware, 'DELETE', '/servers/4', 'usr2', 100)
61
73
def test_POST_servers_action_implies_POST_action(self):
62
middleware = RateLimitingMiddleware(APIStub())
74
middleware = RateLimitingMiddleware(simple_wsgi)
63
75
self.exhaust(middleware, 'POST', '/servers/4', 'usr1', 10)
64
76
self.exhaust(middleware, 'POST', '/images/4', 'usr2', 10)
65
self.assertTrue(set(middleware.limiter._levels) ==
77
self.assertTrue(set(middleware.limiter._levels) == \
66
78
set(['usr1:POST', 'usr1:POST servers', 'usr2:POST']))
68
80
def test_POST_servers_action_correctly_ratelimited(self):
69
middleware = RateLimitingMiddleware(APIStub())
81
middleware = RateLimitingMiddleware(simple_wsgi)
70
82
# Use up all of our "POST" allowance for the minute, 5 times
72
84
self.exhaust(middleware, 'POST', '/servers/4', 'usr1', 10)
76
88
self.exhaust(middleware, 'POST', '/servers/4', 'usr1', 0)
78
90
def test_proxy_ctor_works(self):
79
middleware = RateLimitingMiddleware(APIStub())
91
middleware = RateLimitingMiddleware(simple_wsgi)
80
92
self.assertEqual(middleware.limiter.__class__.__name__, "Limiter")
81
middleware = RateLimitingMiddleware(APIStub(), service_host='foobar')
93
middleware = RateLimitingMiddleware(simple_wsgi, service_host='foobar')
82
94
self.assertEqual(middleware.limiter.__class__.__name__, "WSGIAppProxy")