github.com/verrazzano/verrazzano@v1.7.0/tools/psr/psrctl/pkg/manifest/manager.go (about)

     1  // Copyright (c) 2022, 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 manifest
     5  
     6  import (
     7  	"github.com/verrazzano/verrazzano/pkg/helm"
     8  	"github.com/verrazzano/verrazzano/pkg/log/vzlog"
     9  
    10  	"github.com/verrazzano/verrazzano/pkg/files"
    11  	"os"
    12  	"path/filepath"
    13  	"regexp"
    14  	"sigs.k8s.io/yaml"
    15  	"strings"
    16  )
    17  
    18  // The required use case overrides directory
    19  const usecaseOverrideDir = "usecase-overrides"
    20  
    21  // ManifestManager contains the information needed to manage a Scenario
    22  type ManifestManager struct {
    23  	Log                 vzlog.VerrazzanoLogger
    24  	Manifest            PsrManifests
    25  	ExternalScenarioDir string
    26  }
    27  
    28  // NewManager returns a manifest ManifestManager
    29  func NewManager(externalScenarioDir string, helmOverrides ...helm.HelmOverrides) (ManifestManager, error) {
    30  	m := ManifestManager{
    31  		Log:                 vzlog.DefaultLogger(),
    32  		Manifest:            *Manifests,
    33  		ExternalScenarioDir: externalScenarioDir,
    34  	}
    35  	return m, nil
    36  }
    37  
    38  // ListScenarioManifests returns the list of ScenarioManifests. Scenario manifests
    39  // are located in psr/manifests/scenarios.  By convention, a scenario directory must have
    40  // a scenario.yaml file which describes the scenario. It must also have
    41  // a subdirectory named usecase-overrides containing the override parameters for
    42  // each use case. The name of the parent directory, for example s1, is irrelevant.
    43  func (m ManifestManager) ListScenarioManifests() ([]ScenarioManifest, error) {
    44  	scenarios := []ScenarioManifest{}
    45  
    46  	// Default to the scenarios built into the image. However, the user can
    47  	// override this dir for some operations, like start
    48  	scenariosDir := m.Manifest.ScenarioAbsDir
    49  	if len(m.ExternalScenarioDir) > 0 {
    50  		scenariosDir = m.ExternalScenarioDir
    51  	}
    52  
    53  	// Find all the directories that contain scenario.yaml file
    54  	sfiles, err := files.GetMatchingFiles(scenariosDir, regexp.MustCompile("scenario.yaml"))
    55  	if err != nil {
    56  		return nil, err
    57  	}
    58  	for _, f := range sfiles {
    59  		data, err := os.ReadFile(f)
    60  		if err != nil {
    61  			return nil, err
    62  		}
    63  		var sman ScenarioManifest
    64  		if err := yaml.Unmarshal(data, &sman); err != nil {
    65  			return nil, m.Log.ErrorfNewErr("Failed to unmarshal ScenarioManifest from file %s: %v", f, err)
    66  		}
    67  
    68  		// Build the parent directory name that has the scenario.yaml.
    69  		sman.ScenarioUsecaseOverridesAbsDir = filepath.Join(filepath.Dir(f), usecaseOverrideDir)
    70  		scenarios = append(scenarios, sman)
    71  	}
    72  	return scenarios, nil
    73  }
    74  
    75  // FindScenarioManifestByID finds a ScenarioManifest by ID
    76  func (m ManifestManager) FindScenarioManifestByID(ID string) (*ScenarioManifest, error) {
    77  	return m.findScenarioManifest(func(scenario ScenarioManifest) bool {
    78  		return strings.EqualFold(scenario.ID, ID)
    79  	})
    80  }
    81  
    82  // FindScenarioManifestByName finds a ScenarioManifest by mame
    83  func (m ManifestManager) FindScenarioManifestByName(name string) (*ScenarioManifest, error) {
    84  	return m.findScenarioManifest(func(scenario ScenarioManifest) bool {
    85  		return strings.EqualFold(scenario.Name, name)
    86  	})
    87  }
    88  
    89  // findScenarioManifest finds a ScenarioManifest
    90  func (m ManifestManager) findScenarioManifest(f func(ScenarioManifest) bool) (*ScenarioManifest, error) {
    91  	scList, err := m.ListScenarioManifests()
    92  	if err != nil {
    93  		return nil, err
    94  	}
    95  	for i, sc := range scList {
    96  		if f(sc) {
    97  			return &scList[i], nil
    98  		}
    99  	}
   100  	return nil, nil
   101  }