Current section
Files
Jump to
Current section
Files
lib/docker/container_state.ex
defmodule Docker.ContainerState do
@moduledoc false
defstruct [:id, :status, :mapped_ports]
alias __MODULE__
defmodule Status do
@moduledoc false
@allowed_statuses ~w(created running paused restarting removing exited dead)
@type state :: :created | :running | :paused | :restarting | :removing | :exited | :dead
defguardp is_allowed(status) when status in @allowed_statuses
defstruct [:state, :running]
def parse_status(status_as_string) when is_allowed(status_as_string), do: String.to_atom(status_as_string)
def parse_status(_), do: nil
end
def parse_docker_response(json_info) do
%ContainerState{
id: json_info["Id"],
status: %ContainerState.Status{
state: ContainerState.Status.parse_status(json_info["State"]["Status"]),
running: json_info["State"]["Running"]
},
mapped_ports: port_mapping(json_info["NetworkSettings"]["Ports"])
}
end
defp port_mapping(json_ports) do
json_ports
|> Enum.map(fn {cont, host} -> {cont, host_port(host)} end)
|> Enum.into(%{})
end
defp host_port(nil), do: nil
defp host_port(ports) do
ports
|> Enum.at(0)
|> Map.get("HostPort")
end
end