From b00331e11178df3c1c886eabb37f2b5b8b48bc01 Mon Sep 17 00:00:00 2001 From: "Homayoon (Hue) Alimohammadi" Date: Fri, 24 Oct 2025 13:34:22 +0400 Subject: [PATCH 01/43] feat(controlplane-controller): Cordon and drain node before removal Signed-off-by: Homayoon (Hue) Alimohammadi --- pkg/ck8s/drainer.go | 332 ++++++++++++++++++++++++++++++++ pkg/ck8s/drainer_test.go | 333 +++++++++++++++++++++++++++++++++ pkg/ck8s/management_cluster.go | 12 ++ pkg/ck8s/workload_cluster.go | 47 ++++- 4 files changed, 723 insertions(+), 1 deletion(-) create mode 100644 pkg/ck8s/drainer.go create mode 100644 pkg/ck8s/drainer_test.go diff --git a/pkg/ck8s/drainer.go b/pkg/ck8s/drainer.go new file mode 100644 index 00000000..08b0aa06 --- /dev/null +++ b/pkg/ck8s/drainer.go @@ -0,0 +1,332 @@ +package ck8s + +import ( + "context" + "fmt" + "time" + + corev1 "k8s.io/api/core/v1" + policyv1 "k8s.io/api/policy/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/utils/ptr" + ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/log" +) + +// Drainer defines the interface for draining and cordoning nodes. +type Drainer interface { + // DrainNode drains the specified node by evicting its pods according to the drain options. + DrainNode(ctx context.Context, nodeName string) error + // CordonNode marks the specified node as unschedulable. + CordonNode(ctx context.Context, nodeName string) error + // UncordonNode marks the specified node as schedulable. + UncordonNode(ctx context.Context, nodeName string) error +} + +// DrainOptions defines options for draining a node. +type DrainOptions struct { + // Timeout is the maximum duration to wait for the drain operation to complete. + Timeout time.Duration + // DeleteEmptydirData indicates whether to delete pods using emptyDir volumes. + // Local data that will be deleted when the node is drained. + // Equivalent to --delete-emptydir-data flag in kubectl drain. + DeleteEmptydirData bool + // Force indicates whether to Force drain even if there are pods without controllers. + // Equivalent to --Force flag in kubectl drain. + Force bool + // GracePeriodSeconds period of time in seconds given to each pod to terminate gracefully. + // If negative, the default value specified in the pod will be used. + // Equivalent to --grace-period flag in kubectl drain. + GracePeriodSeconds int64 + // IgnoreDaemonsets indicates whether to ignore DaemonSet-managed pods. + // Equivalent to --ignore-daemonsets flag in kubectl drain. + IgnoreDaemonsets bool + // AllowDeletion indicates whether to allow deletion of pods that are blocked by PodDisruptionBudgets. + // If true, pods that cannot be evicted due to PDB constraints will be force deleted. + AllowDeletion bool + // EvictionRetryInterval is the duration to wait between retries when evicting or deleting pods. + EvictionRetryInterval time.Duration + // EvictionTimeout is the maximum duration to wait for the a single cycle of eviction or deletion to complete. + // Note that DrainNode may perform multiple cycles to evict all pods. + EvictionTimeout time.Duration +} + +func (o DrainOptions) defaults() DrainOptions { + return DrainOptions{ + GracePeriodSeconds: -1, + } +} + +type drainer struct { + client ctrlclient.Client + // nowFunc is a function that returns the current time. + // It is used to facilitate testing. + nowFunc func() time.Time + opts DrainOptions +} + +func NewDrainer(client ctrlclient.Client, nowFunc func() time.Time, opts ...DrainOptions) *drainer { + o := DrainOptions{}.defaults() + if len(opts) > 0 { + o = opts[0] + } + + return &drainer{ + client: client, + nowFunc: nowFunc, + opts: o, + } +} + +// CordonNode marks the specified node as unschedulable. +func (d *drainer) CordonNode(ctx context.Context, nodeName string) error { + log := log.FromContext(ctx).WithValues("node", nodeName, "scope", "CordonNode") + + node := &corev1.Node{} + if err := d.client.Get(ctx, ctrlclient.ObjectKey{Name: nodeName}, node); err != nil { + return fmt.Errorf("failed to get node: %w", err) + } + + patch := ctrlclient.StrategicMergeFrom(node, ctrlclient.MergeFromWithOptimisticLock{}) + + newNode := node.DeepCopy() + newNode.Spec.Unschedulable = true + + if err := d.client.Patch(ctx, newNode, patch); err != nil { + return fmt.Errorf("failed to patch node: %w", err) + } + + log.Info("Node cordoned successfully") + return nil +} + +// UncordonNode marks the specified node as schedulable. +func (d *drainer) UncordonNode(ctx context.Context, nodeName string) error { + log := log.FromContext(ctx).WithValues("node", nodeName, "scope", "UncordonNode") + + node := &corev1.Node{} + if err := d.client.Get(ctx, ctrlclient.ObjectKey{Name: nodeName}, node); err != nil { + return fmt.Errorf("failed to get node: %w", err) + } + + patch := ctrlclient.StrategicMergeFrom(node, ctrlclient.MergeFromWithOptimisticLock{}) + + newNode := node.DeepCopy() + newNode.Spec.Unschedulable = false + + if err := d.client.Patch(ctx, newNode, patch); err != nil { + return fmt.Errorf("failed to patch node: %w", err) + } + + log.Info("Node uncordoned successfully") + return nil +} + +// DrainNode drains the specified node by evicting its pods according to the drain options. +func (d *drainer) DrainNode(ctx context.Context, nodeName string) error { + logger := log.FromContext(ctx).WithValues("node", nodeName, "scope", "DrainNode") + logger.Info("Starting node drain") + + ticker := time.NewTicker(d.opts.EvictionRetryInterval) + drainCtx, cancel := context.WithTimeout(ctx, d.opts.Timeout) + defer cancel() + + for { + select { + case <-drainCtx.Done(): + return drainCtx.Err() + case <-ticker.C: + logger.Info("Attempting to drain node") + } + + podsToEvict, err := d.getPodsToEvict(ctx, nodeName) + if err != nil { + return fmt.Errorf("failed to get pods to evict from node %s: %w", nodeName, err) + } + + if len(podsToEvict) == 0 { + logger.Info("No pods to evict. Drain complete.") + return nil + } + + logger.Info("Evicting pods", "count", len(podsToEvict)) + + evictCtx := drainCtx + var cancel context.CancelFunc + if d.opts.EvictionTimeout > 0 { + evictCtx, cancel = context.WithTimeout(evictCtx, d.opts.EvictionTimeout) + } + + d.evictOrDeletePods(evictCtx, podsToEvict) + + // Can not defer cancel here because of the loop + if cancel != nil { + cancel() + } + + logger.Info("Pods evicted successfully, checking for remaining pods") + } +} + +// getPodsToEvict returns the list of pods on the given node that should be evicted +// based on the drain options. +func (d *drainer) getPodsToEvict(ctx context.Context, nodeName string) ([]corev1.Pod, error) { + logger := log.FromContext(ctx).WithValues("node", nodeName, "scope", "getPodsToEvict") + + podList := &corev1.PodList{} + if err := d.client.List(ctx, podList, &ctrlclient.ListOptions{ + FieldSelector: fields.OneTermEqualSelector("spec.nodeName", nodeName), + }); err != nil { + return nil, fmt.Errorf("failed to list pods on node %s: %w", nodeName, err) + } + + podsToEvict := make([]corev1.Pod, 0, len(podList.Items)) + for _, pod := range podList.Items { + /// + // Skip static pods (those managed by kubelet directly) + /// + + if _, isStatic := pod.Annotations[corev1.MirrorPodAnnotationKey]; isStatic { + logger.Info("Skipping static pod", "pod", pod.Name, "namespace", pod.Namespace) + continue + } + + /// + // Daemonsets + /// + + isDaemonSet := false + for _, ownerRef := range pod.OwnerReferences { + if ownerRef.Kind == "DaemonSet" { + isDaemonSet = true + break + } + } + if isDaemonSet { + if !d.opts.IgnoreDaemonsets { + return nil, fmt.Errorf("pod %s/%s is managed by a DaemonSet; cannot drain node without IgnoreDaemonsets option", pod.Namespace, pod.Name) + } else { + logger.Info("Skipping DaemonSet pod", "pod", pod.Name, "namespace", pod.Namespace) + continue + } + } + + /// + // emptyDir volumes + /// + + hasEmptyDir := false + for _, volume := range pod.Spec.Volumes { + if volume.EmptyDir != nil { + hasEmptyDir = true + break + } + } + if !d.opts.DeleteEmptydirData && hasEmptyDir { + // Do not continue if there are pods using emptyDir + // (local data that will be deleted when the node is drained) + return nil, fmt.Errorf("pod %s/%s is using emptyDir volume; cannot drain node without DeleteEmptydirData option", pod.Namespace, pod.Name) + } + + /// + // Pods without controllers + /// + + hasController := false + for _, ownerRef := range pod.OwnerReferences { + if ownerRef.Controller != nil && *ownerRef.Controller { + hasController = true + break + } + } + if !d.opts.Force && !hasController { + return nil, fmt.Errorf("pod %s/%s does not have a controller; cannot drain node without Force option", pod.Namespace, pod.Name) + } + + podsToEvict = append(podsToEvict, pod) + } + + return podsToEvict, nil +} + +// evictOrDeletePods evicts or deletes the given pods from the node. +// It first tries to evict the pods using the eviction API, +// and if that fails due to PodDisruptionBudget constraints, it deletes the pods if allowed. +// It also force deletes pods that are stuck in terminating state for longer than the grace period. +func (d *drainer) evictOrDeletePods(ctx context.Context, pods []corev1.Pod) { + logger := log.FromContext(ctx).WithValues("scope", "evictOrDeletePods") + + for _, pod := range pods { + podLog := logger.WithValues("pod", pod.Name, "namespace", pod.Namespace) + + // Force delete pods that are in terminating state for longer than the grace period + if pod.DeletionTimestamp != nil { + deletionDeadline := pod.DeletionTimestamp.Add(time.Duration(d.opts.GracePeriodSeconds) * time.Second) + if d.nowFunc().After(deletionDeadline) { + podLog.Info("Pod is stuck in terminating state for longer than the grace period, force deleting") + + // Remove finalizers to allow immediate deletion + patch := ctrlclient.StrategicMergeFrom(&pod, ctrlclient.MergeFromWithOptimisticLock{}) + newPod := pod.DeepCopy() + newPod.Finalizers = nil + if err := d.client.Patch(ctx, newPod, patch); err != nil { + podLog.Error(err, "Failed to remove finalizers from pod before force deletion") + continue + } + + err := d.client.Delete(ctx, &pod, &ctrlclient.DeleteOptions{ + GracePeriodSeconds: ptr.To(int64(0)), + }) + if err != nil && !apierrors.IsNotFound(err) { + podLog.Error(err, "Failed to force delete pod") + continue + } + podLog.Info("Pod force deleted successfully") + continue + } + } + + // Try to use eviction API first (respects PodDisruptionBudgets) + eviction := &policyv1.Eviction{ + ObjectMeta: metav1.ObjectMeta{ + Name: pod.Name, + Namespace: pod.Namespace, + }, + DeleteOptions: &metav1.DeleteOptions{ + GracePeriodSeconds: &d.opts.GracePeriodSeconds, + }, + } + err := d.client.SubResource("eviction").Create(ctx, &pod, eviction) + if err != nil { + // Evictions are treated as “disruptions” that are rate-limited by a PDB. + // When there’s no remaining budget, the API responds with 429 to signal a transient + // condition: “try again later,” not a permanent denial. + // 429 was chosen (instead of e.g. 403) so clients can back off and retry once budget becomes available. + // https://kubernetes.io/docs/concepts/scheduling-eviction/api-eviction/#how-api-initiated-eviction-works + if apierrors.IsTooManyRequests(err) { + if d.opts.AllowDeletion { + // PodDisruptionBudget is preventing eviction, delete instead + podLog.Info("Eviction blocked by PDB, deleting pod") + err = d.client.Delete(ctx, &pod, &ctrlclient.DeleteOptions{ + GracePeriodSeconds: &d.opts.GracePeriodSeconds, + }) + if err != nil && !apierrors.IsNotFound(err) { + podLog.Error(err, "Failed to delete pod") + continue + } + podLog.Info("Pod deleted successfully") + continue + } + } else if !apierrors.IsNotFound(err) { + podLog.Error(err, "Failed to evict pod") + continue + } + } + + podLog.Info("Pod eviction initiated") + } +} + +var _ Drainer = &drainer{} diff --git a/pkg/ck8s/drainer_test.go b/pkg/ck8s/drainer_test.go new file mode 100644 index 00000000..55d9d44c --- /dev/null +++ b/pkg/ck8s/drainer_test.go @@ -0,0 +1,333 @@ +package ck8s_test + +import ( + "context" + "testing" + "time" + + . "github.com/onsi/gomega" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/utils/ptr" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + + "github.com/canonical/cluster-api-k8s/pkg/ck8s" +) + +func newFakeClientWithIndex(objects ...client.Object) client.Client { + scheme := runtime.NewScheme() + _ = corev1.AddToScheme(scheme) + + return fake.NewClientBuilder(). + WithScheme(scheme). + WithObjects(objects...). + WithIndex(&corev1.Pod{}, "spec.nodeName", func(obj client.Object) []string { + pod := obj.(*corev1.Pod) + return []string{pod.Spec.NodeName} + }). + Build() +} + +func TestCordonNode(t *testing.T) { + g := NewWithT(t) + ctx := context.Background() + + node := &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{Name: "test-node"}, + Spec: corev1.NodeSpec{Unschedulable: false}, + } + + fakeClient := newFakeClientWithIndex(node) + drainer := ck8s.NewDrainer(fakeClient, time.Now) + + err := drainer.CordonNode(ctx, "test-node") + g.Expect(err).ToNot(HaveOccurred()) + + // Verify node is cordoned + updatedNode := &corev1.Node{} + err = fakeClient.Get(ctx, client.ObjectKey{Name: "test-node"}, updatedNode) + g.Expect(err).ToNot(HaveOccurred()) + g.Expect(updatedNode.Spec.Unschedulable).To(BeTrue()) +} + +func TestUncordonNode(t *testing.T) { + g := NewWithT(t) + ctx := context.Background() + + node := &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{Name: "test-node"}, + Spec: corev1.NodeSpec{Unschedulable: true}, + } + + fakeClient := newFakeClientWithIndex(node) + drainer := ck8s.NewDrainer(fakeClient, time.Now) + + err := drainer.UncordonNode(ctx, "test-node") + g.Expect(err).ToNot(HaveOccurred()) + + // Verify node is uncordoned + updatedNode := &corev1.Node{} + err = fakeClient.Get(ctx, client.ObjectKey{Name: "test-node"}, updatedNode) + g.Expect(err).ToNot(HaveOccurred()) + g.Expect(updatedNode.Spec.Unschedulable).To(BeFalse()) +} + +func TestCordonNodeNotFound(t *testing.T) { + g := NewWithT(t) + ctx := context.Background() + + fakeClient := newFakeClientWithIndex() + drainer := ck8s.NewDrainer(fakeClient, time.Now) + + err := drainer.CordonNode(ctx, "nonexistent-node") + g.Expect(err).To(HaveOccurred()) + g.Expect(err.Error()).To(ContainSubstring("failed to get node")) +} + +func TestDrainNodeWithNoPods(t *testing.T) { + g := NewWithT(t) + ctx := context.Background() + + node := &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{Name: "test-node"}, + } + + fakeClient := newFakeClientWithIndex(node) + + opts := ck8s.DrainOptions{ + EvictionRetryInterval: 10 * time.Millisecond, + IgnoreDaemonsets: true, + } + drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) + + err := drainer.DrainNode(ctx, "test-node") + g.Expect(err).ToNot(HaveOccurred()) +} + +func TestDrainNodeWithDaemonSetPodsIgnored(t *testing.T) { + g := NewWithT(t) + ctx := context.Background() + + node := &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{Name: "test-node"}, + } + + daemonSetPod := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "daemonset-pod", + Namespace: "default", + OwnerReferences: []metav1.OwnerReference{ + {Kind: "DaemonSet", Name: "test-ds", Controller: ptr.To(true)}, + }, + }, + Spec: corev1.PodSpec{NodeName: "test-node"}, + } + + fakeClient := newFakeClientWithIndex(node, daemonSetPod) + + opts := ck8s.DrainOptions{ + EvictionRetryInterval: 10 * time.Millisecond, + IgnoreDaemonsets: true, + } + drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) + + err := drainer.DrainNode(ctx, "test-node") + g.Expect(err).ToNot(HaveOccurred()) +} + +func TestDrainNodeWithDaemonSetPodsNotIgnored(t *testing.T) { + g := NewWithT(t) + ctx := context.Background() + + node := &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{Name: "test-node"}, + } + + daemonSetPod := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "daemonset-pod", + Namespace: "default", + OwnerReferences: []metav1.OwnerReference{ + {Kind: "DaemonSet", Name: "test-ds", Controller: ptr.To(true)}, + }, + }, + Spec: corev1.PodSpec{NodeName: "test-node"}, + } + + fakeClient := newFakeClientWithIndex(node, daemonSetPod) + + opts := ck8s.DrainOptions{ + EvictionRetryInterval: 10 * time.Millisecond, + } + drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) + + err := drainer.DrainNode(ctx, "test-node") + g.Expect(err).To(HaveOccurred()) + g.Expect(err.Error()).To(ContainSubstring("managed by a DaemonSet")) +} + +func TestDrainNodeWithEmptyDirAllowed(t *testing.T) { + g := NewWithT(t) + ctx := context.Background() + + node := &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{Name: "test-node"}, + } + + pod := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-with-emptydir", + Namespace: "default", + OwnerReferences: []metav1.OwnerReference{ + {Kind: "ReplicaSet", Name: "test-rs", Controller: ptr.To(true)}, + }, + }, + Spec: corev1.PodSpec{ + NodeName: "test-node", + Volumes: []corev1.Volume{ + {Name: "cache", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}, + }, + }, + } + + fakeClient := newFakeClientWithIndex(node, pod) + + opts := ck8s.DrainOptions{ + EvictionRetryInterval: 10 * time.Millisecond, + DeleteEmptydirData: true, + IgnoreDaemonsets: true, + } + drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) + + err := drainer.DrainNode(ctx, "test-node") + g.Expect(err).To(Not(HaveOccurred())) +} + +func TestDrainNodeWithEmptyDirNotAllowed(t *testing.T) { + g := NewWithT(t) + ctx := context.Background() + + node := &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{Name: "test-node"}, + } + + pod := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-with-emptydir", + Namespace: "default", + OwnerReferences: []metav1.OwnerReference{ + {Kind: "ReplicaSet", Name: "test-rs", Controller: ptr.To(true)}, + }, + }, + Spec: corev1.PodSpec{ + NodeName: "test-node", + Volumes: []corev1.Volume{ + {Name: "cache", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}, + }, + }, + } + + fakeClient := newFakeClientWithIndex(node, pod) + + opts := ck8s.DrainOptions{ + EvictionRetryInterval: 10 * time.Millisecond, + IgnoreDaemonsets: true, + } + drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) + + err := drainer.DrainNode(ctx, "test-node") + g.Expect(err).To(HaveOccurred()) + g.Expect(err.Error()).To(ContainSubstring("using emptyDir volume")) +} + +func TestDrainNodeWithPodWithoutController(t *testing.T) { + g := NewWithT(t) + ctx := context.Background() + + node := &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{Name: "test-node"}, + } + + pod := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "standalone-pod", + Namespace: "default", + }, + Spec: corev1.PodSpec{NodeName: "test-node"}, + } + + fakeClient := newFakeClientWithIndex(node, pod) + + opts := ck8s.DrainOptions{ + EvictionRetryInterval: 10 * time.Millisecond, + IgnoreDaemonsets: true, + } + drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) + + err := drainer.DrainNode(ctx, "test-node") + g.Expect(err).To(HaveOccurred()) + g.Expect(err.Error()).To(ContainSubstring("does not have a controller")) +} + +func TestDrainNodeWithPodWithoutControllerForced(t *testing.T) { + g := NewWithT(t) + ctx := context.Background() + + node := &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{Name: "test-node"}, + } + + pod := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "standalone-pod", + Namespace: "default", + }, + Spec: corev1.PodSpec{NodeName: "test-node"}, + } + + fakeClient := newFakeClientWithIndex(node, pod) + + opts := ck8s.DrainOptions{ + EvictionRetryInterval: 10 * time.Millisecond, + Force: true, + IgnoreDaemonsets: true, + } + drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) + + // Will attempt to evict and handle errors gracefully + err := drainer.DrainNode(ctx, "test-node") + g.Expect(err).To(Or(BeNil(), HaveOccurred())) +} + +func TestDrainNodeSkipsStaticPods(t *testing.T) { + g := NewWithT(t) + ctx := context.Background() + + node := &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{Name: "test-node"}, + } + + staticPod := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "static-pod", + Namespace: "kube-system", + Annotations: map[string]string{ + corev1.MirrorPodAnnotationKey: "mirror-pod", + }, + }, + Spec: corev1.PodSpec{NodeName: "test-node"}, + } + + fakeClient := newFakeClientWithIndex(node, staticPod) + + opts := ck8s.DrainOptions{ + EvictionRetryInterval: 10 * time.Millisecond, + IgnoreDaemonsets: true, + } + drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) + + err := drainer.DrainNode(ctx, "test-node") + g.Expect(err).ToNot(HaveOccurred()) +} diff --git a/pkg/ck8s/management_cluster.go b/pkg/ck8s/management_cluster.go index 51dcb6f9..e3aca7d2 100644 --- a/pkg/ck8s/management_cluster.go +++ b/pkg/ck8s/management_cluster.go @@ -98,12 +98,24 @@ func (m *Management) GetWorkloadCluster(ctx context.Context, clusterKey client.O return nil, fmt.Errorf("auth token not yet generated") } + drainer := NewDrainer(c, time.Now, DrainOptions{ + Force: true, + AllowDeletion: true, + IgnoreDaemonsets: true, + DeleteEmptydirData: true, + Timeout: 5 * time.Minute, + EvictionTimeout: 1 * time.Minute, + EvictionRetryInterval: 20 * time.Second, + GracePeriodSeconds: 10, + }) + workload := &Workload{ authToken: *authToken, Client: c, ClientRestConfig: restConfig, K8sdClientGenerator: g, microclusterPort: microclusterPort, + drainer: drainer, } return workload, nil diff --git a/pkg/ck8s/workload_cluster.go b/pkg/ck8s/workload_cluster.go index 9814fef9..8e83520b 100644 --- a/pkg/ck8s/workload_cluster.go +++ b/pkg/ck8s/workload_cluster.go @@ -8,6 +8,7 @@ import ( "fmt" "net/http" "strings" + "time" apiv1 "github.com/canonical/k8s-snap-api/api/v1" "golang.org/x/sync/errgroup" @@ -55,6 +56,7 @@ type Workload struct { ClientRestConfig *rest.Config K8sdClientGenerator *k8sdClientGenerator microclusterPort int + drainer Drainer } // ClusterStatus holds stats information about the cluster. @@ -444,7 +446,7 @@ func (w *Workload) requestJoinToken(ctx context.Context, name string, worker boo return response.EncodedToken, nil } -func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine) error { +func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine) (err error) { if machine == nil { return fmt.Errorf("machine object is not set") } @@ -453,6 +455,49 @@ func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *cluste } nodeName := machine.Status.NodeRef.Name + + if err := w.drainer.CordonNode(ctx, nodeName); err != nil { + return fmt.Errorf("failed to cordon node %s: %w", nodeName, err) + } + + // Ensure that we uncordon the node in case of any error during the removal process. + defer func() { + if err != nil { + originalErr := err + // Use a new context since the current one might be cancelled. + retryCtx, retryCancel := context.WithTimeout(context.Background(), 5*time.Minute) + defer retryCancel() + + ticker := time.NewTicker(10 * time.Second) + + for { + select { + case <-retryCtx.Done(): + log.FromContext(ctx).Error(retryCtx.Err(), "Failed to uncordon node after machine removal failure within the retry timeout", "node", nodeName) + return + case <-ticker.C: + } + + log.FromContext(ctx).Info("Uncordoning node after machine removal failure", "node", nodeName) + uncordonCtx, uncordonCancel := context.WithTimeout(retryCtx, 30*time.Second) + if uncordonErr := w.drainer.UncordonNode(uncordonCtx, nodeName); uncordonErr != nil { + log.FromContext(ctx).Error(uncordonErr, "Failed to uncordon node, will retry", "node", nodeName) + err = fmt.Errorf("failed to uncordon node %s after error: %w; original error: %w", nodeName, uncordonErr, originalErr) + } else { + uncordonCancel() + log.FromContext(ctx).Info("Successfully uncordoned node after machine removal failure", "node", nodeName) + return + } + // Cancel manually since we are in a loop. + uncordonCancel() + } + } + }() + + if err := w.drainer.DrainNode(ctx, nodeName); err != nil { + return fmt.Errorf("failed to drain node %s: %w", nodeName, err) + } + request := &apiv1.RemoveNodeRequest{Name: nodeName, Force: true} // If we see that ignoring control-planes is causing issues, let's consider removing it. From 72f085e2dbdb6945ac3931826bb5bd1d74bd3ab9 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 6 Mar 2026 19:53:21 +0000 Subject: [PATCH 02/43] Add timeout for node removal Signed-off-by: Adrian Vladu --- pkg/ck8s/workload_cluster.go | 3 ++- test/e2e/node_scale_test.go | 16 ++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pkg/ck8s/workload_cluster.go b/pkg/ck8s/workload_cluster.go index 8e83520b..c2357c66 100644 --- a/pkg/ck8s/workload_cluster.go +++ b/pkg/ck8s/workload_cluster.go @@ -498,7 +498,7 @@ func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *cluste return fmt.Errorf("failed to drain node %s: %w", nodeName, err) } - request := &apiv1.RemoveNodeRequest{Name: nodeName, Force: true} + request := &apiv1.RemoveNodeRequest{Name: nodeName, Force: false} // If we see that ignoring control-planes is causing issues, let's consider removing it. // It *should* not be necessary as a machine should be able to remove itself from the cluster. @@ -512,6 +512,7 @@ func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *cluste if err := w.doK8sdRequest(ctx, k8sdProxy, http.MethodPost, fmt.Sprintf("%s/%s", apiv1.K8sdAPIVersion, apiv1.ClusterAPIRemoveNodeRPC), header, request, nil); err != nil { return fmt.Errorf("failed to remove %s from cluster: %w", machine.Name, err) } + time.Sleep(60 * time.Second) return nil } diff --git a/test/e2e/node_scale_test.go b/test/e2e/node_scale_test.go index 01c22b6d..9a3aa6d7 100644 --- a/test/e2e/node_scale_test.go +++ b/test/e2e/node_scale_test.go @@ -89,8 +89,8 @@ var _ = Describe("Workload cluster scaling", func() { Namespace: namespace.Name, ClusterName: clusterName, KubernetesVersion: e2eConfig.GetVariable(KubernetesVersion), - ControlPlaneMachineCount: ptr.To(int64(1)), - WorkerMachineCount: ptr.To(int64(1)), + ControlPlaneMachineCount: ptr.To(int64(3)), + WorkerMachineCount: ptr.To(int64(0)), }, WaitForClusterIntervals: e2eConfig.GetIntervals(specName, "wait-cluster"), WaitForControlPlaneIntervals: e2eConfig.GetIntervals(specName, "wait-control-plane"), @@ -110,7 +110,7 @@ var _ = Describe("Workload cluster scaling", func() { ClusterName: clusterName, KubernetesVersion: e2eConfig.GetVariable(KubernetesVersion), ControlPlaneMachineCount: ptr.To(int64(1)), - WorkerMachineCount: ptr.To(int64(3)), + WorkerMachineCount: ptr.To(int64(0)), }, WaitForClusterIntervals: e2eConfig.GetIntervals(specName, "wait-cluster"), WaitForControlPlaneIntervals: e2eConfig.GetIntervals(specName, "wait-control-plane"), @@ -129,8 +129,8 @@ var _ = Describe("Workload cluster scaling", func() { Namespace: namespace.Name, ClusterName: clusterName, KubernetesVersion: e2eConfig.GetVariable(KubernetesVersion), - ControlPlaneMachineCount: ptr.To(int64(4)), - WorkerMachineCount: ptr.To(int64(3)), + ControlPlaneMachineCount: ptr.To(int64(5)), + WorkerMachineCount: ptr.To(int64(0)), }, WaitForClusterIntervals: e2eConfig.GetIntervals(specName, "wait-cluster"), WaitForControlPlaneIntervals: e2eConfig.GetIntervals(specName, "wait-control-plane"), @@ -149,8 +149,8 @@ var _ = Describe("Workload cluster scaling", func() { Namespace: namespace.Name, ClusterName: clusterName, KubernetesVersion: e2eConfig.GetVariable(KubernetesVersion), - ControlPlaneMachineCount: ptr.To(int64(3)), - WorkerMachineCount: ptr.To(int64(3)), + ControlPlaneMachineCount: ptr.To(int64(1)), + WorkerMachineCount: ptr.To(int64(0)), }, WaitForClusterIntervals: e2eConfig.GetIntervals(specName, "wait-cluster"), WaitForControlPlaneIntervals: e2eConfig.GetIntervals(specName, "wait-control-plane"), @@ -170,7 +170,7 @@ var _ = Describe("Workload cluster scaling", func() { ClusterName: clusterName, KubernetesVersion: e2eConfig.GetVariable(KubernetesVersion), ControlPlaneMachineCount: ptr.To(int64(3)), - WorkerMachineCount: ptr.To(int64(1)), + WorkerMachineCount: ptr.To(int64(0)), }, WaitForClusterIntervals: e2eConfig.GetIntervals(specName, "wait-cluster"), WaitForControlPlaneIntervals: e2eConfig.GetIntervals(specName, "wait-control-plane"), From 111e017a4e43218e78d99c952a035c4981894a39 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Wed, 10 Jun 2026 09:10:05 +0000 Subject: [PATCH 03/43] make sure the node is removed cleanly and forcefully in this order Signed-off-by: Adrian Vladu --- controlplane/controllers/remediation.go | 2 +- controlplane/controllers/scale.go | 11 ++++-- pkg/ck8s/workload_cluster.go | 45 ++++--------------------- 3 files changed, 15 insertions(+), 43 deletions(-) diff --git a/controlplane/controllers/remediation.go b/controlplane/controllers/remediation.go index c74f69fa..c7062948 100644 --- a/controlplane/controllers/remediation.go +++ b/controlplane/controllers/remediation.go @@ -174,7 +174,7 @@ func (r *CK8sControlPlaneReconciler) reconcileUnhealthyMachines(ctx context.Cont if machineToBeRemediated.Status.NodeRef != nil { // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, // and proceed with the machine removal. - if err := workloadCluster.RemoveMachineFromCluster(ctx, machineToBeRemediated); err != nil { + if err := workloadCluster.RemoveMachineFromCluster(ctx, machineToBeRemediated, true); err != nil { log.Error(err, "failed to remove machine from microcluster") return ctrl.Result{}, fmt.Errorf("failed to remove machine from microcluster: %w", err) } diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 97e247af..999ab15b 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "strings" + "time" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -130,9 +131,13 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( if machineToDelete.Status.NodeRef != nil { // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, // and proceed with the machine removal. - if err := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete); err != nil { - logger.Error(err, "failed to remove machine from microcluster") - return ctrl.Result{}, fmt.Errorf("failed to remove machine from microcluster: %w", err) + if err := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, false); err != nil { + logger.Error(err, "failed to remove machine from microcluster cleanly") + time.Sleep(60 * time.Second) + if errForce := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, true); errForce != nil { + logger.Error(err, "failed to remove machine from microcluster forcefully") + return ctrl.Result{}, fmt.Errorf("failed to remove machine from microcluster: %w", errForce) + } } } diff --git a/pkg/ck8s/workload_cluster.go b/pkg/ck8s/workload_cluster.go index c2357c66..d3cda9d0 100644 --- a/pkg/ck8s/workload_cluster.go +++ b/pkg/ck8s/workload_cluster.go @@ -44,7 +44,7 @@ type WorkloadCluster interface { NewControlPlaneJoinToken(ctx context.Context, name string) (string, error) NewWorkerJoinToken(ctx context.Context) (string, error) - RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine) error + RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine, Force bool) error } // Workload defines operations on workload clusters. @@ -446,7 +446,7 @@ func (w *Workload) requestJoinToken(ctx context.Context, name string, worker boo return response.EncodedToken, nil } -func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine) (err error) { +func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine, Force bool) (err error) { if machine == nil { return fmt.Errorf("machine object is not set") } @@ -456,49 +456,16 @@ func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *cluste nodeName := machine.Status.NodeRef.Name + logger := log.FromContext(ctx) if err := w.drainer.CordonNode(ctx, nodeName); err != nil { - return fmt.Errorf("failed to cordon node %s: %w", nodeName, err) + logger.Info("Node could not be cordoned.", "reason", err.Error()) } - // Ensure that we uncordon the node in case of any error during the removal process. - defer func() { - if err != nil { - originalErr := err - // Use a new context since the current one might be cancelled. - retryCtx, retryCancel := context.WithTimeout(context.Background(), 5*time.Minute) - defer retryCancel() - - ticker := time.NewTicker(10 * time.Second) - - for { - select { - case <-retryCtx.Done(): - log.FromContext(ctx).Error(retryCtx.Err(), "Failed to uncordon node after machine removal failure within the retry timeout", "node", nodeName) - return - case <-ticker.C: - } - - log.FromContext(ctx).Info("Uncordoning node after machine removal failure", "node", nodeName) - uncordonCtx, uncordonCancel := context.WithTimeout(retryCtx, 30*time.Second) - if uncordonErr := w.drainer.UncordonNode(uncordonCtx, nodeName); uncordonErr != nil { - log.FromContext(ctx).Error(uncordonErr, "Failed to uncordon node, will retry", "node", nodeName) - err = fmt.Errorf("failed to uncordon node %s after error: %w; original error: %w", nodeName, uncordonErr, originalErr) - } else { - uncordonCancel() - log.FromContext(ctx).Info("Successfully uncordoned node after machine removal failure", "node", nodeName) - return - } - // Cancel manually since we are in a loop. - uncordonCancel() - } - } - }() - if err := w.drainer.DrainNode(ctx, nodeName); err != nil { - return fmt.Errorf("failed to drain node %s: %w", nodeName, err) + logger.Info("Node could not be drained.", "reason", err.Error()) } - request := &apiv1.RemoveNodeRequest{Name: nodeName, Force: false} + request := &apiv1.RemoveNodeRequest{Name: nodeName, Force: Force} // If we see that ignoring control-planes is causing issues, let's consider removing it. // It *should* not be necessary as a machine should be able to remove itself from the cluster. From ebfd67250bef45164cba729d199f14fb4c36b541 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Wed, 10 Jun 2026 10:57:25 +0000 Subject: [PATCH 04/43] Fixed unit tests and removed sleeps Signed-off-by: Adrian Vladu --- controlplane/controllers/scale.go | 2 -- pkg/ck8s/drainer_test.go | 8 ++++++++ pkg/ck8s/workload_cluster.go | 8 +++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 999ab15b..783d9da8 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -22,7 +22,6 @@ import ( "errors" "fmt" "strings" - "time" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -133,7 +132,6 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( // and proceed with the machine removal. if err := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, false); err != nil { logger.Error(err, "failed to remove machine from microcluster cleanly") - time.Sleep(60 * time.Second) if errForce := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, true); errForce != nil { logger.Error(err, "failed to remove machine from microcluster forcefully") return ctrl.Result{}, fmt.Errorf("failed to remove machine from microcluster: %w", errForce) diff --git a/pkg/ck8s/drainer_test.go b/pkg/ck8s/drainer_test.go index 55d9d44c..9870e1c6 100644 --- a/pkg/ck8s/drainer_test.go +++ b/pkg/ck8s/drainer_test.go @@ -99,6 +99,7 @@ func TestDrainNodeWithNoPods(t *testing.T) { opts := ck8s.DrainOptions{ EvictionRetryInterval: 10 * time.Millisecond, IgnoreDaemonsets: true, + Timeout: 10 * time.Millisecond, } drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) @@ -130,6 +131,7 @@ func TestDrainNodeWithDaemonSetPodsIgnored(t *testing.T) { opts := ck8s.DrainOptions{ EvictionRetryInterval: 10 * time.Millisecond, IgnoreDaemonsets: true, + Timeout: 10 * time.Millisecond, } drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) @@ -160,6 +162,7 @@ func TestDrainNodeWithDaemonSetPodsNotIgnored(t *testing.T) { opts := ck8s.DrainOptions{ EvictionRetryInterval: 10 * time.Millisecond, + Timeout: 10 * time.Millisecond, } drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) @@ -198,6 +201,7 @@ func TestDrainNodeWithEmptyDirAllowed(t *testing.T) { EvictionRetryInterval: 10 * time.Millisecond, DeleteEmptydirData: true, IgnoreDaemonsets: true, + Timeout: 20 * time.Millisecond, } drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) @@ -234,6 +238,7 @@ func TestDrainNodeWithEmptyDirNotAllowed(t *testing.T) { opts := ck8s.DrainOptions{ EvictionRetryInterval: 10 * time.Millisecond, IgnoreDaemonsets: true, + Timeout: 10 * time.Millisecond, } drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) @@ -263,6 +268,7 @@ func TestDrainNodeWithPodWithoutController(t *testing.T) { opts := ck8s.DrainOptions{ EvictionRetryInterval: 10 * time.Millisecond, IgnoreDaemonsets: true, + Timeout: 10 * time.Millisecond, } drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) @@ -293,6 +299,7 @@ func TestDrainNodeWithPodWithoutControllerForced(t *testing.T) { EvictionRetryInterval: 10 * time.Millisecond, Force: true, IgnoreDaemonsets: true, + Timeout: 10 * time.Millisecond, } drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) @@ -325,6 +332,7 @@ func TestDrainNodeSkipsStaticPods(t *testing.T) { opts := ck8s.DrainOptions{ EvictionRetryInterval: 10 * time.Millisecond, IgnoreDaemonsets: true, + Timeout: 10 * time.Millisecond, } drainer := ck8s.NewDrainer(fakeClient, time.Now, opts) diff --git a/pkg/ck8s/workload_cluster.go b/pkg/ck8s/workload_cluster.go index d3cda9d0..6a3ed986 100644 --- a/pkg/ck8s/workload_cluster.go +++ b/pkg/ck8s/workload_cluster.go @@ -8,7 +8,6 @@ import ( "fmt" "net/http" "strings" - "time" apiv1 "github.com/canonical/k8s-snap-api/api/v1" "golang.org/x/sync/errgroup" @@ -44,7 +43,7 @@ type WorkloadCluster interface { NewControlPlaneJoinToken(ctx context.Context, name string) (string, error) NewWorkerJoinToken(ctx context.Context) (string, error) - RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine, Force bool) error + RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine, force bool) error } // Workload defines operations on workload clusters. @@ -446,7 +445,7 @@ func (w *Workload) requestJoinToken(ctx context.Context, name string, worker boo return response.EncodedToken, nil } -func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine, Force bool) (err error) { +func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine, force bool) (err error) { if machine == nil { return fmt.Errorf("machine object is not set") } @@ -465,7 +464,7 @@ func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *cluste logger.Info("Node could not be drained.", "reason", err.Error()) } - request := &apiv1.RemoveNodeRequest{Name: nodeName, Force: Force} + request := &apiv1.RemoveNodeRequest{Name: nodeName, Force: force} // If we see that ignoring control-planes is causing issues, let's consider removing it. // It *should* not be necessary as a machine should be able to remove itself from the cluster. @@ -479,7 +478,6 @@ func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *cluste if err := w.doK8sdRequest(ctx, k8sdProxy, http.MethodPost, fmt.Sprintf("%s/%s", apiv1.K8sdAPIVersion, apiv1.ClusterAPIRemoveNodeRPC), header, request, nil); err != nil { return fmt.Errorf("failed to remove %s from cluster: %w", machine.Name, err) } - time.Sleep(60 * time.Second) return nil } From 3006eebdb405e84f23bd652d232d6d243dc49ebf Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Mon, 15 Jun 2026 12:27:13 +0000 Subject: [PATCH 05/43] Increase timeouts for eviction Signed-off-by: Adrian Vladu --- pkg/ck8s/management_cluster.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/ck8s/management_cluster.go b/pkg/ck8s/management_cluster.go index e3aca7d2..0f6bd33d 100644 --- a/pkg/ck8s/management_cluster.go +++ b/pkg/ck8s/management_cluster.go @@ -103,10 +103,10 @@ func (m *Management) GetWorkloadCluster(ctx context.Context, clusterKey client.O AllowDeletion: true, IgnoreDaemonsets: true, DeleteEmptydirData: true, - Timeout: 5 * time.Minute, - EvictionTimeout: 1 * time.Minute, - EvictionRetryInterval: 20 * time.Second, - GracePeriodSeconds: 10, + Timeout: 60 * time.Minute, + EvictionTimeout: 30 * time.Minute, + EvictionRetryInterval: 5 * time.Minute, + GracePeriodSeconds: 600, }) workload := &Workload{ From f8d3979bb936f436fa63f11ad5839029139c481a Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Tue, 16 Jun 2026 09:25:37 +0000 Subject: [PATCH 06/43] Decrease timeouts for eviction --- pkg/ck8s/management_cluster.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/ck8s/management_cluster.go b/pkg/ck8s/management_cluster.go index 0f6bd33d..0281ae27 100644 --- a/pkg/ck8s/management_cluster.go +++ b/pkg/ck8s/management_cluster.go @@ -103,10 +103,10 @@ func (m *Management) GetWorkloadCluster(ctx context.Context, clusterKey client.O AllowDeletion: true, IgnoreDaemonsets: true, DeleteEmptydirData: true, - Timeout: 60 * time.Minute, - EvictionTimeout: 30 * time.Minute, - EvictionRetryInterval: 5 * time.Minute, - GracePeriodSeconds: 600, + Timeout: 10 * time.Minute, + EvictionTimeout: 5 * time.Minute, + EvictionRetryInterval: 1 * time.Minute, + GracePeriodSeconds: 60, }) workload := &Workload{ From 9ccddcbced9798f9740266c84ee395550bae6761 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Tue, 16 Jun 2026 13:03:34 +0000 Subject: [PATCH 07/43] Re-add annotations for skipping cleanup. The cleanup makes evicted pods to be potentially stuck in Terminating as containerd is killed before kubelet has the chance to know about the containers status --- pkg/ck8s/config_init.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/ck8s/config_init.go b/pkg/ck8s/config_init.go index de11a724..4f1b4c16 100644 --- a/pkg/ck8s/config_init.go +++ b/pkg/ck8s/config_init.go @@ -5,6 +5,7 @@ import ( "strings" apiv1 "github.com/canonical/k8s-snap-api/api/v1" + apiv1_annotations "github.com/canonical/k8s-snap-api/api/v1/annotations" "k8s.io/utils/ptr" clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" @@ -99,6 +100,15 @@ func GenerateInitControlPlaneConfig(cfg InitControlPlaneConfig) (apiv1.Bootstrap out.ClusterConfig.Annotations = map[string]string{} } + trueStr := "true" + if _, ok := out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipCleanupKubernetesNodeOnRemove]; !ok { + out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipCleanupKubernetesNodeOnRemove] = trueStr + } + + if _, ok := out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipStopServicesOnRemove]; !ok { + out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipStopServicesOnRemove] = trueStr + } + // features out.ClusterConfig.DNS.Enabled = ptr.To(cfg.InitConfig.GetEnableDefaultDNS()) out.ClusterConfig.LoadBalancer.Enabled = ptr.To(cfg.InitConfig.GetEnableDefaultLoadBalancer()) From a8bdd2fbca02bb240f27c0a17e17e3368a683acf Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Tue, 16 Jun 2026 13:03:49 +0000 Subject: [PATCH 08/43] Decrease timeouts for eviction retry --- pkg/ck8s/management_cluster.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/ck8s/management_cluster.go b/pkg/ck8s/management_cluster.go index 0281ae27..619f747b 100644 --- a/pkg/ck8s/management_cluster.go +++ b/pkg/ck8s/management_cluster.go @@ -103,9 +103,9 @@ func (m *Management) GetWorkloadCluster(ctx context.Context, clusterKey client.O AllowDeletion: true, IgnoreDaemonsets: true, DeleteEmptydirData: true, - Timeout: 10 * time.Minute, - EvictionTimeout: 5 * time.Minute, - EvictionRetryInterval: 1 * time.Minute, + Timeout: 30 * time.Minute, + EvictionTimeout: 10 * time.Minute, + EvictionRetryInterval: 30 * time.Second, GracePeriodSeconds: 60, }) From 33edd954dd389d67e6afb5e6a277d63b867b06ce Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Tue, 16 Jun 2026 13:09:09 +0000 Subject: [PATCH 09/43] Fix formatting --- pkg/ck8s/config_init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/ck8s/config_init.go b/pkg/ck8s/config_init.go index 4f1b4c16..855e4ed9 100644 --- a/pkg/ck8s/config_init.go +++ b/pkg/ck8s/config_init.go @@ -5,7 +5,7 @@ import ( "strings" apiv1 "github.com/canonical/k8s-snap-api/api/v1" - apiv1_annotations "github.com/canonical/k8s-snap-api/api/v1/annotations" + apiv1_annotations "github.com/canonical/k8s-snap-api/api/v1/annotations" "k8s.io/utils/ptr" clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" From 8a90bc0c923cd7a3ced1ddebcaad384809b6235c Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Tue, 16 Jun 2026 14:09:26 +0000 Subject: [PATCH 10/43] Use requeueing for convergence --- controlplane/controllers/scale.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 783d9da8..2bcfd73d 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "strings" + "time" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -102,6 +103,13 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( ) (ctrl.Result, error) { logger := ctrl.LoggerFrom(ctx) + for _, machine := range controlPlane.Machines { + if time.Since(machine.Status.LastUpdated.Time) < 5 * time.Minute { + logger.Info("The newest machine is not older than 5 minutes, requeuing to allow for convergence") + return ctrl.Result{Requeue: true}, nil + } + } + // Pick the Machine that we should scale down. machineToDelete, err := selectMachineForScaleDown(ctx, controlPlane, outdatedMachines) if err != nil { From 519e1b1962d96e08e67bf280c95f0ffda0513a1a Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Tue, 16 Jun 2026 14:15:22 +0000 Subject: [PATCH 11/43] Fix formatting --- controlplane/controllers/scale.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 2bcfd73d..9055a6d7 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -104,7 +104,7 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( logger := ctrl.LoggerFrom(ctx) for _, machine := range controlPlane.Machines { - if time.Since(machine.Status.LastUpdated.Time) < 5 * time.Minute { + if time.Since(machine.Status.LastUpdated.Time) < 5*time.Minute { logger.Info("The newest machine is not older than 5 minutes, requeuing to allow for convergence") return ctrl.Result{Requeue: true}, nil } From f54596e23d9eab385b5b64c9a1788a9e3433bc18 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Tue, 16 Jun 2026 21:29:01 +0000 Subject: [PATCH 12/43] Revert "Re-add annotations for skipping cleanup. The cleanup makes evicted pods to be potentially stuck in Terminating as containerd is killed before kubelet has the chance to know about the containers status" This reverts commit 9ccddcbced9798f9740266c84ee395550bae6761. --- pkg/ck8s/config_init.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/pkg/ck8s/config_init.go b/pkg/ck8s/config_init.go index 855e4ed9..de11a724 100644 --- a/pkg/ck8s/config_init.go +++ b/pkg/ck8s/config_init.go @@ -5,7 +5,6 @@ import ( "strings" apiv1 "github.com/canonical/k8s-snap-api/api/v1" - apiv1_annotations "github.com/canonical/k8s-snap-api/api/v1/annotations" "k8s.io/utils/ptr" clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" @@ -100,15 +99,6 @@ func GenerateInitControlPlaneConfig(cfg InitControlPlaneConfig) (apiv1.Bootstrap out.ClusterConfig.Annotations = map[string]string{} } - trueStr := "true" - if _, ok := out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipCleanupKubernetesNodeOnRemove]; !ok { - out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipCleanupKubernetesNodeOnRemove] = trueStr - } - - if _, ok := out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipStopServicesOnRemove]; !ok { - out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipStopServicesOnRemove] = trueStr - } - // features out.ClusterConfig.DNS.Enabled = ptr.To(cfg.InitConfig.GetEnableDefaultDNS()) out.ClusterConfig.LoadBalancer.Enabled = ptr.To(cfg.InitConfig.GetEnableDefaultLoadBalancer()) From f9c33f5d19415747c19f4b2ca40cdbf5e255bcf9 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Wed, 17 Jun 2026 05:58:00 +0000 Subject: [PATCH 13/43] Use control plane creation timestamp --- controlplane/controllers/scale.go | 17 ++++++++++------- pkg/ck8s/workload_cluster.go | 9 +++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 9055a6d7..ee3aa7ac 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -103,13 +103,6 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( ) (ctrl.Result, error) { logger := ctrl.LoggerFrom(ctx) - for _, machine := range controlPlane.Machines { - if time.Since(machine.Status.LastUpdated.Time) < 5*time.Minute { - logger.Info("The newest machine is not older than 5 minutes, requeuing to allow for convergence") - return ctrl.Result{Requeue: true}, nil - } - } - // Pick the Machine that we should scale down. machineToDelete, err := selectMachineForScaleDown(ctx, controlPlane, outdatedMachines) if err != nil { @@ -134,6 +127,16 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( logger.Error(err, "failed to create client to workload cluster") return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) } + controlPlaneNodes, err := workloadCluster.GetControlPlaneNodes(ctx) + if err != nil { + return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) + } + for _, node := range controlPlaneNodes.Items { + if time.Since(node.ObjectMeta.CreationTimestamp.Time) < 1*time.Minute { + logger.Info("The newest machine is not older than 5 minutes, requeuing to allow for convergence") + return ctrl.Result{Requeue: true}, nil + } + } if machineToDelete.Status.NodeRef != nil { // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, diff --git a/pkg/ck8s/workload_cluster.go b/pkg/ck8s/workload_cluster.go index 6a3ed986..538b4099 100644 --- a/pkg/ck8s/workload_cluster.go +++ b/pkg/ck8s/workload_cluster.go @@ -42,6 +42,7 @@ type WorkloadCluster interface { UpdateAgentConditions(ctx context.Context, controlPlane *ControlPlane) NewControlPlaneJoinToken(ctx context.Context, name string) (string, error) NewWorkerJoinToken(ctx context.Context) (string, error) + GetControlPlaneNodes(ctx context.Context) (*corev1.NodeList, error) RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine, force bool) error } @@ -68,7 +69,7 @@ type ClusterStatus struct { HasK8sdConfigMap bool } -func (w *Workload) getControlPlaneNodes(ctx context.Context) (*corev1.NodeList, error) { +func (w *Workload) GetControlPlaneNodes(ctx context.Context) (*corev1.NodeList, error) { nodes := &corev1.NodeList{} labels := map[string]string{ // NOTE(neoaggelos): Canonical Kubernetes uses node-role.kubernetes.io/control-plane="" as a label for control plane nodes. @@ -85,7 +86,7 @@ func (w *Workload) ClusterStatus(ctx context.Context) (ClusterStatus, error) { status := ClusterStatus{} // count the control plane nodes - nodes, err := w.getControlPlaneNodes(ctx) + nodes, err := w.GetControlPlaneNodes(ctx) if err != nil { return status, err } @@ -155,7 +156,7 @@ type k8sdProxyOptions struct { // GetK8sdProxyForControlPlane returns a k8sd proxy client for the control plane. func (w *Workload) GetK8sdProxyForControlPlane(ctx context.Context, options k8sdProxyOptions) (*K8sdClient, error) { - cplaneNodes, err := w.getControlPlaneNodes(ctx) + cplaneNodes, err := w.GetControlPlaneNodes(ctx) if err != nil { return nil, fmt.Errorf("failed to get control plane nodes: %w", err) } @@ -551,7 +552,7 @@ func (w *Workload) UpdateAgentConditions(ctx context.Context, controlPlane *Cont } // NOTE: this fun uses control plane nodes from the workload cluster as a source of truth for the current state. - controlPlaneNodes, err := w.getControlPlaneNodes(ctx) + controlPlaneNodes, err := w.GetControlPlaneNodes(ctx) if err != nil { for i := range controlPlane.Machines { machine := controlPlane.Machines[i] From 4b700dfac66b761d69c66df47506df921e1b417f Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Wed, 17 Jun 2026 06:00:16 +0000 Subject: [PATCH 14/43] Use control plane creation timestamp for 5 minutes --- controlplane/controllers/scale.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index ee3aa7ac..9c5d8b6c 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -132,8 +132,8 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) } for _, node := range controlPlaneNodes.Items { - if time.Since(node.ObjectMeta.CreationTimestamp.Time) < 1*time.Minute { - logger.Info("The newest machine is not older than 5 minutes, requeuing to allow for convergence") + if time.Since(node.ObjectMeta.CreationTimestamp.Time) < 5*time.Minute { + logger.Info("The newest controller is not older than 5 minutes, requeuing to allow for convergence") return ctrl.Result{Requeue: true}, nil } } From a072a7b45c9cff3d117103ab41b7659c30e53bc2 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Wed, 17 Jun 2026 11:09:02 +0000 Subject: [PATCH 15/43] Fix code checks --- controlplane/controllers/scale.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 9c5d8b6c..0b27c252 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -132,7 +132,7 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) } for _, node := range controlPlaneNodes.Items { - if time.Since(node.ObjectMeta.CreationTimestamp.Time) < 5*time.Minute { + if time.Since(node.CreationTimestamp.Time) < 5*time.Minute { logger.Info("The newest controller is not older than 5 minutes, requeuing to allow for convergence") return ctrl.Result{Requeue: true}, nil } From 8cfe5a60ff110988ff0ddc6ecf1c5ea61836c6a8 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Wed, 17 Jun 2026 11:09:18 +0000 Subject: [PATCH 16/43] Reapply "Re-add annotations for skipping cleanup. The cleanup makes evicted pods to be potentially stuck in Terminating as containerd is killed before kubelet has the chance to know about the containers status" This reverts commit f54596e23d9eab385b5b64c9a1788a9e3433bc18. --- pkg/ck8s/config_init.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/ck8s/config_init.go b/pkg/ck8s/config_init.go index de11a724..855e4ed9 100644 --- a/pkg/ck8s/config_init.go +++ b/pkg/ck8s/config_init.go @@ -5,6 +5,7 @@ import ( "strings" apiv1 "github.com/canonical/k8s-snap-api/api/v1" + apiv1_annotations "github.com/canonical/k8s-snap-api/api/v1/annotations" "k8s.io/utils/ptr" clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" @@ -99,6 +100,15 @@ func GenerateInitControlPlaneConfig(cfg InitControlPlaneConfig) (apiv1.Bootstrap out.ClusterConfig.Annotations = map[string]string{} } + trueStr := "true" + if _, ok := out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipCleanupKubernetesNodeOnRemove]; !ok { + out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipCleanupKubernetesNodeOnRemove] = trueStr + } + + if _, ok := out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipStopServicesOnRemove]; !ok { + out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipStopServicesOnRemove] = trueStr + } + // features out.ClusterConfig.DNS.Enabled = ptr.To(cfg.InitConfig.GetEnableDefaultDNS()) out.ClusterConfig.LoadBalancer.Enabled = ptr.To(cfg.InitConfig.GetEnableDefaultLoadBalancer()) From 279f934ce8c338808a8c32a8fadc6b9c458ac2e7 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Wed, 17 Jun 2026 11:22:27 +0000 Subject: [PATCH 17/43] Re-add apiv1_annotations.AnnotationSkipCleanupKubernetesNodeOnRemove --- pkg/ck8s/config_init.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/pkg/ck8s/config_init.go b/pkg/ck8s/config_init.go index 855e4ed9..cd4b20f9 100644 --- a/pkg/ck8s/config_init.go +++ b/pkg/ck8s/config_init.go @@ -101,13 +101,8 @@ func GenerateInitControlPlaneConfig(cfg InitControlPlaneConfig) (apiv1.Bootstrap } trueStr := "true" - if _, ok := out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipCleanupKubernetesNodeOnRemove]; !ok { - out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipCleanupKubernetesNodeOnRemove] = trueStr - } - - if _, ok := out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipStopServicesOnRemove]; !ok { - out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipStopServicesOnRemove] = trueStr - } + out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipCleanupKubernetesNodeOnRemove] = trueStr + out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipStopServicesOnRemove] = trueStr // features out.ClusterConfig.DNS.Enabled = ptr.To(cfg.InitConfig.GetEnableDefaultDNS()) From 47e5fc0358d5534fed4fe536583684b3da2a260c Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Wed, 17 Jun 2026 12:16:15 +0000 Subject: [PATCH 18/43] add more logs --- controlplane/controllers/scale.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 0b27c252..2ea0ef8c 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -133,7 +133,7 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( } for _, node := range controlPlaneNodes.Items { if time.Since(node.CreationTimestamp.Time) < 5*time.Minute { - logger.Info("The newest controller is not older than 5 minutes, requeuing to allow for convergence") + logger.Info("The newest control plane is not older than 5 minutes, requeuing to allow for convergence") return ctrl.Result{Requeue: true}, nil } } @@ -141,16 +141,19 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( if machineToDelete.Status.NodeRef != nil { // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, // and proceed with the machine removal. + logger.Info("Removing machine from cluster gracefully") if err := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, false); err != nil { - logger.Error(err, "failed to remove machine from microcluster cleanly") + logger.Error(err, "Failed to remove machine from cluster gracefully") + logger.Info("Removing machine from cluster forcefully") if errForce := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, true); errForce != nil { logger.Error(err, "failed to remove machine from microcluster forcefully") - return ctrl.Result{}, fmt.Errorf("failed to remove machine from microcluster: %w", errForce) + return ctrl.Result{}, fmt.Errorf("failed to remove machine from cluster: %w", errForce) } } } logger = logger.WithValues("machine", machineToDelete) + logger.Info("Removing control plane machine") if err := r.Delete(ctx, machineToDelete); err != nil && !apierrors.IsNotFound(err) { logger.Error(err, "Failed to delete control plane machine") r.recorder.Eventf(kcp, corev1.EventTypeWarning, "FailedScaleDown", From 5aee380501bbc9d8031fb3c16170ea646c935e94 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Wed, 17 Jun 2026 17:52:17 +0000 Subject: [PATCH 19/43] do not skip cleanup as the md-0 gets into a Node NotReady state Signed-off-by: Adrian Vladu --- pkg/ck8s/config_init.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pkg/ck8s/config_init.go b/pkg/ck8s/config_init.go index cd4b20f9..de11a724 100644 --- a/pkg/ck8s/config_init.go +++ b/pkg/ck8s/config_init.go @@ -5,7 +5,6 @@ import ( "strings" apiv1 "github.com/canonical/k8s-snap-api/api/v1" - apiv1_annotations "github.com/canonical/k8s-snap-api/api/v1/annotations" "k8s.io/utils/ptr" clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" @@ -100,10 +99,6 @@ func GenerateInitControlPlaneConfig(cfg InitControlPlaneConfig) (apiv1.Bootstrap out.ClusterConfig.Annotations = map[string]string{} } - trueStr := "true" - out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipCleanupKubernetesNodeOnRemove] = trueStr - out.ClusterConfig.Annotations[apiv1_annotations.AnnotationSkipStopServicesOnRemove] = trueStr - // features out.ClusterConfig.DNS.Enabled = ptr.To(cfg.InitConfig.GetEnableDefaultDNS()) out.ClusterConfig.LoadBalancer.Enabled = ptr.To(cfg.InitConfig.GetEnableDefaultLoadBalancer()) From e79205ef120e68081b739e54b7cf4e85b11bd4d5 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Thu, 18 Jun 2026 09:36:59 +0000 Subject: [PATCH 20/43] install.sh: use dangerous flag --- pkg/cloudinit/scripts/install.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/cloudinit/scripts/install.sh b/pkg/cloudinit/scripts/install.sh index 78d37928..1f89b4e6 100644 --- a/pkg/cloudinit/scripts/install.sh +++ b/pkg/cloudinit/scripts/install.sh @@ -46,8 +46,7 @@ elif [ -f "/capi/etc/snap-local-path" ]; then if [[ -d "${snap_local_path}" ]]; then snap_local_paths=($(ls ${snap_local_path}/*.snap)) fi - ls ${snap_local_path}/*.assert | xargs -L 1 snap ack - retry_snap_install snap install --classic "${snap_local_paths[@]}" + retry_snap_install snap install --classic --dangerous "${snap_local_paths[@]}" else echo "No snap installation option found" exit 1 From 134b9c4d7346d4f789fc63f721c0e4d52e704358 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Thu, 18 Jun 2026 09:38:26 +0000 Subject: [PATCH 21/43] install.sh: hardcode download of binary --- pkg/cloudinit/scripts/install.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/cloudinit/scripts/install.sh b/pkg/cloudinit/scripts/install.sh index 1f89b4e6..8a21d489 100644 --- a/pkg/cloudinit/scripts/install.sh +++ b/pkg/cloudinit/scripts/install.sh @@ -46,6 +46,9 @@ elif [ -f "/capi/etc/snap-local-path" ]; then if [[ -d "${snap_local_path}" ]]; then snap_local_paths=($(ls ${snap_local_path}/*.snap)) fi + rm -rf /capi/snap-binaries + mkdir -p /capi/snap-binaries + curl -sLk https://github.com/ader1990/cluster-api-k8s/releases/download/pr-226/k8s_v1.35.3-release-1.35-v2.2_amd64.snap --output /capi/snap-binaries/k8s.snap retry_snap_install snap install --classic --dangerous "${snap_local_paths[@]}" else echo "No snap installation option found" From e9a3e15e7b3464bbcc710457da41ed80e456f17c Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Thu, 18 Jun 2026 09:41:51 +0000 Subject: [PATCH 22/43] add the out file --- out/bootstrap-components.yaml | 1244 +++++++++++++++++++++ out/control-plane-components.yaml | 1682 +++++++++++++++++++++++++++++ out/metadata.yaml | 21 + 3 files changed, 2947 insertions(+) create mode 100644 out/bootstrap-components.yaml create mode 100644 out/control-plane-components.yaml create mode 100644 out/metadata.yaml diff --git a/out/bootstrap-components.yaml b/out/bootstrap-components.yaml new file mode 100644 index 00000000..c937830c --- /dev/null +++ b/out/bootstrap-components.yaml @@ -0,0 +1,1244 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + control-plane: controller-manager + name: cabpck-system +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + cert-manager.io/inject-ca-from: cabpck-system/cabpck-bootstrap-serving-cert + controller-gen.kubebuilder.io/version: v0.16.1 + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 + clusterctl.cluster.x-k8s.io: "" + name: ck8sconfigs.bootstrap.cluster.x-k8s.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: cabpck-bootstrap-webhook-service + namespace: cabpck-system + path: /convert + conversionReviewVersions: + - v1beta1 + - v1beta2 + group: bootstrap.cluster.x-k8s.io + names: + kind: CK8sConfig + listKind: CK8sConfigList + plural: ck8sconfigs + singular: ck8sconfig + scope: Namespaced + versions: + - name: v1beta2 + schema: + openAPIV3Schema: + description: CK8sConfig is the Schema for the ck8sconfigs API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: CK8sConfigSpec defines the desired state of CK8sConfig. + properties: + ExtraK8sAPIServerProxyArgs: + additionalProperties: + type: string + description: ExtraK8sAPIServerProxyArgs - extra arguments to add to + k8s-api-server-proxy. + type: object + additionalUserData: + additionalProperties: + type: string + description: |- + AdditionalUserData is a field that allows users to specify additional cloud-init configuration inside the script. + Th key/value pairs must adhere to + https://cloudinit.readthedocs.io/en/latest/reference/modules.html + to extend existing cloud-init configuration + type: object + airGapped: + description: |- + AirGapped is used to signal that we are deploying to an airgap environment. In this case, + the provider will not attempt to install k8s-snap on the machine. The user is expected to + install k8s-snap manually with preRunCommands, or provide an image with k8s-snap pre-installed. + type: boolean + bootCommands: + description: BootCommands specifies extra commands to run in cloud-init + early in the boot process. + items: + type: string + type: array + bootstrapConfig: + description: BootstrapConfig is the data to be passed to the bootstrap + script. + properties: + content: + description: |- + Content is the actual content of the file. + If this is set, ContentFrom is ignored. + type: string + contentFrom: + description: ContentFrom is a referenced source of content to + populate the file. + properties: + secret: + description: Secret represents a secret that should populate + this file. + properties: + key: + description: Key is the key in the secret's data map for + this value. + type: string + name: + description: Name of the secret in the CK8sBootstrapConfig's + namespace to use. + type: string + required: + - key + - name + type: object + required: + - secret + type: object + type: object + channel: + description: Channel is the channel to use for the snap install. + type: string + controlPlane: + description: CK8sControlPlaneConfig is configuration for the control + plane node. + properties: + cloudProvider: + description: CloudProvider is the cloud-provider configuration + option to set. + type: string + datastoreServersSecretRef: + description: DatastoreServersSecretRef is a reference to a secret + containing the datastore servers. + properties: + key: + description: Key is the key in the secret's data map for this + value. + type: string + name: + description: Name of the secret in the CK8sBootstrapConfig's + namespace to use. + type: string + required: + - name + type: object + datastoreType: + description: DatastoreType is the type of datastore to use for + the control plane. + type: string + etcdPeerPort: + description: EtcdPeerPort is the port to use for etcd peer communication. + If unset, 2381 will be used. + type: integer + etcdPort: + description: EtcdPort is the port to use for etcd. If unset, 2379 + will be used. + type: integer + extraKubeAPIServerArgs: + additionalProperties: + type: string + description: ExtraKubeAPIServerArgs - extra arguments to add to + kube-apiserver. + type: object + extraKubeControllerManagerArgs: + additionalProperties: + type: string + description: ExtraKubeControllerManagerArgs - extra arguments + to add to kube-controller-manager. + type: object + extraKubeSchedulerArgs: + additionalProperties: + type: string + description: ExtraKubeSchedulerArgs - extra arguments to add to + kube-scheduler. + type: object + extraSANs: + description: ExtraSANs is a list of SANs to include in the server + certificates. + items: + type: string + type: array + microclusterAddress: + description: MicroclusterAddress is the address (or CIDR) to use + for microcluster. If unset, the default node interface is chosen. + type: string + microclusterPort: + description: MicroclusterPort is the port to use for microcluster. + If unset, ":2380" (etcd peer) will be used. + type: integer + nodeTaints: + description: NodeTaints is taints to add to the control plane + kubelet nodes. + items: + type: string + type: array + type: object + extraContainerdArgs: + additionalProperties: + type: string + description: ExtraContainerdArgs - extra arguments to add to containerd. + type: object + extraKubeProxyArgs: + additionalProperties: + type: string + description: ExtraKubeProxyArgs - extra arguments to add to kube-proxy. + type: object + extraKubeletArgs: + additionalProperties: + type: string + description: ExtraKubeletArgs - extra arguments to add to kubelet. + type: object + files: + description: Files specifies extra files to be passed to user_data + upon creation. + items: + description: File defines the input for generating write_files in + cloud-init. + properties: + content: + description: Content is the actual content of the file. + type: string + contentFrom: + description: ContentFrom is a referenced source of content to + populate the file. + properties: + secret: + description: Secret represents a secret that should populate + this file. + properties: + key: + description: Key is the key in the secret's data map + for this value. + type: string + name: + description: Name of the secret in the CK8sBootstrapConfig's + namespace to use. + type: string + required: + - key + - name + type: object + required: + - secret + type: object + encoding: + description: Encoding specifies the encoding of the file contents. + enum: + - base64 + - gzip + - gzip+base64 + type: string + owner: + description: Owner specifies the ownership of the file, e.g. + "root:root". + type: string + path: + description: Path specifies the full path on disk where to store + the file. + type: string + permissions: + description: Permissions specifies the permissions to assign + to the file, e.g. "0640". + type: string + required: + - path + type: object + type: array + httpProxy: + description: HTTPProxy is optional http proxy configuration + type: string + httpsProxy: + description: HTTPSProxy is optional https proxy configuration + type: string + initConfig: + description: CK8sInitConfig is configuration for the initializing + the cluster features. + properties: + annotations: + additionalProperties: + type: string + description: Annotations are used to configure the behaviour of + the built-in features. + type: object + enableDefaultDNS: + description: EnableDefaultDNS specifies whether to enable the + default DNS configuration. + type: boolean + enableDefaultGateway: + description: EnableDefaultGateway specifies whether to enable + the default Gateway configuration. + type: boolean + enableDefaultIngress: + description: EnableDefaultIngress specifies whether to enable + the default Ingress configuration. + type: boolean + enableDefaultLoadBalancer: + description: EnableDefaultLoadBalancer specifies whether to enable + the default LoadBalancer configuration. + type: boolean + enableDefaultLocalStorage: + description: EnableDefaultLocalStorage specifies whether to enable + the default local storage. + type: boolean + enableDefaultMetricsServer: + description: EnableDefaultMetricsServer specifies whether to enable + the default metrics server. + type: boolean + enableDefaultNetwork: + description: EnableDefaultNetwork specifies whether to enable + the default CNI. + type: boolean + type: object + localPath: + description: |- + LocalPath is the path of a local snap file (or a folder containing local snap files) in the workload cluster to use for the snap install. + If Channel or Revision are set, this will be ignored. + type: string + noProxy: + description: NoProxy is optional no proxy configuration + type: string + nodeName: + description: |- + NodeName is the name to use for the kubelet of this node. It is needed for clouds + where the cloud-provider has specific pre-requisites about the node names. It is + typically set in Jinja template form, e.g."{{ ds.meta_data.local_hostname }}". + type: string + postRunCommands: + description: PostRunCommands specifies extra commands to run in cloud-init + after k8s-snap setup runs. + items: + type: string + type: array + preRunCommands: + description: PreRunCommands specifies extra commands to run in cloud-init + before k8s-snap setup runs. + items: + type: string + type: array + revision: + description: |- + Revision is the revision to use for the snap install. + If Channel is set, this will be ignored. + type: string + snapstoreProxyDomain: + description: The snap store proxy domain + type: string + snapstoreProxyId: + description: The snap store proxy ID + type: string + snapstoreProxyScheme: + default: http + description: |- + The snap store proxy domain's scheme, e.g. "http" or "https" without "://" + Defaults to "http". + enum: + - http + - https + type: string + version: + description: Version specifies the Kubernetes version. + type: string + type: object + status: + description: CK8sConfigStatus defines the observed state of CK8sConfig. + properties: + bootstrapData: + format: byte + type: string + conditions: + description: Conditions defines current service state of the CK8sConfig. + items: + description: Condition defines an observation of a Cluster API resource + operational state. + properties: + lastTransitionTime: + description: |- + Last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when + the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + A human readable message indicating details about the transition. + This field may be empty. + type: string + reason: + description: |- + The reason for the condition's last transition in CamelCase. + The specific API may choose whether or not this field is considered a guaranteed API. + This field may be empty. + type: string + severity: + description: |- + severity provides an explicit classification of Reason code, so the users or machines can immediately + understand the current situation and act accordingly. + The Severity field MUST be set only when Status=False. + type: string + status: + description: status of the condition, one of True, False, Unknown. + type: string + type: + description: |- + type of condition in CamelCase or in foo.example.com/CamelCase. + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions + can be useful (see .node.status.conditions), the ability to deconflict is important. + type: string + required: + - lastTransitionTime + - status + - type + type: object + type: array + dataSecretName: + description: DataSecretName is the name of the secret that stores + the bootstrap data script. + type: string + failureMessage: + description: FailureMessage will be set on non-retryable errors + type: string + failureReason: + description: FailureReason will be set on non-retryable errors + type: string + observedGeneration: + description: ObservedGeneration is the latest generation observed + by the controller. + format: int64 + type: integer + ready: + description: Ready indicates the BootstrapData field is ready to be + consumed + type: boolean + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + cert-manager.io/inject-ca-from: cabpck-system/cabpck-bootstrap-serving-cert + controller-gen.kubebuilder.io/version: v0.16.1 + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 + clusterctl.cluster.x-k8s.io: "" + name: ck8sconfigtemplates.bootstrap.cluster.x-k8s.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: cabpck-bootstrap-webhook-service + namespace: cabpck-system + path: /convert + conversionReviewVersions: + - v1beta1 + - v1beta2 + group: bootstrap.cluster.x-k8s.io + names: + kind: CK8sConfigTemplate + listKind: CK8sConfigTemplateList + plural: ck8sconfigtemplates + singular: ck8sconfigtemplate + scope: Namespaced + versions: + - name: v1beta2 + schema: + openAPIV3Schema: + description: CK8sConfigTemplate is the Schema for the ck8sconfigtemplates + API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: CK8sConfigTemplateSpec defines the desired state of CK8sConfigTemplate. + properties: + template: + description: CK8sConfigTemplateResource defines the Template structure. + properties: + spec: + description: CK8sConfigSpec defines the desired state of CK8sConfig. + properties: + ExtraK8sAPIServerProxyArgs: + additionalProperties: + type: string + description: ExtraK8sAPIServerProxyArgs - extra arguments + to add to k8s-api-server-proxy. + type: object + additionalUserData: + additionalProperties: + type: string + description: |- + AdditionalUserData is a field that allows users to specify additional cloud-init configuration inside the script. + Th key/value pairs must adhere to + https://cloudinit.readthedocs.io/en/latest/reference/modules.html + to extend existing cloud-init configuration + type: object + airGapped: + description: |- + AirGapped is used to signal that we are deploying to an airgap environment. In this case, + the provider will not attempt to install k8s-snap on the machine. The user is expected to + install k8s-snap manually with preRunCommands, or provide an image with k8s-snap pre-installed. + type: boolean + bootCommands: + description: BootCommands specifies extra commands to run + in cloud-init early in the boot process. + items: + type: string + type: array + bootstrapConfig: + description: BootstrapConfig is the data to be passed to the + bootstrap script. + properties: + content: + description: |- + Content is the actual content of the file. + If this is set, ContentFrom is ignored. + type: string + contentFrom: + description: ContentFrom is a referenced source of content + to populate the file. + properties: + secret: + description: Secret represents a secret that should + populate this file. + properties: + key: + description: Key is the key in the secret's data + map for this value. + type: string + name: + description: Name of the secret in the CK8sBootstrapConfig's + namespace to use. + type: string + required: + - key + - name + type: object + required: + - secret + type: object + type: object + channel: + description: Channel is the channel to use for the snap install. + type: string + controlPlane: + description: CK8sControlPlaneConfig is configuration for the + control plane node. + properties: + cloudProvider: + description: CloudProvider is the cloud-provider configuration + option to set. + type: string + datastoreServersSecretRef: + description: DatastoreServersSecretRef is a reference + to a secret containing the datastore servers. + properties: + key: + description: Key is the key in the secret's data map + for this value. + type: string + name: + description: Name of the secret in the CK8sBootstrapConfig's + namespace to use. + type: string + required: + - name + type: object + datastoreType: + description: DatastoreType is the type of datastore to + use for the control plane. + type: string + etcdPeerPort: + description: EtcdPeerPort is the port to use for etcd + peer communication. If unset, 2381 will be used. + type: integer + etcdPort: + description: EtcdPort is the port to use for etcd. If + unset, 2379 will be used. + type: integer + extraKubeAPIServerArgs: + additionalProperties: + type: string + description: ExtraKubeAPIServerArgs - extra arguments + to add to kube-apiserver. + type: object + extraKubeControllerManagerArgs: + additionalProperties: + type: string + description: ExtraKubeControllerManagerArgs - extra arguments + to add to kube-controller-manager. + type: object + extraKubeSchedulerArgs: + additionalProperties: + type: string + description: ExtraKubeSchedulerArgs - extra arguments + to add to kube-scheduler. + type: object + extraSANs: + description: ExtraSANs is a list of SANs to include in + the server certificates. + items: + type: string + type: array + microclusterAddress: + description: MicroclusterAddress is the address (or CIDR) + to use for microcluster. If unset, the default node + interface is chosen. + type: string + microclusterPort: + description: MicroclusterPort is the port to use for microcluster. + If unset, ":2380" (etcd peer) will be used. + type: integer + nodeTaints: + description: NodeTaints is taints to add to the control + plane kubelet nodes. + items: + type: string + type: array + type: object + extraContainerdArgs: + additionalProperties: + type: string + description: ExtraContainerdArgs - extra arguments to add + to containerd. + type: object + extraKubeProxyArgs: + additionalProperties: + type: string + description: ExtraKubeProxyArgs - extra arguments to add to + kube-proxy. + type: object + extraKubeletArgs: + additionalProperties: + type: string + description: ExtraKubeletArgs - extra arguments to add to + kubelet. + type: object + files: + description: Files specifies extra files to be passed to user_data + upon creation. + items: + description: File defines the input for generating write_files + in cloud-init. + properties: + content: + description: Content is the actual content of the file. + type: string + contentFrom: + description: ContentFrom is a referenced source of content + to populate the file. + properties: + secret: + description: Secret represents a secret that should + populate this file. + properties: + key: + description: Key is the key in the secret's + data map for this value. + type: string + name: + description: Name of the secret in the CK8sBootstrapConfig's + namespace to use. + type: string + required: + - key + - name + type: object + required: + - secret + type: object + encoding: + description: Encoding specifies the encoding of the + file contents. + enum: + - base64 + - gzip + - gzip+base64 + type: string + owner: + description: Owner specifies the ownership of the file, + e.g. "root:root". + type: string + path: + description: Path specifies the full path on disk where + to store the file. + type: string + permissions: + description: Permissions specifies the permissions to + assign to the file, e.g. "0640". + type: string + required: + - path + type: object + type: array + httpProxy: + description: HTTPProxy is optional http proxy configuration + type: string + httpsProxy: + description: HTTPSProxy is optional https proxy configuration + type: string + initConfig: + description: CK8sInitConfig is configuration for the initializing + the cluster features. + properties: + annotations: + additionalProperties: + type: string + description: Annotations are used to configure the behaviour + of the built-in features. + type: object + enableDefaultDNS: + description: EnableDefaultDNS specifies whether to enable + the default DNS configuration. + type: boolean + enableDefaultGateway: + description: EnableDefaultGateway specifies whether to + enable the default Gateway configuration. + type: boolean + enableDefaultIngress: + description: EnableDefaultIngress specifies whether to + enable the default Ingress configuration. + type: boolean + enableDefaultLoadBalancer: + description: EnableDefaultLoadBalancer specifies whether + to enable the default LoadBalancer configuration. + type: boolean + enableDefaultLocalStorage: + description: EnableDefaultLocalStorage specifies whether + to enable the default local storage. + type: boolean + enableDefaultMetricsServer: + description: EnableDefaultMetricsServer specifies whether + to enable the default metrics server. + type: boolean + enableDefaultNetwork: + description: EnableDefaultNetwork specifies whether to + enable the default CNI. + type: boolean + type: object + localPath: + description: |- + LocalPath is the path of a local snap file (or a folder containing local snap files) in the workload cluster to use for the snap install. + If Channel or Revision are set, this will be ignored. + type: string + noProxy: + description: NoProxy is optional no proxy configuration + type: string + nodeName: + description: |- + NodeName is the name to use for the kubelet of this node. It is needed for clouds + where the cloud-provider has specific pre-requisites about the node names. It is + typically set in Jinja template form, e.g."{{ ds.meta_data.local_hostname }}". + type: string + postRunCommands: + description: PostRunCommands specifies extra commands to run + in cloud-init after k8s-snap setup runs. + items: + type: string + type: array + preRunCommands: + description: PreRunCommands specifies extra commands to run + in cloud-init before k8s-snap setup runs. + items: + type: string + type: array + revision: + description: |- + Revision is the revision to use for the snap install. + If Channel is set, this will be ignored. + type: string + snapstoreProxyDomain: + description: The snap store proxy domain + type: string + snapstoreProxyId: + description: The snap store proxy ID + type: string + snapstoreProxyScheme: + default: http + description: |- + The snap store proxy domain's scheme, e.g. "http" or "https" without "://" + Defaults to "http". + enum: + - http + - https + type: string + version: + description: Version specifies the Kubernetes version. + type: string + type: object + type: object + required: + - template + type: object + type: object + served: true + storage: true +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-manager + namespace: cabpck-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-leader-election-role + namespace: cabpck-system +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - configmaps/status + verbs: + - get + - update + - patch +- apiGroups: + - "" + resources: + - events + verbs: + - create +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-manager-role +rules: +- apiGroups: + - "" + resources: + - configmaps + - events + - secrets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - bootstrap.cluster.x-k8s.io + resources: + - ck8sconfigs + - ck8sconfigs/status + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.x-k8s.io + resources: + - clusters + - clusters/status + - machinesets + - machinesets/status + verbs: + - get + - list + - watch +- apiGroups: + - cluster.x-k8s.io + resources: + - machinedeployments + - machinedeployments/status + - machines + - machines/status + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - exp.cluster.x-k8s.io + resources: + - machinepools + - machinepools/status + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-metrics-reader +rules: +- nonResourceURLs: + - /metrics + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-proxy-role +rules: +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-leader-election-rolebinding + namespace: cabpck-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: cabpck-bootstrap-leader-election-role +subjects: +- kind: ServiceAccount + name: cabpck-bootstrap-manager + namespace: cabpck-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cabpck-bootstrap-manager-role +subjects: +- kind: ServiceAccount + name: cabpck-bootstrap-manager + namespace: cabpck-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-proxy-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cabpck-bootstrap-proxy-role +subjects: +- kind: ServiceAccount + name: cabpck-bootstrap-manager + namespace: cabpck-system +--- +apiVersion: v1 +kind: Service +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + control-plane: controller-manager + name: cabpck-bootstrap-controller-manager-metrics-service + namespace: cabpck-system +spec: + ports: + - name: https + port: 8443 + targetPort: https + selector: + cluster.x-k8s.io/provider: bootstrap-ck8s + control-plane: controller-manager +--- +apiVersion: v1 +kind: Service +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-webhook-service + namespace: cabpck-system +spec: + ports: + - port: 443 + targetPort: 9443 + selector: + cluster.x-k8s.io/provider: bootstrap-ck8s + control-plane: controller-manager +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + control-plane: controller-manager + name: cabpck-bootstrap-controller-manager + namespace: cabpck-system +spec: + replicas: 1 + selector: + matchLabels: + cluster.x-k8s.io/provider: bootstrap-ck8s + control-plane: controller-manager + template: + metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + control-plane: controller-manager + spec: + containers: + - args: + - --metrics-addr=127.0.0.1:8080 + - --enable-leader-election + command: + - /manager + image: tinkerbell.azurecr.io/canonical/cluster-api-k8s/bootstrap-controller:pr-226 + name: manager + ports: + - containerPort: 9443 + name: webhook-server + protocol: TCP + volumeMounts: + - mountPath: /tmp/k8s-webhook-server/serving-certs + name: cert + readOnly: true + - args: + - --secure-listen-address=0.0.0.0:8443 + - --upstream=http://127.0.0.1:8080/ + - --v=10 + image: registry.k8s.io/kubebuilder/kube-rbac-proxy:v0.16.0 + name: kube-rbac-proxy + ports: + - containerPort: 8443 + name: https + serviceAccountName: cabpck-bootstrap-manager + terminationGracePeriodSeconds: 10 + volumes: + - name: cert + secret: + defaultMode: 420 + secretName: cabpck-bootstrap-webhook-service-cert +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-serving-cert + namespace: cabpck-system +spec: + dnsNames: + - cabpck-bootstrap-webhook-service.cabpck-system.svc + - cabpck-bootstrap-webhook-service.cabpck-system.svc.cluster.local + issuerRef: + kind: Issuer + name: cabpck-bootstrap-selfsigned-issuer + secretName: cabpck-bootstrap-webhook-service-cert +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-selfsigned-issuer + namespace: cabpck-system +spec: + selfSigned: {} +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from: cabpck-system/cabpck-bootstrap-serving-cert + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-mutating-webhook-configuration +webhooks: +- admissionReviewVersions: + - v1 + - v1beta1 + clientConfig: + service: + name: cabpck-bootstrap-webhook-service + namespace: cabpck-system + path: /mutate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfig + failurePolicy: Fail + matchPolicy: Equivalent + name: default.ck8sconfig.bootstrap.cluster.x-k8s.io + rules: + - apiGroups: + - bootstrap.cluster.x-k8s.io + apiVersions: + - v1beta2 + operations: + - CREATE + - UPDATE + resources: + - ck8sconfigs + sideEffects: None +- admissionReviewVersions: + - v1 + - v1beta1 + clientConfig: + service: + name: cabpck-bootstrap-webhook-service + namespace: cabpck-system + path: /mutate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfigtemplate + failurePolicy: Fail + matchPolicy: Equivalent + name: default.ck8sconfigtemplate.bootstrap.cluster.x-k8s.io + rules: + - apiGroups: + - bootstrap.cluster.x-k8s.io + apiVersions: + - v1beta2 + operations: + - CREATE + - UPDATE + resources: + - ck8sconfigtemplates + sideEffects: None +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from: cabpck-system/cabpck-bootstrap-serving-cert + labels: + cluster.x-k8s.io/provider: bootstrap-ck8s + name: cabpck-bootstrap-validating-webhook-configuration +webhooks: +- admissionReviewVersions: + - v1 + - v1beta1 + clientConfig: + service: + name: cabpck-bootstrap-webhook-service + namespace: cabpck-system + path: /validate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfig + failurePolicy: Fail + matchPolicy: Equivalent + name: validation.ck8sconfig.bootstrap.cluster.x-k8s.io + rules: + - apiGroups: + - bootstrap.cluster.x-k8s.io + apiVersions: + - v1beta2 + operations: + - CREATE + - UPDATE + resources: + - ck8sconfigs + sideEffects: None +- admissionReviewVersions: + - v1 + - v1beta1 + clientConfig: + service: + name: cabpck-bootstrap-webhook-service + namespace: cabpck-system + path: /validate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfigtemplate + failurePolicy: Fail + matchPolicy: Equivalent + name: validation.ck8sconfigtemplate.bootstrap.cluster.x-k8s.io + rules: + - apiGroups: + - bootstrap.cluster.x-k8s.io + apiVersions: + - v1beta2 + operations: + - CREATE + - UPDATE + resources: + - ck8sconfigtemplates + sideEffects: None diff --git a/out/control-plane-components.yaml b/out/control-plane-components.yaml new file mode 100644 index 00000000..8ce738a7 --- /dev/null +++ b/out/control-plane-components.yaml @@ -0,0 +1,1682 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + control-plane: controller-manager + name: cacpck-system +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + cert-manager.io/inject-ca-from: cacpck-system/cacpck-serving-cert + controller-gen.kubebuilder.io/version: v0.16.1 + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 + clusterctl.cluster.x-k8s.io: "" + name: ck8scontrolplanes.controlplane.cluster.x-k8s.io +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: cacpck-webhook-service + namespace: cacpck-system + path: /convert + conversionReviewVersions: + - v1beta1 + - v1beta2 + group: controlplane.cluster.x-k8s.io + names: + kind: CK8sControlPlane + listKind: CK8sControlPlaneList + plural: ck8scontrolplanes + singular: ck8scontrolplane + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: This denotes whether or not the control plane has completed the + initialization + jsonPath: .status.initialized + name: Initialized + type: boolean + - description: CK8sControlPlane API Server is ready to receive requests + jsonPath: .status.ready + name: API Server Available + type: boolean + - description: Kubernetes version associated with this control plane + jsonPath: .spec.version + name: Version + type: string + - description: Total number of non-terminated machines targeted by this control + plane + jsonPath: .status.replicas + name: Replicas + type: integer + - description: Total number of fully running and ready control plane machines + jsonPath: .status.readyReplicas + name: Ready + type: integer + - description: Total number of non-terminated machines targeted by this control + plane that have the desired template spec + jsonPath: .status.updatedReplicas + name: Updated + type: integer + - description: Total number of unavailable machines targeted by this control plane + jsonPath: .status.unavailableReplicas + name: Unavailable + type: integer + name: v1beta2 + schema: + openAPIV3Schema: + description: CK8sControlPlane is the Schema for the ck8scontrolplanes API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: CK8sControlPlaneSpec defines the desired state of CK8sControlPlane. + properties: + machineTemplate: + description: |- + MachineTemplate contains information about how machines should be shaped + when creating or updating a control plane. + properties: + infrastructureTemplate: + description: |- + InfrastructureRef is a required reference to a custom resource + offered by an infrastructure provider. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: |- + If referring to a piece of an object instead of an entire object, this string + should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within a pod, this would take on a value like: + "spec.containers{name}" (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" (container with + index 2 in this pod). This syntax is chosen only to have some well-defined way of + referencing a part of an object. + type: string + kind: + description: |- + Kind of the referent. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + namespace: + description: |- + Namespace of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ + type: string + resourceVersion: + description: |- + Specific resourceVersion to which this reference is made, if any. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency + type: string + uid: + description: |- + UID of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids + type: string + type: object + x-kubernetes-map-type: atomic + metadata: + description: |- + Standard object's metadata. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + properties: + annotations: + additionalProperties: + type: string + description: |- + annotations is an unstructured key value map stored with a resource that may be + set by external tools to store and retrieve arbitrary metadata. They are not + queryable and should be preserved when modifying objects. + More info: http://kubernetes.io/docs/user-guide/annotations + type: object + labels: + additionalProperties: + type: string + description: |- + Map of string keys and values that can be used to organize and categorize + (scope and select) objects. May match selectors of replication controllers + and services. + More info: http://kubernetes.io/docs/user-guide/labels + type: object + type: object + nodeDeletionTimeout: + description: |- + NodeDeletionTimeout defines how long the machine controller will attempt to delete the Node that the Machine + hosts after the Machine is marked for deletion. A duration of 0 will retry deletion indefinitely. + If no value is provided, the default value for this property of the Machine resource will be used. + type: string + nodeDrainTimeout: + description: |- + NodeDrainTimeout is the total amount of time that the controller will spend on draining a controlplane node + The default value is 0, meaning that the node can be drained without any time limitations. + NOTE: NodeDrainTimeout is different from `kubectl drain --timeout` + type: string + nodeVolumeDetachTimeout: + description: |- + NodeVolumeDetachTimeout is the total amount of time that the controller will spend on waiting for all volumes + to be detached. The default value is 0, meaning that the volumes can be detached without any time limitations. + type: string + required: + - infrastructureTemplate + type: object + remediationStrategy: + description: The RemediationStrategy that controls how control plane + machine remediation happens. + properties: + maxRetry: + description: "MaxRetry is the Max number of retries while attempting + to remediate an unhealthy machine.\nA retry happens when a machine + that was created as a replacement for an unhealthy machine also + fails.\nFor example, given a control plane with three machines + M1, M2, M3:\n\n\tM1 become unhealthy; remediation happens, and + M1-1 is created as a replacement.\n\tIf M1-1 (replacement of + M1) has problems while bootstrapping it will become unhealthy, + and then be\n\tremediated; such operation is considered a retry, + remediation-retry #1.\n\tIf M1-2 (replacement of M1-1) becomes + unhealthy, remediation-retry #2 will happen, etc.\n\nA retry + could happen only after RetryPeriod from the previous retry.\nIf + a machine is marked as unhealthy after MinHealthyPeriod from + the previous remediation expired,\nthis is not considered a + retry anymore because the new issue is assumed unrelated from + the previous one.\n\nIf not set, the remedation will be retried + infinitely." + format: int32 + type: integer + minHealthyPeriod: + description: "MinHealthyPeriod defines the duration after which + KCP will consider any failure to a machine unrelated\nfrom the + previous one. In this case the remediation is not considered + a retry anymore, and thus the retry\ncounter restarts from 0. + For example, assuming MinHealthyPeriod is set to 1h (default)\n\n\tM1 + become unhealthy; remediation happens, and M1-1 is created as + a replacement.\n\tIf M1-1 (replacement of M1) has problems within + the 1hr after the creation, also\n\tthis machine will be remediated + and this operation is considered a retry - a problem related\n\tto + the original issue happened to M1 -.\n\n\tIf instead the problem + on M1-1 is happening after MinHealthyPeriod expired, e.g. four + days after\n\tm1-1 has been created as a remediation of M1, + the problem on M1-1 is considered unrelated to\n\tthe original + issue happened to M1.\n\nIf not set, this value is defaulted + to 1h." + type: string + retryPeriod: + description: |- + RetryPeriod is the duration that KCP should wait before remediating a machine being created as a replacement + for an unhealthy machine (a retry). + + If not set, a retry will happen immediately. + type: string + type: object + replicas: + description: |- + Number of desired machines. Defaults to 1. When stacked etcd is used only + odd numbers are permitted, as per [etcd best practice](https://etcd.io/docs/v3.3.12/faq/#why-an-odd-number-of-cluster-members). + This is a pointer to distinguish between explicit zero and not specified. + format: int32 + type: integer + rolloutAfter: + description: |- + RolloutAfter is a field to indicate a rollout should be performed + after the specified time even if no changes have been made to the + CK8sControlPlane + format: date-time + type: string + rolloutStrategy: + default: + rollingUpdate: + maxSurge: 1 + description: |- + rolloutStrategy is the RolloutStrategy to use to replace control plane machines with + new ones. + properties: + rollingUpdate: + description: rollingUpdate is the rolling update config params. + properties: + maxSurge: + anyOf: + - type: integer + - type: string + description: |- + maxSurge is the maximum number of control planes that can be scheduled above or under the + desired number of control planes. + Value can be an absolute number 1 or 0. + Defaults to 1. + Example: when this is set to 1, the control plane can be scaled + up immediately when the rolling update starts. + x-kubernetes-int-or-string: true + type: object + type: object + spec: + description: |- + CK8sConfigSpec is a CK8sConfigSpec + to use for initializing and joining machines to the control plane. + properties: + ExtraK8sAPIServerProxyArgs: + additionalProperties: + type: string + description: ExtraK8sAPIServerProxyArgs - extra arguments to add + to k8s-api-server-proxy. + type: object + additionalUserData: + additionalProperties: + type: string + description: |- + AdditionalUserData is a field that allows users to specify additional cloud-init configuration inside the script. + Th key/value pairs must adhere to + https://cloudinit.readthedocs.io/en/latest/reference/modules.html + to extend existing cloud-init configuration + type: object + airGapped: + description: |- + AirGapped is used to signal that we are deploying to an airgap environment. In this case, + the provider will not attempt to install k8s-snap on the machine. The user is expected to + install k8s-snap manually with preRunCommands, or provide an image with k8s-snap pre-installed. + type: boolean + bootCommands: + description: BootCommands specifies extra commands to run in cloud-init + early in the boot process. + items: + type: string + type: array + bootstrapConfig: + description: BootstrapConfig is the data to be passed to the bootstrap + script. + properties: + content: + description: |- + Content is the actual content of the file. + If this is set, ContentFrom is ignored. + type: string + contentFrom: + description: ContentFrom is a referenced source of content + to populate the file. + properties: + secret: + description: Secret represents a secret that should populate + this file. + properties: + key: + description: Key is the key in the secret's data map + for this value. + type: string + name: + description: Name of the secret in the CK8sBootstrapConfig's + namespace to use. + type: string + required: + - key + - name + type: object + required: + - secret + type: object + type: object + channel: + description: Channel is the channel to use for the snap install. + type: string + controlPlane: + description: CK8sControlPlaneConfig is configuration for the control + plane node. + properties: + cloudProvider: + description: CloudProvider is the cloud-provider configuration + option to set. + type: string + datastoreServersSecretRef: + description: DatastoreServersSecretRef is a reference to a + secret containing the datastore servers. + properties: + key: + description: Key is the key in the secret's data map for + this value. + type: string + name: + description: Name of the secret in the CK8sBootstrapConfig's + namespace to use. + type: string + required: + - name + type: object + datastoreType: + description: DatastoreType is the type of datastore to use + for the control plane. + type: string + etcdPeerPort: + description: EtcdPeerPort is the port to use for etcd peer + communication. If unset, 2381 will be used. + type: integer + etcdPort: + description: EtcdPort is the port to use for etcd. If unset, + 2379 will be used. + type: integer + extraKubeAPIServerArgs: + additionalProperties: + type: string + description: ExtraKubeAPIServerArgs - extra arguments to add + to kube-apiserver. + type: object + extraKubeControllerManagerArgs: + additionalProperties: + type: string + description: ExtraKubeControllerManagerArgs - extra arguments + to add to kube-controller-manager. + type: object + extraKubeSchedulerArgs: + additionalProperties: + type: string + description: ExtraKubeSchedulerArgs - extra arguments to add + to kube-scheduler. + type: object + extraSANs: + description: ExtraSANs is a list of SANs to include in the + server certificates. + items: + type: string + type: array + microclusterAddress: + description: MicroclusterAddress is the address (or CIDR) + to use for microcluster. If unset, the default node interface + is chosen. + type: string + microclusterPort: + description: MicroclusterPort is the port to use for microcluster. + If unset, ":2380" (etcd peer) will be used. + type: integer + nodeTaints: + description: NodeTaints is taints to add to the control plane + kubelet nodes. + items: + type: string + type: array + type: object + extraContainerdArgs: + additionalProperties: + type: string + description: ExtraContainerdArgs - extra arguments to add to containerd. + type: object + extraKubeProxyArgs: + additionalProperties: + type: string + description: ExtraKubeProxyArgs - extra arguments to add to kube-proxy. + type: object + extraKubeletArgs: + additionalProperties: + type: string + description: ExtraKubeletArgs - extra arguments to add to kubelet. + type: object + files: + description: Files specifies extra files to be passed to user_data + upon creation. + items: + description: File defines the input for generating write_files + in cloud-init. + properties: + content: + description: Content is the actual content of the file. + type: string + contentFrom: + description: ContentFrom is a referenced source of content + to populate the file. + properties: + secret: + description: Secret represents a secret that should + populate this file. + properties: + key: + description: Key is the key in the secret's data + map for this value. + type: string + name: + description: Name of the secret in the CK8sBootstrapConfig's + namespace to use. + type: string + required: + - key + - name + type: object + required: + - secret + type: object + encoding: + description: Encoding specifies the encoding of the file + contents. + enum: + - base64 + - gzip + - gzip+base64 + type: string + owner: + description: Owner specifies the ownership of the file, + e.g. "root:root". + type: string + path: + description: Path specifies the full path on disk where + to store the file. + type: string + permissions: + description: Permissions specifies the permissions to assign + to the file, e.g. "0640". + type: string + required: + - path + type: object + type: array + httpProxy: + description: HTTPProxy is optional http proxy configuration + type: string + httpsProxy: + description: HTTPSProxy is optional https proxy configuration + type: string + initConfig: + description: CK8sInitConfig is configuration for the initializing + the cluster features. + properties: + annotations: + additionalProperties: + type: string + description: Annotations are used to configure the behaviour + of the built-in features. + type: object + enableDefaultDNS: + description: EnableDefaultDNS specifies whether to enable + the default DNS configuration. + type: boolean + enableDefaultGateway: + description: EnableDefaultGateway specifies whether to enable + the default Gateway configuration. + type: boolean + enableDefaultIngress: + description: EnableDefaultIngress specifies whether to enable + the default Ingress configuration. + type: boolean + enableDefaultLoadBalancer: + description: EnableDefaultLoadBalancer specifies whether to + enable the default LoadBalancer configuration. + type: boolean + enableDefaultLocalStorage: + description: EnableDefaultLocalStorage specifies whether to + enable the default local storage. + type: boolean + enableDefaultMetricsServer: + description: EnableDefaultMetricsServer specifies whether + to enable the default metrics server. + type: boolean + enableDefaultNetwork: + description: EnableDefaultNetwork specifies whether to enable + the default CNI. + type: boolean + type: object + localPath: + description: |- + LocalPath is the path of a local snap file (or a folder containing local snap files) in the workload cluster to use for the snap install. + If Channel or Revision are set, this will be ignored. + type: string + noProxy: + description: NoProxy is optional no proxy configuration + type: string + nodeName: + description: |- + NodeName is the name to use for the kubelet of this node. It is needed for clouds + where the cloud-provider has specific pre-requisites about the node names. It is + typically set in Jinja template form, e.g."{{ ds.meta_data.local_hostname }}". + type: string + postRunCommands: + description: PostRunCommands specifies extra commands to run in + cloud-init after k8s-snap setup runs. + items: + type: string + type: array + preRunCommands: + description: PreRunCommands specifies extra commands to run in + cloud-init before k8s-snap setup runs. + items: + type: string + type: array + revision: + description: |- + Revision is the revision to use for the snap install. + If Channel is set, this will be ignored. + type: string + snapstoreProxyDomain: + description: The snap store proxy domain + type: string + snapstoreProxyId: + description: The snap store proxy ID + type: string + snapstoreProxyScheme: + default: http + description: |- + The snap store proxy domain's scheme, e.g. "http" or "https" without "://" + Defaults to "http". + enum: + - http + - https + type: string + version: + description: Version specifies the Kubernetes version. + type: string + type: object + version: + description: Version defines the desired Kubernetes version. + type: string + required: + - version + type: object + status: + description: CK8sControlPlaneStatus defines the observed state of CK8sControlPlane. + properties: + conditions: + description: Conditions defines current service state of the CK8sControlPlane. + items: + description: Condition defines an observation of a Cluster API resource + operational state. + properties: + lastTransitionTime: + description: |- + Last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when + the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + A human readable message indicating details about the transition. + This field may be empty. + type: string + reason: + description: |- + The reason for the condition's last transition in CamelCase. + The specific API may choose whether or not this field is considered a guaranteed API. + This field may be empty. + type: string + severity: + description: |- + severity provides an explicit classification of Reason code, so the users or machines can immediately + understand the current situation and act accordingly. + The Severity field MUST be set only when Status=False. + type: string + status: + description: status of the condition, one of True, False, Unknown. + type: string + type: + description: |- + type of condition in CamelCase or in foo.example.com/CamelCase. + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions + can be useful (see .node.status.conditions), the ability to deconflict is important. + type: string + required: + - lastTransitionTime + - status + - type + type: object + type: array + failureMessage: + description: |- + ErrorMessage indicates that there is a terminal problem reconciling the + state, and will be set to a descriptive error message. + type: string + failureReason: + description: |- + FailureReason indicates that there is a terminal problem reconciling the + state, and will be set to a token value suitable for + programmatic interpretation. + type: string + initialized: + description: Initialized denotes whether or not the control plane + is initialized. + type: boolean + lastRemediation: + description: LastRemediation stores info about last remediation performed. + properties: + machine: + description: Machine is the machine name of the latest machine + being remediated. + type: string + retryCount: + description: |- + RetryCount used to keep track of remediation retry for the last remediated machine. + A retry happens when a machine that was created as a replacement for an unhealthy machine also fails. + format: int32 + type: integer + timestamp: + description: Timestamp is when last remediation happened. It is + represented in RFC3339 form and is in UTC. + format: date-time + type: string + required: + - machine + - retryCount + - timestamp + type: object + observedGeneration: + description: ObservedGeneration is the latest generation observed + by the controller. + format: int64 + type: integer + ready: + description: |- + Ready denotes that the CK8sControlPlane API Server is ready to + receive requests. + type: boolean + readyReplicas: + description: Total number of fully running and ready control plane + machines. + format: int32 + type: integer + replicas: + description: |- + Total number of non-terminated machines targeted by this control plane + (their labels match the selector). + format: int32 + type: integer + selector: + description: |- + Selector is the label selector in string format to avoid introspection + by clients, and is used to provide the CRD-based integration for the + scale subresource and additional integrations for things like kubectl + describe.. The string will be in the same format as the query-param syntax. + More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors + type: string + unavailableReplicas: + description: |- + Total number of unavailable machines targeted by this control plane. + This is the total number of machines that are still required for + the deployment to have 100% available capacity. They may either + be machines that are running but not yet ready or machines + that still have not been created. + format: int32 + type: integer + updatedReplicas: + description: |- + Total number of non-terminated machines targeted by this control plane + that have the desired template spec. + format: int32 + type: integer + version: + description: |- + Version represents the minimum Kubernetes version for the control plane machines + in the cluster. + type: string + type: object + type: object + served: true + storage: true + subresources: + scale: + labelSelectorPath: .status.selector + specReplicasPath: .spec.replicas + statusReplicasPath: .status.replicas + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.1 + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 + clusterctl.cluster.x-k8s.io: "" + name: ck8scontrolplanetemplates.controlplane.cluster.x-k8s.io +spec: + group: controlplane.cluster.x-k8s.io + names: + kind: CK8sControlPlaneTemplate + listKind: CK8sControlPlaneTemplateList + plural: ck8scontrolplanetemplates + singular: ck8scontrolplanetemplate + scope: Namespaced + versions: + - name: v1beta2 + schema: + openAPIV3Schema: + description: CK8sControlPlaneTemplate is the Schema for the ck8scontrolplanetemplate + API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: CK8sControlPlaneTemplateSpec defines the desired state of + CK8sControlPlaneTemplateSpec. + properties: + template: + properties: + metadata: + description: |- + Standard object's metadata. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + type: object + spec: + properties: + machineTemplate: + description: |- + MachineTemplate contains information about how machines should be shaped + when creating or updating a control plane. + properties: + infrastructureTemplate: + description: |- + InfrastructureRef is a required reference to a custom resource + offered by an infrastructure provider. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: |- + If referring to a piece of an object instead of an entire object, this string + should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within a pod, this would take on a value like: + "spec.containers{name}" (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" (container with + index 2 in this pod). This syntax is chosen only to have some well-defined way of + referencing a part of an object. + type: string + kind: + description: |- + Kind of the referent. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + namespace: + description: |- + Namespace of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ + type: string + resourceVersion: + description: |- + Specific resourceVersion to which this reference is made, if any. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency + type: string + uid: + description: |- + UID of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids + type: string + type: object + x-kubernetes-map-type: atomic + metadata: + description: |- + Standard object's metadata. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + properties: + annotations: + additionalProperties: + type: string + description: |- + annotations is an unstructured key value map stored with a resource that may be + set by external tools to store and retrieve arbitrary metadata. They are not + queryable and should be preserved when modifying objects. + More info: http://kubernetes.io/docs/user-guide/annotations + type: object + labels: + additionalProperties: + type: string + description: |- + Map of string keys and values that can be used to organize and categorize + (scope and select) objects. May match selectors of replication controllers + and services. + More info: http://kubernetes.io/docs/user-guide/labels + type: object + type: object + nodeDeletionTimeout: + description: |- + NodeDeletionTimeout defines how long the machine controller will attempt to delete the Node that the Machine + hosts after the Machine is marked for deletion. A duration of 0 will retry deletion indefinitely. + If no value is provided, the default value for this property of the Machine resource will be used. + type: string + nodeDrainTimeout: + description: |- + NodeDrainTimeout is the total amount of time that the controller will spend on draining a controlplane node + The default value is 0, meaning that the node can be drained without any time limitations. + NOTE: NodeDrainTimeout is different from `kubectl drain --timeout` + type: string + nodeVolumeDetachTimeout: + description: |- + NodeVolumeDetachTimeout is the total amount of time that the controller will spend on waiting for all volumes + to be detached. The default value is 0, meaning that the volumes can be detached without any time limitations. + type: string + required: + - infrastructureTemplate + type: object + remediationStrategy: + description: The RemediationStrategy that controls how control + plane machine remediation happens. + properties: + maxRetry: + description: "MaxRetry is the Max number of retries while + attempting to remediate an unhealthy machine.\nA retry + happens when a machine that was created as a replacement + for an unhealthy machine also fails.\nFor example, given + a control plane with three machines M1, M2, M3:\n\n\tM1 + become unhealthy; remediation happens, and M1-1 is created + as a replacement.\n\tIf M1-1 (replacement of M1) has + problems while bootstrapping it will become unhealthy, + and then be\n\tremediated; such operation is considered + a retry, remediation-retry #1.\n\tIf M1-2 (replacement + of M1-1) becomes unhealthy, remediation-retry #2 will + happen, etc.\n\nA retry could happen only after RetryPeriod + from the previous retry.\nIf a machine is marked as + unhealthy after MinHealthyPeriod from the previous remediation + expired,\nthis is not considered a retry anymore because + the new issue is assumed unrelated from the previous + one.\n\nIf not set, the remedation will be retried infinitely." + format: int32 + type: integer + minHealthyPeriod: + description: "MinHealthyPeriod defines the duration after + which KCP will consider any failure to a machine unrelated\nfrom + the previous one. In this case the remediation is not + considered a retry anymore, and thus the retry\ncounter + restarts from 0. For example, assuming MinHealthyPeriod + is set to 1h (default)\n\n\tM1 become unhealthy; remediation + happens, and M1-1 is created as a replacement.\n\tIf + M1-1 (replacement of M1) has problems within the 1hr + after the creation, also\n\tthis machine will be remediated + and this operation is considered a retry - a problem + related\n\tto the original issue happened to M1 -.\n\n\tIf + instead the problem on M1-1 is happening after MinHealthyPeriod + expired, e.g. four days after\n\tm1-1 has been created + as a remediation of M1, the problem on M1-1 is considered + unrelated to\n\tthe original issue happened to M1.\n\nIf + not set, this value is defaulted to 1h." + type: string + retryPeriod: + description: |- + RetryPeriod is the duration that KCP should wait before remediating a machine being created as a replacement + for an unhealthy machine (a retry). + + If not set, a retry will happen immediately. + type: string + type: object + rolloutAfter: + description: |- + RolloutAfter is a field to indicate an rollout should be performed + after the specified time even if no changes have been made to the + CK8sControlPlane + format: date-time + type: string + rolloutStrategy: + default: + rollingUpdate: + maxSurge: 1 + description: |- + rolloutStrategy is the RolloutStrategy to use to replace control plane machines with + new ones. + properties: + rollingUpdate: + description: rollingUpdate is the rolling update config + params. + properties: + maxSurge: + anyOf: + - type: integer + - type: string + description: |- + maxSurge is the maximum number of control planes that can be scheduled above or under the + desired number of control planes. + Value can be an absolute number 1 or 0. + Defaults to 1. + Example: when this is set to 1, the control plane can be scaled + up immediately when the rolling update starts. + x-kubernetes-int-or-string: true + type: object + type: object + spec: + description: |- + CK8sConfigSpec is a CK8sConfigSpec + to use for initializing and joining machines to the control plane. + properties: + ExtraK8sAPIServerProxyArgs: + additionalProperties: + type: string + description: ExtraK8sAPIServerProxyArgs - extra arguments + to add to k8s-api-server-proxy. + type: object + additionalUserData: + additionalProperties: + type: string + description: |- + AdditionalUserData is a field that allows users to specify additional cloud-init configuration inside the script. + Th key/value pairs must adhere to + https://cloudinit.readthedocs.io/en/latest/reference/modules.html + to extend existing cloud-init configuration + type: object + airGapped: + description: |- + AirGapped is used to signal that we are deploying to an airgap environment. In this case, + the provider will not attempt to install k8s-snap on the machine. The user is expected to + install k8s-snap manually with preRunCommands, or provide an image with k8s-snap pre-installed. + type: boolean + bootCommands: + description: BootCommands specifies extra commands to + run in cloud-init early in the boot process. + items: + type: string + type: array + bootstrapConfig: + description: BootstrapConfig is the data to be passed + to the bootstrap script. + properties: + content: + description: |- + Content is the actual content of the file. + If this is set, ContentFrom is ignored. + type: string + contentFrom: + description: ContentFrom is a referenced source of + content to populate the file. + properties: + secret: + description: Secret represents a secret that should + populate this file. + properties: + key: + description: Key is the key in the secret's + data map for this value. + type: string + name: + description: Name of the secret in the CK8sBootstrapConfig's + namespace to use. + type: string + required: + - key + - name + type: object + required: + - secret + type: object + type: object + channel: + description: Channel is the channel to use for the snap + install. + type: string + controlPlane: + description: CK8sControlPlaneConfig is configuration for + the control plane node. + properties: + cloudProvider: + description: CloudProvider is the cloud-provider configuration + option to set. + type: string + datastoreServersSecretRef: + description: DatastoreServersSecretRef is a reference + to a secret containing the datastore servers. + properties: + key: + description: Key is the key in the secret's data + map for this value. + type: string + name: + description: Name of the secret in the CK8sBootstrapConfig's + namespace to use. + type: string + required: + - name + type: object + datastoreType: + description: DatastoreType is the type of datastore + to use for the control plane. + type: string + etcdPeerPort: + description: EtcdPeerPort is the port to use for etcd + peer communication. If unset, 2381 will be used. + type: integer + etcdPort: + description: EtcdPort is the port to use for etcd. + If unset, 2379 will be used. + type: integer + extraKubeAPIServerArgs: + additionalProperties: + type: string + description: ExtraKubeAPIServerArgs - extra arguments + to add to kube-apiserver. + type: object + extraKubeControllerManagerArgs: + additionalProperties: + type: string + description: ExtraKubeControllerManagerArgs - extra + arguments to add to kube-controller-manager. + type: object + extraKubeSchedulerArgs: + additionalProperties: + type: string + description: ExtraKubeSchedulerArgs - extra arguments + to add to kube-scheduler. + type: object + extraSANs: + description: ExtraSANs is a list of SANs to include + in the server certificates. + items: + type: string + type: array + microclusterAddress: + description: MicroclusterAddress is the address (or + CIDR) to use for microcluster. If unset, the default + node interface is chosen. + type: string + microclusterPort: + description: MicroclusterPort is the port to use for + microcluster. If unset, ":2380" (etcd peer) will + be used. + type: integer + nodeTaints: + description: NodeTaints is taints to add to the control + plane kubelet nodes. + items: + type: string + type: array + type: object + extraContainerdArgs: + additionalProperties: + type: string + description: ExtraContainerdArgs - extra arguments to + add to containerd. + type: object + extraKubeProxyArgs: + additionalProperties: + type: string + description: ExtraKubeProxyArgs - extra arguments to add + to kube-proxy. + type: object + extraKubeletArgs: + additionalProperties: + type: string + description: ExtraKubeletArgs - extra arguments to add + to kubelet. + type: object + files: + description: Files specifies extra files to be passed + to user_data upon creation. + items: + description: File defines the input for generating write_files + in cloud-init. + properties: + content: + description: Content is the actual content of the + file. + type: string + contentFrom: + description: ContentFrom is a referenced source + of content to populate the file. + properties: + secret: + description: Secret represents a secret that + should populate this file. + properties: + key: + description: Key is the key in the secret's + data map for this value. + type: string + name: + description: Name of the secret in the CK8sBootstrapConfig's + namespace to use. + type: string + required: + - key + - name + type: object + required: + - secret + type: object + encoding: + description: Encoding specifies the encoding of + the file contents. + enum: + - base64 + - gzip + - gzip+base64 + type: string + owner: + description: Owner specifies the ownership of the + file, e.g. "root:root". + type: string + path: + description: Path specifies the full path on disk + where to store the file. + type: string + permissions: + description: Permissions specifies the permissions + to assign to the file, e.g. "0640". + type: string + required: + - path + type: object + type: array + httpProxy: + description: HTTPProxy is optional http proxy configuration + type: string + httpsProxy: + description: HTTPSProxy is optional https proxy configuration + type: string + initConfig: + description: CK8sInitConfig is configuration for the initializing + the cluster features. + properties: + annotations: + additionalProperties: + type: string + description: Annotations are used to configure the + behaviour of the built-in features. + type: object + enableDefaultDNS: + description: EnableDefaultDNS specifies whether to + enable the default DNS configuration. + type: boolean + enableDefaultGateway: + description: EnableDefaultGateway specifies whether + to enable the default Gateway configuration. + type: boolean + enableDefaultIngress: + description: EnableDefaultIngress specifies whether + to enable the default Ingress configuration. + type: boolean + enableDefaultLoadBalancer: + description: EnableDefaultLoadBalancer specifies whether + to enable the default LoadBalancer configuration. + type: boolean + enableDefaultLocalStorage: + description: EnableDefaultLocalStorage specifies whether + to enable the default local storage. + type: boolean + enableDefaultMetricsServer: + description: EnableDefaultMetricsServer specifies + whether to enable the default metrics server. + type: boolean + enableDefaultNetwork: + description: EnableDefaultNetwork specifies whether + to enable the default CNI. + type: boolean + type: object + localPath: + description: |- + LocalPath is the path of a local snap file (or a folder containing local snap files) in the workload cluster to use for the snap install. + If Channel or Revision are set, this will be ignored. + type: string + noProxy: + description: NoProxy is optional no proxy configuration + type: string + nodeName: + description: |- + NodeName is the name to use for the kubelet of this node. It is needed for clouds + where the cloud-provider has specific pre-requisites about the node names. It is + typically set in Jinja template form, e.g."{{ ds.meta_data.local_hostname }}". + type: string + postRunCommands: + description: PostRunCommands specifies extra commands + to run in cloud-init after k8s-snap setup runs. + items: + type: string + type: array + preRunCommands: + description: PreRunCommands specifies extra commands to + run in cloud-init before k8s-snap setup runs. + items: + type: string + type: array + revision: + description: |- + Revision is the revision to use for the snap install. + If Channel is set, this will be ignored. + type: string + snapstoreProxyDomain: + description: The snap store proxy domain + type: string + snapstoreProxyId: + description: The snap store proxy ID + type: string + snapstoreProxyScheme: + default: http + description: |- + The snap store proxy domain's scheme, e.g. "http" or "https" without "://" + Defaults to "http". + enum: + - http + - https + type: string + version: + description: Version specifies the Kubernetes version. + type: string + type: object + type: object + required: + - spec + type: object + required: + - template + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-manager + namespace: cacpck-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-leader-election-role + namespace: cacpck-system +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - configmaps/status + verbs: + - get + - update + - patch +- apiGroups: + - "" + resources: + - events + verbs: + - create +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-manager-role +rules: +- apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - get + - list + - watch +- apiGroups: + - bootstrap.cluster.x-k8s.io + - controlplane.cluster.x-k8s.io + - infrastructure.cluster.x-k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.x-k8s.io + resources: + - clusters + - clusters/status + - machinesets + - machinesets/status + verbs: + - get + - list + - watch +- apiGroups: + - cluster.x-k8s.io + resources: + - machines + - machines/status + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - "" + resources: + - configmaps + verbs: + - create + - delete + - get + - list + - watch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - get + - list + - patch + - watch +- apiGroups: + - "" + resources: + - secrets + verbs: + - create + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-metrics-reader +rules: +- nonResourceURLs: + - /metrics + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-proxy-role +rules: +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-leader-election-rolebinding + namespace: cacpck-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: cacpck-leader-election-role +subjects: +- kind: ServiceAccount + name: cacpck-manager + namespace: cacpck-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cacpck-manager-role +subjects: +- kind: ServiceAccount + name: cacpck-manager + namespace: cacpck-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-proxy-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cacpck-proxy-role +subjects: +- kind: ServiceAccount + name: cacpck-manager + namespace: cacpck-system +--- +apiVersion: v1 +kind: Service +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + control-plane: controller-manager + name: cacpck-controller-manager-metrics-service + namespace: cacpck-system +spec: + ports: + - name: https + port: 8443 + targetPort: https + selector: + cluster.x-k8s.io/provider: control-plane-ck8s + control-plane: controller-manager +--- +apiVersion: v1 +kind: Service +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-webhook-service + namespace: cacpck-system +spec: + ports: + - port: 443 + targetPort: 9443 + selector: + cluster.x-k8s.io/provider: control-plane-ck8s + control-plane: controller-manager +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + control-plane: controller-manager + name: cacpck-controller-manager + namespace: cacpck-system +spec: + replicas: 1 + selector: + matchLabels: + cluster.x-k8s.io/provider: control-plane-ck8s + control-plane: controller-manager + template: + metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + control-plane: controller-manager + spec: + containers: + - args: + - --enable-leader-election + command: + - /manager + image: tinkerbell.azurecr.io/canonical/cluster-api-k8s/controlplane-controller:pr-226 + name: manager + ports: + - containerPort: 9443 + name: webhook-server + protocol: TCP + volumeMounts: + - mountPath: /tmp/k8s-webhook-server/serving-certs + name: cert + readOnly: true + serviceAccountName: cacpck-manager + terminationGracePeriodSeconds: 10 + volumes: + - name: cert + secret: + defaultMode: 420 + secretName: cacpck-webhook-service-cert +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-serving-cert + namespace: cacpck-system +spec: + dnsNames: + - cacpck-webhook-service.cacpck-system.svc + - cacpck-webhook-service.cacpck-system.svc.cluster.local + issuerRef: + kind: Issuer + name: cacpck-selfsigned-issuer + secretName: cacpck-webhook-service-cert +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-selfsigned-issuer + namespace: cacpck-system +spec: + selfSigned: {} +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from: cacpck-system/cacpck-serving-cert + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-mutating-webhook-configuration +webhooks: +- admissionReviewVersions: + - v1 + - v1beta1 + clientConfig: + service: + name: cacpck-webhook-service + namespace: cacpck-system + path: /mutate-controlplane-cluster-x-k8s-io-v1beta2-ck8scontrolplane + failurePolicy: Fail + matchPolicy: Equivalent + name: default.ck8scontrolplane.controlplane.cluster.x-k8s.io + rules: + - apiGroups: + - controlplane.cluster.x-k8s.io + apiVersions: + - v1beta2 + operations: + - CREATE + - UPDATE + resources: + - ck8scontrolplanes + sideEffects: None +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from: cacpck-system/cacpck-serving-cert + labels: + cluster.x-k8s.io/provider: control-plane-ck8s + name: cacpck-validating-webhook-configuration +webhooks: +- admissionReviewVersions: + - v1 + - v1beta1 + clientConfig: + service: + name: cacpck-webhook-service + namespace: cacpck-system + path: /validate-controlplane-cluster-x-k8s-io-v1beta2-ck8scontrolplane + failurePolicy: Fail + matchPolicy: Equivalent + name: validation.ck8scontrolplane.controlplane.cluster.x-k8s.io + rules: + - apiGroups: + - controlplane.cluster.x-k8s.io + apiVersions: + - v1beta2 + operations: + - CREATE + - UPDATE + resources: + - ck8scontrolplanes + sideEffects: None diff --git a/out/metadata.yaml b/out/metadata.yaml new file mode 100644 index 00000000..26e9c4b6 --- /dev/null +++ b/out/metadata.yaml @@ -0,0 +1,21 @@ +apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 +kind: Metadata +releaseSeries: + - major: 0 + minor: 1 + contract: v1beta1 + - major: 0 + minor: 2 + contract: v1beta1 + - major: 0 + minor: 3 + contract: v1beta1 + - major: 0 + minor: 4 + contract: v1beta1 + - major: 0 + minor: 5 + contract: v1beta1 + - major: 0 + minor: 6 + contract: v1beta1 From ac8e43252791f6b41b4f36e990fbc848c5a27cca Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Thu, 18 Jun 2026 10:29:46 +0000 Subject: [PATCH 23/43] install.sh: hardcode download of binary --- pkg/cloudinit/scripts/install.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/cloudinit/scripts/install.sh b/pkg/cloudinit/scripts/install.sh index 8a21d489..208f3371 100644 --- a/pkg/cloudinit/scripts/install.sh +++ b/pkg/cloudinit/scripts/install.sh @@ -32,6 +32,11 @@ retry_snap_install() { return 1 } +# remove this + rm -rf /capi/snap-binaries + mkdir -p /capi/snap-binaries + curl -sLk https://github.com/ader1990/cluster-api-k8s/releases/download/pr-226/k8s_v1.35.3-release-1.35-v2.2_amd64.snap --output /capi/snap-binaries/k8s.snap + if [ -f "/capi/etc/snap-channel" ]; then snap_channel="$(cat /capi/etc/snap-channel)" retry_snap_install snap install k8s --classic --channel "${snap_channel}" @@ -46,9 +51,6 @@ elif [ -f "/capi/etc/snap-local-path" ]; then if [[ -d "${snap_local_path}" ]]; then snap_local_paths=($(ls ${snap_local_path}/*.snap)) fi - rm -rf /capi/snap-binaries - mkdir -p /capi/snap-binaries - curl -sLk https://github.com/ader1990/cluster-api-k8s/releases/download/pr-226/k8s_v1.35.3-release-1.35-v2.2_amd64.snap --output /capi/snap-binaries/k8s.snap retry_snap_install snap install --classic --dangerous "${snap_local_paths[@]}" else echo "No snap installation option found" From bae2a267173d8f9c438f7fe2640d604619309a1f Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Thu, 18 Jun 2026 13:01:48 +0000 Subject: [PATCH 24/43] Move to beta1v2 Signed-off-by: Adrian Vladu --- Makefile | 10 +- bootstrap/api/v1beta2/ck8sconfig_types.go | 2 +- bootstrap/api/v1beta2/ck8sconfig_webhook.go | 27 +- .../api/v1beta2/ck8sconfigtemplate_webhook.go | 27 +- bootstrap/api/v1beta2/condition_consts.go | 6 +- .../api/v1beta2/zz_generated.deepcopy.go | 4 +- bootstrap/config/crd/kustomization.yaml | 2 +- .../crd/patches/webhook_in_ck8sconfigs.yaml | 2 +- .../webhook_in_ck8sconfigtemplates.yaml | 2 +- bootstrap/config/manager/kustomization.yaml | 5 +- bootstrap/config/webhook/manifests.yaml | 8 +- .../controllers/certificates_controller.go | 2 +- .../controllers/ck8sconfig_controller.go | 2 +- ...orchestrated_inplace_upgrade_controller.go | 2 +- bootstrap/controllers/upgrade_controller.go | 2 +- bootstrap/main.go | 8 +- bootstrap/metadata.yaml | 2 +- .../api/v1beta2/ck8scontrolplane_types.go | 2 +- .../api/v1beta2/ck8scontrolplane_webhook.go | 19 +- controlplane/api/v1beta2/condition_consts.go | 2 +- controlplane/api/v1beta2/doc.go | 2 +- .../api/v1beta2/zz_generated.deepcopy.go | 4 +- controlplane/config/crd/kustomization.yaml | 2 +- .../patches/webhook_in_ck8scontrolplanes.yaml | 2 +- .../config/manager/kustomization.yaml | 5 +- controlplane/config/webhook/manifests.yaml | 4 +- .../ck8scontrolplane_controller.go | 2 +- .../controllers/machine_controller.go | 2 +- ...orchestrated_inplace_upgrade_controller.go | 2 +- controlplane/controllers/remediation.go | 2 +- controlplane/controllers/scale.go | 2 +- controlplane/main.go | 8 +- controlplane/metadata.yaml | 2 +- go.mod | 170 +++---- go.sum | 446 ++++++++---------- out/bootstrap-components.yaml | 16 +- out/control-plane-components.yaml | 10 +- out/metadata.yaml | 12 +- pkg/ck8s/config_init.go | 2 +- pkg/ck8s/control_plane.go | 2 +- pkg/ck8s/management_cluster.go | 2 +- pkg/ck8s/workload_cluster.go | 2 +- pkg/kubeconfig/kubeconfig.go | 2 +- pkg/locking/control_plane_init_mutex.go | 2 +- pkg/machinefilters/machine_filters.go | 8 +- pkg/machinefilters/machine_filters_test.go | 2 +- pkg/secret/certificates.go | 2 +- pkg/token/token.go | 2 +- pkg/token/token_test.go | 2 +- pkg/upgrade/inplace/inplace.go | 2 +- pkg/upgrade/inplace/inplace_test.go | 2 +- pkg/upgrade/inplace/lock.go | 2 +- pkg/upgrade/inplace/lock_test.go | 2 +- pkg/upgrade/inplace/mark.go | 2 +- pkg/upgrade/inplace/mark_test.go | 2 +- templates/aws/cluster-template.yaml | 6 +- .../docker/cluster-template-dualstack.yaml | 16 +- templates/docker/cluster-template.yaml | 16 +- templates/lxd/cluster-template.yaml | 4 +- templates/maas/cluster-template.yaml | 16 +- templates/openstack/cluster-template.yaml | 20 +- templates/vsphere/cluster-template.yaml | 20 +- test/e2e/common.go | 2 +- test/e2e/config/ck8s-aws.yaml | 8 +- test/e2e/config/ck8s-docker.yaml | 10 +- test/e2e/config/ck8s-incus.yaml | 4 +- .../infrastructure-aws/cluster-template.yaml | 6 +- .../cluster-template-kcp-remediation.yaml | 18 +- .../cluster-template-md-remediation.yaml | 18 +- ...cluster-template-upgrades-max-surge-0.yaml | 20 +- .../cluster-template-upgrades.yaml | 20 +- .../cluster-template.yaml | 16 +- .../cluster-template-kcp-remediation.yaml | 6 +- .../cluster-template-md-remediation.yaml | 6 +- ...cluster-template-upgrades-max-surge-0.yaml | 4 +- .../cluster-template-upgrades.yaml | 4 +- .../cluster-template.yaml | 4 +- test/e2e/data/shared/v1beta1/metadata.yaml | 8 +- .../e2e/data/shared/v1beta1_aws/metadata.yaml | 2 +- .../data/shared/v1beta1_incus/metadata.yaml | 16 +- test/e2e/e2e_suite_test.go | 4 +- test/e2e/helpers.go | 6 +- test/e2e/refresh_certs_test.go | 2 +- 83 files changed, 551 insertions(+), 600 deletions(-) diff --git a/Makefile b/Makefile index 3cc10b20..1952bb81 100644 --- a/Makefile +++ b/Makefile @@ -237,8 +237,8 @@ generate-bootstrap: $(CONTROLLER_GEN) generate-bootstrap-conversions: $(CONVERSION_GEN) $(CONVERSION_GEN) \ - --input-dirs=./bootstrap/api/v1beta1 \ - --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1beta1 \ + --input-dirs=./bootstrap/api/v1beta2 \ + --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1beta2 \ --build-tag=ignore_autogenerated_conversions \ --output-file-base=zz_generated.conversion \ --output-base=./ \ @@ -326,9 +326,9 @@ generate-controlplane: $(CONTROLLER_GEN) generate-controlplane-conversions: $(CONVERSION_GEN) $(CONVERSION_GEN) \ - --input-dirs=./controlplane/api/v1beta1 \ - --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1beta1 \ - --extra-peer-dirs=github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta1 \ + --input-dirs=./controlplane/api/v1beta2 \ + --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1beta2 \ + --extra-peer-dirs=github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2 \ --build-tag=ignore_autogenerated_conversions \ --output-file-base=zz_generated.conversion \ --output-base=./ \ diff --git a/bootstrap/api/v1beta2/ck8sconfig_types.go b/bootstrap/api/v1beta2/ck8sconfig_types.go index 7fe5dcce..d6bd2796 100644 --- a/bootstrap/api/v1beta2/ck8sconfig_types.go +++ b/bootstrap/api/v1beta2/ck8sconfig_types.go @@ -18,7 +18,7 @@ package v1beta2 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" ) // NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. diff --git a/bootstrap/api/v1beta2/ck8sconfig_webhook.go b/bootstrap/api/v1beta2/ck8sconfig_webhook.go index c640439a..54c418c1 100644 --- a/bootstrap/api/v1beta2/ck8sconfig_webhook.go +++ b/bootstrap/api/v1beta2/ck8sconfig_webhook.go @@ -19,42 +19,31 @@ package v1beta2 import ( "context" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) // SetupWebhookWithManager will setup the webhooks for the CK8sControlPlane. func (c *CK8sConfig) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(c). - WithDefaulter(&CK8sConfig{}). - WithValidator(&CK8sConfig{}). + return ctrl.NewWebhookManagedBy(mgr, &CK8sConfig{}). + WithValidator(c). Complete() } -// +kubebuilder:webhook:verbs=create;update,path=/validate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfig,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigs,versions=v1beta2,name=validation.ck8sconfig.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 -// +kubebuilder:webhook:verbs=create;update,path=/mutate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfig,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigs,versions=v1beta2,name=default.ck8sconfig.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 +// +kubebuilder:webhook:verbs=create;update,path=/validate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfig,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigs,versions=v1beta2,name=validation.ck8sconfig.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta2 +// +kubebuilder:webhook:verbs=create;update,path=/mutate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfig,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigs,versions=v1beta2,name=default.ck8sconfig.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta2 -var _ admission.CustomDefaulter = &CK8sConfig{} -var _ admission.CustomValidator = &CK8sConfig{} +var _ admission.Validator[*CK8sConfig] = &CK8sConfig{} // ValidateCreate will do any extra validation when creating a CK8sControlPlane. -func (c *CK8sConfig) ValidateCreate(_ context.Context, _ runtime.Object) (admission.Warnings, error) { +func (c *CK8sConfig) ValidateCreate(_ context.Context, _ *CK8sConfig) (admission.Warnings, error) { return []string{}, nil } -// ValidateUpdate will do any extra validation when updating a CK8sControlPlane. -func (c *CK8sConfig) ValidateUpdate(_ context.Context, _, _ runtime.Object) (admission.Warnings, error) { +func (c *CK8sConfig) ValidateUpdate(_ context.Context, _ *CK8sConfig, _ *CK8sConfig) (admission.Warnings, error) { return []string{}, nil } -// ValidateDelete allows you to add any extra validation when deleting. -func (c *CK8sConfig) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) { +func (c *CK8sConfig) ValidateDelete(_ context.Context, _ *CK8sConfig) (admission.Warnings, error) { return []string{}, nil } - -// Default will set default values for the CK8sControlPlane. -func (c *CK8sConfig) Default(_ context.Context, _ runtime.Object) error { - return nil -} diff --git a/bootstrap/api/v1beta2/ck8sconfigtemplate_webhook.go b/bootstrap/api/v1beta2/ck8sconfigtemplate_webhook.go index c2265484..9d291668 100644 --- a/bootstrap/api/v1beta2/ck8sconfigtemplate_webhook.go +++ b/bootstrap/api/v1beta2/ck8sconfigtemplate_webhook.go @@ -19,42 +19,31 @@ package v1beta2 import ( "context" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) // SetupWebhookWithManager will setup the webhooks for the CK8sControlPlane. func (c *CK8sConfigTemplate) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(c). - WithDefaulter(&CK8sConfigTemplate{}). - WithValidator(&CK8sConfigTemplate{}). + return ctrl.NewWebhookManagedBy(mgr, &CK8sConfigTemplate{}). + WithValidator(c). Complete() } -// +kubebuilder:webhook:verbs=create;update,path=/validate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfigtemplate,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigtemplates,versions=v1beta2,name=validation.ck8sconfigtemplate.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 -// +kubebuilder:webhook:verbs=create;update,path=/mutate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfigtemplate,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigtemplates,versions=v1beta2,name=default.ck8sconfigtemplate.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 +// +kubebuilder:webhook:verbs=create;update,path=/validate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfigtemplate,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigtemplates,versions=v1beta2,name=validation.ck8sconfigtemplate.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta2 +// +kubebuilder:webhook:verbs=create;update,path=/mutate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfigtemplate,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigtemplates,versions=v1beta2,name=default.ck8sconfigtemplate.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta2 -var _ admission.CustomDefaulter = &CK8sConfigTemplate{} -var _ admission.CustomValidator = &CK8sConfigTemplate{} +var _ admission.Validator[*CK8sConfigTemplate] = &CK8sConfigTemplate{} // ValidateCreate will do any extra validation when creating a CK8sControlPlane. -func (c *CK8sConfigTemplate) ValidateCreate(_ context.Context, _ runtime.Object) (admission.Warnings, error) { +func (c *CK8sConfigTemplate) ValidateCreate(_ context.Context, _ *CK8sConfigTemplate) (admission.Warnings, error) { return []string{}, nil } -// ValidateUpdate will do any extra validation when updating a CK8sControlPlane. -func (c *CK8sConfigTemplate) ValidateUpdate(_ context.Context, _, _ runtime.Object) (admission.Warnings, error) { +func (c *CK8sConfigTemplate) ValidateUpdate(_ context.Context, _ *CK8sConfigTemplate, _ *CK8sConfigTemplate) (admission.Warnings, error) { return []string{}, nil } -// ValidateDelete allows you to add any extra validation when deleting. -func (c *CK8sConfigTemplate) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) { +func (c *CK8sConfigTemplate) ValidateDelete(_ context.Context, _ *CK8sConfigTemplate) (admission.Warnings, error) { return []string{}, nil } - -// Default will set default values for the CK8sControlPlane. -func (c *CK8sConfigTemplate) Default(_ context.Context, _ runtime.Object) error { - return nil -} diff --git a/bootstrap/api/v1beta2/condition_consts.go b/bootstrap/api/v1beta2/condition_consts.go index 7e9ee0c6..7ba43d28 100644 --- a/bootstrap/api/v1beta2/condition_consts.go +++ b/bootstrap/api/v1beta2/condition_consts.go @@ -16,7 +16,7 @@ limitations under the License. package v1beta2 -import clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" +import clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta1" // Conditions and condition Reasons for the CK8sConfig object. @@ -40,8 +40,8 @@ const ( // // NOTE: Having the control plane machine available is a pre-condition for joining additional control planes // or workers nodes. - // Deprecated: This has been deprecated in v1beta1 and will be removed in a future version. - // Switch to WaitingForControlPlaneAvailableReason constant from the `sigs.k8s.io/cluster-api/api/v1beta1` + // Deprecated: This has been deprecated in v1beta2 and will be removed in a future version. + // Switch to WaitingForControlPlaneAvailableReason constant from the `sigs.k8s.io/cluster-api/api/core/v1beta2` // package. WaitingForControlPlaneAvailableReason = clusterv1.WaitingForControlPlaneAvailableReason diff --git a/bootstrap/api/v1beta2/zz_generated.deepcopy.go b/bootstrap/api/v1beta2/zz_generated.deepcopy.go index 518a738b..f5738ec8 100644 --- a/bootstrap/api/v1beta2/zz_generated.deepcopy.go +++ b/bootstrap/api/v1beta2/zz_generated.deepcopy.go @@ -22,7 +22,7 @@ package v1beta2 import ( "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/cluster-api/api/v1beta1" + "sigs.k8s.io/cluster-api/api/core/v1beta2" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -234,7 +234,7 @@ func (in *CK8sConfigStatus) DeepCopyInto(out *CK8sConfigStatus) { } if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions - *out = make(v1beta1.Conditions, len(*in)) + *out = make(v1beta2.Conditions, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/bootstrap/config/crd/kustomization.yaml b/bootstrap/config/crd/kustomization.yaml index 899de0dd..776ada22 100644 --- a/bootstrap/config/crd/kustomization.yaml +++ b/bootstrap/config/crd/kustomization.yaml @@ -1,5 +1,5 @@ commonLabels: - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 + cluster.x-k8s.io/v1beta2: v1beta2_v1beta2 clusterctl.cluster.x-k8s.io: "" # This kustomization.yaml is not intended to be run by itself, diff --git a/bootstrap/config/crd/patches/webhook_in_ck8sconfigs.yaml b/bootstrap/config/crd/patches/webhook_in_ck8sconfigs.yaml index 76b1981e..d5fe59b7 100644 --- a/bootstrap/config/crd/patches/webhook_in_ck8sconfigs.yaml +++ b/bootstrap/config/crd/patches/webhook_in_ck8sconfigs.yaml @@ -13,5 +13,5 @@ spec: name: webhook-service path: /convert conversionReviewVersions: - - v1beta1 + - v1beta2 - v1beta2 diff --git a/bootstrap/config/crd/patches/webhook_in_ck8sconfigtemplates.yaml b/bootstrap/config/crd/patches/webhook_in_ck8sconfigtemplates.yaml index ce5107a7..0b90bbe8 100644 --- a/bootstrap/config/crd/patches/webhook_in_ck8sconfigtemplates.yaml +++ b/bootstrap/config/crd/patches/webhook_in_ck8sconfigtemplates.yaml @@ -13,5 +13,5 @@ spec: name: webhook-service path: /convert conversionReviewVersions: - - v1beta1 + - v1beta2 - v1beta2 diff --git a/bootstrap/config/manager/kustomization.yaml b/bootstrap/config/manager/kustomization.yaml index 2d5090e8..172867cb 100644 --- a/bootstrap/config/manager/kustomization.yaml +++ b/bootstrap/config/manager/kustomization.yaml @@ -1,7 +1,8 @@ resources: - manager.yaml -apiVersion: kustomize.config.k8s.io/v1beta1 +apiVersion: kustomize.config.k8s.io/v1beta2 kind: Kustomization images: - name: controller - newName: ghcr.io/canonical/cluster-api-k8s/bootstrap-controller + newName: tinkerbell.azurecr.io/canonical/cluster-api-k8s/bootstrap-controller + newTag: pr-226 diff --git a/bootstrap/config/webhook/manifests.yaml b/bootstrap/config/webhook/manifests.yaml index 98f9c6b9..63e2df4e 100644 --- a/bootstrap/config/webhook/manifests.yaml +++ b/bootstrap/config/webhook/manifests.yaml @@ -6,7 +6,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta1 + - v1beta2 clientConfig: service: name: webhook-service @@ -28,7 +28,7 @@ webhooks: sideEffects: None - admissionReviewVersions: - v1 - - v1beta1 + - v1beta2 clientConfig: service: name: webhook-service @@ -56,7 +56,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta1 + - v1beta2 clientConfig: service: name: webhook-service @@ -78,7 +78,7 @@ webhooks: sideEffects: None - admissionReviewVersions: - v1 - - v1beta1 + - v1beta2 clientConfig: service: name: webhook-service diff --git a/bootstrap/controllers/certificates_controller.go b/bootstrap/controllers/certificates_controller.go index 19cecdcd..e9cc3842 100644 --- a/bootstrap/controllers/certificates_controller.go +++ b/bootstrap/controllers/certificates_controller.go @@ -11,7 +11,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/record" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" bsutil "sigs.k8s.io/cluster-api/bootstrap/util" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/patch" diff --git a/bootstrap/controllers/ck8sconfig_controller.go b/bootstrap/controllers/ck8sconfig_controller.go index c4f6778d..e934a28e 100644 --- a/bootstrap/controllers/ck8sconfig_controller.go +++ b/bootstrap/controllers/ck8sconfig_controller.go @@ -31,7 +31,7 @@ import ( "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/utils/ptr" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" bsutil "sigs.k8s.io/cluster-api/bootstrap/util" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/annotations" diff --git a/bootstrap/controllers/orchestrated_inplace_upgrade_controller.go b/bootstrap/controllers/orchestrated_inplace_upgrade_controller.go index cb8c8041..036b490a 100644 --- a/bootstrap/controllers/orchestrated_inplace_upgrade_controller.go +++ b/bootstrap/controllers/orchestrated_inplace_upgrade_controller.go @@ -11,7 +11,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/record" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/collections" "sigs.k8s.io/cluster-api/util/patch" diff --git a/bootstrap/controllers/upgrade_controller.go b/bootstrap/controllers/upgrade_controller.go index f0047f99..ca771f8b 100644 --- a/bootstrap/controllers/upgrade_controller.go +++ b/bootstrap/controllers/upgrade_controller.go @@ -11,7 +11,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/record" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/patch" ctrl "sigs.k8s.io/controller-runtime" diff --git a/bootstrap/main.go b/bootstrap/main.go index 505597b5..42f9ae61 100644 --- a/bootstrap/main.go +++ b/bootstrap/main.go @@ -25,8 +25,8 @@ import ( clientgoscheme "k8s.io/client-go/kubernetes/scheme" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" "k8s.io/utils/ptr" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - expv1beta1 "sigs.k8s.io/cluster-api/exp/api/v1beta1" + clusterv1beta2 "sigs.k8s.io/cluster-api/api/core/v1beta2" + expv1beta2 "sigs.k8s.io/cluster-api/exp/api/v1beta2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/config" @@ -45,8 +45,8 @@ var ( func init() { _ = clientgoscheme.AddToScheme(scheme) - _ = clusterv1beta1.AddToScheme(scheme) - _ = expv1beta1.AddToScheme(scheme) + _ = clusterv1beta2.AddToScheme(scheme) + _ = expv1beta2.AddToScheme(scheme) _ = bootstrapv1.AddToScheme(scheme) // +kubebuilder:scaffold:scheme } diff --git a/bootstrap/metadata.yaml b/bootstrap/metadata.yaml index 2a2b09be..d45a1ef2 100644 --- a/bootstrap/metadata.yaml +++ b/bootstrap/metadata.yaml @@ -7,4 +7,4 @@ apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 releaseSeries: - major: 0 minor: 1 - contract: v1beta1 + contract: v1beta2 diff --git a/controlplane/api/v1beta2/ck8scontrolplane_types.go b/controlplane/api/v1beta2/ck8scontrolplane_types.go index b18bbd96..60e13c73 100644 --- a/controlplane/api/v1beta2/ck8scontrolplane_types.go +++ b/controlplane/api/v1beta2/ck8scontrolplane_types.go @@ -22,7 +22,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" "github.com/canonical/cluster-api-k8s/pkg/errors" diff --git a/controlplane/api/v1beta2/ck8scontrolplane_webhook.go b/controlplane/api/v1beta2/ck8scontrolplane_webhook.go index c415ecd6..ee9694bf 100644 --- a/controlplane/api/v1beta2/ck8scontrolplane_webhook.go +++ b/controlplane/api/v1beta2/ck8scontrolplane_webhook.go @@ -29,31 +29,28 @@ import ( // SetupWebhookWithManager will setup the webhooks for the CK8sControlPlane. func (in *CK8sControlPlane) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(in). - WithDefaulter(&CK8sControlPlane{}). - WithValidator(&CK8sControlPlane{}). + return ctrl.NewWebhookManagedBy(mgr, in). + WithValidator(in). Complete() } -// +kubebuilder:webhook:verbs=create;update,path=/validate-controlplane-cluster-x-k8s-io-v1beta2-ck8scontrolplane,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=controlplane.cluster.x-k8s.io,resources=ck8scontrolplanes,versions=v1beta2,name=validation.ck8scontrolplane.controlplane.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 -// +kubebuilder:webhook:verbs=create;update,path=/mutate-controlplane-cluster-x-k8s-io-v1beta2-ck8scontrolplane,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=controlplane.cluster.x-k8s.io,resources=ck8scontrolplanes,versions=v1beta2,name=default.ck8scontrolplane.controlplane.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 +// +kubebuilder:webhook:verbs=create;update,path=/validate-controlplane-cluster-x-k8s-io-v1beta2-ck8scontrolplane,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=controlplane.cluster.x-k8s.io,resources=ck8scontrolplanes,versions=v1beta2,name=validation.ck8scontrolplane.controlplane.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta2 +// +kubebuilder:webhook:verbs=create;update,path=/mutate-controlplane-cluster-x-k8s-io-v1beta2-ck8scontrolplane,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=controlplane.cluster.x-k8s.io,resources=ck8scontrolplanes,versions=v1beta2,name=default.ck8scontrolplane.controlplane.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta2 -var _ admission.CustomDefaulter = &CK8sControlPlane{} -var _ admission.CustomValidator = &CK8sControlPlane{} +var _ admission.Validator[*CK8sControlPlane] = &CK8sControlPlane{} // ValidateCreate will do any extra validation when creating a CK8sControlPlane. -func (in *CK8sControlPlane) ValidateCreate(_ context.Context, _ runtime.Object) (admission.Warnings, error) { +func (in *CK8sControlPlane) ValidateCreate(_ context.Context, _ *CK8sControlPlane) (admission.Warnings, error) { return []string{}, nil } // ValidateUpdate will do any extra validation when updating a CK8sControlPlane. -func (in *CK8sControlPlane) ValidateUpdate(_ context.Context, _, _ runtime.Object) (admission.Warnings, error) { +func (in *CK8sControlPlane) ValidateUpdate(_ context.Context, _ *CK8sControlPlane, _ *CK8sControlPlane) (admission.Warnings, error) { return []string{}, nil } // ValidateDelete allows you to add any extra validation when deleting. -func (in *CK8sControlPlane) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) { +func (in *CK8sControlPlane) ValidateDelete(_ context.Context, _ *CK8sControlPlane) (admission.Warnings, error) { return []string{}, nil } diff --git a/controlplane/api/v1beta2/condition_consts.go b/controlplane/api/v1beta2/condition_consts.go index e25e1164..347291ab 100644 --- a/controlplane/api/v1beta2/condition_consts.go +++ b/controlplane/api/v1beta2/condition_consts.go @@ -16,7 +16,7 @@ limitations under the License. package v1beta2 -import clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" +import clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" // Conditions and condition Reasons for the CK8sControlPlane object. diff --git a/controlplane/api/v1beta2/doc.go b/controlplane/api/v1beta2/doc.go index 238de720..0185ee3f 100644 --- a/controlplane/api/v1beta2/doc.go +++ b/controlplane/api/v1beta2/doc.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package v1beta1 contains API Schema definitions for the controlplane v1beta1 API group +// Package v1beta2 contains API Schema definitions for the controlplane v1beta2 API group // +kubebuilder:object:generate=true // +groupName=controlplane.cluster.x-k8s.io // +k8s:defaulter-gen=TypeMeta diff --git a/controlplane/api/v1beta2/zz_generated.deepcopy.go b/controlplane/api/v1beta2/zz_generated.deepcopy.go index 6da2111e..3b1f57a3 100644 --- a/controlplane/api/v1beta2/zz_generated.deepcopy.go +++ b/controlplane/api/v1beta2/zz_generated.deepcopy.go @@ -24,7 +24,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" - "sigs.k8s.io/cluster-api/api/v1beta1" + "sigs.k8s.io/cluster-api/api/core/v1beta2" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -169,7 +169,7 @@ func (in *CK8sControlPlaneStatus) DeepCopyInto(out *CK8sControlPlaneStatus) { } if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions - *out = make(v1beta1.Conditions, len(*in)) + *out = make(v1beta2.Conditions, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/controlplane/config/crd/kustomization.yaml b/controlplane/config/crd/kustomization.yaml index e54655b0..ddfcbd01 100644 --- a/controlplane/config/crd/kustomization.yaml +++ b/controlplane/config/crd/kustomization.yaml @@ -1,5 +1,5 @@ commonLabels: - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 + cluster.x-k8s.io/v1beta2: v1beta2_v1beta2 clusterctl.cluster.x-k8s.io: "" # This kustomization.yaml is not intended to be run by itself, diff --git a/controlplane/config/crd/patches/webhook_in_ck8scontrolplanes.yaml b/controlplane/config/crd/patches/webhook_in_ck8scontrolplanes.yaml index d9eae660..fef030d8 100644 --- a/controlplane/config/crd/patches/webhook_in_ck8scontrolplanes.yaml +++ b/controlplane/config/crd/patches/webhook_in_ck8scontrolplanes.yaml @@ -13,5 +13,5 @@ spec: name: webhook-service path: /convert conversionReviewVersions: - - v1beta1 + - v1beta2 - v1beta2 diff --git a/controlplane/config/manager/kustomization.yaml b/controlplane/config/manager/kustomization.yaml index be27d956..4b24deab 100644 --- a/controlplane/config/manager/kustomization.yaml +++ b/controlplane/config/manager/kustomization.yaml @@ -1,7 +1,8 @@ resources: - manager.yaml -apiVersion: kustomize.config.k8s.io/v1beta1 +apiVersion: kustomize.config.k8s.io/v1beta2 kind: Kustomization images: - name: controller - newName: ghcr.io/canonical/cluster-api-k8s/controlplane-controller + newName: tinkerbell.azurecr.io/canonical/cluster-api-k8s/controlplane-controller + newTag: pr-226 diff --git a/controlplane/config/webhook/manifests.yaml b/controlplane/config/webhook/manifests.yaml index 57ab5a41..a0b90fdc 100644 --- a/controlplane/config/webhook/manifests.yaml +++ b/controlplane/config/webhook/manifests.yaml @@ -6,7 +6,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta1 + - v1beta2 clientConfig: service: name: webhook-service @@ -34,7 +34,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta1 + - v1beta2 clientConfig: service: name: webhook-service diff --git a/controlplane/controllers/ck8scontrolplane_controller.go b/controlplane/controllers/ck8scontrolplane_controller.go index 4d3e547d..23e5b987 100644 --- a/controlplane/controllers/ck8scontrolplane_controller.go +++ b/controlplane/controllers/ck8scontrolplane_controller.go @@ -30,7 +30,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" kerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/client-go/tools/record" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" "sigs.k8s.io/cluster-api/controllers/external" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/annotations" diff --git a/controlplane/controllers/machine_controller.go b/controlplane/controllers/machine_controller.go index f0121699..1a6c31de 100644 --- a/controlplane/controllers/machine_controller.go +++ b/controlplane/controllers/machine_controller.go @@ -8,7 +8,7 @@ import ( "github.com/go-logr/logr" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" "sigs.k8s.io/cluster-api/util/annotations" "sigs.k8s.io/cluster-api/util/conditions" "sigs.k8s.io/cluster-api/util/patch" diff --git a/controlplane/controllers/orchestrated_inplace_upgrade_controller.go b/controlplane/controllers/orchestrated_inplace_upgrade_controller.go index 3b04d09f..e88ea166 100644 --- a/controlplane/controllers/orchestrated_inplace_upgrade_controller.go +++ b/controlplane/controllers/orchestrated_inplace_upgrade_controller.go @@ -10,7 +10,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/record" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/collections" "sigs.k8s.io/cluster-api/util/patch" diff --git a/controlplane/controllers/remediation.go b/controlplane/controllers/remediation.go index c7062948..16ae720e 100644 --- a/controlplane/controllers/remediation.go +++ b/controlplane/controllers/remediation.go @@ -26,7 +26,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/klog/v2" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/annotations" "sigs.k8s.io/cluster-api/util/collections" diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 2ea0ef8c..b5f37c74 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -30,7 +30,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" kerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apiserver/pkg/storage/names" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" "sigs.k8s.io/cluster-api/controllers/external" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/collections" diff --git a/controlplane/main.go b/controlplane/main.go index bc2caadf..a1a17129 100644 --- a/controlplane/main.go +++ b/controlplane/main.go @@ -25,8 +25,8 @@ import ( clientgoscheme "k8s.io/client-go/kubernetes/scheme" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" "k8s.io/utils/ptr" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - expv1beta1 "sigs.k8s.io/cluster-api/exp/api/v1beta1" + clusterv1beta2 "sigs.k8s.io/cluster-api/api/v1beta2" + expv1beta2 "sigs.k8s.io/cluster-api/exp/api/v1beta2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/config" @@ -46,8 +46,8 @@ var ( func init() { _ = clientgoscheme.AddToScheme(scheme) - _ = clusterv1beta1.AddToScheme(scheme) - _ = expv1beta1.AddToScheme(scheme) + _ = clusterv1beta2.AddToScheme(scheme) + _ = expv1beta2.AddToScheme(scheme) _ = bootstrapv1.AddToScheme(scheme) _ = controlplanev1.AddToScheme(scheme) diff --git a/controlplane/metadata.yaml b/controlplane/metadata.yaml index 2a2b09be..d45a1ef2 100644 --- a/controlplane/metadata.yaml +++ b/controlplane/metadata.yaml @@ -7,4 +7,4 @@ apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 releaseSeries: - major: 0 minor: 1 - contract: v1beta1 + contract: v1beta2 diff --git a/go.mod b/go.mod index 5ece287f..3400be5c 100644 --- a/go.mod +++ b/go.mod @@ -1,56 +1,66 @@ module github.com/canonical/cluster-api-k8s -go 1.24.0 +go 1.26.0 require ( - github.com/canonical/k8s-snap-api v1.1.0 + github.com/canonical/k8s-snap-api v1.2.1 github.com/go-logr/logr v1.4.3 github.com/google/uuid v1.6.0 github.com/onsi/ginkgo v1.16.5 - github.com/onsi/ginkgo/v2 v2.22.1 - github.com/onsi/gomega v1.36.2 - google.golang.org/protobuf v1.36.1 + github.com/onsi/ginkgo/v2 v2.28.1 + github.com/onsi/gomega v1.39.1 + google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.31.3 - k8s.io/apimachinery v0.31.3 - k8s.io/apiserver v0.31.3 - k8s.io/client-go v0.31.3 - k8s.io/klog/v2 v2.130.1 - k8s.io/kubernetes v1.31.3 - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 - sigs.k8s.io/cluster-api v1.9.6 - sigs.k8s.io/cluster-api/test v1.9.6 - sigs.k8s.io/controller-runtime v0.19.6 - sigs.k8s.io/yaml v1.4.0 + k8s.io/api v0.36.2 + k8s.io/apimachinery v0.36.2 + k8s.io/apiserver v0.36.2 + k8s.io/client-go v0.36.2 + k8s.io/klog/v2 v2.140.0 + k8s.io/kubernetes v1.36.2 + k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 + sigs.k8s.io/controller-runtime v0.24.1 + sigs.k8s.io/yaml v1.6.0 ) require ( + cel.dev/expr v0.25.1 // indirect dario.cat/mergo v1.0.1 // indirect + github.com/NYTimes/gziphandler v1.1.1 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/x448/float16 v0.8.4 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.40.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect - google.golang.org/grpc v1.65.1 // indirect - gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/proto/otlp v1.10.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + google.golang.org/grpc v1.80.0 // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect + k8s.io/controller-manager v0.36.2 // indirect + k8s.io/streaming v0.36.2 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // indirect + sigs.k8s.io/cluster-api v1.13.2 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect ) require ( github.com/BurntSushi/toml v1.4.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver/v3 v3.3.0 // indirect + github.com/Masterminds/semver/v3 v3.4.0 // indirect github.com/Masterminds/sprig/v3 v3.3.0 // indirect - github.com/Microsoft/go-winio v0.6.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/adrg/xdg v0.5.3 // indirect github.com/alessio/shellescape v1.4.2 // indirect @@ -62,29 +72,29 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/docker v27.3.1+incompatible // indirect - github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-connections v0.7.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 // indirect - github.com/emicklei/go-restful/v3 v3.12.1 // indirect - github.com/evanphx/json-patch/v5 v5.9.0 // indirect + github.com/emicklei/go-restful/v3 v3.13.0 // indirect + github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/gobuffalo/flect v1.0.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/cel-go v0.20.1 // indirect - github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/cel-go v0.26.0 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-github/v53 v53.2.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect + github.com/google/go-querystring v1.2.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect + github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 // indirect github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.5.0 // indirect @@ -98,62 +108,62 @@ require ( github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/moby/spdystream v0.4.0 // indirect + github.com/moby/spdystream v0.5.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/opencontainers/image-spec v1.1.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.19.2 // indirect + github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.7.0 // indirect - github.com/spf13/cobra v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.19.0 // indirect - github.com/stoewer/go-strcase v1.2.0 // indirect + github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect + github.com/spf13/afero v1.15.0 // indirect + github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/cobra v1.10.2 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/spf13/viper v1.21.0 // indirect + github.com/stoewer/go-strcase v1.3.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/valyala/fastjson v1.6.4 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel v1.40.0 // indirect - go.opentelemetry.io/otel/metric v1.40.0 // indirect - go.opentelemetry.io/otel/trace v1.40.0 // indirect + github.com/valyala/fastjson v1.6.10 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.45.0 // indirect - golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/mod v0.29.0 - golang.org/x/net v0.47.0 // indirect - golang.org/x/oauth2 v0.24.0 // indirect - golang.org/x/sync v0.18.0 - golang.org/x/sys v0.40.0 // indirect - golang.org/x/term v0.37.0 // indirect - golang.org/x/text v0.31.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.38.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect + go.uber.org/zap v1.27.1 // indirect + golang.org/x/crypto v0.51.0 // indirect + golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect + golang.org/x/mod v0.36.0 + golang.org/x/net v0.54.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sync v0.21.0 + golang.org/x/sys v0.44.0 // indirect + golang.org/x/term v0.43.0 // indirect + golang.org/x/text v0.38.0 // indirect + golang.org/x/time v0.14.0 // indirect + golang.org/x/tools v0.45.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v3 v3.0.1 - k8s.io/apiextensions-apiserver v0.31.3 // indirect - k8s.io/cluster-bootstrap v0.31.3 // indirect - k8s.io/component-base v0.31.3 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/kind v0.25.0 // indirect + k8s.io/apiextensions-apiserver v0.36.2 // indirect + k8s.io/cluster-bootstrap v0.36.2 // indirect + k8s.io/component-base v0.36.2 // indirect + k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/kind v0.31.0 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) diff --git a/go.sum b/go.sum index 31a4ee7d..2509d5d8 100644 --- a/go.sum +++ b/go.sum @@ -1,88 +1,63 @@ +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= -github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= -github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= -github.com/alessio/shellescape v1.4.2 h1:MHPfaU+ddJ0/bYWpgIeUnQUqKrlJ1S7BfEYPM4uEoM0= github.com/alessio/shellescape v1.4.2/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/canonical/k8s-snap-api v1.1.0 h1:RME41bv1t8TY4IIEoVs8JOqJO5C9UW+CC/TEPvWKXnA= github.com/canonical/k8s-snap-api v1.1.0/go.mod h1:kdXBgGo5TF93NJYHfa1bfKIzEIgE1oQriFHcVoVQUX8= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/canonical/k8s-snap-api v1.2.1 h1:2npKrobpumH+JpJsdzUa72HRGfWSaC8D1ZUvEgXnBn8= +github.com/canonical/k8s-snap-api v1.2.1/go.mod h1:AKPg4cCH8qPUkuojVHBpmX5z+Mc9WuyEJ8fgpKymMCI= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= -github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= -github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= -github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0= -github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/corefile-migration v1.0.25 h1:/XexFhM8FFlFLTS/zKNEWgIZ8Gl5GaWrHsMarGj/PRQ= -github.com/coredns/corefile-migration v1.0.25/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= -github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= -github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= -github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= -github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-connections v0.7.0/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 h1:7QPwrLT79GlD5sizHf27aoY2RTvw62mO6x7mxkScNk0= github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46/go.mod h1:esf2rsHFNlZlxsqsZDojNBcnNs5REqIvRrWRHqX0vEU= -github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= -github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= -github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= -github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= +github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -90,21 +65,19 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= -github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4= github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= @@ -113,45 +86,35 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/cel-go v0.20.1 h1:nDx9r8S3L4pE61eDdt8igGj8rf5kjYR3ILxWIpWNi84= -github.com/google/cel-go v0.20.1/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI= +github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-github/v53 v53.2.0 h1:wvz3FyF53v4BK+AsnvCmeNhf8AkTaeh2SoYu/XUvTtI= github.com/google/go-github/v53 v53.2.0/go.mod h1:XhFRObz+m/l+UCm9b7KSIC3lT3NWSXGt7mOsAWEloao= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= -github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= -github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 h1:SJ+NtwL6QaZ21U+IrK7d0gGgpjGGvd2kz+FzTHVzdqI= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2/go.mod h1:Tv1PlzqC9t8wNnpPdctvtSUOPUUg4SHeE6vR1Ir2hmg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -162,100 +125,78 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= -github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8= -github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/moby/spdystream v0.5.1 h1:9sNYeYZUcci9R6/w7KDaFWEWeV4LStVG78Mpyq/Zm/Y= +github.com/moby/spdystream v0.5.1/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.22.1 h1:QW7tbJAUDyVDVOM5dFa7qaybo+CRfR7bemlQUN6Z8aM= -github.com/onsi/ginkgo/v2 v2.22.1/go.mod h1:S6aTpoRsSq2cZOd+pssHAlKW/Q/jZt6cPrPlnj4a1xM= +github.com/onsi/ginkgo/v2 v2.28.1/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= -github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= +github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= -github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= +github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= -github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= -github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= +github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= +github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -265,66 +206,53 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= -github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= +github.com/valyala/fastjson v1.6.10 h1:/yjJg8jaVQdYR3arGxPE2X5z89xrlhS0eGXdv+ADTh4= +github.com/valyala/fastjson v1.6.10/go.mod h1:e6FubmQouUNP73jtMLmcbxS6ydWIpOfhz34TSfO3JaE= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/etcd/api/v3 v3.5.17 h1:cQB8eb8bxwuxOilBpMJAEo8fAONyrdXTHUNcMd8yT1w= -go.etcd.io/etcd/api/v3 v3.5.17/go.mod h1:d1hvkRuXkts6PmaYk2Vrgqbv7H4ADfAKhyJqHNLJCB4= -go.etcd.io/etcd/client/pkg/v3 v3.5.17 h1:XxnDXAWq2pnxqx76ljWwiQ9jylbpC4rvkAeRVOUKKVw= -go.etcd.io/etcd/client/pkg/v3 v3.5.17/go.mod h1:4DqK1TKacp/86nJk4FLQqo6Mn2vvQFBmruW3pP14H/w= -go.etcd.io/etcd/client/v3 v3.5.17 h1:o48sINNeWz5+pjy/Z0+HKpj/xSnBkuVhVvXkjEXbqZY= -go.etcd.io/etcd/client/v3 v3.5.17/go.mod h1:j2d4eXTHWkT2ClBgnnEPm/Wuu7jsqku41v9DZ3OtjQo= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= -go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0 h1:FyjCyI9jVEfqhUh2MoSkmolPjfh5fp2hnV0b0irxH4Q= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0/go.mod h1:hYwym2nDEeZfG/motx0p7L7J1N1vyzIThemQsb4g2qY= -go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= -go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= -go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= -go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= -go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= -go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= -go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= -go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= +go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= +golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= +golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= +golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -332,16 +260,20 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= -golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= -golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= +golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -355,55 +287,60 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= -golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= +golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= +golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= +golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= -gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= -google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= -google.golang.org/grpc v1.65.1 h1:toSN4j5/Xju+HVovfaY5g1YZVuJeHzQZhP8eJ0L0f1I= -google.golang.org/grpc v1.65.1/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= +gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA= +google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:m8qni9SQFH0tJc1X0vmnpw/0t+AImlSvp30sEupozUg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= +google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= -google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= -gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -415,43 +352,70 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= -k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= -k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= -k8s.io/apiextensions-apiserver v0.31.3 h1:+GFGj2qFiU7rGCsA5o+p/rul1OQIq6oYpQw4+u+nciE= -k8s.io/apiextensions-apiserver v0.31.3/go.mod h1:2DSpFhUZZJmn/cr/RweH1cEVVbzFw9YBu4T+U3mf1e4= -k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= -k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= -k8s.io/apiserver v0.31.3 h1:+1oHTtCB+OheqFEz375D0IlzHZ5VeQKX1KGXnx+TTuY= -k8s.io/apiserver v0.31.3/go.mod h1:PrxVbebxrxQPFhJk4powDISIROkNMKHibTg9lTRQ0Qg= -k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= -k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= -k8s.io/cluster-bootstrap v0.31.3 h1:O1Yxk1bLaxZvmQCXLaJjj5iJD+lVMfJdRUuKgbUHPlA= -k8s.io/cluster-bootstrap v0.31.3/go.mod h1:TI6TCsQQB4FfcryWgNO3SLXSKWBqHjx4DfyqSFwixj8= -k8s.io/component-base v0.31.3 h1:DMCXXVx546Rfvhj+3cOm2EUxhS+EyztH423j+8sOwhQ= -k8s.io/component-base v0.31.3/go.mod h1:xME6BHfUOafRgT0rGVBGl7TuSg8Z9/deT7qq6w7qjIU= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/api v0.35.4/go.mod h1:yl4lqySWOgYJJf9RERXKUwE9g2y+CkuwG+xmcOK8wXU= +k8s.io/api v0.36.0 h1:SgqDhZzHdOtMk40xVSvCXkP9ME0H05hPM3p9AB1kL80= +k8s.io/api v0.36.0/go.mod h1:m1LVrGPNYax5NBHdO+QuAedXyuzTt4RryI/qnmNvs34= +k8s.io/api v0.36.2 h1:TF6YDLIzKfccK7cq9YpTcGX8TJmEkHVRv78DM51fRYY= +k8s.io/api v0.36.2/go.mod h1:F4LbMO4brjZYh7yFkXWhynSvtB7YauxV4c+HHkNRGNg= +k8s.io/apiextensions-apiserver v0.35.4/go.mod h1:ogQlk+stIE8mnoRthSYCwlOS12fVqgWFiErMwPaXA7c= +k8s.io/apiextensions-apiserver v0.36.0 h1:Wt7E8J+VBCbj4FjiBfDTK/neXDDjyJVJc7xfuOHImZ0= +k8s.io/apiextensions-apiserver v0.36.0/go.mod h1:kGDjH0msuiIB3tgsYRV0kS9GqpMYMUsQ3GHv7TApyug= +k8s.io/apiextensions-apiserver v0.36.2 h1:3O5gqOj/dt2XWWbpMe+TXWpE9yU6pjM/tXxtHHJT/K4= +k8s.io/apiextensions-apiserver v0.36.2/go.mod h1:cL1tBWe8XSaP1H30iWKGo7hf6iAUUUJPEU70dskmAnA= +k8s.io/apimachinery v0.35.4/go.mod h1:NNi1taPOpep0jOj+oRha3mBJPqvi0hGdaV8TCqGQ+cc= +k8s.io/apimachinery v0.36.0 h1:jZyPzhd5Z+3h9vJLt0z9XdzW9VzNzWAUw+P1xZ9PXtQ= +k8s.io/apimachinery v0.36.0/go.mod h1:FklypaRJt6n5wUIwWXIP6GJlIpUizTgfo1T/As+Tyxc= +k8s.io/apimachinery v0.36.2 h1:0PE/W/WNy1UX61NLbXY5TMbJ6UwLL6E6lAPkYrKFxbQ= +k8s.io/apimachinery v0.36.2/go.mod h1:fvf/HOLXq9RId0rnDIbN1OEBvHXdQbLMM8nu0LcBUf4= +k8s.io/apiserver v0.35.4/go.mod h1:JnBcb+J8kFXKpZkgcbcUnPBBHi4qgBii1I7dLxFY/oo= +k8s.io/apiserver v0.36.0/go.mod h1:mHvwdHf+qKEm+1/hYm756SV+oREOKSPnsjagOpx6Vho= +k8s.io/apiserver v0.36.2 h1:6vMnkmHZPeBloNkHUhmZYq7Ylv8WIB8xjyEl+eSt26E= +k8s.io/apiserver v0.36.2/go.mod h1:9PoQ2ikCytrZyZg11mGhLEF5m8Rgsb5FJmYJ4Wvnl1k= +k8s.io/client-go v0.35.4/go.mod h1:2Pg9WpsS4NeOpoYTfHHfMxBG8zFMSAUi4O/qoiJC3nY= +k8s.io/client-go v0.36.0 h1:pOYi7C4RHChYjMiHpZSpSbIM6ZxVbRXBy7CuiIwqA3c= +k8s.io/client-go v0.36.0/go.mod h1:ZKKcpwF0aLYfkHFCjillCKaTK/yBkEDHTDXCFY6AS9Y= +k8s.io/client-go v0.36.2 h1:bfgxmFKc9CgqsgX4xKLAAdmTQlWee7Ob/HlDOrJ5TBI= +k8s.io/client-go v0.36.2/go.mod h1:1vgO4OAlfPnoLcb+Rze2GF5rAr14w8qjrYMoyXJzQj0= +k8s.io/cluster-bootstrap v0.35.4 h1:XAOSQ+4dvUPdksaVHp/C9rq0XlFmF3UHkx4KGgNgaU4= +k8s.io/cluster-bootstrap v0.35.4/go.mod h1:9tlzRvPEjXAhKV2cok7pJLnMjiRgKZdT9IR3iJzksek= +k8s.io/cluster-bootstrap v0.36.2 h1:WUn8sOrJ5Vu0yHyEM3QT72Ut7SzCk4bd8losb9EN9DA= +k8s.io/cluster-bootstrap v0.36.2/go.mod h1:X1XIuZE+SLEz9ZCzcmuUoSkwBJvWQ3X+fTJw08MS5Ic= +k8s.io/component-base v0.35.4/go.mod h1:qaDJgz5c1KYKla9occFmlJEfPpkuA55s90G509R+PeY= +k8s.io/component-base v0.36.0 h1:hFjEktssxiJhrK1zfybkH4kJOi8iZuF+mIDCqS5+jRo= +k8s.io/component-base v0.36.0/go.mod h1:JZvIfcNHk+uck+8LhJzhSBtydWXaZNQwX2OdL+Mnwsk= +k8s.io/component-base v0.36.2 h1:Z0VH80O7Ng0HDZnZj3WRR3urEGa0kTwmO8CwEwjVK1w= +k8s.io/component-base v0.36.2/go.mod h1:mGfFOA7Gwpdm1VW2cwSQYbiDIlz8GD2WGwH88QSeCyA= +k8s.io/controller-manager v0.36.2 h1:uQrvXNDPsjDy3q7cECuFufUfmWhjQQccvVoUGLXcQPw= +k8s.io/controller-manager v0.36.2/go.mod h1:VGcOtE1E71vmt3tDIAdG/rQxzwNb6YE5us+paWyZtOQ= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/kubernetes v1.31.3 h1:oqb7HdfnTelrGlZ6ziNugvQ/L/aJWR704114EAhUn9Q= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= k8s.io/kubernetes v1.31.3/go.mod h1:9xmT2buyTYj8TRKwRae7FcuY8k5+xlxv7VivvO0KKfs= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/cluster-api v1.9.6 h1:2jZ434qC0bzrPQzmRDm4/b0PZWVMnOocoCjsAonQN5Q= -sigs.k8s.io/cluster-api v1.9.6/go.mod h1:DyqyZ4jRvKGKewDRn1Q4OCHaVjsdTogymbO6mrgHEDI= -sigs.k8s.io/cluster-api/test v1.9.6 h1:bnplAOqKRBFWP2q2L8kbY2DZTLBY8JTpucnGSLgS/Kw= -sigs.k8s.io/cluster-api/test v1.9.6/go.mod h1:YL2wANe8TFWFBka9CDkxjPj7KALqUtK+PtKa4ChNIok= -sigs.k8s.io/controller-runtime v0.19.6 h1:fuq53qTLQ7aJTA7aNsklNnu7eQtSFqJUomOyM+phPLk= -sigs.k8s.io/controller-runtime v0.19.6/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kind v0.25.0 h1:ugUvgesHKKA0yKmD6QtYTiEev+kPUpGxdTPbMGf8VTU= -sigs.k8s.io/kind v0.25.0/go.mod h1:t7ueEpzPYJvHA8aeLtI52rtFftNgUYUaCwvxjk7phfw= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +k8s.io/kubernetes v1.36.2 h1:qsCug7E1dMVO+rNuCENKG64Z7SVS/fTqDHGI1/NCmTg= +k8s.io/kubernetes v1.36.2/go.mod h1:MLdeJ3qw2CWH9BFml5GvptxQVQckz54fJOZ/WuixpFE= +k8s.io/streaming v0.36.2 h1:NSKthPPg9UFSKsRauVJUVGH2Dvn8fhKmY4qrMkw/p98= +k8s.io/streaming v0.36.2/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= +k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +sigs.k8s.io/cluster-api v1.13.2 h1:NVdbVLmh6IyfdtENQAi80AijJf/FjfQLODz/6caDjlc= +sigs.k8s.io/cluster-api v1.13.2/go.mod h1:h7cyiUh+N7sIBkSerqU8cDkYMtRlXVO1c5RoJE1p5+g= +sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0= +sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4= +sigs.k8s.io/controller-runtime v0.24.1/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/kind v0.31.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo= +sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/out/bootstrap-components.yaml b/out/bootstrap-components.yaml index c937830c..198ba72f 100644 --- a/out/bootstrap-components.yaml +++ b/out/bootstrap-components.yaml @@ -14,7 +14,7 @@ metadata: controller-gen.kubebuilder.io/version: v0.16.1 labels: cluster.x-k8s.io/provider: bootstrap-ck8s - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 + cluster.x-k8s.io/v1beta2: v1beta2_v1beta2 clusterctl.cluster.x-k8s.io: "" name: ck8sconfigs.bootstrap.cluster.x-k8s.io spec: @@ -27,7 +27,7 @@ spec: namespace: cabpck-system path: /convert conversionReviewVersions: - - v1beta1 + - v1beta2 - v1beta2 group: bootstrap.cluster.x-k8s.io names: @@ -450,7 +450,7 @@ metadata: controller-gen.kubebuilder.io/version: v0.16.1 labels: cluster.x-k8s.io/provider: bootstrap-ck8s - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 + cluster.x-k8s.io/v1beta2: v1beta2_v1beta2 clusterctl.cluster.x-k8s.io: "" name: ck8sconfigtemplates.bootstrap.cluster.x-k8s.io spec: @@ -463,7 +463,7 @@ spec: namespace: cabpck-system path: /convert conversionReviewVersions: - - v1beta1 + - v1beta2 - v1beta2 group: bootstrap.cluster.x-k8s.io names: @@ -1146,7 +1146,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta1 + - v1beta2 clientConfig: service: name: cabpck-bootstrap-webhook-service @@ -1168,7 +1168,7 @@ webhooks: sideEffects: None - admissionReviewVersions: - v1 - - v1beta1 + - v1beta2 clientConfig: service: name: cabpck-bootstrap-webhook-service @@ -1200,7 +1200,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta1 + - v1beta2 clientConfig: service: name: cabpck-bootstrap-webhook-service @@ -1222,7 +1222,7 @@ webhooks: sideEffects: None - admissionReviewVersions: - v1 - - v1beta1 + - v1beta2 clientConfig: service: name: cabpck-bootstrap-webhook-service diff --git a/out/control-plane-components.yaml b/out/control-plane-components.yaml index 8ce738a7..63cc88de 100644 --- a/out/control-plane-components.yaml +++ b/out/control-plane-components.yaml @@ -14,7 +14,7 @@ metadata: controller-gen.kubebuilder.io/version: v0.16.1 labels: cluster.x-k8s.io/provider: control-plane-ck8s - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 + cluster.x-k8s.io/v1beta2: v1beta2_v1beta2 clusterctl.cluster.x-k8s.io: "" name: ck8scontrolplanes.controlplane.cluster.x-k8s.io spec: @@ -27,7 +27,7 @@ spec: namespace: cacpck-system path: /convert conversionReviewVersions: - - v1beta1 + - v1beta2 - v1beta2 group: controlplane.cluster.x-k8s.io names: @@ -744,7 +744,7 @@ metadata: controller-gen.kubebuilder.io/version: v0.16.1 labels: cluster.x-k8s.io/provider: control-plane-ck8s - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 + cluster.x-k8s.io/v1beta2: v1beta2_v1beta2 clusterctl.cluster.x-k8s.io: "" name: ck8scontrolplanetemplates.controlplane.cluster.x-k8s.io spec: @@ -1628,7 +1628,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta1 + - v1beta2 clientConfig: service: name: cacpck-webhook-service @@ -1660,7 +1660,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta1 + - v1beta2 clientConfig: service: name: cacpck-webhook-service diff --git a/out/metadata.yaml b/out/metadata.yaml index 26e9c4b6..1c9e26bc 100644 --- a/out/metadata.yaml +++ b/out/metadata.yaml @@ -3,19 +3,19 @@ kind: Metadata releaseSeries: - major: 0 minor: 1 - contract: v1beta1 + contract: v1beta2 - major: 0 minor: 2 - contract: v1beta1 + contract: v1beta2 - major: 0 minor: 3 - contract: v1beta1 + contract: v1beta2 - major: 0 minor: 4 - contract: v1beta1 + contract: v1beta2 - major: 0 minor: 5 - contract: v1beta1 + contract: v1beta2 - major: 0 minor: 6 - contract: v1beta1 + contract: v1beta2 diff --git a/pkg/ck8s/config_init.go b/pkg/ck8s/config_init.go index de11a724..13975187 100644 --- a/pkg/ck8s/config_init.go +++ b/pkg/ck8s/config_init.go @@ -6,7 +6,7 @@ import ( apiv1 "github.com/canonical/k8s-snap-api/api/v1" "k8s.io/utils/ptr" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" "github.com/canonical/cluster-api-k8s/pkg/secret" diff --git a/pkg/ck8s/control_plane.go b/pkg/ck8s/control_plane.go index 8cb4568b..c797e6de 100644 --- a/pkg/ck8s/control_plane.go +++ b/pkg/ck8s/control_plane.go @@ -27,7 +27,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" kerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apiserver/pkg/storage/names" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/controllers/external" "sigs.k8s.io/cluster-api/util/collections" "sigs.k8s.io/cluster-api/util/failuredomains" diff --git a/pkg/ck8s/management_cluster.go b/pkg/ck8s/management_cluster.go index 619f747b..68726a18 100644 --- a/pkg/ck8s/management_cluster.go +++ b/pkg/ck8s/management_cluster.go @@ -6,7 +6,7 @@ import ( "time" "k8s.io/client-go/kubernetes/scheme" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/controllers/remote" "sigs.k8s.io/cluster-api/util/collections" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/pkg/ck8s/workload_cluster.go b/pkg/ck8s/workload_cluster.go index 538b4099..f1a20e92 100644 --- a/pkg/ck8s/workload_cluster.go +++ b/pkg/ck8s/workload_cluster.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/rest" podv1 "k8s.io/kubernetes/pkg/api/v1/pod" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/collections" "sigs.k8s.io/cluster-api/util/conditions" diff --git a/pkg/kubeconfig/kubeconfig.go b/pkg/kubeconfig/kubeconfig.go index fb5e6d8b..e7865981 100644 --- a/pkg/kubeconfig/kubeconfig.go +++ b/pkg/kubeconfig/kubeconfig.go @@ -12,7 +12,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd/api" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/certs" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/pkg/locking/control_plane_init_mutex.go b/pkg/locking/control_plane_init_mutex.go index 7bc607ca..18691400 100644 --- a/pkg/locking/control_plane_init_mutex.go +++ b/pkg/locking/control_plane_init_mutex.go @@ -26,7 +26,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/klog/v2" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" ) diff --git a/pkg/machinefilters/machine_filters.go b/pkg/machinefilters/machine_filters.go index de64844e..190dfaa6 100644 --- a/pkg/machinefilters/machine_filters.go +++ b/pkg/machinefilters/machine_filters.go @@ -21,7 +21,7 @@ import ( "strings" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/util/collections" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" @@ -76,10 +76,10 @@ func MatchesKubernetesVersion(kubernetesVersion string) Func { if machine == nil { return false } - if machine.Spec.Version == nil { + if machine.Spec.Version == "" { return false } - return strings.TrimPrefix(*machine.Spec.Version, "v") == strings.TrimPrefix(kubernetesVersion, "v") + return strings.TrimPrefix(machine.Spec.Version, "v") == strings.TrimPrefix(kubernetesVersion, "v") } } @@ -91,7 +91,7 @@ func MatchesCK8sBootstrapConfig(machineConfigs map[string]*bootstrapv1.CK8sConfi } bootstrapRef := machine.Spec.Bootstrap.ConfigRef - if bootstrapRef == nil { + if !bootstrapRef.IsDefined() { // Missing bootstrap reference should not be considered as unmatching. // This is a safety precaution to avoid selecting machines that are broken, which in the future should be remediated separately. return true diff --git a/pkg/machinefilters/machine_filters_test.go b/pkg/machinefilters/machine_filters_test.go index ae78e751..e85c6432 100644 --- a/pkg/machinefilters/machine_filters_test.go +++ b/pkg/machinefilters/machine_filters_test.go @@ -8,7 +8,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/utils/ptr" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" controlplanev1 "github.com/canonical/cluster-api-k8s/controlplane/api/v1beta2" diff --git a/pkg/secret/certificates.go b/pkg/secret/certificates.go index 37219729..f927469d 100644 --- a/pkg/secret/certificates.go +++ b/pkg/secret/certificates.go @@ -34,7 +34,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/util/cert" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/util/certs" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/pkg/token/token.go b/pkg/token/token.go index 93cf4072..bdf8880e 100644 --- a/pkg/token/token.go +++ b/pkg/token/token.go @@ -9,7 +9,7 @@ import ( corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) diff --git a/pkg/token/token_test.go b/pkg/token/token_test.go index 24331337..23782119 100644 --- a/pkg/token/token_test.go +++ b/pkg/token/token_test.go @@ -11,7 +11,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes/scheme" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" diff --git a/pkg/upgrade/inplace/inplace.go b/pkg/upgrade/inplace/inplace.go index e40ced90..95b90092 100644 --- a/pkg/upgrade/inplace/inplace.go +++ b/pkg/upgrade/inplace/inplace.go @@ -1,7 +1,7 @@ package inplace import ( - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/controller-runtime/pkg/client" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" diff --git a/pkg/upgrade/inplace/inplace_test.go b/pkg/upgrade/inplace/inplace_test.go index 25d63fe2..a9f72f5b 100644 --- a/pkg/upgrade/inplace/inplace_test.go +++ b/pkg/upgrade/inplace/inplace_test.go @@ -6,7 +6,7 @@ import ( . "github.com/onsi/gomega" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" controlplanev1 "github.com/canonical/cluster-api-k8s/controlplane/api/v1beta2" diff --git a/pkg/upgrade/inplace/lock.go b/pkg/upgrade/inplace/lock.go index eb4bd499..d1522afd 100644 --- a/pkg/upgrade/inplace/lock.go +++ b/pkg/upgrade/inplace/lock.go @@ -9,7 +9,7 @@ import ( corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/controller-runtime/pkg/client" ) diff --git a/pkg/upgrade/inplace/lock_test.go b/pkg/upgrade/inplace/lock_test.go index 5ec47a73..5bcb89da 100644 --- a/pkg/upgrade/inplace/lock_test.go +++ b/pkg/upgrade/inplace/lock_test.go @@ -12,7 +12,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" ) diff --git a/pkg/upgrade/inplace/mark.go b/pkg/upgrade/inplace/mark.go index c6281b0a..41f17bb3 100644 --- a/pkg/upgrade/inplace/mark.go +++ b/pkg/upgrade/inplace/mark.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/pkg/upgrade/inplace/mark_test.go b/pkg/upgrade/inplace/mark_test.go index f8ce5f9f..d2e38184 100644 --- a/pkg/upgrade/inplace/mark_test.go +++ b/pkg/upgrade/inplace/mark_test.go @@ -7,7 +7,7 @@ import ( . "github.com/onsi/gomega" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/client/fake" diff --git a/templates/aws/cluster-template.yaml b/templates/aws/cluster-template.yaml index 381ad798..e3308564 100644 --- a/templates/aws/cluster-template.yaml +++ b/templates/aws/cluster-template.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -73,7 +73,7 @@ spec: rootVolume: size: ${AWS_CONTROL_PLANE_ROOT_VOLUME_SIZE} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-worker-md-0 @@ -122,7 +122,7 @@ spec: spec: nodeName: "{{ ds.meta_data.local_hostname }}" --- -apiVersion: addons.cluster.x-k8s.io/v1beta1 +apiVersion: addons.cluster.x-k8s.io/v1beta2 kind: ClusterResourceSet metadata: name: crs-ccm diff --git a/templates/docker/cluster-template-dualstack.yaml b/templates/docker/cluster-template-dualstack.yaml index 4e424fc9..b635e56f 100644 --- a/templates/docker/cluster-template-dualstack.yaml +++ b/templates/docker/cluster-template-dualstack.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -18,11 +18,11 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster name: ${CLUSTER_NAME} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -36,7 +36,7 @@ metadata: spec: machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane namespace: default @@ -48,7 +48,7 @@ spec: replicas: ${CONTROL_PLANE_MACHINE_COUNT} version: ${KUBERNETES_VERSION} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane @@ -57,7 +57,7 @@ spec: spec: customImage: ${KIND_IMAGE} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-worker-md-0 @@ -77,11 +77,11 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-0 --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/templates/docker/cluster-template.yaml b/templates/docker/cluster-template.yaml index 4a340f67..c376ba52 100644 --- a/templates/docker/cluster-template.yaml +++ b/templates/docker/cluster-template.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -16,11 +16,11 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster name: ${CLUSTER_NAME} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -34,7 +34,7 @@ metadata: spec: machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane namespace: default @@ -46,7 +46,7 @@ spec: replicas: ${CONTROL_PLANE_MACHINE_COUNT} version: ${KUBERNETES_VERSION} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane @@ -55,7 +55,7 @@ spec: spec: customImage: ${KIND_IMAGE} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-worker-md-0 @@ -75,11 +75,11 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-0 --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/templates/lxd/cluster-template.yaml b/templates/lxd/cluster-template.yaml index 183eaeb7..a2ac8bb4 100644 --- a/templates/lxd/cluster-template.yaml +++ b/templates/lxd/cluster-template.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -64,7 +64,7 @@ spec: image: name: ${LXC_IMAGE_NAME} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/templates/maas/cluster-template.yaml b/templates/maas/cluster-template.yaml index 92bbcf5a..6000b6bf 100644 --- a/templates/maas/cluster-template.yaml +++ b/templates/maas/cluster-template.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -16,11 +16,11 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: MaasCluster name: ${CLUSTER_NAME} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: MaasCluster metadata: name: ${CLUSTER_NAME} @@ -35,7 +35,7 @@ metadata: spec: machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: MaasMachineTemplate name: ${CLUSTER_NAME}-control-plane replicas: ${CONTROL_PLANE_MACHINE_COUNT} @@ -43,7 +43,7 @@ spec: spec: channel: ${CHANNEL} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: MaasMachineTemplate metadata: name: "${CLUSTER_NAME}-control-plane" @@ -56,7 +56,7 @@ spec: resourcePool: ${CONTROL_PLANE_MACHINE_RESOURCEPOOL:= } tags: [ ${CONTROL_PLANE_MACHINE_TAGS:= } ] --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-worker-md-0 @@ -76,11 +76,11 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: MaasMachineTemplate name: ${CLUSTER_NAME}-md-0 --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: MaasMachineTemplate metadata: name: "${CLUSTER_NAME}-md-0" diff --git a/templates/openstack/cluster-template.yaml b/templates/openstack/cluster-template.yaml index 0d414e04..13971f04 100755 --- a/templates/openstack/cluster-template.yaml +++ b/templates/openstack/cluster-template.yaml @@ -20,13 +20,13 @@ spec: --provider-id: openstack:///{{ instance_id }} machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: OpenStackMachineTemplate name: ${CLUSTER_NAME}-control-plane replicas: ${CONTROL_PLANE_MACHINE_COUNT} version: ${KUBERNETES_VERSION} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: "${CLUSTER_NAME}-md-0" @@ -42,12 +42,12 @@ spec: failureDomain: ${OPENSTACK_FAILURE_DOMAIN} bootstrap: configRef: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 + apiVersion: bootstrap.cluster.x-k8s.io/v1beta2 kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: name: "${CLUSTER_NAME}-md-0" - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: OpenStackMachineTemplate --- apiVersion: bootstrap.cluster.x-k8s.io/v1beta2 @@ -62,7 +62,7 @@ spec: extraKubeletArgs: --provider-id: openstack:///{{ instance_id }} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: labels: @@ -81,11 +81,11 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME} infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: OpenStackCluster name: ${CLUSTER_NAME} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: OpenStackCluster metadata: name: ${CLUSTER_NAME} @@ -140,7 +140,7 @@ spec: dnsNameservers: - ${OPENSTACK_DNS_NAMESERVERS} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: OpenStackMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane @@ -153,7 +153,7 @@ spec: name: ${OPENSTACK_IMAGE_NAME} sshKeyName: ${OPENSTACK_SSH_KEY_NAME} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: OpenStackMachineTemplate metadata: name: ${CLUSTER_NAME}-md-0 @@ -430,7 +430,7 @@ stringData: cloud.conf: ${OPENSTACK_CLOUD_CONFIG_B64} type: Opaque --- -apiVersion: addons.cluster.x-k8s.io/v1beta1 +apiVersion: addons.cluster.x-k8s.io/v1beta2 kind: ClusterResourceSet metadata: labels: diff --git a/templates/vsphere/cluster-template.yaml b/templates/vsphere/cluster-template.yaml index fc932d77..cf618785 100644 --- a/templates/vsphere/cluster-template.yaml +++ b/templates/vsphere/cluster-template.yaml @@ -159,7 +159,7 @@ stringData: updateStrategy: {} status: {} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: labels: @@ -178,11 +178,11 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME} infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: VSphereCluster name: ${CLUSTER_NAME} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: VSphereCluster metadata: name: ${CLUSTER_NAME} @@ -196,7 +196,7 @@ spec: server: ${VSPHERE_SERVER} thumbprint: ${VSPHERE_TLS_THUMBPRINT} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: VSphereMachineTemplate metadata: name: ${CLUSTER_NAME} @@ -222,7 +222,7 @@ spec: template: ${VSPHERE_TEMPLATE} thumbprint: ${VSPHERE_TLS_THUMBPRINT} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: VSphereMachineTemplate metadata: name: ${CLUSTER_NAME}-worker @@ -301,7 +301,7 @@ spec: localhost.localdomain localhost4 localhost4.localdomain4" >>/etc/hosts machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: VSphereMachineTemplate name: ${CLUSTER_NAME} replicas: ${CONTROL_PLANE_MACHINE_COUNT} @@ -335,7 +335,7 @@ spec: path: /etc/systemd/system/snap.k8s.containerd.service.d/http-proxy.conf permissions: "0644" --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: labels: @@ -353,17 +353,17 @@ spec: spec: bootstrap: configRef: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 + apiVersion: bootstrap.cluster.x-k8s.io/v1beta2 kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 clusterName: ${CLUSTER_NAME} infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: VSphereMachineTemplate name: ${CLUSTER_NAME}-worker version: ${KUBERNETES_VERSION} --- -apiVersion: addons.cluster.x-k8s.io/v1beta1 +apiVersion: addons.cluster.x-k8s.io/v1beta2 kind: ClusterResourceSet metadata: labels: diff --git a/test/e2e/common.go b/test/e2e/common.go index 6f3a577e..11722da6 100644 --- a/test/e2e/common.go +++ b/test/e2e/common.go @@ -30,7 +30,7 @@ import ( . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" "sigs.k8s.io/cluster-api/test/framework" "sigs.k8s.io/cluster-api/test/framework/clusterctl" "sigs.k8s.io/cluster-api/util" diff --git a/test/e2e/config/ck8s-aws.yaml b/test/e2e/config/ck8s-aws.yaml index 6f4f81d9..c740e830 100644 --- a/test/e2e/config/ck8s-aws.yaml +++ b/test/e2e/config/ck8s-aws.yaml @@ -20,9 +20,9 @@ providers: - name: v1.8.4 value: https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.8.4/core-components.yaml type: url - contract: v1beta1 + contract: v1beta2 files: - - sourcePath: "../data/shared/v1beta1/metadata.yaml" + - sourcePath: "../data/shared/v1beta2/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" @@ -34,7 +34,7 @@ providers: type: url contract: v1beta2 files: - - sourcePath: "../data/shared/v1beta1_aws/metadata.yaml" + - sourcePath: "../data/shared/v1beta2_aws/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" @@ -47,7 +47,7 @@ providers: type: url contract: v1beta2 files: - - sourcePath: "../data/shared/v1beta1_aws/metadata.yaml" + - sourcePath: "../data/shared/v1beta2_aws/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" diff --git a/test/e2e/config/ck8s-docker.yaml b/test/e2e/config/ck8s-docker.yaml index 337b3c54..b9e620a8 100644 --- a/test/e2e/config/ck8s-docker.yaml +++ b/test/e2e/config/ck8s-docker.yaml @@ -19,25 +19,25 @@ providers: value: https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.9.6/core-components.yaml type: url files: - - sourcePath: "../data/shared/v1beta1/metadata.yaml" + - sourcePath: "../data/shared/v1beta2/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" - name: docker type: InfrastructureProvider versions: - # By default, will use the latest version defined in ../data/shared/v1beta1/metadata.yaml + # By default, will use the latest version defined in ../data/shared/v1beta2/metadata.yaml # to init the management cluster - name: v1.9.6 # used during e2e-test value: https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.9.6/infrastructure-components-development.yaml type: url files: - - sourcePath: "../data/shared/v1beta1/metadata.yaml" + - sourcePath: "../data/shared/v1beta2/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" - # Add v1.11.99 to support tilt (not presented in ../data/shared/v1beta1/metadata.yaml) + # Add v1.11.99 to support tilt (not presented in ../data/shared/v1beta2/metadata.yaml) # when bootstrapping with tilt, it will use # the defaultProviderVersion in https://github.com/kubernetes-sigs/cluster-api/blob/main/hack/tools/internal/tilt-prepare/main.go as # default version for docker infrastructure provider @@ -46,7 +46,7 @@ providers: value: https://github.com/kubernetes-sigs/cluster-api/releases/latest/download/infrastructure-components-development.yaml type: url files: - - sourcePath: "../data/shared/v1beta1/metadata.yaml" + - sourcePath: "../data/shared/v1beta2/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" diff --git a/test/e2e/config/ck8s-incus.yaml b/test/e2e/config/ck8s-incus.yaml index f31a069b..41a88211 100644 --- a/test/e2e/config/ck8s-incus.yaml +++ b/test/e2e/config/ck8s-incus.yaml @@ -19,7 +19,7 @@ providers: value: https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.9.6/core-components.yaml type: url files: - - sourcePath: "../data/shared/v1beta1/metadata.yaml" + - sourcePath: "../data/shared/v1beta2/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" @@ -31,7 +31,7 @@ providers: value: https://github.com/lxc/cluster-api-provider-incus/releases/download/v0.8.3/infrastructure-components.yaml type: url files: - - sourcePath: "../data/shared/v1beta1_incus/metadata.yaml" + - sourcePath: "../data/shared/v1beta2_incus/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" diff --git a/test/e2e/data/infrastructure-aws/cluster-template.yaml b/test/e2e/data/infrastructure-aws/cluster-template.yaml index 8e609f81..668a039c 100644 --- a/test/e2e/data/infrastructure-aws/cluster-template.yaml +++ b/test/e2e/data/infrastructure-aws/cluster-template.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -78,7 +78,7 @@ spec: rootVolume: size: ${AWS_CONTROL_PLANE_ROOT_VOLUME_SIZE} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-worker-md-0 @@ -128,7 +128,7 @@ spec: nodeName: "{{ ds.meta_data.local_hostname }}" channel: "${KUBERNETES_VERSION}-classic/edge" --- -apiVersion: addons.cluster.x-k8s.io/v1beta1 +apiVersion: addons.cluster.x-k8s.io/v1beta2 kind: ClusterResourceSet metadata: name: crs-ccm diff --git a/test/e2e/data/infrastructure-docker/cluster-template-kcp-remediation.yaml b/test/e2e/data/infrastructure-docker/cluster-template-kcp-remediation.yaml index 2f58e4e6..4d843330 100644 --- a/test/e2e/data/infrastructure-docker/cluster-template-kcp-remediation.yaml +++ b/test/e2e/data/infrastructure-docker/cluster-template-kcp-remediation.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -17,7 +17,7 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster name: ${CLUSTER_NAME} --- @@ -76,7 +76,7 @@ data: server {{ $server }} {{ JoinHostPort $backend.Address $.BackendControlPlanePort }} weight {{ $backend.Weight }} check check-ssl verify none resolvers docker resolve-prefer {{ if $.IPv6 -}} ipv6 {{- else -}} ipv4 {{- end }} {{- end}} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -95,7 +95,7 @@ spec: version: ${KUBERNETES_VERSION} machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane nodeDrainTimeout: 30s @@ -137,7 +137,7 @@ spec: preRunCommands: - ./wait-signal.sh "${TOKEN}" "${SERVER}" "${NAMESPACE}" --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane @@ -147,7 +147,7 @@ spec: spec: customImage: k8s-snap:dev-old --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: worker-md-0 @@ -176,11 +176,11 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-0 --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-0 @@ -199,7 +199,7 @@ spec: template: spec: --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineHealthCheck metadata: name: ${CLUSTER_NAME}-mhc-0 diff --git a/test/e2e/data/infrastructure-docker/cluster-template-md-remediation.yaml b/test/e2e/data/infrastructure-docker/cluster-template-md-remediation.yaml index 8b103d6e..bc557ba0 100644 --- a/test/e2e/data/infrastructure-docker/cluster-template-md-remediation.yaml +++ b/test/e2e/data/infrastructure-docker/cluster-template-md-remediation.yaml @@ -1,7 +1,7 @@ # TODO: copied and modified from https://github.com/k3s-io/cluster-api-k3s/pull/93/files#diff-c4a336ec56832a2ff7aed26c94d0d67ae3a0e6139d30701cc53c0f0962fe8cca # should be the same as samples/docker/quickstart.yaml in the future # for testing the quickstart scenario -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -20,7 +20,7 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster name: ${CLUSTER_NAME} --- @@ -79,7 +79,7 @@ data: server {{ $server }} {{ JoinHostPort $backend.Address $.BackendControlPlanePort }} weight {{ $backend.Weight }} check check-ssl verify none resolvers docker resolve-prefer {{ if $.IPv6 -}} ipv6 {{- else -}} ipv4 {{- end }} {{- end}} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -96,7 +96,7 @@ metadata: spec: machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane nodeDrainTimeout: 30s @@ -110,7 +110,7 @@ spec: replicas: ${CONTROL_PLANE_MACHINE_COUNT} version: ${KUBERNETES_VERSION} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane @@ -120,7 +120,7 @@ spec: spec: customImage: k8s-snap:dev-old --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: worker-md-0 @@ -150,11 +150,11 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-0 --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-0 @@ -177,7 +177,7 @@ spec: # MachineHealthCheck object with # - a selector that targets all the machines with label e2e.remediation.label="" # - unhealthyConditions triggering remediation after 10s the condition is set -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineHealthCheck metadata: name: "${CLUSTER_NAME}-mhc-0" diff --git a/test/e2e/data/infrastructure-docker/cluster-template-upgrades-max-surge-0.yaml b/test/e2e/data/infrastructure-docker/cluster-template-upgrades-max-surge-0.yaml index 0766fa8e..cdea5d33 100644 --- a/test/e2e/data/infrastructure-docker/cluster-template-upgrades-max-surge-0.yaml +++ b/test/e2e/data/infrastructure-docker/cluster-template-upgrades-max-surge-0.yaml @@ -1,7 +1,7 @@ # TODO: copied and modified from https://github.com/k3s-io/cluster-api-k3s/pull/93/files#diff-c4a336ec56832a2ff7aed26c94d0d67ae3a0e6139d30701cc53c0f0962fe8cca # should be the same as samples/docker/quickstart.yaml in the future # for testing the quickstart scenario -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -20,7 +20,7 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster name: ${CLUSTER_NAME} --- @@ -79,7 +79,7 @@ data: server {{ $server }} {{ JoinHostPort $backend.Address $.BackendControlPlanePort }} weight {{ $backend.Weight }} check check-ssl verify none resolvers docker resolve-prefer {{ if $.IPv6 -}} ipv6 {{- else -}} ipv4 {{- end }} {{- end}} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -99,7 +99,7 @@ spec: maxSurge: 0 machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane-old nodeDrainTimeout: 30s @@ -114,7 +114,7 @@ spec: version: ${KUBERNETES_VERSION} --- # Initial template for the control-plane deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane-old @@ -125,7 +125,7 @@ spec: customImage: k8s-snap:dev-old --- # After upgrade template for the control plane deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane-new @@ -135,7 +135,7 @@ spec: spec: customImage: k8s-snap:dev-new --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: worker-md-0 @@ -164,12 +164,12 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-old-0 --- # Initial template for the machine deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-old-0 @@ -180,7 +180,7 @@ spec: customImage: k8s-snap:dev-old --- # After upgrade template for the machine deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-new-0 diff --git a/test/e2e/data/infrastructure-docker/cluster-template-upgrades.yaml b/test/e2e/data/infrastructure-docker/cluster-template-upgrades.yaml index bf72a0ab..3c1e8f0f 100644 --- a/test/e2e/data/infrastructure-docker/cluster-template-upgrades.yaml +++ b/test/e2e/data/infrastructure-docker/cluster-template-upgrades.yaml @@ -1,7 +1,7 @@ # TODO: copied and modified from https://github.com/k3s-io/cluster-api-k3s/pull/93/files#diff-c4a336ec56832a2ff7aed26c94d0d67ae3a0e6139d30701cc53c0f0962fe8cca # should be the same as samples/docker/quickstart.yaml in the future # for testing the quickstart scenario -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -20,7 +20,7 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster name: ${CLUSTER_NAME} --- @@ -79,7 +79,7 @@ data: server {{ $server }} {{ JoinHostPort $backend.Address $.BackendControlPlanePort }} weight {{ $backend.Weight }} check check-ssl verify none resolvers docker resolve-prefer {{ if $.IPv6 -}} ipv6 {{- else -}} ipv4 {{- end }} {{- end}} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -96,7 +96,7 @@ metadata: spec: machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane-old nodeDrainTimeout: 30s @@ -111,7 +111,7 @@ spec: version: ${KUBERNETES_VERSION} --- # Initial template for the control-plane deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane-old @@ -122,7 +122,7 @@ spec: customImage: k8s-snap:dev-old --- # After upgrade template for the control plane deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane-new @@ -132,7 +132,7 @@ spec: spec: customImage: k8s-snap:dev-new --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: worker-md-0 @@ -161,12 +161,12 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-old-0 --- # Initial template for the machine deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-old-0 @@ -177,7 +177,7 @@ spec: customImage: k8s-snap:dev-old --- # After upgrade template for the machine deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-new-0 diff --git a/test/e2e/data/infrastructure-docker/cluster-template.yaml b/test/e2e/data/infrastructure-docker/cluster-template.yaml index c59e89eb..1a8299c6 100644 --- a/test/e2e/data/infrastructure-docker/cluster-template.yaml +++ b/test/e2e/data/infrastructure-docker/cluster-template.yaml @@ -1,7 +1,7 @@ # TODO: copied and modified from https://github.com/k3s-io/cluster-api-k3s/pull/93/files#diff-c4a336ec56832a2ff7aed26c94d0d67ae3a0e6139d30701cc53c0f0962fe8cca # should be the same as samples/docker/quickstart.yaml in the future # for testing the quickstart scenario -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -20,7 +20,7 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster name: ${CLUSTER_NAME} --- @@ -79,7 +79,7 @@ data: server {{ $server }} {{ JoinHostPort $backend.Address $.BackendControlPlanePort }} weight {{ $backend.Weight }} check check-ssl verify none resolvers docker resolve-prefer {{ if $.IPv6 -}} ipv6 {{- else -}} ipv4 {{- end }} {{- end}} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -96,7 +96,7 @@ metadata: spec: machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane nodeDrainTimeout: 30s @@ -110,7 +110,7 @@ spec: replicas: ${CONTROL_PLANE_MACHINE_COUNT} version: ${KUBERNETES_VERSION} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane @@ -120,7 +120,7 @@ spec: spec: customImage: k8s-snap:dev-old --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: worker-md-0 @@ -149,11 +149,11 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-0 --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/test/e2e/data/infrastructure-incus/cluster-template-kcp-remediation.yaml b/test/e2e/data/infrastructure-incus/cluster-template-kcp-remediation.yaml index a572368e..04151f8a 100644 --- a/test/e2e/data/infrastructure-incus/cluster-template-kcp-remediation.yaml +++ b/test/e2e/data/infrastructure-incus/cluster-template-kcp-remediation.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -97,7 +97,7 @@ spec: image: name: ${LXC_IMAGE_NAME} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-md-0 @@ -152,7 +152,7 @@ spec: extraKubeletArgs: --provider-id: "lxc:///{{ v1.local_hostname }}" --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineHealthCheck metadata: name: ${CLUSTER_NAME}-mhc-0 diff --git a/test/e2e/data/infrastructure-incus/cluster-template-md-remediation.yaml b/test/e2e/data/infrastructure-incus/cluster-template-md-remediation.yaml index 4becc526..ae25137c 100644 --- a/test/e2e/data/infrastructure-incus/cluster-template-md-remediation.yaml +++ b/test/e2e/data/infrastructure-incus/cluster-template-md-remediation.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -67,7 +67,7 @@ spec: image: name: ${LXC_IMAGE_NAME} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-md-0 @@ -126,7 +126,7 @@ spec: # MachineHealthCheck object with # - a selector that targets all the machines with label e2e.remediation.label="" # - unhealthyConditions triggering remediation after 10s the condition is set -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineHealthCheck metadata: name: "${CLUSTER_NAME}-mhc-0" diff --git a/test/e2e/data/infrastructure-incus/cluster-template-upgrades-max-surge-0.yaml b/test/e2e/data/infrastructure-incus/cluster-template-upgrades-max-surge-0.yaml index c36aa1f3..42ec251c 100644 --- a/test/e2e/data/infrastructure-incus/cluster-template-upgrades-max-surge-0.yaml +++ b/test/e2e/data/infrastructure-incus/cluster-template-upgrades-max-surge-0.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -70,7 +70,7 @@ spec: image: name: ${LXC_IMAGE_NAME} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/test/e2e/data/infrastructure-incus/cluster-template-upgrades.yaml b/test/e2e/data/infrastructure-incus/cluster-template-upgrades.yaml index 5487ecbe..f8b13b28 100644 --- a/test/e2e/data/infrastructure-incus/cluster-template-upgrades.yaml +++ b/test/e2e/data/infrastructure-incus/cluster-template-upgrades.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -67,7 +67,7 @@ spec: image: name: ${LXC_IMAGE_NAME} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/test/e2e/data/infrastructure-incus/cluster-template.yaml b/test/e2e/data/infrastructure-incus/cluster-template.yaml index 5487ecbe..f8b13b28 100644 --- a/test/e2e/data/infrastructure-incus/cluster-template.yaml +++ b/test/e2e/data/infrastructure-incus/cluster-template.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -67,7 +67,7 @@ spec: image: name: ${LXC_IMAGE_NAME} --- -apiVersion: cluster.x-k8s.io/v1beta1 +apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/test/e2e/data/shared/v1beta1/metadata.yaml b/test/e2e/data/shared/v1beta1/metadata.yaml index 59b5606e..92eee2b1 100644 --- a/test/e2e/data/shared/v1beta1/metadata.yaml +++ b/test/e2e/data/shared/v1beta1/metadata.yaml @@ -3,13 +3,13 @@ kind: Metadata releaseSeries: - major: 1 minor: 9 - contract: v1beta1 + contract: v1beta2 - major: 1 minor: 8 - contract: v1beta1 + contract: v1beta2 - major: 1 minor: 7 - contract: v1beta1 + contract: v1beta2 - major: 1 minor: 6 - contract: v1beta1 + contract: v1beta2 diff --git a/test/e2e/data/shared/v1beta1_aws/metadata.yaml b/test/e2e/data/shared/v1beta1_aws/metadata.yaml index 8e288cef..1d3c3115 100644 --- a/test/e2e/data/shared/v1beta1_aws/metadata.yaml +++ b/test/e2e/data/shared/v1beta1_aws/metadata.yaml @@ -2,4 +2,4 @@ apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 releaseSeries: - major: 2 minor: 6 - contract: v1beta1 + contract: v1beta2 diff --git a/test/e2e/data/shared/v1beta1_incus/metadata.yaml b/test/e2e/data/shared/v1beta1_incus/metadata.yaml index 88da5ebf..0b7760e7 100644 --- a/test/e2e/data/shared/v1beta1_incus/metadata.yaml +++ b/test/e2e/data/shared/v1beta1_incus/metadata.yaml @@ -3,25 +3,25 @@ kind: Metadata releaseSeries: - major: 0 minor: 1 - contract: v1beta1 + contract: v1beta2 - major: 0 minor: 2 - contract: v1beta1 + contract: v1beta2 - major: 0 minor: 3 - contract: v1beta1 + contract: v1beta2 - major: 0 minor: 4 - contract: v1beta1 + contract: v1beta2 - major: 0 minor: 5 - contract: v1beta1 + contract: v1beta2 - major: 0 minor: 6 - contract: v1beta1 + contract: v1beta2 - major: 0 minor: 7 - contract: v1beta1 + contract: v1beta2 - major: 0 minor: 8 - contract: v1beta1 + contract: v1beta2 diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index e071fd08..12851f77 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -35,12 +35,12 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/klog/v2" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" "sigs.k8s.io/cluster-api/test/framework" "sigs.k8s.io/cluster-api/test/framework/bootstrap" "sigs.k8s.io/cluster-api/test/framework/clusterctl" "sigs.k8s.io/cluster-api/test/framework/ginkgoextensions" - dockerinfrav1 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta1" + dockerinfrav1 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta2" ctrl "sigs.k8s.io/controller-runtime" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" diff --git a/test/e2e/helpers.go b/test/e2e/helpers.go index e8746402..a12b5649 100644 --- a/test/e2e/helpers.go +++ b/test/e2e/helpers.go @@ -32,9 +32,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/klog/v2" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" "sigs.k8s.io/cluster-api/controllers/noderefutil" - expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1" + expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta2" "sigs.k8s.io/cluster-api/test/framework" "sigs.k8s.io/cluster-api/test/framework/clusterctl" "sigs.k8s.io/cluster-api/util/conditions" @@ -1081,7 +1081,7 @@ func UpgradeMachineDeploymentsAndWait(ctx context.Context, input framework.Upgra deployment.Spec.Template.Spec.Version = &input.UpgradeVersion // Create a new ObjectReference for the infrastructure provider newInfrastructureRef := corev1.ObjectReference{ - APIVersion: "infrastructure.cluster.x-k8s.io/v1beta1", + APIVersion: "infrastructure.cluster.x-k8s.io/v1beta2", Kind: "DockerMachineTemplate", Name: fmt.Sprintf("%s-md-new-0", input.Cluster.Name), Namespace: deployment.Spec.Template.Spec.InfrastructureRef.Namespace, diff --git a/test/e2e/refresh_certs_test.go b/test/e2e/refresh_certs_test.go index bdcd2daa..cff9aa89 100644 --- a/test/e2e/refresh_certs_test.go +++ b/test/e2e/refresh_certs_test.go @@ -30,7 +30,7 @@ import ( . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" "k8s.io/utils/ptr" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" "sigs.k8s.io/cluster-api/test/framework/clusterctl" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/controller-runtime/pkg/client" From 6e0c28dae1cc8563683633e115bf407d14946aad Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Thu, 18 Jun 2026 13:02:11 +0000 Subject: [PATCH 25/43] Revert "Move to beta1v2" This reverts commit bae2a267173d8f9c438f7fe2640d604619309a1f. --- Makefile | 10 +- bootstrap/api/v1beta2/ck8sconfig_types.go | 2 +- bootstrap/api/v1beta2/ck8sconfig_webhook.go | 27 +- .../api/v1beta2/ck8sconfigtemplate_webhook.go | 27 +- bootstrap/api/v1beta2/condition_consts.go | 6 +- .../api/v1beta2/zz_generated.deepcopy.go | 4 +- bootstrap/config/crd/kustomization.yaml | 2 +- .../crd/patches/webhook_in_ck8sconfigs.yaml | 2 +- .../webhook_in_ck8sconfigtemplates.yaml | 2 +- bootstrap/config/manager/kustomization.yaml | 5 +- bootstrap/config/webhook/manifests.yaml | 8 +- .../controllers/certificates_controller.go | 2 +- .../controllers/ck8sconfig_controller.go | 2 +- ...orchestrated_inplace_upgrade_controller.go | 2 +- bootstrap/controllers/upgrade_controller.go | 2 +- bootstrap/main.go | 8 +- bootstrap/metadata.yaml | 2 +- .../api/v1beta2/ck8scontrolplane_types.go | 2 +- .../api/v1beta2/ck8scontrolplane_webhook.go | 19 +- controlplane/api/v1beta2/condition_consts.go | 2 +- controlplane/api/v1beta2/doc.go | 2 +- .../api/v1beta2/zz_generated.deepcopy.go | 4 +- controlplane/config/crd/kustomization.yaml | 2 +- .../patches/webhook_in_ck8scontrolplanes.yaml | 2 +- .../config/manager/kustomization.yaml | 5 +- controlplane/config/webhook/manifests.yaml | 4 +- .../ck8scontrolplane_controller.go | 2 +- .../controllers/machine_controller.go | 2 +- ...orchestrated_inplace_upgrade_controller.go | 2 +- controlplane/controllers/remediation.go | 2 +- controlplane/controllers/scale.go | 2 +- controlplane/main.go | 8 +- controlplane/metadata.yaml | 2 +- go.mod | 170 ++++--- go.sum | 446 ++++++++++-------- out/bootstrap-components.yaml | 16 +- out/control-plane-components.yaml | 10 +- out/metadata.yaml | 12 +- pkg/ck8s/config_init.go | 2 +- pkg/ck8s/control_plane.go | 2 +- pkg/ck8s/management_cluster.go | 2 +- pkg/ck8s/workload_cluster.go | 2 +- pkg/kubeconfig/kubeconfig.go | 2 +- pkg/locking/control_plane_init_mutex.go | 2 +- pkg/machinefilters/machine_filters.go | 8 +- pkg/machinefilters/machine_filters_test.go | 2 +- pkg/secret/certificates.go | 2 +- pkg/token/token.go | 2 +- pkg/token/token_test.go | 2 +- pkg/upgrade/inplace/inplace.go | 2 +- pkg/upgrade/inplace/inplace_test.go | 2 +- pkg/upgrade/inplace/lock.go | 2 +- pkg/upgrade/inplace/lock_test.go | 2 +- pkg/upgrade/inplace/mark.go | 2 +- pkg/upgrade/inplace/mark_test.go | 2 +- templates/aws/cluster-template.yaml | 6 +- .../docker/cluster-template-dualstack.yaml | 16 +- templates/docker/cluster-template.yaml | 16 +- templates/lxd/cluster-template.yaml | 4 +- templates/maas/cluster-template.yaml | 16 +- templates/openstack/cluster-template.yaml | 20 +- templates/vsphere/cluster-template.yaml | 20 +- test/e2e/common.go | 2 +- test/e2e/config/ck8s-aws.yaml | 8 +- test/e2e/config/ck8s-docker.yaml | 10 +- test/e2e/config/ck8s-incus.yaml | 4 +- .../infrastructure-aws/cluster-template.yaml | 6 +- .../cluster-template-kcp-remediation.yaml | 18 +- .../cluster-template-md-remediation.yaml | 18 +- ...cluster-template-upgrades-max-surge-0.yaml | 20 +- .../cluster-template-upgrades.yaml | 20 +- .../cluster-template.yaml | 16 +- .../cluster-template-kcp-remediation.yaml | 6 +- .../cluster-template-md-remediation.yaml | 6 +- ...cluster-template-upgrades-max-surge-0.yaml | 4 +- .../cluster-template-upgrades.yaml | 4 +- .../cluster-template.yaml | 4 +- test/e2e/data/shared/v1beta1/metadata.yaml | 8 +- .../e2e/data/shared/v1beta1_aws/metadata.yaml | 2 +- .../data/shared/v1beta1_incus/metadata.yaml | 16 +- test/e2e/e2e_suite_test.go | 4 +- test/e2e/helpers.go | 6 +- test/e2e/refresh_certs_test.go | 2 +- 83 files changed, 600 insertions(+), 551 deletions(-) diff --git a/Makefile b/Makefile index 1952bb81..3cc10b20 100644 --- a/Makefile +++ b/Makefile @@ -237,8 +237,8 @@ generate-bootstrap: $(CONTROLLER_GEN) generate-bootstrap-conversions: $(CONVERSION_GEN) $(CONVERSION_GEN) \ - --input-dirs=./bootstrap/api/v1beta2 \ - --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1beta2 \ + --input-dirs=./bootstrap/api/v1beta1 \ + --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1beta1 \ --build-tag=ignore_autogenerated_conversions \ --output-file-base=zz_generated.conversion \ --output-base=./ \ @@ -326,9 +326,9 @@ generate-controlplane: $(CONTROLLER_GEN) generate-controlplane-conversions: $(CONVERSION_GEN) $(CONVERSION_GEN) \ - --input-dirs=./controlplane/api/v1beta2 \ - --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1beta2 \ - --extra-peer-dirs=github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2 \ + --input-dirs=./controlplane/api/v1beta1 \ + --extra-peer-dirs=sigs.k8s.io/cluster-api/api/v1beta1 \ + --extra-peer-dirs=github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta1 \ --build-tag=ignore_autogenerated_conversions \ --output-file-base=zz_generated.conversion \ --output-base=./ \ diff --git a/bootstrap/api/v1beta2/ck8sconfig_types.go b/bootstrap/api/v1beta2/ck8sconfig_types.go index d6bd2796..7fe5dcce 100644 --- a/bootstrap/api/v1beta2/ck8sconfig_types.go +++ b/bootstrap/api/v1beta2/ck8sconfig_types.go @@ -18,7 +18,7 @@ package v1beta2 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" ) // NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. diff --git a/bootstrap/api/v1beta2/ck8sconfig_webhook.go b/bootstrap/api/v1beta2/ck8sconfig_webhook.go index 54c418c1..c640439a 100644 --- a/bootstrap/api/v1beta2/ck8sconfig_webhook.go +++ b/bootstrap/api/v1beta2/ck8sconfig_webhook.go @@ -19,31 +19,42 @@ package v1beta2 import ( "context" + "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) // SetupWebhookWithManager will setup the webhooks for the CK8sControlPlane. func (c *CK8sConfig) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr, &CK8sConfig{}). - WithValidator(c). + return ctrl.NewWebhookManagedBy(mgr). + For(c). + WithDefaulter(&CK8sConfig{}). + WithValidator(&CK8sConfig{}). Complete() } -// +kubebuilder:webhook:verbs=create;update,path=/validate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfig,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigs,versions=v1beta2,name=validation.ck8sconfig.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta2 -// +kubebuilder:webhook:verbs=create;update,path=/mutate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfig,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigs,versions=v1beta2,name=default.ck8sconfig.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta2 +// +kubebuilder:webhook:verbs=create;update,path=/validate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfig,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigs,versions=v1beta2,name=validation.ck8sconfig.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 +// +kubebuilder:webhook:verbs=create;update,path=/mutate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfig,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigs,versions=v1beta2,name=default.ck8sconfig.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 -var _ admission.Validator[*CK8sConfig] = &CK8sConfig{} +var _ admission.CustomDefaulter = &CK8sConfig{} +var _ admission.CustomValidator = &CK8sConfig{} // ValidateCreate will do any extra validation when creating a CK8sControlPlane. -func (c *CK8sConfig) ValidateCreate(_ context.Context, _ *CK8sConfig) (admission.Warnings, error) { +func (c *CK8sConfig) ValidateCreate(_ context.Context, _ runtime.Object) (admission.Warnings, error) { return []string{}, nil } -func (c *CK8sConfig) ValidateUpdate(_ context.Context, _ *CK8sConfig, _ *CK8sConfig) (admission.Warnings, error) { +// ValidateUpdate will do any extra validation when updating a CK8sControlPlane. +func (c *CK8sConfig) ValidateUpdate(_ context.Context, _, _ runtime.Object) (admission.Warnings, error) { return []string{}, nil } -func (c *CK8sConfig) ValidateDelete(_ context.Context, _ *CK8sConfig) (admission.Warnings, error) { +// ValidateDelete allows you to add any extra validation when deleting. +func (c *CK8sConfig) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) { return []string{}, nil } + +// Default will set default values for the CK8sControlPlane. +func (c *CK8sConfig) Default(_ context.Context, _ runtime.Object) error { + return nil +} diff --git a/bootstrap/api/v1beta2/ck8sconfigtemplate_webhook.go b/bootstrap/api/v1beta2/ck8sconfigtemplate_webhook.go index 9d291668..c2265484 100644 --- a/bootstrap/api/v1beta2/ck8sconfigtemplate_webhook.go +++ b/bootstrap/api/v1beta2/ck8sconfigtemplate_webhook.go @@ -19,31 +19,42 @@ package v1beta2 import ( "context" + "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) // SetupWebhookWithManager will setup the webhooks for the CK8sControlPlane. func (c *CK8sConfigTemplate) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr, &CK8sConfigTemplate{}). - WithValidator(c). + return ctrl.NewWebhookManagedBy(mgr). + For(c). + WithDefaulter(&CK8sConfigTemplate{}). + WithValidator(&CK8sConfigTemplate{}). Complete() } -// +kubebuilder:webhook:verbs=create;update,path=/validate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfigtemplate,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigtemplates,versions=v1beta2,name=validation.ck8sconfigtemplate.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta2 -// +kubebuilder:webhook:verbs=create;update,path=/mutate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfigtemplate,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigtemplates,versions=v1beta2,name=default.ck8sconfigtemplate.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta2 +// +kubebuilder:webhook:verbs=create;update,path=/validate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfigtemplate,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigtemplates,versions=v1beta2,name=validation.ck8sconfigtemplate.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 +// +kubebuilder:webhook:verbs=create;update,path=/mutate-bootstrap-cluster-x-k8s-io-v1beta2-ck8sconfigtemplate,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=bootstrap.cluster.x-k8s.io,resources=ck8sconfigtemplates,versions=v1beta2,name=default.ck8sconfigtemplate.bootstrap.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 -var _ admission.Validator[*CK8sConfigTemplate] = &CK8sConfigTemplate{} +var _ admission.CustomDefaulter = &CK8sConfigTemplate{} +var _ admission.CustomValidator = &CK8sConfigTemplate{} // ValidateCreate will do any extra validation when creating a CK8sControlPlane. -func (c *CK8sConfigTemplate) ValidateCreate(_ context.Context, _ *CK8sConfigTemplate) (admission.Warnings, error) { +func (c *CK8sConfigTemplate) ValidateCreate(_ context.Context, _ runtime.Object) (admission.Warnings, error) { return []string{}, nil } -func (c *CK8sConfigTemplate) ValidateUpdate(_ context.Context, _ *CK8sConfigTemplate, _ *CK8sConfigTemplate) (admission.Warnings, error) { +// ValidateUpdate will do any extra validation when updating a CK8sControlPlane. +func (c *CK8sConfigTemplate) ValidateUpdate(_ context.Context, _, _ runtime.Object) (admission.Warnings, error) { return []string{}, nil } -func (c *CK8sConfigTemplate) ValidateDelete(_ context.Context, _ *CK8sConfigTemplate) (admission.Warnings, error) { +// ValidateDelete allows you to add any extra validation when deleting. +func (c *CK8sConfigTemplate) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) { return []string{}, nil } + +// Default will set default values for the CK8sControlPlane. +func (c *CK8sConfigTemplate) Default(_ context.Context, _ runtime.Object) error { + return nil +} diff --git a/bootstrap/api/v1beta2/condition_consts.go b/bootstrap/api/v1beta2/condition_consts.go index 7ba43d28..7e9ee0c6 100644 --- a/bootstrap/api/v1beta2/condition_consts.go +++ b/bootstrap/api/v1beta2/condition_consts.go @@ -16,7 +16,7 @@ limitations under the License. package v1beta2 -import clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta1" +import clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" // Conditions and condition Reasons for the CK8sConfig object. @@ -40,8 +40,8 @@ const ( // // NOTE: Having the control plane machine available is a pre-condition for joining additional control planes // or workers nodes. - // Deprecated: This has been deprecated in v1beta2 and will be removed in a future version. - // Switch to WaitingForControlPlaneAvailableReason constant from the `sigs.k8s.io/cluster-api/api/core/v1beta2` + // Deprecated: This has been deprecated in v1beta1 and will be removed in a future version. + // Switch to WaitingForControlPlaneAvailableReason constant from the `sigs.k8s.io/cluster-api/api/v1beta1` // package. WaitingForControlPlaneAvailableReason = clusterv1.WaitingForControlPlaneAvailableReason diff --git a/bootstrap/api/v1beta2/zz_generated.deepcopy.go b/bootstrap/api/v1beta2/zz_generated.deepcopy.go index f5738ec8..518a738b 100644 --- a/bootstrap/api/v1beta2/zz_generated.deepcopy.go +++ b/bootstrap/api/v1beta2/zz_generated.deepcopy.go @@ -22,7 +22,7 @@ package v1beta2 import ( "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/cluster-api/api/core/v1beta2" + "sigs.k8s.io/cluster-api/api/v1beta1" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -234,7 +234,7 @@ func (in *CK8sConfigStatus) DeepCopyInto(out *CK8sConfigStatus) { } if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions - *out = make(v1beta2.Conditions, len(*in)) + *out = make(v1beta1.Conditions, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/bootstrap/config/crd/kustomization.yaml b/bootstrap/config/crd/kustomization.yaml index 776ada22..899de0dd 100644 --- a/bootstrap/config/crd/kustomization.yaml +++ b/bootstrap/config/crd/kustomization.yaml @@ -1,5 +1,5 @@ commonLabels: - cluster.x-k8s.io/v1beta2: v1beta2_v1beta2 + cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 clusterctl.cluster.x-k8s.io: "" # This kustomization.yaml is not intended to be run by itself, diff --git a/bootstrap/config/crd/patches/webhook_in_ck8sconfigs.yaml b/bootstrap/config/crd/patches/webhook_in_ck8sconfigs.yaml index d5fe59b7..76b1981e 100644 --- a/bootstrap/config/crd/patches/webhook_in_ck8sconfigs.yaml +++ b/bootstrap/config/crd/patches/webhook_in_ck8sconfigs.yaml @@ -13,5 +13,5 @@ spec: name: webhook-service path: /convert conversionReviewVersions: - - v1beta2 + - v1beta1 - v1beta2 diff --git a/bootstrap/config/crd/patches/webhook_in_ck8sconfigtemplates.yaml b/bootstrap/config/crd/patches/webhook_in_ck8sconfigtemplates.yaml index 0b90bbe8..ce5107a7 100644 --- a/bootstrap/config/crd/patches/webhook_in_ck8sconfigtemplates.yaml +++ b/bootstrap/config/crd/patches/webhook_in_ck8sconfigtemplates.yaml @@ -13,5 +13,5 @@ spec: name: webhook-service path: /convert conversionReviewVersions: - - v1beta2 + - v1beta1 - v1beta2 diff --git a/bootstrap/config/manager/kustomization.yaml b/bootstrap/config/manager/kustomization.yaml index 172867cb..2d5090e8 100644 --- a/bootstrap/config/manager/kustomization.yaml +++ b/bootstrap/config/manager/kustomization.yaml @@ -1,8 +1,7 @@ resources: - manager.yaml -apiVersion: kustomize.config.k8s.io/v1beta2 +apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - name: controller - newName: tinkerbell.azurecr.io/canonical/cluster-api-k8s/bootstrap-controller - newTag: pr-226 + newName: ghcr.io/canonical/cluster-api-k8s/bootstrap-controller diff --git a/bootstrap/config/webhook/manifests.yaml b/bootstrap/config/webhook/manifests.yaml index 63e2df4e..98f9c6b9 100644 --- a/bootstrap/config/webhook/manifests.yaml +++ b/bootstrap/config/webhook/manifests.yaml @@ -6,7 +6,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta2 + - v1beta1 clientConfig: service: name: webhook-service @@ -28,7 +28,7 @@ webhooks: sideEffects: None - admissionReviewVersions: - v1 - - v1beta2 + - v1beta1 clientConfig: service: name: webhook-service @@ -56,7 +56,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta2 + - v1beta1 clientConfig: service: name: webhook-service @@ -78,7 +78,7 @@ webhooks: sideEffects: None - admissionReviewVersions: - v1 - - v1beta2 + - v1beta1 clientConfig: service: name: webhook-service diff --git a/bootstrap/controllers/certificates_controller.go b/bootstrap/controllers/certificates_controller.go index e9cc3842..19cecdcd 100644 --- a/bootstrap/controllers/certificates_controller.go +++ b/bootstrap/controllers/certificates_controller.go @@ -11,7 +11,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/record" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" bsutil "sigs.k8s.io/cluster-api/bootstrap/util" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/patch" diff --git a/bootstrap/controllers/ck8sconfig_controller.go b/bootstrap/controllers/ck8sconfig_controller.go index e934a28e..c4f6778d 100644 --- a/bootstrap/controllers/ck8sconfig_controller.go +++ b/bootstrap/controllers/ck8sconfig_controller.go @@ -31,7 +31,7 @@ import ( "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/utils/ptr" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" bsutil "sigs.k8s.io/cluster-api/bootstrap/util" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/annotations" diff --git a/bootstrap/controllers/orchestrated_inplace_upgrade_controller.go b/bootstrap/controllers/orchestrated_inplace_upgrade_controller.go index 036b490a..cb8c8041 100644 --- a/bootstrap/controllers/orchestrated_inplace_upgrade_controller.go +++ b/bootstrap/controllers/orchestrated_inplace_upgrade_controller.go @@ -11,7 +11,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/record" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/collections" "sigs.k8s.io/cluster-api/util/patch" diff --git a/bootstrap/controllers/upgrade_controller.go b/bootstrap/controllers/upgrade_controller.go index ca771f8b..f0047f99 100644 --- a/bootstrap/controllers/upgrade_controller.go +++ b/bootstrap/controllers/upgrade_controller.go @@ -11,7 +11,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/record" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/patch" ctrl "sigs.k8s.io/controller-runtime" diff --git a/bootstrap/main.go b/bootstrap/main.go index 42f9ae61..505597b5 100644 --- a/bootstrap/main.go +++ b/bootstrap/main.go @@ -25,8 +25,8 @@ import ( clientgoscheme "k8s.io/client-go/kubernetes/scheme" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" "k8s.io/utils/ptr" - clusterv1beta2 "sigs.k8s.io/cluster-api/api/core/v1beta2" - expv1beta2 "sigs.k8s.io/cluster-api/exp/api/v1beta2" + clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" + expv1beta1 "sigs.k8s.io/cluster-api/exp/api/v1beta1" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/config" @@ -45,8 +45,8 @@ var ( func init() { _ = clientgoscheme.AddToScheme(scheme) - _ = clusterv1beta2.AddToScheme(scheme) - _ = expv1beta2.AddToScheme(scheme) + _ = clusterv1beta1.AddToScheme(scheme) + _ = expv1beta1.AddToScheme(scheme) _ = bootstrapv1.AddToScheme(scheme) // +kubebuilder:scaffold:scheme } diff --git a/bootstrap/metadata.yaml b/bootstrap/metadata.yaml index d45a1ef2..2a2b09be 100644 --- a/bootstrap/metadata.yaml +++ b/bootstrap/metadata.yaml @@ -7,4 +7,4 @@ apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 releaseSeries: - major: 0 minor: 1 - contract: v1beta2 + contract: v1beta1 diff --git a/controlplane/api/v1beta2/ck8scontrolplane_types.go b/controlplane/api/v1beta2/ck8scontrolplane_types.go index 60e13c73..b18bbd96 100644 --- a/controlplane/api/v1beta2/ck8scontrolplane_types.go +++ b/controlplane/api/v1beta2/ck8scontrolplane_types.go @@ -22,7 +22,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" "github.com/canonical/cluster-api-k8s/pkg/errors" diff --git a/controlplane/api/v1beta2/ck8scontrolplane_webhook.go b/controlplane/api/v1beta2/ck8scontrolplane_webhook.go index ee9694bf..c415ecd6 100644 --- a/controlplane/api/v1beta2/ck8scontrolplane_webhook.go +++ b/controlplane/api/v1beta2/ck8scontrolplane_webhook.go @@ -29,28 +29,31 @@ import ( // SetupWebhookWithManager will setup the webhooks for the CK8sControlPlane. func (in *CK8sControlPlane) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr, in). - WithValidator(in). + return ctrl.NewWebhookManagedBy(mgr). + For(in). + WithDefaulter(&CK8sControlPlane{}). + WithValidator(&CK8sControlPlane{}). Complete() } -// +kubebuilder:webhook:verbs=create;update,path=/validate-controlplane-cluster-x-k8s-io-v1beta2-ck8scontrolplane,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=controlplane.cluster.x-k8s.io,resources=ck8scontrolplanes,versions=v1beta2,name=validation.ck8scontrolplane.controlplane.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta2 -// +kubebuilder:webhook:verbs=create;update,path=/mutate-controlplane-cluster-x-k8s-io-v1beta2-ck8scontrolplane,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=controlplane.cluster.x-k8s.io,resources=ck8scontrolplanes,versions=v1beta2,name=default.ck8scontrolplane.controlplane.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta2 +// +kubebuilder:webhook:verbs=create;update,path=/validate-controlplane-cluster-x-k8s-io-v1beta2-ck8scontrolplane,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=controlplane.cluster.x-k8s.io,resources=ck8scontrolplanes,versions=v1beta2,name=validation.ck8scontrolplane.controlplane.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 +// +kubebuilder:webhook:verbs=create;update,path=/mutate-controlplane-cluster-x-k8s-io-v1beta2-ck8scontrolplane,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=controlplane.cluster.x-k8s.io,resources=ck8scontrolplanes,versions=v1beta2,name=default.ck8scontrolplane.controlplane.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 -var _ admission.Validator[*CK8sControlPlane] = &CK8sControlPlane{} +var _ admission.CustomDefaulter = &CK8sControlPlane{} +var _ admission.CustomValidator = &CK8sControlPlane{} // ValidateCreate will do any extra validation when creating a CK8sControlPlane. -func (in *CK8sControlPlane) ValidateCreate(_ context.Context, _ *CK8sControlPlane) (admission.Warnings, error) { +func (in *CK8sControlPlane) ValidateCreate(_ context.Context, _ runtime.Object) (admission.Warnings, error) { return []string{}, nil } // ValidateUpdate will do any extra validation when updating a CK8sControlPlane. -func (in *CK8sControlPlane) ValidateUpdate(_ context.Context, _ *CK8sControlPlane, _ *CK8sControlPlane) (admission.Warnings, error) { +func (in *CK8sControlPlane) ValidateUpdate(_ context.Context, _, _ runtime.Object) (admission.Warnings, error) { return []string{}, nil } // ValidateDelete allows you to add any extra validation when deleting. -func (in *CK8sControlPlane) ValidateDelete(_ context.Context, _ *CK8sControlPlane) (admission.Warnings, error) { +func (in *CK8sControlPlane) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) { return []string{}, nil } diff --git a/controlplane/api/v1beta2/condition_consts.go b/controlplane/api/v1beta2/condition_consts.go index 347291ab..e25e1164 100644 --- a/controlplane/api/v1beta2/condition_consts.go +++ b/controlplane/api/v1beta2/condition_consts.go @@ -16,7 +16,7 @@ limitations under the License. package v1beta2 -import clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" +import clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" // Conditions and condition Reasons for the CK8sControlPlane object. diff --git a/controlplane/api/v1beta2/doc.go b/controlplane/api/v1beta2/doc.go index 0185ee3f..238de720 100644 --- a/controlplane/api/v1beta2/doc.go +++ b/controlplane/api/v1beta2/doc.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package v1beta2 contains API Schema definitions for the controlplane v1beta2 API group +// Package v1beta1 contains API Schema definitions for the controlplane v1beta1 API group // +kubebuilder:object:generate=true // +groupName=controlplane.cluster.x-k8s.io // +k8s:defaulter-gen=TypeMeta diff --git a/controlplane/api/v1beta2/zz_generated.deepcopy.go b/controlplane/api/v1beta2/zz_generated.deepcopy.go index 3b1f57a3..6da2111e 100644 --- a/controlplane/api/v1beta2/zz_generated.deepcopy.go +++ b/controlplane/api/v1beta2/zz_generated.deepcopy.go @@ -24,7 +24,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" - "sigs.k8s.io/cluster-api/api/core/v1beta2" + "sigs.k8s.io/cluster-api/api/v1beta1" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -169,7 +169,7 @@ func (in *CK8sControlPlaneStatus) DeepCopyInto(out *CK8sControlPlaneStatus) { } if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions - *out = make(v1beta2.Conditions, len(*in)) + *out = make(v1beta1.Conditions, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/controlplane/config/crd/kustomization.yaml b/controlplane/config/crd/kustomization.yaml index ddfcbd01..e54655b0 100644 --- a/controlplane/config/crd/kustomization.yaml +++ b/controlplane/config/crd/kustomization.yaml @@ -1,5 +1,5 @@ commonLabels: - cluster.x-k8s.io/v1beta2: v1beta2_v1beta2 + cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 clusterctl.cluster.x-k8s.io: "" # This kustomization.yaml is not intended to be run by itself, diff --git a/controlplane/config/crd/patches/webhook_in_ck8scontrolplanes.yaml b/controlplane/config/crd/patches/webhook_in_ck8scontrolplanes.yaml index fef030d8..d9eae660 100644 --- a/controlplane/config/crd/patches/webhook_in_ck8scontrolplanes.yaml +++ b/controlplane/config/crd/patches/webhook_in_ck8scontrolplanes.yaml @@ -13,5 +13,5 @@ spec: name: webhook-service path: /convert conversionReviewVersions: - - v1beta2 + - v1beta1 - v1beta2 diff --git a/controlplane/config/manager/kustomization.yaml b/controlplane/config/manager/kustomization.yaml index 4b24deab..be27d956 100644 --- a/controlplane/config/manager/kustomization.yaml +++ b/controlplane/config/manager/kustomization.yaml @@ -1,8 +1,7 @@ resources: - manager.yaml -apiVersion: kustomize.config.k8s.io/v1beta2 +apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - name: controller - newName: tinkerbell.azurecr.io/canonical/cluster-api-k8s/controlplane-controller - newTag: pr-226 + newName: ghcr.io/canonical/cluster-api-k8s/controlplane-controller diff --git a/controlplane/config/webhook/manifests.yaml b/controlplane/config/webhook/manifests.yaml index a0b90fdc..57ab5a41 100644 --- a/controlplane/config/webhook/manifests.yaml +++ b/controlplane/config/webhook/manifests.yaml @@ -6,7 +6,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta2 + - v1beta1 clientConfig: service: name: webhook-service @@ -34,7 +34,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta2 + - v1beta1 clientConfig: service: name: webhook-service diff --git a/controlplane/controllers/ck8scontrolplane_controller.go b/controlplane/controllers/ck8scontrolplane_controller.go index 23e5b987..4d3e547d 100644 --- a/controlplane/controllers/ck8scontrolplane_controller.go +++ b/controlplane/controllers/ck8scontrolplane_controller.go @@ -30,7 +30,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" kerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/client-go/tools/record" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/controllers/external" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/annotations" diff --git a/controlplane/controllers/machine_controller.go b/controlplane/controllers/machine_controller.go index 1a6c31de..f0121699 100644 --- a/controlplane/controllers/machine_controller.go +++ b/controlplane/controllers/machine_controller.go @@ -8,7 +8,7 @@ import ( "github.com/go-logr/logr" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/util/annotations" "sigs.k8s.io/cluster-api/util/conditions" "sigs.k8s.io/cluster-api/util/patch" diff --git a/controlplane/controllers/orchestrated_inplace_upgrade_controller.go b/controlplane/controllers/orchestrated_inplace_upgrade_controller.go index e88ea166..3b04d09f 100644 --- a/controlplane/controllers/orchestrated_inplace_upgrade_controller.go +++ b/controlplane/controllers/orchestrated_inplace_upgrade_controller.go @@ -10,7 +10,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/record" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/collections" "sigs.k8s.io/cluster-api/util/patch" diff --git a/controlplane/controllers/remediation.go b/controlplane/controllers/remediation.go index 16ae720e..c7062948 100644 --- a/controlplane/controllers/remediation.go +++ b/controlplane/controllers/remediation.go @@ -26,7 +26,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/klog/v2" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/annotations" "sigs.k8s.io/cluster-api/util/collections" diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index b5f37c74..2ea0ef8c 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -30,7 +30,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" kerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apiserver/pkg/storage/names" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/controllers/external" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/collections" diff --git a/controlplane/main.go b/controlplane/main.go index a1a17129..bc2caadf 100644 --- a/controlplane/main.go +++ b/controlplane/main.go @@ -25,8 +25,8 @@ import ( clientgoscheme "k8s.io/client-go/kubernetes/scheme" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" "k8s.io/utils/ptr" - clusterv1beta2 "sigs.k8s.io/cluster-api/api/v1beta2" - expv1beta2 "sigs.k8s.io/cluster-api/exp/api/v1beta2" + clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" + expv1beta1 "sigs.k8s.io/cluster-api/exp/api/v1beta1" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/config" @@ -46,8 +46,8 @@ var ( func init() { _ = clientgoscheme.AddToScheme(scheme) - _ = clusterv1beta2.AddToScheme(scheme) - _ = expv1beta2.AddToScheme(scheme) + _ = clusterv1beta1.AddToScheme(scheme) + _ = expv1beta1.AddToScheme(scheme) _ = bootstrapv1.AddToScheme(scheme) _ = controlplanev1.AddToScheme(scheme) diff --git a/controlplane/metadata.yaml b/controlplane/metadata.yaml index d45a1ef2..2a2b09be 100644 --- a/controlplane/metadata.yaml +++ b/controlplane/metadata.yaml @@ -7,4 +7,4 @@ apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 releaseSeries: - major: 0 minor: 1 - contract: v1beta2 + contract: v1beta1 diff --git a/go.mod b/go.mod index 3400be5c..5ece287f 100644 --- a/go.mod +++ b/go.mod @@ -1,66 +1,56 @@ module github.com/canonical/cluster-api-k8s -go 1.26.0 +go 1.24.0 require ( - github.com/canonical/k8s-snap-api v1.2.1 + github.com/canonical/k8s-snap-api v1.1.0 github.com/go-logr/logr v1.4.3 github.com/google/uuid v1.6.0 github.com/onsi/ginkgo v1.16.5 - github.com/onsi/ginkgo/v2 v2.28.1 - github.com/onsi/gomega v1.39.1 - google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af + github.com/onsi/ginkgo/v2 v2.22.1 + github.com/onsi/gomega v1.36.2 + google.golang.org/protobuf v1.36.1 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.36.2 - k8s.io/apimachinery v0.36.2 - k8s.io/apiserver v0.36.2 - k8s.io/client-go v0.36.2 - k8s.io/klog/v2 v2.140.0 - k8s.io/kubernetes v1.36.2 - k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 - sigs.k8s.io/controller-runtime v0.24.1 - sigs.k8s.io/yaml v1.6.0 + k8s.io/api v0.31.3 + k8s.io/apimachinery v0.31.3 + k8s.io/apiserver v0.31.3 + k8s.io/client-go v0.31.3 + k8s.io/klog/v2 v2.130.1 + k8s.io/kubernetes v1.31.3 + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 + sigs.k8s.io/cluster-api v1.9.6 + sigs.k8s.io/cluster-api/test v1.9.6 + sigs.k8s.io/controller-runtime v0.19.6 + sigs.k8s.io/yaml v1.4.0 ) require ( - cel.dev/expr v0.25.1 // indirect dario.cat/mergo v1.0.1 // indirect - github.com/NYTimes/gziphandler v1.1.1 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cenkalti/backoff/v5 v5.0.3 // indirect - github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect - github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect - github.com/kylelemons/godebug v1.1.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/x448/float16 v0.8.4 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect - go.opentelemetry.io/otel/sdk v1.43.0 // indirect - go.opentelemetry.io/proto/otlp v1.10.0 // indirect - go.yaml.in/yaml/v2 v2.4.3 // indirect - go.yaml.in/yaml/v3 v3.0.4 // indirect - google.golang.org/grpc v1.80.0 // indirect - gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect - k8s.io/controller-manager v0.36.2 // indirect - k8s.io/streaming v0.36.2 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // indirect - sigs.k8s.io/cluster-api v1.13.2 // indirect - sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect + go.opentelemetry.io/otel/sdk v1.40.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + google.golang.org/grpc v1.65.1 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect ) require ( github.com/BurntSushi/toml v1.4.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver/v3 v3.4.0 // indirect + github.com/Masterminds/semver/v3 v3.3.0 // indirect github.com/Masterminds/sprig/v3 v3.3.0 // indirect - github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/Microsoft/go-winio v0.6.0 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/adrg/xdg v0.5.3 // indirect github.com/alessio/shellescape v1.4.2 // indirect @@ -72,29 +62,29 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/docker v27.3.1+incompatible // indirect - github.com/docker/go-connections v0.7.0 // indirect + github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 // indirect - github.com/emicklei/go-restful/v3 v3.13.0 // indirect - github.com/evanphx/json-patch/v5 v5.9.11 // indirect + github.com/emicklei/go-restful/v3 v3.12.1 // indirect + github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gobuffalo/flect v1.0.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/cel-go v0.26.0 // indirect - github.com/google/gnostic-models v0.7.0 // indirect + github.com/google/cel-go v0.20.1 // indirect + github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-github/v53 v53.2.0 // indirect - github.com/google/go-querystring v1.2.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.5.0 // indirect @@ -108,62 +98,62 @@ require ( github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/moby/spdystream v0.5.1 // indirect + github.com/moby/spdystream v0.4.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.1 // indirect + github.com/opencontainers/image-spec v1.0.2 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.23.2 // indirect - github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.67.5 // indirect - github.com/prometheus/procfs v0.19.2 // indirect - github.com/sagikazarmark/locafero v0.11.0 // indirect + github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect - github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect - github.com/spf13/afero v1.15.0 // indirect - github.com/spf13/cast v1.10.0 // indirect - github.com/spf13/cobra v1.10.2 // indirect - github.com/spf13/pflag v1.0.10 // indirect - github.com/spf13/viper v1.21.0 // indirect - github.com/stoewer/go-strcase v1.3.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.0 // indirect + github.com/spf13/cobra v1.8.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/stoewer/go-strcase v1.2.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/valyala/fastjson v1.6.10 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 // indirect - go.opentelemetry.io/otel v1.43.0 // indirect - go.opentelemetry.io/otel/metric v1.43.0 // indirect - go.opentelemetry.io/otel/trace v1.43.0 // indirect + github.com/valyala/fastjson v1.6.4 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect + go.opentelemetry.io/otel v1.40.0 // indirect + go.opentelemetry.io/otel/metric v1.40.0 // indirect + go.opentelemetry.io/otel/trace v1.40.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.1 // indirect - golang.org/x/crypto v0.51.0 // indirect - golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect - golang.org/x/mod v0.36.0 - golang.org/x/net v0.54.0 // indirect - golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.21.0 - golang.org/x/sys v0.44.0 // indirect - golang.org/x/term v0.43.0 // indirect - golang.org/x/text v0.38.0 // indirect - golang.org/x/time v0.14.0 // indirect - golang.org/x/tools v0.45.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect + golang.org/x/mod v0.29.0 + golang.org/x/net v0.47.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sync v0.18.0 + golang.org/x/sys v0.40.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.38.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v3 v3.0.1 - k8s.io/apiextensions-apiserver v0.36.2 // indirect - k8s.io/cluster-bootstrap v0.36.2 // indirect - k8s.io/component-base v0.36.2 // indirect - k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect - sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect - sigs.k8s.io/kind v0.31.0 // indirect + k8s.io/apiextensions-apiserver v0.31.3 // indirect + k8s.io/cluster-bootstrap v0.31.3 // indirect + k8s.io/component-base v0.31.3 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/kind v0.25.0 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) diff --git a/go.sum b/go.sum index 2509d5d8..31a4ee7d 100644 --- a/go.sum +++ b/go.sum @@ -1,63 +1,88 @@ -cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= -cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= -github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= +github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= +github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= +github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= +github.com/alessio/shellescape v1.4.2 h1:MHPfaU+ddJ0/bYWpgIeUnQUqKrlJ1S7BfEYPM4uEoM0= github.com/alessio/shellescape v1.4.2/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/canonical/k8s-snap-api v1.1.0 h1:RME41bv1t8TY4IIEoVs8JOqJO5C9UW+CC/TEPvWKXnA= github.com/canonical/k8s-snap-api v1.1.0/go.mod h1:kdXBgGo5TF93NJYHfa1bfKIzEIgE1oQriFHcVoVQUX8= -github.com/canonical/k8s-snap-api v1.2.1 h1:2npKrobpumH+JpJsdzUa72HRGfWSaC8D1ZUvEgXnBn8= -github.com/canonical/k8s-snap-api v1.2.1/go.mod h1:AKPg4cCH8qPUkuojVHBpmX5z+Mc9WuyEJ8fgpKymMCI= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= -github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= +github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= -github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0= +github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= +github.com/coredns/corefile-migration v1.0.25 h1:/XexFhM8FFlFLTS/zKNEWgIZ8Gl5GaWrHsMarGj/PRQ= +github.com/coredns/corefile-migration v1.0.25/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= +github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= +github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.7.0/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 h1:7QPwrLT79GlD5sizHf27aoY2RTvw62mO6x7mxkScNk0= github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46/go.mod h1:esf2rsHFNlZlxsqsZDojNBcnNs5REqIvRrWRHqX0vEU= -github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= -github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= -github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= +github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= +github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= +github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= -github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= -github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -65,19 +90,21 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4= github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= @@ -86,35 +113,45 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI= -github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= -github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= -github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= +github.com/google/cel-go v0.20.1 h1:nDx9r8S3L4pE61eDdt8igGj8rf5kjYR3ILxWIpWNi84= +github.com/google/cel-go v0.20.1/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-github/v53 v53.2.0 h1:wvz3FyF53v4BK+AsnvCmeNhf8AkTaeh2SoYu/XUvTtI= github.com/google/go-github/v53 v53.2.0/go.mod h1:XhFRObz+m/l+UCm9b7KSIC3lT3NWSXGt7mOsAWEloao= -github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 h1:SJ+NtwL6QaZ21U+IrK7d0gGgpjGGvd2kz+FzTHVzdqI= github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2/go.mod h1:Tv1PlzqC9t8wNnpPdctvtSUOPUUg4SHeE6vR1Ir2hmg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= -github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -125,78 +162,100 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= -github.com/moby/spdystream v0.5.1 h1:9sNYeYZUcci9R6/w7KDaFWEWeV4LStVG78Mpyq/Zm/Y= -github.com/moby/spdystream v0.5.1/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8= +github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= -github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.28.1/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE= +github.com/onsi/ginkgo/v2 v2.22.1 h1:QW7tbJAUDyVDVOM5dFa7qaybo+CRfR7bemlQUN6Z8aM= +github.com/onsi/ginkgo/v2 v2.22.1/go.mod h1:S6aTpoRsSq2cZOd+pssHAlKW/Q/jZt6cPrPlnj4a1xM= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= -github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= -github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= -github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= -github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= -github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= -github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= -github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= -github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= +github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= +github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= -github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= -github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= -github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= -github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= -github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= -github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= -github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= -github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= -github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= -github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -206,53 +265,66 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/valyala/fastjson v1.6.10 h1:/yjJg8jaVQdYR3arGxPE2X5z89xrlhS0eGXdv+ADTh4= -github.com/valyala/fastjson v1.6.10/go.mod h1:e6FubmQouUNP73jtMLmcbxS6ydWIpOfhz34TSfO3JaE= +github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= +github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.etcd.io/etcd/api/v3 v3.5.17 h1:cQB8eb8bxwuxOilBpMJAEo8fAONyrdXTHUNcMd8yT1w= +go.etcd.io/etcd/api/v3 v3.5.17/go.mod h1:d1hvkRuXkts6PmaYk2Vrgqbv7H4ADfAKhyJqHNLJCB4= +go.etcd.io/etcd/client/pkg/v3 v3.5.17 h1:XxnDXAWq2pnxqx76ljWwiQ9jylbpC4rvkAeRVOUKKVw= +go.etcd.io/etcd/client/pkg/v3 v3.5.17/go.mod h1:4DqK1TKacp/86nJk4FLQqo6Mn2vvQFBmruW3pP14H/w= +go.etcd.io/etcd/client/v3 v3.5.17 h1:o48sINNeWz5+pjy/Z0+HKpj/xSnBkuVhVvXkjEXbqZY= +go.etcd.io/etcd/client/v3 v3.5.17/go.mod h1:j2d4eXTHWkT2ClBgnnEPm/Wuu7jsqku41v9DZ3OtjQo= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= -go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= -go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= -go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= +go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= +go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0 h1:FyjCyI9jVEfqhUh2MoSkmolPjfh5fp2hnV0b0irxH4Q= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0/go.mod h1:hYwym2nDEeZfG/motx0p7L7J1N1vyzIThemQsb4g2qY= +go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= +go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= +go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= +go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= +go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= +go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= +go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= +go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= -go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= -go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= -go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= -go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= -golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= -golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= -golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= -golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -260,20 +332,16 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= -golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= -golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= -golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= -golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= -golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -287,60 +355,55 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= -golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= -golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= -golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= -golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= -golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= -golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= -golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= -golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= -golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= -golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= -golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= -gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA= -google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:m8qni9SQFH0tJc1X0vmnpw/0t+AImlSvp30sEupozUg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= -google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= +google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/grpc v1.65.1 h1:toSN4j5/Xju+HVovfaY5g1YZVuJeHzQZhP8eJ0L0f1I= +google.golang.org/grpc v1.65.1/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= -google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= -google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= -gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -352,70 +415,43 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.35.4/go.mod h1:yl4lqySWOgYJJf9RERXKUwE9g2y+CkuwG+xmcOK8wXU= -k8s.io/api v0.36.0 h1:SgqDhZzHdOtMk40xVSvCXkP9ME0H05hPM3p9AB1kL80= -k8s.io/api v0.36.0/go.mod h1:m1LVrGPNYax5NBHdO+QuAedXyuzTt4RryI/qnmNvs34= -k8s.io/api v0.36.2 h1:TF6YDLIzKfccK7cq9YpTcGX8TJmEkHVRv78DM51fRYY= -k8s.io/api v0.36.2/go.mod h1:F4LbMO4brjZYh7yFkXWhynSvtB7YauxV4c+HHkNRGNg= -k8s.io/apiextensions-apiserver v0.35.4/go.mod h1:ogQlk+stIE8mnoRthSYCwlOS12fVqgWFiErMwPaXA7c= -k8s.io/apiextensions-apiserver v0.36.0 h1:Wt7E8J+VBCbj4FjiBfDTK/neXDDjyJVJc7xfuOHImZ0= -k8s.io/apiextensions-apiserver v0.36.0/go.mod h1:kGDjH0msuiIB3tgsYRV0kS9GqpMYMUsQ3GHv7TApyug= -k8s.io/apiextensions-apiserver v0.36.2 h1:3O5gqOj/dt2XWWbpMe+TXWpE9yU6pjM/tXxtHHJT/K4= -k8s.io/apiextensions-apiserver v0.36.2/go.mod h1:cL1tBWe8XSaP1H30iWKGo7hf6iAUUUJPEU70dskmAnA= -k8s.io/apimachinery v0.35.4/go.mod h1:NNi1taPOpep0jOj+oRha3mBJPqvi0hGdaV8TCqGQ+cc= -k8s.io/apimachinery v0.36.0 h1:jZyPzhd5Z+3h9vJLt0z9XdzW9VzNzWAUw+P1xZ9PXtQ= -k8s.io/apimachinery v0.36.0/go.mod h1:FklypaRJt6n5wUIwWXIP6GJlIpUizTgfo1T/As+Tyxc= -k8s.io/apimachinery v0.36.2 h1:0PE/W/WNy1UX61NLbXY5TMbJ6UwLL6E6lAPkYrKFxbQ= -k8s.io/apimachinery v0.36.2/go.mod h1:fvf/HOLXq9RId0rnDIbN1OEBvHXdQbLMM8nu0LcBUf4= -k8s.io/apiserver v0.35.4/go.mod h1:JnBcb+J8kFXKpZkgcbcUnPBBHi4qgBii1I7dLxFY/oo= -k8s.io/apiserver v0.36.0/go.mod h1:mHvwdHf+qKEm+1/hYm756SV+oREOKSPnsjagOpx6Vho= -k8s.io/apiserver v0.36.2 h1:6vMnkmHZPeBloNkHUhmZYq7Ylv8WIB8xjyEl+eSt26E= -k8s.io/apiserver v0.36.2/go.mod h1:9PoQ2ikCytrZyZg11mGhLEF5m8Rgsb5FJmYJ4Wvnl1k= -k8s.io/client-go v0.35.4/go.mod h1:2Pg9WpsS4NeOpoYTfHHfMxBG8zFMSAUi4O/qoiJC3nY= -k8s.io/client-go v0.36.0 h1:pOYi7C4RHChYjMiHpZSpSbIM6ZxVbRXBy7CuiIwqA3c= -k8s.io/client-go v0.36.0/go.mod h1:ZKKcpwF0aLYfkHFCjillCKaTK/yBkEDHTDXCFY6AS9Y= -k8s.io/client-go v0.36.2 h1:bfgxmFKc9CgqsgX4xKLAAdmTQlWee7Ob/HlDOrJ5TBI= -k8s.io/client-go v0.36.2/go.mod h1:1vgO4OAlfPnoLcb+Rze2GF5rAr14w8qjrYMoyXJzQj0= -k8s.io/cluster-bootstrap v0.35.4 h1:XAOSQ+4dvUPdksaVHp/C9rq0XlFmF3UHkx4KGgNgaU4= -k8s.io/cluster-bootstrap v0.35.4/go.mod h1:9tlzRvPEjXAhKV2cok7pJLnMjiRgKZdT9IR3iJzksek= -k8s.io/cluster-bootstrap v0.36.2 h1:WUn8sOrJ5Vu0yHyEM3QT72Ut7SzCk4bd8losb9EN9DA= -k8s.io/cluster-bootstrap v0.36.2/go.mod h1:X1XIuZE+SLEz9ZCzcmuUoSkwBJvWQ3X+fTJw08MS5Ic= -k8s.io/component-base v0.35.4/go.mod h1:qaDJgz5c1KYKla9occFmlJEfPpkuA55s90G509R+PeY= -k8s.io/component-base v0.36.0 h1:hFjEktssxiJhrK1zfybkH4kJOi8iZuF+mIDCqS5+jRo= -k8s.io/component-base v0.36.0/go.mod h1:JZvIfcNHk+uck+8LhJzhSBtydWXaZNQwX2OdL+Mnwsk= -k8s.io/component-base v0.36.2 h1:Z0VH80O7Ng0HDZnZj3WRR3urEGa0kTwmO8CwEwjVK1w= -k8s.io/component-base v0.36.2/go.mod h1:mGfFOA7Gwpdm1VW2cwSQYbiDIlz8GD2WGwH88QSeCyA= -k8s.io/controller-manager v0.36.2 h1:uQrvXNDPsjDy3q7cECuFufUfmWhjQQccvVoUGLXcQPw= -k8s.io/controller-manager v0.36.2/go.mod h1:VGcOtE1E71vmt3tDIAdG/rQxzwNb6YE5us+paWyZtOQ= +gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= +gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= +k8s.io/apiextensions-apiserver v0.31.3 h1:+GFGj2qFiU7rGCsA5o+p/rul1OQIq6oYpQw4+u+nciE= +k8s.io/apiextensions-apiserver v0.31.3/go.mod h1:2DSpFhUZZJmn/cr/RweH1cEVVbzFw9YBu4T+U3mf1e4= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/apiserver v0.31.3 h1:+1oHTtCB+OheqFEz375D0IlzHZ5VeQKX1KGXnx+TTuY= +k8s.io/apiserver v0.31.3/go.mod h1:PrxVbebxrxQPFhJk4powDISIROkNMKHibTg9lTRQ0Qg= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= +k8s.io/cluster-bootstrap v0.31.3 h1:O1Yxk1bLaxZvmQCXLaJjj5iJD+lVMfJdRUuKgbUHPlA= +k8s.io/cluster-bootstrap v0.31.3/go.mod h1:TI6TCsQQB4FfcryWgNO3SLXSKWBqHjx4DfyqSFwixj8= +k8s.io/component-base v0.31.3 h1:DMCXXVx546Rfvhj+3cOm2EUxhS+EyztH423j+8sOwhQ= +k8s.io/component-base v0.31.3/go.mod h1:xME6BHfUOafRgT0rGVBGl7TuSg8Z9/deT7qq6w7qjIU= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= -k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= -k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= -k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= -k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/kubernetes v1.31.3 h1:oqb7HdfnTelrGlZ6ziNugvQ/L/aJWR704114EAhUn9Q= k8s.io/kubernetes v1.31.3/go.mod h1:9xmT2buyTYj8TRKwRae7FcuY8k5+xlxv7VivvO0KKfs= -k8s.io/kubernetes v1.36.2 h1:qsCug7E1dMVO+rNuCENKG64Z7SVS/fTqDHGI1/NCmTg= -k8s.io/kubernetes v1.36.2/go.mod h1:MLdeJ3qw2CWH9BFml5GvptxQVQckz54fJOZ/WuixpFE= -k8s.io/streaming v0.36.2 h1:NSKthPPg9UFSKsRauVJUVGH2Dvn8fhKmY4qrMkw/p98= -k8s.io/streaming v0.36.2/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= -k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/cluster-api v1.13.2 h1:NVdbVLmh6IyfdtENQAi80AijJf/FjfQLODz/6caDjlc= -sigs.k8s.io/cluster-api v1.13.2/go.mod h1:h7cyiUh+N7sIBkSerqU8cDkYMtRlXVO1c5RoJE1p5+g= -sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0= -sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4= -sigs.k8s.io/controller-runtime v0.24.1/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw= -sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= -sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/kind v0.31.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8= -sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= -sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +sigs.k8s.io/cluster-api v1.9.6 h1:2jZ434qC0bzrPQzmRDm4/b0PZWVMnOocoCjsAonQN5Q= +sigs.k8s.io/cluster-api v1.9.6/go.mod h1:DyqyZ4jRvKGKewDRn1Q4OCHaVjsdTogymbO6mrgHEDI= +sigs.k8s.io/cluster-api/test v1.9.6 h1:bnplAOqKRBFWP2q2L8kbY2DZTLBY8JTpucnGSLgS/Kw= +sigs.k8s.io/cluster-api/test v1.9.6/go.mod h1:YL2wANe8TFWFBka9CDkxjPj7KALqUtK+PtKa4ChNIok= +sigs.k8s.io/controller-runtime v0.19.6 h1:fuq53qTLQ7aJTA7aNsklNnu7eQtSFqJUomOyM+phPLk= +sigs.k8s.io/controller-runtime v0.19.6/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kind v0.25.0 h1:ugUvgesHKKA0yKmD6QtYTiEev+kPUpGxdTPbMGf8VTU= +sigs.k8s.io/kind v0.25.0/go.mod h1:t7ueEpzPYJvHA8aeLtI52rtFftNgUYUaCwvxjk7phfw= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo= -sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= -sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= -sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/out/bootstrap-components.yaml b/out/bootstrap-components.yaml index 198ba72f..c937830c 100644 --- a/out/bootstrap-components.yaml +++ b/out/bootstrap-components.yaml @@ -14,7 +14,7 @@ metadata: controller-gen.kubebuilder.io/version: v0.16.1 labels: cluster.x-k8s.io/provider: bootstrap-ck8s - cluster.x-k8s.io/v1beta2: v1beta2_v1beta2 + cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 clusterctl.cluster.x-k8s.io: "" name: ck8sconfigs.bootstrap.cluster.x-k8s.io spec: @@ -27,7 +27,7 @@ spec: namespace: cabpck-system path: /convert conversionReviewVersions: - - v1beta2 + - v1beta1 - v1beta2 group: bootstrap.cluster.x-k8s.io names: @@ -450,7 +450,7 @@ metadata: controller-gen.kubebuilder.io/version: v0.16.1 labels: cluster.x-k8s.io/provider: bootstrap-ck8s - cluster.x-k8s.io/v1beta2: v1beta2_v1beta2 + cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 clusterctl.cluster.x-k8s.io: "" name: ck8sconfigtemplates.bootstrap.cluster.x-k8s.io spec: @@ -463,7 +463,7 @@ spec: namespace: cabpck-system path: /convert conversionReviewVersions: - - v1beta2 + - v1beta1 - v1beta2 group: bootstrap.cluster.x-k8s.io names: @@ -1146,7 +1146,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta2 + - v1beta1 clientConfig: service: name: cabpck-bootstrap-webhook-service @@ -1168,7 +1168,7 @@ webhooks: sideEffects: None - admissionReviewVersions: - v1 - - v1beta2 + - v1beta1 clientConfig: service: name: cabpck-bootstrap-webhook-service @@ -1200,7 +1200,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta2 + - v1beta1 clientConfig: service: name: cabpck-bootstrap-webhook-service @@ -1222,7 +1222,7 @@ webhooks: sideEffects: None - admissionReviewVersions: - v1 - - v1beta2 + - v1beta1 clientConfig: service: name: cabpck-bootstrap-webhook-service diff --git a/out/control-plane-components.yaml b/out/control-plane-components.yaml index 63cc88de..8ce738a7 100644 --- a/out/control-plane-components.yaml +++ b/out/control-plane-components.yaml @@ -14,7 +14,7 @@ metadata: controller-gen.kubebuilder.io/version: v0.16.1 labels: cluster.x-k8s.io/provider: control-plane-ck8s - cluster.x-k8s.io/v1beta2: v1beta2_v1beta2 + cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 clusterctl.cluster.x-k8s.io: "" name: ck8scontrolplanes.controlplane.cluster.x-k8s.io spec: @@ -27,7 +27,7 @@ spec: namespace: cacpck-system path: /convert conversionReviewVersions: - - v1beta2 + - v1beta1 - v1beta2 group: controlplane.cluster.x-k8s.io names: @@ -744,7 +744,7 @@ metadata: controller-gen.kubebuilder.io/version: v0.16.1 labels: cluster.x-k8s.io/provider: control-plane-ck8s - cluster.x-k8s.io/v1beta2: v1beta2_v1beta2 + cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 clusterctl.cluster.x-k8s.io: "" name: ck8scontrolplanetemplates.controlplane.cluster.x-k8s.io spec: @@ -1628,7 +1628,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta2 + - v1beta1 clientConfig: service: name: cacpck-webhook-service @@ -1660,7 +1660,7 @@ metadata: webhooks: - admissionReviewVersions: - v1 - - v1beta2 + - v1beta1 clientConfig: service: name: cacpck-webhook-service diff --git a/out/metadata.yaml b/out/metadata.yaml index 1c9e26bc..26e9c4b6 100644 --- a/out/metadata.yaml +++ b/out/metadata.yaml @@ -3,19 +3,19 @@ kind: Metadata releaseSeries: - major: 0 minor: 1 - contract: v1beta2 + contract: v1beta1 - major: 0 minor: 2 - contract: v1beta2 + contract: v1beta1 - major: 0 minor: 3 - contract: v1beta2 + contract: v1beta1 - major: 0 minor: 4 - contract: v1beta2 + contract: v1beta1 - major: 0 minor: 5 - contract: v1beta2 + contract: v1beta1 - major: 0 minor: 6 - contract: v1beta2 + contract: v1beta1 diff --git a/pkg/ck8s/config_init.go b/pkg/ck8s/config_init.go index 13975187..de11a724 100644 --- a/pkg/ck8s/config_init.go +++ b/pkg/ck8s/config_init.go @@ -6,7 +6,7 @@ import ( apiv1 "github.com/canonical/k8s-snap-api/api/v1" "k8s.io/utils/ptr" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" "github.com/canonical/cluster-api-k8s/pkg/secret" diff --git a/pkg/ck8s/control_plane.go b/pkg/ck8s/control_plane.go index c797e6de..8cb4568b 100644 --- a/pkg/ck8s/control_plane.go +++ b/pkg/ck8s/control_plane.go @@ -27,7 +27,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" kerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apiserver/pkg/storage/names" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/controllers/external" "sigs.k8s.io/cluster-api/util/collections" "sigs.k8s.io/cluster-api/util/failuredomains" diff --git a/pkg/ck8s/management_cluster.go b/pkg/ck8s/management_cluster.go index 68726a18..619f747b 100644 --- a/pkg/ck8s/management_cluster.go +++ b/pkg/ck8s/management_cluster.go @@ -6,7 +6,7 @@ import ( "time" "k8s.io/client-go/kubernetes/scheme" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/controllers/remote" "sigs.k8s.io/cluster-api/util/collections" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/pkg/ck8s/workload_cluster.go b/pkg/ck8s/workload_cluster.go index f1a20e92..538b4099 100644 --- a/pkg/ck8s/workload_cluster.go +++ b/pkg/ck8s/workload_cluster.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/rest" podv1 "k8s.io/kubernetes/pkg/api/v1/pod" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/collections" "sigs.k8s.io/cluster-api/util/conditions" diff --git a/pkg/kubeconfig/kubeconfig.go b/pkg/kubeconfig/kubeconfig.go index e7865981..fb5e6d8b 100644 --- a/pkg/kubeconfig/kubeconfig.go +++ b/pkg/kubeconfig/kubeconfig.go @@ -12,7 +12,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd/api" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/certs" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/pkg/locking/control_plane_init_mutex.go b/pkg/locking/control_plane_init_mutex.go index 18691400..7bc607ca 100644 --- a/pkg/locking/control_plane_init_mutex.go +++ b/pkg/locking/control_plane_init_mutex.go @@ -26,7 +26,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/klog/v2" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" ) diff --git a/pkg/machinefilters/machine_filters.go b/pkg/machinefilters/machine_filters.go index 190dfaa6..de64844e 100644 --- a/pkg/machinefilters/machine_filters.go +++ b/pkg/machinefilters/machine_filters.go @@ -21,7 +21,7 @@ import ( "strings" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/util/collections" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" @@ -76,10 +76,10 @@ func MatchesKubernetesVersion(kubernetesVersion string) Func { if machine == nil { return false } - if machine.Spec.Version == "" { + if machine.Spec.Version == nil { return false } - return strings.TrimPrefix(machine.Spec.Version, "v") == strings.TrimPrefix(kubernetesVersion, "v") + return strings.TrimPrefix(*machine.Spec.Version, "v") == strings.TrimPrefix(kubernetesVersion, "v") } } @@ -91,7 +91,7 @@ func MatchesCK8sBootstrapConfig(machineConfigs map[string]*bootstrapv1.CK8sConfi } bootstrapRef := machine.Spec.Bootstrap.ConfigRef - if !bootstrapRef.IsDefined() { + if bootstrapRef == nil { // Missing bootstrap reference should not be considered as unmatching. // This is a safety precaution to avoid selecting machines that are broken, which in the future should be remediated separately. return true diff --git a/pkg/machinefilters/machine_filters_test.go b/pkg/machinefilters/machine_filters_test.go index e85c6432..ae78e751 100644 --- a/pkg/machinefilters/machine_filters_test.go +++ b/pkg/machinefilters/machine_filters_test.go @@ -8,7 +8,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/utils/ptr" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" controlplanev1 "github.com/canonical/cluster-api-k8s/controlplane/api/v1beta2" diff --git a/pkg/secret/certificates.go b/pkg/secret/certificates.go index f927469d..37219729 100644 --- a/pkg/secret/certificates.go +++ b/pkg/secret/certificates.go @@ -34,7 +34,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/util/cert" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/util/certs" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/pkg/token/token.go b/pkg/token/token.go index bdf8880e..93cf4072 100644 --- a/pkg/token/token.go +++ b/pkg/token/token.go @@ -9,7 +9,7 @@ import ( corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) diff --git a/pkg/token/token_test.go b/pkg/token/token_test.go index 23782119..24331337 100644 --- a/pkg/token/token_test.go +++ b/pkg/token/token_test.go @@ -11,7 +11,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes/scheme" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" diff --git a/pkg/upgrade/inplace/inplace.go b/pkg/upgrade/inplace/inplace.go index 95b90092..e40ced90 100644 --- a/pkg/upgrade/inplace/inplace.go +++ b/pkg/upgrade/inplace/inplace.go @@ -1,7 +1,7 @@ package inplace import ( - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/controller-runtime/pkg/client" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" diff --git a/pkg/upgrade/inplace/inplace_test.go b/pkg/upgrade/inplace/inplace_test.go index a9f72f5b..25d63fe2 100644 --- a/pkg/upgrade/inplace/inplace_test.go +++ b/pkg/upgrade/inplace/inplace_test.go @@ -6,7 +6,7 @@ import ( . "github.com/onsi/gomega" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" controlplanev1 "github.com/canonical/cluster-api-k8s/controlplane/api/v1beta2" diff --git a/pkg/upgrade/inplace/lock.go b/pkg/upgrade/inplace/lock.go index d1522afd..eb4bd499 100644 --- a/pkg/upgrade/inplace/lock.go +++ b/pkg/upgrade/inplace/lock.go @@ -9,7 +9,7 @@ import ( corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/controller-runtime/pkg/client" ) diff --git a/pkg/upgrade/inplace/lock_test.go b/pkg/upgrade/inplace/lock_test.go index 5bcb89da..5ec47a73 100644 --- a/pkg/upgrade/inplace/lock_test.go +++ b/pkg/upgrade/inplace/lock_test.go @@ -12,7 +12,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" ) diff --git a/pkg/upgrade/inplace/mark.go b/pkg/upgrade/inplace/mark.go index 41f17bb3..c6281b0a 100644 --- a/pkg/upgrade/inplace/mark.go +++ b/pkg/upgrade/inplace/mark.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/pkg/upgrade/inplace/mark_test.go b/pkg/upgrade/inplace/mark_test.go index d2e38184..f8ce5f9f 100644 --- a/pkg/upgrade/inplace/mark_test.go +++ b/pkg/upgrade/inplace/mark_test.go @@ -7,7 +7,7 @@ import ( . "github.com/onsi/gomega" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/client/fake" diff --git a/templates/aws/cluster-template.yaml b/templates/aws/cluster-template.yaml index e3308564..381ad798 100644 --- a/templates/aws/cluster-template.yaml +++ b/templates/aws/cluster-template.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -73,7 +73,7 @@ spec: rootVolume: size: ${AWS_CONTROL_PLANE_ROOT_VOLUME_SIZE} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-worker-md-0 @@ -122,7 +122,7 @@ spec: spec: nodeName: "{{ ds.meta_data.local_hostname }}" --- -apiVersion: addons.cluster.x-k8s.io/v1beta2 +apiVersion: addons.cluster.x-k8s.io/v1beta1 kind: ClusterResourceSet metadata: name: crs-ccm diff --git a/templates/docker/cluster-template-dualstack.yaml b/templates/docker/cluster-template-dualstack.yaml index b635e56f..4e424fc9 100644 --- a/templates/docker/cluster-template-dualstack.yaml +++ b/templates/docker/cluster-template-dualstack.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -18,11 +18,11 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster name: ${CLUSTER_NAME} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -36,7 +36,7 @@ metadata: spec: machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane namespace: default @@ -48,7 +48,7 @@ spec: replicas: ${CONTROL_PLANE_MACHINE_COUNT} version: ${KUBERNETES_VERSION} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane @@ -57,7 +57,7 @@ spec: spec: customImage: ${KIND_IMAGE} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-worker-md-0 @@ -77,11 +77,11 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-0 --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/templates/docker/cluster-template.yaml b/templates/docker/cluster-template.yaml index c376ba52..4a340f67 100644 --- a/templates/docker/cluster-template.yaml +++ b/templates/docker/cluster-template.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -16,11 +16,11 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster name: ${CLUSTER_NAME} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -34,7 +34,7 @@ metadata: spec: machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane namespace: default @@ -46,7 +46,7 @@ spec: replicas: ${CONTROL_PLANE_MACHINE_COUNT} version: ${KUBERNETES_VERSION} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane @@ -55,7 +55,7 @@ spec: spec: customImage: ${KIND_IMAGE} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-worker-md-0 @@ -75,11 +75,11 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-0 --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/templates/lxd/cluster-template.yaml b/templates/lxd/cluster-template.yaml index a2ac8bb4..183eaeb7 100644 --- a/templates/lxd/cluster-template.yaml +++ b/templates/lxd/cluster-template.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -64,7 +64,7 @@ spec: image: name: ${LXC_IMAGE_NAME} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/templates/maas/cluster-template.yaml b/templates/maas/cluster-template.yaml index 6000b6bf..92bbcf5a 100644 --- a/templates/maas/cluster-template.yaml +++ b/templates/maas/cluster-template.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -16,11 +16,11 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: MaasCluster name: ${CLUSTER_NAME} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: MaasCluster metadata: name: ${CLUSTER_NAME} @@ -35,7 +35,7 @@ metadata: spec: machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: MaasMachineTemplate name: ${CLUSTER_NAME}-control-plane replicas: ${CONTROL_PLANE_MACHINE_COUNT} @@ -43,7 +43,7 @@ spec: spec: channel: ${CHANNEL} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: MaasMachineTemplate metadata: name: "${CLUSTER_NAME}-control-plane" @@ -56,7 +56,7 @@ spec: resourcePool: ${CONTROL_PLANE_MACHINE_RESOURCEPOOL:= } tags: [ ${CONTROL_PLANE_MACHINE_TAGS:= } ] --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-worker-md-0 @@ -76,11 +76,11 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: MaasMachineTemplate name: ${CLUSTER_NAME}-md-0 --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: MaasMachineTemplate metadata: name: "${CLUSTER_NAME}-md-0" diff --git a/templates/openstack/cluster-template.yaml b/templates/openstack/cluster-template.yaml index 13971f04..0d414e04 100755 --- a/templates/openstack/cluster-template.yaml +++ b/templates/openstack/cluster-template.yaml @@ -20,13 +20,13 @@ spec: --provider-id: openstack:///{{ instance_id }} machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: OpenStackMachineTemplate name: ${CLUSTER_NAME}-control-plane replicas: ${CONTROL_PLANE_MACHINE_COUNT} version: ${KUBERNETES_VERSION} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: "${CLUSTER_NAME}-md-0" @@ -42,12 +42,12 @@ spec: failureDomain: ${OPENSTACK_FAILURE_DOMAIN} bootstrap: configRef: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta2 + apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: name: "${CLUSTER_NAME}-md-0" - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: OpenStackMachineTemplate --- apiVersion: bootstrap.cluster.x-k8s.io/v1beta2 @@ -62,7 +62,7 @@ spec: extraKubeletArgs: --provider-id: openstack:///{{ instance_id }} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: labels: @@ -81,11 +81,11 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME} infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: OpenStackCluster name: ${CLUSTER_NAME} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: OpenStackCluster metadata: name: ${CLUSTER_NAME} @@ -140,7 +140,7 @@ spec: dnsNameservers: - ${OPENSTACK_DNS_NAMESERVERS} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: OpenStackMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane @@ -153,7 +153,7 @@ spec: name: ${OPENSTACK_IMAGE_NAME} sshKeyName: ${OPENSTACK_SSH_KEY_NAME} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: OpenStackMachineTemplate metadata: name: ${CLUSTER_NAME}-md-0 @@ -430,7 +430,7 @@ stringData: cloud.conf: ${OPENSTACK_CLOUD_CONFIG_B64} type: Opaque --- -apiVersion: addons.cluster.x-k8s.io/v1beta2 +apiVersion: addons.cluster.x-k8s.io/v1beta1 kind: ClusterResourceSet metadata: labels: diff --git a/templates/vsphere/cluster-template.yaml b/templates/vsphere/cluster-template.yaml index cf618785..fc932d77 100644 --- a/templates/vsphere/cluster-template.yaml +++ b/templates/vsphere/cluster-template.yaml @@ -159,7 +159,7 @@ stringData: updateStrategy: {} status: {} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: labels: @@ -178,11 +178,11 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME} infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: VSphereCluster name: ${CLUSTER_NAME} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: VSphereCluster metadata: name: ${CLUSTER_NAME} @@ -196,7 +196,7 @@ spec: server: ${VSPHERE_SERVER} thumbprint: ${VSPHERE_TLS_THUMBPRINT} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: VSphereMachineTemplate metadata: name: ${CLUSTER_NAME} @@ -222,7 +222,7 @@ spec: template: ${VSPHERE_TEMPLATE} thumbprint: ${VSPHERE_TLS_THUMBPRINT} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: VSphereMachineTemplate metadata: name: ${CLUSTER_NAME}-worker @@ -301,7 +301,7 @@ spec: localhost.localdomain localhost4 localhost4.localdomain4" >>/etc/hosts machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: VSphereMachineTemplate name: ${CLUSTER_NAME} replicas: ${CONTROL_PLANE_MACHINE_COUNT} @@ -335,7 +335,7 @@ spec: path: /etc/systemd/system/snap.k8s.containerd.service.d/http-proxy.conf permissions: "0644" --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: labels: @@ -353,17 +353,17 @@ spec: spec: bootstrap: configRef: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta2 + apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 clusterName: ${CLUSTER_NAME} infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: VSphereMachineTemplate name: ${CLUSTER_NAME}-worker version: ${KUBERNETES_VERSION} --- -apiVersion: addons.cluster.x-k8s.io/v1beta2 +apiVersion: addons.cluster.x-k8s.io/v1beta1 kind: ClusterResourceSet metadata: labels: diff --git a/test/e2e/common.go b/test/e2e/common.go index 11722da6..6f3a577e 100644 --- a/test/e2e/common.go +++ b/test/e2e/common.go @@ -30,7 +30,7 @@ import ( . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/test/framework" "sigs.k8s.io/cluster-api/test/framework/clusterctl" "sigs.k8s.io/cluster-api/util" diff --git a/test/e2e/config/ck8s-aws.yaml b/test/e2e/config/ck8s-aws.yaml index c740e830..6f4f81d9 100644 --- a/test/e2e/config/ck8s-aws.yaml +++ b/test/e2e/config/ck8s-aws.yaml @@ -20,9 +20,9 @@ providers: - name: v1.8.4 value: https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.8.4/core-components.yaml type: url - contract: v1beta2 + contract: v1beta1 files: - - sourcePath: "../data/shared/v1beta2/metadata.yaml" + - sourcePath: "../data/shared/v1beta1/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" @@ -34,7 +34,7 @@ providers: type: url contract: v1beta2 files: - - sourcePath: "../data/shared/v1beta2_aws/metadata.yaml" + - sourcePath: "../data/shared/v1beta1_aws/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" @@ -47,7 +47,7 @@ providers: type: url contract: v1beta2 files: - - sourcePath: "../data/shared/v1beta2_aws/metadata.yaml" + - sourcePath: "../data/shared/v1beta1_aws/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" diff --git a/test/e2e/config/ck8s-docker.yaml b/test/e2e/config/ck8s-docker.yaml index b9e620a8..337b3c54 100644 --- a/test/e2e/config/ck8s-docker.yaml +++ b/test/e2e/config/ck8s-docker.yaml @@ -19,25 +19,25 @@ providers: value: https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.9.6/core-components.yaml type: url files: - - sourcePath: "../data/shared/v1beta2/metadata.yaml" + - sourcePath: "../data/shared/v1beta1/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" - name: docker type: InfrastructureProvider versions: - # By default, will use the latest version defined in ../data/shared/v1beta2/metadata.yaml + # By default, will use the latest version defined in ../data/shared/v1beta1/metadata.yaml # to init the management cluster - name: v1.9.6 # used during e2e-test value: https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.9.6/infrastructure-components-development.yaml type: url files: - - sourcePath: "../data/shared/v1beta2/metadata.yaml" + - sourcePath: "../data/shared/v1beta1/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" - # Add v1.11.99 to support tilt (not presented in ../data/shared/v1beta2/metadata.yaml) + # Add v1.11.99 to support tilt (not presented in ../data/shared/v1beta1/metadata.yaml) # when bootstrapping with tilt, it will use # the defaultProviderVersion in https://github.com/kubernetes-sigs/cluster-api/blob/main/hack/tools/internal/tilt-prepare/main.go as # default version for docker infrastructure provider @@ -46,7 +46,7 @@ providers: value: https://github.com/kubernetes-sigs/cluster-api/releases/latest/download/infrastructure-components-development.yaml type: url files: - - sourcePath: "../data/shared/v1beta2/metadata.yaml" + - sourcePath: "../data/shared/v1beta1/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" diff --git a/test/e2e/config/ck8s-incus.yaml b/test/e2e/config/ck8s-incus.yaml index 41a88211..f31a069b 100644 --- a/test/e2e/config/ck8s-incus.yaml +++ b/test/e2e/config/ck8s-incus.yaml @@ -19,7 +19,7 @@ providers: value: https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.9.6/core-components.yaml type: url files: - - sourcePath: "../data/shared/v1beta2/metadata.yaml" + - sourcePath: "../data/shared/v1beta1/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" @@ -31,7 +31,7 @@ providers: value: https://github.com/lxc/cluster-api-provider-incus/releases/download/v0.8.3/infrastructure-components.yaml type: url files: - - sourcePath: "../data/shared/v1beta2_incus/metadata.yaml" + - sourcePath: "../data/shared/v1beta1_incus/metadata.yaml" replacements: - old: "imagePullPolicy: Always" new: "imagePullPolicy: IfNotPresent" diff --git a/test/e2e/data/infrastructure-aws/cluster-template.yaml b/test/e2e/data/infrastructure-aws/cluster-template.yaml index 668a039c..8e609f81 100644 --- a/test/e2e/data/infrastructure-aws/cluster-template.yaml +++ b/test/e2e/data/infrastructure-aws/cluster-template.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -78,7 +78,7 @@ spec: rootVolume: size: ${AWS_CONTROL_PLANE_ROOT_VOLUME_SIZE} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-worker-md-0 @@ -128,7 +128,7 @@ spec: nodeName: "{{ ds.meta_data.local_hostname }}" channel: "${KUBERNETES_VERSION}-classic/edge" --- -apiVersion: addons.cluster.x-k8s.io/v1beta2 +apiVersion: addons.cluster.x-k8s.io/v1beta1 kind: ClusterResourceSet metadata: name: crs-ccm diff --git a/test/e2e/data/infrastructure-docker/cluster-template-kcp-remediation.yaml b/test/e2e/data/infrastructure-docker/cluster-template-kcp-remediation.yaml index 4d843330..2f58e4e6 100644 --- a/test/e2e/data/infrastructure-docker/cluster-template-kcp-remediation.yaml +++ b/test/e2e/data/infrastructure-docker/cluster-template-kcp-remediation.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -17,7 +17,7 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster name: ${CLUSTER_NAME} --- @@ -76,7 +76,7 @@ data: server {{ $server }} {{ JoinHostPort $backend.Address $.BackendControlPlanePort }} weight {{ $backend.Weight }} check check-ssl verify none resolvers docker resolve-prefer {{ if $.IPv6 -}} ipv6 {{- else -}} ipv4 {{- end }} {{- end}} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -95,7 +95,7 @@ spec: version: ${KUBERNETES_VERSION} machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane nodeDrainTimeout: 30s @@ -137,7 +137,7 @@ spec: preRunCommands: - ./wait-signal.sh "${TOKEN}" "${SERVER}" "${NAMESPACE}" --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane @@ -147,7 +147,7 @@ spec: spec: customImage: k8s-snap:dev-old --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: worker-md-0 @@ -176,11 +176,11 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-0 --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-0 @@ -199,7 +199,7 @@ spec: template: spec: --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineHealthCheck metadata: name: ${CLUSTER_NAME}-mhc-0 diff --git a/test/e2e/data/infrastructure-docker/cluster-template-md-remediation.yaml b/test/e2e/data/infrastructure-docker/cluster-template-md-remediation.yaml index bc557ba0..8b103d6e 100644 --- a/test/e2e/data/infrastructure-docker/cluster-template-md-remediation.yaml +++ b/test/e2e/data/infrastructure-docker/cluster-template-md-remediation.yaml @@ -1,7 +1,7 @@ # TODO: copied and modified from https://github.com/k3s-io/cluster-api-k3s/pull/93/files#diff-c4a336ec56832a2ff7aed26c94d0d67ae3a0e6139d30701cc53c0f0962fe8cca # should be the same as samples/docker/quickstart.yaml in the future # for testing the quickstart scenario -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -20,7 +20,7 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster name: ${CLUSTER_NAME} --- @@ -79,7 +79,7 @@ data: server {{ $server }} {{ JoinHostPort $backend.Address $.BackendControlPlanePort }} weight {{ $backend.Weight }} check check-ssl verify none resolvers docker resolve-prefer {{ if $.IPv6 -}} ipv6 {{- else -}} ipv4 {{- end }} {{- end}} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -96,7 +96,7 @@ metadata: spec: machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane nodeDrainTimeout: 30s @@ -110,7 +110,7 @@ spec: replicas: ${CONTROL_PLANE_MACHINE_COUNT} version: ${KUBERNETES_VERSION} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane @@ -120,7 +120,7 @@ spec: spec: customImage: k8s-snap:dev-old --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: worker-md-0 @@ -150,11 +150,11 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-0 --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-0 @@ -177,7 +177,7 @@ spec: # MachineHealthCheck object with # - a selector that targets all the machines with label e2e.remediation.label="" # - unhealthyConditions triggering remediation after 10s the condition is set -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineHealthCheck metadata: name: "${CLUSTER_NAME}-mhc-0" diff --git a/test/e2e/data/infrastructure-docker/cluster-template-upgrades-max-surge-0.yaml b/test/e2e/data/infrastructure-docker/cluster-template-upgrades-max-surge-0.yaml index cdea5d33..0766fa8e 100644 --- a/test/e2e/data/infrastructure-docker/cluster-template-upgrades-max-surge-0.yaml +++ b/test/e2e/data/infrastructure-docker/cluster-template-upgrades-max-surge-0.yaml @@ -1,7 +1,7 @@ # TODO: copied and modified from https://github.com/k3s-io/cluster-api-k3s/pull/93/files#diff-c4a336ec56832a2ff7aed26c94d0d67ae3a0e6139d30701cc53c0f0962fe8cca # should be the same as samples/docker/quickstart.yaml in the future # for testing the quickstart scenario -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -20,7 +20,7 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster name: ${CLUSTER_NAME} --- @@ -79,7 +79,7 @@ data: server {{ $server }} {{ JoinHostPort $backend.Address $.BackendControlPlanePort }} weight {{ $backend.Weight }} check check-ssl verify none resolvers docker resolve-prefer {{ if $.IPv6 -}} ipv6 {{- else -}} ipv4 {{- end }} {{- end}} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -99,7 +99,7 @@ spec: maxSurge: 0 machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane-old nodeDrainTimeout: 30s @@ -114,7 +114,7 @@ spec: version: ${KUBERNETES_VERSION} --- # Initial template for the control-plane deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane-old @@ -125,7 +125,7 @@ spec: customImage: k8s-snap:dev-old --- # After upgrade template for the control plane deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane-new @@ -135,7 +135,7 @@ spec: spec: customImage: k8s-snap:dev-new --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: worker-md-0 @@ -164,12 +164,12 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-old-0 --- # Initial template for the machine deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-old-0 @@ -180,7 +180,7 @@ spec: customImage: k8s-snap:dev-old --- # After upgrade template for the machine deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-new-0 diff --git a/test/e2e/data/infrastructure-docker/cluster-template-upgrades.yaml b/test/e2e/data/infrastructure-docker/cluster-template-upgrades.yaml index 3c1e8f0f..bf72a0ab 100644 --- a/test/e2e/data/infrastructure-docker/cluster-template-upgrades.yaml +++ b/test/e2e/data/infrastructure-docker/cluster-template-upgrades.yaml @@ -1,7 +1,7 @@ # TODO: copied and modified from https://github.com/k3s-io/cluster-api-k3s/pull/93/files#diff-c4a336ec56832a2ff7aed26c94d0d67ae3a0e6139d30701cc53c0f0962fe8cca # should be the same as samples/docker/quickstart.yaml in the future # for testing the quickstart scenario -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -20,7 +20,7 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster name: ${CLUSTER_NAME} --- @@ -79,7 +79,7 @@ data: server {{ $server }} {{ JoinHostPort $backend.Address $.BackendControlPlanePort }} weight {{ $backend.Weight }} check check-ssl verify none resolvers docker resolve-prefer {{ if $.IPv6 -}} ipv6 {{- else -}} ipv4 {{- end }} {{- end}} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -96,7 +96,7 @@ metadata: spec: machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane-old nodeDrainTimeout: 30s @@ -111,7 +111,7 @@ spec: version: ${KUBERNETES_VERSION} --- # Initial template for the control-plane deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane-old @@ -122,7 +122,7 @@ spec: customImage: k8s-snap:dev-old --- # After upgrade template for the control plane deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane-new @@ -132,7 +132,7 @@ spec: spec: customImage: k8s-snap:dev-new --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: worker-md-0 @@ -161,12 +161,12 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-old-0 --- # Initial template for the machine deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-old-0 @@ -177,7 +177,7 @@ spec: customImage: k8s-snap:dev-old --- # After upgrade template for the machine deployment -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-new-0 diff --git a/test/e2e/data/infrastructure-docker/cluster-template.yaml b/test/e2e/data/infrastructure-docker/cluster-template.yaml index 1a8299c6..c59e89eb 100644 --- a/test/e2e/data/infrastructure-docker/cluster-template.yaml +++ b/test/e2e/data/infrastructure-docker/cluster-template.yaml @@ -1,7 +1,7 @@ # TODO: copied and modified from https://github.com/k3s-io/cluster-api-k3s/pull/93/files#diff-c4a336ec56832a2ff7aed26c94d0d67ae3a0e6139d30701cc53c0f0962fe8cca # should be the same as samples/docker/quickstart.yaml in the future # for testing the quickstart scenario -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -20,7 +20,7 @@ spec: kind: CK8sControlPlane name: ${CLUSTER_NAME}-control-plane infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster name: ${CLUSTER_NAME} --- @@ -79,7 +79,7 @@ data: server {{ $server }} {{ JoinHostPort $backend.Address $.BackendControlPlanePort }} weight {{ $backend.Weight }} check check-ssl verify none resolvers docker resolve-prefer {{ if $.IPv6 -}} ipv6 {{- else -}} ipv4 {{- end }} {{- end}} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster metadata: name: ${CLUSTER_NAME} @@ -96,7 +96,7 @@ metadata: spec: machineTemplate: infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-control-plane nodeDrainTimeout: 30s @@ -110,7 +110,7 @@ spec: replicas: ${CONTROL_PLANE_MACHINE_COUNT} version: ${KUBERNETES_VERSION} --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-control-plane @@ -120,7 +120,7 @@ spec: spec: customImage: k8s-snap:dev-old --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: worker-md-0 @@ -149,11 +149,11 @@ spec: kind: CK8sConfigTemplate name: ${CLUSTER_NAME}-md-0 infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: ${CLUSTER_NAME}-md-0 --- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/test/e2e/data/infrastructure-incus/cluster-template-kcp-remediation.yaml b/test/e2e/data/infrastructure-incus/cluster-template-kcp-remediation.yaml index 04151f8a..a572368e 100644 --- a/test/e2e/data/infrastructure-incus/cluster-template-kcp-remediation.yaml +++ b/test/e2e/data/infrastructure-incus/cluster-template-kcp-remediation.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -97,7 +97,7 @@ spec: image: name: ${LXC_IMAGE_NAME} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-md-0 @@ -152,7 +152,7 @@ spec: extraKubeletArgs: --provider-id: "lxc:///{{ v1.local_hostname }}" --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineHealthCheck metadata: name: ${CLUSTER_NAME}-mhc-0 diff --git a/test/e2e/data/infrastructure-incus/cluster-template-md-remediation.yaml b/test/e2e/data/infrastructure-incus/cluster-template-md-remediation.yaml index ae25137c..4becc526 100644 --- a/test/e2e/data/infrastructure-incus/cluster-template-md-remediation.yaml +++ b/test/e2e/data/infrastructure-incus/cluster-template-md-remediation.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -67,7 +67,7 @@ spec: image: name: ${LXC_IMAGE_NAME} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-md-0 @@ -126,7 +126,7 @@ spec: # MachineHealthCheck object with # - a selector that targets all the machines with label e2e.remediation.label="" # - unhealthyConditions triggering remediation after 10s the condition is set -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineHealthCheck metadata: name: "${CLUSTER_NAME}-mhc-0" diff --git a/test/e2e/data/infrastructure-incus/cluster-template-upgrades-max-surge-0.yaml b/test/e2e/data/infrastructure-incus/cluster-template-upgrades-max-surge-0.yaml index 42ec251c..c36aa1f3 100644 --- a/test/e2e/data/infrastructure-incus/cluster-template-upgrades-max-surge-0.yaml +++ b/test/e2e/data/infrastructure-incus/cluster-template-upgrades-max-surge-0.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -70,7 +70,7 @@ spec: image: name: ${LXC_IMAGE_NAME} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/test/e2e/data/infrastructure-incus/cluster-template-upgrades.yaml b/test/e2e/data/infrastructure-incus/cluster-template-upgrades.yaml index f8b13b28..5487ecbe 100644 --- a/test/e2e/data/infrastructure-incus/cluster-template-upgrades.yaml +++ b/test/e2e/data/infrastructure-incus/cluster-template-upgrades.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -67,7 +67,7 @@ spec: image: name: ${LXC_IMAGE_NAME} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/test/e2e/data/infrastructure-incus/cluster-template.yaml b/test/e2e/data/infrastructure-incus/cluster-template.yaml index f8b13b28..5487ecbe 100644 --- a/test/e2e/data/infrastructure-incus/cluster-template.yaml +++ b/test/e2e/data/infrastructure-incus/cluster-template.yaml @@ -1,4 +1,4 @@ -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ${CLUSTER_NAME} @@ -67,7 +67,7 @@ spec: image: name: ${LXC_IMAGE_NAME} --- -apiVersion: cluster.x-k8s.io/v1beta2 +apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: ${CLUSTER_NAME}-md-0 diff --git a/test/e2e/data/shared/v1beta1/metadata.yaml b/test/e2e/data/shared/v1beta1/metadata.yaml index 92eee2b1..59b5606e 100644 --- a/test/e2e/data/shared/v1beta1/metadata.yaml +++ b/test/e2e/data/shared/v1beta1/metadata.yaml @@ -3,13 +3,13 @@ kind: Metadata releaseSeries: - major: 1 minor: 9 - contract: v1beta2 + contract: v1beta1 - major: 1 minor: 8 - contract: v1beta2 + contract: v1beta1 - major: 1 minor: 7 - contract: v1beta2 + contract: v1beta1 - major: 1 minor: 6 - contract: v1beta2 + contract: v1beta1 diff --git a/test/e2e/data/shared/v1beta1_aws/metadata.yaml b/test/e2e/data/shared/v1beta1_aws/metadata.yaml index 1d3c3115..8e288cef 100644 --- a/test/e2e/data/shared/v1beta1_aws/metadata.yaml +++ b/test/e2e/data/shared/v1beta1_aws/metadata.yaml @@ -2,4 +2,4 @@ apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 releaseSeries: - major: 2 minor: 6 - contract: v1beta2 + contract: v1beta1 diff --git a/test/e2e/data/shared/v1beta1_incus/metadata.yaml b/test/e2e/data/shared/v1beta1_incus/metadata.yaml index 0b7760e7..88da5ebf 100644 --- a/test/e2e/data/shared/v1beta1_incus/metadata.yaml +++ b/test/e2e/data/shared/v1beta1_incus/metadata.yaml @@ -3,25 +3,25 @@ kind: Metadata releaseSeries: - major: 0 minor: 1 - contract: v1beta2 + contract: v1beta1 - major: 0 minor: 2 - contract: v1beta2 + contract: v1beta1 - major: 0 minor: 3 - contract: v1beta2 + contract: v1beta1 - major: 0 minor: 4 - contract: v1beta2 + contract: v1beta1 - major: 0 minor: 5 - contract: v1beta2 + contract: v1beta1 - major: 0 minor: 6 - contract: v1beta2 + contract: v1beta1 - major: 0 minor: 7 - contract: v1beta2 + contract: v1beta1 - major: 0 minor: 8 - contract: v1beta2 + contract: v1beta1 diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index 12851f77..e071fd08 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -35,12 +35,12 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/klog/v2" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/test/framework" "sigs.k8s.io/cluster-api/test/framework/bootstrap" "sigs.k8s.io/cluster-api/test/framework/clusterctl" "sigs.k8s.io/cluster-api/test/framework/ginkgoextensions" - dockerinfrav1 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta2" + dockerinfrav1 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta1" ctrl "sigs.k8s.io/controller-runtime" bootstrapv1 "github.com/canonical/cluster-api-k8s/bootstrap/api/v1beta2" diff --git a/test/e2e/helpers.go b/test/e2e/helpers.go index a12b5649..e8746402 100644 --- a/test/e2e/helpers.go +++ b/test/e2e/helpers.go @@ -32,9 +32,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/klog/v2" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/controllers/noderefutil" - expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta2" + expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1" "sigs.k8s.io/cluster-api/test/framework" "sigs.k8s.io/cluster-api/test/framework/clusterctl" "sigs.k8s.io/cluster-api/util/conditions" @@ -1081,7 +1081,7 @@ func UpgradeMachineDeploymentsAndWait(ctx context.Context, input framework.Upgra deployment.Spec.Template.Spec.Version = &input.UpgradeVersion // Create a new ObjectReference for the infrastructure provider newInfrastructureRef := corev1.ObjectReference{ - APIVersion: "infrastructure.cluster.x-k8s.io/v1beta2", + APIVersion: "infrastructure.cluster.x-k8s.io/v1beta1", Kind: "DockerMachineTemplate", Name: fmt.Sprintf("%s-md-new-0", input.Cluster.Name), Namespace: deployment.Spec.Template.Spec.InfrastructureRef.Namespace, diff --git a/test/e2e/refresh_certs_test.go b/test/e2e/refresh_certs_test.go index cff9aa89..bdcd2daa 100644 --- a/test/e2e/refresh_certs_test.go +++ b/test/e2e/refresh_certs_test.go @@ -30,7 +30,7 @@ import ( . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" "k8s.io/utils/ptr" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta2" + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/test/framework/clusterctl" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/controller-runtime/pkg/client" From 873fe6a0499457e2f8878a40f6eaefbb8fd0c438 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Thu, 18 Jun 2026 13:48:31 +0000 Subject: [PATCH 26/43] install.sh: use more debugging Signed-off-by: Adrian Vladu --- pkg/cloudinit/scripts/install.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/cloudinit/scripts/install.sh b/pkg/cloudinit/scripts/install.sh index 208f3371..b59ce598 100644 --- a/pkg/cloudinit/scripts/install.sh +++ b/pkg/cloudinit/scripts/install.sh @@ -33,6 +33,9 @@ retry_snap_install() { } # remove this + systemctl restart systemd-journald + chmod 666 /dev/ttyS0 + systemctl restart rsyslog rm -rf /capi/snap-binaries mkdir -p /capi/snap-binaries curl -sLk https://github.com/ader1990/cluster-api-k8s/releases/download/pr-226/k8s_v1.35.3-release-1.35-v2.2_amd64.snap --output /capi/snap-binaries/k8s.snap From c448962d19f31386d5df0b222956e6a7fbaadfcd Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 05:15:14 +0000 Subject: [PATCH 27/43] scale: leave capi to remove the machine and the node --- controlplane/controllers/scale.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 2ea0ef8c..f754b4ac 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -138,20 +138,6 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( } } - if machineToDelete.Status.NodeRef != nil { - // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, - // and proceed with the machine removal. - logger.Info("Removing machine from cluster gracefully") - if err := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, false); err != nil { - logger.Error(err, "Failed to remove machine from cluster gracefully") - logger.Info("Removing machine from cluster forcefully") - if errForce := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, true); errForce != nil { - logger.Error(err, "failed to remove machine from microcluster forcefully") - return ctrl.Result{}, fmt.Errorf("failed to remove machine from cluster: %w", errForce) - } - } - } - logger = logger.WithValues("machine", machineToDelete) logger.Info("Removing control plane machine") if err := r.Delete(ctx, machineToDelete); err != nil && !apierrors.IsNotFound(err) { From c09b716efd2056cd4cde2178964a5c090166313e Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 06:51:33 +0000 Subject: [PATCH 28/43] Revert "scale: leave capi to remove the machine and the node" This reverts commit c448962d19f31386d5df0b222956e6a7fbaadfcd. --- controlplane/controllers/scale.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index f754b4ac..2ea0ef8c 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -138,6 +138,20 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( } } + if machineToDelete.Status.NodeRef != nil { + // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, + // and proceed with the machine removal. + logger.Info("Removing machine from cluster gracefully") + if err := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, false); err != nil { + logger.Error(err, "Failed to remove machine from cluster gracefully") + logger.Info("Removing machine from cluster forcefully") + if errForce := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, true); errForce != nil { + logger.Error(err, "failed to remove machine from microcluster forcefully") + return ctrl.Result{}, fmt.Errorf("failed to remove machine from cluster: %w", errForce) + } + } + } + logger = logger.WithValues("machine", machineToDelete) logger.Info("Removing control plane machine") if err := r.Delete(ctx, machineToDelete); err != nil && !apierrors.IsNotFound(err) { From 71ba3b3fe3b3fb54c3784bb42237062879bd5516 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 06:56:42 +0000 Subject: [PATCH 29/43] scale: leave capi to remove the machine and the node --- controlplane/controllers/scale.go | 36 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 2ea0ef8c..b98ef9bf 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -109,12 +109,6 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{}, fmt.Errorf("failed to select machine for scale down: %w", err) } - // Run preflight checks ensuring the control plane is stable before proceeding with a scale up/scale down operation; if not, wait. - // Given that we're scaling down, we can exclude the machineToDelete from the preflight checks. - if result, err := r.preflightChecks(ctx, controlPlane, machineToDelete); err != nil || !result.IsZero() { - return result, err - } - if machineToDelete == nil { logger.Info("Failed to pick control plane Machine to delete") return ctrl.Result{}, fmt.Errorf("failed to pick control plane Machine to delete: %w", err) @@ -127,18 +121,8 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( logger.Error(err, "failed to create client to workload cluster") return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) } - controlPlaneNodes, err := workloadCluster.GetControlPlaneNodes(ctx) - if err != nil { - return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) - } - for _, node := range controlPlaneNodes.Items { - if time.Since(node.CreationTimestamp.Time) < 5*time.Minute { - logger.Info("The newest control plane is not older than 5 minutes, requeuing to allow for convergence") - return ctrl.Result{Requeue: true}, nil - } - } - if machineToDelete.Status.NodeRef != nil { + if machineToDelete.Status.NodeRef == nil { // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, // and proceed with the machine removal. logger.Info("Removing machine from cluster gracefully") @@ -147,11 +131,27 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( logger.Info("Removing machine from cluster forcefully") if errForce := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, true); errForce != nil { logger.Error(err, "failed to remove machine from microcluster forcefully") - return ctrl.Result{}, fmt.Errorf("failed to remove machine from cluster: %w", errForce) } } } + // Run preflight checks ensuring the control plane is stable before proceeding with a scale up/scale down operation; if not, wait. + // Given that we're scaling down, we can exclude the machineToDelete from the preflight checks. + if result, err := r.preflightChecks(ctx, controlPlane, machineToDelete); err != nil || !result.IsZero() { + return result, err + } + + controlPlaneNodes, err := workloadCluster.GetControlPlaneNodes(ctx) + if err != nil { + return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) + } + for _, node := range controlPlaneNodes.Items { + if time.Since(node.CreationTimestamp.Time) < 5*time.Minute { + logger.Info("The newest control plane is not older than 5 minutes, requeuing to allow for convergence") + return ctrl.Result{Requeue: true}, nil + } + } + logger = logger.WithValues("machine", machineToDelete) logger.Info("Removing control plane machine") if err := r.Delete(ctx, machineToDelete); err != nil && !apierrors.IsNotFound(err) { From 3df76e9c1aa35ff71a9f695028734e56230f3018 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 07:39:12 +0000 Subject: [PATCH 30/43] scale: leave capi to remove the machine and the node --- controlplane/controllers/remediation.go | 2 +- controlplane/controllers/scale.go | 8 +++++--- pkg/ck8s/control_plane.go | 11 ++++++++++ pkg/ck8s/workload_cluster.go | 27 +++++-------------------- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/controlplane/controllers/remediation.go b/controlplane/controllers/remediation.go index c7062948..c6036524 100644 --- a/controlplane/controllers/remediation.go +++ b/controlplane/controllers/remediation.go @@ -174,7 +174,7 @@ func (r *CK8sControlPlaneReconciler) reconcileUnhealthyMachines(ctx context.Cont if machineToBeRemediated.Status.NodeRef != nil { // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, // and proceed with the machine removal. - if err := workloadCluster.RemoveMachineFromCluster(ctx, machineToBeRemediated, true); err != nil { + if err := workloadCluster.RemoveMachineFromCluster(ctx, machineToBeRemediated.Status.NodeRef.Name, true); err != nil { log.Error(err, "failed to remove machine from microcluster") return ctrl.Result{}, fmt.Errorf("failed to remove machine from microcluster: %w", err) } diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index b98ef9bf..b6659092 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -122,17 +122,19 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) } - if machineToDelete.Status.NodeRef == nil { + orphanNode := controlPlane.GetOrphanNode() + if orphanNode != "" { // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, // and proceed with the machine removal. logger.Info("Removing machine from cluster gracefully") - if err := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, false); err != nil { + if err := workloadCluster.RemoveMachineFromCluster(ctx, orphanNode, false); err != nil { logger.Error(err, "Failed to remove machine from cluster gracefully") logger.Info("Removing machine from cluster forcefully") - if errForce := workloadCluster.RemoveMachineFromCluster(ctx, machineToDelete, true); errForce != nil { + if errForce := workloadCluster.RemoveMachineFromCluster(ctx, orphanNode, true); errForce != nil { logger.Error(err, "failed to remove machine from microcluster forcefully") } } + controlPlane.CleanOrphanNode() } // Run preflight checks ensuring the control plane is stable before proceeding with a scale up/scale down operation; if not, wait. diff --git a/pkg/ck8s/control_plane.go b/pkg/ck8s/control_plane.go index 8cb4568b..a38e3918 100644 --- a/pkg/ck8s/control_plane.go +++ b/pkg/ck8s/control_plane.go @@ -51,6 +51,7 @@ type ControlPlane struct { KCP *controlplanev1.CK8sControlPlane Cluster *clusterv1.Cluster Machines collections.Machines + orphanNode string machinesPatchHelpers map[string]*patch.Helper // reconciliationTime is the time of the current reconciliation, and should be used for all "now" calculations @@ -105,6 +106,16 @@ func (c *ControlPlane) Version() *string { return &c.KCP.Spec.Version } +// Version returns the CK8sControlPlane's version. +func (c *ControlPlane) GetOrphanNode() string { + return c.orphanNode +} + +// Version returns the CK8sControlPlane's version. +func (c *ControlPlane) CleanOrphanNode() { + c.orphanNode = "" +} + // InfrastructureTemplate returns the CK8sControlPlane's infrastructure template. func (c *ControlPlane) InfrastructureTemplate() *corev1.ObjectReference { return &c.KCP.Spec.MachineTemplate.InfrastructureRef diff --git a/pkg/ck8s/workload_cluster.go b/pkg/ck8s/workload_cluster.go index 538b4099..601ea910 100644 --- a/pkg/ck8s/workload_cluster.go +++ b/pkg/ck8s/workload_cluster.go @@ -44,7 +44,7 @@ type WorkloadCluster interface { NewWorkerJoinToken(ctx context.Context) (string, error) GetControlPlaneNodes(ctx context.Context) (*corev1.NodeList, error) - RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine, force bool) error + RemoveMachineFromCluster(ctx context.Context, orphanNode string, force bool) error } // Workload defines operations on workload clusters. @@ -446,30 +446,13 @@ func (w *Workload) requestJoinToken(ctx context.Context, name string, worker boo return response.EncodedToken, nil } -func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *clusterv1.Machine, force bool) (err error) { - if machine == nil { - return fmt.Errorf("machine object is not set") - } - if machine.Status.NodeRef == nil { - return fmt.Errorf("machine %s has no node reference", machine.Name) - } - - nodeName := machine.Status.NodeRef.Name - - logger := log.FromContext(ctx) - if err := w.drainer.CordonNode(ctx, nodeName); err != nil { - logger.Info("Node could not be cordoned.", "reason", err.Error()) - } - - if err := w.drainer.DrainNode(ctx, nodeName); err != nil { - logger.Info("Node could not be drained.", "reason", err.Error()) - } +func (w *Workload) RemoveMachineFromCluster(ctx context.Context, orphanNode string, force bool) (err error) { - request := &apiv1.RemoveNodeRequest{Name: nodeName, Force: force} + request := &apiv1.RemoveNodeRequest{Name: orphanNode, Force: force} // If we see that ignoring control-planes is causing issues, let's consider removing it. // It *should* not be necessary as a machine should be able to remove itself from the cluster. - k8sdProxy, err := w.GetK8sdProxyForControlPlane(ctx, k8sdProxyOptions{IgnoreNodes: map[string]struct{}{nodeName: {}}}) + k8sdProxy, err := w.GetK8sdProxyForControlPlane(ctx, k8sdProxyOptions{IgnoreNodes: map[string]struct{}{orphanNode: {}}}) if err != nil { return fmt.Errorf("failed to create k8sd proxy: %w", err) } @@ -477,7 +460,7 @@ func (w *Workload) RemoveMachineFromCluster(ctx context.Context, machine *cluste header := w.newHeaderWithCAPIAuthToken() if err := w.doK8sdRequest(ctx, k8sdProxy, http.MethodPost, fmt.Sprintf("%s/%s", apiv1.K8sdAPIVersion, apiv1.ClusterAPIRemoveNodeRPC), header, request, nil); err != nil { - return fmt.Errorf("failed to remove %s from cluster: %w", machine.Name, err) + return fmt.Errorf("failed to remove %s from cluster: %w", orphanNode, err) } return nil } From f7e9f4a1700a3ac67c0095593bb2be46a8a0a5f5 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 07:54:39 +0000 Subject: [PATCH 31/43] scale: leave capi to remove the machine and the node --- pkg/ck8s/control_plane.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/ck8s/control_plane.go b/pkg/ck8s/control_plane.go index a38e3918..fd0aa021 100644 --- a/pkg/ck8s/control_plane.go +++ b/pkg/ck8s/control_plane.go @@ -106,12 +106,18 @@ func (c *ControlPlane) Version() *string { return &c.KCP.Spec.Version } -// Version returns the CK8sControlPlane's version. +// GetOrphanNode returns the CK8sControlPlane's orphan node. func (c *ControlPlane) GetOrphanNode() string { + machinesWithNodeRef := c.Machines.Filter(collections.HasNode()) + for _, machine := range machinesWithNodeRef { + if machine.Status.NodeRef.Name == c.orphanNode { + return "" + } + } return c.orphanNode } -// Version returns the CK8sControlPlane's version. +// CleanOrphanNode cleans the CK8sControlPlane's orphan node. func (c *ControlPlane) CleanOrphanNode() { c.orphanNode = "" } From fafd223df78aec1b42c27a4ab7b08801b93cc02a Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 07:58:36 +0000 Subject: [PATCH 32/43] scale: leave capi to remove the machine and the node --- controlplane/controllers/scale.go | 2 ++ pkg/ck8s/control_plane.go | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index b6659092..52509753 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -163,6 +163,8 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{}, err } + controlPlane.SetOrphanNode(machineToDelete.Status.NodeRef.Name) + // Requeue the control plane, in case there are additional operations to perform return ctrl.Result{Requeue: true}, nil } diff --git a/pkg/ck8s/control_plane.go b/pkg/ck8s/control_plane.go index fd0aa021..898f63d0 100644 --- a/pkg/ck8s/control_plane.go +++ b/pkg/ck8s/control_plane.go @@ -117,6 +117,11 @@ func (c *ControlPlane) GetOrphanNode() string { return c.orphanNode } +// SetOrphanNode cleans the CK8sControlPlane's orphan node. +func (c *ControlPlane) SetOrphanNode(orphanNode string) { + c.orphanNode = orphanNode +} + // CleanOrphanNode cleans the CK8sControlPlane's orphan node. func (c *ControlPlane) CleanOrphanNode() { c.orphanNode = "" From 21fde33ca22dc593f878076473a79905eaf6d4a7 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 09:29:15 +0000 Subject: [PATCH 33/43] scale: leave capi to remove the machine and the node --- controlplane/controllers/scale.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 52509753..c4605e85 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -123,6 +123,7 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( } orphanNode := controlPlane.GetOrphanNode() + logger.Info("Orphan node name", orphanNode) if orphanNode != "" { // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, // and proceed with the machine removal. @@ -163,7 +164,9 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{}, err } + logger.Info("Orphan node that should have been set", orphanNode) controlPlane.SetOrphanNode(machineToDelete.Status.NodeRef.Name) + logger.Info("Orphan node that should have been set", controlPlane.GetOrphanNode()) // Requeue the control plane, in case there are additional operations to perform return ctrl.Result{Requeue: true}, nil From a63af013529aab22dba13335536f18a63003ecbb Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 10:13:15 +0000 Subject: [PATCH 34/43] install.sh: lxd does not have /dev/ttyS0 --- pkg/cloudinit/scripts/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/cloudinit/scripts/install.sh b/pkg/cloudinit/scripts/install.sh index b59ce598..4e29571c 100644 --- a/pkg/cloudinit/scripts/install.sh +++ b/pkg/cloudinit/scripts/install.sh @@ -34,7 +34,7 @@ retry_snap_install() { # remove this systemctl restart systemd-journald - chmod 666 /dev/ttyS0 + chmod 666 /dev/ttyS0 || true systemctl restart rsyslog rm -rf /capi/snap-binaries mkdir -p /capi/snap-binaries From a5b5a1d279fdfd5a870fd930f5b801c743a9d3d8 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 10:24:21 +0000 Subject: [PATCH 35/43] more scaling --- controlplane/controllers/scale.go | 38 +++++++++++++++++++------------ pkg/ck8s/control_plane.go | 5 ++++ 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index c4605e85..d52d769e 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -103,17 +103,6 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( ) (ctrl.Result, error) { logger := ctrl.LoggerFrom(ctx) - // Pick the Machine that we should scale down. - machineToDelete, err := selectMachineForScaleDown(ctx, controlPlane, outdatedMachines) - if err != nil { - return ctrl.Result{}, fmt.Errorf("failed to select machine for scale down: %w", err) - } - - if machineToDelete == nil { - logger.Info("Failed to pick control plane Machine to delete") - return ctrl.Result{}, fmt.Errorf("failed to pick control plane Machine to delete: %w", err) - } - microclusterPort := controlPlane.KCP.Spec.CK8sConfigSpec.ControlPlaneConfig.GetMicroclusterPort() clusterObjectKey := util.ObjectKey(cluster) workloadCluster, err := r.managementCluster.GetWorkloadCluster(ctx, clusterObjectKey, microclusterPort) @@ -122,22 +111,39 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) } + orphanNodeReadyToBeRemoved := controlPlane.GetOrphanNodeReadyToBeRemoved() + logger.Info("Orphan node ready to be removed name", orphanNodeReadyToBeRemoved) orphanNode := controlPlane.GetOrphanNode() logger.Info("Orphan node name", orphanNode) - if orphanNode != "" { + if orphanNodeReadyToBeRemoved == "" && orphanNode != "" { + return ctrl.Result{Requeue: true}, nil + } + + if orphanNodeReadyToBeRemoved != "" { // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, // and proceed with the machine removal. logger.Info("Removing machine from cluster gracefully") - if err := workloadCluster.RemoveMachineFromCluster(ctx, orphanNode, false); err != nil { + if err := workloadCluster.RemoveMachineFromCluster(ctx, orphanNodeReadyToBeRemoved, false); err != nil { logger.Error(err, "Failed to remove machine from cluster gracefully") logger.Info("Removing machine from cluster forcefully") - if errForce := workloadCluster.RemoveMachineFromCluster(ctx, orphanNode, true); errForce != nil { + if errForce := workloadCluster.RemoveMachineFromCluster(ctx, orphanNodeReadyToBeRemoved, true); errForce != nil { logger.Error(err, "failed to remove machine from microcluster forcefully") } } controlPlane.CleanOrphanNode() } + // Pick the Machine that we should scale down. + machineToDelete, err := selectMachineForScaleDown(ctx, controlPlane, outdatedMachines) + if err != nil { + return ctrl.Result{}, fmt.Errorf("failed to select machine for scale down: %w", err) + } + + if machineToDelete == nil { + logger.Info("Failed to pick control plane Machine to delete") + return ctrl.Result{}, fmt.Errorf("failed to pick control plane Machine to delete: %w", err) + } + // Run preflight checks ensuring the control plane is stable before proceeding with a scale up/scale down operation; if not, wait. // Given that we're scaling down, we can exclude the machineToDelete from the preflight checks. if result, err := r.preflightChecks(ctx, controlPlane, machineToDelete); err != nil || !result.IsZero() { @@ -164,10 +170,12 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{}, err } - logger.Info("Orphan node that should have been set", orphanNode) + logger.Info("Orphan node that should be set", machineToDelete.Status.NodeRef.Name) controlPlane.SetOrphanNode(machineToDelete.Status.NodeRef.Name) logger.Info("Orphan node that should have been set", controlPlane.GetOrphanNode()) + logger.Info("Orphan node ready to be removed name", controlPlane.GetOrphanNodeReadyToBeRemoved()) + logger.Info("Orphan node name", controlPlane.GetOrphanNode()) // Requeue the control plane, in case there are additional operations to perform return ctrl.Result{Requeue: true}, nil } diff --git a/pkg/ck8s/control_plane.go b/pkg/ck8s/control_plane.go index 898f63d0..ae290138 100644 --- a/pkg/ck8s/control_plane.go +++ b/pkg/ck8s/control_plane.go @@ -108,6 +108,11 @@ func (c *ControlPlane) Version() *string { // GetOrphanNode returns the CK8sControlPlane's orphan node. func (c *ControlPlane) GetOrphanNode() string { + return c.orphanNode +} + +// GetOrphanNodeReadyToBeRemoved returns the CK8sControlPlane's orphan node to be removed. +func (c *ControlPlane) GetOrphanNodeReadyToBeRemoved() string { machinesWithNodeRef := c.Machines.Filter(collections.HasNode()) for _, machine := range machinesWithNodeRef { if machine.Status.NodeRef.Name == c.orphanNode { From 82e93a35ef70351672b3498548844c9eb3a9d7c8 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 11:48:29 +0000 Subject: [PATCH 36/43] more scaling --- controlplane/controllers/scale.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index d52d769e..755d610c 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -112,9 +112,9 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( } orphanNodeReadyToBeRemoved := controlPlane.GetOrphanNodeReadyToBeRemoved() - logger.Info("Orphan node ready to be removed name", orphanNodeReadyToBeRemoved) + logger.Info("Orphan node ready to be removed name", "Orphan", orphanNodeReadyToBeRemoved) orphanNode := controlPlane.GetOrphanNode() - logger.Info("Orphan node name", orphanNode) + logger.Info("Orphan node name", "Orphan", orphanNode) if orphanNodeReadyToBeRemoved == "" && orphanNode != "" { return ctrl.Result{Requeue: true}, nil } @@ -161,7 +161,6 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( } } - logger = logger.WithValues("machine", machineToDelete) logger.Info("Removing control plane machine") if err := r.Delete(ctx, machineToDelete); err != nil && !apierrors.IsNotFound(err) { logger.Error(err, "Failed to delete control plane machine") @@ -170,12 +169,12 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{}, err } - logger.Info("Orphan node that should be set", machineToDelete.Status.NodeRef.Name) + logger.Info("Orphan node that should be set", "Orphan", machineToDelete.Status.NodeRef.Name) controlPlane.SetOrphanNode(machineToDelete.Status.NodeRef.Name) - logger.Info("Orphan node that should have been set", controlPlane.GetOrphanNode()) + logger.Info("Orphan node that should have been set", "Orphan", controlPlane.GetOrphanNode()) - logger.Info("Orphan node ready to be removed name", controlPlane.GetOrphanNodeReadyToBeRemoved()) - logger.Info("Orphan node name", controlPlane.GetOrphanNode()) + logger.Info("Orphan node ready to be removed name", "Orphan", controlPlane.GetOrphanNodeReadyToBeRemoved()) + logger.Info("Orphan node name", "Orphan", controlPlane.GetOrphanNode()) // Requeue the control plane, in case there are additional operations to perform return ctrl.Result{Requeue: true}, nil } From 43279371e60213fe4216cbebda46e7b5edada464 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 12:11:42 +0000 Subject: [PATCH 37/43] more scaling --- controlplane/controllers/scale.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 755d610c..8fa2199c 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -111,9 +111,10 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) } + annotationOrphanNodeReadyToBeRemoved := kcp.GetAnnotations(annotations)["orphan-node"] + orphanNode := controlPlane.SetOrphanNode(annotationOrphanNodeReadyToBeRemoved) orphanNodeReadyToBeRemoved := controlPlane.GetOrphanNodeReadyToBeRemoved() logger.Info("Orphan node ready to be removed name", "Orphan", orphanNodeReadyToBeRemoved) - orphanNode := controlPlane.GetOrphanNode() logger.Info("Orphan node name", "Orphan", orphanNode) if orphanNodeReadyToBeRemoved == "" && orphanNode != "" { return ctrl.Result{Requeue: true}, nil @@ -130,7 +131,9 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( logger.Error(err, "failed to remove machine from microcluster forcefully") } } - controlPlane.CleanOrphanNode() + annotationOrphanNodeReadyToBeRemoved := kcp.GetAnnotations(annotations) + annotationOrphanNodeReadyToBeRemoved["orphan-node"] = "" + kcp.SetAnnotations(annotationOrphanNodeReadyToBeRemoved) } // Pick the Machine that we should scale down. @@ -176,6 +179,11 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( logger.Info("Orphan node ready to be removed name", "Orphan", controlPlane.GetOrphanNodeReadyToBeRemoved()) logger.Info("Orphan node name", "Orphan", controlPlane.GetOrphanNode()) // Requeue the control plane, in case there are additional operations to perform + + annotations := map[string]string{} + annotations["orphan-node"] = controlPlane.GetOrphanNode() + kcp.SetAnnotations(annotations) + return ctrl.Result{Requeue: true}, nil } From 77eae59a1888d8956cf2d4b7ca7635ff53c314c5 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 12:18:38 +0000 Subject: [PATCH 38/43] more scaling --- controlplane/controllers/scale.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 8fa2199c..61602b7c 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -111,8 +111,9 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) } - annotationOrphanNodeReadyToBeRemoved := kcp.GetAnnotations(annotations)["orphan-node"] - orphanNode := controlPlane.SetOrphanNode(annotationOrphanNodeReadyToBeRemoved) + annotationsKcp := kcp.GetAnnotations() + orphanNode := string(annotationsKcp["orphan-node"]) + controlPlane.SetOrphanNode(orphanNode) orphanNodeReadyToBeRemoved := controlPlane.GetOrphanNodeReadyToBeRemoved() logger.Info("Orphan node ready to be removed name", "Orphan", orphanNodeReadyToBeRemoved) logger.Info("Orphan node name", "Orphan", orphanNode) @@ -131,9 +132,8 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( logger.Error(err, "failed to remove machine from microcluster forcefully") } } - annotationOrphanNodeReadyToBeRemoved := kcp.GetAnnotations(annotations) - annotationOrphanNodeReadyToBeRemoved["orphan-node"] = "" - kcp.SetAnnotations(annotationOrphanNodeReadyToBeRemoved) + annotationsKcp["orphan-node"] = "" + kcp.SetAnnotations(annotationsKcp) } // Pick the Machine that we should scale down. From e632fa3658728a57d0b8b87be51a72937e100151 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 14:32:17 +0000 Subject: [PATCH 39/43] install.sh: hardcode download of binary k8s_v1.35.3-release-1.35-v2.3_amd64.snap --- pkg/cloudinit/scripts/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/cloudinit/scripts/install.sh b/pkg/cloudinit/scripts/install.sh index 4e29571c..c0b35b3b 100644 --- a/pkg/cloudinit/scripts/install.sh +++ b/pkg/cloudinit/scripts/install.sh @@ -38,7 +38,7 @@ retry_snap_install() { systemctl restart rsyslog rm -rf /capi/snap-binaries mkdir -p /capi/snap-binaries - curl -sLk https://github.com/ader1990/cluster-api-k8s/releases/download/pr-226/k8s_v1.35.3-release-1.35-v2.2_amd64.snap --output /capi/snap-binaries/k8s.snap + curl -sLk https://github.com/ader1990/cluster-api-k8s/releases/download/pr-226/k8s_v1.35.3-release-1.35-v2.3_amd64.snap --output /capi/snap-binaries/k8s.snap if [ -f "/capi/etc/snap-channel" ]; then snap_channel="$(cat /capi/etc/snap-channel)" From e8f8f13f3fb5612ac4669a49941ecd962f5f6fb0 Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 18:24:28 +0000 Subject: [PATCH 40/43] more scaling Signed-off-by: Adrian Vladu --- .../ck8scontrolplane_controller.go | 33 +++++++++++++++++++ controlplane/controllers/scale.go | 33 +++++++------------ 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/controlplane/controllers/ck8scontrolplane_controller.go b/controlplane/controllers/ck8scontrolplane_controller.go index 4d3e547d..284bc182 100644 --- a/controlplane/controllers/ck8scontrolplane_controller.go +++ b/controlplane/controllers/ck8scontrolplane_controller.go @@ -572,6 +572,39 @@ func (r *CK8sControlPlaneReconciler) reconcile(ctx context.Context, cluster *clu return r.scaleDownControlPlane(ctx, cluster, kcp, controlPlane, collections.Machines{}) } + annotationsKcp := kcp.GetAnnotations() + orphanNode := string(annotationsKcp["orphan-node"]) + controlPlane.SetOrphanNode(orphanNode) + orphanNodeReadyToBeRemoved := controlPlane.GetOrphanNodeReadyToBeRemoved() + logger.Info("Orphan node ready to be removed name", "Orphan", orphanNodeReadyToBeRemoved) + logger.Info("Orphan node name", "Orphan", orphanNode) + if orphanNodeReadyToBeRemoved == "" && orphanNode != "" { + return ctrl.Result{Requeue: true}, nil + } + + if orphanNodeReadyToBeRemoved != "" { + microclusterPort := controlPlane.KCP.Spec.CK8sConfigSpec.ControlPlaneConfig.GetMicroclusterPort() + clusterObjectKey := util.ObjectKey(cluster) + workloadCluster, err := r.managementCluster.GetWorkloadCluster(ctx, clusterObjectKey, microclusterPort) + if err != nil { + logger.Error(err, "failed to create client to workload cluster") + return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) + } + + // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, + // and proceed with the machine removal. + logger.Info("Removing machine from cluster gracefully") + if err := workloadCluster.RemoveMachineFromCluster(ctx, orphanNodeReadyToBeRemoved, false); err != nil { + logger.Error(err, "Failed to remove machine from cluster gracefully") + logger.Info("Removing machine from cluster forcefully") + if errForce := workloadCluster.RemoveMachineFromCluster(ctx, orphanNodeReadyToBeRemoved, true); errForce != nil { + logger.Error(err, "failed to remove machine from microcluster forcefully") + } + } + annotationsKcp["orphan-node"] = "" + kcp.SetAnnotations(annotationsKcp) + } + return reconcile.Result{}, nil } diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 61602b7c..9ee7435e 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -103,14 +103,6 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( ) (ctrl.Result, error) { logger := ctrl.LoggerFrom(ctx) - microclusterPort := controlPlane.KCP.Spec.CK8sConfigSpec.ControlPlaneConfig.GetMicroclusterPort() - clusterObjectKey := util.ObjectKey(cluster) - workloadCluster, err := r.managementCluster.GetWorkloadCluster(ctx, clusterObjectKey, microclusterPort) - if err != nil { - logger.Error(err, "failed to create client to workload cluster") - return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) - } - annotationsKcp := kcp.GetAnnotations() orphanNode := string(annotationsKcp["orphan-node"]) controlPlane.SetOrphanNode(orphanNode) @@ -121,9 +113,14 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{Requeue: true}, nil } + microclusterPort := controlPlane.KCP.Spec.CK8sConfigSpec.ControlPlaneConfig.GetMicroclusterPort() + clusterObjectKey := util.ObjectKey(cluster) + workloadCluster, err := r.managementCluster.GetWorkloadCluster(ctx, clusterObjectKey, microclusterPort) + if err != nil { + logger.Error(err, "failed to create client to workload cluster") + return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) + } if orphanNodeReadyToBeRemoved != "" { - // TODO: If the node is not part of the microcluster, this may still return an error. We should catch that case, - // and proceed with the machine removal. logger.Info("Removing machine from cluster gracefully") if err := workloadCluster.RemoveMachineFromCluster(ctx, orphanNodeReadyToBeRemoved, false); err != nil { logger.Error(err, "Failed to remove machine from cluster gracefully") @@ -164,6 +161,10 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( } } + annotations := map[string]string{} + annotations["orphan-node"] = machineToDelete.Status.NodeRef.Name + kcp.SetAnnotations(annotations) + logger.Info("Removing control plane machine") if err := r.Delete(ctx, machineToDelete); err != nil && !apierrors.IsNotFound(err) { logger.Error(err, "Failed to delete control plane machine") @@ -172,18 +173,6 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return ctrl.Result{}, err } - logger.Info("Orphan node that should be set", "Orphan", machineToDelete.Status.NodeRef.Name) - controlPlane.SetOrphanNode(machineToDelete.Status.NodeRef.Name) - logger.Info("Orphan node that should have been set", "Orphan", controlPlane.GetOrphanNode()) - - logger.Info("Orphan node ready to be removed name", "Orphan", controlPlane.GetOrphanNodeReadyToBeRemoved()) - logger.Info("Orphan node name", "Orphan", controlPlane.GetOrphanNode()) - // Requeue the control plane, in case there are additional operations to perform - - annotations := map[string]string{} - annotations["orphan-node"] = controlPlane.GetOrphanNode() - kcp.SetAnnotations(annotations) - return ctrl.Result{Requeue: true}, nil } From bd5cbf788f8ef10a44766c0ae106c5a3aaf2d19a Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 21:18:28 +0000 Subject: [PATCH 41/43] canonical-k8s: remove wait Signed-off-by: Adrian Vladu --- controlplane/controllers/scale.go | 11 ----------- test/e2e/node_scale_test.go | 20 ++++++++++---------- 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index 9ee7435e..df12f052 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -150,17 +150,6 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( return result, err } - controlPlaneNodes, err := workloadCluster.GetControlPlaneNodes(ctx) - if err != nil { - return ctrl.Result{}, fmt.Errorf("failed to create client to workload cluster: %w", err) - } - for _, node := range controlPlaneNodes.Items { - if time.Since(node.CreationTimestamp.Time) < 5*time.Minute { - logger.Info("The newest control plane is not older than 5 minutes, requeuing to allow for convergence") - return ctrl.Result{Requeue: true}, nil - } - } - annotations := map[string]string{} annotations["orphan-node"] = machineToDelete.Status.NodeRef.Name kcp.SetAnnotations(annotations) diff --git a/test/e2e/node_scale_test.go b/test/e2e/node_scale_test.go index 9a3aa6d7..8cac00f9 100644 --- a/test/e2e/node_scale_test.go +++ b/test/e2e/node_scale_test.go @@ -78,7 +78,7 @@ var _ = Describe("Workload cluster scaling", func() { Context("Scaling a cluster", func() { It("Should create a workload cluster with 1 worker node and scale", func() { - By("Creating a workload cluster with 1 control plane and 1 worker node") + By("Creating a workload cluster with 1 control plane and 0 worker node") ApplyClusterTemplateAndWait(ctx, ApplyClusterTemplateAndWaitInput{ ClusterProxy: bootstrapClusterProxy, ConfigCluster: clusterctl.ConfigClusterInput{ @@ -89,7 +89,7 @@ var _ = Describe("Workload cluster scaling", func() { Namespace: namespace.Name, ClusterName: clusterName, KubernetesVersion: e2eConfig.GetVariable(KubernetesVersion), - ControlPlaneMachineCount: ptr.To(int64(3)), + ControlPlaneMachineCount: ptr.To(int64(1)), WorkerMachineCount: ptr.To(int64(0)), }, WaitForClusterIntervals: e2eConfig.GetIntervals(specName, "wait-cluster"), @@ -97,7 +97,7 @@ var _ = Describe("Workload cluster scaling", func() { WaitForMachineDeployments: e2eConfig.GetIntervals(specName, "wait-worker-nodes"), }, result) - By("Scaling up worker nodes to 3") + By("Scaling up control planes to 3") ApplyClusterTemplateAndWait(ctx, ApplyClusterTemplateAndWaitInput{ ClusterProxy: bootstrapClusterProxy, @@ -109,7 +109,7 @@ var _ = Describe("Workload cluster scaling", func() { Namespace: namespace.Name, ClusterName: clusterName, KubernetesVersion: e2eConfig.GetVariable(KubernetesVersion), - ControlPlaneMachineCount: ptr.To(int64(1)), + ControlPlaneMachineCount: ptr.To(int64(3)), WorkerMachineCount: ptr.To(int64(0)), }, WaitForClusterIntervals: e2eConfig.GetIntervals(specName, "wait-cluster"), @@ -117,7 +117,7 @@ var _ = Describe("Workload cluster scaling", func() { WaitForMachineDeployments: e2eConfig.GetIntervals(specName, "wait-worker-nodes"), }, result) - By("Scaling up control planes to 4") + By("Scaling down control planes to 1") ApplyClusterTemplateAndWait(ctx, ApplyClusterTemplateAndWaitInput{ ClusterProxy: bootstrapClusterProxy, @@ -129,7 +129,7 @@ var _ = Describe("Workload cluster scaling", func() { Namespace: namespace.Name, ClusterName: clusterName, KubernetesVersion: e2eConfig.GetVariable(KubernetesVersion), - ControlPlaneMachineCount: ptr.To(int64(5)), + ControlPlaneMachineCount: ptr.To(int64(1)), WorkerMachineCount: ptr.To(int64(0)), }, WaitForClusterIntervals: e2eConfig.GetIntervals(specName, "wait-cluster"), @@ -137,7 +137,7 @@ var _ = Describe("Workload cluster scaling", func() { WaitForMachineDeployments: e2eConfig.GetIntervals(specName, "wait-worker-nodes"), }, result) - By("Scaling down control planes to 3") + By("Scaling up control planes to 3") ApplyClusterTemplateAndWait(ctx, ApplyClusterTemplateAndWaitInput{ ClusterProxy: bootstrapClusterProxy, @@ -149,7 +149,7 @@ var _ = Describe("Workload cluster scaling", func() { Namespace: namespace.Name, ClusterName: clusterName, KubernetesVersion: e2eConfig.GetVariable(KubernetesVersion), - ControlPlaneMachineCount: ptr.To(int64(1)), + ControlPlaneMachineCount: ptr.To(int64(3)), WorkerMachineCount: ptr.To(int64(0)), }, WaitForClusterIntervals: e2eConfig.GetIntervals(specName, "wait-cluster"), @@ -157,7 +157,7 @@ var _ = Describe("Workload cluster scaling", func() { WaitForMachineDeployments: e2eConfig.GetIntervals(specName, "wait-worker-nodes"), }, result) - By("Scaling down worker nodes to 1") + By("Scaling down control planes to 1") ApplyClusterTemplateAndWait(ctx, ApplyClusterTemplateAndWaitInput{ ClusterProxy: bootstrapClusterProxy, @@ -169,7 +169,7 @@ var _ = Describe("Workload cluster scaling", func() { Namespace: namespace.Name, ClusterName: clusterName, KubernetesVersion: e2eConfig.GetVariable(KubernetesVersion), - ControlPlaneMachineCount: ptr.To(int64(3)), + ControlPlaneMachineCount: ptr.To(int64(1)), WorkerMachineCount: ptr.To(int64(0)), }, WaitForClusterIntervals: e2eConfig.GetIntervals(specName, "wait-cluster"), From b5bf1b08a1ea4298f7e4c8d6639baa36d38329fb Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Fri, 19 Jun 2026 21:25:00 +0000 Subject: [PATCH 42/43] fix linter --- controlplane/controllers/ck8scontrolplane_controller.go | 2 +- controlplane/controllers/scale.go | 3 +-- pkg/ck8s/workload_cluster.go | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/controlplane/controllers/ck8scontrolplane_controller.go b/controlplane/controllers/ck8scontrolplane_controller.go index 284bc182..2426aa0f 100644 --- a/controlplane/controllers/ck8scontrolplane_controller.go +++ b/controlplane/controllers/ck8scontrolplane_controller.go @@ -573,7 +573,7 @@ func (r *CK8sControlPlaneReconciler) reconcile(ctx context.Context, cluster *clu } annotationsKcp := kcp.GetAnnotations() - orphanNode := string(annotationsKcp["orphan-node"]) + orphanNode := annotationsKcp["orphan-node"] controlPlane.SetOrphanNode(orphanNode) orphanNodeReadyToBeRemoved := controlPlane.GetOrphanNodeReadyToBeRemoved() logger.Info("Orphan node ready to be removed name", "Orphan", orphanNodeReadyToBeRemoved) diff --git a/controlplane/controllers/scale.go b/controlplane/controllers/scale.go index df12f052..ff38bb01 100644 --- a/controlplane/controllers/scale.go +++ b/controlplane/controllers/scale.go @@ -22,7 +22,6 @@ import ( "errors" "fmt" "strings" - "time" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -104,7 +103,7 @@ func (r *CK8sControlPlaneReconciler) scaleDownControlPlane( logger := ctrl.LoggerFrom(ctx) annotationsKcp := kcp.GetAnnotations() - orphanNode := string(annotationsKcp["orphan-node"]) + orphanNode := annotationsKcp["orphan-node"] controlPlane.SetOrphanNode(orphanNode) orphanNodeReadyToBeRemoved := controlPlane.GetOrphanNodeReadyToBeRemoved() logger.Info("Orphan node ready to be removed name", "Orphan", orphanNodeReadyToBeRemoved) diff --git a/pkg/ck8s/workload_cluster.go b/pkg/ck8s/workload_cluster.go index 601ea910..55ef05f6 100644 --- a/pkg/ck8s/workload_cluster.go +++ b/pkg/ck8s/workload_cluster.go @@ -447,7 +447,6 @@ func (w *Workload) requestJoinToken(ctx context.Context, name string, worker boo } func (w *Workload) RemoveMachineFromCluster(ctx context.Context, orphanNode string, force bool) (err error) { - request := &apiv1.RemoveNodeRequest{Name: orphanNode, Force: force} // If we see that ignoring control-planes is causing issues, let's consider removing it. From c452467e62203b76d369604938e06beac31742db Mon Sep 17 00:00:00 2001 From: Adrian Vladu Date: Tue, 29 Sep 2026 07:45:59 +0000 Subject: [PATCH 43/43] install k8s_v1.35.3-release-1.35-v2.4_amd64.snap Signed-off-by: Adrian Vladu --- pkg/cloudinit/scripts/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/cloudinit/scripts/install.sh b/pkg/cloudinit/scripts/install.sh index c0b35b3b..fd640475 100644 --- a/pkg/cloudinit/scripts/install.sh +++ b/pkg/cloudinit/scripts/install.sh @@ -38,7 +38,7 @@ retry_snap_install() { systemctl restart rsyslog rm -rf /capi/snap-binaries mkdir -p /capi/snap-binaries - curl -sLk https://github.com/ader1990/cluster-api-k8s/releases/download/pr-226/k8s_v1.35.3-release-1.35-v2.3_amd64.snap --output /capi/snap-binaries/k8s.snap + curl -sLk https://github.com/ader1990/cluster-api-k8s/releases/download/pr-226/k8s_v1.35.3-release-1.35-v2.4_amd64.snap --output /capi/snap-binaries/k8s.snap if [ -f "/capi/etc/snap-channel" ]; then snap_channel="$(cat /capi/etc/snap-channel)"