Skip to content

Commit f4b4bba

Browse files
[entity] Not error when optional properties are not present in the entity (#138)
This PR introduces the optional field while loading entities from bundles. If the property is optional and is not present, we do not error. Signed-off-by: Varsha Prasad Narsing <[email protected]>
1 parent a252719 commit f4b4bba

File tree

2 files changed

+28
-21
lines changed

2 files changed

+28
-21
lines changed

internal/resolution/variable_sources/entity/bundle_entity.go

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ type ChannelProperties struct {
1919
SkipRange string `json:"skipRange,omitempty"`
2020
}
2121

22+
type propertyRequirement bool
23+
24+
const (
25+
required propertyRequirement = true
26+
optional propertyRequirement = false
27+
)
28+
2229
type PackageRequired struct {
2330
property.PackageRequired
2431
SemverRange *semver.Range `json:"-"`
@@ -121,7 +128,7 @@ func (b *BundleEntity) loadPackage() error {
121128
b.mu.Lock()
122129
defer b.mu.Unlock()
123130
if b.bundlePackage == nil {
124-
bundlePackage, err := loadFromEntity[property.Package](b.Entity, property.TypePackage)
131+
bundlePackage, err := loadFromEntity[property.Package](b.Entity, property.TypePackage, required)
125132
if err != nil {
126133
return fmt.Errorf("error determining package for entity '%s': %w", b.ID, err)
127134
}
@@ -141,7 +148,7 @@ func (b *BundleEntity) loadProvidedGVKs() error {
141148
b.mu.Lock()
142149
defer b.mu.Unlock()
143150
if b.providedGVKs == nil {
144-
providedGVKs, err := loadFromEntity[[]GVK](b.Entity, property.TypeGVK)
151+
providedGVKs, err := loadFromEntity[[]GVK](b.Entity, property.TypeGVK, optional)
145152
if err != nil {
146153
return fmt.Errorf("error determining bundle provided gvks for entity '%s': %w", b.ID, err)
147154
}
@@ -154,7 +161,7 @@ func (b *BundleEntity) loadRequiredGVKs() error {
154161
b.mu.Lock()
155162
defer b.mu.Unlock()
156163
if b.requiredGVKs == nil {
157-
requiredGVKs, err := loadFromEntity[[]GVKRequired](b.Entity, property.TypeGVKRequired)
164+
requiredGVKs, err := loadFromEntity[[]GVKRequired](b.Entity, property.TypeGVKRequired, optional)
158165
if err != nil {
159166
return fmt.Errorf("error determining bundle required gvks for entity '%s': %w", b.ID, err)
160167
}
@@ -167,7 +174,7 @@ func (b *BundleEntity) loadRequiredPackages() error {
167174
b.mu.Lock()
168175
defer b.mu.Unlock()
169176
if b.requiredPackages == nil {
170-
requiredPackages, err := loadFromEntity[[]PackageRequired](b.Entity, property.TypePackageRequired)
177+
requiredPackages, err := loadFromEntity[[]PackageRequired](b.Entity, property.TypePackageRequired, optional)
171178
if err != nil {
172179
return fmt.Errorf("error determining bundle required packages for entity '%s': %w", b.ID, err)
173180
}
@@ -187,7 +194,7 @@ func (b *BundleEntity) loadChannelProperties() error {
187194
b.mu.Lock()
188195
defer b.mu.Unlock()
189196
if b.channelProperties == nil {
190-
channel, err := loadFromEntity[ChannelProperties](b.Entity, property.TypeChannel)
197+
channel, err := loadFromEntity[ChannelProperties](b.Entity, property.TypeChannel, required)
191198
if err != nil {
192199
return fmt.Errorf("error determining bundle channel properties for entity '%s': %w", b.ID, err)
193200
}
@@ -200,7 +207,7 @@ func (b *BundleEntity) loadBundlePath() error {
200207
b.mu.Lock()
201208
defer b.mu.Unlock()
202209
if b.bundlePath == "" {
203-
bundlePath, err := loadFromEntity[string](b.Entity, PropertyBundlePath)
210+
bundlePath, err := loadFromEntity[string](b.Entity, PropertyBundlePath, required)
204211
if err != nil {
205212
return fmt.Errorf("error determining bundle path for entity '%s': %w", b.ID, err)
206213
}
@@ -209,15 +216,15 @@ func (b *BundleEntity) loadBundlePath() error {
209216
return nil
210217
}
211218

212-
func loadFromEntity[T interface{}](entity *input.Entity, propertyName string) (T, error) {
219+
func loadFromEntity[T interface{}](entity *input.Entity, propertyName string, required propertyRequirement) (T, error) {
213220
deserializedProperty := *new(T)
214221
propertyValue, ok := entity.Properties[propertyName]
215-
if !ok {
216-
return deserializedProperty, fmt.Errorf("property '%s' not found", propertyName)
217-
}
218-
219-
if err := json.Unmarshal([]byte(propertyValue), &deserializedProperty); err != nil {
220-
return deserializedProperty, fmt.Errorf("property '%s' ('%s') could not be parsed: %w", propertyName, propertyValue, err)
222+
if ok {
223+
if err := json.Unmarshal([]byte(propertyValue), &deserializedProperty); err != nil {
224+
return deserializedProperty, fmt.Errorf("property '%s' ('%s') could not be parsed: %w", propertyName, propertyValue, err)
225+
}
226+
} else if required {
227+
return deserializedProperty, fmt.Errorf("required property '%s' not found", propertyName)
221228
}
222229
return deserializedProperty, nil
223230
}

internal/resolution/variable_sources/entity/bundle_entity_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ var _ = Describe("BundleEntity", func() {
3333
bundleEntity := olmentity.NewBundleEntity(entity)
3434
packageName, err := bundleEntity.PackageName()
3535
Expect(packageName).To(Equal(""))
36-
Expect(err.Error()).To(Equal("error determining package for entity 'operatorhub/prometheus/0.14.0': property 'olm.package' not found"))
36+
Expect(err.Error()).To(Equal("error determining package for entity 'operatorhub/prometheus/0.14.0': required property 'olm.package' not found"))
3737
})
3838
It("should return error if the property is malformed", func() {
3939
entity := input.NewEntity("operatorhub/prometheus/0.14.0", map[string]string{
@@ -61,7 +61,7 @@ var _ = Describe("BundleEntity", func() {
6161
bundleEntity := olmentity.NewBundleEntity(entity)
6262
version, err := bundleEntity.Version()
6363
Expect(version).To(BeNil())
64-
Expect(err.Error()).To(Equal("error determining package for entity 'operatorhub/prometheus/0.14.0': property 'olm.package' not found"))
64+
Expect(err.Error()).To(Equal("error determining package for entity 'operatorhub/prometheus/0.14.0': required property 'olm.package' not found"))
6565
})
6666
It("should return error if the property is malformed", func() {
6767
entity := input.NewEntity("operatorhub/prometheus/0.14.0", map[string]string{
@@ -101,7 +101,7 @@ var _ = Describe("BundleEntity", func() {
101101
bundleEntity := olmentity.NewBundleEntity(entity)
102102
providedGvks, err := bundleEntity.ProvidedGVKs()
103103
Expect(providedGvks).To(BeNil())
104-
Expect(err.Error()).To(Equal("error determining bundle provided gvks for entity 'operatorhub/prometheus/0.14.0': property 'olm.gvk' not found"))
104+
Expect(err).To(BeNil())
105105
})
106106
It("should return error if the property is malformed", func() {
107107
entity := input.NewEntity("operatorhub/prometheus/0.14.0", map[string]string{
@@ -132,7 +132,7 @@ var _ = Describe("BundleEntity", func() {
132132
bundleEntity := olmentity.NewBundleEntity(entity)
133133
requiredGvks, err := bundleEntity.RequiredGVKs()
134134
Expect(requiredGvks).To(BeNil())
135-
Expect(err.Error()).To(Equal("error determining bundle required gvks for entity 'operatorhub/prometheus/0.14.0': property 'olm.gvk.required' not found"))
135+
Expect(err).To(BeNil())
136136
})
137137
It("should return error if the property is malformed", func() {
138138
entity := input.NewEntity("operatorhub/prometheus/0.14.0", map[string]string{
@@ -163,7 +163,7 @@ var _ = Describe("BundleEntity", func() {
163163
bundleEntity := olmentity.NewBundleEntity(entity)
164164
requiredPackages, err := bundleEntity.RequiredPackages()
165165
Expect(requiredPackages).To(BeNil())
166-
Expect(err.Error()).To(Equal("error determining bundle required packages for entity 'operatorhub/prometheus/0.14.0': property 'olm.package.required' not found"))
166+
Expect(err).To(BeNil())
167167
})
168168
It("should return error if the property is malformed", func() {
169169
entity := input.NewEntity("operatorhub/prometheus/0.14.0", map[string]string{
@@ -191,7 +191,7 @@ var _ = Describe("BundleEntity", func() {
191191
bundleEntity := olmentity.NewBundleEntity(entity)
192192
channelName, err := bundleEntity.ChannelName()
193193
Expect(channelName).To(BeEmpty())
194-
Expect(err.Error()).To(Equal("error determining bundle channel properties for entity 'operatorhub/prometheus/0.14.0': property 'olm.channel' not found"))
194+
Expect(err.Error()).To(Equal("error determining bundle channel properties for entity 'operatorhub/prometheus/0.14.0': required property 'olm.channel' not found"))
195195
})
196196
It("should return error if the property is malformed", func() {
197197
entity := input.NewEntity("operatorhub/prometheus/0.14.0", map[string]string{
@@ -227,7 +227,7 @@ var _ = Describe("BundleEntity", func() {
227227
bundleEntity := olmentity.NewBundleEntity(entity)
228228
channelProperties, err := bundleEntity.ChannelProperties()
229229
Expect(channelProperties).To(BeNil())
230-
Expect(err.Error()).To(Equal("error determining bundle channel properties for entity 'operatorhub/prometheus/0.14.0': property 'olm.channel' not found"))
230+
Expect(err.Error()).To(Equal("error determining bundle channel properties for entity 'operatorhub/prometheus/0.14.0': required property 'olm.channel' not found"))
231231
})
232232
It("should return error if the property is malformed", func() {
233233
entity := input.NewEntity("operatorhub/prometheus/0.14.0", map[string]string{
@@ -255,7 +255,7 @@ var _ = Describe("BundleEntity", func() {
255255
bundleEntity := olmentity.NewBundleEntity(entity)
256256
bundlePath, err := bundleEntity.BundlePath()
257257
Expect(bundlePath).To(BeEmpty())
258-
Expect(err.Error()).To(Equal("error determining bundle path for entity 'operatorhub/prometheus/0.14.0': property 'olm.bundle.path' not found"))
258+
Expect(err.Error()).To(Equal("error determining bundle path for entity 'operatorhub/prometheus/0.14.0': required property 'olm.bundle.path' not found"))
259259
})
260260
It("should return error if the property is malformed", func() {
261261
entity := input.NewEntity("operatorhub/prometheus/0.14.0", map[string]string{

0 commit comments

Comments
 (0)