mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-23 10:32:03 +00:00
unify tag syntax for genclient tags and add onlyVerbs and skipVerbs
This commit is contained in:
parent
84db0a9487
commit
d7e3029d7a
@ -27,6 +27,7 @@ go_library(
|
|||||||
"//vendor/k8s.io/kube-gen/cmd/client-gen/args:go_default_library",
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/args:go_default_library",
|
||||||
"//vendor/k8s.io/kube-gen/cmd/client-gen/generators/fake:go_default_library",
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/generators/fake:go_default_library",
|
||||||
"//vendor/k8s.io/kube-gen/cmd/client-gen/generators/scheme:go_default_library",
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/generators/scheme:go_default_library",
|
||||||
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/generators/util:go_default_library",
|
||||||
"//vendor/k8s.io/kube-gen/cmd/client-gen/path:go_default_library",
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/path:go_default_library",
|
||||||
"//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library",
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library",
|
||||||
],
|
],
|
||||||
|
@ -29,6 +29,7 @@ import (
|
|||||||
clientgenargs "k8s.io/kube-gen/cmd/client-gen/args"
|
clientgenargs "k8s.io/kube-gen/cmd/client-gen/args"
|
||||||
"k8s.io/kube-gen/cmd/client-gen/generators/fake"
|
"k8s.io/kube-gen/cmd/client-gen/generators/fake"
|
||||||
"k8s.io/kube-gen/cmd/client-gen/generators/scheme"
|
"k8s.io/kube-gen/cmd/client-gen/generators/scheme"
|
||||||
|
"k8s.io/kube-gen/cmd/client-gen/generators/util"
|
||||||
"k8s.io/kube-gen/cmd/client-gen/path"
|
"k8s.io/kube-gen/cmd/client-gen/path"
|
||||||
clientgentypes "k8s.io/kube-gen/cmd/client-gen/types"
|
clientgentypes "k8s.io/kube-gen/cmd/client-gen/types"
|
||||||
|
|
||||||
@ -169,7 +170,7 @@ func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, cli
|
|||||||
return generators
|
return generators
|
||||||
},
|
},
|
||||||
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
||||||
return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true
|
return util.MustParseClientGenTags(t.SecondClosestCommentLines).GenerateClient
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -342,7 +343,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
|
|||||||
} else {
|
} else {
|
||||||
// User has not specified any override for this group version.
|
// User has not specified any override for this group version.
|
||||||
// filter out types which dont have genclient=true.
|
// filter out types which dont have genclient=true.
|
||||||
if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false {
|
if tags := util.MustParseClientGenTags(t.SecondClosestCommentLines); !tags.GenerateClient {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,12 +17,12 @@ go_library(
|
|||||||
],
|
],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
deps = [
|
deps = [
|
||||||
"//vendor/github.com/golang/glog:go_default_library",
|
|
||||||
"//vendor/k8s.io/gengo/generator:go_default_library",
|
"//vendor/k8s.io/gengo/generator:go_default_library",
|
||||||
"//vendor/k8s.io/gengo/namer:go_default_library",
|
"//vendor/k8s.io/gengo/namer:go_default_library",
|
||||||
"//vendor/k8s.io/gengo/types:go_default_library",
|
"//vendor/k8s.io/gengo/types:go_default_library",
|
||||||
"//vendor/k8s.io/kube-gen/cmd/client-gen/args:go_default_library",
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/args:go_default_library",
|
||||||
"//vendor/k8s.io/kube-gen/cmd/client-gen/generators/scheme:go_default_library",
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/generators/scheme:go_default_library",
|
||||||
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/generators/util:go_default_library",
|
||||||
"//vendor/k8s.io/kube-gen/cmd/client-gen/path:go_default_library",
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/path:go_default_library",
|
||||||
"//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library",
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library",
|
||||||
],
|
],
|
||||||
|
@ -20,12 +20,12 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
|
||||||
|
|
||||||
"k8s.io/gengo/generator"
|
"k8s.io/gengo/generator"
|
||||||
"k8s.io/gengo/types"
|
"k8s.io/gengo/types"
|
||||||
|
|
||||||
clientgenargs "k8s.io/kube-gen/cmd/client-gen/args"
|
clientgenargs "k8s.io/kube-gen/cmd/client-gen/args"
|
||||||
scheme "k8s.io/kube-gen/cmd/client-gen/generators/scheme"
|
scheme "k8s.io/kube-gen/cmd/client-gen/generators/scheme"
|
||||||
|
"k8s.io/kube-gen/cmd/client-gen/generators/util"
|
||||||
clientgentypes "k8s.io/kube-gen/cmd/client-gen/types"
|
clientgentypes "k8s.io/kube-gen/cmd/client-gen/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -78,19 +78,11 @@ func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, cli
|
|||||||
return generators
|
return generators
|
||||||
},
|
},
|
||||||
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
||||||
return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true
|
return util.MustParseClientGenTags(t.SecondClosestCommentLines).GenerateClient
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func extractBoolTagOrDie(key string, lines []string) bool {
|
|
||||||
val, err := types.ExtractSingleBoolCommentTag("+", key, false, lines)
|
|
||||||
if err != nil {
|
|
||||||
glog.Fatalf(err.Error())
|
|
||||||
}
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
func PackageForClientset(customArgs clientgenargs.Args, fakeClientsetPackage string, boilerplate []byte, generatedBy string) generator.Package {
|
func PackageForClientset(customArgs clientgenargs.Args, fakeClientsetPackage string, boilerplate []byte, generatedBy string) generator.Package {
|
||||||
return &generator.DefaultPackage{
|
return &generator.DefaultPackage{
|
||||||
// TODO: we'll generate fake clientset for different release in the future.
|
// TODO: we'll generate fake clientset for different release in the future.
|
||||||
|
@ -25,6 +25,8 @@ import (
|
|||||||
"k8s.io/gengo/generator"
|
"k8s.io/gengo/generator"
|
||||||
"k8s.io/gengo/namer"
|
"k8s.io/gengo/namer"
|
||||||
"k8s.io/gengo/types"
|
"k8s.io/gengo/types"
|
||||||
|
|
||||||
|
"k8s.io/kube-gen/cmd/client-gen/generators/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// genFakeForGroup produces a file for a group client, e.g. ExtensionsClient for the extension group.
|
// genFakeForGroup produces a file for a group client, e.g. ExtensionsClient for the extension group.
|
||||||
@ -70,18 +72,20 @@ func (g *genFakeForGroup) GenerateType(c *generator.Context, t *types.Type, w io
|
|||||||
|
|
||||||
sw.Do(groupClientTemplate, m)
|
sw.Do(groupClientTemplate, m)
|
||||||
for _, t := range g.types {
|
for _, t := range g.types {
|
||||||
|
tags, err := util.ParseClientGenTags(t.SecondClosestCommentLines)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
wrapper := map[string]interface{}{
|
wrapper := map[string]interface{}{
|
||||||
"type": t,
|
"type": t,
|
||||||
"GroupVersion": namer.IC(g.group) + namer.IC(g.version),
|
"GroupVersion": namer.IC(g.group) + namer.IC(g.version),
|
||||||
"realClientPackage": strings.ToLower(filepath.Base(g.realClientPackage)),
|
"realClientPackage": strings.ToLower(filepath.Base(g.realClientPackage)),
|
||||||
}
|
}
|
||||||
namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines)
|
if tags.NonNamespaced {
|
||||||
if namespaced {
|
|
||||||
sw.Do(getterImplNamespaced, wrapper)
|
|
||||||
} else {
|
|
||||||
sw.Do(getterImplNonNamespaced, wrapper)
|
sw.Do(getterImplNonNamespaced, wrapper)
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
sw.Do(getterImplNamespaced, wrapper)
|
||||||
}
|
}
|
||||||
sw.Do(getRESTClient, m)
|
sw.Do(getRESTClient, m)
|
||||||
return sw.Error()
|
return sw.Error()
|
||||||
|
@ -17,13 +17,14 @@ limitations under the License.
|
|||||||
package fake
|
package fake
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"k8s.io/gengo/generator"
|
"k8s.io/gengo/generator"
|
||||||
"k8s.io/gengo/namer"
|
"k8s.io/gengo/namer"
|
||||||
"k8s.io/gengo/types"
|
"k8s.io/gengo/types"
|
||||||
|
|
||||||
|
"k8s.io/kube-gen/cmd/client-gen/generators/util"
|
||||||
"k8s.io/kube-gen/cmd/client-gen/path"
|
"k8s.io/kube-gen/cmd/client-gen/path"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -66,12 +67,8 @@ func genStatus(t *types.Type) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allow overriding via a comment on the type
|
tags := util.MustParseClientGenTags(t.SecondClosestCommentLines)
|
||||||
genStatus, err := types.ExtractSingleBoolCommentTag("+", "genclientstatus", hasStatus, t.SecondClosestCommentLines)
|
return hasStatus && !tags.NoStatus
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("error looking up +genclientstatus: %v\n", err)
|
|
||||||
}
|
|
||||||
return genStatus
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// hasObjectMeta returns true if the type has a ObjectMeta field.
|
// hasObjectMeta returns true if the type has a ObjectMeta field.
|
||||||
@ -88,7 +85,10 @@ func hasObjectMeta(t *types.Type) bool {
|
|||||||
func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
||||||
sw := generator.NewSnippetWriter(w, c, "$", "$")
|
sw := generator.NewSnippetWriter(w, c, "$", "$")
|
||||||
pkg := filepath.Base(t.Name.Package)
|
pkg := filepath.Base(t.Name.Package)
|
||||||
namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines)
|
tags, err := util.ParseClientGenTags(t.SecondClosestCommentLines)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
canonicalGroup := g.group
|
canonicalGroup := g.group
|
||||||
if canonicalGroup == "core" {
|
if canonicalGroup == "core" {
|
||||||
canonicalGroup = ""
|
canonicalGroup = ""
|
||||||
@ -110,7 +110,7 @@ func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io.
|
|||||||
"type": t,
|
"type": t,
|
||||||
"package": pkg,
|
"package": pkg,
|
||||||
"Package": namer.IC(pkg),
|
"Package": namer.IC(pkg),
|
||||||
"namespaced": namespaced,
|
"namespaced": !tags.NonNamespaced,
|
||||||
"Group": namer.IC(g.group),
|
"Group": namer.IC(g.group),
|
||||||
"GroupVersion": namer.IC(g.group) + namer.IC(g.version),
|
"GroupVersion": namer.IC(g.group) + namer.IC(g.version),
|
||||||
"group": canonicalGroup,
|
"group": canonicalGroup,
|
||||||
@ -148,43 +148,48 @@ func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io.
|
|||||||
"ExtractFromListOptions": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "ExtractFromListOptions"}),
|
"ExtractFromListOptions": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "ExtractFromListOptions"}),
|
||||||
}
|
}
|
||||||
|
|
||||||
noMethods := extractBoolTagOrDie("noMethods", t.SecondClosestCommentLines) == true
|
if tags.NonNamespaced {
|
||||||
|
|
||||||
readonly := extractBoolTagOrDie("readonly", t.SecondClosestCommentLines) == true
|
|
||||||
|
|
||||||
if namespaced {
|
|
||||||
sw.Do(structNamespaced, m)
|
|
||||||
} else {
|
|
||||||
sw.Do(structNonNamespaced, m)
|
sw.Do(structNonNamespaced, m)
|
||||||
|
} else {
|
||||||
|
sw.Do(structNamespaced, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !noMethods {
|
if tags.NoVerbs {
|
||||||
sw.Do(resource, m)
|
return sw.Error()
|
||||||
sw.Do(kind, m)
|
|
||||||
}
|
}
|
||||||
|
sw.Do(resource, m)
|
||||||
|
sw.Do(kind, m)
|
||||||
|
|
||||||
if !noMethods && !readonly {
|
if tags.HasVerb("get") {
|
||||||
sw.Do(createTemplate, m)
|
|
||||||
sw.Do(updateTemplate, m)
|
|
||||||
// Generate the UpdateStatus method if the type has a status
|
|
||||||
if genStatus(t) {
|
|
||||||
sw.Do(updateStatusTemplate, m)
|
|
||||||
}
|
|
||||||
sw.Do(deleteTemplate, m)
|
|
||||||
sw.Do(deleteCollectionTemplate, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !noMethods {
|
|
||||||
sw.Do(getTemplate, m)
|
sw.Do(getTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("list") {
|
||||||
if hasObjectMeta(t) {
|
if hasObjectMeta(t) {
|
||||||
sw.Do(listUsingOptionsTemplate, m)
|
sw.Do(listUsingOptionsTemplate, m)
|
||||||
} else {
|
} else {
|
||||||
sw.Do(listTemplate, m)
|
sw.Do(listTemplate, m)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if tags.HasVerb("watch") {
|
||||||
sw.Do(watchTemplate, m)
|
sw.Do(watchTemplate, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !noMethods && !readonly {
|
if tags.HasVerb("create") {
|
||||||
|
sw.Do(createTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("update") {
|
||||||
|
sw.Do(updateTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("updateStatus") && genStatus(t) {
|
||||||
|
sw.Do(updateStatusTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("delete") {
|
||||||
|
sw.Do(deleteTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("deleteCollection") {
|
||||||
|
sw.Do(deleteCollectionTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("patch") {
|
||||||
sw.Do(patchTemplate, m)
|
sw.Do(patchTemplate, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,6 +222,7 @@ var $.type|allLowercasePlural$Kind = $.GroupVersionKind|raw${Group: "$.groupName
|
|||||||
`
|
`
|
||||||
|
|
||||||
var listTemplate = `
|
var listTemplate = `
|
||||||
|
// List takes label and field selectors, and returns the list of $.type|publicPlural$ that match those selectors.
|
||||||
func (c *Fake$.type|publicPlural$) List(opts $.ListOptions|raw$) (result *$.type|raw$List, err error) {
|
func (c *Fake$.type|publicPlural$) List(opts $.ListOptions|raw$) (result *$.type|raw$List, err error) {
|
||||||
obj, err := c.Fake.
|
obj, err := c.Fake.
|
||||||
$if .namespaced$Invokes($.NewListAction|raw$($.type|allLowercasePlural$Resource, $.type|allLowercasePlural$Kind, c.ns, opts), &$.type|raw$List{})
|
$if .namespaced$Invokes($.NewListAction|raw$($.type|allLowercasePlural$Resource, $.type|allLowercasePlural$Kind, c.ns, opts), &$.type|raw$List{})
|
||||||
@ -229,6 +235,7 @@ func (c *Fake$.type|publicPlural$) List(opts $.ListOptions|raw$) (result *$.type
|
|||||||
`
|
`
|
||||||
|
|
||||||
var listUsingOptionsTemplate = `
|
var listUsingOptionsTemplate = `
|
||||||
|
// List takes label and field selectors, and returns the list of $.type|publicPlural$ that match those selectors.
|
||||||
func (c *Fake$.type|publicPlural$) List(opts $.ListOptions|raw$) (result *$.type|raw$List, err error) {
|
func (c *Fake$.type|publicPlural$) List(opts $.ListOptions|raw$) (result *$.type|raw$List, err error) {
|
||||||
obj, err := c.Fake.
|
obj, err := c.Fake.
|
||||||
$if .namespaced$Invokes($.NewListAction|raw$($.type|allLowercasePlural$Resource, $.type|allLowercasePlural$Kind, c.ns, opts), &$.type|raw$List{})
|
$if .namespaced$Invokes($.NewListAction|raw$($.type|allLowercasePlural$Resource, $.type|allLowercasePlural$Kind, c.ns, opts), &$.type|raw$List{})
|
||||||
@ -252,6 +259,7 @@ func (c *Fake$.type|publicPlural$) List(opts $.ListOptions|raw$) (result *$.type
|
|||||||
`
|
`
|
||||||
|
|
||||||
var getTemplate = `
|
var getTemplate = `
|
||||||
|
// Get takes name of the $.type|private$, and returns the corresponding $.type|private$ object, and an error if there is any.
|
||||||
func (c *Fake$.type|publicPlural$) Get(name string, options $.GetOptions|raw$) (result *$.type|raw$, err error) {
|
func (c *Fake$.type|publicPlural$) Get(name string, options $.GetOptions|raw$) (result *$.type|raw$, err error) {
|
||||||
obj, err := c.Fake.
|
obj, err := c.Fake.
|
||||||
$if .namespaced$Invokes($.NewGetAction|raw$($.type|allLowercasePlural$Resource, c.ns, name), &$.type|raw${})
|
$if .namespaced$Invokes($.NewGetAction|raw$($.type|allLowercasePlural$Resource, c.ns, name), &$.type|raw${})
|
||||||
@ -264,6 +272,7 @@ func (c *Fake$.type|publicPlural$) Get(name string, options $.GetOptions|raw$) (
|
|||||||
`
|
`
|
||||||
|
|
||||||
var deleteTemplate = `
|
var deleteTemplate = `
|
||||||
|
// Delete takes name of the $.type|private$ and deletes it. Returns an error if one occurs.
|
||||||
func (c *Fake$.type|publicPlural$) Delete(name string, options *$.DeleteOptions|raw$) error {
|
func (c *Fake$.type|publicPlural$) Delete(name string, options *$.DeleteOptions|raw$) error {
|
||||||
_, err := c.Fake.
|
_, err := c.Fake.
|
||||||
$if .namespaced$Invokes($.NewDeleteAction|raw$($.type|allLowercasePlural$Resource, c.ns, name), &$.type|raw${})
|
$if .namespaced$Invokes($.NewDeleteAction|raw$($.type|allLowercasePlural$Resource, c.ns, name), &$.type|raw${})
|
||||||
@ -273,6 +282,7 @@ func (c *Fake$.type|publicPlural$) Delete(name string, options *$.DeleteOptions|
|
|||||||
`
|
`
|
||||||
|
|
||||||
var deleteCollectionTemplate = `
|
var deleteCollectionTemplate = `
|
||||||
|
// DeleteCollection deletes a collection of objects.
|
||||||
func (c *Fake$.type|publicPlural$) DeleteCollection(options *$.DeleteOptions|raw$, listOptions $.ListOptions|raw$) error {
|
func (c *Fake$.type|publicPlural$) DeleteCollection(options *$.DeleteOptions|raw$, listOptions $.ListOptions|raw$) error {
|
||||||
$if .namespaced$action := $.NewDeleteCollectionAction|raw$($.type|allLowercasePlural$Resource, c.ns, listOptions)
|
$if .namespaced$action := $.NewDeleteCollectionAction|raw$($.type|allLowercasePlural$Resource, c.ns, listOptions)
|
||||||
$else$action := $.NewRootDeleteCollectionAction|raw$($.type|allLowercasePlural$Resource, listOptions)
|
$else$action := $.NewRootDeleteCollectionAction|raw$($.type|allLowercasePlural$Resource, listOptions)
|
||||||
@ -283,6 +293,7 @@ func (c *Fake$.type|publicPlural$) DeleteCollection(options *$.DeleteOptions|raw
|
|||||||
`
|
`
|
||||||
|
|
||||||
var createTemplate = `
|
var createTemplate = `
|
||||||
|
// Create takes the representation of a $.type|private$ and creates it. Returns the server's representation of the $.type|private$, and an error, if there is any.
|
||||||
func (c *Fake$.type|publicPlural$) Create($.type|private$ *$.type|raw$) (result *$.type|raw$, err error) {
|
func (c *Fake$.type|publicPlural$) Create($.type|private$ *$.type|raw$) (result *$.type|raw$, err error) {
|
||||||
obj, err := c.Fake.
|
obj, err := c.Fake.
|
||||||
$if .namespaced$Invokes($.NewCreateAction|raw$($.type|allLowercasePlural$Resource, c.ns, $.type|private$), &$.type|raw${})
|
$if .namespaced$Invokes($.NewCreateAction|raw$($.type|allLowercasePlural$Resource, c.ns, $.type|private$), &$.type|raw${})
|
||||||
@ -295,6 +306,7 @@ func (c *Fake$.type|publicPlural$) Create($.type|private$ *$.type|raw$) (result
|
|||||||
`
|
`
|
||||||
|
|
||||||
var updateTemplate = `
|
var updateTemplate = `
|
||||||
|
// Update takes the representation of a $.type|private$ and updates it. Returns the server's representation of the $.type|private$, and an error, if there is any.
|
||||||
func (c *Fake$.type|publicPlural$) Update($.type|private$ *$.type|raw$) (result *$.type|raw$, err error) {
|
func (c *Fake$.type|publicPlural$) Update($.type|private$ *$.type|raw$) (result *$.type|raw$, err error) {
|
||||||
obj, err := c.Fake.
|
obj, err := c.Fake.
|
||||||
$if .namespaced$Invokes($.NewUpdateAction|raw$($.type|allLowercasePlural$Resource, c.ns, $.type|private$), &$.type|raw${})
|
$if .namespaced$Invokes($.NewUpdateAction|raw$($.type|allLowercasePlural$Resource, c.ns, $.type|private$), &$.type|raw${})
|
||||||
@ -307,6 +319,8 @@ func (c *Fake$.type|publicPlural$) Update($.type|private$ *$.type|raw$) (result
|
|||||||
`
|
`
|
||||||
|
|
||||||
var updateStatusTemplate = `
|
var updateStatusTemplate = `
|
||||||
|
// UpdateStatus was generated because the type contains a Status member.
|
||||||
|
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
|
||||||
func (c *Fake$.type|publicPlural$) UpdateStatus($.type|private$ *$.type|raw$) (*$.type|raw$, error) {
|
func (c *Fake$.type|publicPlural$) UpdateStatus($.type|private$ *$.type|raw$) (*$.type|raw$, error) {
|
||||||
obj, err := c.Fake.
|
obj, err := c.Fake.
|
||||||
$if .namespaced$Invokes($.NewUpdateSubresourceAction|raw$($.type|allLowercasePlural$Resource, "status", c.ns, $.type|private$), &$.type|raw${})
|
$if .namespaced$Invokes($.NewUpdateSubresourceAction|raw$($.type|allLowercasePlural$Resource, "status", c.ns, $.type|private$), &$.type|raw${})
|
||||||
|
@ -23,6 +23,8 @@ import (
|
|||||||
"k8s.io/gengo/generator"
|
"k8s.io/gengo/generator"
|
||||||
"k8s.io/gengo/namer"
|
"k8s.io/gengo/namer"
|
||||||
"k8s.io/gengo/types"
|
"k8s.io/gengo/types"
|
||||||
|
|
||||||
|
"k8s.io/kube-gen/cmd/client-gen/generators/util"
|
||||||
"k8s.io/kube-gen/cmd/client-gen/path"
|
"k8s.io/kube-gen/cmd/client-gen/path"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -101,15 +103,18 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer
|
|||||||
sw.Do(groupInterfaceTemplate, m)
|
sw.Do(groupInterfaceTemplate, m)
|
||||||
sw.Do(groupClientTemplate, m)
|
sw.Do(groupClientTemplate, m)
|
||||||
for _, t := range g.types {
|
for _, t := range g.types {
|
||||||
|
tags, err := util.ParseClientGenTags(t.SecondClosestCommentLines)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
wrapper := map[string]interface{}{
|
wrapper := map[string]interface{}{
|
||||||
"type": t,
|
"type": t,
|
||||||
"GroupVersion": namer.IC(g.group) + namer.IC(g.version),
|
"GroupVersion": namer.IC(g.group) + namer.IC(g.version),
|
||||||
}
|
}
|
||||||
namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines)
|
if tags.NonNamespaced {
|
||||||
if namespaced {
|
|
||||||
sw.Do(getterImplNamespaced, wrapper)
|
|
||||||
} else {
|
|
||||||
sw.Do(getterImplNonNamespaced, wrapper)
|
sw.Do(getterImplNonNamespaced, wrapper)
|
||||||
|
} else {
|
||||||
|
sw.Do(getterImplNamespaced, wrapper)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sw.Do(newClientForConfigTemplate, m)
|
sw.Do(newClientForConfigTemplate, m)
|
||||||
|
@ -17,13 +17,15 @@ limitations under the License.
|
|||||||
package generators
|
package generators
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"k8s.io/gengo/generator"
|
"k8s.io/gengo/generator"
|
||||||
"k8s.io/gengo/namer"
|
"k8s.io/gengo/namer"
|
||||||
"k8s.io/gengo/types"
|
"k8s.io/gengo/types"
|
||||||
|
|
||||||
|
"k8s.io/kube-gen/cmd/client-gen/generators/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// genClientForType produces a file for each top-level type.
|
// genClientForType produces a file for each top-level type.
|
||||||
@ -64,25 +66,22 @@ func genStatus(t *types.Type) bool {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return hasStatus && !util.MustParseClientGenTags(t.SecondClosestCommentLines).NoStatus
|
||||||
// Allow overriding via a comment on the type
|
|
||||||
genStatus, err := types.ExtractSingleBoolCommentTag("+", "genclientstatus", hasStatus, t.SecondClosestCommentLines)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("error looking up +genclientstatus: %v\n", err)
|
|
||||||
}
|
|
||||||
return genStatus
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenerateType makes the body of a file implementing the individual typed client for type t.
|
// GenerateType makes the body of a file implementing the individual typed client for type t.
|
||||||
func (g *genClientForType) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
func (g *genClientForType) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
||||||
sw := generator.NewSnippetWriter(w, c, "$", "$")
|
sw := generator.NewSnippetWriter(w, c, "$", "$")
|
||||||
pkg := filepath.Base(t.Name.Package)
|
pkg := filepath.Base(t.Name.Package)
|
||||||
namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines)
|
tags, err := util.ParseClientGenTags(t.SecondClosestCommentLines)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
m := map[string]interface{}{
|
m := map[string]interface{}{
|
||||||
"type": t,
|
"type": t,
|
||||||
"package": pkg,
|
"package": pkg,
|
||||||
"Package": namer.IC(pkg),
|
"Package": namer.IC(pkg),
|
||||||
"namespaced": namespaced,
|
"namespaced": !tags.NonNamespaced,
|
||||||
"Group": namer.IC(g.group),
|
"Group": namer.IC(g.group),
|
||||||
"GroupVersion": namer.IC(g.group) + namer.IC(g.version),
|
"GroupVersion": namer.IC(g.group) + namer.IC(g.version),
|
||||||
"DeleteOptions": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/apis/meta/v1", Name: "DeleteOptions"}),
|
"DeleteOptions": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/apis/meta/v1", Name: "DeleteOptions"}),
|
||||||
@ -95,74 +94,100 @@ func (g *genClientForType) GenerateType(c *generator.Context, t *types.Type, w i
|
|||||||
}
|
}
|
||||||
|
|
||||||
sw.Do(getterComment, m)
|
sw.Do(getterComment, m)
|
||||||
if namespaced {
|
if tags.NonNamespaced {
|
||||||
sw.Do(getterNamesapced, m)
|
sw.Do(getterNonNamespaced, m)
|
||||||
} else {
|
} else {
|
||||||
sw.Do(getterNonNamesapced, m)
|
sw.Do(getterNamespaced, m)
|
||||||
}
|
}
|
||||||
noMethods := extractBoolTagOrDie("noMethods", t.SecondClosestCommentLines) == true
|
|
||||||
|
|
||||||
readonly := extractBoolTagOrDie("readonly", t.SecondClosestCommentLines) == true
|
|
||||||
|
|
||||||
sw.Do(interfaceTemplate1, m)
|
sw.Do(interfaceTemplate1, m)
|
||||||
if !noMethods {
|
if !tags.NoVerbs {
|
||||||
if readonly {
|
if !genStatus(t) {
|
||||||
sw.Do(interfaceTemplateReadonly, m)
|
tags.SkipVerbs = append(tags.SkipVerbs, "updateStatus")
|
||||||
} else {
|
|
||||||
sw.Do(interfaceTemplate2, m)
|
|
||||||
// Include the UpdateStatus method if the type has a status
|
|
||||||
if genStatus(t) {
|
|
||||||
sw.Do(interfaceUpdateStatusTemplate, m)
|
|
||||||
}
|
|
||||||
sw.Do(interfaceTemplate3, m)
|
|
||||||
}
|
}
|
||||||
|
sw.Do(generateInterface(tags), m)
|
||||||
}
|
}
|
||||||
sw.Do(interfaceTemplate4, m)
|
sw.Do(interfaceTemplate4, m)
|
||||||
|
|
||||||
if namespaced {
|
if tags.NonNamespaced {
|
||||||
sw.Do(structNamespaced, m)
|
|
||||||
sw.Do(newStructNamespaced, m)
|
|
||||||
} else {
|
|
||||||
sw.Do(structNonNamespaced, m)
|
sw.Do(structNonNamespaced, m)
|
||||||
sw.Do(newStructNonNamespaced, m)
|
sw.Do(newStructNonNamespaced, m)
|
||||||
|
} else {
|
||||||
|
sw.Do(structNamespaced, m)
|
||||||
|
sw.Do(newStructNamespaced, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !noMethods && !readonly {
|
if tags.NoVerbs {
|
||||||
sw.Do(createTemplate, m)
|
return sw.Error()
|
||||||
sw.Do(updateTemplate, m)
|
|
||||||
// Generate the UpdateStatus method if the type has a status
|
|
||||||
if genStatus(t) {
|
|
||||||
sw.Do(updateStatusTemplate, m)
|
|
||||||
}
|
|
||||||
sw.Do(deleteTemplate, m)
|
|
||||||
sw.Do(deleteCollectionTemplate, m)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !noMethods {
|
if tags.HasVerb("get") {
|
||||||
sw.Do(getTemplate, m)
|
sw.Do(getTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("list") {
|
||||||
sw.Do(listTemplate, m)
|
sw.Do(listTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("watch") {
|
||||||
sw.Do(watchTemplate, m)
|
sw.Do(watchTemplate, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !noMethods && !readonly {
|
if tags.HasVerb("create") {
|
||||||
|
sw.Do(createTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("update") {
|
||||||
|
sw.Do(updateTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("updateStatus") {
|
||||||
|
sw.Do(updateStatusTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("delete") {
|
||||||
|
sw.Do(deleteTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("deleteCollection") {
|
||||||
|
sw.Do(deleteCollectionTemplate, m)
|
||||||
|
}
|
||||||
|
if tags.HasVerb("patch") {
|
||||||
sw.Do(patchTemplate, m)
|
sw.Do(patchTemplate, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
return sw.Error()
|
return sw.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func generateInterface(tags util.Tags) string {
|
||||||
|
// need an ordered list here to guarantee order of generated methods.
|
||||||
|
out := []string{}
|
||||||
|
for _, m := range util.SupportedVerbs {
|
||||||
|
if tags.HasVerb(m) {
|
||||||
|
out = append(out, defaultVerbTemplates[m])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return strings.Join(out, "\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
var defaultVerbTemplates = map[string]string{
|
||||||
|
"create": `Create(*$.type|raw$) (*$.type|raw$, error)`,
|
||||||
|
"update": `Update(*$.type|raw$) (*$.type|raw$, error)`,
|
||||||
|
"updateStatus": `UpdateStatus(*$.type|raw$) (*$.type|raw$, error)`,
|
||||||
|
"delete": `Delete(name string, options *$.DeleteOptions|raw$) error`,
|
||||||
|
"deleteCollection": `DeleteCollection(options *$.DeleteOptions|raw$, listOptions $.ListOptions|raw$) error`,
|
||||||
|
"get": `Get(name string, options $.GetOptions|raw$) (*$.type|raw$, error)`,
|
||||||
|
"list": `List(opts $.ListOptions|raw$) (*$.type|raw$List, error)`,
|
||||||
|
"watch": `Watch(opts $.ListOptions|raw$) ($.watchInterface|raw$, error)`,
|
||||||
|
"patch": `Patch(name string, pt $.PatchType|raw$, data []byte, subresources ...string) (result *$.type|raw$, err error)`,
|
||||||
|
}
|
||||||
|
|
||||||
// group client will implement this interface.
|
// group client will implement this interface.
|
||||||
var getterComment = `
|
var getterComment = `
|
||||||
// $.type|publicPlural$Getter has a method to return a $.type|public$Interface.
|
// $.type|publicPlural$Getter has a method to return a $.type|public$Interface.
|
||||||
// A group's client should implement this interface.`
|
// A group's client should implement this interface.`
|
||||||
|
|
||||||
var getterNamesapced = `
|
var getterNamespaced = `
|
||||||
type $.type|publicPlural$Getter interface {
|
type $.type|publicPlural$Getter interface {
|
||||||
$.type|publicPlural$(namespace string) $.type|public$Interface
|
$.type|publicPlural$(namespace string) $.type|public$Interface
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
var getterNonNamesapced = `
|
var getterNonNamespaced = `
|
||||||
type $.type|publicPlural$Getter interface {
|
type $.type|publicPlural$Getter interface {
|
||||||
$.type|publicPlural$() $.type|public$Interface
|
$.type|publicPlural$() $.type|public$Interface
|
||||||
}
|
}
|
||||||
@ -173,27 +198,6 @@ var interfaceTemplate1 = `
|
|||||||
// $.type|public$Interface has methods to work with $.type|public$ resources.
|
// $.type|public$Interface has methods to work with $.type|public$ resources.
|
||||||
type $.type|public$Interface interface {`
|
type $.type|public$Interface interface {`
|
||||||
|
|
||||||
var interfaceTemplate2 = `
|
|
||||||
Create(*$.type|raw$) (*$.type|raw$, error)
|
|
||||||
Update(*$.type|raw$) (*$.type|raw$, error)`
|
|
||||||
|
|
||||||
var interfaceUpdateStatusTemplate = `
|
|
||||||
UpdateStatus(*$.type|raw$) (*$.type|raw$, error)`
|
|
||||||
|
|
||||||
// template for the Interface
|
|
||||||
var interfaceTemplate3 = `
|
|
||||||
Delete(name string, options *$.DeleteOptions|raw$) error
|
|
||||||
DeleteCollection(options *$.DeleteOptions|raw$, listOptions $.ListOptions|raw$) error
|
|
||||||
Get(name string, options $.GetOptions|raw$) (*$.type|raw$, error)
|
|
||||||
List(opts $.ListOptions|raw$) (*$.type|raw$List, error)
|
|
||||||
Watch(opts $.ListOptions|raw$) ($.watchInterface|raw$, error)
|
|
||||||
Patch(name string, pt $.PatchType|raw$, data []byte, subresources ...string) (result *$.type|raw$, err error)`
|
|
||||||
|
|
||||||
var interfaceTemplateReadonly = `
|
|
||||||
Get(name string, options $.GetOptions|raw$) (*$.type|raw$, error)
|
|
||||||
List(opts $.ListOptions|raw$) (*$.type|raw$List, error)
|
|
||||||
Watch(opts $.ListOptions|raw$) ($.watchInterface|raw$, error)`
|
|
||||||
|
|
||||||
var interfaceTemplate4 = `
|
var interfaceTemplate4 = `
|
||||||
$.type|public$Expansion
|
$.type|public$Expansion
|
||||||
}
|
}
|
||||||
@ -320,7 +324,7 @@ func (c *$.type|privatePlural$) Update($.type|private$ *$.type|raw$) (result *$.
|
|||||||
|
|
||||||
var updateStatusTemplate = `
|
var updateStatusTemplate = `
|
||||||
// UpdateStatus was generated because the type contains a Status member.
|
// UpdateStatus was generated because the type contains a Status member.
|
||||||
// Add a +genclientstatus=false comment above the type to avoid generating UpdateStatus().
|
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
|
||||||
|
|
||||||
func (c *$.type|privatePlural$) UpdateStatus($.type|private$ *$.type|raw$) (result *$.type|raw$, err error) {
|
func (c *$.type|privatePlural$) UpdateStatus($.type|private$ *$.type|raw$) (result *$.type|raw$, err error) {
|
||||||
result = &$.type|raw${}
|
result = &$.type|raw${}
|
||||||
|
@ -17,21 +17,9 @@ limitations under the License.
|
|||||||
package generators
|
package generators
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/golang/glog"
|
|
||||||
"k8s.io/gengo/types"
|
"k8s.io/gengo/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// extractBoolTagOrDie gets the comment-tags for the key and asserts that, if
|
|
||||||
// it exists, the value is boolean. If the tag did not exist, it returns
|
|
||||||
// false.
|
|
||||||
func extractBoolTagOrDie(key string, lines []string) bool {
|
|
||||||
val, err := types.ExtractSingleBoolCommentTag("+", key, false, lines)
|
|
||||||
if err != nil {
|
|
||||||
glog.Fatalf(err.Error())
|
|
||||||
}
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
// extractTag gets the comment-tags for the key. If the tag did not exist, it
|
// extractTag gets the comment-tags for the key. If the tag did not exist, it
|
||||||
// returns the empty string.
|
// returns the empty string.
|
||||||
func extractTag(key string, lines []string) string {
|
func extractTag(key string, lines []string) string {
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
licenses(["notice"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
"go_test",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_test(
|
||||||
|
name = "go_default_test",
|
||||||
|
srcs = ["tags_test.go"],
|
||||||
|
library = ":go_default_library",
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["tags.go"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
deps = ["//vendor/k8s.io/gengo/types:go_default_library"],
|
||||||
|
)
|
@ -0,0 +1,163 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2016 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"k8s.io/gengo/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
var supportedTags = []string{
|
||||||
|
"genclient",
|
||||||
|
"genclient:nonNamespaced",
|
||||||
|
"genclient:noVerbs",
|
||||||
|
"genclient:onlyVerbs",
|
||||||
|
"genclient:skipVerbs",
|
||||||
|
"genclient:noStatus",
|
||||||
|
"genclient:readonly",
|
||||||
|
}
|
||||||
|
|
||||||
|
// SupportedVerbs is a list of supported verbs for +onlyVerbs and +skipVerbs.
|
||||||
|
var SupportedVerbs = []string{
|
||||||
|
"create",
|
||||||
|
"update",
|
||||||
|
"updateStatus",
|
||||||
|
"delete",
|
||||||
|
"deleteCollection",
|
||||||
|
"get",
|
||||||
|
"list",
|
||||||
|
"watch",
|
||||||
|
"patch",
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadonlyVerbs represents a list of read-only verbs.
|
||||||
|
var ReadonlyVerbs = []string{
|
||||||
|
"get",
|
||||||
|
"list",
|
||||||
|
"watch",
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tags represents a genclient configuration for a single type.
|
||||||
|
type Tags struct {
|
||||||
|
// +genclient
|
||||||
|
GenerateClient bool
|
||||||
|
// +genclient:nonNamespaced
|
||||||
|
NonNamespaced bool
|
||||||
|
// +genclient:noStatus
|
||||||
|
NoStatus bool
|
||||||
|
// +genclient:noVerbs
|
||||||
|
NoVerbs bool
|
||||||
|
// +genclient:skipVerbs=get,update
|
||||||
|
// +genclient:onlyVerbs=create,delete
|
||||||
|
SkipVerbs []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasVerb returns true if we should include the given verb in final client interface and
|
||||||
|
// generate the function for it.
|
||||||
|
func (t Tags) HasVerb(verb string) bool {
|
||||||
|
if len(t.SkipVerbs) == 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
for _, s := range t.SkipVerbs {
|
||||||
|
if verb == s {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustParseClientGenTags calls ParseClientGenTags but instead of returning error it panics.
|
||||||
|
func MustParseClientGenTags(lines []string) Tags {
|
||||||
|
tags, err := ParseClientGenTags(lines)
|
||||||
|
if err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
}
|
||||||
|
return tags
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseClientGenTags parse the provided genclient tags and validates that no unknown
|
||||||
|
// tags are provided.
|
||||||
|
func ParseClientGenTags(lines []string) (Tags, error) {
|
||||||
|
ret := Tags{}
|
||||||
|
values := types.ExtractCommentTags("+", lines)
|
||||||
|
value := []string{}
|
||||||
|
value, ret.GenerateClient = values["genclient"]
|
||||||
|
// Check the old format and error when used to avoid generating client when //+genclient=false
|
||||||
|
if len(value) > 0 && len(value[0]) > 0 {
|
||||||
|
return ret, fmt.Errorf("+genclient=%s is invalid, use //+genclient if you want to generate client or omit it when you want to disable generation", value)
|
||||||
|
}
|
||||||
|
_, ret.NonNamespaced = values["genclient:nonNamespaced"]
|
||||||
|
// Check the old format and error when used
|
||||||
|
if value := values["nonNamespaced"]; len(value) > 0 && len(value[0]) > 0 {
|
||||||
|
return ret, fmt.Errorf("+nonNamespaced=%s is invalid, use //+genclient:nonNamespaced instead", value[0])
|
||||||
|
}
|
||||||
|
_, ret.NoVerbs = values["genclient:noVerbs"]
|
||||||
|
_, ret.NoStatus = values["genclient:noStatus"]
|
||||||
|
onlyVerbs := []string{}
|
||||||
|
if _, isReadonly := values["genclient:readonly"]; isReadonly {
|
||||||
|
onlyVerbs = ReadonlyVerbs
|
||||||
|
}
|
||||||
|
// Check the old format and error when used
|
||||||
|
if value := values["readonly"]; len(value) > 0 && len(value[0]) > 0 {
|
||||||
|
return ret, fmt.Errorf("+readonly=%s is invalid, use //+genclient:readonly instead", value[0])
|
||||||
|
}
|
||||||
|
if v, exists := values["genclient:skipVerbs"]; exists {
|
||||||
|
ret.SkipVerbs = strings.Split(v[0], ",")
|
||||||
|
}
|
||||||
|
if v, exists := values["genclient:onlyVerbs"]; exists || len(onlyVerbs) > 0 {
|
||||||
|
if len(v) > 0 {
|
||||||
|
onlyVerbs = append(onlyVerbs, strings.Split(v[0], ",")...)
|
||||||
|
}
|
||||||
|
skipVerbs := []string{}
|
||||||
|
for _, m := range SupportedVerbs {
|
||||||
|
skip := true
|
||||||
|
for _, o := range onlyVerbs {
|
||||||
|
if o == m {
|
||||||
|
skip = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Check for conflicts
|
||||||
|
for _, v := range skipVerbs {
|
||||||
|
if v == m {
|
||||||
|
return ret, fmt.Errorf("verb %q used both in genclient:skipVerbs and genclient:onlyVerbs", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if skip {
|
||||||
|
skipVerbs = append(skipVerbs, m)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret.SkipVerbs = skipVerbs
|
||||||
|
}
|
||||||
|
return ret, validateClientGenTags(values)
|
||||||
|
}
|
||||||
|
|
||||||
|
// validateTags validates that only supported genclient tags were provided.
|
||||||
|
func validateClientGenTags(values map[string][]string) error {
|
||||||
|
for _, k := range supportedTags {
|
||||||
|
delete(values, k)
|
||||||
|
}
|
||||||
|
for key := range values {
|
||||||
|
if strings.HasPrefix(key, "genclient") {
|
||||||
|
return errors.New("unknown tag detected: " + key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2016 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestParseTags(t *testing.T) {
|
||||||
|
testCases := map[string]struct {
|
||||||
|
lines []string
|
||||||
|
expectTags Tags
|
||||||
|
expectError bool
|
||||||
|
}{
|
||||||
|
"genclient": {
|
||||||
|
lines: []string{`+genclient`},
|
||||||
|
expectTags: Tags{GenerateClient: true},
|
||||||
|
},
|
||||||
|
"genclient=true": {
|
||||||
|
lines: []string{`+genclient=true`},
|
||||||
|
expectError: true,
|
||||||
|
},
|
||||||
|
"nonNamespaced=true": {
|
||||||
|
lines: []string{`+genclient=true`, `+nonNamespaced=true`},
|
||||||
|
expectError: true,
|
||||||
|
},
|
||||||
|
"readonly=true": {
|
||||||
|
lines: []string{`+genclient=true`, `+readonly=true`},
|
||||||
|
expectError: true,
|
||||||
|
},
|
||||||
|
"genclient:nonNamespaced": {
|
||||||
|
lines: []string{`+genclient`, `+genclient:nonNamespaced`},
|
||||||
|
expectTags: Tags{GenerateClient: true, NonNamespaced: true},
|
||||||
|
},
|
||||||
|
"genclient:noVerbs": {
|
||||||
|
lines: []string{`+genclient`, `+genclient:noVerbs`},
|
||||||
|
expectTags: Tags{GenerateClient: true, NoVerbs: true},
|
||||||
|
},
|
||||||
|
"genclient:noStatus": {
|
||||||
|
lines: []string{`+genclient`, `+genclient:noStatus`},
|
||||||
|
expectTags: Tags{GenerateClient: true, NoStatus: true},
|
||||||
|
},
|
||||||
|
"genclient:onlyVerbs": {
|
||||||
|
lines: []string{`+genclient`, `+genclient:onlyVerbs=create,delete`},
|
||||||
|
expectTags: Tags{GenerateClient: true, SkipVerbs: []string{"update", "updateStatus", "deleteCollection", "get", "list", "watch", "patch"}},
|
||||||
|
},
|
||||||
|
"genclient:readonly": {
|
||||||
|
lines: []string{`+genclient`, `+genclient:readonly`},
|
||||||
|
expectTags: Tags{GenerateClient: true, SkipVerbs: []string{"create", "update", "updateStatus", "delete", "deleteCollection", "patch"}},
|
||||||
|
},
|
||||||
|
"genclient:conflict": {
|
||||||
|
lines: []string{`+genclient`, `+genclient:onlyVerbs=create`, `+genclient:skipVerbs=create`},
|
||||||
|
expectError: true,
|
||||||
|
},
|
||||||
|
"genclient:invalid": {
|
||||||
|
lines: []string{`+genclient`, `+genclient:invalid`},
|
||||||
|
expectError: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for key, c := range testCases {
|
||||||
|
result, err := ParseClientGenTags(c.lines)
|
||||||
|
if err != nil && !c.expectError {
|
||||||
|
t.Fatalf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
if !c.expectError && !reflect.DeepEqual(result, c.expectTags) {
|
||||||
|
t.Errorf("[%s] expected %#v to be %#v", key, result, c.expectTags)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -18,7 +18,7 @@ package testgroup
|
|||||||
|
|
||||||
import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
|
||||||
// +genclient=true
|
// +genclient
|
||||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||||
|
|
||||||
type TestType struct {
|
type TestType struct {
|
||||||
|
@ -18,7 +18,7 @@ package v1
|
|||||||
|
|
||||||
import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
|
||||||
// +genclient=true
|
// +genclient
|
||||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||||
|
|
||||||
type TestType struct {
|
type TestType struct {
|
||||||
|
@ -36,6 +36,44 @@ var testtypesResource = schema.GroupVersionResource{Group: "testgroup.k8s.io", V
|
|||||||
|
|
||||||
var testtypesKind = schema.GroupVersionKind{Group: "testgroup.k8s.io", Version: "", Kind: "TestType"}
|
var testtypesKind = schema.GroupVersionKind{Group: "testgroup.k8s.io", Version: "", Kind: "TestType"}
|
||||||
|
|
||||||
|
func (c *FakeTestTypes) Get(name string, options v1.GetOptions) (result *testgroup.TestType, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewGetAction(testtypesResource, c.ns, name), &testgroup.TestType{})
|
||||||
|
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj.(*testgroup.TestType), err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *FakeTestTypes) List(opts v1.ListOptions) (result *testgroup.TestTypeList, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewListAction(testtypesResource, testtypesKind, c.ns, opts), &testgroup.TestTypeList{})
|
||||||
|
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
label, _, _ := testing.ExtractFromListOptions(opts)
|
||||||
|
if label == nil {
|
||||||
|
label = labels.Everything()
|
||||||
|
}
|
||||||
|
list := &testgroup.TestTypeList{}
|
||||||
|
for _, item := range obj.(*testgroup.TestTypeList).Items {
|
||||||
|
if label.Matches(labels.Set(item.Labels)) {
|
||||||
|
list.Items = append(list.Items, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Watch returns a watch.Interface that watches the requested testTypes.
|
||||||
|
func (c *FakeTestTypes) Watch(opts v1.ListOptions) (watch.Interface, error) {
|
||||||
|
return c.Fake.
|
||||||
|
InvokesWatch(testing.NewWatchAction(testtypesResource, c.ns, opts))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (c *FakeTestTypes) Create(testType *testgroup.TestType) (result *testgroup.TestType, err error) {
|
func (c *FakeTestTypes) Create(testType *testgroup.TestType) (result *testgroup.TestType, err error) {
|
||||||
obj, err := c.Fake.
|
obj, err := c.Fake.
|
||||||
Invokes(testing.NewCreateAction(testtypesResource, c.ns, testType), &testgroup.TestType{})
|
Invokes(testing.NewCreateAction(testtypesResource, c.ns, testType), &testgroup.TestType{})
|
||||||
@ -80,44 +118,6 @@ func (c *FakeTestTypes) DeleteCollection(options *v1.DeleteOptions, listOptions
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *FakeTestTypes) Get(name string, options v1.GetOptions) (result *testgroup.TestType, err error) {
|
|
||||||
obj, err := c.Fake.
|
|
||||||
Invokes(testing.NewGetAction(testtypesResource, c.ns, name), &testgroup.TestType{})
|
|
||||||
|
|
||||||
if obj == nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return obj.(*testgroup.TestType), err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *FakeTestTypes) List(opts v1.ListOptions) (result *testgroup.TestTypeList, err error) {
|
|
||||||
obj, err := c.Fake.
|
|
||||||
Invokes(testing.NewListAction(testtypesResource, testtypesKind, c.ns, opts), &testgroup.TestTypeList{})
|
|
||||||
|
|
||||||
if obj == nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
label, _, _ := testing.ExtractFromListOptions(opts)
|
|
||||||
if label == nil {
|
|
||||||
label = labels.Everything()
|
|
||||||
}
|
|
||||||
list := &testgroup.TestTypeList{}
|
|
||||||
for _, item := range obj.(*testgroup.TestTypeList).Items {
|
|
||||||
if label.Matches(labels.Set(item.Labels)) {
|
|
||||||
list.Items = append(list.Items, item)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return list, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Watch returns a watch.Interface that watches the requested testTypes.
|
|
||||||
func (c *FakeTestTypes) Watch(opts v1.ListOptions) (watch.Interface, error) {
|
|
||||||
return c.Fake.
|
|
||||||
InvokesWatch(testing.NewWatchAction(testtypesResource, c.ns, opts))
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Patch applies the patch and returns the patched testType.
|
// Patch applies the patch and returns the patched testType.
|
||||||
func (c *FakeTestTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *testgroup.TestType, err error) {
|
func (c *FakeTestTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *testgroup.TestType, err error) {
|
||||||
obj, err := c.Fake.
|
obj, err := c.Fake.
|
||||||
|
@ -59,6 +59,41 @@ func newTestTypes(c *TestgroupClient, namespace string) *testTypes {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get takes name of the testType, and returns the corresponding testType object, and an error if there is any.
|
||||||
|
func (c *testTypes) Get(name string, options v1.GetOptions) (result *testgroup.TestType, err error) {
|
||||||
|
result = &testgroup.TestType{}
|
||||||
|
err = c.client.Get().
|
||||||
|
Namespace(c.ns).
|
||||||
|
Resource("testtypes").
|
||||||
|
Name(name).
|
||||||
|
VersionedParams(&options, scheme.ParameterCodec).
|
||||||
|
Do().
|
||||||
|
Into(result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// List takes label and field selectors, and returns the list of TestTypes that match those selectors.
|
||||||
|
func (c *testTypes) List(opts v1.ListOptions) (result *testgroup.TestTypeList, err error) {
|
||||||
|
result = &testgroup.TestTypeList{}
|
||||||
|
err = c.client.Get().
|
||||||
|
Namespace(c.ns).
|
||||||
|
Resource("testtypes").
|
||||||
|
VersionedParams(&opts, scheme.ParameterCodec).
|
||||||
|
Do().
|
||||||
|
Into(result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Watch returns a watch.Interface that watches the requested testTypes.
|
||||||
|
func (c *testTypes) Watch(opts v1.ListOptions) (watch.Interface, error) {
|
||||||
|
opts.Watch = true
|
||||||
|
return c.client.Get().
|
||||||
|
Namespace(c.ns).
|
||||||
|
Resource("testtypes").
|
||||||
|
VersionedParams(&opts, scheme.ParameterCodec).
|
||||||
|
Watch()
|
||||||
|
}
|
||||||
|
|
||||||
// Create takes the representation of a testType and creates it. Returns the server's representation of the testType, and an error, if there is any.
|
// Create takes the representation of a testType and creates it. Returns the server's representation of the testType, and an error, if there is any.
|
||||||
func (c *testTypes) Create(testType *testgroup.TestType) (result *testgroup.TestType, err error) {
|
func (c *testTypes) Create(testType *testgroup.TestType) (result *testgroup.TestType, err error) {
|
||||||
result = &testgroup.TestType{}
|
result = &testgroup.TestType{}
|
||||||
@ -85,7 +120,7 @@ func (c *testTypes) Update(testType *testgroup.TestType) (result *testgroup.Test
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UpdateStatus was generated because the type contains a Status member.
|
// UpdateStatus was generated because the type contains a Status member.
|
||||||
// Add a +genclientstatus=false comment above the type to avoid generating UpdateStatus().
|
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
|
||||||
|
|
||||||
func (c *testTypes) UpdateStatus(testType *testgroup.TestType) (result *testgroup.TestType, err error) {
|
func (c *testTypes) UpdateStatus(testType *testgroup.TestType) (result *testgroup.TestType, err error) {
|
||||||
result = &testgroup.TestType{}
|
result = &testgroup.TestType{}
|
||||||
@ -122,41 +157,6 @@ func (c *testTypes) DeleteCollection(options *v1.DeleteOptions, listOptions v1.L
|
|||||||
Error()
|
Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get takes name of the testType, and returns the corresponding testType object, and an error if there is any.
|
|
||||||
func (c *testTypes) Get(name string, options v1.GetOptions) (result *testgroup.TestType, err error) {
|
|
||||||
result = &testgroup.TestType{}
|
|
||||||
err = c.client.Get().
|
|
||||||
Namespace(c.ns).
|
|
||||||
Resource("testtypes").
|
|
||||||
Name(name).
|
|
||||||
VersionedParams(&options, scheme.ParameterCodec).
|
|
||||||
Do().
|
|
||||||
Into(result)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// List takes label and field selectors, and returns the list of TestTypes that match those selectors.
|
|
||||||
func (c *testTypes) List(opts v1.ListOptions) (result *testgroup.TestTypeList, err error) {
|
|
||||||
result = &testgroup.TestTypeList{}
|
|
||||||
err = c.client.Get().
|
|
||||||
Namespace(c.ns).
|
|
||||||
Resource("testtypes").
|
|
||||||
VersionedParams(&opts, scheme.ParameterCodec).
|
|
||||||
Do().
|
|
||||||
Into(result)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Watch returns a watch.Interface that watches the requested testTypes.
|
|
||||||
func (c *testTypes) Watch(opts v1.ListOptions) (watch.Interface, error) {
|
|
||||||
opts.Watch = true
|
|
||||||
return c.client.Get().
|
|
||||||
Namespace(c.ns).
|
|
||||||
Resource("testtypes").
|
|
||||||
VersionedParams(&opts, scheme.ParameterCodec).
|
|
||||||
Watch()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Patch applies the patch and returns the patched testType.
|
// Patch applies the patch and returns the patched testType.
|
||||||
func (c *testTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *testgroup.TestType, err error) {
|
func (c *testTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *testgroup.TestType, err error) {
|
||||||
result = &testgroup.TestType{}
|
result = &testgroup.TestType{}
|
||||||
|
@ -29,6 +29,7 @@ go_library(
|
|||||||
"//vendor/k8s.io/gengo/generator:go_default_library",
|
"//vendor/k8s.io/gengo/generator:go_default_library",
|
||||||
"//vendor/k8s.io/gengo/namer:go_default_library",
|
"//vendor/k8s.io/gengo/namer:go_default_library",
|
||||||
"//vendor/k8s.io/gengo/types:go_default_library",
|
"//vendor/k8s.io/gengo/types:go_default_library",
|
||||||
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/generators/util:go_default_library",
|
||||||
"//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library",
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -24,6 +24,8 @@ import (
|
|||||||
"k8s.io/gengo/generator"
|
"k8s.io/gengo/generator"
|
||||||
"k8s.io/gengo/namer"
|
"k8s.io/gengo/namer"
|
||||||
"k8s.io/gengo/types"
|
"k8s.io/gengo/types"
|
||||||
|
|
||||||
|
"k8s.io/kube-gen/cmd/client-gen/generators/util"
|
||||||
clientgentypes "k8s.io/kube-gen/cmd/client-gen/types"
|
clientgentypes "k8s.io/kube-gen/cmd/client-gen/types"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
@ -69,6 +71,11 @@ func (g *informerGenerator) GenerateType(c *generator.Context, t *types.Type, w
|
|||||||
clientSetInterface := c.Universe.Type(types.Name{Package: g.clientSetPackage, Name: "Interface"})
|
clientSetInterface := c.Universe.Type(types.Name{Package: g.clientSetPackage, Name: "Interface"})
|
||||||
informerFor := "InformerFor"
|
informerFor := "InformerFor"
|
||||||
|
|
||||||
|
tags, err := util.ParseClientGenTags(t.SecondClosestCommentLines)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
m := map[string]interface{}{
|
m := map[string]interface{}{
|
||||||
"apiScheme": c.Universe.Type(apiScheme),
|
"apiScheme": c.Universe.Type(apiScheme),
|
||||||
"cacheIndexers": c.Universe.Type(cacheIndexers),
|
"cacheIndexers": c.Universe.Type(cacheIndexers),
|
||||||
@ -84,7 +91,7 @@ func (g *informerGenerator) GenerateType(c *generator.Context, t *types.Type, w
|
|||||||
"listOptions": c.Universe.Type(listOptions),
|
"listOptions": c.Universe.Type(listOptions),
|
||||||
"lister": c.Universe.Type(types.Name{Package: listerPackage, Name: t.Name.Name + "Lister"}),
|
"lister": c.Universe.Type(types.Name{Package: listerPackage, Name: t.Name.Name + "Lister"}),
|
||||||
"namespaceAll": c.Universe.Type(metav1NamespaceAll),
|
"namespaceAll": c.Universe.Type(metav1NamespaceAll),
|
||||||
"namespaced": !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines),
|
"namespaced": !tags.NonNamespaced,
|
||||||
"newLister": c.Universe.Function(types.Name{Package: listerPackage, Name: "New" + t.Name.Name + "Lister"}),
|
"newLister": c.Universe.Function(types.Name{Package: listerPackage, Name: "New" + t.Name.Name + "Lister"}),
|
||||||
"runtimeObject": c.Universe.Type(runtimeObject),
|
"runtimeObject": c.Universe.Type(runtimeObject),
|
||||||
"timeDuration": c.Universe.Type(timeDuration),
|
"timeDuration": c.Universe.Type(timeDuration),
|
||||||
|
@ -25,6 +25,8 @@ import (
|
|||||||
"k8s.io/gengo/generator"
|
"k8s.io/gengo/generator"
|
||||||
"k8s.io/gengo/namer"
|
"k8s.io/gengo/namer"
|
||||||
"k8s.io/gengo/types"
|
"k8s.io/gengo/types"
|
||||||
|
|
||||||
|
"k8s.io/kube-gen/cmd/client-gen/generators/util"
|
||||||
clientgentypes "k8s.io/kube-gen/cmd/client-gen/types"
|
clientgentypes "k8s.io/kube-gen/cmd/client-gen/types"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
@ -69,8 +71,7 @@ func generatedBy() string {
|
|||||||
func objectMetaForPackage(p *types.Package) (*types.Type, bool, error) {
|
func objectMetaForPackage(p *types.Package) (*types.Type, bool, error) {
|
||||||
generatingForPackage := false
|
generatingForPackage := false
|
||||||
for _, t := range p.Types {
|
for _, t := range p.Types {
|
||||||
// filter out types which dont have genclient=true.
|
if !util.MustParseClientGenTags(t.SecondClosestCommentLines).GenerateClient {
|
||||||
if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
generatingForPackage = true
|
generatingForPackage = true
|
||||||
@ -170,12 +171,8 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
|
|||||||
|
|
||||||
var typesToGenerate []*types.Type
|
var typesToGenerate []*types.Type
|
||||||
for _, t := range p.Types {
|
for _, t := range p.Types {
|
||||||
// filter out types which dont have genclient=true.
|
tags := util.MustParseClientGenTags(t.SecondClosestCommentLines)
|
||||||
if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false {
|
if !tags.GenerateClient || tags.NoVerbs {
|
||||||
continue
|
|
||||||
}
|
|
||||||
// filter out types which have noMethods
|
|
||||||
if extractBoolTagOrDie("noMethods", t.SecondClosestCommentLines) == true {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,8 +304,7 @@ func groupPackage(basePackage string, groupVersions clientgentypes.GroupVersions
|
|||||||
return generators
|
return generators
|
||||||
},
|
},
|
||||||
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
||||||
// piggy-back on types that are tagged for client-gen
|
return util.MustParseClientGenTags(t.SecondClosestCommentLines).GenerateClient
|
||||||
return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -348,8 +344,7 @@ func versionPackage(basePackage string, gv clientgentypes.GroupVersion, boilerpl
|
|||||||
return generators
|
return generators
|
||||||
},
|
},
|
||||||
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
||||||
// piggy-back on types that are tagged for client-gen
|
return util.MustParseClientGenTags(t.SecondClosestCommentLines).GenerateClient
|
||||||
return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ go_library(
|
|||||||
"//vendor/k8s.io/gengo/generator:go_default_library",
|
"//vendor/k8s.io/gengo/generator:go_default_library",
|
||||||
"//vendor/k8s.io/gengo/namer:go_default_library",
|
"//vendor/k8s.io/gengo/namer:go_default_library",
|
||||||
"//vendor/k8s.io/gengo/types:go_default_library",
|
"//vendor/k8s.io/gengo/types:go_default_library",
|
||||||
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/generators/util:go_default_library",
|
||||||
"//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library",
|
"//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -24,6 +24,8 @@ import (
|
|||||||
|
|
||||||
"k8s.io/gengo/generator"
|
"k8s.io/gengo/generator"
|
||||||
"k8s.io/gengo/types"
|
"k8s.io/gengo/types"
|
||||||
|
|
||||||
|
"k8s.io/kube-gen/cmd/client-gen/generators/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// expansionGenerator produces a file for a expansion interfaces.
|
// expansionGenerator produces a file for a expansion interfaces.
|
||||||
@ -41,10 +43,10 @@ func (g *expansionGenerator) Filter(c *generator.Context, t *types.Type) bool {
|
|||||||
func (g *expansionGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
func (g *expansionGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
||||||
sw := generator.NewSnippetWriter(w, c, "$", "$")
|
sw := generator.NewSnippetWriter(w, c, "$", "$")
|
||||||
for _, t := range g.types {
|
for _, t := range g.types {
|
||||||
|
tags := util.MustParseClientGenTags(t.SecondClosestCommentLines)
|
||||||
if _, err := os.Stat(filepath.Join(g.packagePath, strings.ToLower(t.Name.Name+"_expansion.go"))); os.IsNotExist(err) {
|
if _, err := os.Stat(filepath.Join(g.packagePath, strings.ToLower(t.Name.Name+"_expansion.go"))); os.IsNotExist(err) {
|
||||||
sw.Do(expansionInterfaceTemplate, t)
|
sw.Do(expansionInterfaceTemplate, t)
|
||||||
namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines)
|
if !tags.NonNamespaced {
|
||||||
if namespaced {
|
|
||||||
sw.Do(namespacedExpansionInterfaceTemplate, t)
|
sw.Do(namespacedExpansionInterfaceTemplate, t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,8 @@ import (
|
|||||||
"k8s.io/gengo/generator"
|
"k8s.io/gengo/generator"
|
||||||
"k8s.io/gengo/namer"
|
"k8s.io/gengo/namer"
|
||||||
"k8s.io/gengo/types"
|
"k8s.io/gengo/types"
|
||||||
|
|
||||||
|
"k8s.io/kube-gen/cmd/client-gen/generators/util"
|
||||||
clientgentypes "k8s.io/kube-gen/cmd/client-gen/types"
|
clientgentypes "k8s.io/kube-gen/cmd/client-gen/types"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
@ -115,8 +117,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
|
|||||||
|
|
||||||
var typesToGenerate []*types.Type
|
var typesToGenerate []*types.Type
|
||||||
for _, t := range p.Types {
|
for _, t := range p.Types {
|
||||||
// filter out types which dont have genclient=true.
|
if !util.MustParseClientGenTags(t.SecondClosestCommentLines).GenerateClient {
|
||||||
if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
typesToGenerate = append(typesToGenerate, t)
|
typesToGenerate = append(typesToGenerate, t)
|
||||||
@ -154,8 +155,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
|
|||||||
return generators
|
return generators
|
||||||
},
|
},
|
||||||
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
||||||
// piggy-back on types that are tagged for client-gen
|
return util.MustParseClientGenTags(t.SecondClosestCommentLines).GenerateClient
|
||||||
return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -168,7 +168,7 @@ func objectMetaForPackage(p *types.Package) (*types.Type, bool, error) {
|
|||||||
generatingForPackage := false
|
generatingForPackage := false
|
||||||
for _, t := range p.Types {
|
for _, t := range p.Types {
|
||||||
// filter out types which dont have genclient=true.
|
// filter out types which dont have genclient=true.
|
||||||
if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false {
|
if !util.MustParseClientGenTags(t.SecondClosestCommentLines).GenerateClient {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
generatingForPackage = true
|
generatingForPackage = true
|
||||||
@ -232,27 +232,32 @@ func (g *listerGenerator) GenerateType(c *generator.Context, t *types.Type, w io
|
|||||||
"objectMeta": g.objectMeta,
|
"objectMeta": g.objectMeta,
|
||||||
}
|
}
|
||||||
|
|
||||||
namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines)
|
tags, err := util.ParseClientGenTags(t.SecondClosestCommentLines)
|
||||||
if namespaced {
|
if err != nil {
|
||||||
sw.Do(typeListerInterface, m)
|
return err
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
if tags.NonNamespaced {
|
||||||
sw.Do(typeListerInterface_NonNamespaced, m)
|
sw.Do(typeListerInterface_NonNamespaced, m)
|
||||||
|
} else {
|
||||||
|
sw.Do(typeListerInterface, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
sw.Do(typeListerStruct, m)
|
sw.Do(typeListerStruct, m)
|
||||||
sw.Do(typeListerConstructor, m)
|
sw.Do(typeListerConstructor, m)
|
||||||
sw.Do(typeLister_List, m)
|
sw.Do(typeLister_List, m)
|
||||||
|
|
||||||
if namespaced {
|
if tags.NonNamespaced {
|
||||||
sw.Do(typeLister_NamespaceLister, m)
|
|
||||||
sw.Do(namespaceListerInterface, m)
|
|
||||||
sw.Do(namespaceListerStruct, m)
|
|
||||||
sw.Do(namespaceLister_List, m)
|
|
||||||
sw.Do(namespaceLister_Get, m)
|
|
||||||
} else {
|
|
||||||
sw.Do(typeLister_NonNamespacedGet, m)
|
sw.Do(typeLister_NonNamespacedGet, m)
|
||||||
|
return sw.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sw.Do(typeLister_NamespaceLister, m)
|
||||||
|
sw.Do(namespaceListerInterface, m)
|
||||||
|
sw.Do(namespaceListerStruct, m)
|
||||||
|
sw.Do(namespaceLister_List, m)
|
||||||
|
sw.Do(namespaceLister_Get, m)
|
||||||
|
|
||||||
return sw.Error()
|
return sw.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user