diff --git a/pkg/apparchive/helm-v1beta2.go b/pkg/apparchive/helm-v1beta2.go index 60ef747efe..d89e7f00df 100644 --- a/pkg/apparchive/helm-v1beta2.go +++ b/pkg/apparchive/helm-v1beta2.go @@ -146,6 +146,27 @@ func WriteV1Beta2HelmCharts(opts WriteV1Beta2HelmChartsOptions) error { return errors.Wrap(err, "failed to write values file") } + chartImages, err := findV1Beta2HelmChartImages(opts, &helmChart, chartDir) + if err != nil { + return errors.Wrap(err, "failed to find chart images") + } + + var dockerHubRegistryCreds registry.Credentials + dockerhubSecret, _ := registry.GetDockerHubPullSecret(opts.Clientset, util.PodNamespace, opts.ProcessImageOptions.Namespace, opts.ProcessImageOptions.AppSlug) + if dockerhubSecret != nil { + dockerHubRegistryCreds, _ = registry.GetCredentialsForRegistryFromConfigJSON(dockerhubSecret.Data[".dockerconfigjson"], registry.DockerHubRegistryName) + } + + if err := image.UpdateInstallationImages(image.UpdateInstallationImagesOptions{ + Images: chartImages, + KotsKinds: opts.KotsKinds, + IsAirgap: opts.ProcessImageOptions.IsAirgap, + UpstreamDir: opts.Upstream.GetUpstreamDir(opts.WriteUpstreamOptions), + DockerHubRegistryCreds: dockerHubRegistryCreds, + }); err != nil { + return errors.Wrap(err, "failed to update installation images") + } + if !opts.ProcessImageOptions.RewriteImages || opts.ProcessImageOptions.IsAirgap { // if an on-prem registry is not configured (which means it's an online installation) // there's no need to process/copy the images as they will be pulled from their original registries or through the replicated proxy. @@ -154,8 +175,8 @@ func WriteV1Beta2HelmCharts(opts WriteV1Beta2HelmChartsOptions) error { continue } - if err := processOnlineV1Beta2HelmChartImages(opts, &helmChart, chartDir); err != nil { - return errors.Wrap(err, "failed to process online images") + if err := image.CopyOnlineImages(opts.ProcessImageOptions, chartImages, opts.KotsKinds, opts.KotsKinds.License, dockerHubRegistryCreds, opts.RenderOptions.Log); err != nil { + return errors.Wrap(err, "failed to copy online images") } } @@ -264,62 +285,42 @@ func templateV1Beta2HelmChartWithValuesToDir(helmChart *kotsv1beta2.HelmChart, c return nil } -func processOnlineV1Beta2HelmChartImages(opts WriteV1Beta2HelmChartsOptions, helmChart *kotsv1beta2.HelmChart, chartDir string) error { +func findV1Beta2HelmChartImages(opts WriteV1Beta2HelmChartsOptions, helmChart *kotsv1beta2.HelmChart, chartDir string) ([]string, error) { // template the chart with the builder values to a temp dir and then process images tmpDir, err := os.MkdirTemp("", fmt.Sprintf("kots-images-%s", helmChart.GetDirName())) if err != nil { - return errors.Wrap(err, "failed to create temp dir for image processing") + return nil, errors.Wrap(err, "failed to create temp dir for image processing") } defer os.RemoveAll(tmpDir) builderHelmValues, err := helmChart.GetBuilderValues() if err != nil { - return errors.Wrap(err, "failed to get builder values for chart") + return nil, errors.Wrap(err, "failed to get builder values for chart") } builderValuesContent, err := yaml.Marshal(builderHelmValues) if err != nil { - return errors.Wrap(err, "failed to marshal builder values") + return nil, errors.Wrap(err, "failed to marshal builder values") } builderValuesPath := path.Join(tmpDir, "builder-values.yaml") if err := os.WriteFile(builderValuesPath, builderValuesContent, 0644); err != nil { - return errors.Wrap(err, "failed to write builder values file") + return nil, errors.Wrap(err, "failed to write builder values file") } templatedOutputDir := path.Join(tmpDir, helmChart.GetDirName()) if err := os.Mkdir(templatedOutputDir, 0755); err != nil { - return errors.Wrap(err, "failed to create temp dir for image processing") + return nil, errors.Wrap(err, "failed to create temp dir for image processing") } if err := templateV1Beta2HelmChartWithValuesToDir(helmChart, chartDir, builderValuesPath, templatedOutputDir, opts.RenderOptions.Log.Debug); err != nil { - return errors.Wrap(err, "failed to template helm chart for image processing") - } - - var dockerHubRegistryCreds registry.Credentials - dockerhubSecret, _ := registry.GetDockerHubPullSecret(opts.Clientset, util.PodNamespace, opts.ProcessImageOptions.Namespace, opts.ProcessImageOptions.AppSlug) - if dockerhubSecret != nil { - dockerHubRegistryCreds, _ = registry.GetCredentialsForRegistryFromConfigJSON(dockerhubSecret.Data[".dockerconfigjson"], registry.DockerHubRegistryName) + return nil, errors.Wrap(err, "failed to template helm chart for image processing") } chartImages, err := image.FindImagesInDir(templatedOutputDir) if err != nil { - return errors.Wrap(err, "failed to find base images") - } - - if err := image.UpdateInstallationImages(image.UpdateInstallationImagesOptions{ - Images: chartImages, - KotsKinds: opts.KotsKinds, - IsAirgap: opts.ProcessImageOptions.IsAirgap, - UpstreamDir: opts.Upstream.GetUpstreamDir(opts.WriteUpstreamOptions), - DockerHubRegistryCreds: dockerHubRegistryCreds, - }); err != nil { - return errors.Wrap(err, "failed to update installation images") + return nil, errors.Wrap(err, "failed to find images in dir") } - if err := image.CopyOnlineImages(opts.ProcessImageOptions, chartImages, opts.KotsKinds, opts.KotsKinds.License, dockerHubRegistryCreds, opts.RenderOptions.Log); err != nil { - return errors.Wrap(err, "failed to rewrite base images") - } - - return nil + return chartImages, nil } diff --git a/pkg/tests/pull/cases/airgap/testcase.yaml b/pkg/tests/pull/cases/airgap/testcase.yaml new file mode 100644 index 0000000000..406773976c --- /dev/null +++ b/pkg/tests/pull/cases/airgap/testcase.yaml @@ -0,0 +1,18 @@ +Name: test airgap +PullOptions: + Namespace: app-namespace + ExcludeAdminConsole: true + IsAirgap: true + Silent: true + LocalPath: cases/airgap/upstream + RootDir: cases/airgap/results + SharedPassword: dummy-pass + RewriteImages: true + RewriteImageOptions: + Hostname: ttl.sh + Namespace: test + Username: test + Password: fake-pass + IsReadOnly: true + Downstreams: + - this-cluster \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/upstream/kots-app.yaml b/pkg/tests/pull/cases/airgap/upstream/kots-app.yaml new file mode 100644 index 0000000000..d10ce3862d --- /dev/null +++ b/pkg/tests/pull/cases/airgap/upstream/kots-app.yaml @@ -0,0 +1,8 @@ +apiVersion: kots.io/v1beta1 +kind: Application +metadata: + name: my-app + annotations: + kots.io/exclude: "true" +spec: + title: my-app diff --git a/pkg/tests/pull/cases/airgap/upstream/my-chart-0.1.0.tgz b/pkg/tests/pull/cases/airgap/upstream/my-chart-0.1.0.tgz new file mode 100644 index 0000000000..dd79ddc8a7 Binary files /dev/null and b/pkg/tests/pull/cases/airgap/upstream/my-chart-0.1.0.tgz differ diff --git a/pkg/tests/pull/cases/airgap/upstream/my-chart.yaml b/pkg/tests/pull/cases/airgap/upstream/my-chart.yaml new file mode 100644 index 0000000000..ddac6450f7 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/upstream/my-chart.yaml @@ -0,0 +1,19 @@ +apiVersion: kots.io/v1beta1 +kind: HelmChart +metadata: + name: my-chart +spec: + # chart identifies a matching chart from a .tgz + chart: + name: my-chart + chartVersion: 0.1.0 + releaseName: my-chart-release + useHelmInstall: true + + # values are used in the customer environment, as a pre-render step + # these values will be supplied to helm template + values: {} + + # builder values provide a way to render the chart with all images + # and manifests. this is used in replicated to create airgap packages + builder: {} diff --git a/pkg/tests/pull/cases/airgap/upstream/replicated-1.0.0-beta.12.tgz b/pkg/tests/pull/cases/airgap/upstream/replicated-1.0.0-beta.12.tgz new file mode 100644 index 0000000000..f8b693aff1 Binary files /dev/null and b/pkg/tests/pull/cases/airgap/upstream/replicated-1.0.0-beta.12.tgz differ diff --git a/pkg/tests/pull/cases/airgap/upstream/replicated.yaml b/pkg/tests/pull/cases/airgap/upstream/replicated.yaml new file mode 100644 index 0000000000..d22998fd26 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/upstream/replicated.yaml @@ -0,0 +1,18 @@ +apiVersion: kots.io/v1beta2 +kind: HelmChart +metadata: + name: replicated + annotations: + kots.io/exclude: "true" +spec: + chart: + name: replicated + chartVersion: 1.0.0-beta.12 + releaseName: replicated-release + values: + my-value: my-value + optionalValues: + - when: 'repl{{ "true" }}' + recursiveMerge: true + values: + my-optional-value: my-optional-value diff --git a/pkg/tests/pull/cases/airgap/upstream/subdir/configmap.yaml b/pkg/tests/pull/cases/airgap/upstream/subdir/configmap.yaml new file mode 100644 index 0000000000..73843036cb --- /dev/null +++ b/pkg/tests/pull/cases/airgap/upstream/subdir/configmap.yaml @@ -0,0 +1,25 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: test-licenseinfo +data: + dockerCfg: {{repl LicenseDockerCfg }} + licenseFieldValueIsGitOpsSupported: {{repl LicenseFieldValue "isGitOpsSupported" }} + licenseFieldValueIsIdentityServiceSupported: {{repl LicenseFieldValue "isIdentityServiceSupported" }} + licenseFieldValueIsGeoaxisSupported: {{repl LicenseFieldValue "isGeoaxisSupported" }} + licenseFieldValueIsAirgapSupported: {{repl LicenseFieldValue "isAirgapSupported" }} + licenseFieldValueLicenseType: {{repl LicenseFieldValue "licenseType" }} + licenseFieldValueLicenseSequence: {{repl LicenseFieldValue "licenseSequence" }} + licenseFieldValueSignature: '{{repl LicenseFieldValue "signature" }}' + licenseFieldValueAppSlug: {{repl LicenseFieldValue "appSlug" }} + licenseFieldValueChannelID: {{repl LicenseFieldValue "channelID" }} + licenseFieldValueChannelName: {{repl LicenseFieldValue "channelName" }} + licenseFieldValueCustomerName: {{repl LicenseFieldValue "customerName" }} + licenseFieldValueEndpoint: {{repl LicenseFieldValue "endpoint" }} + licenseFieldValueLicenseID: {{repl LicenseFieldValue "licenseID" }} + licenseFieldValueLicenseId: {{repl LicenseFieldValue "licenseId" }} + licenseFieldValueCustomIntField: {{repl LicenseFieldValue "int_field" }} + licenseFieldValueCustomStringField: {{repl LicenseFieldValue "string_field" }} + licenseFieldValueCustomTextField: "{{repl LicenseFieldValue "text_field" | replace "\n" "\\n" }}" + licenseFieldValueCustomBoolField: "{{repl LicenseFieldValue "bool_field" }}" + licenseFieldValueCustomHiddenField: "{{repl LicenseFieldValue "hidden_field" }}" diff --git a/pkg/tests/pull/cases/airgap/upstream/subdir/nginx.yaml b/pkg/tests/pull/cases/airgap/upstream/subdir/nginx.yaml new file mode 100644 index 0000000000..0b288ece73 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/upstream/subdir/nginx.yaml @@ -0,0 +1,34 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: nginx +--- +kind: Service +apiVersion: v1 +metadata: + name: nginx + labels: + app: nginx +spec: + ports: + - port: 80 + name: web +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: nginx +spec: + selector: + matchLabels: + app: nginx + replicas: 1 + template: + metadata: + labels: + app: nginx + spec: + serviceAccountName: nginx + containers: + - name: nginx + image: nginx:1.24 diff --git a/pkg/tests/pull/cases/airgap/upstream/test-chart-0.1.0.tgz b/pkg/tests/pull/cases/airgap/upstream/test-chart-0.1.0.tgz new file mode 100644 index 0000000000..aaa774dc03 Binary files /dev/null and b/pkg/tests/pull/cases/airgap/upstream/test-chart-0.1.0.tgz differ diff --git a/pkg/tests/pull/cases/airgap/upstream/test-chart.yaml b/pkg/tests/pull/cases/airgap/upstream/test-chart.yaml new file mode 100644 index 0000000000..4710b18f0e --- /dev/null +++ b/pkg/tests/pull/cases/airgap/upstream/test-chart.yaml @@ -0,0 +1,19 @@ +apiVersion: kots.io/v1beta1 +kind: HelmChart +metadata: + name: test-chart +spec: + # chart identifies a matching chart from a .tgz + chart: + name: test-chart + chartVersion: 0.1.0 + useHelmInstall: false + namespace: helmns + + # values are used in the customer environment, as a pre-render step + # these values will be supplied to helm template + values: {} + + # builder values provide a way to render the chart with all images + # and manifests. this is used in replicated to create airgap packages + builder: {} diff --git a/pkg/tests/pull/cases/airgap/upstream/userdata/config.yaml b/pkg/tests/pull/cases/airgap/upstream/userdata/config.yaml new file mode 100644 index 0000000000..fbbf7d0972 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/upstream/userdata/config.yaml @@ -0,0 +1,10 @@ +apiVersion: kots.io/v1beta1 +kind: ConfigValues +metadata: + creationTimestamp: null + name: my-app +spec: + values: + hostname: + value: "my-app.somebigbank.com" +status: {} diff --git a/pkg/tests/pull/cases/airgap/upstream/userdata/license.yaml b/pkg/tests/pull/cases/airgap/upstream/userdata/license.yaml new file mode 100644 index 0000000000..25cc45c08b --- /dev/null +++ b/pkg/tests/pull/cases/airgap/upstream/userdata/license.yaml @@ -0,0 +1,47 @@ +apiVersion: kots.io/v1beta1 +kind: License +metadata: + name: testcustomer +spec: + appSlug: my-app + channelID: 1vusIYZLAVxMG6q760OJmRKj5i5 + channelName: My Channel + customerName: Test Customer + endpoint: https://replicated.app + entitlements: + bool_field: + title: Bool Field + value: true + valueType: Boolean + expires_at: + description: License Expiration + title: Expiration + value: "2030-07-27T00:00:00Z" + valueType: String + hidden_field: + isHidden: true + title: Hidden Field + value: this is secret + valueType: String + int_field: + title: Int Field + value: 123 + valueType: Integer + string_field: + title: StringField + value: single line text + valueType: String + text_field: + title: Text Field + value: |- + multi + line + text + valueType: Text + isAirgapSupported: true + isGitOpsSupported: true + isSnapshotSupported: true + licenseID: 1vusOokxAVp1tkRGuyxnF23PJcq + licenseSequence: 7 + licenseType: prod + signature: eyJsaWNlbnNlRGF0YSI6ImV5SmhjR2xXWlhKemFXOXVJam9pYTI5MGN5NXBieTkyTVdKbGRHRXhJaXdpYTJsdVpDSTZJa3hwWTJWdWMyVWlMQ0p0WlhSaFpHRjBZU0k2ZXlKdVlXMWxJam9pZEdWemRHTjFjM1J2YldWeUluMHNJbk53WldNaU9uc2liR2xqWlc1elpVbEVJam9pTVhaMWMwOXZhM2hCVm5BeGRHdFNSM1Y1ZUc1R01qTlFTbU54SWl3aWJHbGpaVzV6WlZSNWNHVWlPaUp3Y205a0lpd2lZM1Z6ZEc5dFpYSk9ZVzFsSWpvaVZHVnpkQ0JEZFhOMGIyMWxjaUlzSW1Gd2NGTnNkV2NpT2lKdGVTMWhjSEFpTENKamFHRnVibVZzU1VRaU9pSXhkblZ6U1ZsYVRFRldlRTFITm5FM05qQlBTbTFTUzJvMWFUVWlMQ0pqYUdGdWJtVnNUbUZ0WlNJNklrMTVJRU5vWVc1dVpXd2lMQ0pzYVdObGJuTmxVMlZ4ZFdWdVkyVWlPamNzSW1WdVpIQnZhVzUwSWpvaWFIUjBjSE02THk5eVpYQnNhV05oZEdWa0xtRndjQ0lzSW1WdWRHbDBiR1Z0Wlc1MGN5STZleUppYjI5c1gyWnBaV3hrSWpwN0luUnBkR3hsSWpvaVFtOXZiQ0JHYVdWc1pDSXNJblpoYkhWbElqcDBjblZsTENKMllXeDFaVlI1Y0dVaU9pSkNiMjlzWldGdUluMHNJbVY0Y0dseVpYTmZZWFFpT25zaWRHbDBiR1VpT2lKRmVIQnBjbUYwYVc5dUlpd2laR1Z6WTNKcGNIUnBiMjRpT2lKTWFXTmxibk5sSUVWNGNHbHlZWFJwYjI0aUxDSjJZV3gxWlNJNklqSXdNekF0TURjdE1qZFVNREE2TURBNk1EQmFJaXdpZG1Gc2RXVlVlWEJsSWpvaVUzUnlhVzVuSW4wc0ltaHBaR1JsYmw5bWFXVnNaQ0k2ZXlKMGFYUnNaU0k2SWtocFpHUmxiaUJHYVdWc1pDSXNJblpoYkhWbElqb2lkR2hwY3lCcGN5QnpaV055WlhRaUxDSjJZV3gxWlZSNWNHVWlPaUpUZEhKcGJtY2lMQ0pwYzBocFpHUmxiaUk2ZEhKMVpYMHNJbWx1ZEY5bWFXVnNaQ0k2ZXlKMGFYUnNaU0k2SWtsdWRDQkdhV1ZzWkNJc0luWmhiSFZsSWpveE1qTXNJblpoYkhWbFZIbHdaU0k2SWtsdWRHVm5aWElpZlN3aWMzUnlhVzVuWDJacFpXeGtJanA3SW5ScGRHeGxJam9pVTNSeWFXNW5SbWxsYkdRaUxDSjJZV3gxWlNJNkluTnBibWRzWlNCc2FXNWxJSFJsZUhRaUxDSjJZV3gxWlZSNWNHVWlPaUpUZEhKcGJtY2lmU3dpZEdWNGRGOW1hV1ZzWkNJNmV5SjBhWFJzWlNJNklsUmxlSFFnUm1sbGJHUWlMQ0oyWVd4MVpTSTZJbTExYkhScFhHNXNhVzVsWEc1MFpYaDBJaXdpZG1Gc2RXVlVlWEJsSWpvaVZHVjRkQ0o5ZlN3aWFYTkJhWEpuWVhCVGRYQndiM0owWldRaU9uUnlkV1VzSW1selIybDBUM0J6VTNWd2NHOXlkR1ZrSWpwMGNuVmxMQ0pwYzFOdVlYQnphRzkwVTNWd2NHOXlkR1ZrSWpwMGNuVmxmWDA9IiwiaW5uZXJTaWduYXR1cmUiOiJleUpzYVdObGJuTmxVMmxuYm1GMGRYSmxJam9pYUhneE1XTXZUR1ozUTNoVE5YRmtRWEJGU1hGdVRrMU9NMHBLYTJzNFZHZFhSVVpzVDFKVlJ6UjJjR1YzZEZoV1YzbG1lamRZY0hBd1ExazJZamRyUVRSS2N6TklhR3d3YkZJMFdUQTFMemN2UVVkQ2FEZFZNSGczUkhaTVozUXpVM00wYm5GTFZTdFhXRXBTVHpKWVFVRnZSME4xZFRWR1RGcHJRVWhYY1RSUVFtMXphSFY2Y1ZsdmNucHhlbGhGWVZWVlpFUlVkVXhDTW1nNWFIZ3dXRWhQUmxwUk16bHVkbTlPUjJaT2R5OTRTVmRaZEhSUGRYZHZhMncyTVZsb1JVeFZlRmQxU1ZSRmMwTlVhM2xtTVRNd09IazVSbFJzWlRKeVYyZEVlSEZNYTBSUFNXVXlPRWwzUzJSQkwySXdWVUl5VEZGbVRWcHdWemwyUTNCSkwybHlWek5uYmpaeU5WWjNWMjB2U1dweWJtNDNSelJrVmpadVYzcFRkMGhQUTJSdWEwMTRNRXQ1VVVOa0wxQjFaWEpUYjNSdVEwOXRTMDEzWlRSTGJqaERkMU5YVVRRNGRURkRNbTFpV1VzeGRYTlpOM1YzUFQwaUxDSndkV0pzYVdOTFpYa2lPaUl0TFMwdExVSkZSMGxPSUZCVlFreEpReUJMUlZrdExTMHRMVnh1VFVsSlFrbHFRVTVDWjJ0eGFHdHBSemwzTUVKQlVVVkdRVUZQUTBGUk9FRk5TVWxDUTJkTFEwRlJSVUZ6TkhKdlVIcDFhV1JNZVhOMmIxWTJkemxhTkZ4dVdHRmliME5tWTJNeGFHZFZhQ3N3V1VkS2NFNURSVXhyTjBaTFF5OTJhemR6ZERsR05tY3dUMjlrU0VSbGVYZFJXa2hLZFU1TVpsUnNRbEJHUTJOaU5seHVObTlzVEZOeWNGQTRjbFUzU0d4SGJsRkVSMFJNYVhkS1EyaGtSRGRVVUdSM2FXdHBkMHRGY201aldqaEdaalZsU25vd2RETmlUWFpyVDJaVVluSkJiRnh1WWtGQ1kwbzVNVmxVT1hKdVVXOXFkVWN4UldKUVRqaEZWblI2TWxZNE5IZHViR2Q0TUhCd2JEVjRPSFpOYlhwcE1ISnVibEZVV1VGamJ6WnFhMnBJTTF4dVRuTlVkWE4xUzFkdlJGUjVNWE5yZGtSUk9IbEJZV0ptWTNNME4zWnNRazAwU0RGT1JFNHZSSFJhWWxZdllubDJia0o2YkM4eFZrVnpURmRqWlZWcFRGeHVSWEYxT0VkeWF5dFFVRGQyUkdSd2JFUjNjWFpQV2t4RmRYazNkamhuUm01U09WUlVSV3ByTlVvNWRuWlVTR2RtU25VemVubEVPR2xLWTBSRE5YcHFPVnh1YjFGSlJFRlJRVUpjYmkwdExTMHRSVTVFSUZCVlFreEpReUJMUlZrdExTMHRMVnh1SWl3aWEyVjVVMmxuYm1GMGRYSmxJam9pWlhsS2VtRlhaSFZaV0ZJeFkyMVZhVTlwU2pCUldIQjJXVE5LVms1NmFGaFNSMlJzVVRKb2NtTklXa1ZVVlRsRldqQktXVTFGUmtaVFJFNUZVMGhLYkUxclRUTkxNSEJFVkROR2VGTnROVVJVVlRWVlltMDFiVnBGUm5sWldIQjZaRVJqTVZaSGFFeFBXRUpVVWtacmRrd3diek5aTUZaSlVteFdWRXd5T1VoV1JXeHNWa1ZPTUZSSE1WWlJNR04zVkd4R2JGa3pTblJUUm1zMFZVWk9hMVpWU2pCVU1WbDNZbXQwY0ZSclZuQmpia0poVFZjNWFtSldiSEZaYTNob1UyeHNWV0pGUmtWWGJVWnZWakZLVUZkcWJGSmhXRVp1V2xkb1EyRnVRak5TUjNNd1lWWkpOVTVXVmxkV1ZUVnlUMGhLYjFsVlRYbGhiVGcwVjBkYWVGbHFWbFppYlhoeFpFWkZkMDU1Y3pCaFZsSkpWRVpPTm1WRk1IcGxWWFJ2VFVaR1ZtRXdWVFJSVnpsSFVsaEtVRTFZUmxCU01WcFJVMVJDTmxsV2FIcFdWWEJ0WTBSU2JFMVVRazlPVjNSU1ZucFdUMU5XWTNaU1ZYUkZVMGhzYlU5VmJGaGtNMUl3WTFWc1lXTlhSakJTYTA1RVlVWmtjbUo2VmtSU00wSllUREkxUmsxWVl6SmxWM1JKVlZoQk1sVXhTbEppU0Zwd1VrVXdNRlpFVWt0VU1rWnNVVmQwYzFSV1VrMVVWV055V1RCYVRHSXpaRTlUVm05NVlraE9SR1JzVG5aUmFrWmFaVmRPVGxOVlNteGFiRXB1Wld0U2RVMHhSVGxRVTBselNXMWtjMkl5U21oaVJYUnNaVlZzYTBscWIybFpiVkpzV2xSVk1rNVVXWGRaTWxwcFRrUk9hazlYU1hsUFIwcHRUMVJvYkZsWFRtaGFiVVV5VGtSWmFXWlJQVDBpZlE9PSJ9 diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/Chart.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/Chart.yaml new file mode 100644 index 0000000000..5e4dbdb5d6 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 0.1.0 +description: A Helm chart for Kubernetes +name: my-chart +type: application +version: 0.1.0 diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/kustomization.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/kustomization.yaml new file mode 100644 index 0000000000..5904b4dc35 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/kustomization.yaml @@ -0,0 +1,8 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +metadata: + annotations: + kots.io/kustomization: base +resources: +- templates/my-chart-configmap.yaml +- templates/my-chart-pod.yaml diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/templates/my-chart-configmap.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/templates/my-chart-configmap.yaml new file mode 100644 index 0000000000..9d552489d6 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/templates/my-chart-configmap.yaml @@ -0,0 +1,6 @@ +# Source: my-chart/templates/my-chart-configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: my-chart-configmap +data: {} diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/templates/my-chart-pod.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/templates/my-chart-pod.yaml new file mode 100644 index 0000000000..60224953fe --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/templates/my-chart-pod.yaml @@ -0,0 +1,11 @@ +# Source: my-chart/templates/my-chart-pod.yaml +apiVersion: v1 +kind: Pod +metadata: + name: my-chart-pod +spec: + containers: + - name: my-chart-container + image: nginx:1.23 + ports: + - containerPort: 80 diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/values.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/values.yaml new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/values.yaml @@ -0,0 +1 @@ +{} diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/Chart.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/Chart.yaml new file mode 100644 index 0000000000..5b721b173a --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.16.0 +description: A Helm chart for Kubernetes +name: test-chart +type: application +version: 0.1.0 diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/chartHelmSecret.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/chartHelmSecret.yaml new file mode 100644 index 0000000000..4691b32af5 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/chartHelmSecret.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +data: + release: SDRzSUFBQUFBQUFDLyt4WmIzT2l6TEwvS2hUM3JTYUFNYlZTZFY0SWlZUm9UTlNFZnpkYlc4TXdBbWFZWVdGUWNTdmYvZFlBUmpUSnMwL3VuaGVuNmp5cDJsV2ErZFA5NjE5M1Q0Ky9SQUlTSktvaVF6bnJ3Z2hrVE95SU1WbFNVZjBsTHVNc1p6OENsR0phb2tCVVJiRWpZdkJPRkNDTTJPRWhoMW1jc3BnU1VSV3ZzbExJQ2lKQW1xUjhrTmdSY3daWWtZdXErTGJJYTBlc2QxWi9pUWxpSUFBTThPOGZxYlpHV1Y0dkxaM0paOUs3RFlmQ0RjS0pVQTBYbGpRVHhvV1BNb0lZeXNXT0NOTFllbHRnclZTUzlDQ1J6K1RMYWsxV3BueG5rS1k0aHFCYStyVWpZZ3BmUkpVVUdIZEVocElVQTc2cStyOHRUUnZoT2RmNXJBUUo1Z3BXNW9pdW82VldZcFZRd1d0L1JjTmdkVDBHQ2k2OEt4bytLZFlLSnBha0p6SU9qTkdMNjh5ais1Q0dwakVxL0dRZ3VjNDg5WlgrcnBMcHc5RHZCWVZuejVoTFhpN05teWwyZTFZSm5IbC80c3l4YTB0alU5ZHkxNzdGL3MzZHBSNFBRMVBYMW9IU3gzQkZRM2NoRTgvdVk1aU1KTDVHdFpaak1qOFpNVy9HOSt4SHZ2MTBzdTUwNWRwOVBtNE1lL01TMkgweU4wYVMrMGo1WHBubnZGeWF4blVJZTliR2M4elF1NmsvWVdPWGFUQ01acFJORnRMNEZBZlgwVGF3SENoM3N6UURkdi9sUHRhdVBVZkwvUjVtbnQzL0FKTnQ1Q1pXRG5kODd5SEhhQVAxZmhiWXR4Z21mUndZMW02UzRQVkV3UVhzelNNL21lTDdXTnQ1OWxTR0NaYlFRcFk4WnlvMXVFVHdabGlBbmhWN3ptM2hPWE1NeTM3cWx3UG0ydjNJVTZ5WGlYM2J2NDgxMDdPMzdEZHpDdGVXK1Y0WUdTTUdqUzJlMkZQcU9yZS8yMHZ4bk5zZHNBZkZmVHpjVGxiWHltUTFiR3lMc0c5SUJWVEN0YXRFRVNTelM5T3dMbHhiM3ZqR0UydGs3RTYvMk5aenRMME83K3lkMk8vbWpXRlB3MjZGbzFaeXpJRTlqZUNPaG5lY0J6ZFQ3QnZXS2pBRzVSdnY3SkhrS3RIZE1iZisxQWQvTmIvaDRudWJ1YzZTVjhsR2t2ZTQ1OElKVi9RSzkveWR2dnF3NHQwa1liS2JXS1dmV0pMbjNCWEEvcllHZG44WEdLUENWWjdleFJic3pjYjcrWC9BZ3gwMHJGVkx2NVd2OUNYWHhnWG53VUUrWktaaEZjR0t0dmJrc2dhVDBYUTBrNjNGd3BwN2pqeTltajMxNytmVzdYSWhXWjZ6RzI0cUh4N21oVUV5eWdQYk1tQXlZSzA5OWpwdzM1U2VNNTk0RGw1NHRudUUxZjRmVUN3ZUN6emV4NmZ2UHVIZXpsVjREclBLOW5yQWxpT1A0MnYwQ2JEN0YvZkpOdUkrRDRZdHZmWjJHakxQUHdjLzJOTzFUK1lSNERuc0NLdnAycmZseUU5bVI3cFBGc08xbStCaTBwdm1ubTF0VHQ3Rjk0L0R6WjF1dHYyYSt2YUllSTgwZE8zdGh1OXp2N29ycGgvcGRoTkVnUHM5L0NTM0pUeGV3blU3MXkrU1FmeDM4end3ck54ZjlIZEFIMUJmR1dUM3NiYnhlenlXbTdneU51L3lCREFHYTFES1BjL0dCTnpNTGszZExNMnduZGUxTmV6TldNUHozTmZsbjc1aXRuTkI3TnJUekZlODVOSEFERGl6Uy9QcTdpdng5bWtPK2pyL1AvT3B0Z050ZitoU09MSHZqdVBrcHZhM2VYVzkrWmg3b3h3YXVQRGFjV0pnNXRvQmZycXhjbitrclgwRHI5QWpEUmUyZCsvMzVqT1lXTHVxSnJYV3Ercm1JdzBiM0kvejJzMHQ1bjZDWkQ3emxXM3E5bDR1emVzK0RxcDRrTmhrbGtiUXdQWWgvMnV4Njh4WFFEK3FoMlB1SDkrMkpOZWVSNEZ4WFdIQjY3SGY0ODk0N1pPM09rOTVuWnFRS1owbzBkcFhjdTd2MGx2SXFVK21rbXR2ODAvR3NVQ3hVaytKcFB0NEdOL0ZacnVXYkdEeTlBOWYvalA1MHViSnpGZG1mOENUcXI0eDJMTldybUx0NE9hZnM5YS84YXpGcXZxbXk1eTdoV2RQSmE2RFRxWWJ6NjU5NGlxRElqQkdLYStWRGQ3TU5FYWwxM3M3dDdBUHppUE1jNkxJZDdUY1c4Z3JZSXpLNElwZTNEVmNkNVVCOCswUnJ6dmpQZThESmNEN09udmc5cTBNZXpqMmUrSDRwTDRSejVrMTU4T3B4UEY5TWdiOG5NajlkTzg1SHE5OS94SmZ2M2ZFTmNBRjc0ZCtpV0M1akVuTVNsSDk5ZG9SUWNGb0RnR09TY2hmSWdKOHpMdkZKY0E1Nm9nSjJNNVIxV2Zsb2lwTFVrZE1ZdEtTZEVRR3NoQXgvZUhwaWNVNDNsWDkyQVBLSUNJTWhFaFV2MG12SFhGWllNemJzUHMxeXJJNFFIVTNHaWZWaUY5aVdtRDhRSEVNUzFFVnplV1Vzb2NNNVlqd25qSkRLYzFqUmpQK2pvUXgyZklXRUlSOGlkZG1qWWNDNHdXQ0dXSzg0L3ZPZStRd1EzbHRMaUdVVlZybHRjV25Ka1kwWjNXanlMK0phdDN1ZHRFVzhLNzRERk1JZUtPWUFoWlZxM00wR2E2L2RzVDNWaEVhb0FYQ0NES2ExVHVtTkJpZWFwSFNZSUZna2NXczFDbGhhTXRxZVZaanE5T0NzQXJmRE9XMHlDQnE1dVVmVGNwUnRvNWhEU1hscmZvMzVhMU4xbkdSTTVTWkQrSmg0QkRDZXYwUDRJRVpBZ3lKS3NzSzFObjN6bnd1b3hobCs1R1Y3VG1NVUFMMlRmY3l4c2NOOTFtRWNCS0hoR2JvMEdpYnBUWnpuYm5FQXgrV211U1hXdW9wL1RWTW5zSkFpYkFmYTNGZzQ5emp5YnpVTnJ4NDhTUU95NHV4V1dwUHdNQTc4MllxUTM1UUluUCtuU2ZMM0RTQzNGZk1mUk9VK2duTWVjTG1CUTQ0SGpadnRDZ3d3dVAzeHFqd2huUmxHbjNzS2FNcTZFMDkyc0RFU29BVFlVL1hlc0NaVTFPL1RpZXg5dUFuMjc1cERBcHZvVzMyTnBnM0dvWXhiODc2ZUJMU1lqNmFMcDk2YzI0UDEvZktWMlRtS3hlaDlUSjlOSTE1Q3NuZGVKSUVhYUIvcXo4TlRQeGtVSG96V3Jna0xTZWIraFBZUWVIM2JyRWU5NmxYOHJFUmFjbDJRWEt4MXVPN2NGWWxrVUZoR3JlUnF6QVo2bG9DN0MyR0cvcHpRcVk5T0tRL0o4bHRCS3JuT2F1ZkJ5V3c0WGhNS2t4dDE3bE4vWjYxTTYveDlkeTVHMCtJVnZwS2l0M2ViRHhKOEl0blg2LzFtQmFCSVc5Z012aXB4MzBGS3RPMVp6eXQ5ZkJmUE1HODhsUkI0aVdxSXFqYjdUNlQveEVXRlhGVjRYQkhkUDdCSmN3ek9WejhxTUphZmlZdk1RbFVvUTdvWjdLL2RGS2ZpU0MwNkZvOUN3TGRFQlIwL1ZJVjlxSFJaUWdrL0NVR1BzTHRjWmtxZ0c2SUNPY3hDcnFWcU12WnlvZnd6OVlpT1FTRW9PeVo1Q3lMU1hpMTErQUZsYW9BaEx4SVVTWUUxZjk1cFNsLzgweit3SFNRcHZuNXdmNnI2Z1l1UWVRVWd5T3pRSnFldmJ6ZG9wM0Y5RHdtT1FNRW9pTkFjdmJaOEFRUUVEWUkzaUNjZkRhdWhxZkppclZKbncxZDd5MnFyK3pxWVR3Wm5PWFJlVFh6WktGdWRWMzRnUk1xK0U3MnpGTUVLK09iVkptcmdzd2Y4eWJuTnNBa2dNRm8wb2JxeTJCOUFZYTljL2VidC8zRi8vQ3hJdjhQVmI3a2t6ZU0rQitraElHWW9PeXdmMWRBWk4zU3B0c0F2N2pXbitibW8vdGpvUStuMCt2NWovRzErME9TNU1OSVFhaE9FcU9NSm1wYktqUlJNRWJsSEMxUFhqVlJVd1hJc2Z5em9OdS9yOHE3S2xSMVg2Mmlwd1ZJUFRrcHUyL3ozMHc5R0FwcGtnQVNIQmw3N3Nma1BNY0lwVzNwc3ppUUpPbFpmTGM3d0dsTWtObzd1empkZXdOaXhqY1QrVEdDdmh5VnY3OGdjUzJDbEJBRXEvdnJqc2hqWGxURkJ4bzBaNDJqdS9Yemp5K3ZXeW4zNHh6NlFJUGZKdEI5WUhJRG1vU1ZGeENpUFArdlR6YW5mbW9sbjVPZzZnb2dDL2N3ZGY5cVRmVmJvK014TWJ2Q0prU05rUTN0L0NJdmZicXRaUTNmbWpFWnlobklXSDFtVm9VcFdxTk03SWhvalVoMWxxMm9JMzV2ZmhES0NzS1BldFVVRlB3QXJENm83bi8yT1VqU0NPVDFjZSsxODhiamxPYXNXL2taNCs2SytnZXkzbFlQZjBoV24rZnBWdG03cGY0WEtkdFc4UDM3N2diRlljUlU0VmxVNnRpdW9UdzFxK1ZiSDhBWHVseE80aVJtcXREN08vbjlBeXI5M1V6OFVZTEtvL1pURng2OTQzbExrS1ZQMHRTSitPR3R0VktGZG1kMW1za3FxTnJwOWJjVWF3UDRKMVRyaUxXSFJGVnBzeTVELzlta08rajNCYzRkRy9VUDViNUt1UU4rL3k3R2ZXLzlhaTNYL1c2ZUF0NUxpOXlqSkJkZi95OEFBUC8vL3FHMEdJY2ZBQUE9 +kind: Secret +metadata: + labels: + createdAt: "1" + name: test-chart + owner: helm + status: deployed + version: "1" + name: sh.helm.release.v1.test-chart.v1 + namespace: helmns +type: helm.sh/release.v1 diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/kustomization.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/kustomization.yaml new file mode 100644 index 0000000000..074775d621 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/kustomization.yaml @@ -0,0 +1,12 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +metadata: + annotations: + kots.io/kustomization: base +resources: +- chartHelmSecret.yaml +- test-1.yaml +- test-2.yaml +- test-3.yaml +- test-4.yaml +- test-5.yaml diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-1.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-1.yaml new file mode 100644 index 0000000000..57a2d11a47 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-1.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Secret +metadata: + annotations: + owned-by: security-team + labels: + owner: a-generated-owner-name + name: security-scanner + namespace: helmns +stringData: + key: a super duper secret key diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-2.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-2.yaml new file mode 100644 index 0000000000..e4e325d6c6 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-2.yaml @@ -0,0 +1,37 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/instance: security-test + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: example-chart + app.kubernetes.io/version: 1.16.0 + helm.sh/chart: example-chart-0.1.0 + name: security-test-example-chart + namespace: helmns +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: security-test + app.kubernetes.io/name: example-chart + template: + metadata: + labels: + app.kubernetes.io/instance: security-test + app.kubernetes.io/name: example-chart + spec: + containers: + - env: + - name: SECURITY_SCANNER_KEY_001 + valueFrom: + secretKeyRef: + key: key + name: security-scanner + image: nginx:latest + name: my-security-container + - command: + - /bin/sleep + - "9000" + image: alpine:3.4 + name: waiter diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-3.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-3.yaml new file mode 100644 index 0000000000..8370389271 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-3.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: Pod +metadata: + annotations: + helm.sh/hook: test-success + labels: + app.kubernetes.io/instance: security-test + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: example-chart + app.kubernetes.io/version: 1.16.0 + helm.sh/chart: example-chart-0.1.0 + name: security-test-example-chart-test-connection + namespace: helmns +spec: + containers: + - args: + - security-test-example-chart:80 + command: + - wget + image: busybox + name: wget + restartPolicy: Never diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-4.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-4.yaml new file mode 100644 index 0000000000..8c049a8b11 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-4.yaml @@ -0,0 +1,23 @@ +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + helm.sh/hook: post-install + helm.sh/hook-weight: "2" + name: post-install-job + namespace: helmns +spec: + backoffLimit: 3 + template: + metadata: + name: security-test + spec: + containers: + - command: + - sh + - -c + - sleep 10 + image: alpine + imagePullPolicy: IfNotPresent + name: hook-test + restartPolicy: Never diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-5.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-5.yaml new file mode 100644 index 0000000000..2abc24e5ae --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-5.yaml @@ -0,0 +1,23 @@ +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "2" + name: pre-install-job + namespace: helmns +spec: + backoffLimit: 3 + template: + metadata: + name: security-test + spec: + containers: + - command: + - sh + - -c + - sleep 10 + image: alpine + imagePullPolicy: IfNotPresent + name: hook-test + restartPolicy: Never diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/values.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/values.yaml new file mode 100644 index 0000000000..de2bccb1ac --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/values.yaml @@ -0,0 +1,34 @@ +affinity: {} +autoscaling: + enabled: false + maxReplicas: 100 + minReplicas: 1 + targetCPUUtilizationPercentage: 80 +fullnameOverride: "" +image: + pullPolicy: IfNotPresent + repository: nginx + tag: "" +imagePullSecrets: [] +ingress: + annotations: {} + enabled: false + hosts: + - host: chart-example.local + paths: [] + tls: [] +nameOverride: "" +nodeSelector: {} +podAnnotations: {} +podSecurityContext: {} +replicaCount: 1 +resources: {} +securityContext: {} +service: + port: 82 + type: ClusterIP +serviceAccount: + annotations: {} + create: true + name: "" +tolerations: [] diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/kustomization.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/kustomization.yaml new file mode 100644 index 0000000000..e5293ee40d --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/kustomization.yaml @@ -0,0 +1,16 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +metadata: + annotations: + kots.io/kustomization: base +resources: +- charts/test-chart/chartHelmSecret.yaml +- charts/test-chart/test-1.yaml +- charts/test-chart/test-2.yaml +- charts/test-chart/test-3.yaml +- charts/test-chart/test-4.yaml +- charts/test-chart/test-5.yaml +- subdir/configmap.yaml +- subdir/nginx-2.yaml +- subdir/nginx-3.yaml +- subdir/nginx.yaml diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/subdir/configmap.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/subdir/configmap.yaml new file mode 100644 index 0000000000..cb312455ad --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/subdir/configmap.yaml @@ -0,0 +1,25 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: test-licenseinfo +data: + dockerCfg: eyJhdXRocyI6eyJwcm94eS5yZXBsaWNhdGVkLmNvbSI6eyJhdXRoIjoiTVhaMWMwOXZhM2hCVm5BeGRHdFNSM1Y1ZUc1R01qTlFTbU54T2pGMmRYTlBiMnQ0UVZad01YUnJVa2QxZVhodVJqSXpVRXBqY1E9PSJ9LCJyZWdpc3RyeS5yZXBsaWNhdGVkLmNvbSI6eyJhdXRoIjoiTVhaMWMwOXZhM2hCVm5BeGRHdFNSM1Y1ZUc1R01qTlFTbU54T2pGMmRYTlBiMnQ0UVZad01YUnJVa2QxZVhodVJqSXpVRXBqY1E9PSJ9fX0= + licenseFieldValueIsGitOpsSupported: true + licenseFieldValueIsIdentityServiceSupported: false + licenseFieldValueIsGeoaxisSupported: false + licenseFieldValueIsAirgapSupported: true + licenseFieldValueLicenseType: prod + licenseFieldValueLicenseSequence: 7 + licenseFieldValueSignature: '{"licenseData":"eyJhcGlWZXJzaW9uIjoia290cy5pby92MWJldGExIiwia2luZCI6IkxpY2Vuc2UiLCJtZXRhZGF0YSI6eyJuYW1lIjoidGVzdGN1c3RvbWVyIn0sInNwZWMiOnsibGljZW5zZUlEIjoiMXZ1c09va3hBVnAxdGtSR3V5eG5GMjNQSmNxIiwibGljZW5zZVR5cGUiOiJwcm9kIiwiY3VzdG9tZXJOYW1lIjoiVGVzdCBDdXN0b21lciIsImFwcFNsdWciOiJteS1hcHAiLCJjaGFubmVsSUQiOiIxdnVzSVlaTEFWeE1HNnE3NjBPSm1SS2o1aTUiLCJjaGFubmVsTmFtZSI6Ik15IENoYW5uZWwiLCJsaWNlbnNlU2VxdWVuY2UiOjcsImVuZHBvaW50IjoiaHR0cHM6Ly9yZXBsaWNhdGVkLmFwcCIsImVudGl0bGVtZW50cyI6eyJib29sX2ZpZWxkIjp7InRpdGxlIjoiQm9vbCBGaWVsZCIsInZhbHVlIjp0cnVlLCJ2YWx1ZVR5cGUiOiJCb29sZWFuIn0sImV4cGlyZXNfYXQiOnsidGl0bGUiOiJFeHBpcmF0aW9uIiwiZGVzY3JpcHRpb24iOiJMaWNlbnNlIEV4cGlyYXRpb24iLCJ2YWx1ZSI6IjIwMzAtMDctMjdUMDA6MDA6MDBaIiwidmFsdWVUeXBlIjoiU3RyaW5nIn0sImhpZGRlbl9maWVsZCI6eyJ0aXRsZSI6IkhpZGRlbiBGaWVsZCIsInZhbHVlIjoidGhpcyBpcyBzZWNyZXQiLCJ2YWx1ZVR5cGUiOiJTdHJpbmciLCJpc0hpZGRlbiI6dHJ1ZX0sImludF9maWVsZCI6eyJ0aXRsZSI6IkludCBGaWVsZCIsInZhbHVlIjoxMjMsInZhbHVlVHlwZSI6IkludGVnZXIifSwic3RyaW5nX2ZpZWxkIjp7InRpdGxlIjoiU3RyaW5nRmllbGQiLCJ2YWx1ZSI6InNpbmdsZSBsaW5lIHRleHQiLCJ2YWx1ZVR5cGUiOiJTdHJpbmcifSwidGV4dF9maWVsZCI6eyJ0aXRsZSI6IlRleHQgRmllbGQiLCJ2YWx1ZSI6Im11bHRpXG5saW5lXG50ZXh0IiwidmFsdWVUeXBlIjoiVGV4dCJ9fSwiaXNBaXJnYXBTdXBwb3J0ZWQiOnRydWUsImlzR2l0T3BzU3VwcG9ydGVkIjp0cnVlLCJpc1NuYXBzaG90U3VwcG9ydGVkIjp0cnVlfX0=","innerSignature":"eyJsaWNlbnNlU2lnbmF0dXJlIjoiaHgxMWMvTGZ3Q3hTNXFkQXBFSXFuTk1OM0pKa2s4VGdXRUZsT1JVRzR2cGV3dFhWV3lmejdYcHAwQ1k2YjdrQTRKczNIaGwwbFI0WTA1LzcvQUdCaDdVMHg3RHZMZ3QzU3M0bnFLVStXWEpSTzJYQUFvR0N1dTVGTFprQUhXcTRQQm1zaHV6cVlvcnpxelhFYVVVZERUdUxCMmg5aHgwWEhPRlpRMzludm9OR2ZOdy94SVdZdHRPdXdva2w2MVloRUxVeFd1SVRFc0NUa3lmMTMwOHk5RlRsZTJyV2dEeHFMa0RPSWUyOEl3S2RBL2IwVUIyTFFmTVpwVzl2Q3BJL2lyVzNnbjZyNVZ3V20vSWpybm43RzRkVjZuV3pTd0hPQ2Rua014MEt5UUNkL1B1ZXJTb3RuQ09tS013ZTRLbjhDd1NXUTQ4dTFDMm1iWUsxdXNZN3V3PT0iLCJwdWJsaWNLZXkiOiItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFzNHJvUHp1aWRMeXN2b1Y2dzlaNFxuWGFib0NmY2MxaGdVaCswWUdKcE5DRUxrN0ZLQy92azdzdDlGNmcwT29kSERleXdRWkhKdU5MZlRsQlBGQ2NiNlxuNm9sTFNycFA4clU3SGxHblFER0RMaXdKQ2hkRDdUUGR3aWtpd0tFcm5jWjhGZjVlSnowdDNiTXZrT2ZUYnJBbFxuYkFCY0o5MVlUOXJuUW9qdUcxRWJQTjhFVnR6MlY4NHdubGd4MHBwbDV4OHZNbXppMHJublFUWUFjbzZqa2pIM1xuTnNUdXN1S1dvRFR5MXNrdkRROHlBYWJmY3M0N3ZsQk00SDFORE4vRHRaYlYvYnl2bkJ6bC8xVkVzTFdjZVVpTFxuRXF1OEdyaytQUDd2RGRwbER3cXZPWkxFdXk3djhnRm5SOVRURWprNUo5dnZUSGdmSnUzenlEOGlKY0RDNXpqOVxub1FJREFRQUJcbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIiwia2V5U2lnbmF0dXJlIjoiZXlKemFXZHVZWFIxY21VaU9pSjBRWHB2WTNKVk56aFhSR2RsUTJocmNIWkVUVTlFWjBKWU1FRkZTRE5FU0hKbE1rTTNLMHBEVDNGeFNtNURUVTVVYm01bVpFRnlZWHB6ZERjMVZHaExPWEJUUkZrdkwwbzNZMFZJUmxWVEwyOUhWRWxsVkVOMFRHMVZRMGN3VGxGbFkzSnRTRms0VUZOa1ZVSjBUMVl3Ymt0cFRrVnBjbkJhTVc5amJWbHFZa3hoU2xsVWJFRkVXbUZvVjFKUFdqbFJhWEZuWldoQ2FuQjNSR3MwYVZJNU5WVldWVTVyT0hKb1lVTXlhbTg0V0daeFlqVlZibXhxZEZFd055czBhVlJJVEZONmVFMHplVXRvTUZGVmEwVTRRVzlHUlhKUE1YRlBSMVpRU1RCNllWaHpWVXBtY0RSbE1UQk9OV3RSVnpWT1NWY3ZSVXRFU0hsbU9VbFhkM1IwY1VsYWNXRjBSa05EYUZkcmJ6VkRSM0JYTDI1Rk1YYzJlV3RJVVhBMlUxSlJiSFpwUkUwMFZEUktUMkZsUVd0c1RWUk1UVWNyWTBaTGIzZE9TVm95YkhORGRsTnZRakZaZVdOTlNVSmxabEpuZWtSdU0xRTlQU0lzSW1kc2IySmhiRXRsZVVsa0lqb2lZbVJsWlRVMk5UWXdZMlppTkROak9XSXlPR0ptT1RobFlXTmhabUUyTkRZaWZRPT0ifQ=="}' + licenseFieldValueAppSlug: my-app + licenseFieldValueChannelID: 1vusIYZLAVxMG6q760OJmRKj5i5 + licenseFieldValueChannelName: My Channel + licenseFieldValueCustomerName: Test Customer + licenseFieldValueEndpoint: https://replicated.app + licenseFieldValueLicenseID: 1vusOokxAVp1tkRGuyxnF23PJcq + licenseFieldValueLicenseId: 1vusOokxAVp1tkRGuyxnF23PJcq + licenseFieldValueCustomIntField: 123 + licenseFieldValueCustomStringField: single line text + licenseFieldValueCustomTextField: "multi\nline\ntext" + licenseFieldValueCustomBoolField: "true" + licenseFieldValueCustomHiddenField: "this is secret" diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/subdir/nginx-2.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/subdir/nginx-2.yaml new file mode 100644 index 0000000000..4b7b4138a1 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/subdir/nginx-2.yaml @@ -0,0 +1,10 @@ +kind: Service +apiVersion: v1 +metadata: + name: nginx + labels: + app: nginx +spec: + ports: + - port: 80 + name: web \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/subdir/nginx-3.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/subdir/nginx-3.yaml new file mode 100644 index 0000000000..1984c5b489 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/subdir/nginx-3.yaml @@ -0,0 +1,18 @@ +kind: Deployment +apiVersion: apps/v1 +metadata: + name: nginx +spec: + selector: + matchLabels: + app: nginx + replicas: 1 + template: + metadata: + labels: + app: nginx + spec: + serviceAccountName: nginx + containers: + - name: nginx + image: nginx:1.24 diff --git a/pkg/tests/pull/cases/airgap/wantResults/base/subdir/nginx.yaml b/pkg/tests/pull/cases/airgap/wantResults/base/subdir/nginx.yaml new file mode 100644 index 0000000000..588266b046 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/base/subdir/nginx.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: nginx \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/helm/replicated-release/replicated-1.0.0-beta.12.tgz b/pkg/tests/pull/cases/airgap/wantResults/helm/replicated-release/replicated-1.0.0-beta.12.tgz new file mode 100644 index 0000000000..f8b693aff1 Binary files /dev/null and b/pkg/tests/pull/cases/airgap/wantResults/helm/replicated-release/replicated-1.0.0-beta.12.tgz differ diff --git a/pkg/tests/pull/cases/airgap/wantResults/helm/replicated-release/values.yaml b/pkg/tests/pull/cases/airgap/wantResults/helm/replicated-release/values.yaml new file mode 100644 index 0000000000..06dc4497bf --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/helm/replicated-release/values.yaml @@ -0,0 +1,2 @@ +my-optional-value: my-optional-value +my-value: my-value diff --git a/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/kots-app.yaml b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/kots-app.yaml new file mode 100644 index 0000000000..d10ce3862d --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/kots-app.yaml @@ -0,0 +1,8 @@ +apiVersion: kots.io/v1beta1 +kind: Application +metadata: + name: my-app + annotations: + kots.io/exclude: "true" +spec: + title: my-app diff --git a/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/my-chart.yaml b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/my-chart.yaml new file mode 100644 index 0000000000..ddac6450f7 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/my-chart.yaml @@ -0,0 +1,19 @@ +apiVersion: kots.io/v1beta1 +kind: HelmChart +metadata: + name: my-chart +spec: + # chart identifies a matching chart from a .tgz + chart: + name: my-chart + chartVersion: 0.1.0 + releaseName: my-chart-release + useHelmInstall: true + + # values are used in the customer environment, as a pre-render step + # these values will be supplied to helm template + values: {} + + # builder values provide a way to render the chart with all images + # and manifests. this is used in replicated to create airgap packages + builder: {} diff --git a/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/replicated.yaml b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/replicated.yaml new file mode 100644 index 0000000000..c35bbff15c --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/replicated.yaml @@ -0,0 +1,18 @@ +apiVersion: kots.io/v1beta2 +kind: HelmChart +metadata: + name: replicated + annotations: + kots.io/exclude: "true" +spec: + chart: + name: replicated + chartVersion: 1.0.0-beta.12 + releaseName: replicated-release + values: + my-value: my-value + optionalValues: + - when: 'true' + recursiveMerge: true + values: + my-optional-value: my-optional-value diff --git a/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/test-chart.yaml b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/test-chart.yaml new file mode 100644 index 0000000000..4710b18f0e --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/test-chart.yaml @@ -0,0 +1,19 @@ +apiVersion: kots.io/v1beta1 +kind: HelmChart +metadata: + name: test-chart +spec: + # chart identifies a matching chart from a .tgz + chart: + name: test-chart + chartVersion: 0.1.0 + useHelmInstall: false + namespace: helmns + + # values are used in the customer environment, as a pre-render step + # these values will be supplied to helm template + values: {} + + # builder values provide a way to render the chart with all images + # and manifests. this is used in replicated to create airgap packages + builder: {} diff --git a/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/userdata/config.yaml b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/userdata/config.yaml new file mode 100644 index 0000000000..8fac6db08a --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/userdata/config.yaml @@ -0,0 +1,10 @@ +apiVersion: kots.io/v1beta1 +kind: ConfigValues +metadata: + creationTimestamp: null + name: my-app +spec: + values: + hostname: + value: my-app.somebigbank.com +status: {} diff --git a/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/userdata/installation.yaml b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/userdata/installation.yaml new file mode 100644 index 0000000000..825d8239f2 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/userdata/installation.yaml @@ -0,0 +1,24 @@ +apiVersion: kots.io/v1beta1 +kind: Installation +metadata: + creationTimestamp: null + name: my-app +spec: + channelID: 1vusIYZLAVxMG6q760OJmRKj5i5 + channelName: My Channel + knownImages: + - image: alpine + isPrivate: true + - image: alpine:3.4 + isPrivate: true + - image: busybox + isPrivate: true + - image: nginx:1.23 + isPrivate: true + - image: nginx:1.24 + isPrivate: true + - image: nginx:latest + isPrivate: true + - image: replicated/replicated-sdk:v1.0.0-beta.12 + isPrivate: true +status: {} diff --git a/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/userdata/license.yaml b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/userdata/license.yaml new file mode 100644 index 0000000000..9fa3a14d7f --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/kotsKinds/userdata/license.yaml @@ -0,0 +1,49 @@ +apiVersion: kots.io/v1beta1 +kind: License +metadata: + creationTimestamp: null + name: testcustomer +spec: + appSlug: my-app + channelID: 1vusIYZLAVxMG6q760OJmRKj5i5 + channelName: My Channel + customerName: Test Customer + endpoint: https://replicated.app + entitlements: + bool_field: + title: Bool Field + value: true + valueType: Boolean + expires_at: + description: License Expiration + title: Expiration + value: "2030-07-27T00:00:00Z" + valueType: String + hidden_field: + isHidden: true + title: Hidden Field + value: this is secret + valueType: String + int_field: + title: Int Field + value: 123 + valueType: Integer + string_field: + title: StringField + value: single line text + valueType: String + text_field: + title: Text Field + value: |- + multi + line + text + valueType: Text + isAirgapSupported: true + isGitOpsSupported: true + isSnapshotSupported: true + licenseID: 1vusOokxAVp1tkRGuyxnF23PJcq + licenseSequence: 7 + licenseType: prod + signature: eyJsaWNlbnNlRGF0YSI6ImV5SmhjR2xXWlhKemFXOXVJam9pYTI5MGN5NXBieTkyTVdKbGRHRXhJaXdpYTJsdVpDSTZJa3hwWTJWdWMyVWlMQ0p0WlhSaFpHRjBZU0k2ZXlKdVlXMWxJam9pZEdWemRHTjFjM1J2YldWeUluMHNJbk53WldNaU9uc2liR2xqWlc1elpVbEVJam9pTVhaMWMwOXZhM2hCVm5BeGRHdFNSM1Y1ZUc1R01qTlFTbU54SWl3aWJHbGpaVzV6WlZSNWNHVWlPaUp3Y205a0lpd2lZM1Z6ZEc5dFpYSk9ZVzFsSWpvaVZHVnpkQ0JEZFhOMGIyMWxjaUlzSW1Gd2NGTnNkV2NpT2lKdGVTMWhjSEFpTENKamFHRnVibVZzU1VRaU9pSXhkblZ6U1ZsYVRFRldlRTFITm5FM05qQlBTbTFTUzJvMWFUVWlMQ0pqYUdGdWJtVnNUbUZ0WlNJNklrMTVJRU5vWVc1dVpXd2lMQ0pzYVdObGJuTmxVMlZ4ZFdWdVkyVWlPamNzSW1WdVpIQnZhVzUwSWpvaWFIUjBjSE02THk5eVpYQnNhV05oZEdWa0xtRndjQ0lzSW1WdWRHbDBiR1Z0Wlc1MGN5STZleUppYjI5c1gyWnBaV3hrSWpwN0luUnBkR3hsSWpvaVFtOXZiQ0JHYVdWc1pDSXNJblpoYkhWbElqcDBjblZsTENKMllXeDFaVlI1Y0dVaU9pSkNiMjlzWldGdUluMHNJbVY0Y0dseVpYTmZZWFFpT25zaWRHbDBiR1VpT2lKRmVIQnBjbUYwYVc5dUlpd2laR1Z6WTNKcGNIUnBiMjRpT2lKTWFXTmxibk5sSUVWNGNHbHlZWFJwYjI0aUxDSjJZV3gxWlNJNklqSXdNekF0TURjdE1qZFVNREE2TURBNk1EQmFJaXdpZG1Gc2RXVlVlWEJsSWpvaVUzUnlhVzVuSW4wc0ltaHBaR1JsYmw5bWFXVnNaQ0k2ZXlKMGFYUnNaU0k2SWtocFpHUmxiaUJHYVdWc1pDSXNJblpoYkhWbElqb2lkR2hwY3lCcGN5QnpaV055WlhRaUxDSjJZV3gxWlZSNWNHVWlPaUpUZEhKcGJtY2lMQ0pwYzBocFpHUmxiaUk2ZEhKMVpYMHNJbWx1ZEY5bWFXVnNaQ0k2ZXlKMGFYUnNaU0k2SWtsdWRDQkdhV1ZzWkNJc0luWmhiSFZsSWpveE1qTXNJblpoYkhWbFZIbHdaU0k2SWtsdWRHVm5aWElpZlN3aWMzUnlhVzVuWDJacFpXeGtJanA3SW5ScGRHeGxJam9pVTNSeWFXNW5SbWxsYkdRaUxDSjJZV3gxWlNJNkluTnBibWRzWlNCc2FXNWxJSFJsZUhRaUxDSjJZV3gxWlZSNWNHVWlPaUpUZEhKcGJtY2lmU3dpZEdWNGRGOW1hV1ZzWkNJNmV5SjBhWFJzWlNJNklsUmxlSFFnUm1sbGJHUWlMQ0oyWVd4MVpTSTZJbTExYkhScFhHNXNhVzVsWEc1MFpYaDBJaXdpZG1Gc2RXVlVlWEJsSWpvaVZHVjRkQ0o5ZlN3aWFYTkJhWEpuWVhCVGRYQndiM0owWldRaU9uUnlkV1VzSW1selIybDBUM0J6VTNWd2NHOXlkR1ZrSWpwMGNuVmxMQ0pwYzFOdVlYQnphRzkwVTNWd2NHOXlkR1ZrSWpwMGNuVmxmWDA9IiwiaW5uZXJTaWduYXR1cmUiOiJleUpzYVdObGJuTmxVMmxuYm1GMGRYSmxJam9pYUhneE1XTXZUR1ozUTNoVE5YRmtRWEJGU1hGdVRrMU9NMHBLYTJzNFZHZFhSVVpzVDFKVlJ6UjJjR1YzZEZoV1YzbG1lamRZY0hBd1ExazJZamRyUVRSS2N6TklhR3d3YkZJMFdUQTFMemN2UVVkQ2FEZFZNSGczUkhaTVozUXpVM00wYm5GTFZTdFhXRXBTVHpKWVFVRnZSME4xZFRWR1RGcHJRVWhYY1RSUVFtMXphSFY2Y1ZsdmNucHhlbGhGWVZWVlpFUlVkVXhDTW1nNWFIZ3dXRWhQUmxwUk16bHVkbTlPUjJaT2R5OTRTVmRaZEhSUGRYZHZhMncyTVZsb1JVeFZlRmQxU1ZSRmMwTlVhM2xtTVRNd09IazVSbFJzWlRKeVYyZEVlSEZNYTBSUFNXVXlPRWwzUzJSQkwySXdWVUl5VEZGbVRWcHdWemwyUTNCSkwybHlWek5uYmpaeU5WWjNWMjB2U1dweWJtNDNSelJrVmpadVYzcFRkMGhQUTJSdWEwMTRNRXQ1VVVOa0wxQjFaWEpUYjNSdVEwOXRTMDEzWlRSTGJqaERkMU5YVVRRNGRURkRNbTFpV1VzeGRYTlpOM1YzUFQwaUxDSndkV0pzYVdOTFpYa2lPaUl0TFMwdExVSkZSMGxPSUZCVlFreEpReUJMUlZrdExTMHRMVnh1VFVsSlFrbHFRVTVDWjJ0eGFHdHBSemwzTUVKQlVVVkdRVUZQUTBGUk9FRk5TVWxDUTJkTFEwRlJSVUZ6TkhKdlVIcDFhV1JNZVhOMmIxWTJkemxhTkZ4dVdHRmliME5tWTJNeGFHZFZhQ3N3V1VkS2NFNURSVXhyTjBaTFF5OTJhemR6ZERsR05tY3dUMjlrU0VSbGVYZFJXa2hLZFU1TVpsUnNRbEJHUTJOaU5seHVObTlzVEZOeWNGQTRjbFUzU0d4SGJsRkVSMFJNYVhkS1EyaGtSRGRVVUdSM2FXdHBkMHRGY201aldqaEdaalZsU25vd2RETmlUWFpyVDJaVVluSkJiRnh1WWtGQ1kwbzVNVmxVT1hKdVVXOXFkVWN4UldKUVRqaEZWblI2TWxZNE5IZHViR2Q0TUhCd2JEVjRPSFpOYlhwcE1ISnVibEZVV1VGamJ6WnFhMnBJTTF4dVRuTlVkWE4xUzFkdlJGUjVNWE5yZGtSUk9IbEJZV0ptWTNNME4zWnNRazAwU0RGT1JFNHZSSFJhWWxZdllubDJia0o2YkM4eFZrVnpURmRqWlZWcFRGeHVSWEYxT0VkeWF5dFFVRGQyUkdSd2JFUjNjWFpQV2t4RmRYazNkamhuUm01U09WUlVSV3ByTlVvNWRuWlVTR2RtU25VemVubEVPR2xLWTBSRE5YcHFPVnh1YjFGSlJFRlJRVUpjYmkwdExTMHRSVTVFSUZCVlFreEpReUJMUlZrdExTMHRMVnh1SWl3aWEyVjVVMmxuYm1GMGRYSmxJam9pWlhsS2VtRlhaSFZaV0ZJeFkyMVZhVTlwU2pCUldIQjJXVE5LVms1NmFGaFNSMlJzVVRKb2NtTklXa1ZVVlRsRldqQktXVTFGUmtaVFJFNUZVMGhLYkUxclRUTkxNSEJFVkROR2VGTnROVVJVVlRWVlltMDFiVnBGUm5sWldIQjZaRVJqTVZaSGFFeFBXRUpVVWtacmRrd3diek5aTUZaSlVteFdWRXd5T1VoV1JXeHNWa1ZPTUZSSE1WWlJNR04zVkd4R2JGa3pTblJUUm1zMFZVWk9hMVpWU2pCVU1WbDNZbXQwY0ZSclZuQmpia0poVFZjNWFtSldiSEZaYTNob1UyeHNWV0pGUmtWWGJVWnZWakZLVUZkcWJGSmhXRVp1V2xkb1EyRnVRak5TUjNNd1lWWkpOVTVXVmxkV1ZUVnlUMGhLYjFsVlRYbGhiVGcwVjBkYWVGbHFWbFppYlhoeFpFWkZkMDU1Y3pCaFZsSkpWRVpPTm1WRk1IcGxWWFJ2VFVaR1ZtRXdWVFJSVnpsSFVsaEtVRTFZUmxCU01WcFJVMVJDTmxsV2FIcFdWWEJ0WTBSU2JFMVVRazlPVjNSU1ZucFdUMU5XWTNaU1ZYUkZVMGhzYlU5VmJGaGtNMUl3WTFWc1lXTlhSakJTYTA1RVlVWmtjbUo2VmtSU00wSllUREkxUmsxWVl6SmxWM1JKVlZoQk1sVXhTbEppU0Zwd1VrVXdNRlpFVWt0VU1rWnNVVmQwYzFSV1VrMVVWV055V1RCYVRHSXpaRTlUVm05NVlraE9SR1JzVG5aUmFrWmFaVmRPVGxOVlNteGFiRXB1Wld0U2RVMHhSVGxRVTBselNXMWtjMkl5U21oaVJYUnNaVlZzYTBscWIybFpiVkpzV2xSVk1rNVVXWGRaTWxwcFRrUk9hazlYU1hsUFIwcHRUMVJvYkZsWFRtaGFiVVV5VGtSWmFXWlJQVDBpZlE9PSJ9 +status: {} diff --git a/pkg/tests/pull/cases/airgap/wantResults/overlays/downstreams/this-cluster/charts/my-chart/kustomization.yaml b/pkg/tests/pull/cases/airgap/wantResults/overlays/downstreams/this-cluster/charts/my-chart/kustomization.yaml new file mode 100644 index 0000000000..bb3bccfe4c --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/overlays/downstreams/this-cluster/charts/my-chart/kustomization.yaml @@ -0,0 +1,4 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +bases: +- ../../../../midstream/charts/my-chart +kind: Kustomization diff --git a/pkg/tests/pull/cases/airgap/wantResults/overlays/downstreams/this-cluster/kustomization.yaml b/pkg/tests/pull/cases/airgap/wantResults/overlays/downstreams/this-cluster/kustomization.yaml new file mode 100644 index 0000000000..73a609d8fa --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/overlays/downstreams/this-cluster/kustomization.yaml @@ -0,0 +1,4 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +bases: +- ../../midstream +kind: Kustomization diff --git a/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/backup-label-transformer.yaml b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/backup-label-transformer.yaml new file mode 100644 index 0000000000..c3acc6c5b9 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/backup-label-transformer.yaml @@ -0,0 +1,39 @@ +apiVersion: builtin +kind: LabelTransformer +metadata: + name: backup-label-transformer +labels: + kots.io/app-slug: my-app + kots.io/backup: velero +fieldSpecs: +- path: metadata/labels + create: true +- version: v1 + kind: ReplicationController + path: spec/template/metadata/labels + create: true +- kind: Deployment + path: spec/template/metadata/labels + create: true +- kind: ReplicaSet + path: spec/template/metadata/labels + create: true +- kind: DaemonSet + path: spec/template/metadata/labels + create: true +- group: apps + kind: StatefulSet + path: spec/template/metadata/labels + create: true +- group: batch + kind: Job + path: spec/template/metadata/labels + create: true +- group: batch + kind: CronJob + path: spec/jobTemplate/metadata/labels + create: true +- group: batch + kind: CronJob + path: spec/jobTemplate/spec/template/metadata/labels + create: true diff --git a/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/backup-label-transformer.yaml b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/backup-label-transformer.yaml new file mode 100644 index 0000000000..c3acc6c5b9 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/backup-label-transformer.yaml @@ -0,0 +1,39 @@ +apiVersion: builtin +kind: LabelTransformer +metadata: + name: backup-label-transformer +labels: + kots.io/app-slug: my-app + kots.io/backup: velero +fieldSpecs: +- path: metadata/labels + create: true +- version: v1 + kind: ReplicationController + path: spec/template/metadata/labels + create: true +- kind: Deployment + path: spec/template/metadata/labels + create: true +- kind: ReplicaSet + path: spec/template/metadata/labels + create: true +- kind: DaemonSet + path: spec/template/metadata/labels + create: true +- group: apps + kind: StatefulSet + path: spec/template/metadata/labels + create: true +- group: batch + kind: Job + path: spec/template/metadata/labels + create: true +- group: batch + kind: CronJob + path: spec/jobTemplate/metadata/labels + create: true +- group: batch + kind: CronJob + path: spec/jobTemplate/spec/template/metadata/labels + create: true diff --git a/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/kustomization.yaml b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/kustomization.yaml new file mode 100644 index 0000000000..b716a0c5da --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/kustomization.yaml @@ -0,0 +1,21 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +bases: +- ../../../../base/charts/my-chart +commonAnnotations: + kots.io/app-slug: my-app +images: +- name: nginx + newName: ttl.sh/test/nginx +- name: docker.io/library/nginx + newName: ttl.sh/test/nginx +- name: library/nginx + newName: ttl.sh/test/nginx +- name: docker.io/nginx + newName: ttl.sh/test/nginx +kind: Kustomization +patchesStrategicMerge: +- pullsecrets.yaml +resources: +- secret.yaml +transformers: +- backup-label-transformer.yaml diff --git a/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/pullsecrets.yaml b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/pullsecrets.yaml new file mode 100644 index 0000000000..1e4153d7b4 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/pullsecrets.yaml @@ -0,0 +1,8 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: my-chart-pod +spec: + imagePullSecrets: + - name: my-app-my-chart-registry diff --git a/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/secret.yaml b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/secret.yaml new file mode 100644 index 0000000000..1722e075f0 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/secret.yaml @@ -0,0 +1,26 @@ +apiVersion: v1 +data: + .dockerconfigjson: eyJhdXRocyI6eyJ0dGwuc2giOnsiYXV0aCI6ImRHVnpkRHBtWVd0bExYQmhjM009In19fQ== +kind: Secret +metadata: + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-9999" + kots.io/creation-phase: "-9999" + creationTimestamp: null + name: my-app-my-chart-registry +type: kubernetes.io/dockerconfigjson + +--- +apiVersion: v1 +data: + .dockerconfigjson: eyJhdXRocyI6eyJ0dGwuc2giOnsiYXV0aCI6ImRHVnpkRHBtWVd0bExYQmhjM009In19fQ== +kind: Secret +metadata: + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-9999" + kots.io/creation-phase: "-9999" + creationTimestamp: null + name: kotsadm-replicated-registry +type: kubernetes.io/dockerconfigjson diff --git a/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/kustomization.yaml b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/kustomization.yaml new file mode 100644 index 0000000000..85bd396733 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/kustomization.yaml @@ -0,0 +1,37 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +bases: +- ../../base +commonAnnotations: + kots.io/app-slug: my-app +images: +- name: alpine + newName: ttl.sh/test/alpine +- name: docker.io/library/alpine + newName: ttl.sh/test/alpine +- name: library/alpine + newName: ttl.sh/test/alpine +- name: docker.io/alpine + newName: ttl.sh/test/alpine +- name: busybox + newName: ttl.sh/test/busybox +- name: docker.io/library/busybox + newName: ttl.sh/test/busybox +- name: library/busybox + newName: ttl.sh/test/busybox +- name: docker.io/busybox + newName: ttl.sh/test/busybox +- name: nginx + newName: ttl.sh/test/nginx +- name: docker.io/library/nginx + newName: ttl.sh/test/nginx +- name: library/nginx + newName: ttl.sh/test/nginx +- name: docker.io/nginx + newName: ttl.sh/test/nginx +kind: Kustomization +patchesStrategicMerge: +- pullsecrets.yaml +resources: +- secret.yaml +transformers: +- backup-label-transformer.yaml diff --git a/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/pullsecrets.yaml b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/pullsecrets.yaml new file mode 100644 index 0000000000..8797dc7686 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/pullsecrets.yaml @@ -0,0 +1,64 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx +spec: + template: + spec: + imagePullSecrets: + - name: my-app-registry +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: security-test-example-chart + namespace: helmns + labels: + app.kubernetes.io/instance: security-test + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: example-chart + app.kubernetes.io/version: 1.16.0 + helm.sh/chart: example-chart-0.1.0 +spec: + template: + spec: + imagePullSecrets: + - name: my-app-registry +--- +apiVersion: v1 +kind: Pod +metadata: + name: security-test-example-chart-test-connection + namespace: helmns + labels: + app.kubernetes.io/instance: security-test + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: example-chart + app.kubernetes.io/version: 1.16.0 + helm.sh/chart: example-chart-0.1.0 +spec: + imagePullSecrets: + - name: my-app-registry +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: post-install-job + namespace: helmns +spec: + template: + spec: + imagePullSecrets: + - name: my-app-registry +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: pre-install-job + namespace: helmns +spec: + template: + spec: + imagePullSecrets: + - name: my-app-registry diff --git a/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/secret.yaml b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/secret.yaml new file mode 100644 index 0000000000..f33fe4124d --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/secret.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +data: + .dockerconfigjson: eyJhdXRocyI6eyJ0dGwuc2giOnsiYXV0aCI6ImRHVnpkRHBtWVd0bExYQmhjM009In19fQ== +kind: Secret +metadata: + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-9999" + kots.io/creation-phase: "-9999" + creationTimestamp: null + name: my-app-registry + namespace: app-namespace +type: kubernetes.io/dockerconfigjson + +--- +apiVersion: v1 +data: + .dockerconfigjson: eyJhdXRocyI6eyJ0dGwuc2giOnsiYXV0aCI6ImRHVnpkRHBtWVd0bExYQmhjM009In19fQ== +kind: Secret +metadata: + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-9999" + kots.io/creation-phase: "-9999" + creationTimestamp: null + name: kotsadm-replicated-registry + namespace: app-namespace +type: kubernetes.io/dockerconfigjson diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/Chart.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/Chart.yaml new file mode 100644 index 0000000000..5e4dbdb5d6 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 0.1.0 +description: A Helm chart for Kubernetes +name: my-chart +type: application +version: 0.1.0 diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/kotsadm-replicated-registry-secret.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/kotsadm-replicated-registry-secret.yaml new file mode 100644 index 0000000000..a4ca9a193c --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/kotsadm-replicated-registry-secret.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +data: + .dockerconfigjson: eyJhdXRocyI6eyJ0dGwuc2giOnsiYXV0aCI6ImRHVnpkRHBtWVd0bExYQmhjM009In19fQ== +kind: Secret +metadata: + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-9999" + kots.io/app-slug: my-app + kots.io/creation-phase: "-9999" + creationTimestamp: null + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: kotsadm-replicated-registry +type: kubernetes.io/dockerconfigjson \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/my-app-my-chart-registry-secret.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/my-app-my-chart-registry-secret.yaml new file mode 100644 index 0000000000..4c2e980706 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/my-app-my-chart-registry-secret.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +data: + .dockerconfigjson: eyJhdXRocyI6eyJ0dGwuc2giOnsiYXV0aCI6ImRHVnpkRHBtWVd0bExYQmhjM009In19fQ== +kind: Secret +metadata: + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-9999" + kots.io/app-slug: my-app + kots.io/creation-phase: "-9999" + creationTimestamp: null + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: my-app-my-chart-registry +type: kubernetes.io/dockerconfigjson \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/my-chart-configmap-configmap.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/my-chart-configmap-configmap.yaml new file mode 100644 index 0000000000..31f38b0819 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/my-chart-configmap-configmap.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: {} +kind: ConfigMap +metadata: + annotations: + kots.io/app-slug: my-app + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: my-chart-configmap \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/my-chart-pod-pod.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/my-chart-pod-pod.yaml new file mode 100644 index 0000000000..eeed5bfcc3 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/my-chart-pod-pod.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Pod +metadata: + annotations: + kots.io/app-slug: my-app + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: my-chart-pod +spec: + containers: + - image: ttl.sh/test/nginx:1.23 + name: my-chart-container + ports: + - containerPort: 80 + imagePullSecrets: + - name: my-app-my-chart-registry diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/helm/replicated-release/all.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/helm/replicated-release/all.yaml new file mode 100644 index 0000000000..1f6be3e5c1 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/helm/replicated-release/all.yaml @@ -0,0 +1,330 @@ +--- +# Source: replicated/templates/replicated-serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + helm.sh/chart: replicated-1.0.0-beta.12 + app.kubernetes.io/name: replicated + app.kubernetes.io/instance: replicated-release + app.kubernetes.io/version: "v1.0.0-beta.12" + app.kubernetes.io/managed-by: Helm + name: replicated + namespace: "" +--- +# Source: replicated/templates/replicated-secret.yaml +apiVersion: v1 +kind: Secret +metadata: + labels: + helm.sh/chart: replicated-1.0.0-beta.12 + app.kubernetes.io/name: replicated + app.kubernetes.io/instance: replicated-release + app.kubernetes.io/version: "v1.0.0-beta.12" + app.kubernetes.io/managed-by: Helm + name: replicated + namespace: "" +type: Opaque +stringData: + config.yaml: | + license: | + apiVersion: kots.io/v1beta1 + kind: License + metadata: + name: kotssdkcustomer + spec: + appSlug: kots-sdk-demo + channelID: 2MqOAm2LeY9gsaqFwczXAoSfRtD + channelName: Beta + customerEmail: salah+qa@replicated.com + customerName: KOTS SDK Customer + endpoint: https://replicated.app + entitlements: + expires_at: + description: License Expiration + signature: {} + title: Expiration + value: "" + valueType: String + isAirgapSupported: true + isGitOpsSupported: true + isKotsInstallEnabled: true + isSemverRequired: true + isSnapshotSupported: true + licenseID: 2MqOPWspoqXLAIBchNPJA87GOzM + licenseSequence: 28 + licenseType: dev + signature: eyJsaWNlbnNlRGF0YSI6ImV5SmhjR2xXWlhKemFXOXVJam9pYTI5MGN5NXBieTkyTVdKbGRHRXhJaXdpYTJsdVpDSTZJa3hwWTJWdWMyVWlMQ0p0WlhSaFpHRjBZU0k2ZXlKdVlXMWxJam9pYTI5MGMzTmthMk4xYzNSdmJXVnlJbjBzSW5Od1pXTWlPbnNpYkdsalpXNXpaVWxFSWpvaU1rMXhUMUJYYzNCdmNWaE1RVWxDWTJoT1VFcEJPRGRIVDNwTklpd2liR2xqWlc1elpWUjVjR1VpT2lKa1pYWWlMQ0pqZFhOMGIyMWxjazVoYldVaU9pSkxUMVJUSUZORVN5QkRkWE4wYjIxbGNpSXNJbU4xYzNSdmJXVnlSVzFoYVd3aU9pSnpZV3hoYUN0eFlVQnlaWEJzYVdOaGRHVmtMbU52YlNJc0ltRndjRk5zZFdjaU9pSnJiM1J6TFhOa2F5MWtaVzF2SWl3aVkyaGhibTVsYkVsRUlqb2lNazF4VDBGdE1reGxXVGxuYzJGeFJuZGplbGhCYjFObVVuUkVJaXdpWTJoaGJtNWxiRTVoYldVaU9pSkNaWFJoSWl3aWJHbGpaVzV6WlZObGNYVmxibU5sSWpveU9Dd2laVzVrY0c5cGJuUWlPaUpvZEhSd2N6b3ZMM0psY0d4cFkyRjBaV1F1WVhCd0lpd2laVzUwYVhSc1pXMWxiblJ6SWpwN0ltVjRjR2x5WlhOZllYUWlPbnNpZEdsMGJHVWlPaUpGZUhCcGNtRjBhVzl1SWl3aVpHVnpZM0pwY0hScGIyNGlPaUpNYVdObGJuTmxJRVY0Y0dseVlYUnBiMjRpTENKMllXeDFaU0k2SWlJc0luWmhiSFZsVkhsd1pTSTZJbE4wY21sdVp5SXNJbk5wWjI1aGRIVnlaU0k2ZTMxOWZTd2lhWE5CYVhKbllYQlRkWEJ3YjNKMFpXUWlPblJ5ZFdVc0ltbHpSMmwwVDNCelUzVndjRzl5ZEdWa0lqcDBjblZsTENKcGMxTnVZWEJ6YUc5MFUzVndjRzl5ZEdWa0lqcDBjblZsTENKcGMwdHZkSE5KYm5OMFlXeHNSVzVoWW14bFpDSTZkSEoxWlN3aWFYTlRaVzEyWlhKU1pYRjFhWEpsWkNJNmRISjFaWDE5IiwiaW5uZXJTaWduYXR1cmUiOiJleUpzYVdObGJuTmxVMmxuYm1GMGRYSmxJam9pUzNablZEQm9aSFkxWlM4eFZYUkJUelV6Y0VOcWEyZHBWM0EyY21GTFVEVnNXV3cyU2xWMGFHeEJNVVUzZDB0RVUzVlpNV2RQVVVZMVlYUjVRMjFJT1Zkd2JUUlBRMHMzVm1oelZIWk1ObUphUlhZMmJUQTNXRk01V2tWR1VqRnhla3N2VEhZekwyZHliWG95WVV0WlNsRnpaMUpNWW5CR1VsQllNRWM1YUdzNGVWazBkbkV6Y0d4V1VEbDZNMVpMV1ROa2ExVTNVbkEwVFZGUk9WSTJOa2xJTHpWM1N5dDZTbTQ1YTNOblIwcDNVbVY0TlRsdVZWQm1Za296ZUVoMFRqZFdPVEpFVEhOMWRrRTFlaTh4ZDBKbVMzbG9MM3BYV1UwM1FrbDZZV2hxT1Zac1NFRTJhblUzYm0wdk9IWlBTV0kyTW13clNqRTBUMVJoTW5KTVZ6VllkekZhYXpSSGVFVm9UMjVQYkc1dWNHSlVXVkYyVGpCYUsxaFpWR3BQZUdkS1EySm5RMUZLZUZoMFJXOUtZVXBrUVRaUk1WSklaVFFyVWtvNVZUWjNhME40VkZwVVMzUmxTa015VGs1SVJWa3pUREpSUFQwaUxDSndkV0pzYVdOTFpYa2lPaUl0TFMwdExVSkZSMGxPSUZCVlFreEpReUJMUlZrdExTMHRMVnh1VFVsSlFrbHFRVTVDWjJ0eGFHdHBSemwzTUVKQlVVVkdRVUZQUTBGUk9FRk5TVWxDUTJkTFEwRlJSVUYzUTBSRlVrbHFkbUkxVUZwcVltbExlVUpqYzF4dVZIVk9jRkZHZHpKdFpuRlBSbFJ5ZDFGSE9HdzFXVVJ2VUhCeFNuTnpPU3RCYVRWTE9WaElWelZzY0hsQlVHSmxObmQzZGpkaUwzUXdNMFV5VnpJd1NseHVlblJOVjBSRk5VcDNhRFF5WTNKT1ZqUnhaM2xNU25jd1lUUkNXblZwVlRORFVUSnBNbVZSWkhGVVNGaExOaTlwV1ZCc1F6QlRhbmhZUTNjcmFIVm5UbHh1YldoS2MwRlpRVnBZUVdKeVYybEtSemh2UVhwT0t6WktaV3cwYTJKeVRVVjRSMjEyWTB4RU0xWnZSazV3VTNSdk5EaERTSGs0VjJOWWFYWnhWVVZuUTF4dUsxWTBkSEJFYUV4NlIySnFUWEpFZUUxdU0xZFhjV3RTWmxGWGJ6bGpSMlJIVG1kSlFXTldURlpZVFhGMlJ6ZHlRa05PZUV0NGVVeGtZa3AxZERkM1FWeHVkVnBGWnpGQ1RuZDVVMnh3V0VseVFsTjZVMHRTVFdneFMwSmFVR0ZqWjFsb0wwdGpRMjQyVW01ek0wTTJRV0p4YXpodFNWWXZTRzVqZWtoRlpHTlRhVnh1ZUZGSlJFRlJRVUpjYmkwdExTMHRSVTVFSUZCVlFreEpReUJMUlZrdExTMHRMVnh1SWl3aWEyVjVVMmxuYm1GMGRYSmxJam9pWlhsS2VtRlhaSFZaV0ZJeFkyMVZhVTlwU2pKTU1rcEpZVVJTYmxGdFRqRlJNV1JIWTFVeFlXVnVjRlpqU0U1b1ZrUmFNbFY1T1hWa01FcHhWREJvZEZKRlpGTmtWVkUwV1RGYVNWSkdaSFJoUkZKWlZFUmpNRTFyTVd4bFYwcDVWa1pPYTFVeFJsQmxWVlp6VFRCNGRrNUVXVFJoTTBGNlVXMHhVRTlFUW5sWGJWazFVVEZOZVdFeFFsTmpWWGN6VDBkb1lXUldRbnBqUjNCUVYydEZlbEZyWkZCT2F6VktUbXRTVkUxSGN6SmFSR2hYVTIxYVJsWXdWWGRqTTJzelZFVmFlR05GZEZoTE1WSnNVVk01V0U0eWVGSlVTR055VVZabk1FOVZTWFpPUm5CTFRsUm9hMk5JU1hwVlJFSlVUVEpLUmxVemFETmFibHBSVkZaU1dXUllRbmhNZW14TVVWUkplRTVGUmxaTk1HdzBXbFp3VVZGVVozWk5NRTVTV2tSc2IxbHRPVTVrTVVad1ZqSmFSMVl3YUVWaFZXTnlXVEprVTJKVlZsTlZNMFpPV2tSb2JGVjVPWGxPU0hCVlpXNVNXbUpxVGtwVFZFSjBWVlprTWxKWGMzbFhSbXhIVjJ0d1NWWkRPSHBVYmxKdFRtdGpNMkZGVWs5V2JrNVNWRmhPVkdKSE1YRlZSVFV6V2tod2RGUkdiek5SVjBwdFpHNWtiVkZxUmpCUFdFcHdWVlYwZFZRd1duSlVSMXBUVlZWMFRHSjZVakprYlRoM1dqSjRVVkV6U205UFZ6bE1Uak5XVG1FeFRtcGhiR1JEVkcxT2FFOVZSVGxRVTBselNXMWtjMkl5U21oaVJYUnNaVlZzYTBscWIybFpiVkpzV2xSVk1rNVVXWGRaTWxwcFRrUk9hazlYU1hsUFIwcHRUMVJvYkZsWFRtaGFiVVV5VGtSWmFXWlJQVDBpZlE9PSJ9 + licenseFields: + expires_at: + description: License Expiration + name: expires_at + signature: + v1: eKrZjLra37s9U83uq/U9DEdhxe8UziWarH6myd8wvE/lJwPc+M1IPUQHRSVnQBCruCFUEbEYPLYJ0ylguyD6gZt3Ab7Vgv2Nu2r1cFm41N5LSjFYQiO1VDVCX6WMGgdTliL59BB0Olug9hYXCxPAAWsp/fIZZA1ewBA3zwloYoEwRu1L0e14o9okBTo9sRN7518I0SMAme/AMdU/dYdrKI9rw3TtJHc/ddWG9CKFUXfLtwkVwocsgsytQm2fA/QmnNOalyNzmfpkkgSx1mAmpifLDsxOQV9WWV5zpea8k5p/wxf0uSOJCPqVjWn+0qdhPXetbx+D4XGj2eJarYCHCg== + title: Expiration + value: "" + valueType: String + appName: "kots-sdk-demo" + channelID: "2MqOAm2LeY9gsaqFwczXAoSfRtD" + channelName: "Beta" + channelSequence: -1 + releaseSequence: -1 + releaseCreatedAt: "" + releaseNotes: |- + + versionLabel: "" + replicatedAppEndpoint: "https://replicated.app" + statusInformers: null + replicatedID: "" + appID: "" + # kindIs "invalid" indicates that the value is nil and the user did not provide a value +--- +# Source: replicated/templates/replicated-supportbundle.yaml +apiVersion: v1 +kind: Secret +metadata: + labels: + helm.sh/chart: replicated-1.0.0-beta.12 + app.kubernetes.io/name: replicated + app.kubernetes.io/instance: replicated-release + app.kubernetes.io/version: "v1.0.0-beta.12" + app.kubernetes.io/managed-by: Helm + troubleshoot.sh/kind: support-bundle + name: replicated-supportbundle + namespace: "" +stringData: + support-bundle-spec: |- + apiVersion: troubleshoot.sh/v1beta2 + kind: SupportBundle + metadata: + name: replicated-supportbundle + spec: + collectors: + - logs: + collectorName: replicated-logs + selector: + - app.kubernetes.io/instance=replicated-release + - app.kubernetes.io/managed-by=Helm + - app.kubernetes.io/name=replicated + - app.kubernetes.io/version=v1.0.0-beta.12 + - helm.sh/chart=replicated-1.0.0-beta.12 + name: replicated/logs + - http: + collectorName: replicated-app-info + get: + url: http://replicated.:3000/api/v1/app/info + headers: + User-Agent: "troubleshoot.sh/support-bundle" + timeout: 5s + - http: + collectorName: replicated-license-info + get: + url: http://replicated.:3000/api/v1/license/info + headers: + User-Agent: "troubleshoot.sh/support-bundle" + timeout: 5s + - secret: + namespace: + name: replicated-instance-report + includeValue: true + key: report + - secret: + namespace: + name: replicated-custom-app-metrics-report + includeValue: true + key: report + analyzers: + - jsonCompare: + checkName: Replicated SDK App Status + fileName: replicated-app-info.json + path: "appStatus" + value: "ready" + outcomes: + - warn: + when: "false" + message: Replicated SDK App status is not ready. + - pass: + when: "true" + message: Replicated SDK App status is not ready. +--- +# Source: replicated/templates/replicated-role.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + helm.sh/chart: replicated-1.0.0-beta.12 + app.kubernetes.io/name: replicated + app.kubernetes.io/instance: replicated-release + app.kubernetes.io/version: "v1.0.0-beta.12" + app.kubernetes.io/managed-by: Helm + name: replicated-role + namespace: "" +rules: +- apiGroups: + - '*' + resources: + - '*' + verbs: + - 'get' + - 'list' + - 'watch' +- apiGroups: + - '' + resources: + - 'secrets' + verbs: + - 'create' +- apiGroups: + - '' + resources: + - 'secrets' + verbs: + - 'update' + resourceNames: + - replicated + - replicated-instance-report + - replicated-custom-app-metrics-report +--- +# Source: replicated/templates/replicated-rolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + helm.sh/chart: replicated-1.0.0-beta.12 + app.kubernetes.io/name: replicated + app.kubernetes.io/instance: replicated-release + app.kubernetes.io/version: "v1.0.0-beta.12" + app.kubernetes.io/managed-by: Helm + name: replicated-rolebinding + namespace: "" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: replicated-role +subjects: +- kind: ServiceAccount + name: replicated + namespace: "" +--- +# Source: replicated/templates/replicated-service.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + helm.sh/chart: replicated-1.0.0-beta.12 + app.kubernetes.io/name: replicated + app.kubernetes.io/instance: replicated-release + app.kubernetes.io/version: "v1.0.0-beta.12" + app.kubernetes.io/managed-by: Helm + name: replicated + namespace: "" +spec: + ports: + - name: http + port: 3000 + targetPort: 3000 + selector: + app.kubernetes.io/name: replicated + app.kubernetes.io/instance: replicated-release + type: ClusterIP +--- +# Source: replicated/templates/replicated-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + helm.sh/chart: replicated-1.0.0-beta.12 + app.kubernetes.io/name: replicated + app.kubernetes.io/instance: replicated-release + app.kubernetes.io/version: "v1.0.0-beta.12" + app.kubernetes.io/managed-by: Helm + name: replicated + namespace: "" +spec: + selector: + matchLabels: + app.kubernetes.io/name: replicated + app.kubernetes.io/instance: replicated-release + template: + metadata: + annotations: + checksum/replicated-secret: 32c3b8c2724a47a8cda8dbf71d0bcbd600f6dd6031dbe4eb92a4c4ffcb36bdb1 + labels: + helm.sh/chart: replicated-1.0.0-beta.12 + app.kubernetes.io/name: replicated + app.kubernetes.io/instance: replicated-release + app.kubernetes.io/version: "v1.0.0-beta.12" + app.kubernetes.io/managed-by: Helm + spec: + securityContext: + runAsGroup: 1001 + runAsUser: 1001 + seccompProfile: + type: RuntimeDefault + volumes: + - name: replicated + secret: + secretName: replicated + containers: + - name: replicated + image: replicated/replicated-sdk:v1.0.0-beta.12 + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + volumeMounts: + - name: replicated + mountPath: /etc/replicated/config.yaml + readOnly: true + subPath: config.yaml + env: + - name: REPLICATED_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: REPLICATED_POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: DISABLE_OUTBOUND_CONNECTIONS + value: "false" + - name: IS_HELM_MANAGED + value: "true" + - name: HELM_RELEASE_NAME + value: replicated-release + - name: HELM_RELEASE_NAMESPACE + value: + - name: HELM_PARENT_CHART_URL + value: "oci://registry.replicated.com/kots-sdk-demo/beta/replicated" + - name: HELM_DRIVER + value: secret # TODO: support other drivers + - name: REPLICATED_SECRET_NAME + value: replicated + - name: REPLICATED_DEPLOYMENT_NAME + value: replicated + - name: REPLICATED_CONFIG_FILE + value: /etc/replicated/config.yaml + ports: + - containerPort: 3000 + name: http + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 3000 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + resources: + limits: + cpu: 500m + memory: 500Mi + requests: + cpu: 100m + memory: 100Mi + restartPolicy: Always + serviceAccountName: replicated diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/kotsadm-replicated-registry-secret.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/kotsadm-replicated-registry-secret.yaml new file mode 100644 index 0000000000..6423193999 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/kotsadm-replicated-registry-secret.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +data: + .dockerconfigjson: eyJhdXRocyI6eyJ0dGwuc2giOnsiYXV0aCI6ImRHVnpkRHBtWVd0bExYQmhjM009In19fQ== +kind: Secret +metadata: + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-9999" + kots.io/app-slug: my-app + kots.io/creation-phase: "-9999" + creationTimestamp: null + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: kotsadm-replicated-registry + namespace: app-namespace +type: kubernetes.io/dockerconfigjson \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/my-app-registry-secret.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/my-app-registry-secret.yaml new file mode 100644 index 0000000000..c08c23734a --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/my-app-registry-secret.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +data: + .dockerconfigjson: eyJhdXRocyI6eyJ0dGwuc2giOnsiYXV0aCI6ImRHVnpkRHBtWVd0bExYQmhjM009In19fQ== +kind: Secret +metadata: + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-9999" + kots.io/app-slug: my-app + kots.io/creation-phase: "-9999" + creationTimestamp: null + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: my-app-registry + namespace: app-namespace +type: kubernetes.io/dockerconfigjson \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/nginx-deployment.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/nginx-deployment.yaml new file mode 100644 index 0000000000..1d3266ea00 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/nginx-deployment.yaml @@ -0,0 +1,29 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kots.io/app-slug: my-app + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: nginx +spec: + replicas: 1 + selector: + matchLabels: + app: nginx + template: + metadata: + annotations: + kots.io/app-slug: my-app + labels: + app: nginx + kots.io/app-slug: my-app + kots.io/backup: velero + spec: + containers: + - image: ttl.sh/test/nginx:1.24 + name: nginx + imagePullSecrets: + - name: my-app-registry + serviceAccountName: nginx \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/nginx-service.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/nginx-service.yaml new file mode 100644 index 0000000000..ecfd354811 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/nginx-service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + kots.io/app-slug: my-app + labels: + app: nginx + kots.io/app-slug: my-app + kots.io/backup: velero + name: nginx +spec: + ports: + - name: web + port: 80 \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/nginx-serviceaccount.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/nginx-serviceaccount.yaml new file mode 100644 index 0000000000..a636f9d39e --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/nginx-serviceaccount.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + kots.io/app-slug: my-app + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: nginx \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/post-install-job-job.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/post-install-job-job.yaml new file mode 100644 index 0000000000..b1018149f3 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/post-install-job-job.yaml @@ -0,0 +1,34 @@ +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + helm.sh/hook: post-install + helm.sh/hook-weight: "2" + kots.io/app-slug: my-app + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: post-install-job + namespace: helmns +spec: + backoffLimit: 3 + template: + metadata: + annotations: + kots.io/app-slug: my-app + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: security-test + spec: + containers: + - command: + - sh + - -c + - sleep 10 + image: ttl.sh/test/alpine + imagePullPolicy: IfNotPresent + name: hook-test + imagePullSecrets: + - name: my-app-registry + restartPolicy: Never \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/pre-install-job-job.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/pre-install-job-job.yaml new file mode 100644 index 0000000000..a1552015f7 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/pre-install-job-job.yaml @@ -0,0 +1,34 @@ +apiVersion: batch/v1 +kind: Job +metadata: + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "2" + kots.io/app-slug: my-app + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: pre-install-job + namespace: helmns +spec: + backoffLimit: 3 + template: + metadata: + annotations: + kots.io/app-slug: my-app + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: security-test + spec: + containers: + - command: + - sh + - -c + - sleep 10 + image: ttl.sh/test/alpine + imagePullPolicy: IfNotPresent + name: hook-test + imagePullSecrets: + - name: my-app-registry + restartPolicy: Never \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/security-scanner-secret.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/security-scanner-secret.yaml new file mode 100644 index 0000000000..90304a32a2 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/security-scanner-secret.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Secret +metadata: + annotations: + kots.io/app-slug: my-app + owned-by: security-team + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + owner: a-generated-owner-name + name: security-scanner + namespace: helmns +stringData: + key: a super duper secret key \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/security-test-example-chart-deployment.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/security-test-example-chart-deployment.yaml new file mode 100644 index 0000000000..bd0c959f27 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/security-test-example-chart-deployment.yaml @@ -0,0 +1,47 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kots.io/app-slug: my-app + labels: + app.kubernetes.io/instance: security-test + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: example-chart + app.kubernetes.io/version: 1.16.0 + helm.sh/chart: example-chart-0.1.0 + kots.io/app-slug: my-app + kots.io/backup: velero + name: security-test-example-chart + namespace: helmns +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: security-test + app.kubernetes.io/name: example-chart + template: + metadata: + annotations: + kots.io/app-slug: my-app + labels: + app.kubernetes.io/instance: security-test + app.kubernetes.io/name: example-chart + kots.io/app-slug: my-app + kots.io/backup: velero + spec: + containers: + - env: + - name: SECURITY_SCANNER_KEY_001 + valueFrom: + secretKeyRef: + key: key + name: security-scanner + image: ttl.sh/test/nginx:latest + name: my-security-container + - command: + - /bin/sleep + - "9000" + image: ttl.sh/test/alpine:3.4 + name: waiter + imagePullSecrets: + - name: my-app-registry \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/security-test-example-chart-test-connection-pod.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/security-test-example-chart-test-connection-pod.yaml new file mode 100644 index 0000000000..a39120fc26 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/security-test-example-chart-test-connection-pod.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: Pod +metadata: + annotations: + helm.sh/hook: test-success + kots.io/app-slug: my-app + labels: + app.kubernetes.io/instance: security-test + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: example-chart + app.kubernetes.io/version: 1.16.0 + helm.sh/chart: example-chart-0.1.0 + kots.io/app-slug: my-app + kots.io/backup: velero + name: security-test-example-chart-test-connection + namespace: helmns +spec: + containers: + - args: + - security-test-example-chart:80 + command: + - wget + image: ttl.sh/test/busybox + name: wget + imagePullSecrets: + - name: my-app-registry + restartPolicy: Never diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/sh.helm.release.v1.test-chart.v1-secret.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/sh.helm.release.v1.test-chart.v1-secret.yaml new file mode 100644 index 0000000000..7b7b313a8e --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/sh.helm.release.v1.test-chart.v1-secret.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +data: + release: SDRzSUFBQUFBQUFDLyt4WmIzT2l6TEwvS2hUM3JTYUFNYlZTZFY0SWlZUm9UTlNFZnpkYlc4TXdBbWFZWVdGUWNTdmYvZFlBUmpUSnMwL3VuaGVuNmp5cDJsV2ErZFA5NjE5M1Q0Ky9SQUlTSktvaVF6bnJ3Z2hrVE95SU1WbFNVZjBsTHVNc1p6OENsR0phb2tCVVJiRWpZdkJPRkNDTTJPRWhoMW1jc3BnU1VSV3ZzbExJQ2lKQW1xUjhrTmdSY3daWWtZdXErTGJJYTBlc2QxWi9pUWxpSUFBTThPOGZxYlpHV1Y0dkxaM0paOUs3RFlmQ0RjS0pVQTBYbGpRVHhvV1BNb0lZeXNXT0NOTFllbHRnclZTUzlDQ1J6K1RMYWsxV3BueG5rS1k0aHFCYStyVWpZZ3BmUkpVVUdIZEVocElVQTc2cStyOHRUUnZoT2RmNXJBUUo1Z3BXNW9pdW82VldZcFZRd1d0L1JjTmdkVDBHQ2k2OEt4bytLZFlLSnBha0p6SU9qTkdMNjh5ais1Q0dwakVxL0dRZ3VjNDg5WlgrcnBMcHc5RHZCWVZuejVoTFhpN05teWwyZTFZSm5IbC80c3l4YTB0alU5ZHkxNzdGL3MzZHBSNFBRMVBYMW9IU3gzQkZRM2NoRTgvdVk1aU1KTDVHdFpaak1qOFpNVy9HOSt4SHZ2MTBzdTUwNWRwOVBtNE1lL01TMkgweU4wYVMrMGo1WHBubnZGeWF4blVJZTliR2M4elF1NmsvWVdPWGFUQ01acFJORnRMNEZBZlgwVGF3SENoM3N6UURkdi9sUHRhdVBVZkwvUjVtbnQzL0FKTnQ1Q1pXRG5kODd5SEhhQVAxZmhiWXR4Z21mUndZMW02UzRQVkV3UVhzelNNL21lTDdXTnQ1OWxTR0NaYlFRcFk4WnlvMXVFVHdabGlBbmhWN3ptM2hPWE1NeTM3cWx3UG0ydjNJVTZ5WGlYM2J2NDgxMDdPMzdEZHpDdGVXK1Y0WUdTTUdqUzJlMkZQcU9yZS8yMHZ4bk5zZHNBZkZmVHpjVGxiWHltUTFiR3lMc0c5SUJWVEN0YXRFRVNTelM5T3dMbHhiM3ZqR0UydGs3RTYvMk5aenRMME83K3lkMk8vbWpXRlB3MjZGbzFaeXpJRTlqZUNPaG5lY0J6ZFQ3QnZXS2pBRzVSdnY3SkhrS3RIZE1iZisxQWQvTmIvaDRudWJ1YzZTVjhsR2t2ZTQ1OElKVi9RSzkveWR2dnF3NHQwa1liS2JXS1dmV0pMbjNCWEEvcllHZG44WEdLUENWWjdleFJic3pjYjcrWC9BZ3gwMHJGVkx2NVd2OUNYWHhnWG53VUUrWktaaEZjR0t0dmJrc2dhVDBYUTBrNjNGd3BwN2pqeTltajMxNytmVzdYSWhXWjZ6RzI0cUh4N21oVUV5eWdQYk1tQXlZSzA5OWpwdzM1U2VNNTk0RGw1NHRudUUxZjRmVUN3ZUN6emV4NmZ2UHVIZXpsVjREclBLOW5yQWxpT1A0MnYwQ2JEN0YvZkpOdUkrRDRZdHZmWjJHakxQUHdjLzJOTzFUK1lSNERuc0NLdnAycmZseUU5bVI3cFBGc08xbStCaTBwdm1ubTF0VHQ3Rjk0L0R6WjF1dHYyYSt2YUllSTgwZE8zdGh1OXp2N29ycGgvcGRoTkVnUHM5L0NTM0pUeGV3blU3MXkrU1FmeDM4end3ck54ZjlIZEFIMUJmR1dUM3NiYnhlenlXbTdneU51L3lCREFHYTFES1BjL0dCTnpNTGszZExNMnduZGUxTmV6TldNUHozTmZsbjc1aXRuTkI3TnJUekZlODVOSEFERGl6Uy9QcTdpdng5bWtPK2pyL1AvT3B0Z050ZitoU09MSHZqdVBrcHZhM2VYVzkrWmg3b3h3YXVQRGFjV0pnNXRvQmZycXhjbitrclgwRHI5QWpEUmUyZCsvMzVqT1lXTHVxSnJYV3Ercm1JdzBiM0kvejJzMHQ1bjZDWkQ3emxXM3E5bDR1emVzK0RxcDRrTmhrbGtiUXdQWWgvMnV4Njh4WFFEK3FoMlB1SDkrMkpOZWVSNEZ4WFdIQjY3SGY0ODk0N1pPM09rOTVuWnFRS1owbzBkcFhjdTd2MGx2SXFVK21rbXR2ODAvR3NVQ3hVaytKcFB0NEdOL0ZacnVXYkdEeTlBOWYvalA1MHViSnpGZG1mOENUcXI0eDJMTldybUx0NE9hZnM5YS84YXpGcXZxbXk1eTdoV2RQSmE2RFRxWWJ6NjU5NGlxRElqQkdLYStWRGQ3TU5FYWwxM3M3dDdBUHppUE1jNkxJZDdUY1c4Z3JZSXpLNElwZTNEVmNkNVVCOCswUnJ6dmpQZThESmNEN09udmc5cTBNZXpqMmUrSDRwTDRSejVrMTU4T3B4UEY5TWdiOG5NajlkTzg1SHE5OS94SmZ2M2ZFTmNBRjc0ZCtpV0M1akVuTVNsSDk5ZG9SUWNGb0RnR09TY2hmSWdKOHpMdkZKY0E1Nm9nSjJNNVIxV2Zsb2lwTFVrZE1ZdEtTZEVRR3NoQXgvZUhwaWNVNDNsWDkyQVBLSUNJTWhFaFV2MG12SFhGWllNemJzUHMxeXJJNFFIVTNHaWZWaUY5aVdtRDhRSEVNUzFFVnplV1Vzb2NNNVlqd25qSkRLYzFqUmpQK2pvUXgyZklXRUlSOGlkZG1qWWNDNHdXQ0dXSzg0L3ZPZStRd1EzbHRMaUdVVlZybHRjV25Ka1kwWjNXanlMK0phdDN1ZHRFVzhLNzRERk1JZUtPWUFoWlZxM00wR2E2L2RzVDNWaEVhb0FYQ0NES2ExVHVtTkJpZWFwSFNZSUZna2NXczFDbGhhTXRxZVZaanE5T0NzQXJmRE9XMHlDQnE1dVVmVGNwUnRvNWhEU1hscmZvMzVhMU4xbkdSTTVTWkQrSmg0QkRDZXYwUDRJRVpBZ3lKS3NzSzFObjN6bnd1b3hobCs1R1Y3VG1NVUFMMlRmY3l4c2NOOTFtRWNCS0hoR2JvMEdpYnBUWnpuYm5FQXgrV211U1hXdW9wL1RWTW5zSkFpYkFmYTNGZzQ5emp5YnpVTnJ4NDhTUU95NHV4V1dwUHdNQTc4MllxUTM1UUluUCtuU2ZMM0RTQzNGZk1mUk9VK2duTWVjTG1CUTQ0SGpadnRDZ3d3dVAzeHFqd2huUmxHbjNzS2FNcTZFMDkyc0RFU29BVFlVL1hlc0NaVTFPL1RpZXg5dUFuMjc1cERBcHZvVzMyTnBnM0dvWXhiODc2ZUJMU1lqNmFMcDk2YzI0UDEvZktWMlRtS3hlaDlUSjlOSTE1Q3NuZGVKSUVhYUIvcXo4TlRQeGtVSG96V3Jna0xTZWIraFBZUWVIM2JyRWU5NmxYOHJFUmFjbDJRWEt4MXVPN2NGWWxrVUZoR3JlUnF6QVo2bG9DN0MyR0cvcHpRcVk5T0tRL0o4bHRCS3JuT2F1ZkJ5V3c0WGhNS2t4dDE3bE4vWjYxTTYveDlkeTVHMCtJVnZwS2l0M2ViRHhKOEl0blg2LzFtQmFCSVc5Z012aXB4MzBGS3RPMVp6eXQ5ZkJmUE1HODhsUkI0aVdxSXFqYjdUNlQveEVXRlhGVjRYQkhkUDdCSmN3ek9WejhxTUphZmlZdk1RbFVvUTdvWjdLL2RGS2ZpU0MwNkZvOUN3TGRFQlIwL1ZJVjlxSFJaUWdrL0NVR1BzTHRjWmtxZ0c2SUNPY3hDcnFWcU12WnlvZnd6OVlpT1FTRW9PeVo1Q3lMU1hpMTErQUZsYW9BaEx4SVVTWUUxZjk1cFNsLzgweit3SFNRcHZuNXdmNnI2Z1l1UWVRVWd5T3pRSnFldmJ6ZG9wM0Y5RHdtT1FNRW9pTkFjdmJaOEFRUUVEWUkzaUNjZkRhdWhxZkppclZKbncxZDd5MnFyK3pxWVR3Wm5PWFJlVFh6WktGdWRWMzRnUk1xK0U3MnpGTUVLK09iVkptcmdzd2Y4eWJuTnNBa2dNRm8wb2JxeTJCOUFZYTljL2VidC8zRi8vQ3hJdjhQVmI3a2t6ZU0rQitraElHWW9PeXdmMWRBWk4zU3B0c0F2N2pXbitibW8vdGpvUStuMCt2NWovRzErME9TNU1OSVFhaE9FcU9NSm1wYktqUlJNRWJsSEMxUFhqVlJVd1hJc2Z5em9OdS9yOHE3S2xSMVg2Mmlwd1ZJUFRrcHUyL3ozMHc5R0FwcGtnQVNIQmw3N3Nma1BNY0lwVzNwc3ppUUpPbFpmTGM3d0dsTWtObzd1empkZXdOaXhqY1QrVEdDdmh5VnY3OGdjUzJDbEJBRXEvdnJqc2hqWGxURkJ4bzBaNDJqdS9Yemp5K3ZXeW4zNHh6NlFJUGZKdEI5WUhJRG1vU1ZGeENpUFArdlR6YW5mbW9sbjVPZzZnb2dDL2N3ZGY5cVRmVmJvK014TWJ2Q0prU05rUTN0L0NJdmZicXRaUTNmbWpFWnlobklXSDFtVm9VcFdxTk03SWhvalVoMWxxMm9JMzV2ZmhES0NzS1BldFVVRlB3QXJENm83bi8yT1VqU0NPVDFjZSsxODhiamxPYXNXL2taNCs2SytnZXkzbFlQZjBoV24rZnBWdG03cGY0WEtkdFc4UDM3N2diRlljUlU0VmxVNnRpdW9UdzFxK1ZiSDhBWHVseE80aVJtcXREN08vbjlBeXI5M1V6OFVZTEtvL1pURng2OTQzbExrS1ZQMHRTSitPR3R0VktGZG1kMW1za3FxTnJwOWJjVWF3UDRKMVRyaUxXSFJGVnBzeTVELzlta08rajNCYzRkRy9VUDViNUt1UU4rL3k3R2ZXLzlhaTNYL1c2ZUF0NUxpOXlqSkJkZi95OEFBUC8vL3FHMEdJY2ZBQUE9 +kind: Secret +metadata: + annotations: + kots.io/app-slug: my-app + labels: + createdAt: "1" + kots.io/app-slug: my-app + kots.io/backup: velero + name: test-chart + owner: helm + status: deployed + version: "1" + name: sh.helm.release.v1.test-chart.v1 + namespace: helmns +type: helm.sh/release.v1 \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/test-licenseinfo-configmap.yaml b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/test-licenseinfo-configmap.yaml new file mode 100644 index 0000000000..db9a488146 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/test-licenseinfo-configmap.yaml @@ -0,0 +1,33 @@ +apiVersion: v1 +data: + dockerCfg: eyJhdXRocyI6eyJwcm94eS5yZXBsaWNhdGVkLmNvbSI6eyJhdXRoIjoiTVhaMWMwOXZhM2hCVm5BeGRHdFNSM1Y1ZUc1R01qTlFTbU54T2pGMmRYTlBiMnQ0UVZad01YUnJVa2QxZVhodVJqSXpVRXBqY1E9PSJ9LCJyZWdpc3RyeS5yZXBsaWNhdGVkLmNvbSI6eyJhdXRoIjoiTVhaMWMwOXZhM2hCVm5BeGRHdFNSM1Y1ZUc1R01qTlFTbU54T2pGMmRYTlBiMnQ0UVZad01YUnJVa2QxZVhodVJqSXpVRXBqY1E9PSJ9fX0= + licenseFieldValueAppSlug: my-app + licenseFieldValueChannelID: 1vusIYZLAVxMG6q760OJmRKj5i5 + licenseFieldValueChannelName: My Channel + licenseFieldValueCustomBoolField: "true" + licenseFieldValueCustomHiddenField: this is secret + licenseFieldValueCustomIntField: 123 + licenseFieldValueCustomStringField: single line text + licenseFieldValueCustomTextField: |- + multi + line + text + licenseFieldValueCustomerName: Test Customer + licenseFieldValueEndpoint: https://replicated.app + licenseFieldValueIsAirgapSupported: true + licenseFieldValueIsGeoaxisSupported: false + licenseFieldValueIsGitOpsSupported: true + licenseFieldValueIsIdentityServiceSupported: false + licenseFieldValueLicenseID: 1vusOokxAVp1tkRGuyxnF23PJcq + licenseFieldValueLicenseId: 1vusOokxAVp1tkRGuyxnF23PJcq + licenseFieldValueLicenseSequence: 7 + licenseFieldValueLicenseType: prod + licenseFieldValueSignature: '{"licenseData":"eyJhcGlWZXJzaW9uIjoia290cy5pby92MWJldGExIiwia2luZCI6IkxpY2Vuc2UiLCJtZXRhZGF0YSI6eyJuYW1lIjoidGVzdGN1c3RvbWVyIn0sInNwZWMiOnsibGljZW5zZUlEIjoiMXZ1c09va3hBVnAxdGtSR3V5eG5GMjNQSmNxIiwibGljZW5zZVR5cGUiOiJwcm9kIiwiY3VzdG9tZXJOYW1lIjoiVGVzdCBDdXN0b21lciIsImFwcFNsdWciOiJteS1hcHAiLCJjaGFubmVsSUQiOiIxdnVzSVlaTEFWeE1HNnE3NjBPSm1SS2o1aTUiLCJjaGFubmVsTmFtZSI6Ik15IENoYW5uZWwiLCJsaWNlbnNlU2VxdWVuY2UiOjcsImVuZHBvaW50IjoiaHR0cHM6Ly9yZXBsaWNhdGVkLmFwcCIsImVudGl0bGVtZW50cyI6eyJib29sX2ZpZWxkIjp7InRpdGxlIjoiQm9vbCBGaWVsZCIsInZhbHVlIjp0cnVlLCJ2YWx1ZVR5cGUiOiJCb29sZWFuIn0sImV4cGlyZXNfYXQiOnsidGl0bGUiOiJFeHBpcmF0aW9uIiwiZGVzY3JpcHRpb24iOiJMaWNlbnNlIEV4cGlyYXRpb24iLCJ2YWx1ZSI6IjIwMzAtMDctMjdUMDA6MDA6MDBaIiwidmFsdWVUeXBlIjoiU3RyaW5nIn0sImhpZGRlbl9maWVsZCI6eyJ0aXRsZSI6IkhpZGRlbiBGaWVsZCIsInZhbHVlIjoidGhpcyBpcyBzZWNyZXQiLCJ2YWx1ZVR5cGUiOiJTdHJpbmciLCJpc0hpZGRlbiI6dHJ1ZX0sImludF9maWVsZCI6eyJ0aXRsZSI6IkludCBGaWVsZCIsInZhbHVlIjoxMjMsInZhbHVlVHlwZSI6IkludGVnZXIifSwic3RyaW5nX2ZpZWxkIjp7InRpdGxlIjoiU3RyaW5nRmllbGQiLCJ2YWx1ZSI6InNpbmdsZSBsaW5lIHRleHQiLCJ2YWx1ZVR5cGUiOiJTdHJpbmcifSwidGV4dF9maWVsZCI6eyJ0aXRsZSI6IlRleHQgRmllbGQiLCJ2YWx1ZSI6Im11bHRpXG5saW5lXG50ZXh0IiwidmFsdWVUeXBlIjoiVGV4dCJ9fSwiaXNBaXJnYXBTdXBwb3J0ZWQiOnRydWUsImlzR2l0T3BzU3VwcG9ydGVkIjp0cnVlLCJpc1NuYXBzaG90U3VwcG9ydGVkIjp0cnVlfX0=","innerSignature":"eyJsaWNlbnNlU2lnbmF0dXJlIjoiaHgxMWMvTGZ3Q3hTNXFkQXBFSXFuTk1OM0pKa2s4VGdXRUZsT1JVRzR2cGV3dFhWV3lmejdYcHAwQ1k2YjdrQTRKczNIaGwwbFI0WTA1LzcvQUdCaDdVMHg3RHZMZ3QzU3M0bnFLVStXWEpSTzJYQUFvR0N1dTVGTFprQUhXcTRQQm1zaHV6cVlvcnpxelhFYVVVZERUdUxCMmg5aHgwWEhPRlpRMzludm9OR2ZOdy94SVdZdHRPdXdva2w2MVloRUxVeFd1SVRFc0NUa3lmMTMwOHk5RlRsZTJyV2dEeHFMa0RPSWUyOEl3S2RBL2IwVUIyTFFmTVpwVzl2Q3BJL2lyVzNnbjZyNVZ3V20vSWpybm43RzRkVjZuV3pTd0hPQ2Rua014MEt5UUNkL1B1ZXJTb3RuQ09tS013ZTRLbjhDd1NXUTQ4dTFDMm1iWUsxdXNZN3V3PT0iLCJwdWJsaWNLZXkiOiItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFzNHJvUHp1aWRMeXN2b1Y2dzlaNFxuWGFib0NmY2MxaGdVaCswWUdKcE5DRUxrN0ZLQy92azdzdDlGNmcwT29kSERleXdRWkhKdU5MZlRsQlBGQ2NiNlxuNm9sTFNycFA4clU3SGxHblFER0RMaXdKQ2hkRDdUUGR3aWtpd0tFcm5jWjhGZjVlSnowdDNiTXZrT2ZUYnJBbFxuYkFCY0o5MVlUOXJuUW9qdUcxRWJQTjhFVnR6MlY4NHdubGd4MHBwbDV4OHZNbXppMHJublFUWUFjbzZqa2pIM1xuTnNUdXN1S1dvRFR5MXNrdkRROHlBYWJmY3M0N3ZsQk00SDFORE4vRHRaYlYvYnl2bkJ6bC8xVkVzTFdjZVVpTFxuRXF1OEdyaytQUDd2RGRwbER3cXZPWkxFdXk3djhnRm5SOVRURWprNUo5dnZUSGdmSnUzenlEOGlKY0RDNXpqOVxub1FJREFRQUJcbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIiwia2V5U2lnbmF0dXJlIjoiZXlKemFXZHVZWFIxY21VaU9pSjBRWHB2WTNKVk56aFhSR2RsUTJocmNIWkVUVTlFWjBKWU1FRkZTRE5FU0hKbE1rTTNLMHBEVDNGeFNtNURUVTVVYm01bVpFRnlZWHB6ZERjMVZHaExPWEJUUkZrdkwwbzNZMFZJUmxWVEwyOUhWRWxsVkVOMFRHMVZRMGN3VGxGbFkzSnRTRms0VUZOa1ZVSjBUMVl3Ymt0cFRrVnBjbkJhTVc5amJWbHFZa3hoU2xsVWJFRkVXbUZvVjFKUFdqbFJhWEZuWldoQ2FuQjNSR3MwYVZJNU5WVldWVTVyT0hKb1lVTXlhbTg0V0daeFlqVlZibXhxZEZFd055czBhVlJJVEZONmVFMHplVXRvTUZGVmEwVTRRVzlHUlhKUE1YRlBSMVpRU1RCNllWaHpWVXBtY0RSbE1UQk9OV3RSVnpWT1NWY3ZSVXRFU0hsbU9VbFhkM1IwY1VsYWNXRjBSa05EYUZkcmJ6VkRSM0JYTDI1Rk1YYzJlV3RJVVhBMlUxSlJiSFpwUkUwMFZEUktUMkZsUVd0c1RWUk1UVWNyWTBaTGIzZE9TVm95YkhORGRsTnZRakZaZVdOTlNVSmxabEpuZWtSdU0xRTlQU0lzSW1kc2IySmhiRXRsZVVsa0lqb2lZbVJsWlRVMk5UWXdZMlppTkROak9XSXlPR0ptT1RobFlXTmhabUUyTkRZaWZRPT0ifQ=="}' +kind: ConfigMap +metadata: + annotations: + kots.io/app-slug: my-app + labels: + kots.io/app-slug: my-app + kots.io/backup: velero + name: test-licenseinfo \ No newline at end of file diff --git a/pkg/tests/pull/cases/airgap/wantResults/upstream/kots-app.yaml b/pkg/tests/pull/cases/airgap/wantResults/upstream/kots-app.yaml new file mode 100644 index 0000000000..d10ce3862d --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/upstream/kots-app.yaml @@ -0,0 +1,8 @@ +apiVersion: kots.io/v1beta1 +kind: Application +metadata: + name: my-app + annotations: + kots.io/exclude: "true" +spec: + title: my-app diff --git a/pkg/tests/pull/cases/airgap/wantResults/upstream/my-chart-0.1.0.tgz b/pkg/tests/pull/cases/airgap/wantResults/upstream/my-chart-0.1.0.tgz new file mode 100644 index 0000000000..dd79ddc8a7 Binary files /dev/null and b/pkg/tests/pull/cases/airgap/wantResults/upstream/my-chart-0.1.0.tgz differ diff --git a/pkg/tests/pull/cases/airgap/wantResults/upstream/my-chart.yaml b/pkg/tests/pull/cases/airgap/wantResults/upstream/my-chart.yaml new file mode 100644 index 0000000000..ddac6450f7 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/upstream/my-chart.yaml @@ -0,0 +1,19 @@ +apiVersion: kots.io/v1beta1 +kind: HelmChart +metadata: + name: my-chart +spec: + # chart identifies a matching chart from a .tgz + chart: + name: my-chart + chartVersion: 0.1.0 + releaseName: my-chart-release + useHelmInstall: true + + # values are used in the customer environment, as a pre-render step + # these values will be supplied to helm template + values: {} + + # builder values provide a way to render the chart with all images + # and manifests. this is used in replicated to create airgap packages + builder: {} diff --git a/pkg/tests/pull/cases/airgap/wantResults/upstream/replicated-1.0.0-beta.12.tgz b/pkg/tests/pull/cases/airgap/wantResults/upstream/replicated-1.0.0-beta.12.tgz new file mode 100644 index 0000000000..f8b693aff1 Binary files /dev/null and b/pkg/tests/pull/cases/airgap/wantResults/upstream/replicated-1.0.0-beta.12.tgz differ diff --git a/pkg/tests/pull/cases/airgap/wantResults/upstream/replicated.yaml b/pkg/tests/pull/cases/airgap/wantResults/upstream/replicated.yaml new file mode 100644 index 0000000000..d22998fd26 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/upstream/replicated.yaml @@ -0,0 +1,18 @@ +apiVersion: kots.io/v1beta2 +kind: HelmChart +metadata: + name: replicated + annotations: + kots.io/exclude: "true" +spec: + chart: + name: replicated + chartVersion: 1.0.0-beta.12 + releaseName: replicated-release + values: + my-value: my-value + optionalValues: + - when: 'repl{{ "true" }}' + recursiveMerge: true + values: + my-optional-value: my-optional-value diff --git a/pkg/tests/pull/cases/airgap/wantResults/upstream/subdir/configmap.yaml b/pkg/tests/pull/cases/airgap/wantResults/upstream/subdir/configmap.yaml new file mode 100644 index 0000000000..73843036cb --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/upstream/subdir/configmap.yaml @@ -0,0 +1,25 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: test-licenseinfo +data: + dockerCfg: {{repl LicenseDockerCfg }} + licenseFieldValueIsGitOpsSupported: {{repl LicenseFieldValue "isGitOpsSupported" }} + licenseFieldValueIsIdentityServiceSupported: {{repl LicenseFieldValue "isIdentityServiceSupported" }} + licenseFieldValueIsGeoaxisSupported: {{repl LicenseFieldValue "isGeoaxisSupported" }} + licenseFieldValueIsAirgapSupported: {{repl LicenseFieldValue "isAirgapSupported" }} + licenseFieldValueLicenseType: {{repl LicenseFieldValue "licenseType" }} + licenseFieldValueLicenseSequence: {{repl LicenseFieldValue "licenseSequence" }} + licenseFieldValueSignature: '{{repl LicenseFieldValue "signature" }}' + licenseFieldValueAppSlug: {{repl LicenseFieldValue "appSlug" }} + licenseFieldValueChannelID: {{repl LicenseFieldValue "channelID" }} + licenseFieldValueChannelName: {{repl LicenseFieldValue "channelName" }} + licenseFieldValueCustomerName: {{repl LicenseFieldValue "customerName" }} + licenseFieldValueEndpoint: {{repl LicenseFieldValue "endpoint" }} + licenseFieldValueLicenseID: {{repl LicenseFieldValue "licenseID" }} + licenseFieldValueLicenseId: {{repl LicenseFieldValue "licenseId" }} + licenseFieldValueCustomIntField: {{repl LicenseFieldValue "int_field" }} + licenseFieldValueCustomStringField: {{repl LicenseFieldValue "string_field" }} + licenseFieldValueCustomTextField: "{{repl LicenseFieldValue "text_field" | replace "\n" "\\n" }}" + licenseFieldValueCustomBoolField: "{{repl LicenseFieldValue "bool_field" }}" + licenseFieldValueCustomHiddenField: "{{repl LicenseFieldValue "hidden_field" }}" diff --git a/pkg/tests/pull/cases/airgap/wantResults/upstream/subdir/nginx.yaml b/pkg/tests/pull/cases/airgap/wantResults/upstream/subdir/nginx.yaml new file mode 100644 index 0000000000..0b288ece73 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/upstream/subdir/nginx.yaml @@ -0,0 +1,34 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: nginx +--- +kind: Service +apiVersion: v1 +metadata: + name: nginx + labels: + app: nginx +spec: + ports: + - port: 80 + name: web +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: nginx +spec: + selector: + matchLabels: + app: nginx + replicas: 1 + template: + metadata: + labels: + app: nginx + spec: + serviceAccountName: nginx + containers: + - name: nginx + image: nginx:1.24 diff --git a/pkg/tests/pull/cases/airgap/wantResults/upstream/test-chart-0.1.0.tgz b/pkg/tests/pull/cases/airgap/wantResults/upstream/test-chart-0.1.0.tgz new file mode 100644 index 0000000000..aaa774dc03 Binary files /dev/null and b/pkg/tests/pull/cases/airgap/wantResults/upstream/test-chart-0.1.0.tgz differ diff --git a/pkg/tests/pull/cases/airgap/wantResults/upstream/test-chart.yaml b/pkg/tests/pull/cases/airgap/wantResults/upstream/test-chart.yaml new file mode 100644 index 0000000000..4710b18f0e --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/upstream/test-chart.yaml @@ -0,0 +1,19 @@ +apiVersion: kots.io/v1beta1 +kind: HelmChart +metadata: + name: test-chart +spec: + # chart identifies a matching chart from a .tgz + chart: + name: test-chart + chartVersion: 0.1.0 + useHelmInstall: false + namespace: helmns + + # values are used in the customer environment, as a pre-render step + # these values will be supplied to helm template + values: {} + + # builder values provide a way to render the chart with all images + # and manifests. this is used in replicated to create airgap packages + builder: {} diff --git a/pkg/tests/pull/cases/airgap/wantResults/upstream/userdata/config.yaml b/pkg/tests/pull/cases/airgap/wantResults/upstream/userdata/config.yaml new file mode 100644 index 0000000000..8fac6db08a --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/upstream/userdata/config.yaml @@ -0,0 +1,10 @@ +apiVersion: kots.io/v1beta1 +kind: ConfigValues +metadata: + creationTimestamp: null + name: my-app +spec: + values: + hostname: + value: my-app.somebigbank.com +status: {} diff --git a/pkg/tests/pull/cases/airgap/wantResults/upstream/userdata/installation.yaml b/pkg/tests/pull/cases/airgap/wantResults/upstream/userdata/installation.yaml new file mode 100644 index 0000000000..825d8239f2 --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/upstream/userdata/installation.yaml @@ -0,0 +1,24 @@ +apiVersion: kots.io/v1beta1 +kind: Installation +metadata: + creationTimestamp: null + name: my-app +spec: + channelID: 1vusIYZLAVxMG6q760OJmRKj5i5 + channelName: My Channel + knownImages: + - image: alpine + isPrivate: true + - image: alpine:3.4 + isPrivate: true + - image: busybox + isPrivate: true + - image: nginx:1.23 + isPrivate: true + - image: nginx:1.24 + isPrivate: true + - image: nginx:latest + isPrivate: true + - image: replicated/replicated-sdk:v1.0.0-beta.12 + isPrivate: true +status: {} diff --git a/pkg/tests/pull/cases/airgap/wantResults/upstream/userdata/license.yaml b/pkg/tests/pull/cases/airgap/wantResults/upstream/userdata/license.yaml new file mode 100644 index 0000000000..9fa3a14d7f --- /dev/null +++ b/pkg/tests/pull/cases/airgap/wantResults/upstream/userdata/license.yaml @@ -0,0 +1,49 @@ +apiVersion: kots.io/v1beta1 +kind: License +metadata: + creationTimestamp: null + name: testcustomer +spec: + appSlug: my-app + channelID: 1vusIYZLAVxMG6q760OJmRKj5i5 + channelName: My Channel + customerName: Test Customer + endpoint: https://replicated.app + entitlements: + bool_field: + title: Bool Field + value: true + valueType: Boolean + expires_at: + description: License Expiration + title: Expiration + value: "2030-07-27T00:00:00Z" + valueType: String + hidden_field: + isHidden: true + title: Hidden Field + value: this is secret + valueType: String + int_field: + title: Int Field + value: 123 + valueType: Integer + string_field: + title: StringField + value: single line text + valueType: String + text_field: + title: Text Field + value: |- + multi + line + text + valueType: Text + isAirgapSupported: true + isGitOpsSupported: true + isSnapshotSupported: true + licenseID: 1vusOokxAVp1tkRGuyxnF23PJcq + licenseSequence: 7 + licenseType: prod + signature: eyJsaWNlbnNlRGF0YSI6ImV5SmhjR2xXWlhKemFXOXVJam9pYTI5MGN5NXBieTkyTVdKbGRHRXhJaXdpYTJsdVpDSTZJa3hwWTJWdWMyVWlMQ0p0WlhSaFpHRjBZU0k2ZXlKdVlXMWxJam9pZEdWemRHTjFjM1J2YldWeUluMHNJbk53WldNaU9uc2liR2xqWlc1elpVbEVJam9pTVhaMWMwOXZhM2hCVm5BeGRHdFNSM1Y1ZUc1R01qTlFTbU54SWl3aWJHbGpaVzV6WlZSNWNHVWlPaUp3Y205a0lpd2lZM1Z6ZEc5dFpYSk9ZVzFsSWpvaVZHVnpkQ0JEZFhOMGIyMWxjaUlzSW1Gd2NGTnNkV2NpT2lKdGVTMWhjSEFpTENKamFHRnVibVZzU1VRaU9pSXhkblZ6U1ZsYVRFRldlRTFITm5FM05qQlBTbTFTUzJvMWFUVWlMQ0pqYUdGdWJtVnNUbUZ0WlNJNklrMTVJRU5vWVc1dVpXd2lMQ0pzYVdObGJuTmxVMlZ4ZFdWdVkyVWlPamNzSW1WdVpIQnZhVzUwSWpvaWFIUjBjSE02THk5eVpYQnNhV05oZEdWa0xtRndjQ0lzSW1WdWRHbDBiR1Z0Wlc1MGN5STZleUppYjI5c1gyWnBaV3hrSWpwN0luUnBkR3hsSWpvaVFtOXZiQ0JHYVdWc1pDSXNJblpoYkhWbElqcDBjblZsTENKMllXeDFaVlI1Y0dVaU9pSkNiMjlzWldGdUluMHNJbVY0Y0dseVpYTmZZWFFpT25zaWRHbDBiR1VpT2lKRmVIQnBjbUYwYVc5dUlpd2laR1Z6WTNKcGNIUnBiMjRpT2lKTWFXTmxibk5sSUVWNGNHbHlZWFJwYjI0aUxDSjJZV3gxWlNJNklqSXdNekF0TURjdE1qZFVNREE2TURBNk1EQmFJaXdpZG1Gc2RXVlVlWEJsSWpvaVUzUnlhVzVuSW4wc0ltaHBaR1JsYmw5bWFXVnNaQ0k2ZXlKMGFYUnNaU0k2SWtocFpHUmxiaUJHYVdWc1pDSXNJblpoYkhWbElqb2lkR2hwY3lCcGN5QnpaV055WlhRaUxDSjJZV3gxWlZSNWNHVWlPaUpUZEhKcGJtY2lMQ0pwYzBocFpHUmxiaUk2ZEhKMVpYMHNJbWx1ZEY5bWFXVnNaQ0k2ZXlKMGFYUnNaU0k2SWtsdWRDQkdhV1ZzWkNJc0luWmhiSFZsSWpveE1qTXNJblpoYkhWbFZIbHdaU0k2SWtsdWRHVm5aWElpZlN3aWMzUnlhVzVuWDJacFpXeGtJanA3SW5ScGRHeGxJam9pVTNSeWFXNW5SbWxsYkdRaUxDSjJZV3gxWlNJNkluTnBibWRzWlNCc2FXNWxJSFJsZUhRaUxDSjJZV3gxWlZSNWNHVWlPaUpUZEhKcGJtY2lmU3dpZEdWNGRGOW1hV1ZzWkNJNmV5SjBhWFJzWlNJNklsUmxlSFFnUm1sbGJHUWlMQ0oyWVd4MVpTSTZJbTExYkhScFhHNXNhVzVsWEc1MFpYaDBJaXdpZG1Gc2RXVlVlWEJsSWpvaVZHVjRkQ0o5ZlN3aWFYTkJhWEpuWVhCVGRYQndiM0owWldRaU9uUnlkV1VzSW1selIybDBUM0J6VTNWd2NHOXlkR1ZrSWpwMGNuVmxMQ0pwYzFOdVlYQnphRzkwVTNWd2NHOXlkR1ZrSWpwMGNuVmxmWDA9IiwiaW5uZXJTaWduYXR1cmUiOiJleUpzYVdObGJuTmxVMmxuYm1GMGRYSmxJam9pYUhneE1XTXZUR1ozUTNoVE5YRmtRWEJGU1hGdVRrMU9NMHBLYTJzNFZHZFhSVVpzVDFKVlJ6UjJjR1YzZEZoV1YzbG1lamRZY0hBd1ExazJZamRyUVRSS2N6TklhR3d3YkZJMFdUQTFMemN2UVVkQ2FEZFZNSGczUkhaTVozUXpVM00wYm5GTFZTdFhXRXBTVHpKWVFVRnZSME4xZFRWR1RGcHJRVWhYY1RSUVFtMXphSFY2Y1ZsdmNucHhlbGhGWVZWVlpFUlVkVXhDTW1nNWFIZ3dXRWhQUmxwUk16bHVkbTlPUjJaT2R5OTRTVmRaZEhSUGRYZHZhMncyTVZsb1JVeFZlRmQxU1ZSRmMwTlVhM2xtTVRNd09IazVSbFJzWlRKeVYyZEVlSEZNYTBSUFNXVXlPRWwzUzJSQkwySXdWVUl5VEZGbVRWcHdWemwyUTNCSkwybHlWek5uYmpaeU5WWjNWMjB2U1dweWJtNDNSelJrVmpadVYzcFRkMGhQUTJSdWEwMTRNRXQ1VVVOa0wxQjFaWEpUYjNSdVEwOXRTMDEzWlRSTGJqaERkMU5YVVRRNGRURkRNbTFpV1VzeGRYTlpOM1YzUFQwaUxDSndkV0pzYVdOTFpYa2lPaUl0TFMwdExVSkZSMGxPSUZCVlFreEpReUJMUlZrdExTMHRMVnh1VFVsSlFrbHFRVTVDWjJ0eGFHdHBSemwzTUVKQlVVVkdRVUZQUTBGUk9FRk5TVWxDUTJkTFEwRlJSVUZ6TkhKdlVIcDFhV1JNZVhOMmIxWTJkemxhTkZ4dVdHRmliME5tWTJNeGFHZFZhQ3N3V1VkS2NFNURSVXhyTjBaTFF5OTJhemR6ZERsR05tY3dUMjlrU0VSbGVYZFJXa2hLZFU1TVpsUnNRbEJHUTJOaU5seHVObTlzVEZOeWNGQTRjbFUzU0d4SGJsRkVSMFJNYVhkS1EyaGtSRGRVVUdSM2FXdHBkMHRGY201aldqaEdaalZsU25vd2RETmlUWFpyVDJaVVluSkJiRnh1WWtGQ1kwbzVNVmxVT1hKdVVXOXFkVWN4UldKUVRqaEZWblI2TWxZNE5IZHViR2Q0TUhCd2JEVjRPSFpOYlhwcE1ISnVibEZVV1VGamJ6WnFhMnBJTTF4dVRuTlVkWE4xUzFkdlJGUjVNWE5yZGtSUk9IbEJZV0ptWTNNME4zWnNRazAwU0RGT1JFNHZSSFJhWWxZdllubDJia0o2YkM4eFZrVnpURmRqWlZWcFRGeHVSWEYxT0VkeWF5dFFVRGQyUkdSd2JFUjNjWFpQV2t4RmRYazNkamhuUm01U09WUlVSV3ByTlVvNWRuWlVTR2RtU25VemVubEVPR2xLWTBSRE5YcHFPVnh1YjFGSlJFRlJRVUpjYmkwdExTMHRSVTVFSUZCVlFreEpReUJMUlZrdExTMHRMVnh1SWl3aWEyVjVVMmxuYm1GMGRYSmxJam9pWlhsS2VtRlhaSFZaV0ZJeFkyMVZhVTlwU2pCUldIQjJXVE5LVms1NmFGaFNSMlJzVVRKb2NtTklXa1ZVVlRsRldqQktXVTFGUmtaVFJFNUZVMGhLYkUxclRUTkxNSEJFVkROR2VGTnROVVJVVlRWVlltMDFiVnBGUm5sWldIQjZaRVJqTVZaSGFFeFBXRUpVVWtacmRrd3diek5aTUZaSlVteFdWRXd5T1VoV1JXeHNWa1ZPTUZSSE1WWlJNR04zVkd4R2JGa3pTblJUUm1zMFZVWk9hMVpWU2pCVU1WbDNZbXQwY0ZSclZuQmpia0poVFZjNWFtSldiSEZaYTNob1UyeHNWV0pGUmtWWGJVWnZWakZLVUZkcWJGSmhXRVp1V2xkb1EyRnVRak5TUjNNd1lWWkpOVTVXVmxkV1ZUVnlUMGhLYjFsVlRYbGhiVGcwVjBkYWVGbHFWbFppYlhoeFpFWkZkMDU1Y3pCaFZsSkpWRVpPTm1WRk1IcGxWWFJ2VFVaR1ZtRXdWVFJSVnpsSFVsaEtVRTFZUmxCU01WcFJVMVJDTmxsV2FIcFdWWEJ0WTBSU2JFMVVRazlPVjNSU1ZucFdUMU5XWTNaU1ZYUkZVMGhzYlU5VmJGaGtNMUl3WTFWc1lXTlhSakJTYTA1RVlVWmtjbUo2VmtSU00wSllUREkxUmsxWVl6SmxWM1JKVlZoQk1sVXhTbEppU0Zwd1VrVXdNRlpFVWt0VU1rWnNVVmQwYzFSV1VrMVVWV055V1RCYVRHSXpaRTlUVm05NVlraE9SR1JzVG5aUmFrWmFaVmRPVGxOVlNteGFiRXB1Wld0U2RVMHhSVGxRVTBselNXMWtjMkl5U21oaVJYUnNaVlZzYTBscWIybFpiVkpzV2xSVk1rNVVXWGRaTWxwcFRrUk9hazlYU1hsUFIwcHRUMVJvYkZsWFRtaGFiVVV5VGtSWmFXWlJQVDBpZlE9PSJ9 +status: {}