sigs.k8s.io/kueue@v0.6.2/pkg/visibility/server.go (about) 1 // Copyright 2023 The Kubernetes Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package visibility 16 17 import ( 18 "context" 19 "fmt" 20 "net" 21 "strings" 22 23 "sigs.k8s.io/kueue/apis/visibility/v1alpha1" 24 generatedopenapi "sigs.k8s.io/kueue/apis/visibility/v1alpha1/openapi" 25 "sigs.k8s.io/kueue/pkg/queue" 26 "sigs.k8s.io/kueue/pkg/visibility/api" 27 28 openapinamer "k8s.io/apiserver/pkg/endpoints/openapi" 29 genericapiserver "k8s.io/apiserver/pkg/server" 30 genericoptions "k8s.io/apiserver/pkg/server/options" 31 "k8s.io/client-go/pkg/version" 32 _ "k8s.io/component-base/metrics/prometheus/restclient" // for client-go metrics registration 33 ctrl "sigs.k8s.io/controller-runtime" 34 ) 35 36 var ( 37 setupLog = ctrl.Log.WithName("visibility-server") 38 ) 39 40 type server struct { 41 *genericapiserver.GenericAPIServer 42 } 43 44 // +kubebuilder:rbac:groups=flowcontrol.apiserver.k8s.io,resources=prioritylevelconfigurations,verbs=list;watch 45 // +kubebuilder:rbac:groups=flowcontrol.apiserver.k8s.io,resources=flowschemas,verbs=list;watch 46 // +kubebuilder:rbac:groups=flowcontrol.apiserver.k8s.io,resources=flowschemas/status,verbs=patch 47 48 // CreateAndStartVisibilityServer creates visibility server injecting KueueManager and starts it 49 func CreateAndStartVisibilityServer(kueueMgr *queue.Manager, ctx context.Context) { 50 config := newVisibilityServerConfig() 51 if err := applyVisibilityServerOptions(config); err != nil { 52 setupLog.Error(err, "Unable to apply VisibilityServerOptions") 53 } 54 55 visibilityServer, err := config.Complete().New("visibility-server", genericapiserver.NewEmptyDelegate()) 56 if err != nil { 57 setupLog.Error(err, "Unable to create visibility server") 58 } 59 60 if err := api.Install(visibilityServer, kueueMgr); err != nil { 61 setupLog.Error(err, "Unable to install visibility.kueue.x-k8s.io/v1alpha1 API") 62 } 63 64 s := &server{visibilityServer} 65 if err := s.GenericAPIServer.PrepareRun().Run(ctx.Done()); err != nil { 66 setupLog.Error(err, "Error running visibility server") 67 } 68 } 69 70 func applyVisibilityServerOptions(config *genericapiserver.RecommendedConfig) error { 71 o := genericoptions.NewRecommendedOptions("", api.Codecs.LegacyCodec(v1alpha1.SchemeGroupVersion)) 72 o.Etcd = nil 73 o.SecureServing.BindPort = 8082 74 // The directory where TLS certs will be created 75 o.SecureServing.ServerCert.CertDirectory = "/tmp" 76 77 if err := o.SecureServing.MaybeDefaultWithSelfSignedCerts("localhost", nil, []net.IP{net.ParseIP("127.0.0.1")}); err != nil { 78 return fmt.Errorf("error creating self-signed certificates: %v", err) 79 } 80 return o.ApplyTo(config) 81 } 82 83 func newVisibilityServerConfig() *genericapiserver.RecommendedConfig { 84 c := genericapiserver.NewRecommendedConfig(api.Codecs) 85 versionGet := version.Get() 86 c.Config.Version = &versionGet 87 // enable OpenAPI schemas 88 c.Config.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(generatedopenapi.GetOpenAPIDefinitions, openapinamer.NewDefinitionNamer(api.Scheme)) 89 c.Config.OpenAPIV3Config = genericapiserver.DefaultOpenAPIV3Config(generatedopenapi.GetOpenAPIDefinitions, openapinamer.NewDefinitionNamer(api.Scheme)) 90 c.Config.OpenAPIConfig.Info.Title = "Kueue visibility-server" 91 c.Config.OpenAPIV3Config.Info.Title = "Kueue visibility-server" 92 c.Config.OpenAPIConfig.Info.Version = strings.Split(c.Config.Version.String(), "-")[0] 93 c.Config.OpenAPIV3Config.Info.Version = strings.Split(c.Config.Version.String(), "-")[0] 94 95 c.EnableMetrics = true 96 97 return c 98 }