-
Notifications
You must be signed in to change notification settings - Fork 0
/
kubeutil.go
98 lines (79 loc) · 1.89 KB
/
kubeutil.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package main
import (
"cuelang.org/go/cue"
"cuelang.org/go/cue/ast"
"encoding/base64"
)
func DecodeSecret(v *cue.Value) (*ast.StructLit, error) {
data := v.LookupPath(cue.ParsePath("data"))
fields, err := data.Fields()
if err != nil {
return nil, err
}
ret := *v
for fields.Next() {
value := fields.Value()
selectors := value.Path().Selectors()
selector := selectors[len(selectors)-1]
var str string
if err := value.Null(); err == nil {
// `value` is null.
// Since Kubernetes Secret.data.<var> cannot be null,
// we substitute an empty string here.
str = ""
} else if s, err := value.String(); err != nil {
return nil, err
} else {
str = s
}
var decoded []byte
if d, err := base64.StdEncoding.DecodeString(str); err != nil {
return nil, err
} else {
decoded = d
}
path := cue.MakePath(cue.Hid("_data", "_"), selector)
ret = ret.FillPath(path, decoded)
}
syntax := ret.Syntax().(*ast.StructLit)
var dataIdx int
for i, elt := range syntax.Elts {
elt := elt.(*ast.Field)
label := elt.Label.(*ast.Ident)
if label.Name == "data" {
dataIdx = i
break
}
}
syntax.Elts = deleteAt(syntax.Elts, dataIdx)
return syntax, nil
}
func BuildFile(labels *stringArray, pkgName string, s *ast.StructLit) *ast.File {
f := &ast.File{}
if pkgName != "" {
f.Decls = append(f.Decls, &ast.Package{Name: ast.NewIdent(pkgName)})
}
if labels == nil || len(*labels) == 0 {
f.Decls = append(f.Decls, s)
return f
}
lastIdx := len(*labels) - 1
cur := &ast.Field{}
root := cur
for i, label := range *labels {
cur.Label = ast.NewIdent(label)
if i < lastIdx {
f := &ast.Field{}
cur.Value = ast.NewStruct(f)
cur = f
}
}
cur.Value = s
f.Decls = append(f.Decls, root)
return f
}
func deleteAt(list []ast.Decl, idx int) []ast.Decl {
lastIdx := len(list) - 1
list[idx], list[lastIdx] = list[lastIdx], list[idx]
return list[:lastIdx]
}