def test_request_exception_retry(self): connection = Rest(device=self.device, alias='rest', via='rest') self.assertEqual(connection.connected, False) with patch('requests.Session') as req: resp = Response() resp.status_code = 200 req().post.side_effect = [resp, resp] req().request.side_effect = [TimeoutError('Timeout'), resp] connection.connect() resp.json = MagicMock(return_value={'imdata': []}) with self.assertLogs( logger='rest.connector.libs.nxos.implementation', level=logging.INFO) as log_cm: connection.post(dn='temp', payload={'payload': 'something'}, retry_wait=0) self.assertIn('TimeoutError', '\n'.join(log_cm.output)) self.assertEqual(connection.connected, True) connection.disconnect() self.assertEqual(connection.connected, False)
def test_connect_fail_no_retry(self): # Test connect failure with no retries self.mock_ics.return_value.post.return_value = FakeResponseRestarting() connection = Rest(device=self.device, alias="rest", via="rest") with self.assertRaises(iControlUnexpectedHTTPError): connection.connect(retries=0) self.assertFalse(connection.connected) self.mock_sleep.assert_not_called() self.mock_ics.return_value.post.assert_called_once()
def test_connect_fail(self): # Test connect failure with retries self.mock_ics.return_value.post.return_value = FakeResponseRestarting() connection = Rest(device=self.device, alias="rest", via="rest") with self.assertRaises(iControlUnexpectedHTTPError): connection.connect(retries=3, retry_wait=35) self.assertFalse(connection.connected) self.mock_sleep.assert_called_with(35) self.assertEqual(self.mock_sleep.call_count, 3) self.assertEqual(self.mock_ics.return_value.post.call_count, 4)
def test_disconnect(self): self.mock_ics.return_value.post.return_value = FakeResponse() self.mock_ics.return_value.patch.return_value = FakeResponsePatch() self.mock_ics.return_value.delete.return_value = FakeResponseDelete() connection = Rest(device=self.device, alias="rest", via="rest") connection.connect() connection.disconnect() self.mock_ics.return_value.post.assert_called_once() self.mock_ics.return_value.delete.assert_called_once() self.assertFalse(connection.connected)
def test_get(self): self.mock_ics.return_value.post.return_value = FakeResponse() self.mock_ics.return_value.patch.return_value = FakeResponsePatch() self.mock_ics.return_value.delete.return_value = FakeResponseDelete() self.mock_ics.return_value.get.return_value = FakeResponseGet() connection = Rest(device=self.device, alias="rest", via="rest") connection.connect() result = connection.get("/mgmt/tm/ltm/global-settings") self.mock_ics.return_value.post.assert_called_once() self.mock_ics.return_value.get.assert_called_once() self.assertEqual(result, self.mock_ics.return_value.get.return_value)
def test_post_connected(self): connection = Rest(device=self.device, alias='rest', via='rest') self.assertEqual(connection.connected, False) with patch('requests.Session') as req: resp = Response() resp.status_code = 200 req().post.return_value = resp connection.connect() resp.json = MagicMock(return_value={'imdata': []}) connection.post(dn='temp', payload={'payload': 'something'}) connection.disconnect() self.assertEqual(connection.connected, False)
def test_delete_connected(self): connection = Rest(device=self.device, alias='rest', via='rest') self.assertEqual(connection.connected, False) with patch('requests.Session') as req: resp = Response() resp.status_code = 200 req().get.return_value = resp req().delete.return_value = resp connection.connect() resp.json = MagicMock(return_value={'imdata': []}) connection.delete(dn='temp') connection.disconnect() self.assertEqual(connection.connected, False)
def test_connection(self): connection = Rest(device=self.device, alias='rest', via='rest') self.assertEqual(connection.connected, False) with patch('requests.Session') as req: resp = Response() resp.status_code = 200 req().get.return_value = resp connection.connect() self.assertEqual(connection.connected, True) connection.connect() self.assertEqual(connection.connected, True) # Now disconnect with patch('requests.Session') as req: connection.disconnect() self.assertEqual(connection.connected, False)
def test_post_xml_connected(self): connection = Rest(device=self.device, alias='rest', via='rest') self.assertEqual(connection.connected, False) with patch('requests.Session') as req: resp = Response() resp.status_code = 200 req().post.return_value = resp connection.connect() resp._content = '<?xml version="1.0" encoding="UTF-8"?>' \ '<imdata totalCount="0"></imdata>' connection.post(dn='temp', xml_payload=True, payload='<fvTenant name="ExampleCorp"/>') connection.disconnect() self.assertEqual(connection.connected, False)
def test_connection_wrong_code(self): connection = Rest(device=self.device, alias='rest', via='rest') self.assertEqual(connection.connected, False) with patch('requests.Session') as req: resp = Response() resp.status_code = 404 req().post.return_value = resp with self.assertRaises(RequestException): connection.connect() self.assertEqual(connection.connected, False) # Now disconnect with patch('requests.Session') as req: connection.disconnect() self.assertEqual(connection.connected, False)
def test_get_connected_change_expected(self): connection = Rest(device=self.device, alias='rest', via='rest') self.assertEqual(connection.connected, False) with patch('requests.Session') as req: resp = Response() resp.status_code = 200 resp2 = Response() resp2.status_code = 300 req().get.side_effect = [resp, resp] connection.connect() resp.json = MagicMock(return_value={'imdata': []}) resp2.json = MagicMock(return_value={'imdata': []}) connection.get(dn='temp') self.assertEqual(connection.connected, True) connection.disconnect() self.assertEqual(connection.connected, False)
def test_delete_connected_wrong_status_change_expected(self): connection = Rest(device=self.device, alias='rest', via='rest') self.assertEqual(connection.connected, False) with patch('requests.Session') as req: resp = Response() resp.status_code = 200 resp2 = Response() resp2.status_code = 400 req().post.side_effect = [resp, resp] req().request.return_value = resp2 connection.connect() with self.assertRaises(RequestException): connection.delete(dn='/temp') self.assertEqual(connection.connected, True) connection.disconnect() self.assertEqual(connection.connected, False)
def test_delete_connected_wrong_status(self): connection = Rest(device=self.device, alias='rest', via='rest') self.assertEqual(connection.connected, False) with patch('requests.Session') as req: resp = Response() resp.status_code = 200 resp2 = Response() resp2.status_code = 300 req().delete.return_value = resp2 req().post.side_effect = [resp, resp, resp2] connection.connect() resp.json = MagicMock(return_value={'imdata': []}) resp2.json = MagicMock(return_value={'imdata': []}) with self.assertRaises(RequestException): connection.delete(dn='temp') self.assertEqual(connection.connected, True) connection.disconnect() self.assertEqual(connection.connected, False)
def test_connect(self): # Test connect with 1 retry self.mock_ics.return_value.post.side_effect = [ FakeResponseRestarting(), FakeResponse() ] connection = Rest(device=self.device, alias="rest", via="rest") result_is_connected, result_session = connection.connect(retry_wait=15) self.assertTrue(result_is_connected) self.assertTrue(connection.connected) self.mock_sleep.assert_called_once_with(15) self.assertEqual(self.mock_ics.return_value.post.call_count, 2) self.assertIsInstance(result_session, MagicMock)
def test_put_connected_change_expected(self): connection = Rest(device=self.device, alias='rest', via='rest') self.assertEqual(connection.connected, False) with patch('requests.Session') as req: resp = Response() resp.status_code = 200 resp2 = Response() resp2.status_code = 300 req().put.return_value = resp2 req().post.side_effect = [resp, resp, resp2] connection.connect() resp.json = MagicMock(return_value={'imdata': []}) resp2.json = MagicMock(return_value={'imdata': []}) connection.put(api_url='temp', payload={'payload': 'something'}, expected_status_code=300) self.assertEqual(connection.connected, True) connection.disconnect() self.assertEqual(connection.connected, False)
def test_post_connected_wrong_status(self): connection = Rest(device=self.device, alias='rest', via='rest') self.assertEqual(connection.connected, False) with patch('requests.Session') as req: resp = Response() resp.status_code = 200 resp2 = Response() resp2.status_code = 400 req().request.return_value = resp2 req().get.return_value = resp req().post.return_value = resp2 connection.connect() resp.json = MagicMock(return_value={'imdata': []}) resp2.json = MagicMock(return_value={'imdata': []}) with self.assertRaises(RequestException): connection.post(dn='temp', payload={'payload': 'something'}) self.assertEqual(connection.connected, True) connection.disconnect() self.assertEqual(connection.connected, False)
def test_connect(self, **kwargs): connection = Rest(device=self.device, alias='rest', via='rest') response_text = """\ <api xmlns="http://tail-f.com/ns/rest" xmlns:y="http://tail-f.com/ns/rest"> <version>0.5</version> <config/> <running/> <operational/> <operations/> <rollbacks/> </api> """ kwargs['mock'].get('http://1.2.3.4:8080/api', text=response_text) output = connection.connect(verbose=True).text self.assertEqual(output, response_text) return connection