Skip to content

Commit 1e8e4fa

Browse files
committed
degraded tests
Signed-off-by: nhamza <[email protected]>
1 parent 5b8861d commit 1e8e4fa

File tree

2 files changed

+502
-0
lines changed

2 files changed

+502
-0
lines changed

test/extended/two_node/common.go

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package two_node
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
g "github.com/onsi/ginkgo/v2"
8+
o "github.com/onsi/gomega"
9+
v1 "github.com/openshift/api/config/v1"
10+
"github.com/openshift/origin/test/extended/util"
11+
exutil "github.com/openshift/origin/test/extended/util"
12+
corev1 "k8s.io/api/core/v1"
13+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
"k8s.io/client-go/kubernetes"
15+
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
16+
)
17+
18+
const (
19+
labelNodeRoleMaster = "node-role.kubernetes.io/master"
20+
labelNodeRoleControlPlane = "node-role.kubernetes.io/control-plane"
21+
labelNodeRoleWorker = "node-role.kubernetes.io/worker"
22+
labelNodeRoleArbiter = "node-role.kubernetes.io/arbiter"
23+
)
24+
25+
func skipIfNotTopology(oc *exutil.CLI, wanted v1.TopologyMode) {
26+
current, err := exutil.GetControlPlaneTopology(oc)
27+
if err != nil {
28+
e2eskipper.Skip(fmt.Sprintf("Could not get current topology, skipping test: error %v", err))
29+
}
30+
if *current != wanted {
31+
e2eskipper.Skip(fmt.Sprintf("Cluster is not in %v topology, skipping test", wanted))
32+
}
33+
}
34+
35+
func isClusterOperatorAvailable(operator *v1.ClusterOperator) bool {
36+
for _, cond := range operator.Status.Conditions {
37+
if cond.Type == v1.OperatorAvailable && cond.Status == v1.ConditionTrue {
38+
return true
39+
}
40+
}
41+
return false
42+
}
43+
44+
func isClusterOperatorDegraded(operator *v1.ClusterOperator) bool {
45+
for _, cond := range operator.Status.Conditions {
46+
if cond.Type == v1.OperatorDegraded && cond.Status == v1.ConditionTrue {
47+
return true
48+
}
49+
}
50+
return false
51+
}
52+
53+
func hasNodeRebooted(oc *util.CLI, node *corev1.Node) (bool, error) {
54+
if n, err := oc.AdminKubeClient().CoreV1().Nodes().Get(context.Background(), node.Name, metav1.GetOptions{}); err != nil {
55+
return false, err
56+
} else {
57+
return n.Status.NodeInfo.BootID != node.Status.NodeInfo.BootID, nil
58+
}
59+
}
60+
61+
func ensureTNFDegradedOrSkip(oc *exutil.CLI) {
62+
skipIfNotTopology(oc, v1.DualReplicaTopologyMode)
63+
64+
ctx := context.Background()
65+
kubeClient := oc.AdminKubeClient()
66+
67+
masters, err := listControlPlaneNodes(ctx, kubeClient)
68+
o.Expect(err).NotTo(o.HaveOccurred(), "failed to list control-plane nodes")
69+
70+
if len(masters) != 2 {
71+
g.Skip(fmt.Sprintf(
72+
"TNF degraded tests expect exactly 2 control-plane nodes, found %d",
73+
len(masters),
74+
))
75+
}
76+
77+
readyCount := countReadyNodes(masters)
78+
if readyCount != 1 {
79+
g.Skip(fmt.Sprintf(
80+
"cluster is not in TNF degraded mode (expected exactly 1 Ready master, got %d)",
81+
readyCount,
82+
))
83+
}
84+
}
85+
86+
func listControlPlaneNodes(ctx context.Context, client kubernetes.Interface) ([]corev1.Node, error) {
87+
nodes, err := client.CoreV1().Nodes().List(ctx, metav1.ListOptions{
88+
LabelSelector: "node-role.kubernetes.io/master",
89+
})
90+
if err != nil {
91+
return nil, err
92+
}
93+
if len(nodes.Items) > 0 {
94+
return nodes.Items, nil
95+
}
96+
97+
nodes, err = client.CoreV1().Nodes().List(ctx, metav1.ListOptions{
98+
LabelSelector: "node-role.kubernetes.io/control-plane",
99+
})
100+
if err != nil {
101+
return nil, err
102+
}
103+
return nodes.Items, nil
104+
}
105+
106+
func countReadyNodes(nodes []corev1.Node) int {
107+
ready := 0
108+
for _, n := range nodes {
109+
for _, cond := range n.Status.Conditions {
110+
if cond.Type == corev1.NodeReady && cond.Status == corev1.ConditionTrue {
111+
ready++
112+
break
113+
}
114+
}
115+
}
116+
return ready
117+
}
118+
119+
func getReadyMasterNode(
120+
ctx context.Context,
121+
client kubernetes.Interface,
122+
) (*corev1.Node, error) {
123+
nodes, err := client.CoreV1().Nodes().List(ctx, metav1.ListOptions{
124+
LabelSelector: "node-role.kubernetes.io/master=",
125+
})
126+
if err != nil {
127+
return nil, err
128+
}
129+
130+
for i := range nodes.Items {
131+
node := &nodes.Items[i]
132+
if isNodeReady(node) {
133+
return node, nil
134+
}
135+
}
136+
return nil, fmt.Errorf("no Ready master node found")
137+
}
138+
139+
func isNodeReady(node *corev1.Node) bool {
140+
for _, cond := range node.Status.Conditions {
141+
if cond.Type == corev1.NodeReady && cond.Status == corev1.ConditionTrue {
142+
return true
143+
}
144+
}
145+
return false
146+
}

0 commit comments

Comments
 (0)