add new test cases to test json output when fetch kubeadm config from server

This commit is contained in:
carlory 2024-02-21 18:22:33 +08:00
parent 98437cb4be
commit ecaf269d3c
2 changed files with 70 additions and 7 deletions

View File

@ -26,13 +26,13 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag" "github.com/spf13/pflag"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/duration" "k8s.io/apimachinery/pkg/util/duration"
"k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"k8s.io/klog/v2" "k8s.io/klog/v2"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme" kubeadmscheme "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme"
kubeadmapiv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3" kubeadmapiv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3"

View File

@ -32,11 +32,18 @@ import (
"testing" "testing"
"time" "time"
"github.com/lithammer/dedent"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag" "github.com/spf13/pflag"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes"
fakeclientset "k8s.io/client-go/kubernetes/fake"
clientgotesting "k8s.io/client-go/testing"
"k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd"
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
@ -45,6 +52,7 @@ import (
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
certsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs" certsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs"
kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig" kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig"
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
"k8s.io/kubernetes/cmd/kubeadm/app/util/pkiutil" "k8s.io/kubernetes/cmd/kubeadm/app/util/pkiutil"
testutil "k8s.io/kubernetes/cmd/kubeadm/test" testutil "k8s.io/kubernetes/cmd/kubeadm/test"
cmdtestutil "k8s.io/kubernetes/cmd/kubeadm/test/cmd" cmdtestutil "k8s.io/kubernetes/cmd/kubeadm/test/cmd"
@ -492,6 +500,7 @@ func TestRunCmdCertsExpiration(t *testing.T) {
if err := os.RemoveAll(kdir); err != nil { if err := os.RemoveAll(kdir); err != nil {
t.Fatalf("Failed to teardown: %s", err) t.Fatalf("Failed to teardown: %s", err)
} }
clientSetFromFile = kubeconfigutil.ClientSetFromFile
}() }()
cfg := testutil.GetDefaultInternalConfig(t) cfg := testutil.GetDefaultInternalConfig(t)
@ -555,17 +564,43 @@ kubernetesVersion: %s`,
cfg.CertificatesDir, cfg.CertificatesDir,
kubeadmconstants.MinimumControlPlaneVersion.String()) kubeadmconstants.MinimumControlPlaneVersion.String())
// Write the minimal kubeadm config to a file
customConfigPath := kdir + "/kubeadm.conf" customConfigPath := kdir + "/kubeadm.conf"
f, err := os.Create(customConfigPath) f, err := os.Create(customConfigPath)
require.NoError(t, err) require.NoError(t, err)
_, err = f.Write([]byte(kubeadmConfig)) _, err = f.Write([]byte(kubeadmConfig))
require.NoError(t, err) require.NoError(t, err)
// fakeClientSetFromFile returns a fake clientset with kubeadm config map
var fakeClientSetFromFile = func(_ string) (kubernetes.Interface, error) {
client := fakeclientset.NewSimpleClientset()
client.PrependReactor("get", "configmaps", func(action clientgotesting.Action) (bool, runtime.Object, error) {
getAction := action.(clientgotesting.GetAction)
if getAction.GetNamespace() == metav1.NamespaceSystem && getAction.GetName() == kubeadmconstants.KubeadmConfigConfigMap {
cm := &v1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: kubeadmconstants.KubeadmConfigConfigMap,
Namespace: metav1.NamespaceSystem,
},
Data: map[string]string{
kubeadmconstants.ClusterConfigurationConfigMapKey: dedent.Dedent(kubeadmConfig),
},
}
return true, cm, nil
}
// Return an empty config map for kubelet and kube-proxy components.
return true, &v1.ConfigMap{}, nil
})
return client, nil
}
// Select a certificate used to simulate a missing certificate file
brokenCertName := kubeadmconstants.APIServerCertAndKeyBaseName brokenCertName := kubeadmconstants.APIServerCertAndKeyBaseName
brokenCertPath, _ := pkiutil.PathsForCertAndKey(cfg.CertificatesDir, brokenCertName) brokenCertPath, _ := pkiutil.PathsForCertAndKey(cfg.CertificatesDir, brokenCertName)
type testCase struct { type testCase struct {
name string name string
config string
output string output string
brokenCertName string brokenCertName string
} }
@ -575,11 +610,17 @@ kubernetesVersion: %s`,
cmd := newCmdCertsExpiration(&output, kdir) cmd := newCmdCertsExpiration(&output, kdir)
args := []string{ args := []string{
fmt.Sprintf("--cert-dir=%s", cfg.CertificatesDir), fmt.Sprintf("--cert-dir=%s", cfg.CertificatesDir),
fmt.Sprintf("--config=%s", customConfigPath), }
if tc.config != "" {
args = append(args, fmt.Sprintf("--config=%s", tc.config))
} else {
clientSetFromFile = fakeClientSetFromFile
defer func() {
clientSetFromFile = kubeconfigutil.ClientSetFromFile
}()
} }
if tc.output != "" { if tc.output != "" {
args = append(args, fmt.Sprintf("-o=%s", tc.output)) args = append(args, fmt.Sprintf("-o=%s", tc.output))
} }
cmd.SetArgs(args) cmd.SetArgs(args)
require.NoError(t, cmd.Execute()) require.NoError(t, cmd.Execute())
@ -619,21 +660,43 @@ kubernetesVersion: %s`,
testCases := []testCase{ testCases := []testCase{
{ {
name: "print columns and no missing certs", name: "fetch kubeadm config from file and print columns and no missing certs",
config: customConfigPath,
output: "", output: "",
}, },
{ {
name: "print json and no missing certs", name: "fetch kubeadm config from server and print columns and no missing certs",
output: "",
},
{
name: "fetch kubeadm config from file and print json and no missing certs",
config: customConfigPath,
output: "json",
},
{
name: "fetch kubeadm config from server and print json and no missing certs",
output: "json", output: "json",
}, },
// all broken cases must be at the end of the list. // all broken cases must be at the end of the list.
{ {
name: "print columns and missing certs", name: "fetch kubeadm config from file and print columns and missing certs",
config: customConfigPath,
output: "", output: "",
brokenCertName: brokenCertName, brokenCertName: brokenCertName,
}, },
{ {
name: "print json and missing certs", name: "fetch kubeadm config from server and print columns and missing certs",
output: "",
brokenCertName: brokenCertName,
},
{
name: "fetch kubeadm config from file and print json and missing certs",
config: customConfigPath,
output: "json",
brokenCertName: brokenCertName,
},
{
name: "fetch kubeadm config from server and print json and missing certs",
output: "json", output: "json",
brokenCertName: brokenCertName, brokenCertName: brokenCertName,
}, },