...
1
16
17 package kubeadm
18
19 import (
20 "context"
21 "fmt"
22
23 authv1 "k8s.io/api/authorization/v1"
24 corev1 "k8s.io/api/core/v1"
25 rbacv1 "k8s.io/api/rbac/v1"
26 "k8s.io/kubernetes/test/e2e/framework"
27 admissionapi "k8s.io/pod-security-admission/api"
28
29 "github.com/onsi/ginkgo/v2"
30 "github.com/onsi/gomega"
31 )
32
33 const (
34 kubeadmCertsSecretName = "kubeadm-certs"
35 )
36
37 var (
38 kubeadmCertsRoleName = fmt.Sprintf("kubeadm:%s", kubeadmCertsSecretName)
39 kubeadmCertsRoleBindingName = kubeadmCertsRoleName
40
41 kubeadmCertsSecretResource = &authv1.ResourceAttributes{
42 Namespace: kubeSystemNamespace,
43 Name: kubeadmCertsSecretName,
44 Resource: "secrets",
45 Verb: "get",
46 }
47 )
48
49
50
51
52
53
54
55 var _ = Describe("kubeadm-certs [copy-certs]", func() {
56
57
58 f := framework.NewDefaultFramework("kubeadm-certs")
59 f.NamespacePodSecurityLevel = admissionapi.LevelPrivileged
60
61
62
63 f.SkipNamespaceCreation = true
64
65 ginkgo.It("should exist and be properly configured", func(ctx context.Context) {
66 s := GetSecret(f.ClientSet, kubeSystemNamespace, kubeadmCertsSecretName)
67
68
69 gomega.Expect(s.OwnerReferences).To(gomega.HaveLen(1), "%s should have one owner reference", kubeadmCertsSecretName)
70 ownRef := s.OwnerReferences[0]
71 gomega.Expect(ownRef.Kind).To(gomega.Equal("Secret"), "%s should be owned by a secret", kubeadmCertsSecretName)
72 gomega.Expect(*ownRef.BlockOwnerDeletion).To(gomega.BeTrue(), "%s should be deleted on owner deletion", kubeadmCertsSecretName)
73
74 o := GetSecret(f.ClientSet, kubeSystemNamespace, ownRef.Name)
75 gomega.Expect(o.Type).To(gomega.Equal(corev1.SecretTypeBootstrapToken), "%s should have an owner reference that refers to a bootstrap-token", kubeadmCertsSecretName)
76 gomega.Expect(o.Data).To(gomega.HaveKey("expiration"), "%s should have an owner reference with an expiration", kubeadmCertsSecretName)
77
78
79 m := getClusterConfiguration(f.ClientSet)
80
81
82 etcdType := "local"
83 if _, ok := m["etcd"]; ok {
84 d := m["etcd"].(map[interface{}]interface{})
85 if _, ok := d["external"]; ok {
86 etcdType = "external"
87 }
88 }
89
90
91 gomega.Expect(s.Data).To(gomega.HaveKey("ca.crt"))
92 gomega.Expect(s.Data).To(gomega.HaveKey("ca.key"))
93 gomega.Expect(s.Data).To(gomega.HaveKey("front-proxy-ca.crt"))
94 gomega.Expect(s.Data).To(gomega.HaveKey("front-proxy-ca.key"))
95 gomega.Expect(s.Data).To(gomega.HaveKey("sa.pub"))
96 gomega.Expect(s.Data).To(gomega.HaveKey("sa.key"))
97
98 if etcdType == "local" {
99 gomega.Expect(s.Data).To(gomega.HaveKey("etcd-ca.crt"))
100 gomega.Expect(s.Data).To(gomega.HaveKey("etcd-ca.key"))
101 } else {
102 gomega.Expect(s.Data).To(gomega.HaveKey("external-etcd-ca.crt"))
103 gomega.Expect(s.Data).To(gomega.HaveKey("external-etcd.crt"))
104 gomega.Expect(s.Data).To(gomega.HaveKey("external-etcd.key"))
105 }
106 })
107
108 ginkgo.It("should have related Role and RoleBinding", func(ctx context.Context) {
109 ExpectRole(f.ClientSet, kubeSystemNamespace, kubeadmCertsRoleName)
110 ExpectRoleBinding(f.ClientSet, kubeSystemNamespace, kubeadmCertsRoleBindingName)
111 })
112
113 ginkgo.It("should be accessible for bootstrap tokens", func(ctx context.Context) {
114 ExpectSubjectHasAccessToResource(f.ClientSet,
115 rbacv1.GroupKind, bootstrapTokensGroup,
116 kubeadmCertsSecretResource,
117 )
118 })
119 })
120
View as plain text