Skip to content

Commit 1e38c86

Browse files
authored
Merge pull request kubernetes#129996 from yongruilin/fix-flag-apiserver
fix: apiserver flagz to response actual parsed flags
2 parents e7b03ea + b1d72a5 commit 1e38c86

File tree

8 files changed

+37
-11
lines changed

8 files changed

+37
-11
lines changed

cmd/kube-apiserver/app/options/completion.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (s *ServerRunOptions) Complete(ctx context.Context) (CompletedOptions, erro
5757
if err != nil {
5858
return CompletedOptions{}, err
5959
}
60-
controlplane, err := s.Options.Complete(ctx, s.Flags(), []string{"kubernetes.default.svc", "kubernetes.default", "kubernetes"}, []net.IP{apiServerServiceIP})
60+
controlplane, err := s.Options.Complete(ctx, []string{"kubernetes.default.svc", "kubernetes.default", "kubernetes"}, []net.IP{apiServerServiceIP})
6161
if err != nil {
6262
return CompletedOptions{}, err
6363
}

cmd/kube-apiserver/app/server.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ import (
4949
"k8s.io/component-base/term"
5050
utilversion "k8s.io/component-base/version"
5151
"k8s.io/component-base/version/verflag"
52+
zpagesfeatures "k8s.io/component-base/zpages/features"
53+
"k8s.io/component-base/zpages/flagz"
5254
"k8s.io/klog/v2"
5355
aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver"
5456
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
@@ -124,6 +126,11 @@ cluster's shared state through which all other components interact.`,
124126

125127
fs := cmd.Flags()
126128
namedFlagSets := s.Flags()
129+
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentFlagz) {
130+
s.Flagz = flagz.NamedFlagSetsReader{
131+
FlagSets: namedFlagSets,
132+
}
133+
}
127134
verflag.AddFlags(namedFlagSets.FlagSet("global"))
128135
globalflag.AddGlobalFlags(namedFlagSets.FlagSet("global"), cmd.Name(), logs.SkipLoggingConfigurationFlags())
129136
options.AddCustomGlobalFlags(namedFlagSets.FlagSet("generic"))

cmd/kube-apiserver/app/testing/testserver.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ import (
5757
basecompatibility "k8s.io/component-base/compatibility"
5858
featuregatetesting "k8s.io/component-base/featuregate/testing"
5959
logsapi "k8s.io/component-base/logs/api/v1"
60+
zpagesfeatures "k8s.io/component-base/zpages/features"
61+
"k8s.io/component-base/zpages/flagz"
6062
"k8s.io/klog/v2"
6163
"k8s.io/kube-aggregator/pkg/apiserver"
6264
"k8s.io/kubernetes/pkg/features"
@@ -207,7 +209,8 @@ func StartTestServer(t ktesting.TB, instanceOptions *TestServerInstanceOptions,
207209
s.GenericServerRunOptions.RequestTimeout = instanceOptions.RequestTimeout
208210
}
209211

210-
for _, f := range s.Flags().FlagSets {
212+
namedFlagSets := s.Flags()
213+
for _, f := range namedFlagSets.FlagSets {
211214
fs.AddFlagSet(f)
212215
}
213216

@@ -341,6 +344,9 @@ func StartTestServer(t ktesting.TB, instanceOptions *TestServerInstanceOptions,
341344
if err := fs.Parse(customFlags); err != nil {
342345
return result, err
343346
}
347+
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentFlagz) {
348+
s.Flagz = flagz.NamedFlagSetsReader{FlagSets: namedFlagSets}
349+
}
344350

345351
// the RequestHeader options pointer gets replaced in the case of EnableCertAuth override
346352
// and so flags are connected to a struct that no longer appears in the ServerOptions struct

pkg/controlplane/apiserver/config_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"k8s.io/apimachinery/pkg/runtime"
2626
"k8s.io/apimachinery/pkg/runtime/schema"
2727
apiserveroptions "k8s.io/apiserver/pkg/server/options"
28-
cliflag "k8s.io/component-base/cli/flag"
2928
aggregatorscheme "k8s.io/kube-aggregator/pkg/apiserver/scheme"
3029
"k8s.io/kubernetes/pkg/api/legacyscheme"
3130
"k8s.io/kubernetes/pkg/controlplane/apiserver/options"
@@ -47,7 +46,7 @@ func TestBuildGenericConfig(t *testing.T) {
4746
s.BindPort = ln.Addr().(*net.TCPAddr).Port
4847
opts.SecureServing = s
4948

50-
completedOptions, err := opts.Complete(context.TODO(), cliflag.NamedFlagSets{}, nil, nil)
49+
completedOptions, err := opts.Complete(context.TODO(), nil, nil)
5150
if err != nil {
5251
t.Fatalf("Failed to complete apiserver options: %v", err)
5352
}

pkg/controlplane/apiserver/options/options.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ func (s *Options) AddFlags(fss *cliflag.NamedFlagSets) {
203203
"Path to socket where a external JWT signer is listening. This flag is mutually exclusive with --service-account-signing-key-file and --service-account-key-file. Requires enabling feature gate (ExternalServiceAccountTokenSigner)")
204204
}
205205

206-
func (o *Options) Complete(ctx context.Context, fss cliflag.NamedFlagSets, alternateDNS []string, alternateIPs []net.IP) (CompletedOptions, error) {
206+
func (o *Options) Complete(ctx context.Context, alternateDNS []string, alternateIPs []net.IP) (CompletedOptions, error) {
207207
if o == nil {
208208
return CompletedOptions{completedOptions: &completedOptions{}}, nil
209209
}
@@ -269,8 +269,6 @@ func (o *Options) Complete(ctx context.Context, fss cliflag.NamedFlagSets, alter
269269
}
270270
}
271271

272-
completed.Flagz = flagz.NamedFlagSetsReader{FlagSets: fss}
273-
274272
return CompletedOptions{
275273
completedOptions: &completed,
276274
}, nil

pkg/controlplane/apiserver/samples/generic/server/server.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"path/filepath"
2525

2626
"github.com/spf13/cobra"
27-
"github.com/spf13/pflag"
2827
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2928
utilerrors "k8s.io/apimachinery/pkg/util/errors"
3029
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
@@ -86,7 +85,7 @@ APIs.`,
8685

8786
ctx := genericapiserver.SetupSignalContext()
8887

89-
completedOptions, err := s.Complete(ctx, cliflag.NamedFlagSets{FlagSets: map[string]*pflag.FlagSet{"sample_generic_controlplane": fs}}, []string{}, []net.IP{})
88+
completedOptions, err := s.Complete(ctx, []string{}, []net.IP{})
9089
if err != nil {
9190
return err
9291
}

pkg/controlplane/apiserver/samples/generic/server/testing/testserver.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,13 @@ import (
3737
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
3838
"k8s.io/apimachinery/pkg/util/wait"
3939
"k8s.io/apiserver/pkg/storage/storagebackend"
40+
utilfeature "k8s.io/apiserver/pkg/util/feature"
4041
"k8s.io/client-go/kubernetes"
4142
restclient "k8s.io/client-go/rest"
4243
cliflag "k8s.io/component-base/cli/flag"
4344
logsapi "k8s.io/component-base/logs/api/v1"
45+
zpagesfeatures "k8s.io/component-base/zpages/features"
46+
"k8s.io/component-base/zpages/flagz"
4447
"k8s.io/klog/v2"
4548
controlplaneapiserver "k8s.io/kubernetes/pkg/controlplane/apiserver/options"
4649
"k8s.io/kubernetes/test/utils/ktesting"
@@ -126,6 +129,9 @@ func StartTestServer(t ktesting.TB, instanceOptions *TestServerInstanceOptions,
126129
o := server.NewOptions()
127130
var fss cliflag.NamedFlagSets
128131
o.AddFlags(&fss)
132+
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentFlagz) {
133+
o.Flagz = flagz.NamedFlagSetsReader{FlagSets: fss}
134+
}
129135

130136
fs := pflag.NewFlagSet("test", pflag.PanicOnError)
131137
for _, f := range fss.FlagSets {
@@ -164,7 +170,7 @@ func StartTestServer(t ktesting.TB, instanceOptions *TestServerInstanceOptions,
164170
o.Authentication.ServiceAccounts.Issuers = []string{"https://foo.bar.example.com"}
165171
o.Authentication.ServiceAccounts.KeyFiles = []string{saSigningKeyFile.Name()}
166172

167-
completedOptions, err := o.Complete(tCtx, fss, nil, nil)
173+
completedOptions, err := o.Complete(tCtx, nil, nil)
168174
if err != nil {
169175
return result, fmt.Errorf("failed to set default ServerRunOptions: %w", err)
170176
}

test/integration/controlplane/kube_apiserver_test.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ func TestLivezAndReadyz(t *testing.T) {
132132

133133
func TestFlagz(t *testing.T) {
134134
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ComponentFlagz, true)
135-
server := kubeapiservertesting.StartTestServerOrDie(t, nil, framework.DefaultTestServerFlags(), framework.SharedEtcd())
135+
testServerFlags := append(framework.DefaultTestServerFlags(), "--emulated-version=1.32")
136+
server := kubeapiservertesting.StartTestServerOrDie(t, nil, testServerFlags, framework.SharedEtcd())
136137
defer server.TearDownFn()
137138

138139
client, err := kubernetes.NewForConfig(server.ClientConfig)
@@ -158,6 +159,16 @@ Warning: This endpoint is not meant to be machine parseable, has no formatting c
158159
if !bytes.HasPrefix(raw, []byte(expectedHeader)) {
159160
t.Fatalf("Header mismatch!\nExpected:\n%s\n\nGot:\n%s", expectedHeader, string(raw))
160161
}
162+
found := false
163+
for _, line := range strings.Split(string(raw), "\n") {
164+
if strings.Contains(line, "emulated-version") && strings.Contains(line, "1.32") {
165+
found = true
166+
break
167+
}
168+
}
169+
if !found {
170+
t.Fatalf("Expected flag --emulated-version=[1.32] to be reflected in /flagz output, got:\n%s", string(raw))
171+
}
161172
}
162173

163174
// TestOpenAPIDelegationChainPlumbing is a smoke test that checks for

0 commit comments

Comments
 (0)