Skip to content

Commit 41892f5

Browse files
committedJul 7, 2020
feat(deps): nest dependency values
this places a `value` key at the top of the dependency schema
1 parent f82ee8b commit 41892f5

File tree

23 files changed

+291
-308
lines changed

23 files changed

+291
-308
lines changed
 

‎Makefile

+6-4
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,29 @@ PKG := github.com/operator-framework/operator-registry
66
GIT_COMMIT := $(shell git rev-parse --short HEAD)
77
OPM_VERSION := $(shell cat OPM_VERSION)
88
BUILD_DATE := $(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
9+
TAGS := -tags "json1"
910

1011

1112
.PHONY: all
1213
all: clean test build
1314

1415
$(CMDS):
15-
$(GO) build $(extra_flags) -o $@ ./cmd/$(notdir $@)
16+
$(GO) build $(extra_flags) $(TAGS) -o $@ ./cmd/$(notdir $@)
17+
1618
$(OPM): opm_version_flags=-ldflags "-X '$(PKG)/cmd/opm/version.gitCommit=$(GIT_COMMIT)' -X '$(PKG)/cmd/opm/version.opmVersion=$(OPM_VERSION)' -X '$(PKG)/cmd/opm/version.buildDate=$(BUILD_DATE)'"
1719
$(OPM):
18-
$(GO) build $(opm_version_flags) $(extra_flags) -o $@ ./cmd/$(notdir $@)
20+
$(GO) build $(opm_version_flags) $(extra_flags) $(TAGS) -o $@ ./cmd/$(notdir $@)
1921

2022
.PHONY: build
2123
build: clean $(CMDS) $(OPM)
2224

2325
.PHONY: static
24-
static: extra_flags=-ldflags '-w -extldflags "-static"'
26+
static: extra_flags=-ldflags '-w -extldflags "-static"' -tags "json1"
2527
static: build
2628

2729
.PHONY: unit
2830
unit:
29-
$(GO) test $(SPECIFIC_UNIT_TEST) -count=1 -v -race ./pkg/...
31+
$(GO) test $(SPECIFIC_UNIT_TEST) $(TAGS) -count=1 -v -race ./pkg/...
3032

3133
.PHONY: image
3234
image:
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
dependencies:
2-
- type: olm.gvk
2+
- type: olm.gvk
3+
value:
34
group: testapi.coreos.com
45
kind: testapi
56
version: v1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
dependencies:
22
- type: olm.package
3-
packageName: testoperator
4-
version: "> 0.2.0"
3+
value:
4+
packageName: testoperator
5+
version: "> 0.2.0"
56
- type: olm.gvk
6-
group: testprometheus.coreos.com
7-
kind: testtestprometheus
8-
version: v1
7+
value:
8+
group: testprometheus.coreos.com
9+
kind: testtestprometheus
10+
version: v1

‎cmd/registry-server/main.go

-1
Original file line numberDiff line numberDiff line change
@@ -142,4 +142,3 @@ func migrate(cmd *cobra.Command, db *sql.DB) error {
142142

143143
return migrator.Migrate(context.TODO())
144144
}
145-

‎docs/design/operator-bundle.md

+7-5
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,14 @@ An example of a `dependencies.yaml` that specifies Prometheus operator and etcd
7676
```
7777
dependencies:
7878
- type: olm.package
79-
packageName: prometheus
80-
version: >0.27.0
79+
value:
80+
packageName: prometheus
81+
version: >0.27.0
8182
- type: olm.gvk
82-
group: etcd.database.coreos.com
83-
kind: EtcdCluster
84-
version: v1beta2
83+
value:
84+
group: etcd.database.coreos.com
85+
kind: EtcdCluster
86+
version: v1beta2
8587
```
8688

8789
### Bundle Dockerfile

‎pkg/api/registry.proto

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ service Registry {
1212
rpc GetChannelEntriesThatProvide(GetAllProvidersRequest) returns (stream ChannelEntry) {}
1313
rpc GetLatestChannelEntriesThatProvide(GetLatestProvidersRequest) returns (stream ChannelEntry) {}
1414
rpc GetDefaultBundleThatProvides(GetDefaultProviderRequest) returns (Bundle) {}
15-
rpc ListBundles(ListBundlesRequest) returns (stream Bundle) {}
15+
rpc ListBundles(ListBundlesRequest) returns (stream Bundle) {}
1616
}
1717

1818

@@ -59,8 +59,8 @@ message Bundle{
5959
repeated GroupVersionKind requiredApis = 8;
6060
string version = 9;
6161
string skipRange = 10;
62-
repeated Dependency dependencies = 11;
63-
repeated Property properties = 12;
62+
repeated Dependency dependencies = 11;
63+
repeated Property properties = 12;
6464
}
6565

6666
message ChannelEntry{
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
dependencies:
22
- type: olm.crd
3-
group: test.coreos.com
4-
version: v1alpha1
5-
kind: testcrd
3+
value:
4+
group: test.coreos.com
5+
version: v1alpha1
6+
kind: testcrd
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
dependencies:
22
- type: olm.package
3-
version: "0.2.0"
3+
value:
4+
version: "0.2.0"
45
- type: olm.package
5-
packageName: testoperator
6-
version: ">!0.2.0"
6+
value:
7+
packageName: testoperator
8+
version: ">!0.2.0"
79
- type: olm.package
8-
packageName: testoperator2
10+
value:
11+
packageName: testoperator2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
dependencies:
22
- type: olm.package
3-
packgeName: testoperator
4-
version: >0.2.0
3+
value:
4+
packgeName: testoperator
5+
version: >0.2.0
56
- type: olm.gvk
6-
group: test.coreos.com
7-
kind: testapi
8-
version: v1
7+
group: test.coreos.com
8+
kind: testapi
9+
version: v1

‎pkg/lib/bundle/validate.go

+3-29
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func (i imageValidator) ValidateBundleFormat(directory string) error {
124124
}
125125

126126
if !dependenciesFound {
127-
err = parseDependenciesFile(filepath.Join(metadataDir, f.Name()), dependenciesFile)
127+
err = registry.DecodeFile(filepath.Join(metadataDir, f.Name()), &dependenciesFile)
128128
if err == nil && len(dependenciesFile.Dependencies) > 0 {
129129
dependenciesFound = true
130130
}
@@ -225,10 +225,10 @@ func validateDependencies(dependenciesFile *registry.DependenciesFile) []error {
225225
case registry.PackageDependency:
226226
errs = dp.Validate()
227227
default:
228-
errs = append(errs, fmt.Errorf("Unsupported dependency type %s", d.GetType()))
228+
errs = append(errs, fmt.Errorf("unsupported dependency type %s", d.GetType()))
229229
}
230230
} else {
231-
errs = append(errs, fmt.Errorf("Unsupported dependency type %s", d.GetType()))
231+
errs = append(errs, fmt.Errorf("couldn't parse dependency of type %s", d.GetType()))
232232
}
233233
validationErrors = append(validationErrors, errs...)
234234
}
@@ -373,32 +373,6 @@ func (i imageValidator) ValidateBundleContent(manifestDir string) error {
373373
return nil
374374
}
375375

376-
func parseDependenciesFile(path string, depFile *registry.DependenciesFile) error {
377-
deps := registry.Dependencies{}
378-
err := registry.DecodeFile(path, &deps)
379-
380-
if err != nil || len(deps.RawMessage) == 0 {
381-
return fmt.Errorf("Unable to decode the dependencies file %s", path)
382-
}
383-
384-
depList := []registry.Dependency{}
385-
for _, v := range deps.RawMessage {
386-
jsonStr, _ := json.Marshal(v)
387-
dep := registry.Dependency{}
388-
err := json.Unmarshal(jsonStr, &dep)
389-
if err != nil {
390-
return err
391-
}
392-
393-
dep.Value = string(jsonStr)
394-
depList = append(depList, dep)
395-
}
396-
397-
depFile.Dependencies = depList
398-
399-
return nil
400-
}
401-
402376
// Validate if the file is kubecle-able
403377
func validateKubectlable(fileBytes []byte) error {
404378
exampleFileBytesJSON, err := y.YAMLToJSON(fileBytes)

‎pkg/lib/bundle/validate_test.go

+11-17
Original file line numberDiff line numberDiff line change
@@ -33,51 +33,45 @@ func TestValidateBundleDependencies(t *testing.T) {
3333
description string
3434
mediaType string
3535
directory string
36-
errStrings map[string]struct{}
36+
errs []error
3737
}{
3838
{
3939
description: "registryv1 bundle/invalid gvk dependency",
4040
mediaType: RegistryV1Type,
4141
directory: "./testdata/validate/invalid_dependencies_bundle/invalid_gvk_dependency/",
42-
errStrings: map[string]struct{}{
43-
"API Group is empty": struct{}{},
44-
"API Version is empty": struct{}{},
45-
"API Kind is empty": struct{}{},
42+
errs: []error{
43+
fmt.Errorf("couldn't parse dependency of type olm.gvk"),
4644
},
4745
},
4846
{
4947
description: "registryv1 bundle/invalid package dependency",
5048
mediaType: RegistryV1Type,
5149
directory: "./testdata/validate/invalid_dependencies_bundle/invalid_package_dependency/",
52-
errStrings: map[string]struct{}{
53-
"Invalid semver format version": struct{}{},
54-
"Package version is empty": struct{}{},
55-
"Package name is empty": struct{}{},
50+
errs: []error{
51+
fmt.Errorf("Invalid semver format version"),
52+
fmt.Errorf("Package version is empty"),
53+
fmt.Errorf("Package name is empty"),
5654
},
5755
},
5856
{
5957
description: "registryv1 bundle/invalid dependency type",
6058
mediaType: RegistryV1Type,
6159
directory: "./testdata/validate/invalid_dependencies_bundle/invalid_dependency_type/",
62-
errStrings: map[string]struct{}{
63-
"Unsupported dependency type olm.crd": struct{}{},
60+
errs: []error{
61+
fmt.Errorf("couldn't parse dependency of type olm.crd"),
6462
},
6563
},
6664
}
6765

68-
for i, tt := range table {
66+
for _, tt := range table {
6967
fmt.Println(tt.directory)
7068
err := validator.ValidateBundleFormat(tt.directory)
7169
var validationError ValidationError
7270
if err != nil {
7371
isValidationErr := errors.As(err, &validationError)
7472
require.True(t, isValidationErr)
7573
}
76-
require.Len(t, validationError.Errors, len(tt.errStrings), table[i].description)
77-
for _, e := range validationError.Errors {
78-
_, ok := tt.errStrings[e.Error()]
79-
require.True(t, ok, "Unable to find this error %s", e.Error())
80-
}
74+
require.ElementsMatch(t, tt.errs, validationError.Errors)
8175
}
8276
}
8377

‎pkg/registry/bundle.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ import (
1616

1717
const (
1818
v1beta1CRDVersion = "v1beta1"
19-
v1CRDVersion = "v1"
20-
CRDKind = "CustomResourceDefinition"
19+
v1CRDVersion = "v1"
20+
CRDKind = "CustomResourceDefinition"
2121
)
22+
2223
// Scheme is the default instance of runtime.Scheme to which types in the Kubernetes API are already registered.
2324
var Scheme = runtime.NewScheme()
2425

‎pkg/registry/imageinput.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,11 @@ func NewImageInput(to image.Reference, from string) (*ImageInput, error) {
4949
}
5050

5151
if !dependenciesFound {
52-
err = parseDependenciesFile(filepath.Join(metadata, f.Name()), dependenciesFile)
53-
if err == nil && len(dependenciesFile.Dependencies) > 0 {
52+
err = DecodeFile(filepath.Join(metadata, f.Name()), &dependenciesFile)
53+
if err != nil {
54+
return nil, err
55+
}
56+
if len(dependenciesFile.Dependencies) > 0 {
5457
dependenciesFound = true
5558
}
5659
}

‎pkg/registry/populator.go

+1-34
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package registry
22

33
import (
44
"context"
5-
"encoding/json"
65
"errors"
76
"fmt"
87
"io/ioutil"
@@ -19,7 +18,7 @@ import (
1918
)
2019

2120
type Dependencies struct {
22-
RawMessage []map[string]string `json:"dependencies" yaml:"dependencies"`
21+
RawMessage []map[string]interface{} `json:"dependencies" yaml:"dependencies"`
2322
}
2423

2524
// DirectoryPopulator loads an unpacked operator bundle from a directory into the database.
@@ -371,35 +370,3 @@ func DecodeFile(path string, into interface{}) error {
371370

372371
return decoder.Decode(into)
373372
}
374-
375-
func parseDependenciesFile(path string, depFile *DependenciesFile) error {
376-
deps := Dependencies{}
377-
err := DecodeFile(path, &deps)
378-
if err != nil || len(deps.RawMessage) == 0 {
379-
return fmt.Errorf("Unable to decode the dependencies file %s", path)
380-
}
381-
depList := []Dependency{}
382-
for _, v := range deps.RawMessage {
383-
// convert map to json
384-
jsonStr, _ := json.Marshal(v)
385-
386-
// Check dependency type
387-
dep := Dependency{}
388-
err := json.Unmarshal(jsonStr, &dep)
389-
if err != nil {
390-
return err
391-
}
392-
393-
switch dep.GetType() {
394-
case GVKType, PackageType:
395-
dep.Value = string(jsonStr)
396-
default:
397-
return fmt.Errorf("Unsupported dependency type %s", dep.GetType())
398-
}
399-
depList = append(depList, dep)
400-
}
401-
402-
depFile.Dependencies = depList
403-
404-
return nil
405-
}

0 commit comments

Comments
 (0)
Please sign in to comment.