@@ -46,22 +46,21 @@ 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"
60
- "github.com/operator-framework/operator-controller/internal/catalogd/serverutil"
57
+ "github.com/operator-framework/operator-controller/internal/catalogd/handler"
58
+ v1 "github.com/operator-framework/operator-controller/internal/catalogd/handler/api/v1"
61
59
"github.com/operator-framework/operator-controller/internal/catalogd/storage"
62
60
"github.com/operator-framework/operator-controller/internal/catalogd/webhook"
63
61
sharedcontrollers "github.com/operator-framework/operator-controller/internal/shared/controllers"
64
62
fsutil "github.com/operator-framework/operator-controller/internal/shared/util/fs"
63
+ http2 "github.com/operator-framework/operator-controller/internal/shared/util/http"
65
64
imageutil "github.com/operator-framework/operator-controller/internal/shared/util/image"
66
65
"github.com/operator-framework/operator-controller/internal/shared/util/pullsecretcache"
67
66
sautil "github.com/operator-framework/operator-controller/internal/shared/util/sa"
@@ -328,61 +327,60 @@ 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
+ catalogdHandler := handler .NewStandardHandler (
345
+ newAPIV1Handler (catalogsSubPath , storageInstances ),
346
+ )
365
347
366
348
// 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 ,
349
+ catalogServerConfig := http2.ServerConfig {
350
+ Name : "catalogs" ,
351
+ OnlyServeWhenLeader : true ,
352
+ ListenAddr : cfg .catalogServerAddr ,
353
+ Server : & http.Server {
354
+ Handler : catalogdHandler ,
355
+ ReadTimeout : 5 * time .Second ,
356
+ WriteTimeout : 5 * time .Minute ,
357
+ },
358
+ }
359
+ if cfg .certFile != "" && cfg .keyFile != "" {
360
+ catalogServerConfig .TLSConfig = & tls.Config {
361
+ GetCertificate : cw .GetCertificate ,
362
+ MinVersion : tls .VersionTLS12 ,
363
+ }
373
364
}
374
365
375
- err = serverutil . AddCatalogServerToManager ( mgr , catalogServerConfig , cw )
366
+ catalogServer , err := http2 . NewManagerServer ( catalogServerConfig )
376
367
if err != nil {
377
368
setupLog .Error (err , "unable to configure catalog server" )
378
369
return err
379
370
}
371
+ if err := mgr .Add (catalogServer ); err != nil {
372
+ setupLog .Error (err , "unable to add catalog server to manager" )
373
+ return err
374
+ }
380
375
381
- if err = (& corecontrollers .ClusterCatalogReconciler {
376
+ if err = (& controllers .ClusterCatalogReconciler {
382
377
Client : mgr .GetClient (),
383
378
ImageCache : imageCache ,
384
379
ImagePuller : imagePuller ,
385
- Storage : localStorage ,
380
+ Storage : storageInstances ,
381
+ GetBaseURL : func (catalogName string ) string {
382
+ return fmt .Sprintf ("%s/%s" , baseCatalogsURL , catalogName )
383
+ },
386
384
}).SetupWithManager (mgr ); err != nil {
387
385
setupLog .Error (err , "unable to create controller" , "controller" , "ClusterCatalog" )
388
386
return err
@@ -452,3 +450,33 @@ func podNamespace() string {
452
450
}
453
451
return string (namespace )
454
452
}
453
+
454
+ func configureStorage (storeDir string ) * storage.Instances {
455
+ metasEnabled := features .CatalogdFeatureGate .Enabled (features .APIV1MetasHandler )
456
+ graphqlEnabled := features .CatalogdFeatureGate .Enabled (features .APIV1GraphQLHandler )
457
+ needsIndices := metasEnabled || graphqlEnabled
458
+
459
+ // Setup storage instances
460
+ storageInstances := storage.Instances {}
461
+ storageInstances .Files = storage .NewFiles (storeDir )
462
+
463
+ if needsIndices {
464
+ storageInstances .Indices = storage .NewIndices (storeDir )
465
+ }
466
+ if graphqlEnabled {
467
+ storageInstances .GraphQLSchemas = storage .NewGraphQLSchemas ()
468
+ }
469
+
470
+ return & storageInstances
471
+ }
472
+
473
+ func newAPIV1Handler (baseURLPath string , si * storage.Instances ) * v1.APIV1Handler {
474
+ metasEnabled := features .CatalogdFeatureGate .Enabled (features .APIV1MetasHandler )
475
+ graphqlEnabled := features .CatalogdFeatureGate .Enabled (features .APIV1GraphQLHandler )
476
+
477
+ return v1 .NewAPIV1Handler (baseURLPath , si ,
478
+ v1 .WithAllHandler (true ),
479
+ v1 .WithMetasHandler (metasEnabled ),
480
+ v1 .WithGraphQLHandler (graphqlEnabled ),
481
+ )
482
+ }
0 commit comments