From 12a4e7d128da512e0ea09d3b4b3d2983a70446ff Mon Sep 17 00:00:00 2001 From: Alena Varkockova Date: Wed, 18 Sep 2019 10:48:08 +0200 Subject: [PATCH] Get rid of word bundle and use package everywhere (#834) --- keps/0009-operator-toolkit.md | 2 +- pkg/bundle/operator.go | 20 --- pkg/kudoctl/bundle/finder/bundle_finder.go | 115 ------------------ pkg/kudoctl/cmd/install/install.go | 16 +-- pkg/kudoctl/cmd/install/install_test.go | 4 +- pkg/kudoctl/cmd/package.go | 4 +- pkg/kudoctl/cmd/package_test.go | 8 +- pkg/kudoctl/cmd/repo_index_test.go | 2 +- pkg/kudoctl/packages/finder/package_finder.go | 115 ++++++++++++++++++ .../finder/package_finder_test.go} | 18 +-- pkg/kudoctl/{bundle => packages}/package.go | 24 +++- .../bundle.go => packages/package_manager.go} | 44 +++---- .../{bundle => packages}/package_test.go | 6 +- pkg/kudoctl/{bundle => packages}/tar.go | 2 +- pkg/kudoctl/{bundle => packages}/tar_test.go | 2 +- .../testdata/zk-crd-golden1/instance.golden | 0 .../testdata/zk-crd-golden1/operator.golden | 0 .../zk-crd-golden1/operatorversion.golden | 0 .../testdata/zk-crd-golden2/instance.golden | 0 .../testdata/zk-crd-golden2/operator.golden | 0 .../zk-crd-golden2/operatorversion.golden | 0 .../{bundle => packages}/testdata/zk.tgz | Bin .../testdata/zk/operator.yaml | 0 .../testdata/zk/params.yaml | 0 .../testdata/zk/templates/pdb.yaml | 0 .../testdata/zk/templates/services.yaml | 0 .../testdata/zk/templates/statefulset.yaml | 0 .../testdata/zk/templates/validation.yaml | 0 pkg/kudoctl/util/repo/index.go | 10 +- pkg/kudoctl/util/repo/index_test.go | 9 +- pkg/kudoctl/util/repo/repo_operator.go | 18 +-- 31 files changed, 206 insertions(+), 213 deletions(-) delete mode 100644 pkg/bundle/operator.go delete mode 100644 pkg/kudoctl/bundle/finder/bundle_finder.go create mode 100644 pkg/kudoctl/packages/finder/package_finder.go rename pkg/kudoctl/{bundle/finder/bundle_finder_test.go => packages/finder/package_finder_test.go} (55%) rename pkg/kudoctl/{bundle => packages}/package.go (87%) rename pkg/kudoctl/{bundle/bundle.go => packages/package_manager.go} (76%) rename pkg/kudoctl/{bundle => packages}/package_test.go (97%) rename pkg/kudoctl/{bundle => packages}/tar.go (99%) rename pkg/kudoctl/{bundle => packages}/tar_test.go (97%) rename pkg/kudoctl/{bundle => packages}/testdata/zk-crd-golden1/instance.golden (100%) rename pkg/kudoctl/{bundle => packages}/testdata/zk-crd-golden1/operator.golden (100%) rename pkg/kudoctl/{bundle => packages}/testdata/zk-crd-golden1/operatorversion.golden (100%) rename pkg/kudoctl/{bundle => packages}/testdata/zk-crd-golden2/instance.golden (100%) rename pkg/kudoctl/{bundle => packages}/testdata/zk-crd-golden2/operator.golden (100%) rename pkg/kudoctl/{bundle => packages}/testdata/zk-crd-golden2/operatorversion.golden (100%) rename pkg/kudoctl/{bundle => packages}/testdata/zk.tgz (100%) rename pkg/kudoctl/{bundle => packages}/testdata/zk/operator.yaml (100%) rename pkg/kudoctl/{bundle => packages}/testdata/zk/params.yaml (100%) rename pkg/kudoctl/{bundle => packages}/testdata/zk/templates/pdb.yaml (100%) rename pkg/kudoctl/{bundle => packages}/testdata/zk/templates/services.yaml (100%) rename pkg/kudoctl/{bundle => packages}/testdata/zk/templates/statefulset.yaml (100%) rename pkg/kudoctl/{bundle => packages}/testdata/zk/templates/validation.yaml (100%) diff --git a/keps/0009-operator-toolkit.md b/keps/0009-operator-toolkit.md index 597f27e70..3205129c2 100644 --- a/keps/0009-operator-toolkit.md +++ b/keps/0009-operator-toolkit.md @@ -85,7 +85,7 @@ These combine to form an operator responsible for the deployment, upgrading, and ### Operator Organization -An operator bundle is a folder that contains all of the manifests needed to create or extend a KUDO operator. In the most basic form, an operator bundle is structured in the following format: +An operator package is a folder that contains all of the manifests needed to create or extend a KUDO operator. In the most basic form, an operator bundle is structured in the following format: ```bash . diff --git a/pkg/bundle/operator.go b/pkg/bundle/operator.go deleted file mode 100644 index 6a982d069..000000000 --- a/pkg/bundle/operator.go +++ /dev/null @@ -1,20 +0,0 @@ -package bundle - -import "github.com/kudobuilder/kudo/pkg/apis/kudo/v1alpha1" - -//TODO (kensipe): Switch Maintainers to RepoName Maintainer: https://github.com/kudobuilder/kudo/blob/master/pkg/kudoctl/util/repo/repo.go#L43 - -// Operator is a representation of the KEP-9 Operator YAML -type Operator struct { - Name string `json:"name"` - Description string `json:"description,omitempty"` - Version string `json:"version"` - AppVersion string `json:"appVersion,omitempty"` - KUDOVersion string `json:"kudoVersion,omitempty"` - KubernetesVersion string `json:"kubernetesVersion,omitempty"` - Maintainers []*v1alpha1.Maintainer `json:"maintainers,omitempty"` - URL string `json:"url,omitempty"` - Tasks map[string]v1alpha1.TaskSpec `json:"tasks"` - Plans map[string]v1alpha1.Plan `json:"plans"` - Dependencies []v1alpha1.OperatorDependency `json:"dependencies,omitempty"` -} diff --git a/pkg/kudoctl/bundle/finder/bundle_finder.go b/pkg/kudoctl/bundle/finder/bundle_finder.go deleted file mode 100644 index 3f0f2f51b..000000000 --- a/pkg/kudoctl/bundle/finder/bundle_finder.go +++ /dev/null @@ -1,115 +0,0 @@ -package finder - -import ( - "fmt" - "io" - - "github.com/kudobuilder/kudo/pkg/kudoctl/bundle" - "github.com/kudobuilder/kudo/pkg/kudoctl/http" - "github.com/spf13/afero" -) - -// Finder is a bundle finder and is any implementation which can find/discover a bundle. -// Even Repos are finders. Local and URL Finders current do nothing with the version information. -type Finder interface { - GetBundle(name string, version string) (bundle.Bundle, error) -} - -// LocalFinder will find local operator bundle: folders or tgz -type LocalFinder struct { - fs afero.Fs -} - -// URLFinder will find an operator bundle from a url -type URLFinder struct { - client http.Client -} - -// Manager is the source of finder of operator bundles. -type Manager struct { - local *LocalFinder - uri *URLFinder -} - -// New creates an operator bundle finder for non-repository bundles -func New() *Manager { - lf := NewLocal() - uf := NewURL() - return &Manager{ - local: lf, - uri: uf, - } -} - -// GetBundle provides a one stop to acquire any non-repo bundle. We should refactor repo to be in the finder package and have manager manage it. -func (f *Manager) GetBundle(name string, version string) (bundle.Bundle, error) { - - // if local folder return the bundle - if _, err := f.local.fs.Stat(name); err == nil { - b, err := f.local.GetBundle(name, version) - if err != nil { - return nil, err - } - return b, nil - } - - // if url return that bundle - if http.IsValidURL(name) { - b, err := f.uri.GetBundle(name, version) - if err != nil { - return nil, err - } - return b, nil - } - - return nil, fmt.Errorf("finder: unable to find bundle for %v", name) -} - -// GetBundle provides a bundle for the url provided -func (f *URLFinder) GetBundle(name string, version string) (bundle.Bundle, error) { - // check to see if name is url - if !http.IsValidURL(name) { - return nil, fmt.Errorf("finder: url %v invalid", name) - } - reader, err := f.getBundleByURL(name) - if err != nil { - return nil, err - } - return bundle.NewBundleFromReader(reader), nil -} - -func (f *URLFinder) getBundleByURL(url string) (io.Reader, error) { - resp, err := f.client.Get(url) - if err != nil { - return nil, fmt.Errorf("finder: unable to get get reader from url %v", url) - } - - return resp, nil -} - -// GetBundle provides a bundle for the local folder or tarball provided -func (f *LocalFinder) GetBundle(name string, version string) (bundle.Bundle, error) { - // make sure file exists - _, err := f.fs.Stat(name) - if err != nil { - return nil, err - } - // order of discovery - // 1. tarball - // 2. file based - return bundle.NewBundle(f.fs, name) -} - -// NewLocal creates a finder for local operator bundles -func NewLocal() *LocalFinder { - return &LocalFinder{fs: afero.NewOsFs()} -} - -// NewURL creates an instance of a URLFinder -func NewURL() *URLFinder { - client := http.NewClient() - - return &URLFinder{ - client: *client, - } -} diff --git a/pkg/kudoctl/cmd/install/install.go b/pkg/kudoctl/cmd/install/install.go index fbc7e84fe..61cdaadb5 100644 --- a/pkg/kudoctl/cmd/install/install.go +++ b/pkg/kudoctl/cmd/install/install.go @@ -5,11 +5,11 @@ import ( "strings" "github.com/kudobuilder/kudo/pkg/apis/kudo/v1alpha1" - "github.com/kudobuilder/kudo/pkg/kudoctl/bundle" - "github.com/kudobuilder/kudo/pkg/kudoctl/bundle/finder" "github.com/kudobuilder/kudo/pkg/kudoctl/clog" "github.com/kudobuilder/kudo/pkg/kudoctl/env" "github.com/kudobuilder/kudo/pkg/kudoctl/http" + "github.com/kudobuilder/kudo/pkg/kudoctl/packages" + "github.com/kudobuilder/kudo/pkg/kudoctl/packages/finder" "github.com/kudobuilder/kudo/pkg/kudoctl/util/kudo" "github.com/kudobuilder/kudo/pkg/kudoctl/util/repo" @@ -61,13 +61,13 @@ func validate(args []string, options *Options) error { // - an operator name in the remote repository // in that order. Should there exist a local folder e.g. `cassandra` it will take precedence // over the remote repository package with the same name. -func GetPackageCRDs(name string, version string, repository repo.Repository) (*bundle.PackageCRDs, error) { +func GetPackageCRDs(name string, version string, repository repo.Repository) (*packages.PackageCRDs, error) { // Local files/folder have priority if _, err := os.Stat(name); err == nil { clog.V(2).Printf("local operator discovered: %v", name) f := finder.NewLocal() - b, err := f.GetBundle(name, version) + b, err := f.GetPackage(name, version) if err != nil { return nil, err } @@ -78,7 +78,7 @@ func GetPackageCRDs(name string, version string, repository repo.Repository) (*b if http.IsValidURL(name) { clog.V(3).Printf("operator using http protocol for %v", name) f := finder.NewURL() - b, err := f.GetBundle(name, version) + b, err := f.GetPackage(name, version) if err != nil { return nil, err } @@ -86,7 +86,7 @@ func GetPackageCRDs(name string, version string, repository repo.Repository) (*b } clog.V(3).Printf("no http discovered, looking for repository") - b, err := repository.GetBundle(name, version) + b, err := repository.GetPackage(name, version) if err != nil { return nil, err } @@ -118,7 +118,7 @@ func installOperator(operatorArgument string, options *Options, fs afero.Fs, set return installCrds(crds, kc, options, settings) } -func installCrds(crds *bundle.PackageCRDs, kc *kudo.Client, options *Options, settings *env.Settings) error { +func installCrds(crds *packages.PackageCRDs, kc *kudo.Client, options *Options, settings *env.Settings) error { // PRE-INSTALLATION SETUP operatorName := crds.Operator.ObjectMeta.Name clog.V(3).Printf("operator name: %v", operatorName) @@ -183,7 +183,7 @@ func installCrds(crds *bundle.PackageCRDs, kc *kudo.Client, options *Options, se return nil } -func validateCrds(crds *bundle.PackageCRDs, skipInstance bool) error { +func validateCrds(crds *packages.PackageCRDs, skipInstance bool) error { if skipInstance { // right now we are just validating parameters on instance, if we're not creating instance right now, there is nothing to validate clog.V(3).Printf("skipping instance...") diff --git a/pkg/kudoctl/cmd/install/install_test.go b/pkg/kudoctl/cmd/install/install_test.go index e3b05db49..470c8559b 100644 --- a/pkg/kudoctl/cmd/install/install_test.go +++ b/pkg/kudoctl/cmd/install/install_test.go @@ -4,8 +4,8 @@ import ( "fmt" "testing" - "github.com/kudobuilder/kudo/pkg/kudoctl/bundle" "github.com/kudobuilder/kudo/pkg/kudoctl/env" + "github.com/kudobuilder/kudo/pkg/kudoctl/packages" util "github.com/kudobuilder/kudo/pkg/util/kudo" "github.com/kudobuilder/kudo/pkg/apis/kudo/v1alpha1" @@ -41,7 +41,7 @@ func newTestClient() *kudo.Client { } func TestParameterValidation_InstallCrds(t *testing.T) { - crds := bundle.PackageCRDs{ + crds := packages.PackageCRDs{ Operator: &v1alpha1.Operator{ TypeMeta: metav1.TypeMeta{ APIVersion: "kudo.dev/v1alpha1", diff --git a/pkg/kudoctl/cmd/package.go b/pkg/kudoctl/cmd/package.go index 88d9ab402..f42710064 100644 --- a/pkg/kudoctl/cmd/package.go +++ b/pkg/kudoctl/cmd/package.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - "github.com/kudobuilder/kudo/pkg/kudoctl/bundle" + "github.com/kudobuilder/kudo/pkg/kudoctl/packages" "github.com/spf13/afero" "github.com/spf13/cobra" ) @@ -64,7 +64,7 @@ func validate(args []string) error { // run returns the errors associated with cmd env func (pkg *packageCmd) run() error { - tarfile, err := bundle.ToTarBundle(pkg.fs, pkg.path, pkg.destination, pkg.overwrite) + tarfile, err := packages.CreateTarball(pkg.fs, pkg.path, pkg.destination, pkg.overwrite) if err == nil { fmt.Fprintf(pkg.out, "Package created: %v\n", tarfile) } diff --git a/pkg/kudoctl/cmd/package_test.go b/pkg/kudoctl/cmd/package_test.go index 7a069bf95..2a889433b 100644 --- a/pkg/kudoctl/cmd/package_test.go +++ b/pkg/kudoctl/cmd/package_test.go @@ -21,14 +21,14 @@ var packageCmdArgs = []struct { {"valid operator", []string{"/opt/zk"}, ""}, // 4 } -func TestTableNewBundleCmd(t *testing.T) { +func TestTableNewPackageCmd(t *testing.T) { fs := afero.NewMemMapFs() testdir, _ := filepath.Abs("") fs.Mkdir(testdir, 0777) - files.CopyOperatorToFs(fs, "../bundle/testdata/zk", "/opt") + files.CopyOperatorToFs(fs, "../packages/testdata/zk", "/opt") for _, test := range packageCmdArgs { - newCmdBundle := newPackageCmd(fs, os.Stdout) - err := newCmdBundle.RunE(newCmdBundle, test.arg) + newCmd := newPackageCmd(fs, os.Stdout) + err := newCmd.RunE(newCmd, test.arg) if err != nil { assert.Equal(t, test.errorMessage, err.Error(), test.name) } diff --git a/pkg/kudoctl/cmd/repo_index_test.go b/pkg/kudoctl/cmd/repo_index_test.go index 2b9f32ce0..2c55d7cba 100644 --- a/pkg/kudoctl/cmd/repo_index_test.go +++ b/pkg/kudoctl/cmd/repo_index_test.go @@ -47,7 +47,7 @@ func TestRepoIndexCmd_IndexCreation(t *testing.T) { fs := afero.NewMemMapFs() testdir, _ := filepath.Abs("") fs.Mkdir(testdir, 0777) - files.CopyOperatorToFs(fs, "../bundle/testdata/zk.tgz", "/opt") + files.CopyOperatorToFs(fs, "../packages/testdata/zk.tgz", "/opt") time, _ := time.Parse(time.RFC3339, "2019-10-25T00:00:00Z") out := &bytes.Buffer{} diff --git a/pkg/kudoctl/packages/finder/package_finder.go b/pkg/kudoctl/packages/finder/package_finder.go new file mode 100644 index 000000000..4edef50bf --- /dev/null +++ b/pkg/kudoctl/packages/finder/package_finder.go @@ -0,0 +1,115 @@ +package finder + +import ( + "fmt" + "io" + + "github.com/kudobuilder/kudo/pkg/kudoctl/http" + "github.com/kudobuilder/kudo/pkg/kudoctl/packages" + "github.com/spf13/afero" +) + +// Finder is a packages finder and is any implementation which can find/discover a packages. +// Even Repos are finders. Local and URL Finders current do nothing with the version information. +type Finder interface { + GetPackage(name string, version string) (packages.Package, error) +} + +// LocalFinder will find local operator packages: folders or tgz +type LocalFinder struct { + fs afero.Fs +} + +// URLFinder will find an operator packages from a url +type URLFinder struct { + client http.Client +} + +// Manager is the source of finder of operator packages. +type Manager struct { + local *LocalFinder + uri *URLFinder +} + +// New creates an operator package finder for non-repository packages +func New() *Manager { + lf := NewLocal() + uf := NewURL() + return &Manager{ + local: lf, + uri: uf, + } +} + +// GetPackage provides a one stop to acquire any non-repo packages. We should refactor repo to be in the finder package and have manager manage it. +func (f *Manager) GetPackage(name string, version string) (packages.Package, error) { + + // if local folder return the package + if _, err := f.local.fs.Stat(name); err == nil { + b, err := f.local.GetPackage(name, version) + if err != nil { + return nil, err + } + return b, nil + } + + // if url return that package + if http.IsValidURL(name) { + b, err := f.uri.GetPackage(name, version) + if err != nil { + return nil, err + } + return b, nil + } + + return nil, fmt.Errorf("finder: unable to find packages for %v", name) +} + +// GetPackage provides a package for the url provided +func (f *URLFinder) GetPackage(name string, version string) (packages.Package, error) { + // check to see if name is url + if !http.IsValidURL(name) { + return nil, fmt.Errorf("finder: url %v invalid", name) + } + reader, err := f.getPackageByURL(name) + if err != nil { + return nil, err + } + return packages.NewPackageFromReader(reader), nil +} + +func (f *URLFinder) getPackageByURL(url string) (io.Reader, error) { + resp, err := f.client.Get(url) + if err != nil { + return nil, fmt.Errorf("finder: unable to get get reader from url %v", url) + } + + return resp, nil +} + +// GetPackage provides a package for the local folder or tarball provided +func (f *LocalFinder) GetPackage(name string, version string) (packages.Package, error) { + // make sure file exists + _, err := f.fs.Stat(name) + if err != nil { + return nil, err + } + // order of discovery + // 1. tarball + // 2. file based + return packages.ReadPackage(f.fs, name) +} + +// NewLocal creates a finder for local operator package +func NewLocal() *LocalFinder { + return &LocalFinder{fs: afero.NewOsFs()} +} + +// NewURL creates an instance of a URLFinder +func NewURL() *URLFinder { + client := http.NewClient() + + return &URLFinder{ + client: *client, + } +} diff --git a/pkg/kudoctl/bundle/finder/bundle_finder_test.go b/pkg/kudoctl/packages/finder/package_finder_test.go similarity index 55% rename from pkg/kudoctl/bundle/finder/bundle_finder_test.go rename to pkg/kudoctl/packages/finder/package_finder_test.go index dd22ad852..cdcf4c7c4 100644 --- a/pkg/kudoctl/bundle/finder/bundle_finder_test.go +++ b/pkg/kudoctl/packages/finder/package_finder_test.go @@ -6,41 +6,41 @@ import ( "github.com/stretchr/testify/assert" ) -func TestManager_GetBundle(t *testing.T) { +func TestManager_GetPackage(t *testing.T) { m := &Manager{ local: NewLocal(), uri: nil, } - b, err := m.GetBundle("../testdata/zk", "") + b, err := m.GetPackage("../testdata/zk", "") if err != nil { - t.Errorf("Manager.GetBundle() error = %v", err) + t.Errorf("Manager.GetPackage() error = %v", err) return } crd, err := b.GetCRDs() if err != nil { - t.Errorf("bundle.GetCRDs error = %v", err) + t.Errorf("packages.GetCRDs error = %v", err) } assert.EqualValues(t, "zookeeper", crd.Operator.Name) } -func TestLocalFinder_GetBundle(t *testing.T) { +func TestLocalFinder_GetPackage(t *testing.T) { f := NewLocal() - b, err := f.GetBundle("../testdata/zk", "") + b, err := f.GetPackage("../testdata/zk", "") if err != nil { - t.Errorf("Manager.GetBundle() error = %v", err) + t.Errorf("Manager.GetPackage() error = %v", err) return } crd, err := b.GetCRDs() if err != nil { - t.Errorf("bundle.GetCRDs error = %v", err) + t.Errorf("packages.GetCRDs error = %v", err) } assert.EqualValues(t, "zookeeper", crd.Operator.Name) } func TestLocalFinder_Failure(t *testing.T) { f := NewLocal() - _, err := f.GetBundle("../testdata/zk-bad", "") + _, err := f.GetPackage("../testdata/zk-bad", "") assert.Errorf(t, err, "should have errored on bad folder name") } diff --git a/pkg/kudoctl/bundle/package.go b/pkg/kudoctl/packages/package.go similarity index 87% rename from pkg/kudoctl/bundle/package.go rename to pkg/kudoctl/packages/package.go index cc9e4f7c6..c9d0cfda1 100644 --- a/pkg/kudoctl/bundle/package.go +++ b/pkg/kudoctl/packages/package.go @@ -1,4 +1,4 @@ -package bundle +package packages import ( "fmt" @@ -8,7 +8,6 @@ import ( "strings" "github.com/kudobuilder/kudo/pkg/apis/kudo/v1alpha1" - "github.com/kudobuilder/kudo/pkg/bundle" "github.com/kudobuilder/kudo/pkg/kudoctl/files" "github.com/kudobuilder/kudo/pkg/util/kudo" @@ -36,13 +35,28 @@ type PackageCRDs struct { Instance *v1alpha1.Instance } -// PackageFiles represents the raw operator package format the way it is found in the tgz package bundles +// PackageFiles represents the raw operator package format the way it is found in the tgz packages type PackageFiles struct { Templates map[string]string - Operator *bundle.Operator + Operator *Operator Params []v1alpha1.Parameter } +// Operator is a representation of the KEP-9 Operator YAML +type Operator struct { + Name string `json:"name"` + Description string `json:"description,omitempty"` + Version string `json:"version"` + AppVersion string `json:"appVersion,omitempty"` + KUDOVersion string `json:"kudoVersion,omitempty"` + KubernetesVersion string `json:"kubernetesVersion,omitempty"` + Maintainers []*v1alpha1.Maintainer `json:"maintainers,omitempty"` + URL string `json:"url,omitempty"` + Tasks map[string]v1alpha1.TaskSpec `json:"tasks"` + Plans map[string]v1alpha1.Plan `json:"plans"` + Dependencies []v1alpha1.OperatorDependency `json:"dependencies,omitempty"` +} + // PackageFilesDigest is a tuple of data used to return the package files AND the digest of a tarball type PackageFilesDigest struct { PkgFiles *PackageFiles @@ -259,7 +273,7 @@ func pathToOperator(fs afero.Fs, path string) (pfd *PackageFilesDigest, err erro } func readerToOperator(r io.Reader) (*PackageFiles, error) { - b := NewBundleFromReader(r) + b := NewPackageFromReader(r) pkg, err := b.GetPkgFiles() if err != nil { return nil, err diff --git a/pkg/kudoctl/bundle/bundle.go b/pkg/kudoctl/packages/package_manager.go similarity index 76% rename from pkg/kudoctl/bundle/bundle.go rename to pkg/kudoctl/packages/package_manager.go index 52775002f..8ef989280 100644 --- a/pkg/kudoctl/bundle/bundle.go +++ b/pkg/kudoctl/packages/package_manager.go @@ -1,4 +1,4 @@ -package bundle +package packages import ( "archive/tar" @@ -15,30 +15,30 @@ import ( "github.com/spf13/afero" ) -// This is an abstraction which abstracts the underlying bundle, which is likely file system or compressed file. -// There should be a complete separation between retrieving a bundle if not local and working with a bundle. +// This is an abstraction which abstracts the underlying packages, which is likely file system or compressed file. +// There should be a complete separation between retrieving a packages if not local and working with a packages. -// Bundle is an abstraction of the collection of files that makes up a package. It is anything we can retrieve the PackageCRDs from. -type Bundle interface { +// Package is an abstraction of the collection of files that makes up a package. It is anything we can retrieve the PackageCRDs from. +type Package interface { // transformed server view GetCRDs() (*PackageCRDs, error) // working with local package files GetPkgFiles() (*PackageFiles, error) } -// FIXME: Implement 'io.Closer' and make sure that it is called. 'tarBundle' will leak a file descriptor otherwise. -type tarBundle struct { +// FIXME: Implement 'io.Closer' and make sure that it is called. 'tarPackage' will leak a file descriptor otherwise. +type tarPackage struct { reader io.Reader } -type fileBundle struct { +type filePackage struct { path string fs afero.Fs } -// NewBundle creates the implementation of the bundle based on the path. The expectation is the bundle -// is always local . The path can be relative or absolute location of the bundle. -func NewBundle(fs afero.Fs, path string) (Bundle, error) { +// ReadPackage creates the implementation of the packages based on the path. The expectation is the packages +// is always local . The path can be relative or absolute location of the packages. +func ReadPackage(fs afero.Fs, path string) (Package, error) { // make sure file exists fi, err := fs.Stat(path) if err != nil { @@ -53,9 +53,9 @@ func NewBundle(fs afero.Fs, path string) (Bundle, error) { return nil, err } - return tarBundle{r}, nil + return tarPackage{r}, nil } else if fi.IsDir() { - return fileBundle{path, fs}, nil + return filePackage{path, fs}, nil } else { return nil, fmt.Errorf("unsupported file system format %v. Expect either a *.tgz file or a folder", path) } @@ -69,18 +69,18 @@ func getFileReader(fs afero.Fs, path string) (io.Reader, error) { return f, nil } -// NewBundleFromReader is a bundle from a reader. This should only be used when a file cache isn't used. -func NewBundleFromReader(r io.Reader) Bundle { - return tarBundle{r} +// NewPackageFromReader is a package from a reader. This should only be used when a file cache isn't used. +func NewPackageFromReader(r io.Reader) Package { + return tarPackage{r} } // GetPkgFiles returns the command side package files -func (b tarBundle) GetPkgFiles() (*PackageFiles, error) { +func (b tarPackage) GetPkgFiles() (*PackageFiles, error) { return parseTarPackage(b.reader) } // GetCRDs returns the server side CRDs -func (b tarBundle) GetCRDs() (*PackageCRDs, error) { +func (b tarPackage) GetCRDs() (*PackageCRDs, error) { p, err := b.GetPkgFiles() if err != nil { return nil, errors.Wrap(err, "while extracting package files") @@ -88,7 +88,7 @@ func (b tarBundle) GetCRDs() (*PackageCRDs, error) { return p.getCRDs() } -func (b fileBundle) GetCRDs() (*PackageCRDs, error) { +func (b filePackage) GetCRDs() (*PackageCRDs, error) { p, err := b.GetPkgFiles() if err != nil { return nil, errors.Wrap(err, "while reading package from the file system") @@ -96,12 +96,12 @@ func (b fileBundle) GetCRDs() (*PackageCRDs, error) { return p.getCRDs() } -func (b fileBundle) GetPkgFiles() (*PackageFiles, error) { +func (b filePackage) GetPkgFiles() (*PackageFiles, error) { return fromFolder(b.fs, b.path) } -// ToTarBundle takes a path to operator files and creates a tgz of those files with the destination and name provided -func ToTarBundle(fs afero.Fs, path string, destination string, overwrite bool) (target string, err error) { +// CreateTarball takes a path to operator files and creates a tgz of those files with the destination and name provided +func CreateTarball(fs afero.Fs, path string, destination string, overwrite bool) (target string, err error) { pkg, err := fromFolder(fs, path) if err != nil { //TODO (kensipe): use wrapped err at high verbosity diff --git a/pkg/kudoctl/bundle/package_test.go b/pkg/kudoctl/packages/package_test.go similarity index 97% rename from pkg/kudoctl/bundle/package_test.go rename to pkg/kudoctl/packages/package_test.go index 56974d3b6..73d212b0c 100644 --- a/pkg/kudoctl/bundle/package_test.go +++ b/pkg/kudoctl/packages/package_test.go @@ -1,4 +1,4 @@ -package bundle +package packages import ( "fmt" @@ -35,11 +35,11 @@ func TestReadFileSystemPackage(t *testing.T) { for _, tt := range tests { t.Run(fmt.Sprintf("%s-from-%s", tt.name, tt.path), func(t *testing.T) { - bundle, err := NewBundle(fs, tt.path) + pkg, err := ReadPackage(fs, tt.path) if err != nil { t.Fatalf("Found unexpected error: %v", err) } - actual, err := bundle.GetCRDs() + actual, err := pkg.GetCRDs() if err != nil { t.Fatalf("Found unexpected error: %v", err) } diff --git a/pkg/kudoctl/bundle/tar.go b/pkg/kudoctl/packages/tar.go similarity index 99% rename from pkg/kudoctl/bundle/tar.go rename to pkg/kudoctl/packages/tar.go index a237246be..3a0985bb6 100644 --- a/pkg/kudoctl/bundle/tar.go +++ b/pkg/kudoctl/packages/tar.go @@ -1,4 +1,4 @@ -package bundle +package packages import ( "archive/tar" diff --git a/pkg/kudoctl/bundle/tar_test.go b/pkg/kudoctl/packages/tar_test.go similarity index 97% rename from pkg/kudoctl/bundle/tar_test.go rename to pkg/kudoctl/packages/tar_test.go index 514c688c9..dadf23c64 100644 --- a/pkg/kudoctl/bundle/tar_test.go +++ b/pkg/kudoctl/packages/tar_test.go @@ -1,4 +1,4 @@ -package bundle +package packages import ( "os" diff --git a/pkg/kudoctl/bundle/testdata/zk-crd-golden1/instance.golden b/pkg/kudoctl/packages/testdata/zk-crd-golden1/instance.golden similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk-crd-golden1/instance.golden rename to pkg/kudoctl/packages/testdata/zk-crd-golden1/instance.golden diff --git a/pkg/kudoctl/bundle/testdata/zk-crd-golden1/operator.golden b/pkg/kudoctl/packages/testdata/zk-crd-golden1/operator.golden similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk-crd-golden1/operator.golden rename to pkg/kudoctl/packages/testdata/zk-crd-golden1/operator.golden diff --git a/pkg/kudoctl/bundle/testdata/zk-crd-golden1/operatorversion.golden b/pkg/kudoctl/packages/testdata/zk-crd-golden1/operatorversion.golden similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk-crd-golden1/operatorversion.golden rename to pkg/kudoctl/packages/testdata/zk-crd-golden1/operatorversion.golden diff --git a/pkg/kudoctl/bundle/testdata/zk-crd-golden2/instance.golden b/pkg/kudoctl/packages/testdata/zk-crd-golden2/instance.golden similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk-crd-golden2/instance.golden rename to pkg/kudoctl/packages/testdata/zk-crd-golden2/instance.golden diff --git a/pkg/kudoctl/bundle/testdata/zk-crd-golden2/operator.golden b/pkg/kudoctl/packages/testdata/zk-crd-golden2/operator.golden similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk-crd-golden2/operator.golden rename to pkg/kudoctl/packages/testdata/zk-crd-golden2/operator.golden diff --git a/pkg/kudoctl/bundle/testdata/zk-crd-golden2/operatorversion.golden b/pkg/kudoctl/packages/testdata/zk-crd-golden2/operatorversion.golden similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk-crd-golden2/operatorversion.golden rename to pkg/kudoctl/packages/testdata/zk-crd-golden2/operatorversion.golden diff --git a/pkg/kudoctl/bundle/testdata/zk.tgz b/pkg/kudoctl/packages/testdata/zk.tgz similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk.tgz rename to pkg/kudoctl/packages/testdata/zk.tgz diff --git a/pkg/kudoctl/bundle/testdata/zk/operator.yaml b/pkg/kudoctl/packages/testdata/zk/operator.yaml similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk/operator.yaml rename to pkg/kudoctl/packages/testdata/zk/operator.yaml diff --git a/pkg/kudoctl/bundle/testdata/zk/params.yaml b/pkg/kudoctl/packages/testdata/zk/params.yaml similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk/params.yaml rename to pkg/kudoctl/packages/testdata/zk/params.yaml diff --git a/pkg/kudoctl/bundle/testdata/zk/templates/pdb.yaml b/pkg/kudoctl/packages/testdata/zk/templates/pdb.yaml similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk/templates/pdb.yaml rename to pkg/kudoctl/packages/testdata/zk/templates/pdb.yaml diff --git a/pkg/kudoctl/bundle/testdata/zk/templates/services.yaml b/pkg/kudoctl/packages/testdata/zk/templates/services.yaml similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk/templates/services.yaml rename to pkg/kudoctl/packages/testdata/zk/templates/services.yaml diff --git a/pkg/kudoctl/bundle/testdata/zk/templates/statefulset.yaml b/pkg/kudoctl/packages/testdata/zk/templates/statefulset.yaml similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk/templates/statefulset.yaml rename to pkg/kudoctl/packages/testdata/zk/templates/statefulset.yaml diff --git a/pkg/kudoctl/bundle/testdata/zk/templates/validation.yaml b/pkg/kudoctl/packages/testdata/zk/templates/validation.yaml similarity index 100% rename from pkg/kudoctl/bundle/testdata/zk/templates/validation.yaml rename to pkg/kudoctl/packages/testdata/zk/templates/validation.yaml diff --git a/pkg/kudoctl/util/repo/index.go b/pkg/kudoctl/util/repo/index.go index c3bd6d2cf..7b51db609 100644 --- a/pkg/kudoctl/util/repo/index.go +++ b/pkg/kudoctl/util/repo/index.go @@ -7,7 +7,7 @@ import ( "sort" "time" - "github.com/kudobuilder/kudo/pkg/kudoctl/bundle" + "github.com/kudobuilder/kudo/pkg/kudoctl/packages" "github.com/Masterminds/semver" "github.com/pkg/errors" @@ -167,11 +167,11 @@ func (i *IndexFile) WriteFile(fs afero.Fs, file string) (err error) { } // Map transforms a slice of packagefiles with file digests into a slice of PackageVersions -func Map(pkgs []*bundle.PackageFilesDigest, url string) PackageVersions { +func Map(pkgs []*packages.PackageFilesDigest, url string) PackageVersions { return mapPackages(pkgs, url, ToPackageVersion) } -func mapPackages(packages []*bundle.PackageFilesDigest, url string, f func(*bundle.PackageFiles, string, string) *PackageVersion) PackageVersions { +func mapPackages(packages []*packages.PackageFilesDigest, url string, f func(*packages.PackageFiles, string, string) *PackageVersion) PackageVersions { pvs := make(PackageVersions, len(packages)) for i, pkg := range packages { pvs[i] = f(pkg.PkgFiles, pkg.Digest, url) @@ -180,7 +180,7 @@ func mapPackages(packages []*bundle.PackageFilesDigest, url string, f func(*bund } // ToPackageVersion provided the packageFiles will create a PackageVersion (used for index) -func ToPackageVersion(pf *bundle.PackageFiles, digest string, url string) *PackageVersion { +func ToPackageVersion(pf *packages.PackageFiles, digest string, url string) *PackageVersion { o := pf.Operator if url == "" { url = defaultURL @@ -221,7 +221,7 @@ func IndexDirectory(fs afero.Fs, path string, url string, now *time.Time) (*Inde return nil, errors.New("no packages discovered") } index := newIndexFile(now) - ops := bundle.GetFilesDigest(fs, archives) + ops := packages.GetFilesDigest(fs, archives) pvs := Map(ops, url) for _, pv := range pvs { err = index.AddPackageVersion(pv) diff --git a/pkg/kudoctl/util/repo/index_test.go b/pkg/kudoctl/util/repo/index_test.go index 46ef98b9e..2a0230c6e 100644 --- a/pkg/kudoctl/util/repo/index_test.go +++ b/pkg/kudoctl/util/repo/index_test.go @@ -11,8 +11,7 @@ import ( "time" "github.com/kudobuilder/kudo/pkg/apis/kudo/v1alpha1" - pkgbundle "github.com/kudobuilder/kudo/pkg/bundle" - "github.com/kudobuilder/kudo/pkg/kudoctl/bundle" + "github.com/kudobuilder/kudo/pkg/kudoctl/packages" "github.com/magiconair/properties/assert" ) @@ -130,7 +129,7 @@ func getTestPackageVersion(name string, version string) PackageVersion { return bv } -func TestAddBundleVersionErrorConditions(t *testing.T) { +func TestAddPackageVersionErrorConditions(t *testing.T) { index := getTestIndexFile() dup := index.Entries["flink"][0] missing := getTestPackageVersion("flink", "") @@ -157,7 +156,7 @@ func TestAddBundleVersionErrorConditions(t *testing.T) { } func TestMapPackageFileToPackageVersion(t *testing.T) { - o := pkgbundle.Operator{ + o := packages.Operator{ Name: "kafka", Description: "", Version: "1.0.0", @@ -167,7 +166,7 @@ func TestMapPackageFileToPackageVersion(t *testing.T) { Maintainers: []*v1alpha1.Maintainer{&v1alpha1.Maintainer{Name: "Ken Sipe"}}, URL: "http://kudo.dev/kafka", } - pf := bundle.PackageFiles{ + pf := packages.PackageFiles{ Operator: &o, } diff --git a/pkg/kudoctl/util/repo/repo_operator.go b/pkg/kudoctl/util/repo/repo_operator.go index 1979c0660..968097306 100644 --- a/pkg/kudoctl/util/repo/repo_operator.go +++ b/pkg/kudoctl/util/repo/repo_operator.go @@ -8,18 +8,18 @@ import ( "strings" "github.com/kudobuilder/kudo/pkg/apis/kudo/v1alpha1" - "github.com/kudobuilder/kudo/pkg/kudoctl/bundle" "github.com/kudobuilder/kudo/pkg/kudoctl/clog" "github.com/kudobuilder/kudo/pkg/kudoctl/http" "github.com/kudobuilder/kudo/pkg/kudoctl/kudohome" + "github.com/kudobuilder/kudo/pkg/kudoctl/packages" "github.com/pkg/errors" "github.com/spf13/afero" ) -// Repository is an abstraction for a service that can retrieve package bundles +// Repository is an abstraction for a service that can retrieve packages type Repository interface { - GetBundle(name string, version string) (bundle.Bundle, error) + GetPackage(name string, version string) (packages.Package, error) } // Client represents an operator repository @@ -112,24 +112,24 @@ func (r *Client) GetPackageReader(name string, version string) (io.Reader, error return nil, errors.WithMessage(err, "could not download repository index file") } - bundleVersion, err := indexFile.GetByNameAndVersion(name, version) + pkgVersion, err := indexFile.GetByNameAndVersion(name, version) if err != nil { return nil, errors.Wrapf(err, "getting %s in index file", name) } - packageName := bundleVersion.Name + "-" + bundleVersion.Version - clog.V(4).Printf("bundle version returned %v", packageName) + packageName := pkgVersion.Name + "-" + pkgVersion.Version + clog.V(4).Printf("package version returned %v", packageName) return r.getPackageReaderByFullPackageName(packageName) } -// GetBundle provides an Bundle for a provided package name and optional version -func (r *Client) GetBundle(name string, version string) (bundle.Bundle, error) { +// GetPackage provides an Package for a provided package name and optional version +func (r *Client) GetPackage(name string, version string) (packages.Package, error) { reader, err := r.GetPackageReader(name, version) if err != nil { return nil, err } - return bundle.NewBundleFromReader(reader), nil + return packages.NewPackageFromReader(reader), nil } // GetOperatorVersionDependencies helper method returns a slice of strings that contains the names of all