Skip to content

Commit 58068dc

Browse files
committed
Decouple CRD and APIResourceSchema in service export request reconciler
Signed-off-by: Karol Szwaj <karol.szwaj@gmail.com> On-behalf-of: @SAP karol.szwaj@sap.com
1 parent b06359d commit 58068dc

1 file changed

Lines changed: 40 additions & 18 deletions

File tree

contrib/example-backend/controllers/serviceexportrequest/serviceexportrequest_reconcile.go

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,18 @@ func (r *reconciler) reconcile(ctx context.Context, req *kubebindv1alpha2.APISer
5858

5959
func (r *reconciler) ensureExports(ctx context.Context, req *kubebindv1alpha2.APIServiceExportRequest) error {
6060
logger := klog.FromContext(ctx)
61-
6261
if req.Status.Phase == kubebindv1alpha2.APIServiceExportRequestPhasePending {
6362
failure := false
6463
for _, res := range req.Spec.Resources {
65-
// backend is created using CRD's as backup. But this is not required.
6664
name := res.Resource + "." + res.Group
67-
6865
apiResourceSchema, err := r.getAPIResourceSchema(ctx, name)
6966
switch {
7067
case apierrors.IsNotFound(err):
71-
logger.V(1).Info("APIResourceSchema not found, continuing with fallback to CRD conversion to APIResourceSchema", "name", name)
72-
crd, err := r.getCRD(name)
73-
if err != nil && !apierrors.IsNotFound(err) {
68+
apiResourceSchema, err = r.ensureAPIResourceSchema(ctx, req, name)
69+
if err != nil {
7470
return err
7571
}
76-
if apierrors.IsNotFound(err) {
72+
if apiResourceSchema == nil {
7773
conditions.MarkFalse(
7874
req,
7975
kubebindv1alpha2.APIServiceExportRequestConditionExportsReady,
@@ -83,17 +79,7 @@ func (r *reconciler) ensureExports(ctx context.Context, req *kubebindv1alpha2.AP
8379
name,
8480
)
8581
failure = true
86-
break
87-
}
88-
schema, err := helpers.CRDToAPIResourceSchema(crd, "")
89-
if err != nil {
90-
return err
91-
}
92-
schema.Namespace = req.Namespace
93-
94-
logger.V(1).Info("Creating APIResourceSchema", "name", schema.Name, "namespace", schema.Namespace)
95-
if apiResourceSchema, err = r.createAPIResourceSchema(ctx, schema); err != nil {
96-
return err
82+
continue
9783
}
9884
case err != nil:
9985
return err
@@ -155,3 +141,39 @@ func (r *reconciler) ensureExports(ctx context.Context, req *kubebindv1alpha2.AP
155141

156142
return nil
157143
}
144+
145+
func (r *reconciler) ensureAPIResourceSchema(
146+
ctx context.Context,
147+
req *kubebindv1alpha2.APIServiceExportRequest,
148+
name string,
149+
) (*kubebindv1alpha2.APIResourceSchema, error) {
150+
logger := klog.FromContext(ctx)
151+
152+
// try to get existing APIResourceSchema first
153+
apiResourceSchema, err := r.getAPIResourceSchema(ctx, name)
154+
if err == nil {
155+
logger.V(1).Info("Found existing APIResourceSchema", "name", name)
156+
return apiResourceSchema, nil
157+
}
158+
if !apierrors.IsNotFound(err) {
159+
return nil, err
160+
}
161+
162+
// fallback to CRD conversion
163+
crd, err := r.getCRD(name)
164+
if err != nil {
165+
if apierrors.IsNotFound(err) {
166+
return nil, nil // Neither APIResourceSchema nor CRD found
167+
}
168+
return nil, err
169+
}
170+
171+
logger.V(1).Info("Creating APIResourceSchema from CRD conversion", "name", name)
172+
schema, err := helpers.CRDToAPIResourceSchema(crd, "")
173+
if err != nil {
174+
return nil, err
175+
}
176+
schema.Namespace = req.Namespace
177+
178+
return r.createAPIResourceSchema(ctx, schema)
179+
}

0 commit comments

Comments
 (0)