Skip to content

Commit 41b0c21

Browse files
committed
mockkubeapiserver: Support stringData when creating a secret
This is an edge case in the kube apiserver, but there is special handling for the stringData field of a secret, that is mapped to base64 data.
1 parent 634c42a commit 41b0c21

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

mockkubeapiserver/postresource.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package mockkubeapiserver
1818

1919
import (
2020
"context"
21+
"encoding/base64"
2122
"fmt"
2223
"io"
2324
"net/http"
@@ -73,8 +74,42 @@ func (req *postResource) Run(ctx context.Context, s *MockKubeAPIServer) error {
7374
obj.SetGeneration(1)
7475
}
7576

77+
if err := preCreateHook(ctx, obj); err != nil {
78+
return err
79+
}
80+
7681
if err := resource.CreateObject(ctx, id, obj); err != nil {
7782
return err
7883
}
7984
return req.writeResponse(obj)
8085
}
86+
87+
func preCreateHook(ctx context.Context, obj *unstructured.Unstructured) error {
88+
gvk := obj.GroupVersionKind()
89+
if gvk.Group == "" && gvk.Version == "v1" && gvk.Kind == "Secret" {
90+
stringDataAny, found := obj.Object["stringData"]
91+
if found {
92+
stringDataMap, ok := stringDataAny.(map[string]any)
93+
if !ok {
94+
return fmt.Errorf("unexpected type for v1.Secret stringData, got %T", stringDataAny)
95+
}
96+
dataAny, dataFound := obj.Object["data"]
97+
if !dataFound {
98+
dataAny = make(map[string]any)
99+
obj.Object["data"] = dataAny
100+
}
101+
dataMap, ok := dataAny.(map[string]any)
102+
if !ok {
103+
return fmt.Errorf("unexpected type for v1.Secret data, got %T", dataAny)
104+
}
105+
for k, vAny := range stringDataMap {
106+
v, ok := vAny.(string)
107+
if !ok {
108+
return fmt.Errorf("unexpected type for v1.Secret stringData entry, got %T", vAny)
109+
}
110+
dataMap[k] = base64.StdEncoding.EncodeToString([]byte(v))
111+
}
112+
}
113+
}
114+
return nil
115+
}

0 commit comments

Comments
 (0)