1
# Copyright (C) 2009-2012 VMware, Inc. All Rights Reserved.
3
# Licensed under the Apache License, Version 2.0 (the "License"); you may
4
# not use this file except in compliance with the License. You may obtain
5
# a copy of the License at
7
# http://www.apache.org/licenses/LICENSE-2.0
9
# Unless required by applicable law or agreed to in writing, software
10
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
# License for the specific language governing permissions and limitations
19
from eventlet.green import urllib2
22
from neutron.i18n import _LI
23
from neutron.openstack.common import log as logging
24
from neutron.plugins.vmware.api_client import eventlet_client as client
25
from neutron.plugins.vmware.api_client import eventlet_request as request
26
from neutron.tests import base
27
from neutron.tests.unit import vmware
30
LOG = logging.getLogger(__name__)
37
return urllib2.urlopen(url).read()
40
class ApiRequestEventletTest(base.BaseTestCase):
44
super(ApiRequestEventletTest, self).setUp()
45
self.client = client.EventletApiClient(
46
[("127.0.0.1", 4401, True)], "admin", "admin")
47
self.url = "/ws.v1/_debug"
48
self.req = request.EventletApiRequest(self.client, self.url)
53
super(ApiRequestEventletTest, self).tearDown()
55
def test_construct_eventlet_api_request(self):
56
e = request.EventletApiRequest(self.client, self.url)
57
self.assertIsNotNone(e)
59
def test_apirequest_spawn(self):
61
eventlet.greenthread.sleep(random.random())
62
LOG.info(_LI('spawned: %d'), id)
65
request.EventletApiRequest._spawn(x, i)
67
def test_apirequest_start(self):
69
a = request.EventletApiRequest(
70
self.client, self.url)
71
a._handle_request = mock.Mock()
73
eventlet.greenthread.sleep(0.1)
74
LOG.info(_LI('_handle_request called: %s'),
75
a._handle_request.called)
76
request.EventletApiRequest.joinall()
78
def test_join_with_handle_request(self):
79
self.req._handle_request = mock.Mock()
82
self.assertTrue(self.req._handle_request.called)
84
def test_join_without_handle_request(self):
85
self.req._handle_request = mock.Mock()
87
self.assertFalse(self.req._handle_request.called)
92
'_api_client', '_url', '_method', '_body', '_headers',
93
'_http_timeout', '_request_timeout', '_retries',
94
'_redirects', '_auto_login']:
95
self.assertTrue(getattr(req, att) is getattr(self.req, att))
97
def test_request_error(self):
98
self.assertIsNone(self.req.request_error)
100
def test_run_and_handle_request(self):
101
self.req._request_timeout = None
102
self.req._handle_request = mock.Mock()
105
self.assertTrue(self.req._handle_request.called)
107
def test_run_and_timeout(self):
108
def my_handle_request():
109
LOG.info('my_handle_request() self: %s' % self.req)
110
LOG.info('my_handle_request() dir(self): %s' % dir(self.req))
111
eventlet.greenthread.sleep(REQUEST_TIMEOUT * 2)
113
with mock.patch.object(
116
new=my_handle_request
118
self.req._request_timeout = REQUEST_TIMEOUT
120
self.assertIsNone(self.req.join())
122
def prep_issue_request(self):
124
mysock.gettimeout.return_value = 4242
126
myresponse = mock.Mock()
127
myresponse.read.return_value = 'body'
128
myresponse.getheaders.return_value = 'headers'
129
myresponse.status = httplib.MOVED_PERMANENTLY
132
myconn.request.return_value = None
134
myconn.getresponse.return_value = myresponse
135
myconn.__str__ = mock.Mock()
136
myconn.__str__.return_value = 'myconn string'
139
req._redirect_params = mock.Mock()
140
req._redirect_params.return_value = (myconn, 'url')
141
req._request_str = mock.Mock()
142
req._request_str.return_value = 'http://cool/cool'
145
client.need_login = False
146
client._auto_login = False
147
client._auth_cookie = False
148
client.acquire_connection = mock.Mock()
149
client.acquire_connection.return_value = myconn
150
client.release_connection = mock.Mock()
152
return (mysock, myresponse, myconn)
154
def test_issue_request_trigger_exception(self):
155
(mysock, myresponse, myconn) = self.prep_issue_request()
156
self.client.acquire_connection.return_value = None
158
self.req._issue_request()
159
self.assertIsInstance(self.req._request_error, Exception)
160
self.assertTrue(self.client.acquire_connection.called)
162
def test_issue_request_handle_none_sock(self):
163
(mysock, myresponse, myconn) = self.prep_issue_request()
166
self.assertIsNone(self.req.join())
167
self.assertTrue(self.client.acquire_connection.called)
169
def test_issue_request_exceed_maximum_retries(self):
170
(mysock, myresponse, myconn) = self.prep_issue_request()
172
self.assertIsNone(self.req.join())
173
self.assertTrue(self.client.acquire_connection.called)
175
def test_issue_request_trigger_non_redirect(self):
176
(mysock, myresponse, myconn) = self.prep_issue_request()
177
myresponse.status = httplib.OK
179
self.assertIsNone(self.req.join())
180
self.assertTrue(self.client.acquire_connection.called)
182
def test_issue_request_trigger_internal_server_error(self):
183
(mysock, myresponse, myconn) = self.prep_issue_request()
184
self.req._redirect_params.return_value = (myconn, None)
186
self.assertIsNone(self.req.join())
187
self.assertTrue(self.client.acquire_connection.called)
189
def test_redirect_params_break_on_location(self):
191
(conn, retval) = self.req._redirect_params(
192
myconn, [('location', None)])
193
self.assertIsNone(retval)
195
def test_redirect_params_parse_a_url(self):
197
(conn, retval) = self.req._redirect_params(
198
myconn, [('location', '/path/a/b/c')])
199
self.assertIsNotNone(retval)
201
def test_redirect_params_invalid_redirect_location(self):
203
(conn, retval) = self.req._redirect_params(
204
myconn, [('location', '+path/a/b/c')])
205
self.assertIsNone(retval)
207
def test_redirect_params_invalid_scheme(self):
209
(conn, retval) = self.req._redirect_params(
210
myconn, [('location', 'invalidscheme://hostname:1/path')])
211
self.assertIsNone(retval)
213
def test_redirect_params_setup_https_with_cooki(self):
214
with mock.patch(vmware.CLIENT_NAME) as mock_client:
215
api_client = mock_client.return_value
216
self.req._api_client = api_client
218
(conn, retval) = self.req._redirect_params(
219
myconn, [('location', 'https://host:1/path')])
221
self.assertIsNotNone(retval)
222
self.assertTrue(api_client.acquire_redirect_connection.called)
224
def test_redirect_params_setup_htttps_and_query(self):
225
with mock.patch(vmware.CLIENT_NAME) as mock_client:
226
api_client = mock_client.return_value
227
self.req._api_client = api_client
229
(conn, retval) = self.req._redirect_params(myconn, [
230
('location', 'https://host:1/path?q=1')])
232
self.assertIsNotNone(retval)
233
self.assertTrue(api_client.acquire_redirect_connection.called)
235
def test_redirect_params_setup_https_connection_no_cookie(self):
236
with mock.patch(vmware.CLIENT_NAME) as mock_client:
237
api_client = mock_client.return_value
238
self.req._api_client = api_client
240
(conn, retval) = self.req._redirect_params(myconn, [
241
('location', 'https://host:1/path')])
243
self.assertIsNotNone(retval)
244
self.assertTrue(api_client.acquire_redirect_connection.called)
246
def test_redirect_params_setup_https_and_query_no_cookie(self):
247
with mock.patch(vmware.CLIENT_NAME) as mock_client:
248
api_client = mock_client.return_value
249
self.req._api_client = api_client
251
(conn, retval) = self.req._redirect_params(
252
myconn, [('location', 'https://host:1/path?q=1')])
253
self.assertIsNotNone(retval)
254
self.assertTrue(api_client.acquire_redirect_connection.called)
256
def test_redirect_params_path_only_with_query(self):
257
with mock.patch(vmware.CLIENT_NAME) as mock_client:
258
api_client = mock_client.return_value
259
api_client.wait_for_login.return_value = None
260
api_client.auth_cookie = None
261
api_client.acquire_connection.return_value = True
263
(conn, retval) = self.req._redirect_params(myconn, [
264
('location', '/path?q=1')])
265
self.assertIsNotNone(retval)
267
def test_handle_request_auto_login(self):
268
self.req._auto_login = True
269
self.req._api_client = mock.Mock()
270
self.req._api_client.need_login = True
271
self.req._request_str = mock.Mock()
272
self.req._request_str.return_value = 'http://cool/cool'
273
self.req.spawn = mock.Mock()
274
self.req._handle_request()
276
def test_handle_request_auto_login_unauth(self):
277
self.req._auto_login = True
278
self.req._api_client = mock.Mock()
279
self.req._api_client.need_login = True
280
self.req._request_str = mock.Mock()
281
self.req._request_str.return_value = 'http://cool/cool'
284
resp = httplib.HTTPResponse(socket.socket())
285
resp.status = httplib.UNAUTHORIZED
286
mywaiter = mock.Mock()
287
mywaiter.wait = mock.Mock()
288
mywaiter.wait.return_value = resp
289
self.req.spawn = mock.Mock(return_value=mywaiter)
290
self.req._handle_request()
292
def test_construct_eventlet_login_request(self):
293
r = request.LoginRequestEventlet(self.client, 'user', 'password')
294
self.assertIsNotNone(r)
296
def test_session_cookie_session_cookie_retrieval(self):
297
r = request.LoginRequestEventlet(self.client, 'user', 'password')
298
r.successful = mock.Mock()
299
r.successful.return_value = True
300
r.value = mock.Mock()
301
r.value.get_header = mock.Mock()
302
r.value.get_header.return_value = 'cool'
303
self.assertIsNotNone(r.session_cookie())
305
def test_session_cookie_not_retrieved(self):
306
r = request.LoginRequestEventlet(self.client, 'user', 'password')
307
r.successful = mock.Mock()
308
r.successful.return_value = False
309
r.value = mock.Mock()
310
r.value.get_header = mock.Mock()
311
r.value.get_header.return_value = 'cool'
312
self.assertIsNone(r.session_cookie())
314
def test_construct_eventlet_get_api_providers_request(self):
315
r = request.GetApiProvidersRequestEventlet(self.client)
316
self.assertIsNotNone(r)
318
def test_api_providers_none_api_providers(self):
319
r = request.GetApiProvidersRequestEventlet(self.client)
320
r.successful = mock.Mock(return_value=False)
321
self.assertIsNone(r.api_providers())
323
def test_api_providers_non_none_api_providers(self):
324
r = request.GetApiProvidersRequestEventlet(self.client)
325
r.value = mock.Mock()
329
{ "role": "api_provider",
330
"listen_addr": "pssl:1.1.1.1:1" }]}]}"""
331
r.successful = mock.Mock(return_value=True)
332
LOG.info('%s' % r.api_providers())
333
self.assertIsNotNone(r.api_providers())