Merge pull request #24059 from caesarxuchao/client-gen-dotted-group

Automatic merge from submit-queue

Client-gen: handle dotted group name, e.g., "authentication.k8s.io"

The client-gen used to assume the group name doesn't include dot, but it's not true, e.g., we have group `authentication.k8s.io`.

With this PR, Client-gen will use the full group name when creating directory (e.g., the client for the authentication group will be generated at pkg/client/clientset_generated/release_1_3/typed/`authentication.k8s.io`/v1/). However, because golang doesn't allow dot in variable/function names, so when the group name is used as part of variable/function name, client-gen extracts the part before the first dot (e.g., authentication).

This PR also changes the group name of the test group from `testgroup` to `testgroup.k8s.io` to verify if client-gen generates sane code.

cc @deads2k for #20573
This commit is contained in:
k8s-merge-robot 2016-04-14 13:13:32 -07:00
commit 5cc7c9565f
23 changed files with 56 additions and 45 deletions

View File

@ -88,7 +88,7 @@ func packageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packag
OptionalName: strings.ToLower(c.Namers["private"].Name(t)), OptionalName: strings.ToLower(c.Namers["private"].Name(t)),
}, },
outputPackage: outputPackagePath, outputPackage: outputPackagePath,
group: gv.Group, group: normalization.BeforeFirstDot(gv.Group),
typeToMatch: t, typeToMatch: t,
imports: generator.NewImportTracker(), imports: generator.NewImportTracker(),
}) })
@ -96,7 +96,7 @@ func packageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packag
generators = append(generators, &genGroup{ generators = append(generators, &genGroup{
DefaultGen: generator.DefaultGen{ DefaultGen: generator.DefaultGen{
OptionalName: gv.Group + "_client", OptionalName: normalization.BeforeFirstDot(gv.Group) + "_client",
}, },
outputPackage: outputPackagePath, outputPackage: outputPackagePath,
group: gv.Group, group: gv.Group,

View File

@ -21,6 +21,7 @@ import (
"strings" "strings"
clientgenargs "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/args" clientgenargs "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/args"
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/generators/normalization"
"k8s.io/kubernetes/cmd/libs/go2idl/generator" "k8s.io/kubernetes/cmd/libs/go2idl/generator"
"k8s.io/kubernetes/cmd/libs/go2idl/types" "k8s.io/kubernetes/cmd/libs/go2idl/types"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
@ -53,7 +54,7 @@ func PackageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packag
OptionalName: "fake_" + strings.ToLower(c.Namers["private"].Name(t)), OptionalName: "fake_" + strings.ToLower(c.Namers["private"].Name(t)),
}, },
outputPackage: outputPackagePath, outputPackage: outputPackagePath,
group: gv.Group, group: normalization.BeforeFirstDot(gv.Group),
typeToMatch: t, typeToMatch: t,
imports: generator.NewImportTracker(), imports: generator.NewImportTracker(),
}) })
@ -65,7 +66,7 @@ func PackageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packag
}, },
outputPackage: outputPackagePath, outputPackage: outputPackagePath,
realClientPath: realClientPath, realClientPath: realClientPath,
group: gv.Group, group: normalization.BeforeFirstDot(gv.Group),
types: typeList, types: typeList,
imports: generator.NewImportTracker(), imports: generator.NewImportTracker(),
}) })

View File

@ -59,6 +59,7 @@ func (g *genClientset) Imports(c *generator.Context) (imports []string) {
group := normalization.Group(gv.Group) group := normalization.Group(gv.Group)
version := normalization.Version(gv.Version) version := normalization.Version(gv.Version)
typedClientPath := filepath.Join(g.typedClientPath, group, version) typedClientPath := filepath.Join(g.typedClientPath, group, version)
group = normalization.BeforeFirstDot(group)
imports = append(imports, fmt.Sprintf("%s%s \"%s\"", version, group, typedClientPath)) imports = append(imports, fmt.Sprintf("%s%s \"%s\"", version, group, typedClientPath))
imports = append(imports, "github.com/golang/glog") imports = append(imports, "github.com/golang/glog")
} }
@ -79,7 +80,7 @@ func (g *genClientset) GenerateType(c *generator.Context, t *types.Type, w io.Wr
allGroups := []arg{} allGroups := []arg{}
for _, gv := range g.groupVersions { for _, gv := range g.groupVersions {
group := normalization.Group(gv.Group) group := normalization.BeforeFirstDot(normalization.Group(gv.Group))
version := normalization.Version(gv.Version) version := normalization.Version(gv.Version)
allGroups = append(allGroups, arg{namer.IC(group), version + group}) allGroups = append(allGroups, arg{namer.IC(group), version + group})
} }

View File

@ -19,6 +19,7 @@ package generators
import ( import (
"io" "io"
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/generators/normalization"
"k8s.io/kubernetes/cmd/libs/go2idl/generator" "k8s.io/kubernetes/cmd/libs/go2idl/generator"
"k8s.io/kubernetes/cmd/libs/go2idl/namer" "k8s.io/kubernetes/cmd/libs/go2idl/namer"
"k8s.io/kubernetes/cmd/libs/go2idl/types" "k8s.io/kubernetes/cmd/libs/go2idl/types"
@ -71,8 +72,8 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer
} }
m := map[string]interface{}{ m := map[string]interface{}{
"group": g.group, "group": normalization.BeforeFirstDot(g.group),
"Group": namer.IC(g.group), "Group": namer.IC(normalization.BeforeFirstDot(g.group)),
"canonicalGroup": canonize(g.group), "canonicalGroup": canonize(g.group),
"types": g.types, "types": g.types,
"Config": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "Config"}), "Config": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "Config"}),
@ -89,7 +90,7 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer
for _, t := range g.types { for _, t := range g.types {
wrapper := map[string]interface{}{ wrapper := map[string]interface{}{
"type": t, "type": t,
"Group": namer.IC(g.group), "Group": namer.IC(normalization.BeforeFirstDot(g.group)),
} }
namespaced := !(types.ExtractCommentTags("+", t.SecondClosestCommentLines)["nonNamespaced"] == "true") namespaced := !(types.ExtractCommentTags("+", t.SecondClosestCommentLines)["nonNamespaced"] == "true")
if namespaced { if namespaced {

View File

@ -16,7 +16,11 @@ limitations under the License.
package normalization package normalization
import "k8s.io/kubernetes/pkg/api/unversioned" import (
"strings"
"k8s.io/kubernetes/pkg/api/unversioned"
)
func Group(group string) string { func Group(group string) string {
if group == "api" { if group == "api" {
@ -35,3 +39,7 @@ func Version(version string) string {
func GroupVersion(gv unversioned.GroupVersion) unversioned.GroupVersion { func GroupVersion(gv unversioned.GroupVersion) unversioned.GroupVersion {
return unversioned.GroupVersion{Group: Group(gv.Group), Version: Version(gv.Version)} return unversioned.GroupVersion{Group: Group(gv.Group), Version: Version(gv.Version)}
} }
func BeforeFirstDot(dotted string) string {
return strings.Split(dotted, ".")[0]
}

View File

@ -92,12 +92,12 @@ func main() {
if *test { if *test {
arguments.InputDirs = append(dependencies, []string{ arguments.InputDirs = append(dependencies, []string{
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup", "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io",
}...) }...)
arguments.CustomArgs = clientgenargs.Args{ arguments.CustomArgs = clientgenargs.Args{
GroupVersions: []unversioned.GroupVersion{{Group: "testgroup", Version: ""}}, GroupVersions: []unversioned.GroupVersion{{Group: "testgroup.k8s.io", Version: ""}},
GroupVersionToInputPath: map[unversioned.GroupVersion]string{ GroupVersionToInputPath: map[unversioned.GroupVersion]string{
unversioned.GroupVersion{Group: "testgroup", Version: ""}: "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup", unversioned.GroupVersion{Group: "testgroup.k8s.io", Version: ""}: "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io",
}, },
ClientsetName: "test_internalclientset", ClientsetName: "test_internalclientset",
ClientsetOutputPath: "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/", ClientsetOutputPath: "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/",

View File

@ -23,8 +23,8 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup" "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io"
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1" "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io/v1"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
@ -34,11 +34,11 @@ import (
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
) )
const importPrefix = "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup" const importPrefix = "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io"
var accessor = meta.NewAccessor() var accessor = meta.NewAccessor()
const groupName = "testgroup" const groupName = "testgroup.k8s.io"
// availableVersions lists all known external versions for this group from most preferred to least preferred // availableVersions lists all known external versions for this group from most preferred to least preferred
var availableVersions = []unversioned.GroupVersion{{Group: groupName, Version: "v1"}} var availableVersions = []unversioned.GroupVersion{{Group: groupName, Version: "v1"}}

View File

@ -22,7 +22,7 @@ import (
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
) )
var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup", Version: runtime.APIVersionInternal} var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup.k8s.io", Version: runtime.APIVersionInternal}
func AddToScheme(scheme *runtime.Scheme) { func AddToScheme(scheme *runtime.Scheme) {
// Add the API to Scheme. // Add the API to Scheme.

View File

@ -23,7 +23,7 @@ import (
versionedwatch "k8s.io/kubernetes/pkg/watch/versioned" versionedwatch "k8s.io/kubernetes/pkg/watch/versioned"
) )
var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup", Version: "v1"} var SchemeGroupVersion = unversioned.GroupVersion{Group: "testgroup.k8s.io", Version: "v1"}
func AddToScheme(scheme *runtime.Scheme) { func AddToScheme(scheme *runtime.Scheme) {
// Add the API to Scheme. // Add the API to Scheme.

View File

@ -18,7 +18,7 @@ package test_internalclientset
import ( import (
"github.com/golang/glog" "github.com/golang/glog"
unversionedtestgroup "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup/unversioned" unversionedtestgroup "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned"
restclient "k8s.io/kubernetes/pkg/client/restclient" restclient "k8s.io/kubernetes/pkg/client/restclient"
discovery "k8s.io/kubernetes/pkg/client/typed/discovery" discovery "k8s.io/kubernetes/pkg/client/typed/discovery"
) )

View File

@ -65,7 +65,7 @@ func New(c *restclient.RESTClient) *TestgroupClient {
func setConfigDefaults(config *restclient.Config) error { func setConfigDefaults(config *restclient.Config) error {
// if testgroup group is not registered, return an error // if testgroup group is not registered, return an error
g, err := registered.Group("testgroup") g, err := registered.Group("testgroup.k8s.io")
if err != nil { if err != nil {
return err return err
} }

View File

@ -21,9 +21,9 @@ import (
"net/url" "net/url"
"testing" "testing"
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup" testgroup "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io"
_ "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install" _ "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io/install"
. "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup/unversioned" . "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"

View File

@ -17,7 +17,7 @@ limitations under the License.
package unversioned package unversioned
import ( import (
testgroup "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup" testgroup_k8s_io "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io"
api "k8s.io/kubernetes/pkg/api" api "k8s.io/kubernetes/pkg/api"
watch "k8s.io/kubernetes/pkg/watch" watch "k8s.io/kubernetes/pkg/watch"
) )
@ -30,13 +30,13 @@ type TestTypesGetter interface {
// TestTypeInterface has methods to work with TestType resources. // TestTypeInterface has methods to work with TestType resources.
type TestTypeInterface interface { type TestTypeInterface interface {
Create(*testgroup.TestType) (*testgroup.TestType, error) Create(*testgroup_k8s_io.TestType) (*testgroup_k8s_io.TestType, error)
Update(*testgroup.TestType) (*testgroup.TestType, error) Update(*testgroup_k8s_io.TestType) (*testgroup_k8s_io.TestType, error)
UpdateStatus(*testgroup.TestType) (*testgroup.TestType, error) UpdateStatus(*testgroup_k8s_io.TestType) (*testgroup_k8s_io.TestType, error)
Delete(name string, options *api.DeleteOptions) error Delete(name string, options *api.DeleteOptions) error
DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error
Get(name string) (*testgroup.TestType, error) Get(name string) (*testgroup_k8s_io.TestType, error)
List(opts api.ListOptions) (*testgroup.TestTypeList, error) List(opts api.ListOptions) (*testgroup_k8s_io.TestTypeList, error)
Watch(opts api.ListOptions) (watch.Interface, error) Watch(opts api.ListOptions) (watch.Interface, error)
TestTypeExpansion TestTypeExpansion
} }
@ -56,8 +56,8 @@ func newTestTypes(c *TestgroupClient, namespace string) *testTypes {
} }
// 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_k8s_io.TestType) (result *testgroup_k8s_io.TestType, err error) {
result = &testgroup.TestType{} result = &testgroup_k8s_io.TestType{}
err = c.client.Post(). err = c.client.Post().
Namespace(c.ns). Namespace(c.ns).
Resource("testtypes"). Resource("testtypes").
@ -68,8 +68,8 @@ func (c *testTypes) Create(testType *testgroup.TestType) (result *testgroup.Test
} }
// Update takes the representation of a testType and updates it. Returns the server's representation of the testType, and an error, if there is any. // Update takes the representation of a testType and updates it. Returns the server's representation of the testType, and an error, if there is any.
func (c *testTypes) Update(testType *testgroup.TestType) (result *testgroup.TestType, err error) { func (c *testTypes) Update(testType *testgroup_k8s_io.TestType) (result *testgroup_k8s_io.TestType, err error) {
result = &testgroup.TestType{} result = &testgroup_k8s_io.TestType{}
err = c.client.Put(). err = c.client.Put().
Namespace(c.ns). Namespace(c.ns).
Resource("testtypes"). Resource("testtypes").
@ -80,8 +80,8 @@ func (c *testTypes) Update(testType *testgroup.TestType) (result *testgroup.Test
return return
} }
func (c *testTypes) UpdateStatus(testType *testgroup.TestType) (result *testgroup.TestType, err error) { func (c *testTypes) UpdateStatus(testType *testgroup_k8s_io.TestType) (result *testgroup_k8s_io.TestType, err error) {
result = &testgroup.TestType{} result = &testgroup_k8s_io.TestType{}
err = c.client.Put(). err = c.client.Put().
Namespace(c.ns). Namespace(c.ns).
Resource("testtypes"). Resource("testtypes").
@ -116,8 +116,8 @@ func (c *testTypes) DeleteCollection(options *api.DeleteOptions, listOptions api
} }
// Get takes name of the testType, and returns the corresponding testType object, and an error if there is any. // 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) (result *testgroup.TestType, err error) { func (c *testTypes) Get(name string) (result *testgroup_k8s_io.TestType, err error) {
result = &testgroup.TestType{} result = &testgroup_k8s_io.TestType{}
err = c.client.Get(). err = c.client.Get().
Namespace(c.ns). Namespace(c.ns).
Resource("testtypes"). Resource("testtypes").
@ -128,8 +128,8 @@ func (c *testTypes) Get(name string) (result *testgroup.TestType, err error) {
} }
// List takes label and field selectors, and returns the list of TestTypes that match those selectors. // List takes label and field selectors, and returns the list of TestTypes that match those selectors.
func (c *testTypes) List(opts api.ListOptions) (result *testgroup.TestTypeList, err error) { func (c *testTypes) List(opts api.ListOptions) (result *testgroup_k8s_io.TestTypeList, err error) {
result = &testgroup.TestTypeList{} result = &testgroup_k8s_io.TestTypeList{}
err = c.client.Get(). err = c.client.Get().
Namespace(c.ns). Namespace(c.ns).
Resource("testtypes"). Resource("testtypes").

View File

@ -19,7 +19,7 @@ package apiserver
import ( import (
"fmt" "fmt"
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1" "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io/v1"
testgroupetcd "k8s.io/kubernetes/examples/apiserver/rest" testgroupetcd "k8s.io/kubernetes/examples/apiserver/rest"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
@ -29,7 +29,7 @@ import (
etcdstorage "k8s.io/kubernetes/pkg/storage/etcd" etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
// Install the testgroup API // Install the testgroup API
_ "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install" _ "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io/install"
) )
const ( const (

View File

@ -24,7 +24,7 @@ import (
"testing" "testing"
"time" "time"
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1" "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io/v1"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
@ -107,7 +107,7 @@ func testAPIGroupList(t *testing.T) {
} }
func testAPIGroup(t *testing.T) { func testAPIGroup(t *testing.T) {
serverURL := serverIP + "/apis/testgroup" serverURL := serverIP + "/apis/testgroup.k8s.io"
contents, err := readResponse(serverURL) contents, err := readResponse(serverURL)
if err != nil { if err != nil {
t.Fatalf("%v", err) t.Fatalf("%v", err)
@ -126,7 +126,7 @@ func testAPIGroup(t *testing.T) {
} }
func testAPIResourceList(t *testing.T) { func testAPIResourceList(t *testing.T) {
serverURL := serverIP + "/apis/testgroup/v1" serverURL := serverIP + "/apis/testgroup.k8s.io/v1"
contents, err := readResponse(serverURL) contents, err := readResponse(serverURL)
if err != nil { if err != nil {
t.Fatalf("%v", err) t.Fatalf("%v", err)

View File

@ -17,7 +17,7 @@ limitations under the License.
package rest package rest
import ( import (
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup" "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"