예제 #1
0
def get_images():
    """Computes the response of the '/cluster/resources/images' endpoint.

  Returns:
    The images of the context graph.
  """
    gs = app.context_graph_global_state

    # A dictionary from Image ID to wrapped image objects.
    # If an image appears more than once, keep only its latest value.
    images_dict = {}

    try:
        for node in kubernetes.get_nodes(gs):
            for image in docker.get_images(gs, node['id']):
                images_dict[image['id']] = image

    except collector_error.CollectorError as e:
        return flask.jsonify(utilities.make_error(str(e)))
    except:
        msg = 'kubernetes.get_images() failed with exception %s' % sys.exc_info(
        )[0]
        app.logger.exception(msg)
        return flask.jsonify(utilities.make_error(msg))

    # The images list is sorted by increasing identifiers.
    images_list = [images_dict[key] for key in sorted(images_dict.keys())]
    return flask.jsonify(utilities.make_response(images_list, 'resources'))
예제 #2
0
def get_images():
  """Computes the response of the '/cluster/resources/images' endpoint.

  Returns:
    The images of the context graph.
  """
  gs = app.context_graph_global_state

  # A dictionary from Image ID to wrapped image objects.
  # If an image appears more than once, keep only its latest value.
  images_dict = {}

  try:
    for node in kubernetes.get_nodes(gs):
      for image in docker.get_images(gs, node['id']):
        images_dict[image['id']] = image

  except collector_error.CollectorError as e:
    return flask.jsonify(utilities.make_error(str(e)))
  except:
    msg = 'kubernetes.get_images() failed with exception %s' % sys.exc_info()[0]
    app.logger.exception(msg)
    return flask.jsonify(utilities.make_error(msg))

  # The images list is sorted by increasing identifiers.
  images_list = [images_dict[key] for key in sorted(images_dict.keys())]
  return flask.jsonify(utilities.make_response(images_list, 'resources'))
예제 #3
0
def get_processes():
    """Computes the response of the '/cluster/resources/processes' endpoint.

  Returns:
    The processes of the context graph.
  """
    processes = []

    gs = app.context_graph_global_state
    try:
        for node in kubernetes.get_nodes(gs):
            node_id = node['id']
            docker_host = node_id
            for container in docker.get_containers(gs, docker_host):
                container_id = container['id']
                processes.extend(
                    docker.get_processes(gs, docker_host, container_id))

    except collector_error.CollectorError as e:
        return flask.jsonify(utilities.make_error(str(e)))
    except:
        msg = 'get_processes() failed with exception %s' % sys.exc_info()[0]
        app.logger.exception(msg)
        return flask.jsonify(utilities.make_error(msg))

    return flask.jsonify(utilities.make_response(processes, 'resources'))
예제 #4
0
def get_processes():
  """Computes the response of the '/cluster/resources/processes' endpoint.

  Returns:
    The processes of the context graph.
  """
  processes = []

  gs = app.context_graph_global_state
  try:
    for node in kubernetes.get_nodes(gs):
      node_id = node['id']
      docker_host = node_id
      for container in docker.get_containers(gs, docker_host):
        container_id = container['id']
        processes.extend(docker.get_processes(gs, docker_host, container_id))

  except collector_error.CollectorError as e:
    return flask.jsonify(utilities.make_error(str(e)))
  except:
    msg = 'get_processes() failed with exception %s' % sys.exc_info()[0]
    app.logger.exception(msg)
    return flask.jsonify(utilities.make_error(msg))

  return flask.jsonify(utilities.make_response(processes, 'resources'))
예제 #5
0
def get_version():
    """Computes the response of the '/version' endpoint.

  Returns:
    The value of the docker.get_version() or an error message.
  """
    gs = app.context_graph_global_state
    try:
        version = docker.get_version(gs)
        return flask.jsonify(utilities.make_response(version, 'version'))
    except collector_error.CollectorError as e:
        return flask.jsonify(utilities.make_error(str(e)))
    except:
        msg = ('get_version() failed with exception %s' % sys.exc_info()[0])
        app.logger.exception(msg)
        return flask.jsonify(utilities.make_error(msg))
예제 #6
0
def get_debug():
    """Computes the response of the '/cluster/resources/debug' endpoint.

  Returns:
    The DOT graph depicting the context graph.
  """
    gs = app.context_graph_global_state
    try:
        return context.compute_graph(gs, 'dot')
    except collector_error.CollectorError as e:
        return flask.jsonify(utilities.make_error(str(e)))
    except:
        msg = ('compute_graph(\"dot\") failed with exception %s' %
               sys.exc_info()[0])
        app.logger.exception(msg)
        return flask.jsonify(utilities.make_error(msg))
예제 #7
0
def get_response(req, cache=None):
  """Send request 'req' to the Docker unix socket and returns the response."""
  if cache:
    value, _ = cache.lookup(req)
    if value is not None:
      app.logger.info('cache hit for request=%s', req)
      return flask.make_response(
          value, requests.codes.ok, {'Content-Type': 'application/json'})

  try:
    result = fetch(req)
    cleanup(result)
    output = json.dumps(result)
    if cache:
      app.logger.info('caching result of request=%s', req)
      cache.update(req, output)

    return flask.make_response(
        output,
        requests.codes.ok,
        {'Content-Type': 'application/json'})

  except:
    exc_type, value, _ = sys.exc_info()
    msg = ('Failed to retrieve %s with exception %s: %s' %
           (req, exc_type, value))
    app.logger.error(msg)
    return flask.jsonify(utilities.make_error(msg))
예제 #8
0
def get_debug():
  """Computes the response of the '/cluster/resources/debug' endpoint.

  Returns:
    The DOT graph depicting the context graph.
  """
  gs = app.context_graph_global_state
  try:
    return context.compute_graph(gs, 'dot')
  except collector_error.CollectorError as e:
    return flask.jsonify(utilities.make_error(str(e)))
  except:
    msg = ('compute_graph(\"dot\") failed with exception %s' %
           sys.exc_info()[0])
    app.logger.exception(msg)
    return flask.jsonify(utilities.make_error(msg))
예제 #9
0
def get_version():
  """Computes the response of the '/version' endpoint.

  Returns:
    The value of the docker.get_version() or an error message.
  """
  gs = app.context_graph_global_state
  try:
    version = docker.get_version(gs)
    return flask.jsonify(utilities.make_response(version, 'version'))
  except collector_error.CollectorError as e:
    return flask.jsonify(utilities.make_error(str(e)))
  except:
    msg = ('get_version() failed with exception %s' % sys.exc_info()[0])
    app.logger.exception(msg)
    return flask.jsonify(utilities.make_error(msg))
예제 #10
0
def get_cluster():
    """Computes the response of the '/cluster' endpoint.

  Returns:
    The entire context graph.
  """
    gs = app.context_graph_global_state
    try:
        response = context.compute_graph(gs, 'context_graph')
        return flask.jsonify(response)
    except collector_error.CollectorError as e:
        return flask.jsonify(utilities.make_error(str(e)))
    except:
        msg = ('compute_graph(\"context_graph\") failed with exception %s' %
               sys.exc_info()[0])
        app.logger.exception(msg)
        return flask.jsonify(utilities.make_error(msg))
예제 #11
0
def get_cluster():
  """Computes the response of the '/cluster' endpoint.

  Returns:
    The entire context graph.
  """
  gs = app.context_graph_global_state
  try:
    response = context.compute_graph(gs, 'context_graph')
    return flask.jsonify(response)
  except collector_error.CollectorError as e:
    return flask.jsonify(utilities.make_error(str(e)))
  except:
    msg = ('compute_graph(\"context_graph\") failed with exception %s' %
           sys.exc_info()[0])
    app.logger.exception(msg)
    return flask.jsonify(utilities.make_error(msg))
예제 #12
0
def get_nodes():
  """Computes the response of the '/cluster/resources/nodes' endpoint.

  Returns:
    The nodes of the context graph.
  """
  gs = app.context_graph_global_state
  try:
    nodes_list = kubernetes.get_nodes_with_metrics(gs)
  except collector_error.CollectorError as e:
    return flask.jsonify(utilities.make_error(str(e)))
  except:
    msg = 'kubernetes.get_nodes() failed with exception %s' % sys.exc_info()[0]
    app.logger.exception(msg)
    return flask.jsonify(utilities.make_error(msg))

  return flask.jsonify(utilities.make_response(nodes_list, 'resources'))
예제 #13
0
def get_services():
    """Computes the response of the '/cluster/resources/services' endpoint.

  Returns:
    The services of the context graph.
  """
    gs = app.context_graph_global_state
    try:
        services_list = kubernetes.get_services(gs)
    except collector_error.CollectorError as e:
        return flask.jsonify(utilities.make_error(str(e)))
    except:
        msg = ('kubernetes.get_services() failed with exception %s' %
               sys.exc_info()[0])
        app.logger.exception(msg)
        return flask.jsonify(utilities.make_error(msg))

    return flask.jsonify(utilities.make_response(services_list, 'resources'))
예제 #14
0
def get_one_container_processes(container_id):
  qargs = flask.request.args.to_dict() if flask.request.args else {}
  if len(qargs) != 1 or qargs.get('ps_args') != 'aux':
    return flask.jsonify(utilities.make_error(
        'For /container/{container_id}/top, the sole mandatory arg is '
        'ps_args=aux. %s is not allowed' % (qargs)))

  return get_response(
      '/containers/{cid}/top?ps_args=aux'.format(cid=container_id))
예제 #15
0
def get_one_container_processes(container_id):
  qargs = flask.request.args.to_dict() if flask.request.args else {}
  if len(qargs) != 1 or qargs.get('ps_args') != 'aux':
    return flask.jsonify(utilities.make_error(
        'For /container/{container_id}/top, the sole mandatory arg is '
        'ps_args=aux. %s is not allowed' % (qargs)))

  return get_response(
      '/containers/{cid}/top?ps_args=aux'.format(cid=container_id))
예제 #16
0
def get_rcontrollers():
  """Computes the response of accessing the '/cluster/resources/rcontrollers'.

  Returns:
    The replication controllers of the context graph.
  """
  gs = app.context_graph_global_state
  try:
    rcontrollers_list = kubernetes.get_rcontrollers(gs)
  except collector_error.CollectorError as e:
    return flask.jsonify(utilities.make_error(str(e)))
  except:
    msg = ('kubernetes.get_rcontrollers() failed with exception %s' %
           sys.exc_info()[0])
    app.logger.exception(msg)
    return flask.jsonify(utilities.make_error(msg))

  return flask.jsonify(utilities.make_response(rcontrollers_list, 'resources'))
예제 #17
0
def get_debug():
  """Computes the response of the '/cluster/resources/debug' endpoint.

  Returns:
    The DOT graph depicting the context graph.
  """
  gs = app.context_graph_global_state
  try:
    return context.compute_graph(gs, 'dot')
  except collector_error.CollectorError as e:
    return flask.jsonify(utilities.make_error(str(e)))
예제 #18
0
def get_debug():
    """Computes the response of the '/cluster/resources/debug' endpoint.

  Returns:
    The DOT graph depicting the context graph.
  """
    gs = app.context_graph_global_state
    try:
        return context.compute_graph(gs, 'dot')
    except collector_error.CollectorError as e:
        return flask.jsonify(utilities.make_error(str(e)))
예제 #19
0
def get_cluster():
    """Computes the response of the '/cluster' endpoint.

  Returns:
    The entire context graph.
  """
    gs = app.context_graph_global_state
    try:
        response = context.compute_graph(gs, 'context_graph')
        return flask.jsonify(response)
    except collector_error.CollectorError as e:
        return flask.jsonify(utilities.make_error(str(e)))
예제 #20
0
def get_cluster():
  """Computes the response of the '/cluster' endpoint.

  Returns:
    The entire context graph.
  """
  gs = app.context_graph_global_state
  try:
    response = context.compute_graph(gs, 'context_graph')
    return flask.jsonify(response)
  except collector_error.CollectorError as e:
    return flask.jsonify(utilities.make_error(str(e)))
예제 #21
0
def get_nodes():
    """Computes the response of the '/cluster/resources/nodes' endpoint.

  Returns:
    The nodes of the context graph.
  """
    gs = app.context_graph_global_state
    try:
        nodes_list = kubernetes.get_nodes_with_metrics(gs)
    except collector_error.CollectorError as e:
        return flask.jsonify(utilities.make_error(str(e)))

    return flask.jsonify(utilities.make_response(nodes_list, 'resources'))
예제 #22
0
def get_pods():
  """Computes the response of the '/cluster/resources/pods' endpoint.

  Returns:
    The pods of the context graph.
  """
  gs = app.context_graph_global_state
  try:
    pods_list = kubernetes.get_pods(gs)
  except collector_error.CollectorError as e:
    return flask.jsonify(utilities.make_error(str(e)))

  return flask.jsonify(utilities.make_response(pods_list, 'resources'))
예제 #23
0
def get_rcontrollers():
    """Computes the response of accessing the '/cluster/resources/rcontrollers'.

  Returns:
    The replication controllers of the context graph.
  """
    gs = app.context_graph_global_state
    try:
        rcontrollers_list = kubernetes.get_rcontrollers(gs)
    except collector_error.CollectorError as e:
        return flask.jsonify(utilities.make_error(str(e)))

    return flask.jsonify(
        utilities.make_response(rcontrollers_list, 'resources'))
예제 #24
0
def get_containers():
  """Computes the response of the '/cluster/resources/containers' endpoint.

  Returns:
    The containers of the context graph.
  """
  containers = []

  gs = app.context_graph_global_state
  try:
    for node in kubernetes.get_nodes(gs):
      # The node_id is the Docker host name.
      docker_host = node['id']
      containers.extend(docker.get_containers_with_metrics(gs, docker_host))

  except collector_error.CollectorError as e:
    return flask.jsonify(utilities.make_error(str(e)))
  except:
    msg = 'get_containers() failed with exception %s' % sys.exc_info()[0]
    app.logger.exception(msg)
    return flask.jsonify(utilities.make_error(msg))

  return flask.jsonify(utilities.make_response(containers, 'resources'))
예제 #25
0
def get_minions():
  """Computes the response of the '/minions_status' endpoint.

  Returns:
  A dictionary from node names to the status of their minion collectors
  or an error message.
  """
  gs = app.context_graph_global_state
  minions_status = {}
  try:
    for node in kubernetes.get_nodes(gs):
      assert utilities.is_wrapped_object(node, 'Node')
      docker_host = node['id']
      minions_status[docker_host] = docker.get_minion_status(gs, docker_host)

  except collector_error.CollectorError as e:
    return flask.jsonify(utilities.make_error(str(e)))
  except:
    msg = 'get_minions_status() failed with exception %s' % sys.exc_info()[0]
    app.logger.exception(msg)
    return flask.jsonify(utilities.make_error(msg))

  return flask.jsonify(utilities.make_response(minions_status, 'minionsStatus'))
예제 #26
0
def get_containers():
    """Computes the response of the '/cluster/resources/containers' endpoint.

  Returns:
    The containers of the context graph.
  """
    containers = []

    gs = app.context_graph_global_state
    try:
        for node in kubernetes.get_nodes(gs):
            # The node_id is the Docker host name.
            docker_host = node['id']
            containers.extend(
                docker.get_containers_with_metrics(gs, docker_host))

    except collector_error.CollectorError as e:
        return flask.jsonify(utilities.make_error(str(e)))
    except:
        msg = 'get_containers() failed with exception %s' % sys.exc_info()[0]
        app.logger.exception(msg)
        return flask.jsonify(utilities.make_error(msg))

    return flask.jsonify(utilities.make_response(containers, 'resources'))
예제 #27
0
def get_elapsed():
  """Computes the response of the '/elapsed' endpoint.

  Returns:
  A successful response containing the list of elapsed time records of the
  most recent Kubernetes and Docker access operations since the previous
  call to the '/elapsed' endpoint. Never returns more than
  constants.MAX_ELAPSED_QUEUE_SIZE elapsed time records.
  """
  gs = app.context_graph_global_state
  try:
    result = return_elapsed(gs)
    return flask.jsonify(utilities.make_response(result, 'elapsed'))
  except:
    msg = 'get_elapsed() failed with exception %s' % sys.exc_info()[0]
    app.logger.exception(msg)
    return flask.jsonify(utilities.make_error(msg))
예제 #28
0
def get_response(req, cache=None):
  """Send request 'req' to the Docker unix socket and returns the response."""
  if cache:
    value, _ = cache.lookup(req)
    if value is not None:
      app.logger.info('cache hit for request=%s', req)
      return flask.make_response(
          value, 200, {'Content-Type': 'application/json'})

  try:
    r = fetch(req)
    if r.status_code != 200:
      msg = 'Accessing %s API returns an error code %d' % (req, r.status_code)
      app.logger.error(msg)
      raise IOError(msg)

    else:
      result = r.json()
      cleanup(result)
      output = json.dumps(result)
      if cache:
        app.logger.info('caching result of request=%s', req)
        cache.update(req, output)

      return flask.make_response(
          output,
          r.status_code,
          {'Content-Type': 'application/json'})

  except Exception as e:
    app.logger.error(e, exc_info=True)
    exc_type, value, _ = sys.exc_info()
    msg = ('Failed to retrieve %s with exception %s: %s' %
           (req, exc_type, value))
    app.logger.error(msg)
    return flask.jsonify(utilities.make_error(msg))