From 73895c0418f6a16433623b0386aeeebc59496e6c Mon Sep 17 00:00:00 2001 From: nikhiljindal Date: Tue, 10 May 2016 16:30:44 -0700 Subject: [PATCH] Updating client-gen to support a user specified override on the resources to be included in generated client --- cmd/libs/go2idl/client-gen/args/args.go | 4 ++ .../client-gen/generators/client_generator.go | 23 +++++++- cmd/libs/go2idl/client-gen/main.go | 59 ++++++++++++++++--- hack/update-codegen.sh | 4 +- hack/verify-flags/known-flags.txt | 3 +- 5 files changed, 80 insertions(+), 13 deletions(-) diff --git a/cmd/libs/go2idl/client-gen/args/args.go b/cmd/libs/go2idl/client-gen/args/args.go index af27a94cef1..1e7099e49ea 100644 --- a/cmd/libs/go2idl/client-gen/args/args.go +++ b/cmd/libs/go2idl/client-gen/args/args.go @@ -29,6 +29,10 @@ type Args struct { // the respective types.go. We still need GroupVersions in the struct because // we need an order. 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 // populated from command-line arguments. ClientsetName string diff --git a/cmd/libs/go2idl/client-gen/generators/client_generator.go b/cmd/libs/go2idl/client-gen/generators/client_generator.go index 76c8329b6e4..dcefb1d9ede 100644 --- a/cmd/libs/go2idl/client-gen/generators/client_generator.go +++ b/cmd/libs/go2idl/client-gen/generators/client_generator.go @@ -166,15 +166,32 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat if !ok { glog.Fatalf("cannot convert arguments.CustomArgs to clientgenargs.Args") } + includedTypesOverrides := customArgs.IncludedTypesOverrides generatedBy := generatedBy(customArgs) gvToTypes := map[unversioned.GroupVersion][]*types.Type{} for gv, inputDir := range customArgs.GroupVersionToInputPath { p := context.Universe.Package(inputDir) - for _, t := range p.Types { - if types.ExtractCommentTags("+", t.SecondClosestCommentLines)["genclient"] != "true" { - continue + 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" { + continue + } } if _, found := gvToTypes[gv]; !found { gvToTypes[gv] = []*types.Type{} diff --git a/cmd/libs/go2idl/client-gen/main.go b/cmd/libs/go2idl/client-gen/main.go index afff4d01263..e6bce2ba18c 100644 --- a/cmd/libs/go2idl/client-gen/main.go +++ b/cmd/libs/go2idl/client-gen/main.go @@ -33,13 +33,14 @@ import ( ) var ( - 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/\"") - 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.") - clientsetPath = flag.String("clientset-path", "k8s.io/kubernetes/pkg/client/clientset_generated/", "the generated clientset will be output to /. Default to \"k8s.io/kubernetes/pkg/client/clientset_generated/\"") - clientsetOnly = flag.Bool("clientset-only", false, "when set, client-gen only generates the clientset shell, without generating the individual typed clients") - fakeClient = flag.Bool("fake-clientset", true, "when set, client-gen will generate the fake clientset that can be used in tests") + 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/\"") + 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\"") + 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 /. Default to \"k8s.io/kubernetes/pkg/client/clientset_generated/\"") + clientsetOnly = flag.Bool("clientset-only", false, "when set, client-gen only generates the clientset shell, without generating the individual typed clients") + fakeClient = flag.Bool("fake-clientset", true, "when set, client-gen will generate the fake clientset that can be used in tests") ) func versionToPath(gvPath string, group string, version string) (path string) { @@ -52,6 +53,24 @@ func versionToPath(gvPath string, group string, version string) (path string) { 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) { subs := strings.Split(pgvString, "/") length := len(subs) @@ -85,6 +104,27 @@ func parseInputVersions() (paths []string, groupVersions []unversioned.GroupVers 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() { arguments := args.Default() flag.Parse() @@ -124,6 +164,10 @@ func main() { if err != nil { 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) arguments.InputDirs = append(inputPath, dependencies...) @@ -135,6 +179,7 @@ func main() { ClientsetOnly: *clientsetOnly, FakeClient: *fakeClient, CmdArgs: cmdArgs, + IncludedTypesOverrides: includedTypesOverrides, } fmt.Printf("==arguments: %v\n", arguments) diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 7a46a30fcfa..3ab76ed7fbd 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -45,8 +45,8 @@ ${clientgen} "$@" ${clientgen} -t "$@" # 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_release_1_3 --clientset-path=k8s.io/kubernetes/federation/client/clientset_generated --input="../../federation/apis/federation/v1alpha1" "$@" +${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","api/v1" --included-types-overrides="api/v1/Service" "$@" ${conversiongen} "$@" ${deepcopygen} "$@" diff --git a/hack/verify-flags/known-flags.txt b/hack/verify-flags/known-flags.txt index 223ceeadeb6..efdea0c14a7 100644 --- a/hack/verify-flags/known-flags.txt +++ b/hack/verify-flags/known-flags.txt @@ -175,6 +175,7 @@ image-gc-high-threshold image-gc-low-threshold image-pull-policy include-extended-apis +included-types-overrides input-base input-dirs insecure-bind-address @@ -197,8 +198,8 @@ k8s-build-output keep-gogoproto km-path kube-api-burst -kube-api-qps kube-api-content-type +kube-api-qps kube-master kube-master kube-master-url