@@ -58,22 +58,18 @@ func (r *reconciler) reconcile(ctx context.Context, req *kubebindv1alpha2.APISer
5858
5959func (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