1
0
mirror of https://github.com/rancher/norman.git synced 2025-08-15 22:13:27 +00:00

Changes to generator for deepcopygen

This commit is contained in:
Darren Shepherd 2017-11-11 17:07:09 -07:00
parent f9b15a5e39
commit 591b663b2d
6 changed files with 80 additions and 7 deletions

View File

@ -227,9 +227,7 @@ func (a *APIOperations) DoByID(schemaType string, id string, respObject interfac
return errors.New("Failed to find collection URL for [" + schemaType + "]") return errors.New("Failed to find collection URL for [" + schemaType + "]")
} }
err := a.DoGet(collectionUrl+"/"+id, nil, respObject) return a.DoGet(collectionUrl+"/"+id, nil, respObject)
//TODO check for 404 and return nil, nil
return err
} }
func (a *APIOperations) DoResourceDelete(schemaType string, existing *types.Resource) error { func (a *APIOperations) DoResourceDelete(schemaType string, existing *types.Resource) error {

View File

@ -31,6 +31,12 @@ var (
} }
) )
type {{.schema.CodeName}}List struct {
metav1.TypeMeta %BACK%json:",inline"%BACK%
metav1.ObjectMeta %BACK%json:"metadata,omitempty"%BACK%
Items []{{.schema.CodeName}}
}
type {{.schema.CodeName}}HandlerFunc func(key string, obj *{{.schema.CodeName}}) error type {{.schema.CodeName}}HandlerFunc func(key string, obj *{{.schema.CodeName}}) error
type {{.schema.CodeName}}Controller interface { type {{.schema.CodeName}}Controller interface {

View File

@ -10,11 +10,15 @@ import (
"strings" "strings"
"text/template" "text/template"
"io"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/rancher/norman/types" "github.com/rancher/norman/types"
"github.com/rancher/norman/types/convert" "github.com/rancher/norman/types/convert"
"k8s.io/gengo/args" "k8s.io/gengo/args"
"k8s.io/gengo/examples/deepcopy-gen/generators" "k8s.io/gengo/examples/deepcopy-gen/generators"
"k8s.io/gengo/generator"
gengotypes "k8s.io/gengo/types"
) )
var ( var (
@ -173,6 +177,8 @@ func Generate(schemas *types.Schemas, cattleOutputPackage, k8sOutputPackage stri
return err return err
} }
doDeepCopy := false
generated := []*types.Schema{} generated := []*types.Schema{}
for _, schema := range schemas.Schemas() { for _, schema := range schemas.Schemas() {
if blackListTypes[schema.ID] { if blackListTypes[schema.ID] {
@ -183,7 +189,10 @@ func Generate(schemas *types.Schemas, cattleOutputPackage, k8sOutputPackage stri
return err return err
} }
if contains(schema.CollectionMethods, http.MethodGet) { if contains(schema.CollectionMethods, http.MethodGet) &&
!strings.HasPrefix(schema.PkgName, "k8s.io") &&
!strings.Contains(schema.PkgName, "/vendor/") {
doDeepCopy = true
if err := generateController(k8sDir, schema, schemas); err != nil { if err := generateController(k8sDir, schema, schemas); err != nil {
return err return err
} }
@ -196,8 +205,10 @@ func Generate(schemas *types.Schemas, cattleOutputPackage, k8sOutputPackage stri
return err return err
} }
if err := deepCopyGen(baseDir, k8sOutputPackage); err != nil { if doDeepCopy {
return err if err := deepCopyGen(baseDir, k8sOutputPackage); err != nil {
return err
}
} }
if err := gofmt(baseDir, k8sOutputPackage); err != nil { if err := gofmt(baseDir, k8sOutputPackage); err != nil {
@ -252,5 +263,54 @@ func deepCopyGen(workDir, pkg string) error {
return arguments.Execute( return arguments.Execute(
generators.NameSystems(), generators.NameSystems(),
generators.DefaultNameSystem(), generators.DefaultNameSystem(),
generators.Packages) func(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages {
packageParts := strings.Split(pkg, "/")
return generator.Packages{
&generator.DefaultPackage{
PackageName: packageParts[len(packageParts)-1],
PackagePath: pkg,
HeaderText: []byte{},
GeneratorFunc: func(c *generator.Context) []generator.Generator {
return []generator.Generator{
&noInitGenerator{
generators.NewGenDeepCopy(arguments.OutputFileBaseName, pkg, nil, true, true),
},
}
},
FilterFunc: func(c *generator.Context, t *gengotypes.Type) bool {
if t.Name.Package != pkg {
return false
}
if isObjectOrList(t) {
t.SecondClosestCommentLines = append(t.SecondClosestCommentLines,
"+k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object")
}
return true
},
},
}
})
}
type noInitGenerator struct {
generator.Generator
}
func (n *noInitGenerator) Init(*generator.Context, io.Writer) error {
return nil
}
func isObjectOrList(t *gengotypes.Type) bool {
for _, member := range t.Members {
if member.Embedded && (member.Name == "ObjectMeta" || member.Name == "ListMeta") {
return true
}
if member.Embedded && isObjectOrList(member.Type) {
return true
}
}
return false
} }

View File

@ -49,6 +49,7 @@ func (s *Schemas) newSchemaFromType(version *APIVersion, t reflect.Type, typeNam
ID: typeName, ID: typeName,
Version: *version, Version: *version,
CodeName: t.Name(), CodeName: t.Name(),
PkgName: t.PkgPath(),
ResourceFields: map[string]Field{}, ResourceFields: map[string]Field{},
} }

View File

@ -32,6 +32,13 @@ func (s *Schemas) Err() error {
return NewErrors(s.errors) return NewErrors(s.errors)
} }
func (s *Schemas) AddSchemas(schema *Schemas) *Schemas {
for _, schema := range schema.Schemas() {
s.AddSchema(schema)
}
return s
}
func (s *Schemas) AddSchema(schema *Schema) *Schemas { func (s *Schemas) AddSchema(schema *Schema) *Schemas {
schema.Type = "schema" schema.Type = "schema"
if schema.ID == "" { if schema.ID == "" {

View File

@ -62,6 +62,7 @@ type APIVersion struct {
type Schema struct { type Schema struct {
ID string `json:"id,omitempty"` ID string `json:"id,omitempty"`
CodeName string `json:"-"` CodeName string `json:"-"`
PkgName string `json:"-"`
Type string `json:"type,omitempty"` Type string `json:"type,omitempty"`
Links map[string]string `json:"links"` Links map[string]string `json:"links"`
Version APIVersion `json:"version"` Version APIVersion `json:"version"`