Skip to content

Commit

Permalink
Resource groups from config (#55)
Browse files Browse the repository at this point in the history
* rename GroupName to ProtoPackage

Signed-off-by: Scott Weiss <[email protected]>

* make private

Signed-off-by: Scott Weiss <[email protected]>

* wip: migrating to new resource grouping strategy

Signed-off-by: Scott Weiss <[email protected]>

* resources by explicit grouping working

Signed-off-by: Scott Weiss <[email protected]>

* regenerate test code

Signed-off-by: Scott Weiss <[email protected]>
  • Loading branch information
ilackarms authored Jan 4, 2019
1 parent cd00204 commit 2e36533
Show file tree
Hide file tree
Showing 23 changed files with 182 additions and 117 deletions.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 4 additions & 5 deletions pkg/code-generator/cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ import (
"strings"
"sync"

"golang.org/x/sync/errgroup"

"github.com/gogo/protobuf/proto"
"github.com/gogo/protobuf/protoc-gen-gogo/descriptor"
"github.com/solo-io/solo-kit/pkg/code-generator/codegen"
Expand All @@ -21,6 +19,7 @@ import (
"github.com/solo-io/solo-kit/pkg/errors"
"github.com/solo-io/solo-kit/pkg/utils/log"
"github.com/solo-io/solo-kit/pkg/utils/stringutils"
"golang.org/x/sync/errgroup"
)

func Run(relativeRoot string, compileProtos, genDocs bool, customImports, skipDirs []string) error {
Expand Down Expand Up @@ -84,14 +83,14 @@ func Run(relativeRoot string, compileProtos, genDocs bool, customImports, skipDi
return err
}

if project.DocsDir != "" && genDocs {
if project.ProjectConfig.DocsDir != "" && genDocs {
docs, err := docgen.GenerateFiles(project)
if err != nil {
return err
}

for _, file := range docs {
path := filepath.Join(absoluteRoot, project.DocsDir, file.Filename)
path := filepath.Join(absoluteRoot, project.ProjectConfig.DocsDir, file.Filename)
if err := os.MkdirAll(filepath.Dir(path), 0777); err != nil {
return err
}
Expand All @@ -101,7 +100,7 @@ func Run(relativeRoot string, compileProtos, genDocs bool, customImports, skipDi
}
}

outDir := filepath.Join(gopathSrc(), project.GoPackage)
outDir := filepath.Join(gopathSrc(), project.ProjectConfig.GoPackage)

for _, file := range code {
path := filepath.Join(outDir, file.Filename)
Expand Down
4 changes: 2 additions & 2 deletions pkg/code-generator/codegen/funcs/template_funcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ func linkForResource(project *model.Project) func(resource *model.Resource) (str
}
}
return "", errors.Errorf("internal error: could not find file for resource %v in project %v",
resource.Filename, project.Name)
resource.Filename, project.ProjectConfig.Name)
}
}

Expand All @@ -262,7 +262,7 @@ func resourceForMessage(project *model.Project) func(msg *protokit.Descriptor) (
}
return nil, nil
return nil, errors.Errorf("internal error: could not find file for resource for msg %v in project %v",
msg.GetName(), project.Name)
msg.GetName(), project.ProjectConfig.Name)
}
}

Expand Down
18 changes: 10 additions & 8 deletions pkg/code-generator/codegen/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"strings"
"text/template"

"github.com/solo-io/solo-kit/pkg/errors"

"github.com/iancoleman/strcase"
"github.com/solo-io/solo-kit/pkg/code-generator"
"github.com/solo-io/solo-kit/pkg/code-generator/codegen/templates"
Expand All @@ -23,10 +25,10 @@ func GenerateFiles(project *model.Project, skipOutOfPackageFiles bool) (code_gen
}
for _, res := range project.Resources {
// only generate files for the resources in our group, otherwise we import
if res.GroupName != project.GroupName {
if res.ProtoPackage != project.ProtoPackage {
log.Printf("not generating solo-kit "+
"clients for resource %v.%v, "+
"group name must match package name %v", res.GroupName, res.Name, project.GroupName)
"resource proto package must match project proto package %v", res.ProtoPackage, res.Name, project.ProtoPackage)
continue
}
fs, err := generateFilesForResource(res)
Expand All @@ -36,7 +38,7 @@ func GenerateFiles(project *model.Project, skipOutOfPackageFiles bool) (code_gen
files = append(files, fs...)
}
for _, grp := range project.ResourceGroups {
if skipOutOfPackageFiles && !(strings.HasSuffix(grp.Name, "."+project.GroupName) || grp.Name == project.GroupName) {
if skipOutOfPackageFiles && !(strings.HasSuffix(grp.Name, "."+project.ProtoPackage) || grp.Name == project.ProtoPackage) {
continue
}
fs, err := generateFilesForResourceGroup(grp)
Expand All @@ -47,7 +49,7 @@ func GenerateFiles(project *model.Project, skipOutOfPackageFiles bool) (code_gen
}

for _, res := range project.XDSResources {
if skipOutOfPackageFiles && res.GroupName != project.GroupName && !strings.HasSuffix(res.GroupName, "."+project.GroupName) {
if skipOutOfPackageFiles && res.ProtoPackage != project.ProtoPackage && !strings.HasSuffix(res.ProtoPackage, "."+project.ProtoPackage) {
continue
}
fs, err := generateFilesForXdsResource(res)
Expand Down Expand Up @@ -89,7 +91,7 @@ func generateFilesForResource(resource *model.Resource) (code_generator.Files, e
} {
content, err := generateResourceFile(resource, tmpl)
if err != nil {
return nil, err
return nil, errors.Wrapf(err, "internal error: processing template '%v' for resource %v failed", tmpl.ParseName, resource.Name)
}
v = append(v, code_generator.File{
Filename: strcase.ToSnake(resource.Name) + suffix,
Expand All @@ -110,7 +112,7 @@ func generateFilesForResourceGroup(rg *model.ResourceGroup) (code_generator.File
} {
content, err := generateResourceGroupFile(rg, tmpl)
if err != nil {
return nil, err
return nil, errors.Wrapf(err, "internal error: processing %template '%v' for resource group %v failed", tmpl.ParseName, rg.Name)
}
v = append(v, code_generator.File{
Filename: strcase.ToSnake(rg.GoName) + suffix,
Expand All @@ -127,10 +129,10 @@ func generateFilesForProject(project *model.Project) (code_generator.Files, erro
} {
content, err := generateProjectFile(project, tmpl)
if err != nil {
return nil, err
return nil, errors.Wrapf(err, "internal error: processing template '%v' for project %v failed", tmpl.ParseName, project.ProjectConfig.Name)
}
v = append(v, code_generator.File{
Filename: strcase.ToSnake(project.Name) + suffix,
Filename: strcase.ToSnake(project.ProjectConfig.Name) + suffix,
Content: content,
})
}
Expand Down
6 changes: 3 additions & 3 deletions pkg/code-generator/codegen/templates/event_loop_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"text/template"
)

var ResourceGroupEventLoopTemplate = template.Must(template.New("resource_group_event_loop").Funcs(Funcs).Parse(`package {{ .Project.Version }}
var ResourceGroupEventLoopTemplate = template.Must(template.New("resource_group_event_loop").Funcs(Funcs).Parse(`package {{ .Project.ProjectConfig.Version }}
import (
"context"
Expand Down Expand Up @@ -53,7 +53,7 @@ func New{{ .GoName }}EventLoop(emitter {{ .GoName }}Emitter, syncer {{ .GoName }
func (el *{{ lower_camel .GoName }}EventLoop) Run(namespaces []string, opts clients.WatchOpts) (<-chan error, error) {
opts = opts.WithDefaults()
opts.Ctx = contextutils.WithLogger(opts.Ctx, "{{ .Project.Version }}.event_loop")
opts.Ctx = contextutils.WithLogger(opts.Ctx, "{{ .Project.ProjectConfig.Version }}.event_loop")
logger := contextutils.LoggerFrom(opts.Ctx)
logger.Infof("event loop started")
Expand All @@ -63,7 +63,7 @@ func (el *{{ lower_camel .GoName }}EventLoop) Run(namespaces []string, opts clie
if err != nil {
return nil, errors.Wrapf(err, "starting snapshot watch")
}
go errutils.AggregateErrs(opts.Ctx, errs, emitterErrs, "{{ .Project.Version }}.emitter errors")
go errutils.AggregateErrs(opts.Ctx, errs, emitterErrs, "{{ .Project.ProjectConfig.Version }}.emitter errors")
go func() {
// create a new context for each loop, cancel it before each loop
var cancel context.CancelFunc = func() {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"text/template"
)

var ResourceGroupEventLoopTestTemplate = template.Must(template.New("resource_group_event_loop_test").Funcs(Funcs).Parse(`package {{ .Project.Version }}
var ResourceGroupEventLoopTestTemplate = template.Must(template.New("resource_group_event_loop_test").Funcs(Funcs).Parse(`package {{ .Project.ProjectConfig.Version }}
{{- $clients := new_str_slice }}
{{- range .Resources}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (

var ResourceClientTestTemplate = template.Must(template.New("resource_client_test").Funcs(Funcs).Parse(`// +build solokit
package {{ .Project.Version }}
package {{ .Project.ProjectConfig.Version }}
import (
"time"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"text/template"
)

var ResourceClientTemplate = template.Must(template.New("resource_reconciler").Funcs(Funcs).Parse(`package {{ .Project.Version }}
var ResourceClientTemplate = template.Must(template.New("resource_reconciler").Funcs(Funcs).Parse(`package {{ .Project.ProjectConfig.Version }}
import (
"github.com/solo-io/solo-kit/pkg/api/v1/clients"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"text/template"
)

var ResourceReconcilerTemplate = template.Must(template.New("resource_client").Funcs(Funcs).Parse(`package {{ .Project.Version }}
var ResourceReconcilerTemplate = template.Must(template.New("resource_client").Funcs(Funcs).Parse(`package {{ .Project.ProjectConfig.Version }}
import (
"github.com/solo-io/solo-kit/pkg/api/v1/clients"
"github.com/solo-io/solo-kit/pkg/api/v1/reconcile"
Expand Down
8 changes: 4 additions & 4 deletions pkg/code-generator/codegen/templates/resource_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"text/template"
)

var ResourceTemplate = template.Must(template.New("resource").Funcs(Funcs).Parse(`package {{ .Project.Version }}
var ResourceTemplate = template.Must(template.New("resource").Funcs(Funcs).Parse(`package {{ .Project.ProjectConfig.Version }}
import (
"sort"
Expand Down Expand Up @@ -177,10 +177,10 @@ func (o *{{ .Name }}) DeepCopyObject() runtime.Object {
return resources.Clone(o).(*{{ .Name }})
}
var {{ .Name }}Crd = crd.NewCrd("{{ .Project.GroupName }}",
var {{ .Name }}Crd = crd.NewCrd("{{ .Project.ProtoPackage }}",
"{{ lowercase (upper_camel .PluralName) }}",
"{{ .Project.GroupName }}",
"{{ .Project.Version }}",
"{{ .Project.ProtoPackage }}",
"{{ .Project.ProjectConfig.Version }}",
"{{ .Name }}",
"{{ .ShortName }}",
&{{ .Name }}{})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
)

var ResourceGroupEmitterTemplate = template.Must(template.New("resource_group_emitter").Funcs(Funcs).Parse(
`package {{ .Project.Version }}
`package {{ .Project.ProjectConfig.Version }}
{{- $client_declarations := new_str_slice }}
{{- $clients := new_str_slice }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"text/template"
)

var ResourceGroupEmitterTestTemplate = template.Must(template.New("resource_group_emitter_test").Funcs(Funcs).Parse(`package {{ .Project.Version }}
var ResourceGroupEmitterTestTemplate = template.Must(template.New("resource_group_emitter_test").Funcs(Funcs).Parse(`package {{ .Project.ProjectConfig.Version }}
{{- $clients := new_str_slice }}
{{- $needs_kube_client := false }}
Expand Down Expand Up @@ -42,7 +42,7 @@ import (
{{- end }}
)
var _ = Describe("{{ upper_camel .Project.Version }}Emitter", func() {
var _ = Describe("{{ upper_camel .Project.ProjectConfig.Version }}Emitter", func() {
if os.Getenv("RUN_KUBE_TESTS") != "1" {
log.Printf("This test creates kubernetes resources and is disabled by default. To enable, set RUN_KUBE_TESTS=1 in your env.")
return
Expand Down
2 changes: 1 addition & 1 deletion pkg/code-generator/codegen/templates/snapshot_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
)

var ResourceGroupSnapshotTemplate = template.Must(template.New("resource_group_snapshot").Funcs(Funcs).Parse(
`package {{ .Project.Version }}
`package {{ .Project.ProjectConfig.Version }}
import (
{{ .Imports }}
Expand Down
6 changes: 3 additions & 3 deletions pkg/code-generator/codegen/templates/test_suite_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"text/template"
)

var ProjectTestSuiteTemplate = template.Must(template.New("project_template").Funcs(Funcs).Parse(`package {{ .Version }}
var ProjectTestSuiteTemplate = template.Must(template.New("project_template").Funcs(Funcs).Parse(`package {{ .ProjectConfig.Version }}
import (
"testing"
Expand All @@ -13,9 +13,9 @@ import (
. "github.com/onsi/gomega"
)
func Test{{ upper_camel .Name }}(t *testing.T) {
func Test{{ upper_camel .ProjectConfig.Name }}(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "{{ upper_camel .Name }} Suite")
RunSpecs(t, "{{ upper_camel .ProjectConfig.Name }} Suite")
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/code-generator/codegen/templates/xds_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"text/template"
)

var XdsTemplate = template.Must(template.New("xds_template").Funcs(Funcs).Parse(`package {{ .Project.Version }}
var XdsTemplate = template.Must(template.New("xds_template").Funcs(Funcs).Parse(`package {{ .Project.ProjectConfig.Version }}
import (
"context"
Expand Down
2 changes: 1 addition & 1 deletion pkg/code-generator/docgen/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ func generateFilesForProject(project *model.Project) (code_generator.Files, erro
return nil, err
}
v = append(v, code_generator.File{
Filename: strcase.ToSnake(project.Name) + suffix,
Filename: strcase.ToSnake(project.ProjectConfig.Name) + suffix,
Content: content,
})
}
Expand Down
7 changes: 3 additions & 4 deletions pkg/code-generator/docgen/templates/project_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,12 @@ import (

func ProjectDocsRootTemplate(project *model.Project) *template.Template {
return template.Must(template.New("pf").Funcs(funcs.TemplateFuncs(project)).Parse(`
{{ $Project := . -}}
### API Reference for {{ .Title}}
### API Reference for {{ .ProjectConfig.Title}}
API Version: ` + "`{{ .Name }}.{{ .Version }}`" + `
API Version: ` + "`{{ .ProjectConfig.Name }}.{{ .ProjectConfig.Version }}`" + `
{{ .Description }}
{{ .ProjectConfig.Description }}
### API Resources:
{{- range .Resources}}
Expand Down
43 changes: 24 additions & 19 deletions pkg/code-generator/model/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,34 +19,38 @@ const ProjectConfigFilename = "solo-kit.json"
// SOLO-KIT Descriptors from which code can be generated

type ProjectConfig struct {
Title string `json:"title"`
Description string `json:"description"`
Name string `json:"name"`
Version string `json:"version"`
DocsDir string `json:"docs_dir"`
Title string `json:"title"`
Description string `json:"description"`
Name string `json:"name"`
Version string `json:"version"`
DocsDir string `json:"docs_dir"`
ResourceGroups map[string][]ResourceConfig `json:"resource_groups"`
// set by load
ProjectFile string
GoPackage string
}

type Project struct {
ProjectConfig
GroupName string
type ResourceConfig struct {
MessageName string `json:"name"`
MessagePackage string `json:"package"`
}

type Project struct {
ProjectConfig ProjectConfig
ProtoPackage string
Resources []*Resource
ResourceGroups []*ResourceGroup

XDSResources []*XDSResource
XDSResources []*XDSResource

Request *plugin_go.CodeGeneratorRequest
}

type Resource struct {
Name string
PluralName string
ShortName string
GroupName string // eg. gloo.solo.io
// ImportPrefix will equal GroupName+"." if the resource does not belong to the project
Name string
PluralName string
ShortName string
ProtoPackage string // eg. gloo.solo.io
// ImportPrefix will equal ProtoPackage+"." if the resource does not belong to the project
// else it will be empty string. used in event loop files
ImportPrefix string
// empty unless resource is external
Expand All @@ -57,8 +61,10 @@ type Resource struct {
Fields []*Field
Oneofs []*Oneof

// resource groups i belong to
ResourceGroups []*ResourceGroup
Project *Project
// project i belong to
Project *Project

Filename string // the proto file where this resource is contained

Expand Down Expand Up @@ -92,9 +98,8 @@ type XDSResource struct {
NameField string
NoReferences bool

Project *Project
GroupName string // eg. gloo.solo.io
Package string // proto package for the message
Project *Project
ProtoPackage string // eg. gloo.solo.io
}

func LoadProjectConfig(path string) (ProjectConfig, error) {
Expand Down
Loading

0 comments on commit 2e36533

Please sign in to comment.