22
22
from oslo.config import cfg
24
from neutron import context
24
25
from neutron.manager import NeutronManager
25
26
from neutron.openstack.common import importutils
27
from neutron.openstack.common import jsonutils
26
28
from neutron.plugins.bigswitch import servermanager
27
29
from neutron.tests.unit.bigswitch import test_restproxy_plugin as test_rp
80
82
rmock.assert_called_with('GET', '/health', '', {}, [], False)
81
83
self.assertEqual(1, len(lmock.mock_calls))
85
def test_consistency_hash_header(self):
86
# mock HTTP class instead of rest_call so we can see headers
87
with mock.patch(HTTPCON) as conmock:
88
rv = conmock.return_value
89
rv.getresponse.return_value.getheader.return_value = 'HASHHEADER'
90
rv.getresponse.return_value.status = 200
91
rv.getresponse.return_value.read.return_value = ''
93
callheaders = rv.request.mock_calls[0][1][3]
94
self.assertIn('X-BSN-BVS-HASH-MATCH', callheaders)
95
# first call will be empty to indicate no previous state hash
96
self.assertEqual(callheaders['X-BSN-BVS-HASH-MATCH'], '')
97
# change the header that will be received on delete call
98
rv.getresponse.return_value.getheader.return_value = 'HASH2'
100
# net delete should have used header received on create
101
callheaders = rv.request.mock_calls[1][1][3]
102
self.assertEqual(callheaders['X-BSN-BVS-HASH-MATCH'], 'HASHHEADER')
104
# create again should now use header received from prev delete
106
callheaders = rv.request.mock_calls[2][1][3]
107
self.assertIn('X-BSN-BVS-HASH-MATCH', callheaders)
108
self.assertEqual(callheaders['X-BSN-BVS-HASH-MATCH'],
111
def test_consistency_hash_header_no_update_on_bad_response(self):
112
# mock HTTP class instead of rest_call so we can see headers
113
with mock.patch(HTTPCON) as conmock:
114
rv = conmock.return_value
115
rv.getresponse.return_value.getheader.return_value = 'HASHHEADER'
116
rv.getresponse.return_value.status = 200
117
rv.getresponse.return_value.read.return_value = ''
119
# change the header that will be received on delete call
120
rv.getresponse.return_value.getheader.return_value = 'EVIL'
121
rv.getresponse.return_value.status = 'GARBAGE'
123
# create again should not use header from delete call
125
callheaders = rv.request.mock_calls[2][1][3]
126
self.assertIn('X-BSN-BVS-HASH-MATCH', callheaders)
127
self.assertEqual(callheaders['X-BSN-BVS-HASH-MATCH'],
83
130
def test_file_put_contents(self):
84
131
pl = NeutronManager.get_plugin()
85
132
with mock.patch(SERVERMANAGER + '.open', create=True) as omock:
109
156
mock.call.write('certdata')
159
def test_req_context_header(self):
160
sp = NeutronManager.get_plugin().servers
161
ncontext = context.Context('uid', 'tid')
162
sp.set_context(ncontext)
163
with mock.patch(HTTPCON) as conmock:
164
rv = conmock.return_value
165
rv.getresponse.return_value.getheader.return_value = 'HASHHEADER'
166
sp.rest_action('GET', '/')
167
callheaders = rv.request.mock_calls[0][1][3]
168
self.assertIn(servermanager.REQ_CONTEXT_HEADER, callheaders)
169
ctxdct = ncontext.to_dict()
171
ctxdct, jsonutils.loads(
172
callheaders[servermanager.REQ_CONTEXT_HEADER]))
112
174
def test_capabilities_retrieval(self):
113
175
sp = servermanager.ServerPool()
114
176
with mock.patch(HTTPCON) as conmock:
186
248
resp = sp.servers[0].rest_call('GET', '/')
187
249
self.assertEqual(resp, (0, None, None, None))
251
def test_retry_on_unavailable(self):
252
pl = NeutronManager.get_plugin()
254
mock.patch(SERVERMANAGER + '.ServerProxy.rest_call',
255
return_value=(httplib.SERVICE_UNAVAILABLE, 0, 0, 0)),
256
mock.patch(SERVERMANAGER + '.time.sleep')
257
) as (srestmock, tmock):
258
# making a call should trigger retries with sleeps in between
259
pl.servers.rest_call('GET', '/', '', None, [])
260
rest_call = [mock.call('GET', '/', '', None, False, reconnect=True,
261
hash_handler=mock.ANY)]
263
servermanager.HTTP_SERVICE_UNAVAILABLE_RETRY_COUNT + 1)
264
srestmock.assert_has_calls(rest_call * rest_call_count)
265
sleep_call = [mock.call(
266
servermanager.HTTP_SERVICE_UNAVAILABLE_RETRY_INTERVAL)]
267
# should sleep 1 less time than the number of calls
268
sleep_call_count = rest_call_count - 1
269
tmock.assert_has_calls(sleep_call * sleep_call_count)
190
272
class TestSockets(test_rp.BigSwitchProxyPluginV2TestCase):