Developer Guide
This document describes the necessary steps tools to get started with developing and testing CAPN on a local environment.
Table Of Contents
Setup environment
Install pre-requisites
# docker
curl https://get.docker.com | bash -x
# kind
curl -Lo ./kind https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# clusterctl
curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.10.4/clusterctl-linux-amd64 -o clusterctl
chmod +x ./clusterctl
sudo mv ./clusterctl /usr/local/bin/clusterctl
# kubectl
curl -L --remote-name-all "https://dl.k8s.io/release/v1.33.0/bin/linux/amd64/kubectl" -o ./kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
Create kind management cluster
Create a kind cluster:
sudo kind create cluster --kubeconfig ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
Initialize ClusterAPI
We deploy core ClusterAPI providers and enable ClusterTopology feature gate:
export CLUSTER_TOPOLOGY=true
clusterctl init
Initialize repository
Clone the cluster-api-provider-incus repository with:
git clone https://github.com/lxc/cluster-api-provider-incus
cd cluster-api-provider-incus
Initialize infrastructure
If Incus is not already installed on your machine, install latest stable version and initialize using setup-incus.sh:
./hack/scripts/ci/setup-incus.sh
The script will perform the following steps:
- Install latest stable incus version
- Initialize incus daemon using default options
- Configure incus daemon to listen on
https://$hostip:8443
- Configure client certificate for local incus deamon
- Create a secret
lxc-secret.yaml
on the local directory with infrastructure credentials for the local incus daemon.
If LXD is not already installed on your machine, install and initialize using setup-lxd.sh:
./hack/scripts/ci/setup-lxd.sh
The script will perform the following steps:
- Install Canonical LXD 5.21 snap
- Initialize LXD with default options
- Configure LXD daemon to listen on
https://$hostip:8443
- Configure client certificate for local LXD deamon
- Create a secret
lxc-secret.yaml
on the local directory with infrastructure credentials for the local LXD daemon.
Then, apply the lxc-secret.yaml
on the cluster to create the infrastructure crendentials secret:
kubectl apply -f lxc-secret.yaml
Running locally
First, deploy the CRDs with:
make install
Then, run the controller manager with:
make run V=4
Deploy a test cluster
On a separate window, generate a cluster manifest and deploy:
export LOAD_BALANCER="lxc: {}"
export LXC_SECRET_NAME="lxc-secret"
export KUBERNETES_VERSION="v1.33.0"
export CONTROL_PLANE_MACHINE_COUNT=1
export WORKER_MACHINE_COUNT=1
clusterctl generate cluster c1 --from ./templates/cluster-template.yaml > c1.yaml
Deploy the cluster with:
kubectl apply -f ./templates/clusterclass-capn-default.yaml
kubectl apply -f c1.yaml
Running unit tests
make test
Running e2e tests
First, build the e2e image with:
make e2e-image
Then, run the e2e tests with:
# run the e2e tests
make test-e2e
# run on existing cluster (NOTE: expects providers to be installed)
make test-e2e E2E_ARGS='-use-existing-cluster' KUBE_CONTEXT=kind-kind
# run in parallel
make test-e2e E2E_GINKGO_PARALLEL=2
# run specific tests
make test-e2e E2E_GINKGO_FOCUS='QuickStart OCI'
Unless specified, the e2e tests will use the default local-https
remote from the client configuration.
Running conformance tests
First, build the e2e image with:
make e2e-image
Then, run the conformance tests with:
# run upstream k8s conformance tests (full suite)
make test-conformance
# run upstream k8s conformance tests (fast)
make test-conformance-fast