docs: def cached(f):
      """Decorator for caching/retrieving api calls request.
  
      Many calls to the API are getter on static parts (e.g site of a given
      cluster name won't change). By caching some responses we can avoid
      hammering the API server.
      """
      @functools.wraps(f)
      def wrapped(*args, **kwargs):
          with _cache_lock:
              identifier = (f.__name__,  args, kwargs)
              key = pickle.dumps(identifier)
              value = cache.get(key)
              if value is not None:
                  logger.debug("HIT for %s -> %s" % (str(identifier), value))
              else:
                  logger.debug("MISS for %s" % str(identifier))
                  value = f(*args, **kwargs)
                  cache[key] = value
              return value
      return wrapped