diff --git a/pkg/base/replicated.go b/pkg/base/replicated.go index 22a9b6417b..c74dd26544 100644 --- a/pkg/base/replicated.go +++ b/pkg/base/replicated.go @@ -14,17 +14,30 @@ import ( "github.com/pkg/errors" kotsv1beta1 "github.com/replicatedhq/kots/kotskinds/apis/kots/v1beta1" + kotsscheme "github.com/replicatedhq/kots/kotskinds/client/kotsclientset/scheme" kotsconfig "github.com/replicatedhq/kots/pkg/config" + "github.com/replicatedhq/kots/pkg/kotsutil" "github.com/replicatedhq/kots/pkg/logger" "github.com/replicatedhq/kots/pkg/template" upstreamtypes "github.com/replicatedhq/kots/pkg/upstream/types" "github.com/replicatedhq/kots/pkg/util" + troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + troubleshootscheme "github.com/replicatedhq/troubleshoot/pkg/client/troubleshootclientset/scheme" + velerov1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" stdyaml "gopkg.in/yaml.v2" "helm.sh/helm/v3/pkg/chart" "k8s.io/client-go/kubernetes/scheme" + applicationv1beta1 "sigs.k8s.io/application/api/v1beta1" "sigs.k8s.io/yaml" ) +func init() { + kotsscheme.AddToScheme(scheme.Scheme) + troubleshootscheme.AddToScheme(scheme.Scheme) + velerov1.AddToScheme(scheme.Scheme) + applicationv1beta1.AddToScheme(scheme.Scheme) +} + type Document struct { APIVersion string `yaml:"apiVersion"` Kind string `yaml:"kind"` @@ -41,12 +54,12 @@ func renderReplicated(u *upstreamtypes.Upstream, renderOptions *RenderOptions) ( return nil, nil, errors.Wrap(err, "failed to create new config context template builder") } - config, _, idConfig, license, err := findConfigAndLicense(u, renderOptions.Log) + kotsKinds, err := getKotsKinds(u, renderOptions.Log) if err != nil { return nil, nil, errors.Wrap(err, "failed to find config file") } - renderedConfig, err := kotsconfig.TemplateConfigObjects(config, itemValues, license, template.LocalRegistry{}, nil, idConfig, util.PodNamespace) + renderedConfig, err := kotsconfig.TemplateConfigObjects(kotsKinds.Config, itemValues, kotsKinds.License, &kotsKinds.KotsApplication, template.LocalRegistry{}, nil, kotsKinds.IdentityConfig, util.PodNamespace) if err != nil { return nil, nil, errors.Wrap(err, "failed to template config objects") } @@ -348,11 +361,8 @@ func tryGetConfigFromFileContent(content []byte, log *logger.CLILogger) *kotsv1b return nil } -func findConfigAndLicense(u *upstreamtypes.Upstream, log *logger.CLILogger) (*kotsv1beta1.Config, *kotsv1beta1.ConfigValues, *kotsv1beta1.IdentityConfig, *kotsv1beta1.License, error) { - var config *kotsv1beta1.Config - var values *kotsv1beta1.ConfigValues - var identityConfig *kotsv1beta1.IdentityConfig - var license *kotsv1beta1.License +func getKotsKinds(u *upstreamtypes.Upstream, log *logger.CLILogger) (*kotsutil.KotsKinds, error) { + kotsKinds := &kotsutil.KotsKinds{} for _, file := range u.Files { document := &Document{} @@ -361,27 +371,48 @@ func findConfigAndLicense(u *upstreamtypes.Upstream, log *logger.CLILogger) (*ko } decode := scheme.Codecs.UniversalDeserializer().Decode - obj, gvk, err := decode(file.Content, nil, nil) + decoded, gvk, err := decode(file.Content, nil, nil) if err != nil { if document.APIVersion == "kots.io/v1beta1" && (document.Kind == "Config" || document.Kind == "License") { errMessage := fmt.Sprintf("Failed to decode %s", file.Path) - return nil, nil, nil, nil, errors.Wrap(err, errMessage) + return nil, errors.Wrap(err, errMessage) } continue } - if gvk.Group == "kots.io" && gvk.Version == "v1beta1" && gvk.Kind == "Config" { - config = obj.(*kotsv1beta1.Config) - } else if gvk.Group == "kots.io" && gvk.Version == "v1beta1" && gvk.Kind == "ConfigValues" { - values = obj.(*kotsv1beta1.ConfigValues) - } else if gvk.Group == "kots.io" && gvk.Version == "v1beta1" && gvk.Kind == "IdentityConfig" { - identityConfig = obj.(*kotsv1beta1.IdentityConfig) - } else if gvk.Group == "kots.io" && gvk.Version == "v1beta1" && gvk.Kind == "License" { - license = obj.(*kotsv1beta1.License) - } - } - - return config, values, identityConfig, license, nil + switch gvk.String() { + case "kots.io/v1beta1, Kind=Config": + kotsKinds.Config = decoded.(*kotsv1beta1.Config) + case "kots.io/v1beta1, Kind=ConfigValues": + kotsKinds.ConfigValues = decoded.(*kotsv1beta1.ConfigValues) + case "kots.io/v1beta1, Kind=Application": + kotsKinds.KotsApplication = *decoded.(*kotsv1beta1.Application) + case "kots.io/v1beta1, Kind=License": + kotsKinds.License = decoded.(*kotsv1beta1.License) + case "kots.io/v1beta1, Kind=Identity": + kotsKinds.Identity = decoded.(*kotsv1beta1.Identity) + case "kots.io/v1beta1, Kind=IdentityConfig": + kotsKinds.IdentityConfig = decoded.(*kotsv1beta1.IdentityConfig) + case "kots.io/v1beta1, Kind=Installation": + kotsKinds.Installation = *decoded.(*kotsv1beta1.Installation) + case "troubleshoot.sh/v1beta2, Kind=Collector": + kotsKinds.Collector = decoded.(*troubleshootv1beta2.Collector) + case "troubleshoot.sh/v1beta2, Kind=Analyzer": + kotsKinds.Analyzer = decoded.(*troubleshootv1beta2.Analyzer) + case "troubleshoot.sh/v1beta2, Kind=SupportBundle": + kotsKinds.SupportBundle = decoded.(*troubleshootv1beta2.SupportBundle) + case "troubleshoot.sh/v1beta2, Kind=Redactor": + kotsKinds.Redactor = decoded.(*troubleshootv1beta2.Redactor) + case "troubleshoot.sh/v1beta2, Kind=Preflight": + kotsKinds.Preflight = decoded.(*troubleshootv1beta2.Preflight) + case "velero.io/v1, Kind=Backup": + kotsKinds.Backup = decoded.(*velerov1.Backup) + case "app.k8s.io/v1beta1, Kind=Application": + kotsKinds.Application = decoded.(*applicationv1beta1.Application) + } + } + + return kotsKinds, nil } // findHelmChartArchiveInRelease iterates through all files in the release (upstreamFiles), looking for a helm chart archive diff --git a/pkg/base/templates.go b/pkg/base/templates.go index c0e475c28a..aa6c87d088 100644 --- a/pkg/base/templates.go +++ b/pkg/base/templates.go @@ -9,15 +9,15 @@ import ( ) func NewConfigContextTemplateBuilder(u *upstreamtypes.Upstream, renderOptions *RenderOptions) (*template.Builder, map[string]template.ItemValue, error) { - config, configValues, identityConfig, license, err := findConfigAndLicense(u, renderOptions.Log) + kotsKinds, err := getKotsKinds(u, renderOptions.Log) if err != nil { return nil, nil, err } var templateContext map[string]template.ItemValue - if configValues != nil { + if kotsKinds.ConfigValues != nil { ctx := map[string]template.ItemValue{} - for k, v := range configValues.Spec.Values { + for k, v := range kotsKinds.ConfigValues.Spec.Values { ctx[k] = template.ItemValue{ Value: v.Value, Default: v.Default, @@ -40,8 +40,8 @@ func NewConfigContextTemplateBuilder(u *upstreamtypes.Upstream, renderOptions *R } configGroups := []kotsv1beta1.ConfigGroup{} - if config != nil { - configGroups = config.Spec.Groups + if kotsKinds.Config != nil { + configGroups = kotsKinds.Config.Spec.Groups } localRegistry := template.LocalRegistry{ @@ -70,10 +70,11 @@ func NewConfigContextTemplateBuilder(u *upstreamtypes.Upstream, renderOptions *R ExistingValues: templateContext, LocalRegistry: localRegistry, Cipher: cipher, - License: license, + License: kotsKinds.License, + Application: &kotsKinds.KotsApplication, VersionInfo: &versionInfo, ApplicationInfo: &appInfo, - IdentityConfig: identityConfig, + IdentityConfig: kotsKinds.IdentityConfig, Namespace: renderOptions.Namespace, } builder, itemValues, err := template.NewBuilder(builderOptions) diff --git a/pkg/config/config.go b/pkg/config/config.go index cb9b72c642..905b444d94 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -17,12 +17,12 @@ import ( "k8s.io/client-go/kubernetes/scheme" ) -func TemplateConfig(log *logger.CLILogger, configSpecData string, configValuesData string, licenseData string, identityConfigData string, localRegistry template.LocalRegistry, namespace string) (string, error) { - return templateConfig(log, configSpecData, configValuesData, licenseData, identityConfigData, localRegistry, namespace, MarshalConfig) +func TemplateConfig(log *logger.CLILogger, configSpecData string, configValuesData string, licenseData string, appData string, identityConfigData string, localRegistry template.LocalRegistry, namespace string) (string, error) { + return templateConfig(log, configSpecData, configValuesData, licenseData, appData, identityConfigData, localRegistry, namespace, MarshalConfig) } -func TemplateConfigObjects(configSpec *kotsv1beta1.Config, configValues map[string]template.ItemValue, license *kotsv1beta1.License, localRegistry template.LocalRegistry, versionInfo *template.VersionInfo, identityconfig *kotsv1beta1.IdentityConfig, namespace string) (*kotsv1beta1.Config, error) { - templatedString, err := templateConfigObjects(configSpec, configValues, license, localRegistry, versionInfo, identityconfig, namespace, MarshalConfig) +func TemplateConfigObjects(configSpec *kotsv1beta1.Config, configValues map[string]template.ItemValue, license *kotsv1beta1.License, app *kotsv1beta1.Application, localRegistry template.LocalRegistry, versionInfo *template.VersionInfo, identityconfig *kotsv1beta1.IdentityConfig, namespace string) (*kotsv1beta1.Config, error) { + templatedString, err := templateConfigObjects(configSpec, configValues, license, app, localRegistry, versionInfo, identityconfig, namespace, MarshalConfig) if err != nil { return nil, errors.Wrap(err, "failed to template config") } @@ -43,7 +43,7 @@ func TemplateConfigObjects(configSpec *kotsv1beta1.Config, configValues map[stri return config, nil } -func templateConfigObjects(configSpec *kotsv1beta1.Config, configValues map[string]template.ItemValue, license *kotsv1beta1.License, localRegistry template.LocalRegistry, versionInfo *template.VersionInfo, identityconfig *kotsv1beta1.IdentityConfig, namespace string, marshalFunc func(config *kotsv1beta1.Config) (string, error)) (string, error) { +func templateConfigObjects(configSpec *kotsv1beta1.Config, configValues map[string]template.ItemValue, license *kotsv1beta1.License, app *kotsv1beta1.Application, localRegistry template.LocalRegistry, versionInfo *template.VersionInfo, identityconfig *kotsv1beta1.IdentityConfig, namespace string, marshalFunc func(config *kotsv1beta1.Config) (string, error)) (string, error) { if configSpec == nil { return "", nil } @@ -54,6 +54,7 @@ func templateConfigObjects(configSpec *kotsv1beta1.Config, configValues map[stri LocalRegistry: localRegistry, Cipher: nil, License: license, + Application: app, VersionInfo: versionInfo, IdentityConfig: identityconfig, Namespace: namespace, @@ -78,7 +79,7 @@ func templateConfigObjects(configSpec *kotsv1beta1.Config, configValues map[stri return rendered, nil } -func templateConfig(log *logger.CLILogger, configSpecData string, configValuesData string, licenseData string, identityConfigData string, localRegistry template.LocalRegistry, namespace string, marshalFunc func(config *kotsv1beta1.Config) (string, error)) (string, error) { +func templateConfig(log *logger.CLILogger, configSpecData string, configValuesData string, licenseData string, appData string, identityConfigData string, localRegistry template.LocalRegistry, namespace string, marshalFunc func(config *kotsv1beta1.Config) (string, error)) (string, error) { // This function will // 1. unmarshal config // 2. replace all item values with values that already exist @@ -96,6 +97,18 @@ func templateConfig(log *logger.CLILogger, configSpecData string, configValuesDa } license := obj.(*kotsv1beta1.License) + var app *kotsv1beta1.Application + if appData != "" { + obj, gvk, err = decode([]byte(appData), nil, nil) + if err != nil { + return "", errors.Wrap(err, "failed to decode applicationappData := ` data") + } + if gvk.Group != "kots.io" || gvk.Version != "v1beta1" || gvk.Kind != "Application" { + return "", errors.Errorf("expected Application, but found %s/%s/%s", gvk.Group, gvk.Version, gvk.Kind) + } + app = obj.(*kotsv1beta1.Application) + } + obj, gvk, err = decode([]byte(configSpecData), nil, nil) // TODO fix decode of boolstrings if err != nil { return "", errors.Wrap(err, "failed to decode config data") @@ -124,7 +137,7 @@ func templateConfig(log *logger.CLILogger, configSpecData string, configValuesDa identityConfig = obj.(*kotsv1beta1.IdentityConfig) } - return templateConfigObjects(config, templateContext, license, localRegistry, &template.VersionInfo{}, identityConfig, namespace, marshalFunc) + return templateConfigObjects(config, templateContext, license, app, localRegistry, &template.VersionInfo{}, identityConfig, namespace, marshalFunc) } func ApplyValuesToConfig(config *kotsv1beta1.Config, values map[string]template.ItemValue) *kotsv1beta1.Config { diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 78dc782bdf..31e88bdba0 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -61,10 +61,19 @@ spec: value: "123asd" signature: IA==` + appSpec := ` +apiVersion: kots.io/v1beta1 +kind: Application +metadata: + name: local +spec: + title: My Application` + tests := []struct { name string configSpecData string configValuesData string + useAppSpec bool want string expectOldFail bool }{ @@ -96,6 +105,7 @@ spec: value: "xyz789" status: {} `, + useAppSpec: true, want: `apiVersion: kots.io/v1beta1 kind: Config metadata: @@ -147,6 +157,7 @@ spec: values: {} status: {} `, + useAppSpec: false, want: `apiVersion: kots.io/v1beta1 kind: Config metadata: @@ -213,6 +224,7 @@ spec: value: "xyz789" status: {} `, + useAppSpec: false, want: `apiVersion: kots.io/v1beta1 kind: Config metadata: @@ -286,6 +298,7 @@ spec: repeatableItem: secretName status: {} `, + useAppSpec: true, want: `apiVersion: kots.io/v1beta1 kind: Config metadata: @@ -331,8 +344,13 @@ spec: wantObj, _, err := decode([]byte(tt.want), nil, nil) req.NoError(err) + appData := "" + if tt.useAppSpec { + appData = appSpec + } + localRegistry := template.LocalRegistry{} - got, err := templateConfig(log, tt.configSpecData, tt.configValuesData, licenseData, "", localRegistry, "", MarshalConfig) + got, err := templateConfig(log, tt.configSpecData, tt.configValuesData, licenseData, appData, "", localRegistry, "", MarshalConfig) req.NoError(err) gotObj, _, err := decode([]byte(got), nil, nil) @@ -341,7 +359,7 @@ spec: req.Equal(wantObj, gotObj) // compare with oldMarshalConfig results - got, err = templateConfig(log, tt.configSpecData, tt.configValuesData, licenseData, "", localRegistry, "", oldMarshalConfig) + got, err = templateConfig(log, tt.configSpecData, tt.configValuesData, licenseData, appData, "", localRegistry, "", oldMarshalConfig) if !tt.expectOldFail { req.NoError(err) diff --git a/pkg/handlers/config.go b/pkg/handlers/config.go index 26773456fb..ec4f6fd925 100644 --- a/pkg/handlers/config.go +++ b/pkg/handlers/config.go @@ -241,7 +241,7 @@ func (h *Handler) LiveAppConfig(w http.ResponseWriter, r *http.Request) { } versionInfo := template.VersionInfoFromInstallation(liveAppConfigRequest.Sequence+1, foundApp.IsAirgap, kotsKinds.Installation.Spec) // sequence +1 because the sequence will be incremented on save (and we want the preview to be accurate) - renderedConfig, err := kotsconfig.TemplateConfigObjects(kotsKinds.Config, configValues, appLicense, localRegistry, &versionInfo, kotsKinds.IdentityConfig, util.PodNamespace) + renderedConfig, err := kotsconfig.TemplateConfigObjects(kotsKinds.Config, configValues, appLicense, &kotsKinds.KotsApplication, localRegistry, &versionInfo, kotsKinds.IdentityConfig, util.PodNamespace) if err != nil { logger.Error(err) liveAppConfigResponse.Error = "failed to render templates" @@ -341,7 +341,7 @@ func (h *Handler) CurrentAppConfig(w http.ResponseWriter, r *http.Request) { } versionInfo := template.VersionInfoFromInstallation(int64(sequence)+1, foundApp.IsAirgap, kotsKinds.Installation.Spec) // sequence +1 because the sequence will be incremented on save (and we want the preview to be accurate) - renderedConfig, err := kotsconfig.TemplateConfigObjects(kotsKinds.Config, configValues, appLicense, localRegistry, &versionInfo, kotsKinds.IdentityConfig, util.PodNamespace) + renderedConfig, err := kotsconfig.TemplateConfigObjects(kotsKinds.Config, configValues, appLicense, &kotsKinds.KotsApplication, localRegistry, &versionInfo, kotsKinds.IdentityConfig, util.PodNamespace) if err != nil { logger.Error(err) currentAppConfigResponse.Error = "failed to render templates" @@ -774,7 +774,7 @@ func (h *Handler) SetAppConfigValues(w http.ResponseWriter, r *http.Request) { } versionInfo := template.VersionInfoFromInstallation(foundApp.CurrentSequence+1, foundApp.IsAirgap, kotsKinds.Installation.Spec) // sequence +1 because the sequence will be incremented on save (and we want the preview to be accurate) - renderedConfig, err := kotsconfig.TemplateConfigObjects(newConfig, configValueMap, kotsKinds.License, localRegistry, &versionInfo, kotsKinds.IdentityConfig, util.PodNamespace) + renderedConfig, err := kotsconfig.TemplateConfigObjects(newConfig, configValueMap, kotsKinds.License, &kotsKinds.KotsApplication, localRegistry, &versionInfo, kotsKinds.IdentityConfig, util.PodNamespace) if err != nil { setAppConfigValuesResponse.Error = "failed to render templates" logger.Error(errors.Wrap(err, setAppConfigValuesResponse.Error)) diff --git a/pkg/kotsadmconfig/config.go b/pkg/kotsadmconfig/config.go index 0d4c8854a3..5eeeeb50f9 100644 --- a/pkg/kotsadmconfig/config.go +++ b/pkg/kotsadmconfig/config.go @@ -64,6 +64,11 @@ func NeedsConfiguration(kotsKinds *kotsutil.KotsKinds, registrySettings registry return false, errors.Wrap(err, "failed to marshal license spec") } + appSpec, err := kotsKinds.Marshal("kots.io", "v1beta1", "Application") + if err != nil { + return false, errors.Wrap(err, "failed to marshal license spec") + } + identityConfigSpec, err := kotsKinds.Marshal("kots.io", "v1beta1", "IdentityConfig") if err != nil { return false, errors.Wrap(err, "failed to marshal identityconfig spec") @@ -77,7 +82,7 @@ func NeedsConfiguration(kotsKinds *kotsutil.KotsKinds, registrySettings registry ReadOnly: registrySettings.IsReadOnly, } - rendered, err := kotsconfig.TemplateConfig(logger.NewCLILogger(), configSpec, configValuesSpec, licenseSpec, identityConfigSpec, localRegistry, util.PodNamespace) + rendered, err := kotsconfig.TemplateConfig(logger.NewCLILogger(), configSpec, configValuesSpec, licenseSpec, appSpec, identityConfigSpec, localRegistry, util.PodNamespace) if err != nil { return false, errors.Wrap(err, "failed to template config") } diff --git a/pkg/render/render.go b/pkg/render/render.go index e19ff17e23..3f2110f4ac 100644 --- a/pkg/render/render.go +++ b/pkg/render/render.go @@ -93,6 +93,7 @@ func NewBuilder(kotsKinds *kotsutil.KotsKinds, registrySettings registrytypes.Re LocalRegistry: localRegistry, Cipher: appCipher, License: kotsKinds.License, + Application: &kotsKinds.KotsApplication, ApplicationInfo: &appInfo, VersionInfo: &versionInfo, IdentityConfig: kotsKinds.IdentityConfig, diff --git a/pkg/template/builder.go b/pkg/template/builder.go index ebbc18e8f7..43292d2ef7 100644 --- a/pkg/template/builder.go +++ b/pkg/template/builder.go @@ -28,6 +28,7 @@ type BuilderOptions struct { LocalRegistry LocalRegistry Cipher *crypto.AESCipher License *kotsv1beta1.License + Application *kotsv1beta1.Application ApplicationInfo *ApplicationInfo VersionInfo *VersionInfo IdentityConfig *kotsv1beta1.IdentityConfig @@ -51,7 +52,8 @@ func NewBuilder(opts BuilderOptions) (Builder, map[string]ItemValue, error) { } } - configCtx, err := b.newConfigContext(opts.ConfigGroups, opts.ExistingValues, opts.LocalRegistry, opts.Cipher, opts.License, opts.VersionInfo, dockerHubRegistry) + configCtx, err := b.newConfigContext(opts.ConfigGroups, opts.ExistingValues, opts.LocalRegistry, opts.Cipher, + opts.License, opts.Application, opts.VersionInfo, dockerHubRegistry) if err != nil { return Builder{}, nil, errors.Wrap(err, "create config context") } diff --git a/pkg/template/config_context.go b/pkg/template/config_context.go index 898df894b5..dc2e641d46 100644 --- a/pkg/template/config_context.go +++ b/pkg/template/config_context.go @@ -73,12 +73,13 @@ type ConfigCtx struct { } // newConfigContext creates and returns a context for template rendering -func (b *Builder) newConfigContext(configGroups []kotsv1beta1.ConfigGroup, existingValues map[string]ItemValue, localRegistry LocalRegistry, cipher *crypto.AESCipher, license *kotsv1beta1.License, info *VersionInfo, dockerHubRegistry registry.RegistryOptions) (*ConfigCtx, error) { +func (b *Builder) newConfigContext(configGroups []kotsv1beta1.ConfigGroup, existingValues map[string]ItemValue, localRegistry LocalRegistry, cipher *crypto.AESCipher, license *kotsv1beta1.License, app *kotsv1beta1.Application, info *VersionInfo, dockerHubRegistry registry.RegistryOptions) (*ConfigCtx, error) { configCtx := &ConfigCtx{ ItemValues: existingValues, LocalRegistry: localRegistry, DockerHubRegistry: dockerHubRegistry, license: license, + app: app, } builder := Builder{ diff --git a/pkg/template/config_context_test.go b/pkg/template/config_context_test.go index 63d5b075a8..d0fc8ef16f 100644 --- a/pkg/template/config_context_test.go +++ b/pkg/template/config_context_test.go @@ -370,7 +370,7 @@ func TestBuilder_NewConfigContext(t *testing.T) { builder.AddCtx(StaticCtx{}) localRegistry := LocalRegistry{} - got, err := builder.newConfigContext(tt.args.configGroups, tt.args.templateContext, localRegistry, tt.args.cipher, tt.args.license, nil, registry.RegistryOptions{}) + got, err := builder.newConfigContext(tt.args.configGroups, tt.args.templateContext, localRegistry, tt.args.cipher, tt.args.license, nil, nil, registry.RegistryOptions{}) req.NoError(err) req.Equal(tt.want, got) }) diff --git a/pkg/upstream/replicated.go b/pkg/upstream/replicated.go index 524b8f9508..f720e41d30 100644 --- a/pkg/upstream/replicated.go +++ b/pkg/upstream/replicated.go @@ -256,7 +256,7 @@ func downloadReplicated( // If config existed and was removed from the app, // values will be carried over to the new version anyway. - configValues, err := createConfigValues(application.Name, config, existingConfigValues, cipher, license, &appInfo, &versionInfo, localRegistry, existingIdentityConfig) + configValues, err := createConfigValues(application.Name, config, existingConfigValues, cipher, license, application, &appInfo, &versionInfo, localRegistry, existingIdentityConfig) if err != nil { return nil, errors.Wrap(err, "failed to create empty config values") } @@ -574,7 +574,7 @@ func mustMarshalConfigValues(configValues *kotsv1beta1.ConfigValues) []byte { return b.Bytes() } -func createConfigValues(applicationName string, config *kotsv1beta1.Config, existingConfigValues *kotsv1beta1.ConfigValues, cipher *crypto.AESCipher, license *kotsv1beta1.License, appInfo *template.ApplicationInfo, versionInfo *template.VersionInfo, localRegistry template.LocalRegistry, identityConfig *kotsv1beta1.IdentityConfig) (*kotsv1beta1.ConfigValues, error) { +func createConfigValues(applicationName string, config *kotsv1beta1.Config, existingConfigValues *kotsv1beta1.ConfigValues, cipher *crypto.AESCipher, license *kotsv1beta1.License, app *kotsv1beta1.Application, appInfo *template.ApplicationInfo, versionInfo *template.VersionInfo, localRegistry template.LocalRegistry, identityConfig *kotsv1beta1.IdentityConfig) (*kotsv1beta1.ConfigValues, error) { templateContextValues := make(map[string]template.ItemValue) var newValues kotsv1beta1.ConfigValuesSpec @@ -618,6 +618,7 @@ func createConfigValues(applicationName string, config *kotsv1beta1.Config, exis LocalRegistry: localRegistry, Cipher: cipher, License: license, + Application: app, ApplicationInfo: appInfo, VersionInfo: versionInfo, IdentityConfig: identityConfig, diff --git a/pkg/upstream/replicated_test.go b/pkg/upstream/replicated_test.go index 3982bd43aa..81fd3bdff7 100644 --- a/pkg/upstream/replicated_test.go +++ b/pkg/upstream/replicated_test.go @@ -250,13 +250,13 @@ func Test_createConfigValues(t *testing.T) { Default: "default_4", }, } - values1, err := createConfigValues(applicationName, config, nil, nil, nil, nil, nil, template.LocalRegistry{}, nil) + values1, err := createConfigValues(applicationName, config, nil, nil, nil, nil, nil, nil, template.LocalRegistry{}, nil) req.NoError(err) assert.Equal(t, expected1, values1.Spec.Values) // Like an app without a config, should have exact same values expected2 := configValues.Spec.Values - values2, err := createConfigValues(applicationName, nil, configValues, nil, nil, nil, nil, template.LocalRegistry{}, nil) + values2, err := createConfigValues(applicationName, nil, configValues, nil, nil, nil, nil, nil, template.LocalRegistry{}, nil) req.NoError(err) assert.Equal(t, expected2, values2.Spec.Values) @@ -277,7 +277,7 @@ func Test_createConfigValues(t *testing.T) { Default: "default_4", }, } - values3, err := createConfigValues(applicationName, config, configValues, nil, nil, nil, nil, template.LocalRegistry{}, nil) + values3, err := createConfigValues(applicationName, config, configValues, nil, nil, nil, nil, nil, template.LocalRegistry{}, nil) req.NoError(err) assert.Equal(t, expected3, values3.Spec.Values) }