-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathloadbalancer.py
74 lines (66 loc) · 2.85 KB
/
loadbalancer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import requests as req
import os
import fire
class LoadBalancer:
def __init__(self, lb_name):
DO_TOKEN = os.environ.get('DO_TOKEN')
self.headers = {"Authorization": f"Bearer {DO_TOKEN}"}
self.base_url = f'https://api.digitalocean.com/v2/'
self.dets = self._get_lb_details_by_name(lb_name)
self.droplets = self._get_all_droplets()
def _get_lb_details_by_name(self, lb_name):
response = req.get(url=f"{self.base_url}load_balancers",
headers=self.headers)
data = response.json()
droplet_details = {}
for lb in data['load_balancers']:
if lb['name'] == lb_name:
self.lb_name = lb_name
self.lb_id = lb['id']
for droplet_id in lb['droplet_ids']:
droplet_details.update(self._get_droplet_details_by_id(droplet_id))
lb_data = {lb['name']: {'ip': lb['ip'], 'droplets': droplet_details}}
return lb_data
def _get_droplet_details_by_id(self, droplet_id):
response = req.get(url=f"{self.base_url}droplets/{droplet_id}", headers=self.headers)
data = response.json()
return {data['droplet']['name']: {'ip_address': data['droplet']['networks']['v4'][0]['ip_address'],
'id': droplet_id}}
def _get_all_droplets(self):
response = req.get(url=f"{self.base_url}droplets", headers=self.headers)
data = response.json()
droplets = {}
for droplet in data['droplets']:
droplets.update({droplet['name']: {'id': droplet['id'],
'ip': droplet['networks']['v4'][0]['ip_address']}})
return droplets
def detach(self, droplet_names):
url = f"{self.base_url}load_balancers/{self.lb_id}/droplets"
droplet_list = []
for droplet in droplet_names:
try:
droplet_list.append(self.dets[self.lb_name]['droplets'][droplet]['id'])
except KeyError:
return "Droplet not attached"
payload = {"droplet_ids": droplet_list}
response = req.delete(url=url, json=payload, headers=self.headers)
if response.status_code == 204:
return "Success"
else:
return "Failed"
def attach(self, droplet_names):
url = f"{self.base_url}load_balancers/{self.lb_id}/droplets"
droplet_list = []
for droplet in droplet_names:
try:
droplet_list.append(self.droplets[droplet]['id'])
except KeyError:
return "Droplet doesn't exist"
payload = {"droplet_ids": droplet_list}
response = req.post(url=url, json=payload, headers=self.headers)
if response.status_code == 204:
return "Success"
else:
return "Failed"
def main():
fire.Fire(LoadBalancer)