Packages
k8s
0.2.11
2.8.0
2.7.0
2.6.2
2.6.1
2.6.0
2.5.0
2.4.2
2.4.1
2.4.0
2.3.0
2.2.0
2.1.1
2.1.0
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-rc.6
2.0.0-rc.5
2.0.0-rc.4
2.0.0-rc.3
2.0.0-rc.2
2.0.0-rc.1
2.0.0-rc.0
1.2.1
1.2.0
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
1.0.0-rc1
0.5.2
0.5.1
0.5.0
0.5.0-rc.2
0.5.0-rc.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
retired
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.3
Kubernetes API Client for Elixir
Current section
Files
Jump to
Current section
Files
lib/k8s/group.ex
defmodule K8s.Group do
@moduledoc """
Kubernetes API Groups
"""
@doc """
Finds a resource definition by group version and kind
"""
@spec find_resource(binary | atom, binary, binary | atom) ::
{:ok, map} | {:error, atom() | binary}
def find_resource(cluster_name, group_version, kind) do
case :ets.lookup(K8s.Group, cluster_key(cluster_name, group_version)) do
[] ->
{:error, :unsupported_group_version, group_version}
[{_, _group_version, resources}] ->
find_resource_by_name(resources, kind)
end
end
@doc false
@spec find_resource_by_name(list(map), binary()) ::
{:ok, map} | {:error, atom() | binary()}
def find_resource_by_name(resources, kind) do
resource = Enum.find(resources, &match_resource_by_name(&1, kind))
case resource do
nil -> {:error, :unsupported_kind}
resource -> {:ok, resource}
end
end
@doc """
Creates a ETS key for `K8s.Group` per `K8s.Cluster`
## Examples
iex. K8s.Group.cluster_key(:dev, "apps/v1")
"dev/apps/v1"
"""
@spec cluster_key(atom, binary) :: binary
def cluster_key(cluster_name, group_version), do: "#{cluster_name}/#{group_version}"
@spec match_resource_by_name(map, atom | binary) :: boolean
defp match_resource_by_name(resource, kind) when is_atom(kind),
do: match_resource_by_name(resource, Atom.to_string(kind))
defp match_resource_by_name(%{"kind" => kind}, kind), do: true
defp match_resource_by_name(%{"name" => name}, name), do: true
defp match_resource_by_name(%{"kind" => kind}, name), do: String.downcase(kind) == name
end