mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-06 16:06:56 +00:00
121 lines
2.5 KiB
Go
121 lines
2.5 KiB
Go
|
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
|
||
|
}
|