Skip to content

Commit 7d50a3b

Browse files
committed
Create an Apply function
1 parent 798dbef commit 7d50a3b

File tree

2 files changed

+63
-37
lines changed

2 files changed

+63
-37
lines changed

cmd/descheduler/app/options/options.go

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,15 @@ import (
2323

2424
"github.com/spf13/pflag"
2525
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26+
apiserver "k8s.io/apiserver/pkg/server"
2627
apiserveroptions "k8s.io/apiserver/pkg/server/options"
2728
clientset "k8s.io/client-go/kubernetes"
29+
restclient "k8s.io/client-go/rest"
2830
cliflag "k8s.io/component-base/cli/flag"
2931
componentbaseconfig "k8s.io/component-base/config"
3032
componentbaseoptions "k8s.io/component-base/config/options"
3133
"k8s.io/component-base/featuregate"
34+
"k8s.io/klog/v2"
3235

3336
"sigs.k8s.io/descheduler/pkg/apis/componentconfig"
3437
"sigs.k8s.io/descheduler/pkg/apis/componentconfig/v1alpha1"
@@ -45,11 +48,12 @@ const (
4548
type DeschedulerServer struct {
4649
componentconfig.DeschedulerConfiguration
4750

48-
Client clientset.Interface
49-
EventClient clientset.Interface
50-
SecureServing *apiserveroptions.SecureServingOptionsWithLoopback
51-
DisableMetrics bool
52-
EnableHTTP2 bool
51+
Client clientset.Interface
52+
EventClient clientset.Interface
53+
SecureServing *apiserveroptions.SecureServingOptionsWithLoopback
54+
SecureServingInfo *apiserver.SecureServingInfo
55+
DisableMetrics bool
56+
EnableHTTP2 bool
5357
// FeatureGates enabled by the user
5458
FeatureGates map[string]bool
5559
// DefaultFeatureGates for internal accessing so unit tests can enable/disable specific features
@@ -118,3 +122,24 @@ func (rs *DeschedulerServer) AddFlags(fs *pflag.FlagSet) {
118122

119123
rs.SecureServing.AddFlags(fs)
120124
}
125+
126+
func (rs *DeschedulerServer) Apply() error {
127+
err := features.DefaultMutableFeatureGate.SetFromMap(rs.FeatureGates)
128+
if err != nil {
129+
return err
130+
}
131+
rs.DefaultFeatureGates = features.DefaultMutableFeatureGate
132+
133+
// loopbackClientConfig is a config for a privileged loopback connection
134+
var loopbackClientConfig *restclient.Config
135+
var secureServing *apiserver.SecureServingInfo
136+
if err := rs.SecureServing.ApplyTo(&secureServing, &loopbackClientConfig); err != nil {
137+
klog.ErrorS(err, "failed to apply secure server configuration")
138+
return err
139+
}
140+
141+
secureServing.DisableHTTP2 = !rs.EnableHTTP2
142+
rs.SecureServingInfo = secureServing
143+
144+
return nil
145+
}

cmd/descheduler/app/server.go

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,7 @@ import (
3434

3535
"k8s.io/apimachinery/pkg/util/runtime"
3636
"k8s.io/apimachinery/pkg/watch"
37-
apiserver "k8s.io/apiserver/pkg/server"
3837
"k8s.io/apiserver/pkg/server/mux"
39-
restclient "k8s.io/client-go/rest"
4038
"k8s.io/component-base/featuregate"
4139
"k8s.io/component-base/logs"
4240
logsapi "k8s.io/component-base/logs/api/v1"
@@ -68,40 +66,16 @@ func NewDeschedulerCommand(out io.Writer) *cobra.Command {
6866
return nil
6967
},
7068
RunE: func(cmd *cobra.Command, args []string) error {
71-
// loopbackClientConfig is a config for a privileged loopback connection
72-
var loopbackClientConfig *restclient.Config
73-
var secureServing *apiserver.SecureServingInfo
74-
if err := s.SecureServing.ApplyTo(&secureServing, &loopbackClientConfig); err != nil {
75-
klog.ErrorS(err, "failed to apply secure server configuration")
69+
if err = Apply(s); err != nil {
70+
klog.ErrorS(err, "failed to apply")
7671
return err
7772
}
7873

79-
secureServing.DisableHTTP2 = !s.EnableHTTP2
80-
81-
ctx, done := signal.NotifyContext(cmd.Context(), syscall.SIGINT, syscall.SIGTERM)
82-
83-
pathRecorderMux := mux.NewPathRecorderMux("descheduler")
84-
if !s.DisableMetrics {
85-
pathRecorderMux.Handle("/metrics", legacyregistry.HandlerWithReset())
86-
}
87-
88-
healthz.InstallHandler(pathRecorderMux, healthz.NamedCheck("Descheduler", healthz.PingHealthz.Check))
89-
90-
stoppedCh, _, err := secureServing.Serve(pathRecorderMux, 0, ctx.Done())
91-
if err != nil {
92-
klog.Fatalf("failed to start secure server: %v", err)
93-
return err
94-
}
95-
96-
if err = Run(ctx, s); err != nil {
97-
klog.ErrorS(err, "descheduler server")
74+
if err = Run(cmd.Context(), s); err != nil {
75+
klog.ErrorS(err, "failed to run descheduler server")
9876
return err
9977
}
10078

101-
done()
102-
// wait for metrics server to close
103-
<-stoppedCh
104-
10579
return nil
10680
},
10781
}
@@ -115,12 +89,30 @@ func NewDeschedulerCommand(out io.Writer) *cobra.Command {
11589
return cmd
11690
}
11791

118-
func Run(ctx context.Context, rs *options.DeschedulerServer) error {
92+
func Apply(rs *options.DeschedulerServer) error {
11993
err := features.DefaultMutableFeatureGate.SetFromMap(rs.FeatureGates)
12094
if err != nil {
12195
return err
12296
}
12397
rs.DefaultFeatureGates = features.DefaultMutableFeatureGate
98+
return nil
99+
}
100+
101+
func Run(rootCtx context.Context, rs *options.DeschedulerServer) error {
102+
ctx, done := signal.NotifyContext(rootCtx, syscall.SIGINT, syscall.SIGTERM)
103+
104+
pathRecorderMux := mux.NewPathRecorderMux("descheduler")
105+
if !rs.DisableMetrics {
106+
pathRecorderMux.Handle("/metrics", legacyregistry.HandlerWithReset())
107+
}
108+
109+
healthz.InstallHandler(pathRecorderMux, healthz.NamedCheck("Descheduler", healthz.PingHealthz.Check))
110+
111+
stoppedCh, _, err := rs.SecureServingInfo.Serve(pathRecorderMux, 0, ctx.Done())
112+
if err != nil {
113+
klog.Fatalf("failed to start secure server: %v", err)
114+
return err
115+
}
124116

125117
err = tracing.NewTracerProvider(ctx, rs.Tracing.CollectorEndpoint, rs.Tracing.TransportCert, rs.Tracing.ServiceName, rs.Tracing.ServiceNamespace, rs.Tracing.SampleRate, rs.Tracing.FallbackToNoOpProviderOnError)
126118
if err != nil {
@@ -131,5 +123,14 @@ func Run(ctx context.Context, rs *options.DeschedulerServer) error {
131123
// increase the fake watch channel so the dry-run mode can be run
132124
// over a cluster with thousands of pods
133125
watch.DefaultChanSize = 100000
134-
return descheduler.Run(ctx, rs)
126+
err = descheduler.Run(ctx, rs)
127+
if err != nil {
128+
return err
129+
}
130+
131+
done()
132+
// wait for metrics server to close
133+
<-stoppedCh
134+
135+
return nil
135136
}

0 commit comments

Comments
 (0)