diff --git a/cmd/hauler/cli/store/sync.go b/cmd/hauler/cli/store/sync.go index ff6dbf8..db9e597 100644 --- a/cmd/hauler/cli/store/sync.go +++ b/cmd/hauler/cli/store/sync.go @@ -12,9 +12,9 @@ import ( "github.com/rancherfederal/hauler/pkg/apis/hauler.cattle.io/v1alpha1" "github.com/rancherfederal/hauler/pkg/content" "github.com/rancherfederal/hauler/pkg/content/chart" - "github.com/rancherfederal/hauler/pkg/content/driver" "github.com/rancherfederal/hauler/pkg/content/file" "github.com/rancherfederal/hauler/pkg/content/image" + "github.com/rancherfederal/hauler/pkg/content/k3s" "github.com/rancherfederal/hauler/pkg/log" "github.com/rancherfederal/hauler/pkg/store" ) @@ -113,7 +113,7 @@ func SyncCmd(ctx context.Context, o *SyncOpts, s *store.Store) error { return err } - oci, err := driver.NewK3s(cfg.Spec.Version) + oci, err := k3s.NewK3s(cfg.Spec.Version) if err != nil { return err } diff --git a/pkg/content/chart/chart_test.go b/pkg/content/chart/chart_test.go new file mode 100644 index 0000000..9c796e0 --- /dev/null +++ b/pkg/content/chart/chart_test.go @@ -0,0 +1,61 @@ +package chart + +import ( + "context" + "os" + "testing" + + "github.com/rancherfederal/hauler/pkg/apis/hauler.cattle.io/v1alpha1" + "github.com/rancherfederal/hauler/pkg/log" + "github.com/rancherfederal/hauler/pkg/store" +) + +func TestChart_Copy(t *testing.T) { + ctx := context.Background() + l := log.NewLogger(os.Stdout) + ctx = l.WithContext(ctx) + + tmpdir, err := os.MkdirTemp("", "hauler") + if err != nil { + t.Error(err) + } + defer os.Remove(tmpdir) + + s := store.NewStore(ctx, tmpdir) + s.Open() + defer s.Close() + + type args struct { + ctx context.Context + registry string + } + tests := []struct { + name string + cfg v1alpha1.Chart + args args + wantErr bool + }{ + // TODO: This test isn't self-contained + { + name: "should work", + cfg: v1alpha1.Chart{ + Name: "rancher", + RepoURL: "https://releases.rancher.com/server-charts/latest", + Version: "2.6.2", + }, + args: args{ + ctx: ctx, + registry: s.RegistryURL(), + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := NewChart(tt.cfg) + if err := c.Copy(tt.args.ctx, tt.args.registry); (err != nil) != tt.wantErr { + t.Errorf("Copy() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/pkg/content/driver/rke2.go b/pkg/content/driver/rke2.go deleted file mode 100644 index 3a23454..0000000 --- a/pkg/content/driver/rke2.go +++ /dev/null @@ -1,11 +0,0 @@ -package driver - -import ( - "github.com/rancherfederal/hauler/pkg/content/file" - "github.com/rancherfederal/hauler/pkg/content/image" -) - -type Rke2 struct { - Files []file.File - Images []image.Image -} diff --git a/pkg/content/file/file.go b/pkg/content/file/file.go index 5e82e3d..8c8003b 100644 --- a/pkg/content/file/file.go +++ b/pkg/content/file/file.go @@ -2,7 +2,6 @@ package file import ( "context" - "fmt" "io" "net/http" "net/url" @@ -25,9 +24,6 @@ const ( ) type File struct { - name string - raw string - cfg v1alpha1.File content getter @@ -54,27 +50,6 @@ func NewFile(cfg v1alpha1.File) File { } } -func (f *File) Ref(opts ...name.Option) (name.Reference, error) { - cname := f.content.name() - if f.name != "" { - cname = f.name - } - - if cname == "" { - return nil, fmt.Errorf("cannot identify name from %s", f.raw) - } - - return name.ParseReference(cname, opts...) -} - -func (f *File) Repo() string { - cname := f.content.name() - if f.name != "" { - cname = f.name - } - return path.Join("hauler", cname) -} - func (f File) Copy(ctx context.Context, registry string) error { l := log.FromContext(ctx) @@ -88,8 +63,8 @@ func (f File) Copy(ctx context.Context, registry string) error { } cname := f.content.name() - if f.name != "" { - cname = f.name + if f.cfg.Name != "" { + cname = f.cfg.Name } desc := fs.Add(cname, f.content.mediaType(), data) diff --git a/pkg/content/file/file_test.go b/pkg/content/file/file_test.go index 3666905..5de389a 100644 --- a/pkg/content/file/file_test.go +++ b/pkg/content/file/file_test.go @@ -1,63 +1,134 @@ package file -// func TestNewFile(t *testing.T) { -// ctx := context.Background() -// -// tmpdir, err := os.MkdirTemp("", "hauler") -// if err != nil { -// t.Error(err) -// } -// defer os.Remove(tmpdir) -// -// // Make some temp files -// f, err := os.CreateTemp(tmpdir, "tmp") -// f.Write([]byte("content")) -// defer f.Close() -// -// c, err := cache.NewBoltDB(tmpdir, "cache") -// if err != nil { -// t.Fatal(err) -// } -// _ = c -// -// s := rstore.NewStore(ctx, tmpdir) -// s.Start() -// defer s.Stop() -// -// type args struct { -// cfg v1alpha1.File -// root string -// } -// tests := []struct { -// name string -// args args -// want *File -// wantErr bool -// }{ -// { -// name: "should work", -// args: args{ -// root: tmpdir, -// cfg: v1alpha1.File{ -// Name: "myfile", -// }, -// }, -// want: nil, -// wantErr: false, -// }, -// } -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// got := New(tt.args.cfg, tt.args.root) -// -// ref, _ := name.ParseReference(path.Join("hauler", tt.args.cfg.Name)) -// if err := s.Add(ctx, got, ref); err != nil { -// t.Error(err) -// } -// -// if !reflect.DeepEqual(got, tt.want) { -// t.Errorf("New() got = %v, want %v", got, tt.want) -// } -// }) -// } -// } +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "testing" + + "github.com/rancherfederal/hauler/pkg/apis/hauler.cattle.io/v1alpha1" + "github.com/rancherfederal/hauler/pkg/log" + "github.com/rancherfederal/hauler/pkg/store" +) + +func TestFile_Copy(t *testing.T) { + ctx := context.Background() + l := log.NewLogger(os.Stdout) + ctx = l.WithContext(ctx) + + tmpdir, err := os.MkdirTemp("", "hauler") + if err != nil { + t.Error(err) + } + defer os.Remove(tmpdir) + + // Make a temp file + f, err := os.CreateTemp(tmpdir, "tmp") + f.Write([]byte("content")) + defer f.Close() + + fs := newTestFileServer(tmpdir) + fs.Start() + defer fs.Stop() + + s := store.NewStore(ctx, tmpdir) + s.Open() + defer s.Close() + + type args struct { + ctx context.Context + registry string + } + + tests := []struct { + name string + cfg v1alpha1.File + args args + wantErr bool + }{ + { + name: "should copy a local file successfully without an explicit name", + cfg: v1alpha1.File{ + Ref: f.Name(), + }, + args: args{ + ctx: ctx, + registry: s.RegistryURL(), + }, + }, + { + name: "should copy a local file successfully with an explicit name", + cfg: v1alpha1.File{ + Ref: f.Name(), + Name: "my-other-file", + }, + args: args{ + ctx: ctx, + registry: s.RegistryURL(), + }, + }, + { + name: "should fail to copy a local file successfully with a malformed explicit name", + cfg: v1alpha1.File{ + Ref: f.Name(), + Name: "my!invalid~@file", + }, + args: args{ + ctx: ctx, + registry: s.RegistryURL(), + }, + wantErr: true, + }, + { + name: "should copy a remote file successfully without an explicit name", + cfg: v1alpha1.File{ + Ref: fmt.Sprintf("%s/%s", fs.server.URL, filepath.Base(f.Name())), + }, + args: args{ + ctx: ctx, + registry: s.RegistryURL(), + }, + }, + { + name: "should copy a remote file successfully with an explicit name", + cfg: v1alpha1.File{ + Ref: fmt.Sprintf("%s/%s", fs.server.URL, filepath.Base(f.Name())), + Name: "my-other-file", + }, + args: args{ + ctx: ctx, + registry: s.RegistryURL(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + l.Debugf("doing: %s", tt.cfg.Ref) + f := NewFile(tt.cfg) + if err := f.Copy(tt.args.ctx, tt.args.registry); (err != nil) != tt.wantErr { + t.Errorf("Copy() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +type testFileServer struct { + server *httptest.Server +} + +func newTestFileServer(path string) *testFileServer { + s := httptest.NewUnstartedServer(http.FileServer(http.Dir(path))) + return &testFileServer{server: s} +} + +func (s *testFileServer) Start() *httptest.Server { + s.server.Start() + return s.server +} + +func (s *testFileServer) Stop() { + s.server.Close() +} diff --git a/pkg/content/image/image.go b/pkg/content/image/image.go index 4eb8207..6970909 100644 --- a/pkg/content/image/image.go +++ b/pkg/content/image/image.go @@ -21,16 +21,6 @@ func NewImage(cfg v1alpha1.Image) Image { } } -func (i Image) Ref(opts ...name.Option) (name.Reference, error) { - return name.ParseReference(i.cfg.Ref, opts...) -} - -// Repo returns the repository component of the image -func (i Image) Repo() string { - ref, _ := name.ParseReference(i.cfg.Ref) - return ref.Context().RepositoryStr() -} - func (i Image) Copy(ctx context.Context, registry string) error { l := log.FromContext(ctx) diff --git a/pkg/content/image/image_test.go b/pkg/content/image/image_test.go new file mode 100644 index 0000000..f281870 --- /dev/null +++ b/pkg/content/image/image_test.go @@ -0,0 +1,71 @@ +package image + +import ( + "context" + "os" + "testing" + + "github.com/rancherfederal/hauler/pkg/apis/hauler.cattle.io/v1alpha1" + "github.com/rancherfederal/hauler/pkg/log" + "github.com/rancherfederal/hauler/pkg/store" +) + +func TestImage_Copy(t *testing.T) { + ctx := context.Background() + l := log.NewLogger(os.Stdout) + ctx = l.WithContext(ctx) + + tmpdir, err := os.MkdirTemp("", "hauler") + if err != nil { + t.Error(err) + } + defer os.Remove(tmpdir) + + s := store.NewStore(ctx, tmpdir) + s.Open() + defer s.Close() + + type args struct { + ctx context.Context + registry string + } + tests := []struct { + name string + cfg v1alpha1.Image + args args + wantErr bool + }{ + // TODO: These mostly test functionality we're not responsible for (go-containerregistry), refactor these to only stuff we care about + { + name: "should work with tagged image", + cfg: v1alpha1.Image{ + Ref: "busybox:1.34.1", + }, + args: args{ + ctx: ctx, + registry: s.RegistryURL(), + }, + wantErr: false, + }, + { + name: "should work with digest image", + cfg: v1alpha1.Image{ + Ref: "busybox@sha256:6066ca124f8c2686b7ae71aa1d6583b28c6dc3df3bdc386f2c89b92162c597d9", + }, + args: args{ + ctx: ctx, + registry: s.RegistryURL(), + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + i := NewImage(tt.cfg) + + if err := i.Copy(tt.args.ctx, tt.args.registry); (err != nil) != tt.wantErr { + t.Errorf("Copy() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/pkg/content/driver/dependencies.go b/pkg/content/k3s/dependencies.go similarity index 99% rename from pkg/content/driver/dependencies.go rename to pkg/content/k3s/dependencies.go index 62a4730..64fa93a 100644 --- a/pkg/content/driver/dependencies.go +++ b/pkg/content/k3s/dependencies.go @@ -1,4 +1,4 @@ -package driver +package k3s import ( "bufio" diff --git a/pkg/content/driver/k3s.go b/pkg/content/k3s/k3s.go similarity index 98% rename from pkg/content/driver/k3s.go rename to pkg/content/k3s/k3s.go index 42efcc1..a3acc0f 100644 --- a/pkg/content/driver/k3s.go +++ b/pkg/content/k3s/k3s.go @@ -1,4 +1,4 @@ -package driver +package k3s import ( "context" diff --git a/pkg/content/driver/k3s_test.go b/pkg/content/k3s/k3s_test.go similarity index 98% rename from pkg/content/driver/k3s_test.go rename to pkg/content/k3s/k3s_test.go index 5679c82..2f1a482 100644 --- a/pkg/content/driver/k3s_test.go +++ b/pkg/content/k3s/k3s_test.go @@ -1,4 +1,4 @@ -package driver +package k3s import ( "reflect" diff --git a/pkg/store/add.go b/pkg/store/add.go index fd85441..5916c62 100644 --- a/pkg/store/add.go +++ b/pkg/store/add.go @@ -32,7 +32,7 @@ func (s *Store) Add(ctx context.Context, oci content.Oci, opts ...AddOption) err if opt.repo == "" { } - if err := oci.Copy(ctx, s.registryURL()); err != nil { + if err := oci.Copy(ctx, s.RegistryURL()); err != nil { return err } diff --git a/pkg/store/store.go b/pkg/store/store.go index c8ffbd4..37f7865 100644 --- a/pkg/store/store.go +++ b/pkg/store/store.go @@ -115,7 +115,7 @@ func (s *Store) RelocateReference(ref name.Reference) name.Reference { } relocatedRef, _ := name.ParseReference( fmt.Sprintf("%s%s%s", ref.Context().RepositoryStr(), sep, ref.Identifier()), - name.WithDefaultRegistry(s.registryURL()), + name.WithDefaultRegistry(s.RegistryURL()), ) return relocatedRef } @@ -129,8 +129,8 @@ func (s *Store) precheck() error { return nil } -// registryURL returns the registries URL without the protocol, suitable for image relocation operations -func (s *Store) registryURL() string { +// RegistryURL returns the registries URL without the protocol, suitable for image relocation operations +func (s *Store) RegistryURL() string { return httpRegex.ReplaceAllString(s.server.URL, "") } diff --git a/testdata/custom/fleet.yaml b/testdata/custom/fleet.yaml deleted file mode 100644 index 69c204f..0000000 --- a/testdata/custom/fleet.yaml +++ /dev/null @@ -1,8 +0,0 @@ -#defaultNamespace: fleet-system -#helm: -# chart: https://github.com/rancher/fleet/releases/download/v0.3.5/fleet-agent-0.3.5.tgz -# releaseName: fleet-agent - -helm: - repo: https://charts.longhorn.io - chart: longhorn \ No newline at end of file diff --git a/testdata/docker-registry/.circleci/config.yml b/testdata/docker-registry/.circleci/config.yml deleted file mode 100644 index 6e4b6a7..0000000 --- a/testdata/docker-registry/.circleci/config.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: 2.1 -jobs: - lint: - docker: - - image: twuni/helm:3.4.1 - steps: - - checkout - - run: - command: helm lint --strict - name: lint -workflows: - version: 2 - default: - jobs: - - lint diff --git a/testdata/docker-registry/.helmignore b/testdata/docker-registry/.helmignore deleted file mode 100644 index f0c1319..0000000 --- a/testdata/docker-registry/.helmignore +++ /dev/null @@ -1,21 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj diff --git a/testdata/docker-registry/Chart.yaml b/testdata/docker-registry/Chart.yaml deleted file mode 100644 index 7f1d24c..0000000 --- a/testdata/docker-registry/Chart.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -appVersion: 2.7.1 -description: A Helm chart for Docker Registry -home: https://hub.docker.com/_/registry/ -icon: https://hub.docker.com/public/images/logos/mini-logo.svg -maintainers: -- email: devin@canterberry.cc - name: Devin Canterberry - url: https://canterberry.cc/ -name: docker-registry -sources: -- https://github.com/docker/distribution-library-image -version: 1.10.1 diff --git a/testdata/docker-registry/LICENSE b/testdata/docker-registry/LICENSE deleted file mode 100644 index 393b7a3..0000000 --- a/testdata/docker-registry/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright The Helm Authors. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/testdata/docker-registry/README.md b/testdata/docker-registry/README.md deleted file mode 100644 index 00f1fd5..0000000 --- a/testdata/docker-registry/README.md +++ /dev/null @@ -1,94 +0,0 @@ -# Docker Registry Helm Chart - -This directory contains a Kubernetes chart to deploy a private Docker Registry. - -## Prerequisites Details - -* PV support on underlying infrastructure (if persistence is required) - -## Chart Details - -This chart will do the following: - -* Implement a Docker registry deployment - -## Installing the Chart - -First, add the repo: - -```console -$ helm repo add twuni https://helm.twun.io -``` - -To install the chart, use the following: - -```console -$ helm install twuni/docker-registry -``` - -## Configuration - -The following table lists the configurable parameters of the docker-registry chart and -their default values. - -| Parameter | Description | Default | -|:----------------------------|:-------------------------------------------------------------------------------------------|:----------------| -| `image.pullPolicy` | Container pull policy | `IfNotPresent` | -| `image.repository` | Container image to use | `registry` | -| `image.tag` | Container image tag to deploy | `2.7.1` | -| `imagePullSecrets` | Specify image pull secrets | `nil` (does not add image pull secrets to deployed pods) | -| `persistence.accessMode` | Access mode to use for PVC | `ReadWriteOnce` | -| `persistence.enabled` | Whether to use a PVC for the Docker storage | `false` | -| `persistence.deleteEnabled` | Enable the deletion of image blobs and manifests by digest | `nil` | -| `persistence.size` | Amount of space to claim for PVC | `10Gi` | -| `persistence.storageClass` | Storage Class to use for PVC | `-` | -| `persistence.existingClaim` | Name of an existing PVC to use for config | `nil` | -| `service.port` | TCP port on which the service is exposed | `5000` | -| `service.type` | service type | `ClusterIP` | -| `service.clusterIP` | if `service.type` is `ClusterIP` and this is non-empty, sets the cluster IP of the service | `nil` | -| `service.nodePort` | if `service.type` is `NodePort` and this is non-empty, sets the node port of the service | `nil` | -| `service.loadBalancerIP` | if `service.type` is `LoadBalancer` and this is non-empty, sets the loadBalancerIP of the service | `nil` | -| `service.loadBalancerSourceRanges`| if `service.type` is `LoadBalancer` and this is non-empty, sets the loadBalancerSourceRanges of the service | `nil` | -| `service.sessionAffinity` | service session affinity | `nil` | -| `service.sessionAffinityConfig` | service session affinity config | `nil` | -| `replicaCount` | k8s replicas | `1` | -| `updateStrategy` | update strategy for deployment | `{}` | -| `podAnnotations` | Annotations for pod | `{}` | -| `podLabels` | Labels for pod | `{}` | -| `podDisruptionBudget` | Pod disruption budget | `{}` | -| `resources.limits.cpu` | Container requested CPU | `nil` | -| `resources.limits.memory` | Container requested memory | `nil` | -| `priorityClassName ` | priorityClassName | `""` | -| `storage` | Storage system to use | `filesystem` | -| `tlsSecretName` | Name of secret for TLS certs | `nil` | -| `secrets.htpasswd` | Htpasswd authentication | `nil` | -| `secrets.s3.accessKey` | Access Key for S3 configuration | `nil` | -| `secrets.s3.secretKey` | Secret Key for S3 configuration | `nil` | -| `secrets.swift.username` | Username for Swift configuration | `nil` | -| `secrets.swift.password` | Password for Swift configuration | `nil` | -| `haSharedSecret` | Shared secret for Registry | `nil` | -| `configData` | Configuration hash for docker | `nil` | -| `s3.region` | S3 region | `nil` | -| `s3.regionEndpoint` | S3 region endpoint | `nil` | -| `s3.bucket` | S3 bucket name | `nil` | -| `s3.encrypt` | Store images in encrypted format | `nil` | -| `s3.secure` | Use HTTPS | `nil` | -| `swift.authurl` | Swift authurl | `nil` | -| `swift.container` | Swift container | `nil` | -| `nodeSelector` | node labels for pod assignment | `{}` | -| `affinity` | affinity settings | `{}` | -| `tolerations` | pod tolerations | `[]` | -| `ingress.enabled` | If true, Ingress will be created | `false` | -| `ingress.annotations` | Ingress annotations | `{}` | -| `ingress.labels` | Ingress labels | `{}` | -| `ingress.path` | Ingress service path | `/` | -| `ingress.hosts` | Ingress hostnames | `[]` | -| `ingress.tls` | Ingress TLS configuration (YAML) | `[]` | -| `extraVolumeMounts` | Additional volumeMounts to the registry container | `[]` | -| `extraVolumes` | Additional volumes to the pod | `[]` | - -Specify each parameter using the `--set key=value[,key=value]` argument to -`helm install`. - -To generate htpasswd file, run this docker command: -`docker run --entrypoint htpasswd registry:2 -Bbn user password > ./htpasswd`. diff --git a/testdata/docker-registry/templates/NOTES.txt b/testdata/docker-registry/templates/NOTES.txt deleted file mode 100644 index 4a9152b..0000000 --- a/testdata/docker-registry/templates/NOTES.txt +++ /dev/null @@ -1,19 +0,0 @@ -1. Get the application URL by running these commands: -{{- if .Values.ingress.enabled }} -{{- range .Values.ingress.hosts }} - http{{ if $.Values.ingress.tls }}s{{ end }}://{{ . }}{{ $.Values.ingress.path }} -{{- end }} -{{- else if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "docker-registry.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc -w {{ template "docker-registry.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "docker-registry.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo http://$SERVICE_IP:{{ .Values.service.externalPort }} -{{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "docker-registry.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl -n {{ .Release.Namespace }} port-forward $POD_NAME 8080:5000 -{{- end }} diff --git a/testdata/docker-registry/templates/_helpers.tpl b/testdata/docker-registry/templates/_helpers.tpl deleted file mode 100644 index a91077e..0000000 --- a/testdata/docker-registry/templates/_helpers.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "docker-registry.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "docker-registry.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/testdata/docker-registry/templates/configmap.yaml b/testdata/docker-registry/templates/configmap.yaml deleted file mode 100644 index 820bb4f..0000000 --- a/testdata/docker-registry/templates/configmap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "docker-registry.fullname" . }}-config - labels: - app: {{ template "docker-registry.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} -data: - config.yml: |- -{{ toYaml .Values.configData | indent 4 }} diff --git a/testdata/docker-registry/templates/deployment.yaml b/testdata/docker-registry/templates/deployment.yaml deleted file mode 100644 index a146d76..0000000 --- a/testdata/docker-registry/templates/deployment.yaml +++ /dev/null @@ -1,221 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "docker-registry.fullname" . }} - labels: - app: {{ template "docker-registry.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -spec: - selector: - matchLabels: - app: {{ template "docker-registry.name" . }} - release: {{ .Release.Name }} - replicas: {{ .Values.replicaCount }} -{{- if .Values.updateStrategy }} - strategy: -{{ toYaml .Values.updateStrategy | indent 4 }} -{{- end }} - minReadySeconds: 5 - template: - metadata: - labels: - app: {{ template "docker-registry.name" . }} - release: {{ .Release.Name }} - {{- if .Values.podLabels }} -{{ toYaml .Values.podLabels | indent 8 }} - {{- end }} - annotations: - checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} -{{- if $.Values.podAnnotations }} -{{ toYaml $.Values.podAnnotations | indent 8 }} -{{- end }} - spec: - {{- if .Values.imagePullSecrets }} - imagePullSecrets: -{{ toYaml .Values.imagePullSecrets | indent 8 }} - {{- end }} -{{- if .Values.priorityClassName }} - priorityClassName: "{{ .Values.priorityClassName }}" -{{- end }} -{{- if .Values.securityContext.enabled }} - securityContext: - fsGroup: {{ .Values.securityContext.fsGroup }} - runAsUser: {{ .Values.securityContext.runAsUser }} -{{- end }} - containers: - - name: {{ .Chart.Name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - command: - - /bin/registry - - serve - - /etc/docker/registry/config.yml - ports: - - containerPort: 5000 - livenessProbe: - httpGet: -{{- if .Values.tlsSecretName }} - scheme: HTTPS -{{- end }} - path: / - port: 5000 - readinessProbe: - httpGet: -{{- if .Values.tlsSecretName }} - scheme: HTTPS -{{- end }} - path: / - port: 5000 - resources: -{{ toYaml .Values.resources | indent 12 }} - env: -{{- if .Values.secrets.htpasswd }} - - name: REGISTRY_AUTH - value: "htpasswd" - - name: REGISTRY_AUTH_HTPASSWD_REALM - value: "Registry Realm" - - name: REGISTRY_AUTH_HTPASSWD_PATH - value: "/auth/htpasswd" -{{- end }} - - name: REGISTRY_HTTP_SECRET - valueFrom: - secretKeyRef: - name: {{ template "docker-registry.fullname" . }}-secret - key: haSharedSecret -{{- if .Values.tlsSecretName }} - - name: REGISTRY_HTTP_TLS_CERTIFICATE - value: /etc/ssl/docker/tls.crt - - name: REGISTRY_HTTP_TLS_KEY - value: /etc/ssl/docker/tls.key -{{- end }} -{{- if eq .Values.storage "filesystem" }} - - name: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY - value: "/var/lib/registry" -{{- else if eq .Values.storage "azure" }} - - name: REGISTRY_STORAGE_AZURE_ACCOUNTNAME - valueFrom: - secretKeyRef: - name: {{ template "docker-registry.fullname" . }}-secret - key: azureAccountName - - name: REGISTRY_STORAGE_AZURE_ACCOUNTKEY - valueFrom: - secretKeyRef: - name: {{ template "docker-registry.fullname" . }}-secret - key: azureAccountKey - - name: REGISTRY_STORAGE_AZURE_CONTAINER - valueFrom: - secretKeyRef: - name: {{ template "docker-registry.fullname" . }}-secret - key: azureContainer -{{- else if eq .Values.storage "s3" }} - {{- if and .Values.secrets.s3.secretKey .Values.secrets.s3.accessKey }} - - name: REGISTRY_STORAGE_S3_ACCESSKEY - valueFrom: - secretKeyRef: - name: {{ template "docker-registry.fullname" . }}-secret - key: s3AccessKey - - name: REGISTRY_STORAGE_S3_SECRETKEY - valueFrom: - secretKeyRef: - name: {{ template "docker-registry.fullname" . }}-secret - key: s3SecretKey - {{- end }} - - name: REGISTRY_STORAGE_S3_REGION - value: {{ required ".Values.s3.region is required" .Values.s3.region }} - {{- if .Values.s3.regionEndpoint }} - - name: REGISTRY_STORAGE_S3_REGIONENDPOINT - value: {{ .Values.s3.regionEndpoint }} - {{- end }} - - name: REGISTRY_STORAGE_S3_BUCKET - value: {{ required ".Values.s3.bucket is required" .Values.s3.bucket }} - {{- if .Values.s3.encrypt }} - - name: REGISTRY_STORAGE_S3_ENCRYPT - value: {{ .Values.s3.encrypt | quote }} - {{- end }} - {{- if .Values.s3.secure }} - - name: REGISTRY_STORAGE_S3_SECURE - value: {{ .Values.s3.secure | quote }} - {{- end }} -{{- else if eq .Values.storage "swift" }} - - name: REGISTRY_STORAGE_SWIFT_AUTHURL - value: {{ required ".Values.swift.authurl is required" .Values.swift.authurl }} - - name: REGISTRY_STORAGE_SWIFT_USERNAME - valueFrom: - secretKeyRef: - name: {{ template "docker-registry.fullname" . }}-secret - key: swiftUsername - - name: REGISTRY_STORAGE_SWIFT_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "docker-registry.fullname" . }}-secret - key: swiftPassword - - name: REGISTRY_STORAGE_SWIFT_CONTAINER - value: {{ required ".Values.swift.container is required" .Values.swift.container }} -{{- end }} -{{- if .Values.persistence.deleteEnabled }} - - name: REGISTRY_STORAGE_DELETE_ENABLED - value: "true" -{{- end }} - volumeMounts: -{{- if .Values.secrets.htpasswd }} - - name: auth - mountPath: /auth - readOnly: true -{{- end }} -{{- if eq .Values.storage "filesystem" }} - - name: data - mountPath: /var/lib/registry/ -{{- end }} - - name: "{{ template "docker-registry.fullname" . }}-config" - mountPath: "/etc/docker/registry" -{{- if .Values.tlsSecretName }} - - mountPath: /etc/ssl/docker - name: tls-cert - readOnly: true -{{- end }} -{{- with .Values.extraVolumeMounts }} - {{- toYaml . | nindent 12 }} -{{- end }} -{{- if .Values.nodeSelector }} - nodeSelector: -{{ toYaml .Values.nodeSelector | indent 8 }} -{{- end }} -{{- if .Values.affinity }} - affinity: -{{ toYaml .Values.affinity | indent 8 }} -{{- end }} -{{- if .Values.tolerations }} - tolerations: -{{ toYaml .Values.tolerations | indent 8 }} -{{- end }} - volumes: -{{- if .Values.secrets.htpasswd }} - - name: auth - secret: - secretName: {{ template "docker-registry.fullname" . }}-secret - items: - - key: htpasswd - path: htpasswd -{{- end }} -{{- if eq .Values.storage "filesystem" }} - - name: data - {{- if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ if .Values.persistence.existingClaim }}{{ .Values.persistence.existingClaim }}{{- else }}{{ template "docker-registry.fullname" . }}{{- end }} - {{- else }} - emptyDir: {} - {{- end -}} -{{- end }} - - name: {{ template "docker-registry.fullname" . }}-config - configMap: - name: {{ template "docker-registry.fullname" . }}-config -{{- if .Values.tlsSecretName }} - - name: tls-cert - secret: - secretName: {{ .Values.tlsSecretName }} -{{- end }} -{{- with .Values.extraVolumes }} - {{- toYaml . | nindent 8 }} -{{- end }} diff --git a/testdata/docker-registry/templates/ingress.yaml b/testdata/docker-registry/templates/ingress.yaml deleted file mode 100644 index 58ab5fa..0000000 --- a/testdata/docker-registry/templates/ingress.yaml +++ /dev/null @@ -1,36 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $serviceName := include "docker-registry.fullname" . -}} -{{- $servicePort := .Values.service.port -}} -{{- $path := .Values.ingress.path -}} -apiVersion: {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} networking.k8s.io/v1beta1 {{- else }} extensions/v1beta1 {{- end }} -kind: Ingress -metadata: - name: {{ template "docker-registry.fullname" . }} - labels: - app: {{ template "docker-registry.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- if .Values.ingress.labels }} -{{ toYaml .Values.ingress.labels | indent 4 }} -{{- end }} - annotations: - {{- range $key, $value := .Values.ingress.annotations }} - {{ $key }}: {{ $value | quote }} - {{- end }} -spec: - rules: - {{- range $host := .Values.ingress.hosts }} - - host: {{ $host }} - http: - paths: - - path: {{ $path }} - backend: - serviceName: {{ $serviceName }} - servicePort: {{ $servicePort }} - {{- end -}} - {{- if .Values.ingress.tls }} - tls: -{{ toYaml .Values.ingress.tls | indent 4 }} - {{- end -}} -{{- end -}} diff --git a/testdata/docker-registry/templates/poddisruptionbudget.yaml b/testdata/docker-registry/templates/poddisruptionbudget.yaml deleted file mode 100644 index 38eb384..0000000 --- a/testdata/docker-registry/templates/poddisruptionbudget.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if .Values.podDisruptionBudget -}} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ template "docker-registry.fullname" . }} - labels: - app: {{ template "docker-registry.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -spec: - selector: - matchLabels: - app: {{ template "docker-registry.name" . }} - release: {{ .Release.Name }} -{{ toYaml .Values.podDisruptionBudget | indent 2 }} -{{- end -}} diff --git a/testdata/docker-registry/templates/pvc.yaml b/testdata/docker-registry/templates/pvc.yaml deleted file mode 100644 index 1619617..0000000 --- a/testdata/docker-registry/templates/pvc.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if .Values.persistence.enabled }} -{{- if not .Values.persistence.existingClaim -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ template "docker-registry.fullname" . }} - labels: - app: {{ template "docker-registry.fullname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - release: "{{ .Release.Name }}" - heritage: "{{ .Release.Service }}" -spec: - accessModes: - - {{ .Values.persistence.accessMode | quote }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} -{{- if .Values.persistence.storageClass }} -{{- if (eq "-" .Values.persistence.storageClass) }} - storageClassName: "" -{{- else }} - storageClassName: "{{ .Values.persistence.storageClass }}" -{{- end }} -{{- end }} -{{- end }} -{{- end -}} diff --git a/testdata/docker-registry/templates/secret.yaml b/testdata/docker-registry/templates/secret.yaml deleted file mode 100644 index c22fd30..0000000 --- a/testdata/docker-registry/templates/secret.yaml +++ /dev/null @@ -1,37 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "docker-registry.fullname" . }}-secret - labels: - app: {{ template "docker-registry.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} -type: Opaque -data: - {{- if .Values.secrets.htpasswd }} - htpasswd: {{ .Values.secrets.htpasswd | b64enc }} - {{- end }} - {{- if .Values.secrets.haSharedSecret }} - haSharedSecret: {{ .Values.secrets.haSharedSecret | b64enc | quote }} - {{- else }} - haSharedSecret: {{ randAlphaNum 16 | b64enc | quote }} - {{- end }} - - {{- if eq .Values.storage "azure" }} - {{- if and .Values.secrets.azure.accountName .Values.secrets.azure.accountKey .Values.secrets.azure.container }} - azureAccountName: {{ .Values.secrets.azure.accountName | b64enc | quote }} - azureAccountKey: {{ .Values.secrets.azure.accountKey | b64enc | quote }} - azureContainer: {{ .Values.secrets.azure.container | b64enc | quote }} - {{- end }} - {{- else if eq .Values.storage "s3" }} - {{- if and .Values.secrets.s3.secretKey .Values.secrets.s3.accessKey }} - s3AccessKey: {{ .Values.secrets.s3.accessKey | b64enc | quote }} - s3SecretKey: {{ .Values.secrets.s3.secretKey | b64enc | quote }} - {{- end }} - {{- else if eq .Values.storage "swift" }} - {{- if and .Values.secrets.swift.username .Values.secrets.swift.password }} - swiftUsername: {{ .Values.secrets.swift.username | b64enc | quote }} - swiftPassword: {{ .Values.secrets.swift.password | b64enc | quote }} - {{- end }} - {{- end }} diff --git a/testdata/docker-registry/templates/service.yaml b/testdata/docker-registry/templates/service.yaml deleted file mode 100644 index ea195f5..0000000 --- a/testdata/docker-registry/templates/service.yaml +++ /dev/null @@ -1,42 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ template "docker-registry.fullname" . }} - labels: - app: {{ template "docker-registry.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- if .Values.service.annotations }} - annotations: -{{ toYaml .Values.service.annotations | indent 4 }} -{{- end }} -spec: - type: {{ .Values.service.type }} -{{- if (and (eq .Values.service.type "ClusterIP") (not (empty .Values.service.clusterIP))) }} - clusterIP: {{ .Values.service.clusterIP }} -{{- end }} -{{- if (and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerIP))) }} - loadBalancerIP: {{ .Values.service.loadBalancerIP }} -{{- end }} -{{- if (and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerSourceRanges))) }} - loadBalancerSourceRanges: {{ .Values.service.loadBalancerSourceRanges }} -{{- end }} -{{- if .Values.service.sessionAffinity }} - sessionAffinity: {{ .Values.service.sessionAffinity }} - {{- if .Values.service.sessionAffinityConfig }} - sessionAffinityConfig: - {{ toYaml .Values.service.sessionAffinityConfig | nindent 4 }} - {{- end -}} -{{- end }} - ports: - - port: {{ .Values.service.port }} - protocol: TCP - name: {{ if .Values.tlsSecretName }}https{{ else }}http{{ end }}-{{ .Values.service.port }} - targetPort: 5000 -{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }} - nodePort: {{ .Values.service.nodePort }} -{{- end }} - selector: - app: {{ template "docker-registry.name" . }} - release: {{ .Release.Name }} diff --git a/testdata/docker-registry/values.yaml b/testdata/docker-registry/values.yaml deleted file mode 100644 index 00eeafd..0000000 --- a/testdata/docker-registry/values.yaml +++ /dev/null @@ -1,149 +0,0 @@ -# Default values for docker-registry. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. -replicaCount: 2 - -updateStrategy: {} - # type: RollingUpdate - # rollingUpdate: - # maxSurge: 1 - # maxUnavailable: 0 - -podAnnotations: {} -podLabels: {} - -image: - repository: registry - tag: 2.7.1 - pullPolicy: IfNotPresent -# imagePullSecrets: - # - name: docker -service: - name: registry - type: ClusterIP - # sessionAffinity: None - # sessionAffinityConfig: {} - # clusterIP: - port: 5000 - # nodePort: - # loadBalancerIP: - # loadBalancerSourceRanges: - annotations: {} - # foo.io/bar: "true" -ingress: - enabled: false - path: / - # Used to create an Ingress record. - hosts: - - chart-example.local - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - tls: - # Secrets must be manually created in the namespace. - # - secretName: chart-example-tls - # hosts: - # - chart-example.local -resources: {} - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. If you do want to specify resources, uncomment the following - # lines, adjust them as necessary, and remove the curly braces after 'resources:'. - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi -persistence: - accessMode: 'ReadWriteOnce' - enabled: false - size: 10Gi - # storageClass: '-' - -# set the type of filesystem to use: filesystem, s3 -storage: filesystem - -# Set this to name of secret for tls certs -# tlsSecretName: registry.docker.example.com -secrets: - haSharedSecret: "" - htpasswd: "" -# Secrets for Azure -# azure: -# accountName: "" -# accountKey: "" -# container: "" -# Secrets for S3 access and secret keys -# s3: -# accessKey: "" -# secretKey: "" -# Secrets for Swift username and password -# swift: -# username: "" -# password: "" - -# Options for s3 storage type: -# s3: -# region: us-east-1 -# regionEndpoint: s3.us-east-1.amazonaws.com -# bucket: my-bucket -# encrypt: false -# secure: true - -# Options for swift storage type: -# swift: -# authurl: http://swift.example.com/ -# container: my-container - -configData: - version: 0.1 - log: - fields: - service: registry - storage: - cache: - blobdescriptor: inmemory - http: - addr: :5000 - headers: - X-Content-Type-Options: [nosniff] - health: - storagedriver: - enabled: true - interval: 10s - threshold: 3 - -securityContext: - enabled: true - runAsUser: 1000 - fsGroup: 1000 - -priorityClassName: "" - -podDisruptionBudget: {} - # maxUnavailable: 1 - # minAvailable: 2 - -nodeSelector: {} - -affinity: {} - -tolerations: [] - -extraVolumeMounts: [] -## Additional volumeMounts to the registry container. -# - mountPath: /secret-data -# name: cloudfront-pem-secret -# readOnly: true - -extraVolumes: [] -## Additional volumes to the pod. -# - name: cloudfront-pem-secret -# secret: -# secretName: cloudfront-credentials -# items: -# - key: cloudfront.pem -# path: cloudfront.pem -# mode: 511 diff --git a/testdata/rawmanifests/podinfo.yaml b/testdata/rawmanifests/podinfo.yaml deleted file mode 100644 index f8378cd..0000000 --- a/testdata/rawmanifests/podinfo.yaml +++ /dev/null @@ -1,109 +0,0 @@ ---- -# Source: podinfo/templates/service.yaml -apiVersion: v1 -kind: Service -metadata: - name: tester-podinfo - labels: - helm.sh/chart: podinfo-5.2.1 - app.kubernetes.io/name: tester-podinfo - app.kubernetes.io/version: "5.2.1" - app.kubernetes.io/managed-by: Helm -spec: - type: ClusterIP - ports: - - port: 9898 - targetPort: http - protocol: TCP - name: http - - port: 9999 - targetPort: grpc - protocol: TCP - name: grpc - selector: - app.kubernetes.io/name: tester-podinfo ---- -# Source: podinfo/templates/deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: tester-podinfo - labels: - helm.sh/chart: podinfo-5.2.1 - app.kubernetes.io/name: tester-podinfo - app.kubernetes.io/version: "5.2.1" - app.kubernetes.io/managed-by: Helm -spec: - replicas: 1 - strategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 1 - selector: - matchLabels: - app.kubernetes.io/name: tester-podinfo - template: - metadata: - labels: - app.kubernetes.io/name: tester-podinfo - annotations: - prometheus.io/scrape: "true" - prometheus.io/port: "9898" - spec: - terminationGracePeriodSeconds: 30 - containers: - - name: podinfo - image: "ghcr.io/stefanprodan/podinfo:5.2.1" - imagePullPolicy: IfNotPresent - command: - - ./podinfo - - --port=9898 - - --cert-path=/data/cert - - --port-metrics=9797 - - --grpc-port=9999 - - --grpc-service-name=podinfo - - --level=info - - --random-delay=false - - --random-error=false - env: - - name: PODINFO_UI_COLOR - value: "#34577c" - ports: - - name: http - containerPort: 9898 - protocol: TCP - - name: http-metrics - containerPort: 9797 - protocol: TCP - - name: grpc - containerPort: 9999 - protocol: TCP - livenessProbe: - exec: - command: - - podcli - - check - - http - - localhost:9898/healthz - initialDelaySeconds: 1 - timeoutSeconds: 5 - readinessProbe: - exec: - command: - - podcli - - check - - http - - localhost:9898/readyz - initialDelaySeconds: 1 - timeoutSeconds: 5 - volumeMounts: - - name: data - mountPath: /data - resources: - limits: null - requests: - cpu: 1m - memory: 16Mi - volumes: - - name: data - emptyDir: {} diff --git a/testdata/testchart-0.1.0.tgz b/testdata/testchart-0.1.0.tgz new file mode 100644 index 0000000..3d6f457 Binary files /dev/null and b/testdata/testchart-0.1.0.tgz differ