diff --git a/pkg/validation/internal/bundle.go b/pkg/validation/internal/bundle.go deleted file mode 100644 index 973151274..000000000 --- a/pkg/validation/internal/bundle.go +++ /dev/null @@ -1,103 +0,0 @@ -package internal - -import ( - "fmt" - - "github.com/operator-framework/api/pkg/validation/errors" - interfaces "github.com/operator-framework/api/pkg/validation/interfaces" - - "github.com/operator-framework/operator-registry/pkg/registry" -) - -var BundleValidator interfaces.Validator = interfaces.ValidatorFunc(validateBundles) - -func validateBundles(objs ...interface{}) (results []errors.ManifestResult) { - for _, obj := range objs { - switch v := obj.(type) { - case *registry.Bundle: - results = append(results, validateBundle(v)) - } - } - return results -} - -func validateBundle(bundle *registry.Bundle) (result errors.ManifestResult) { - csv, err := bundle.ClusterServiceVersion() - if err != nil { - result.Add(errors.ErrInvalidParse("error getting bundle CSV", err)) - return result - } - - result = validateOwnedCRDs(bundle, csv) - - if result.Name, err = csv.GetVersion(); err != nil { - result.Add(errors.ErrInvalidParse("error getting bundle CSV version", err)) - return result - } - return result -} - -func validateOwnedCRDs(bundle *registry.Bundle, csv *registry.ClusterServiceVersion) (result errors.ManifestResult) { - ownedKeys, _, err := csv.GetCustomResourceDefintions() - if err != nil { - result.Add(errors.ErrInvalidParse("error getting CSV CRDs", err)) - return result - } - - keySet, rerr := getBundleCRDKeys(bundle) - if rerr != (errors.Error{}) { - result.Add(rerr) - return result - } - - // Validate all owned keys, and remove them from the set if seen. - for _, ownedKey := range ownedKeys { - if _, ok := keySet[*ownedKey]; !ok { - result.Add(errors.ErrInvalidBundle(fmt.Sprintf("owned CRD %s not found in bundle %q", keyToString(*ownedKey), bundle.Name), *ownedKey)) - } else { - delete(keySet, *ownedKey) - } - } - // CRDs not defined in the CSV present in the bundle - for key := range keySet { - result.Add(errors.WarnInvalidBundle(fmt.Sprintf("CRD %s is present in bundle %q but not defined in CSV", keyToString(key), bundle.Name), key)) - } - return result -} - -func getBundleCRDKeys(bundle *registry.Bundle) (map[registry.DefinitionKey]struct{}, errors.Error) { - crds, err := bundle.CustomResourceDefinitions() - if err != nil { - return nil, errors.ErrInvalidParse("error getting bundle CRDs", err) - } - keySet := map[registry.DefinitionKey]struct{}{} - for _, crd := range crds { - if len(crd.Spec.Versions) == 0 { - // Skip group, which CSVs do not support. - key := registry.DefinitionKey{ - Name: crd.GetName(), - Version: crd.Spec.Version, - Kind: crd.Spec.Names.Kind, - } - keySet[key] = struct{}{} - } else { - for _, version := range crd.Spec.Versions { - // Skip group, which CSVs do not support. - key := registry.DefinitionKey{ - Name: crd.GetName(), - Version: version.Name, - Kind: crd.Spec.Names.Kind, - } - keySet[key] = struct{}{} - } - } - } - return keySet, errors.Error{} -} - -func keyToString(key registry.DefinitionKey) string { - if key.Name == "" { - return fmt.Sprintf("%s/%s %s", key.Group, key.Version, key.Kind) - } - return fmt.Sprintf("%s/%s", key.Name, key.Version) -} diff --git a/pkg/validation/internal/bundle_test.go b/pkg/validation/internal/bundle_test.go deleted file mode 100644 index 93e8414fe..000000000 --- a/pkg/validation/internal/bundle_test.go +++ /dev/null @@ -1,73 +0,0 @@ -package internal - -import ( - "io/ioutil" - "path/filepath" - "strings" - "testing" - - "github.com/operator-framework/operator-registry/pkg/registry" - "github.com/stretchr/testify/require" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - - k8syaml "k8s.io/apimachinery/pkg/util/yaml" -) - -func TestValidateBundle(t *testing.T) { - var table = []struct { - description string - directory string - hasError bool - errString string - }{ - { - description: "registryv1 bundle/valid bundle", - directory: "./testdata/valid_bundle", - hasError: false, - }, - { - description: "registryv1 bundle/invalid bundle", - directory: "./testdata/invalid_bundle", - hasError: true, - errString: "owned CRD etcdclusters.etcd.database.coreos.com/v1beta2 not found in bundle", - }, - { - description: "registryv1 bundle/invalid bundle 2", - directory: "./testdata/invalid_bundle_2", - hasError: true, - errString: `CRD etcdclusters.etcd.database.coreos.com/v1beta2 is present in bundle "test" but not defined in CSV`, - }, - } - - for _, tt := range table { - unstObjs := []*unstructured.Unstructured{} - - // Read all files in manifests directory - items, err := ioutil.ReadDir(tt.directory) - require.NoError(t, err, "Unable to read directory: %s", tt.description) - - for _, item := range items { - fileWithPath := filepath.Join(tt.directory, item.Name()) - data, err := ioutil.ReadFile(fileWithPath) - require.NoError(t, err, "Unable to read file: %s", fileWithPath) - - dec := k8syaml.NewYAMLOrJSONDecoder(strings.NewReader(string(data)), 30) - k8sFile := &unstructured.Unstructured{} - err = dec.Decode(k8sFile) - require.NoError(t, err, "Unable to decode file: %s", fileWithPath) - - unstObjs = append(unstObjs, k8sFile) - } - - // Validate the bundle object - bundle := registry.NewBundle("test", "", nil, unstObjs...) - results := BundleValidator.Validate(bundle) - - if len(results) > 0 { - require.Equal(t, tt.hasError, results[0].HasError(), "%s: %s", tt.description, results[0]) - if results[0].HasError() { - require.Contains(t, results[0].Errors[0].Error(), tt.errString) - } - } - } -} diff --git a/pkg/validation/validation.go b/pkg/validation/validation.go index ffe01f2ef..796c6e5e7 100644 --- a/pkg/validation/validation.go +++ b/pkg/validation/validation.go @@ -24,9 +24,6 @@ var ClusterServiceVersionValidator = internal.CSVValidator // CustomResourceDefinitions. var CustomResourceDefinitionValidator = internal.CRDValidator -// BundleValidator implements Validator to validate Bundles. -var BundleValidator = internal.BundleValidator - // PackageUpdateGraphValidator implements Validator to validate the // package update graph between a package manifest and Bundles. var PackageUpdateGraphValidator = internal.PackageUpdateGraphValidator @@ -36,6 +33,5 @@ var AllValidators = interfaces.Validators{ PackageManifestValidator, ClusterServiceVersionValidator, CustomResourceDefinitionValidator, - BundleValidator, PackageUpdateGraphValidator, }