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  }