def test_registration_build(self):
    tmpdir = tempfile.gettempdir()
    ver_dir = os.path.join(tmpdir, "infra")
    app_ver = "1.0.0"
    config = AgentConfig(tmpdir, ver_dir)
    config.set('agent', 'prefix', tmpdir)
    config.set('agent', 'current_ping_port', '33777')

    register = Register(config)
    data = register.build(State.INIT, State.INIT, {}, {}, app_ver, "tag", 1)
    #print ("Register: " + pprint.pformat(data))
    self.assertEquals(data['label'] != "", True, "hostname should not be empty")
    self.assertEquals(data['publicHostname'] != "", True, "publicHostname should not be empty")
    self.assertEquals(data['responseId'], 1)
    self.assertEquals(data['timestamp'] > 1353678475465L, True, "timestamp should not be empty")
    self.assertEquals(data['agentVersion'], '1', "agentVersion should not be empty")
    self.assertEquals(data['actualState'], State.INIT, "actualState should not be empty")
    self.assertEquals(data['expectedState'], State.INIT, "expectedState should not be empty")
    self.assertEquals(data['allocatedPorts'], {}, "allocatedPorts should be empty")
    self.assertEquals(data['logFolders'], {}, "allocated log should be empty")
    self.assertEquals(data['appVersion'], app_ver, "app version should match")
    self.assertEquals(data['tags'], "tag", "tags should be tag")
    self.assertEquals(len(data), 11)

    self.assertEquals(posixpath.join(tmpdir, "app/definition"), config.getResolvedPath("app_pkg_dir"))
    self.assertEquals(posixpath.join(tmpdir, "app/install"), config.getResolvedPath("app_install_dir"))
    self.assertEquals(posixpath.join(ver_dir, "."), config.getResolvedPath("app_log_dir"))
    self.assertEquals(posixpath.join(ver_dir, "."), config.getResolvedPath("log_dir"))
    self.assertEquals(posixpath.join(ver_dir, "."), config.getResolvedPath("app_task_dir"))
    def test_registration_build(self):
        tmpdir = tempfile.gettempdir()
        ver_dir = os.path.join(tmpdir, "infra")
        config = AgentConfig(tmpdir, ver_dir)
        config.set("agent", "prefix", tmpdir)
        config.set("agent", "current_ping_port", "33777")

        register = Register(config)
        data = register.build(State.INIT, State.INIT, {}, {}, "tag", 1)
        # print ("Register: " + pprint.pformat(data))
        self.assertEquals(data["label"] != "", True, "hostname should not be empty")
        self.assertEquals(data["publicHostname"] != "", True, "publicHostname should not be empty")
        self.assertEquals(data["responseId"], 1)
        self.assertEquals(data["timestamp"] > 1353678475465L, True, "timestamp should not be empty")
        self.assertEquals(data["agentVersion"], "1", "agentVersion should not be empty")
        self.assertEquals(data["actualState"], State.INIT, "actualState should not be empty")
        self.assertEquals(data["expectedState"], State.INIT, "expectedState should not be empty")
        self.assertEquals(data["allocatedPorts"], {}, "allocatedPorts should be empty")
        self.assertEquals(data["logFolders"], {}, "allocated log should be empty")
        self.assertEquals(data["tags"], "tag", "tags should be tag")
        self.assertEquals(len(data), 10)

        self.assertEquals(posixpath.join(tmpdir, "app/definition"), config.getResolvedPath("app_pkg_dir"))
        self.assertEquals(posixpath.join(tmpdir, "app/install"), config.getResolvedPath("app_install_dir"))
        self.assertEquals(posixpath.join(ver_dir, "."), config.getResolvedPath("app_log_dir"))
        self.assertEquals(posixpath.join(ver_dir, "."), config.getResolvedPath("log_dir"))
        self.assertEquals(posixpath.join(ver_dir, "."), config.getResolvedPath("app_task_dir"))
Beispiel #3
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
Beispiel #4
0
    def test_registration_build(self):
        tmpdir = tempfile.gettempdir()
        ver_dir = os.path.join(tmpdir, "infra")
        config = AgentConfig(tmpdir, ver_dir)
        config.set('agent', 'prefix', tmpdir)
        config.set('agent', 'current_ping_port', '33777')
        try:
            os.mkdir(ver_dir)
        except OSError as exception:
            if exception.errno != errno.EEXIST:
                raise
        pass
        ver_file = os.path.join(ver_dir, "version")
        with open(ver_file, "w") as text_file:
            text_file.write("1.3.0")

        register = Register(config)
        data = register.build(State.INIT, State.INIT, {}, 1)
        #print ("Register: " + pprint.pformat(data))
        self.assertEquals(data['hostname'] != "", True,
                          "hostname should not be empty")
        self.assertEquals(data['publicHostname'] != "", True,
                          "publicHostname should not be empty")
        self.assertEquals(data['responseId'], 1)
        self.assertEquals(data['timestamp'] > 1353678475465L, True,
                          "timestamp should not be empty")
        self.assertEquals(data['agentVersion'], '1.3.0',
                          "agentVersion should not be empty")
        self.assertEquals(data['actualState'], State.INIT,
                          "actualState should not be empty")
        self.assertEquals(data['expectedState'], State.INIT,
                          "expectedState should not be empty")
        self.assertEquals(data['allocatedPorts'], {},
                          "allocatedPorts should be empty")
        self.assertEquals(len(data), 8)

        self.assertEquals(os.path.join(tmpdir, "app/definition"),
                          config.getResolvedPath("app_pkg_dir"))
        self.assertEquals(os.path.join(tmpdir, "app/install"),
                          config.getResolvedPath("app_install_dir"))
        self.assertEquals(os.path.join(ver_dir, "."),
                          config.getResolvedPath("app_log_dir"))
        self.assertEquals(os.path.join(ver_dir, "."),
                          config.getResolvedPath("log_dir"))
        self.assertEquals(os.path.join(ver_dir, "."),
                          config.getResolvedPath("app_task_dir"))

        os.remove(ver_file)
        os.removedirs(ver_dir)
    def test_registration_build(self):
        tmpdir = tempfile.gettempdir()
        ver_dir = os.path.join(tmpdir, "infra")
        config = AgentConfig(tmpdir, ver_dir)
        config.set('agent', 'prefix', tmpdir)
        config.set('agent', 'current_ping_port', '33777')

        register = Register(config)
        data = register.build(State.INIT, State.INIT, {}, {}, "tag", 1)
        #print ("Register: " + pprint.pformat(data))
        self.assertEquals(data['label'] != "", True,
                          "hostname should not be empty")
        self.assertEquals(data['publicHostname'] != "", True,
                          "publicHostname should not be empty")
        self.assertEquals(data['responseId'], 1)
        self.assertEquals(data['timestamp'] > 1353678475465L, True,
                          "timestamp should not be empty")
        self.assertEquals(data['agentVersion'], '1',
                          "agentVersion should not be empty")
        self.assertEquals(data['actualState'], State.INIT,
                          "actualState should not be empty")
        self.assertEquals(data['expectedState'], State.INIT,
                          "expectedState should not be empty")
        self.assertEquals(data['allocatedPorts'], {},
                          "allocatedPorts should be empty")
        self.assertEquals(data['logFolders'], {},
                          "allocated log should be empty")
        self.assertEquals(data['tags'], "tag", "tags should be tag")
        self.assertEquals(len(data), 10)

        self.assertEquals(posixpath.join(tmpdir, "app/definition"),
                          config.getResolvedPath("app_pkg_dir"))
        self.assertEquals(posixpath.join(tmpdir, "app/install"),
                          config.getResolvedPath("app_install_dir"))
        self.assertEquals(posixpath.join(ver_dir, "."),
                          config.getResolvedPath("app_log_dir"))
        self.assertEquals(posixpath.join(ver_dir, "."),
                          config.getResolvedPath("log_dir"))
        self.assertEquals(posixpath.join(ver_dir, "."),
                          config.getResolvedPath("app_task_dir"))
  def test_registration_build(self):
    tmpdir = tempfile.gettempdir()
    ver_dir = os.path.join(tmpdir, "infra")
    config = AgentConfig(tmpdir, ver_dir)
    config.set('agent', 'prefix', tmpdir)
    config.set('agent', 'current_ping_port', '33777')
    try:
      os.mkdir(ver_dir)
    except OSError as exception:
      if exception.errno != errno.EEXIST:
        raise
    pass
    ver_file = os.path.join(ver_dir, "version")
    with open(ver_file, "w") as text_file:
      text_file.write("1.3.0")

    register = Register(config)
    data = register.build(State.INIT, State.INIT, {}, 1)
    #print ("Register: " + pprint.pformat(data))
    self.assertEquals(data['hostname'] != "", True, "hostname should not be empty")
    self.assertEquals(data['publicHostname'] != "", True, "publicHostname should not be empty")
    self.assertEquals(data['responseId'], 1)
    self.assertEquals(data['timestamp'] > 1353678475465L, True, "timestamp should not be empty")
    self.assertEquals(data['agentVersion'], '1.3.0', "agentVersion should not be empty")
    self.assertEquals(data['actualState'], State.INIT, "actualState should not be empty")
    self.assertEquals(data['expectedState'], State.INIT, "expectedState should not be empty")
    self.assertEquals(data['allocatedPorts'], {}, "allocatedPorts should be empty")
    self.assertEquals(len(data), 8)

    self.assertEquals(os.path.join(tmpdir, "app/definition"), config.getResolvedPath("app_pkg_dir"))
    self.assertEquals(os.path.join(tmpdir, "app/install"), config.getResolvedPath("app_install_dir"))
    self.assertEquals(os.path.join(ver_dir, "."), config.getResolvedPath("app_log_dir"))
    self.assertEquals(os.path.join(ver_dir, "."), config.getResolvedPath("log_dir"))
    self.assertEquals(os.path.join(ver_dir, "."), config.getResolvedPath("app_task_dir"))

    os.remove(ver_file)
    os.removedirs(ver_dir)
Beispiel #7
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
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