Skip to content

Commit d023f3d

Browse files
committed
kubeadm: Cleanup and refactor the LoadJoinConfigurationFromFile test
Back in the v1alpha2 days the fuzzer test needed to be disabled. To ensure that there were no config breaks and everything worked correctly extensive replacement tests were put in place that functioned as unit tests for the kubeadm config utils as well. The fuzzer test has been reenabled for a long time now and there's no need for these replacements. Hence, over time most of these were disabled, deleted and refactored. The last remnants are part of the LoadJoinConfigurationFromFile test. The test data for those old tests remains largely unused today, but it still receives updates as it contains kubelet's and kube-proxy's component configs. Updates to these configs are usually done because the maintainers of those need to add a new field. Hence, to cleanup old code and reduce maintenance burden, the last test that depends on this test data is finally refactored and cleaned up to represent a simple unit test of `LoadJoinConfigurationFromFile`. Signed-off-by: Rostislav M. Georgiev <[email protected]>
1 parent 930ca6c commit d023f3d

17 files changed

+79
-1284
lines changed

cmd/kubeadm/app/util/config/BUILD

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ go_test(
5656
embed = [":go_default_library"],
5757
deps = [
5858
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
59-
"//cmd/kubeadm/app/apis/kubeadm/scheme:go_default_library",
60-
"//cmd/kubeadm/app/apis/kubeadm/v1beta1:go_default_library",
6159
"//cmd/kubeadm/app/apis/kubeadm/v1beta2:go_default_library",
6260
"//cmd/kubeadm/app/componentconfigs:go_default_library",
6361
"//cmd/kubeadm/app/constants:go_default_library",
@@ -74,7 +72,6 @@ go_test(
7472
"//staging/src/k8s.io/client-go/testing:go_default_library",
7573
"//vendor/github.com/lithammer/dedent:go_default_library",
7674
"//vendor/github.com/pkg/errors:go_default_library",
77-
"//vendor/github.com/pmezard/go-difflib/difflib:go_default_library",
7875
"//vendor/sigs.k8s.io/yaml:go_default_library",
7976
],
8077
)

cmd/kubeadm/app/util/config/initconfiguration_test.go

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,33 +23,18 @@ import (
2323
"path/filepath"
2424
"testing"
2525

26-
"github.com/pmezard/go-difflib/difflib"
27-
2826
"k8s.io/api/core/v1"
2927
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3028
kubeadmapiv1beta2 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2"
3129
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
3230
"sigs.k8s.io/yaml"
3331
)
3432

35-
func diff(expected, actual []byte) string {
36-
// Write out the diff
37-
var diffBytes bytes.Buffer
38-
difflib.WriteUnifiedDiff(&diffBytes, difflib.UnifiedDiff{
39-
A: difflib.SplitLines(string(expected)),
40-
B: difflib.SplitLines(string(actual)),
41-
FromFile: "expected",
42-
ToFile: "actual",
43-
Context: 3,
44-
})
45-
return diffBytes.String()
46-
}
47-
4833
func TestLoadInitConfigurationFromFile(t *testing.T) {
4934
// Create temp folder for the test case
5035
tmpdir, err := ioutil.TempDir("", "")
5136
if err != nil {
52-
t.Fatalf("Couldn't create tmpdir")
37+
t.Fatalf("Couldn't create tmpdir: %v", err)
5338
}
5439
defer os.RemoveAll(tmpdir)
5540

@@ -100,7 +85,7 @@ func TestLoadInitConfigurationFromFile(t *testing.T) {
10085
cfgPath := filepath.Join(tmpdir, rt.name)
10186
err := ioutil.WriteFile(cfgPath, rt.fileContents, 0644)
10287
if err != nil {
103-
t.Errorf("Couldn't create file")
88+
t.Errorf("Couldn't create file: %v", err)
10489
return
10590
}
10691

@@ -116,7 +101,7 @@ func TestLoadInitConfigurationFromFile(t *testing.T) {
116101
}
117102

118103
if obj == nil {
119-
t.Errorf("Unexpected nil return value")
104+
t.Error("Unexpected nil return value")
120105
}
121106
}
122107
})

cmd/kubeadm/app/util/config/joinconfiguration_test.go

Lines changed: 76 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -17,100 +17,103 @@ limitations under the License.
1717
package config
1818

1919
import (
20-
"bytes"
2120
"io/ioutil"
21+
"os"
22+
"path/filepath"
2223
"testing"
2324

24-
"k8s.io/apimachinery/pkg/runtime/schema"
25-
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
26-
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme"
27-
kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1"
28-
kubeadmapiv1beta2 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2"
29-
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
30-
)
31-
32-
const (
33-
nodeV1beta1YAML = "testdata/conversion/node/v1beta1.yaml"
34-
nodeV1beta2YAML = "testdata/conversion/node/v1beta2.yaml"
35-
nodeInternalYAML = "testdata/conversion/node/internal.yaml"
36-
nodeIncompleteYAML = "testdata/defaulting/node/incomplete.yaml"
37-
nodeDefaultedYAML = "testdata/defaulting/node/defaulted.yaml"
38-
nodeInvalidYAML = "testdata/validation/invalid_nodecfg.yaml"
25+
"github.com/lithammer/dedent"
3926
)
4027

4128
func TestLoadJoinConfigurationFromFile(t *testing.T) {
29+
// Create temp folder for the test case
30+
tmpdir, err := ioutil.TempDir("", "")
31+
if err != nil {
32+
t.Fatalf("Couldn't create tmpdir: %v", err)
33+
}
34+
defer os.RemoveAll(tmpdir)
35+
36+
// cfgFiles is in cluster_test.go
4237
var tests = []struct {
43-
name, in, out string
44-
groupVersion schema.GroupVersion
45-
expectedErr bool
38+
name string
39+
fileContents string
40+
expectErr bool
4641
}{
47-
// These tests are reading one file, loading it using LoadJoinConfigurationFromFile that all of kubeadm is using for unmarshal of our API types,
48-
// and then marshals the internal object to the expected groupVersion
49-
{ // v1beta1 -> internal
50-
name: "v1beta1ToInternal",
51-
in: nodeV1beta1YAML,
52-
out: nodeInternalYAML,
53-
groupVersion: kubeadm.SchemeGroupVersion,
54-
},
55-
{ // v1beta1 -> internal -> v1beta1
56-
name: "v1beta1Tov1beta1",
57-
in: nodeV1beta1YAML,
58-
out: nodeV1beta1YAML,
59-
groupVersion: kubeadmapiv1beta1.SchemeGroupVersion,
42+
{
43+
name: "empty file causes error",
44+
expectErr: true,
6045
},
61-
{ // v1beta2 -> internal
62-
name: "v1beta2ToInternal",
63-
in: nodeV1beta2YAML,
64-
out: nodeInternalYAML,
65-
groupVersion: kubeadm.SchemeGroupVersion,
46+
{
47+
name: "Invalid v1beta1 causes error",
48+
fileContents: dedent.Dedent(`
49+
apiVersion: kubeadm.k8s.io/v1beta1
50+
kind: JoinConfiguration
51+
`),
52+
expectErr: true,
6653
},
67-
{ // v1beta2 -> internal -> v1beta2
68-
name: "v1beta2Tov1beta2",
69-
in: nodeV1beta2YAML,
70-
out: nodeV1beta2YAML,
71-
groupVersion: kubeadmapiv1beta2.SchemeGroupVersion,
54+
{
55+
name: "valid v1beta1 is loaded",
56+
fileContents: dedent.Dedent(`
57+
apiVersion: kubeadm.k8s.io/v1beta1
58+
kind: JoinConfiguration
59+
caCertPath: /etc/kubernetes/pki/ca.crt
60+
discovery:
61+
bootstrapToken:
62+
apiServerEndpoint: kube-apiserver:6443
63+
token: abcdef.0123456789abcdef
64+
unsafeSkipCAVerification: true
65+
timeout: 5m0s
66+
tlsBootstrapToken: abcdef.0123456789abcdef
67+
`),
7268
},
73-
// These tests are reading one file that has only a subset of the fields populated, loading it using LoadJoinConfigurationFromFile,
74-
// and then marshals the internal object to the expected groupVersion
75-
{ // v1beta2 -> default -> validate -> internal -> v1beta2
76-
name: "incompleteYAMLToDefaultedv1beta2",
77-
in: nodeIncompleteYAML,
78-
out: nodeDefaultedYAML,
79-
groupVersion: kubeadmapiv1beta2.SchemeGroupVersion,
69+
{
70+
name: "Invalid v1beta2 causes error",
71+
fileContents: dedent.Dedent(`
72+
apiVersion: kubeadm.k8s.io/v1beta2
73+
kind: JoinConfiguration
74+
`),
75+
expectErr: true,
8076
},
81-
{ // v1beta2 -> validation should fail
82-
name: "invalidYAMLShouldFail",
83-
in: nodeInvalidYAML,
84-
expectedErr: true,
77+
{
78+
name: "valid v1beta2 is loaded",
79+
fileContents: dedent.Dedent(`
80+
apiVersion: kubeadm.k8s.io/v1beta2
81+
kind: JoinConfiguration
82+
caCertPath: /etc/kubernetes/pki/ca.crt
83+
discovery:
84+
bootstrapToken:
85+
apiServerEndpoint: kube-apiserver:6443
86+
token: abcdef.0123456789abcdef
87+
unsafeSkipCAVerification: true
88+
timeout: 5m0s
89+
tlsBootstrapToken: abcdef.0123456789abcdef
90+
`),
8591
},
8692
}
8793

8894
for _, rt := range tests {
8995
t.Run(rt.name, func(t2 *testing.T) {
90-
91-
internalcfg, err := LoadJoinConfigurationFromFile(rt.in)
96+
cfgPath := filepath.Join(tmpdir, rt.name)
97+
err := ioutil.WriteFile(cfgPath, []byte(rt.fileContents), 0644)
9298
if err != nil {
93-
if rt.expectedErr {
94-
return
95-
}
96-
t2.Fatalf("couldn't unmarshal test data: %v", err)
97-
} else if rt.expectedErr {
98-
t2.Fatalf("expected error, but no error returned")
99+
t.Errorf("Couldn't create file: %v", err)
100+
return
99101
}
100102

101-
actual, err := kubeadmutil.MarshalToYamlForCodecs(internalcfg, rt.groupVersion, scheme.Codecs)
102-
if err != nil {
103-
t2.Fatalf("couldn't marshal internal object: %v", err)
104-
}
105-
106-
expected, err := ioutil.ReadFile(rt.out)
107-
if err != nil {
108-
t2.Fatalf("couldn't read test data: %v", err)
109-
}
103+
obj, err := LoadJoinConfigurationFromFile(cfgPath)
104+
if rt.expectErr {
105+
if err == nil {
106+
t.Error("Unexpected success")
107+
}
108+
} else {
109+
if err != nil {
110+
t.Errorf("Error reading file: %v", err)
111+
return
112+
}
110113

111-
if !bytes.Equal(expected, actual) {
112-
t2.Errorf("the expected and actual output differs.\n\tin: %s\n\tout: %s\n\tgroupversion: %s\n\tdiff: \n%s\n",
113-
rt.in, rt.out, rt.groupVersion.String(), diff(expected, actual))
114+
if obj == nil {
115+
t.Error("Unexpected nil return value")
116+
}
114117
}
115118
})
116119
}

0 commit comments

Comments
 (0)