@@ -46,17 +46,16 @@ import (
46
46
"sigs.k8s.io/controller-runtime/pkg/client"
47
47
"sigs.k8s.io/controller-runtime/pkg/healthz"
48
48
"sigs.k8s.io/controller-runtime/pkg/log"
49
- "sigs.k8s.io/controller-runtime/pkg/metrics"
50
49
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
51
50
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
52
51
crwebhook "sigs.k8s.io/controller-runtime/pkg/webhook"
53
52
54
53
ocv1 "github.com/operator-framework/operator-controller/api/v1"
55
- corecontrollers "github.com/operator-framework/operator-controller/internal/catalogd/controllers/core "
54
+ "github.com/operator-framework/operator-controller/internal/catalogd/controllers"
56
55
"github.com/operator-framework/operator-controller/internal/catalogd/features"
57
56
"github.com/operator-framework/operator-controller/internal/catalogd/garbagecollection"
58
- "github.com/operator-framework/operator-controller/internal/catalogd/handlers"
59
- catalogdmetrics "github.com/operator-framework/operator-controller/internal/catalogd/metrics "
57
+ v1 "github.com/operator-framework/operator-controller/internal/catalogd/handlers/api/v1 "
58
+ "github.com/operator-framework/operator-controller/internal/catalogd/handlers/middleware "
60
59
"github.com/operator-framework/operator-controller/internal/catalogd/serverutil"
61
60
"github.com/operator-framework/operator-controller/internal/catalogd/storage"
62
61
"github.com/operator-framework/operator-controller/internal/catalogd/webhook"
@@ -328,61 +327,55 @@ func run(ctx context.Context) error {
328
327
},
329
328
}
330
329
331
- var localStorage storage.Instance
332
- metrics .Registry .MustRegister (catalogdmetrics .RequestDurationMetric )
333
-
334
330
storeDir := filepath .Join (cfg .cacheDir , storageDir )
335
331
if err := os .MkdirAll (storeDir , 0700 ); err != nil {
336
332
setupLog .Error (err , "unable to create storage directory for catalogs" )
337
333
return err
338
334
}
339
335
340
- baseStorageURL , err := url .Parse (fmt .Sprintf ("%s/catalogs/" , cfg .externalAddr ))
336
+ const catalogsSubPath = "catalogs"
337
+ baseCatalogsURL , err := url .Parse (fmt .Sprintf ("%s/%s" , cfg .externalAddr , catalogsSubPath ))
341
338
if err != nil {
342
339
setupLog .Error (err , "unable to create base storage URL" )
343
340
return err
344
341
}
345
342
346
- indexer := storage .NewIndexer ()
347
- handlersMap := map [string ]http.Handler {
348
- "/all" : handlers .V1AllHandler (indexer ),
349
- }
350
-
351
- if features .CatalogdFeatureGate .Enabled (features .APIV1MetasHandler ) {
352
- handlersMap ["/metas" ] = handlers .V1MetasHandler (indexer )
353
- }
354
-
355
- if features .CatalogdFeatureGate .Enabled (features .APIV1GraphQLHandler ) {
356
- handlersMap ["/graphql" ] = handlers .V1GraphQLHandler ()
357
- }
358
-
359
- localStorage = & storage.LocalDirV1 {
360
- Indexer : indexer ,
361
- Handlers : handlersMap ,
362
- RootDir : storeDir ,
363
- RootURL : baseStorageURL ,
364
- }
343
+ storageInstances := configureStorage (storeDir )
344
+ handler := configureHandler (configAPIV1Handler (catalogsSubPath , storageInstances ))
365
345
366
346
// Config for the catalogd web server
367
- catalogServerConfig := serverutil.CatalogServerConfig {
368
- ExternalAddr : cfg .externalAddr ,
369
- CatalogAddr : cfg .catalogServerAddr ,
370
- CertFile : cfg .certFile ,
371
- KeyFile : cfg .keyFile ,
372
- LocalStorage : localStorage ,
347
+ catalogServerConfig := serverutil.ServerConfig {
348
+ Name : "catalogs" ,
349
+ OnlyServeWhenLeader : true ,
350
+ ListenAddr : cfg .catalogServerAddr ,
351
+ Server : & http.Server {
352
+ Handler : handler ,
353
+ ReadTimeout : 5 * time .Second ,
354
+ WriteTimeout : 5 * time .Minute ,
355
+ },
356
+ }
357
+ if cfg .certFile != "" && cfg .keyFile != "" {
358
+ catalogServerConfig .GetCertificate = cw .GetCertificate
373
359
}
374
360
375
- err = serverutil .AddCatalogServerToManager ( mgr , catalogServerConfig , cw )
361
+ catalogServer , err : = serverutil .NewManagerServer ( catalogServerConfig )
376
362
if err != nil {
377
363
setupLog .Error (err , "unable to configure catalog server" )
378
364
return err
379
365
}
366
+ if err := mgr .Add (catalogServer ); err != nil {
367
+ setupLog .Error (err , "unable to add catalog server to manager" )
368
+ return err
369
+ }
380
370
381
- if err = (& corecontrollers .ClusterCatalogReconciler {
371
+ if err = (& controllers .ClusterCatalogReconciler {
382
372
Client : mgr .GetClient (),
383
373
ImageCache : imageCache ,
384
374
ImagePuller : imagePuller ,
385
- Storage : localStorage ,
375
+ Storage : storageInstances ,
376
+ GetBaseURL : func (catalogName string ) string {
377
+ return fmt .Sprintf ("%s/%s" , baseCatalogsURL , catalogName )
378
+ },
386
379
}).SetupWithManager (mgr ); err != nil {
387
380
setupLog .Error (err , "unable to create controller" , "controller" , "ClusterCatalog" )
388
381
return err
@@ -452,3 +445,54 @@ func podNamespace() string {
452
445
}
453
446
return string (namespace )
454
447
}
448
+
449
+ func configureStorage (storeDir string ) * storage.Instances {
450
+ metasEnabled := features .CatalogdFeatureGate .Enabled (features .APIV1MetasHandler )
451
+ graphqlEnabled := features .CatalogdFeatureGate .Enabled (features .APIV1GraphQLHandler )
452
+ needsIndices := metasEnabled || graphqlEnabled
453
+
454
+ // Setup storage instances
455
+ storageInstances := storage.Instances {}
456
+ storageInstances .Files = storage .NewFiles (storeDir )
457
+
458
+ if needsIndices {
459
+ storageInstances .Indices = storage .NewIndices (storeDir )
460
+ }
461
+ if graphqlEnabled {
462
+ storageInstances .GraphQLSchemas = storage .NewGraphQLSchemas ()
463
+ }
464
+
465
+ return & storageInstances
466
+ }
467
+
468
+ func configAPIV1Handler (baseURLPath string , si * storage.Instances ) subPathedHandler {
469
+ metasEnabled := features .CatalogdFeatureGate .Enabled (features .APIV1MetasHandler )
470
+ graphqlEnabled := features .CatalogdFeatureGate .Enabled (features .APIV1GraphQLHandler )
471
+
472
+ // Setup API v1 handler
473
+ apiV1HandlerOpts := []v1.APIV1HandlerOption {}
474
+ apiV1HandlerOpts = append (apiV1HandlerOpts , v1 .WithAllHandler (si .Files ))
475
+
476
+ if metasEnabled {
477
+ apiV1HandlerOpts = append (apiV1HandlerOpts , v1 .WithMetasHandler (si .Files , si .Indices ))
478
+ }
479
+
480
+ if graphqlEnabled {
481
+ apiV1HandlerOpts = append (apiV1HandlerOpts , v1 .WithGraphQLHandler (si .Files , si .Indices , si .GraphQLSchemas ))
482
+ }
483
+
484
+ return v1 .NewAPIV1Handler (baseURLPath , apiV1HandlerOpts ... )
485
+ }
486
+
487
+ type subPathedHandler interface {
488
+ SubPath () string
489
+ http.Handler
490
+ }
491
+
492
+ func configureHandler (handlers ... subPathedHandler ) http.Handler {
493
+ mux := http .NewServeMux ()
494
+ for _ , h := range handlers {
495
+ mux .Handle (h .SubPath (), h )
496
+ }
497
+ return middleware .Standard (mux )
498
+ }
0 commit comments