LOG.debug(_("Request: %s"), req)
try:
return self._proxy_request(req.remote_addr,
+ req.method,
req.path_info,
- req.query_string)
+ req.query_string,
+ req.body)
except Exception:
LOG.exception(_("Unexpected error."))
msg = _('An unknown error has occurred. '
'Please try your request again.')
return webob.exc.HTTPInternalServerError(explanation=unicode(msg))
- def _proxy_request(self, remote_address, path_info, query_string):
+ def _proxy_request(self, remote_address, method, path_info,
+ query_string, body):
headers = {
'X-Forwarded-For': remote_address,
}
h = httplib2.Http()
resp, content = h.request(
url,
+ method=method,
headers=headers,
+ body=body,
connection_type=UnixDomainHTTPConnection)
if resp.status == 200:
return content
elif resp.status == 404:
return webob.exc.HTTPNotFound()
+ elif resp.status == 409:
+ return webob.exc.HTTPConflict()
elif resp.status == 500:
msg = _(
'Remote metadata server experienced an internal server error.'
self._get_instance_id_helper(headers, ports, networks=['the_id'])
)
- def _proxy_request_test_helper(self, response_code):
+ def _proxy_request_test_helper(self, response_code=200, method='GET'):
hdrs = {'X-Forwarded-For': '8.8.8.8'}
- req = mock.Mock(path_info='/the_path', query_string='', headers=hdrs)
+ body = 'body'
+
+ req = mock.Mock(path_info='/the_path', query_string='', headers=hdrs,
+ method=method, body=body)
resp = mock.Mock(status=response_code)
with mock.patch.object(self.handler, '_sign_instance_id') as sign:
sign.return_value = 'signed'
mock_http.assert_has_calls([
mock.call().request(
'http://9.9.9.9:8775/the_path',
+ method=method,
headers={
'X-Forwarded-For': '8.8.8.8',
'X-Instance-ID-Signature': 'signed',
'X-Instance-ID': 'the_id'
- }
+ },
+ body=body
)]
)
return retval
+ def test_proxy_request_post(self):
+ self.assertEqual('content',
+ self._proxy_request_test_helper(method='POST'))
+
def test_proxy_request_200(self):
self.assertEqual('content', self._proxy_request_test_helper(200))
self.assertIsInstance(self._proxy_request_test_helper(404),
webob.exc.HTTPNotFound)
+ def test_proxy_request_409(self):
+ self.assertIsInstance(self._proxy_request_test_helper(409),
+ webob.exc.HTTPConflict)
+
def test_proxy_request_500(self):
self.assertIsInstance(self._proxy_request_test_helper(500),
webob.exc.HTTPInternalServerError)
retval = self.handler(req)
self.assertEqual(retval, 'value')
proxy_req.assert_called_once_with(req.remote_addr,
+ req.method,
req.path_info,
- req.query_string)
+ req.query_string,
+ req.body)
def test_no_argument_passed_to_init(self):
with testtools.ExpectedException(ValueError):
mock_http.return_value.request.return_value = (resp, 'content')
retval = self.handler._proxy_request('192.168.1.1',
+ 'GET',
'/latest/meta-data',
+ '',
'')
mock_http.assert_has_calls([
mock.call().request(
'http://169.254.169.254/latest/meta-data',
+ method='GET',
headers={
'X-Forwarded-For': '192.168.1.1',
'X-Quantum-Router-ID': 'router_id'
},
- connection_type=ns_proxy.UnixDomainHTTPConnection
+ connection_type=ns_proxy.UnixDomainHTTPConnection,
+ body=''
)]
)
mock_http.return_value.request.return_value = (resp, 'content')
retval = self.handler._proxy_request('192.168.1.1',
+ 'GET',
'/latest/meta-data',
+ '',
'')
mock_http.assert_has_calls([
mock.call().request(
'http://169.254.169.254/latest/meta-data',
+ method='GET',
headers={
'X-Forwarded-For': '192.168.1.1',
'X-Quantum-Network-ID': 'network_id'
},
- connection_type=ns_proxy.UnixDomainHTTPConnection
+ connection_type=ns_proxy.UnixDomainHTTPConnection,
+ body=''
)]
)
mock_http.return_value.request.return_value = (resp, '')
retval = self.handler._proxy_request('192.168.1.1',
+ 'GET',
'/latest/meta-data',
+ '',
'')
mock_http.assert_has_calls([
mock.call().request(
'http://169.254.169.254/latest/meta-data',
+ method='GET',
headers={
'X-Forwarded-For': '192.168.1.1',
'X-Quantum-Network-ID': 'network_id'
},
- connection_type=ns_proxy.UnixDomainHTTPConnection
+ connection_type=ns_proxy.UnixDomainHTTPConnection,
+ body=''
)]
)
self.assertIsInstance(retval, webob.exc.HTTPNotFound)
+ def test_proxy_request_network_409(self):
+ self.handler.network_id = 'network_id'
+
+ resp = mock.Mock(status=409)
+ with mock.patch('httplib2.Http') as mock_http:
+ mock_http.return_value.request.return_value = (resp, '')
+
+ retval = self.handler._proxy_request('192.168.1.1',
+ 'POST',
+ '/latest/meta-data',
+ '',
+ '')
+
+ mock_http.assert_has_calls([
+ mock.call().request(
+ 'http://169.254.169.254/latest/meta-data',
+ method='POST',
+ headers={
+ 'X-Forwarded-For': '192.168.1.1',
+ 'X-Quantum-Network-ID': 'network_id'
+ },
+ connection_type=ns_proxy.UnixDomainHTTPConnection,
+ body=''
+ )]
+ )
+
+ self.assertIsInstance(retval, webob.exc.HTTPConflict)
+
def test_proxy_request_network_500(self):
self.handler.network_id = 'network_id'
mock_http.return_value.request.return_value = (resp, '')
retval = self.handler._proxy_request('192.168.1.1',
+ 'GET',
'/latest/meta-data',
+ '',
'')
mock_http.assert_has_calls([
mock.call().request(
'http://169.254.169.254/latest/meta-data',
+ method='GET',
headers={
'X-Forwarded-For': '192.168.1.1',
'X-Quantum-Network-ID': 'network_id'
},
- connection_type=ns_proxy.UnixDomainHTTPConnection
+ connection_type=ns_proxy.UnixDomainHTTPConnection,
+ body=''
)]
)
with testtools.ExpectedException(Exception):
self.handler._proxy_request('192.168.1.1',
+ 'GET',
'/latest/meta-data',
+ '',
'')
mock_http.assert_has_calls([
mock.call().request(
'http://169.254.169.254/latest/meta-data',
+ method='GET',
headers={
'X-Forwarded-For': '192.168.1.1',
'X-Quantum-Network-ID': 'network_id'
},
- connection_type=ns_proxy.UnixDomainHTTPConnection
+ connection_type=ns_proxy.UnixDomainHTTPConnection,
+ body=''
)]
)
with testtools.ExpectedException(Exception):
self.handler._proxy_request('192.168.1.1',
+ 'GET',
'/latest/meta-data',
+ '',
'')
mock_http.assert_has_calls([
mock.call().request(
'http://169.254.169.254/latest/meta-data',
+ method='GET',
headers={
'X-Forwarded-For': '192.168.1.1',
'X-Quantum-Network-ID': 'network_id'
},
- connection_type=ns_proxy.UnixDomainHTTPConnection
+ connection_type=ns_proxy.UnixDomainHTTPConnection,
+ body=''
)]
)