package testutils import ( "encoding/json" "fmt" "strings" "time" secretmanagerpb "cloud.google.com/go/secretmanager/apiv1/secretmanagerpb" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/timestamppb" "edge-infra.dev/pkg/edge/api/types" "edge-infra.dev/pkg/edge/constants" ) const ( secretManagerKeyFormat = "secret-manager-%s-%s" ) var ( SecretManagerMap = make(map[string][]byte) ts = []*types.SecretInfo{{ Name: constants.DockerPullCfg, ProjectID: "foreman", Secret: &secretmanagerpb.Secret{ Name: constants.DockerPullCfg, Labels: map[string]string{"test": "test"}, CreateTime: ×tamppb.Timestamp{ Seconds: time.Now().Unix(), }, }, SecretValue: []byte("ZG9ja2VyIGNvbmZpZyB2YWxz"), SecretVersion: &secretmanagerpb.SecretVersion{ CreateTime: ×tamppb.Timestamp{ Seconds: time.Now().Unix(), }, }, }, } ) func AddToSecretManager(secretValue []byte, name, organization string, labels map[string]string) error { key := fmt.Sprintf(secretManagerKeyFormat, organization, name) smr, err := json.Marshal(toSecretInfo(secretValue, name, organization, labels)) if err != nil { return err } SecretManagerMap[key] = smr return nil } func GetFromSecretManager(organization string, name string) ([]*secretmanagerpb.Secret, error) { if name == constants.DockerPullCfg { return []*secretmanagerpb.Secret{ts[0].Secret}, nil } secrets, err := GetSecretInfoFromSecretManager(organization, name) if err != nil { return nil, err } var result []*secretmanagerpb.Secret for _, secret := range secrets { result = append(result, secret.Secret) } return result, nil } func GetSecretInfoFromSecretManager(organization string, name string) ([]*types.SecretInfo, error) { var secrets []*types.SecretInfo if name != "" { //nolint: nestif if name == constants.DockerPullCfg { return ts, nil } key := fmt.Sprintf(secretManagerKeyFormat, organization, name) value := SecretManagerMap[key] if value != nil { secret := &types.SecretInfo{} err := json.Unmarshal(value, secret) if err != nil { return nil, err } secrets = append(secrets, secret) } } else { _key := fmt.Sprintf(secretManagerKeyFormat, organization, "") for key, value := range SecretManagerMap { if strings.HasPrefix(key, _key) { secret := &types.SecretInfo{} err := json.Unmarshal(value, secret) if err != nil { return nil, err } secrets = append(secrets, secret) } } } if len(secrets) == 0 { return nil, status.Error(codes.NotFound, "not found") } return secrets, nil } func DeleteFromSecretManager(organization, name string) error { key := fmt.Sprintf(secretManagerKeyFormat, organization, name) if _, ok := SecretManagerMap[key]; ok { delete(SecretManagerMap, key) return nil } return status.Error(codes.NotFound, "not found") } func toSecretInfo(secretValue []byte, name, organization string, labels map[string]string) *types.SecretInfo { sn := fmt.Sprintf("/api/v1/namespaces/%s/secrets/%s", organization, name) return &types.SecretInfo{ Name: name, ProjectID: "test-project", Secret: &secretmanagerpb.Secret{ Name: sn, Labels: labels, CreateTime: ×tamppb.Timestamp{ Seconds: time.Now().Unix(), }, }, SecretValue: secretValue, SecretVersion: &secretmanagerpb.SecretVersion{ CreateTime: ×tamppb.Timestamp{ Seconds: time.Now().Unix(), }, }, } }