mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-21 02:41:25 +00:00
Merge pull request #113574 from chendave/cleanup_testcases
kubeadm: Improve testcases for `init` and `join` command
This commit is contained in:
commit
fb37f1331b
@ -22,10 +22,16 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/google/go-cmp/cmp"
|
||||||
|
"github.com/google/go-cmp/cmp/cmpopts"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
|
|
||||||
|
v1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/bootstraptoken/v1"
|
||||||
|
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
||||||
kubeadmapiv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3"
|
kubeadmapiv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
|
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
||||||
)
|
)
|
||||||
|
|
||||||
var testInitConfig = fmt.Sprintf(`---
|
var testInitConfig = fmt.Sprintf(`---
|
||||||
@ -36,7 +42,7 @@ localAPIEndpoint:
|
|||||||
bootstrapTokens:
|
bootstrapTokens:
|
||||||
- token: "abcdef.0123456789abcdef"
|
- token: "abcdef.0123456789abcdef"
|
||||||
nodeRegistration:
|
nodeRegistration:
|
||||||
criSocket: /run/containerd/containerd.sock
|
criSocket: unix:///var/run/containerd/containerd.sock
|
||||||
name: someName
|
name: someName
|
||||||
ignorePreflightErrors:
|
ignorePreflightErrors:
|
||||||
- c
|
- c
|
||||||
@ -98,9 +104,42 @@ func TestNewInitData(t *testing.T) {
|
|||||||
flags: map[string]string{
|
flags: map[string]string{
|
||||||
options.CfgPath: configFilePath,
|
options.CfgPath: configFilePath,
|
||||||
},
|
},
|
||||||
|
validate: func(t *testing.T, data *initData) {
|
||||||
|
validData := &initData{
|
||||||
|
certificatesDir: kubeadmapiv1.DefaultCertificatesDir,
|
||||||
|
kubeconfigPath: constants.GetAdminKubeConfigPath(),
|
||||||
|
kubeconfigDir: constants.KubernetesDir,
|
||||||
|
ignorePreflightErrors: sets.New("c", "d"),
|
||||||
|
cfg: &kubeadmapi.InitConfiguration{
|
||||||
|
NodeRegistration: kubeadmapi.NodeRegistrationOptions{
|
||||||
|
Name: "somename",
|
||||||
|
CRISocket: "unix:///var/run/containerd/containerd.sock",
|
||||||
|
IgnorePreflightErrors: []string{"c", "d"},
|
||||||
|
ImagePullPolicy: "IfNotPresent",
|
||||||
|
},
|
||||||
|
LocalAPIEndpoint: kubeadmapi.APIEndpoint{
|
||||||
|
AdvertiseAddress: "1.2.3.4",
|
||||||
|
BindPort: 6443,
|
||||||
|
},
|
||||||
|
BootstrapTokens: []v1.BootstrapToken{
|
||||||
|
{
|
||||||
|
Token: &v1.BootstrapTokenString{ID: "abcdef", Secret: "0123456789abcdef"},
|
||||||
|
Usages: []string{"signing", "authentication"},
|
||||||
|
TTL: &metav1.Duration{
|
||||||
|
Duration: constants.DefaultTokenDuration,
|
||||||
|
},
|
||||||
|
Groups: []string{"system:bootstrappers:kubeadm:default-node-token"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if diff := cmp.Diff(validData, data, cmp.AllowUnexported(initData{}), cmpopts.IgnoreFields(initData{}, "client", "cfg.ClusterConfiguration", "cfg.NodeRegistration.Taints")); diff != "" {
|
||||||
|
t.Fatalf("newInitData returned data (-want,+got):\n%s", diff)
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "--cri-socket and --node-name flags override config from file",
|
name: "--node-name flags override config from file",
|
||||||
flags: map[string]string{
|
flags: map[string]string{
|
||||||
options.CfgPath: configFilePath,
|
options.CfgPath: configFilePath,
|
||||||
options.NodeName: "anotherName",
|
options.NodeName: "anotherName",
|
||||||
@ -108,7 +147,7 @@ func TestNewInitData(t *testing.T) {
|
|||||||
validate: func(t *testing.T, data *initData) {
|
validate: func(t *testing.T, data *initData) {
|
||||||
// validate that node-name is overwritten
|
// validate that node-name is overwritten
|
||||||
if data.cfg.NodeRegistration.Name != "anotherName" {
|
if data.cfg.NodeRegistration.Name != "anotherName" {
|
||||||
t.Errorf("Invalid NodeRegistration.Name")
|
t.Error("Invalid NodeRegistration.Name")
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -162,9 +201,8 @@ func TestNewInitData(t *testing.T) {
|
|||||||
t.Fatalf("newInitData returned unexpected error: %v", err)
|
t.Fatalf("newInitData returned unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
if err == nil && tc.expectError {
|
if err == nil && tc.expectError {
|
||||||
t.Fatalf("newInitData didn't return error when expected")
|
t.Fatal("newInitData didn't return error when expected")
|
||||||
}
|
}
|
||||||
|
|
||||||
// exec additional validation on the returned value
|
// exec additional validation on the returned value
|
||||||
if tc.validate != nil {
|
if tc.validate != nil {
|
||||||
tc.validate(t, data)
|
tc.validate(t, data)
|
||||||
|
@ -24,9 +24,15 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/google/go-cmp/cmp"
|
||||||
|
"github.com/google/go-cmp/cmp/cmpopts"
|
||||||
|
|
||||||
|
v1 "k8s.io/api/core/v1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
|
|
||||||
|
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
||||||
kubeadmapiv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3"
|
kubeadmapiv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
||||||
@ -42,7 +48,7 @@ discovery:
|
|||||||
controlPlane:
|
controlPlane:
|
||||||
certificateKey: c39a18bae4a72e71b178661f437363da218a3efb83ddb03f1cd91d9ae1da41bd
|
certificateKey: c39a18bae4a72e71b178661f437363da218a3efb83ddb03f1cd91d9ae1da41bd
|
||||||
nodeRegistration:
|
nodeRegistration:
|
||||||
criSocket: /run/containerd/containerd.sock
|
criSocket: unix:///var/run/containerd/containerd.sock
|
||||||
name: someName
|
name: someName
|
||||||
ignorePreflightErrors:
|
ignorePreflightErrors:
|
||||||
- c
|
- c
|
||||||
@ -104,7 +110,7 @@ func TestNewJoinData(t *testing.T) {
|
|||||||
validate: func(t *testing.T, data *joinData) {
|
validate: func(t *testing.T, data *joinData) {
|
||||||
// validate that file discovery settings are set into join data
|
// validate that file discovery settings are set into join data
|
||||||
if data.cfg.Discovery.File == nil || data.cfg.Discovery.File.KubeConfigPath != "https://foo" {
|
if data.cfg.Discovery.File == nil || data.cfg.Discovery.File.KubeConfigPath != "https://foo" {
|
||||||
t.Errorf("Invalid data.cfg.Discovery.File")
|
t.Error("Invalid data.cfg.Discovery.File")
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -121,7 +127,7 @@ func TestNewJoinData(t *testing.T) {
|
|||||||
data.cfg.Discovery.BootstrapToken.APIServerEndpoint != "1.2.3.4:6443" || //only first arg should be kept as APIServerEndpoint
|
data.cfg.Discovery.BootstrapToken.APIServerEndpoint != "1.2.3.4:6443" || //only first arg should be kept as APIServerEndpoint
|
||||||
data.cfg.Discovery.BootstrapToken.Token != "abcdef.0123456789abcdef" ||
|
data.cfg.Discovery.BootstrapToken.Token != "abcdef.0123456789abcdef" ||
|
||||||
data.cfg.Discovery.BootstrapToken.UnsafeSkipCAVerification != true {
|
data.cfg.Discovery.BootstrapToken.UnsafeSkipCAVerification != true {
|
||||||
t.Errorf("Invalid data.cfg.Discovery.BootstrapToken")
|
t.Error("Invalid data.cfg.Discovery.BootstrapToken")
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -137,7 +143,7 @@ func TestNewJoinData(t *testing.T) {
|
|||||||
if data.cfg.Discovery.TLSBootstrapToken != "abcdef.0123456789abcdef" ||
|
if data.cfg.Discovery.TLSBootstrapToken != "abcdef.0123456789abcdef" ||
|
||||||
data.cfg.Discovery.BootstrapToken == nil ||
|
data.cfg.Discovery.BootstrapToken == nil ||
|
||||||
data.cfg.Discovery.BootstrapToken.Token != "abcdef.0123456789abcdef" {
|
data.cfg.Discovery.BootstrapToken.Token != "abcdef.0123456789abcdef" {
|
||||||
t.Errorf("Invalid TLSBootstrapToken or BootstrapToken.Token")
|
t.Error("Invalid TLSBootstrapToken or BootstrapToken.Token")
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -155,7 +161,7 @@ func TestNewJoinData(t *testing.T) {
|
|||||||
if data.cfg.Discovery.TLSBootstrapToken != "abcdef.0123456789abcdef" ||
|
if data.cfg.Discovery.TLSBootstrapToken != "abcdef.0123456789abcdef" ||
|
||||||
data.cfg.Discovery.BootstrapToken == nil ||
|
data.cfg.Discovery.BootstrapToken == nil ||
|
||||||
data.cfg.Discovery.BootstrapToken.Token != "defghi.0123456789defghi" {
|
data.cfg.Discovery.BootstrapToken.Token != "defghi.0123456789defghi" {
|
||||||
t.Errorf("Invalid TLSBootstrapToken or BootstrapToken.Token")
|
t.Error("Invalid TLSBootstrapToken or BootstrapToken.Token")
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -172,7 +178,7 @@ func TestNewJoinData(t *testing.T) {
|
|||||||
if data.cfg.ControlPlane == nil ||
|
if data.cfg.ControlPlane == nil ||
|
||||||
data.cfg.ControlPlane.LocalAPIEndpoint.AdvertiseAddress != "1.2.3.4" ||
|
data.cfg.ControlPlane.LocalAPIEndpoint.AdvertiseAddress != "1.2.3.4" ||
|
||||||
data.cfg.ControlPlane.LocalAPIEndpoint.BindPort != 1234 {
|
data.cfg.ControlPlane.LocalAPIEndpoint.BindPort != 1234 {
|
||||||
t.Errorf("Invalid ControlPlane")
|
t.Error("Invalid ControlPlane")
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -187,7 +193,7 @@ func TestNewJoinData(t *testing.T) {
|
|||||||
validate: func(t *testing.T, data *joinData) {
|
validate: func(t *testing.T, data *joinData) {
|
||||||
// validate that control plane attributes are unset in join data
|
// validate that control plane attributes are unset in join data
|
||||||
if data.cfg.ControlPlane != nil {
|
if data.cfg.ControlPlane != nil {
|
||||||
t.Errorf("Invalid ControlPlane")
|
t.Error("Invalid ControlPlane")
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
expectWarn: true,
|
expectWarn: true,
|
||||||
@ -206,9 +212,40 @@ func TestNewJoinData(t *testing.T) {
|
|||||||
flags: map[string]string{
|
flags: map[string]string{
|
||||||
options.CfgPath: configFilePath,
|
options.CfgPath: configFilePath,
|
||||||
},
|
},
|
||||||
|
validate: func(t *testing.T, data *joinData) {
|
||||||
|
validData := &joinData{
|
||||||
|
cfg: &kubeadmapi.JoinConfiguration{
|
||||||
|
TypeMeta: metav1.TypeMeta{Kind: "", APIVersion: ""},
|
||||||
|
NodeRegistration: kubeadmapi.NodeRegistrationOptions{
|
||||||
|
Name: "somename",
|
||||||
|
CRISocket: "unix:///var/run/containerd/containerd.sock",
|
||||||
|
IgnorePreflightErrors: []string{"c", "d"},
|
||||||
|
ImagePullPolicy: "IfNotPresent",
|
||||||
|
Taints: []v1.Taint{{Key: "node-role.kubernetes.io/control-plane", Effect: "NoSchedule"}},
|
||||||
|
},
|
||||||
|
CACertPath: kubeadmapiv1.DefaultCACertPath,
|
||||||
|
Discovery: kubeadmapi.Discovery{
|
||||||
|
BootstrapToken: &kubeadmapi.BootstrapTokenDiscovery{
|
||||||
|
Token: "abcdef.0123456789abcdef",
|
||||||
|
APIServerEndpoint: "1.2.3.4:6443",
|
||||||
|
UnsafeSkipCAVerification: true,
|
||||||
|
},
|
||||||
|
TLSBootstrapToken: "abcdef.0123456789abcdef",
|
||||||
|
Timeout: &metav1.Duration{Duration: kubeadmapiv1.DefaultDiscoveryTimeout},
|
||||||
|
},
|
||||||
|
ControlPlane: &kubeadmapi.JoinControlPlane{
|
||||||
|
CertificateKey: "c39a18bae4a72e71b178661f437363da218a3efb83ddb03f1cd91d9ae1da41bd",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ignorePreflightErrors: sets.New("c", "d"),
|
||||||
|
}
|
||||||
|
if diff := cmp.Diff(validData, data, cmp.AllowUnexported(joinData{}), cmpopts.IgnoreFields(joinData{}, "client", "initCfg", "cfg.ControlPlane.LocalAPIEndpoint")); diff != "" {
|
||||||
|
t.Fatalf("newJoinData returned data (-want,+got):\n%s", diff)
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "--cri-socket and --node-name flags override config from file",
|
name: "--node-name flags override config from file",
|
||||||
flags: map[string]string{
|
flags: map[string]string{
|
||||||
options.CfgPath: configFilePath,
|
options.CfgPath: configFilePath,
|
||||||
options.NodeName: "anotherName",
|
options.NodeName: "anotherName",
|
||||||
@ -216,7 +253,7 @@ func TestNewJoinData(t *testing.T) {
|
|||||||
validate: func(t *testing.T, data *joinData) {
|
validate: func(t *testing.T, data *joinData) {
|
||||||
// validate that node-name is overwritten
|
// validate that node-name is overwritten
|
||||||
if data.cfg.NodeRegistration.Name != "anotherName" {
|
if data.cfg.NodeRegistration.Name != "anotherName" {
|
||||||
t.Errorf("Invalid NodeRegistration.Name")
|
t.Error("Invalid NodeRegistration.Name")
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -304,7 +341,7 @@ func TestNewJoinData(t *testing.T) {
|
|||||||
t.Fatalf("newJoinData returned unexpected error: %v", err)
|
t.Fatalf("newJoinData returned unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
if err == nil && tc.expectError {
|
if err == nil && tc.expectError {
|
||||||
t.Fatalf("newJoinData didn't return error when expected")
|
t.Fatal("newJoinData didn't return error when expected")
|
||||||
}
|
}
|
||||||
|
|
||||||
// exec additional validation on the returned value
|
// exec additional validation on the returned value
|
||||||
|
Loading…
Reference in New Issue
Block a user