@@ -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+
2334var _ = 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+
7192func 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+ }
0 commit comments