Skip to content

Commit 02d278b

Browse files
Merge pull request #2136 from ecordell/hive-val-bug
Fix CR validation bug on go 1.16
2 parents 9f18c1b + b854558 commit 02d278b

File tree

11 files changed

+602
-25
lines changed

11 files changed

+602
-25
lines changed

go.mod

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ require (
4141
google.golang.org/grpc v1.30.0
4242
gopkg.in/yaml.v2 v2.4.0
4343
helm.sh/helm/v3 v3.1.0-rc.1.0.20201215141456-e71d38b414eb
44+
// can't update to 0.21 until https://github.com/kubernetes/apiserver/issues/65 is resolved
4445
k8s.io/api v0.20.6
4546
k8s.io/apiextensions-apiserver v0.20.6
4647
k8s.io/apimachinery v0.20.6
@@ -50,7 +51,7 @@ require (
5051
k8s.io/component-base v0.20.6
5152
k8s.io/klog v1.0.0
5253
k8s.io/kube-aggregator v0.20.4
53-
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd
54+
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7
5455
k8s.io/utils v0.0.0-20210111153108-fddb29f9d009
5556
rsc.io/letsencrypt v0.0.3 // indirect
5657
sigs.k8s.io/controller-runtime v0.8.3

go.sum

+2-1
Original file line numberDiff line numberDiff line change
@@ -1439,8 +1439,9 @@ k8s.io/kube-aggregator v0.20.4 h1:j/SUwPy1eO+ud3XOUGmH18gISPyerqhXOoNRZDbv3fs=
14391439
k8s.io/kube-aggregator v0.20.4/go.mod h1:0ixQ9De7KXyHteXizS6nVtrnKqGa4kiuxl9rEBsNccw=
14401440
k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
14411441
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
1442-
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c=
14431442
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
1443+
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0=
1444+
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE=
14441445
k8s.io/kubectl v0.18.0/go.mod h1:LOkWx9Z5DXMEg5KtOjHhRiC1fqJPLyCr3KtQgEolCkU=
14451446
k8s.io/kubectl v0.20.0 h1:q6HH6jILYi2lkzFqBhs63M4bKLxYlM0HpFJ///MgARA=
14461447
k8s.io/kubectl v0.20.0/go.mod h1:8x5GzQkgikz7M2eFGGuu6yOfrenwnw5g4RXOUgbjR1M=

pkg/controller/operators/catalog/operator.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1600,7 +1600,7 @@ func validateExistingCRs(dynamicClient dynamic.Interface, gvr schema.GroupVersio
16001600
}
16011601
err = validation.ValidateCustomResource(field.NewPath(""), cr.UnstructuredContent(), validator).ToAggregate()
16021602
if err != nil {
1603-
return fmt.Errorf("error validating custom resource against new schema %#v: %s", newCRD.Spec.Validation, err)
1603+
return fmt.Errorf("error validating custom resource against new schema for %s %s/%s: %v", newCRD.Spec.Names.Kind, cr.GetNamespace(), cr.GetName(), err)
16041604
}
16051605
}
16061606
return nil

pkg/controller/operators/catalog/operator_test.go

+67
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
"testing/quick"
1414
"time"
1515

16+
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
17+
1618
"github.com/sirupsen/logrus"
1719
"github.com/stretchr/testify/require"
1820
"golang.org/x/time/rate"
@@ -30,6 +32,7 @@ import (
3032
"k8s.io/apimachinery/pkg/runtime/schema"
3133
"k8s.io/apimachinery/pkg/types"
3234
utilclock "k8s.io/apimachinery/pkg/util/clock"
35+
k8syaml "k8s.io/apimachinery/pkg/util/yaml"
3336
utilyaml "k8s.io/apimachinery/pkg/util/yaml"
3437
"k8s.io/apiserver/pkg/storage/names"
3538
fakedynamic "k8s.io/client-go/dynamic/fake"
@@ -1284,6 +1287,70 @@ func TestCompetingCRDOwnersExist(t *testing.T) {
12841287
}
12851288
}
12861289

1290+
func TestValidateExistingCRs(t *testing.T) {
1291+
unstructuredForFile := func(file string) *unstructured.Unstructured {
1292+
data, err := ioutil.ReadFile(file)
1293+
require.NoError(t, err)
1294+
dec := k8syaml.NewYAMLOrJSONDecoder(strings.NewReader(string(data)), 30)
1295+
k8sFile := &unstructured.Unstructured{}
1296+
require.NoError(t, dec.Decode(k8sFile))
1297+
return k8sFile
1298+
}
1299+
1300+
unversionedCRDForV1beta1File := func(file string) *apiextensions.CustomResourceDefinition {
1301+
data, err := ioutil.ReadFile(file)
1302+
require.NoError(t, err)
1303+
dec := k8syaml.NewYAMLOrJSONDecoder(strings.NewReader(string(data)), 30)
1304+
k8sFile := &apiextensionsv1beta1.CustomResourceDefinition{}
1305+
require.NoError(t, dec.Decode(k8sFile))
1306+
convertedCRD := &apiextensions.CustomResourceDefinition{}
1307+
require.NoError(t, apiextensionsv1beta1.Convert_v1beta1_CustomResourceDefinition_To_apiextensions_CustomResourceDefinition(k8sFile, convertedCRD, nil))
1308+
return convertedCRD
1309+
}
1310+
1311+
tests := []struct {
1312+
name string
1313+
existingObjects []runtime.Object
1314+
gvr schema.GroupVersionResource
1315+
newCRD *apiextensions.CustomResourceDefinition
1316+
want error
1317+
}{
1318+
{
1319+
name: "label validation",
1320+
existingObjects: []runtime.Object{
1321+
unstructuredForFile("testdata/hivebug/cr.yaml"),
1322+
},
1323+
gvr: schema.GroupVersionResource{
1324+
Group: "hive.openshift.io",
1325+
Version: "v1",
1326+
Resource: "machinepools",
1327+
},
1328+
newCRD: unversionedCRDForV1beta1File("testdata/hivebug/crd.yaml"),
1329+
},
1330+
{
1331+
name: "fail validation",
1332+
existingObjects: []runtime.Object{
1333+
unstructuredForFile("testdata/hivebug/fail.yaml"),
1334+
},
1335+
gvr: schema.GroupVersionResource{
1336+
Group: "hive.openshift.io",
1337+
Version: "v1",
1338+
Resource: "machinepools",
1339+
},
1340+
newCRD: unversionedCRDForV1beta1File("testdata/hivebug/crd.yaml"),
1341+
want: fmt.Errorf("error validating custom resource against new schema for MachinePool /test: [[].spec.clusterDeploymentRef: Invalid value: \"null\": spec.clusterDeploymentRef in body must be of type object: \"null\", [].spec.name: Required value, [].spec.platform: Required value]"),
1342+
},
1343+
}
1344+
for _, tt := range tests {
1345+
t.Run(tt.name, func(t *testing.T) {
1346+
client := fakedynamic.NewSimpleDynamicClientWithCustomListKinds(runtime.NewScheme(), map[schema.GroupVersionResource]string{
1347+
tt.gvr: "UnstructuredList",
1348+
}, tt.existingObjects...)
1349+
require.Equal(t, tt.want, validateExistingCRs(client, tt.gvr, tt.newCRD))
1350+
})
1351+
}
1352+
}
1353+
12871354
func fakeConfigMapData() map[string]string {
12881355
data := make(map[string]string)
12891356
yaml, err := yaml.Marshal([]apiextensionsv1beta1.CustomResourceDefinition{crd("fake-crd")})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
apiVersion: hive.openshift.io/v1
2+
kind: MachinePool
3+
metadata:
4+
name: test
5+
spec:
6+
name: "test"
7+
platform:
8+
aws:
9+
rootVolume:
10+
iops: 1
11+
size: 1
12+
type: a
13+
type: m4-large
14+
clusterDeploymentRef:
15+
name: osd-abc
16+
labels:
17+
node-role.kubernetes.io: infra
18+
node-role.kubernetes.io/infra: ""

0 commit comments

Comments
 (0)