Skip to content

Commit e7f3f40

Browse files
Merge pull request #29335 from vrutkovs/additional-kubeconfig-tests
OCPBUGS-43777: tests: extend kubeconfig tests
2 parents 5115178 + c3f4f80 commit e7f3f40

File tree

2 files changed

+90
-37
lines changed

2 files changed

+90
-37
lines changed

test/extended/apiserver/kubeconfigs.go

Lines changed: 86 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -20,57 +20,81 @@ import (
2020
exutil "github.com/openshift/origin/test/extended/util"
2121
)
2222

23+
var kcLocations = map[string]string{
24+
"localhost.kubeconfig": "/etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/node-kubeconfigs/localhost.kubeconfig",
25+
"lb-ext.kubeconfig": "/etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/node-kubeconfigs/lb-ext.kubeconfig",
26+
"lb-int.kubeconfig": "/etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/node-kubeconfigs/lb-int.kubeconfig",
27+
"localhost-recovery.kubeconfig": "/etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/node-kubeconfigs/localhost-recovery.kubeconfig",
28+
}
29+
var kubeApiserverLocations = map[string]string{
30+
"check-endpoints.kubeconfig": "/etc/kubernetes/static-pod-certs/configmaps/check-endpoints-kubeconfig/kubeconfig",
31+
"control-plane-node.kubeconfig": "/etc/kubernetes/static-pod-certs/configmaps/control-plane-node-kubeconfig/kubeconfig",
32+
}
33+
2334
var _ = g.Describe("[Conformance][sig-api-machinery][Feature:APIServer] local kubeconfig", func() {
2435
defer g.GinkgoRecover()
2536
oc := exutil.NewCLIWithPodSecurityLevel("apiserver", admissionapi.LevelPrivileged)
2637

27-
for _, kc := range []string{
28-
"localhost.kubeconfig",
29-
"lb-ext.kubeconfig",
30-
"lb-int.kubeconfig",
31-
"localhost-recovery.kubeconfig",
32-
} {
33-
kubeconfig := kc
38+
for kubeconfig := range kcLocations {
3439
g.It(fmt.Sprintf("%q should be present on all masters and work", kubeconfig), func() {
35-
// external controlplane topology doesn't have master nodes
36-
controlPlaneTopology, err := exutil.GetControlPlaneTopology(oc)
37-
o.Expect(err).NotTo(o.HaveOccurred())
38-
if *controlPlaneTopology == configv1.ExternalTopologyMode {
39-
g.Skip("ExternalControlPlaneTopology doesn't have master node kubeconfigs")
40-
}
40+
testKubeConfig(oc, kubeconfig, testNode)
41+
})
42+
}
4143

42-
masterNodes, err := oc.AdminKubeClient().CoreV1().Nodes().List(context.Background(), metav1.ListOptions{
43-
LabelSelector: `node-role.kubernetes.io/master`,
44-
})
44+
for kubeconfig := range kubeApiserverLocations {
45+
g.It(fmt.Sprintf("%q should be present in all kube-apiserver containers", kubeconfig), func() {
46+
// skip on microshift
47+
isMicroShift, err := exutil.IsMicroShiftCluster(oc.AdminKubeClient())
4548
o.Expect(err).NotTo(o.HaveOccurred())
46-
framework.Logf("Discovered %d master nodes.", len(masterNodes.Items))
47-
o.Expect(masterNodes.Items).NotTo(o.HaveLen(0))
48-
for _, master := range masterNodes.Items {
49-
err := retry.OnError(
50-
wait.Backoff{
51-
Duration: 2 * time.Second,
52-
Steps: 3,
53-
Factor: 5.0,
54-
Jitter: 0.1,
55-
},
56-
func(err error) bool {
57-
// retry error when kube-apiserver was temporarily unavailable, this matches oc error coming from:
58-
// https://github.com/kubernetes/kubernetes/blob/cbb5ea8210596ada1efce7e7a271ca4217ae598e/staging/src/k8s.io/kubectl/pkg/cmd/util/helpers.go#L237-L243
59-
matched, _ := regexp.MatchString("The connection to the server .+ was refused - did you specify the right host or port", err.Error())
60-
return !matched
61-
},
62-
func() error {
63-
return testNode(oc, kubeconfig, master.Name)
64-
})
65-
o.Expect(err).NotTo(o.HaveOccurred())
49+
if isMicroShift {
50+
g.Skip("Not supported on Microshift")
6651
}
52+
testKubeConfig(oc, kubeconfig, testKubeApiserverContainer)
6753
})
6854
}
6955
})
7056

57+
func testKubeConfig(oc *exutil.CLI, kubeconfig string, testFn func(oc *exutil.CLI, kubeconfig, masterName string) error) {
58+
// external controlplane topology doesn't have master nodes
59+
controlPlaneTopology, err := exutil.GetControlPlaneTopology(oc)
60+
o.Expect(err).NotTo(o.HaveOccurred())
61+
if *controlPlaneTopology == configv1.ExternalTopologyMode {
62+
g.Skip("ExternalControlPlaneTopology doesn't have master node kubeconfigs")
63+
}
64+
65+
masterNodes, err := oc.AdminKubeClient().CoreV1().Nodes().List(context.Background(), metav1.ListOptions{
66+
LabelSelector: `node-role.kubernetes.io/master`,
67+
})
68+
o.Expect(err).NotTo(o.HaveOccurred())
69+
framework.Logf("Discovered %d master nodes.", len(masterNodes.Items))
70+
o.Expect(masterNodes.Items).NotTo(o.HaveLen(0))
71+
for _, master := range masterNodes.Items {
72+
err := retry.OnError(
73+
wait.Backoff{
74+
Duration: 2 * time.Second,
75+
Steps: 3,
76+
Factor: 5.0,
77+
Jitter: 0.1,
78+
},
79+
func(err error) bool {
80+
// retry error when kube-apiserver was temporarily unavailable, this matches oc error coming from:
81+
// https://github.com/kubernetes/kubernetes/blob/cbb5ea8210596ada1efce7e7a271ca4217ae598e/staging/src/k8s.io/kubectl/pkg/cmd/util/helpers.go#L237-L243
82+
matched, _ := regexp.MatchString("The connection to the server .+ was refused - did you specify the right host or port", err.Error())
83+
return !matched
84+
},
85+
func() error {
86+
return testFn(oc, kubeconfig, master.Name)
87+
})
88+
o.Expect(err).NotTo(o.HaveOccurred())
89+
}
90+
}
91+
7192
func testNode(oc *exutil.CLI, kubeconfig, masterName string) error {
7293
g.By("Testing master node " + masterName)
73-
kubeconfigPath := "/etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/node-kubeconfigs/" + kubeconfig
94+
kubeconfigPath, ok := kcLocations[kubeconfig]
95+
if !ok {
96+
return fmt.Errorf("location for %s kubeconfig not found", kubeconfig)
97+
}
7498
framework.Logf("Verifying kubeconfig %q on master %q", kubeconfig, masterName)
7599
out, err := oc.AsAdmin().Run("debug").Args("node/"+masterName, "--", "chroot", "/host", "/bin/bash", "-euxo", "pipefail", "-c",
76100
fmt.Sprintf(`oc --kubeconfig "%s" get namespace kube-system`, kubeconfigPath)).Output()
@@ -80,3 +104,28 @@ func testNode(oc *exutil.CLI, kubeconfig, masterName string) error {
80104
}
81105
return nil
82106
}
107+
108+
func testKubeApiserverContainer(oc *exutil.CLI, kubeconfig, masterName string) error {
109+
g.By("Testing kube-apiserver container on master node " + masterName)
110+
kubeconfigPath, ok := kubeApiserverLocations[kubeconfig]
111+
if !ok {
112+
return fmt.Errorf("location for %s kubeconfig not found", kubeconfig)
113+
}
114+
115+
framework.Logf("Copying oc binary from host to kube-apiserver container in master %q", masterName)
116+
out, err := oc.AsAdmin().Run("debug").Args("node/"+masterName, "--", "chroot", "/host", "/bin/bash", "-euxo", "pipefail", "-c",
117+
fmt.Sprintf(`oc --kubeconfig /etc/kubernetes/static-pod-resources/kube-apiserver-certs/secrets/node-kubeconfigs/localhost.kubeconfig -n openshift-kube-apiserver cp /usr/bin/oc kube-apiserver-%s:/tmp`, masterName)).Output()
118+
framework.Logf(out)
119+
if err != nil {
120+
return fmt.Errorf(out)
121+
}
122+
123+
framework.Logf("Verifying kubeconfig %q in kube-apiserver container in master %q", kubeconfig, masterName)
124+
out, err = oc.AsAdmin().Run("exec").Args("-n", "openshift-kube-apiserver", "kube-apiserver-"+masterName, "--", "/bin/bash", "-euxo", "pipefail", "-c",
125+
fmt.Sprintf(`/tmp/oc --kubeconfig "%s" get nodes`, kubeconfigPath)).Output()
126+
framework.Logf(out)
127+
if err != nil {
128+
return fmt.Errorf(out)
129+
}
130+
return nil
131+
}

test/extended/util/annotate/generated/zz_generated.annotations.go

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)