23
20
from oslo.config import cfg
22
from neutron import context
25
23
from neutron import manager
26
24
from neutron.openstack.common import importutils
25
from neutron.openstack.common import jsonutils
27
26
from neutron.plugins.bigswitch import servermanager
28
27
from neutron.tests.unit.bigswitch import test_restproxy_plugin as test_rp
116
115
rv.getresponse.return_value.getheader.return_value = 'HASHHEADER'
117
116
rv.getresponse.return_value.status = 200
118
117
rv.getresponse.return_value.read.return_value = ''
118
with self.network() as network:
120
119
callheaders = rv.request.mock_calls[0][1][3]
121
120
self.assertIn('X-BSN-BVS-HASH-MATCH', callheaders)
122
121
# first call will be empty to indicate no previous state hash
123
122
self.assertEqual(callheaders['X-BSN-BVS-HASH-MATCH'], '')
124
123
# change the header that will be received on delete call
125
124
rv.getresponse.return_value.getheader.return_value = 'HASH2'
125
self._delete('networks', network['network']['id'])
127
126
# net delete should have used header received on create
128
127
callheaders = rv.request.mock_calls[1][1][3]
129
128
self.assertEqual(callheaders['X-BSN-BVS-HASH-MATCH'], 'HASHHEADER')
142
141
rv.getresponse.return_value.getheader.return_value = 'HASHHEADER'
143
142
rv.getresponse.return_value.status = 200
144
143
rv.getresponse.return_value.read.return_value = ''
144
with self.network() as net:
146
145
# change the header that will be received on delete call
147
146
rv.getresponse.return_value.getheader.return_value = 'EVIL'
148
147
rv.getresponse.return_value.status = 'GARBAGE'
148
self._delete('networks', net['network']['id'])
150
150
# create again should not use header from delete call
151
151
with self.network():
210
210
self.assertIn('EXTRA-HEADER', callheaders)
211
211
self.assertEqual(callheaders['EXTRA-HEADER'], 'HI')
213
def test_req_context_header(self):
214
sp = manager.NeutronManager.get_plugin().servers
215
ncontext = context.Context('uid', 'tid')
216
sp.set_context(ncontext)
217
with mock.patch(HTTPCON) as conmock:
218
rv = conmock.return_value
219
rv.getresponse.return_value.getheader.return_value = 'HASHHEADER'
220
sp.rest_action('GET', '/')
221
callheaders = rv.request.mock_calls[0][1][3]
222
self.assertIn(servermanager.REQ_CONTEXT_HEADER, callheaders)
223
ctxdct = ncontext.to_dict()
224
# auth token is not included
225
ctxdct.pop('auth_token')
227
ctxdct, jsonutils.loads(
228
callheaders[servermanager.REQ_CONTEXT_HEADER]))
213
230
def test_capabilities_retrieval(self):
214
231
sp = servermanager.ServerPool()
215
232
with mock.patch(HTTPCON) as conmock:
373
390
self.assertFalse(pl.servers.server_failure((404,),
374
391
ignore_codes=[404]))
393
def test_retry_on_unavailable(self):
394
pl = manager.NeutronManager.get_plugin()
395
with contextlib.nested(
396
mock.patch(SERVERMANAGER + '.ServerProxy.rest_call',
397
return_value=(httplib.SERVICE_UNAVAILABLE, 0, 0, 0)),
398
mock.patch(SERVERMANAGER + '.time.sleep')
399
) as (srestmock, tmock):
400
# making a call should trigger retries with sleeps in between
401
pl.servers.rest_call('GET', '/', '', None, [])
402
rest_call = [mock.call('GET', '/', '', None, False, reconnect=True,
403
hash_handler=mock.ANY)]
405
servermanager.HTTP_SERVICE_UNAVAILABLE_RETRY_COUNT + 1)
406
srestmock.assert_has_calls(rest_call * rest_call_count)
407
sleep_call = [mock.call(
408
servermanager.HTTP_SERVICE_UNAVAILABLE_RETRY_INTERVAL)]
409
# should sleep 1 less time than the number of calls
410
sleep_call_count = rest_call_count - 1
411
tmock.assert_has_calls(sleep_call * sleep_call_count)
376
413
def test_conflict_triggers_sync(self):
377
414
pl = manager.NeutronManager.get_plugin()