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)),
},
outputPackage: outputPackagePath,
group: gv.Group,
group: normalization.BeforeFirstDot(gv.Group),
typeToMatch: t,
imports: generator.NewImportTracker(),
})
@ -96,7 +96,7 @@ func packageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packag
generators = append(generators, &genGroup{
DefaultGen: generator.DefaultGen{
OptionalName: gv.Group + "_client",
OptionalName: normalization.BeforeFirstDot(gv.Group) + "_client",
},
outputPackage: outputPackagePath,
group: gv.Group,

View File

@ -21,6 +21,7 @@ import (
"strings"
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/types"
"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)),
},
outputPackage: outputPackagePath,
group: gv.Group,
group: normalization.BeforeFirstDot(gv.Group),
typeToMatch: t,
imports: generator.NewImportTracker(),
})
@ -65,7 +66,7 @@ func PackageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packag
},
outputPackage: outputPackagePath,
realClientPath: realClientPath,
group: gv.Group,
group: normalization.BeforeFirstDot(gv.Group),
types: typeList,
imports: generator.NewImportTracker(),
})

View File

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

View File

@ -19,6 +19,7 @@ package generators
import (
"io"
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/generators/normalization"
"k8s.io/kubernetes/cmd/libs/go2idl/generator"
"k8s.io/kubernetes/cmd/libs/go2idl/namer"
"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{}{
"group": g.group,
"Group": namer.IC(g.group),
"group": normalization.BeforeFirstDot(g.group),
"Group": namer.IC(normalization.BeforeFirstDot(g.group)),
"canonicalGroup": canonize(g.group),
"types": g.types,
"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 {
wrapper := map[string]interface{}{
"type": t,
"Group": namer.IC(g.group),
"Group": namer.IC(normalization.BeforeFirstDot(g.group)),
}
namespaced := !(types.ExtractCommentTags("+", t.SecondClosestCommentLines)["nonNamespaced"] == "true")
if namespaced {

View File

@ -16,7 +16,11 @@ limitations under the License.
package normalization
import "k8s.io/kubernetes/pkg/api/unversioned"
import (
"strings"
"k8s.io/kubernetes/pkg/api/unversioned"
)
func Group(group string) string {
if group == "api" {
@ -35,3 +39,7 @@ func Version(version string) string {
func GroupVersion(gv unversioned.GroupVersion) unversioned.GroupVersion {
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 {
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{
GroupVersions: []unversioned.GroupVersion{{Group: "testgroup", Version: ""}},
GroupVersions: []unversioned.GroupVersion{{Group: "testgroup.k8s.io", Version: ""}},
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",
ClientsetOutputPath: "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/",

View File

@ -23,8 +23,8 @@ import (
"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/v1"
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io"
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup.k8s.io/v1"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned"
@ -34,11 +34,11 @@ import (
"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()
const groupName = "testgroup"
const groupName = "testgroup.k8s.io"
// availableVersions lists all known external versions for this group from most preferred to least preferred
var availableVersions = []unversioned.GroupVersion{{Group: groupName, Version: "v1"}}

View File

@ -22,7 +22,7 @@ import (
"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) {
// Add the API to Scheme.

View File

@ -23,7 +23,7 @@ import (
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) {
// Add the API to Scheme.

View File

@ -18,7 +18,7 @@ package test_internalclientset
import (
"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"
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 {
// if testgroup group is not registered, return an error
g, err := registered.Group("testgroup")
g, err := registered.Group("testgroup.k8s.io")
if err != nil {
return err
}

View File

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

View File

@ -17,7 +17,7 @@ limitations under the License.
package unversioned
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"
watch "k8s.io/kubernetes/pkg/watch"
)
@ -30,13 +30,13 @@ type TestTypesGetter interface {
// TestTypeInterface has methods to work with TestType resources.
type TestTypeInterface interface {
Create(*testgroup.TestType) (*testgroup.TestType, error)
Update(*testgroup.TestType) (*testgroup.TestType, error)
UpdateStatus(*testgroup.TestType) (*testgroup.TestType, error)
Create(*testgroup_k8s_io.TestType) (*testgroup_k8s_io.TestType, error)
Update(*testgroup_k8s_io.TestType) (*testgroup_k8s_io.TestType, error)
UpdateStatus(*testgroup_k8s_io.TestType) (*testgroup_k8s_io.TestType, error)
Delete(name string, options *api.DeleteOptions) error
DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error
Get(name string) (*testgroup.TestType, error)
List(opts api.ListOptions) (*testgroup.TestTypeList, error)
Get(name string) (*testgroup_k8s_io.TestType, error)
List(opts api.ListOptions) (*testgroup_k8s_io.TestTypeList, error)
Watch(opts api.ListOptions) (watch.Interface, error)
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.
func (c *testTypes) Create(testType *testgroup.TestType) (result *testgroup.TestType, err error) {
result = &testgroup.TestType{}
func (c *testTypes) Create(testType *testgroup_k8s_io.TestType) (result *testgroup_k8s_io.TestType, err error) {
result = &testgroup_k8s_io.TestType{}
err = c.client.Post().
Namespace(c.ns).
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.
func (c *testTypes) Update(testType *testgroup.TestType) (result *testgroup.TestType, err error) {
result = &testgroup.TestType{}
func (c *testTypes) Update(testType *testgroup_k8s_io.TestType) (result *testgroup_k8s_io.TestType, err error) {
result = &testgroup_k8s_io.TestType{}
err = c.client.Put().
Namespace(c.ns).
Resource("testtypes").
@ -80,8 +80,8 @@ func (c *testTypes) Update(testType *testgroup.TestType) (result *testgroup.Test
return
}
func (c *testTypes) UpdateStatus(testType *testgroup.TestType) (result *testgroup.TestType, err error) {
result = &testgroup.TestType{}
func (c *testTypes) UpdateStatus(testType *testgroup_k8s_io.TestType) (result *testgroup_k8s_io.TestType, err error) {
result = &testgroup_k8s_io.TestType{}
err = c.client.Put().
Namespace(c.ns).
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.
func (c *testTypes) Get(name string) (result *testgroup.TestType, err error) {
result = &testgroup.TestType{}
func (c *testTypes) Get(name string) (result *testgroup_k8s_io.TestType, err error) {
result = &testgroup_k8s_io.TestType{}
err = c.client.Get().
Namespace(c.ns).
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.
func (c *testTypes) List(opts api.ListOptions) (result *testgroup.TestTypeList, err error) {
result = &testgroup.TestTypeList{}
func (c *testTypes) List(opts api.ListOptions) (result *testgroup_k8s_io.TestTypeList, err error) {
result = &testgroup_k8s_io.TestTypeList{}
err = c.client.Get().
Namespace(c.ns).
Resource("testtypes").

View File

@ -19,7 +19,7 @@ package apiserver
import (
"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"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/rest"
@ -29,7 +29,7 @@ import (
etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
// 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 (

View File

@ -24,7 +24,7 @@ import (
"testing"
"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"
"k8s.io/kubernetes/pkg/api/unversioned"
@ -107,7 +107,7 @@ func testAPIGroupList(t *testing.T) {
}
func testAPIGroup(t *testing.T) {
serverURL := serverIP + "/apis/testgroup"
serverURL := serverIP + "/apis/testgroup.k8s.io"
contents, err := readResponse(serverURL)
if err != nil {
t.Fatalf("%v", err)
@ -126,7 +126,7 @@ func testAPIGroup(t *testing.T) {
}
func testAPIResourceList(t *testing.T) {
serverURL := serverIP + "/apis/testgroup/v1"
serverURL := serverIP + "/apis/testgroup.k8s.io/v1"
contents, err := readResponse(serverURL)
if err != nil {
t.Fatalf("%v", err)

View File

@ -17,7 +17,7 @@ limitations under the License.
package rest
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/fields"
"k8s.io/kubernetes/pkg/labels"