Esempio n. 1
0
    def __init__(self, logger, staticFileHandler):
        self._logger = logger
        self._sfh = staticFileHandler

        self.kz = kazoo.client.KazooClient(
            gConfig.zk,
            logger=self._logger,
            handler=kazoo.handlers.gevent.SequentialGeventHandler())
        self.kz.start()
        self.kz.ensure_path(ezRPKazoo.KZLOCKFILE)
        self.kz.ensure_path(ezRPKazoo.KZCONFLOC)
        self.kz.ensure_path(ezRPKazoo.KZWATCHLOC)
        self.kz.ensure_path(ezRPKazoo.KZSSLCONFLOC)

        accConfig = AccumuloConfiguration(gConfig.ezproperties)
        self.ac = EzRPCertStore(host=accConfig.getProxyHost(),
                                port=accConfig.getProxyPort(),
                                user=accConfig.getUsername(),
                                password=accConfig.getPassword(),
                                privateKey=gConfig.ez_keyfile,
                                logger=self._logger)

        self.lock = gevent.coros.Semaphore()
        self.configurer = ezRPConfigNginx.Configurer(self.kz, self.ac,
                                                     self._logger, self._sfh)
Esempio n. 2
0
  def __init__(self, logger):
    self._logger = logger
    
    self.kz = kazoo.client.KazooClient(gConfig.zk, logger=self._logger, handler=kazoo.handlers.gevent.SequentialGeventHandler())
    self.kz.start()
    self.kz.ensure_path(ezRPKazoo.KZLOCKFILE)
    self.kz.ensure_path(ezRPKazoo.KZCONFLOC)
    self.kz.ensure_path(ezRPKazoo.KZWATCHLOC)
    self.kz.ensure_path(ezRPKazoo.KZSSLCONFLOC)

    accConfig = AccumuloConfiguration(gConfig.ezproperties)
    self.ac = EzRPCertStore(host=accConfig.getProxyHost(),
                            port=accConfig.getProxyPort(),
                            user=accConfig.getUsername(),
                            password=accConfig.getPassword(),
                            privateKey=gConfig.ez_keyfile,
                            logger=self._logger)
    self.lock = gevent.coros.Semaphore()
 def configurationChangeQueueGreenlet(self):
     kz = None
     ac = None
     task = None
     while gConfig.run:
         try:
             if kz is None:
                 kz = kazoo.client.KazooClient(
                     gConfig.zk,
                     logger=self._logger,
                     handler=kazoo.handlers.gevent.SequentialGeventHandler(
                     ))
                 kz.start()
             if ac is None:
                 accConfig = AccumuloConfiguration(gConfig.ezproperties)
                 ac = EzRPCertStore(host=accConfig.getProxyHost(),
                                    port=accConfig.getProxyPort(),
                                    user=accConfig.getUsername(),
                                    password=accConfig.getPassword(),
                                    privateKey=gConfig.ez_keyfile,
                                    logger=self._logger)
             if task is None:
                 task = gConfig.configurationChangeQueue.get()
             configurer = ezRPConfigNginx.Configurer(
                 kz, ac, self._logger, self._sfh)
             self._logger.info(
                 "processing entry in configuration work queue")
             configurer.configure()
             task = None
             gConfig.configurationChangeQueue.task_done()
         except EzRPCertStoreException as ex:
             self._logger.exception(
                 'CertStore exception while running configurationChangeQueueGreenlet: %s'
                 % str(ex))
             gConfig.run = False
         except Exception as e:
             self._logger.exception(
                 'Exception processing configuration change: %s' % str(e))
             kz = None
             ac = None
     self._logger.info("configurationChangeQueueGreenlet() exiting")
class EzReverseProxyHandler(object):
  def __init__(self, logger, staticFileHandler):
    self._logger = logger
    self._sfh = staticFileHandler

    self.kz = kazoo.client.KazooClient(gConfig.zk, logger=self._logger, handler=kazoo.handlers.gevent.SequentialGeventHandler())
    self.kz.start()
    self.kz.ensure_path(ezRPKazoo.KZLOCKFILE)
    self.kz.ensure_path(ezRPKazoo.KZCONFLOC)
    self.kz.ensure_path(ezRPKazoo.KZWATCHLOC)
    self.kz.ensure_path(ezRPKazoo.KZSSLCONFLOC)

    accConfig = AccumuloConfiguration(gConfig.ezproperties)
    self.ac = EzRPCertStore(host=accConfig.getProxyHost(),
                            port=accConfig.getProxyPort(),
                            user=accConfig.getUsername(),
                            password=accConfig.getPassword(),
                            privateKey=gConfig.ez_keyfile,
                            logger=self._logger)

    self.lock = gevent.coros.Semaphore()
    self.configurer = ezRPConfigNginx.Configurer(self.kz, self.ac, self._logger, self._sfh)


  def ping(self):
    self._logger.info("thrift interface received a ping()")
    rtn = True
    if gConfig.clientService.exception:
        self._logger.error("Error in thrift service greenlet: {0}".format(gConfig.clientService.exception))
        rtn = False
    if gConfig.zkMonitor.exception:
        self._logger.error("Error in zookeeper monitor greenlet: {0}".format(gConfig.zkMonitor.exception))
        rtn = False
    if gConfig.cfgGreenlet.exception:
        self._logger.error("Error in configuration change greenlet: {0}".format(gConfig.cfgGreenlet.exception))
        rtn = False
    if gConfig.wGreenlet.exception:
        self._logger.error("Error in shutdown monitor greenlet: {0}".format(gConfig.wGreenlet.exception))
        rtn = False

    return rtn

  def _serializeUpstreamServerRegistration(self, registration):
      transport = TTransport.TMemoryBuffer()
      protocol = TBinaryProtocol.TBinaryProtocol(transport)
      registration.write(protocol)
      return transport.getvalue()

  def _validateUpstreamServerRegistration(self,registration):
    # eventually this will validate the user facing hostname
    ezRPRegistration.get_ngx_server_name(registration)

    # eventually this will validate the user facing location
    ezRPRegistration.get_ngx_location(registration)

    if registration.contentServiceType != ContentServiceType.STATIC_ONLY:
        # validates upstream portnumber - not yet host
        ezRPRegistration.getUpstreamHostAndPort(registration)

    # eventually will validate the upstream path
    ezRPRegistration.getUpstreamPath(registration)

    # validate timeout and timeoutTries
    try:
      assert registration.timeout > 0
      assert registration.timeout <=120
    except:
          raise RegistrationInvalidException("timeout: %d not in range [1,120]" % (registration.timeout))
    try:
      assert registration.timeoutTries > 0
      assert registration.timeoutTries <=10
    except:
          raise RegistrationInvalidException("timeoutTries: %d not in range [1,10]" % (registration.timeoutTries))

    if gConfig.defaultEznginxOps not in registration.authOperations:
        raise RegistrationInvalidException("%s authorization operation is required. Specified operations are: %s" % (AuthorizationOperation._VALUES_TO_NAMES[gConfig.defaultEznginxOps], ' ,'.join([AuthorizationOperation._VALUES_TO_NAMES[x] for x in registration.authOperations])))

  def _validateNoConflictingUpstreamPath(self,registration):

    # the node in zk has 3 parts base62 encoded parts separated by _
    # see getNodeName for details
    matchingPrefix = ezRPRegistration.getNodeName(registration).rsplit('_',1)[0]+'_'
    basePrefix = matchingPrefix.split('_')[0]+'_'
    with self.lock:
        allConfigs = self.kz.get_children(ezRPKazoo.KZCONFLOC)
    sameUserFacingConfigs = [x for x in allConfigs if x.startswith(basePrefix)]

    # if there aren't any existing nodes in zk that have the same UserFacingPrefix
    # then we're OK to create one with any upstream path, and can just return here
    if len(sameUserFacingConfigs) > 0:
        # if one or more of the existing nodes with the same UserFacingPrefix has
        # a different upstream path, throw an invalid registration exception
        collidingConfigs = [x for x in sameUserFacingConfigs if not x.startswith(matchingPrefix)]
        if len(collidingConfigs) > 0:
            raise RegistrationInvalidException("that UserFacingUrlPrefix is already registered with a different UpstreamPath")

  def _isServerUnique(self, registration):
     encodedServceNamePrefix = ezRPRegistration.getNodeName(registration).rsplit('_',1)[0]+'_'
     allConfigs = self.kz.get_children(ezRPKazoo.KZCONFLOC)
     return False if (len([x for x in allConfigs if x.startswith(encodedServceNamePrefix)]) > 1) else True

  def addUpstreamServerRegistration(self, registration):
    """
    Parameters:
     - registration
    """
    self._logger.info("thrift interface received a call to addUpstreamServerRegistration with a registration value of %s" % (registration))
    self._validateUpstreamServerRegistration(registration)
    self._validateNoConflictingUpstreamPath(registration)
    nodeName = ezRPKazoo.KZCONFLOC + '/' + ezRPRegistration.getNodeName(registration)
    nodeData = self._serializeUpstreamServerRegistration(registration)

    with self.lock:
        lock = self.kz.Lock(ezRPKazoo.KZLOCKFILE,"another contender")
        with lock:
            self._logger.info("addUpstreamServerRegistration registering")
            if not self.kz.exists(nodeName):
              self._logger.info("Adding node in zookeeper\n\tNode Name: %s\n\tNode Data:%s" % (nodeName,nodeData))
              self.kz.create(nodeName,nodeData)
            else:
              self.kz.set(nodeName,nodeData)
              self._logger.info("Updating node in zookeeper\n\tNode Name: %s\n\tNode Data:%s" % (nodeName,nodeData))
            self.kz.set(ezRPKazoo.KZWATCHLOC, str(gConfig.current_milli_time()))

  def removeUpstreamServerRegistration(self, registration):
    """
    Parameters:
     - registration
    """
    self._logger.info("thrift interface received a call to removeUpstreamServerRegistration with a registration value of %s" % (registration))
    self._validateUpstreamServerRegistration(registration)
    self._validateNoConflictingUpstreamPath(registration)
    nodeName =  ezRPKazoo.KZCONFLOC + '/' + ezRPRegistration.getNodeName(registration)
    serverName = ezRPRegistration.get_ngx_server_name(registration)
    sslConfigNodeName = ezRPKazoo.KZSSLCONFLOC + '/' + serverName
    with self.lock:
        lock = self.kz.Lock(ezRPKazoo.KZLOCKFILE,"another contender")
        with lock:
            if not self.kz.exists(nodeName):
              raise RegistrationNotFoundException("no registration found for %s" % (nodeName))
            else:
              self._logger.info("removeUpstreamServerRegistration removing %s" % (nodeName))
              self.kz.delete(nodeName)
              if self.kz.exists(sslConfigNodeName) and self._isServerUnique(registration):
                  try:
                      #remove certs if server registration is unique
                      self.kz.delete(sslConfigNodeName)
                      self.ac.remove(serverName)
                      self._logger.info("removed certs for server %s" % serverName)
                  except EzRPCertStoreException as ex:
                      self._logger.exception('Exception in removing certs for server %s' % serverName)
              self.kz.set(ezRPKazoo.KZWATCHLOC, str(gConfig.current_milli_time()))

  def removeReverseProxiedPath(self, userFacingUrlPrefix):
    """
    Parameters:
     - userFacingUrlPrefix
    """
    self._logger.info("thrift interface received a call to removeReverseProxiedPath with a path value of %s" % userFacingUrlPrefix)
    prefixToRemove = zbase62.b2a(userFacingUrlPrefix)+ "_"
    with self.lock:
        allNodes = self.kz.get_children(ezRPKazoo.KZCONFLOC)
        fileNamesToRemove = [x for x in allNodes if x.startswith(prefixToRemove)]
        for fn in fileNamesToRemove:
            self._logger.info("removeReverseProxiedPath is deleting %s from zookeeper" % (ezRPKazoo.KZCONFLOC+'/'+fn))
            self.kz.delete(ezRPKazoo.KZCONFLOC+'/'+fn)
        if len(fileNamesToRemove) > 0:
            self.kz.set(ezRPKazoo.KZWATCHLOC, str(gConfig.current_milli_time()))

  def removeAllProxyRegistrations():
    self._logger.log("thrift interface received a call to removeAllProxyRegistration")
    allNodes = self.kz.get_children(ezRPKazoo.KZCONFLOC)
    with self.lock:
        for fn in allNodes:
            self._logger.log("removeAllProxyRegistrations is deleting %s from zookeeper" % (ezRPKazoo.KZCONFLOC+'/'+fn))
            self.kz.delete(ezRPKazoo.KZCONFLOC+'/'+fn)
        self.kz.set(ezRPKazoo.KZWATCHLOC, str(gConfig.current_milli_time()))

  def isUpstreamServerRegistered(self, registration): #UpstreamServerRegistration
    '''
        Does not verify timout and  timeoutTries match
    '''
    self._logger.info("thrift interface received a call to isUpstreamServerRegistered with a registration value of %s" % (registration))
    nodeName =  ezRPKazoo.KZCONFLOC + '/' + ezRPRegistration.getNodeName(registration)
    with self.lock:
        if self.kz.exists(nodeName):
            return True
    return False

  def isReverseProxiedPathRegistered(self, userFacingUrlPrefix): #string
    self._logger.info("thrift interface received a call to isReverseProxiedPathRegistered with a path value of %s" % (userFacingUrlPrefix))
    prefix = zbase62.b2a(userFacingUrlPrefix)+ "_"
    with self.lock:
        allNodes = self.kz.get_children(ezRPKazoo.KZCONFLOC)
    matchingFilenames = [x for x in allNodes if x.startswith(prefix)]
    if len(matchingFilenames):
        return True
    return False

  def getAllUpstreamServerRegistrations(self):
    self._logger.info("thrift interface received a call to getAllUpstreamServerRegistrations")
    with self.lock:
        return self.configurer.getAllRegistrations()

  def getRegistrationsForProxiedPath(self, userFacingUrlPrefix):
    self._logger.info('thrift interface received a call to getRegistrationsForProxiedPath with a path value of %s' % userFacingUrlPrefix)
    prefix = zbase62.b2a(userFacingUrlPrefix)+ "_"
    with self.lock:
      return self.configurer.getAllRegistrationsWihPrefix(zbase62.b2a(userFacingUrlPrefix)+ '_')

  def getRegistrationsForApp(self, appName):
    self._logger.info('thrift interface received a call to getRegistrationsForApp for app %s' % appName)
    with self.lock:
      return self.configurer.getAllRegistrationsForApp(appName)

  def addServerCerts(self, serverName, info):
     self._logger.info("thrift interface recevied a call to addServerCerts - %s" % (serverName))
     if serverName is None or not isinstance(serverName, basestring):
         raise EzFrontendCertException(message="Error in adding server cert. serverName must be a STRING")
     if info is None or info.certificateContents is None or info.keyContents is None:
         raise EzFrontendCertException(message="Error in adding server cert. info, info.certificateContents, info.keyContents should not be None.")
     if not isinstance(info.certificateContents, str) or not isinstance(info.keyContents, str):
         raise EzFrontendCertException(message="Error in adding server cert. info.certificateContents and info.keyContents must be a STRING")
     try:
         self.ac.put(serverName, info.certificateContents, info.keyContents)
         self.kz.ensure_path(sslconfig_node(serverName))
         self.kz.set(ezRPKazoo.KZWATCHLOC, str(gConfig.current_milli_time()))
     except Exception as e:
         self._logger.exception("Exception in adding server certs for %s: %s" % (serverName, str(e)))
         raise EzFrontendCertException(message="Internal error in adding server cert for %s." % (serverName))

  def removeServerCerts(self, serverName):
     self._logger.info("thrift interface recevied a call to removeServerCerts - %s" % serverName)
     if serverName is None or not isinstance(serverName, basestring):
         raise EzFrontendCertException(message="Error in removing server cert. serverName must be a STRING")
     try:
         self.ac.remove(serverName)
         self.kz.delete(sslconfig_node(serverName))
         self.kz.set(ezRPKazoo.KZWATCHLOC, str(gConfig.current_milli_time()))
     except Exception as e:
         self._logger.exception("Exception in removing server certs for %s: %s\n%s" % (serverName, str(e)))
         raise EzFrontendCertException(message="Internal error in removing server cert for %s." % (serverName))

  def isServerCertPresent(self, serverName):
     self._logger.info("thrift interface recevied a call to isServerCertPresent - %s" % serverName)
     if serverName is None or not isinstance(serverName, basestring):
         raise EzFrontendCertException(message="Error in checking server cert. serverName must be a STRING")
     try:
         return self.ac.exists(serverName)
     except Exception as e:
         self._logger.exception("Exception in checking server certs for %s:" % serverName)
         raise EzFrontendCertException(message="Internal error in checking server cert for %s." % serverName)

  def addStaticContent(self, content):
    '''
    Save the file in Accumulo
    '''
    self._logger.info("thrift interface received a call to addStaticContent")
    if self._sfh.addStaticContent(content):
        # reconfigure
        self._logger.info('Triggering zookeeper watch node')
        self.kz.ensure_path(ezRPKazoo.KZWATCHLOC)
        self.kz.set(ezRPKazoo.KZWATCHLOC, str(gConfig.current_milli_time()))
    else:
        pass


  def removeStaticContent(self, content):
    '''
     Delete the file from Accumulo
    '''
    self._logger.info("thrift interface received a call to removeStaticContent")
    if self._sfh.removeStaticContent(content):
        # reconfigure
        self._logger.info('Triggering zookeeper watch node')
        self.kz.ensure_path(ezRPKazoo.KZWATCHLOC)
        self.kz.set(ezRPKazoo.KZWATCHLOC, str(gConfig.current_milli_time()))
    else:
         pass

  def isStaticContentPresentForProxiedPath(self, userFacingUrlPrefix):
       '''
       Returns True if Static content available for userFacingUrlPrefix
       '''
       self._logger.info("thrift interface received a call to isStaticContentPresentForProxiedPath - %s" % (str(userFacingUrlPrefix)))
       return self._sfh.isStaticContentPresent(userFacingUrlPrefix)
Esempio n. 5
0
class EzReverseProxyHandler(object):
    def __init__(self, logger, staticFileHandler):
        self._logger = logger
        self._sfh = staticFileHandler

        self.kz = kazoo.client.KazooClient(
            gConfig.zk,
            logger=self._logger,
            handler=kazoo.handlers.gevent.SequentialGeventHandler())
        self.kz.start()
        self.kz.ensure_path(ezRPKazoo.KZLOCKFILE)
        self.kz.ensure_path(ezRPKazoo.KZCONFLOC)
        self.kz.ensure_path(ezRPKazoo.KZWATCHLOC)
        self.kz.ensure_path(ezRPKazoo.KZSSLCONFLOC)

        accConfig = AccumuloConfiguration(gConfig.ezproperties)
        self.ac = EzRPCertStore(host=accConfig.getProxyHost(),
                                port=accConfig.getProxyPort(),
                                user=accConfig.getUsername(),
                                password=accConfig.getPassword(),
                                privateKey=gConfig.ez_keyfile,
                                logger=self._logger)

        self.lock = gevent.coros.Semaphore()
        self.configurer = ezRPConfigNginx.Configurer(self.kz, self.ac,
                                                     self._logger, self._sfh)

    def ping(self):
        self._logger.info("thrift interface received a ping()")
        rtn = True
        if gConfig.clientService.exception:
            self._logger.error("Error in thrift service greenlet: {0}".format(
                gConfig.clientService.exception))
            rtn = False
        if gConfig.zkMonitor.exception:
            self._logger.error(
                "Error in zookeeper monitor greenlet: {0}".format(
                    gConfig.zkMonitor.exception))
            rtn = False
        if gConfig.cfgGreenlet.exception:
            self._logger.error(
                "Error in configuration change greenlet: {0}".format(
                    gConfig.cfgGreenlet.exception))
            rtn = False
        if gConfig.wGreenlet.exception:
            self._logger.error(
                "Error in shutdown monitor greenlet: {0}".format(
                    gConfig.wGreenlet.exception))
            rtn = False

        return rtn

    def _serializeUpstreamServerRegistration(self, registration):
        transport = TTransport.TMemoryBuffer()
        protocol = TBinaryProtocol.TBinaryProtocol(transport)
        registration.write(protocol)
        return transport.getvalue()

    def _validateUpstreamServerRegistration(self, registration):
        # eventually this will validate the user facing hostname
        ezRPRegistration.get_ngx_server_name(registration)

        # eventually this will validate the user facing location
        ezRPRegistration.get_ngx_location(registration)

        if registration.contentServiceType != ContentServiceType.STATIC_ONLY:
            # validates upstream portnumber - not yet host
            ezRPRegistration.getUpstreamHostAndPort(registration)

        # eventually will validate the upstream path
        ezRPRegistration.getUpstreamPath(registration)

        # validate timeout and timeoutTries
        try:
            assert registration.timeout > 0
            assert registration.timeout <= 120
        except:
            raise RegistrationInvalidException(
                "timeout: %d not in range [1,120]" % (registration.timeout))
        try:
            assert registration.timeoutTries > 0
            assert registration.timeoutTries <= 10
        except:
            raise RegistrationInvalidException(
                "timeoutTries: %d not in range [1,10]" %
                (registration.timeoutTries))

        if gConfig.defaultEznginxOps not in registration.authOperations:
            raise RegistrationInvalidException(
                "%s authorization operation is required. Specified operations are: %s"
                % (AuthorizationOperation._VALUES_TO_NAMES[
                    gConfig.defaultEznginxOps], ' ,'.join([
                        AuthorizationOperation._VALUES_TO_NAMES[x]
                        for x in registration.authOperations
                    ])))

    def _validateNoConflictingUpstreamPath(self, registration):

        # the node in zk has 3 parts base62 encoded parts separated by _
        # see getNodeName for details
        matchingPrefix = ezRPRegistration.getNodeName(registration).rsplit(
            '_', 1)[0] + '_'
        basePrefix = matchingPrefix.split('_')[0] + '_'
        with self.lock:
            allConfigs = self.kz.get_children(ezRPKazoo.KZCONFLOC)
        sameUserFacingConfigs = [
            x for x in allConfigs if x.startswith(basePrefix)
        ]

        # if there aren't any existing nodes in zk that have the same UserFacingPrefix
        # then we're OK to create one with any upstream path, and can just return here
        if len(sameUserFacingConfigs) > 0:
            # if one or more of the existing nodes with the same UserFacingPrefix has
            # a different upstream path, throw an invalid registration exception
            collidingConfigs = [
                x for x in sameUserFacingConfigs
                if not x.startswith(matchingPrefix)
            ]
            if len(collidingConfigs) > 0:
                raise RegistrationInvalidException(
                    "that UserFacingUrlPrefix is already registered with a different UpstreamPath"
                )

    def _isServerUnique(self, registration):
        encodedServceNamePrefix = ezRPRegistration.getNodeName(
            registration).rsplit('_', 1)[0] + '_'
        allConfigs = self.kz.get_children(ezRPKazoo.KZCONFLOC)
        return False if (len(
            [x for x in allConfigs
             if x.startswith(encodedServceNamePrefix)]) > 1) else True

    def addUpstreamServerRegistration(self, registration):
        """
    Parameters:
     - registration
    """
        self._logger.info(
            "thrift interface received a call to addUpstreamServerRegistration with a registration value of %s"
            % (registration))
        self._validateUpstreamServerRegistration(registration)
        self._validateNoConflictingUpstreamPath(registration)
        nodeName = ezRPKazoo.KZCONFLOC + '/' + ezRPRegistration.getNodeName(
            registration)
        nodeData = self._serializeUpstreamServerRegistration(registration)

        with self.lock:
            lock = self.kz.Lock(ezRPKazoo.KZLOCKFILE, "another contender")
            with lock:
                self._logger.info("addUpstreamServerRegistration registering")
                if not self.kz.exists(nodeName):
                    self._logger.info(
                        "Adding node in zookeeper\n\tNode Name: %s\n\tNode Data:%s"
                        % (nodeName, nodeData))
                    self.kz.create(nodeName, nodeData)
                else:
                    self.kz.set(nodeName, nodeData)
                    self._logger.info(
                        "Updating node in zookeeper\n\tNode Name: %s\n\tNode Data:%s"
                        % (nodeName, nodeData))
                self.kz.set(ezRPKazoo.KZWATCHLOC,
                            str(gConfig.current_milli_time()))

    def removeUpstreamServerRegistration(self, registration):
        """
    Parameters:
     - registration
    """
        self._logger.info(
            "thrift interface received a call to removeUpstreamServerRegistration with a registration value of %s"
            % (registration))
        self._validateUpstreamServerRegistration(registration)
        self._validateNoConflictingUpstreamPath(registration)
        nodeName = ezRPKazoo.KZCONFLOC + '/' + ezRPRegistration.getNodeName(
            registration)
        serverName = ezRPRegistration.get_ngx_server_name(registration)
        sslConfigNodeName = ezRPKazoo.KZSSLCONFLOC + '/' + serverName
        with self.lock:
            lock = self.kz.Lock(ezRPKazoo.KZLOCKFILE, "another contender")
            with lock:
                if not self.kz.exists(nodeName):
                    raise RegistrationNotFoundException(
                        "no registration found for %s" % (nodeName))
                else:
                    self._logger.info(
                        "removeUpstreamServerRegistration removing %s" %
                        (nodeName))
                    self.kz.delete(nodeName)
                    if self.kz.exists(sslConfigNodeName
                                      ) and self._isServerUnique(registration):
                        try:
                            #remove certs if server registration is unique
                            self.kz.delete(sslConfigNodeName)
                            self.ac.remove(serverName)
                            self._logger.info("removed certs for server %s" %
                                              serverName)
                        except EzRPCertStoreException as ex:
                            self._logger.exception(
                                'Exception in removing certs for server %s' %
                                serverName)
                    self.kz.set(ezRPKazoo.KZWATCHLOC,
                                str(gConfig.current_milli_time()))

    def removeReverseProxiedPath(self, userFacingUrlPrefix):
        """
    Parameters:
     - userFacingUrlPrefix
    """
        self._logger.info(
            "thrift interface received a call to removeReverseProxiedPath with a path value of %s"
            % userFacingUrlPrefix)
        prefixToRemove = zbase62.b2a(userFacingUrlPrefix) + "_"
        with self.lock:
            allNodes = self.kz.get_children(ezRPKazoo.KZCONFLOC)
            fileNamesToRemove = [
                x for x in allNodes if x.startswith(prefixToRemove)
            ]
            for fn in fileNamesToRemove:
                self._logger.info(
                    "removeReverseProxiedPath is deleting %s from zookeeper" %
                    (ezRPKazoo.KZCONFLOC + '/' + fn))
                self.kz.delete(ezRPKazoo.KZCONFLOC + '/' + fn)
            if len(fileNamesToRemove) > 0:
                self.kz.set(ezRPKazoo.KZWATCHLOC,
                            str(gConfig.current_milli_time()))

    def removeAllProxyRegistrations():
        self._logger.log(
            "thrift interface received a call to removeAllProxyRegistration")
        allNodes = self.kz.get_children(ezRPKazoo.KZCONFLOC)
        with self.lock:
            for fn in allNodes:
                self._logger.log(
                    "removeAllProxyRegistrations is deleting %s from zookeeper"
                    % (ezRPKazoo.KZCONFLOC + '/' + fn))
                self.kz.delete(ezRPKazoo.KZCONFLOC + '/' + fn)
            self.kz.set(ezRPKazoo.KZWATCHLOC,
                        str(gConfig.current_milli_time()))

    def isUpstreamServerRegistered(self,
                                   registration):  #UpstreamServerRegistration
        '''
        Does not verify timout and  timeoutTries match
    '''
        self._logger.info(
            "thrift interface received a call to isUpstreamServerRegistered with a registration value of %s"
            % (registration))
        nodeName = ezRPKazoo.KZCONFLOC + '/' + ezRPRegistration.getNodeName(
            registration)
        with self.lock:
            if self.kz.exists(nodeName):
                return True
        return False

    def isReverseProxiedPathRegistered(self, userFacingUrlPrefix):  #string
        self._logger.info(
            "thrift interface received a call to isReverseProxiedPathRegistered with a path value of %s"
            % (userFacingUrlPrefix))
        prefix = zbase62.b2a(userFacingUrlPrefix) + "_"
        with self.lock:
            allNodes = self.kz.get_children(ezRPKazoo.KZCONFLOC)
        matchingFilenames = [x for x in allNodes if x.startswith(prefix)]
        if len(matchingFilenames):
            return True
        return False

    def getAllUpstreamServerRegistrations(self):
        self._logger.info(
            "thrift interface received a call to getAllUpstreamServerRegistrations"
        )
        with self.lock:
            return self.configurer.getAllRegistrations()

    def getRegistrationsForProxiedPath(self, userFacingUrlPrefix):
        self._logger.info(
            'thrift interface received a call to getRegistrationsForProxiedPath with a path value of %s'
            % userFacingUrlPrefix)
        prefix = zbase62.b2a(userFacingUrlPrefix) + "_"
        with self.lock:
            return self.configurer.getAllRegistrationsWihPrefix(
                zbase62.b2a(userFacingUrlPrefix) + '_')

    def getRegistrationsForApp(self, appName):
        self._logger.info(
            'thrift interface received a call to getRegistrationsForApp for app %s'
            % appName)
        with self.lock:
            return self.configurer.getAllRegistrationsForApp(appName)

    def addServerCerts(self, serverName, info):
        self._logger.info(
            "thrift interface recevied a call to addServerCerts - %s" %
            (serverName))
        if serverName is None or not isinstance(serverName, basestring):
            raise EzFrontendCertException(
                message=
                "Error in adding server cert. serverName must be a STRING")
        if info is None or info.certificateContents is None or info.keyContents is None:
            raise EzFrontendCertException(
                message=
                "Error in adding server cert. info, info.certificateContents, info.keyContents should not be None."
            )
        if not isinstance(info.certificateContents, str) or not isinstance(
                info.keyContents, str):
            raise EzFrontendCertException(
                message=
                "Error in adding server cert. info.certificateContents and info.keyContents must be a STRING"
            )
        try:
            self.ac.put(serverName, info.certificateContents, info.keyContents)
            self.kz.ensure_path(sslconfig_node(serverName))
            self.kz.set(ezRPKazoo.KZWATCHLOC,
                        str(gConfig.current_milli_time()))
        except Exception as e:
            self._logger.exception(
                "Exception in adding server certs for %s: %s" %
                (serverName, str(e)))
            raise EzFrontendCertException(
                message="Internal error in adding server cert for %s." %
                (serverName))

    def removeServerCerts(self, serverName):
        self._logger.info(
            "thrift interface recevied a call to removeServerCerts - %s" %
            serverName)
        if serverName is None or not isinstance(serverName, basestring):
            raise EzFrontendCertException(
                message=
                "Error in removing server cert. serverName must be a STRING")
        try:
            self.ac.remove(serverName)
            self.kz.delete(sslconfig_node(serverName))
            self.kz.set(ezRPKazoo.KZWATCHLOC,
                        str(gConfig.current_milli_time()))
        except Exception as e:
            self._logger.exception(
                "Exception in removing server certs for %s: %s\n%s" %
                (serverName, str(e)))
            raise EzFrontendCertException(
                message="Internal error in removing server cert for %s." %
                (serverName))

    def isServerCertPresent(self, serverName):
        self._logger.info(
            "thrift interface recevied a call to isServerCertPresent - %s" %
            serverName)
        if serverName is None or not isinstance(serverName, basestring):
            raise EzFrontendCertException(
                message=
                "Error in checking server cert. serverName must be a STRING")
        try:
            return self.ac.exists(serverName)
        except Exception as e:
            self._logger.exception(
                "Exception in checking server certs for %s:" % serverName)
            raise EzFrontendCertException(
                message="Internal error in checking server cert for %s." %
                serverName)

    def addStaticContent(self, content):
        '''
    Save the file in Accumulo
    '''
        self._logger.info(
            "thrift interface received a call to addStaticContent")
        if self._sfh.addStaticContent(content):
            # reconfigure
            self._logger.info('Triggering zookeeper watch node')
            self.kz.ensure_path(ezRPKazoo.KZWATCHLOC)
            self.kz.set(ezRPKazoo.KZWATCHLOC,
                        str(gConfig.current_milli_time()))
        else:
            pass

    def removeStaticContent(self, content):
        '''
     Delete the file from Accumulo
    '''
        self._logger.info(
            "thrift interface received a call to removeStaticContent")
        if self._sfh.removeStaticContent(content):
            # reconfigure
            self._logger.info('Triggering zookeeper watch node')
            self.kz.ensure_path(ezRPKazoo.KZWATCHLOC)
            self.kz.set(ezRPKazoo.KZWATCHLOC,
                        str(gConfig.current_milli_time()))
        else:
            pass

    def isStaticContentPresentForProxiedPath(self, userFacingUrlPrefix):
        '''
       Returns True if Static content available for userFacingUrlPrefix
       '''
        self._logger.info(
            "thrift interface received a call to isStaticContentPresentForProxiedPath - %s"
            % (str(userFacingUrlPrefix)))
        return self._sfh.isStaticContentPresent(userFacingUrlPrefix)