defmodule Consul.Api.V1.Catalog do @moduledoc """ Higher level abstraction on top of Consul's Catalog API. """ alias Consul.{Connection, Request, Response} @doc """ List the services registered in a given datacenter. """ def list_services(connection, optional_params \\ [], opts \\ []) do optional_params_config = %{ :dc => :query, :"node-meta" => :query, :ns => :query, :index => :query, :wait => :query } request = Request.new() |> Request.method(:get) |> Request.url("/v1/catalog/services") |> Request.add_optional_params(optional_params_config, optional_params) connection |> Connection.execute(request) |> Response.decode(opts ++ [as: %{}]) end @doc """ List the nodes for a service. """ def list_nodes(connection, service, optional_params \\ [], opts \\ []) do optional_params_config = %{ :dc => :query, :tag => :query, :near => :query, :"node-meta" => :query, :filter => :query, :ns => :query, :index => :query, :wait => :query } request = Request.new() |> Request.method(:get) |> Request.url("/v1/catalog/service/{service}", %{ "service" => service }) |> Request.add_optional_params(optional_params_config, optional_params) connection |> Connection.execute(request) |> Response.decode(opts ++ [as: %{}]) end @doc """ List datacenters. """ def list_datacenters(connection, opts \\ []) do request = Request.new() |> Request.method(:get) |> Request.url("/v1/catalog/datacenters") connection |> Connection.execute(request) |> Response.decode(opts ++ [as: []]) end @doc """ List all available nodes. """ def list_all_nodes(connection, optional_params \\ [], opts \\ []) do optional_params_config = %{ :dc => :query, :near => :query, :"node-meta" => :query, :filter => :query, :index => :query, :wait => :query } request = Request.new() |> Request.method(:get) |> Request.url("/v1/catalog/nodes") |> Request.add_optional_params(optional_params_config, optional_params) connection |> Connection.execute(request) |> Response.decode(opts ++ [as: []]) end @doc """ List all available services. """ def list_all_services(connection, optional_params \\ [], opts \\ []) do optional_params_config = %{ :dc => :query, :"node-meta" => :query, :ns => :query, :index => :query, :wait => :query } request = Request.new() |> Request.method(:get) |> Request.url("/v1/catalog/services") |> Request.add_optional_params(optional_params_config, optional_params) connection |> Connection.execute(request) |> Response.decode(opts ++ [as: []]) end @doc """ List services at a node. """ def list_node_services(connection, node, optional_params \\ [], opts \\ []) do optional_params_config = %{ :dc => :query, :filter => :query, :ns => :query, :index => :query, :wait => :query } request = Request.new() |> Request.method(:get) |> Request.url("/v1/catalog/node/{node}", %{ "node" => node }) |> Request.add_optional_params(optional_params_config, optional_params) connection |> Connection.execute(request) |> Response.decode(opts ++ [as: %{}]) end end