Subversion Repositories SmartDukaan

Rev

Rev 3124 | Blame | Compare with Previous | Last modification | View Log | RSS feed

'''
@author: rajveer
'''
from thrift.transport import TSocket
from thrift.transport.TTransport import TFramedTransport, TTransportException
from thrift.protocol.TBinaryProtocol import TBinaryProtocol
from shop2020.config.client.ConfigClient import ConfigClient
from shop2020.utils.Utils import log_entry
from shop2020.thriftpy.config.ttypes import ConfigException

class GenericClient:
    
    host = "localhost"
    port = 0
    attemptNumber = 1
    MAX_ATTEMPTS = 3    
    TOTAL_SERVICES = 2
    serviceNumber = 0
    
    def __init__(self, hostConfigKey, portConfigKey):
        self.hostConfigKey = hostConfigKey
        self.portConfigKey = hostConfigKey
        try:
            self.loadConfigParameters(hostConfigKey, portConfigKey)
            self.connectToService(1)
        except ConfigException:
            log_entry(self, "error getting data from config")
            raise TTransportException(0, "error getting data from config")
        
    def loadConfigParameters(self, hostConfigKey, portConfigKey):
        try:
            self.config_client = ConfigClient()
            self.host = self.config_client.get_property(hostConfigKey)
            self.port = int(self.config_client.get_property(portConfigKey))
        except:
            log_entry(self, "error getting data from config")
            raise
    
    def connectToService(self, attemptNumber):
        try:
            self.openTransport()
        except:
            if attemptNumber < self.MAX_ATTEMPTS:
                self.connectToService(attemptNumber+1)
            else:
                if self.serviceNumber < self.TOTAL_SERVICES:
                    self.serviceNumber += 1
                    log_entry(self, "Maximum attempts have reached. Failing over to another service instance")
                    self.loadConfigParameters(self.hostConfigKey + str(self.serviceNumber), self.portConfigKey + str(self.serviceNumber))
                    self.connectToService(1)
                    self.updateConfigParameters(self.hostConfigKey, self.portConfigKey)
                else:
                    log_entry(self, "Have tried enough services, giving up....")
                    raise
                
    def openTransport(self):
        self.transport = TSocket.TSocket(self.host, self.port)
        self.transport = TFramedTransport(self.transport)
        self.protocol = TBinaryProtocol(self.transport)
        self.transport.open()
    
    def updateConfigParameters(self, hostConfigKey, portConfigKey):
        try:
            self.config_client = ConfigClient()
            self.host = self.config_client.set_property(hostConfigKey, self.host)
            self.port = self.config_client.get_property(portConfigKey, self.port)
        except:
            log_entry(self, "error getting data from config")
            
    def close_connection(self):
        self.transport.close()