Generate resource based Kubernetes clients with Kubegen
.
kubegen
is a code generator. Add the package as dev dependency. Make sure to
add kubereq
to your list of dependencies as well:
def deps do
[
{:kubegen, "~> 0.1.2", only: :dev, runtime: false},
{:kubereq, "~> 0.3.0"}
]
end
The docs can be found at https://hexdocs.pm/kubegen.
Before you can generate clients, you need to create a configuration in your
config.exs
under config :kubegen, :default
or config :kubegen, :mycluster
.
where a custom :mycluster
identifier is passed as argument
(mix kubegen -c mycluster
)
:module_prefix
- The prefix of the generated modules (e.g.MyApp.K8sClient
):kubeconfig_pipeline
- ThePluggable
pipeline responsible for loading the Kubernetes config. (e.g.Kubereq.Kubeconfig.Default
):resources
- List of resources for which clients are generated.
The entries of :resources
can be in the form of
- Group-Version-Kind in the case of Kubernetes core resources.
- Path to a local CRD YAML (multiple CRDs in one file are supported)
- URL to a public remote CRD Yaml (multiple CRDs in one file are supported)
config :kubegen, :default,
module_prefix: MyApp.K8sClient,
kubeconfig_pipeline: Kubereq.Kubeconfig.Default,
resources: [
"v1/ConfigMap",
"rbac.authorization.k8s.io/v1/ClusterRole",
"test/support/foos.example.com.yaml", # local CRD
"https://raw.githubusercontent.com/mruoss/kompost/main/priv/manifest/postgresdatabase.crd.yaml" # public remote CRD
]
Use mix kubegen.search
to search for GVKs (e.g. mix.kubegen.search Pod
)
Now you can (re-)generate clients using mix kubegen
or mix kubegen -c mycluster
kubegen
creates a module per resource and subresource. Each resource is
generaated with functions for the operations applicable to that resource. The
generated functions also come with @doc
documentations.
You can use apply/3
or create/2
to create a new resource:
import YamlElixir.Sigil
alias MyApp.K8sClient.Core.V1.ConfigMap
ConfigMap.apply(~y"""
apiVersion: v1
kind: ConfigMap
metadata:
namespace: default
name: my-config
labels:
app: my-app
data:
foo: bar
""")
To retrieve a resource, use get/2
:
ConfigMap.get("default", "my-config")
Use list/0
or list/1
to list resources of that kind in all namespaces or
list/2
to list resources in a specific namespace. Label or field selectors can
be passed as option if needed.
ConfigMap.list("default", label_selectors: [{"app", "my-app"}])
delete/2
and delete_all/2
delete a single or multiple resources (whereas the
latter also supports selectors).
ConfigMap.delete("default", "my-config")
ConfigMap.delete_all("default", label_selectors: [{"app", "my-app"}])
There are more functions like update/1
, json_path/3
, merge_patch/3
,
watch/N
, watch_single/3
wait_until/4
. Checkout the generated modules for
their documentation.