Middleware (K8s.Middleware)

K8s.Middleware is registered by connection name. By default a few pieces of middleware are registered for all connections.

Request Middleware

Middleware can be added to a connection or the entire middleware stack can be replaced.

Adding Request Middleware

Given a registered K8s.Conn named :foo the following example will add ExampleMiddleware to the end of the middleware stack

K8s.Middleware.Registry.add(:foo, :request, MyMiddlewareModule)

Replacing the Middleware Stack

Given a registered K8s.Conn named :foo the following example will replace the middleware stack.

K8s.Middleware.Registry.set(:foo, :request, [MyMiddlewareModule])

Listing Middleware for a K8s.Conn

K8s.Middleware.Registry.list(:foo, :request)
[K8s.Middleware.Request.Initialize, K8s.Middleware.Request.EncodeBody]

Writing Request Middleware

K8s.Middleware.Request is a behaviour and struct for encapsulating requests processed by the middleware stack. Middleware is expected to return {:ok, %Request{}} to continue processing or {:error, :my_error} to halt. The error in the error tuple can be an atom or a struct. It will automatically be wrapped in K8s.Middleware.Error during processing.

To implement a piece of middleware, you need to define a function call/1 that accepts a K8s.Middleware.Request.

The example below will automatically add labels to a :post requests.

def call(%Request{method: :post, body: body} = req) do
  metadata = Map.get(body, "metadata", %{})
  metadata_with_labels = Map.put(metadata, "labels", %{"env" => "prod"})
  updated_body = Map.put(body, "metadata", metadata_with_labels)

  request_with_labels = %Request{req | body: updated_body}
  {:ok, request_with_labels}
end

Response Middleware

Response middleware has not been implemented at this time.