formatted using 'black' + rescan vms if there is some vm which is pending scheduling due to resource deficiency
This commit is contained in:
parent
dd3b9fe1cb
commit
7c310d0430
1 changed files with 34 additions and 13 deletions
47
main.py
47
main.py
|
|
@ -12,7 +12,7 @@ import logging
|
||||||
from decouple import config
|
from decouple import config
|
||||||
from collections import Counter
|
from collections import Counter
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
from etcd3_wrapper import Etcd3Wrapper
|
from etcd3_wrapper import Etcd3Wrapper, EtcdEntry, PseudoEtcdMeta
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
|
|
@ -141,13 +141,27 @@ def dead_host_mitigation(client: Etcd3Wrapper, dead_hosts_keys):
|
||||||
client.put(vm.key, vm.value, value_in_json=True)
|
client.put(vm.key, vm.value, value_in_json=True)
|
||||||
|
|
||||||
|
|
||||||
|
def assign_host(client, vm_prefix, host_prefix, e):
|
||||||
|
host_name = get_suitable_host(
|
||||||
|
client, vm_prefix, host_prefix, e.value["specs"]
|
||||||
|
)
|
||||||
|
if host_name:
|
||||||
|
e.value["status"] = "SCHEDULED_DEPLOY"
|
||||||
|
e.value["hostname"] = host_name
|
||||||
|
client.put(e.key, json.dumps(e.value))
|
||||||
|
return host_name
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def main(vm_prefix, host_prefix):
|
def main(vm_prefix, host_prefix):
|
||||||
client = Etcd3Wrapper(
|
client = Etcd3Wrapper(
|
||||||
host=config("ETCD_HOST"), port=int(config("ETCD_PORT"))
|
host=config("ETCD_HOST"), port=int(config("ETCD_PORT"))
|
||||||
)
|
)
|
||||||
|
RESCAN_VMS = False
|
||||||
for events_iterator in [client.get_prefix(vm_prefix),
|
for events_iterator in [
|
||||||
client.watch_prefix(vm_prefix, timeout=10)]:
|
client.get_prefix(vm_prefix),
|
||||||
|
client.watch_prefix(vm_prefix, timeout=10),
|
||||||
|
]:
|
||||||
for e in events_iterator:
|
for e in events_iterator:
|
||||||
try:
|
try:
|
||||||
e.value = json.loads(e.value)
|
e.value = json.loads(e.value)
|
||||||
|
|
@ -165,17 +179,24 @@ def main(vm_prefix, host_prefix):
|
||||||
dead_hosts = dead_host_detection(hosts)
|
dead_hosts = dead_host_detection(hosts)
|
||||||
dead_host_mitigation(client, dead_hosts)
|
dead_host_mitigation(client, dead_hosts)
|
||||||
|
|
||||||
|
if RESCAN_VMS:
|
||||||
|
RESCAN_VMS = False # Assume we won't need it after this
|
||||||
|
vms = client.get_prefix(vm_prefix, value_in_json=True)
|
||||||
|
|
||||||
|
for vm in vms:
|
||||||
|
fake_e = EtcdEntry(
|
||||||
|
PseudoEtcdMeta(key=vm.key), value=vm.value
|
||||||
|
)
|
||||||
|
if (assign_host(client, vm_prefix, host_prefix,
|
||||||
|
fake_e) is None):
|
||||||
|
# We need it because we still have vm left
|
||||||
|
# to schedule
|
||||||
|
RESCAN_VMS = True
|
||||||
|
|
||||||
elif e_status == "REQUESTED_NEW":
|
elif e_status == "REQUESTED_NEW":
|
||||||
host_name = get_suitable_host(
|
if assign_host(client, vm_prefix, host_prefix, e) is None:
|
||||||
client, vm_prefix, host_prefix, e.value["specs"]
|
|
||||||
)
|
|
||||||
if host_name:
|
|
||||||
e.value["status"] = "SCHEDULED_DEPLOY"
|
|
||||||
e.value["hostname"] = host_name
|
|
||||||
client.put(e.key, json.dumps(e.value))
|
|
||||||
else:
|
|
||||||
# email admin
|
|
||||||
print("No Resource Left. Emailing admin....")
|
print("No Resource Left. Emailing admin....")
|
||||||
|
RESCAN_VMS = True
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue