From 8788d8c8127801bc033b25363061c09c08a92b22 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Wed, 15 Mar 2023 13:26:51 +0530 Subject: [PATCH 01/41] NPT-632: Cosmos DM nexus compiler changes --- .github/workflows/build.yml | 4 - compiler/.gitignore | 1 + compiler/Dockerfile | 2 +- compiler/Makefile | 46 +- .../_generated_base_structure/model/.gitkeep | 0 .../tsm-nexus-gql/graph/.gitkeep | 0 compiler/cmd/nexus-sdk/main.go | 5 +- compiler/cmd/preparser/main.go | 39 ++ .../config.tsm.tanzu.vmware.com/v1/types.go | 11 +- .../apis/gns.tsm.tanzu.vmware.com/v1/types.go | 11 +- .../v1/types.go | 11 +- .../root.tsm.tanzu.vmware.com/v1/types.go | 11 +- .../v1/types.go | 11 +- .../output/_rendered_templates/model/model.go | 0 .../_rendered_templates/nexus-gql/gqlgen.yml | 6 + .../nexus-gql/graph/graphqlResolver.go | 150 +++++- .../nexus-gql/graph/schema.graphqls | 18 +- .../tsm-nexus-gql/graph/schema.graphqls | 167 ++++++ .../tsm-nexus-gql/graph/schema.graphqls | 37 ++ compiler/go.mod | 26 +- compiler/go.sum | 347 ++++++++++++- compiler/pkg/generator/generator_test.go | 7 +- compiler/pkg/generator/graphql_common.go | 405 +++++++++++++++ .../graphql_custom_query_generator.go | 6 +- .../graphql_custom_query_generator_test.go | 6 +- compiler/pkg/generator/resolver_generator.go | 157 +----- .../pkg/generator/resolver_generator_test.go | 4 +- .../template/graphql/graphqlResolver.go.tmpl | 12 +- .../template/graphql/schema.graphqls.tmpl | 11 + compiler/pkg/generator/template/model.go.tmpl | 1 + .../template/tsm-graphql/schema.graphqls.tmpl | 15 + compiler/pkg/generator/template/types.go.tmpl | 11 +- compiler/pkg/generator/template_renderers.go | 93 +++- .../pkg/generator/tsm_graphql_generator.go | 485 ++++++++++++++++++ .../generator/tsm_graphql_generator_test.go | 79 +++ compiler/pkg/openapi_generator/generator.go | 12 - compiler/pkg/parser/graphql_file_parser.go | 39 ++ compiler/pkg/parser/graphql_queries_parser.go | 25 +- compiler/pkg/parser/graphql_spec_parser.go | 56 ++ compiler/pkg/parser/graphql_test.go | 32 +- compiler/pkg/parser/node.go | 26 +- compiler/pkg/parser/node_config.go | 5 + compiler/pkg/parser/node_parser.go | 91 +++- compiler/pkg/parser/node_parser_test.go | 4 +- compiler/pkg/parser/pkg.go | 110 +++- compiler/pkg/parser/pkg_parser.go | 4 +- compiler/pkg/parser/rest/rest_test.go | 4 +- compiler/pkg/preparser/preparser.go | 294 +++++++++++ compiler/pkg/util/namers.go | 2 +- compiler/pkg/util/plural.go | 8 + compiler/pkg/util/util.go | 14 + compiler/scripts/pin_deps.sh | 1 - compiler/scripts/pin_graphql_build_version.sh | 1 - nexus/nexus/nexus.go | 6 + 54 files changed, 2634 insertions(+), 295 deletions(-) create mode 100644 compiler/_generated_base_structure/model/.gitkeep create mode 100644 compiler/_generated_base_structure/tsm-nexus-gql/graph/.gitkeep create mode 100644 compiler/cmd/preparser/main.go create mode 100644 compiler/example/output/_rendered_templates/model/model.go create mode 100644 compiler/example/output/_rendered_templates/tsm-nexus-gql/graph/schema.graphqls create mode 100644 compiler/example/test-utils/output-group-name-with-hyphen-datamodel/crd_generated/tsm-nexus-gql/graph/schema.graphqls create mode 100644 compiler/pkg/generator/template/model.go.tmpl create mode 100644 compiler/pkg/generator/template/tsm-graphql/schema.graphqls.tmpl create mode 100644 compiler/pkg/generator/tsm_graphql_generator.go create mode 100644 compiler/pkg/generator/tsm_graphql_generator_test.go create mode 100644 compiler/pkg/parser/graphql_file_parser.go create mode 100644 compiler/pkg/parser/graphql_spec_parser.go create mode 100644 compiler/pkg/preparser/preparser.go diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 326ba3352..a8bcb7cef 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,8 +13,6 @@ jobs: uses: actions/setup-go@v3 with: go-version: '>=1.17.0' - - name: setup-docker - uses: docker-practice/actions-setup-docker@1.0.11 - name: 'Set up Cloud SDK' uses: 'google-github-actions/setup-gcloud@v0' - name: Build Compiler image @@ -51,8 +49,6 @@ jobs: uses: actions/setup-go@v3 with: go-version: '>=1.17.0' - - name: setup-docker - uses: docker-practice/actions-setup-docker@1.0.11 - name: Test Generate Code and Render templates run: | git config --global url."https://github.com/".insteadOf "git@github.com:" diff --git a/compiler/.gitignore b/compiler/.gitignore index 43119c410..2155e068a 100644 --- a/compiler/.gitignore +++ b/compiler/.gitignore @@ -7,6 +7,7 @@ cmd/nexus-openapi-gen cmd/gqlgen compiler.tar _generated +_tsm_temp ### GoLand ### .idea diff --git a/compiler/Dockerfile b/compiler/Dockerfile index b41fffc1f..cc7ce7b33 100644 --- a/compiler/Dockerfile +++ b/compiler/Dockerfile @@ -25,4 +25,4 @@ RUN CGO_ENABLED=0 go build --trimpath -o install.so ./cmd/validate WORKDIR /go/src/github.com/vmware-tanzu/graph-framework-for-microservices/compiler RUN go mod download -CMD make docker.gitlab_credentials && make generate_code +CMD make docker.gitlab_credentials && make preparser diff --git a/compiler/Makefile b/compiler/Makefile index 104454364..95484f0fb 100644 --- a/compiler/Makefile +++ b/compiler/Makefile @@ -20,6 +20,7 @@ CONFIG_FILE ?= "" GENERATED_OUTPUT_DIRECTORY ?= generated COMPILER_SRC_DIRECTORY ?= "" FORCE ?= false +PREPARSER_MODPATH ?= model NEXUS_KUBEOPENAPI_VERSION ?= 7416bd4754d3c0dd8b3fa37fff53d36594f11607 NEXUS_GRAPHQLGEN_VERSION ?= 32f028bce22efeb70b47a640195bd969dbb337f0 @@ -140,11 +141,41 @@ generate_example_in_container: test_in_container: ${BUILDER_NAME}\:${BUILDER_TAG}.image.exists $(call run_in_container, make test) +.PHONY: preparser +preparser: + @echo "Nexus Compiler: Start Preparser" + @echo "Cleaning up workdir" + rm -rf _generated + @echo "Copying generated_base_structure to create directory structure" + @echo "COMPILER_SRC_DIRECTORY: ${COMPILER_SRC_DIRECTORY}" + cp -R _generated_base_structure _generated + @echo "Cleaning up temp dir" + rm -rf _tsm_temp + @echo "Copying Datamodel to temp directory" + cp -R ${DATAMODEL_PATH} _tsm_temp + cp -R _generated_base_structure/* ${DATAMODEL_PATH}/build + @echo "Nexus Compiler: Running Preparser" + go run cmd/preparser/main.go -dsl _tsm_temp -output _generated -modpath ${PREPARSER_MODPATH} + @echo "Nexus Compiler: Remove empty directories from model directory" + @find _generated/model -depth -type d -empty -delete + + @if [ -d "_tsm_temp/global" ]; then \ + cp _tsm_temp/go.mod _tsm_temp/global/go.mod; \ + for d in _tsm_temp/*/; do \ + if [[ ! "$$d" == "_tsm_temp/global/" && ! "$$d" == "_tsm_temp/build/" ]]; then \ + cp -r "$$d" "_tsm_temp/global/"; \ + fi; \ + done; \ + $(MAKE) generate_code DATAMODEL_PATH=_tsm_temp/global; \ + else \ + $(MAKE) generate_code; \ + fi + .PHONY: generate_code generate_code: @echo "Nexus Compiler: Running compiler code generation" @echo "Cleaning up workdir" - rm -rf _generated ${GOPATH}/src/nexustempmodule + rm -rf ${GOPATH}/src/nexustempmodule @echo "Copying generated_base_structure to create directory structure" @echo "COMPILER_SRC_DIRECTORY: ${COMPILER_SRC_DIRECTORY}" cp -R _generated_base_structure _generated @@ -164,11 +195,12 @@ generate_code: @echo "Nexus Compiler: Generating CRD yamls" go run cmd/generate-openapischema/generate-openapischema.go -yamls-path _generated/crds -existing-CRDs-Path ${GENERATED_OUTPUT_DIRECTORY}/crds -force ${FORCE} git checkout -- pkg/openapi_generator/openapi/openapi_generated.go - rm -rf ${GENERATED_OUTPUT_DIRECTORY}/{client,apis,crds,common,nexus-client,helper,nexus-gql} - cp -r _generated/{client,apis,crds,common,nexus-client,helper,nexus-gql} ${GENERATED_OUTPUT_DIRECTORY} + rm -rf ${GENERATED_OUTPUT_DIRECTORY}/{client,apis,crds,common,nexus-client,helper,nexus-gql,tsm-nexus-gql,model} + cp -r _generated/{client,apis,crds,common,nexus-client,helper,nexus-gql,tsm-nexus-gql,model} ${GENERATED_OUTPUT_DIRECTORY} @echo "Nexus Compiler: Generating GRAPHQL PKG" - cd _generated && goimports -w . + cd _generated && mv model/model.go model/model.tmp && goimports -w . && mv model/model.tmp model/model.go cd _generated/nexus-gql && gqlgen generate + @echo "Nexus Compiler: GRAPHQL Generating completed" cp -rf _generated/* ${GOPATH}/src/nexustempmodule/ cd ${GOPATH}/src/nexustempmodule && cd nexus-gql && go mod init && \ go mod edit -replace nexustempmodule=${GOPATH}/src/nexustempmodule && \ @@ -180,12 +212,12 @@ generate_code: ./scripts/replace_mod_path.sh find . -name "*.bak" -type f -delete @echo "Sorting imports" - cd _generated && goimports -w . + cd _generated && mv model/model.go model/model.tmp && goimports -w . && mv model/model.tmp model/model.go @echo "Nexus Compiler: Moving files to output directory" - cp -r _generated/{client,apis,crds,common,nexus-client,helper,nexus-gql} ${GENERATED_OUTPUT_DIRECTORY} - cp -r ${GOPATH}/src/nexustempmodule/nexus-gql/graphql.so ${GENERATED_OUTPUT_DIRECTORY}/nexus-gql mkdir -p ${GENERATED_OUTPUT_DIRECTORY}/install-validator cp -r ${GOPATH}/src/github.com/vmware-tanzu/graph-framework-for-microservices/install-validator/install.so ${GENERATED_OUTPUT_DIRECTORY}/install-validator/install.so || echo "Could not find install.so file, skipping" + cp -r _generated/{client,apis,crds,common,nexus-client,helper,nexus-gql,tsm-nexus-gql,model} ${GENERATED_OUTPUT_DIRECTORY} + cp -r ${GOPATH}/src/nexustempmodule/nexus-gql/* ${GENERATED_OUTPUT_DIRECTORY}/nexus-gql/ @echo "Nexus Compiler: Compiler code generation completed" .PHONY: test_generate_code_in_container diff --git a/compiler/_generated_base_structure/model/.gitkeep b/compiler/_generated_base_structure/model/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/compiler/_generated_base_structure/tsm-nexus-gql/graph/.gitkeep b/compiler/_generated_base_structure/tsm-nexus-gql/graph/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/compiler/cmd/nexus-sdk/main.go b/compiler/cmd/nexus-sdk/main.go index 2627e8257..184f474dc 100644 --- a/compiler/cmd/nexus-sdk/main.go +++ b/compiler/cmd/nexus-sdk/main.go @@ -49,10 +49,11 @@ func main() { config.ConfigInstance = conf pkgs := parser.ParseDSLPkg(*dslDir) graphlqQueries := parser.ParseGraphqlQuerySpecs(pkgs) - graph := parser.ParseDSLNodes(*dslDir, conf.GroupName, pkgs, graphlqQueries) + graph, nonNexusTypes, fileset := parser.ParseDSLNodes(*dslDir, conf.GroupName, pkgs, graphlqQueries) methods, codes := rest.ParseResponses(pkgs) + graphqlFiles := parser.ParseGraphQLFiles(*dslDir) if err = generator.RenderCRDTemplate(conf.GroupName, conf.CrdModulePath, pkgs, graph, - *crdDir, methods, codes); err != nil { + *crdDir, methods, codes, nonNexusTypes, fileset, graphqlFiles); err != nil { log.Fatalf("Error rendering crd template: %v", err) } } diff --git a/compiler/cmd/preparser/main.go b/compiler/cmd/preparser/main.go new file mode 100644 index 000000000..16b13217a --- /dev/null +++ b/compiler/cmd/preparser/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "flag" + + log "github.com/sirupsen/logrus" + "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/preparser" +) + +func main() { + dslDir := flag.String("dsl", "datamodel", "DSL file location.") + outputDir := flag.String("output", "_generated", "output dir location.") + modPath := flag.String("modpath", "datamodel", "ModPath for rendered imports") + logLevel := flag.String("log-level", "ERROR", "Log level") + flag.Parse() + + lvl, err := log.ParseLevel(*logLevel) + if err != nil { + log.Fatalf("Failed to configure logging: %v\n", err) + } + log.SetLevel(lvl) + + packages := preparser.Parse(*dslDir) + err = preparser.Render(*dslDir, packages) + if err != nil { + log.Fatal(err) + } + + err = preparser.CopyPkgsToBuild(*dslDir, *outputDir) + if err != nil { + log.Fatal(err) + } + + packages = preparser.Parse(*dslDir) + err = preparser.RenderImports(packages, *outputDir, *modPath) + if err != nil { + log.Fatal(err) + } +} diff --git a/compiler/example/output/_rendered_templates/apis/config.tsm.tanzu.vmware.com/v1/types.go b/compiler/example/output/_rendered_templates/apis/config.tsm.tanzu.vmware.com/v1/types.go index a5760cb96..04f5dd6b4 100644 --- a/compiler/example/output/_rendered_templates/apis/config.tsm.tanzu.vmware.com/v1/types.go +++ b/compiler/example/output/_rendered_templates/apis/config.tsm.tanzu.vmware.com/v1/types.go @@ -24,10 +24,17 @@ type Link struct { Name string `json:"name" yaml:"name"` } +// +k8s:openapi-gen=true +type SyncerStatus struct { + EtcdVersion int64 `json:"etcdVersion, omitempty" yaml:"etcdVersion, omitempty"` + CRGenerationId int64 `json:"cRGenerationId, omitempty" yaml:"cRGenerationId, omitempty"` +} + // +k8s:openapi-gen=true type NexusStatus struct { - SourceGeneration int64 `json:"sourceGeneration" yaml:"sourceGeneration"` - RemoteGeneration int64 `json:"remoteGeneration" yaml:"remoteGeneration"` + SourceGeneration int64 `json:"sourceGeneration, omitempty" yaml:"sourceGeneration, omitempty"` + RemoteGeneration int64 `json:"remoteGeneration, omitempty" yaml:"remoteGeneration, omitempty"` + SyncerStatus SyncerStatus `json:"syncerStatus, omitempty" yaml:"syncerStatus, omitempty"` } /* ------------------- CRDs definitions ------------------- */ diff --git a/compiler/example/output/_rendered_templates/apis/gns.tsm.tanzu.vmware.com/v1/types.go b/compiler/example/output/_rendered_templates/apis/gns.tsm.tanzu.vmware.com/v1/types.go index ae3ffdf01..669b6e7b3 100644 --- a/compiler/example/output/_rendered_templates/apis/gns.tsm.tanzu.vmware.com/v1/types.go +++ b/compiler/example/output/_rendered_templates/apis/gns.tsm.tanzu.vmware.com/v1/types.go @@ -23,10 +23,17 @@ type Link struct { Name string `json:"name" yaml:"name"` } +// +k8s:openapi-gen=true +type SyncerStatus struct { + EtcdVersion int64 `json:"etcdVersion, omitempty" yaml:"etcdVersion, omitempty"` + CRGenerationId int64 `json:"cRGenerationId, omitempty" yaml:"cRGenerationId, omitempty"` +} + // +k8s:openapi-gen=true type NexusStatus struct { - SourceGeneration int64 `json:"sourceGeneration" yaml:"sourceGeneration"` - RemoteGeneration int64 `json:"remoteGeneration" yaml:"remoteGeneration"` + SourceGeneration int64 `json:"sourceGeneration, omitempty" yaml:"sourceGeneration, omitempty"` + RemoteGeneration int64 `json:"remoteGeneration, omitempty" yaml:"remoteGeneration, omitempty"` + SyncerStatus SyncerStatus `json:"syncerStatus, omitempty" yaml:"syncerStatus, omitempty"` } /* ------------------- CRDs definitions ------------------- */ diff --git a/compiler/example/output/_rendered_templates/apis/policypkg.tsm.tanzu.vmware.com/v1/types.go b/compiler/example/output/_rendered_templates/apis/policypkg.tsm.tanzu.vmware.com/v1/types.go index 474e2caad..b369ca5b4 100644 --- a/compiler/example/output/_rendered_templates/apis/policypkg.tsm.tanzu.vmware.com/v1/types.go +++ b/compiler/example/output/_rendered_templates/apis/policypkg.tsm.tanzu.vmware.com/v1/types.go @@ -22,10 +22,17 @@ type Link struct { Name string `json:"name" yaml:"name"` } +// +k8s:openapi-gen=true +type SyncerStatus struct { + EtcdVersion int64 `json:"etcdVersion, omitempty" yaml:"etcdVersion, omitempty"` + CRGenerationId int64 `json:"cRGenerationId, omitempty" yaml:"cRGenerationId, omitempty"` +} + // +k8s:openapi-gen=true type NexusStatus struct { - SourceGeneration int64 `json:"sourceGeneration" yaml:"sourceGeneration"` - RemoteGeneration int64 `json:"remoteGeneration" yaml:"remoteGeneration"` + SourceGeneration int64 `json:"sourceGeneration, omitempty" yaml:"sourceGeneration, omitempty"` + RemoteGeneration int64 `json:"remoteGeneration, omitempty" yaml:"remoteGeneration, omitempty"` + SyncerStatus SyncerStatus `json:"syncerStatus, omitempty" yaml:"syncerStatus, omitempty"` } /* ------------------- CRDs definitions ------------------- */ diff --git a/compiler/example/output/_rendered_templates/apis/root.tsm.tanzu.vmware.com/v1/types.go b/compiler/example/output/_rendered_templates/apis/root.tsm.tanzu.vmware.com/v1/types.go index 112a210b0..2e8b817c8 100644 --- a/compiler/example/output/_rendered_templates/apis/root.tsm.tanzu.vmware.com/v1/types.go +++ b/compiler/example/output/_rendered_templates/apis/root.tsm.tanzu.vmware.com/v1/types.go @@ -22,10 +22,17 @@ type Link struct { Name string `json:"name" yaml:"name"` } +// +k8s:openapi-gen=true +type SyncerStatus struct { + EtcdVersion int64 `json:"etcdVersion, omitempty" yaml:"etcdVersion, omitempty"` + CRGenerationId int64 `json:"cRGenerationId, omitempty" yaml:"cRGenerationId, omitempty"` +} + // +k8s:openapi-gen=true type NexusStatus struct { - SourceGeneration int64 `json:"sourceGeneration" yaml:"sourceGeneration"` - RemoteGeneration int64 `json:"remoteGeneration" yaml:"remoteGeneration"` + SourceGeneration int64 `json:"sourceGeneration, omitempty" yaml:"sourceGeneration, omitempty"` + RemoteGeneration int64 `json:"remoteGeneration, omitempty" yaml:"remoteGeneration, omitempty"` + SyncerStatus SyncerStatus `json:"syncerStatus, omitempty" yaml:"syncerStatus, omitempty"` } /* ------------------- CRDs definitions ------------------- */ diff --git a/compiler/example/output/_rendered_templates/apis/servicegroup.tsm.tanzu.vmware.com/v1/types.go b/compiler/example/output/_rendered_templates/apis/servicegroup.tsm.tanzu.vmware.com/v1/types.go index c5cad05d7..19cebc4b3 100644 --- a/compiler/example/output/_rendered_templates/apis/servicegroup.tsm.tanzu.vmware.com/v1/types.go +++ b/compiler/example/output/_rendered_templates/apis/servicegroup.tsm.tanzu.vmware.com/v1/types.go @@ -22,10 +22,17 @@ type Link struct { Name string `json:"name" yaml:"name"` } +// +k8s:openapi-gen=true +type SyncerStatus struct { + EtcdVersion int64 `json:"etcdVersion, omitempty" yaml:"etcdVersion, omitempty"` + CRGenerationId int64 `json:"cRGenerationId, omitempty" yaml:"cRGenerationId, omitempty"` +} + // +k8s:openapi-gen=true type NexusStatus struct { - SourceGeneration int64 `json:"sourceGeneration" yaml:"sourceGeneration"` - RemoteGeneration int64 `json:"remoteGeneration" yaml:"remoteGeneration"` + SourceGeneration int64 `json:"sourceGeneration, omitempty" yaml:"sourceGeneration, omitempty"` + RemoteGeneration int64 `json:"remoteGeneration, omitempty" yaml:"remoteGeneration, omitempty"` + SyncerStatus SyncerStatus `json:"syncerStatus, omitempty" yaml:"syncerStatus, omitempty"` } /* ------------------- CRDs definitions ------------------- */ diff --git a/compiler/example/output/_rendered_templates/model/model.go b/compiler/example/output/_rendered_templates/model/model.go new file mode 100644 index 000000000..e69de29bb diff --git a/compiler/example/output/_rendered_templates/nexus-gql/gqlgen.yml b/compiler/example/output/_rendered_templates/nexus-gql/gqlgen.yml index d37aa546e..d5e13d028 100644 --- a/compiler/example/output/_rendered_templates/nexus-gql/gqlgen.yml +++ b/compiler/example/output/_rendered_templates/nexus-gql/gqlgen.yml @@ -68,6 +68,12 @@ models: fields: PolicyConfigs: resolver: true + policypkg_ACPConfig: + fields: + DestSvcGroups: + resolver: true + SourceSvcGroups: + resolver: true policypkg_VMpolicy: fields: queryGns1: diff --git a/compiler/example/output/_rendered_templates/nexus-gql/graph/graphqlResolver.go b/compiler/example/output/_rendered_templates/nexus-gql/graph/graphqlResolver.go index 168230efc..ed1957e22 100644 --- a/compiler/example/output/_rendered_templates/nexus-gql/graph/graphqlResolver.go +++ b/compiler/example/output/_rendered_templates/nexus-gql/graph/graphqlResolver.go @@ -27,6 +27,16 @@ func getParentName(parentLabels map[string]interface{}, key string) string { return "" } +type NodeMetricTypeEnum string +type ServiceMetricTypeEnum string +type ServiceGroupByEnum string +type HTTPMethodEnum string +type EventSeverityEnum string +type AnalyticsMetricEnum string +type AnalyticsSubMetricEnum string +type TrafficDirectionEnum string +type SloDetailsEnum string + ////////////////////////////////////// // Nexus K8sAPIEndpointConfig ////////////////////////////////////// @@ -82,7 +92,7 @@ parentLabels := map[string]interface{}{"roots.root.tsm.tanzu.vmware.com":dn} return ret, nil } // Custom query -func getConfigConfigQueryExampleResolver(obj *model.ConfigConfig, StartTime *string, EndTime *string, Interval *string, IsServiceDeployment *bool, StartVal *int, ) (*model.NexusGraphqlResponse, error) { +func getConfigConfigQueryExampleResolver(obj *model.ConfigConfig, StartTime *string, EndTime *string, Interval *string, IsServiceDeployment *bool, StartVal *int,) (*model.NexusGraphqlResponse, error) { parentLabels := make(map[string]string) if obj != nil { for k, v := range obj.ParentLabels { @@ -111,7 +121,7 @@ func getConfigConfigQueryExampleResolver(obj *model.ConfigConfig, StartTime *st return resp.(*model.NexusGraphqlResponse), nil } // Custom query -func getGnsGnsqueryGns1Resolver(obj *model.GnsGns, StartTime *string, EndTime *string, Interval *string, IsServiceDeployment *bool, StartVal *int, ) (*model.NexusGraphqlResponse, error) { +func getGnsGnsqueryGns1Resolver(obj *model.GnsGns, StartTime *string, EndTime *string, Interval *string, IsServiceDeployment *bool, StartVal *int,) (*model.NexusGraphqlResponse, error) { parentLabels := make(map[string]string) if obj != nil { for k, v := range obj.ParentLabels { @@ -163,7 +173,7 @@ func getGnsGnsqueryGnsQM1Resolver(obj *model.GnsGns, ) (*model.TimeSeriesData, e return resp.(*model.TimeSeriesData), nil } // Custom query -func getGnsGnsqueryGnsQMResolver(obj *model.GnsGns, StartTime *string, EndTime *string, TimeInterval *string, SomeUserArg1 *string, SomeUserArg2 *int, SomeUserArg3 *bool, ) (*model.TimeSeriesData, error) { +func getGnsGnsqueryGnsQMResolver(obj *model.GnsGns, StartTime *string, EndTime *string, TimeInterval *string, SomeUserArg1 *string, SomeUserArg2 *int, SomeUserArg3 *bool,) (*model.TimeSeriesData, error) { parentLabels := make(map[string]string) if obj != nil { for k, v := range obj.ParentLabels { @@ -192,7 +202,7 @@ func getGnsGnsqueryGnsQMResolver(obj *model.GnsGns, StartTime *string, EndTime return resp.(*model.TimeSeriesData), nil } // Custom query -func getPolicypkgVMpolicyqueryGns1Resolver(obj *model.PolicypkgVMpolicy, StartTime *string, EndTime *string, Interval *string, IsServiceDeployment *bool, StartVal *int, ) (*model.NexusGraphqlResponse, error) { +func getPolicypkgVMpolicyqueryGns1Resolver(obj *model.PolicypkgVMpolicy, StartTime *string, EndTime *string, Interval *string, IsServiceDeployment *bool, StartVal *int,) (*model.NexusGraphqlResponse, error) { parentLabels := make(map[string]string) if obj != nil { for k, v := range obj.ParentLabels { @@ -244,7 +254,7 @@ func getPolicypkgVMpolicyqueryGnsQM1Resolver(obj *model.PolicypkgVMpolicy, ) (*m return resp.(*model.TimeSeriesData), nil } // Custom query -func getPolicypkgVMpolicyqueryGnsQMResolver(obj *model.PolicypkgVMpolicy, StartTime *string, EndTime *string, TimeInterval *string, SomeUserArg1 *string, SomeUserArg2 *int, SomeUserArg3 *bool, ) (*model.TimeSeriesData, error) { +func getPolicypkgVMpolicyqueryGnsQMResolver(obj *model.PolicypkgVMpolicy, StartTime *string, EndTime *string, TimeInterval *string, SomeUserArg1 *string, SomeUserArg2 *int, SomeUserArg3 *bool,) (*model.TimeSeriesData, error) { parentLabels := make(map[string]string) if obj != nil { for k, v := range obj.ParentLabels { @@ -1089,3 +1099,133 @@ ConditionsData := string(Conditions) return vPolicypkgACPConfigList, nil } +////////////////////////////////////// +// LINKS RESOLVER +// FieldName: DestSvcGroups Node: ACPConfig PKG: Policypkg +////////////////////////////////////// +func getPolicypkgACPConfigDestSvcGroupsResolver(obj *model.PolicypkgACPConfig, id *string) ([]*model.ServicegroupSvcGroup, error) { + log.Debugf("[getPolicypkgACPConfigDestSvcGroupsResolver]Parent Object %+v", obj) + var vServicegroupSvcGroupList []*model.ServicegroupSvcGroup + if id != nil && *id != "" { + log.Debugf("[getPolicypkgACPConfigDestSvcGroupsResolver]Id %q", *id) + vSvcGroupParent, err := nc.RootRoot().Config(getParentName(obj.ParentLabels, "configs.config.tsm.tanzu.vmware.com")).GNS(getParentName(obj.ParentLabels, "gnses.gns.tsm.tanzu.vmware.com")).GnsAccessControlPolicy(getParentName(obj.ParentLabels, "accesscontrolpolicies.policypkg.tsm.tanzu.vmware.com")).GetPolicyConfigs(context.TODO(), getParentName(obj.ParentLabels, "acpconfigs.policypkg.tsm.tanzu.vmware.com")) + if err != nil { + log.Errorf("[getPolicypkgACPConfigDestSvcGroupsResolver]Error getting DestSvcGroups %q : %s", *id, err) + return vServicegroupSvcGroupList, nil + } + vSvcGroup, err := vSvcGroupParent.GetDestSvcGroups(context.TODO(), *id) + if err != nil { + log.Errorf("[getPolicypkgACPConfigDestSvcGroupsResolver]Error getting DestSvcGroups %q : %s", *id, err) + return vServicegroupSvcGroupList, nil + } + + for k, v := range obj.ParentLabels { + parentLabels[k] = v + } + + vServicegroupSvcGroupList = append(vServicegroupSvcGroupList, ret) + + log.Debugf("[getPolicypkgACPConfigDestSvcGroupsResolver]Output DestSvcGroups objects %v", vServicegroupSvcGroupList) + + return vServicegroupSvcGroupList, nil + } + + log.Debug("[getPolicypkgACPConfigDestSvcGroupsResolver]Id is empty, process all DestSvcGroupss") + + vSvcGroupParent, err := nc.RootRoot().Config(getParentName(obj.ParentLabels, "configs.config.tsm.tanzu.vmware.com")).GNS(getParentName(obj.ParentLabels, "gnses.gns.tsm.tanzu.vmware.com")).GnsAccessControlPolicy(getParentName(obj.ParentLabels, "accesscontrolpolicies.policypkg.tsm.tanzu.vmware.com")).GetPolicyConfigs(context.TODO(), getParentName(obj.ParentLabels, "acpconfigs.policypkg.tsm.tanzu.vmware.com")) + if err != nil { + log.Errorf("[getPolicypkgACPConfigDestSvcGroupsResolver]Error getting parent node %s", err) + return vServicegroupSvcGroupList, nil + } + vSvcGroupAllObj, err := vSvcGroupParent.GetAllDestSvcGroups(context.TODO()) + if err != nil { + log.Errorf("[getPolicypkgACPConfigDestSvcGroupsResolver]Error getting DestSvcGroups %s", err) + return vServicegroupSvcGroupList, nil + } + for _, i := range vSvcGroupAllObj { + vSvcGroupParent, err := nc.RootRoot().Config(getParentName(obj.ParentLabels, "configs.config.tsm.tanzu.vmware.com")).GNS(getParentName(obj.ParentLabels, "gnses.gns.tsm.tanzu.vmware.com")).GnsAccessControlPolicy(getParentName(obj.ParentLabels, "accesscontrolpolicies.policypkg.tsm.tanzu.vmware.com")).GetPolicyConfigs(context.TODO(), getParentName(obj.ParentLabels, "acpconfigs.policypkg.tsm.tanzu.vmware.com")) + if err != nil { + log.Errorf("[getPolicypkgACPConfigDestSvcGroupsResolver]Error getting parent node %s, skipping...", err) + continue + } + vSvcGroup, err := vSvcGroupParent.GetDestSvcGroups(context.TODO(), i.DisplayName()) + if err != nil { + log.Errorf("[getPolicypkgACPConfigDestSvcGroupsResolver]Error getting DestSvcGroups node %q : %s, skipping...", i.DisplayName(), err) + continue + } + + for k, v := range obj.ParentLabels { + parentLabels[k] = v + } + + vServicegroupSvcGroupList = append(vServicegroupSvcGroupList, ret) + } + log.Debugf("[getPolicypkgACPConfigDestSvcGroupsResolver]List of DestSvcGroups object %v", vServicegroupSvcGroupList) + return vServicegroupSvcGroupList, nil +} + +////////////////////////////////////// +// LINKS RESOLVER +// FieldName: SourceSvcGroups Node: ACPConfig PKG: Policypkg +////////////////////////////////////// +func getPolicypkgACPConfigSourceSvcGroupsResolver(obj *model.PolicypkgACPConfig, id *string) ([]*model.ServicegroupSvcGroup, error) { + log.Debugf("[getPolicypkgACPConfigSourceSvcGroupsResolver]Parent Object %+v", obj) + var vServicegroupSvcGroupList []*model.ServicegroupSvcGroup + if id != nil && *id != "" { + log.Debugf("[getPolicypkgACPConfigSourceSvcGroupsResolver]Id %q", *id) + vSvcGroupParent, err := nc.RootRoot().Config(getParentName(obj.ParentLabels, "configs.config.tsm.tanzu.vmware.com")).GNS(getParentName(obj.ParentLabels, "gnses.gns.tsm.tanzu.vmware.com")).GnsAccessControlPolicy(getParentName(obj.ParentLabels, "accesscontrolpolicies.policypkg.tsm.tanzu.vmware.com")).GetPolicyConfigs(context.TODO(), getParentName(obj.ParentLabels, "acpconfigs.policypkg.tsm.tanzu.vmware.com")) + if err != nil { + log.Errorf("[getPolicypkgACPConfigSourceSvcGroupsResolver]Error getting SourceSvcGroups %q : %s", *id, err) + return vServicegroupSvcGroupList, nil + } + vSvcGroup, err := vSvcGroupParent.GetSourceSvcGroups(context.TODO(), *id) + if err != nil { + log.Errorf("[getPolicypkgACPConfigSourceSvcGroupsResolver]Error getting SourceSvcGroups %q : %s", *id, err) + return vServicegroupSvcGroupList, nil + } + + for k, v := range obj.ParentLabels { + parentLabels[k] = v + } + + vServicegroupSvcGroupList = append(vServicegroupSvcGroupList, ret) + + log.Debugf("[getPolicypkgACPConfigSourceSvcGroupsResolver]Output SourceSvcGroups objects %v", vServicegroupSvcGroupList) + + return vServicegroupSvcGroupList, nil + } + + log.Debug("[getPolicypkgACPConfigSourceSvcGroupsResolver]Id is empty, process all SourceSvcGroupss") + + vSvcGroupParent, err := nc.RootRoot().Config(getParentName(obj.ParentLabels, "configs.config.tsm.tanzu.vmware.com")).GNS(getParentName(obj.ParentLabels, "gnses.gns.tsm.tanzu.vmware.com")).GnsAccessControlPolicy(getParentName(obj.ParentLabels, "accesscontrolpolicies.policypkg.tsm.tanzu.vmware.com")).GetPolicyConfigs(context.TODO(), getParentName(obj.ParentLabels, "acpconfigs.policypkg.tsm.tanzu.vmware.com")) + if err != nil { + log.Errorf("[getPolicypkgACPConfigSourceSvcGroupsResolver]Error getting parent node %s", err) + return vServicegroupSvcGroupList, nil + } + vSvcGroupAllObj, err := vSvcGroupParent.GetAllSourceSvcGroups(context.TODO()) + if err != nil { + log.Errorf("[getPolicypkgACPConfigSourceSvcGroupsResolver]Error getting SourceSvcGroups %s", err) + return vServicegroupSvcGroupList, nil + } + for _, i := range vSvcGroupAllObj { + vSvcGroupParent, err := nc.RootRoot().Config(getParentName(obj.ParentLabels, "configs.config.tsm.tanzu.vmware.com")).GNS(getParentName(obj.ParentLabels, "gnses.gns.tsm.tanzu.vmware.com")).GnsAccessControlPolicy(getParentName(obj.ParentLabels, "accesscontrolpolicies.policypkg.tsm.tanzu.vmware.com")).GetPolicyConfigs(context.TODO(), getParentName(obj.ParentLabels, "acpconfigs.policypkg.tsm.tanzu.vmware.com")) + if err != nil { + log.Errorf("[getPolicypkgACPConfigSourceSvcGroupsResolver]Error getting parent node %s, skipping...", err) + continue + } + vSvcGroup, err := vSvcGroupParent.GetSourceSvcGroups(context.TODO(), i.DisplayName()) + if err != nil { + log.Errorf("[getPolicypkgACPConfigSourceSvcGroupsResolver]Error getting SourceSvcGroups node %q : %s, skipping...", i.DisplayName(), err) + continue + } + + for k, v := range obj.ParentLabels { + parentLabels[k] = v + } + + vServicegroupSvcGroupList = append(vServicegroupSvcGroupList, ret) + } + log.Debugf("[getPolicypkgACPConfigSourceSvcGroupsResolver]List of SourceSvcGroups object %v", vServicegroupSvcGroupList) + return vServicegroupSvcGroupList, nil +} + diff --git a/compiler/example/output/_rendered_templates/nexus-gql/graph/schema.graphqls b/compiler/example/output/_rendered_templates/nexus-gql/graph/schema.graphqls index dc5d49a9b..72f2153a8 100644 --- a/compiler/example/output/_rendered_templates/nexus-gql/graph/schema.graphqls +++ b/compiler/example/output/_rendered_templates/nexus-gql/graph/schema.graphqls @@ -20,7 +20,6 @@ type config_Config { IsServiceDeployment: Boolean StartVal: Int ): NexusGraphqlResponse - ACPPolicies(Id: ID): [policypkg_AccessControlPolicy!] FooExample(Id: ID): [config_FooTypeABC!] MyStr0: String @@ -73,9 +72,7 @@ type gns_Gns { Interval: String IsServiceDeployment: Boolean StartVal: Int - ): NexusGraphqlResponse - queryGnsQM1: TimeSeriesData - queryGnsQM( + ): NexusGraphqlResponse queryGnsQM1: TimeSeriesData queryGnsQM( StartTime: String EndTime: String TimeInterval: String @@ -83,7 +80,6 @@ type gns_Gns { SomeUserArg2: Int SomeUserArg3: Boolean ): TimeSeriesData - Domain: String UseSharedGateway: Boolean Description: String @@ -143,6 +139,8 @@ type policypkg_ACPConfig { Id: ID ParentLabels: Map + DestSvcGroups(Id: ID): [servicegroup_SvcGroup!] + SourceSvcGroups(Id: ID): [servicegroup_SvcGroup!] DisplayName: String Gns: String Description: String @@ -160,9 +158,7 @@ type policypkg_VMpolicy { Interval: String IsServiceDeployment: Boolean StartVal: Int - ): NexusGraphqlResponse - queryGnsQM1: TimeSeriesData - queryGnsQM( + ): NexusGraphqlResponse queryGnsQM1: TimeSeriesData queryGnsQM( StartTime: String EndTime: String TimeInterval: String @@ -170,7 +166,6 @@ type policypkg_VMpolicy { SomeUserArg2: Int SomeUserArg3: Boolean ): TimeSeriesData - } type NexusGraphqlResponse { @@ -188,3 +183,8 @@ type TimeSeriesData { Last: String TotalRecords: Int } + +directive @jsonencoded(file: String, gofile: String, name: String) on FIELD_DEFINITION +directive @relation(name: String, parameters: String, softlink: String, uuidkey: String) on FIELD_DEFINITION +directive @timeseriesAPI(file: String!, handler: String!) on FIELD_DEFINITION +directive @protobuf(file: String!, name: String!) on FIELD_DEFINITION diff --git a/compiler/example/output/_rendered_templates/tsm-nexus-gql/graph/schema.graphqls b/compiler/example/output/_rendered_templates/tsm-nexus-gql/graph/schema.graphqls new file mode 100644 index 000000000..81cbf1ef2 --- /dev/null +++ b/compiler/example/output/_rendered_templates/tsm-nexus-gql/graph/schema.graphqls @@ -0,0 +1,167 @@ + + +type root_Root @nexus(group:"root.tsm.tanzu.vmware.com",version:"v1",kind:"Root",resource:"roots",name:"Root",crdName:"roots.root.tsm.tanzu.vmware.com"){ + id: ID + config: config_Config +} + +type config_Config @nexus(group:"config.tsm.tanzu.vmware.com",version:"v1",kind:"Config",resource:"configs",name:"Config",crdName:"configs.config.tsm.tanzu.vmware.com"){ + id: ID + QueryExample( + StartTime: String + EndTime: String + Interval: String + IsServiceDeployment: Boolean + StartVal: Int + ): NexusGraphqlResponse + gNS: gns_Gns + dNS: gns_Dns + vMPPolicies: policypkg_VMpolicy + aCPPolicies(id: ID): [policypkg_AccessControlPolicy!] @relation(softlink: "true") + domain: config_Domain + fooExample(id: ID): [config_FooTypeABC!] + svcGrpInfo: servicegroup_SvcGroupLinkInfo + myStr0: String + myStr2: String + xYZPort: String @jsonencoded(gofile:"model.go", name:"Port", goname:"nexus_gns.Port") + clusterNamespaces: [] + testValMarkers: String @jsonencoded(gofile:"model.go", name:"TestValMarkers", goname:"nexus_config.TestValMarkers") + instance: Float + cuOption: String +} + +type config_FooTypeABC @nexus(group:"config.tsm.tanzu.vmware.com",version:"v1",kind:"FooTypeABC",resource:"footypeabcs",name:"FooTypeABC",crdName:"footypeabcs.config.tsm.tanzu.vmware.com"){ + id: ID + fooA: String @jsonencoded(gofile:"model.go", name:"AMap", goname:"nexus_config.AMap") + fooB: String @jsonencoded(gofile:"model.go", name:"BArray", goname:"nexus_config.BArray") + fooD: String @jsonencoded(gofile:"model.go", name:"DFloat", goname:"nexus_config.DFloat") + fooF: String @jsonencoded(gofile:"model.go", name:"DFloat", goname:"nexus_config.DFloat") +} + +type config_Domain @nexus(group:"config.tsm.tanzu.vmware.com",version:"v1",kind:"Domain",resource:"domains",name:"Domain",crdName:"domains.config.tsm.tanzu.vmware.com"){ + id: ID + pointPort: String + pointString: String + pointInt: Int + pointMap: String + pointSlice: String + sliceOfPoints: [String] + sliceOfArrPoints: [] + mapOfArrsPoints: String + pointStruct: String +} + +type gns_RandomGnsData @nexus(group:"gns.tsm.tanzu.vmware.com",version:"v1",kind:"RandomGnsData",resource:"randomgnsdatas",name:"RandomGnsData",crdName:"randomgnsdatas.gns.tsm.tanzu.vmware.com"){ + id: ID + description: String @jsonencoded(gofile:"model.go", name:"RandomDescription", goname:"nexus_gns.RandomDescription") +} + +type gns_Gns @nexus(group:"gns.tsm.tanzu.vmware.com",version:"v1",kind:"Gns",resource:"gnses",name:"Gns",crdName:"gnses.gns.tsm.tanzu.vmware.com"){ + id: ID + queryGns1( + StartTime: String + EndTime: String + Interval: String + IsServiceDeployment: Boolean + StartVal: Int + ): NexusGraphqlResponse + queryGnsQM1: TimeSeriesData @timeseriesAPI(file: "../../tsquery/timeSeriesQuery", handler: "queryGnsQM1") + queryGnsQM( + StartTime: String + EndTime: String + TimeInterval: String + SomeUserArg1: String + SomeUserArg2: Int + SomeUserArg3: Boolean + ): TimeSeriesData @timeseriesAPI(file: "../../tsquery/timeSeriesQuery", handler: "queryGnsQM") + gnsAccessControlPolicy: String + fooChild: String + domain: String + useSharedGateway: Boolean + description: String @jsonencoded(gofile:"model.go", name:"Description", goname:"nexus_gns.Description") + meta: String + port: Int + otherDescription: String + mapPointer: String + slicePointer: String + workloadSpec: String @jsonencoded(gofile:"model.go", name:"WorkloadSpec") + differentSpec: String + serviceSegmentRef: String @jsonencoded(gofile:"model.go", name:"ServiceSegmentRef", goname:"nexus_gns.ServiceSegmentRef") + serviceSegmentRefPointer: String + serviceSegmentRefs: [] + serviceSegmentRefMap: String +} + +type gns_BarChild @nexus(group:"gns.tsm.tanzu.vmware.com",version:"v1",kind:"BarChild",resource:"barchilds",name:"BarChild",crdName:"barchilds.gns.tsm.tanzu.vmware.com"){ + id: ID + name: String +} + +type gns_IgnoreChild @nexus(group:"gns.tsm.tanzu.vmware.com",version:"v1",kind:"IgnoreChild",resource:"ignorechilds",name:"IgnoreChild",crdName:"ignorechilds.gns.tsm.tanzu.vmware.com"){ + id: ID + name: String +} + +type gns_Dns @nexus(group:"gns.tsm.tanzu.vmware.com",version:"v1",kind:"Dns",resource:"dnses",name:"Dns",crdName:"dnses.gns.tsm.tanzu.vmware.com"){ + id: ID +} + +type gns_AdditionalGnsData @nexus(group:"gns.tsm.tanzu.vmware.com",version:"v1",kind:"AdditionalGnsData",resource:"additionalgnsdatas",name:"AdditionalGnsData",crdName:"additionalgnsdatas.gns.tsm.tanzu.vmware.com"){ + id: ID + description: String @jsonencoded(gofile:"model.go", name:"AdditionalDescription", goname:"nexus_gns.AdditionalDescription") +} + +type servicegroup_SvcGroupLinkInfo @nexus(group:"servicegroup.tsm.tanzu.vmware.com",version:"v1",kind:"SvcGroupLinkInfo",resource:"svcgrouplinkinfos",name:"SvcGroupLinkInfo",crdName:"svcgrouplinkinfos.servicegroup.tsm.tanzu.vmware.com"){ + id: ID + clusterName: String + domainName: String + serviceName: String + serviceType: String +} + +type policypkg_AdditionalPolicyData @nexus(group:"policypkg.tsm.tanzu.vmware.com",version:"v1",kind:"AdditionalPolicyData",resource:"additionalpolicydatas",name:"AdditionalPolicyData",crdName:"additionalpolicydatas.policypkg.tsm.tanzu.vmware.com"){ + id: ID + description: String @jsonencoded(gofile:"model.go", name:"AdditionalDescription", goname:"nexus_policy.AdditionalDescription") +} + +type policypkg_AccessControlPolicy @nexus(group:"policypkg.tsm.tanzu.vmware.com",version:"v1",kind:"AccessControlPolicy",resource:"accesscontrolpolicies",name:"AccessControlPolicy",crdName:"accesscontrolpolicies.policypkg.tsm.tanzu.vmware.com"){ + id: ID + policyConfigs(id: ID): [policypkg_ACPConfig!] +} + +type policypkg_ACPConfig @nexus(group:"policypkg.tsm.tanzu.vmware.com",version:"v1",kind:"ACPConfig",resource:"acpconfigs",name:"ACPConfig",crdName:"acpconfigs.policypkg.tsm.tanzu.vmware.com"){ + id: ID + destSvcGroups(id: ID): [servicegroup_SvcGroup!] @relation(softlink: "true") + sourceSvcGroups(id: ID): [servicegroup_SvcGroup!] @relation(softlink: "true") + displayName: String + gns: String + description: String + tags: [String] + projectId: String + conditions: [String] +} + +type policypkg_VMpolicy @nexus(group:"policypkg.tsm.tanzu.vmware.com",version:"v1",kind:"VMpolicy",resource:"vmpolicies",name:"VMpolicy",crdName:"vmpolicies.policypkg.tsm.tanzu.vmware.com"){ + id: ID + queryGns1( + StartTime: String + EndTime: String + Interval: String + IsServiceDeployment: Boolean + StartVal: Int + ): NexusGraphqlResponse + queryGnsQM1: TimeSeriesData @timeseriesAPI(file: "../../tsquery/timeSeriesQuery", handler: "queryGnsQM1") + queryGnsQM( + StartTime: String + EndTime: String + TimeInterval: String + SomeUserArg1: String + SomeUserArg2: Int + SomeUserArg3: Boolean + ): TimeSeriesData @timeseriesAPI(file: "../../tsquery/timeSeriesQuery", handler: "queryGnsQM") +} + +type policypkg_RandomPolicyData @nexus(group:"policypkg.tsm.tanzu.vmware.com",version:"v1",kind:"RandomPolicyData",resource:"randompolicydatas",name:"RandomPolicyData",crdName:"randompolicydatas.policypkg.tsm.tanzu.vmware.com"){ + id: ID + description: String @jsonencoded(gofile:"model.go", name:"RandomDescription", goname:"nexus_policy.RandomDescription") +} diff --git a/compiler/example/test-utils/output-group-name-with-hyphen-datamodel/crd_generated/tsm-nexus-gql/graph/schema.graphqls b/compiler/example/test-utils/output-group-name-with-hyphen-datamodel/crd_generated/tsm-nexus-gql/graph/schema.graphqls new file mode 100644 index 000000000..f4a368413 --- /dev/null +++ b/compiler/example/test-utils/output-group-name-with-hyphen-datamodel/crd_generated/tsm-nexus-gql/graph/schema.graphqls @@ -0,0 +1,37 @@ +schema { + query: Root +} + +type config_Config { + id: ID + fieldX: String + fieldY: Int + myStructField: String +} + +type project_Project { + id: ID + config: _Config + key: String + field1: String + field2: Int +} + +type root_Root { + id: ID + project: _Project + someRootData: String +} + +directive @jsonencoded(file: String, gofile: String, name: String) on FIELD_DEFINITION +directive @relation(name: String, parameters: String, softlink: String, uuidkey: String) on FIELD_DEFINITION +directive @timeseriesAPI(file: String!, handler: String!) on FIELD_DEFINITION +directive @protobuf(file: String!, name: String!) on FIELD_DEFINITION + +type TimeSeriesData { + Code: Int + Message: String + Data: String + Last: String + TotalRecords: Int +} diff --git a/compiler/go.mod b/compiler/go.mod index 7340c0a3d..4de5e9876 100644 --- a/compiler/go.mod +++ b/compiler/go.mod @@ -3,11 +3,15 @@ module github.com/vmware-tanzu/graph-framework-for-microservices/compiler go 1.17 require ( + github.com/elliotchance/orderedmap v1.5.0 github.com/fatih/structtag v1.2.0 github.com/ghodss/yaml v1.0.0 github.com/gogo/protobuf v1.3.2 + github.com/golang/protobuf v1.5.2 github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.20.2 + github.com/onsi/gomega v1.23.0 + github.com/otiai10/copy v1.9.0 + github.com/rs/cors v1.8.3 github.com/sirupsen/logrus v1.8.1 github.com/vmware-tanzu/graph-framework-for-microservices/common-library v0.0.0-20221129104902-06818e531062 github.com/vmware-tanzu/graph-framework-for-microservices/kube-openapi v0.0.0-20220603123335-7416bd4754d3 @@ -16,7 +20,10 @@ require ( golang.org/x/text v0.7.0 golang.org/x/tools v0.1.12 k8s.io/apiextensions-apiserver v0.24.0 + k8s.io/apimachinery v0.26.0 + k8s.io/client-go v0.24.0 k8s.io/gengo v0.0.0-20220307231824-4627b89bbf1b + k8s.io/utils v0.0.0-20221107191617-1a15be271d1d ) require ( @@ -27,7 +34,6 @@ require ( github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.21.1 // indirect - github.com/golang/protobuf v1.5.2 // indirect github.com/gonvenience/bunt v1.3.4 // indirect github.com/gonvenience/neat v1.3.11 // indirect github.com/gonvenience/term v1.0.2 // indirect @@ -37,6 +43,8 @@ require ( github.com/google/gnostic v0.6.9 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/homeport/dyff v1.5.6 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -46,8 +54,10 @@ require ( github.com/mattn/go-isatty v0.0.16 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect github.com/mitchellh/hashstructure v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/sergi/go-diff v1.2.0 // indirect github.com/texttheater/golang-levenshtein v1.0.1 // indirect @@ -56,17 +66,17 @@ require ( golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde // indirect golang.org/x/sys v0.5.0 // indirect golang.org/x/term v0.5.0 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apimachinery v0.24.0 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect + k8s.io/klog/v2 v2.80.1 // indirect + k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect + sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) replace github.com/vmware-tanzu/graph-framework-for-microservices/kube-openapi => ../kube-openapi diff --git a/compiler/go.sum b/compiler/go.sum index 6074a1f84..049ec93ea 100644 --- a/compiler/go.sum +++ b/compiler/go.sum @@ -18,24 +18,160 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -94,6 +230,7 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= @@ -107,6 +244,7 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -118,6 +256,7 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elliotchance/orderedmap v1.5.0 h1:1IsExUsjv5XNBD3ZdC7jkAAqLWOOKdbPTmkHx63OsBg= github.com/elliotchance/orderedmap v1.5.0/go.mod h1:wsDwEaX5jEoyhbs7x93zk2H/qv0zwuhg4inXhDkYqys= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -131,7 +270,9 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= @@ -218,6 +359,7 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gonvenience/bunt v1.3.2/go.mod h1:oTOZqb1TVL1KqZm57zUCJCiwUliNfY8+d3QndOVqxpg= github.com/gonvenience/bunt v1.3.3/go.mod h1:XjlODZ8sTL9jQs9c4Kj1ZBTrHSsbUGdoRy7ROCtw8nU= github.com/gonvenience/bunt v1.3.4 h1:Row599Ohja2BPooaqd1tHYdTAKu6SWq7W/UeakTXddM= @@ -255,6 +397,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -265,6 +409,7 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -277,15 +422,29 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= @@ -307,6 +466,7 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= @@ -379,6 +539,7 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= @@ -390,6 +551,7 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -413,8 +575,10 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042 github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= -github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= +github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs= +github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -426,9 +590,19 @@ github.com/onsi/gomega v1.18.0/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5h github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= -github.com/onsi/gomega v1.20.2 h1:8uQq0zMgLEfa0vRrrBgaJF2gyW9Da9BmfGV+OyUzfkY= github.com/onsi/gomega v1.20.2/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= +github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys= +github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/otiai10/copy v1.9.0 h1:7KFNiCgZ91Ru4qW4CWPf/7jqtxLagGRmIxWldPP9VY4= +github.com/otiai10/copy v1.9.0/go.mod h1:hsfX19wcn0UWIHUQ3/4fHuehhk2UyArQ9dVFAn3FczI= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.4.0 h1:umwcf7gbpEwf7WFzqmWwSv0CzbeMsae2u9ZvpP8j2q4= +github.com/otiai10/mint v1.4.0/go.mod h1:gifjb2MYOoULtKLqUAEILUG/9KONW6f7YsJ6vQLTlFI= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -467,6 +641,8 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= +github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -580,6 +756,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -618,6 +795,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -662,6 +841,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -670,6 +850,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= @@ -686,7 +868,18 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 h1:lxqLZaMad/dJHMFZH0NiNpiEZI/nhgWhe4wgzpE+MuA= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -698,6 +891,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc= golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -759,20 +953,36 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -796,6 +1006,7 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -855,15 +1066,22 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -885,12 +1103,39 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -934,10 +1179,68 @@ google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55 h1:U1u4KB2kx6KR/aJDjQ97hZ15wQs8ZPvDcGcRynBhkvg= +google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55/go.mod h1:45EK0dUbEZ2NHjCeAd2LXmyjAgGUGrpGROgjhC3ADck= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -958,9 +1261,24 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -974,8 +1292,9 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1017,12 +1336,18 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +istio.io/api v0.0.0-20221222163824-3417dfab291b h1:wzdw9dsRO+djEP7wAa75ktLDvgEG5jraECZB5n7zfwg= +istio.io/api v0.0.0-20221222163824-3417dfab291b/go.mod h1:+IPBhFYUZBqH7ATQoxMCu1MGEbtQ+C29exvSGYGOWpI= k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= +k8s.io/api v0.26.0 h1:IpPlZnxBpV1xl7TGk/X6lFtpgjgntCg8PJ+qrPHAC7I= +k8s.io/api v0.26.0/go.mod h1:k6HDTaIFC8yn1i6pSClSqIwLABIcLV9l5Q4EcngKnQg= k8s.io/apiextensions-apiserver v0.24.0 h1:JfgFqbA8gKJ/uDT++feAqk9jBIwNnL9YGdQvaI9DLtY= k8s.io/apiextensions-apiserver v0.24.0/go.mod h1:iuVe4aEpe6827lvO6yWQVxiPSpPoSKVjkq+MIdg84cM= -k8s.io/apimachinery v0.24.0 h1:ydFCyC/DjCvFCHK5OPMKBlxayQytB8pxy8YQInd5UyQ= k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apimachinery v0.26.0 h1:1feANjElT7MvPqp0JT6F3Ss6TWDwmcjLypwoPpEf7zg= +k8s.io/apimachinery v0.26.0/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu74= k8s.io/apiserver v0.24.0/go.mod h1:WFx2yiOMawnogNToVvUYT9nn1jaIkMKj41ZYCVycsBA= +k8s.io/client-go v0.24.0 h1:lbE4aB1gTHvYFSwm6eD3OF14NhFDKCejlnsGYlSJe5U= k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= @@ -1032,21 +1357,27 @@ k8s.io/gengo v0.0.0-20220307231824-4627b89bbf1b h1:vEhKDJESYfeRiaBNmRvO+/12RAo1c k8s.io/gengo v0.0.0-20220307231824-4627b89bbf1b/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20221107191617-1a15be271d1d h1:0Smp/HP1OH4Rvhe+4B8nWGERtlqAGSftbSbbmm45oFs= +k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/compiler/pkg/generator/generator_test.go b/compiler/pkg/generator/generator_test.go index 28f11d324..a8b77c993 100644 --- a/compiler/pkg/generator/generator_test.go +++ b/compiler/pkg/generator/generator_test.go @@ -52,7 +52,7 @@ var _ = Describe("Template renderers tests", func() { pkg, ok = pkgs["github.com/vmware-tanzu/graph-framework-for-microservices/compiler/example/datamodel/config/gns"] Expect(ok).To(BeTrue()) graphqlQueries := parser.ParseGraphqlQuerySpecs(pkgs) - graph := parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) + graph, _, _ := parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) parentsMap = parser.CreateParentsMap(graph) Expect(parentsMap).To(HaveLen(14)) @@ -203,10 +203,9 @@ var _ = Describe("Template renderers tests", func() { pkgs := parser.ParseDSLPkg(datamodelPath) graphlqQueries := parser.ParseGraphqlQuerySpecs(pkgs) - graph := parser.ParseDSLNodes(datamodelPath, groupName, pkgs, graphlqQueries) + graph, nonNexusTypes, fileset := parser.ParseDSLNodes(datamodelPath, groupName, pkgs, graphlqQueries) methods, codes := rest.ParseResponses(pkgs) - err := generator.RenderCRDTemplate(groupName, crdModulePath, pkgs, graph, - outputDir, methods, codes) + err := generator.RenderCRDTemplate(groupName, crdModulePath, pkgs, graph, outputDir, methods, codes, nonNexusTypes, fileset, nil) Expect(err).NotTo(HaveOccurred()) }) diff --git a/compiler/pkg/generator/graphql_common.go b/compiler/pkg/generator/graphql_common.go index 707befa5c..9887d7dcd 100644 --- a/compiler/pkg/generator/graphql_common.go +++ b/compiler/pkg/generator/graphql_common.go @@ -2,14 +2,20 @@ package generator import ( "fmt" + "go/ast" + "go/types" "strconv" "strings" + "k8s.io/utils/strings/slices" + "golang.org/x/text/cases" "golang.org/x/text/language" log "github.com/sirupsen/logrus" "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/parser" + "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/util" + "github.com/vmware-tanzu/graph-framework-for-microservices/nexus/nexus" ) const ( @@ -25,6 +31,78 @@ const ( ` ) +type ReturnStatement struct { + Alias string + ReturnType string + FieldCount int + CRDName string + ChainAPI string + IsSingleton bool +} + +type FieldProperty struct { + IsResolver bool + IsNexusTypeField bool + IsNexusOrSingletonField bool + IsChildOrLink bool + IsChildrenOrLinks bool + IsMapTypeField bool + IsArrayTypeField bool + IsStdTypeField bool + IsCustomTypeField bool + IsPointerTypeField bool + IsStringType bool + IsArrayStdType bool + IsSingleton bool + PkgName string + NodeName string + FieldName string + FieldType string + FieldTypePkgPath string + ModelType string + SchemaFieldName string + SchemaTypeName string + BaseTypeName string + Alias string + ReturnType string + FieldCount int + CRDName string + ChainAPI string + LinkAPI string +} + +type NodeProperty struct { + IsParentNode bool + HasParent bool + IsSingletonNode bool + IsNexusNode bool + BaseImportPath string + CrdName string + ResolverCount int + PkgName string + NodeName string + SchemaName string + Alias string + ReturnType string + GroupResourceNameTitle string + GroupName string + Singular string + Kind string + ResourceName string + ResourceVersion string + ChildFields []FieldProperty + LinkFields []FieldProperty + ChildrenFields []FieldProperty + LinksFields []FieldProperty + ArrayFields []FieldProperty + CustomFields []FieldProperty + NonStructFields []FieldProperty + GraphqlSchemaFields []FieldProperty + ResolverFields map[string][]FieldProperty + CustomQueries []nexus.GraphQLQuery + GraphQlSpec nexus.GraphQLSpec +} + // Convert go standardType to GraphQL standardType func convertGraphqlStdType(t string) string { // remove pointers @@ -55,6 +133,14 @@ func getPkgName(pkgs parser.Packages, pkgPath string) string { return pkgs[importPath].Name } +func GetPkg(pkgs parser.Packages, pkgPath string) parser.Package { + importPath, err := strconv.Unquote(pkgPath) + if err != nil { + log.Errorf("Failed to parse the package path : %s: %v", pkgPath, err) + } + return pkgs[importPath] +} + func genSchemaResolverName(fn1, fn2 string) (string, string) { return fmt.Sprintf("%s_%s", strings.ToLower(fn1), fn2), cases.Title(language.Und, cases.NoLower).String(fn1) + cases.Title(language.Und, cases.NoLower).String(fn2) } @@ -80,6 +166,44 @@ func ValidateImportPkg(pkgName, typeString string, importMap map[string]string, return genSchemaResolverName(pkgName, typeWithoutPointers) } +func GetNexusSchemaFieldName(GraphQlSpec nexus.GraphQLSpec) string { + name := "id" + value := "ID" + if GraphQlSpec.IdName != "" { + name = GraphQlSpec.IdName + } + if !GraphQlSpec.IdNullable { + value = "ID!" + } + return fmt.Sprintf("%s: %s", name, value) +} + +func GetNodeDetails(pkgName, typeString string, importMap map[string]string, pkgs parser.Packages, gqlSpecMap map[string]nexus.GraphQLSpec) string { + typeWithoutPointers := strings.ReplaceAll(typeString, "*", "") + if strings.Contains(typeWithoutPointers, ".") { + part := strings.Split(typeWithoutPointers, ".") + if val, ok := importMap[part[0]]; ok { + p := GetPkg(pkgs, val) + if val, ok := parser.GetNexusGraphqlSpecAnnotation(p, part[1]); ok { + gqlspec := gqlSpecMap[fmt.Sprintf("%s.%s", p.Name, val)] + return GetNexusSchemaFieldName(gqlspec) + } + } + for _, v := range importMap { + pkgName := getPkgName(pkgs, v) + if pkgName == part[0] { + p := GetPkg(pkgs, v) + if val, ok := parser.GetNexusGraphqlSpecAnnotation(p, part[1]); ok { + gqlspec := gqlSpecMap[fmt.Sprintf("%s.%s", p.Name, val)] + return GetNexusSchemaFieldName(gqlspec) + } + } + } + return fmt.Sprintf("id: ID") + } + return fmt.Sprintf("id: ID") +} + func getBaseNodeType(typeString string) string { if strings.Contains(typeString, ".") { part := strings.Split(typeString, ".") @@ -87,3 +211,284 @@ func getBaseNodeType(typeString string) string { } return typeString } + +func constructNexusTypeMap(nodes []*NodeProperty) map[string]string { + crdNameMap := make(map[string]string) + for _, n := range nodes { + if n.IsNexusNode || n.IsSingletonNode { + crdNameMap[n.CrdName] = n.PkgName + n.NodeName + } + } + return crdNameMap +} + +func findTypeAndPkgForField(ptParts []string, importMap map[string]string, pkgs map[string]parser.Package) (string, *parser.Package) { + structPkg := ptParts[0] + structType := ptParts[1] + + pkgPath, ok := importMap[structPkg] + if !ok { + log.Errorf("Cannot find the package name %s for the type %s", structPkg, structType) + return "", nil + } + + importPath, err := strconv.Unquote(pkgPath) + if err != nil { + log.Errorf("Failed to parse package %s for the type %s with error %v", pkgPath, structType, err) + return "", nil + } + + p, ok := pkgs[importPath] + if !ok { + log.Errorf("Cannot find the package details from the path %s for the type %s", importPath, structType) + return "", nil + } + + return structType, &p +} + +/* +collect and construct type alias field into map recursively before +populating the nexus node and custom struct type +ex. nonStructMap[pkgName] = nodeType --> nonStructMap["root"] = "AliasTypeFoo" +*/ +func constructAliasType(sortedPackages []parser.Package) map[string]string { + nonStructMap := make(map[string]string) + for _, pkg := range sortedPackages { + for _, node := range pkg.GetNonStructTypes() { + pkgName := fmt.Sprintf("%s_%s", pkg.Name, parser.GetTypeName(node)) + // NonStruct Map + nonStructType := types.ExprString(node.Type) + nonStructMap[pkgName] = nonStructType + } + } + + return nonStructMap +} + +func setNexusProperties(nodeHelper parser.NodeHelper, node *ast.TypeSpec, nodeProp *NodeProperty) { + if len(nodeHelper.Parents) > 0 { + nodeProp.HasParent = true + } + + if parser.IsSingletonNode(node) { + nodeProp.IsSingletonNode = true + } + + if parser.IsNexusNode(node) { + nodeProp.IsNexusNode = true + } +} + +// isRootOfGraph intended to allow only one root of the graph, +// if we receive multiple node in such behaviour, then we allow the first node and the rest will be skipped with error +// arg: `parents` indicates the node's parents, `rootOfGraph` indicates if the received node is the root of the graph or not. +func isRootOfGraph(parents []string, rootOfGraph bool) bool { + if len(parents) == 0 && !rootOfGraph { + return true + } + + return rootOfGraph +} + +func getGraphqlSchemaName(pattern, fieldName, schemaType string, f *ast.Field) string { + schemaName := fmt.Sprintf(pattern, fieldName, schemaType) + schemaType = strings.TrimPrefix(schemaType, "global_") + if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_ALIAS_TYPE_ANNOTATION) { + schemaType = parser.GetFieldAnnotationVal(f, parser.GRAPHQL_ALIAS_TYPE_ANNOTATION) + } + if fieldName != "" { + // use camelCase for fieldName #e.g ServiceGroup --> serviceGroup + schemaName = fmt.Sprintf(pattern, getAliasFieldValue(fieldName, f), schemaType) + } + + schemaName = strings.TrimPrefix(schemaName, "global_") + + return schemaName +} + +// func getGraphQLArgs(f *ast.Field) string { +// argKey := "id" +// argVal := "ID" +// k := parser.GetGraphqlArgumentKey(f) +// if k != "" { +// argKey = k +// } +// v := parser.GetGraphqlArgumentValue(f) +// if v != "" { +// argVal = v +// } +// return fmt.Sprintf("%s: %s", argKey, argVal) +// } + +// getTsmGraphqlSchemaFieldName process nexus annotation `nexus-graphql-nullable` and `nexus-graphql-tsm-directive` +func getTsmGraphqlSchemaFieldName(sType GraphQLSchemaType, fieldName, schemaType, listArg string, f *ast.Field, pkg parser.Package, nonNexusTypes *parser.NonNexusTypes) string { + pattern := "" + nullable := parser.IsNexusGraphqlNullField(f) + jsonEncoded := parser.IsJsonStringField(f) + switch sType { + case Standard, JsonMarshal, Child, Link: + if nullable { + pattern = "%s: %s" + } else { + pattern = "%s: %s!" + } + if jsonEncoded { + pattern = "%s: %s" + schemaType = "String" + } + case Array: + if nullable { + pattern = "%s: [%s]" + } else { + pattern = "%s: [%s!]" + } + if jsonEncoded { + pattern = "%s: %s" + schemaType = "String" + } + case NamedChild, NamedLink: + if nullable { + pattern = "%s(" + listArg + "): [%s!]" + } else { + pattern = "%s(" + listArg + "): [%s]" + } + if jsonEncoded { + pattern = "%s(" + listArg + "): %s" + schemaType = "String" + } + } + schemaName := getGraphqlSchemaName(pattern, fieldName, schemaType, f) + + if sType == AliasType { + e := parser.GetFieldAnnotationVal(f, parser.GRAPHQL_ALIAS_TYPE_ANNOTATION) + if e != "" { + schemaName = fmt.Sprintf("%s: %s", getAliasFieldValue(fieldName, f), e) + } else { + schemaName = fmt.Sprintf("%s: %s", getAliasFieldValue(fieldName, f), "String") + } + } + + schemaName = addFieldAnnotations(pkg, f, schemaName, sType, nonNexusTypes) + + return schemaName +} + +func addFieldAnnotations(pkg parser.Package, f *ast.Field, schemaName string, sType GraphQLSchemaType, nonNexusTypes *parser.NonNexusTypes) string { + importMap := pkg.GetImportMap() + // add jsonencoded annotation + if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_TSM_DIRECTIVE_ANNOTATION) { + replacer := strings.NewReplacer("nexus-graphql-tsm-directive:", "", "\\", "") + out := replacer.Replace(parser.GetFieldAnnotationString(f, parser.GRAPHQL_TSM_DIRECTIVE_ANNOTATION)) + schemaName += " " + strings.Trim(out, "\"") + } else if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_PROTOBUF_NAME) || + parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_PROTOBUF_FILE) { + schemaName = addProtobufAnnotation(f, schemaName) + } else { + if sType != Link && sType != Child && sType != NamedChild && sType != NamedLink { + if val, ok := f.Type.(*ast.SelectorExpr); ok { + x := types.ExprString(val.X) + if imp, ok := importMap[x]; ok { + if strings.HasPrefix(imp, fmt.Sprintf(`"%s`, pkg.ModPath)) { + schemaName = addJsonencodedAnnotation(f, parser.GRAPHQL_TS_TYPE_ANNOTATION, x, val.Sel.Name, schemaName, false, imp) + } else { + if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_TYPE_NAME) { + typeName := parser.GetFieldAnnotationVal(f, parser.GRAPHQL_TYPE_NAME) + externalType := fmt.Sprintf("%s.%s", x, val.Sel.Name) + aliasType := fmt.Sprintf("type %s %s", typeName, externalType) + if !slices.Contains(nonNexusTypes.ExternalTypes, aliasType) { + nonNexusTypes.ExternalTypes = append(nonNexusTypes.ExternalTypes, aliasType) + } + schemaName = addJsonencodedAnnotation(f, parser.GRAPHQL_TS_TYPE_ANNOTATION, x, typeName, schemaName, true, imp) + } else { + schemaName = addJsonencodedAnnotation(f, parser.GRAPHQL_TS_TYPE_ANNOTATION, x, val.Sel.Name, schemaName, true, imp) + } + } + } + } else if val, ok := f.Type.(*ast.Ident); ok && convertGraphqlStdType(val.Name) == "" { + x := "" + importExpr := "" + if pkg.Name != "global" { + x = pkg.Name + importExpr = fmt.Sprintf(`"%s"`, pkg.FullName) + } + schemaName = addJsonencodedAnnotation(f, parser.GRAPHQL_TS_TYPE_ANNOTATION, x, val.Name, schemaName, false, importExpr) + } else if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_JSONENCODED_ANNOTATION) { + schemaName += " @jsonencoded" + } + } + + schemaName = addRelationAnnotation(sType, f, schemaName) + } + + return schemaName +} + +func addJsonencodedAnnotation(f *ast.Field, annotation parser.FieldAnnotation, x string, name string, schemaName string, external bool, importExpr string) string { + args := []string{`gofile:"model.go"`, fmt.Sprintf(`name:"%s"`, name)} + + if parser.IsFieldAnnotationPresent(f, annotation) { + args = append(args, fmt.Sprintf(`file:"%s"`, parser.GetFieldAnnotationVal(f, annotation))) + } + + if !external && x != "" { + importStr := strings.Trim(importExpr, "\"") + namedImport := "nexus_" + importStr[strings.LastIndex(importStr, "/")+1:] + args = append(args, fmt.Sprintf(`goname:"%s.%s"`, namedImport, name)) + } + + schemaName += fmt.Sprintf(" @jsonencoded(%s)", strings.Join(args, ", ")) + + return schemaName +} + +func addRelationAnnotation(sType GraphQLSchemaType, f *ast.Field, schemaName string) string { + var args []string + if sType == Link || sType == NamedLink { + args = append(args, `softlink: "true"`) + } + if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_RELATION_NAME) { + args = append(args, fmt.Sprintf(`name:"%s"`, parser.GetFieldAnnotationVal(f, parser.GRAPHQL_RELATION_NAME))) + } + + if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_RELATION_PARAMETERS) { + args = append(args, fmt.Sprintf("parameters:%s", parser.GetFieldAnnotationVal(f, parser.GRAPHQL_RELATION_PARAMETERS))) + } + + if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_RELATION_UUIDKEY) { + args = append(args, fmt.Sprintf(`uuidkey:"%s"`, parser.GetFieldAnnotationVal(f, parser.GRAPHQL_RELATION_UUIDKEY))) + } + + if len(args) > 0 { + schemaName += fmt.Sprintf(" @relation(%s)", strings.Join(args, ", ")) + } + + return schemaName +} + +func addProtobufAnnotation(f *ast.Field, schemaName string) string { + var args []string + + if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_PROTOBUF_NAME) { + args = append(args, fmt.Sprintf(`name:"%s"`, parser.GetFieldAnnotationVal(f, parser.GRAPHQL_PROTOBUF_NAME))) + } + + if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_PROTOBUF_FILE) { + args = append(args, fmt.Sprintf(`file:"%s"`, parser.GetFieldAnnotationVal(f, parser.GRAPHQL_PROTOBUF_FILE))) + } + + if len(args) > 0 { + schemaName += fmt.Sprintf(" @protobuf(%s)", strings.Join(args, ", ")) + } + + return schemaName +} + +// getAliasFieldValue process nexus annotation `nexus-alias-value:` +func getAliasFieldValue(fieldName string, f *ast.Field) string { + e := parser.GetFieldAnnotationVal(f, parser.GRAPHQL_ALIAS_NAME_ANNOTATION) + if e != "" { + return e + } + return util.GetTag(fieldName) +} diff --git a/compiler/pkg/generator/graphql_custom_query_generator.go b/compiler/pkg/generator/graphql_custom_query_generator.go index cba5336af..f89dcd4d8 100644 --- a/compiler/pkg/generator/graphql_custom_query_generator.go +++ b/compiler/pkg/generator/graphql_custom_query_generator.go @@ -17,6 +17,10 @@ func CustomQueryToGraphqlSchema(query nexus.GraphQLQuery) string { args = "(\n" for _, arg := range argsList { graphqlType := convertGraphqlStdType(arg.Type) + // AliasType is to over write arg type with annotation `nexus-alias-type:""` + if arg.AliasType { + graphqlType = arg.Type + } if graphqlType == "" { log.Fatalf("Failed to convert type %s to graphql types, supported types are: "+ "string, bool, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, "+ @@ -38,5 +42,5 @@ func CustomQueryToGraphqlSchema(query nexus.GraphQLQuery) string { log.Fatalf("Wrong Api Type of Graphql custom query") } - return fmt.Sprintf(" %s"+args+": "+returnType+"\n", query.Name) + return fmt.Sprintf(" %s"+args+": "+returnType, query.Name) } diff --git a/compiler/pkg/generator/graphql_custom_query_generator_test.go b/compiler/pkg/generator/graphql_custom_query_generator_test.go index 2d17a27fc..dde507587 100644 --- a/compiler/pkg/generator/graphql_custom_query_generator_test.go +++ b/compiler/pkg/generator/graphql_custom_query_generator_test.go @@ -17,7 +17,7 @@ var _ = Describe("Graphql Custom query generator tests", func() { BeforeEach(func() { pkgs = parser.ParseDSLPkg(exampleDSLPath) graphqlQueries := parser.ParseGraphqlQuerySpecs(pkgs) - graph := parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) + graph, _, _ := parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) root, ok := graph["roots.root.tsm.tanzu.vmware.com"] Expect(ok).To(BeTrue()) config, ok := root.SingleChildren["Config"] @@ -27,7 +27,7 @@ var _ = Describe("Graphql Custom query generator tests", func() { }) It("should translate graphql query spec to schema", func() { - schema := generator.CustomQueryToGraphqlSchema(gns.GraphqlSpec.Queries[0]) + schema := generator.CustomQueryToGraphqlSchema(gns.GraphqlQuerySpec.Queries[0]) Expect(schema).To(Equal(` queryGns1( StartTime: String EndTime: String @@ -36,7 +36,7 @@ var _ = Describe("Graphql Custom query generator tests", func() { StartVal: Int ): NexusGraphqlResponse `)) - schema = generator.CustomQueryToGraphqlSchema(gns.GraphqlSpec.Queries[1]) + schema = generator.CustomQueryToGraphqlSchema(gns.GraphqlQuerySpec.Queries[1]) Expect(schema).To(Equal(` queryGnsQM1: TimeSeriesData `)) }) diff --git a/compiler/pkg/generator/resolver_generator.go b/compiler/pkg/generator/resolver_generator.go index fa0824c6e..3475eb726 100644 --- a/compiler/pkg/generator/resolver_generator.go +++ b/compiler/pkg/generator/resolver_generator.go @@ -3,84 +3,15 @@ package generator import ( "fmt" "go/ast" - "go/types" "sort" - "strconv" "strings" log "github.com/sirupsen/logrus" "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/parser" "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/util" - "github.com/vmware-tanzu/graph-framework-for-microservices/nexus/nexus" ) -type ReturnStatement struct { - Alias string - ReturnType string - FieldCount int - CRDName string - ChainAPI string - IsSingleton bool -} - -type FieldProperty struct { - IsResolver bool - IsNexusTypeField bool - IsNexusOrSingletonField bool - IsChildOrLink bool - IsChildrenOrLinks bool - IsMapTypeField bool - IsArrayTypeField bool - IsStdTypeField bool - IsCustomTypeField bool - IsPointerTypeField bool - IsStringType bool - IsArrayStdType bool - IsSingleton bool - PkgName string - NodeName string - FieldName string - FieldType string - FieldTypePkgPath string - ModelType string - SchemaFieldName string - SchemaTypeName string - BaseTypeName string - Alias string - ReturnType string - FieldCount int - CRDName string - ChainAPI string - LinkAPI string -} - -type NodeProperty struct { - IsParentNode bool - HasParent bool - IsSingletonNode bool - IsNexusNode bool - BaseImportPath string - CrdName string - ResolverCount int - PkgName string - NodeName string - SchemaName string - Alias string - ReturnType string - GroupResourceNameTitle string - ChildFields []FieldProperty - LinkFields []FieldProperty - ChildrenFields []FieldProperty - LinksFields []FieldProperty - ArrayFields []FieldProperty - CustomFields []FieldProperty - NonStructFields []FieldProperty - GraphqlSchemaFields []FieldProperty - ResolverFields map[string][]FieldProperty - CustomQueries []nexus.GraphQLQuery -} - // populateValuesForEachNode populates each node with required resolver properties func populateValuesForEachNode(nodes []*NodeProperty, linkAPI map[string]string, retMap map[string]ReturnStatement) []NodeProperty { var nodeProperties []NodeProperty @@ -259,16 +190,6 @@ func populateValuesForResolver(nodes []*NodeProperty, parentsMap map[string]pars return linkAPI, retMap } -func constructNexusTypeMap(nodes []*NodeProperty) map[string]string { - crdNameMap := make(map[string]string) - for _, n := range nodes { - if n.IsNexusNode || n.IsSingletonNode { - crdNameMap[n.CrdName] = n.PkgName + n.NodeName - } - } - return crdNameMap -} - // processNonNexusFields process and populates properties for each non nexus fields // func processNonNexusFields(aliasNameMap map[string]string, node *ast.TypeSpec, @@ -317,38 +238,6 @@ func processNonNexusFields(aliasNameMap map[string]string, node *ast.TypeSpec, } } -func findTypeAndPkgForField(ptParts []string, importMap map[string]string, pkgs map[string]parser.Package) (string, *parser.Package) { - structPkg := ptParts[0] - structType := ptParts[1] - - // if the import path has alias name, it is resolved - importPath, ok := importMap[structPkg] - if !ok { - // when pkg and directory names are different and no alias name provided, - // try to resolve by package name - for _, path := range importMap { - pkgName := getPkgName(pkgs, path) - if pkgName == structPkg { - importPath = path - } - } - } - - pkgPath, err := strconv.Unquote(importPath) - if err != nil { - log.Errorf("Failed to parse package %s for the type %s with error %v", pkgPath, structType, err) - return "", nil - } - - p, ok := pkgs[pkgPath] - if !ok { - log.Errorf("Cannot find the package details from the path %s for the type %s", importPath, structType) - return "", nil - } - - return structType, &p -} - // SkipSecretSpecAnnotation checks if the field has nexus secrets annotated on them // If yes, the field is skipped in the response. func SkipSecretSpecAnnotation(fieldName, nfType string, pkg parser.Package, importMap map[string]string, pkgs map[string]parser.Package) bool { @@ -477,50 +366,6 @@ func processNexusFields(pkg parser.Package, aliasNameMap map[string]string, node } } -/* -collect and construct type alias field into map recursively before -populating the nexus node and custom struct type -ex. nonStructMap[pkgName] = nodeType --> nonStructMap["root"] = "AliasTypeFoo" -*/ -func constructAliasType(sortedPackages []parser.Package) map[string]string { - nonStructMap := make(map[string]string) - for _, pkg := range sortedPackages { - for _, node := range pkg.GetNonStructTypes() { - pkgName := fmt.Sprintf("%s_%s", pkg.Name, parser.GetTypeName(node)) - // NonStruct Map - nonStructType := types.ExprString(node.Type) - nonStructMap[pkgName] = nonStructType - } - } - - return nonStructMap -} - -func setNexusProperties(nodeHelper parser.NodeHelper, node *ast.TypeSpec, nodeProp *NodeProperty) { - if len(nodeHelper.Parents) > 0 { - nodeProp.HasParent = true - } - - if parser.IsSingletonNode(node) { - nodeProp.IsSingletonNode = true - } - - if parser.IsNexusNode(node) { - nodeProp.IsNexusNode = true - } -} - -// isRootOfGraph intended to allow only one root of the graph, -// if we receive multiple node in such behaviour, then we allow the first node and the rest will be skipped with error -// arg: `parents` indicates the node's parents, `rootOfGraph` indicates if the received node is the root of the graph or not. -func isRootOfGraph(parents []string, rootOfGraph bool) bool { - if len(parents) == 0 && !rootOfGraph { - return true - } - - return rootOfGraph -} - // GenerateGraphqlResolverVars populates the node and its field properties required to generate graphql resolver func GenerateGraphqlResolverVars(baseGroupName, crdModulePath string, pkgs parser.Packages, parentsMap map[string]parser.NodeHelper) ([]NodeProperty, error) { sortedKeys := make([]string, 0, len(pkgs)) @@ -561,7 +406,7 @@ func GenerateGraphqlResolverVars(baseGroupName, crdModulePath string, pkgs parse nodeProp.CrdName = util.GetCrdName(node.Name.String(), pkg.Name, baseGroupName) nodeHelper := parentsMap[nodeProp.CrdName] nodeProp.IsParentNode = parser.IsNexusNode(node) - nodeProp.CustomQueries = nodeHelper.GraphqlSpec.Queries + nodeProp.CustomQueries = nodeHelper.GraphqlQuerySpec.Queries if parser.IsNexusNode(node) && len(nodeHelper.Parents) == 0 && rootOfGraph { log.Errorf("Can't allow multiple root of the graph, skipping Node:%s", nodeProp.NodeName) diff --git a/compiler/pkg/generator/resolver_generator_test.go b/compiler/pkg/generator/resolver_generator_test.go index 5490e2302..03c8cd7c7 100644 --- a/compiler/pkg/generator/resolver_generator_test.go +++ b/compiler/pkg/generator/resolver_generator_test.go @@ -21,7 +21,7 @@ var _ = Describe("Template renderers tests", func() { config.ConfigInstance.IgnoredDirs = []string{"ignored"} pkgs = parser.ParseDSLPkg(exampleDSLPath) graphqlQueries = parser.ParseGraphqlQuerySpecs(pkgs) - graph := parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) + graph, _, _ := parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) parentsMap = parser.CreateParentsMap(graph) }) @@ -53,7 +53,7 @@ var _ = Describe("Template renderers tests", func() { It("should resolve non-singleton root and singleton child node", func() { pkgs = parser.ParseDSLPkg("../../example/test-utils/non-singleton-root") - graph := parser.ParseDSLNodes("../../example/test-utils/non-singleton-root", baseGroupName, pkgs, graphqlQueries) + graph, _, _ := parser.ParseDSLNodes("../../example/test-utils/non-singleton-root", baseGroupName, pkgs, graphqlQueries) parentsMap = parser.CreateParentsMap(graph) vars, err := generator.GenerateGraphqlResolverVars(baseGroupName, crdModulePath, pkgs, parentsMap) diff --git a/compiler/pkg/generator/template/graphql/graphqlResolver.go.tmpl b/compiler/pkg/generator/template/graphql/graphqlResolver.go.tmpl index 1e99f8178..166f139de 100644 --- a/compiler/pkg/generator/template/graphql/graphqlResolver.go.tmpl +++ b/compiler/pkg/generator/template/graphql/graphqlResolver.go.tmpl @@ -27,6 +27,16 @@ func getParentName(parentLabels map[string]interface{}, key string) string { return "" } +type NodeMetricTypeEnum string +type ServiceMetricTypeEnum string +type ServiceGroupByEnum string +type HTTPMethodEnum string +type EventSeverityEnum string +type AnalyticsMetricEnum string +type AnalyticsSubMetricEnum string +type TrafficDirectionEnum string +type SloDetailsEnum string + ////////////////////////////////////// // Nexus K8sAPIEndpointConfig ////////////////////////////////////// @@ -135,7 +145,7 @@ func getRootResolver(id *string) ([]*model.{{$node.PkgName}}{{$node.NodeName}}, {{ end }}{{end}} {{- range $key, $query := $node.CustomQueries }} // Custom query -func get{{$node.PkgName}}{{$node.NodeName}}{{$query.Name}}Resolver(obj *model.{{$node.PkgName}}{{$node.NodeName}}, {{ range $key, $arg := $query.Args }} {{$arg.Name}} *{{$arg.Type}}, {{ end }}) ({{- if eq $query.ApiType 0 }}*model.NexusGraphqlResponse{{- else if eq $query.ApiType 1 }}*model.TimeSeriesData {{- end}}, error) { +func get{{$node.PkgName}}{{$node.NodeName}}{{$query.Name}}Resolver(obj *model.{{$node.PkgName}}{{$node.NodeName}}, {{ range $key, $arg := $query.Args }} {{- if $arg.AliasType }} {{$arg.Name}} *model.{{$arg.Type}}, {{- else }} {{$arg.Name}} *{{$arg.Type}}, {{- end}}{{ end }}) ({{- if eq $query.ApiType 0 }}*model.NexusGraphqlResponse{{- else if eq $query.ApiType 1 }}*model.TimeSeriesData {{- end}}, error) { parentLabels := make(map[string]string) if obj != nil { for k, v := range obj.ParentLabels { diff --git a/compiler/pkg/generator/template/graphql/schema.graphqls.tmpl b/compiler/pkg/generator/template/graphql/schema.graphqls.tmpl index a614e1956..755cc8dd0 100644 --- a/compiler/pkg/generator/template/graphql/schema.graphqls.tmpl +++ b/compiler/pkg/generator/template/graphql/schema.graphqls.tmpl @@ -35,3 +35,14 @@ type TimeSeriesData { Last: String TotalRecords: Int } + +{{- range $key, $val := .GraphQlFiles}} + {{- if eq $key "_tsm_temp/global/common/enums.graphql" }} + {{ $val }} + {{- else}}{{ end }} +{{- end }} + +directive @jsonencoded(file: String, gofile: String, name: String) on FIELD_DEFINITION +directive @relation(name: String, parameters: String, softlink: String, uuidkey: String) on FIELD_DEFINITION +directive @timeseriesAPI(file: String!, handler: String!) on FIELD_DEFINITION +directive @protobuf(file: String!, name: String!) on FIELD_DEFINITION diff --git a/compiler/pkg/generator/template/model.go.tmpl b/compiler/pkg/generator/template/model.go.tmpl new file mode 100644 index 000000000..8fc992aa7 --- /dev/null +++ b/compiler/pkg/generator/template/model.go.tmpl @@ -0,0 +1 @@ +{{.Types}} \ No newline at end of file diff --git a/compiler/pkg/generator/template/tsm-graphql/schema.graphqls.tmpl b/compiler/pkg/generator/template/tsm-graphql/schema.graphqls.tmpl new file mode 100644 index 000000000..8ce8642fe --- /dev/null +++ b/compiler/pkg/generator/template/tsm-graphql/schema.graphqls.tmpl @@ -0,0 +1,15 @@ +{{- range $key, $node := .Nodes }} +{{- if $node.IsNexusNode }} +{{ $length := len $node.GraphqlSchemaFields }}{{- if eq $length 0 }}{{- else }} +type {{ $node.SchemaName }} @nexus(group:"{{ $node.GroupName}}",version:"{{ $node.ResourceVersion}}",kind:"{{ $node.Kind}}",resource:"{{ $node.ResourceName}}",name:"{{ $node.NodeName}}",crdName:"{{ $node.CrdName}}"){ + {{- range $key, $field := $node.GraphqlSchemaFields }} + {{- if $field.SchemaFieldName }} + {{ $field.SchemaFieldName -}} + {{- end}} + {{- end }} +} +{{- end }}{{- end }}{{- end }} + +{{- range $key, $val := .GraphQlFiles}} + {{ $val }} +{{- end }} diff --git a/compiler/pkg/generator/template/types.go.tmpl b/compiler/pkg/generator/template/types.go.tmpl index 1f8581297..539535664 100644 --- a/compiler/pkg/generator/template/types.go.tmpl +++ b/compiler/pkg/generator/template/types.go.tmpl @@ -22,10 +22,17 @@ type Link struct { Name string `json:"name" yaml:"name"` } +// +k8s:openapi-gen=true +type SyncerStatus struct { + EtcdVersion int64 `json:"etcdVersion, omitempty" yaml:"etcdVersion, omitempty"` + CRGenerationId int64 `json:"cRGenerationId, omitempty" yaml:"cRGenerationId, omitempty"` +} + // +k8s:openapi-gen=true type NexusStatus struct { - SourceGeneration int64 `json:"sourceGeneration" yaml:"sourceGeneration"` - RemoteGeneration int64 `json:"remoteGeneration" yaml:"remoteGeneration"` + SourceGeneration int64 `json:"sourceGeneration, omitempty" yaml:"sourceGeneration, omitempty"` + RemoteGeneration int64 `json:"remoteGeneration, omitempty" yaml:"remoteGeneration, omitempty"` + SyncerStatus SyncerStatus `json:"syncerStatus, omitempty" yaml:"syncerStatus, omitempty"` } /* ------------------- CRDs definitions ------------------- */ diff --git a/compiler/pkg/generator/template_renderers.go b/compiler/pkg/generator/template_renderers.go index 3ffdc471e..3530e49b0 100644 --- a/compiler/pkg/generator/template_renderers.go +++ b/compiler/pkg/generator/template_renderers.go @@ -6,6 +6,8 @@ import ( "encoding/json" "fmt" "go/format" + "go/printer" + "go/token" "os" "sort" "strings" @@ -55,9 +57,17 @@ var graphqlResolverTemplateFile []byte //go:embed template/graphql/server.go.tmpl var gqlserverTemplateFile []byte +//go:embed template/tsm-graphql/schema.graphqls.tmpl +var tsmGraphqlSchemaTemplateFile []byte + +//go:embed template/model.go.tmpl +var modelTemplateFile []byte + func RenderCRDTemplate(baseGroupName, crdModulePath string, - pkgs parser.Packages, graph map[string]parser.Node, outputDir string, - httpMethods map[string]nexus.HTTPMethodsResponses, httpCodes map[string]nexus.HTTPCodesResponse) error { + pkgs parser.Packages, graph map[string]parser.Node, + outputDir string, httpMethods map[string]nexus.HTTPMethodsResponses, + httpCodes map[string]nexus.HTTPCodesResponse, nonNexusTypes *parser.NonNexusTypes, + fileset *token.FileSet, graphqlFiles map[string]string) error { parentsMap := parser.CreateParentsMap(graph) pkgNames := make([]string, len(pkgs)) @@ -137,7 +147,7 @@ func RenderCRDTemplate(baseGroupName, crdModulePath string, return err } - err = RenderGraphQL(baseGroupName, outputDir, crdModulePath, pkgs, parentsMap) + err = RenderGraphQL(baseGroupName, outputDir, crdModulePath, pkgs, parentsMap, graphqlFiles, nonNexusTypes) if err != nil { return err } @@ -146,6 +156,11 @@ func RenderCRDTemplate(baseGroupName, crdModulePath string, if err != nil { return err } + + err = RenderNonNexusTypes(outputDir, nonNexusTypes, fileset) + if err != nil { + return err + } return nil } @@ -538,9 +553,10 @@ func RenderClientTemplate(baseGroupName, crdModulePath string, pkgs parser.Packa type GraphDetails struct { BaseImportPath string Nodes []NodeProperty + GraphQlFiles map[string]string } -func RenderGraphQL(baseGroupName, outputDir, crdModulePath string, pkgs parser.Packages, parentsMap map[string]parser.NodeHelper) error { +func RenderGraphQL(baseGroupName, outputDir, crdModulePath string, pkgs parser.Packages, parentsMap map[string]parser.NodeHelper, graphqlFiles map[string]string, nonNexusTypes *parser.NonNexusTypes) error { gqlFolder := outputDir + "/nexus-gql/graph" var ( vars GraphDetails @@ -549,6 +565,7 @@ func RenderGraphQL(baseGroupName, outputDir, crdModulePath string, pkgs parser.P vars.BaseImportPath = crdModulePath vars.Nodes, err = GenerateGraphqlResolverVars(baseGroupName, crdModulePath, pkgs, parentsMap) + vars.GraphQlFiles = graphqlFiles if err != nil { return err } @@ -586,6 +603,25 @@ func RenderGraphQL(baseGroupName, outputDir, crdModulePath string, pkgs parser.P return err } + //Render Graphql Schema Template (TSM) + vars.Nodes, err = GenerateTsmGraphqlSchemaVars(baseGroupName, crdModulePath, pkgs, parentsMap, nonNexusTypes) + if err != nil { + return err + } + tsmGqlFolder := outputDir + "/tsm-nexus-gql/graph" + schemaTemplate, err := readTemplateFile(tsmGraphqlSchemaTemplateFile) + if err != nil { + return err + } + tsmFile, err := renderTemplate(schemaTemplate, vars) + if err != nil { + return err + } + log.Debugf("Rendered graphql schema template: %s", tsmFile) + err = createFile(tsmGqlFolder, "schema.graphqls", tsmFile, false) + if err != nil { + return err + } return nil } @@ -649,3 +685,52 @@ func RenderGqlServerTemplate(vars ServerVars) (*bytes.Buffer, error) { } return renderTemplate(registerGqlserverTemplate, vars) } + +type CommonVars struct { + Types string +} + +func RenderNonNexusTypes(outputDir string, nonNexusTypes *parser.NonNexusTypes, fileset *token.FileSet) error { + outputModelFolder := outputDir + "/model" + err := createFolder(outputModelFolder) + if err != nil { + return err + } + + var output string + for _, decl := range nonNexusTypes.Types { + var buf bytes.Buffer + err := printer.Fprint(&buf, fileset, decl) + if err != nil { + return err + } + + output += fmt.Sprintf("%s\n\n", buf.String()) + } + + for _, val := range nonNexusTypes.Values { + output += fmt.Sprintf("%s\n\n", val) + } + + for _, val := range nonNexusTypes.ExternalTypes { + output += fmt.Sprintf("%s\n\n", val) + } + + vars := CommonVars{Types: output} + tmpl, err := readTemplateFile(modelTemplateFile) + if err != nil { + return err + } + + out, err := renderTemplate(tmpl, vars) + if err != nil { + return err + } + + err = createFile(outputModelFolder, "model.go", out, false) + if err != nil { + return err + } + + return nil +} diff --git a/compiler/pkg/generator/tsm_graphql_generator.go b/compiler/pkg/generator/tsm_graphql_generator.go new file mode 100644 index 000000000..2d2dc85e0 --- /dev/null +++ b/compiler/pkg/generator/tsm_graphql_generator.go @@ -0,0 +1,485 @@ +package generator + +import ( + "fmt" + "go/ast" + "regexp" + "sort" + "strings" + + log "github.com/sirupsen/logrus" + "golang.org/x/text/cases" + "golang.org/x/text/language" + + "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/parser" + "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/util" + "github.com/vmware-tanzu/graph-framework-for-microservices/nexus/nexus" +) + +type GraphQLSchemaType int + +const ( + Standard GraphQLSchemaType = iota + Array + JsonMarshal + Child + Link + NamedChild + NamedLink + AliasType +) + +// tsmPopulateValuesForEachNode populates each node with required resolver properties +func tsmPopulateValuesForEachNode(nodes []*NodeProperty, linkAPI map[string]string, retMap map[string]ReturnStatement) []NodeProperty { + var nodeProperties []NodeProperty + for _, n := range nodes { + resNodeProp := NodeProperty{} + resNodeProp.GroupResourceNameTitle = util.GetGroupResourceNameTitle(n.NodeName) + resNodeProp.Alias = n.Alias + resNodeProp.ReturnType = n.ReturnType + resNodeProp.BaseImportPath = n.BaseImportPath + resNodeProp.GraphqlSchemaFields = n.GraphqlSchemaFields + resNodeProp.IsSingletonNode = n.IsSingletonNode + resNodeProp.CustomQueries = n.CustomQueries + resNodeProp.IsNexusNode = n.IsNexusNode + resNodeProp.ResolverFields = n.ResolverFields + resNodeProp.ResolverCount = n.ResolverCount + resNodeProp.PkgName = n.PkgName + resNodeProp.NodeName = n.NodeName + resNodeProp.SchemaName = n.SchemaName + resNodeProp.GroupName = n.GroupName + resNodeProp.Singular = n.Singular + resNodeProp.Kind = n.Kind + resNodeProp.ResourceName = n.ResourceName + resNodeProp.ResourceVersion = n.ResourceVersion + resNodeProp.CrdName = n.CrdName + + // populate return values for root of the graph + if !n.HasParent && n.IsParentNode { + resNodeProp.Alias = retMap[resNodeProp.PkgName+resNodeProp.NodeName].Alias + resNodeProp.ReturnType = retMap[resNodeProp.PkgName+resNodeProp.NodeName].ReturnType + resNodeProp.IsParentNode = true + } + + // populate return values for child fields + for _, f := range n.ChildFields { + f.ReturnType = retMap[f.FieldTypePkgPath].ReturnType + f.Alias = retMap[f.FieldTypePkgPath].Alias + f.FieldCount = retMap[f.FieldTypePkgPath].FieldCount + f.CRDName = retMap[f.FieldTypePkgPath].CRDName + f.ChainAPI = retMap[f.FieldTypePkgPath].ChainAPI + f.IsSingleton = retMap[f.FieldTypePkgPath].IsSingleton + f.LinkAPI = linkAPI[f.PkgName+f.NodeName] + resNodeProp.ChildFields = append(resNodeProp.ChildFields, f) + } + + // populate return values for multiple child fields + for _, f := range n.ChildrenFields { + f.ReturnType = retMap[f.FieldTypePkgPath].ReturnType + f.Alias = retMap[f.FieldTypePkgPath].Alias + f.FieldCount = retMap[f.FieldTypePkgPath].FieldCount + f.CRDName = retMap[f.FieldTypePkgPath].CRDName + f.ChainAPI = retMap[f.FieldTypePkgPath].ChainAPI + f.IsSingleton = retMap[f.FieldTypePkgPath].IsSingleton + f.LinkAPI = linkAPI[f.PkgName+f.NodeName] + resNodeProp.ChildrenFields = append(resNodeProp.ChildrenFields, f) + } + + // populate return values for link fields + for _, f := range n.LinkFields { + f.ReturnType = retMap[f.FieldTypePkgPath].ReturnType + f.Alias = retMap[f.FieldTypePkgPath].Alias + f.FieldCount = retMap[f.FieldTypePkgPath].FieldCount + f.CRDName = retMap[f.FieldTypePkgPath].CRDName + f.ChainAPI = retMap[f.FieldTypePkgPath].ChainAPI + f.IsSingleton = retMap[f.FieldTypePkgPath].IsSingleton + f.LinkAPI = linkAPI[f.PkgName+f.NodeName] + resNodeProp.LinkFields = append(resNodeProp.LinkFields, f) + } + + // populate return values for multiple link fields + for _, f := range n.LinksFields { + f.ReturnType = retMap[f.FieldTypePkgPath].ReturnType + f.Alias = retMap[f.FieldTypePkgPath].Alias + f.FieldCount = retMap[f.FieldTypePkgPath].FieldCount + f.CRDName = retMap[f.FieldTypePkgPath].CRDName + f.ChainAPI = retMap[f.FieldTypePkgPath].ChainAPI + f.IsSingleton = retMap[f.FieldTypePkgPath].IsSingleton + f.LinkAPI = linkAPI[f.PkgName+f.NodeName] + resNodeProp.LinksFields = append(resNodeProp.LinksFields, f) + } + + nodeProperties = append(nodeProperties, resNodeProp) + } + + return nodeProperties +} + +func tsmPopulateValuesForResolver(nodes []*NodeProperty, parentsMap map[string]parser.NodeHelper, + crdNameMap, nonStructMap map[string]string) (map[string]string, map[string]ReturnStatement) { + linkAPI := make(map[string]string) + retMap := make(map[string]ReturnStatement) + + for _, n := range nodes { + var ( + retType, aliasVal, listRetVal, ChainAPI string + fieldCount int + IsSingleton bool + ) + + retType += fmt.Sprintf("ret := &model.%s%s {\n", n.PkgName, n.NodeName) + if n.IsNexusNode || n.IsSingletonNode { + retType += fmt.Sprintf("\t%s: &%s,\n", "Id", "dn") + aliasVal += fmt.Sprintf("%s := v%s.DisplayName()\n", "dn", n.NodeName) + + retType += fmt.Sprintf("\t%s: %s,\n", "ParentLabels", "parentLabels") + aliasVal += fmt.Sprintf("%s := map[string]interface{}{%q:%s}\n", "parentLabels", n.CrdName, "dn") + + ChainAPI += "nc" + var prevNode parser.NodeHelper + for _, i := range parentsMap[n.CrdName].Parents { + currentNode := parentsMap[i] + + if len(currentNode.Parents) == 0 { + // root of the graph + if currentNode.IsSingleton { + ChainAPI += fmt.Sprintf(".%s()", crdNameMap[i]) + } else { + ChainAPI += fmt.Sprintf(".%s(getParentName(obj.ParentLabels, %q))", crdNameMap[i], i) + } + } else { + if childNode, ok := prevNode.Children[i]; ok { + if currentNode.IsSingleton { + ChainAPI += fmt.Sprintf(".%s()", childNode.FieldName) + } else { + ChainAPI += fmt.Sprintf(".%s(getParentName(obj.ParentLabels, %q))", childNode.FieldName, i) + } + } + } + // cache the non-leaf node + prevNode = currentNode + } + + // Create linkAPI + if n.IsSingletonNode { + IsSingleton = true + if !n.HasParent && n.IsParentNode { + linkAPI[n.PkgName+n.NodeName] = fmt.Sprintf("%s.Get%s(context.TODO())", ChainAPI, n.PkgName+n.NodeName) + } else { + linkAPI[n.PkgName+n.NodeName] = fmt.Sprintf("%s.Get%s(context.TODO())", ChainAPI, prevNode.Children[n.CrdName].FieldName) + } + } else { + IsSingleton = false + if !n.HasParent && n.IsParentNode { + linkAPI[n.PkgName+n.NodeName] = fmt.Sprintf("%s.Get%s(context.TODO(), getParentName(obj.ParentLabels, %q))", ChainAPI, n.PkgName+n.NodeName, n.CrdName) + } else { + linkAPI[n.PkgName+n.NodeName] = fmt.Sprintf("%s.Get%s(context.TODO(), getParentName(obj.ParentLabels, %q))", ChainAPI, prevNode.Children[n.CrdName].FieldName, n.CrdName) + } + } + } + for _, i := range n.ResolverFields[n.PkgName+n.NodeName] { + if i.IsMapTypeField || i.IsStringType { + fieldCount += 1 + retType += fmt.Sprintf("\t%s: &%sData,\n", i.FieldName, i.FieldName) + aliasVal += jsonMarshalResolver(i.FieldName, n.NodeName) + } else if i.IsStdTypeField { + if len(convertGoStdType(i.FieldType)) != 0 { + fieldCount += 1 + retType += fmt.Sprintf("\t%s: &v%s,\n", i.FieldName, i.FieldName) + listRetVal += fmt.Sprintf("v%s := %s(i.%s)\n", i.FieldName, convertGoStdType(i.FieldType), i.FieldName) + aliasVal += fmt.Sprintf("v%s := %s(v%s.Spec.%s)\n", i.FieldName, convertGoStdType(i.FieldType), i.NodeName, i.FieldName) + } + } + } + retType += "\t}" + retMap[n.PkgName+n.NodeName] = ReturnStatement{ + Alias: aliasVal, + ReturnType: retType, + FieldCount: fieldCount, + CRDName: n.CrdName, + ChainAPI: ChainAPI, + IsSingleton: IsSingleton, + } + } + + return linkAPI, retMap +} + +// tsmProcessNonNexusFields process and populates properties for each non nexus fields +// +func tsmProcessNonNexusFields(pkg parser.Package, aliasNameMap map[string]string, node *ast.TypeSpec, nodeProp *NodeProperty, simpleGroupTypeName string, nonNexusTypes *parser.NonNexusTypes) { + resField := make(map[string][]FieldProperty) + for _, f := range parser.GetSpecFields(node) { + var ( + fieldProp FieldProperty + err error + ) + typeString := ConstructType(aliasNameMap, f) + // populate each field properties + if len(f.Names) > 0 { + fieldProp.FieldName, err = parser.GetNodeFieldName(f) + if err != nil { + log.Fatalf("failed to determine field name: %v", err) + } + fieldProp.FieldType = typeString + fieldProp.PkgName = simpleGroupTypeName + fieldProp.NodeName = node.Name.String() + } + + if parser.IgnoreField(f) { + continue + } + + if parser.IsJsonStringField(f) { + fieldProp.IsStringType = true + fieldProp.SchemaFieldName = getTsmGraphqlSchemaFieldName(JsonMarshal, fieldProp.FieldName, "String", "id: ID", f, pkg, nonNexusTypes) + resField[nodeProp.PkgName+nodeProp.NodeName] = append(resField[nodeProp.PkgName+nodeProp.NodeName], fieldProp) + } else if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_ALIAS_TYPE_ANNOTATION) || parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_ALIAS_NAME_ANNOTATION) { + fieldProp.SchemaFieldName = getTsmGraphqlSchemaFieldName(AliasType, fieldProp.FieldName, "", "", f, pkg, nonNexusTypes) + resField[nodeProp.PkgName+nodeProp.NodeName] = append(resField[nodeProp.PkgName+nodeProp.NodeName], fieldProp) + } else if parser.IsArrayField(f) { + arr := regexp.MustCompile(`^(\[])`).ReplaceAllString(typeString, "") + if !strings.Contains(arr, ".") { + stdType := convertGraphqlStdType(arr) + fieldProp.SchemaFieldName = getTsmGraphqlSchemaFieldName(Array, fieldProp.FieldName, stdType, "id: ID", f, pkg, nonNexusTypes) + resField[nodeProp.PkgName+nodeProp.NodeName] = append(resField[nodeProp.PkgName+nodeProp.NodeName], fieldProp) + } + } else { + stdType := convertGraphqlStdType(typeString) + // standard type + if len(stdType) != 0 { + fieldProp.IsStdTypeField = true + fieldProp.SchemaFieldName = getTsmGraphqlSchemaFieldName(Standard, fieldProp.FieldName, stdType, "id: ID", f, pkg, nonNexusTypes) + resField[nodeProp.PkgName+nodeProp.NodeName] = append(resField[nodeProp.PkgName+nodeProp.NodeName], fieldProp) + } else { + fieldProp.SchemaFieldName = getTsmGraphqlSchemaFieldName(Standard, fieldProp.FieldName, "String", "id: ID", f, pkg, nonNexusTypes) + fieldProp.IsStringType = true + resField[nodeProp.PkgName+nodeProp.NodeName] = append(resField[nodeProp.PkgName+nodeProp.NodeName], fieldProp) + } + } + nodeProp.GraphqlSchemaFields = append(nodeProp.GraphqlSchemaFields, fieldProp) + nodeProp.ResolverFields = resField + } +} + +// tsmProcessNexusFields process and populates properties for each nexus fields +// +func tsmProcessNexusFields(pkg parser.Package, aliasNameMap map[string]string, node *ast.TypeSpec, + nodeProp *NodeProperty, simpleGroupTypeName string, pkgs map[string]parser.Package, + gqlSpecMap map[string]nexus.GraphQLSpec) { + importMap := pkg.GetImportMap() + for _, nf := range parser.GetNexusFields(node) { + var ( + fieldProp FieldProperty + err error + ) + if len(nf.Names) > 0 { + fieldProp.FieldName, err = parser.GetNodeFieldName(nf) + if err != nil { + log.Fatalf("Failed to determine field name: %v", err) + } + fieldProp.PkgName = simpleGroupTypeName + fieldProp.NodeName = node.Name.String() + } + + // Except for nexus fields (nexus.Node and nexus.SingletonNode), + // this will check other fields to see whether they have nexus secrets annotated on them + // If yes, the field is ignored in the response. + if !parser.IsNexusTypeField(nf) { + nfType := parser.GetFieldType(nf) + fieldPkg := &pkg + structType := nfType + + if ptParts := strings.Split(nfType, "."); len(ptParts) == 2 { //service_group.SvcGroup + structType, fieldPkg = findTypeAndPkgForField(ptParts, importMap, pkgs) + } + if len(structType) != 0 { + if _, ok := parser.GetNexusSecretSpecAnnotation(*fieldPkg, structType); ok { + log.Debugf("Ignoring the field %s since the node is annotated as nexus secret", fieldProp.FieldName) + continue + } + } + } + + // `Ignore:true` annotation used to ignore the specific field `nexus-graphql:"ignore:true"` + if parser.IgnoreField(nf) { + continue + } + // `type:string` annotation used to consider the type as string `nexus-graphql:"type:string"` + if parser.IsJsonStringField(nf) { + fieldProp.IsStringType = true + fieldProp.SchemaFieldName = getTsmGraphqlSchemaFieldName(JsonMarshal, fieldProp.FieldName, "String", "id: ID", nf, pkg, nil) + } + + // denote field is nexus or singletonField type + if parser.IsNexusTypeField(nf) { + fieldProp.IsNexusOrSingletonField = true + // get nexus schemaFieldName from GraphQlSpec "IdName" & "IdNullable" + fieldProp.SchemaFieldName = GetNexusSchemaFieldName(nodeProp.GraphQlSpec) + for _, customQuery := range nodeProp.CustomQueries { + cq := CustomQueryToGraphqlSchema(customQuery) + // In TSM DM "@timeseriesAPI" directives is need to added along with returnType "TimeSeriesData" + fieldProp.SchemaFieldName += "\n" + strings.ReplaceAll(cq, "TimeSeriesData", fmt.Sprintf("TimeSeriesData @timeseriesAPI(file: \"../../tsquery/timeSeriesQuery\", handler: \"%s\")", customQuery.Name)) + var customQueryFieldProp FieldProperty + customQueryFieldProp.IsResolver = true + customQueryFieldProp.FieldName = customQuery.Name + nodeProp.GraphqlSchemaFields = append(nodeProp.GraphqlSchemaFields, customQueryFieldProp) + nodeProp.ResolverCount += 1 + } + } + + // nexus link field + typeString := ConstructType(aliasNameMap, nf) + if parser.IsOnlyLinkField(nf) { + schemaTypeName, resolverTypeName := ValidateImportPkg(nodeProp.PkgName, typeString, importMap, pkgs) + fieldProp.SchemaFieldName = getTsmGraphqlSchemaFieldName(Link, fieldProp.FieldName, schemaTypeName, "id: ID", nf, pkg, nil) + fieldProp.IsResolver = true + fieldProp.IsNexusTypeField = true + fieldProp.FieldType = typeString + fieldProp.FieldTypePkgPath = resolverTypeName + fieldProp.SchemaTypeName = schemaTypeName + fieldProp.BaseTypeName = getBaseNodeType(typeString) + nodeProp.LinkFields = append(nodeProp.LinkFields, fieldProp) + } + + // nexus child field + if parser.IsOnlyChildField(nf) { + schemaTypeName, resolverTypeName := ValidateImportPkg(nodeProp.PkgName, typeString, importMap, pkgs) + fieldProp.SchemaFieldName = getTsmGraphqlSchemaFieldName(Child, fieldProp.FieldName, schemaTypeName, "id: ID", nf, pkg, nil) + fieldProp.SchemaTypeName = schemaTypeName + fieldProp.IsResolver = true + fieldProp.IsNexusTypeField = true + fieldProp.FieldType = typeString + fieldProp.FieldTypePkgPath = resolverTypeName + fieldProp.BaseTypeName = getBaseNodeType(typeString) + nodeProp.ChildFields = append(nodeProp.ChildFields, fieldProp) + } + + // nexus children or links field + if parser.IsNamedChildOrLink(nf) { + var listArg string + fieldProp.IsChildrenOrLinks = true + schemaTypeName, resolverTypeName := ValidateImportPkg(nodeProp.PkgName, typeString, importMap, pkgs) + // Annotation `nexus-graphql-args:"name: String"` use to specify graphql arguments + AnnotatedGqlArgs := parser.GetFieldAnnotationVal(nf, parser.GRAPHQL_ARGS_ANNOTATION) + if AnnotatedGqlArgs != "" { + listArg = AnnotatedGqlArgs + } else { + if val, ok := parser.GetNexusGraphqlSpecAnnotation(pkg, typeString); ok { + gqlspec := gqlSpecMap[fmt.Sprintf("%s.%s", pkg.Name, val)] + listArg = GetNexusSchemaFieldName(gqlspec) + } else { + listArg = GetNodeDetails(nodeProp.PkgName, typeString, importMap, pkgs, gqlSpecMap) + } + } + + sType := NamedChild + if parser.IsLinkField(nf) { + sType = NamedLink + } + fieldProp.SchemaFieldName = getTsmGraphqlSchemaFieldName(sType, fieldProp.FieldName, schemaTypeName, listArg, nf, pkg, nil) + fieldProp.IsResolver = true + fieldProp.IsNexusTypeField = true + fieldProp.FieldType = typeString + fieldProp.FieldTypePkgPath = resolverTypeName + fieldProp.BaseTypeName = getBaseNodeType(typeString) + if parser.IsOnlyChildrenField(nf) { + nodeProp.ChildrenFields = append(nodeProp.ChildrenFields, fieldProp) + } else { + nodeProp.LinksFields = append(nodeProp.LinksFields, fieldProp) + } + } + // no. of resolver field in a node + if fieldProp.IsResolver { + nodeProp.ResolverCount += 1 + } + nodeProp.GraphqlSchemaFields = append(nodeProp.GraphqlSchemaFields, fieldProp) + } +} + +// GenerateTsmGraphqlSchemaVars populates the node and its field properties required to generate graphql resolver +func GenerateTsmGraphqlSchemaVars(baseGroupName, crdModulePath string, pkgs parser.Packages, parentsMap map[string]parser.NodeHelper, nonNexusTypes *parser.NonNexusTypes) ([]NodeProperty, error) { + sortedKeys := make([]string, 0, len(pkgs)) + gqlSpecMap := parser.ParseGraphqlSpecs(pkgs) + for k := range pkgs { + sortedKeys = append(sortedKeys, k) + } + sort.Strings(sortedKeys) + sortedPackages := make([]parser.Package, len(pkgs)) + for i, k := range sortedKeys { + sortedPackages[i] = pkgs[k] + } + + // Iterate all the struct type and it's fields in the sortedPackages and + // set the node and field properties accordingly. + var nodes []*NodeProperty + aliasNameMap := make(map[string]string) + //rootOfGraph := false + for _, pkg := range sortedPackages { + simpleGroupTypeName := util.GetSimpleGroupTypeName(pkg.Name) + // Iterating struct type + for _, node := range pkg.GetStructs() { + // Nexus GraphQlSpec by default "IdNullable" value is true + gqlspec := nexus.GraphQLSpec{ + IdName: "", + IdNullable: true, + } + // Skip Empty struct type + if len(parser.GetNexusFields(node)) == 0 && len(parser.GetSpecFields(node)) == 0 { + continue + } + + typeName := parser.GetTypeName(node) + if _, ok := parser.GetNexusSecretSpecAnnotation(pkg, typeName); ok { + log.Debugf("Ignoring the node %s since the node is annotated as nexus secret", typeName) + continue + } + + if val, ok := parser.GetNexusGraphqlSpecAnnotation(pkg, typeName); ok { + gqlspec = gqlSpecMap[fmt.Sprintf("%s.%s", pkg.Name, val)] + } + + nodeProp := &NodeProperty{} + // populate node properties + nodeProp.PkgName = simpleGroupTypeName + nodeProp.NodeName = node.Name.String() + nodeProp.BaseImportPath = crdModulePath + nodeProp.CrdName = util.GetCrdName(node.Name.String(), pkg.Name, baseGroupName) + nodeHelper := parentsMap[nodeProp.CrdName] + nodeProp.IsParentNode = parser.IsNexusNode(node) + nodeProp.CustomQueries = nodeHelper.GraphqlQuerySpec.Queries + nodeProp.GraphQlSpec = gqlspec + nodeProp.GroupName = pkg.Name + "." + baseGroupName + nodeProp.Singular = strings.ToLower(typeName) + nodeProp.Kind = cases.Title(language.Und, cases.NoLower).String(typeName) + nodeProp.ResourceName = util.ToPlural(nodeProp.Singular) + nodeProp.ResourceVersion = "v1" + // crdName := fmt.Sprintf("%s.%s", plural, groupName) + + setNexusProperties(nodeHelper, node, nodeProp) + if pkg.Name == "global" { + nodeProp.SchemaName = parser.GetTypeName(node) + } else if pkg.Name == "tsm" { + continue + } else { + nodeProp.SchemaName = fmt.Sprintf("%s_%s", pkg.Name, parser.GetTypeName(node)) + } + // Iterate each node's nexus fields and set its properties + tsmProcessNexusFields(pkg, aliasNameMap, node, nodeProp, simpleGroupTypeName, pkgs, gqlSpecMap) + + // Iterate each node's non-nexus fields and set its properties + tsmProcessNonNexusFields(pkg, aliasNameMap, node, nodeProp, simpleGroupTypeName, nonNexusTypes) + nodes = append(nodes, nodeProp) + } + } + + crdNameMap := constructNexusTypeMap(nodes) + // populate return values of each Node for resolver + nonStructMap := constructAliasType(sortedPackages) + linkAPI, retMap := tsmPopulateValuesForResolver(nodes, parentsMap, crdNameMap, nonStructMap) + + // populate return values of each node + nodeProperties := tsmPopulateValuesForEachNode(nodes, linkAPI, retMap) + + return nodeProperties, nil +} diff --git a/compiler/pkg/generator/tsm_graphql_generator_test.go b/compiler/pkg/generator/tsm_graphql_generator_test.go new file mode 100644 index 000000000..72874106a --- /dev/null +++ b/compiler/pkg/generator/tsm_graphql_generator_test.go @@ -0,0 +1,79 @@ +package generator_test + +import ( + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/vmware-tanzu/graph-framework-for-microservices/nexus/nexus" + + "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/generator" + "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/parser" +) + +var _ = Describe("Template renderers tests", func() { + var ( + pkgs parser.Packages + parentsMap map[string]parser.NodeHelper + graphqlQueries map[string]nexus.GraphQLQuerySpec + ) + + BeforeEach(func() { + pkgs = parser.ParseDSLPkg(exampleDSLPath) + graphqlQueries = parser.ParseGraphqlQuerySpecs(pkgs) + graph, _, _ := parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) + parentsMap = parser.CreateParentsMap(graph) + }) + + FIt("should resolve graphql vars", func() { + vars, err := generator.GenerateTsmGraphqlSchemaVars(baseGroupName, crdModulePath, pkgs, parentsMap, nil) + Expect(err).NotTo(HaveOccurred()) + + Expect(len(vars)).To(Equal(45)) + Expect(vars[0].NodeName).To(Equal("Root")) + Expect(vars[3].PkgName).To(Equal("Config")) + Expect(vars[3].NodeName).To(Equal("Config")) + Expect(vars[3].SchemaName).To(Equal("config_Config")) + Expect(vars[3].Alias).To(Equal("")) + Expect(vars[3].ReturnType).To(Equal("")) + + Expect(vars[2].IsParentNode).To(BeFalse()) + Expect(vars[2].HasParent).To(BeFalse()) + Expect(vars[2].IsSingletonNode).To(BeFalse()) + Expect(vars[2].IsNexusNode).To(BeFalse()) + Expect(vars[2].BaseImportPath).To(Equal("nexustempmodule/")) + Expect(vars[2].CrdName).To(Equal("")) + + // Test that nexus-secret Node should not be present + Expect(vars).NotTo(ContainElement(HaveField("NodeName", "Foo"))) + }) + + It("should resolve non-singleton root and singleton child node", func() { + pkgs = parser.ParseDSLPkg("../../example/test-utils/non-singleton-root") + graph, _, _ := parser.ParseDSLNodes("../../example/test-utils/non-singleton-root", baseGroupName, pkgs, graphqlQueries) + parentsMap = parser.CreateParentsMap(graph) + + vars, err := generator.GenerateGraphqlResolverVars(baseGroupName, crdModulePath, pkgs, parentsMap) + Expect(err).NotTo(HaveOccurred()) + Expect(len(vars)).To(Equal(3)) + + Expect(vars[0].NodeName).To(Equal("Root")) + Expect(vars[1].PkgName).To(Equal("Config")) + Expect(vars[1].NodeName).To(Equal("Config")) + Expect(vars[1].SchemaName).To(Equal("config_Config")) + + Expect(vars[1].IsParentNode).To(BeFalse()) + Expect(vars[1].HasParent).To(BeFalse()) + Expect(vars[1].IsSingletonNode).To(BeTrue()) + Expect(vars[1].IsNexusNode).To(BeTrue()) + Expect(vars[1].BaseImportPath).To(Equal("nexustempmodule/")) + Expect(vars[1].CrdName).To(Equal("")) + }) + + It("should validate the import pkg and translate to graphql schema and resolver typeName", func() { + pkg := pkgs["github.com/vmware-tanzu/graph-framework-for-microservices/compiler/example/datamodel/config/gns"] + schemaTypeName, resolverTypeName := generator.ValidateImportPkg(pkg.Name, "servicegroup.SvcGroup", pkg.GetImportMap(), pkgs) + + Expect(pkg.Name).To(Equal("gns")) + Expect(schemaTypeName).To(Equal("servicegroup_SvcGroup")) + Expect(resolverTypeName).To(Equal("ServicegroupSvcGroup")) + }) +}) diff --git a/compiler/pkg/openapi_generator/generator.go b/compiler/pkg/openapi_generator/generator.go index 96ce548c8..c2ed99ea2 100644 --- a/compiler/pkg/openapi_generator/generator.go +++ b/compiler/pkg/openapi_generator/generator.go @@ -183,18 +183,6 @@ func (g *Generator) resolveRefsForPackage(pkg string) error { } fmt.Printf("Resolving refs for %v\n", pkg) - // We are forcing camelCase in all field names for consistency - for property, propSchema := range pkgSchema.schema.Properties { - if strings.Contains(property, "_") { - pkgSchema.schema.Properties[convertToCamelCase(property)] = propSchema - delete(pkgSchema.schema.Properties, property) - } - toReplace := make([]string, len(pkgSchema.schema.Required)) - for i, required := range pkgSchema.schema.Required { - toReplace[i] = convertToCamelCase(required) - } - pkgSchema.schema.Required = toReplace - } g.resolveRefsInProperty(pkgSchema.schema) g.resolveRefsInProperties(pkgSchema.schema) diff --git a/compiler/pkg/parser/graphql_file_parser.go b/compiler/pkg/parser/graphql_file_parser.go new file mode 100644 index 000000000..0659ba973 --- /dev/null +++ b/compiler/pkg/parser/graphql_file_parser.go @@ -0,0 +1,39 @@ +package parser + +import ( + log "github.com/sirupsen/logrus" + "io/fs" + "os" + "path/filepath" +) + +// ParseDSLNodes walks recursively through given path and looks for structs types definitions to add them to graph +func ParseGraphQLFiles(startPath string) map[string]string { + graphqlFiles := make(map[string]string, 0) + err := filepath.Walk(startPath, func(path string, info fs.FileInfo, err error) error { + if info.IsDir() { + if info.Name() == "build" { + log.Infof("Ignoring build directory...") + return filepath.SkipDir + } + if info.Name() == "vendor" { + log.Infof("Ignoring vendor directory...") + return filepath.SkipDir + } + } else { + if filepath.Ext(path) == ".graphql" { + data, err := os.ReadFile(path) + if err != nil { + return err + } + graphqlFiles[path] = string(data) + } + } + return nil + }) + if err != nil { + log.Fatalf("Failed to ParseDSLNodes %v", err) + } + + return graphqlFiles +} diff --git a/compiler/pkg/parser/graphql_queries_parser.go b/compiler/pkg/parser/graphql_queries_parser.go index 8f7633696..a43c3af49 100644 --- a/compiler/pkg/parser/graphql_queries_parser.go +++ b/compiler/pkg/parser/graphql_queries_parser.go @@ -117,8 +117,9 @@ func parseQuery(queryComp *ast.CompositeLit, p Package) (newQuery nexus.GraphQLQ } type GraphQlArg struct { - Name string - Type string + Name string + Type string + AliasType bool } func parseArgs(argsTypeName string, p Package) []GraphQlArg { @@ -133,9 +134,25 @@ func parseArgs(argsTypeName string, p Package) []GraphQlArg { if len(field.Names) == 0 { log.Fatalf("Field in graphql args must be named, args %s", argsTypeName) } + // AliasName Annotation + var fName, fType string + var aType bool + if val := GetFieldAnnotationVal(field, GRAPHQL_ALIAS_NAME_ANNOTATION); val != "" { + fName = val + } else { + fName = field.Names[0].Name + } + // AliasType Annotation + if val := GetFieldAnnotationVal(field, GRAPHQL_ALIAS_TYPE_ANNOTATION); val != "" { + fType = val + aType = true + } else { + fType = GetFieldType(field) + } args = append(args, GraphQlArg{ - Name: field.Names[0].Name, - Type: GetFieldType(field), + Name: fName, + Type: fType, + AliasType: aType, }) } } diff --git a/compiler/pkg/parser/graphql_spec_parser.go b/compiler/pkg/parser/graphql_spec_parser.go new file mode 100644 index 000000000..b20024376 --- /dev/null +++ b/compiler/pkg/parser/graphql_spec_parser.go @@ -0,0 +1,56 @@ +package parser + +import ( + "go/ast" + "strconv" + + log "github.com/sirupsen/logrus" + "github.com/vmware-tanzu/graph-framework-for-microservices/nexus/nexus" +) + +func ParseGraphqlSpecs(pkgs Packages) map[string]nexus.GraphQLSpec { + graphQLSpecMap := make(map[string]nexus.GraphQLSpec) + for _, pkg := range pkgs { + GetGraphqlSpecs(graphQLSpecMap, pkg) + } + return graphQLSpecMap +} + +func GetGraphqlSpecs(graphQLSpecMap map[string]nexus.GraphQLSpec, p Package) { + for _, spec := range GetNexusSpecs(p, "nexus.GraphQLSpec") { + graphQLSpecMap[p.Name+"."+spec.Name] = parseGqlSpec(spec.Value, p) + } +} + +func parseGqlSpec(v *ast.CompositeLit, p Package) nexus.GraphQLSpec { + spec := nexus.GraphQLSpec{ + IdName: "", + IdNullable: true, + } + for _, gqlSpecElt := range v.Elts { + gqlSpecKv, ok := gqlSpecElt.(*ast.KeyValueExpr) + if !ok { + log.Fatalf("Wrong format of graphql query spec, please check graphql spec") + } + + gqlSpecFieldName := gqlSpecKv.Key.(*ast.Ident) + switch gqlSpecFieldName.String() { + case "IdName": + gqlSpecFieldValue := gqlSpecKv.Value.(*ast.BasicLit) + name, err := strconv.Unquote(gqlSpecFieldValue.Value) + if err != nil { + log.Fatalf("Internal compiler error, failed to unqote name in graphql") + } + spec.IdName = name + case "IdNullable": + gqlSpecFieldValue := gqlSpecKv.Value.(*ast.Ident) + val := gqlSpecFieldValue.String() + if val == "false" { + spec.IdNullable = false + } else { + spec.IdNullable = true + } + } + } + return spec +} diff --git a/compiler/pkg/parser/graphql_test.go b/compiler/pkg/parser/graphql_test.go index 2bc3ceb5d..244898ef1 100644 --- a/compiler/pkg/parser/graphql_test.go +++ b/compiler/pkg/parser/graphql_test.go @@ -17,7 +17,7 @@ var _ = Describe("Graphql parsing tests", func() { It("should parse graphql query specs", func() { pkgs = parser.ParseDSLPkg(exampleDSLPath) graphqlQueries := parser.ParseGraphqlQuerySpecs(pkgs) - graph = parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) + graph, _, _ = parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) root, ok := graph["roots.root.tsm.tanzu.vmware.com"] Expect(ok).To(BeTrue()) config, ok := root.SingleChildren["Config"] @@ -25,11 +25,11 @@ var _ = Describe("Graphql parsing tests", func() { gns, ok := config.SingleChildren["GNS"] Expect(ok).To(BeTrue()) - Expect(gns.GraphqlSpec.Queries).To(HaveLen(3)) - Expect(gns.GraphqlSpec.Queries[0].Name).To(Equal("queryGns1")) - Expect(gns.GraphqlSpec.Queries[0].ServiceEndpoint.Domain).To(Equal("nexus-query-responder")) - Expect(gns.GraphqlSpec.Queries[0].ServiceEndpoint.Port).To(Equal(15000)) - args := gns.GraphqlSpec.Queries[0].Args.([]parser.GraphQlArg) + Expect(gns.GraphqlQuerySpec.Queries).To(HaveLen(3)) + Expect(gns.GraphqlQuerySpec.Queries[0].Name).To(Equal("queryGns1")) + Expect(gns.GraphqlQuerySpec.Queries[0].ServiceEndpoint.Domain).To(Equal("nexus-query-responder")) + Expect(gns.GraphqlQuerySpec.Queries[0].ServiceEndpoint.Port).To(Equal(15000)) + args := gns.GraphqlQuerySpec.Queries[0].Args.([]parser.GraphQlArg) Expect(len(args)).To(Equal(5)) Expect(args[0].Name).To(Equal("StartTime")) @@ -43,26 +43,26 @@ var _ = Describe("Graphql parsing tests", func() { Expect(args[4].Name).To(Equal("StartVal")) Expect(args[4].Type).To(Equal("int")) - Expect(gns.GraphqlSpec.Queries[1].Name).To(Equal("queryGnsQM1")) - Expect(gns.GraphqlSpec.Queries[1].ServiceEndpoint.Domain).To(Equal("query-manager")) - Expect(gns.GraphqlSpec.Queries[1].ServiceEndpoint.Port).To(Equal(15002)) - Expect(gns.GraphqlSpec.Queries[1].Args).To(BeNil()) + Expect(gns.GraphqlQuerySpec.Queries[1].Name).To(Equal("queryGnsQM1")) + Expect(gns.GraphqlQuerySpec.Queries[1].ServiceEndpoint.Domain).To(Equal("query-manager")) + Expect(gns.GraphqlQuerySpec.Queries[1].ServiceEndpoint.Port).To(Equal(15002)) + Expect(gns.GraphqlQuerySpec.Queries[1].Args).To(BeNil()) }) It("should match graphql query specs from other packages", func() { pkgs = parser.ParseDSLPkg(exampleDSLPath) graphqlQueries := parser.ParseGraphqlQuerySpecs(pkgs) - graph = parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) + graph, _, _ = parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) root, ok := graph["roots.root.tsm.tanzu.vmware.com"] Expect(ok).To(BeTrue()) config, ok := root.SingleChildren["Config"] Expect(ok).To(BeTrue()) - Expect(config.GraphqlSpec.Queries).To(HaveLen(1)) - Expect(config.GraphqlSpec.Queries[0].Name).To(Equal("QueryExample")) - Expect(config.GraphqlSpec.Queries[0].ServiceEndpoint.Domain).To(Equal("query-manager")) - Expect(config.GraphqlSpec.Queries[0].ServiceEndpoint.Port).To(Equal(6000)) - args := config.GraphqlSpec.Queries[0].Args.([]parser.GraphQlArg) + Expect(config.GraphqlQuerySpec.Queries).To(HaveLen(1)) + Expect(config.GraphqlQuerySpec.Queries[0].Name).To(Equal("QueryExample")) + Expect(config.GraphqlQuerySpec.Queries[0].ServiceEndpoint.Domain).To(Equal("query-manager")) + Expect(config.GraphqlQuerySpec.Queries[0].ServiceEndpoint.Port).To(Equal(6000)) + args := config.GraphqlQuerySpec.Queries[0].Args.([]parser.GraphQlArg) Expect(len(args)).To(Equal(5)) }) diff --git a/compiler/pkg/parser/node.go b/compiler/pkg/parser/node.go index 7c5a7ae79..98d469620 100644 --- a/compiler/pkg/parser/node.go +++ b/compiler/pkg/parser/node.go @@ -19,18 +19,20 @@ type Node struct { MultipleChildren map[string]Node SingleLink map[string]Node MultipleLink map[string]Node - GraphqlSpec nexus.GraphQLQuerySpec + GraphqlQuerySpec nexus.GraphQLQuerySpec + GraphqlSpec nexus.GraphQLSpec } type NodeHelper struct { - Name string - RestName string - Parents []string - Children map[string]NodeHelperChild // CRD Name => NodeHelperChild - Links map[string]NodeHelperChild // FieldName => NodeHelperChild - RestMappings map[string]string - IsSingleton bool - GraphqlSpec nexus.GraphQLQuerySpec + Name string + RestName string + Parents []string + Children map[string]NodeHelperChild // CRD Name => NodeHelperChild + Links map[string]NodeHelperChild // FieldName => NodeHelperChild + RestMappings map[string]string + IsSingleton bool + GraphqlQuerySpec nexus.GraphQLQuerySpec + GraphqlSpec nexus.GraphQLSpec } type NodeHelperChild struct { @@ -39,6 +41,12 @@ type NodeHelperChild struct { IsNamed bool `json:"isNamed"` } +type NonNexusTypes struct { + Types map[string]ast.Decl + Values []string + ExternalTypes []string +} + func (node *Node) Walk(fn func(node *Node)) { fn(node) diff --git a/compiler/pkg/parser/node_config.go b/compiler/pkg/parser/node_config.go index 2d56b5378..031ac6168 100644 --- a/compiler/pkg/parser/node_config.go +++ b/compiler/pkg/parser/node_config.go @@ -13,6 +13,7 @@ const ( NexusDescriptionAnnotation = "nexus-description" NexusGraphqlAnnotation = "nexus-graphql-query" NexusSecretSpecAnnotation = "nexus-secret-spec" + NexusGraphqlSpecAnnotation = "nexus-graphql-spec" ) func GetNexusSecretSpecAnnotation(pkg Package, name string) (string, bool) { @@ -35,6 +36,10 @@ func GetNexusGraphqlAnnotation(pkg Package, name string) (string, bool) { return getNexusAnnotation(pkg, name, NexusGraphqlAnnotation) } +func GetNexusGraphqlSpecAnnotation(pkg Package, name string) (string, bool) { + return getNexusAnnotation(pkg, name, NexusGraphqlSpecAnnotation) +} + func getNexusAnnotation(pkg Package, name string, annotationName string) (string, bool) { var annotationValue string diff --git a/compiler/pkg/parser/node_parser.go b/compiler/pkg/parser/node_parser.go index 2a8446ab3..97a48c42b 100644 --- a/compiler/pkg/parser/node_parser.go +++ b/compiler/pkg/parser/node_parser.go @@ -5,7 +5,9 @@ import ( "go/ast" "go/parser" "go/token" + "go/types" "io/fs" + "k8s.io/utils/strings/slices" "path/filepath" "strconv" "strings" @@ -18,12 +20,17 @@ import ( // ParseDSLNodes walks recursively through given path and looks for structs types definitions to add them to graph func ParseDSLNodes(startPath string, baseGroupName string, packages Packages, - graphqlQueries map[string]nexus.GraphQLQuerySpec) map[string]Node { + graphqlQueries map[string]nexus.GraphQLQuerySpec) (map[string]Node, *NonNexusTypes, *token.FileSet) { modulePath := GetModulePath(startPath) rootNodes := make([]string, 0) nodes := make(map[string]Node) pkgsMap := make(map[string]string) + nonNexusTypes := NonNexusTypes{ + Types: map[string]ast.Decl{}, + Values: nil, + } + fileset := token.NewFileSet() err := filepath.Walk(startPath, func(path string, info fs.FileInfo, err error) error { if info.IsDir() { if info.Name() == "build" { @@ -34,7 +41,6 @@ func ParseDSLNodes(startPath string, baseGroupName string, packages Packages, log.Infof("Ignoring vendor directory...") return filepath.SkipDir } - fileset := token.NewFileSet() pkgs, err := parser.ParseDir(fileset, path, nil, parser.ParseComments) if err != nil { log.Fatalf("Failed to parse directory %s: %v", path, err) @@ -87,15 +93,57 @@ func ParseDSLNodes(startPath string, baseGroupName string, packages Packages, // look for spec in current package annotation = v.Name + "." + annotation } - graphqlSpec, ok := graphqlQueries[annotation] + GraphqlQuerySpec, ok := graphqlQueries[annotation] if ok { - node.GraphqlSpec = graphqlSpec + node.GraphqlQuerySpec = GraphqlQuerySpec } } nodes[crdName] = node + } else { + if !strings.Contains(types.ExprString(typeSpec.Type), "nexus.") && v.Name == "global" { + nonNexusTypes.Types[typeSpec.Name.Name] = decl + } + } + } else { + if !strings.Contains(types.ExprString(typeSpec.Type), "nexus.") && v.Name == "global" { + nonNexusTypes.Types[typeSpec.Name.Name] = decl } } } + if valueSpec, ok := spec.(*ast.ValueSpec); ok { + out, err := util.RenderDecl(decl, fileset) + if err != nil { + return err + } + outStr := out.String() + + // ignore nexus vars + if len(valueSpec.Values) > 0 { + value := valueSpec.Values[0] + if val, ok := value.(*ast.CompositeLit); ok { + if sel, ok := val.Type.(*ast.SelectorExpr); ok { + if types.ExprString(sel.X) == "nexus" { + continue + } + } + } + } + if !slices.Contains(nonNexusTypes.Values, outStr) && v.Name == "global" { + nonNexusTypes.Values = append(nonNexusTypes.Values, outStr) + } + } + } + } + + if _, ok := decl.(*ast.FuncDecl); ok { + out, err := util.RenderDecl(decl, fileset) + if err != nil { + return err + } + outStr := out.String() + + if !slices.Contains(nonNexusTypes.Values, outStr) { + nonNexusTypes.Values = append(nonNexusTypes.Values, outStr) } } } @@ -120,20 +168,28 @@ func ParseDSLNodes(startPath string, baseGroupName string, packages Packages, for _, child := range node.SingleChildren { // if rootNode is a child then remove it from the slice if child.CrdName == rootNode { - rootNodes = append(rootNodes[:i], rootNodes[i+1:]...) + if i+1 >= len(rootNodes) { + rootNodes = rootNodes[:i] + } else { + rootNodes = append(rootNodes[:i], rootNodes[i+1:]...) + } } } for _, child := range node.MultipleChildren { // if rootNode is a named child then remove it from the slice if child.CrdName == rootNode { - rootNodes = append(rootNodes[:i], rootNodes[i+1:]...) + if i+1 >= len(rootNodes) { + rootNodes = rootNodes[:i] + } else { + rootNodes = append(rootNodes[:i], rootNodes[i+1:]...) + } } } } }) } - return buildGraph(nodes, rootNodes, baseGroupName) + return buildGraph(nodes, rootNodes, baseGroupName), &nonNexusTypes, fileset } func buildGraph(nodes map[string]Node, rootNodes []string, baseGroupName string) map[string]Node { @@ -200,13 +256,14 @@ func CreateParentsMap(graph map[string]Node) map[string]NodeHelper { } parents[node.CrdName] = NodeHelper{ - Name: node.Name, - RestName: fmt.Sprintf("%s.%s", node.PkgName, node.Name), - Parents: node.Parents, - Children: children, - Links: links, - IsSingleton: node.IsSingleton, - GraphqlSpec: node.GraphqlSpec, + Name: node.Name, + RestName: fmt.Sprintf("%s.%s", node.PkgName, node.Name), + Parents: node.Parents, + Children: children, + Links: links, + IsSingleton: node.IsSingleton, + GraphqlQuerySpec: node.GraphqlQuerySpec, + GraphqlSpec: node.GraphqlSpec, } }) } @@ -249,8 +306,10 @@ func processNode(node *Node, nodes map[string]Node, baseGroupName string) { if !ok { log.Fatalf("Internal compiler failure: couldn't find node for key %v", key) } - n.Parents = node.Parents - n.Parents = append(n.Parents, node.CrdName) + p := make([]string, len(node.Parents)) + copy(p, node.Parents) + + n.Parents = append(p, node.CrdName) processNode(&n, nodes, baseGroupName) if isNamed { diff --git a/compiler/pkg/parser/node_parser_test.go b/compiler/pkg/parser/node_parser_test.go index 8e8ad4438..35ed1366b 100644 --- a/compiler/pkg/parser/node_parser_test.go +++ b/compiler/pkg/parser/node_parser_test.go @@ -23,7 +23,7 @@ var _ = Describe("Node parser tests", func() { ) BeforeEach(func() { - graph = parser.ParseDSLNodes(exampleDSLPath, baseGroupName, nil, nil) + graph, _, _ = parser.ParseDSLNodes(exampleDSLPath, baseGroupName, nil, nil) root, ok = graph["roots.root.tsm.tanzu.vmware.com"] Expect(ok).To(BeTrue()) }) @@ -147,7 +147,7 @@ var _ = Describe("Node parser tests", func() { }) It("should be able to get graphql info from a field", func() { - graph = parser.ParseDSLNodes(exampleDSLPath, baseGroupName, nil, nil) + graph, _, _ = parser.ParseDSLNodes(exampleDSLPath, baseGroupName, nil, nil) config, ok := graph["roots.root.tsm.tanzu.vmware.com"].SingleChildren["Config"] Expect(ok).To(BeTrue()) diff --git a/compiler/pkg/parser/pkg.go b/compiler/pkg/parser/pkg.go index fec0edc3b..da7b1a73c 100644 --- a/compiler/pkg/parser/pkg.go +++ b/compiler/pkg/parser/pkg.go @@ -35,6 +35,24 @@ type Package struct { FileSet *token.FileSet } +type FieldAnnotation string + +const ( + GRAPHQL_ARGS_ANNOTATION = FieldAnnotation("nexus-graphql-args") + GRAPHQL_ALIAS_NAME_ANNOTATION = FieldAnnotation("nexus-alias-name") + GRAPHQL_ALIAS_TYPE_ANNOTATION = FieldAnnotation("nexus-alias-type") + GRAPHQL_TSM_DIRECTIVE_ANNOTATION = FieldAnnotation("nexus-graphql-tsm-directive") + GRAPHQL_NULLABLE_ANNOTATION = FieldAnnotation("nexus-graphql-nullable") + GRAPHQL_TS_TYPE_ANNOTATION = FieldAnnotation("nexus-graphql-ts-type") + GRAPHQL_JSONENCODED_ANNOTATION = FieldAnnotation("nexus-graphql-jsonencoded") + GRAPHQL_RELATION_NAME = FieldAnnotation("nexus-graphql-relation-name") + GRAPHQL_RELATION_PARAMETERS = FieldAnnotation("nexus-graphql-relation-parameters") + GRAPHQL_RELATION_UUIDKEY = FieldAnnotation("nexus-graphql-relation-uuidkey") + GRAPHQL_TYPE_NAME = FieldAnnotation("nexus-graphql-type-name") + GRAPHQL_PROTOBUF_NAME = FieldAnnotation("nexus-graphql-protobuf-name") + GRAPHQL_PROTOBUF_FILE = FieldAnnotation("nexus-graphql-protobuf-file") +) + // func (p *Package) GetImports() []*ast.ImportSpec // func (p *Package) GetNodes() []*ast.StructType // func (p *Package) GetNexusNodes []*ast.StructType @@ -201,7 +219,7 @@ func IsNexusNode(n *ast.TypeSpec) bool { if val, ok := n.Type.(*ast.StructType); ok { for _, field := range val.Fields.List { typeString := types.ExprString(field.Type) - if typeString == "nexus.Node" || typeString == "nexus.SingletonNode" { + if typeString == "nexus.Node" || typeString == "nexus.SingletonNode" || typeString == "NexusNode" { return true } } @@ -248,7 +266,7 @@ func IsNexusTypeField(f *ast.Field) bool { } typeString := types.ExprString(f.Type) - if typeString == "nexus.Node" || typeString == "nexus.SingletonNode" || typeString == "nexus.ID" { + if typeString == "nexus.Node" || typeString == "nexus.SingletonNode" || typeString == "nexus.ID" || typeString == "NexusNode" { return true } @@ -722,3 +740,91 @@ func (p *Package) ValueSpecToString(t *ast.ValueSpec) (string, error) { } return buf.String(), nil } + +func IsNexusGraphqlNullField(f *ast.Field) bool { + if f == nil { + return false + } + + if f.Tag != nil { + tags := ParseFieldTags(f.Tag.Value) + if val, err := tags.Get(string(GRAPHQL_NULLABLE_ANNOTATION)); err == nil { + if strings.ToLower(val.Name) == "false" { + return false + } + } + } + + return true +} + +// Parser for TSM Integration +// func GetGraphqlArgumentKey(f *ast.Field) string { +// if f == nil { +// return "" +// } + +// if f.Tag != nil { +// tags := ParseFieldTags(f.Tag.Value) +// if val, err := tags.Get("nexus-graphql-arg-key"); err == nil { +// return val.Value() +// } +// } +// return "" +// } + +// func GetGraphqlArgumentValue(f *ast.Field) string { +// if f == nil { +// return "" +// } + +// if f.Tag != nil { +// tags := ParseFieldTags(f.Tag.Value) +// if val, err := tags.Get("nexus-graphql-arg-value"); err == nil { +// return val.Value() +// } +// } +// return "" +// } + +func GetFieldAnnotationString(f *ast.Field, annotation FieldAnnotation) string { + if f == nil { + return "" + } + + if f.Tag != nil { + tags := ParseFieldTags(f.Tag.Value) + if val, err := tags.Get(string(annotation)); err == nil { + return val.String() + } + } + return "" +} + +func GetFieldAnnotationVal(f *ast.Field, annotation FieldAnnotation) string { + if f == nil { + return "" + } + + if f.Tag != nil { + tags := ParseFieldTags(f.Tag.Value) + if val, err := tags.Get(string(annotation)); err == nil { + return val.Value() + } + } + return "" +} + +func IsFieldAnnotationPresent(f *ast.Field, annotation FieldAnnotation) bool { + if f == nil { + return false + } + + if f.Tag != nil { + tags := ParseFieldTags(f.Tag.Value) + if _, err := tags.Get(string(annotation)); err == nil { + return true + } + } + return false +} diff --git a/compiler/pkg/parser/pkg_parser.go b/compiler/pkg/parser/pkg_parser.go index 1611d1180..c79b23125 100644 --- a/compiler/pkg/parser/pkg_parser.go +++ b/compiler/pkg/parser/pkg_parser.go @@ -59,7 +59,7 @@ func ParseDSLPkg(startPath string) Packages { FileSet: fileset, Pkg: *v, } - parseGenDecls(v, &pkg) + ParseGenDecls(v, &pkg) packages[pkgImport] = pkg } } @@ -72,7 +72,7 @@ func ParseDSLPkg(startPath string) Packages { return packages } -func parseGenDecls(v *ast.Package, pkg *Package) { +func ParseGenDecls(v *ast.Package, pkg *Package) { sortedKeys := make([]string, 0, len(v.Files)) for k := range v.Files { sortedKeys = append(sortedKeys, k) diff --git a/compiler/pkg/parser/rest/rest_test.go b/compiler/pkg/parser/rest/rest_test.go index 8559cf6bf..779c0a651 100644 --- a/compiler/pkg/parser/rest/rest_test.go +++ b/compiler/pkg/parser/rest/rest_test.go @@ -27,7 +27,7 @@ var _ = Describe("Rest tests", func() { pkgs = parser.ParseDSLPkg(exampleDSLPath) pkg, ok = pkgs["github.com/vmware-tanzu/graph-framework-for-microservices/compiler/example/datamodel/config/gns"] graphqlQueries := parser.ParseGraphqlQuerySpecs(pkgs) - graph := parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) + graph, _, _ := parser.ParseDSLNodes(exampleDSLPath, baseGroupName, pkgs, graphqlQueries) parentsMap = parser.CreateParentsMap(graph) Expect(ok).To(BeTrue()) }) @@ -134,7 +134,7 @@ var _ = Describe("Rest tests", func() { } pkgs := parser.ParseDSLPkg("../../../example/test-utils/duplicated-uris-datamodel") - g := parser.ParseDSLNodes("../../../example/test-utils/duplicated-uris-datamodel", baseGroupName, pkgs, nil) + g, _, _ := parser.ParseDSLNodes("../../../example/test-utils/duplicated-uris-datamodel", baseGroupName, pkgs, nil) parents := parser.CreateParentsMap(g) for _, p := range pkgs { diff --git a/compiler/pkg/preparser/preparser.go b/compiler/pkg/preparser/preparser.go new file mode 100644 index 000000000..0872bc98d --- /dev/null +++ b/compiler/pkg/preparser/preparser.go @@ -0,0 +1,294 @@ +package preparser + +import ( + "bytes" + "fmt" + "go/ast" + goParser "go/parser" + "go/printer" + "go/token" + "go/types" + "io/fs" + "io/ioutil" + "os" + "path/filepath" + "strconv" + "strings" + "text/template" + + cp "github.com/otiai10/copy" + log "github.com/sirupsen/logrus" + "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/parser" + "golang.org/x/tools/imports" +) + +var pkgImportToPkg = make(map[string]string, 0) + +func Parse(startPath string) map[string][]*parser.Package { + packages := map[string][]*parser.Package{} + modulePath := parser.GetModulePath(startPath) + err := filepath.Walk(startPath, func(path string, info fs.FileInfo, err error) error { + if info.IsDir() { + if info.Name() == "build" { + log.Infof("Ignoring build directory...") + return filepath.SkipDir + } + if info.Name() == "vendor" { + log.Infof("Ignoring vendor directory...") + return filepath.SkipDir + } + + fileset := token.NewFileSet() + pkgs, err := goParser.ParseDir(fileset, path, nil, goParser.ParseComments) + if err != nil { + log.Fatalf("failed to parse directory %s: %v", path, err) + } + pkgImport := strings.TrimSuffix(strings.ReplaceAll(path, startPath, modulePath), "/") + for _, v := range pkgs { + if v.Name == "nexus" { + log.Infof("Ignoring nexus package...") + continue + } + + if parser.SpecialCharsPresent(v.Name) { + log.Fatalf("Invalid package-name <%v>, special characters are not allowed. Please use only lowercase alphanumeric characters.", v.Name) + } + pkgImportToPkg[pkgImport] = v.Name + + pkg := parser.Package{ + Name: v.Name, + ModPath: modulePath, + FullName: pkgImport, + FileSet: fileset, + Pkg: *v, + } + parser.ParseGenDecls(v, &pkg) + packages[pkg.Name] = append(packages[pkg.Name], &pkg) + } + } + return nil + }) + if err != nil { + log.Fatalf("Failed to parse DSL: %v", err) + } + + detectDuplicates(packages) + + return packages +} + +func detectDuplicates(packages map[string][]*parser.Package) { + for _, v := range packages { + for _, pkg := range v { + nodes := pkg.GetNodes() + nexusNodes := pkg.GetNexusNodes() + + nodes = append(nodes, pkg.GetNonStructTypes()...) + + for _, nexusNode := range nexusNodes { + for _, node := range nodes { + if node.Name.String() == fmt.Sprintf("%sSpec", nexusNode.Name) || + node.Name.String() == fmt.Sprintf("%sList", nexusNode.Name) { + log.Fatalf(`Duplicated type (%s) found in package %s ("%s" is already used by node "%s")`, node.Name, pkg.Name, node.Name, nexusNode.Name) + } + } + } + } + } +} + +func removeImportIdentifierFromFields(file *ast.File, pkg string) *ast.File { + for _, decl := range file.Decls { + genDecl, ok := decl.(*ast.GenDecl) + if !ok { + continue + } + + for _, spec := range genDecl.Specs { + typeSpec, ok := spec.(*ast.TypeSpec) + if !ok { + continue + } + + structType, ok := typeSpec.Type.(*ast.StructType) + if !ok { + continue + } + + for _, field := range structType.Fields.List { + selectorExpr, ok := field.Type.(*ast.SelectorExpr) + if !ok { + continue + } + + if types.ExprString(selectorExpr.X) == "nexus" { + continue + } + + var modify bool + for _, imp := range file.Imports { + pkgImport, _ := strconv.Unquote(imp.Path.Value) + if types.ExprString(selectorExpr.X) == imp.Name.String() { + if val := pkgImportToPkg[pkgImport]; val == pkg { + modify = true + } + } + } + + if types.ExprString(selectorExpr.X) == pkg { + modify = true + } + + if modify { + field.Type = selectorExpr.Sel + } + + } + } + } + return file +} + +func Render(dslDir string, packages map[string][]*parser.Package) error { + for k, pkgs := range packages { + if len(pkgs) == 1 { + continue + } + pkgDir := filepath.Join(dslDir, k) + //TODO: create unique directory (e.g. global may already exist) + err := os.MkdirAll(pkgDir, os.ModePerm) + if err != nil { + return err + } + + created := map[string]int{} + for _, pkg := range pkgs { + for _, file := range pkg.Pkg.Files { + file = removeImportIdentifierFromFields(file, pkg.Name) + + // remove src file + srcFile := pkg.FileSet.Position(file.Package).Filename + err := os.Remove(srcFile) + if err != nil { + return err + } + + filename := filepath.Base(srcFile) + if _, ok := created[filename]; ok { + created[filename]++ + filename = fmt.Sprintf("%d_%s", created[filename], filename) + } + + // render AST to buffer + var buf bytes.Buffer + err = printer.Fprint(&buf, pkg.FileSet, file) + if err != nil { + return err + } + + // format file & organize imports using imports package + out, err := imports.Process(filename, buf.Bytes(), nil) + if err != nil { + return err + } + + // create file and write output + f, err := os.Create(filepath.Join(pkgDir, filename)) + if err != nil { + return err + } + _, err = f.Write(out) + if err != nil { + return err + } + + err = f.Close() + if err != nil { + return err + } + + created[filename] = 0 + } + } + + } + + return nil +} + +func CopyPkgsToBuild(dslDir string, outputDir string) error { + dir, err := ioutil.ReadDir(dslDir) + if err != nil { + return err + } + + for _, f := range dir { + if !f.IsDir() || f.Name() == "build" || f.Name() == "vendor" || + f.Name() == "global" || strings.HasPrefix(f.Name(), ".") { + continue + } + + opt := cp.Options{ + Skip: func(srcinfo os.FileInfo, src, dest string) (bool, error) { + return !strings.HasSuffix(src, ".go"), nil + }, + } + + err := cp.Copy(filepath.Join(dslDir, f.Name()), filepath.Join(outputDir, "model", f.Name()), opt) + if err != nil { + return err + } + } + + return nil +} + +var importsTemplate = `{{range .ImportsToRender}}{{.}} +{{end}}` + +type ImportsTemplateVars struct { + ImportsToRender []string +} + +func RenderImports(packages map[string][]*parser.Package, outputDir string, modPath string) error { + importsTemplateVars := ImportsTemplateVars{ + ImportsToRender: []string{}, + } + + for k, pkgs := range packages { + if k != "global" { + continue + } + + for _, v := range pkgs { + for _, importExpr := range v.GetImportMap() { + importStr := strings.Trim(importExpr, "\"") + if strings.HasPrefix(importStr, v.ModPath+"/global") || + !strings.HasPrefix(importStr, v.ModPath) { + continue + } + + namedImport := "nexus_" + importStr[strings.LastIndex(importStr, "/")+1:] + importsTemplateVars.ImportsToRender = append(importsTemplateVars.ImportsToRender, + fmt.Sprintf("%s %s", namedImport, strings.ReplaceAll(importExpr, v.ModPath, modPath))) + } + } + } + + t, err := template.New("tmpl").Parse(importsTemplate) + if err != nil { + return err + } + + b := bytes.Buffer{} + if err = t.Execute(&b, importsTemplateVars); err != nil { + return err + } + + err = os.WriteFile(filepath.Join(outputDir, "model", "nexus-dm-imports"), b.Bytes(), 0644) + if err != nil { + return err + } + + return nil +} diff --git a/compiler/pkg/util/namers.go b/compiler/pkg/util/namers.go index 6764abaf9..c69f7bc51 100644 --- a/compiler/pkg/util/namers.go +++ b/compiler/pkg/util/namers.go @@ -36,7 +36,7 @@ func GetGroupGoName(baseGroupName string) string { } func GetGroupResourceName(nodeName string) string { - return strings.ToLower(ToPlural(nodeName)) // eg roots + return ToPlural(strings.ToLower(nodeName)) // eg roots } func GetNodeNameTitle(nodeName string) string { diff --git a/compiler/pkg/util/plural.go b/compiler/pkg/util/plural.go index 45755934b..88ff02148 100644 --- a/compiler/pkg/util/plural.go +++ b/compiler/pkg/util/plural.go @@ -14,6 +14,10 @@ limitations under the License. package util var consonants = "bcdfghjklmnpqrstvwxyz" +var exceptions = map[string]string{ + // The type name is already in the plural form + "Endpoints": "Endpoints", +} // ToPlural returns the plural form of the type's name. If the type's name is found // in the exceptions map, the map value is returned. @@ -21,6 +25,10 @@ func ToPlural(t string) string { singular := t var plural string + if plural, ok := exceptions[singular]; ok { + return plural + } + if len(singular) < 2 { return singular } diff --git a/compiler/pkg/util/util.go b/compiler/pkg/util/util.go index 08b29e6ee..6ee539e9d 100644 --- a/compiler/pkg/util/util.go +++ b/compiler/pkg/util/util.go @@ -1,6 +1,10 @@ package util import ( + "bytes" + "go/ast" + "go/printer" + "go/token" "regexp" log "github.com/sirupsen/logrus" @@ -23,3 +27,13 @@ func RemoveSpecialChars(value string) string { } return re.ReplaceAllString(value, "") } + +func RenderDecl(decl ast.Decl, fileset *token.FileSet) (bytes.Buffer, error) { + var buf bytes.Buffer + err := printer.Fprint(&buf, fileset, decl) + if err != nil { + return buf, err + } + + return buf, nil +} diff --git a/compiler/scripts/pin_deps.sh b/compiler/scripts/pin_deps.sh index 10488420b..2918d8945 100755 --- a/compiler/scripts/pin_deps.sh +++ b/compiler/scripts/pin_deps.sh @@ -45,4 +45,3 @@ go mod edit -require k8s.io/klog/v2@v2.70.1 go mod edit -require golang.org/x/net@v0.2.0 go mod edit -require google.golang.org/grpc@v1.51.0 go mod edit -require k8s.io/utils@v0.0.0-20221128185143-99ec85e7a448 - diff --git a/compiler/scripts/pin_graphql_build_version.sh b/compiler/scripts/pin_graphql_build_version.sh index 23393ddf1..7b9b4d7b9 100755 --- a/compiler/scripts/pin_graphql_build_version.sh +++ b/compiler/scripts/pin_graphql_build_version.sh @@ -21,4 +21,3 @@ go mod edit -require golang.org/x/net@v0.2.0 go mod edit -require google.golang.org/grpc@v1.51.0 go mod edit -require k8s.io/utils@v0.0.0-20221128185143-99ec85e7a448 go mod edit -require sigs.k8s.io/controller-runtime@v0.14.1 - diff --git a/nexus/nexus/nexus.go b/nexus/nexus/nexus.go index 335e60fad..3f843046f 100644 --- a/nexus/nexus/nexus.go +++ b/nexus/nexus/nexus.go @@ -119,3 +119,9 @@ const ( GraphQLQueryApi GraphQlApiType = iota GetMetricsApi ) + +// A GraphQLSpec +type GraphQLSpec struct { + IdName string + IdNullable bool +} From ecfae166bcd658ef1ddd84cdd2ae73aa54fddb9e Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Fri, 17 Mar 2023 18:17:57 +0530 Subject: [PATCH 02/41] COSMOS-856 and COSMOS-858 Fix --- compiler/example/datamodel/config/gns/gns.go | 3 +++ compiler/pkg/generator/types_generator.go | 9 +++++++- .../pkg/openapi_generator/default_schemas.go | 22 +++++++++++++++++++ compiler/pkg/openapi_generator/generator.go | 7 ++++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/compiler/example/datamodel/config/gns/gns.go b/compiler/example/datamodel/config/gns/gns.go index ffacde4c1..970184138 100644 --- a/compiler/example/datamodel/config/gns/gns.go +++ b/compiler/example/datamodel/config/gns/gns.go @@ -4,6 +4,7 @@ import ( "net/http" cartv1 "github.com/vmware-tanzu/cartographer/pkg/apis/v1alpha1" + "k8s.io/apimachinery/pkg/util/intstr" service_group "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/example/datamodel/config/gns/service-group" policypkg "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/example/datamodel/config/policy" @@ -171,6 +172,8 @@ type Gns struct { //nexus-validation: Pattern=abc Domain string UseSharedGateway bool + Annotations string `nexus-graphql-jsonencoded:""` + TargetPort intstr.IntOrString `json:"targetPort,omitempty" mapstructure:"targetPort,omitempty"` Description Description GnsServiceGroups service_group.SvcGroup `nexus:"children"` GnsAccessControlPolicy policypkg.AccessControlPolicy `nexus:"child" nexus-graphql:"type:string"` diff --git a/compiler/pkg/generator/types_generator.go b/compiler/pkg/generator/types_generator.go index 6f1158745..42e5a4c27 100644 --- a/compiler/pkg/generator/types_generator.go +++ b/compiler/pkg/generator/types_generator.go @@ -150,6 +150,7 @@ type {{.Name}}Spec struct { Name string Fields string } + specDef.Name = parser.GetTypeName(node) for _, field := range parser.GetSpecFields(node) { @@ -170,8 +171,14 @@ type {{.Name}}Spec struct { } specDef.Fields += "\t" + name + " " typeString := ConstructType(aliasNameMap, field) - specDef.Fields += typeString + // Type is set to "any" for field with annotation "nexus-graphql-jsonencoded" + if parser.IsFieldAnnotationPresent(field, parser.GRAPHQL_JSONENCODED_ANNOTATION) { + specDef.Fields += "any" + } else { + specDef.Fields += typeString + } specDef.Fields += " " + getTag(field, name, false) + "\n" + } for _, child := range parser.GetChildFields(node) { diff --git a/compiler/pkg/openapi_generator/default_schemas.go b/compiler/pkg/openapi_generator/default_schemas.go index 945723965..40ae9cd25 100644 --- a/compiler/pkg/openapi_generator/default_schemas.go +++ b/compiler/pkg/openapi_generator/default_schemas.go @@ -313,10 +313,17 @@ func defaultSchemas() map[string]common.OpenAPIDefinition { k8sAPIMachineryTypeName("apis/meta/v1.ListMeta"): schemaForTypeAndFormat("object", noFormat), k8sAPIMachineryTypeName("apis/meta/v1.ObjectMeta"): schemaForTypeAndFormat("object", noFormat), k8sAPIMachineryTypeName("apis/meta/v1.Time"): schemaForTypeAndFormat("string", noFormat), + k8sAPIMachineryTypeName("util/intstr.IntOrString"): schemaForOneOf( + schemaForTypeAndFormat("integer", noFormat), + schemaForTypeAndFormat("string", noFormat), + ), envoyTypeName("config/core/v3.grpcservice"): schemaForTypeAndFormat("object", noFormat), envoyTypeName("extensions/access_loggers/grpc/v3.commongrpcaccesslogconfig"): schemaForTypeAndFormat("object", noFormat), + // any is an alias for interface{} + "any": schemaForAnyTypeAndFormat("any", noFormat), + // The `openapi-gen` cannot generate Go schema for struct builtin. We mark is // as an object which allows any properties inside "struct{}": schemaForTypeAndFormat("object", noFormat), @@ -325,6 +332,7 @@ func defaultSchemas() map[string]common.OpenAPIDefinition { // defaultSchema is used when YAML generator can't find a schema for given key. // It will also add the missing schema to `missingDefinitions` which can be accessed // with `MissingDefinitions()`. + // defaultSchema: schemaForNonTypeAndFormat("empty", noFormat), defaultSchema: schemaForTypeAndFormat("object", noFormat), } } @@ -379,3 +387,17 @@ func schemaForTypeAndFormat(schemaType, schemaFormat string) common.OpenAPIDefin } return s } + +func schemaForAnyTypeAndFormat(schemaTitle, schemaFormat string) common.OpenAPIDefinition { + s := common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Title: schemaTitle, + }, + }, + } + if schemaFormat != noFormat { + s.Schema.SchemaProps.Format = schemaFormat + } + return s +} diff --git a/compiler/pkg/openapi_generator/generator.go b/compiler/pkg/openapi_generator/generator.go index c2ed99ea2..34bf8d4bc 100644 --- a/compiler/pkg/openapi_generator/generator.go +++ b/compiler/pkg/openapi_generator/generator.go @@ -215,6 +215,13 @@ func (g *Generator) addKubernetesExtensionsFlags(schema *extensionsv1.JSONSchema t := true schema.XPreserveUnknownFields = &t } + // any is an alias for interface{} + if schema.Title == "any" { + t := true + schema.XPreserveUnknownFields = &t + schema.Title = "" // reset Title + } + if len(schema.AnyOf) > 0 { schema.XIntOrString = true } From 6dc662589aca434913438d65fdb81b8ba8b16ee3 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Fri, 17 Mar 2023 20:01:35 +0530 Subject: [PATCH 03/41] Add new type --- compiler/pkg/generator/types_generator.go | 2 +- compiler/pkg/openapi_generator/default_schemas.go | 9 +++++++-- nexus/nexus/nexus.go | 5 +++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/compiler/pkg/generator/types_generator.go b/compiler/pkg/generator/types_generator.go index 42e5a4c27..d0705d4cb 100644 --- a/compiler/pkg/generator/types_generator.go +++ b/compiler/pkg/generator/types_generator.go @@ -173,7 +173,7 @@ type {{.Name}}Spec struct { typeString := ConstructType(aliasNameMap, field) // Type is set to "any" for field with annotation "nexus-graphql-jsonencoded" if parser.IsFieldAnnotationPresent(field, parser.GRAPHQL_JSONENCODED_ANNOTATION) { - specDef.Fields += "any" + specDef.Fields += "nexus.NexusType" } else { specDef.Fields += typeString } diff --git a/compiler/pkg/openapi_generator/default_schemas.go b/compiler/pkg/openapi_generator/default_schemas.go index 40ae9cd25..efc787bdb 100644 --- a/compiler/pkg/openapi_generator/default_schemas.go +++ b/compiler/pkg/openapi_generator/default_schemas.go @@ -322,8 +322,8 @@ func defaultSchemas() map[string]common.OpenAPIDefinition { envoyTypeName("extensions/access_loggers/grpc/v3.commongrpcaccesslogconfig"): schemaForTypeAndFormat("object", noFormat), // any is an alias for interface{} - "any": schemaForAnyTypeAndFormat("any", noFormat), - + // "nexusType": schemaForAnyTypeAndFormat("any", noFormat), + nexusTypeName("nexus.NexusType"): schemaForAnyTypeAndFormat("any", noFormat), // The `openapi-gen` cannot generate Go schema for struct builtin. We mark is // as an object which allows any properties inside "struct{}": schemaForTypeAndFormat("object", noFormat), @@ -357,6 +357,10 @@ func envoyTypeName(name string) string { return fmt.Sprintf("github.com/envoyproxy/go-control-plane/envoy/%v", name) } +func nexusTypeName(name string) string { + return fmt.Sprintf("github.com/vmware-tanzu/graph-framework-for-microservices/nexus/%v", name) +} + func schemaForOneOf(schemas ...common.OpenAPIDefinition) common.OpenAPIDefinition { s := common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -389,6 +393,7 @@ func schemaForTypeAndFormat(schemaType, schemaFormat string) common.OpenAPIDefin } func schemaForAnyTypeAndFormat(schemaTitle, schemaFormat string) common.OpenAPIDefinition { + fmt.Println("1111111>>>>>>>>>", schemaTitle) s := common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ diff --git a/nexus/nexus/nexus.go b/nexus/nexus/nexus.go index 3f843046f..8996870a9 100644 --- a/nexus/nexus/nexus.go +++ b/nexus/nexus/nexus.go @@ -22,6 +22,11 @@ type SingletonNode struct { // NexusGenericObject type. type NexusGenericObject struct{} +// HTTPMethod type. +type NexusType struct { + Name string +} + // HTTPMethod type. type HTTPMethod string From 680f30895eb0b0736c12f93d39a39e9965fae995 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Fri, 17 Mar 2023 20:32:39 +0530 Subject: [PATCH 04/41] Fix graphql resolver --- compiler/pkg/generator/resolver_generator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/pkg/generator/resolver_generator.go b/compiler/pkg/generator/resolver_generator.go index 3475eb726..4cde13c5f 100644 --- a/compiler/pkg/generator/resolver_generator.go +++ b/compiler/pkg/generator/resolver_generator.go @@ -216,7 +216,7 @@ func processNonNexusFields(aliasNameMap map[string]string, node *ast.TypeSpec, continue } - if parser.IsJsonStringField(f) { + if parser.IsJsonStringField(f) || parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_JSONENCODED_ANNOTATION) { fieldProp.IsStringType = true fieldProp.SchemaFieldName = fmt.Sprintf("%s: %s", fieldProp.FieldName, "String") resField[nodeProp.PkgName+nodeProp.NodeName] = append(resField[nodeProp.PkgName+nodeProp.NodeName], fieldProp) From 4577d1df779a47c132447c75cc8bfd8e5f09b5bf Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Wed, 22 Mar 2023 10:50:42 +0530 Subject: [PATCH 05/41] Add new type NexusGenericObject --- compiler/pkg/generator/types_generator.go | 2 +- compiler/pkg/openapi_generator/default_schemas.go | 3 +-- compiler/pkg/openapi_generator/generator.go | 3 ++- nexus/nexus/nexus.go | 5 ----- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/compiler/pkg/generator/types_generator.go b/compiler/pkg/generator/types_generator.go index d0705d4cb..16bd3348c 100644 --- a/compiler/pkg/generator/types_generator.go +++ b/compiler/pkg/generator/types_generator.go @@ -173,7 +173,7 @@ type {{.Name}}Spec struct { typeString := ConstructType(aliasNameMap, field) // Type is set to "any" for field with annotation "nexus-graphql-jsonencoded" if parser.IsFieldAnnotationPresent(field, parser.GRAPHQL_JSONENCODED_ANNOTATION) { - specDef.Fields += "nexus.NexusType" + specDef.Fields += "nexus.NexusGenericObject" } else { specDef.Fields += typeString } diff --git a/compiler/pkg/openapi_generator/default_schemas.go b/compiler/pkg/openapi_generator/default_schemas.go index efc787bdb..71973d514 100644 --- a/compiler/pkg/openapi_generator/default_schemas.go +++ b/compiler/pkg/openapi_generator/default_schemas.go @@ -323,7 +323,7 @@ func defaultSchemas() map[string]common.OpenAPIDefinition { // any is an alias for interface{} // "nexusType": schemaForAnyTypeAndFormat("any", noFormat), - nexusTypeName("nexus.NexusType"): schemaForAnyTypeAndFormat("any", noFormat), + nexusTypeName("nexus.NexusGenericObject"): schemaForAnyTypeAndFormat("any", noFormat), // The `openapi-gen` cannot generate Go schema for struct builtin. We mark is // as an object which allows any properties inside "struct{}": schemaForTypeAndFormat("object", noFormat), @@ -393,7 +393,6 @@ func schemaForTypeAndFormat(schemaType, schemaFormat string) common.OpenAPIDefin } func schemaForAnyTypeAndFormat(schemaTitle, schemaFormat string) common.OpenAPIDefinition { - fmt.Println("1111111>>>>>>>>>", schemaTitle) s := common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ diff --git a/compiler/pkg/openapi_generator/generator.go b/compiler/pkg/openapi_generator/generator.go index 34bf8d4bc..4f5470b09 100644 --- a/compiler/pkg/openapi_generator/generator.go +++ b/compiler/pkg/openapi_generator/generator.go @@ -215,7 +215,8 @@ func (g *Generator) addKubernetesExtensionsFlags(schema *extensionsv1.JSONSchema t := true schema.XPreserveUnknownFields = &t } - // any is an alias for interface{} + // any is an alias for struct{} + // - x-kubernetes-preserve-unknown-fields: true if schema.Title == "any" { t := true schema.XPreserveUnknownFields = &t diff --git a/nexus/nexus/nexus.go b/nexus/nexus/nexus.go index 8996870a9..3f843046f 100644 --- a/nexus/nexus/nexus.go +++ b/nexus/nexus/nexus.go @@ -22,11 +22,6 @@ type SingletonNode struct { // NexusGenericObject type. type NexusGenericObject struct{} -// HTTPMethod type. -type NexusType struct { - Name string -} - // HTTPMethod type. type HTTPMethod string From 7a25149b85805f46ac7b603961bb8e7db4da56e2 Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Mon, 27 Mar 2023 14:04:30 +0200 Subject: [PATCH 06/41] Use upper case first letter for non global nodes --- compiler/pkg/generator/tsm_graphql_generator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/pkg/generator/tsm_graphql_generator.go b/compiler/pkg/generator/tsm_graphql_generator.go index 2d2dc85e0..6ca57e14f 100644 --- a/compiler/pkg/generator/tsm_graphql_generator.go +++ b/compiler/pkg/generator/tsm_graphql_generator.go @@ -462,7 +462,7 @@ func GenerateTsmGraphqlSchemaVars(baseGroupName, crdModulePath string, pkgs pars } else if pkg.Name == "tsm" { continue } else { - nodeProp.SchemaName = fmt.Sprintf("%s_%s", pkg.Name, parser.GetTypeName(node)) + nodeProp.SchemaName = fmt.Sprintf("%s_%s", strings.Title(pkg.Name), parser.GetTypeName(node)) } // Iterate each node's nexus fields and set its properties tsmProcessNexusFields(pkg, aliasNameMap, node, nodeProp, simpleGroupTypeName, pkgs, gqlSpecMap) From 8cf21730a2acb9182ba617071239a0163e4b134a Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Mon, 27 Mar 2023 14:36:50 +0200 Subject: [PATCH 07/41] Use upper case first letter for field schema name --- compiler/pkg/generator/graphql_common.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/pkg/generator/graphql_common.go b/compiler/pkg/generator/graphql_common.go index 9887d7dcd..070837afa 100644 --- a/compiler/pkg/generator/graphql_common.go +++ b/compiler/pkg/generator/graphql_common.go @@ -302,7 +302,7 @@ func getGraphqlSchemaName(pattern, fieldName, schemaType string, f *ast.Field) s schemaName = fmt.Sprintf(pattern, getAliasFieldValue(fieldName, f), schemaType) } - schemaName = strings.TrimPrefix(schemaName, "global_") + schemaName = strings.Title(strings.TrimPrefix(schemaName, "global_")) return schemaName } From d78ffae0c89d37b364c2bc8f64a2261512809c5a Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Mon, 27 Mar 2023 19:31:57 +0530 Subject: [PATCH 08/41] Add Node NotifyCallBack in nexus-client --- .../pkg/generator/template/client.go.tmpl | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index 1b79dd8a2..c97631e4b 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -16,6 +16,7 @@ import ( "context" "encoding/json" "sync" + "fmt" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/rest" @@ -71,6 +72,7 @@ func (c *Clientset) UnsubscribeAll() { return true }) } + // NewForConfig returns Client which can be which can be used to connect to database func NewForConfig(config *rest.Config) (*Clientset, error) { baseClient, err := baseClientset.NewForConfig(config) @@ -830,6 +832,36 @@ func (c *{{$node.GroupResourceType}}Chainer) IsSubscribed() bool { return ok } +func (c *{{$node.GroupResourceType}}Chainer) NotifyOnAdd(cbfn func(obj interface{})) { + fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> NotifyOnAdd!") + stopper := make(chan struct{}) + informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) + informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: cbfn, + }) + go informer.Run(stopper) +} + +func (c *{{$node.GroupResourceType}}Chainer) NotifyOnUpdate(cbfn func(oldObj interface{}, newObj interface{})) { + fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> NotifyOnUpdate!") + stopper := make(chan struct{}) + informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) + informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + UpdateFunc: cbfn, + }) + go informer.Run(stopper) +} + +func (c *{{$node.GroupResourceType}}Chainer) NotifyOnDelete(cbfn func(obj interface{})) { + fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> NotifyOnDelete!") + stopper := make(chan struct{}) + informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) + informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + DeleteFunc: cbfn, + }) + go informer.Run(stopper) +} + {{if .HasStatus}} // Clear{{$node.StatusName}} to clear user defined status func (c *{{$node.GroupResourceType}}Chainer) Clear{{$node.StatusName}}(ctx context.Context) (err error) { From 547915e89ae2e78765e1141f5469da5f6a0e206d Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Tue, 28 Mar 2023 20:31:57 +0530 Subject: [PATCH 09/41] Add RegisterCB function --- .../pkg/generator/template/client.go.tmpl | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index c97631e4b..4c72a6807 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -862,6 +862,93 @@ func (c *{{$node.GroupResourceType}}Chainer) NotifyOnDelete(cbfn func(obj interf go informer.Run(stopper) } +func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj *{{$node.GroupBaseImport}})) (cache.ResourceEventHandlerRegistration, error){ + fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> RegisterAddCallback!") + var ( + registrationId cache.ResourceEventHandlerRegistration + err error + ) + key := "{{$node.CrdName}}" + stopper := make(chan struct{}) + if s, ok := subscriptionMap.Load(key); ok { + fmt.Println("[{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}] ---SUBSCRIBE-INFORMER---->") + sub := s.(subscription) + registrationId,err = sub.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}){ + cbfn(obj.(*{{$node.GroupBaseImport}})) + }, + }) + } else { + fmt.Println("[{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}] ---NEW-INFORMER---->") + informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) + registrationId,err = informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}){ + cbfn(obj.(*{{$node.GroupBaseImport}})) + }, + }) + go informer.Run(stopper) + } + return registrationId,err +} + +func (c *{{$node.GroupResourceType}}Chainer) RegisterUpdateCallback(cbfn func(oldObj,newObj *{{$node.GroupBaseImport}})) (cache.ResourceEventHandlerRegistration, error){ + fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> RegisterUpdateCallback!") + var ( + registrationId cache.ResourceEventHandlerRegistration + err error + ) + key := "{{$node.CrdName}}" + stopper := make(chan struct{}) + if s, ok := subscriptionMap.Load(key); ok { + fmt.Println("[{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}] ---SUBSCRIBE-INFORMER---->") + sub := s.(subscription) + registrationId,err = sub.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + UpdateFunc: func(oldObj,newObj interface{}){ + cbfn(oldObj.(*{{$node.GroupBaseImport}}),newObj.(*{{$node.GroupBaseImport}})) + }, + }) + } else { + fmt.Println("[{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}] ---NEW-INFORMER---->") + informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) + registrationId,err = informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + UpdateFunc: func(oldObj,newObj interface{}){ + cbfn(oldObj.(*{{$node.GroupBaseImport}}),newObj.(*{{$node.GroupBaseImport}})) + }, + }) + go informer.Run(stopper) + } + return registrationId,err +} + +func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(obj *{{$node.GroupBaseImport}})) (cache.ResourceEventHandlerRegistration, error){ + fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> RegisterDeleteCallback!") + var ( + registrationId cache.ResourceEventHandlerRegistration + err error + ) + key := "{{$node.CrdName}}" + stopper := make(chan struct{}) + if s, ok := subscriptionMap.Load(key); ok { + fmt.Println("[{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}] ---SUBSCRIBE-INFORMER---->") + sub := s.(subscription) + registrationId,err = sub.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + DeleteFunc: func(obj interface{}){ + cbfn(obj.(*{{$node.GroupBaseImport}})) + }, + }) + } else { + fmt.Println("[{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}] ---NEW-INFORMER---->") + informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) + registrationId,err = informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + DeleteFunc: func(obj interface{}){ + cbfn(obj.(*{{$node.GroupBaseImport}})) + }, + }) + go informer.Run(stopper) + } + return registrationId,err +} + {{if .HasStatus}} // Clear{{$node.StatusName}} to clear user defined status func (c *{{$node.GroupResourceType}}Chainer) Clear{{$node.StatusName}}(ctx context.Context) (err error) { From b33822750c6285225960aa805fb23ac92657d48f Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Tue, 28 Mar 2023 09:45:59 +0200 Subject: [PATCH 10/41] Parse non nexus nodes and types and copy them to model dir --- compiler/cmd/preparser/main.go | 6 +- compiler/pkg/parser/pkg.go | 1 + compiler/pkg/preparser/preparser.go | 99 ++++++++++++++++++++--------- 3 files changed, 74 insertions(+), 32 deletions(-) diff --git a/compiler/cmd/preparser/main.go b/compiler/cmd/preparser/main.go index 16b13217a..461498c97 100644 --- a/compiler/cmd/preparser/main.go +++ b/compiler/cmd/preparser/main.go @@ -26,13 +26,13 @@ func main() { log.Fatal(err) } - err = preparser.CopyPkgsToBuild(*dslDir, *outputDir) + packages = preparser.Parse(*dslDir) + err = preparser.RenderImports(packages, *outputDir, *modPath) if err != nil { log.Fatal(err) } - packages = preparser.Parse(*dslDir) - err = preparser.RenderImports(packages, *outputDir, *modPath) + err = preparser.CopyPkgsToBuild(packages, *outputDir) if err != nil { log.Fatal(err) } diff --git a/compiler/pkg/parser/pkg.go b/compiler/pkg/parser/pkg.go index da7b1a73c..73ccabcf7 100644 --- a/compiler/pkg/parser/pkg.go +++ b/compiler/pkg/parser/pkg.go @@ -27,6 +27,7 @@ type PackageNodeRelation struct { type Package struct { Name string FullName string + Dir string //new fields ModPath string diff --git a/compiler/pkg/preparser/preparser.go b/compiler/pkg/preparser/preparser.go index 0872bc98d..6efa401f0 100644 --- a/compiler/pkg/preparser/preparser.go +++ b/compiler/pkg/preparser/preparser.go @@ -9,14 +9,12 @@ import ( "go/token" "go/types" "io/fs" - "io/ioutil" "os" "path/filepath" "strconv" "strings" "text/template" - cp "github.com/otiai10/copy" log "github.com/sirupsen/logrus" "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/parser" "golang.org/x/tools/imports" @@ -60,6 +58,7 @@ func Parse(startPath string) map[string][]*parser.Package { ModPath: modulePath, FullName: pkgImport, FileSet: fileset, + Dir: info.Name(), Pkg: *v, } parser.ParseGenDecls(v, &pkg) @@ -216,33 +215,6 @@ func Render(dslDir string, packages map[string][]*parser.Package) error { return nil } -func CopyPkgsToBuild(dslDir string, outputDir string) error { - dir, err := ioutil.ReadDir(dslDir) - if err != nil { - return err - } - - for _, f := range dir { - if !f.IsDir() || f.Name() == "build" || f.Name() == "vendor" || - f.Name() == "global" || strings.HasPrefix(f.Name(), ".") { - continue - } - - opt := cp.Options{ - Skip: func(srcinfo os.FileInfo, src, dest string) (bool, error) { - return !strings.HasSuffix(src, ".go"), nil - }, - } - - err := cp.Copy(filepath.Join(dslDir, f.Name()), filepath.Join(outputDir, "model", f.Name()), opt) - if err != nil { - return err - } - } - - return nil -} - var importsTemplate = `{{range .ImportsToRender}}{{.}} {{end}}` @@ -292,3 +264,72 @@ func RenderImports(packages map[string][]*parser.Package, outputDir string, modP return nil } + +func CopyPkgsToBuild(packages map[string][]*parser.Package, outputDir string) error { + for k, pkgs := range packages { + if k == "global" { + continue + } + + for _, v := range pkgs { + + for path, f := range v.Pkg.Files { + var output = fmt.Sprintf(`package %s +`, v.Name) + filename := filepath.Base(path) + + declLoop: + for _, decl := range f.Decls { + switch decl.(type) { + case *ast.GenDecl: + genDecl := decl.(*ast.GenDecl) + for _, spec := range genDecl.Specs { + if typeSpec, ok := spec.(*ast.TypeSpec); ok { + if parser.IsNexusNode(typeSpec) { + continue declLoop + } + } + } + + str, err := v.GenDeclToString(genDecl) + if err != nil { + return err + } + + output += fmt.Sprintf("%s\n\n", str) + } + } + + // format file & organize imports using imports package + out, err := imports.Process(filename, []byte(output), nil) + if err != nil { + return err + } + + modelDir := filepath.Join(outputDir, "model", v.Dir) + + err = os.MkdirAll(modelDir, os.ModePerm) + if err != nil { + return err + } + + // create file and write output + f, err := os.Create(filepath.Join(modelDir, filename)) + if err != nil { + return err + } + _, err = f.Write(out) + if err != nil { + return err + } + + err = f.Close() + if err != nil { + return err + } + } + } + } + + return nil +} From fe8c6e0d66971ea98c1b6a86dc03fb372e71973a Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Tue, 28 Mar 2023 22:56:27 +0530 Subject: [PATCH 11/41] upgrade client-go to v0.26.3 --- compiler/go.mod | 4 ++-- compiler/go.sum | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/compiler/go.mod b/compiler/go.mod index 4de5e9876..57eb244d0 100644 --- a/compiler/go.mod +++ b/compiler/go.mod @@ -20,8 +20,8 @@ require ( golang.org/x/text v0.7.0 golang.org/x/tools v0.1.12 k8s.io/apiextensions-apiserver v0.24.0 - k8s.io/apimachinery v0.26.0 - k8s.io/client-go v0.24.0 + k8s.io/apimachinery v0.26.3 + k8s.io/client-go v0.26.3 k8s.io/gengo v0.0.0-20220307231824-4627b89bbf1b k8s.io/utils v0.0.0-20221107191617-1a15be271d1d ) diff --git a/compiler/go.sum b/compiler/go.sum index 049ec93ea..5ad77ea69 100644 --- a/compiler/go.sum +++ b/compiler/go.sum @@ -1346,9 +1346,11 @@ k8s.io/apiextensions-apiserver v0.24.0/go.mod h1:iuVe4aEpe6827lvO6yWQVxiPSpPoSKV k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= k8s.io/apimachinery v0.26.0 h1:1feANjElT7MvPqp0JT6F3Ss6TWDwmcjLypwoPpEf7zg= k8s.io/apimachinery v0.26.0/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu74= +k8s.io/apimachinery v0.26.3/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= k8s.io/apiserver v0.24.0/go.mod h1:WFx2yiOMawnogNToVvUYT9nn1jaIkMKj41ZYCVycsBA= k8s.io/client-go v0.24.0 h1:lbE4aB1gTHvYFSwm6eD3OF14NhFDKCejlnsGYlSJe5U= k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= +k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ= k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= From 0a36dbaef4d2939e9912faa6c07ec434e6f2456d Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Tue, 28 Mar 2023 23:17:30 +0530 Subject: [PATCH 12/41] upgrade client-go to v0.26.3 --- compiler/scripts/pin_deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/scripts/pin_deps.sh b/compiler/scripts/pin_deps.sh index 2918d8945..07f536ffb 100755 --- a/compiler/scripts/pin_deps.sh +++ b/compiler/scripts/pin_deps.sh @@ -35,7 +35,7 @@ go mod edit -require github.com/cespare/xxhash/v2@v2.1.2 go mod edit -require github.com/google/gofuzz@v1.1.0 go mod edit -require github.com/imdario/mergo@v0.3.12 go mod edit -require k8s.io/apimachinery@v0.25.3 -go mod edit -require k8s.io/client-go@v0.25.3 +go mod edit -require k8s.io/client-go@v0.26.3 go mod edit -require golang.org/x/sys@v0.2.0 go mod edit -require golang.org/x/time@v0.0.0-20220210224613-90d013bbcef8 go mod edit -require golang.org/x/term@v0.2.0 From dbb684d61d5b8d382c0fc9f43dabb403ae8c7485 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Wed, 29 Mar 2023 15:14:20 +0530 Subject: [PATCH 13/41] Pin k8s client-go version --- .../github.com/kubernetes/code-generator | 2 +- .../example/datamodel/config/policy/policy.go | 2 +- compiler/go.mod | 68 +++++++++++- compiler/go.sum | 101 ++++++++++++++++++ compiler/manifest.yaml | 2 +- compiler/scripts/pin_deps.sh | 3 +- 6 files changed, 169 insertions(+), 9 deletions(-) diff --git a/compiler/_deps/github.com/kubernetes/code-generator b/compiler/_deps/github.com/kubernetes/code-generator index 7b37ed0d1..ba94e6569 160000 --- a/compiler/_deps/github.com/kubernetes/code-generator +++ b/compiler/_deps/github.com/kubernetes/code-generator @@ -1 +1 @@ -Subproject commit 7b37ed0d1025c4a4ae00f8412371eead4436c4d8 +Subproject commit ba94e6569bf718b0e59f4113990955b8718945ca diff --git a/compiler/example/datamodel/config/policy/policy.go b/compiler/example/datamodel/config/policy/policy.go index 326a88774..3d144ff66 100644 --- a/compiler/example/datamodel/config/policy/policy.go +++ b/compiler/example/datamodel/config/policy/policy.go @@ -1,7 +1,7 @@ package policypkg import ( - "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/example/datamodel/config/gns/service-group" + servicegroup "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/example/datamodel/config/gns/service-group" "github.com/vmware-tanzu/graph-framework-for-microservices/nexus/nexus" ) diff --git a/compiler/go.mod b/compiler/go.mod index 57eb244d0..f1423e4fe 100644 --- a/compiler/go.mod +++ b/compiler/go.mod @@ -16,42 +16,64 @@ require ( github.com/vmware-tanzu/graph-framework-for-microservices/common-library v0.0.0-20221129104902-06818e531062 github.com/vmware-tanzu/graph-framework-for-microservices/kube-openapi v0.0.0-20220603123335-7416bd4754d3 github.com/vmware-tanzu/graph-framework-for-microservices/nexus v0.0.0-00010101000000-000000000000 - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 + golang.org/x/mod v0.6.0 golang.org/x/text v0.7.0 - golang.org/x/tools v0.1.12 - k8s.io/apiextensions-apiserver v0.24.0 + golang.org/x/tools v0.2.0 + k8s.io/apiextensions-apiserver v0.26.3 k8s.io/apimachinery v0.26.3 k8s.io/client-go v0.26.3 - k8s.io/gengo v0.0.0-20220307231824-4627b89bbf1b + k8s.io/gengo v0.0.0-20220902162205-c0856e24416d k8s.io/utils v0.0.0-20221107191617-1a15be271d1d ) require ( github.com/BurntSushi/toml v1.2.1 // indirect + github.com/NYTimes/gziphandler v1.1.1 // indirect + github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 // indirect + github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/blang/semver/v4 v4.0.0 // indirect + github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/coreos/go-semver v0.3.0 // indirect + github.com/coreos/go-systemd/v22 v22.3.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful v2.16.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/evanphx/json-patch v4.12.0+incompatible // indirect + github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.21.1 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/gonvenience/bunt v1.3.4 // indirect github.com/gonvenience/neat v1.3.11 // indirect github.com/gonvenience/term v1.0.2 // indirect github.com/gonvenience/text v1.0.7 // indirect github.com/gonvenience/wrap v1.1.2 // indirect github.com/gonvenience/ytbx v1.4.4 // indirect + github.com/google/cel-go v0.12.6 // indirect github.com/google/gnostic v0.6.9 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/homeport/dyff v1.5.6 // indirect + github.com/imdario/mergo v0.3.6 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/mattn/go-ciede2000 v0.0.0-20170301095244-782e8c62fec3 // indirect github.com/mattn/go-isatty v0.0.16 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect github.com/mitchellh/hashstructure v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -59,21 +81,57 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nxadm/tail v1.4.8 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.37.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect github.com/sergi/go-diff v1.2.0 // indirect + github.com/spf13/cobra v1.6.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stoewer/go-strcase v1.2.0 // indirect github.com/texttheater/golang-levenshtein v1.0.1 // indirect github.com/virtuald/go-ordered-json v0.0.0-20170621173500-b18e6e673d74 // indirect + go.etcd.io/etcd/api/v3 v3.5.5 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.5 // indirect + go.etcd.io/etcd/client/v3 v3.5.5 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0 // indirect + go.opentelemetry.io/otel v1.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0 // indirect + go.opentelemetry.io/otel/metric v0.31.0 // indirect + go.opentelemetry.io/otel/sdk v1.10.0 // indirect + go.opentelemetry.io/otel/trace v1.10.0 // indirect + go.opentelemetry.io/proto/otlp v0.19.0 // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + go.uber.org/zap v1.19.0 // indirect + golang.org/x/crypto v0.1.0 // indirect golang.org/x/net v0.7.0 // indirect + golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde // indirect golang.org/x/sys v0.5.0 // indirect golang.org/x/term v0.5.0 // indirect + golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 // indirect + google.golang.org/grpc v1.49.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.26.3 // indirect + k8s.io/apiserver v0.26.3 // indirect + k8s.io/component-base v0.26.3 // indirect k8s.io/klog/v2 v2.80.1 // indirect + k8s.io/kms v0.26.3 // indirect k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.36 // indirect sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect diff --git a/compiler/go.sum b/compiler/go.sum index 5ad77ea69..c203f38f1 100644 --- a/compiler/go.sum +++ b/compiler/go.sum @@ -187,6 +187,7 @@ github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -198,26 +199,35 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves= +github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -238,8 +248,10 @@ github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u9 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -262,6 +274,8 @@ github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.16.0+incompatible h1:rgqiKNjTnFQA6kkhFe16D8epTksy9HQ1MyrbDXSdYhM= github.com/emicklei/go-restful v2.16.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -278,6 +292,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -286,6 +302,8 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= @@ -297,14 +315,19 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= @@ -331,6 +354,7 @@ github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -382,6 +406,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= +github.com/google/cel-go v0.12.6 h1:kjeKudqV0OygrAqA9fX6J55S8gj+Jre2tckIm5RoG4M= +github.com/google/cel-go v0.12.6/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw= github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= @@ -448,9 +474,13 @@ github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -478,7 +508,11 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -525,6 +559,8 @@ github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peK github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= +github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -620,23 +656,32 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -668,11 +713,14 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.6.0 h1:42a0n6jwCot1pUmomAp4T7DeMD+20LFv4Q54pxLf2LI= +github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -710,11 +758,17 @@ go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.5 h1:BX4JIbQ7hl7+jL+g+2j5UAr0o1bctCm6/Ct+ArBGkf0= +go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.5 h1:9S0JUVvmrVl7wCF39iTQthdaaNIiAaQbmK75ogO6GU8= +go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= +go.etcd.io/etcd/client/v3 v3.5.5 h1:q++2WTJbUgpQu4B6hCuT7VkdwaTP7Qz6Daak3WzbrlI= +go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c= go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= @@ -727,23 +781,46 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 h1:xFSRQBbXF6VvYRf2lqMJXxoB72XI1K/azav8TekHHSw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0 h1:Ajldaqhxqw/gNzQA45IKFWLdG7jZuXX/wBW1d5qvbUI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 h1:TaB+1rQhddO1sF71MpZOZAuSPW1klK2M8XxfrBMfK7Y= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0 h1:pDDYmo0QadUPal5fwXoY1pmMpFcdyhXOmL5drCrI3vU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0 h1:KtiUEhQmj/Pa874bVYKGNVdq8NPKiacPbaRRtgXi+t4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs= +go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY= +go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -756,6 +833,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -872,6 +950,7 @@ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= @@ -984,6 +1063,7 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -1214,6 +1294,7 @@ google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 h1:hrbNEivu7Zn1pxvHk6MBrq9iE22woVILTHqexqBxe6I= google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= @@ -1267,6 +1348,8 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= @@ -1274,6 +1357,7 @@ google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= @@ -1307,6 +1391,7 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -1341,27 +1426,41 @@ istio.io/api v0.0.0-20221222163824-3417dfab291b/go.mod h1:+IPBhFYUZBqH7ATQoxMCu1 k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= k8s.io/api v0.26.0 h1:IpPlZnxBpV1xl7TGk/X6lFtpgjgntCg8PJ+qrPHAC7I= k8s.io/api v0.26.0/go.mod h1:k6HDTaIFC8yn1i6pSClSqIwLABIcLV9l5Q4EcngKnQg= +k8s.io/api v0.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU= +k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE= k8s.io/apiextensions-apiserver v0.24.0 h1:JfgFqbA8gKJ/uDT++feAqk9jBIwNnL9YGdQvaI9DLtY= k8s.io/apiextensions-apiserver v0.24.0/go.mod h1:iuVe4aEpe6827lvO6yWQVxiPSpPoSKVjkq+MIdg84cM= +k8s.io/apiextensions-apiserver v0.26.3 h1:5PGMm3oEzdB1W/FTMgGIDmm100vn7IaUP5er36dB+YE= +k8s.io/apiextensions-apiserver v0.26.3/go.mod h1:jdA5MdjNWGP+njw1EKMZc64xAT5fIhN6VJrElV3sfpQ= k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= k8s.io/apimachinery v0.26.0 h1:1feANjElT7MvPqp0JT6F3Ss6TWDwmcjLypwoPpEf7zg= k8s.io/apimachinery v0.26.0/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu74= +k8s.io/apimachinery v0.26.3 h1:dQx6PNETJ7nODU3XPtrwkfuubs6w7sX0M8n61zHIV/k= k8s.io/apimachinery v0.26.3/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= k8s.io/apiserver v0.24.0/go.mod h1:WFx2yiOMawnogNToVvUYT9nn1jaIkMKj41ZYCVycsBA= +k8s.io/apiserver v0.26.3 h1:blBpv+yOiozkPH2aqClhJmJY+rp53Tgfac4SKPDJnU4= +k8s.io/apiserver v0.26.3/go.mod h1:CJe/VoQNcXdhm67EvaVjYXxR3QyfwpceKPuPaeLibTA= k8s.io/client-go v0.24.0 h1:lbE4aB1gTHvYFSwm6eD3OF14NhFDKCejlnsGYlSJe5U= k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= +k8s.io/client-go v0.26.3 h1:k1UY+KXfkxV2ScEL3gilKcF7761xkYsSD6BC9szIu8s= k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ= k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= +k8s.io/component-base v0.26.3 h1:oC0WMK/ggcbGDTkdcqefI4wIZRYdK3JySx9/HADpV0g= +k8s.io/component-base v0.26.3/go.mod h1:5kj1kZYwSC6ZstHJN7oHBqcJC6yyn41eR+Sqa/mQc8E= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20220307231824-4627b89bbf1b h1:vEhKDJESYfeRiaBNmRvO+/12RAo1cFeu6vGm1fBFY34= k8s.io/gengo v0.0.0-20220307231824-4627b89bbf1b/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20220902162205-c0856e24416d h1:U9tB195lKdzwqicbJvyJeOXV7Klv+wNAWENRnXEGi08= +k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kms v0.26.3 h1:+rC4BMeMBkH5hrfZt9WFMRrs2m3vY2rXymisNactcTY= +k8s.io/kms v0.26.3/go.mod h1:69qGnf1NsFOQP07fBYqNLZklqEHSJF024JqYCaeVxHg= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= @@ -1373,6 +1472,8 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.36 h1:PUuX1qIFv309AT8hF/CdPKDmsG/hn/L8zRX7VvISM3A= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.36/go.mod h1:WxjusMwXlKzfAs4p9km6XJRndVt2FROgMVCE4cdohFo= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= diff --git a/compiler/manifest.yaml b/compiler/manifest.yaml index 02ecccd18..326e29fca 100644 --- a/compiler/manifest.yaml +++ b/compiler/manifest.yaml @@ -6,4 +6,4 @@ k8s_clients: k8s_code_generator_git_tag: v0.16.15 - name: k8s-1.22 k8s_version: 1.22 # compatible with client-go >= 1.18 - k8s_code_generator_git_tag: v0.22.5 + k8s_code_generator_git_tag: v0.26.3 diff --git a/compiler/scripts/pin_deps.sh b/compiler/scripts/pin_deps.sh index 07f536ffb..da42baaf3 100755 --- a/compiler/scripts/pin_deps.sh +++ b/compiler/scripts/pin_deps.sh @@ -34,7 +34,7 @@ go mod edit -replace github.com/vmware-tanzu/graph-framework-for-microservices/n go mod edit -require github.com/cespare/xxhash/v2@v2.1.2 go mod edit -require github.com/google/gofuzz@v1.1.0 go mod edit -require github.com/imdario/mergo@v0.3.12 -go mod edit -require k8s.io/apimachinery@v0.25.3 +go mod edit -require k8s.io/apimachinery@v0.26.3 go mod edit -require k8s.io/client-go@v0.26.3 go mod edit -require golang.org/x/sys@v0.2.0 go mod edit -require golang.org/x/time@v0.0.0-20220210224613-90d013bbcef8 @@ -45,3 +45,4 @@ go mod edit -require k8s.io/klog/v2@v2.70.1 go mod edit -require golang.org/x/net@v0.2.0 go mod edit -require google.golang.org/grpc@v1.51.0 go mod edit -require k8s.io/utils@v0.0.0-20221128185143-99ec85e7a448 +go mod edit -require sigs.k8s.io/controller-runtime@v0.14.1 From db07d2e51ae014a0158e72490e44c37248ba4eae Mon Sep 17 00:00:00 2001 From: Janakiraman Date: Wed, 29 Mar 2023 21:53:52 +0530 Subject: [PATCH 14/41] COSMOS-893 Make graphql server as go binary directly to run , instead of loading as plugin (#139) * NPT-632: Cosmos DM nexus compiler changes * COSMOS-856 and COSMOS-858 Fix * Add new type * Fix graphql resolver * Add new type NexusGenericObject * add go pin version * use without plugin mode * Use upper case first letter for non global nodes * Use upper case first letter for field schema name * Add Node NotifyCallBack in nexus-client * Parse non nexus nodes and types and copy them to model dir --------- Co-authored-by: Vishnubabu Co-authored-by: rjanakiraman Co-authored-by: Kacper Sawicki --- compiler/Makefile | 6 +++--- .../pkg/generator/template/graphql/server.go.tmpl | 13 ++++++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/compiler/Makefile b/compiler/Makefile index 95484f0fb..5b4598c5b 100644 --- a/compiler/Makefile +++ b/compiler/Makefile @@ -205,9 +205,9 @@ generate_code: cd ${GOPATH}/src/nexustempmodule && cd nexus-gql && go mod init && \ go mod edit -replace nexustempmodule=${GOPATH}/src/nexustempmodule && \ ${COMPILER_SRC_DIRECTORY}/scripts/pin_graphql_build_version.sh ${COMPILER_SRC_DIRECTORY} && \ - go mod tidy -e 2>/dev/null && \ - CGO_ENABLED=1 GOOS=linux \ - go build --trimpath -o graphql.so -buildmode=plugin server.go + go mod edit -go=1.18 && \ + go mod tidy && \ + CGO_ENABLED=1 GOARCH=amd64 GOOS=linux go build -ldflags="-w -s" server.go @echo "Updating module name" ./scripts/replace_mod_path.sh find . -name "*.bak" -type f -delete diff --git a/compiler/pkg/generator/template/graphql/server.go.tmpl b/compiler/pkg/generator/template/graphql/server.go.tmpl index 9ca8a4090..bcc165a0b 100644 --- a/compiler/pkg/generator/template/graphql/server.go.tmpl +++ b/compiler/pkg/generator/template/graphql/server.go.tmpl @@ -11,7 +11,6 @@ import ( "github.com/vmware-tanzu/graph-framework-for-microservices/gqlgen/graphql/playground" ) - func StartHttpServer() { c := cors.New(cors.Options{ AllowedOrigins: []string{"*"}, @@ -25,3 +24,15 @@ func StartHttpServer() { http.Handle("/", HttpHandlerFunc) http.Handle("/query", c.Handler(Hander_server)) } + +func main() { + port := os.Getenv("PORT") + if port == "" { + port = "8080" + } + StartHttpServer() + srv := &http.Server{Addr: fmt.Sprintf(":%s", port)} + if err := srv.ListenAndServe(); err != nil { + fmt.Printf("Error in starting graphql server") + } +} \ No newline at end of file From 396c95beb094b4f5ea0ec3f1635c90923ecfa272 Mon Sep 17 00:00:00 2001 From: rjanakiraman Date: Wed, 29 Mar 2023 22:00:09 +0530 Subject: [PATCH 15/41] when commit pushed --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a8bcb7cef..320b981d5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,5 +1,9 @@ name: Build Compiler image on: + push: + branches: + - 'npt-632' + - 'main' pull_request: branches: [ main ] jobs: From c072d50d25b9d3904d903e17d62b587b27d82850 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Thu, 30 Mar 2023 11:55:16 +0530 Subject: [PATCH 16/41] set apiextensions-apiserver as require --- compiler/scripts/pin_deps.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/compiler/scripts/pin_deps.sh b/compiler/scripts/pin_deps.sh index da42baaf3..cae1768f0 100755 --- a/compiler/scripts/pin_deps.sh +++ b/compiler/scripts/pin_deps.sh @@ -36,6 +36,7 @@ go mod edit -require github.com/google/gofuzz@v1.1.0 go mod edit -require github.com/imdario/mergo@v0.3.12 go mod edit -require k8s.io/apimachinery@v0.26.3 go mod edit -require k8s.io/client-go@v0.26.3 +go mod edit -require k8s.io/apiextensions-apiserver@v0.26.3 go mod edit -require golang.org/x/sys@v0.2.0 go mod edit -require golang.org/x/time@v0.0.0-20220210224613-90d013bbcef8 go mod edit -require golang.org/x/term@v0.2.0 From 938136e13f1ff6a6c30ef740837e3e6239295a81 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Thu, 30 Mar 2023 12:34:19 +0530 Subject: [PATCH 17/41] Update require k8s lib --- compiler/scripts/pin_deps.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/compiler/scripts/pin_deps.sh b/compiler/scripts/pin_deps.sh index cae1768f0..b1feca5c0 100755 --- a/compiler/scripts/pin_deps.sh +++ b/compiler/scripts/pin_deps.sh @@ -21,6 +21,8 @@ COMPILER_SRC_DIRECTORY=$1 go mod edit -require github.com/elliotchance/orderedmap@v1.4.0 go mod edit -require k8s.io/apimachinery@$DEFAULT_CLIENT_VERSION_TAG go mod edit -require k8s.io/client-go@$DEFAULT_CLIENT_VERSION_TAG +go mod edit -require k8s.io/api@$DEFAULT_CLIENT_VERSION_TAG +go mod edit -require k8s.io/apiextensions-apiserver@$DEFAULT_CLIENT_VERSION_TAG go mod edit -replace k8s.io/api=k8s.io/api@$DEFAULT_CLIENT_VERSION_TAG @@ -34,9 +36,6 @@ go mod edit -replace github.com/vmware-tanzu/graph-framework-for-microservices/n go mod edit -require github.com/cespare/xxhash/v2@v2.1.2 go mod edit -require github.com/google/gofuzz@v1.1.0 go mod edit -require github.com/imdario/mergo@v0.3.12 -go mod edit -require k8s.io/apimachinery@v0.26.3 -go mod edit -require k8s.io/client-go@v0.26.3 -go mod edit -require k8s.io/apiextensions-apiserver@v0.26.3 go mod edit -require golang.org/x/sys@v0.2.0 go mod edit -require golang.org/x/time@v0.0.0-20220210224613-90d013bbcef8 go mod edit -require golang.org/x/term@v0.2.0 From b90832575a40e31b615aa7f862f56a503dd31545 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Thu, 30 Mar 2023 14:43:32 +0530 Subject: [PATCH 18/41] Fatal node without parent --- compiler/example/datamodel/config/config.go | 2 +- compiler/pkg/generator/resolver_generator.go | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/compiler/example/datamodel/config/config.go b/compiler/example/datamodel/config/config.go index 12943e4b9..c9e32c84e 100644 --- a/compiler/example/datamodel/config/config.go +++ b/compiler/example/datamodel/config/config.go @@ -4,7 +4,7 @@ import ( "net/http" "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/example/datamodel/config/gns" - "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/example/datamodel/config/gns/service-group" + servicegroup "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/example/datamodel/config/gns/service-group" py "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/example/datamodel/config/policy" "github.com/vmware-tanzu/graph-framework-for-microservices/nexus/nexus" ) diff --git a/compiler/pkg/generator/resolver_generator.go b/compiler/pkg/generator/resolver_generator.go index 4cde13c5f..beefed92b 100644 --- a/compiler/pkg/generator/resolver_generator.go +++ b/compiler/pkg/generator/resolver_generator.go @@ -408,9 +408,12 @@ func GenerateGraphqlResolverVars(baseGroupName, crdModulePath string, pkgs parse nodeProp.IsParentNode = parser.IsNexusNode(node) nodeProp.CustomQueries = nodeHelper.GraphqlQuerySpec.Queries + if parser.IsNexusNode(node) && len(nodeHelper.Parents) == 0 && !rootOfGraph { + log.Debugf("Root of the graph, [Node: %s]", nodeProp.NodeName) + } + if parser.IsNexusNode(node) && len(nodeHelper.Parents) == 0 && rootOfGraph { - log.Errorf("Can't allow multiple root of the graph, skipping Node:%s", nodeProp.NodeName) - continue + log.Fatalf("[Node: %s] doesn't have parent", nodeProp.NodeName) } if parser.IsNexusNode(node) { From f3f5e5ff42c45f9ee9e3e4dff15973d1b3bd7ca1 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Thu, 30 Mar 2023 20:00:36 +0530 Subject: [PATCH 19/41] Fix GNS Plural issue --- compiler/pkg/util/namers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/pkg/util/namers.go b/compiler/pkg/util/namers.go index c69f7bc51..6764abaf9 100644 --- a/compiler/pkg/util/namers.go +++ b/compiler/pkg/util/namers.go @@ -36,7 +36,7 @@ func GetGroupGoName(baseGroupName string) string { } func GetGroupResourceName(nodeName string) string { - return ToPlural(strings.ToLower(nodeName)) // eg roots + return strings.ToLower(ToPlural(nodeName)) // eg roots } func GetNodeNameTitle(nodeName string) string { From cb6f9ce87365c91f1048c6f6b855614334a5b292 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Fri, 31 Mar 2023 14:05:34 +0530 Subject: [PATCH 20/41] Fix plural issue GNS --> gnss --- compiler/pkg/generator/template_renderers.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler/pkg/generator/template_renderers.go b/compiler/pkg/generator/template_renderers.go index 3530e49b0..7d90b54de 100644 --- a/compiler/pkg/generator/template_renderers.go +++ b/compiler/pkg/generator/template_renderers.go @@ -386,7 +386,9 @@ func RenderCRDBaseTemplate(baseGroupName string, pkg parser.Package, parentsMap groupName := pkg.Name + "." + baseGroupName singular := strings.ToLower(typeName) kind := cases.Title(language.Und, cases.NoLower).String(typeName) - plural := util.ToPlural(singular) + // plural := util.ToPlural(singular) + plural := strings.ToLower(util.ToPlural(typeName)) + fmt.Printf("TypeName: %s, Plural:%s, singular: %s\n",typeName,plural,singular) crdName := fmt.Sprintf("%s.%s", plural, groupName) nexusAnnotation := &NexusAnnotation{} From 9a61429c0a01d6b52bd5da91e417f0bf37ced70b Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Fri, 31 Mar 2023 14:06:09 +0530 Subject: [PATCH 21/41] revert kacper non global changes --- compiler/pkg/generator/graphql_common.go | 2 +- compiler/pkg/generator/tsm_graphql_generator.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/pkg/generator/graphql_common.go b/compiler/pkg/generator/graphql_common.go index 070837afa..9887d7dcd 100644 --- a/compiler/pkg/generator/graphql_common.go +++ b/compiler/pkg/generator/graphql_common.go @@ -302,7 +302,7 @@ func getGraphqlSchemaName(pattern, fieldName, schemaType string, f *ast.Field) s schemaName = fmt.Sprintf(pattern, getAliasFieldValue(fieldName, f), schemaType) } - schemaName = strings.Title(strings.TrimPrefix(schemaName, "global_")) + schemaName = strings.TrimPrefix(schemaName, "global_") return schemaName } diff --git a/compiler/pkg/generator/tsm_graphql_generator.go b/compiler/pkg/generator/tsm_graphql_generator.go index 6ca57e14f..2d2dc85e0 100644 --- a/compiler/pkg/generator/tsm_graphql_generator.go +++ b/compiler/pkg/generator/tsm_graphql_generator.go @@ -462,7 +462,7 @@ func GenerateTsmGraphqlSchemaVars(baseGroupName, crdModulePath string, pkgs pars } else if pkg.Name == "tsm" { continue } else { - nodeProp.SchemaName = fmt.Sprintf("%s_%s", strings.Title(pkg.Name), parser.GetTypeName(node)) + nodeProp.SchemaName = fmt.Sprintf("%s_%s", pkg.Name, parser.GetTypeName(node)) } // Iterate each node's nexus fields and set its properties tsmProcessNexusFields(pkg, aliasNameMap, node, nodeProp, simpleGroupTypeName, pkgs, gqlSpecMap) From 2bd14a6499cf69f61fbfe353f0ecca8270b4a678 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Fri, 31 Mar 2023 15:22:56 +0530 Subject: [PATCH 22/41] Reverted Plural fix and COSMOS Nexus Compiler version-1 --- compiler/pkg/generator/template_renderers.go | 5 ++--- compiler/pkg/generator/tsm_graphql_generator.go | 1 + compiler/pkg/generator/types_generator.go | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/compiler/pkg/generator/template_renderers.go b/compiler/pkg/generator/template_renderers.go index 7d90b54de..7ab97ea92 100644 --- a/compiler/pkg/generator/template_renderers.go +++ b/compiler/pkg/generator/template_renderers.go @@ -386,9 +386,8 @@ func RenderCRDBaseTemplate(baseGroupName string, pkg parser.Package, parentsMap groupName := pkg.Name + "." + baseGroupName singular := strings.ToLower(typeName) kind := cases.Title(language.Und, cases.NoLower).String(typeName) - // plural := util.ToPlural(singular) - plural := strings.ToLower(util.ToPlural(typeName)) - fmt.Printf("TypeName: %s, Plural:%s, singular: %s\n",typeName,plural,singular) + plural := util.ToPlural(singular) + // plural := strings.ToLower(util.ToPlural(typeName)) crdName := fmt.Sprintf("%s.%s", plural, groupName) nexusAnnotation := &NexusAnnotation{} diff --git a/compiler/pkg/generator/tsm_graphql_generator.go b/compiler/pkg/generator/tsm_graphql_generator.go index 2d2dc85e0..dec6b6f17 100644 --- a/compiler/pkg/generator/tsm_graphql_generator.go +++ b/compiler/pkg/generator/tsm_graphql_generator.go @@ -453,6 +453,7 @@ func GenerateTsmGraphqlSchemaVars(baseGroupName, crdModulePath string, pkgs pars nodeProp.Singular = strings.ToLower(typeName) nodeProp.Kind = cases.Title(language.Und, cases.NoLower).String(typeName) nodeProp.ResourceName = util.ToPlural(nodeProp.Singular) + // nodeProp.ResourceName = strings.ToLower(util.ToPlural(typeName)) nodeProp.ResourceVersion = "v1" // crdName := fmt.Sprintf("%s.%s", plural, groupName) diff --git a/compiler/pkg/generator/types_generator.go b/compiler/pkg/generator/types_generator.go index 16bd3348c..dd41d3690 100644 --- a/compiler/pkg/generator/types_generator.go +++ b/compiler/pkg/generator/types_generator.go @@ -76,6 +76,7 @@ func generateCRDStructType(pkg parser.Package, node *ast.TypeSpec) string { } s.CrdName = fmt.Sprintf("%s.%s.%s", util.ToPlural(strings.ToLower(s.Name)), strings.ToLower(pkg.Name), config.ConfigInstance.GroupName) + // s.CrdName = fmt.Sprintf("%s.%s.%s", strings.ToLower(util.ToPlural(s.Name)), strings.ToLower(pkg.Name), config.ConfigInstance.GroupName) var crdTemplate = clientgen + "\n" + deepcopygen + "\n" + openapigen + ` type {{.Name}} struct { From 9b230aa0d53a842db63b025db283bb15b7090b0d Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Fri, 31 Mar 2023 16:35:57 +0530 Subject: [PATCH 23/41] Bring in Plural Fix as version-2 --- compiler/pkg/generator/template_renderers.go | 4 ++-- compiler/pkg/generator/tsm_graphql_generator.go | 4 ++-- compiler/pkg/generator/types_generator.go | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/compiler/pkg/generator/template_renderers.go b/compiler/pkg/generator/template_renderers.go index 7ab97ea92..c558f7620 100644 --- a/compiler/pkg/generator/template_renderers.go +++ b/compiler/pkg/generator/template_renderers.go @@ -386,8 +386,8 @@ func RenderCRDBaseTemplate(baseGroupName string, pkg parser.Package, parentsMap groupName := pkg.Name + "." + baseGroupName singular := strings.ToLower(typeName) kind := cases.Title(language.Und, cases.NoLower).String(typeName) - plural := util.ToPlural(singular) - // plural := strings.ToLower(util.ToPlural(typeName)) + // plural := util.ToPlural(singular) + plural := strings.ToLower(util.ToPlural(typeName)) crdName := fmt.Sprintf("%s.%s", plural, groupName) nexusAnnotation := &NexusAnnotation{} diff --git a/compiler/pkg/generator/tsm_graphql_generator.go b/compiler/pkg/generator/tsm_graphql_generator.go index dec6b6f17..93a4e5905 100644 --- a/compiler/pkg/generator/tsm_graphql_generator.go +++ b/compiler/pkg/generator/tsm_graphql_generator.go @@ -452,8 +452,8 @@ func GenerateTsmGraphqlSchemaVars(baseGroupName, crdModulePath string, pkgs pars nodeProp.GroupName = pkg.Name + "." + baseGroupName nodeProp.Singular = strings.ToLower(typeName) nodeProp.Kind = cases.Title(language.Und, cases.NoLower).String(typeName) - nodeProp.ResourceName = util.ToPlural(nodeProp.Singular) - // nodeProp.ResourceName = strings.ToLower(util.ToPlural(typeName)) + // nodeProp.ResourceName = util.ToPlural(nodeProp.Singular) + nodeProp.ResourceName = strings.ToLower(util.ToPlural(typeName)) nodeProp.ResourceVersion = "v1" // crdName := fmt.Sprintf("%s.%s", plural, groupName) diff --git a/compiler/pkg/generator/types_generator.go b/compiler/pkg/generator/types_generator.go index dd41d3690..fb309cffb 100644 --- a/compiler/pkg/generator/types_generator.go +++ b/compiler/pkg/generator/types_generator.go @@ -75,8 +75,8 @@ func generateCRDStructType(pkg parser.Package, node *ast.TypeSpec) string { log.Fatalf("name of type can't be empty") } - s.CrdName = fmt.Sprintf("%s.%s.%s", util.ToPlural(strings.ToLower(s.Name)), strings.ToLower(pkg.Name), config.ConfigInstance.GroupName) - // s.CrdName = fmt.Sprintf("%s.%s.%s", strings.ToLower(util.ToPlural(s.Name)), strings.ToLower(pkg.Name), config.ConfigInstance.GroupName) + // s.CrdName = fmt.Sprintf("%s.%s.%s", util.ToPlural(strings.ToLower(s.Name)), strings.ToLower(pkg.Name), config.ConfigInstance.GroupName) + s.CrdName = fmt.Sprintf("%s.%s.%s", strings.ToLower(util.ToPlural(s.Name)), strings.ToLower(pkg.Name), config.ConfigInstance.GroupName) var crdTemplate = clientgen + "\n" + deepcopygen + "\n" + openapigen + ` type {{.Name}} struct { From d303623823dfd991f0d414316d48572e4549074d Mon Sep 17 00:00:00 2001 From: Lokeshvar Kumar <36099411+LokeshvarKr@users.noreply.github.com> Date: Mon, 3 Apr 2023 15:00:02 +0530 Subject: [PATCH 24/41] Fix issue in Delete{Node}ByName() method (#147) Co-authored-by: klokeshvar --- compiler/pkg/generator/template/client.go.tmpl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index 4c72a6807..44c6e784e 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -17,6 +17,7 @@ import ( "encoding/json" "sync" "fmt" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/rest" @@ -172,7 +173,11 @@ func (group *{{$node.GroupTypeName}}) Delete{{$node.BaseNodeName}}ByName(ctx con err := group.client. {{$link.SimpleGroupTypeName}}().Delete{{$link.BaseNodeName}}ByName(ctx, v.Name) if err != nil { - return err + if errors.IsNotFound(err) { + continue + }else{ + return err + } } } {{ else }} @@ -180,7 +185,7 @@ func (group *{{$node.GroupTypeName}}) Delete{{$node.BaseNodeName}}ByName(ctx con err := group.client. {{$link.SimpleGroupTypeName}}(). Delete{{$link.BaseNodeName}}ByName(ctx, result.Spec.{{$link.FieldName}}Gvk.Name) - if err != nil { + if err != nil && !errors.IsNotFound(err) { return err } } From 2b9e9d6cfa70265a10cc906b0e91947aba588625 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Mon, 3 Apr 2023 15:05:27 +0530 Subject: [PATCH 25/41] Cleanup unused notify method --- .../pkg/generator/template/client.go.tmpl | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index 44c6e784e..4a6b14b32 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -837,36 +837,6 @@ func (c *{{$node.GroupResourceType}}Chainer) IsSubscribed() bool { return ok } -func (c *{{$node.GroupResourceType}}Chainer) NotifyOnAdd(cbfn func(obj interface{})) { - fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> NotifyOnAdd!") - stopper := make(chan struct{}) - informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) - informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: cbfn, - }) - go informer.Run(stopper) -} - -func (c *{{$node.GroupResourceType}}Chainer) NotifyOnUpdate(cbfn func(oldObj interface{}, newObj interface{})) { - fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> NotifyOnUpdate!") - stopper := make(chan struct{}) - informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) - informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ - UpdateFunc: cbfn, - }) - go informer.Run(stopper) -} - -func (c *{{$node.GroupResourceType}}Chainer) NotifyOnDelete(cbfn func(obj interface{})) { - fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> NotifyOnDelete!") - stopper := make(chan struct{}) - informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) - informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ - DeleteFunc: cbfn, - }) - go informer.Run(stopper) -} - func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj *{{$node.GroupBaseImport}})) (cache.ResourceEventHandlerRegistration, error){ fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> RegisterAddCallback!") var ( From b4397581dfdb848f0e8a3434781682047bbb1d10 Mon Sep 17 00:00:00 2001 From: vipinakavarpu Date: Mon, 3 Apr 2023 14:49:45 -0400 Subject: [PATCH 26/41] Skipping ignored dirs from config in preparser and node_parser --- compiler/Makefile | 2 +- compiler/cmd/preparser/main.go | 10 ++++++++++ compiler/pkg/parser/node_parser.go | 7 +++++++ compiler/pkg/preparser/preparser.go | 8 +++++++- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/compiler/Makefile b/compiler/Makefile index 5b4598c5b..c4f59fe46 100644 --- a/compiler/Makefile +++ b/compiler/Makefile @@ -155,7 +155,7 @@ preparser: cp -R ${DATAMODEL_PATH} _tsm_temp cp -R _generated_base_structure/* ${DATAMODEL_PATH}/build @echo "Nexus Compiler: Running Preparser" - go run cmd/preparser/main.go -dsl _tsm_temp -output _generated -modpath ${PREPARSER_MODPATH} + go run cmd/preparser/main.go -config-file ${CONFIG_FILE} -dsl _tsm_temp -output _generated -modpath ${PREPARSER_MODPATH} @echo "Nexus Compiler: Remove empty directories from model directory" @find _generated/model -depth -type d -empty -delete diff --git a/compiler/cmd/preparser/main.go b/compiler/cmd/preparser/main.go index 461498c97..c7efcfa1b 100644 --- a/compiler/cmd/preparser/main.go +++ b/compiler/cmd/preparser/main.go @@ -2,12 +2,14 @@ package main import ( "flag" + "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/config" log "github.com/sirupsen/logrus" "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/preparser" ) func main() { + configFile := flag.String("config-file", "", "Config file location.") dslDir := flag.String("dsl", "datamodel", "DSL file location.") outputDir := flag.String("output", "_generated", "output dir location.") modPath := flag.String("modpath", "datamodel", "ModPath for rendered imports") @@ -20,6 +22,14 @@ func main() { } log.SetLevel(lvl) + conf := &config.Config{} + if *configFile != "" { + conf, err = config.LoadConfig(*configFile) + if err != nil { + log.Fatalf("Error loading config: %v", err) + } + } + config.ConfigInstance = conf packages := preparser.Parse(*dslDir) err = preparser.Render(*dslDir, packages) if err != nil { diff --git a/compiler/pkg/parser/node_parser.go b/compiler/pkg/parser/node_parser.go index 97a48c42b..0216cd6ba 100644 --- a/compiler/pkg/parser/node_parser.go +++ b/compiler/pkg/parser/node_parser.go @@ -2,6 +2,7 @@ package parser import ( "fmt" + "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/config" "go/ast" "go/parser" "go/token" @@ -41,6 +42,12 @@ func ParseDSLNodes(startPath string, baseGroupName string, packages Packages, log.Infof("Ignoring vendor directory...") return filepath.SkipDir } + for _, f := range config.ConfigInstance.IgnoredDirs { + if info.Name() == f { + log.Infof(fmt.Sprintf("Ignoring %v directory from config", f)) + return filepath.SkipDir + } + } pkgs, err := parser.ParseDir(fileset, path, nil, parser.ParseComments) if err != nil { log.Fatalf("Failed to parse directory %s: %v", path, err) diff --git a/compiler/pkg/preparser/preparser.go b/compiler/pkg/preparser/preparser.go index 6efa401f0..dc73b21fc 100644 --- a/compiler/pkg/preparser/preparser.go +++ b/compiler/pkg/preparser/preparser.go @@ -3,6 +3,7 @@ package preparser import ( "bytes" "fmt" + "github.com/vmware-tanzu/graph-framework-for-microservices/compiler/pkg/config" "go/ast" goParser "go/parser" "go/printer" @@ -35,7 +36,12 @@ func Parse(startPath string) map[string][]*parser.Package { log.Infof("Ignoring vendor directory...") return filepath.SkipDir } - + for _, f := range config.ConfigInstance.IgnoredDirs { + if info.Name() == f { + log.Infof(fmt.Sprintf("Ignoring %v directory from config", f)) + return filepath.SkipDir + } + } fileset := token.NewFileSet() pkgs, err := goParser.ParseDir(fileset, path, nil, goParser.ParseComments) if err != nil { From e860c00d40c8436efcebe3f925762cd637d50be0 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Wed, 12 Apr 2023 23:01:13 +0530 Subject: [PATCH 27/41] NPT-890: Modified RegisterCB return type --- .../pkg/generator/template/client.go.tmpl | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index 4a6b14b32..c7d5a1f92 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -837,7 +837,7 @@ func (c *{{$node.GroupResourceType}}Chainer) IsSubscribed() bool { return ok } -func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj *{{$node.GroupBaseImport}})) (cache.ResourceEventHandlerRegistration, error){ +func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj *{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}})) (cache.ResourceEventHandlerRegistration, error){ fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> RegisterAddCallback!") var ( registrationId cache.ResourceEventHandlerRegistration @@ -850,7 +850,10 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * sub := s.(subscription) registrationId,err = sub.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}){ - cbfn(obj.(*{{$node.GroupBaseImport}})) + cbfn(&{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, + Project: obj.(*{{$node.GroupBaseImport}}), + }) }, }) } else { @@ -858,7 +861,10 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) registrationId,err = informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}){ - cbfn(obj.(*{{$node.GroupBaseImport}})) + cbfn(&{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, + Project: obj.(*{{$node.GroupBaseImport}}), + }) }, }) go informer.Run(stopper) @@ -866,7 +872,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * return registrationId,err } -func (c *{{$node.GroupResourceType}}Chainer) RegisterUpdateCallback(cbfn func(oldObj,newObj *{{$node.GroupBaseImport}})) (cache.ResourceEventHandlerRegistration, error){ +func (c *{{$node.GroupResourceType}}Chainer) RegisterUpdateCallback(cbfn func(oldObj,newObj *{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}})) (cache.ResourceEventHandlerRegistration, error){ fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> RegisterUpdateCallback!") var ( registrationId cache.ResourceEventHandlerRegistration @@ -887,7 +893,15 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterUpdateCallback(cbfn func(ol informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) registrationId,err = informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ UpdateFunc: func(oldObj,newObj interface{}){ - cbfn(oldObj.(*{{$node.GroupBaseImport}}),newObj.(*{{$node.GroupBaseImport}})) + oldData := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, + Project: oldObj.(*{{$node.GroupBaseImport}}), + } + newData := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, + Project: newObj.(*{{$node.GroupBaseImport}}), + } + cbfn(oldData,newData) }, }) go informer.Run(stopper) @@ -895,7 +909,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterUpdateCallback(cbfn func(ol return registrationId,err } -func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(obj *{{$node.GroupBaseImport}})) (cache.ResourceEventHandlerRegistration, error){ +func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(obj *{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}})) (cache.ResourceEventHandlerRegistration, error){ fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> RegisterDeleteCallback!") var ( registrationId cache.ResourceEventHandlerRegistration @@ -908,7 +922,10 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob sub := s.(subscription) registrationId,err = sub.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ DeleteFunc: func(obj interface{}){ - cbfn(obj.(*{{$node.GroupBaseImport}})) + cbfn(&{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, + Project: obj.(*{{$node.GroupBaseImport}}), + }) }, }) } else { @@ -916,7 +933,10 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) registrationId,err = informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ DeleteFunc: func(obj interface{}){ - cbfn(obj.(*{{$node.GroupBaseImport}})) + cbfn(&{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, + Project: obj.(*{{$node.GroupBaseImport}}), + }) }, }) go informer.Run(stopper) From ce82f6ebcefd394bb03adefcddc036f635969130 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Thu, 13 Apr 2023 14:01:57 +0530 Subject: [PATCH 28/41] COSMOS-1507: Modified return type template nexus client --- .../pkg/generator/template/client.go.tmpl | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index c7d5a1f92..674c68f10 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -852,7 +852,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * AddFunc: func(obj interface{}){ cbfn(&{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ client: c.client, - Project: obj.(*{{$node.GroupBaseImport}}), + {{$node.BaseNodeName}}: obj.(*{{$node.GroupBaseImport}}), }) }, }) @@ -863,7 +863,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * AddFunc: func(obj interface{}){ cbfn(&{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ client: c.client, - Project: obj.(*{{$node.GroupBaseImport}}), + {{$node.BaseNodeName}}: obj.(*{{$node.GroupBaseImport}}), }) }, }) @@ -885,7 +885,15 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterUpdateCallback(cbfn func(ol sub := s.(subscription) registrationId,err = sub.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ UpdateFunc: func(oldObj,newObj interface{}){ - cbfn(oldObj.(*{{$node.GroupBaseImport}}),newObj.(*{{$node.GroupBaseImport}})) + oldData := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, + {{$node.BaseNodeName}}: oldObj.(*{{$node.GroupBaseImport}}), + } + newData := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, + {{$node.BaseNodeName}}: newObj.(*{{$node.GroupBaseImport}}), + } + cbfn(oldData,newData) }, }) } else { @@ -895,11 +903,11 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterUpdateCallback(cbfn func(ol UpdateFunc: func(oldObj,newObj interface{}){ oldData := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ client: c.client, - Project: oldObj.(*{{$node.GroupBaseImport}}), + {{$node.BaseNodeName}}: oldObj.(*{{$node.GroupBaseImport}}), } newData := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ client: c.client, - Project: newObj.(*{{$node.GroupBaseImport}}), + {{$node.BaseNodeName}}: newObj.(*{{$node.GroupBaseImport}}), } cbfn(oldData,newData) }, @@ -924,7 +932,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob DeleteFunc: func(obj interface{}){ cbfn(&{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ client: c.client, - Project: obj.(*{{$node.GroupBaseImport}}), + {{$node.BaseNodeName}}: obj.(*{{$node.GroupBaseImport}}), }) }, }) @@ -935,7 +943,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob DeleteFunc: func(obj interface{}){ cbfn(&{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ client: c.client, - Project: obj.(*{{$node.GroupBaseImport}}), + {{$node.BaseNodeName}}: obj.(*{{$node.GroupBaseImport}}), }) }, }) From f7a43e607479a2077671871b344f0b38447f030f Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Tue, 18 Apr 2023 09:58:02 +0200 Subject: [PATCH 29/41] NPT-632 Cosmos datamodel non global packages support (#150) * Add new type * Use uppercase letter for package name in graphql * Fix non global & Makefile * Remove NexusType --------- Co-authored-by: Vishnubabu --- compiler/Makefile | 17 ++++++++++++----- compiler/pkg/generator/graphql_common.go | 8 +++++++- compiler/pkg/generator/tsm_graphql_generator.go | 3 ++- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/compiler/Makefile b/compiler/Makefile index c4f59fe46..42d9f9c81 100644 --- a/compiler/Makefile +++ b/compiler/Makefile @@ -161,16 +161,23 @@ preparser: @if [ -d "_tsm_temp/global" ]; then \ cp _tsm_temp/go.mod _tsm_temp/global/go.mod; \ - for d in _tsm_temp/*/; do \ - if [[ ! "$$d" == "_tsm_temp/global/" && ! "$$d" == "_tsm_temp/build/" ]]; then \ - cp -r "$$d" "_tsm_temp/global/"; \ - fi; \ - done; \ + for dir in _tsm_temp/*; do \ + if [[ -d "$$dir" && "$$dir" != "_tsm_temp/global" && "$$dir" != "_tsm_temp/build" ]]; then \ + cp -r "$$dir" _tsm_temp/global/; \ + fi; \ + done; \ $(MAKE) generate_code DATAMODEL_PATH=_tsm_temp/global; \ else \ $(MAKE) generate_code; \ fi +test_if: + for dir in _tsm_temp/*; do \ + if [[ -d "$$dir" && "$$dir" != "_tsm_temp/global" && "$$dir" != "_tsm_temp/build" ]]; then \ + cp -r "$$dir" _tsm_temp/global/; \ + fi; \ + done + .PHONY: generate_code generate_code: @echo "Nexus Compiler: Running compiler code generation" diff --git a/compiler/pkg/generator/graphql_common.go b/compiler/pkg/generator/graphql_common.go index 9887d7dcd..3828ca3a9 100644 --- a/compiler/pkg/generator/graphql_common.go +++ b/compiler/pkg/generator/graphql_common.go @@ -292,6 +292,10 @@ func isRootOfGraph(parents []string, rootOfGraph bool) bool { } func getGraphqlSchemaName(pattern, fieldName, schemaType string, f *ast.Field) string { + if !strings.HasPrefix(schemaType, "global_") { + schemaType = cases.Title(language.Und, cases.NoLower).String(schemaType) + } + schemaName := fmt.Sprintf(pattern, fieldName, schemaType) schemaType = strings.TrimPrefix(schemaType, "global_") if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_ALIAS_TYPE_ANNOTATION) { @@ -302,7 +306,9 @@ func getGraphqlSchemaName(pattern, fieldName, schemaType string, f *ast.Field) s schemaName = fmt.Sprintf(pattern, getAliasFieldValue(fieldName, f), schemaType) } - schemaName = strings.TrimPrefix(schemaName, "global_") + if strings.HasPrefix(schemaName, "global_") { + schemaName = strings.TrimPrefix(schemaName, "global_") + } return schemaName } diff --git a/compiler/pkg/generator/tsm_graphql_generator.go b/compiler/pkg/generator/tsm_graphql_generator.go index 93a4e5905..4df356996 100644 --- a/compiler/pkg/generator/tsm_graphql_generator.go +++ b/compiler/pkg/generator/tsm_graphql_generator.go @@ -463,7 +463,8 @@ func GenerateTsmGraphqlSchemaVars(baseGroupName, crdModulePath string, pkgs pars } else if pkg.Name == "tsm" { continue } else { - nodeProp.SchemaName = fmt.Sprintf("%s_%s", pkg.Name, parser.GetTypeName(node)) + nodeProp.SchemaName = fmt.Sprintf("%s_%s", + cases.Title(language.Und, cases.NoLower).String(pkg.Name), parser.GetTypeName(node)) } // Iterate each node's nexus fields and set its properties tsmProcessNexusFields(pkg, aliasNameMap, node, nodeProp, simpleGroupTypeName, pkgs, gqlSpecMap) From 7541c438ff37d007462cbc39794bfd824fd78711 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Tue, 18 Apr 2023 16:25:02 +0530 Subject: [PATCH 30/41] Fixed issue in graphql schema generation for non standard array type --- .../pkg/generator/tsm_graphql_generator.go | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/compiler/pkg/generator/tsm_graphql_generator.go b/compiler/pkg/generator/tsm_graphql_generator.go index 4df356996..5a6093f5a 100644 --- a/compiler/pkg/generator/tsm_graphql_generator.go +++ b/compiler/pkg/generator/tsm_graphql_generator.go @@ -237,17 +237,20 @@ func tsmProcessNonNexusFields(pkg parser.Package, aliasNameMap map[string]string } else if parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_ALIAS_TYPE_ANNOTATION) || parser.IsFieldAnnotationPresent(f, parser.GRAPHQL_ALIAS_NAME_ANNOTATION) { fieldProp.SchemaFieldName = getTsmGraphqlSchemaFieldName(AliasType, fieldProp.FieldName, "", "", f, pkg, nonNexusTypes) resField[nodeProp.PkgName+nodeProp.NodeName] = append(resField[nodeProp.PkgName+nodeProp.NodeName], fieldProp) - } else if parser.IsArrayField(f) { - arr := regexp.MustCompile(`^(\[])`).ReplaceAllString(typeString, "") - if !strings.Contains(arr, ".") { - stdType := convertGraphqlStdType(arr) + } else { + var stdType string + if parser.IsArrayField(f) { + stdType = convertGraphqlStdType(regexp.MustCompile(`^(\[])`).ReplaceAllString(typeString, "")) + } else { + stdType = convertGraphqlStdType(typeString) + } + + // standard type with array + if len(stdType) != 0 && parser.IsArrayField(f) { fieldProp.SchemaFieldName = getTsmGraphqlSchemaFieldName(Array, fieldProp.FieldName, stdType, "id: ID", f, pkg, nonNexusTypes) resField[nodeProp.PkgName+nodeProp.NodeName] = append(resField[nodeProp.PkgName+nodeProp.NodeName], fieldProp) - } - } else { - stdType := convertGraphqlStdType(typeString) - // standard type - if len(stdType) != 0 { + } else if len(stdType) != 0 { + // standard type fieldProp.IsStdTypeField = true fieldProp.SchemaFieldName = getTsmGraphqlSchemaFieldName(Standard, fieldProp.FieldName, stdType, "id: ID", f, pkg, nonNexusTypes) resField[nodeProp.PkgName+nodeProp.NodeName] = append(resField[nodeProp.PkgName+nodeProp.NodeName], fieldProp) From 4053da9c70c11cb164cc3a04fe0631e7299119a6 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Wed, 19 Apr 2023 17:16:49 +0530 Subject: [PATCH 31/41] Add ForceRead support --- compiler/pkg/generator/template/client.go.tmpl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index 674c68f10..f1a3292fe 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -155,6 +155,22 @@ func (group *{{$node.GroupTypeName}}) Get{{$node.BaseNodeName}}ByName(ctx contex } } +// ForceRead{{$node.BaseNodeName}}ByName read object directly from the database under the hashedName which is a hash of display +// name and parents names. Use it when you know hashed name of object. +func (group *{{$node.GroupTypeName}}) ForceRead{{$node.BaseNodeName}}ByName(ctx context.Context, hashedName string) (*{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}, error) { + result, err := group.client.baseClient. + {{$node.GroupTypeName}}(). + {{$node.GroupResourceNameTitle}}().Get(ctx, hashedName, metav1.GetOptions{}) + if err != nil { + return nil, err + } + + return &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: group.client, + {{$node.BaseNodeName}}: result, + }, nil +} + // Delete{{$node.BaseNodeName}}ByName deletes object stored in the database under the hashedName which is a hash of // display name and parents names. Use it when you know hashed name of object. func (group *{{$node.GroupTypeName}}) Delete{{$node.BaseNodeName}}ByName(ctx context.Context, hashedName string) (err error) { From 7e1a59048f7015e73bfc371f178c89539a8cff15 Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Mon, 24 Apr 2023 11:13:04 +0200 Subject: [PATCH 32/41] COSMOS-1557: Check if parent exist before calling callback func (#151) * Check if parent exist before calling callback * Add ForceRead support * Check if gvk exist, if not panic * Fix template * Update RegisterAddCallback template * Update RegisterAddCallback and add checks to RegisterDeleteCallback method --------- Co-authored-by: Vishnubabu --- compiler/pkg/generator/client_generator.go | 2 + .../pkg/generator/template/client.go.tmpl | 256 +++++++++++++++++- compiler/pkg/parser/node.go | 7 +- compiler/pkg/parser/node_parser.go | 28 +- 4 files changed, 268 insertions(+), 25 deletions(-) diff --git a/compiler/pkg/generator/client_generator.go b/compiler/pkg/generator/client_generator.go index 187a46679..d61fb2759 100644 --- a/compiler/pkg/generator/client_generator.go +++ b/compiler/pkg/generator/client_generator.go @@ -181,6 +181,7 @@ func resolveNode(baseImportName, informerImportName string, pkg parser.Package, clientGroupVars.Parent.SimpleGroupTypeName = util.GetSimpleGroupTypeName(util.GetPackageNameFromCrdName(parentCrdName)) clientGroupVars.Parent.GroupResourceNameTitle = util.GetGroupResourceNameTitle(parentHelper.Name) clientGroupVars.Parent.GvkFieldName = parentHelper.Children[clientGroupVars.CrdName].FieldNameGvk + clientGroupVars.Parent.GoGvkFieldName = parentHelper.Children[clientGroupVars.CrdName].GoFieldNameGvk clientGroupVars.Parent.BaseNodeName = parentHelper.Name } @@ -310,6 +311,7 @@ type apiGroupsClientVars struct { HasParent bool CrdName string GvkFieldName string + GoGvkFieldName string GroupTypeName string SimpleGroupTypeName string GroupResourceNameTitle string diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index f1a3292fe..92078e9c4 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -17,6 +17,7 @@ import ( "encoding/json" "sync" "fmt" + "time" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" @@ -866,10 +867,69 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * sub := s.(subscription) registrationId,err = sub.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}){ - cbfn(&{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ - client: c.client, + nc := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, {{$node.BaseNodeName}}: obj.(*{{$node.GroupBaseImport}}), - }) + } + + {{if .Parent.HasParent}} + var parent *{{.Parent.SimpleGroupTypeName}}{{.Parent.BaseNodeName}} + gvkExist := false + for i := 0; i < 600; i++ { + // Check if parent exists + parent, err = nc.GetParent(context.TODO()) + if err != nil || parent == nil { + time.Sleep(500 * time.Millisecond) + continue + } + + // Check GVK + {{if .Parent.IsNamed}} + if _, ok := parent.Spec.{{.Parent.GoGvkFieldName}}[nc.DisplayName()]; !ok { + time.Sleep(500 * time.Millisecond) + continue + } + {{else}} + if parent.Spec.{{.Parent.GoGvkFieldName}} == nil { + time.Sleep(500 * time.Millisecond) + continue + } + {{end}} + + gvkExist = true + + break + } + + if parent == nil { + hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) + parent, err = c.client.Global().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + if err != nil { + if errors.IsNotFound(err) { + return + } + + panic("error occurred while fetching parent " + err.Error()) + } + panic(fmt.Sprintf("parent found (event loop is stalled) " + nc.DisplayName())) + } + + if !gvkExist { + // Check GVK + {{if .Parent.IsNamed}} + if _, ok := parent.Spec.{{.Parent.GoGvkFieldName}}[nc.DisplayName()]; !ok { + return + } + {{else}} + if parent.Spec.{{.Parent.GoGvkFieldName}} == nil { + return + } + {{end}} + panic(fmt.Sprintf("gvk found (event loop is stalled) " + nc.DisplayName())) + } + {{end}} + + cbfn(nc) }, }) } else { @@ -877,10 +937,70 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) registrationId,err = informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}){ - cbfn(&{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + nc := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ client: c.client, {{$node.BaseNodeName}}: obj.(*{{$node.GroupBaseImport}}), - }) + } + + {{if .Parent.HasParent}} + var parent *{{.Parent.SimpleGroupTypeName}}{{.Parent.BaseNodeName}} + gvkExist := false + for i := 0; i < 600; i++ { + // Check if parent exists + parent, err = nc.GetParent(context.TODO()) + if err != nil || parent == nil { + time.Sleep(500 * time.Millisecond) + continue + } + + // Check GVK + {{if .Parent.IsNamed}} + if _, ok := parent.Spec.{{.Parent.GoGvkFieldName}}[nc.DisplayName()]; !ok { + time.Sleep(500 * time.Millisecond) + continue + } + {{else}} + if parent.Spec.{{.Parent.GoGvkFieldName}} == nil { + time.Sleep(500 * time.Millisecond) + continue + } + {{end}} + + gvkExist = true + + break + } + + if parent == nil { + hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) + parent, err = c.client.Global().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + if err != nil { + if errors.IsNotFound(err) { + return + } + + panic("error occurred while fetching parent " + err.Error()) + } + panic(fmt.Sprintf("parent found (event loop is stalled) " + nc.DisplayName())) + } + + if !gvkExist { + // Check GVK + {{if .Parent.IsNamed}} + if _, ok := parent.Spec.{{.Parent.GoGvkFieldName}}[nc.DisplayName()]; !ok { + return + } + {{else}} + if parent.Spec.{{.Parent.GoGvkFieldName}} == nil { + return + } + {{end}} + + panic(fmt.Sprintf("gvk found (event loop is stalled) " + nc.DisplayName())) + } + {{end}} + + cbfn(nc) }, }) go informer.Run(stopper) @@ -946,10 +1066,67 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob sub := s.(subscription) registrationId,err = sub.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ DeleteFunc: func(obj interface{}){ - cbfn(&{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ - client: c.client, + nc := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, {{$node.BaseNodeName}}: obj.(*{{$node.GroupBaseImport}}), - }) + } + + {{if .Parent.HasParent}} + var parent *{{.Parent.SimpleGroupTypeName}}{{.Parent.BaseNodeName}} + gvkExist := true + for i := 0; i < 600; i++ { + // Check if parent exists + parent, err = nc.GetParent(context.TODO()) + if err != nil || parent == nil { + time.Sleep(500 * time.Millisecond) + continue + } + + // Check GVK + {{if .Parent.IsNamed}} + if _, ok := parent.Spec.{{.Parent.GoGvkFieldName}}[nc.DisplayName()]; ok { + time.Sleep(500 * time.Millisecond) + continue + } + {{else}} + if parent.Spec.{{.Parent.GoGvkFieldName}} != nil { + time.Sleep(500 * time.Millisecond) + continue + } + {{end}} + gvkExist = false + break + } + + if parent == nil { + hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) + parent, err = c.client.Global().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + if err != nil { + if errors.IsNotFound(err) { + return + } + + panic("error occurred while fetching parent " + err.Error()) + } + panic(fmt.Sprintf("parent found (event loop is stalled) " + nc.DisplayName())) + } + + if gvkExist { + // Check GVK + {{if .Parent.IsNamed}} + if _, ok := parent.Spec.{{.Parent.GoGvkFieldName}}[nc.DisplayName()]; ok { + return + } + {{else}} + if parent.Spec.{{.Parent.GoGvkFieldName}} != nil { + return + } + {{end}} + panic(fmt.Sprintf("gvk not found (event loop is stalled) " + nc.DisplayName())) + } + {{end}} + + cbfn(nc) }, }) } else { @@ -957,10 +1134,69 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob informer := {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) registrationId,err = informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ DeleteFunc: func(obj interface{}){ - cbfn(&{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + nc := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ client: c.client, {{$node.BaseNodeName}}: obj.(*{{$node.GroupBaseImport}}), - }) + } + + {{if .Parent.HasParent}} + var parent *{{.Parent.SimpleGroupTypeName}}{{.Parent.BaseNodeName}} + gvkExist := true + for i := 0; i < 600; i++ { + // Check if parent exists + parent, err = nc.GetParent(context.TODO()) + if err != nil || parent == nil { + time.Sleep(500 * time.Millisecond) + continue + } + + // Check GVK + {{if .Parent.IsNamed}} + if _, ok := parent.Spec.{{.Parent.GoGvkFieldName}}[nc.DisplayName()]; ok { + time.Sleep(500 * time.Millisecond) + continue + } + {{else}} + if parent.Spec.{{.Parent.GoGvkFieldName}} != nil { + time.Sleep(500 * time.Millisecond) + continue + } + {{end}} + + gvkExist = false + + break + } + + if parent == nil { + hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) + parent, err = c.client.Global().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + if err != nil { + if errors.IsNotFound(err) { + return + } + + panic("error occurred while fetching parent " + err.Error()) + } + panic(fmt.Sprintf("parent found (event loop is stalled) " + nc.DisplayName())) + } + + if gvkExist { + // Check GVK + {{if .Parent.IsNamed}} + if _, ok := parent.Spec.{{.Parent.GoGvkFieldName}}[nc.DisplayName()]; ok { + return + } + {{else}} + if parent.Spec.{{.Parent.GoGvkFieldName}} != nil { + return + } + {{end}} + panic(fmt.Sprintf("gvk not found (event loop is stalled) " + nc.DisplayName())) + } + {{end}} + + cbfn(nc) }, }) go informer.Run(stopper) diff --git a/compiler/pkg/parser/node.go b/compiler/pkg/parser/node.go index 98d469620..ac7065097 100644 --- a/compiler/pkg/parser/node.go +++ b/compiler/pkg/parser/node.go @@ -36,9 +36,10 @@ type NodeHelper struct { } type NodeHelperChild struct { - FieldName string `json:"fieldName"` - FieldNameGvk string `json:"fieldNameGvk"` - IsNamed bool `json:"isNamed"` + FieldName string `json:"fieldName"` + FieldNameGvk string `json:"fieldNameGvk"` + GoFieldNameGvk string `json:"goFieldNameGvk"` + IsNamed bool `json:"isNamed"` } type NonNexusTypes struct { diff --git a/compiler/pkg/parser/node_parser.go b/compiler/pkg/parser/node_parser.go index 0216cd6ba..c52755606 100644 --- a/compiler/pkg/parser/node_parser.go +++ b/compiler/pkg/parser/node_parser.go @@ -219,9 +219,10 @@ func CreateParentsMap(graph map[string]Node) map[string]NodeHelper { log.Fatalf("Internal compiler failure: Failed to determine crd name of child %v", child) } children[child.CrdName] = NodeHelperChild{ - IsNamed: false, - FieldName: key, - FieldNameGvk: util.GetGvkFieldTagName(key), + IsNamed: false, + FieldName: key, + FieldNameGvk: util.GetGvkFieldTagName(key), + GoFieldNameGvk: key + "Gvk", } } @@ -230,9 +231,10 @@ func CreateParentsMap(graph map[string]Node) map[string]NodeHelper { log.Fatalf("Internal compiler failure: Failed to determine crd name of child %v", child) } children[child.CrdName] = NodeHelperChild{ - IsNamed: true, - FieldName: key, - FieldNameGvk: util.GetGvkFieldTagName(key), + IsNamed: true, + FieldName: key, + FieldNameGvk: util.GetGvkFieldTagName(key), + GoFieldNameGvk: key + "Gvk", } } links := make(map[string]NodeHelperChild) @@ -241,9 +243,10 @@ func CreateParentsMap(graph map[string]Node) map[string]NodeHelper { log.Fatalf("Internal compiler failure: Failed to determine crd name of link %v", link) } links[key] = NodeHelperChild{ - IsNamed: false, - FieldName: key, - FieldNameGvk: util.GetGvkFieldTagName(key), + IsNamed: false, + FieldName: key, + FieldNameGvk: util.GetGvkFieldTagName(key), + GoFieldNameGvk: key + "Gvk", } } @@ -252,9 +255,10 @@ func CreateParentsMap(graph map[string]Node) map[string]NodeHelper { log.Fatalf("Internal compiler failure: Failed to determine crd name of link %v", link) } links[key] = NodeHelperChild{ - IsNamed: true, - FieldName: key, - FieldNameGvk: util.GetGvkFieldTagName(key), + IsNamed: true, + FieldName: key, + FieldNameGvk: util.GetGvkFieldTagName(key), + GoFieldNameGvk: key + "Gvk", } } From 53ae696c30b2bf7fc87779f24230745ee76e01bf Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Tue, 25 Apr 2023 18:15:26 +0530 Subject: [PATCH 33/41] Added singletone details in nexus directives --- compiler/pkg/generator/graphql_common.go | 1 + .../generator/template/tsm-graphql/schema.graphqls.tmpl | 2 +- compiler/pkg/generator/tsm_graphql_generator.go | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/compiler/pkg/generator/graphql_common.go b/compiler/pkg/generator/graphql_common.go index 3828ca3a9..89200478c 100644 --- a/compiler/pkg/generator/graphql_common.go +++ b/compiler/pkg/generator/graphql_common.go @@ -90,6 +90,7 @@ type NodeProperty struct { Kind string ResourceName string ResourceVersion string + Singleton string ChildFields []FieldProperty LinkFields []FieldProperty ChildrenFields []FieldProperty diff --git a/compiler/pkg/generator/template/tsm-graphql/schema.graphqls.tmpl b/compiler/pkg/generator/template/tsm-graphql/schema.graphqls.tmpl index 8ce8642fe..7aae29352 100644 --- a/compiler/pkg/generator/template/tsm-graphql/schema.graphqls.tmpl +++ b/compiler/pkg/generator/template/tsm-graphql/schema.graphqls.tmpl @@ -1,7 +1,7 @@ {{- range $key, $node := .Nodes }} {{- if $node.IsNexusNode }} {{ $length := len $node.GraphqlSchemaFields }}{{- if eq $length 0 }}{{- else }} -type {{ $node.SchemaName }} @nexus(group:"{{ $node.GroupName}}",version:"{{ $node.ResourceVersion}}",kind:"{{ $node.Kind}}",resource:"{{ $node.ResourceName}}",name:"{{ $node.NodeName}}",crdName:"{{ $node.CrdName}}"){ +type {{ $node.SchemaName }} @nexus(group:"{{ $node.GroupName}}",version:"{{ $node.ResourceVersion}}",kind:"{{ $node.Kind}}",resource:"{{ $node.ResourceName}}",name:"{{ $node.NodeName}}",crdName:"{{ $node.CrdName}}",singleton:"{{ $node.Singleton}}"){ {{- range $key, $field := $node.GraphqlSchemaFields }} {{- if $field.SchemaFieldName }} {{ $field.SchemaFieldName -}} diff --git a/compiler/pkg/generator/tsm_graphql_generator.go b/compiler/pkg/generator/tsm_graphql_generator.go index 5a6093f5a..adb232f54 100644 --- a/compiler/pkg/generator/tsm_graphql_generator.go +++ b/compiler/pkg/generator/tsm_graphql_generator.go @@ -53,6 +53,7 @@ func tsmPopulateValuesForEachNode(nodes []*NodeProperty, linkAPI map[string]stri resNodeProp.ResourceName = n.ResourceName resNodeProp.ResourceVersion = n.ResourceVersion resNodeProp.CrdName = n.CrdName + resNodeProp.Singleton = n.Singleton // populate return values for root of the graph if !n.HasParent && n.IsParentNode { @@ -459,6 +460,12 @@ func GenerateTsmGraphqlSchemaVars(baseGroupName, crdModulePath string, pkgs pars nodeProp.ResourceName = strings.ToLower(util.ToPlural(typeName)) nodeProp.ResourceVersion = "v1" // crdName := fmt.Sprintf("%s.%s", plural, groupName) + if parser.IsSingletonNode(node) { + nodeProp.IsSingletonNode = true + nodeProp.Singleton = "true" + } else { + nodeProp.Singleton = "false" + } setNexusProperties(nodeHelper, node, nodeProp) if pkg.Name == "global" { From ada508c064d622011e7f4398e4751f1fe7efefab Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Thu, 27 Apr 2023 16:21:31 +0200 Subject: [PATCH 34/41] COSMOS-1557: Fix data race (#153) * Check if parent exist before calling callback * Add ForceRead support * Check if gvk exist, if not panic * Fix template * Update RegisterAddCallback template * Update RegisterAddCallback and add checks to RegisterDeleteCallback method * Fix data race --------- Co-authored-by: Vishnubabu --- .../pkg/generator/template/client.go.tmpl | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index 92078e9c4..6a8b5513c 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -877,11 +877,12 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * gvkExist := false for i := 0; i < 600; i++ { // Check if parent exists - parent, err = nc.GetParent(context.TODO()) - if err != nil || parent == nil { + p, err := nc.GetParent(context.TODO()) + if err != nil || p == nil { time.Sleep(500 * time.Millisecond) continue } + parent = p // Check GVK {{if .Parent.IsNamed}} @@ -947,11 +948,12 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * gvkExist := false for i := 0; i < 600; i++ { // Check if parent exists - parent, err = nc.GetParent(context.TODO()) - if err != nil || parent == nil { + p, err := nc.GetParent(context.TODO()) + if err != nil || p == nil { time.Sleep(500 * time.Millisecond) continue } + parent = p // Check GVK {{if .Parent.IsNamed}} @@ -1076,11 +1078,12 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob gvkExist := true for i := 0; i < 600; i++ { // Check if parent exists - parent, err = nc.GetParent(context.TODO()) - if err != nil || parent == nil { + p, err := nc.GetParent(context.TODO()) + if err != nil || p == nil { time.Sleep(500 * time.Millisecond) continue } + parent = p // Check GVK {{if .Parent.IsNamed}} @@ -1144,11 +1147,12 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob gvkExist := true for i := 0; i < 600; i++ { // Check if parent exists - parent, err = nc.GetParent(context.TODO()) - if err != nil || parent == nil { + p, err := nc.GetParent(context.TODO()) + if err != nil || p == nil { time.Sleep(500 * time.Millisecond) continue } + parent = p // Check GVK {{if .Parent.IsNamed}} From fc3cedfce9e27d11c261a0695b995ffa6e00d034 Mon Sep 17 00:00:00 2001 From: Lokeshvar Kumar <36099411+LokeshvarKr@users.noreply.github.com> Date: Wed, 3 May 2023 13:31:10 +0530 Subject: [PATCH 35/41] Adding template for RegisterEventHandler (#154) Co-authored-by: klokeshvar --- .../pkg/generator/template/client.go.tmpl | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index 6a8b5513c..c06cff460 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -854,6 +854,159 @@ func (c *{{$node.GroupResourceType}}Chainer) IsSubscribed() bool { return ok } +func (c *{{$node.GroupResourceType}}Chainer) RegisterEventHandler(addCB func(obj *{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}), updateCB func(oldObj, newObj *{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}), deleteCB func(obj *{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}})) (cache.ResourceEventHandlerRegistration, error) { + fmt.Println("RegisterEventHandler for {{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}") + var ( + registrationId cache.ResourceEventHandlerRegistration + err error + informer cache.SharedIndexInformer + ) + key := "{{$node.CrdName}}" + stopper := make(chan struct{}) + if s, ok := subscriptionMap.Load(key); ok { + fmt.Println("Informer exists for {{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}") + sub := s.(subscription) + informer = sub.informer + } else { + fmt.Println("Informer doesn't exists for {{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}, so creating a new one") + informer = {{$node.GroupInformerImport}}.New{{$node.BaseNodeName}}Informer(c.client.baseClient, 0, cache.Indexers{}) + go informer.Run(stopper) + subscribe(key, informer) + } + registrationId, err = informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}){ + nc := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, + {{$node.BaseNodeName}}: obj.(*{{$node.GroupBaseImport}}), + } + {{if .Parent.HasParent}} + var parent *{{.Parent.SimpleGroupTypeName}}{{.Parent.BaseNodeName}} + gvkExist := false + for i := 0; i < 600; i++ { + // Check if parent exists + p, err := nc.GetParent(context.TODO()) + if err != nil || p == nil { + time.Sleep(500 * time.Millisecond) + continue + } + parent = p + // Check GVK + {{if .Parent.IsNamed}} + if _, ok := parent.Spec.{{.Parent.GoGvkFieldName}}[nc.DisplayName()]; !ok { + time.Sleep(500 * time.Millisecond) + continue + } + {{else}} + if parent.Spec.{{.Parent.GoGvkFieldName}} == nil { + time.Sleep(500 * time.Millisecond) + continue + } + {{end}} + gvkExist = true + break + } + if parent == nil { + hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) + parent, err = c.client.Global().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + if err != nil { + if errors.IsNotFound(err) { + return + } + panic("error occurred while fetching parent " + err.Error()) + } + panic(fmt.Sprintf("parent found (event loop is stalled) " + nc.DisplayName())) + } + if !gvkExist { + // Check GVK + {{if .Parent.IsNamed}} + if _, ok := parent.Spec.{{.Parent.GoGvkFieldName}}[nc.DisplayName()]; !ok { + return + } + {{else}} + if parent.Spec.{{.Parent.GoGvkFieldName}} == nil { + return + } + {{end}} + panic(fmt.Sprintf("gvk found (event loop is stalled) " + nc.DisplayName())) + } + {{end}} + addCB(nc) + }, + + UpdateFunc: func(oldObj,newObj interface{}){ + oldData := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, + {{$node.BaseNodeName}}: oldObj.(*{{$node.GroupBaseImport}}), + } + newData := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, + {{$node.BaseNodeName}}: newObj.(*{{$node.GroupBaseImport}}), + } + updateCB(oldData,newData) + }, + + DeleteFunc: func(obj interface{}){ + nc := &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: c.client, + {{$node.BaseNodeName}}: obj.(*{{$node.GroupBaseImport}}), + } + {{if .Parent.HasParent}} + var parent *{{.Parent.SimpleGroupTypeName}}{{.Parent.BaseNodeName}} + gvkExist := true + for i := 0; i < 600; i++ { + // Check if parent exists + p, err := nc.GetParent(context.TODO()) + if err != nil || p == nil { + time.Sleep(500 * time.Millisecond) + continue + } + parent = p + // Check GVK + {{if .Parent.IsNamed}} + if _, ok := parent.Spec.{{.Parent.GoGvkFieldName}}[nc.DisplayName()]; ok { + time.Sleep(500 * time.Millisecond) + continue + } + {{else}} + if parent.Spec.{{.Parent.GoGvkFieldName}} != nil { + time.Sleep(500 * time.Millisecond) + continue + } + {{end}} + gvkExist = false + break + } + if parent == nil { + hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) + parent, err = c.client.Global().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + if err != nil { + if errors.IsNotFound(err) { + return + } + panic("error occurred while fetching parent " + err.Error()) + } + panic(fmt.Sprintf("parent found (event loop is stalled) " + nc.DisplayName())) + } + if gvkExist { + // Check GVK + {{if .Parent.IsNamed}} + if _, ok := parent.Spec.{{.Parent.GoGvkFieldName}}[nc.DisplayName()]; ok { + return + } + {{else}} + if parent.Spec.{{.Parent.GoGvkFieldName}} != nil { + return + } + {{end}} + panic(fmt.Sprintf("gvk not found (event loop is stalled) " + nc.DisplayName())) + } + {{end}} + deleteCB(nc) + }, + }) + return registrationId, err +} + func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj *{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}})) (cache.ResourceEventHandlerRegistration, error){ fmt.Println("{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}} --> RegisterAddCallback!") var ( From 17a42122698623e0ac70666dc04b49983b6dbb04 Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Fri, 5 May 2023 14:06:50 +0200 Subject: [PATCH 36/41] Bump go version --- compiler/builder/Dockerfile | 2 +- compiler/go.mod | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/builder/Dockerfile b/compiler/builder/Dockerfile index c4479d337..b4b5b30d4 100644 --- a/compiler/builder/Dockerfile +++ b/compiler/builder/Dockerfile @@ -1,5 +1,5 @@ #graphql's and compiler's builder/Dockerfile should be in sync -FROM gcr.io/nsx-sm/nexus/golang:1.18 +FROM gcr.io/nsx-sm/nexus/golang:1.19 ENV GOPATH /go ENV PATH $PATH:/usr/local/go/bin:/go/bin diff --git a/compiler/go.mod b/compiler/go.mod index f1423e4fe..d56f3b7fa 100644 --- a/compiler/go.mod +++ b/compiler/go.mod @@ -1,6 +1,6 @@ module github.com/vmware-tanzu/graph-framework-for-microservices/compiler -go 1.17 +go 1.19 require ( github.com/elliotchance/orderedmap v1.5.0 From e362b098567dd4928968e6b5e01e86f9e82913f1 Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Fri, 5 May 2023 16:58:56 +0200 Subject: [PATCH 37/41] Pin cert-manager version --- compiler/scripts/pin_deps.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/compiler/scripts/pin_deps.sh b/compiler/scripts/pin_deps.sh index b1feca5c0..164b46874 100755 --- a/compiler/scripts/pin_deps.sh +++ b/compiler/scripts/pin_deps.sh @@ -46,3 +46,4 @@ go mod edit -require golang.org/x/net@v0.2.0 go mod edit -require google.golang.org/grpc@v1.51.0 go mod edit -require k8s.io/utils@v0.0.0-20221128185143-99ec85e7a448 go mod edit -require sigs.k8s.io/controller-runtime@v0.14.1 +go mod edit -require github.com/cert-manager/cert-manager@v1.11.0 From 83580acad649e6c6fa2d21930a3fc8fd7180a6db Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Mon, 8 May 2023 15:21:58 +0200 Subject: [PATCH 38/41] Fix problem with hardcoded Global() in nexus client --- compiler/pkg/generator/template/client.go.tmpl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index c06cff460..f779a69b2 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -907,7 +907,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterEventHandler(addCB func(obj } if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.Global().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{$node.SimpleGroupTypeName}}.ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -978,7 +978,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterEventHandler(addCB func(obj } if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.Global().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{$node.SimpleGroupTypeName}}.ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -1057,7 +1057,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.Global().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{$node.SimpleGroupTypeName}}.ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -1128,7 +1128,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.Global().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{$node.SimpleGroupTypeName}}.ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -1256,7 +1256,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.Global().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{$node.SimpleGroupTypeName}}.ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -1327,7 +1327,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.Global().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{$node.SimpleGroupTypeName}}.ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return From b5c035176d6381f9faf8ae2cabf8923150a6d6e2 Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Mon, 8 May 2023 15:43:39 +0200 Subject: [PATCH 39/41] Fix typo --- compiler/pkg/generator/template/client.go.tmpl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index f779a69b2..aab31748d 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -907,7 +907,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterEventHandler(addCB func(obj } if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.{{$node.SimpleGroupTypeName}}.ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{$node.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -978,7 +978,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterEventHandler(addCB func(obj } if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.{{$node.SimpleGroupTypeName}}.ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{$node.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -1057,7 +1057,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.{{$node.SimpleGroupTypeName}}.ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{$node.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -1128,7 +1128,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.{{$node.SimpleGroupTypeName}}.ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{$node.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -1256,7 +1256,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.{{$node.SimpleGroupTypeName}}.ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{$node.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -1327,7 +1327,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.{{$node.SimpleGroupTypeName}}.ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{$node.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return From 8f34b5f1449baf8a04b6d6d045945f7e21f62af7 Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Mon, 8 May 2023 16:33:50 +0200 Subject: [PATCH 40/41] Use Parent's SimpleGroupName for force read --- compiler/pkg/generator/template/client.go.tmpl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index aab31748d..f96b60c04 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -907,7 +907,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterEventHandler(addCB func(obj } if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.{{$node.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{.Parent.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -978,7 +978,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterEventHandler(addCB func(obj } if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.{{$node.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{.Parent.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -1057,7 +1057,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.{{$node.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{.Parent.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -1128,7 +1128,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterAddCallback(cbfn func(obj * if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.{{$node.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{.Parent.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -1256,7 +1256,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.{{$node.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{.Parent.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return @@ -1327,7 +1327,7 @@ func (c *{{$node.GroupResourceType}}Chainer) RegisterDeleteCallback(cbfn func(ob if parent == nil { hashedName := helper.GetHashedName("{{.Parent.CrdName}}", nc.Labels, nc.Labels["{{.Parent.CrdName}}"]) - parent, err = c.client.{{$node.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) + parent, err = c.client.{{.Parent.SimpleGroupTypeName}}().ForceRead{{.Parent.BaseNodeName}}ByName(context.TODO(), hashedName) if err != nil { if errors.IsNotFound(err) { return From b220a29e2448998f31a3c91e982de01b69340938 Mon Sep 17 00:00:00 2001 From: Vishnubabu Date: Thu, 11 May 2023 22:27:29 +0530 Subject: [PATCH 41/41] nexus client logger and retry --- .../pkg/generator/template/client.go.tmpl | 82 +++++++++++++------ 1 file changed, 58 insertions(+), 24 deletions(-) diff --git a/compiler/pkg/generator/template/client.go.tmpl b/compiler/pkg/generator/template/client.go.tmpl index f96b60c04..8aa548990 100644 --- a/compiler/pkg/generator/template/client.go.tmpl +++ b/compiler/pkg/generator/template/client.go.tmpl @@ -23,6 +23,7 @@ import ( types "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/rest" cache "k8s.io/client-go/tools/cache" + "github.com/sirupsen/logrus" {{.HelperImport}} {{.CommonImport}} @@ -33,6 +34,8 @@ fakeBaseClienset {{.FakeBaseCliensetImport}} {{.InformerImports}} ) +var log = logrus.New() + type Clientset struct { baseClient baseClientset.Interface {{ range $key, $group := .ApiGroups }}{{$group.ClientsetApiGroups}}{{ end }} @@ -142,13 +145,49 @@ func (group *{{$node.GroupTypeName}}) Get{{$node.BaseNodeName}}ByName(ctx contex {{$node.BaseNodeName}}: result, }, nil }else{ + retryCount := 12 + for { + result, err := group.client.baseClient. + {{$node.GroupTypeName}}(). + {{$node.GroupResourceNameTitle}}().Get(ctx, hashedName, metav1.GetOptions{}) + if err != nil { + if errors.IsTimeout(err) { + if retryCount == 0 { + return nil, err + } + retryCount-=1 + time.Sleep(5 * time.Second) + }else { + return nil, err + } + } + return &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ + client: group.client, + {{$node.BaseNodeName}}: result, + }, nil + } + } +} + +// ForceRead{{$node.BaseNodeName}}ByName read object directly from the database under the hashedName which is a hash of display +// name and parents names. Use it when you know hashed name of object. +func (group *{{$node.GroupTypeName}}) ForceRead{{$node.BaseNodeName}}ByName(ctx context.Context, hashedName string) (*{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}, error) { + retryCount := 12 + for { result, err := group.client.baseClient. {{$node.GroupTypeName}}(). {{$node.GroupResourceNameTitle}}().Get(ctx, hashedName, metav1.GetOptions{}) if err != nil { - return nil, err + if errors.IsTimeout(err) { + if retryCount == 0 { + return nil, err + } + retryCount-=1 + time.Sleep(5 * time.Second) + }else { + return nil, err + } } - return &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ client: group.client, {{$node.BaseNodeName}}: result, @@ -156,22 +195,6 @@ func (group *{{$node.GroupTypeName}}) Get{{$node.BaseNodeName}}ByName(ctx contex } } -// ForceRead{{$node.BaseNodeName}}ByName read object directly from the database under the hashedName which is a hash of display -// name and parents names. Use it when you know hashed name of object. -func (group *{{$node.GroupTypeName}}) ForceRead{{$node.BaseNodeName}}ByName(ctx context.Context, hashedName string) (*{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}, error) { - result, err := group.client.baseClient. - {{$node.GroupTypeName}}(). - {{$node.GroupResourceNameTitle}}().Get(ctx, hashedName, metav1.GetOptions{}) - if err != nil { - return nil, err - } - - return &{{$node.SimpleGroupTypeName}}{{$node.BaseNodeName}}{ - client: group.client, - {{$node.BaseNodeName}}: result, - }, nil -} - // Delete{{$node.BaseNodeName}}ByName deletes object stored in the database under the hashedName which is a hash of // display name and parents names. Use it when you know hashed name of object. func (group *{{$node.GroupTypeName}}) Delete{{$node.BaseNodeName}}ByName(ctx context.Context, hashedName string) (err error) { @@ -377,13 +400,24 @@ func (group *{{$node.GroupTypeName}}) Update{{$node.BaseNodeName}}ByName(ctx con }{{end}} // ResourceVersion must be set for update if objToUpdate.ResourceVersion == "" { - current, err := group.client.baseClient. - {{$node.GroupTypeName}}(). - {{$node.GroupResourceNameTitle}}().Get(ctx, objToUpdate.GetName(), metav1.GetOptions{}) - if err != nil { - return nil, err + retryCount := 12 + for { + current, err := group.client.baseClient. + {{$node.GroupTypeName}}(). + {{$node.GroupResourceNameTitle}}().Get(ctx, objToUpdate.GetName(), metav1.GetOptions{}) + if err != nil { + if errors.IsTimeout(err) { + if retryCount == 0 { + return nil, err + } + retryCount-=1 + time.Sleep(5 * time.Second) + }else { + return nil, err + } + } + objToUpdate.ResourceVersion = current.ResourceVersion } - objToUpdate.ResourceVersion = current.ResourceVersion } var patch Patch