Skip to content

Commit dfb63fd

Browse files
committed
Add e2e for accept risks
1 parent 3d589b7 commit dfb63fd

3 files changed

Lines changed: 204 additions & 0 deletions

File tree

.openshift-tests-extension/openshift_payload_cluster-version-operator.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,24 @@
11
[
2+
{
3+
"name": "[Jira:\"Cluster Version Operator\"] cluster-version-operator works well on accept risks. Cluster Version Operator can store accepted risks",
4+
"labels": {},
5+
"resources": {
6+
"isolation": {}
7+
},
8+
"source": "openshift:payload:cluster-version-operator",
9+
"lifecycle": "blocking",
10+
"environmentSelector": {}
11+
},
12+
{
13+
"name": "[Jira:\"Cluster Version Operator\"] cluster-version-operator works well on accept risks. Cluster Version Operator should populate the fields about risks in status",
14+
"labels": {},
15+
"resources": {
16+
"isolation": {}
17+
},
18+
"source": "openshift:payload:cluster-version-operator",
19+
"lifecycle": "blocking",
20+
"environmentSelector": {}
21+
},
222
{
323
"name": "[Jira:\"Cluster Version Operator\"] cluster-version-operator-tests should support passing tests",
424
"labels": {},

test/cvo/accept_risks.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package cvo
2+
3+
import (
4+
"context"
5+
configv1 "github.com/openshift/api/config/v1"
6+
"slices"
7+
8+
g "github.com/onsi/ginkgo/v2"
9+
o "github.com/onsi/gomega"
10+
11+
configclientv1 "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
12+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13+
"k8s.io/client-go/kubernetes"
14+
"k8s.io/client-go/rest"
15+
16+
"github.com/openshift/cluster-version-operator/test/util"
17+
)
18+
19+
var _ = g.Describe(`[Jira:"Cluster Version Operator"] cluster-version-operator works well on accept risks.`, func() {
20+
21+
var (
22+
c *rest.Config
23+
kubeClient kubernetes.Interface
24+
configv1Client *configclientv1.ConfigV1Client
25+
err error
26+
27+
isTechPreviewNoUpgrade bool
28+
isHypershift bool
29+
isMicroShiftCluster bool
30+
)
31+
32+
g.BeforeEach(func() {
33+
c, err = util.LoadRestConfig()
34+
o.Expect(err).To(o.BeNil())
35+
kubeClient, err = kubernetes.NewForConfig(c)
36+
o.Expect(err).To(o.BeNil())
37+
configv1Client, err = configclientv1.NewForConfig(c)
38+
o.Expect(err).To(o.BeNil())
39+
isTechPreviewNoUpgrade = util.IsTechPreviewNoUpgrade(configv1Client)
40+
isHypershift, err = util.IsHypershift(configv1Client)
41+
o.Expect(err).To(o.BeNil())
42+
isMicroShiftCluster, err = util.IsMicroShiftCluster(kubeClient, logger)
43+
o.Expect(err).To(o.BeNil())
44+
45+
if isHypershift {
46+
g.Skip("This test is skipped on a Hypershift cluster")
47+
}
48+
if isMicroShiftCluster {
49+
g.Skip("This test is skipped on a Microshift cluster")
50+
}
51+
if !isTechPreviewNoUpgrade {
52+
g.Skip("This test is skipped because the Tech Preview NoUpgrade is not enabled")
53+
}
54+
})
55+
56+
g.Describe("Cluster Version Operator", func() {
57+
g.It("can store accepted risks", func() {
58+
cv, err := configv1Client.ClusterVersions().Get(context.Background(), "cluster", metav1.GetOptions{})
59+
o.Expect(err).NotTo(o.HaveOccurred())
60+
61+
bk := cv.Spec.DesiredUpdate
62+
if bk != nil {
63+
bk = bk.DeepCopy()
64+
}
65+
66+
g.By("Checking that new risks can be saved")
67+
if cv.Spec.DesiredUpdate == nil {
68+
cv.Spec.DesiredUpdate = &configv1.Update{}
69+
}
70+
cv.Spec.DesiredUpdate.AcceptRisks = append(cv.Spec.DesiredUpdate.AcceptRisks, []configv1.AcceptRisk{
71+
{Name: "riskA"},
72+
{Name: "riskB"},
73+
}...)
74+
75+
cv, err = configv1Client.ClusterVersions().Update(context.Background(), cv, metav1.UpdateOptions{})
76+
o.Expect(err).NotTo(o.HaveOccurred())
77+
var names []string
78+
for _, r := range cv.Spec.DesiredUpdate.AcceptRisks {
79+
names = append(names, r.Name)
80+
}
81+
o.Expect(slices.Contains(cv.Spec.DesiredUpdate.AcceptRisks, configv1.AcceptRisk{Name: "riskA"})).To(o.BeTrue())
82+
o.Expect(slices.Contains(cv.Spec.DesiredUpdate.AcceptRisks, configv1.AcceptRisk{Name: "riskB"})).To(o.BeTrue())
83+
84+
g.By("Checking that new risks can be removed")
85+
cv.Spec.DesiredUpdate = bk
86+
cv, err = configv1Client.ClusterVersions().Update(context.Background(), cv, metav1.UpdateOptions{})
87+
o.Expect(err).NotTo(o.HaveOccurred())
88+
o.Expect(slices.Contains(cv.Spec.DesiredUpdate.AcceptRisks, configv1.AcceptRisk{Name: "riskA"})).To(o.BeTrue())
89+
o.Expect(slices.Contains(cv.Spec.DesiredUpdate.AcceptRisks, configv1.AcceptRisk{Name: "riskB"})).To(o.BeTrue())
90+
})
91+
92+
g.It("should populate the fields about risks in status", func() {
93+
cv, err := configv1Client.ClusterVersions().Get(context.Background(), "cluster", metav1.GetOptions{})
94+
o.Expect(err).NotTo(o.HaveOccurred())
95+
96+
g.By("Checking that each condition update has risk names")
97+
for _, cu := range cv.Status.ConditionalUpdates {
98+
o.Expect(cu.RiskNames).ShouldNot(o.BeEmpty(), "RiskNames should not be empty")
99+
}
100+
})
101+
})
102+
})

test/util/util.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package util
2+
3+
import (
4+
"context"
5+
"github.com/go-logr/logr"
6+
7+
"time"
8+
9+
o "github.com/onsi/gomega"
10+
11+
configv1 "github.com/openshift/api/config/v1"
12+
configclientv1 "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
13+
corev1 "k8s.io/api/core/v1"
14+
apierrors "k8s.io/apimachinery/pkg/api/errors"
15+
kapierrs "k8s.io/apimachinery/pkg/api/errors"
16+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
17+
"k8s.io/apimachinery/pkg/util/wait"
18+
"k8s.io/client-go/kubernetes"
19+
"k8s.io/client-go/rest"
20+
"k8s.io/client-go/tools/clientcmd"
21+
)
22+
23+
// LoadRestConfig loads Kube Config
24+
func LoadRestConfig() (*rest.Config, error) {
25+
return clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
26+
clientcmd.NewDefaultClientConfigLoadingRules(),
27+
&clientcmd.ConfigOverrides{},
28+
).ClientConfig()
29+
}
30+
31+
// IsTechPreviewNoUpgrade checks if a cluster is a TechPreviewNoUpgrade cluster
32+
func IsTechPreviewNoUpgrade(c *configclientv1.ConfigV1Client) bool {
33+
featureGate, err := c.FeatureGates().Get(context.Background(), "cluster", metav1.GetOptions{})
34+
if err != nil {
35+
if apierrors.IsNotFound(err) {
36+
return false
37+
}
38+
o.Expect(err).NotTo(o.HaveOccurred(), "could not retrieve feature-gate: %v", err)
39+
}
40+
return featureGate.Spec.FeatureSet == configv1.TechPreviewNoUpgrade
41+
}
42+
43+
// IsHypershift checks if a cluster is a Hypershift cluster
44+
func IsHypershift(c *configclientv1.ConfigV1Client) (bool, error) {
45+
infrastructure, err := c.Infrastructures().Get(context.Background(), "cluster", metav1.GetOptions{})
46+
if err != nil {
47+
return false, err
48+
}
49+
return infrastructure.Status.ControlPlaneTopology == configv1.ExternalTopologyMode, nil
50+
51+
}
52+
53+
// IsMicroShiftCluster returns "true" if a cluster is MicroShift,
54+
// "false" otherwise. It needs kube-admin client as input.
55+
func IsMicroShiftCluster(kubeClient kubernetes.Interface, logger logr.Logger) (bool, error) {
56+
ctx := context.Background()
57+
var cm *corev1.ConfigMap
58+
duration := 5 * time.Minute
59+
if err := wait.PollUntilContextTimeout(ctx, 10*time.Second, duration, true, func(ctx context.Context) (bool, error) {
60+
// MicroShift cluster contains "microshift-version" configmap in "kube-public" namespace
61+
var err error
62+
cm, err = kubeClient.CoreV1().ConfigMaps("kube-public").Get(ctx, "microshift-version", metav1.GetOptions{})
63+
if err == nil {
64+
return true, nil
65+
}
66+
if kapierrs.IsNotFound(err) {
67+
cm = nil
68+
return true, nil
69+
}
70+
logger.Error(err, "error accessing microshift-version configmap")
71+
return false, nil
72+
}); err != nil {
73+
logger.WithValues("duration", duration).Error(err, "failed to find microshift-version configmap")
74+
return false, err
75+
}
76+
if cm == nil {
77+
logger.Info("microshift-version configmap not found")
78+
return false, nil
79+
}
80+
logger.WithValues("version", cm.Data["version"]).Info("MicroShift cluster has version in ConfigMap")
81+
return true, nil
82+
}

0 commit comments

Comments
 (0)