|
2 | 2 | from datetime import datetime |
3 | 3 | import logging |
4 | 4 | import requests |
| 5 | +import requests.exceptions |
5 | 6 | from requests_toolbelt import user_agent |
6 | 7 | import time |
| 8 | +from urllib.parse import urljoin |
7 | 9 |
|
8 | 10 | from api import __version__ as deis_version |
9 | 11 | from scheduler.exceptions import KubeException, KubeHTTPException # noqa |
@@ -73,7 +75,7 @@ def __getattr__(self, name): |
73 | 75 |
|
74 | 76 | def version(self): |
75 | 77 | """Get Kubernetes version as a float""" |
76 | | - response = self.session.get(self.url + '/version') |
| 78 | + response = self.http_get('/version') |
77 | 79 | if self.unhealthy(response.status_code): |
78 | 80 | raise KubeHTTPException(response, 'fetching Kubernetes version') |
79 | 81 |
|
@@ -139,6 +141,89 @@ def log(namespace, message, level='INFO'): |
139 | 141 | lvl = getattr(logging, level.upper()) if hasattr(logging, level.upper()) else logging.INFO |
140 | 142 | logger.log(lvl, "[{}]: {}".format(namespace, message)) |
141 | 143 |
|
| 144 | + def http_head(self, path, **kwargs): |
| 145 | + """ |
| 146 | + Make a HEAD request to the k8s server. |
| 147 | + """ |
| 148 | + try: |
| 149 | + |
| 150 | + url = urljoin(self.url, path) |
| 151 | + response = self.session.head(url, **kwargs) |
| 152 | + except requests.exceptions.ConnectionError as err: |
| 153 | + # reraise as KubeException, but log stacktrace. |
| 154 | + message = "There was a problem retrieving headers from " \ |
| 155 | + "the Kubernetes API server. URL: {}".format(url) |
| 156 | + logger.error(message) |
| 157 | + raise KubeException(message) from err |
| 158 | + |
| 159 | + return response |
| 160 | + |
| 161 | + def http_get(self, path, params=None, **kwargs): |
| 162 | + """ |
| 163 | + Make a GET request to the k8s server. |
| 164 | + """ |
| 165 | + try: |
| 166 | + url = urljoin(self.url, path) |
| 167 | + response = self.session.get(url, params=params, **kwargs) |
| 168 | + except requests.exceptions.ConnectionError as err: |
| 169 | + # reraise as KubeException, but log stacktrace. |
| 170 | + message = "There was a problem retrieving data from " \ |
| 171 | + "the Kubernetes API server. URL: {}, params: {}".format(url, params) |
| 172 | + logger.error(message) |
| 173 | + raise KubeException(message) from err |
| 174 | + |
| 175 | + return response |
| 176 | + |
| 177 | + def http_post(self, path, data=None, json=None, **kwargs): |
| 178 | + """ |
| 179 | + Make a POST request to the k8s server. |
| 180 | + """ |
| 181 | + try: |
| 182 | + url = urljoin(self.url, path) |
| 183 | + response = self.session.post(url, data=data, json=json, **kwargs) |
| 184 | + except requests.exceptions.ConnectionError as err: |
| 185 | + # reraise as KubeException, but log stacktrace. |
| 186 | + message = "There was a problem posting data to " \ |
| 187 | + "the Kubernetes API server. URL: {}, " \ |
| 188 | + "data: {}, json: {}".format(url, data, json) |
| 189 | + logger.error(message) |
| 190 | + raise KubeException(message) from err |
| 191 | + |
| 192 | + return response |
| 193 | + |
| 194 | + def http_put(self, path, data=None, **kwargs): |
| 195 | + """ |
| 196 | + Make a PUT request to the k8s server. |
| 197 | + """ |
| 198 | + try: |
| 199 | + url = urljoin(self.url, path) |
| 200 | + response = self.session.put(url, data=data, **kwargs) |
| 201 | + except requests.exceptions.ConnectionError as err: |
| 202 | + # reraise as KubeException, but log stacktrace. |
| 203 | + message = "There was a problem putting data to " \ |
| 204 | + "the Kubernetes API server. URL: {}, " \ |
| 205 | + "data: {}".format(url, data) |
| 206 | + logger.error(message) |
| 207 | + raise KubeException(message) from err |
| 208 | + |
| 209 | + return response |
| 210 | + |
| 211 | + def http_delete(self, path, **kwargs): |
| 212 | + """ |
| 213 | + Make a DELETE request to the k8s server. |
| 214 | + """ |
| 215 | + try: |
| 216 | + url = urljoin(self.url, path) |
| 217 | + response = self.session.delete(url, **kwargs) |
| 218 | + except requests.exceptions.ConnectionError as err: |
| 219 | + # reraise as KubeException, but log stacktrace. |
| 220 | + message = "There was a problem deleting data from " \ |
| 221 | + "the Kubernetes API server. URL: {}".format(url) |
| 222 | + logger.error(message) |
| 223 | + raise KubeException(message) from err |
| 224 | + |
| 225 | + return response |
| 226 | + |
142 | 227 | def deploy(self, namespace, name, image, entrypoint, command, **kwargs): # noqa |
143 | 228 | """Deploy Deployment depending on what's requested""" |
144 | 229 | app_type = kwargs.get('app_type') |
@@ -226,7 +311,7 @@ def run(self, namespace, name, image, entrypoint, command, **kwargs): |
226 | 311 | manifest = self.pod.manifest(namespace, name, image, **kwargs) |
227 | 312 |
|
228 | 313 | url = self.pods.api("/namespaces/{}/pods", namespace) |
229 | | - response = self.session.post(url, json=manifest) |
| 314 | + response = self.http_post(url, json=manifest) |
230 | 315 | if self.unhealthy(response.status_code): |
231 | 316 | raise KubeHTTPException(response, 'create Pod in Namespace "{}"', namespace) |
232 | 317 |
|
|
0 commit comments