From d69114fe5623d4ce99504a6354eae3b185029573 Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Tue, 2 Sep 2025 16:11:02 -0400 Subject: [PATCH 01/13] Update everything to work with CAPI v1.11 --- api/v1alpha2/linodecluster_types.go | 2 +- api/v1alpha2/linodemachine_types.go | 2 +- api/v1alpha2/zz_generated.deepcopy.go | 4 +-- cloud/scope/cluster.go | 2 +- cloud/scope/cluster_test.go | 2 +- cloud/scope/firewall.go | 2 +- cloud/scope/machine.go | 2 +- cloud/scope/machine_test.go | 2 +- cloud/scope/placement_group.go | 2 +- cloud/scope/vpc.go | 2 +- cloud/services/domains.go | 6 ++-- cloud/services/domains_test.go | 2 +- cloud/services/loadbalancers.go | 6 ++-- cloud/services/loadbalancers_test.go | 2 +- cmd/main.go | 2 +- ...cture.cluster.x-k8s.io_linodeclusters.yaml | 7 ++-- ...uster.x-k8s.io_linodeclustertemplates.yaml | 7 ++-- go.mod | 13 +++---- go.sum | 32 +++++++++-------- .../controller/linodecluster_controller.go | 20 +++++------ .../linodecluster_controller_helpers.go | 2 +- .../linodecluster_controller_helpers_test.go | 2 +- .../linodecluster_controller_test.go | 24 +++++++++++-- .../controller/linodefirewall_controller.go | 4 +-- .../linodefirewall_controller_test.go | 2 +- .../controller/linodemachine_controller.go | 10 +++--- .../linodemachine_controller_helpers.go | 11 ++---- .../linodemachine_controller_helpers_test.go | 35 +++++++++---------- .../linodemachine_controller_test.go | 21 +++++++---- .../linodemachinetemplate_controller.go | 2 +- .../linodemachinetemplate_controller_test.go | 2 +- .../linodeobjectstoragebucket_controller.go | 4 +-- ...nodeobjectstoragebucket_controller_test.go | 2 +- .../linodeobjectstoragekey_controller.go | 6 ++-- .../linodeobjectstoragekey_controller_test.go | 2 +- .../linodeplacementgroup_controller.go | 16 ++++----- internal/controller/linodevpc_controller.go | 24 ++++++------- .../controller/linodevpc_controller_test.go | 2 +- internal/controller/suite_test.go | 2 +- util/helpers.go | 8 ++--- util/helpers_test.go | 14 ++++---- util/vlanips.go | 2 +- 42 files changed, 171 insertions(+), 145 deletions(-) diff --git a/api/v1alpha2/linodecluster_types.go b/api/v1alpha2/linodecluster_types.go index 322cd9e45..2c1a39a1c 100644 --- a/api/v1alpha2/linodecluster_types.go +++ b/api/v1alpha2/linodecluster_types.go @@ -19,7 +19,7 @@ package v1alpha2 import ( 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/core/v1beta2" ) const ( diff --git a/api/v1alpha2/linodemachine_types.go b/api/v1alpha2/linodemachine_types.go index 58d85b5e0..703895692 100644 --- a/api/v1alpha2/linodemachine_types.go +++ b/api/v1alpha2/linodemachine_types.go @@ -21,7 +21,7 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" 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" ) const ( diff --git a/api/v1alpha2/zz_generated.deepcopy.go b/api/v1alpha2/zz_generated.deepcopy.go index ce1eba52c..4162940e2 100644 --- a/api/v1alpha2/zz_generated.deepcopy.go +++ b/api/v1alpha2/zz_generated.deepcopy.go @@ -25,7 +25,7 @@ import ( "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "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. @@ -1053,7 +1053,7 @@ func (in *LinodeMachineStatus) DeepCopyInto(out *LinodeMachineStatus) { } if in.Addresses != nil { in, out := &in.Addresses, &out.Addresses - *out = make([]v1beta1.MachineAddress, len(*in)) + *out = make([]v1beta2.MachineAddress, len(*in)) copy(*out, *in) } if in.InstanceState != nil { diff --git a/cloud/scope/cluster.go b/cloud/scope/cluster.go index fc4e43edc..caae98c66 100644 --- a/cloud/scope/cluster.go +++ b/cloud/scope/cluster.go @@ -21,7 +21,7 @@ import ( "errors" "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/controller/controllerutil" diff --git a/cloud/scope/cluster_test.go b/cloud/scope/cluster_test.go index bff01ee30..7288adb99 100644 --- a/cloud/scope/cluster_test.go +++ b/cloud/scope/cluster_test.go @@ -27,7 +27,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" infrav1alpha2 "github.com/linode/cluster-api-provider-linode/api/v1alpha2" diff --git a/cloud/scope/firewall.go b/cloud/scope/firewall.go index f8f98fda2..f79764a5b 100644 --- a/cloud/scope/firewall.go +++ b/cloud/scope/firewall.go @@ -19,7 +19,7 @@ import ( "fmt" "k8s.io/client-go/util/retry" - 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/controller/controllerutil" diff --git a/cloud/scope/machine.go b/cloud/scope/machine.go index c2b5f55e1..a74878980 100644 --- a/cloud/scope/machine.go +++ b/cloud/scope/machine.go @@ -7,7 +7,7 @@ import ( corev1 "k8s.io/api/core/v1" "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/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" diff --git a/cloud/scope/machine_test.go b/cloud/scope/machine_test.go index a1a51a756..3c0e6cedd 100644 --- a/cloud/scope/machine_test.go +++ b/cloud/scope/machine_test.go @@ -16,7 +16,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/utils/ptr" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/controller-runtime/pkg/client" infrav1alpha2 "github.com/linode/cluster-api-provider-linode/api/v1alpha2" diff --git a/cloud/scope/placement_group.go b/cloud/scope/placement_group.go index 0cee6268f..9be08f798 100644 --- a/cloud/scope/placement_group.go +++ b/cloud/scope/placement_group.go @@ -21,7 +21,7 @@ import ( "errors" "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/controller/controllerutil" diff --git a/cloud/scope/vpc.go b/cloud/scope/vpc.go index 61eb01003..074946c75 100644 --- a/cloud/scope/vpc.go +++ b/cloud/scope/vpc.go @@ -21,7 +21,7 @@ import ( "errors" "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/controller/controllerutil" diff --git a/cloud/services/domains.go b/cloud/services/domains.go index 1c2852e08..228a13c84 100644 --- a/cloud/services/domains.go +++ b/cloud/services/domains.go @@ -12,7 +12,7 @@ import ( "github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/dns" "github.com/linode/linodego" "golang.org/x/exp/slices" - "sigs.k8s.io/cluster-api/api/v1beta1" + "sigs.k8s.io/cluster-api/api/core/v1beta2" kutil "sigs.k8s.io/cluster-api/util" "github.com/linode/cluster-api-provider-linode/api/v1alpha2" @@ -70,7 +70,7 @@ func getMachineIPs(cscope *scope.ClusterScope) (ipv4IPs, ipv6IPs []string, err e continue } for _, IPs := range eachMachine.Status.Addresses { - if IPs.Type != v1beta1.MachineExternalIP { + if IPs.Type != v1beta2.MachineExternalIP { continue } addr, err := netip.ParseAddr(IPs.Address) @@ -315,7 +315,7 @@ func processLinodeMachine(ctx context.Context, cscope *scope.ClusterScope, machi options := []DNSOptions{} for _, IPs := range machine.Status.Addresses { recordType := linodego.RecordTypeA - if IPs.Type != v1beta1.MachineExternalIP { + if IPs.Type != v1beta2.MachineExternalIP { continue } addr, err := netip.ParseAddr(IPs.Address) diff --git a/cloud/services/domains_test.go b/cloud/services/domains_test.go index 73ff1657e..b018b99c5 100644 --- a/cloud/services/domains_test.go +++ b/cloud/services/domains_test.go @@ -12,7 +12,7 @@ import ( "go.uber.org/mock/gomock" 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" "sigs.k8s.io/controller-runtime/pkg/client" infrav1alpha2 "github.com/linode/cluster-api-provider-linode/api/v1alpha2" diff --git a/cloud/services/loadbalancers.go b/cloud/services/loadbalancers.go index 45973ecd4..4ff3d8e40 100644 --- a/cloud/services/loadbalancers.go +++ b/cloud/services/loadbalancers.go @@ -9,7 +9,7 @@ import ( "github.com/go-logr/logr" "github.com/linode/linodego" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/cluster-api/api/v1beta1" + "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/linode/cluster-api-provider-linode/api/v1alpha2" @@ -399,7 +399,7 @@ func AddNodesToNB(ctx context.Context, logger logr.Logger, clusterScope *scope.C } for _, IPs := range linodeMachine.Status.Addresses { // Look for internal IPs that are NOT linode private IPs (likely VPC IPs) - if IPs.Type == v1beta1.MachineInternalIP && !util.IsLinodePrivateIP(IPs.Address) { + if IPs.Type == v1beta2.MachineInternalIP && !util.IsLinodePrivateIP(IPs.Address) { if err := processAndCreateNodeBalancerNodes(ctx, IPs.Address, clusterScope, nodeBalancerNodes, subnetID); err != nil { logger.Error(err, "Failed to process and create NB nodes") return err @@ -412,7 +412,7 @@ func AddNodesToNB(ctx context.Context, logger logr.Logger, clusterScope *scope.C // We will use private IP address as the default internalIPFound := false for _, IPs := range linodeMachine.Status.Addresses { - if IPs.Type != v1beta1.MachineInternalIP || !util.IsLinodePrivateIP(IPs.Address) { + if IPs.Type != v1beta2.MachineInternalIP || !util.IsLinodePrivateIP(IPs.Address) { continue } internalIPFound = true diff --git a/cloud/services/loadbalancers_test.go b/cloud/services/loadbalancers_test.go index 22825c329..c3d38ea27 100644 --- a/cloud/services/loadbalancers_test.go +++ b/cloud/services/loadbalancers_test.go @@ -14,7 +14,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" "sigs.k8s.io/controller-runtime/pkg/client" infrav1alpha2 "github.com/linode/cluster-api-provider-linode/api/v1alpha2" diff --git a/cmd/main.go b/cmd/main.go index 22d72fc2a..09662659e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -33,7 +33,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" - capi "sigs.k8s.io/cluster-api/api/v1beta1" + capi "sigs.k8s.io/cluster-api/api/core/v1beta2" ctrl "sigs.k8s.io/controller-runtime" crcontroller "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/healthz" diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_linodeclusters.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_linodeclusters.yaml index 4dfa78db0..bc6151cfb 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_linodeclusters.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_linodeclusters.yaml @@ -61,18 +61,19 @@ spec: description: |- controlPlaneEndpoint represents the endpoint used to communicate with the LinodeCluster control plane If ControlPlaneEndpoint is unset then the Nodebalancer ip will be used. + minProperties: 1 properties: host: description: host is the hostname on which the API server is serving. maxLength: 512 + minLength: 1 type: string port: description: port is the port on which the API server is serving. format: int32 + maximum: 65535 + minimum: 1 type: integer - required: - - host - - port type: object credentialsRef: description: |- diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_linodeclustertemplates.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_linodeclustertemplates.yaml index 3647961b1..99a218f43 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_linodeclustertemplates.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_linodeclustertemplates.yaml @@ -54,20 +54,21 @@ spec: description: |- controlPlaneEndpoint represents the endpoint used to communicate with the LinodeCluster control plane If ControlPlaneEndpoint is unset then the Nodebalancer ip will be used. + minProperties: 1 properties: host: description: host is the hostname on which the API server is serving. maxLength: 512 + minLength: 1 type: string port: description: port is the port on which the API server is serving. format: int32 + maximum: 65535 + minimum: 1 type: integer - required: - - host - - port type: object credentialsRef: description: |- diff --git a/go.mod b/go.mod index 226c24ce3..950107e3b 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( k8s.io/apimachinery v0.33.4 k8s.io/client-go v0.33.4 k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 - sigs.k8s.io/cluster-api v1.10.4 + sigs.k8s.io/cluster-api v1.11.0 sigs.k8s.io/controller-runtime v0.21.0 ) @@ -67,11 +67,12 @@ require ( github.com/x448/float16 v0.8.4 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/sync v0.17.0 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect - k8s.io/apiserver v0.33.0 // indirect - k8s.io/component-base v0.33.0 // indirect + k8s.io/apiserver v0.33.3 // indirect + k8s.io/component-base v0.33.3 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect sigs.k8s.io/randfill v1.0.0 // indirect ) @@ -112,7 +113,7 @@ require ( github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect github.com/prometheus/procfs v0.17.0 // indirect - github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/pflag v1.0.7 // indirect github.com/stretchr/objx v0.5.2 // indirect go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 // indirect @@ -149,10 +150,10 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.33.0 // indirect + k8s.io/apiextensions-apiserver v0.33.3 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/go.sum b/go.sum index 72990a42f..1abbff967 100644 --- a/go.sum +++ b/go.sum @@ -73,8 +73,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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.26 h1:xiiEkVB1Dwolb24pkeDUDBfygV9/XsOSq79yFCrhptY= -github.com/coredns/corefile-migration v1.0.26/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= +github.com/coredns/corefile-migration v1.0.27 h1:WIIw5sU0LfGgoGnhdrYdVcto/aWmJoGA/C62iwkU0JM= +github.com/coredns/corefile-migration v1.0.27/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY= 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= @@ -241,8 +241,9 @@ github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M= +github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 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= @@ -331,6 +332,8 @@ go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA= go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6mUg= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M= @@ -420,18 +423,18 @@ 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.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= -k8s.io/apiextensions-apiserver v0.33.0 h1:d2qpYL7Mngbsc1taA4IjJPRJ9ilnsXIrndH+r9IimOs= -k8s.io/apiextensions-apiserver v0.33.0/go.mod h1:VeJ8u9dEEN+tbETo+lFkwaaZPg6uFKLGj5vyNEwwSzc= +k8s.io/apiextensions-apiserver v0.33.3 h1:qmOcAHN6DjfD0v9kxL5udB27SRP6SG/MTopmge3MwEs= +k8s.io/apiextensions-apiserver v0.33.3/go.mod h1:oROuctgo27mUsyp9+Obahos6CWcMISSAPzQ77CAQGz8= k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s= k8s.io/apimachinery v0.33.4/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/apiserver v0.33.0 h1:QqcM6c+qEEjkOODHppFXRiw/cE2zP85704YrQ9YaBbc= -k8s.io/apiserver v0.33.0/go.mod h1:EixYOit0YTxt8zrO2kBU7ixAtxFce9gKGq367nFmqI8= +k8s.io/apiserver v0.33.3 h1:Wv0hGc+QFdMJB4ZSiHrCgN3zL3QRatu56+rpccKC3J4= +k8s.io/apiserver v0.33.3/go.mod h1:05632ifFEe6TxwjdAIrwINHWE2hLwyADFk5mBsQa15E= k8s.io/client-go v0.33.4 h1:TNH+CSu8EmXfitntjUPwaKVPN0AYMbc9F1bBS8/ABpw= k8s.io/client-go v0.33.4/go.mod h1:LsA0+hBG2DPwovjd931L/AoaezMPX9CmBgyVyBZmbCY= -k8s.io/cluster-bootstrap v0.32.3 h1:AqIpsUhB6MUeaAsl1WvaUw54AHRd2hfZrESlKChtd8s= -k8s.io/cluster-bootstrap v0.32.3/go.mod h1:CHbBwgOb6liDV6JFUTkx5t85T2xidy0sChBDoyYw344= -k8s.io/component-base v0.33.0 h1:Ot4PyJI+0JAD9covDhwLp9UNkUja209OzsJ4FzScBNk= -k8s.io/component-base v0.33.0/go.mod h1:aXYZLbw3kihdkOPMDhWbjGCO6sg+luw554KP51t8qCU= +k8s.io/cluster-bootstrap v0.33.3 h1:u2NTxJ5CFSBFXaDxLQoOWMly8eni31psVso+caq6uwI= +k8s.io/cluster-bootstrap v0.33.3/go.mod h1:p970f8u8jf273zyQ5raD8WUu2XyAl0SAWOY82o7i/ds= +k8s.io/component-base v0.33.3 h1:mlAuyJqyPlKZM7FyaoM/LcunZaaY353RXiOd2+B5tGA= +k8s.io/component-base v0.33.3/go.mod h1:ktBVsBzkI3imDuxYXmVxZ2zxJnYTZ4HAsVj9iF09qp4= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= @@ -440,8 +443,8 @@ k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6J k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/cluster-api v1.10.4 h1:5mdyWLGbbwOowWrjqM/J9N600QnxTohu5J1/1YR6g7c= -sigs.k8s.io/cluster-api v1.10.4/go.mod h1:68GJs286ZChsncp+TxYNj/vhy2NWokiPtH4+SA0afs0= +sigs.k8s.io/cluster-api v1.11.0 h1:4ZqKxjhdP3F/vvHMd675rGsDrT/siggnFPt5eKQ8nkI= +sigs.k8s.io/cluster-api v1.11.0/go.mod h1:gGmNlHrtJe3z0YV3J6JRy5Rwh9SfzokjQaS+Fv3DBPE= sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= @@ -451,5 +454,6 @@ 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.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -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/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/internal/controller/linodecluster_controller.go b/internal/controller/linodecluster_controller.go index 8b269e712..156314b83 100644 --- a/internal/controller/linodecluster_controller.go +++ b/internal/controller/linodecluster_controller.go @@ -29,7 +29,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilerrors "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/core/v1beta2" kutil "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/predicates" ctrl "sigs.k8s.io/controller-runtime" @@ -447,9 +447,9 @@ func (r *LinodeClusterReconciler) reconcileDelete(ctx context.Context, logger lo case clusterScope.LinodeCluster.Spec.Network.LoadBalancerType == lbTypeExternal: logger.Info("LoadBalacing managed externally, nothing to do.") clusterScope.LinodeCluster.SetCondition(metav1.Condition{ - Type: string(clusterv1.ReadyCondition), + Type: clusterv1.ReadyCondition, Status: metav1.ConditionFalse, - Reason: string(clusterv1.DeletedReason), + Reason: clusterv1.DeletionCompletedReason, Message: "Deletion in progress", }) r.Recorder.Event(clusterScope.LinodeCluster, corev1.EventTypeWarning, "LoadBalancing managed externally", "LoadBalancing managed externally, nothing to do.") @@ -459,12 +459,12 @@ func (r *LinodeClusterReconciler) reconcileDelete(ctx context.Context, logger lo return fmt.Errorf("remove machine from loadbalancer: %w", err) } clusterScope.LinodeCluster.SetCondition(metav1.Condition{ - Type: string(clusterv1.ReadyCondition), + Type: clusterv1.ReadyCondition, Status: metav1.ConditionFalse, - Reason: string(clusterv1.DeletedReason), + Reason: clusterv1.DeletionCompletedReason, Message: "Load balancing for Type DNS deleted", }) - r.Recorder.Event(clusterScope.LinodeCluster, corev1.EventTypeNormal, clusterv1.DeletedReason, "Load balancing for Type DNS deleted") + r.Recorder.Event(clusterScope.LinodeCluster, corev1.EventTypeNormal, clusterv1.DeletionCompletedReason, "Load balancing for Type DNS deleted") case clusterScope.LinodeCluster.Spec.Network.LoadBalancerType == lbTypeNB && clusterScope.LinodeCluster.Spec.Network.NodeBalancerID == nil: logger.Info("NodeBalancer ID is missing for Type NodeBalancer, nothing to do") @@ -483,12 +483,12 @@ func (r *LinodeClusterReconciler) reconcileDelete(ctx context.Context, logger lo } clusterScope.LinodeCluster.SetCondition(metav1.Condition{ - Type: string(clusterv1.ReadyCondition), + Type: clusterv1.ReadyCondition, Status: metav1.ConditionFalse, - Reason: string(clusterv1.DeletedReason), + Reason: clusterv1.DeletionCompletedReason, Message: "Load balancer for Type NodeBalancer deleted", }) - r.Recorder.Event(clusterScope.LinodeCluster, corev1.EventTypeNormal, clusterv1.DeletedReason, "Load balancer for Type NodeBalancer deleted") + r.Recorder.Event(clusterScope.LinodeCluster, corev1.EventTypeNormal, clusterv1.DeletionCompletedReason, "Load balancer for Type NodeBalancer deleted") clusterScope.LinodeCluster.Spec.Network.NodeBalancerID = nil clusterScope.LinodeCluster.Spec.Network.ApiserverNodeBalancerConfigID = nil @@ -525,7 +525,7 @@ func (r *LinodeClusterReconciler) SetupWithManager(mgr ctrl.Manager, options crc handler.EnqueueRequestsFromMapFunc( kutil.ClusterToInfrastructureMapFunc(context.TODO(), infrav1alpha2.GroupVersion.WithKind("LinodeCluster"), mgr.GetClient(), &infrav1alpha2.LinodeCluster{}), ), - builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureReady(mgr.GetScheme(), mgr.GetLogger())), + builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureProvisioned(mgr.GetScheme(), mgr.GetLogger())), ). Watches( &infrav1alpha2.LinodeMachine{}, diff --git a/internal/controller/linodecluster_controller_helpers.go b/internal/controller/linodecluster_controller_helpers.go index adbdd31df..1313adee6 100644 --- a/internal/controller/linodecluster_controller_helpers.go +++ b/internal/controller/linodecluster_controller_helpers.go @@ -8,7 +8,7 @@ import ( "github.com/go-logr/logr" "github.com/linode/linodego" "k8s.io/apimachinery/pkg/types" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" kutil "sigs.k8s.io/cluster-api/util" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/internal/controller/linodecluster_controller_helpers_test.go b/internal/controller/linodecluster_controller_helpers_test.go index 88d36aa08..70f37297c 100644 --- a/internal/controller/linodecluster_controller_helpers_test.go +++ b/internal/controller/linodecluster_controller_helpers_test.go @@ -14,7 +14,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - 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/internal/controller/linodecluster_controller_test.go b/internal/controller/linodecluster_controller_test.go index d8726d20e..c8bba1d55 100644 --- a/internal/controller/linodecluster_controller_test.go +++ b/internal/controller/linodecluster_controller_test.go @@ -26,7 +26,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" "sigs.k8s.io/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -63,6 +63,9 @@ var _ = Describe("cluster-lifecycle", Ordered, Label("cluster", "cluster-lifecyc linodeCluster := infrav1alpha2.LinodeCluster{ ObjectMeta: metadata, Spec: infrav1alpha2.LinodeClusterSpec{ + ControlPlaneEndpoint: clusterv1.APIEndpoint{ + Port: int32(controlPlaneEndpointPort), + }, Region: "us-ord", VPCRef: &corev1.ObjectReference{Name: "vpctest", Namespace: defaultNamespace}, }, @@ -373,6 +376,10 @@ var _ = Describe("cluster-lifecycle-dns", Ordered, Label("cluster", "cluster-lif ObjectMeta: metadata, Spec: infrav1alpha2.LinodeClusterSpec{ Region: "us-ord", + ControlPlaneEndpoint: clusterv1.APIEndpoint{ + Host: controlPlaneEndpointHost, + Port: int32(controlPlaneEndpointPort), + }, Network: infrav1alpha2.NetworkSpec{ LoadBalancerType: "dns", DNSRootDomain: "lkedevs.net", @@ -623,11 +630,21 @@ var _ = Describe("dns-override-endpoint", Ordered, Label("cluster", "dns-overrid } cluster := clusterv1.Cluster{ ObjectMeta: metadata, + Spec: clusterv1.ClusterSpec{ + ControlPlaneEndpoint: clusterv1.APIEndpoint{ + Host: controlPlaneEndpointHost, + Port: int32(controlPlaneEndpointPort), + }, + }, } linodeCluster := infrav1alpha2.LinodeCluster{ ObjectMeta: metadata, Spec: infrav1alpha2.LinodeClusterSpec{ Region: "us-ord", + ControlPlaneEndpoint: clusterv1.APIEndpoint{ + Host: controlPlaneEndpointHost, + Port: int32(controlPlaneEndpointPort), + }, Network: infrav1alpha2.NetworkSpec{ ApiserverLoadBalancerPort: controlPlaneEndpointPort, LoadBalancerType: "dns", @@ -748,7 +765,10 @@ var _ = Describe("cluster-with-direct-vpcid", Ordered, Label("cluster", "direct- ObjectMeta: metadata, Spec: infrav1alpha2.LinodeClusterSpec{ Region: "us-ord", - VPCID: ptr.To(12345), + ControlPlaneEndpoint: clusterv1.APIEndpoint{ + Port: 6443, + }, + VPCID: ptr.To(12345), }, } diff --git a/internal/controller/linodefirewall_controller.go b/internal/controller/linodefirewall_controller.go index 0c53571d8..8c1877b40 100644 --- a/internal/controller/linodefirewall_controller.go +++ b/internal/controller/linodefirewall_controller.go @@ -29,7 +29,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilerrors "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/core/v1beta2" kutil "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/predicates" ctrl "sigs.k8s.io/controller-runtime" @@ -298,7 +298,7 @@ func (r *LinodeFirewallReconciler) SetupWithManager(mgr ctrl.Manager, options cr Watches( &clusterv1.Cluster{}, handler.EnqueueRequestsFromMapFunc(linodeFirewallMapper), - builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureReady(mgr.GetScheme(), mgr.GetLogger())), + builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureProvisioned(mgr.GetScheme(), mgr.GetLogger())), ). Watches( &infrav1alpha2.AddressSet{}, diff --git a/internal/controller/linodefirewall_controller_test.go b/internal/controller/linodefirewall_controller_test.go index fe00c3a6b..486133192 100644 --- a/internal/controller/linodefirewall_controller_test.go +++ b/internal/controller/linodefirewall_controller_test.go @@ -26,7 +26,7 @@ import ( "go.uber.org/mock/gomock" 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/core/v1beta2" "sigs.k8s.io/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/internal/controller/linodemachine_controller.go b/internal/controller/linodemachine_controller.go index 87393719c..a7ac015c6 100644 --- a/internal/controller/linodemachine_controller.go +++ b/internal/controller/linodemachine_controller.go @@ -32,7 +32,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilerrors "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/core/v1beta2" kutil "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/predicates" ctrl "sigs.k8s.io/controller-runtime" @@ -889,13 +889,13 @@ func (r *LinodeMachineReconciler) reconcileDelete( } machineScope.LinodeMachine.SetCondition(metav1.Condition{ - Type: string(clusterv1.ReadyCondition), + Type: clusterv1.ReadyCondition, Status: metav1.ConditionFalse, - Reason: string(clusterv1.DeletedReason), + Reason: clusterv1.DeletionCompletedReason, Message: "instance deleted", }) - r.Recorder.Event(machineScope.LinodeMachine, corev1.EventTypeNormal, clusterv1.DeletedReason, "instance has cleaned up") + r.Recorder.Event(machineScope.LinodeMachine, corev1.EventTypeNormal, clusterv1.DeletionCompletedReason, "instance has cleaned up") machineScope.LinodeMachine.Spec.ProviderID = nil machineScope.LinodeMachine.Status.InstanceState = nil @@ -934,7 +934,7 @@ func (r *LinodeMachineReconciler) SetupWithManager(mgr ctrl.Manager, options crc Watches( &clusterv1.Cluster{}, handler.EnqueueRequestsFromMapFunc(linodeMachineMapper), - builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureReady(mgr.GetScheme(), mgr.GetLogger())), + builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureProvisioned(mgr.GetScheme(), mgr.GetLogger())), ). // we care about reconciling on metadata updates for LinodeMachines because the OwnerRef for the Machine is needed WithEventFilter(predicate.And( diff --git a/internal/controller/linodemachine_controller_helpers.go b/internal/controller/linodemachine_controller_helpers.go index 888c7dd9c..fb1b8df43 100644 --- a/internal/controller/linodemachine_controller_helpers.go +++ b/internal/controller/linodemachine_controller_helpers.go @@ -38,7 +38,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" 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" kutil "sigs.k8s.io/cluster-api/util" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -396,18 +396,13 @@ func requestsForCluster(ctx context.Context, tracedClient client.Client, namespa result := make([]ctrl.Request, 0, len(machineList.Items)) for _, item := range machineList.Items { - if item.Spec.InfrastructureRef.GroupVersionKind().Kind != "LinodeMachine" || item.Spec.InfrastructureRef.Name == "" { + if item.Spec.InfrastructureRef.Kind != "LinodeMachine" || item.Spec.InfrastructureRef.Name == "" { continue } - infraNs := item.Spec.InfrastructureRef.Namespace - if infraNs == "" { - infraNs = item.Namespace - } - result = append(result, ctrl.Request{ NamespacedName: client.ObjectKey{ - Namespace: infraNs, + Namespace: item.Namespace, Name: item.Spec.InfrastructureRef.Name, }, }) diff --git a/internal/controller/linodemachine_controller_helpers_test.go b/internal/controller/linodemachine_controller_helpers_test.go index 10f29bd1c..9a045e65f 100644 --- a/internal/controller/linodemachine_controller_helpers_test.go +++ b/internal/controller/linodemachine_controller_helpers_test.go @@ -23,7 +23,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/utils/ptr" - "sigs.k8s.io/cluster-api/api/v1beta1" + "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/controller-runtime/pkg/client" infrav1alpha2 "github.com/linode/cluster-api-provider-linode/api/v1alpha2" @@ -140,13 +140,13 @@ func TestSetUserData(t *testing.T) { }{ { name: "Success - SetUserData metadata", - machineScope: &scope.MachineScope{Machine: &v1beta1.Machine{ - Spec: v1beta1.MachineSpec{ + machineScope: &scope.MachineScope{Machine: &v1beta2.Machine{ + Spec: v1beta2.MachineSpec{ ClusterName: "", - Bootstrap: v1beta1.Bootstrap{ + Bootstrap: v1beta2.Bootstrap{ DataSecretName: ptr.To("test-data"), }, - InfrastructureRef: corev1.ObjectReference{}, + InfrastructureRef: v1beta2.ContractVersionedObjectReference{}, }, }, LinodeMachine: &infrav1alpha2.LinodeMachine{ ObjectMeta: metav1.ObjectMeta{ @@ -173,13 +173,13 @@ func TestSetUserData(t *testing.T) { }, { name: "Success - SetUserData metadata and cluster object store (large bootstrap data)", - machineScope: &scope.MachineScope{Machine: &v1beta1.Machine{ - Spec: v1beta1.MachineSpec{ + machineScope: &scope.MachineScope{Machine: &v1beta2.Machine{ + Spec: v1beta2.MachineSpec{ ClusterName: "", - Bootstrap: v1beta1.Bootstrap{ + Bootstrap: v1beta2.Bootstrap{ DataSecretName: ptr.To("test-data"), }, - InfrastructureRef: corev1.ObjectReference{}, + InfrastructureRef: v1beta2.ContractVersionedObjectReference{}, }, }, LinodeMachine: &infrav1alpha2.LinodeMachine{ ObjectMeta: metav1.ObjectMeta{ @@ -230,14 +230,13 @@ https://object.bucket.example.com }, { name: "Error - SetUserData get bootstrap data", - machineScope: &scope.MachineScope{Machine: &v1beta1.Machine{ - Spec: v1beta1.MachineSpec{ + machineScope: &scope.MachineScope{Machine: &v1beta2.Machine{ + Spec: v1beta2.MachineSpec{ ClusterName: "", - Bootstrap: v1beta1.Bootstrap{ - ConfigRef: nil, + Bootstrap: v1beta2.Bootstrap{ DataSecretName: nil, }, - InfrastructureRef: corev1.ObjectReference{}, + InfrastructureRef: v1beta2.ContractVersionedObjectReference{}, }, }, LinodeMachine: &infrav1alpha2.LinodeMachine{ ObjectMeta: metav1.ObjectMeta{ @@ -255,13 +254,13 @@ https://object.bucket.example.com }, { name: "Error - SetUserData failed to upload to Cluster Object Store", - machineScope: &scope.MachineScope{Machine: &v1beta1.Machine{ - Spec: v1beta1.MachineSpec{ + machineScope: &scope.MachineScope{Machine: &v1beta2.Machine{ + Spec: v1beta2.MachineSpec{ ClusterName: "", - Bootstrap: v1beta1.Bootstrap{ + Bootstrap: v1beta2.Bootstrap{ DataSecretName: ptr.To("test-data"), }, - InfrastructureRef: corev1.ObjectReference{}, + InfrastructureRef: v1beta2.ContractVersionedObjectReference{}, }, }, LinodeMachine: &infrav1alpha2.LinodeMachine{ ObjectMeta: metav1.ObjectMeta{ diff --git a/internal/controller/linodemachine_controller_test.go b/internal/controller/linodemachine_controller_test.go index 0c3ead466..3777e52de 100644 --- a/internal/controller/linodemachine_controller_test.go +++ b/internal/controller/linodemachine_controller_test.go @@ -32,7 +32,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/record" "k8s.io/utils/ptr" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/util/patch" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -72,6 +72,9 @@ var _ = Describe("create", Label("machine", "create"), func() { Namespace: defaultNamespace, }, Spec: infrav1alpha2.LinodeClusterSpec{ + ControlPlaneEndpoint: clusterv1.APIEndpoint{ + Port: 6443, + }, Region: "us-east", Network: infrav1alpha2.NetworkSpec{ NodeBalancerID: ptr.To(1), @@ -1389,6 +1392,9 @@ var _ = Describe("machine-lifecycle", Ordered, Label("machine", "machine-lifecyc }, Spec: infrav1alpha2.LinodeClusterSpec{ Region: "us-east", + ControlPlaneEndpoint: clusterv1.APIEndpoint{ + Port: 6443, + }, Network: infrav1alpha2.NetworkSpec{ NodeBalancerID: ptr.To(1), ApiserverNodeBalancerConfigID: ptr.To(2), @@ -1410,9 +1416,8 @@ var _ = Describe("machine-lifecycle", Ordered, Label("machine", "machine-lifecyc Namespace: namespace, }, Spec: clusterv1.ClusterSpec{ - InfrastructureRef: &corev1.ObjectReference{ - Name: "test-cluster", - Namespace: namespace, + InfrastructureRef: clusterv1.ContractVersionedObjectReference{ + Name: "test-cluster", }, }, } @@ -1712,6 +1717,9 @@ var _ = Describe("machine-update", Ordered, Label("machine", "machine-update"), Labels: make(map[string]string), }, Spec: infrav1alpha2.LinodeClusterSpec{ + ControlPlaneEndpoint: clusterv1.APIEndpoint{ + Port: 6443, + }, Region: "us-east", Network: infrav1alpha2.NetworkSpec{ NodeBalancerID: ptr.To(1), @@ -1738,9 +1746,8 @@ var _ = Describe("machine-update", Ordered, Label("machine", "machine-update"), Namespace: namespace, }, Spec: clusterv1.ClusterSpec{ - InfrastructureRef: &corev1.ObjectReference{ - Name: "test-cluster-2", - Namespace: namespace, + InfrastructureRef: clusterv1.ContractVersionedObjectReference{ + Name: "test-cluster-2", }, }, } diff --git a/internal/controller/linodemachinetemplate_controller.go b/internal/controller/linodemachinetemplate_controller.go index b00c6b13b..264b8bb0f 100644 --- a/internal/controller/linodemachinetemplate_controller.go +++ b/internal/controller/linodemachinetemplate_controller.go @@ -26,7 +26,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilerrors "k8s.io/apimachinery/pkg/util/errors" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/cluster-api/util/patch" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/internal/controller/linodemachinetemplate_controller_test.go b/internal/controller/linodemachinetemplate_controller_test.go index 265a7cb6d..14c3878a1 100644 --- a/internal/controller/linodemachinetemplate_controller_test.go +++ b/internal/controller/linodemachinetemplate_controller_test.go @@ -23,7 +23,7 @@ import ( "github.com/linode/cluster-api-provider-linode/cloud/scope" "github.com/linode/cluster-api-provider-linode/mock" 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/cluster-api/util/patch" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/internal/controller/linodeobjectstoragebucket_controller.go b/internal/controller/linodeobjectstoragebucket_controller.go index 578054066..de210cdf8 100644 --- a/internal/controller/linodeobjectstoragebucket_controller.go +++ b/internal/controller/linodeobjectstoragebucket_controller.go @@ -28,7 +28,7 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/client-go/tools/record" "k8s.io/client-go/util/retry" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" kutil "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/predicates" ctrl "sigs.k8s.io/controller-runtime" @@ -252,7 +252,7 @@ func (r *LinodeObjectStorageBucketReconciler) SetupWithManager(mgr ctrl.Manager, Watches( &clusterv1.Cluster{}, handler.EnqueueRequestsFromMapFunc(linodeObjectStorageBucketMapper), - builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureReady(mgr.GetScheme(), mgr.GetLogger())), + builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureProvisioned(mgr.GetScheme(), mgr.GetLogger())), ).Complete(wrappedruntimereconciler.NewRuntimeReconcilerWithTracing(r, wrappedruntimereconciler.DefaultDecorator())) if err != nil { return fmt.Errorf("failed to build controller: %w", err) diff --git a/internal/controller/linodeobjectstoragebucket_controller_test.go b/internal/controller/linodeobjectstoragebucket_controller_test.go index 9542050e8..dc07ce78e 100644 --- a/internal/controller/linodeobjectstoragebucket_controller_test.go +++ b/internal/controller/linodeobjectstoragebucket_controller_test.go @@ -27,7 +27,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" - 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" "sigs.k8s.io/controller-runtime/pkg/reconcile" diff --git a/internal/controller/linodeobjectstoragekey_controller.go b/internal/controller/linodeobjectstoragekey_controller.go index a00371482..5b2699108 100644 --- a/internal/controller/linodeobjectstoragekey_controller.go +++ b/internal/controller/linodeobjectstoragekey_controller.go @@ -29,7 +29,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilerrors "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/core/v1beta2" kutil "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/predicates" ctrl "sigs.k8s.io/controller-runtime" @@ -278,7 +278,7 @@ func (r *LinodeObjectStorageKeyReconciler) reconcileDelete(ctx context.Context, return err } - r.Recorder.Event(keyScope.Key, clusterv1.DeletedReason, "KeyRevoked", "Object storage key revoked") + r.Recorder.Event(keyScope.Key, clusterv1.DeletionCompletedReason, "KeyRevoked", "Object storage key revoked") // If this key's Secret was generated in another namespace, manually delete it since it has no owner reference. if keyScope.Key.Spec.Namespace != keyScope.Key.Namespace { @@ -332,7 +332,7 @@ func (r *LinodeObjectStorageKeyReconciler) SetupWithManager(mgr ctrl.Manager, op Watches( &clusterv1.Cluster{}, handler.EnqueueRequestsFromMapFunc(linodeObjectStorageKeyMapper), - builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureReady(mgr.GetScheme(), mgr.GetLogger())), + builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureProvisioned(mgr.GetScheme(), mgr.GetLogger())), ).Complete(wrappedruntimereconciler.NewRuntimeReconcilerWithTracing(r, wrappedruntimereconciler.DefaultDecorator())) if err != nil { return fmt.Errorf("failed to build controller: %w", err) diff --git a/internal/controller/linodeobjectstoragekey_controller_test.go b/internal/controller/linodeobjectstoragekey_controller_test.go index 061a1e20c..3263da95d 100644 --- a/internal/controller/linodeobjectstoragekey_controller_test.go +++ b/internal/controller/linodeobjectstoragekey_controller_test.go @@ -30,7 +30,7 @@ import ( "k8s.io/client-go/kubernetes/scheme" "k8s.io/utils/ptr" clusteraddonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta1" - 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" "sigs.k8s.io/controller-runtime/pkg/reconcile" diff --git a/internal/controller/linodeplacementgroup_controller.go b/internal/controller/linodeplacementgroup_controller.go index 7acda247f..04690b29d 100644 --- a/internal/controller/linodeplacementgroup_controller.go +++ b/internal/controller/linodeplacementgroup_controller.go @@ -29,7 +29,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilerrors "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/core/v1beta2" kutil "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/predicates" ctrl "sigs.k8s.io/controller-runtime" @@ -289,12 +289,12 @@ func (r *LinodePlacementGroupReconciler) reconcileDelete(ctx context.Context, lo // Wait timeout exceeded, fail the deletion logger.Error(nil, "Placement Group deletion timed out waiting for node(s) to detach", "timeout", waitTimeout) pgScope.LinodePlacementGroup.SetCondition(metav1.Condition{ - Type: string(clusterv1.ReadyCondition), + Type: clusterv1.ReadyCondition, Status: metav1.ConditionFalse, - Reason: string(clusterv1.DeletionFailedReason), + Reason: clusterv1.NotDeletingReason, Message: fmt.Sprintf("skipped due to %d node(s) still attached after %s timeout", len(pg.Members), waitTimeout), }) - r.Recorder.Eventf(pgScope.LinodePlacementGroup, corev1.EventTypeWarning, clusterv1.DeletionFailedReason, "Will not delete Placement Group %d with %d node(s) attached after %s timeout", pg.ID, len(pg.Members), waitTimeout) + r.Recorder.Eventf(pgScope.LinodePlacementGroup, corev1.EventTypeWarning, clusterv1.NotDeletingReason, "Will not delete Placement Group %d with %d node(s) attached after %s timeout", pg.ID, len(pg.Members), waitTimeout) return ctrl.Result{}, errors.New("will not delete Placement Group with node(s) attached") } @@ -325,13 +325,13 @@ func (r *LinodePlacementGroupReconciler) reconcileDelete(ctx context.Context, lo } pgScope.LinodePlacementGroup.SetCondition(metav1.Condition{ - Type: string(clusterv1.ReadyCondition), + Type: clusterv1.ReadyCondition, Status: metav1.ConditionFalse, - Reason: string(clusterv1.DeletedReason), + Reason: clusterv1.DeletionCompletedReason, Message: "Placement Group deleted", }) - r.Recorder.Event(pgScope.LinodePlacementGroup, corev1.EventTypeNormal, clusterv1.DeletedReason, "Placement Group has been cleaned up") + r.Recorder.Event(pgScope.LinodePlacementGroup, corev1.EventTypeNormal, clusterv1.DeletionCompletedReason, "Placement Group has been cleaned up") pgScope.LinodePlacementGroup.Spec.PGID = nil @@ -386,7 +386,7 @@ func (r *LinodePlacementGroupReconciler) SetupWithManager(mgr ctrl.Manager, opti Watches( &clusterv1.Cluster{}, handler.EnqueueRequestsFromMapFunc(linodePlacementGroupMapper), - builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureReady(mgr.GetScheme(), mgr.GetLogger())), + builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureProvisioned(mgr.GetScheme(), mgr.GetLogger())), ).Complete(wrappedruntimereconciler.NewRuntimeReconcilerWithTracing(r, wrappedruntimereconciler.DefaultDecorator())) if err != nil { return fmt.Errorf("failed to build controller: %w", err) diff --git a/internal/controller/linodevpc_controller.go b/internal/controller/linodevpc_controller.go index b0f57d412..8e38aaee7 100644 --- a/internal/controller/linodevpc_controller.go +++ b/internal/controller/linodevpc_controller.go @@ -30,7 +30,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilerrors "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/core/v1beta2" kutil "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/predicates" ctrl "sigs.k8s.io/controller-runtime" @@ -270,7 +270,7 @@ func (r *LinodeVPCReconciler) reconcileUpdate(ctx context.Context, logger logr.L if err := reconcileVPC(ctx, vpcScope, logger); err != nil { logger.Error(err, "Failed to update VPC") vpcScope.LinodeVPC.SetCondition(metav1.Condition{ - Type: string(clusterv1.ReadyCondition), + Type: clusterv1.ReadyCondition, Status: metav1.ConditionFalse, Reason: string(infrav1alpha2.UpdateVPCError), Message: err.Error(), @@ -299,12 +299,12 @@ func (r *LinodeVPCReconciler) reconcileDelete(ctx context.Context, logger logr.L } vpcScope.LinodeVPC.SetCondition(metav1.Condition{ - Type: string(clusterv1.ReadyCondition), + Type: clusterv1.ReadyCondition, Status: metav1.ConditionFalse, - Reason: string(clusterv1.DeletedReason), + Reason: clusterv1.DeletionCompletedReason, Message: "VPC deleted", }) - r.Recorder.Event(vpcScope.LinodeVPC, corev1.EventTypeNormal, clusterv1.DeletedReason, "VPC has cleaned up") + r.Recorder.Event(vpcScope.LinodeVPC, corev1.EventTypeNormal, clusterv1.DeletionCompletedReason, "VPC is cleaning up") vpcScope.LinodeVPC.Spec.VPCID = nil @@ -337,9 +337,9 @@ func (r *LinodeVPCReconciler) handleRetainedVPC(ctx context.Context, logger logr } vpcScope.LinodeVPC.SetCondition(metav1.Condition{ - Type: string(clusterv1.ReadyCondition), + Type: clusterv1.ReadyCondition, Status: metav1.ConditionFalse, - Reason: string(clusterv1.DeletedReason), + Reason: clusterv1.NotDeletingReason, Message: "VPC retained as requested, associated cloud resource was not deleted.", }) @@ -397,9 +397,9 @@ func (r *LinodeVPCReconciler) handleRetainedSubnets(ctx context.Context, logger } vpcScope.LinodeVPC.SetCondition(metav1.Condition{ - Type: string(clusterv1.ReadyCondition), + Type: clusterv1.ReadyCondition, Status: metav1.ConditionFalse, - Reason: string(clusterv1.DeletionFailedReason), + Reason: clusterv1.NotDeletingReason, Message: fmt.Sprintf("will not delete subnet %d with node(s) attached", subnet.SubnetID), }) return fmt.Errorf("will not delete subnet %d with node(s) attached", subnet.SubnetID) @@ -450,9 +450,9 @@ func (r *LinodeVPCReconciler) deleteVPCResources(ctx context.Context, logger log } vpcScope.LinodeVPC.SetCondition(metav1.Condition{ - Type: string(clusterv1.ReadyCondition), + Type: clusterv1.ReadyCondition, Status: metav1.ConditionFalse, - Reason: string(clusterv1.DeletionFailedReason), + Reason: clusterv1.NotDeletingReason, Message: "skipped due to node(s) attached", }) return errors.New("will not delete VPC with node(s) attached") @@ -505,7 +505,7 @@ func (r *LinodeVPCReconciler) SetupWithManager(mgr ctrl.Manager, options crcontr Watches( &clusterv1.Cluster{}, handler.EnqueueRequestsFromMapFunc(linodeVPCMapper), - builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureReady(mgr.GetScheme(), mgr.GetLogger())), + builder.WithPredicates(predicates.ClusterPausedTransitionsOrInfrastructureProvisioned(mgr.GetScheme(), mgr.GetLogger())), ).Complete(wrappedruntimereconciler.NewRuntimeReconcilerWithTracing(r, wrappedruntimereconciler.DefaultDecorator())) if err != nil { return fmt.Errorf("failed to build controller: %w", err) diff --git a/internal/controller/linodevpc_controller_test.go b/internal/controller/linodevpc_controller_test.go index 9f25fe7c8..b3e1425a6 100644 --- a/internal/controller/linodevpc_controller_test.go +++ b/internal/controller/linodevpc_controller_test.go @@ -26,7 +26,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" 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" "sigs.k8s.io/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/internal/controller/suite_test.go b/internal/controller/suite_test.go index a9c61e327..ae76a827e 100644 --- a/internal/controller/suite_test.go +++ b/internal/controller/suite_test.go @@ -28,7 +28,7 @@ import ( "golang.org/x/mod/modfile" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" - 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/envtest" logf "sigs.k8s.io/controller-runtime/pkg/log" diff --git a/util/helpers.go b/util/helpers.go index 084011db3..65949f574 100644 --- a/util/helpers.go +++ b/util/helpers.go @@ -13,7 +13,7 @@ import ( "github.com/linode/linodego" "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/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/log" @@ -105,15 +105,15 @@ func IsLinodePrivateIP(ipAddress string) bool { func SetOwnerReferenceToLinodeCluster(ctx context.Context, k8sclient client.Client, cluster *clusterv1.Cluster, obj client.Object, scheme *runtime.Scheme) error { logger := log.Log.WithName("SetOwnerReferenceToLinodeCluster") - if cluster == nil || cluster.Spec.InfrastructureRef == nil { - logger.Info("the Cluster or InfrastructureRef is nil, cannot fetch LinodeCluster") + if cluster == nil || cluster.Spec.InfrastructureRef.Name == "" { + logger.Info("the Cluster is nil, cannot fetch LinodeCluster") return nil } var linodeCluster infrav1alpha2.LinodeCluster key := types.NamespacedName{ - Namespace: cluster.Spec.InfrastructureRef.Namespace, Name: cluster.Spec.InfrastructureRef.Name, + Namespace: cluster.Namespace, } if err := k8sclient.Get(ctx, key, &linodeCluster); err != nil { if client.IgnoreNotFound(err) != nil { diff --git a/util/helpers_test.go b/util/helpers_test.go index f30d18301..542eecc29 100644 --- a/util/helpers_test.go +++ b/util/helpers_test.go @@ -15,7 +15,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" infrav1alpha2 "github.com/linode/cluster-api-provider-linode/api/v1alpha2" @@ -300,11 +300,9 @@ func TestSetOwnerReferenceToLinodeCluster(t *testing.T) { Namespace: "test-namespace", }, Spec: clusterv1.ClusterSpec{ - InfrastructureRef: &corev1.ObjectReference{ - Name: validLinodeCluster.Name, - Namespace: validLinodeCluster.Namespace, - Kind: linodeClusterGVK.Kind, - APIVersion: linodeClusterGVK.GroupVersion().String(), + InfrastructureRef: clusterv1.ContractVersionedObjectReference{ + Name: validLinodeCluster.Name, + Kind: linodeClusterGVK.Kind, }, }, } @@ -379,10 +377,10 @@ func TestSetOwnerReferenceToLinodeCluster(t *testing.T) { expectedError: "", }, { - name: "cluster infrastructureRef is nil - can happen when deleting", + name: "cluster infrastructureRef is empty - can happen when deleting", cluster: func() *clusterv1.Cluster { c := validCluster.DeepCopy() - c.Spec.InfrastructureRef = nil + c.Spec.InfrastructureRef = clusterv1.ContractVersionedObjectReference{} return c }(), obj: baseObjToOwn.DeepCopy(), diff --git a/util/vlanips.go b/util/vlanips.go index 00b3ada26..92a7786bd 100644 --- a/util/vlanips.go +++ b/util/vlanips.go @@ -26,7 +26,7 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/selection" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/linode/cluster-api-provider-linode/api/v1alpha2" From 3f94ad9b1f17d64b05864b004b979e16706769fc Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Tue, 2 Sep 2025 16:46:32 -0400 Subject: [PATCH 02/13] bump other k8s deps --- go.mod | 32 ++++----- go.sum | 66 +++++++++---------- mock/client.go | 19 ++++++ .../runtimeclient/runtimeclient.gen.go | 26 ++++++++ 4 files changed, 93 insertions(+), 50 deletions(-) diff --git a/go.mod b/go.mod index 950107e3b..e0ff16a92 100644 --- a/go.mod +++ b/go.mod @@ -28,12 +28,12 @@ require ( go4.org/netipx v0.0.0-20231129151722-fdeea329fbba golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 golang.org/x/mod v0.28.0 - k8s.io/api v0.33.4 - k8s.io/apimachinery v0.33.4 - k8s.io/client-go v0.33.4 - k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 + k8s.io/api v0.34.0 + k8s.io/apimachinery v0.34.0 + k8s.io/client-go v0.34.0 + k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 sigs.k8s.io/cluster-api v1.11.0 - sigs.k8s.io/controller-runtime v0.21.0 + sigs.k8s.io/controller-runtime v0.22.0 ) require ( @@ -55,9 +55,9 @@ require ( github.com/aws/aws-sdk-go-v2/service/sts v1.38.4 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/google/btree v1.1.3 // indirect - github.com/google/cel-go v0.23.2 // indirect + github.com/google/cel-go v0.26.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -71,10 +71,11 @@ require ( go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/sync v0.17.0 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect - k8s.io/apiserver v0.33.3 // indirect - k8s.io/component-base v0.33.3 // indirect + k8s.io/apiserver v0.34.0 // indirect + k8s.io/component-base v0.34.0 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect ) require ( @@ -86,7 +87,7 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.12.2 // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect - github.com/fsnotify/fsnotify v1.8.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.21.0 // indirect @@ -97,7 +98,7 @@ require ( github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gobuffalo/flect v1.0.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -105,7 +106,7 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mitchellh/go-homedir v1.1.0 // 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/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect @@ -150,10 +151,9 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.33.3 // indirect + k8s.io/apiextensions-apiserver v0.34.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect - sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect + k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect + sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/go.sum b/go.sum index 1abbff967..8cd7ac3a3 100644 --- a/go.sum +++ b/go.sum @@ -93,10 +93,10 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= -github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -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-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= @@ -129,12 +129,11 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.23.2 h1:UdEe3CvQh3Nv+E/j9r1Y//WO0K0cSyD7/y0bzyLIMI4= -github.com/google/cel-go v0.23.2/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= +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.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.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -197,8 +196,9 @@ github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx 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/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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -421,39 +421,37 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/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.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= -k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= -k8s.io/apiextensions-apiserver v0.33.3 h1:qmOcAHN6DjfD0v9kxL5udB27SRP6SG/MTopmge3MwEs= -k8s.io/apiextensions-apiserver v0.33.3/go.mod h1:oROuctgo27mUsyp9+Obahos6CWcMISSAPzQ77CAQGz8= -k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s= -k8s.io/apimachinery v0.33.4/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/apiserver v0.33.3 h1:Wv0hGc+QFdMJB4ZSiHrCgN3zL3QRatu56+rpccKC3J4= -k8s.io/apiserver v0.33.3/go.mod h1:05632ifFEe6TxwjdAIrwINHWE2hLwyADFk5mBsQa15E= -k8s.io/client-go v0.33.4 h1:TNH+CSu8EmXfitntjUPwaKVPN0AYMbc9F1bBS8/ABpw= -k8s.io/client-go v0.33.4/go.mod h1:LsA0+hBG2DPwovjd931L/AoaezMPX9CmBgyVyBZmbCY= +k8s.io/api v0.34.0 h1:L+JtP2wDbEYPUeNGbeSa/5GwFtIA662EmT2YSLOkAVE= +k8s.io/api v0.34.0/go.mod h1:YzgkIzOOlhl9uwWCZNqpw6RJy9L2FK4dlJeayUoydug= +k8s.io/apiextensions-apiserver v0.34.0 h1:B3hiB32jV7BcyKcMU5fDaDxk882YrJ1KU+ZSkA9Qxoc= +k8s.io/apiextensions-apiserver v0.34.0/go.mod h1:hLI4GxE1BDBy9adJKxUxCEHBGZtGfIg98Q+JmTD7+g0= +k8s.io/apimachinery v0.34.0 h1:eR1WO5fo0HyoQZt1wdISpFDffnWOvFLOOeJ7MgIv4z0= +k8s.io/apimachinery v0.34.0/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/apiserver v0.34.0 h1:Z51fw1iGMqN7uJ1kEaynf2Aec1Y774PqU+FVWCFV3Jg= +k8s.io/apiserver v0.34.0/go.mod h1:52ti5YhxAvewmmpVRqlASvaqxt0gKJxvCeW7ZrwgazQ= +k8s.io/client-go v0.34.0 h1:YoWv5r7bsBfb0Hs2jh8SOvFbKzzxyNo0nSb0zC19KZo= +k8s.io/client-go v0.34.0/go.mod h1:ozgMnEKXkRjeMvBZdV1AijMHLTh3pbACPvK7zFR+QQY= k8s.io/cluster-bootstrap v0.33.3 h1:u2NTxJ5CFSBFXaDxLQoOWMly8eni31psVso+caq6uwI= k8s.io/cluster-bootstrap v0.33.3/go.mod h1:p970f8u8jf273zyQ5raD8WUu2XyAl0SAWOY82o7i/ds= -k8s.io/component-base v0.33.3 h1:mlAuyJqyPlKZM7FyaoM/LcunZaaY353RXiOd2+B5tGA= -k8s.io/component-base v0.33.3/go.mod h1:ktBVsBzkI3imDuxYXmVxZ2zxJnYTZ4HAsVj9iF09qp4= +k8s.io/component-base v0.34.0 h1:bS8Ua3zlJzapklsB1dZgjEJuJEeHjj8yTu1gxE2zQX8= +k8s.io/component-base v0.34.0/go.mod h1:RSCqUdvIjjrEm81epPcjQ/DS+49fADvGSCkIP3IC6vg= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= +k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= +k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= sigs.k8s.io/cluster-api v1.11.0 h1:4ZqKxjhdP3F/vvHMd675rGsDrT/siggnFPt5eKQ8nkI= sigs.k8s.io/cluster-api v1.11.0/go.mod h1:gGmNlHrtJe3z0YV3J6JRy5Rwh9SfzokjQaS+Fv3DBPE= -sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= -sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/controller-runtime v0.22.0 h1:mTOfibb8Hxwpx3xEkR56i7xSjB+nH4hZG37SrlCY5e0= +sigs.k8s.io/controller-runtime v0.22.0/go.mod h1:FwiwRjkRPbiN+zp2QRp7wlTCzbUXxZ/D4OzuQUDwBHY= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= 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.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= -sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.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/mock/client.go b/mock/client.go index 17c764974..5fb9b840c 100644 --- a/mock/client.go +++ b/mock/client.go @@ -2273,6 +2273,25 @@ func (m *MockK8sClient) EXPECT() *MockK8sClientMockRecorder { return m.recorder } +// Apply mocks base method. +func (m *MockK8sClient) Apply(ctx context.Context, obj runtime.ApplyConfiguration, opts ...client.ApplyOption) error { + m.ctrl.T.Helper() + varargs := []any{ctx, obj} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Apply", varargs...) + ret0, _ := ret[0].(error) + return ret0 +} + +// Apply indicates an expected call of Apply. +func (mr *MockK8sClientMockRecorder) Apply(ctx, obj any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, obj}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Apply", reflect.TypeOf((*MockK8sClient)(nil).Apply), varargs...) +} + // Create mocks base method. func (m *MockK8sClient) Create(ctx context.Context, obj client.Object, opts ...client.CreateOption) error { m.ctrl.T.Helper() diff --git a/observability/wrappers/runtimeclient/runtimeclient.gen.go b/observability/wrappers/runtimeclient/runtimeclient.gen.go index 66258dcd5..26de93d35 100644 --- a/observability/wrappers/runtimeclient/runtimeclient.gen.go +++ b/observability/wrappers/runtimeclient/runtimeclient.gen.go @@ -13,6 +13,7 @@ import ( _sourceWrappers "github.com/linode/cluster-api-provider-linode/observability/wrappers" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" + "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -35,6 +36,31 @@ func NewRuntimeClientWithTracing(base _sourceWrappers.RuntimeClient, spanDecorat return d } +// Apply implements _sourceWrappers.RuntimeClient +func (_d RuntimeClientWithTracing) Apply(ctx context.Context, obj runtime.ApplyConfiguration, opts ...client.ApplyOption) (err error) { + ctx, _span := tracing.Start(ctx, "_sourceWrappers.RuntimeClient.Apply") + defer func() { + if _d._spanDecorator != nil { + _d._spanDecorator(_span, map[string]interface{}{ + "ctx": ctx, + "obj": obj, + "opts": opts}, map[string]interface{}{ + "err": err}) + } + + if err != nil { + _span.RecordError(err) + _span.SetAttributes( + attribute.String("event", "error"), + attribute.String("message", err.Error()), + ) + } + + _span.End() + }() + return _d.RuntimeClient.Apply(ctx, obj, opts...) +} + // Create implements _sourceWrappers.RuntimeClient func (_d RuntimeClientWithTracing) Create(ctx context.Context, obj client.Object, opts ...client.CreateOption) (err error) { ctx, _span := tracing.Start(ctx, "_sourceWrappers.RuntimeClient.Create") From 34bfeb678aa229926e36a88fb0d098270af182a2 Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Wed, 3 Sep 2025 10:38:16 -0400 Subject: [PATCH 03/13] lint --- cloud/scope/object_storage_key.go | 2 +- cloud/scope/object_storage_key_test.go | 2 +- internal/controller/linodeobjectstoragekey_controller_test.go | 2 +- internal/webhook/v1alpha2/linodeobjectstoragekey_webhook.go | 2 +- .../webhook/v1alpha2/linodeobjectstoragekey_webhook_test.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cloud/scope/object_storage_key.go b/cloud/scope/object_storage_key.go index 6e46549e7..71447079e 100644 --- a/cloud/scope/object_storage_key.go +++ b/cloud/scope/object_storage_key.go @@ -12,7 +12,7 @@ import ( "github.com/linode/linodego" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusteraddonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta1" + clusteraddonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta2" "sigs.k8s.io/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" diff --git a/cloud/scope/object_storage_key_test.go b/cloud/scope/object_storage_key_test.go index 6ff30f9c3..a75dba1df 100644 --- a/cloud/scope/object_storage_key_test.go +++ b/cloud/scope/object_storage_key_test.go @@ -16,7 +16,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/utils/ptr" - clusteraddonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta1" + clusteraddonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta2" "sigs.k8s.io/controller-runtime/pkg/client" infrav1alpha2 "github.com/linode/cluster-api-provider-linode/api/v1alpha2" diff --git a/internal/controller/linodeobjectstoragekey_controller_test.go b/internal/controller/linodeobjectstoragekey_controller_test.go index 3263da95d..d23ecedcf 100644 --- a/internal/controller/linodeobjectstoragekey_controller_test.go +++ b/internal/controller/linodeobjectstoragekey_controller_test.go @@ -29,7 +29,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes/scheme" "k8s.io/utils/ptr" - clusteraddonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta1" + clusteraddonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta2" 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/internal/webhook/v1alpha2/linodeobjectstoragekey_webhook.go b/internal/webhook/v1alpha2/linodeobjectstoragekey_webhook.go index 63eff2580..92b907469 100644 --- a/internal/webhook/v1alpha2/linodeobjectstoragekey_webhook.go +++ b/internal/webhook/v1alpha2/linodeobjectstoragekey_webhook.go @@ -25,7 +25,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation/field" - clusteraddonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta1" + clusteraddonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta2" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/webhook" diff --git a/internal/webhook/v1alpha2/linodeobjectstoragekey_webhook_test.go b/internal/webhook/v1alpha2/linodeobjectstoragekey_webhook_test.go index 38a69b012..7c66408bd 100644 --- a/internal/webhook/v1alpha2/linodeobjectstoragekey_webhook_test.go +++ b/internal/webhook/v1alpha2/linodeobjectstoragekey_webhook_test.go @@ -27,7 +27,7 @@ import ( "go.uber.org/mock/gomock" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusteraddonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta1" + clusteraddonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta2" infrav1alpha2 "github.com/linode/cluster-api-provider-linode/api/v1alpha2" "github.com/linode/cluster-api-provider-linode/mock" From cbd66367629ffdcca275b5c54fd2be6500416606 Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Wed, 3 Sep 2025 16:01:22 -0400 Subject: [PATCH 04/13] upgrade providers to "latest" version --- Tiltfile | 3 ++- hack/manifests/core.yaml | 1 + hack/manifests/kubeadm.yaml | 6 ++---- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Tiltfile b/Tiltfile index 6601eab0a..1acc3d7d5 100644 --- a/Tiltfile +++ b/Tiltfile @@ -21,6 +21,7 @@ helm_resource( "--create-namespace", "--set=installCRDs=true", "--set=global.leaderElection.namespace=cert-manager", + "--version=1.18.2", ], labels=["cert-manager"], ) @@ -32,7 +33,7 @@ helm_resource( flags=[ "--create-namespace", "--wait", - "--version=0.14.0", + "--version=0.23.0", ], resource_deps=["capi-operator-repo", "cert-manager"], labels=["CAPI"], diff --git a/hack/manifests/core.yaml b/hack/manifests/core.yaml index dee9177da..6d221bfa3 100644 --- a/hack/manifests/core.yaml +++ b/hack/manifests/core.yaml @@ -5,6 +5,7 @@ metadata: name: cluster-api namespace: capi-system spec: + version: v1.10.6 manager: featureGates: ClusterResourceSet: true diff --git a/hack/manifests/kubeadm.yaml b/hack/manifests/kubeadm.yaml index bbef71fce..92ea7e82e 100644 --- a/hack/manifests/kubeadm.yaml +++ b/hack/manifests/kubeadm.yaml @@ -5,9 +5,7 @@ metadata: name: kubeadm namespace: kubeadm-bootstrap-system spec: - manager: - featureGates: - KubeadmBootstrapFormatIgnition: true + version: v1.10.6 --- apiVersion: operator.cluster.x-k8s.io/v1alpha2 kind: ControlPlaneProvider @@ -15,7 +13,7 @@ metadata: name: kubeadm namespace: kubeadm-control-plane-system spec: + version: v1.10.6 manager: featureGates: ClusterTopology: true - KubeadmBootstrapFormatIgnition: true From 48022bf946d990060c1c2fc4508e811b99bc0298 Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Wed, 3 Sep 2025 16:17:12 -0400 Subject: [PATCH 05/13] yet another breaking change: Reconcile no longer exists for ClusterResourceSet strategies, only ApplyOnce --- .../addons/cilium-network-policies/ciliumNetworkPolicies.yaml | 2 +- templates/addons/cluster-resource-set/secret.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/addons/cilium-network-policies/ciliumNetworkPolicies.yaml b/templates/addons/cilium-network-policies/ciliumNetworkPolicies.yaml index 8e2e0862f..8aa7c8954 100644 --- a/templates/addons/cilium-network-policies/ciliumNetworkPolicies.yaml +++ b/templates/addons/cilium-network-policies/ciliumNetworkPolicies.yaml @@ -47,4 +47,4 @@ spec: resources: - kind: ConfigMap name: ${CLUSTER_NAME}-cilium-policy - strategy: Reconcile + strategy: ApplyOnce diff --git a/templates/addons/cluster-resource-set/secret.yaml b/templates/addons/cluster-resource-set/secret.yaml index 18af7d821..45a8d110d 100644 --- a/templates/addons/cluster-resource-set/secret.yaml +++ b/templates/addons/cluster-resource-set/secret.yaml @@ -33,4 +33,4 @@ spec: resources: - kind: Secret name: linode-${CLUSTER_NAME}-crs-0 - strategy: Reconcile + strategy: ApplyOnce From b49b8d36bc728b0c557f879e9c1f71a1d1000ce3 Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Thu, 4 Sep 2025 15:16:04 -0400 Subject: [PATCH 06/13] default to non-capi-operator installation for Tilt, specify 1.11.X for clusterctl version needed, bump contract in metadata necessary to use CAPI v1.11.X, bump clusterctl to 1.11 to use CAPI 1.11.X / v1beta2 resources --- Makefile | 3 +- Tiltfile | 204 ++++++++++++++++------------- docs/src/topics/getting-started.md | 2 +- hack/manifests/core.yaml | 2 +- hack/manifests/kubeadm.yaml | 4 +- metadata.yaml | 3 + 6 files changed, 123 insertions(+), 95 deletions(-) diff --git a/Makefile b/Makefile index f83ad5d87..c1e593737 100644 --- a/Makefile +++ b/Makefile @@ -353,7 +353,6 @@ TILT ?= $(LOCALBIN)/tilt KIND ?= $(LOCALBIN)/kind CHAINSAW ?= $(LOCALBIN)/chainsaw ENVTEST ?= $(CACHE_BIN)/setup-envtest -HUSKY ?= $(LOCALBIN)/husky NILAWAY ?= $(LOCALBIN)/nilaway GOVULNC ?= $(LOCALBIN)/govulncheck MOCKGEN ?= $(LOCALBIN)/mockgen @@ -365,7 +364,7 @@ S5CMD ?= $(CACHE_BIN)/s5cmd ## Tool Versions KUSTOMIZE_VERSION ?= v5.4.3 CTLPTL_VERSION ?= v0.8.29 -CLUSTERCTL_VERSION ?= v1.7.2 +CLUSTERCTL_VERSION ?= v1.11.1 CRD_REF_DOCS_VERSION ?= v0.1.0 KUBECTL_VERSION ?= v1.28.0 KUBEBUILDER_VERSION ?= v3.15.1 diff --git a/Tiltfile b/Tiltfile index 1acc3d7d5..4c1687bdf 100644 --- a/Tiltfile +++ b/Tiltfile @@ -6,103 +6,129 @@ load("ext://secret", "secret_from_dict") load("ext://base64", "decode_base64") update_settings(k8s_upsert_timeout_secs=120) -helm_repo( - "capi-operator-repo", - "https://kubernetes-sigs.github.io/cluster-api-operator", - labels=["helm-repos"], -) -helm_repo("jetstack-repo", "https://charts.jetstack.io", labels=["helm-repos"]) -helm_resource( - "cert-manager", - "jetstack-repo/cert-manager", - namespace="cert-manager", - resource_deps=["jetstack-repo"], - flags=[ - "--create-namespace", - "--set=installCRDs=true", - "--set=global.leaderElection.namespace=cert-manager", - "--version=1.18.2", - ], - labels=["cert-manager"], -) - -helm_resource( - "capi-operator", - "capi-operator-repo/cluster-api-operator", - namespace="capi-operator-system", - flags=[ - "--create-namespace", - "--wait", - "--version=0.23.0", - ], - resource_deps=["capi-operator-repo", "cert-manager"], - labels=["CAPI"], -) -namespace_create("capi-system") -k8s_yaml("./hack/manifests/core.yaml") -k8s_resource( - new_name="capi-controller-manager", - objects=["capi-system:namespace", "cluster-api:coreprovider"], - resource_deps=["capi-operator"], - labels=["CAPI"], -) -if os.getenv("INSTALL_KUBEADM_PROVIDER", "true") == "true": - namespace_create("kubeadm-control-plane-system") - namespace_create("kubeadm-bootstrap-system") - k8s_yaml("./hack/manifests/kubeadm.yaml") - k8s_resource( - new_name="kubeadm-controller-manager", - objects=[ - "kubeadm-bootstrap-system:namespace", - "kubeadm-control-plane-system:namespace", - "kubeadm:bootstrapprovider", - "kubeadm:controlplaneprovider", - ], - resource_deps=["capi-controller-manager"], - labels=["CAPI"], +if os.getenv("USE_CAPI_OPERATOR", "false") == "true": + helm_repo( + "capi-operator-repo", + "https://kubernetes-sigs.github.io/cluster-api-operator", + labels=["helm-repos"], ) - -if os.getenv("INSTALL_HELM_PROVIDER", "true") == "true": - namespace_create("caaph-system") - k8s_yaml("./hack/manifests/helm.yaml") - k8s_resource( - new_name="helm-controller-manager", - objects=["caaph-system:namespace", "helm:addonprovider"], - resource_deps=["capi-controller-manager"], - labels=["CAPI"], + helm_repo("jetstack-repo", "https://charts.jetstack.io", labels=["helm-repos"]) + helm_resource( + "cert-manager", + "jetstack-repo/cert-manager", + namespace="cert-manager", + resource_deps=["jetstack-repo"], + flags=[ + "--create-namespace", + "--set=installCRDs=true", + "--set=global.leaderElection.namespace=cert-manager", + ], + labels=["cert-manager"], ) - -if os.getenv("INSTALL_K3S_PROVIDER", "false") == "true": - namespace_create("capi-k3s-control-plane-system") - namespace_create("capi-k3s-bootstrap-system") - k8s_yaml("./hack/manifests/k3s.yaml") - k8s_resource( - new_name="k3s-controller-manager", - objects=[ - "capi-k3s-bootstrap-system:namespace", - "capi-k3s-control-plane-system:namespace", - "k3s:bootstrapprovider", - "k3s:controlplaneprovider", + helm_resource( + "capi-operator", + "capi-operator-repo/cluster-api-operator", + namespace="capi-operator-system", + flags=[ + "--create-namespace", + "--wait", + "--version=0.14.0", ], - resource_deps=["capi-controller-manager"], + resource_deps=["capi-operator-repo", "cert-manager"], labels=["CAPI"], ) - -if os.getenv("INSTALL_RKE2_PROVIDER", "false") == "true": - namespace_create("rke2-control-plane-system") - namespace_create("rke2-bootstrap-system") - k8s_yaml("./hack/manifests/rke2.yaml") + namespace_create("capi-system") + k8s_yaml("./hack/manifests/core.yaml") k8s_resource( - new_name="capi-rke2-controller-manager", - objects=[ - "rke2-bootstrap-system:namespace", - "rke2-control-plane-system:namespace", - "rke2:bootstrapprovider", - "rke2:controlplaneprovider", - ], - resource_deps=["capi-controller-manager"], + new_name="capi-controller-manager", + objects=["capi-system:namespace", "cluster-api:coreprovider"], + resource_deps=["capi-operator"], labels=["CAPI"], ) + + if os.getenv("INSTALL_KUBEADM_PROVIDER", "true") == "true": + namespace_create("kubeadm-control-plane-system") + namespace_create("kubeadm-bootstrap-system") + k8s_yaml("./hack/manifests/kubeadm.yaml") + k8s_resource( + new_name="kubeadm-controller-manager", + objects=[ + "kubeadm-bootstrap-system:namespace", + "kubeadm-control-plane-system:namespace", + "kubeadm:bootstrapprovider", + "kubeadm:controlplaneprovider", + ], + resource_deps=["capi-controller-manager"], + labels=["CAPI"], + ) + + if os.getenv("INSTALL_HELM_PROVIDER", "true") == "true": + namespace_create("caaph-system") + k8s_yaml("./hack/manifests/helm.yaml") + k8s_resource( + new_name="helm-controller-manager", + objects=["caaph-system:namespace", "helm:addonprovider"], + resource_deps=["capi-controller-manager"], + labels=["CAPI"], + ) + + if os.getenv("INSTALL_K3S_PROVIDER", "false") == "true": + namespace_create("capi-k3s-control-plane-system") + namespace_create("capi-k3s-bootstrap-system") + k8s_yaml("./hack/manifests/k3s.yaml") + k8s_resource( + new_name="k3s-controller-manager", + objects=[ + "capi-k3s-bootstrap-system:namespace", + "capi-k3s-control-plane-system:namespace", + "k3s:bootstrapprovider", + "k3s:controlplaneprovider", + ], + resource_deps=["capi-controller-manager"], + labels=["CAPI"], + ) + + if os.getenv("INSTALL_RKE2_PROVIDER", "false") == "true": + namespace_create("rke2-control-plane-system") + namespace_create("rke2-bootstrap-system") + k8s_yaml("./hack/manifests/rke2.yaml") + k8s_resource( + new_name="capi-rke2-controller-manager", + objects=[ + "rke2-bootstrap-system:namespace", + "rke2-control-plane-system:namespace", + "rke2:bootstrapprovider", + "rke2:controlplaneprovider", + ], + resource_deps=["capi-controller-manager"], + labels=["CAPI"], + ) +else: + if os.getenv("INSTALL_HELM_PROVIDER", "true") == "true": + local_resource( + 'capi-controller-manager', + cmd="EXP_CLUSTER_RESOURCE_SET=true CLUSTER_TOPOLOGY=true clusterctl init --addon helm --core cluster-api:${capi_version} --bootstrap kubeadm:${capi_version} --control-plane kubeadm:${capi_version}", + env={'capi_version': os.getenv("CAPI_VERSION", "v1.11.1")}, + ) + else: + local_resource( + 'capi-controller-manager', + cmd="EXP_CLUSTER_RESOURCE_SET=true CLUSTER_TOPOLOGY=true clusterctl init --core cluster-api:${capi_version} --bootstrap kubeadm:${capi_version} --control-plane kubeadm:${capi_version}", + env={'capi_version': os.getenv("CAPI_VERSION", "v1.11.1")}, + ) + + if os.getenv("INSTALL_K3S_PROVIDER", "false") == "true": + local_resource( + 'capi-k3s-controller-manager', + cmd='clusterctl init --bootstrap k3s --control-plane k3s', + ) + + if os.getenv("INSTALL_RKE2_PROVIDER", "false") == "true": + local_resource( + 'capi-rke2-controller-manager', + cmd='clusterctl init --bootstrap rke2 --control-plane rke2', + ) + capl_resources = [ "capl-system:namespace", "addresssets.infrastructure.cluster.x-k8s.io:customresourcedefinition", diff --git a/docs/src/topics/getting-started.md b/docs/src/topics/getting-started.md index 47f1ff2e2..fc8539dd9 100644 --- a/docs/src/topics/getting-started.md +++ b/docs/src/topics/getting-started.md @@ -13,7 +13,7 @@ Make sure to create the token with at least the following read/write permissions - IPs - Object Storage - Firewalls -- clusterctl is [installed](https://cluster-api.sigs.k8s.io/user/quick-start#installation) +- clusterctl (>= v1.11.0) is [installed](https://cluster-api.sigs.k8s.io/user/quick-start#installation) - Cluster API [management cluster](https://cluster-api.sigs.k8s.io/user/quick-start#install-andor-configure-a-kubernetes-cluster) is created ```admonish question title="" For more information please see the diff --git a/hack/manifests/core.yaml b/hack/manifests/core.yaml index 6d221bfa3..6256aaa63 100644 --- a/hack/manifests/core.yaml +++ b/hack/manifests/core.yaml @@ -5,7 +5,7 @@ metadata: name: cluster-api namespace: capi-system spec: - version: v1.10.6 + version: v1.11.1 manager: featureGates: ClusterResourceSet: true diff --git a/hack/manifests/kubeadm.yaml b/hack/manifests/kubeadm.yaml index 92ea7e82e..92e417ac7 100644 --- a/hack/manifests/kubeadm.yaml +++ b/hack/manifests/kubeadm.yaml @@ -5,7 +5,7 @@ metadata: name: kubeadm namespace: kubeadm-bootstrap-system spec: - version: v1.10.6 + version: v1.11.1 --- apiVersion: operator.cluster.x-k8s.io/v1alpha2 kind: ControlPlaneProvider @@ -13,7 +13,7 @@ metadata: name: kubeadm namespace: kubeadm-control-plane-system spec: - version: v1.10.6 + version: v1.11.1 manager: featureGates: ClusterTopology: true diff --git a/metadata.yaml b/metadata.yaml index 95334ad68..81a4cc8d9 100644 --- a/metadata.yaml +++ b/metadata.yaml @@ -29,3 +29,6 @@ releaseSeries: - major: 0 minor: 9 contract: v1beta1 +- major: 0 + minor: 10 + contract: v1beta2 From a256e8645be497b3b5214a104ec9aaa4eb74dfef Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Thu, 4 Sep 2025 16:42:50 -0400 Subject: [PATCH 07/13] specify clusterctl config for Tilt without capi-operator --- Tiltfile | 4 ++-- hack/clusterctl.yaml | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 hack/clusterctl.yaml diff --git a/Tiltfile b/Tiltfile index 4c1687bdf..7523e9640 100644 --- a/Tiltfile +++ b/Tiltfile @@ -120,13 +120,13 @@ else: if os.getenv("INSTALL_K3S_PROVIDER", "false") == "true": local_resource( 'capi-k3s-controller-manager', - cmd='clusterctl init --bootstrap k3s --control-plane k3s', + cmd='clusterctl init --bootstrap k3s --control-plane k3s --config ./hack/clusterctl.yaml', ) if os.getenv("INSTALL_RKE2_PROVIDER", "false") == "true": local_resource( 'capi-rke2-controller-manager', - cmd='clusterctl init --bootstrap rke2 --control-plane rke2', + cmd='clusterctl init --bootstrap rke2 --control-plane rke2 --config ./hack/clusterctl.yaml', ) capl_resources = [ diff --git a/hack/clusterctl.yaml b/hack/clusterctl.yaml new file mode 100644 index 000000000..2f6619890 --- /dev/null +++ b/hack/clusterctl.yaml @@ -0,0 +1,16 @@ +providers: + - name: linode-linode + url: https://github.com/linode/cluster-api-provider-linode/releases/latest/infrastructure-components.yaml + type: InfrastructureProvider + - name: k3s + url: https://github.com/k3s-io/cluster-api-k3s/releases/latest/bootstrap-components.yaml + type: BootstrapProvider + - name: k3s + url: https://github.com/k3s-io/cluster-api-k3s/releases/latest/control-plane-components.yaml + type: ControlPlaneProvider + - name: rke2 + url: https://github.com/rancher/cluster-api-provider-rke2/releases/latest/bootstrap-components.yaml + type: BootstrapProvider + - name: rke2 + url: https://github.com/rancher/cluster-api-provider-rke2/releases/latest/control-plane-components.yaml + type: ControlPlaneProvider From 3c8327b5692b42ba7477e8a1eb80fcae97acb63d Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Thu, 4 Sep 2025 16:55:54 -0400 Subject: [PATCH 08/13] looks like we have to install all providers in one shot with clusterctl for Tilt to prevent a hang on cert-manager --- Tiltfile | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/Tiltfile b/Tiltfile index 7523e9640..f7f604312 100644 --- a/Tiltfile +++ b/Tiltfile @@ -104,30 +104,12 @@ if os.getenv("USE_CAPI_OPERATOR", "false") == "true": labels=["CAPI"], ) else: - if os.getenv("INSTALL_HELM_PROVIDER", "true") == "true": - local_resource( - 'capi-controller-manager', - cmd="EXP_CLUSTER_RESOURCE_SET=true CLUSTER_TOPOLOGY=true clusterctl init --addon helm --core cluster-api:${capi_version} --bootstrap kubeadm:${capi_version} --control-plane kubeadm:${capi_version}", - env={'capi_version': os.getenv("CAPI_VERSION", "v1.11.1")}, - ) - else: - local_resource( - 'capi-controller-manager', - cmd="EXP_CLUSTER_RESOURCE_SET=true CLUSTER_TOPOLOGY=true clusterctl init --core cluster-api:${capi_version} --bootstrap kubeadm:${capi_version} --control-plane kubeadm:${capi_version}", - env={'capi_version': os.getenv("CAPI_VERSION", "v1.11.1")}, - ) - - if os.getenv("INSTALL_K3S_PROVIDER", "false") == "true": - local_resource( - 'capi-k3s-controller-manager', - cmd='clusterctl init --bootstrap k3s --control-plane k3s --config ./hack/clusterctl.yaml', - ) - - if os.getenv("INSTALL_RKE2_PROVIDER", "false") == "true": - local_resource( - 'capi-rke2-controller-manager', - cmd='clusterctl init --bootstrap rke2 --control-plane rke2 --config ./hack/clusterctl.yaml', - ) + # install all providers in one shot because clusterctl init hangs on cert-manager if we try to do each conditionally + local_resource( + 'capi-controller-manager', + cmd="EXP_CLUSTER_RESOURCE_SET=true CLUSTER_TOPOLOGY=true clusterctl init --addon helm --core cluster-api:${capi_version} --bootstrap kubeadm:${capi_version},k3s,rke2 --control-plane kubeadm:${capi_version},k3s,rke2 --config ./hack/clusterctl.yaml", + env={'capi_version': os.getenv("CAPI_VERSION", "v1.11.1")}, + ) capl_resources = [ "capl-system:namespace", From f0c9e44495bd5c292e20768eeded00aa84f1213a Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Fri, 5 Sep 2025 11:09:05 -0400 Subject: [PATCH 09/13] fix event for lobjkey reconciler to have a proper event type --- internal/controller/linodeobjectstoragekey_controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/controller/linodeobjectstoragekey_controller.go b/internal/controller/linodeobjectstoragekey_controller.go index 5b2699108..4017d7448 100644 --- a/internal/controller/linodeobjectstoragekey_controller.go +++ b/internal/controller/linodeobjectstoragekey_controller.go @@ -278,7 +278,7 @@ func (r *LinodeObjectStorageKeyReconciler) reconcileDelete(ctx context.Context, return err } - r.Recorder.Event(keyScope.Key, clusterv1.DeletionCompletedReason, "KeyRevoked", "Object storage key revoked") + r.Recorder.Event(keyScope.Key, corev1.EventTypeNormal, "KeyRevoked", "Object storage key revoked") // If this key's Secret was generated in another namespace, manually delete it since it has no owner reference. if keyScope.Key.Spec.Namespace != keyScope.Key.Namespace { From 2332b1f79472a4ec68e849cd64d6042f300fba64 Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Fri, 5 Sep 2025 11:16:10 -0400 Subject: [PATCH 10/13] the namespaces for Kubeadm CAPI changed --- .../kubeadm-capl-cluster/assert-capi-resources.yaml | 4 ++-- .../assert-capi-resources.yaml | 4 ++-- .../kubeadm-full-capl-cluster/assert-capi-resources.yaml | 4 ++-- .../cluster-object-store/assert-capi-resources.yaml | 4 ++-- .../assert-capi-resources.yaml | 4 ++-- .../assert-capi-resources.yaml | 4 ++-- .../metadata-gzip-compression/assert-capi-resources.yaml | 4 ++-- .../minimal-linodemachine/assert-capi-resources.yaml | 4 ++-- .../lmt-tags/assert-capi-resources.yaml | 4 ++-- hack/manifests/kubeadm.yaml | 4 ++-- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/e2e/capl-cluster-flavors/kubeadm-capl-cluster/assert-capi-resources.yaml b/e2e/capl-cluster-flavors/kubeadm-capl-cluster/assert-capi-resources.yaml index 0c8d0fc15..5c8db68a1 100644 --- a/e2e/capl-cluster-flavors/kubeadm-capl-cluster/assert-capi-resources.yaml +++ b/e2e/capl-cluster-flavors/kubeadm-capl-cluster/assert-capi-resources.yaml @@ -18,7 +18,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-bootstrap-controller-manager - namespace: kubeadm-bootstrap-system + namespace: capi-kubeadm-bootstrap-system status: availableReplicas: 1 --- @@ -26,7 +26,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-control-plane-controller-manager - namespace: kubeadm-control-plane-system + namespace: capi-kubeadm-control-plane-system status: availableReplicas: 1 --- diff --git a/e2e/capl-cluster-flavors/kubeadm-flatcar-vpcless-capl-cluster/assert-capi-resources.yaml b/e2e/capl-cluster-flavors/kubeadm-flatcar-vpcless-capl-cluster/assert-capi-resources.yaml index 0c8d0fc15..5c8db68a1 100644 --- a/e2e/capl-cluster-flavors/kubeadm-flatcar-vpcless-capl-cluster/assert-capi-resources.yaml +++ b/e2e/capl-cluster-flavors/kubeadm-flatcar-vpcless-capl-cluster/assert-capi-resources.yaml @@ -18,7 +18,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-bootstrap-controller-manager - namespace: kubeadm-bootstrap-system + namespace: capi-kubeadm-bootstrap-system status: availableReplicas: 1 --- @@ -26,7 +26,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-control-plane-controller-manager - namespace: kubeadm-control-plane-system + namespace: capi-kubeadm-control-plane-system status: availableReplicas: 1 --- diff --git a/e2e/capl-cluster-flavors/kubeadm-full-capl-cluster/assert-capi-resources.yaml b/e2e/capl-cluster-flavors/kubeadm-full-capl-cluster/assert-capi-resources.yaml index 48008146c..a7587a843 100644 --- a/e2e/capl-cluster-flavors/kubeadm-full-capl-cluster/assert-capi-resources.yaml +++ b/e2e/capl-cluster-flavors/kubeadm-full-capl-cluster/assert-capi-resources.yaml @@ -66,7 +66,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-bootstrap-controller-manager - namespace: kubeadm-bootstrap-system + namespace: capi-kubeadm-bootstrap-system status: availableReplicas: 1 --- @@ -74,6 +74,6 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-control-plane-controller-manager - namespace: kubeadm-control-plane-system + namespace: capi-kubeadm-control-plane-system status: availableReplicas: 1 diff --git a/e2e/linodemachine-controller/cluster-object-store/assert-capi-resources.yaml b/e2e/linodemachine-controller/cluster-object-store/assert-capi-resources.yaml index 2e5c6a3a7..f8a45f67b 100644 --- a/e2e/linodemachine-controller/cluster-object-store/assert-capi-resources.yaml +++ b/e2e/linodemachine-controller/cluster-object-store/assert-capi-resources.yaml @@ -18,7 +18,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-bootstrap-controller-manager - namespace: kubeadm-bootstrap-system + namespace: capi-kubeadm-bootstrap-system status: availableReplicas: 1 --- @@ -26,6 +26,6 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-control-plane-controller-manager - namespace: kubeadm-control-plane-system + namespace: capi-kubeadm-control-plane-system status: availableReplicas: 1 diff --git a/e2e/linodemachine-controller/linodecluster-vpcref-integration/assert-capi-resources.yaml b/e2e/linodemachine-controller/linodecluster-vpcref-integration/assert-capi-resources.yaml index 2e5c6a3a7..f8a45f67b 100644 --- a/e2e/linodemachine-controller/linodecluster-vpcref-integration/assert-capi-resources.yaml +++ b/e2e/linodemachine-controller/linodecluster-vpcref-integration/assert-capi-resources.yaml @@ -18,7 +18,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-bootstrap-controller-manager - namespace: kubeadm-bootstrap-system + namespace: capi-kubeadm-bootstrap-system status: availableReplicas: 1 --- @@ -26,6 +26,6 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-control-plane-controller-manager - namespace: kubeadm-control-plane-system + namespace: capi-kubeadm-control-plane-system status: availableReplicas: 1 diff --git a/e2e/linodemachine-controller/linodemachine-vpcref-integration/assert-capi-resources.yaml b/e2e/linodemachine-controller/linodemachine-vpcref-integration/assert-capi-resources.yaml index 2e5c6a3a7..f8a45f67b 100644 --- a/e2e/linodemachine-controller/linodemachine-vpcref-integration/assert-capi-resources.yaml +++ b/e2e/linodemachine-controller/linodemachine-vpcref-integration/assert-capi-resources.yaml @@ -18,7 +18,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-bootstrap-controller-manager - namespace: kubeadm-bootstrap-system + namespace: capi-kubeadm-bootstrap-system status: availableReplicas: 1 --- @@ -26,6 +26,6 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-control-plane-controller-manager - namespace: kubeadm-control-plane-system + namespace: capi-kubeadm-control-plane-system status: availableReplicas: 1 diff --git a/e2e/linodemachine-controller/metadata-gzip-compression/assert-capi-resources.yaml b/e2e/linodemachine-controller/metadata-gzip-compression/assert-capi-resources.yaml index 2e5c6a3a7..f8a45f67b 100644 --- a/e2e/linodemachine-controller/metadata-gzip-compression/assert-capi-resources.yaml +++ b/e2e/linodemachine-controller/metadata-gzip-compression/assert-capi-resources.yaml @@ -18,7 +18,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-bootstrap-controller-manager - namespace: kubeadm-bootstrap-system + namespace: capi-kubeadm-bootstrap-system status: availableReplicas: 1 --- @@ -26,6 +26,6 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-control-plane-controller-manager - namespace: kubeadm-control-plane-system + namespace: capi-kubeadm-control-plane-system status: availableReplicas: 1 diff --git a/e2e/linodemachine-controller/minimal-linodemachine/assert-capi-resources.yaml b/e2e/linodemachine-controller/minimal-linodemachine/assert-capi-resources.yaml index 2e5c6a3a7..f8a45f67b 100644 --- a/e2e/linodemachine-controller/minimal-linodemachine/assert-capi-resources.yaml +++ b/e2e/linodemachine-controller/minimal-linodemachine/assert-capi-resources.yaml @@ -18,7 +18,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-bootstrap-controller-manager - namespace: kubeadm-bootstrap-system + namespace: capi-kubeadm-bootstrap-system status: availableReplicas: 1 --- @@ -26,6 +26,6 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-control-plane-controller-manager - namespace: kubeadm-control-plane-system + namespace: capi-kubeadm-control-plane-system status: availableReplicas: 1 diff --git a/e2e/linodemachinetemplate-controller/lmt-tags/assert-capi-resources.yaml b/e2e/linodemachinetemplate-controller/lmt-tags/assert-capi-resources.yaml index 2e5c6a3a7..f8a45f67b 100644 --- a/e2e/linodemachinetemplate-controller/lmt-tags/assert-capi-resources.yaml +++ b/e2e/linodemachinetemplate-controller/lmt-tags/assert-capi-resources.yaml @@ -18,7 +18,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-bootstrap-controller-manager - namespace: kubeadm-bootstrap-system + namespace: capi-kubeadm-bootstrap-system status: availableReplicas: 1 --- @@ -26,6 +26,6 @@ apiVersion: apps/v1 kind: Deployment metadata: name: capi-kubeadm-control-plane-controller-manager - namespace: kubeadm-control-plane-system + namespace: capi-kubeadm-control-plane-system status: availableReplicas: 1 diff --git a/hack/manifests/kubeadm.yaml b/hack/manifests/kubeadm.yaml index 92e417ac7..4356dc91a 100644 --- a/hack/manifests/kubeadm.yaml +++ b/hack/manifests/kubeadm.yaml @@ -3,7 +3,7 @@ apiVersion: operator.cluster.x-k8s.io/v1alpha2 kind: BootstrapProvider metadata: name: kubeadm - namespace: kubeadm-bootstrap-system + namespace: capi-kubeadm-bootstrap-system spec: version: v1.11.1 --- @@ -11,7 +11,7 @@ apiVersion: operator.cluster.x-k8s.io/v1alpha2 kind: ControlPlaneProvider metadata: name: kubeadm - namespace: kubeadm-control-plane-system + namespace: capi-kubeadm-control-plane-system spec: version: v1.11.1 manager: From 400c7d0ed5f1ee3454c60354943464347a037db2 Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Fri, 5 Sep 2025 15:26:51 -0400 Subject: [PATCH 11/13] see https://cluster-api.sigs.k8s.io/user/troubleshooting\#clusterctl-failing-to-start-providers-due-to-outdated-image-overrides --- Tiltfile | 4 ++-- hack/manifests/kubeadm.yaml | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Tiltfile b/Tiltfile index f7f604312..35501dd50 100644 --- a/Tiltfile +++ b/Tiltfile @@ -107,8 +107,8 @@ else: # install all providers in one shot because clusterctl init hangs on cert-manager if we try to do each conditionally local_resource( 'capi-controller-manager', - cmd="EXP_CLUSTER_RESOURCE_SET=true CLUSTER_TOPOLOGY=true clusterctl init --addon helm --core cluster-api:${capi_version} --bootstrap kubeadm:${capi_version},k3s,rke2 --control-plane kubeadm:${capi_version},k3s,rke2 --config ./hack/clusterctl.yaml", - env={'capi_version': os.getenv("CAPI_VERSION", "v1.11.1")}, + cmd="EXP_CLUSTER_RESOURCE_SET=true CLUSTER_TOPOLOGY=true KUBEADM_BOOTSTRAP_FORMAT_IGNITION=true clusterctl init --addon helm --core cluster-api:${capi_version} --bootstrap kubeadm:${capi_version},k3s:${k3s_version},rke2:${rke2_version} --control-plane kubeadm:${capi_version},k3s:${k3s_version},rke2:${rke2_version} --config ./hack/clusterctl.yaml", + env={'capi_version': os.getenv("CAPI_VERSION", "v1.11.1"), 'k3s_version': os.getenv("K3S_VERSION", "v0.3.0"), 'rke2_version': os.getenv("RKE2_VERSION", "v0.20.1")}, ) capl_resources = [ diff --git a/hack/manifests/kubeadm.yaml b/hack/manifests/kubeadm.yaml index 4356dc91a..52926dc83 100644 --- a/hack/manifests/kubeadm.yaml +++ b/hack/manifests/kubeadm.yaml @@ -5,6 +5,9 @@ metadata: name: kubeadm namespace: capi-kubeadm-bootstrap-system spec: + manager: + featureGates: + KubeadmBootstrapFormatIgnition: true version: v1.11.1 --- apiVersion: operator.cluster.x-k8s.io/v1alpha2 @@ -17,3 +20,4 @@ spec: manager: featureGates: ClusterTopology: true + KubeadmBootstrapFormatIgnition: true From c78fda0cc7acb1a533cc74e2640f9f28c40632e9 Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Fri, 5 Sep 2025 15:54:44 -0400 Subject: [PATCH 12/13] fix env var --- Tiltfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tiltfile b/Tiltfile index 35501dd50..7d0cd35c6 100644 --- a/Tiltfile +++ b/Tiltfile @@ -107,7 +107,7 @@ else: # install all providers in one shot because clusterctl init hangs on cert-manager if we try to do each conditionally local_resource( 'capi-controller-manager', - cmd="EXP_CLUSTER_RESOURCE_SET=true CLUSTER_TOPOLOGY=true KUBEADM_BOOTSTRAP_FORMAT_IGNITION=true clusterctl init --addon helm --core cluster-api:${capi_version} --bootstrap kubeadm:${capi_version},k3s:${k3s_version},rke2:${rke2_version} --control-plane kubeadm:${capi_version},k3s:${k3s_version},rke2:${rke2_version} --config ./hack/clusterctl.yaml", + cmd="EXP_CLUSTER_RESOURCE_SET=true CLUSTER_TOPOLOGY=true EXP_KUBEADM_BOOTSTRAP_FORMAT_IGNITION=true clusterctl init --addon helm --core cluster-api:${capi_version} --bootstrap kubeadm:${capi_version},k3s:${k3s_version},rke2:${rke2_version} --control-plane kubeadm:${capi_version},k3s:${k3s_version},rke2:${rke2_version} --config ./hack/clusterctl.yaml", env={'capi_version': os.getenv("CAPI_VERSION", "v1.11.1"), 'k3s_version': os.getenv("K3S_VERSION", "v0.3.0"), 'rke2_version': os.getenv("RKE2_VERSION", "v0.20.1")}, ) From fa2d5eb46e160a631e2ae72d8d1f68f4036d590a Mon Sep 17 00:00:00 2001 From: Ashley Dumaine Date: Mon, 8 Sep 2025 10:45:57 -0400 Subject: [PATCH 13/13] this shouldn't be a dependency, especially if not using capi-operator --- .../kubeadm-full-capl-cluster/assert-capi-resources.yaml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/e2e/capl-cluster-flavors/kubeadm-full-capl-cluster/assert-capi-resources.yaml b/e2e/capl-cluster-flavors/kubeadm-full-capl-cluster/assert-capi-resources.yaml index a7587a843..c6b29a71e 100644 --- a/e2e/capl-cluster-flavors/kubeadm-full-capl-cluster/assert-capi-resources.yaml +++ b/e2e/capl-cluster-flavors/kubeadm-full-capl-cluster/assert-capi-resources.yaml @@ -8,14 +8,6 @@ status: --- apiVersion: apps/v1 kind: Deployment -metadata: - name: capi-operator-cluster-api-operator - namespace: capi-operator-system -status: - availableReplicas: 1 ---- -apiVersion: apps/v1 -kind: Deployment metadata: name: capi-controller-manager namespace: capi-system