~rackspace-titan/nova/cleanup_libvirt_images

« back to all changes in this revision

Viewing changes to nova/tests/api/openstack/test_limits.py

Adding OSAPI v1.1 limits resource

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
from xml.dom.minidom import parseString
29
29
 
30
30
from nova.api.openstack import limits
31
 
from nova.api.openstack.limits import Limit
32
31
 
33
32
 
34
33
TEST_LIMITS = [
35
 
    Limit("GET", "/delayed", "^/delayed", 1, limits.PER_MINUTE),
36
 
    Limit("POST", "*", ".*", 7, limits.PER_MINUTE),
37
 
    Limit("POST", "/servers", "^/servers", 3, limits.PER_MINUTE),
38
 
    Limit("PUT", "*", "", 10, limits.PER_MINUTE),
39
 
    Limit("PUT", "/servers", "^/servers", 5, limits.PER_MINUTE),
 
34
    limits.Limit("GET", "/delayed", "^/delayed", 1, limits.PER_MINUTE),
 
35
    limits.Limit("POST", "*", ".*", 7, limits.PER_MINUTE),
 
36
    limits.Limit("POST", "/servers", "^/servers", 3, limits.PER_MINUTE),
 
37
    limits.Limit("PUT", "*", "", 10, limits.PER_MINUTE),
 
38
    limits.Limit("PUT", "/servers", "^/servers", 5, limits.PER_MINUTE),
40
39
]
41
40
 
42
41
 
58
57
        return self.time
59
58
 
60
59
 
61
 
class LimitsControllerTest(BaseLimitTestSuite):
 
60
class LimitsControllerV10Test(BaseLimitTestSuite):
62
61
    """
63
 
    Tests for `limits.LimitsController` class.
 
62
    Tests for `limits.LimitsControllerV10` class.
64
63
    """
65
64
 
66
65
    def setUp(self):
67
66
        """Run before each test."""
68
67
        BaseLimitTestSuite.setUp(self)
69
 
        self.controller = limits.LimitsController()
 
68
        self.controller = limits.LimitsControllerV10()
70
69
 
71
70
    def _get_index_request(self, accept_header="application/json"):
72
71
        """Helper to set routing arguments."""
81
80
    def _populate_limits(self, request):
82
81
        """Put limit info into a request."""
83
82
        _limits = [
84
 
            Limit("GET", "*", ".*", 10, 60).display(),
85
 
            Limit("POST", "*", ".*", 5, 60 * 60).display(),
 
83
            limits.Limit("GET", "*", ".*", 10, 60).display(),
 
84
            limits.Limit("POST", "*", ".*", 5, 60 * 60).display(),
86
85
        ]
87
86
        request.environ["nova.limits"] = _limits
88
87
        return request
171
170
        self.assertEqual(expected.toxml(), body.toxml())
172
171
 
173
172
 
 
173
class LimitsControllerV11Test(BaseLimitTestSuite):
 
174
    """
 
175
    Tests for `limits.LimitsControllerV11` class.
 
176
    """
 
177
 
 
178
    def setUp(self):
 
179
        """Run before each test."""
 
180
        BaseLimitTestSuite.setUp(self)
 
181
        self.controller = limits.LimitsControllerV11()
 
182
 
 
183
    def _get_index_request(self, accept_header="application/json"):
 
184
        """Helper to set routing arguments."""
 
185
        request = webob.Request.blank("/")
 
186
        request.accept = accept_header
 
187
        request.environ["wsgiorg.routing_args"] = (None, {
 
188
            "action": "index",
 
189
            "controller": "",
 
190
        })
 
191
        return request
 
192
 
 
193
    def _populate_limits(self, request):
 
194
        """Put limit info into a request."""
 
195
        _limits = [
 
196
            limits.Limit("GET", "*", ".*", 10, 60).display(),
 
197
            limits.Limit("POST", "*", ".*", 5, 60 * 60).display(),
 
198
            limits.Limit("GET", "changes-since*", "changes-since",
 
199
                         5, 60).display(),
 
200
        ]
 
201
        request.environ["nova.limits"] = _limits
 
202
        return request
 
203
 
 
204
    def test_empty_index_json(self):
 
205
        """Test getting empty limit details in JSON."""
 
206
        request = self._get_index_request()
 
207
        response = request.get_response(self.controller)
 
208
        expected = {
 
209
            "limits": {
 
210
                "rate": [],
 
211
                "absolute": {},
 
212
            },
 
213
        }
 
214
        body = json.loads(response.body)
 
215
        self.assertEqual(expected, body)
 
216
 
 
217
    def test_index_json(self):
 
218
        """Test getting limit details in JSON."""
 
219
        request = self._get_index_request()
 
220
        request = self._populate_limits(request)
 
221
        response = request.get_response(self.controller)
 
222
        expected = {
 
223
            "limits": {
 
224
                "rate": [
 
225
                    {
 
226
                        "regex": ".*",
 
227
                        "uri": "*",
 
228
                        "limit": [
 
229
                            {
 
230
                                "verb": "GET",
 
231
                                "next-available": 0,
 
232
                                "unit": "MINUTE",
 
233
                                "value": 10,
 
234
                                "remaining": 10,
 
235
                            },
 
236
                            {
 
237
                                "verb": "POST",
 
238
                                "next-available": 0,
 
239
                                "unit": "HOUR",
 
240
                                "value": 5,
 
241
                                "remaining": 5,
 
242
                            },
 
243
                        ],
 
244
                    },
 
245
                    {
 
246
                        "regex": "changes-since",
 
247
                        "uri": "changes-since*",
 
248
                        "limit": [
 
249
                            {
 
250
                                "verb": "GET",
 
251
                                "next-available": 0,
 
252
                                "unit": "MINUTE",
 
253
                                "value": 5,
 
254
                                "remaining": 5,
 
255
                            },
 
256
                        ],
 
257
                    },
 
258
 
 
259
                ],
 
260
                "absolute": {},
 
261
            },
 
262
        }
 
263
        body = json.loads(response.body)
 
264
        self.assertEqual(expected, body)
 
265
 
 
266
 
174
267
class LimitMiddlewareTest(BaseLimitTestSuite):
175
268
    """
176
269
    Tests for the `limits.RateLimitingMiddleware` class.
185
278
        """Prepare middleware for use through fake WSGI app."""
186
279
        BaseLimitTestSuite.setUp(self)
187
280
        _limits = [
188
 
            Limit("GET", "*", ".*", 1, 60),
 
281
            limits.Limit("GET", "*", ".*", 1, 60),
189
282
        ]
190
283
        self.app = limits.RateLimitingMiddleware(self._empty_app, _limits)
191
284
 
238
331
 
239
332
    def test_GET_no_delay(self):
240
333
        """Test a limit handles 1 GET per second."""
241
 
        limit = Limit("GET", "*", ".*", 1, 1)
 
334
        limit = limits.Limit("GET", "*", ".*", 1, 1)
242
335
        delay = limit("GET", "/anything")
243
336
        self.assertEqual(None, delay)
244
337
        self.assertEqual(0, limit.next_request)
246
339
 
247
340
    def test_GET_delay(self):
248
341
        """Test two calls to 1 GET per second limit."""
249
 
        limit = Limit("GET", "*", ".*", 1, 1)
 
342
        limit = limits.Limit("GET", "*", ".*", 1, 1)
250
343
        delay = limit("GET", "/anything")
251
344
        self.assertEqual(None, delay)
252
345