package workloadsiemcfg import ( "encoding/json" "fmt" "strings" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // Final Struct to hold the ConfigMap Data type WorkloadSiemConfigData struct { Configs string } type DefaultMessage struct { Default string `json:"Default"` NeedToPanic string `json:"Need to Panic?"` } // BuildWorkloadSiemConfigMap creates an workload siem configmap func BuildWorkloadSiemConfigMap(classifications []SIEMClassification) (*v1.ConfigMap, error) { defaultMessage := DefaultMessage{ Default: "true", NeedToPanic: "This is the default state. if you are expecting values here and a release is active, check the Helm Chart that the SIEM annotation is correctly done.", } marshaledClassifications := "" if len(classifications) != 0 { marshaledBytes, err := json.MarshalIndent(classifications, "", " ") if err != nil { return nil, fmt.Errorf("Error marshaling SIEM classifications in the configmap package: %w", err) } marshaledClassifications = string(marshaledBytes) } else { marshaledBytes, err := json.MarshalIndent(defaultMessage, "", " ") if err != nil { return nil, fmt.Errorf("Error marshaling default message in the configmap package: %w", err) } marshaledClassifications = string(marshaledBytes) } i := &WorkloadSiemConfigData{ Configs: marshaledClassifications, } return i.ToConfigMap(), nil } // ToConfigMap create a workload siem ConfigMap func (i WorkloadSiemConfigData) ToConfigMap() *v1.ConfigMap { return &v1.ConfigMap{ TypeMeta: metav1.TypeMeta{ Kind: "ConfigMap", APIVersion: v1.SchemeGroupVersion.String(), }, ObjectMeta: metav1.ObjectMeta{ Name: WorkloadSiemConfigMapName, Namespace: WorkloadSiemConfigMapNS, }, Data: map[string]string{ WorkloadSiemConfigDataFieldName: i.Configs, }, } } // ValidateConfigMap validates workload siem ConfigMap func ValidateConfigMap(cfg *v1.ConfigMap) error { var missing []string if cfg.Data[WorkloadSiemConfigDataFieldName] == "" { missing = append(missing, WorkloadSiemConfigDataFieldName) } if len(missing) > 0 { return fmt.Errorf("workload-siem configmap invalid, value(s) not provided: %s", strings.Join(missing, ",")) } return nil } // New creates a valid workload siem ref func New(cfg *v1.ConfigMap) (*WorkloadSiemConfigData, error) { if err := ValidateConfigMap(cfg); err != nil { return nil, err } return FromConfigMap(cfg), nil } // FromConfigMap util function to create workload siem from config map func FromConfigMap(cfg *v1.ConfigMap) *WorkloadSiemConfigData { return (&WorkloadSiemConfigData{}).FromConfigMap(cfg) } // FromConfigMap retrieves data from ConfigMap to workload siem func (i *WorkloadSiemConfigData) FromConfigMap(cfg *v1.ConfigMap) *WorkloadSiemConfigData { i.Configs = cfg.Data[WorkloadSiemConfigDataFieldName] return i } // IsSiemConfigMap util function to check if object is workload siem config map func IsSiemConfigMap(name, namespace string) bool { hasRequiredName := name == WorkloadSiemConfigMapName inRequiredNamespace := namespace == WorkloadSiemConfigMapNS return hasRequiredName && inRequiredNamespace } // ConfigMapToString converts the provided configmap to a string. func ConfigMapToString(configMap *v1.ConfigMap) ([]byte, error) { return json.Marshal(configMap) }