github.com/verrazzano/verrazzano@v1.7.0/tools/psr/psrctl/pkg/scenario/configmap.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 scenario 5 6 import ( 7 "context" 8 "encoding/base64" 9 "fmt" 10 corev1 "k8s.io/api/core/v1" 11 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 12 "k8s.io/apimachinery/pkg/labels" 13 "k8s.io/apimachinery/pkg/selection" 14 "sigs.k8s.io/yaml" 15 ) 16 17 // createConfigMap creates a ConfigMap with the scenario data 18 func (m ScenarioMananger) createConfigMap(scenario Scenario) (*corev1.ConfigMap, error) { 19 y, err := yaml.Marshal(scenario) 20 if err != nil { 21 return nil, m.Log.ErrorfNewErr("Failed to marshal scenario to YAML: %v", err) 22 } 23 // convert to base64 24 encoded := base64.StdEncoding.EncodeToString(y) 25 26 cmIn := corev1.ConfigMap{ 27 ObjectMeta: metav1.ObjectMeta{ 28 Name: buildConfigmapName(scenario.ID), 29 Namespace: m.Namespace, 30 Labels: map[string]string{ 31 LabelScenario: "true", 32 LabelScenarioID: scenario.ScenarioManifest.ID}, 33 }, 34 Data: map[string]string{"scenario": encoded}, 35 } 36 37 cmNew, err := m.Client.ConfigMaps(m.Namespace).Create(context.TODO(), &cmIn, metav1.CreateOptions{}) 38 if err != nil { 39 return nil, m.Log.ErrorfNewErr("Failed to create scenario ConfigMap %s/%s: %v", cmIn.Namespace, cmIn.Name, err) 40 } 41 return cmNew, nil 42 } 43 44 // deleteConfigMap deletes a ConfigMap 45 func (m ScenarioMananger) deleteConfigMap(cm *corev1.ConfigMap) error { 46 err := m.Client.ConfigMaps(cm.Namespace).Delete(context.TODO(), cm.Name, metav1.DeleteOptions{}) 47 if err != nil { 48 return m.Log.ErrorfNewErr("Failed to delete scenario ConfigMap %s/%s: %v", cm.Namespace, cm.Name, err) 49 } 50 return nil 51 } 52 53 // getAllConfigMaps gets all the configmaps that have scenario information 54 func (m ScenarioMananger) getAllConfigMaps() ([]corev1.ConfigMap, error) { 55 req, _ := labels.NewRequirement(LabelScenario, selection.Exists, nil) 56 return m.getConfigMapsByLabels(*req) 57 } 58 59 // getConfigMapByID gets the configmap that matches a specific Scenario ID 60 func (m ScenarioMananger) getConfigMapByID(ID string) (*corev1.ConfigMap, error) { 61 // Find the scenario configmaps in the cluster 62 req1, _ := labels.NewRequirement(LabelScenario, selection.Exists, nil) 63 req2, _ := labels.NewRequirement(LabelScenarioID, selection.Equals, []string{ID}) 64 cms, err := m.getConfigMapsByLabels(*req1, *req2) 65 if err != nil { 66 return nil, err 67 } 68 if len(cms) == 0 { 69 return nil, fmt.Errorf("Failed to find ConfigMap for scenario with ID %s", ID) 70 } 71 return &cms[0], nil 72 } 73 74 // getConfigMapsByLabels gets the configmaps by label 75 func (m ScenarioMananger) getConfigMapsByLabels(requirements ...labels.Requirement) ([]corev1.ConfigMap, error) { 76 // Find the scenario configmaps in the cluster 77 selector := labels.NewSelector() 78 for _, req := range requirements { 79 selector = selector.Add(req) 80 } 81 cms, err := m.Client.ConfigMaps(m.Namespace).List(context.TODO(), metav1.ListOptions{LabelSelector: selector.String()}) 82 if err != nil { 83 return nil, m.Log.ErrorfNewErr("Failed to find scenario ConfigMaps: %v", err) 84 } 85 return cms.Items, nil 86 } 87 88 // getScenarioFromConfigmap gets the Scenario from the ConfigMap 89 func (m ScenarioMananger) getScenarioFromConfigmap(cm *corev1.ConfigMap) (*Scenario, error) { 90 // Load the scenario from the base64 91 decoded, err := base64.StdEncoding.DecodeString(cm.Data[DataScenarioKey]) 92 if err != nil { 93 return nil, m.Log.ErrorfNewErr("Failed to decode configmap %s/%s data at key %s: %v", cm.Namespace, cm.Name, DataScenarioKey, err) 94 } 95 var sc Scenario 96 if err := yaml.Unmarshal(decoded, &sc); err != nil { 97 return nil, m.Log.ErrorfNewErr("Failed to unmarshal Scenario in configmap %s/%s: %v", cm.Namespace, cm.Name, err) 98 } 99 return &sc, nil 100 } 101 102 func buildConfigmapName(ID string) string { 103 return fmt.Sprintf("%s%s%s", PsrPrefix, "-", ID) 104 }