AppManager: Let client override config files during update

Take old input and merge with the new one.

Change-Id: I2d8ad0e5f0cef97a3efa23aa9ca0c7f9163e703b
diff --git a/core/installer/app_manager.go b/core/installer/app_manager.go
index d95e640..e6133c1 100644
--- a/core/installer/app_manager.go
+++ b/core/installer/app_manager.go
@@ -136,7 +136,7 @@
 	return &cfg, err
 }
 
-func GetCueAppData(fs soft.RepoFS, dir string) (CueAppData, error) {
+func GetCueAppData(fs soft.RepoFS, dir string, overrides CueAppData) (CueAppData, error) {
 	files, err := fs.ListDir(dir)
 	if err != nil {
 		return nil, err
@@ -151,11 +151,14 @@
 			cfg[f.Name()] = contents
 		}
 	}
+	for k, v := range overrides {
+		cfg[k] = v
+	}
 	return cfg, nil
 }
 
-func (m *AppManager) GetInstanceApp(id string) (EnvApp, error) {
-	cfg, err := GetCueAppData(m.repo, filepath.Join(m.appDirRoot, id))
+func (m *AppManager) GetInstanceApp(id string, overrides CueAppData) (EnvApp, error) {
+	cfg, err := GetCueAppData(m.repo, filepath.Join(m.appDirRoot, id), overrides)
 	if err != nil {
 		return nil, err
 	}
@@ -615,6 +618,8 @@
 func (m *AppManager) Update(
 	instanceId string,
 	values map[string]any,
+	// TODO(gio): this should not be cue specific
+	overrides CueAppData,
 	opts ...InstallOption,
 ) (ReleaseResources, error) {
 	m.l.Lock()
@@ -627,7 +632,7 @@
 		return ReleaseResources{}, err
 	}
 	instanceDir := filepath.Join(m.appDirRoot, instanceId)
-	app, err := m.GetInstanceApp(instanceId)
+	app, err := m.GetInstanceApp(instanceId, overrides)
 	if err != nil {
 		return ReleaseResources{}, err
 	}
@@ -648,7 +653,7 @@
 	if err != nil {
 		return ReleaseResources{}, err
 	}
-	rendered, err := app.Render(config.Release, env, networks, ToAccessConfigs(clusters), values, renderedCfg.LocalCharts, m.vpnAPIClient)
+	rendered, err := app.Render(config.Release, env, networks, ToAccessConfigs(clusters), merge(config.Input, values), renderedCfg.LocalCharts, m.vpnAPIClient)
 	if err != nil {
 		return ReleaseResources{}, err
 	}
@@ -1035,7 +1040,7 @@
 		return ReleaseResources{}, err
 	}
 	instanceDir := filepath.Join("/infrastructure", instanceId)
-	appCfg, err := GetCueAppData(m.repoIO, instanceDir)
+	appCfg, err := GetCueAppData(m.repoIO, instanceDir, nil)
 	if err != nil {
 		return ReleaseResources{}, err
 	}