|
5 | 5 | from rest_framework.authtoken.models import Token |
6 | 6 |
|
7 | 7 | from api.models import App |
| 8 | +from unittest import mock |
| 9 | +from scheduler import KubeException |
8 | 10 | from api.tests import adapter, DeisTransactionTestCase |
9 | 11 |
|
10 | 12 |
|
@@ -89,3 +91,82 @@ def test_settings_routable(self, mock_requests): |
89 | 91 | settings) |
90 | 92 | self.assertEqual(response.status_code, 201, response.data) |
91 | 93 | self.assertFalse(app.appsettings_set.latest().routable) |
| 94 | + |
| 95 | + def test_settings_whitelist(self, mock_requests): |
| 96 | + """ |
| 97 | + Test that addresses can be added/deleted to whitelist |
| 98 | + """ |
| 99 | + app_id = self.create_app() |
| 100 | + app = App.objects.get(id=app_id) |
| 101 | + # add addresses to empty whitelist |
| 102 | + addresses = ["1.2.3.4", "0.0.0.0/0"] |
| 103 | + whitelist = {'addresses': addresses} |
| 104 | + response = self.client.post( |
| 105 | + '/v2/apps/{app_id}/whitelist'.format(**locals()), |
| 106 | + whitelist) |
| 107 | + self.assertEqual(response.status_code, 201, response.data) |
| 108 | + self.assertEqual(set(response.data['addresses']), |
| 109 | + set(app.appsettings_set.latest().whitelist), response.data) |
| 110 | + self.assertEqual(set(response.data['addresses']), set(addresses), response.data) |
| 111 | + # get the whitelist |
| 112 | + response = self.client.get('/v2/apps/{app_id}/whitelist'.format(**locals())) |
| 113 | + self.assertEqual(response.status_code, 200, response.data) |
| 114 | + self.assertEqual(set(response.data['addresses']), |
| 115 | + set(app.appsettings_set.latest().whitelist), response.data) |
| 116 | + self.assertEqual(set(response.data['addresses']), set(addresses), response.data) |
| 117 | + # add addresses to non-empty whitelist |
| 118 | + whitelist = {'addresses': ["2.3.4.5"]} |
| 119 | + addresses.extend(["2.3.4.5"]) |
| 120 | + response = self.client.post( |
| 121 | + '/v2/apps/{app_id}/whitelist'.format(**locals()), |
| 122 | + whitelist) |
| 123 | + self.assertEqual(response.status_code, 201, response.data) |
| 124 | + self.assertEqual(set(response.data['addresses']), |
| 125 | + set(app.appsettings_set.latest().whitelist), response.data) |
| 126 | + self.assertEqual(set(response.data['addresses']), set(addresses), response.data) |
| 127 | + # add exisitng addresses to whitelist |
| 128 | + response = self.client.post( |
| 129 | + '/v2/apps/{app_id}/whitelist'.format(**locals()), |
| 130 | + whitelist) |
| 131 | + self.assertEqual(response.status_code, 409, response.data) |
| 132 | + # delete non-exisitng address from whitelist |
| 133 | + whitelist = {'addresses': ["2.3.4.6"]} |
| 134 | + response = self.client.delete( |
| 135 | + '/v2/apps/{app_id}/whitelist'.format(**locals()), |
| 136 | + whitelist) |
| 137 | + self.assertEqual(response.status_code, 422) |
| 138 | + # delete an address from whitelist |
| 139 | + whitelist = {'addresses': ["2.3.4.5"]} |
| 140 | + addresses.remove("2.3.4.5") |
| 141 | + response = self.client.delete( |
| 142 | + '/v2/apps/{app_id}/whitelist'.format(**locals()), |
| 143 | + whitelist) |
| 144 | + self.assertEqual(response.status_code, 204, response.data) |
| 145 | + self.assertEqual(set(addresses), set(app.appsettings_set.latest().whitelist)) |
| 146 | + # pass invalid address |
| 147 | + whitelist = {'addresses': ["2.3.4.6.7"]} |
| 148 | + response = self.client.post( |
| 149 | + '/v2/apps/{app_id}/whitelist'.format(**locals()), |
| 150 | + whitelist) |
| 151 | + self.assertEqual(response.status_code, 400, response.data) |
| 152 | + # update other appsettings and whitelist should be retained |
| 153 | + settings = {'maintenance': True} |
| 154 | + response = self.client.post( |
| 155 | + '/v2/apps/{app.id}/settings'.format(**locals()), |
| 156 | + settings) |
| 157 | + self.assertEqual(response.status_code, 201, response.data) |
| 158 | + self.assertEqual(set(addresses), set(app.appsettings_set.latest().whitelist)) |
| 159 | + |
| 160 | + def test_kubernetes_service_failure(self, mock_requests): |
| 161 | + """ |
| 162 | + Cause an Exception in kubernetes services |
| 163 | + """ |
| 164 | + app_id = self.create_app() |
| 165 | + |
| 166 | + # scheduler.update_service exception |
| 167 | + with mock.patch('scheduler.KubeHTTPClient.update_service') as mock_kube: |
| 168 | + mock_kube.side_effect = KubeException('Boom!') |
| 169 | + addresses = ["2.3.4.5"] |
| 170 | + url = '/v2/apps/{}/whitelist'.format(app_id) |
| 171 | + response = self.client.post(url, {'addresses': addresses}) |
| 172 | + self.assertEqual(response.status_code, 400, response.data) |
0 commit comments