Skip to content

Commit 716f487

Browse files
committed
SREP-701: refactor getClusterVersion into util package
1 parent fc8ba3f commit 716f487

File tree

10 files changed

+135
-118
lines changed

10 files changed

+135
-118
lines changed

pkg/investigations/cannotretrieveupdatessre/cannotretrieveupdatessre.go

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package cannotretrieveupdatessre
22

33
import (
4-
"context"
54
"errors"
65
"fmt"
76
"strings"
@@ -12,7 +11,8 @@ import (
1211
"github.com/openshift/configuration-anomaly-detection/pkg/logging"
1312
"github.com/openshift/configuration-anomaly-detection/pkg/networkverifier"
1413
"github.com/openshift/configuration-anomaly-detection/pkg/notewriter"
15-
"sigs.k8s.io/controller-runtime/pkg/client"
14+
15+
"github.com/openshift/configuration-anomaly-detection/pkg/investigations/utils/version"
1616
)
1717

1818
const (
@@ -53,7 +53,7 @@ func (c *Investigation) Run(r *investigation.Resources) (investigation.Investiga
5353
}
5454

5555
// Check ClusterVersion
56-
clusterVersion, err := getClusterVersion(k8scli)
56+
clusterVersion, err := version.GetClusterVersion(k8scli)
5757
if err != nil {
5858
notes.AppendWarning("Failed to get ClusterVersion: %s", err.Error())
5959
} else {
@@ -70,15 +70,6 @@ func (c *Investigation) Run(r *investigation.Resources) (investigation.Investiga
7070
return result, r.PdClient.EscalateIncidentWithNote(notes.String())
7171
}
7272

73-
func getClusterVersion(k8scli client.Client) (*configv1.ClusterVersion, error) {
74-
clusterVersion := &configv1.ClusterVersion{}
75-
err := k8scli.Get(context.TODO(), client.ObjectKey{Name: "version"}, clusterVersion)
76-
if err != nil {
77-
return nil, fmt.Errorf("failed to get ClusterVersion: %w", err)
78-
}
79-
return clusterVersion, nil
80-
}
81-
8273
// getUpdateRetrievalFailures checks for update retrieval failures in the ClusterVersion
8374
func getUpdateRetrievalFailures(clusterVersion *configv1.ClusterVersion) string {
8475
for _, condition := range clusterVersion.Status.Conditions {

pkg/investigations/cannotretrieveupdatessre/cannotretrieveupdatessre_test.go

Lines changed: 0 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,12 @@
11
package cannotretrieveupdatessre
22

33
import (
4-
"strings"
54
"testing"
65

76
configv1 "github.com/openshift/api/config/v1"
8-
apierrors "k8s.io/apimachinery/pkg/api/errors"
97
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10-
"k8s.io/client-go/kubernetes/scheme"
11-
"sigs.k8s.io/controller-runtime/pkg/client"
12-
"sigs.k8s.io/controller-runtime/pkg/client/fake"
138
)
149

15-
func newFakeClient(objs ...client.Object) (client.Client, error) {
16-
s := scheme.Scheme
17-
err := configv1.AddToScheme(s)
18-
if err != nil {
19-
return nil, err
20-
}
21-
22-
client := fake.NewClientBuilder().WithScheme(s).WithObjects(objs...).Build()
23-
return client, nil
24-
}
25-
26-
func TestGetClusterVersion(t *testing.T) {
27-
tests := []struct {
28-
name string
29-
clusterVersion *configv1.ClusterVersion
30-
expectedVersion string
31-
expectError bool
32-
}{
33-
{
34-
name: "Valid ClusterVersion",
35-
clusterVersion: &configv1.ClusterVersion{
36-
ObjectMeta: metav1.ObjectMeta{
37-
Name: "version",
38-
},
39-
Spec: configv1.ClusterVersionSpec{
40-
Channel: "stable-4.18",
41-
ClusterID: "d1ba89f3-fd3e-48d2-91c6-test",
42-
},
43-
Status: configv1.ClusterVersionStatus{
44-
Desired: configv1.Release{Version: "4.18.10"},
45-
},
46-
},
47-
expectedVersion: "4.18.10",
48-
expectError: false,
49-
},
50-
{
51-
name: "ClusterVersion Not Found",
52-
clusterVersion: nil,
53-
expectedVersion: "",
54-
expectError: true,
55-
},
56-
}
57-
58-
for _, tt := range tests {
59-
t.Run(tt.name, func(t *testing.T) {
60-
var k8scli client.Client
61-
var err error
62-
if tt.clusterVersion != nil {
63-
k8scli, err = newFakeClient(tt.clusterVersion)
64-
} else {
65-
k8scli, err = newFakeClient()
66-
}
67-
if err != nil {
68-
t.Fatalf("failed to create a fake client: %v", err)
69-
}
70-
71-
got, err := getClusterVersion(k8scli)
72-
73-
if tt.expectError && err == nil {
74-
t.Errorf("Expected an error, got none")
75-
} else if !tt.expectError && err != nil {
76-
t.Errorf("Expected no error, got %v", err)
77-
}
78-
79-
if !tt.expectError {
80-
if got.Status.Desired.Version != tt.expectedVersion {
81-
t.Errorf("Expected version %q, got %q", tt.expectedVersion, got.Status.Desired.Version)
82-
}
83-
} else {
84-
if got != nil {
85-
t.Errorf("Expected nil ClusterVersion error, got %v", got)
86-
}
87-
if err != nil && !apierrors.IsNotFound(err) && !strings.Contains(err.Error(), "failed to get ClusterVersion") {
88-
t.Errorf("Expected error to be related about failed to get the ClusterVersion, got %v", err)
89-
}
90-
}
91-
})
92-
}
93-
}
94-
9510
func TestGetUpdateRetrievalFailures(t *testing.T) {
9611
tests := []struct {
9712
name string

pkg/investigations/machinehealthcheckunterminatedshortcircuitsre/machinehealthcheckunterminatedshortcircuitsre.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ const (
2929
)
3030

3131
type Investigation struct {
32-
// kclient provides access to on-cluster resources
33-
kclient k8sclient.Client
32+
// k8scli provides access to on-cluster resources
33+
k8scli k8sclient.Client
3434
// notes holds the messages that will be shared with Primary upon completion
3535
notes *notewriter.NoteWriter
3636
// recommendations holds the set of actions CAD recommends primary to take
@@ -39,19 +39,19 @@ type Investigation struct {
3939

4040
func (i *Investigation) setup(r *investigation.Resources) error {
4141
// Setup investigation
42-
k, err := k8sclient.New(r.Cluster.ID(), r.OcmClient, r.Name)
42+
k8scli, err := k8sclient.New(r.Cluster.ID(), r.OcmClient, r.Name)
4343
if err != nil {
4444
return fmt.Errorf("failed to initialize kubernetes client: %w", err)
4545
}
46-
i.kclient = k
46+
i.k8scli = k8scli
4747
i.notes = notewriter.New(r.Name, logging.RawLogger)
4848
i.recommendations = investigationRecommendations{}
4949

5050
return nil
5151
}
5252

5353
func (i *Investigation) teardown() error {
54-
return i.kclient.Clean()
54+
return i.k8scli.Clean()
5555
}
5656

5757
// Run investigates the MachineHealthCheckUnterminatedShortCircuitSRE alert
@@ -106,7 +106,7 @@ func (i *Investigation) Run(r *investigation.Resources) (investigation.Investiga
106106
// If one or more machines managed by the machinehealthcheck have not yet been identified as a problem, check on the machine's
107107
// node to determine if there are node-level problems that need remediating
108108
if len(targetMachines) > 0 {
109-
targetNodes, err := machineutil.GetNodesForMachines(ctx, i.kclient, targetMachines)
109+
targetNodes, err := machineutil.GetNodesForMachines(ctx, i.k8scli, targetMachines)
110110
if err != nil {
111111
i.notes.AppendWarning("failed to retrieve one or more target nodes: %v", err)
112112
}
@@ -127,15 +127,15 @@ func (i *Investigation) Run(r *investigation.Resources) (investigation.Investiga
127127

128128
func (i *Investigation) getMachinesFromFailingMHC(ctx context.Context) ([]machinev1beta1.Machine, error) {
129129
healthchecks := machinev1beta1.MachineHealthCheckList{}
130-
err := i.kclient.List(ctx, &healthchecks, &client.ListOptions{Namespace: machineutil.MachineNamespace})
130+
err := i.k8scli.List(ctx, &healthchecks, &client.ListOptions{Namespace: machineutil.MachineNamespace})
131131
if err != nil {
132132
return []machinev1beta1.Machine{}, fmt.Errorf("failed to retrieve machinehealthchecks from cluster: %w", err)
133133
}
134134

135135
targets := []machinev1beta1.Machine{}
136136
for _, healthcheck := range healthchecks.Items {
137137
if !machineutil.HealthcheckRemediationAllowed(healthcheck) {
138-
machines, err := machineutil.GetMachinesForMHC(ctx, i.kclient, healthcheck)
138+
machines, err := machineutil.GetMachinesForMHC(ctx, i.k8scli, healthcheck)
139139
if err != nil {
140140
i.notes.AppendWarning("failed to retrieve machines from machinehealthcheck %q: %v", healthcheck.Name, err)
141141
continue
@@ -240,7 +240,7 @@ func (i *Investigation) investigateDeletingMachine(ctx context.Context, machine
240240
i.recommendations.addRecommendation(recommendationInvestigateMachine, machine.Name, notes)
241241
return nil
242242
}
243-
node, err := machineutil.GetNodeForMachine(ctx, i.kclient, machine)
243+
node, err := machineutil.GetNodeForMachine(ctx, i.k8scli, machine)
244244
if err != nil {
245245
notes := "machine's node could not be determined"
246246
i.recommendations.addRecommendation(recommendationInvestigateMachine, machine.Name, notes)

pkg/investigations/machinehealthcheckunterminatedshortcircuitsre/machinehealthcheckunterminatedshortcircuitsre_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,7 @@ func newTestInvestigation(testObjects ...client.Object) (Investigation, error) {
573573
}
574574

575575
i := Investigation{
576-
kclient: clientImpl{fakeClient},
576+
k8scli: clientImpl{fakeClient},
577577
notes: notewriter.New("testing", logging.RawLogger),
578578
recommendations: investigationRecommendations{},
579579
}

pkg/investigations/utils/machine/machine.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ func HealthcheckRemediationAllowed(healthcheck machinev1beta1.MachineHealthCheck
3030
}
3131

3232
// GetMachinesForMHC retrieves the machines managed by the given MachineHealthCheck object
33-
func GetMachinesForMHC(ctx context.Context, kclient client.Client, healthcheck machinev1beta1.MachineHealthCheck) ([]machinev1beta1.Machine, error) {
33+
func GetMachinesForMHC(ctx context.Context, k8scli client.Client, healthcheck machinev1beta1.MachineHealthCheck) ([]machinev1beta1.Machine, error) {
3434
machines := machinev1beta1.MachineList{}
3535
selector, err := metav1.LabelSelectorAsSelector(&healthcheck.Spec.Selector)
3636
if err != nil {
3737
return []machinev1beta1.Machine{}, fmt.Errorf("failed to convert machinehealthcheck %q .spec.selector: %w", healthcheck.Name, err)
3838
}
39-
err = kclient.List(ctx, &machines, client.MatchingLabelsSelector{Selector: selector}, &client.ListOptions{Namespace: MachineNamespace})
39+
err = k8scli.List(ctx, &machines, client.MatchingLabelsSelector{Selector: selector}, &client.ListOptions{Namespace: MachineNamespace})
4040
if err != nil {
4141
return []machinev1beta1.Machine{}, fmt.Errorf("failed to retrieve machines from machinehealthcheck %q: %w", healthcheck.Name, err)
4242
}
@@ -53,9 +53,9 @@ func GetRole(machine machinev1beta1.Machine) (string, error) {
5353
}
5454

5555
// GetNodesForMachines retrieves the nodes for the given machines. Errors encountered are joined, but do not block the retrieval of other machines
56-
func GetNodesForMachines(ctx context.Context, kclient client.Client, machines []machinev1beta1.Machine) ([]corev1.Node, error) {
56+
func GetNodesForMachines(ctx context.Context, k8scli client.Client, machines []machinev1beta1.Machine) ([]corev1.Node, error) {
5757
// Retrieving all nodes initially & filtering out irrelevant objects results in fewer API calls
58-
nodes, err := node.GetAll(ctx, kclient)
58+
nodes, err := node.GetAll(ctx, k8scli)
5959
if err != nil {
6060
return []corev1.Node{}, fmt.Errorf("failed to retrieve nodes: %w", err)
6161
}
@@ -87,11 +87,11 @@ func findMatchingNode(machine machinev1beta1.Machine, nodes []corev1.Node) (core
8787

8888
// GetNodeForMachine retrieves the node for the given machine. If the provided machine's .Status.NodeRef is empty,
8989
// an error is returned
90-
func GetNodeForMachine(ctx context.Context, kclient client.Client, machine machinev1beta1.Machine) (corev1.Node, error) {
90+
func GetNodeForMachine(ctx context.Context, k8scli client.Client, machine machinev1beta1.Machine) (corev1.Node, error) {
9191
if machine.Status.NodeRef == nil || machine.Status.NodeRef.Name == "" {
9292
return corev1.Node{}, fmt.Errorf("no .Status.NodeRef defined for machine %q", machine.Name)
9393
}
9494
node := &corev1.Node{}
95-
err := kclient.Get(ctx, types.NamespacedName{Name: machine.Status.NodeRef.Name}, node)
95+
err := k8scli.Get(ctx, types.NamespacedName{Name: machine.Status.NodeRef.Name}, node)
9696
return *node, err
9797
}

pkg/investigations/utils/machine/machine_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,13 +264,13 @@ func Test_GetNodeForMachine(t *testing.T) {
264264
objs = append(objs, node)
265265
}
266266

267-
kclient, err := newFakeClient(objs...)
267+
k8scli, err := newFakeClient(objs...)
268268
if err != nil {
269269
t.Errorf("failed to create fake client for testing: %v", err)
270270
}
271271

272272
// Execute
273-
got, err := GetNodeForMachine(context.TODO(), kclient, *machine)
273+
got, err := GetNodeForMachine(context.TODO(), k8scli, *machine)
274274

275275
// Validate results
276276
if (err != nil) != tt.want.err {

pkg/investigations/utils/node/node.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ func FindNoScheduleTaint(node corev1.Node) (corev1.Taint, bool) {
2929
}
3030

3131
// GetNodes retrieves all nodes present in the cluster
32-
func GetAll(ctx context.Context, kclient client.Client) ([]corev1.Node, error) {
32+
func GetAll(ctx context.Context, k8scli client.Client) ([]corev1.Node, error) {
3333
nodes := corev1.NodeList{}
34-
err := kclient.List(ctx, &nodes)
34+
err := k8scli.List(ctx, &nodes)
3535
return nodes.Items, err
3636
}
3737

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package version
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
configv1 "github.com/openshift/api/config/v1"
8+
"sigs.k8s.io/controller-runtime/pkg/client"
9+
)
10+
11+
func GetClusterVersion(k8scli client.Client) (*configv1.ClusterVersion, error) {
12+
clusterVersion := &configv1.ClusterVersion{}
13+
err := k8scli.Get(context.TODO(), client.ObjectKey{Name: "version"}, clusterVersion)
14+
if err != nil {
15+
return nil, fmt.Errorf("failed to get ClusterVersion: %w", err)
16+
}
17+
return clusterVersion, nil
18+
}

0 commit comments

Comments
 (0)