Skip to content

Commit 5722705

Browse files
committed
wip: last fix before closing
1 parent 9b3ea60 commit 5722705

File tree

5 files changed

+45
-73
lines changed

5 files changed

+45
-73
lines changed

pkg/controller/operators/catalog/operator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1436,7 +1436,7 @@ func (o *Operator) ExecutePlan(plan *v1alpha1.InstallPlan) error {
14361436
}
14371437

14381438
ensurer := newStepEnsurer(kubeclient, crclient, dynamicClient)
1439-
b := newBuilder(kubeclient, dynamicClient, o.csvProvidedAPIsIndexer)
1439+
b := newBuilder(kubeclient, dynamicClient, o.csvProvidedAPIsIndexer, o.logger)
14401440

14411441
for i, step := range plan.Status.Plan {
14421442
doStep := true

pkg/controller/operators/catalog/step.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,16 @@ type builder struct {
3636
opclient operatorclient.ClientInterface
3737
dynamicClient dynamic.Interface
3838
csvToProvidedAPIs map[string]cache.Indexer
39+
logger logger.FieldLogger
3940
}
4041

41-
func newBuilder(opclient operatorclient.ClientInterface, dynamicClient dynamic.Interface, csvToProvidedAPIs map[string]cache.Indexer) *builder {
42+
func newBuilder(opclient operatorclient.ClientInterface, dynamicClient dynamic.Interface, csvToProvidedAPIs map[string]cache.Indexer,
43+
logger logger.FieldLogger) *builder {
4244
return &builder{
4345
opclient: opclient,
4446
dynamicClient: dynamicClient,
4547
csvToProvidedAPIs: csvToProvidedAPIs,
48+
logger: logger,
4649
}
4750
}
4851

@@ -106,20 +109,21 @@ func (b *builder) NewCRDStep(manifest string, client clientset.Interface, status
106109
if err != nil {
107110
return v1alpha1.StepStatusUnknown, err
108111
}
109-
logger.Debugf("crd version %s", version)
112+
b.logger.Debugf("crd version %s", version)
110113
if version == crdlib.V1Version {
111114
crd, err := crdlib.SerializeV1(manifest)
112115
if err != nil {
113116
return v1alpha1.StepStatusUnknown, err
114117
}
118+
b.logger.Debugf("creating v1 CRD %#v", crd)
115119
_, createError = client.ApiextensionsV1().CustomResourceDefinitions().Create(context.TODO(), crd, metav1.CreateOptions{})
116120
crdi = crd
117121
} else if version == crdlib.V1Beta1Version {
118122
crd, err := crdlib.SerializeV1Beta1(manifest)
119123
if err != nil {
120124
return v1alpha1.StepStatusUnknown, err
121125
}
122-
logger.Debugf("creating CRD %v", crdi)
126+
b.logger.Debugf("creating v1beta1 CRD %#v", crd)
123127
_, createError = client.ApiextensionsV1beta1().CustomResourceDefinitions().Create(context.TODO(), crd, metav1.CreateOptions{})
124128
crdi = crd
125129
} else {
@@ -128,15 +132,19 @@ func (b *builder) NewCRDStep(manifest string, client clientset.Interface, status
128132

129133
// convert to v1 type for remaining CRD reconciliation logic
130134
crd, err := crdlib.SerializeV1FromExisting(crdi)
131-
logger.Debugf("converted crd %v", crd)
135+
b.logger.Debugf("converted crd %#v", crd)
132136
if err != nil {
133137
return v1alpha1.StepStatusUnknown, fmt.Errorf("unable to serialize into v1 CRD from existing manifest: %s", err)
134138
}
135139

140+
b.logger.Debugf("create error: %s", createError)
141+
136142
if k8serrors.IsAlreadyExists(createError) {
137143
currentCRD, _ := client.ApiextensionsV1().CustomResourceDefinitions().Get(context.TODO(), crd.GetName(), metav1.GetOptions{})
138-
// Compare 2 CRDs to see if it needs to be updatetd
144+
// Compare 2 CRDs to see if it needs to be updated
145+
logger.Infof("\n current crd: %#v \n new crd: %#v \n", currentCRD, crd)
139146
if crdlib.NotEqual(currentCRD, crd) {
147+
b.logger.Debugf("not equal")
140148
// Verify CRD ownership, only attempt to update if
141149
// CRD has only one owner
142150
// Example: provided=database.coreos.com/v1alpha1/EtcdCluster
@@ -180,7 +188,7 @@ func (b *builder) NewCRDStep(manifest string, client clientset.Interface, status
180188
return v1alpha1.StepStatusPresent, nil
181189
} else if createError != nil {
182190
// Unexpected error creating the CRD.
183-
return v1alpha1.StepStatusUnknown, err
191+
return v1alpha1.StepStatusUnknown, createError
184192
}
185193
// If no error occured, make sure to wait for the API to become available.
186194
return v1alpha1.StepStatusWaitingForAPI, nil

pkg/lib/crd/serialize.go

Lines changed: 10 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@ package crd
33
import (
44
"bytes"
55
"fmt"
6-
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
76

87
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install"
98
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
109
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
11-
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1210
"k8s.io/apimachinery/pkg/runtime"
1311
"k8s.io/apimachinery/pkg/util/yaml"
1412
)
@@ -30,59 +28,29 @@ func init() {
3028
// SerializeV1 takes in a CRD manifest and returns a v1 versioned CRD object.
3129
// Compatible with v1beta1 or v1 CRD manifests.
3230
func SerializeV1(manifest string) (*apiextensionsv1.CustomResourceDefinition, error) {
33-
u := &unstructured.Unstructured{}
31+
crd := &apiextensionsv1.CustomResourceDefinition{}
3432
reader := bytes.NewReader([]byte(manifest))
3533
decoder := yaml.NewYAMLOrJSONDecoder(reader, 30)
36-
if err := decoder.Decode(u); err != nil {
37-
return nil, fmt.Errorf("crd unmarshaling failed: %s", err)
38-
}
39-
40-
// Step through unversioned type to support v1beta1 -> v1
41-
unversioned := &apiextensions.CustomResourceDefinition{}
42-
if err := scheme.Convert(u, unversioned, nil); err != nil {
43-
return nil, fmt.Errorf("failed to convert crd from unstructured to internal: %s\nto v1: %s", u, err)
44-
}
45-
46-
crd := &apiextensionsv1.CustomResourceDefinition{}
47-
if err := scheme.Convert(unversioned, crd, nil); err != nil {
48-
return nil, fmt.Errorf("failed to convert crd from internal to v1: %s\nto v1: %s", u, err)
34+
if err := decoder.Decode(crd); err != nil {
35+
return nil, fmt.Errorf("v1 crd unmarshaling failed: %s", err)
4936
}
5037

5138
// set CRD type meta
5239
// for purposes of fake client for unit tests to pass
5340
crd.TypeMeta.Kind = Kind
5441
crd.TypeMeta.APIVersion = Group + V1Version
5542

56-
// for each version in the CRD, check and make sure there is a schema
57-
// if not a schema, give a default schema of props
58-
for i := range crd.Spec.Versions {
59-
if crd.Spec.Versions[i].Schema == nil {
60-
schema := &apiextensionsv1.JSONSchemaProps{Type: "object"}
61-
crd.Spec.Versions[i].Schema = &apiextensionsv1.CustomResourceValidation{OpenAPIV3Schema: schema}
62-
}
63-
}
64-
6543
return crd, nil
6644
}
6745

6846
// SerializeV1 takes in a CRD manifest and returns a v1 versioned CRD object.
6947
// Compatible with v1beta1 or v1 CRD manifests.
7048
func SerializeV1Beta1(manifest string) (*apiextensionsv1beta1.CustomResourceDefinition, error) {
71-
u := &unstructured.Unstructured{}
49+
crd := &apiextensionsv1beta1.CustomResourceDefinition{}
7250
reader := bytes.NewReader([]byte(manifest))
7351
decoder := yaml.NewYAMLOrJSONDecoder(reader, 30)
74-
if err := decoder.Decode(u); err != nil {
75-
return nil, fmt.Errorf("crd unmarshaling failed: %s", err)
76-
}
77-
78-
unversioned := &apiextensions.CustomResourceDefinition{}
79-
if err := scheme.Convert(u, unversioned, nil); err != nil {
80-
return nil, fmt.Errorf("failed to convert crd from unstructured to internal: %s\nto v1: %s", u, err)
81-
}
82-
83-
crd := &apiextensionsv1beta1.CustomResourceDefinition{}
84-
if err := scheme.Convert(unversioned, crd, nil); err != nil {
85-
return nil, fmt.Errorf("failed to convert crd from internal to v1: %s\nto v1: %s", u, err)
52+
if err := decoder.Decode(crd); err != nil {
53+
return nil, fmt.Errorf("v1beta1 crd unmarshaling failed: %s", err)
8654
}
8755

8856
// set CRD type meta
@@ -99,16 +67,11 @@ func SerializeV1FromExisting(crd interface{}) (*apiextensionsv1.CustomResourceDe
9967
return c, nil
10068
}
10169
if c, ok := crd.(*apiextensionsv1beta1.CustomResourceDefinition); ok {
102-
unversioned := &apiextensions.CustomResourceDefinition{}
103-
if err := scheme.Convert(c, unversioned, nil); err != nil {
104-
return nil, fmt.Errorf("failed to convert crd from unstructured to internal: %s\nto v1: %s", c.String(), err)
105-
}
106-
107-
c := &apiextensionsv1.CustomResourceDefinition{}
108-
if err := scheme.Convert(unversioned, crd, nil); err != nil {
109-
return nil, fmt.Errorf("failed to convert crd from internal to v1: %s\nto v1: %s", c.String(), err)
70+
v1crd := &apiextensionsv1.CustomResourceDefinition{}
71+
if err := scheme.Convert(c, v1crd, nil); err != nil {
72+
return nil, fmt.Errorf("failed to convert crd from v1beta1 to v1: %#v: %s", c, err)
11073
}
111-
return c, nil
74+
return v1crd, nil
11275
}
11376
return nil, fmt.Errorf("unable to determine crd type")
11477
}

pkg/lib/crd/version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func NotEqual(currentCRD *apiextensionsv1.CustomResourceDefinition, oldCRD *apie
6464
return true
6565
}
6666
equalValidation = reflect.DeepEqual(currentCRD.Spec.Versions[i].Schema, oldCRD.Spec.Versions[i].Schema)
67-
if equalValidation == false {
67+
if !equalValidation {
6868
return true
6969
}
7070
}

test/e2e/installplan_e2e_test.go

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -488,9 +488,9 @@ var _ = Describe("Install Plan", func() {
488488
newCRD *apiextensions.CustomResourceDefinition
489489
}
490490

491-
var min float64 = 2.1
492-
var max float64 = 256.1
493-
var newMax float64 = 50.1
491+
var min float64 = 2
492+
var max float64 = 256
493+
var newMax float64 = 50
494494
// generated outside of the test table so that the same naming can be used for both old and new CSVs
495495
mainCRDPlural := "testcrd"
496496

@@ -608,22 +608,22 @@ var _ = Describe("Install Plan", func() {
608608
{
609609
Name: "v1alpha1",
610610
Served: true,
611-
Storage: false,
612-
Schema: &apiextensions.CustomResourceValidation{
613-
OpenAPIV3Schema: &apiextensions.JSONSchemaProps{
614-
Type: "object",
611+
Storage: true,
612+
},
613+
}
614+
newCRD.Spec.Validation = &apiextensions.CustomResourceValidation{
615+
OpenAPIV3Schema: &apiextensions.JSONSchemaProps{
616+
Type: "object",
617+
Properties: map[string]apiextensions.JSONSchemaProps{
618+
"spec": {
619+
Type: "object",
620+
Description: "Spec of a test object.",
615621
Properties: map[string]apiextensions.JSONSchemaProps{
616-
"spec": {
617-
Type: "object",
618-
Description: "Spec of a test object.",
619-
Properties: map[string]apiextensions.JSONSchemaProps{
620-
"scalar": {
621-
Type: "number",
622-
Description: "Scalar value that should have a min and max.",
623-
Minimum: &min,
624-
Maximum: &newMax,
625-
},
626-
},
622+
"scalar": {
623+
Type: "number",
624+
Description: "Scalar value that should have a min and max.",
625+
Minimum: &min,
626+
Maximum: &newMax,
627627
},
628628
},
629629
},
@@ -807,6 +807,7 @@ var _ = Describe("Install Plan", func() {
807807
fetchedInstallPlan, err := fetchInstallPlan(GinkgoT(), crc, installPlanName, completeOrFailedFunc)
808808
require.NoError(GinkgoT(), err)
809809
GinkgoT().Logf("Install plan %s fetched with status %s", fetchedInstallPlan.GetName(), fetchedInstallPlan.Status.Phase)
810+
GinkgoT().Logf("install plan %#v", fetchedInstallPlan)
810811
require.Equal(GinkgoT(), operatorsv1alpha1.InstallPlanPhaseComplete, fetchedInstallPlan.Status.Phase)
811812

812813
// Ensure that the desired resources have been created

0 commit comments

Comments
 (0)