]> git.immae.eu Git - perso/Immae/Projets/Puppet.git/blobdiff - python/hetzner_helper.py
Merge branch 'dev'
[perso/Immae/Projets/Puppet.git] / python / hetzner_helper.py
diff --git a/python/hetzner_helper.py b/python/hetzner_helper.py
new file mode 100644 (file)
index 0000000..496e14d
--- /dev/null
@@ -0,0 +1,59 @@
+import json
+import requests
+import os
+
+from configparser import RawConfigParser, NoSectionError, NoOptionError
+
+class AuthenticationException(Exception):
+    pass
+
+class RateLimitExceeded(Exception):
+    pass
+
+class InternalServer(Exception):
+    pass
+
+class HetznerConfig:
+    def __init__(self):
+        config = RawConfigParser()
+        config.read([os.path.expanduser('~/.hetzner.conf')])
+
+        self.api_key = config.get("default", "api_key")
+
+config = HetznerConfig()
+
+def call(endpoint, url_params=None, body=None, method="GET"):
+    api = "https://api.hetzner.cloud/v1/{}".format(endpoint)
+    headers = {"Authorization": "Bearer {}".format(config.api_key)}
+    data = json.dumps(body) if body is not None else None
+
+    if method == "GET":
+        request = requests.get(api, headers=headers, params=url_params)
+    elif method == "POST" or (method == "GET" and body is not None):
+        request = requests.post(api, data=data, headers=headers, params=url_params)
+    elif method == "DELETE":
+        request = requests.delete(api, headers=headers)
+    elif method == "PUT":
+        request = requests.put(api, headers=headers, data=data)
+
+    if request.status_code == 401 or request.status_code == 403:
+        raise AuthenticationException()
+
+    if request.status_code == 429:
+        raise RateLimitExceeded()
+
+    if request.status_code == 500:
+        raise InternalServer(request.text)
+
+    if not request.text:
+        return request.status_code, ""
+
+    js = request.json()
+
+    return request.status_code, js
+
+def get(*args, **kwargs):
+    return call(*args, method="GET", **kwargs)
+
+def post(*args, **kwargs):
+    return call(*args, method="POST", **kwargs)