8e5b17cf13
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
218 lines
7.8 KiB
Go
218 lines
7.8 KiB
Go
/*
|
|
Copyright 2015 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.
|
|
*/
|
|
|
|
// client-gen makes the individual typed clients using go2idl.
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
"sort"
|
|
"strings"
|
|
|
|
"k8s.io/gengo/args"
|
|
clientgenargs "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/args"
|
|
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/generators"
|
|
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/types"
|
|
|
|
"github.com/golang/glog"
|
|
flag "github.com/spf13/pflag"
|
|
)
|
|
|
|
var (
|
|
test = flag.BoolP("test", "t", false, "set this flag to generate the client code for the testdata")
|
|
inputVersions = flag.StringSlice("input", []string{
|
|
"api/",
|
|
"authentication/",
|
|
"authorization/",
|
|
"autoscaling/",
|
|
"batch/",
|
|
"certificates/",
|
|
"extensions/",
|
|
"rbac/",
|
|
"storage/",
|
|
"apps/",
|
|
"policy/",
|
|
}, "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/,rbac/\"")
|
|
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.")
|
|
clientsetAPIPath = flag.StringP("clientset-api-path", "", "", "the value of default API path.")
|
|
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/\"")
|
|
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) {
|
|
// special case for the core group
|
|
if group == "api" {
|
|
path = filepath.Join(*basePath, "../api", version)
|
|
} else {
|
|
path = filepath.Join(*basePath, gvPath, group, version)
|
|
}
|
|
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:
|
|
// gvtString of the form group/type, e.g. api/Service,extensions/ReplicaSet
|
|
return subs[0] + "/", subs[1], nil
|
|
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)
|
|
switch length {
|
|
case 0, 1, 2:
|
|
return "", pgvString
|
|
default:
|
|
return strings.Join(subs[:length-2], "/"), strings.Join(subs[length-2:], "/")
|
|
}
|
|
}
|
|
|
|
func parseInputVersions() (paths []string, groups []types.GroupVersions, gvToPath map[types.GroupVersion]string, err error) {
|
|
var seenGroups = make(map[types.Group]*types.GroupVersions)
|
|
gvToPath = make(map[types.GroupVersion]string)
|
|
for _, input := range *inputVersions {
|
|
gvPath, gvString := parsePathGroupVersion(input)
|
|
gv, err := types.ToGroupVersion(gvString)
|
|
if err != nil {
|
|
return nil, nil, nil, err
|
|
}
|
|
if group, ok := seenGroups[gv.Group]; ok {
|
|
(*seenGroups[gv.Group]).Versions = append(group.Versions, gv.Version)
|
|
} else {
|
|
seenGroups[gv.Group] = &types.GroupVersions{
|
|
Group: gv.Group,
|
|
Versions: []types.Version{gv.Version},
|
|
}
|
|
}
|
|
|
|
path := versionToPath(gvPath, gv.Group.String(), gv.Version.String())
|
|
paths = append(paths, path)
|
|
gvToPath[gv] = path
|
|
}
|
|
var groupNames []string
|
|
for groupName := range seenGroups {
|
|
groupNames = append(groupNames, groupName.String())
|
|
}
|
|
sort.Strings(groupNames)
|
|
for _, groupName := range groupNames {
|
|
groups = append(groups, *seenGroups[types.Group(groupName)])
|
|
}
|
|
|
|
return paths, groups, gvToPath, nil
|
|
}
|
|
|
|
func parseIncludedTypesOverrides() (map[types.GroupVersion][]string, error) {
|
|
overrides := make(map[types.GroupVersion][]string)
|
|
for _, input := range *includedTypesOverrides {
|
|
gvString, typeStr, err := parseGroupVersionType(input)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
gv, err := types.ToGroupVersion(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()
|
|
arguments.GoHeaderFilePath = filepath.Join(args.DefaultSourceTree(), "k8s.io/kubernetes/hack/boilerplate/boilerplate.go.txt")
|
|
flag.Parse()
|
|
var cmdArgs string
|
|
flag.VisitAll(func(f *flag.Flag) {
|
|
if !f.Changed || f.Name == "verify-only" {
|
|
return
|
|
}
|
|
cmdArgs = cmdArgs + fmt.Sprintf("--%s=%s ", f.Name, f.Value)
|
|
})
|
|
|
|
dependencies := []string{
|
|
"k8s.io/kubernetes/pkg/fields",
|
|
"k8s.io/apimachinery/pkg/labels",
|
|
"k8s.io/apimachinery/pkg/watch",
|
|
"k8s.io/apimachinery/pkg/apimachinery/registered",
|
|
}
|
|
|
|
if *test {
|
|
arguments.InputDirs = append(dependencies, []string{
|
|
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/test_apis/testgroup",
|
|
}...)
|
|
arguments.CustomArgs = clientgenargs.Args{
|
|
Groups: []types.GroupVersions{{Group: "testgroup", Versions: []types.Version{""}}},
|
|
GroupVersionToInputPath: map[types.GroupVersion]string{
|
|
types.GroupVersion{Group: "testgroup", Version: ""}: "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/test_apis/testgroup",
|
|
},
|
|
ClientsetName: "test_internalclientset",
|
|
ClientsetOutputPath: "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/",
|
|
ClientsetOnly: false,
|
|
FakeClient: true,
|
|
CmdArgs: cmdArgs,
|
|
}
|
|
} else {
|
|
inputPath, groups, gvToPath, err := parseInputVersions()
|
|
if err != nil {
|
|
glog.Fatalf("Error: %v", err)
|
|
}
|
|
includedTypesOverrides, err := parseIncludedTypesOverrides()
|
|
if err != nil {
|
|
glog.Fatalf("Unexpected error: %v", err)
|
|
}
|
|
glog.V(3).Infof("going to generate clientset from these input paths: %v", inputPath)
|
|
arguments.InputDirs = append(inputPath, dependencies...)
|
|
|
|
arguments.CustomArgs = clientgenargs.Args{
|
|
Groups: groups,
|
|
GroupVersionToInputPath: gvToPath,
|
|
ClientsetName: *clientsetName,
|
|
ClientsetAPIPath: *clientsetAPIPath,
|
|
ClientsetOutputPath: *clientsetPath,
|
|
ClientsetOnly: *clientsetOnly,
|
|
FakeClient: *fakeClient,
|
|
CmdArgs: cmdArgs,
|
|
IncludedTypesOverrides: includedTypesOverrides,
|
|
}
|
|
|
|
glog.V(3).Infof("==arguments: %v\n", arguments)
|
|
}
|
|
|
|
if err := arguments.Execute(
|
|
generators.NameSystems(),
|
|
generators.DefaultNameSystem(),
|
|
generators.Packages,
|
|
); err != nil {
|
|
glog.Fatalf("Error: %v", err)
|
|
}
|
|
}
|