示例#1
0
class Controller(threading.Thread):
    def __init__(self, config):
        threading.Thread.__init__(self)
        logger.debug('Initializing Controller RPC thread.')
        self.lock = threading.Lock()
        self.safeMode = True
        self.credential = None
        self.config = config
        self.hostname = socket.gethostname()
        server_secured_url = 'https://' + config.get(
            'server', 'hostname') + ':' + config.get('server',
                                                     'secured_url_port')
        self.registerUrl = server_secured_url + '/agent/register/' + self.hostname
        self.heartbeatUrl = server_secured_url + '/agent/heartbeat/' + self.hostname
        self.netutil = NetUtil()

    def start(self):
        self.actionQueue = ActionQueue(self.config)
        self.actionQueue.start()
        self.register = Register()
        self.heartbeat = Heartbeat(self.actionQueue)
        pass

    def __del__(self):
        logger.info("Server connection disconnected.")
        pass

    def registerWithServer(self):
        retry = False
        firstTime = True
        registered = False
        id = -1
        ret = {}
        while registered == False:
            try:
                data = json.dumps(self.register.build(id))
                logger.info("Registering with the server " +
                            pprint.pformat(data))
                req = urllib2.Request(self.registerUrl, data,
                                      {'Content-Type': 'application/json'})
                stream = security.secured_url_open(req)
                response = stream.read()
                stream.close()
                ret = json.loads(response)
                logger.info("Registered with the server with " +
                            pprint.pformat(ret))
                registered = True
                pass
            except Exception, err:
                delay = self.netutil.CONNECT_SERVER_RETRY_INTERVAL_SEC
                logger.info("Unable to connect to: " + self.registerUrl,
                            exc_info=True)
                """ Sleeping for {0} seconds and then retrying again """.format(
                    delay)
                time.sleep(delay)
                pass
            pass
        return ret
示例#2
0
 def test_ActionQueueStartStop(self, CustomServiceOrchestrator_mock,
                               get_mock, process_command_mock):
   CustomServiceOrchestrator_mock.return_value = None
   dummy_controller = MagicMock()
   config = MagicMock()
   actionQueue = ActionQueue(config, dummy_controller)
   actionQueue.start()
   time.sleep(3)
   actionQueue.stop()
   actionQueue.join()
   self.assertEqual(actionQueue.stopped(), True, 'Action queue is not stopped.')
   self.assertTrue(process_command_mock.call_count > 1)
示例#3
0
 def test_ActionQueueStartStop(self, CustomServiceOrchestrator_mock,
                               get_mock, process_command_mock):
   CustomServiceOrchestrator_mock.return_value = None
   dummy_controller = MagicMock()
   config = MagicMock()
   actionQueue = ActionQueue(config, dummy_controller, self.agentToggleLogger)
   actionQueue.start()
   time.sleep(3)
   actionQueue.stop()
   actionQueue.join()
   self.assertEqual(actionQueue.stopped(), True, 'Action queue is not stopped.')
   self.assertTrue(process_command_mock.call_count > 1)
示例#4
0
class Controller(threading.Thread):
    def __init__(self, config, range=30):
        threading.Thread.__init__(self)
        logger.debug('Initializing Controller RPC thread.')
        self.lock = threading.Lock()
        self.safeMode = True
        self.credential = None
        self.config = config
        self.hostname = hostname.hostname()
        server_secured_url = 'https://' + config.get(
            'server', 'hostname') + ':' + config.get('server',
                                                     'secured_url_port')
        self.registerUrl = server_secured_url + '/agent/v1/register/' + self.hostname
        self.unregisterUrl = server_secured_url + '/agent/v1/unregister/' + self.hostname
        self.heartbeatUrl = server_secured_url + '/agent/v1/heartbeat/' + self.hostname
        self.netutil = NetUtil()
        self.responseId = -1
        self.repeatRegistration = False
        self.cachedconnect = None
        self.range = range
        self.hasMappedComponents = True
        self.actionQueue = ActionQueue(self.config)
        self.actionQueue.start()
        self.register = Register(self.config)
        self.unregister = Unregister(self.config)
        self.heartbeat = Heartbeat(self.actionQueue, self.config)

    def __del__(self):
        logger.info("Server connection disconnected.")
        pass

    def unregisterWithServer(self):
        id = -1
        ret = self.retriedRequest(self.unregisterUrl,
                                  lambda: self.unregister.build(id))
        if ret["response"] == "OK":
            logger.info("Unregistered with the server")
            print("Unregistered with the server")
        else:
            logMsg = "Error while unregistering with server: %s" % ret[
                "errorMessage"]
            logger.info(logMsg)
            print(logMsg)
        return ret

    def registerWithServer(self):
        id = -1
        ret = self.retriedRequest(self.registerUrl,
                                  lambda: self.register.build(id))
        logger.info("Registered with the server")
        print("Registered with the server")
        return ret

    def retriedRequest(self, requestUrl, payloadBuilder):
        successfulRequest = False
        id = -1
        ret = {}

        while not successfulRequest:
            try:
                data = json.dumps(payloadBuilder())
                logger.info("Sending request to url " + requestUrl + " " +
                            pprint.pformat(data))
                response = self.sendRequest(requestUrl, data)
                ret = json.loads(response)

                logger.info("Request successful " + pprint.pformat(ret))
                self.responseId = int(ret['responseId'])
                successfulRequest = True
                if 'statusCommands' in ret.keys():
                    logger.info("Got status commands on registration " +
                                pprint.pformat(ret['statusCommands']))
                    self.addToQueue(ret['statusCommands'])
                    pass
                else:
                    self.hasMappedComponents = False
                pass
            except ssl.SSLError:
                self.repeatRegistration = False
                return
            except Exception, err:
                # try a reconnect only after a certain amount of random time
                delay = randint(0, self.range)
                logger.info("Unable to connect to: " + requestUrl,
                            exc_info=True)
                """ Sleeping for {0} seconds and then retrying again """.format(
                    delay)
                time.sleep(delay)
                pass
            pass
        return ret
示例#5
0
class Controller(threading.Thread):

  def __init__(self, config):
    threading.Thread.__init__(self)
    logger.debug('Initializing Controller RPC thread.')
    self.lock = threading.Lock()
    self.safeMode = True
    self.credential = None
    self.config = config
    #Disabled security until we have fix for AMBARI-157
    #if(config.get('controller', 'user')!=None and config.get('controller', 'password')!=None):
    #  self.credential = { 'user' : config.get('controller', 'user'),
    #                      'password' : config.get('controller', 'password')
    #  }
    self.url = config.get('controller', 'url') + '/agent/controller/heartbeat/' + socket.gethostname()

  def start(self):
    self.actionQueue = ActionQueue(self.config)
    self.actionQueue.start()
    self.heartbeat = Heartbeat(self.actionQueue)

  def __del__(self):
    logger.info("Controller connection disconnected.")

  def run(self):
    id='-1'
    if self.credential!=None:
      auth_handler = urllib2.HTTPBasicAuthHandler()
      auth_handler.add_password(realm="Controller",
                                uri=self.url,
                                user=self.credential['user'],
                                passwd=self.credential['password'])
      opener = urllib2.build_opener(auth_handler)
      urllib2.install_opener(opener)
    retry=False
    firstTime=True
    while True:
      try:
        if retry==False:
          data = json.dumps(self.heartbeat.build(id))
          logger.debug(data)
        req = urllib2.Request(self.url, data, {'Content-Type': 'application/json'})
        f = urllib2.urlopen(req)
        response = f.read()
        f.close()
        data = json.loads(response)
        id=int(data['responseId'])
        self.actionQueue.put(data)
        if retry==True or firstTime==True:
          logger.info("Controller connection established")
          firstTime=False
        retry=False
      except Exception, err:
        retry=True
        if "code" in err:
          logger.error(err.code)
        else:
          logger.error("Unable to connect to: "+self.url,exc_info=True)
      if self.actionQueue.isIdle():
        time.sleep(30)
      else:
        time.sleep(1)
class Controller(threading.Thread):

  def __init__(self, config, range=30):
    threading.Thread.__init__(self)
    logger.debug('Initializing Controller RPC thread.')
    self.lock = threading.Lock()
    self.safeMode = True
    self.credential = None
    self.config = config
    self.hostname = hostname.hostname()
    server_secured_url = 'https://' + config.get('server', 'hostname') + ':' + config.get('server', 'secured_url_port')
    self.registerUrl = server_secured_url + '/agent/v1/register/' + self.hostname
    self.unregisterUrl = server_secured_url + '/agent/v1/unregister/' + self.hostname
    self.heartbeatUrl = server_secured_url + '/agent/v1/heartbeat/' + self.hostname
    self.netutil = NetUtil()
    self.responseId = -1
    self.repeatRegistration = False
    self.cachedconnect = None
    self.range = range
    self.hasMappedComponents = True
    self.actionQueue = ActionQueue(self.config)
    self.actionQueue.start()
    self.register = Register(self.config)
    self.unregister = Unregister(self.config)
    self.heartbeat = Heartbeat(self.actionQueue, self.config)
  
  def __del__(self):
    logger.info("Server connection disconnected.")
    pass

  def unregisterWithServer(self):
    id = -1
    ret = self.retriedRequest(self.unregisterUrl, lambda: self.unregister.build(id))
    if ret["response"] == "OK":
        logger.info("Unregistered with the server")
        print("Unregistered with the server")
    else:
        logMsg = "Error while unregistering with server: %s" % ret["errorMessage"]
        logger.info(logMsg)
        print(logMsg)
    return ret
  
  def registerWithServer(self):
    id = -1
    ret = self.retriedRequest(self.registerUrl, lambda: self.register.build(id))
    logger.info("Registered with the server")
    print("Registered with the server")
    return ret

  def retriedRequest(self, requestUrl, payloadBuilder):
    successfulRequest=False
    id = -1
    ret = {}

    while not successfulRequest:
      try:
        data = json.dumps(payloadBuilder())
        logger.info("Sending request to url " + requestUrl + " " + pprint.pformat(data))
        response = self.sendRequest(requestUrl, data)
        ret = json.loads(response)

        logger.info("Request successful " + pprint.pformat(ret))
        self.responseId= int(ret['responseId'])
        successfulRequest = True
        if 'statusCommands' in ret.keys():
          logger.info("Got status commands on registration " + pprint.pformat(ret['statusCommands']) )
          self.addToQueue(ret['statusCommands'])
          pass
        else:
          self.hasMappedComponents = False
        pass
      except ssl.SSLError:
        self.repeatRegistration=False
        return
      except Exception, err:
        # try a reconnect only after a certain amount of random time
        delay = randint(0, self.range)
        logger.info("Unable to connect to: " + requestUrl, exc_info = True)
        """ Sleeping for {0} seconds and then retrying again """.format(delay)
        time.sleep(delay)
        pass
      pass  
    return ret