@@ -2,13 +2,14 @@ package operators
2
2
3
3
import (
4
4
"context"
5
+ "strings"
5
6
6
7
g "github.com/onsi/ginkgo"
7
8
o "github.com/onsi/gomega"
8
9
s "github.com/onsi/gomega/gstruct"
9
10
t "github.com/onsi/gomega/types"
10
-
11
11
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12
+ "k8s.io/apimachinery/pkg/runtime/schema"
12
13
"k8s.io/kube-openapi/pkg/util/sets"
13
14
e2e "k8s.io/kubernetes/test/e2e/framework"
14
15
@@ -81,6 +82,47 @@ var _ = g.Describe("[sig-arch] ClusterOperators", func() {
81
82
}
82
83
})
83
84
85
+ g .Specify ("valid related objects" , func () {
86
+ controlplaneTopology , err := exutil .GetControlPlaneTopology (oc )
87
+ o .Expect (err ).NotTo (o .HaveOccurred ())
88
+ if * controlplaneTopology == config .ExternalTopologyMode {
89
+ // The packageserver runs in a different cluster along the other controlplane components
90
+ // when the controlplane is external.
91
+ whitelistNoOperatorConfig .Insert ("operator-lifecycle-manager-packageserver" )
92
+ }
93
+ restMapper := oc .RESTMapper ()
94
+
95
+ for _ , clusterOperator := range clusterOperators {
96
+ if ! whitelistNoOperatorConfig .Has (clusterOperator .Name ) {
97
+ for _ , relatedObj := range clusterOperator .Status .RelatedObjects {
98
+
99
+ // any uppercase immediately signals an improper mapping:
100
+ o .Expect (relatedObj .Resource ).To (o .Equal (strings .ToLower (relatedObj .Resource )),
101
+ "Cluster operator %s should be using lowercase resource references: %s" ,
102
+ clusterOperator .Name , relatedObj .Resource )
103
+
104
+ // also ensure we find a valid rest mapping:
105
+
106
+ // "storage" ClusterOperator has some relatedResource refs to CRDs that only exists if
107
+ // TechPreviewNoUpgrade is enabled. This is acceptable and not a bug, but needs a special case here.
108
+ if clusterOperator .Name == "storage" && (relatedObj .Resource == "sharedconfigmaps" ||
109
+ relatedObj .Resource == "sharedsecrets" ) {
110
+ continue
111
+ }
112
+
113
+ resourceMatches , err := restMapper .ResourcesFor (schema.GroupVersionResource {
114
+ Group : relatedObj .Group ,
115
+ Resource : relatedObj .Resource ,
116
+ })
117
+ o .Expect (err ).ToNot (o .HaveOccurred ())
118
+ o .Expect (len (resourceMatches )).To (o .BeNumerically (">" , 0 ),
119
+ "No valid rest mapping found for cluster operator %s related object %s" ,
120
+ clusterOperator .Name , relatedObj .Resource )
121
+ }
122
+ }
123
+ }
124
+ })
125
+
84
126
})
85
127
})
86
128
0 commit comments