File size: 2,914 Bytes
bd51aea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 time
import logging
from threading import Thread, Event, Timer
from api import InstancesAPI

class LoadBalancer:
    def __init__(self, polling_interval=10, max_retries=3, initial_delay=1):
        self.version = "0.0.1 V Beta"
        self.instances = []
        self.polling_interval = polling_interval
        self.max_retries = max_retries
        self.initial_delay = initial_delay
        self.stop_event = Event()
        self.instances_api = InstancesAPI(self.instances)

    def register_instance(self, instance_url):
        if instance_url not in self.instances:
            self.instances.append(instance_url)
            logging.info(f"Registered instance {instance_url}")
        else:
            logging.info(f"Instance {instance_url} is already registered.")

    def remove_instance(self, instance_url):
        if instance_url in self.instances:
            self.instances.remove(instance_url)
            logging.info(f"Removed instance {instance_url}")
        else:
            logging.info(f"Instance {instance_url} not found for removal.")
        
    def get_reports(self):
        reports = self.instances_api.fetch_reports()
        for instance_url in self.instances[:]:  # Copy list to avoid modification during iteration
            if instance_url in reports:
                report = reports[instance_url]
                logging.info(f"Report from {instance_url}: {report}")
                self.process_report(instance_url, report)
            else:
                logging.error(f"Failed to get report from {instance_url}. Removing instance.")
                self.remove_instance(instance_url)

    def process_report(self, instance_url, report):
        # Process the report (film_store, tv_store, cache_size) here
        logging.info(f"Processing report from {instance_url}")
        # Example: Print the film_store and tv_store
        logging.info(f"Film Store: {report.get('film_store')}")
        logging.info(f"TV Store: {report.get('tv_store')}")
        logging.info(f"Cache Size: {report.get('cache_size')}")

    def start_polling(self):
        logging.info("Starting polling.")
        while not self.stop_event.is_set():
            self.get_reports()
            time.sleep(self.polling_interval)
        logging.info("Polling stopped.")

    def stop_polling(self):
        logging.info("Stopping polling.")
        self.stop_event.set()

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)

    load_balancer = LoadBalancer()

    # Example registration (in real use, handle this via an API endpoint)
    load_balancer.register_instance("http://localhost:5000")

    # Start polling in a separate thread
    polling_thread = Thread(target=load_balancer.start_polling)
    polling_thread.start()

    # Stop polling after some time for demonstration purposes
    Timer(300, load_balancer.stop_polling).start()  # Stop after 5 minutes