Skip to content

Commit 190fc72

Browse files
Merge pull request #1094 from dinhxuanvu/minkube-status-fix
fix(olm): No longer report status if minKubeVersion not specified
2 parents 3255734 + 08e61fd commit 190fc72

File tree

2 files changed

+111
-12
lines changed

2 files changed

+111
-12
lines changed

pkg/controller/operators/olm/requirements.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,17 @@ import (
1616
)
1717

1818
func (a *Operator) minKubeVersionStatus(name string, minKubeVersion string) (met bool, statuses []v1alpha1.RequirementStatus) {
19+
if minKubeVersion == "" {
20+
return true, nil
21+
}
22+
1923
status := v1alpha1.RequirementStatus{
2024
Group: "operators.coreos.com",
2125
Version: "v1alpha1",
2226
Kind: "ClusterServiceVersion",
2327
Name: name,
2428
}
2529

26-
if minKubeVersion == "" {
27-
status.Status = v1alpha1.RequirementStatusReasonNotPresent
28-
status.Message = "CSV missing minimum kube version specification"
29-
met = true
30-
statuses = append(statuses, status)
31-
return
32-
}
33-
3430
// Retrieve server k8s version
3531
serverVersionInfo, err := a.opClient.KubernetesInterface().Discovery().ServerVersion()
3632
if err != nil {
@@ -340,6 +336,7 @@ func (a *Operator) permissionStatus(strategyDetailsDeployment *install.StrategyD
340336

341337
// requirementAndPermissionStatus returns the aggregate requirement and permissions statuses for the given CSV
342338
func (a *Operator) requirementAndPermissionStatus(csv *v1alpha1.ClusterServiceVersion) (bool, []v1alpha1.RequirementStatus, error) {
339+
allReqStatuses := []v1alpha1.RequirementStatus{}
343340
// Use a StrategyResolver to unmarshal
344341
strategyResolver := install.StrategyResolver{}
345342
strategy, err := strategyResolver.UnmarshalStrategy(csv.Spec.InstallStrategy)
@@ -355,8 +352,12 @@ func (a *Operator) requirementAndPermissionStatus(csv *v1alpha1.ClusterServiceVe
355352

356353
// Check kubernetes version requirement between CSV and server
357354
minKubeMet, minKubeStatus := a.minKubeVersionStatus(csv.GetName(), csv.Spec.MinKubeVersion)
355+
if minKubeStatus != nil {
356+
allReqStatuses = append(allReqStatuses, minKubeStatus...)
357+
}
358+
358359
reqMet, reqStatuses := a.requirementStatus(strategyDetailsDeployment, csv.GetAllCRDDescriptions(), csv.GetOwnedAPIServiceDescriptions(), csv.GetRequiredAPIServiceDescriptions(), csv.Spec.NativeAPIs)
359-
allReqStatuses := append(minKubeStatus, reqStatuses...)
360+
allReqStatuses = append(allReqStatuses, reqStatuses...)
360361

361362
rbacLister := a.lister.RbacV1()
362363
roleLister := rbacLister.RoleLister()

pkg/controller/operators/olm/requirements_test.go

Lines changed: 101 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ func TestRequirementAndPermissionStatus(t *testing.T) {
4646
nil,
4747
v1alpha1.CSVPhasePending,
4848
),
49-
existingObjs: nil,
50-
existingExtObjs: nil,
51-
met: false,
49+
existingObjs: nil,
50+
existingExtObjs: nil,
51+
met: false,
5252
expectedRequirementStatuses: nil,
5353
expectedError: fmt.Errorf("unexpected end of JSON input"),
5454
},
@@ -637,3 +637,101 @@ func TestRequirementAndPermissionStatus(t *testing.T) {
637637
})
638638
}
639639
}
640+
641+
func TestMinKubeVersionStatus(t *testing.T) {
642+
namespace := "ns"
643+
csv := csv("csv1",
644+
namespace,
645+
"0.0.0",
646+
"",
647+
v1alpha1.NamedInstallStrategy{"deployment", json.RawMessage{}},
648+
nil,
649+
nil,
650+
v1alpha1.CSVPhasePending,
651+
)
652+
653+
tests := []struct {
654+
description string
655+
csvName string
656+
minKubeVersion string
657+
expectedMet bool
658+
expectedRequirementStatuses []v1alpha1.RequirementStatus
659+
}{
660+
{
661+
description: "minKubeVersion is not specfied",
662+
csvName: "test1",
663+
minKubeVersion: "",
664+
expectedMet: true,
665+
expectedRequirementStatuses: []v1alpha1.RequirementStatus{},
666+
},
667+
{
668+
description: "minKubeVersion is met",
669+
csvName: "test2",
670+
minKubeVersion: "0.0.0",
671+
expectedMet: true,
672+
expectedRequirementStatuses: []v1alpha1.RequirementStatus{
673+
v1alpha1.RequirementStatus{
674+
Status: v1alpha1.RequirementStatusReasonPresent,
675+
Message: fmt.Sprintf("CSV minKubeVersion (%s) less than server version", "0.0.0"),
676+
Group: "operators.coreos.com",
677+
Version: "v1alpha1",
678+
Kind: "ClusterServiceVersion",
679+
Name: "test2",
680+
},
681+
},
682+
},
683+
{
684+
description: "minKubeVersion is unmet",
685+
csvName: "test3",
686+
minKubeVersion: "999.999.999",
687+
expectedMet: false,
688+
expectedRequirementStatuses: []v1alpha1.RequirementStatus{
689+
v1alpha1.RequirementStatus{
690+
Status: v1alpha1.RequirementStatusReasonPresentNotSatisfied,
691+
Message: fmt.Sprintf("CSV version requirement not met: minKubeVersion (%s)", "999.999.999"),
692+
Group: "operators.coreos.com",
693+
Version: "v1alpha1",
694+
Kind: "ClusterServiceVersion",
695+
Name: "test3",
696+
},
697+
},
698+
},
699+
{
700+
description: "minKubeVersion is invalid",
701+
csvName: "test4",
702+
minKubeVersion: "a.b.c",
703+
expectedMet: false,
704+
expectedRequirementStatuses: []v1alpha1.RequirementStatus{
705+
v1alpha1.RequirementStatus{
706+
Status: v1alpha1.RequirementStatusReasonPresentNotSatisfied,
707+
Message: "CSV version parsing error",
708+
Group: "operators.coreos.com",
709+
Version: "v1alpha1",
710+
Kind: "ClusterServiceVersion",
711+
Name: "test4",
712+
},
713+
},
714+
},
715+
}
716+
717+
for _, test := range tests {
718+
t.Run(test.description, func(t *testing.T) {
719+
ctx, cancel := context.WithCancel(context.TODO())
720+
defer cancel()
721+
op, err := NewFakeOperator(ctx, withNamespaces(namespace), withOperatorNamespace(namespace), withClientObjs(csv))
722+
require.NoError(t, err)
723+
724+
// Get the permission status
725+
met, status := op.minKubeVersionStatus(test.csvName, test.minKubeVersion)
726+
require.Equal(t, test.expectedMet, met)
727+
if len(test.expectedRequirementStatuses) > 0 {
728+
require.Equal(t, status[0].Status, test.expectedRequirementStatuses[0].Status)
729+
require.Equal(t, status[0].Kind, test.expectedRequirementStatuses[0].Kind)
730+
require.Equal(t, status[0].Name, test.expectedRequirementStatuses[0].Name)
731+
require.Contains(t, status[0].Message, test.expectedRequirementStatuses[0].Message)
732+
} else {
733+
require.Equal(t, status, []v1alpha1.RequirementStatus(nil))
734+
}
735+
})
736+
}
737+
}

0 commit comments

Comments
 (0)