github.com/verrazzano/verrazzano@v1.7.1/tools/psr/psrctl/pkg/scenario/update.go (about)

     1  // Copyright (c) 2022, 2023, Oracle and/or its affiliates.
     2  // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
     3  
     4  package scenario
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"path/filepath"
    10  
    11  	helmcli "github.com/verrazzano/verrazzano/pkg/helm"
    12  	"github.com/verrazzano/verrazzano/tools/psr/psrctl/pkg/manifest"
    13  	"github.com/verrazzano/verrazzano/tools/vz/pkg/helpers"
    14  )
    15  
    16  var UpdateUpgradeFunc = helmcli.Upgrade
    17  var UpdateGetValuesFunc = helmcli.GetValues
    18  
    19  // UpdateScenario updates a running Scenario
    20  // The scenario manifest directory can be different that the one used to start the
    21  // scenario.  However, the scenario.yaml must be identical.  In fact, the scenario.yaml
    22  // is ignored during update, the code uses the scenario YAML information stored in the ConfigMap.
    23  func (m ScenarioMananger) UpdateScenario(manifestMan manifest.ManifestManager, scman *manifest.ScenarioManifest, vzHelper helpers.VZHelper) (string, error) {
    24  	// Make sure the scenario is running
    25  	scenario, err := m.FindRunningScenarioByID(scman.ID)
    26  	if err != nil {
    27  		return "", err
    28  	}
    29  
    30  	// Helm upgrade each use case
    31  	for _, hr := range scenario.HelmReleases {
    32  		stderr, err := m.doHelmUpgrade(manifestMan, scman, hr, vzHelper)
    33  		if err != nil {
    34  			return stderr, err
    35  		}
    36  	}
    37  	return "", nil
    38  }
    39  
    40  // doHelmUpgrade runs the Helm upgrade command, applying helm overrides.
    41  func (m ScenarioMananger) doHelmUpgrade(manifestMan manifest.ManifestManager, scman *manifest.ScenarioManifest, hr HelmRelease, vzHelper helpers.VZHelper) (string, error) {
    42  	// Create the set of HelmOverrides, initialized from the manager settings
    43  	helmOverrides := m.HelmOverrides
    44  
    45  	// Get existing Helm values for the release.  These need to be passed since --reuse-values is not used.
    46  	stdout, err := UpdateGetValuesFunc(m.Log, hr.Name, hr.Namespace)
    47  	if err != nil {
    48  		return "", err
    49  	}
    50  
    51  	// Create a temp file with the existing values and add to helm overrides
    52  	tmpPath := filepath.Join(manifestMan.Manifest.RootTmpDir, fmt.Sprintf("upgrade-%s-%s", hr.Namespace, hr.Name))
    53  	// delete any existing update tmp file, shouldn't exist but just in case
    54  	os.RemoveAll(tmpPath)
    55  	err = os.WriteFile(tmpPath, stdout, 0600)
    56  	if err != nil {
    57  		return "", fmt.Errorf("Failed to create temporary file %s", tmpPath)
    58  	}
    59  	defer os.RemoveAll(tmpPath)
    60  	helmOverrides = append(helmOverrides, helmcli.HelmOverrides{FileOverride: tmpPath})
    61  
    62  	// Build scenario override absolute path for the use case, E.G manifests/scenarios/opensearch/s1/usecase-overrides/getlogs-fast.yaml
    63  	scOverride := filepath.Join(scman.ScenarioUsecaseOverridesAbsDir, hr.OverrideFile)
    64  	helmOverrides = append(helmOverrides, helmcli.HelmOverrides{FileOverride: scOverride})
    65  
    66  	if m.Verbose {
    67  		fmt.Fprintf(vzHelper.GetOutputStream(), fmt.Sprintf("Updating use case %s for Helm release %s/%s\n", hr.Usecase.UsecasePath, hr.Namespace, hr.Name))
    68  	}
    69  	_, err = UpdateUpgradeFunc(m.Log, hr.Name, m.Namespace, manifestMan.Manifest.WorkerChartAbsDir, true, m.DryRun, helmOverrides)
    70  	if err != nil {
    71  		return err.Error(), err
    72  	}
    73  	return "", nil
    74  }