Skip to content

Commit

Permalink
fix(konnect): do not set owner relationship between ControlPlane and …
Browse files Browse the repository at this point in the history
…its config entities (#1099)

* fix(konnect): do not set owner relationship between ControlPlane and its config entities

* chore: increase the linter timeout

* chore: simplify setProrammedStatusConditionBasedOnOtherConditions call site

* chore: refactor AreAllConditionsHaveTrueStatus

* chore: deploy.KongConsumerAttachedToCP -> deploy.KongConsumer

* chore: fix build

* update deps

Signed-off-by: Jintao Zhang <zhangjintao9020@gmail.com>

---------

Signed-off-by: Jintao Zhang <zhangjintao9020@gmail.com>
Co-authored-by: Jintao Zhang <zhangjintao9020@gmail.com>
  • Loading branch information
pmalek and tao12345666333 authored Feb 14, 2025
1 parent 104600e commit 27e877a
Show file tree
Hide file tree
Showing 27 changed files with 1,032 additions and 384 deletions.
2 changes: 1 addition & 1 deletion .golangci.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
run:
timeout: 5m
timeout: 8m
linters:
enable:
- asciicheck
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
have any effect.
They will be removed in next major release.
[#1100](https://github.com/Kong/gateway-operator/pull/1100)
- Konnect entities that are attached to a Konnect CP through a `ControlPlaneRef`
do not get an owner relationship set to the `ControlPlane` anymore hence
they are not deleted when the `ControlPlane` is deleted.
[#1099](https://github.com/Kong/gateway-operator/pull/1099)

[kubebuilder_3907]: https://github.com/kubernetes-sigs/kubebuilder/discussions/3907

Expand Down
25 changes: 0 additions & 25 deletions controller/konnect/reconciler_controlplaneref.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
ctrllog "sigs.k8s.io/controller-runtime/pkg/log"

"github.com/kong/gateway-operator/controller/konnect/constraints"
Expand Down Expand Up @@ -152,30 +151,6 @@ func handleControlPlaneRef[T constraints.SupportedKonnectEntityType, TEnt constr
return ctrl.Result{Requeue: true}, nil
}

var (
old = ent.DeepCopyObject().(TEnt)

// A cluster scoped object cannot set a namespaced object as its owner, and also we cannot set cross namespaced owner reference.
// So we skip setting owner reference for cluster scoped resources (KongVault).
// TODO: handle cross namespace refs
isNamespaceScoped = ent.GetNamespace() != ""

// If an entity has another owner, we should not set the owner reference as that would prevent the entity from being deleted.
hasNoOwners = len(ent.GetOwnerReferences()) == 0
)
if isNamespaceScoped && hasNoOwners {
if err := controllerutil.SetOwnerReference(cp, ent, cl.Scheme(), controllerutil.WithBlockOwnerDeletion(true)); err != nil {
return ctrl.Result{}, fmt.Errorf("failed to set owner reference: %w", err)
}
}

if err := cl.Patch(ctx, ent, client.MergeFrom(old)); err != nil {
if k8serrors.IsConflict(err) {
return ctrl.Result{Requeue: true}, nil
}
return ctrl.Result{}, fmt.Errorf("failed to update status: %w", err)
}

if resource, ok := any(ent).(EntityWithControlPlaneRef); ok {
old := ent.DeepCopyObject().(TEnt)
resource.SetControlPlaneID(cp.Status.ID)
Expand Down
5 changes: 2 additions & 3 deletions controller/konnect/reconciler_controlplaneref_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,8 @@ func TestHandleControlPlaneRef(t *testing.T) {
}), "service should get control plane ID"
},
func(svc *configurationv1alpha1.KongService) (bool, string) {
return lo.ContainsBy(svc.OwnerReferences, func(o metav1.OwnerReference) bool {
return o.Kind == "KonnectGatewayControlPlane" && o.Name == "cp-ok"
}), "service should have owner reference set to CP"
return len(svc.OwnerReferences) == 0,
"service should have 0 owner references"
},
func(svc *configurationv1alpha1.KongService) (bool, string) {
return lo.ContainsBy(svc.Status.Conditions, func(c metav1.Condition) bool {
Expand Down
35 changes: 30 additions & 5 deletions controller/konnect/reconciler_generic.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,11 +160,10 @@ func (r *KonnectEntityReconciler[T, TEnt]) Reconcile(
// If a type has a ControlPlane ref, handle it.
res, err := handleControlPlaneRef(ctx, r.Client, ent)
if err != nil || !res.IsZero() {
// If the referenced ControlPlane is not found and the object is deleted,
// remove the finalizer and update the status.
// If the referenced ControlPlane is not found, remove the finalizer and update the status.
// There's no need to remove the entity on Konnect because the ControlPlane
// does not exist anymore.
if !ent.GetDeletionTimestamp().IsZero() && errors.As(err, &ReferencedControlPlaneDoesNotExistError{}) {
if errors.As(err, &ReferencedControlPlaneDoesNotExistError{}) {
if controllerutil.RemoveFinalizer(ent, KonnectCleanupFinalizer) {
if err := r.Client.Update(ctx, ent); err != nil {
if k8serrors.IsConflict(err) {
Expand All @@ -174,8 +173,8 @@ func (r *KonnectEntityReconciler[T, TEnt]) Reconcile(
}
}
}
// Status update will requeue the entity.
return ctrl.Result{}, nil

return setProgrammedStatusConditionBasedOnOtherConditions(ctx, r.Client, ent)
}
// If a type has a KongService ref, handle it.
res, err = handleKongServiceRef(ctx, r.Client, ent)
Expand Down Expand Up @@ -1009,3 +1008,29 @@ func handleKongConsumerRef[T constraints.SupportedKonnectEntityType, TEnt constr

return ctrl.Result{}, nil
}

func setProgrammedStatusConditionBasedOnOtherConditions[
T interface {
client.Object
k8sutils.ConditionsAware
},
](
ctx context.Context,
cl client.Client,
ent T,
) (ctrl.Result, error) {
if k8sutils.AreAllConditionsHaveTrueStatus(ent) {
return ctrl.Result{}, nil
}

if res, errStatus := patch.StatusWithCondition(
ctx, cl, ent,
konnectv1alpha1.KonnectEntityProgrammedConditionType,
metav1.ConditionFalse,
konnectv1alpha1.KonnectEntityProgrammedReasonConditionWithStatusFalseExists,
"Some conditions have status set to False",
); errStatus != nil || !res.IsZero() {
return res, errStatus
}
return ctrl.Result{}, nil
}
156 changes: 78 additions & 78 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/kong/gateway-operator

go 1.23.2
go 1.24.0

// 1.2.2 was released on main branch with a breaking change that was not
// intended to be released in 1.2.x:
Expand All @@ -19,7 +19,7 @@ require (
github.com/google/go-containerregistry v0.20.3
github.com/google/uuid v1.6.0
github.com/gruntwork-io/terratest v0.48.2
github.com/kong/kubernetes-configuration v1.1.1-0.20250131124626-916233dcfdcd
github.com/kong/kubernetes-configuration v1.1.1-0.20250206104619-59e9230a3a4c
github.com/kong/kubernetes-telemetry v0.1.8
github.com/kong/kubernetes-testing-framework v0.47.2
github.com/kong/semver/v4 v4.0.1
Expand All @@ -33,11 +33,11 @@ require (
github.com/tidwall/pretty v1.2.1
go.uber.org/zap v1.27.0
golang.org/x/mod v0.23.0
k8s.io/api v0.32.1
k8s.io/apiextensions-apiserver v0.32.1
k8s.io/apimachinery v0.32.1
k8s.io/client-go v0.32.1
k8s.io/kubernetes v1.32.1
k8s.io/api v0.32.2
k8s.io/apiextensions-apiserver v0.32.2
k8s.io/apimachinery v0.32.2
k8s.io/client-go v0.32.2
k8s.io/kubernetes v1.32.2
// TODO: Use official release when
// https://github.com/oras-project/oras-go/pull/850 becomes part of it.
oras.land/oras-go/v2 v2.5.1-0.20250115103459-a15da41d19be
Expand All @@ -47,16 +47,16 @@ require (
)

require (
cel.dev/expr v0.18.0 // indirect
cel.dev/expr v0.20.0 // indirect
cloud.google.com/go/auth v0.10.2 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect
cloud.google.com/go/compute/metadata v0.6.0 // indirect
cloud.google.com/go/container v1.38.1 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
github.com/BurntSushi/toml v1.4.0 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/antlr4-go/antlr/v4 v4.13.0 // indirect
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/avast/retry-go/v4 v4.6.0 // indirect
github.com/aws/aws-sdk-go-v2 v1.32.5 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect
Expand Down Expand Up @@ -105,11 +105,11 @@ require (
github.com/docker/docker v27.5.0+incompatible // indirect
github.com/docker/go-connections v0.5.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/emicklei/go-restful/v3 v3.12.0 // indirect
github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/ericlagergren/decimal v0.0.0-20240411145413-00de7ca16731 // indirect
github.com/evanphx/json-patch/v5 v5.9.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/gammazero/deque v0.2.0 // indirect
github.com/gammazero/workerpool v1.1.3 // indirect
Expand All @@ -129,7 +129,7 @@ require (
github.com/gonvenience/text v1.0.7 // indirect
github.com/gonvenience/wrap v1.1.2 // indirect
github.com/gonvenience/ytbx v1.4.4 // indirect
github.com/google/cel-go v0.22.0 // indirect
github.com/google/cel-go v0.22.1 // indirect
github.com/google/certificate-transparency-go v1.1.7 // indirect
github.com/google/gnostic-models v0.6.9 // indirect
github.com/google/go-github/v48 v48.2.0 // indirect
Expand All @@ -139,8 +139,8 @@ require (
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
github.com/googleapis/gax-go/v2 v2.14.0 // indirect
github.com/gorilla/websocket v1.5.1 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect
github.com/gruntwork-io/go-commons v0.8.0 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
Expand All @@ -158,7 +158,7 @@ require (
github.com/kong/go-kong v0.63.0 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mailru/easyjson v0.9.0 // indirect
github.com/mattn/go-ciede2000 v0.0.0-20170301095244-782e8c62fec3 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326 // indirect
Expand All @@ -180,15 +180,15 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/pquerna/otp v1.4.0 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sergi/go-diff v1.3.1 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/spf13/cobra v1.8.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/stoewer/go-strcase v1.3.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/texttheater/golang-levenshtein v1.0.1 // indirect
Expand All @@ -202,35 +202,35 @@ require (
github.com/zmap/zcrypto v0.0.0-20230310154051-c8b263fd8300 // indirect
github.com/zmap/zlint/v3 v3.5.0 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect
go.opentelemetry.io/otel v1.33.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect
go.opentelemetry.io/otel/metric v1.33.0 // indirect
go.opentelemetry.io/otel/sdk v1.33.0 // indirect
go.opentelemetry.io/otel/trace v1.33.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
go.opentelemetry.io/otel v1.34.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
go.opentelemetry.io/otel/metric v1.34.0 // indirect
go.opentelemetry.io/otel/sdk v1.34.0 // indirect
go.opentelemetry.io/otel/trace v1.34.0 // indirect
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
golang.org/x/crypto v0.32.0 // indirect
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/tools v0.29.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect
golang.org/x/crypto v0.33.0 // indirect
golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect
golang.org/x/net v0.35.0 // indirect
golang.org/x/tools v0.30.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
k8s.io/apiserver v0.32.1 // indirect
k8s.io/apiserver v0.32.2 // indirect
k8s.io/component-helpers v0.0.0 // indirect
k8s.io/controller-manager v0.0.0 // indirect
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 // indirect
k8s.io/utils v0.0.0-20241210054802-24370beab758
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect
)

require (
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sync v0.11.0 // indirect
google.golang.org/api v0.206.0 // indirect
google.golang.org/grpc v1.67.1 // indirect
google.golang.org/grpc v1.70.0 // indirect
sigs.k8s.io/kind v0.24.0 // indirect
sigs.k8s.io/kustomize/kyaml v0.19.0
)
Expand All @@ -240,21 +240,21 @@ require (
github.com/google/btree v1.1.3 // indirect
github.com/klauspost/compress v1.17.11 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
golang.org/x/oauth2 v0.25.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/term v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/time v0.8.0 // indirect
golang.org/x/oauth2 v0.26.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/term v0.29.0 // indirect
golang.org/x/text v0.22.0 // indirect
golang.org/x/time v0.10.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
google.golang.org/protobuf v1.36.3 // indirect
google.golang.org/protobuf v1.36.5 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/component-base v0.32.1 // indirect
k8s.io/component-base v0.32.2 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 // indirect
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.5.0 // indirect
sigs.k8s.io/yaml v1.4.0 // indirect
)

Expand All @@ -263,36 +263,36 @@ require (
// They can be updated with `./hack/update-k8sio-gomod-replace.sh` script.
// This is a workaround for https://github.com/Kong/gateway-operator/issues/1384.
replace (
k8s.io/api => k8s.io/api v0.32.1
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.32.1
k8s.io/apimachinery => k8s.io/apimachinery v0.32.1
k8s.io/apiserver => k8s.io/apiserver v0.32.1
k8s.io/cli-runtime => k8s.io/cli-runtime v0.32.1
k8s.io/client-go => k8s.io/client-go v0.32.1
k8s.io/cloud-provider => k8s.io/cloud-provider v0.32.1
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.32.1
k8s.io/code-generator => k8s.io/code-generator v0.32.1
k8s.io/component-base => k8s.io/component-base v0.32.1
k8s.io/component-helpers => k8s.io/component-helpers v0.32.1
k8s.io/controller-manager => k8s.io/controller-manager v0.32.1
k8s.io/cri-api => k8s.io/cri-api v0.32.1
k8s.io/cri-client => k8s.io/cri-client v0.32.1
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.32.1
k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.32.1
k8s.io/endpointslice => k8s.io/endpointslice v0.32.1
k8s.io/externaljwt => k8s.io/externaljwt v0.32.1
k8s.io/kms => k8s.io/kms v0.32.1
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.32.1
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.32.1
k8s.io/kube-proxy => k8s.io/kube-proxy v0.32.1
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.32.1
k8s.io/kubectl => k8s.io/kubectl v0.32.1
k8s.io/kubelet => k8s.io/kubelet v0.32.1
k8s.io/api => k8s.io/api v0.32.2
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.32.2
k8s.io/apimachinery => k8s.io/apimachinery v0.32.2
k8s.io/apiserver => k8s.io/apiserver v0.32.2
k8s.io/cli-runtime => k8s.io/cli-runtime v0.32.2
k8s.io/client-go => k8s.io/client-go v0.32.2
k8s.io/cloud-provider => k8s.io/cloud-provider v0.32.2
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.32.2
k8s.io/code-generator => k8s.io/code-generator v0.32.2
k8s.io/component-base => k8s.io/component-base v0.32.2
k8s.io/component-helpers => k8s.io/component-helpers v0.32.2
k8s.io/controller-manager => k8s.io/controller-manager v0.32.2
k8s.io/cri-api => k8s.io/cri-api v0.32.2
k8s.io/cri-client => k8s.io/cri-client v0.32.2
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.32.2
k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.32.2
k8s.io/endpointslice => k8s.io/endpointslice v0.32.2
k8s.io/externaljwt => k8s.io/externaljwt v0.32.2
k8s.io/kms => k8s.io/kms v0.32.2
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.32.2
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.32.2
k8s.io/kube-proxy => k8s.io/kube-proxy v0.32.2
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.32.2
k8s.io/kubectl => k8s.io/kubectl v0.32.2
k8s.io/kubelet => k8s.io/kubelet v0.32.2
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.30.3
k8s.io/metrics => k8s.io/metrics v0.32.1
k8s.io/mount-utils => k8s.io/mount-utils v0.32.1
k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.32.1
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.32.1
k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.32.1
k8s.io/sample-controller => k8s.io/sample-controller v0.32.1
k8s.io/metrics => k8s.io/metrics v0.32.2
k8s.io/mount-utils => k8s.io/mount-utils v0.32.2
k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.32.2
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.32.2
k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.32.2
k8s.io/sample-controller => k8s.io/sample-controller v0.32.2
)
Loading

0 comments on commit 27e877a

Please sign in to comment.