1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-06 16:06:56 +00:00
kyverno/pkg/utils/fuzz/unstructured.go

121 lines
2.5 KiB
Go
Raw Normal View History

package fuzz
import (
"strings"
fuzz "github.com/AdaLogics/go-fuzz-headers"
kubeutils "github.com/kyverno/kyverno/pkg/utils/kube"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)
// Creates an unstructured k8s object
func CreateUnstructuredObject(f *fuzz.ConsumeFuzzer, typeToCreate string) (*unstructured.Unstructured, error) {
labels, err := createLabels(f)
if err != nil {
return nil, err
}
versionAndKind, err := getVersionAndKind(f, typeToCreate)
if err != nil {
return nil, err
}
var sb strings.Builder
sb.WriteString("{ ")
sb.WriteString(versionAndKind)
sb.WriteString(", \"metadata\": { \"creationTimestamp\": \"2020-09-21T12:56:35Z\", \"name\": \"fuzz\", \"labels\": { ")
sb.WriteString(labels)
sb.WriteString(" } }, \"spec\": { ")
for i := 0; i < 1000; i++ {
typeToAdd, err := f.GetInt()
if err != nil {
return kubeutils.BytesToUnstructured([]byte(sb.String()))
}
switch typeToAdd % 11 {
case 0:
sb.WriteString("\"")
case 1:
s, err := f.GetString()
if err != nil {
return kubeutils.BytesToUnstructured([]byte(sb.String()))
}
sb.WriteString(s)
case 2:
sb.WriteString("{")
case 3:
sb.WriteString("}")
case 4:
sb.WriteString("[")
case 5:
sb.WriteString("]")
case 6:
sb.WriteString(":")
case 7:
sb.WriteString(",")
case 8:
sb.WriteString(" ")
case 9:
sb.WriteString("\t")
case 10:
sb.WriteString("\n")
}
}
return kubeutils.BytesToUnstructured([]byte(sb.String()))
}
func getVersionAndKind(ff *fuzz.ConsumeFuzzer, typeToCreate string) (string, error) {
var k, v string
if typeToCreate == "" {
kindToCreate, err := ff.GetInt()
if err != nil {
return "", err
}
k = k8sKinds[kindToCreate%len(k8sKinds)]
} else {
k = typeToCreate
if _, ok := kindToVersion[k]; !ok {
panic("Type not found")
}
}
v = kindToVersion[k]
var sb strings.Builder
sb.WriteString("\"apiVersion\": \"")
sb.WriteString(v)
sb.WriteString("\", \"kind\": \"")
sb.WriteString(k)
sb.WriteString("\"")
return sb.String(), nil
}
func createLabels(ff *fuzz.ConsumeFuzzer) (string, error) {
var sb strings.Builder
noOfLabels, err := ff.GetInt()
if err != nil {
return "", err
}
for i := 0; i < noOfLabels%30; i++ {
key, err := GetK8sString(ff)
if err != nil {
return "", err
}
value, err := GetK8sString(ff)
if err != nil {
return "", err
}
sb.WriteString("\"")
sb.WriteString(key)
sb.WriteString("\":")
sb.WriteString("\"")
sb.WriteString(value)
sb.WriteString("\"")
if i != (noOfLabels%30)-1 {
sb.WriteString(", ")
}
}
return sb.String(), nil
}