f4e9261f1baddddf307e4ef1cc26bfa128d9a3e6
[living-lab-site.git] / cis / cis_lb / load_balancer / base.py
1 import threading
2 import urllib
3
4 import config
5 import logger
6
7 class LoadBalancer(threading.Thread):
8     
9     def __init__(self, id, queue):
10         """
11         Initialize Load Balancer,
12         """
13
14         threading.Thread.__init__(self, \
15                 name = '%s%02d' % (self.__class__.__name__, id))
16         
17         self.queue = queue
18     
19     def run(self):
20         
21         while True:
22             (request, data) = self.queue.get()
23             urls = config.CIS_URLS[:]
24             
25             while len(urls) != 0:
26                 cis = self.choose(urls)
27                 
28                 # Request is forwarded to the chosen CIS.
29                 try:
30                     urllib.urlopen(cis + request, data)
31                 except IOError:
32                     logger.log_msg('Failed to forward request to %s' % cis, \
33                             logger.LOG_LEVEL_ERROR)
34                     continue
35                 
36                 logger.log_msg('Request forwarded to %s' % cis, \
37                         logger.LOG_LEVEL_INFO)
38                 break
39             
40             self.queue.task_done()
41         
42     def choose(self, urls):
43         """
44         Implement load balancing policy in this method for child classes which
45         choses a CIS from urls parameter. The chosen URL should be deleted from
46         urls list.
47         """        
48         pass