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 }