Skip to content

Commit 9e7a576

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 187c2bb commit 9e7a576

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

mockkubeapiserver/postresource.go

+35
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"
@@ -69,8 +70,42 @@ func (req *postResource) Run(ctx context.Context, s *MockKubeAPIServer) error {
6970
return fmt.Errorf("name must be provided in payload")
7071
}
7172

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

0 commit comments

Comments
 (0)