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  }