github.com/argoproj/argo-events@v1.9.1/hack/jsonschema/main.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "os" 7 "strings" 8 ) 9 10 const ( 11 group = "argoproj.io" 12 version = "v1alpha1" 13 eventBusKind = "EventBus" 14 eventSourceKind = "EventSource" 15 sensorKind = "Sensor" 16 ) 17 18 type obj = map[string]interface{} 19 20 func main() { 21 swagger := obj{} 22 { 23 f, err := os.Open("api/openapi-spec/swagger.json") 24 if err != nil { 25 panic(err) 26 } 27 err = json.NewDecoder(f).Decode(&swagger) 28 if err != nil { 29 panic(err) 30 } 31 } 32 { 33 crdKinds := []string{ 34 eventBusKind, 35 eventSourceKind, 36 sensorKind, 37 } 38 definitions := swagger["definitions"] 39 oneOf := make([]obj, 0, len(crdKinds)) 40 for _, kind := range crdKinds { 41 lowerCaseKind := strings.ToLower(kind) 42 definitionKey := fmt.Sprintf("io.argoproj.%s.%s.%s", lowerCaseKind, version, kind) 43 v := definitions.(obj)[definitionKey].(obj) 44 v["x-kubernetes-group-version-kind"] = []obj{ 45 { 46 "group": group, 47 "kind": kind, 48 "version": version, 49 }, 50 } 51 props := v["properties"].(obj) 52 props["apiVersion"].(obj)["const"] = fmt.Sprintf("%s/%s", group, version) 53 props["kind"].(obj)["const"] = kind 54 oneOf = append(oneOf, obj{"$ref": "#/definitions/" + definitionKey}) 55 } 56 57 transformInt64OrStringDefinition(definitions.(obj)) 58 transformK8sIntOrStringDefinitions(definitions.(obj)) 59 60 schema := obj{ 61 "$id": "http://events.argoproj.io/events.json", 62 "$schema": "http://json-schema.org/schema#", 63 "type": "object", 64 "oneOf": oneOf, 65 "definitions": definitions, 66 } 67 f, err := os.Create("api/jsonschema/schema.json") 68 if err != nil { 69 panic(err) 70 } 71 72 e := json.NewEncoder(f) 73 e.SetIndent("", " ") 74 err = e.Encode(schema) 75 if err != nil { 76 panic(err) 77 } 78 79 err = f.Close() 80 if err != nil { 81 panic(err) 82 } 83 } 84 } 85 86 func transformInt64OrStringDefinition(definitions obj) { 87 int64OrStringDefinition := definitions["io.argoproj.common.Int64OrString"].(obj) 88 int64OrStringDefinition["type"] = []string{ 89 "integer", 90 "string", 91 } 92 } 93 94 func transformK8sIntOrStringDefinitions(definitions obj) { 95 for _, d := range definitions { 96 transformK8sIntOrStringTypesInObject(d.(obj)) 97 } 98 } 99 100 func transformK8sIntOrStringTypesInObject(object obj) { 101 props, ok := object["properties"].(obj) 102 if !ok { 103 format, ok := object["format"].(string) 104 if ok && format == "int-or-string" { 105 object["type"] = []string{ 106 "integer", 107 "string", 108 } 109 } 110 return 111 } 112 113 for _, prop := range props { 114 transformK8sIntOrStringTypesInObject(prop.(obj)) 115 } 116 }