Skip to content

Commit 2699368

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 b758057 commit 2699368

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

mockkubeapiserver/postresource.go

+37
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,44 @@ 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+
77+
obj.SetGeneration(1)
78+
7279
if err := resource.CreateObject(ctx, id, obj); err != nil {
7380
return err
7481
}
7582
return req.writeResponse(obj)
7683
}
84+
85+
func preCreateHook(ctx context.Context, obj *unstructured.Unstructured) error {
86+
gvk := obj.GroupVersionKind()
87+
if gvk.Group == "" && gvk.Version == "v1" && gvk.Kind == "Secret" {
88+
stringDataAny, found := obj.Object["stringData"]
89+
if found {
90+
stringDataMap, ok := stringDataAny.(map[string]any)
91+
if !ok {
92+
return fmt.Errorf("unexpected type for v1.Secret stringData, got %T", stringDataAny)
93+
}
94+
dataAny, dataFound := obj.Object["data"]
95+
if !dataFound {
96+
dataAny = make(map[string]any)
97+
obj.Object["data"] = dataAny
98+
}
99+
dataMap, ok := dataAny.(map[string]any)
100+
if !ok {
101+
return fmt.Errorf("unexpected type for v1.Secret data, got %T", dataAny)
102+
}
103+
for k, vAny := range stringDataMap {
104+
v, ok := vAny.(string)
105+
if !ok {
106+
return fmt.Errorf("unexpected type for v1.Secret stringData entry, got %T", vAny)
107+
}
108+
dataMap[k] = base64.StdEncoding.EncodeToString([]byte(v))
109+
}
110+
}
111+
}
112+
return nil
113+
}

0 commit comments

Comments
 (0)