From 1f7b449e64706aae92d7bdfbfa6e20267e8f8372 Mon Sep 17 00:00:00 2001 From: Salah Al Saleh Date: Mon, 19 Feb 2024 18:25:25 +0000 Subject: [PATCH 1/2] Include v1beta2 Helm charts images to known images in air gapped mode --- pkg/apparchive/helm-v1beta2.go | 63 ++-- pkg/tests/pull/cases/airgap/testcase.yaml | 18 + .../pull/cases/airgap/upstream/kots-app.yaml | 8 + .../cases/airgap/upstream/my-chart-0.1.0.tgz | Bin 0 -> 407 bytes .../pull/cases/airgap/upstream/my-chart.yaml | 19 + .../upstream/replicated-1.0.0-beta.12.tgz | Bin 0 -> 7447 bytes .../cases/airgap/upstream/replicated.yaml | 18 + .../airgap/upstream/subdir/configmap.yaml | 25 ++ .../cases/airgap/upstream/subdir/nginx.yaml | 34 ++ .../airgap/upstream/test-chart-0.1.0.tgz | Bin 0 -> 1922 bytes .../cases/airgap/upstream/test-chart.yaml | 19 + .../airgap/upstream/userdata/config.yaml | 10 + .../airgap/upstream/userdata/license.yaml | 47 +++ .../base/charts/my-chart/Chart.yaml | 6 + .../base/charts/my-chart/kustomization.yaml | 8 + .../templates/my-chart-configmap.yaml | 6 + .../my-chart/templates/my-chart-pod.yaml | 11 + .../base/charts/my-chart/values.yaml | 1 + .../base/charts/test-chart/Chart.yaml | 6 + .../charts/test-chart/chartHelmSecret.yaml | 14 + .../base/charts/test-chart/kustomization.yaml | 12 + .../base/charts/test-chart/test-1.yaml | 11 + .../base/charts/test-chart/test-2.yaml | 37 ++ .../base/charts/test-chart/test-3.yaml | 22 ++ .../base/charts/test-chart/test-4.yaml | 23 ++ .../base/charts/test-chart/test-5.yaml | 23 ++ .../base/charts/test-chart/values.yaml | 34 ++ .../wantResults/base/kustomization.yaml | 16 + .../wantResults/base/subdir/configmap.yaml | 25 ++ .../wantResults/base/subdir/nginx-2.yaml | 10 + .../wantResults/base/subdir/nginx-3.yaml | 18 + .../airgap/wantResults/base/subdir/nginx.yaml | 4 + .../replicated-1.0.0-beta.12.tgz | Bin 0 -> 7447 bytes .../helm/replicated-release/values.yaml | 2 + .../wantResults/kotsKinds/kots-app.yaml | 8 + .../wantResults/kotsKinds/my-chart.yaml | 19 + .../wantResults/kotsKinds/replicated.yaml | 18 + .../wantResults/kotsKinds/test-chart.yaml | 19 + .../kotsKinds/userdata/config.yaml | 10 + .../kotsKinds/userdata/installation.yaml | 24 ++ .../kotsKinds/userdata/license.yaml | 49 +++ .../charts/my-chart/kustomization.yaml | 4 + .../this-cluster/kustomization.yaml | 4 + .../midstream/backup-label-transformer.yaml | 39 +++ .../my-chart/backup-label-transformer.yaml | 39 +++ .../charts/my-chart/kustomization.yaml | 21 ++ .../charts/my-chart/pullsecrets.yaml | 8 + .../midstream/charts/my-chart/secret.yaml | 26 ++ .../overlays/midstream/kustomization.yaml | 37 ++ .../overlays/midstream/pullsecrets.yaml | 64 ++++ .../overlays/midstream/secret.yaml | 28 ++ .../this-cluster/charts/my-chart/Chart.yaml | 6 + .../kotsadm-replicated-registry-secret.yaml | 16 + .../my-app-my-chart-registry-secret.yaml | 16 + .../my-chart-configmap-configmap.yaml | 10 + .../my-chart/templates/my-chart-pod-pod.yaml | 17 + .../helm/replicated-release/all.yaml | 330 ++++++++++++++++++ .../kotsadm-replicated-registry-secret.yaml | 17 + .../this-cluster/my-app-registry-secret.yaml | 17 + .../this-cluster/nginx-deployment.yaml | 29 ++ .../rendered/this-cluster/nginx-service.yaml | 14 + .../this-cluster/nginx-serviceaccount.yaml | 9 + .../this-cluster/post-install-job-job.yaml | 34 ++ .../this-cluster/pre-install-job-job.yaml | 34 ++ .../this-cluster/security-scanner-secret.yaml | 14 + ...ecurity-test-example-chart-deployment.yaml | 47 +++ ...est-example-chart-test-connection-pod.yaml | 27 ++ ....helm.release.v1.test-chart.v1-secret.yaml | 18 + .../test-licenseinfo-configmap.yaml | 33 ++ .../airgap/wantResults/upstream/kots-app.yaml | 8 + .../wantResults/upstream/my-chart-0.1.0.tgz | Bin 0 -> 407 bytes .../airgap/wantResults/upstream/my-chart.yaml | 19 + .../upstream/replicated-1.0.0-beta.12.tgz | Bin 0 -> 7447 bytes .../wantResults/upstream/replicated.yaml | 18 + .../upstream/subdir/configmap.yaml | 25 ++ .../wantResults/upstream/subdir/nginx.yaml | 34 ++ .../wantResults/upstream/test-chart-0.1.0.tgz | Bin 0 -> 1922 bytes .../wantResults/upstream/test-chart.yaml | 19 + .../wantResults/upstream/userdata/config.yaml | 10 + .../upstream/userdata/installation.yaml | 24 ++ .../upstream/userdata/license.yaml | 49 +++ 81 files changed, 1830 insertions(+), 31 deletions(-) create mode 100644 pkg/tests/pull/cases/airgap/testcase.yaml create mode 100644 pkg/tests/pull/cases/airgap/upstream/kots-app.yaml create mode 100644 pkg/tests/pull/cases/airgap/upstream/my-chart-0.1.0.tgz create mode 100644 pkg/tests/pull/cases/airgap/upstream/my-chart.yaml create mode 100644 pkg/tests/pull/cases/airgap/upstream/replicated-1.0.0-beta.12.tgz create mode 100644 pkg/tests/pull/cases/airgap/upstream/replicated.yaml create mode 100644 pkg/tests/pull/cases/airgap/upstream/subdir/configmap.yaml create mode 100644 pkg/tests/pull/cases/airgap/upstream/subdir/nginx.yaml create mode 100644 pkg/tests/pull/cases/airgap/upstream/test-chart-0.1.0.tgz create mode 100644 pkg/tests/pull/cases/airgap/upstream/test-chart.yaml create mode 100644 pkg/tests/pull/cases/airgap/upstream/userdata/config.yaml create mode 100644 pkg/tests/pull/cases/airgap/upstream/userdata/license.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/Chart.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/kustomization.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/templates/my-chart-configmap.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/templates/my-chart-pod.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/my-chart/values.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/Chart.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/chartHelmSecret.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/kustomization.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-1.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-2.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-3.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-4.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/test-5.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/charts/test-chart/values.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/kustomization.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/subdir/configmap.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/subdir/nginx-2.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/subdir/nginx-3.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/base/subdir/nginx.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/helm/replicated-release/replicated-1.0.0-beta.12.tgz create mode 100644 pkg/tests/pull/cases/airgap/wantResults/helm/replicated-release/values.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/kotsKinds/kots-app.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/kotsKinds/my-chart.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/kotsKinds/replicated.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/kotsKinds/test-chart.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/kotsKinds/userdata/config.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/kotsKinds/userdata/installation.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/kotsKinds/userdata/license.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/overlays/downstreams/this-cluster/charts/my-chart/kustomization.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/overlays/downstreams/this-cluster/kustomization.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/backup-label-transformer.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/backup-label-transformer.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/kustomization.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/pullsecrets.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/charts/my-chart/secret.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/kustomization.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/pullsecrets.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/overlays/midstream/secret.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/Chart.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/kotsadm-replicated-registry-secret.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/my-app-my-chart-registry-secret.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/my-chart-configmap-configmap.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/charts/my-chart/templates/my-chart-pod-pod.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/helm/replicated-release/all.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/kotsadm-replicated-registry-secret.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/my-app-registry-secret.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/nginx-deployment.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/nginx-service.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/nginx-serviceaccount.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/post-install-job-job.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/pre-install-job-job.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/security-scanner-secret.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/security-test-example-chart-deployment.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/security-test-example-chart-test-connection-pod.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/sh.helm.release.v1.test-chart.v1-secret.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/rendered/this-cluster/test-licenseinfo-configmap.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/upstream/kots-app.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/upstream/my-chart-0.1.0.tgz create mode 100644 pkg/tests/pull/cases/airgap/wantResults/upstream/my-chart.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/upstream/replicated-1.0.0-beta.12.tgz create mode 100644 pkg/tests/pull/cases/airgap/wantResults/upstream/replicated.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/upstream/subdir/configmap.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/upstream/subdir/nginx.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/upstream/test-chart-0.1.0.tgz create mode 100644 pkg/tests/pull/cases/airgap/wantResults/upstream/test-chart.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/upstream/userdata/config.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/upstream/userdata/installation.yaml create mode 100644 pkg/tests/pull/cases/airgap/wantResults/upstream/userdata/license.yaml diff --git a/pkg/apparchive/helm-v1beta2.go b/pkg/apparchive/helm-v1beta2.go index 60ef747efe..85793b6880 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 base 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 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 0000000000000000000000000000000000000000..dd79ddc8a78391a7e96ba81e4696f8382c47b46d GIT binary patch literal 407 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8b693aff1f625496a602f7b1bf7412314327a45 GIT binary patch literal 7447 zcmV+y9q8g8iwFP!00000|LlEfbE~+v==tnlLAm?Z>3z@Y}% zTeo%zPy$AP0yrLa_kVu{c*1suJ>2xY??fNE9VD%_B&|tHOWFyh#CK4J-SdWrN$5XB zaf1K$Qwz(o?B&Hp@qdC%AV0kH!*(q>+V`)Xp0Zepde1o7uJV9lMZjn{*eFoD2Vz1C#fGt*UVG1hA7?r$u-yp zduHPdHMnNY#igz&>N?B-laO(8mSOJWgz=*^LxlLz1EX$PsurOTUo$%%t7S`yuNg$k z4}Kigo;K*J*#7Ey`FAOM@}J?55|rWe{ELSP#Yx)8=+DpvugL$!C3krs|LxD*#fSXA zNBR2o{2w)bK~dx~nTMHNVww29_+3bMqxO&UKmV+K{d&f@_}-5&Q{VASBX3@3&UOvZ zjATrsG$l$7s{s(1;k0NudcsNKyO{Zd$&y**Fqf_3rypvw`+I-E)X(b78WxV+{AaBo zu$N$ztqCeg%;{aL4hE&nEX6KkFLz`!1lgFpOnlLBM?FpaD7$Cs|B;^kM_R8AqWry9 zjm#f~N<$82>i?`W^)K~r9#DsncwSJOV1iLvPJBvpm|4u&n2F1|a&c7X*KkHM|7_RD z#gxR$5Jy@1`U(|Yb_4bAE2~n}ZkJ}$==BzuqQX84ZOkZO;EYwovl60 z>ky@lU}oba!Wm8*etf>QUSGeS=<)~iIEyoUzyZflLKL9~?4H@n63}KYHJm*8&SC#@ z?zA=WZ<)Qrfu5bDqBPde%vCAqjnniO#y@g!mHI+*PLY1=J2*-)BlwuOudI97v}{=t z&M@mG`t7&hHca|JVjGc9ja|=A)vlk`UCYkZZjI;g<)R#$C?tD$3#Q)_plXLxNL~l| ztb7bpW<+tMdH#L&;xzf`w%z_D{kr#^x&9Y(k8$( z)zSF(jEB;3f(xyNC`}tN#Zj7r&RHPmjZOO#$p4k=$2IEes89V>>3WKTRGh}M#KBCV zZC;$3ouX8>wu*TJmmjRgN!UqD@Has{%X_>Tbk~nuKYI9f40hS^O^8zLB>2B!ZqibB z{kH+`I8Hn}TGWlu9XDeB*t#dby+FmMHew(*zd`!0Z^H zrWfw&hBcVZc*x9sLUQN3aAkL@mYMl(ZZZmYd;@@SW1KQkoH2Oer~4a=UtN@;+(7+C z;y9R5rvAj$nR>72DI;1xUwAPPDnD@x{H4>ksrDFcrQxRb{Ox-30r?Ihkal)|0#W0SCogkfs`wFhy|5Qf!TM-Fler@P$6pb!Q@fc+uQ$Oxn z=*9Y{g2dEA&GuzF3z_X!m{i95ZEN@Y2FzwYHvr~-=56KE577f2&j`^9deR;4!p;Xwga=Y{5^ok0oRm|%Yqj_Bhq2{8+zBDY5wZ#1YnxUZTo;|=(0@ik*Zu3eSj^i< zdWy*`#M@z=9eI1(@veDl`}gLH@{$nlZ^RortWF$d$d7RH7R1GZ@40#v7D<{g$j zUKz*4cb3=8@Lq|tae~ua6IHl(7ya52_v#wGv`Vi*dwIz?b|1^ps%_Ryj%U%n1iUbd z3=`&!bAi8R&T;1K3H^DwohgKVuS0^7JBrBix`=b_FZ|3d;hgG+qo=BnROAaUvIOzb z)8X)5mZXzYuo@#C#+@F&N9>LGsg%pFAMC z7dNUG@zeUgp*uu3)V>V(TltIJQ92^uKgLixLP!0IPAY%PcQpRw)SM2jzY6B$3LnEN zcht`T9CuV+(ZBQt9aaBgsJAc98$}6@vf?PjP;d8V@5PBL5cSm|;MHUBrD|k;Vf0ad zbj_^eXH1-VIAPqxf5J)n62EDDPv!OJ=k*)Z@k#i7etbJJ<$RL93CA;j*RyzfBSjdB zUxeZ92^?=xRGX8NEt5wXekjfL_P}J=e}#&nqVuBK$wlbP?Xbry8vkW@#OlYgT+ZkX zUY?NW7v0lmm!d2IUS2bMBRN|SRqVmm{EXuyyJlJ}%hnDl^sVXANiS&NFNil)UXprZhFmd`&}tc{K79fs!P`AD(OCL#1H)}ty1gI*)`K<*|738 z#9^E)iwfDVSjWd1PEW$%o`b>d!ANkvNzXQ(Nr%kQGTl0Vhmrml_~`iLpz&`W^m;A+ zlf(r7Xing3@&6{Yd{QVz)uN|nz&BrI4*qaXzIQx6~i}>m0 z=Nx5@_xBSpPk}6LU3v)EDH5Q55Xg+W1(02b!uKm{-)?))_D>@=sUK$v&dtUCMu>{$HoB zysH_gq|E%dHHZmbZ&o&H_l42d7-rA-eVffnXZ933Sz&rgAX;S^UIX{6Yx^U^|4`BY z|CiVF|K1tLcjI_P|F_x~7l;1;W&0!l|6R(-+?evX=-m|e2_N(Ol~#GfXhhND4A;^u z@uP?SdJKCJv1{g!S{d6YLPgi7GIsY58>*w(_A8TmubEd)GY_(uPaI|zX*%2B#fFge zw-ELq(&of;P@T^;vw@utmb_&F{^2M21H&)^dr`OCMXL}5C0Iz6r2*Reyz;jr z9H)o5KHmLwJj!*=HB)*h{$H`^@8|&T-4*$1$!FUG zzO%!_yYfKo__|1=I96V(@(d*pIIElmR@2$OCwFZ<8>N$af`Gi@T~)>#p`*+p8(+hY-{x4eGq5bEY zAM*b`WqqACa`Wv`?%iwar0idX^`W~n?LS$RANn4dd>=;WD^J2pQ^*rJaIP8P_t;ap2K}w zPv*LR=TNI@t6%r&p-c_|9CoXaU%U|H*tF^urh?R!eM;t=!@%g(S2NL{&1M( z#W1skl%DAI`T1Mj;l^87@y|c6b2s%IQUCmjJ4ckBAJM}w9!4%s(nG2k#z=8;)_K5D zRwSubxw6X5^@GltAL4kHT{G?PoxE)@xj}4R+VEm`Q!;k?y_1H&oU{ne$6U)Wa}P(? zoBZ|@^&w8v;%3Q-ftE4WB1jl#MNaIpafFzn^n|!<5m%Gqe*o`a?N0r#D|^Q8soekl z{0AUk_W!vy+idOm|E=Qv*LL&6|9_A23)5d8Oq9!CJT|tcmTSK-yVoJij(mG|A15Ko za!JhfS>B+J9fA_fJfXx#xy4&=7jmJ;F5^d8%q-(svc0mIHfpu9Vu_hZ4-0W4^P#ebD{HosT-8m1t+zthny>7GJ7bS6>luKINZ1f zd&jU%`Ek?5=@)e5 zhE<*e-Mr|<=grG^J*%x#{~tkfzJ9*%#?l=ch~m3mL{hb4@3pSq+}v7k zoUmK5{eCL?*@&jk)!xKeIxHVE9Jb3+9po>Ku_ z^r0@rItK)Ym&U574nbd;>j9x|llW?L@d$~-VM3uX1yhv+RBw_S#8DHL^gmjHH?Ug0C)3U$h%bawn z3*HDdg|-Yc1Xe;*gQSH(utcKg+d4?i0Hmrx9_=Pk&`P)f{jTWpT!O{L1c-~7xspUI zNHa^M#1_4tITc1W05c;1#ro#+heRn;;KEn+{qZXZ3Q}C)gVMkjDFQ2S35hkbMa2Z+ z!ncifny(KwuKI414-(|M)hME;UH!3QICDRdfDrL*k7rLQG@LFBb2nvM3EeiBGf) zujhzLrcS#aSP`zAFFF7bwPcpgP1e&Kakx~(qP>!@hb>AoJzPjCFjv{2tVrA9U5Hrn==8f&n^1r7O!Nv)inWU%w`4KZ0jG*5 z^A{`#tT_Pk$_N)aV!1XDQ%(aCL@jElJk<>0ZjOvaUyIxTuq8k00yR-H*AIl%1$plB z3!nv-CX0))W>`Hygaq?c#fBss#7bO#q00kR29d`B0i+rc5_=%1KnHy|l~^na19#BX za5!J-2DrH+0D!<%fnnVldN*HBK@Hk^ZqE!|3Uq;=t3=X(VXh3ltEmL!@B-Ti7QnFP z4j`G$F9pi4JsOdR?^Ab6roq)Tf+RK&K&mH}8r1OSVfg<743#jAnL z2@nrJ0HUr4BP!l;>dfi`AV*#cupq@iNcE`&|EC+6|nTeoY2@66bL7luCBnN1+!Qsbf6Q}%lX$bEKwtppb|+12A!H= zFkkbx26Q02#{Z?iz%RiRoYd!#c&XL|nMypQ2^IpZC1D|0%E0n~PUc3F-slFGI6Sog zkaRO#h_0YMszg!%Ck>%404$IRh`>}O^wD4q&gQJd2nEF!Oit%Kh*(Z=1|C#->B-`) z8Je?V-7e~G=T!Oz(txM#YSM=Kw=3-NEKBVa{u?j7R|Y!>*W^e$XL zK_oR)rnxhb_zuaqLlyuZ;dSA3Rn4KUX;gu%`ZOP!gIUtgt5nuqG-WuTo;85W8Q1Ivr5 zZKR-0yZL%0I$Yd9QC``Cr`Z#42&NM2atefjI@ShVV1|nuS5Pxoq>3C^B7kWdG^IoV z3RFXH3|5Xkkp-c21iT-pNl zK|oiaxzIqsB??f84?8_0MG_v zrom8{KqB3NewSK=zZz@ORqY@zzFx0w^V+LXlQ+gojw2;U+2m(j?I`nm_iZniyI!wV z)3WRJS~ah_UawW3FS%x7$1h?g4}O{@%SJU4b6y$Kxs5Zl7hb6yWhO^6LTb+>Vm}j} zIrY3jyX zxf3;ZmcvWDl;%!&b%C|^(wcNr1QpK}L2w%?PqtRn7j1{r*wZ0pb3OhgWdL|r3GE;wAAJQB)aY=?7vRjJgPk(rY%F-yPDeT@z%G-bdMvl&&6W* zqmp~!+b8at!8eIDy-iT-b9!a`-kLq08&`ea^%nSdW937X3@*c^`}_QfKPS?B?EF*a zhGXL{_duh&ZZDbj1cSGEb9`$`?2fz-qRp>&=y?S38{a7+fNsxJ8%UdXs;+nzXxr4K409k zGi@aG#*bhMqkpoGt~Z|G%wGJne=!lKO)R0r>