import unittest import sys import json import multiprocessing import time from datetime import datetime from os.path import dirname BASE_DIR = dirname(dirname(__file__)) sys.path.insert(0, BASE_DIR) from main import ( accumulated_specs, remaining_resources, VmPool, dead_host_detection, dead_host_mitigation, main, ) from etcd3_wrapper import Etcd3Wrapper class TestDeadHostMechanism(unittest.TestCase): def setUp(self): self.client = Etcd3Wrapper() self.host_prefix = "/test/host" self.vm_prefix = "/test/vm" self.client.client.delete_prefix(self.host_prefix) self.client.client.delete_prefix(self.vm_prefix) self.create_hosts() def create_hosts(self): host1 = { "cpu": 32, "ram": 128, "hdd": 1024, "sdd": 0, "status": "ALIVE", "last_heartbeat": datetime.utcnow().isoformat(), } host2 = { "cpu": 16, "ram": 64, "hdd": 512, "sdd": 0, "status": "ALIVE", "last_heartbeat": datetime(2011, 1, 1).isoformat(), } host3 = {"cpu": 16, "ram": 32, "hdd": 256, "sdd": 256} host4 = { "cpu": 16, "ram": 32, "hdd": 256, "sdd": 256, "status": "DEAD", "last_heartbeat": datetime(2011, 1, 1).isoformat(), } with self.client.client.lock("lock"): self.client.put(f"{self.host_prefix}/1", host1, value_in_json=True) self.client.put(f"{self.host_prefix}/2", host2, value_in_json=True) self.client.put(f"{self.host_prefix}/3", host3, value_in_json=True) self.client.put(f"{self.host_prefix}/4", host4, value_in_json=True) def test_dead_host_detection(self): hosts = self.client.get_prefix(self.host_prefix, value_in_json=True) deads = dead_host_detection(hosts) self.assertEqual(deads, ["/test/host/2", "/test/host/3"]) return deads def test_dead_host_mitigation(self): deads = self.test_dead_host_detection() dead_host_mitigation(self.client, deads) hosts = self.client.get_prefix(self.host_prefix, value_in_json=True) deads = dead_host_detection(hosts) self.assertEqual(deads, []) if __name__ == "__main__": unittest.main()