Updating client-gen to support a user specified override on the resources to be included in generated client

This commit is contained in:
nikhiljindal 2016-05-10 16:30:44 -07:00
parent 1616239b4a
commit 73895c0418
5 changed files with 80 additions and 13 deletions

View File

@ -29,6 +29,10 @@ type Args struct {
// the respective types.go. We still need GroupVersions in the struct because // the respective types.go. We still need GroupVersions in the struct because
// we need an order. // we need an order.
GroupVersionToInputPath map[unversioned.GroupVersion]string GroupVersionToInputPath map[unversioned.GroupVersion]string
// Overrides for which types should be included in the client.
IncludedTypesOverrides map[unversioned.GroupVersion][]string
// ClientsetName is the name of the clientset to be generated. It's // ClientsetName is the name of the clientset to be generated. It's
// populated from command-line arguments. // populated from command-line arguments.
ClientsetName string ClientsetName string

View File

@ -166,16 +166,33 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
if !ok { if !ok {
glog.Fatalf("cannot convert arguments.CustomArgs to clientgenargs.Args") glog.Fatalf("cannot convert arguments.CustomArgs to clientgenargs.Args")
} }
includedTypesOverrides := customArgs.IncludedTypesOverrides
generatedBy := generatedBy(customArgs) generatedBy := generatedBy(customArgs)
gvToTypes := map[unversioned.GroupVersion][]*types.Type{} gvToTypes := map[unversioned.GroupVersion][]*types.Type{}
for gv, inputDir := range customArgs.GroupVersionToInputPath { for gv, inputDir := range customArgs.GroupVersionToInputPath {
p := context.Universe.Package(inputDir) p := context.Universe.Package(inputDir)
for _, t := range p.Types { for n, t := range p.Types {
// filter out types which are not included in user specified overrides.
typesOverride, ok := includedTypesOverrides[gv]
if ok {
found := false
for _, typeStr := range typesOverride {
if typeStr == n {
found = true
}
}
if !found {
continue
}
} else {
// User has not specified any override for this group version.
// filter out types which dont have genclient=true.
if types.ExtractCommentTags("+", t.SecondClosestCommentLines)["genclient"] != "true" { if types.ExtractCommentTags("+", t.SecondClosestCommentLines)["genclient"] != "true" {
continue continue
} }
}
if _, found := gvToTypes[gv]; !found { if _, found := gvToTypes[gv]; !found {
gvToTypes[gv] = []*types.Type{} gvToTypes[gv] = []*types.Type{}
} }

View File

@ -35,6 +35,7 @@ import (
var ( var (
test = flag.BoolP("test", "t", false, "set this flag to generate the client code for the testdata") test = flag.BoolP("test", "t", false, "set this flag to generate the client code for the testdata")
inputVersions = flag.StringSlice("input", []string{"api/", "extensions/", "autoscaling/", "batch/"}, "group/versions that client-gen will generate clients for. At most one version per group is allowed. Specified in the format \"group1/version1,group2/version2...\". Default to \"api/,extensions/,autoscaling/,batch/\"") inputVersions = flag.StringSlice("input", []string{"api/", "extensions/", "autoscaling/", "batch/"}, "group/versions that client-gen will generate clients for. At most one version per group is allowed. Specified in the format \"group1/version1,group2/version2...\". Default to \"api/,extensions/,autoscaling/,batch/\"")
includedTypesOverrides = flag.StringSlice("included-types-overrides", []string{}, "list of group/version/type for which client should be generated. By default, client is generated for all types which have genclient=true in types.go. This overrides that. For each groupVersion in this list, only the types mentioned here will be included. The default check of genclient=true will be used for other group versions.")
basePath = flag.String("input-base", "k8s.io/kubernetes/pkg/apis", "base path to look for the api group. Default to \"k8s.io/kubernetes/pkg/apis\"") basePath = flag.String("input-base", "k8s.io/kubernetes/pkg/apis", "base path to look for the api group. Default to \"k8s.io/kubernetes/pkg/apis\"")
clientsetName = flag.StringP("clientset-name", "n", "internalclientset", "the name of the generated clientset package.") clientsetName = flag.StringP("clientset-name", "n", "internalclientset", "the name of the generated clientset package.")
clientsetPath = flag.String("clientset-path", "k8s.io/kubernetes/pkg/client/clientset_generated/", "the generated clientset will be output to <clientset-path>/<clientset-name>. Default to \"k8s.io/kubernetes/pkg/client/clientset_generated/\"") clientsetPath = flag.String("clientset-path", "k8s.io/kubernetes/pkg/client/clientset_generated/", "the generated clientset will be output to <clientset-path>/<clientset-name>. Default to \"k8s.io/kubernetes/pkg/client/clientset_generated/\"")
@ -52,6 +53,24 @@ func versionToPath(gvPath string, group string, version string) (path string) {
return return
} }
func parseGroupVersionType(gvtString string) (gvString string, typeStr string, err error) {
invalidFormatErr := fmt.Errorf("invalid value: %s, should be of the form group/version/type", gvtString)
subs := strings.Split(gvtString, "/")
length := len(subs)
switch length {
case 2:
// handle legacy api group version.
if subs[0] == "api" {
return "api/", subs[1], nil
}
return "", "", invalidFormatErr
case 3:
return strings.Join(subs[:length-1], "/"), subs[length-1], nil
default:
return "", "", invalidFormatErr
}
}
func parsePathGroupVersion(pgvString string) (gvPath string, gvString string) { func parsePathGroupVersion(pgvString string) (gvPath string, gvString string) {
subs := strings.Split(pgvString, "/") subs := strings.Split(pgvString, "/")
length := len(subs) length := len(subs)
@ -85,6 +104,27 @@ func parseInputVersions() (paths []string, groupVersions []unversioned.GroupVers
return paths, groupVersions, gvToPath, nil return paths, groupVersions, gvToPath, nil
} }
func parseIncludedTypesOverrides() (map[unversioned.GroupVersion][]string, error) {
overrides := make(map[unversioned.GroupVersion][]string)
for _, input := range *includedTypesOverrides {
gvString, typeStr, err := parseGroupVersionType(input)
if err != nil {
return nil, err
}
gv, err := unversioned.ParseGroupVersion(gvString)
if err != nil {
return nil, err
}
types, ok := overrides[gv]
if !ok {
types = []string{}
}
types = append(types, typeStr)
overrides[gv] = types
}
return overrides, nil
}
func main() { func main() {
arguments := args.Default() arguments := args.Default()
flag.Parse() flag.Parse()
@ -124,6 +164,10 @@ func main() {
if err != nil { if err != nil {
glog.Fatalf("Error: %v", err) glog.Fatalf("Error: %v", err)
} }
includedTypesOverrides, err := parseIncludedTypesOverrides()
if err != nil {
glog.Fatalf("Unexpected error: %v", err)
}
glog.Infof("going to generate clientset from these input paths: %v", inputPath) glog.Infof("going to generate clientset from these input paths: %v", inputPath)
arguments.InputDirs = append(inputPath, dependencies...) arguments.InputDirs = append(inputPath, dependencies...)
@ -135,6 +179,7 @@ func main() {
ClientsetOnly: *clientsetOnly, ClientsetOnly: *clientsetOnly,
FakeClient: *fakeClient, FakeClient: *fakeClient,
CmdArgs: cmdArgs, CmdArgs: cmdArgs,
IncludedTypesOverrides: includedTypesOverrides,
} }
fmt.Printf("==arguments: %v\n", arguments) fmt.Printf("==arguments: %v\n", arguments)

View File

@ -45,8 +45,8 @@ ${clientgen} "$@"
${clientgen} -t "$@" ${clientgen} -t "$@"
# Clientgen for federation clientset. # Clientgen for federation clientset.
${clientgen} --clientset-name=federation_internalclientset --clientset-path=k8s.io/kubernetes/federation/client/clientset_generated --input="../../federation/apis/federation/" "$@" ${clientgen} --clientset-name=federation_internalclientset --clientset-path=k8s.io/kubernetes/federation/client/clientset_generated --input="../../federation/apis/federation/","api/" --included-types-overrides="api/Service" "$@"
${clientgen} --clientset-name=federation_release_1_3 --clientset-path=k8s.io/kubernetes/federation/client/clientset_generated --input="../../federation/apis/federation/v1alpha1" "$@" ${clientgen} --clientset-name=federation_release_1_3 --clientset-path=k8s.io/kubernetes/federation/client/clientset_generated --input="../../federation/apis/federation/v1alpha1","api/v1" --included-types-overrides="api/v1/Service" "$@"
${conversiongen} "$@" ${conversiongen} "$@"
${deepcopygen} "$@" ${deepcopygen} "$@"

View File

@ -175,6 +175,7 @@ image-gc-high-threshold
image-gc-low-threshold image-gc-low-threshold
image-pull-policy image-pull-policy
include-extended-apis include-extended-apis
included-types-overrides
input-base input-base
input-dirs input-dirs
insecure-bind-address insecure-bind-address
@ -197,8 +198,8 @@ k8s-build-output
keep-gogoproto keep-gogoproto
km-path km-path
kube-api-burst kube-api-burst
kube-api-qps
kube-api-content-type kube-api-content-type
kube-api-qps
kube-master kube-master
kube-master kube-master
kube-master-url kube-master-url