Skip to content

Commit c4dd6b8

Browse files
committed
chore(crd-from-oas): make parent handling for portal and eventgateway types more generic
1 parent f478260 commit c4dd6b8

3 files changed

Lines changed: 118 additions & 158 deletions

File tree

controller/konnect/reconciler_generic_handle_eventgatewayref.go

Lines changed: 20 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,10 @@ import (
1515
"sigs.k8s.io/controller-runtime/pkg/client"
1616
ctrllog "sigs.k8s.io/controller-runtime/pkg/log"
1717

18-
"github.com/kong/kong-operator/v2/api/common/consts"
1918
commonv1alpha1 "github.com/kong/kong-operator/v2/api/common/v1alpha1"
20-
configurationv1alpha1 "github.com/kong/kong-operator/v2/api/configuration/v1alpha1"
2119
konnectv1alpha1 "github.com/kong/kong-operator/v2/api/konnect/v1alpha1"
2220
ctrlconsts "github.com/kong/kong-operator/v2/controller/consts"
2321
"github.com/kong/kong-operator/v2/controller/pkg/patch"
24-
"github.com/kong/kong-operator/v2/internal/utils/crossnamespace"
2522
k8sutils "github.com/kong/kong-operator/v2/pkg/utils/kubernetes"
2623
)
2724

@@ -31,21 +28,30 @@ func handleEventGatewayRef(
3128
cl client.Client,
3229
obj k8sutils.ConditionsAwareObject,
3330
) (ctrl.Result, error) {
34-
cert, ok := any(obj).(*konnectv1alpha1.KonnectEventDataPlaneCertificate)
31+
// TODO: refactor this to be more generic and reusable for other types of references.
32+
type TObj interface {
33+
k8sutils.ConditionsAwareObject
34+
eventGatewayRefAccessor
35+
GetTypeName() string
36+
GetGatewayID() string
37+
SetGatewayID(id string)
38+
}
39+
o, ok := any(obj).(TObj)
3540
if !ok {
3641
return ctrl.Result{}, &UnsupportedGeneratedReferenceTypeError{
3742
TypeName: fmt.Sprintf("%T", obj),
3843
}
3944
}
4045

41-
if res, err := ensureKongReferenceGrantForEventGatewayRef(ctx, cl, cert); err != nil || !res.IsZero() {
46+
gatewayRef := o.GetEventGatewayRef()
47+
if res, err := ensureKongReferenceGrantForParentRef(ctx, cl, o, gatewayRef); err != nil || !res.IsZero() {
4248
return res, err
4349
}
4450

45-
gateway, nn, err := getEventGatewayForRef(ctx, cl, cert.Spec.GatewayRef, cert.GetNamespace())
51+
gateway, nn, err := getEventGatewayForRef(ctx, cl, gatewayRef, o.GetNamespace())
4652
if err != nil {
4753
if res, errStatus := patch.StatusWithCondition(
48-
ctx, cl, cert,
54+
ctx, cl, o,
4955
konnectv1alpha1.EventGatewayRefValidConditionType,
5056
metav1.ConditionFalse,
5157
konnectv1alpha1.EventGatewayRefReasonInvalid,
@@ -59,7 +65,7 @@ func handleEventGatewayRef(
5965
if delTimestamp := gateway.GetDeletionTimestamp(); !delTimestamp.IsZero() {
6066
msg := fmt.Sprintf("Referenced KonnectEventGateway %s is being deleted", nn)
6167
if res, errStatus := patch.StatusWithCondition(
62-
ctx, cl, cert,
68+
ctx, cl, o,
6369
konnectv1alpha1.EventGatewayRefValidConditionType,
6470
metav1.ConditionFalse,
6571
konnectv1alpha1.EventGatewayRefReasonInvalid,
@@ -76,7 +82,7 @@ func handleEventGatewayRef(
7682
cond, ok := k8sutils.GetCondition(konnectv1alpha1.KonnectEntityProgrammedConditionType, gateway)
7783
if !ok || cond.Status != metav1.ConditionTrue {
7884
if res, errStatus := patch.StatusWithCondition(
79-
ctx, cl, cert,
85+
ctx, cl, o,
8086
konnectv1alpha1.EventGatewayRefValidConditionType,
8187
metav1.ConditionFalse,
8288
konnectv1alpha1.EventGatewayRefReasonNotProgrammed,
@@ -93,7 +99,7 @@ func handleEventGatewayRef(
9399
Msg: "Referenced KonnectEventGateway does not have a Konnect ID yet",
94100
}
95101
if res, errStatus := patch.StatusWithCondition(
96-
ctx, cl, cert,
102+
ctx, cl, o,
97103
konnectv1alpha1.EventGatewayRefValidConditionType,
98104
metav1.ConditionFalse,
99105
konnectv1alpha1.EventGatewayRefReasonInvalid,
@@ -104,12 +110,9 @@ func handleEventGatewayRef(
104110
return ctrl.Result{}, err
105111
}
106112

107-
old := cert.DeepCopy()
108-
if cert.Status.GatewayID == nil {
109-
cert.Status.GatewayID = &konnectv1alpha1.KonnectEntityRef{}
110-
}
111-
cert.Status.GatewayID.ID = gateway.GetKonnectID()
112-
_, err = patch.ApplyStatusPatchIfNotEmpty(ctx, cl, ctrllog.FromContext(ctx), cert, old)
113+
old := o.DeepCopyObject().(TObj)
114+
o.SetGatewayID(gateway.GetKonnectID())
115+
_, err = patch.ApplyStatusPatchIfNotEmpty(ctx, cl, ctrllog.FromContext(ctx), o, old)
113116
if err != nil {
114117
if apierrors.IsConflict(err) {
115118
return ctrl.Result{RequeueAfter: ctrlconsts.RequeueWithoutBackoff}, nil
@@ -118,7 +121,7 @@ func handleEventGatewayRef(
118121
}
119122

120123
if res, errStatus := patch.StatusWithCondition(
121-
ctx, cl, cert,
124+
ctx, cl, o,
122125
konnectv1alpha1.EventGatewayRefValidConditionType,
123126
metav1.ConditionTrue,
124127
konnectv1alpha1.EventGatewayRefReasonValid,
@@ -130,72 +133,6 @@ func handleEventGatewayRef(
130133
return ctrl.Result{}, nil
131134
}
132135

133-
func ensureKongReferenceGrantForEventGatewayRef(
134-
ctx context.Context,
135-
cl client.Client,
136-
ent *konnectv1alpha1.KonnectEventDataPlaneCertificate,
137-
) (ctrl.Result, error) {
138-
ref := ent.Spec.GatewayRef
139-
if ref.Type != commonv1alpha1.ObjectRefTypeNamespacedRef ||
140-
ref.NamespacedRef == nil ||
141-
ref.NamespacedRef.Namespace == nil ||
142-
*ref.NamespacedRef.Namespace == ent.GetNamespace() {
143-
if res, errStatus := patch.StatusWithoutCondition(
144-
ctx, cl, ent,
145-
configurationv1alpha1.KongReferenceGrantConditionTypeResolvedRefs,
146-
); errStatus != nil || !res.IsZero() {
147-
return res, errStatus
148-
}
149-
return ctrl.Result{}, nil
150-
}
151-
152-
targetNamespace := *ref.NamespacedRef.Namespace
153-
err := crossnamespace.CheckKongReferenceGrantForResource(
154-
ctx,
155-
cl,
156-
ent.GetNamespace(),
157-
targetNamespace,
158-
ref.NamespacedRef.Name,
159-
metav1.GroupVersionKind(ent.GetObjectKind().GroupVersionKind()),
160-
metav1.GroupVersionKind(konnectv1alpha1.GroupVersion.WithKind("KonnectEventGateway")),
161-
)
162-
if crossnamespace.IsReferenceNotGranted(err) {
163-
if res, errStatus := patch.StatusWithCondition(
164-
ctx, cl, ent,
165-
consts.ConditionType(configurationv1alpha1.KongReferenceGrantConditionTypeResolvedRefs),
166-
metav1.ConditionFalse,
167-
configurationv1alpha1.KongReferenceGrantReasonRefNotPermitted,
168-
fmt.Sprintf(
169-
"KongReferenceGrants do not allow access to KonnectEventGateway %s/%s",
170-
targetNamespace,
171-
ref.NamespacedRef.Name,
172-
),
173-
); errStatus != nil || !res.IsZero() {
174-
return res, errStatus
175-
}
176-
return ctrl.Result{RequeueAfter: ctrlconsts.RequeueWithoutBackoff}, nil
177-
}
178-
if err != nil {
179-
return ctrl.Result{}, err
180-
}
181-
182-
if res, errStatus := patch.StatusWithCondition(
183-
ctx, cl, ent,
184-
consts.ConditionType(configurationv1alpha1.KongReferenceGrantConditionTypeResolvedRefs),
185-
metav1.ConditionTrue,
186-
configurationv1alpha1.KongReferenceGrantReasonResolvedRefs,
187-
fmt.Sprintf(
188-
"KongReferenceGrants allow access to KonnectEventGateway %s/%s",
189-
targetNamespace,
190-
ref.NamespacedRef.Name,
191-
),
192-
); errStatus != nil || !res.IsZero() {
193-
return res, errStatus
194-
}
195-
196-
return ctrl.Result{}, nil
197-
}
198-
199136
func getEventGatewayForRef(
200137
ctx context.Context,
201138
cl client.Client,
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package konnect
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
ctrl "sigs.k8s.io/controller-runtime"
9+
"sigs.k8s.io/controller-runtime/pkg/client"
10+
11+
"github.com/kong/kong-operator/v2/api/common/consts"
12+
commonv1alpha1 "github.com/kong/kong-operator/v2/api/common/v1alpha1"
13+
configurationv1alpha1 "github.com/kong/kong-operator/v2/api/configuration/v1alpha1"
14+
konnectv1alpha1 "github.com/kong/kong-operator/v2/api/konnect/v1alpha1"
15+
ctrlconsts "github.com/kong/kong-operator/v2/controller/consts"
16+
"github.com/kong/kong-operator/v2/controller/pkg/patch"
17+
"github.com/kong/kong-operator/v2/internal/utils/crossnamespace"
18+
k8sutils "github.com/kong/kong-operator/v2/pkg/utils/kubernetes"
19+
)
20+
21+
func ensureKongReferenceGrantForParentRef[
22+
T interface {
23+
client.Object
24+
k8sutils.ConditionsAware
25+
GetTypeName() string
26+
},
27+
](
28+
ctx context.Context,
29+
cl client.Client,
30+
ent T,
31+
ref commonv1alpha1.ObjectRef,
32+
) (ctrl.Result, error) {
33+
if ref.Type != commonv1alpha1.ObjectRefTypeNamespacedRef ||
34+
ref.NamespacedRef == nil ||
35+
ref.NamespacedRef.Namespace == nil ||
36+
*ref.NamespacedRef.Namespace == ent.GetNamespace() {
37+
if res, errStatus := patch.StatusWithoutCondition(
38+
ctx, cl, ent,
39+
configurationv1alpha1.KongReferenceGrantConditionTypeResolvedRefs,
40+
); errStatus != nil || !res.IsZero() {
41+
return res, errStatus
42+
}
43+
return ctrl.Result{}, nil
44+
}
45+
46+
typeName := ent.GetTypeName()
47+
targetNamespace := *ref.NamespacedRef.Namespace
48+
err := crossnamespace.CheckKongReferenceGrantForResource(
49+
ctx,
50+
cl,
51+
ent.GetNamespace(),
52+
targetNamespace,
53+
ref.NamespacedRef.Name,
54+
metav1.GroupVersionKind(ent.GetObjectKind().GroupVersionKind()),
55+
metav1.GroupVersionKind(konnectv1alpha1.GroupVersion.WithKind(typeName)),
56+
)
57+
58+
if crossnamespace.IsReferenceNotGranted(err) {
59+
if res, errStatus := patch.StatusWithCondition(
60+
ctx, cl, ent,
61+
consts.ConditionType(configurationv1alpha1.KongReferenceGrantConditionTypeResolvedRefs),
62+
metav1.ConditionFalse,
63+
configurationv1alpha1.KongReferenceGrantReasonRefNotPermitted,
64+
fmt.Sprintf(
65+
"KongReferenceGrants do not allow access to %s %s/%s",
66+
typeName,
67+
targetNamespace,
68+
ref.NamespacedRef.Name,
69+
),
70+
); errStatus != nil || !res.IsZero() {
71+
return res, errStatus
72+
}
73+
return ctrl.Result{RequeueAfter: ctrlconsts.RequeueWithoutBackoff}, nil
74+
}
75+
if err != nil {
76+
return ctrl.Result{}, err
77+
}
78+
79+
if res, errStatus := patch.StatusWithCondition(
80+
ctx, cl, ent,
81+
consts.ConditionType(configurationv1alpha1.KongReferenceGrantConditionTypeResolvedRefs),
82+
metav1.ConditionTrue,
83+
configurationv1alpha1.KongReferenceGrantReasonResolvedRefs,
84+
fmt.Sprintf(
85+
"KongReferenceGrants allow access to %s %s/%s",
86+
typeName,
87+
targetNamespace,
88+
ref.NamespacedRef.Name,
89+
),
90+
); errStatus != nil || !res.IsZero() {
91+
return res, errStatus
92+
}
93+
94+
return ctrl.Result{}, nil
95+
}

controller/konnect/reconciler_generic_handle_portalref.go

Lines changed: 3 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,10 @@ import (
1515
"sigs.k8s.io/controller-runtime/pkg/client"
1616
ctrllog "sigs.k8s.io/controller-runtime/pkg/log"
1717

18-
"github.com/kong/kong-operator/v2/api/common/consts"
1918
commonv1alpha1 "github.com/kong/kong-operator/v2/api/common/v1alpha1"
20-
configurationv1alpha1 "github.com/kong/kong-operator/v2/api/configuration/v1alpha1"
2119
konnectv1alpha1 "github.com/kong/kong-operator/v2/api/konnect/v1alpha1"
2220
ctrlconsts "github.com/kong/kong-operator/v2/controller/consts"
2321
"github.com/kong/kong-operator/v2/controller/pkg/patch"
24-
"github.com/kong/kong-operator/v2/internal/utils/crossnamespace"
2522
k8sutils "github.com/kong/kong-operator/v2/pkg/utils/kubernetes"
2623
)
2724

@@ -35,6 +32,7 @@ func handlePortalRef(
3532
type TObj interface {
3633
k8sutils.ConditionsAwareObject
3734
portalRefAccessor
35+
GetTypeName() string
3836
GetPortalID() string
3937
SetPortalID(id string)
4038
}
@@ -46,11 +44,11 @@ func handlePortalRef(
4644
}
4745
}
4846

49-
if res, err := ensureKongReferenceGrantForPortalRef(ctx, cl, o); err != nil || !res.IsZero() {
47+
portalRef := o.GetPortalRef()
48+
if res, err := ensureKongReferenceGrantForParentRef(ctx, cl, o, portalRef); err != nil || !res.IsZero() {
5049
return res, err
5150
}
5251

53-
portalRef := o.GetPortalRef()
5452
portal, nn, err := getPortalForRef(ctx, cl, portalRef, o.GetNamespace())
5553
if err != nil {
5654
if res, errStatus := patch.StatusWithCondition(
@@ -136,76 +134,6 @@ func handlePortalRef(
136134
return ctrl.Result{}, nil
137135
}
138136

139-
func ensureKongReferenceGrantForPortalRef[T interface {
140-
client.Object
141-
k8sutils.ConditionsAware
142-
portalRefAccessor
143-
}](
144-
ctx context.Context,
145-
cl client.Client,
146-
ent T,
147-
) (ctrl.Result, error) {
148-
portalRef := ent.GetPortalRef()
149-
if portalRef.Type != commonv1alpha1.ObjectRefTypeNamespacedRef ||
150-
portalRef.NamespacedRef == nil ||
151-
portalRef.NamespacedRef.Namespace == nil ||
152-
*portalRef.NamespacedRef.Namespace == ent.GetNamespace() {
153-
if res, errStatus := patch.StatusWithoutCondition(
154-
ctx, cl, ent,
155-
configurationv1alpha1.KongReferenceGrantConditionTypeResolvedRefs,
156-
); errStatus != nil || !res.IsZero() {
157-
return res, errStatus
158-
}
159-
return ctrl.Result{}, nil
160-
}
161-
162-
targetNamespace := *portalRef.NamespacedRef.Namespace
163-
err := crossnamespace.CheckKongReferenceGrantForResource(
164-
ctx,
165-
cl,
166-
ent.GetNamespace(),
167-
targetNamespace,
168-
portalRef.NamespacedRef.Name,
169-
metav1.GroupVersionKind(ent.GetObjectKind().GroupVersionKind()),
170-
metav1.GroupVersionKind(konnectv1alpha1.GroupVersion.WithKind("Portal")),
171-
)
172-
if crossnamespace.IsReferenceNotGranted(err) {
173-
if res, errStatus := patch.StatusWithCondition(
174-
ctx, cl, ent,
175-
consts.ConditionType(configurationv1alpha1.KongReferenceGrantConditionTypeResolvedRefs),
176-
metav1.ConditionFalse,
177-
configurationv1alpha1.KongReferenceGrantReasonRefNotPermitted,
178-
fmt.Sprintf(
179-
"KongReferenceGrants do not allow access to Portal %s/%s",
180-
targetNamespace,
181-
portalRef.NamespacedRef.Name,
182-
),
183-
); errStatus != nil || !res.IsZero() {
184-
return res, errStatus
185-
}
186-
return ctrl.Result{RequeueAfter: ctrlconsts.RequeueWithoutBackoff}, nil
187-
}
188-
if err != nil {
189-
return ctrl.Result{}, err
190-
}
191-
192-
if res, errStatus := patch.StatusWithCondition(
193-
ctx, cl, ent,
194-
consts.ConditionType(configurationv1alpha1.KongReferenceGrantConditionTypeResolvedRefs),
195-
metav1.ConditionTrue,
196-
configurationv1alpha1.KongReferenceGrantReasonResolvedRefs,
197-
fmt.Sprintf(
198-
"KongReferenceGrants allow access to Portal %s/%s",
199-
targetNamespace,
200-
portalRef.NamespacedRef.Name,
201-
),
202-
); errStatus != nil || !res.IsZero() {
203-
return res, errStatus
204-
}
205-
206-
return ctrl.Result{}, nil
207-
}
208-
209137
func getPortalForRef(
210138
ctx context.Context,
211139
cl client.Client,

0 commit comments

Comments
 (0)