Merge pull request #17227 from deads2k/gv-apigv

Auto commit by PR queue bot
pull/6/head
k8s-merge-robot 2015-11-17 01:53:17 -08:00
commit 5e20dcfd6f
8 changed files with 402 additions and 228 deletions

View File

@ -56,6 +56,15 @@ func ParseGroupVersion(gv string) (GroupVersion, error) {
} }
} }
func ParseGroupVersionOrDie(gv string) GroupVersion {
ret, err := ParseGroupVersion(gv)
if err != nil {
panic(err)
}
return ret
}
// MarshalJSON implements the json.Marshaller interface. // MarshalJSON implements the json.Marshaller interface.
func (gv GroupVersion) MarshalJSON() ([]byte, error) { func (gv GroupVersion) MarshalJSON() ([]byte, error) {
s := gv.String() s := gv.String()

View File

@ -95,7 +95,7 @@ func (a *APIInstaller) NewWebService() *restful.WebService {
// TODO: change to restful.MIME_JSON when we set content type in client // TODO: change to restful.MIME_JSON when we set content type in client
ws.Consumes("*/*") ws.Consumes("*/*")
ws.Produces(restful.MIME_JSON) ws.Produces(restful.MIME_JSON)
ws.ApiVersion(a.group.Version) ws.ApiVersion(a.group.GroupVersion.String())
return ws return ws
} }
@ -104,9 +104,9 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
admit := a.group.Admit admit := a.group.Admit
context := a.group.Context context := a.group.Context
serverVersion := a.group.ServerVersion serverGroupVersion := a.group.GroupVersion
if len(serverVersion) == 0 { if a.group.ServerGroupVersion != nil {
serverVersion = a.group.Version serverGroupVersion = *a.group.ServerGroupVersion
} }
var resource, subresource string var resource, subresource string
@ -126,13 +126,13 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
if err != nil { if err != nil {
return nil, err return nil, err
} }
versionedPtr, err := a.group.Creater.New(a.group.Version, kind) versionedPtr, err := a.group.Creater.New(a.group.GroupVersion.String(), kind)
if err != nil { if err != nil {
return nil, err return nil, err
} }
versionedObject := indirectArbitraryPointer(versionedPtr) versionedObject := indirectArbitraryPointer(versionedPtr)
mapping, err := a.group.Mapper.RESTMapping(kind, a.group.Version) mapping, err := a.group.Mapper.RESTMapping(kind, a.group.GroupVersion.String())
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -148,7 +148,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
if err != nil { if err != nil {
return nil, err return nil, err
} }
parentMapping, err := a.group.Mapper.RESTMapping(parentKind, a.group.Version) parentMapping, err := a.group.Mapper.RESTMapping(parentKind, a.group.GroupVersion.String())
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -181,14 +181,14 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
if isLister { if isLister {
list := lister.NewList() list := lister.NewList()
_, listKind, err := a.group.Typer.ObjectVersionAndKind(list) _, listKind, err := a.group.Typer.ObjectVersionAndKind(list)
versionedListPtr, err := a.group.Creater.New(a.group.Version, listKind) versionedListPtr, err := a.group.Creater.New(a.group.GroupVersion.String(), listKind)
if err != nil { if err != nil {
return nil, err return nil, err
} }
versionedList = indirectArbitraryPointer(versionedListPtr) versionedList = indirectArbitraryPointer(versionedListPtr)
} }
versionedListOptions, err := a.group.Creater.New(serverVersion, "ListOptions") versionedListOptions, err := a.group.Creater.New(serverGroupVersion.String(), "ListOptions")
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -196,7 +196,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
var versionedDeleterObject interface{} var versionedDeleterObject interface{}
switch { switch {
case isGracefulDeleter: case isGracefulDeleter:
objectPtr, err := a.group.Creater.New(serverVersion, "DeleteOptions") objectPtr, err := a.group.Creater.New(serverGroupVersion.String(), "DeleteOptions")
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -206,7 +206,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
gracefulDeleter = rest.GracefulDeleteAdapter{Deleter: deleter} gracefulDeleter = rest.GracefulDeleteAdapter{Deleter: deleter}
} }
versionedStatusPtr, err := a.group.Creater.New(serverVersion, "Status") versionedStatusPtr, err := a.group.Creater.New(serverGroupVersion.String(), "Status")
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -224,7 +224,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
if err != nil { if err != nil {
return nil, err return nil, err
} }
versionedGetOptions, err = a.group.Creater.New(serverVersion, getOptionsKind) versionedGetOptions, err = a.group.Creater.New(serverGroupVersion.String(), getOptionsKind)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -245,7 +245,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
if err != nil { if err != nil {
return nil, err return nil, err
} }
versionedConnectOptions, err = a.group.Creater.New(serverVersion, connectOptionsKind) versionedConnectOptions, err = a.group.Creater.New(serverGroupVersion.String(), connectOptionsKind)
} }
} }
@ -379,8 +379,8 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
Creater: a.group.Creater, Creater: a.group.Creater,
Convertor: a.group.Convertor, Convertor: a.group.Convertor,
Codec: mapping.Codec, Codec: mapping.Codec,
APIVersion: a.group.Version, APIVersion: a.group.GroupVersion.String(),
ServerAPIVersion: serverVersion, ServerAPIVersion: serverGroupVersion.String(),
Resource: resource, Resource: resource,
Subresource: subresource, Subresource: subresource,
Kind: kind, Kind: kind,

View File

@ -79,9 +79,8 @@ type Mux interface {
type APIGroupVersion struct { type APIGroupVersion struct {
Storage map[string]rest.Storage Storage map[string]rest.Storage
Root string Root string
// TODO: caesarxuchao: Version actually contains "group/version", refactor it to avoid confusion. GroupVersion unversioned.GroupVersion
Version string
// RequestInfoResolver is used to parse URLs for the legacy proxy handler. Don't use this for anything else // RequestInfoResolver is used to parse URLs for the legacy proxy handler. Don't use this for anything else
// TODO: refactor proxy handler to use sub resources // TODO: refactor proxy handler to use sub resources
@ -91,9 +90,8 @@ type APIGroupVersion struct {
// schema like api.Status, api.DeleteOptions, and api.ListOptions. Other implementors may // schema like api.Status, api.DeleteOptions, and api.ListOptions. Other implementors may
// define a version "v1beta1" but want to use the Kubernetes "v1" internal objects. If // define a version "v1beta1" but want to use the Kubernetes "v1" internal objects. If
// empty, defaults to Version. // empty, defaults to Version.
// TODO: caesarxuchao: ServerVersion actually contains "group/version", // TODO this seems suspicious. Is this actually just "unversioned" now?
// refactor it to avoid confusion. ServerGroupVersion *unversioned.GroupVersion
ServerVersion string
Mapper meta.RESTMapper Mapper meta.RESTMapper
@ -126,8 +124,7 @@ func (g *APIGroupVersion) InstallREST(container *restful.Container) error {
installer := g.newInstaller() installer := g.newInstaller()
ws := installer.NewWebService() ws := installer.NewWebService()
apiResources, registrationErrors := installer.Install(ws) apiResources, registrationErrors := installer.Install(ws)
// TODO: g.Version only contains "version" now, it will contain "group/version" in the near future. AddSupportedResourcesWebService(ws, g.GroupVersion, apiResources)
AddSupportedResourcesWebService(ws, g.Version, apiResources)
container.Add(ws) container.Add(ws)
return utilerrors.NewAggregate(registrationErrors) return utilerrors.NewAggregate(registrationErrors)
} }
@ -151,14 +148,13 @@ func (g *APIGroupVersion) UpdateREST(container *restful.Container) error {
return apierrors.NewInternalError(fmt.Errorf("unable to find an existing webservice for prefix %s", installer.prefix)) return apierrors.NewInternalError(fmt.Errorf("unable to find an existing webservice for prefix %s", installer.prefix))
} }
apiResources, registrationErrors := installer.Install(ws) apiResources, registrationErrors := installer.Install(ws)
// TODO: g.Version only contains "version" now, it will contain "group/version" in the near future. AddSupportedResourcesWebService(ws, g.GroupVersion, apiResources)
AddSupportedResourcesWebService(ws, g.Version, apiResources)
return utilerrors.NewAggregate(registrationErrors) return utilerrors.NewAggregate(registrationErrors)
} }
// newInstaller is a helper to create the installer. Used by InstallREST and UpdateREST. // newInstaller is a helper to create the installer. Used by InstallREST and UpdateREST.
func (g *APIGroupVersion) newInstaller() *APIInstaller { func (g *APIGroupVersion) newInstaller() *APIInstaller {
prefix := path.Join(g.Root, g.Version) prefix := path.Join(g.Root, g.GroupVersion.Group, g.GroupVersion.Version)
installer := &APIInstaller{ installer := &APIInstaller{
group: g, group: g,
info: g.RequestInfoResolver, info: g.RequestInfoResolver,
@ -287,7 +283,7 @@ func AddGroupWebService(container *restful.Container, path string, group unversi
// Adds a service to return the supported resources, E.g., a such web service // Adds a service to return the supported resources, E.g., a such web service
// will be registered at /apis/extensions/v1. // will be registered at /apis/extensions/v1.
func AddSupportedResourcesWebService(ws *restful.WebService, groupVersion string, apiResources []unversioned.APIResource) { func AddSupportedResourcesWebService(ws *restful.WebService, groupVersion unversioned.GroupVersion, apiResources []unversioned.APIResource) {
resourceHandler := SupportedResourcesHandler(groupVersion, apiResources) resourceHandler := SupportedResourcesHandler(groupVersion, apiResources)
ws.Route(ws.GET("/").To(resourceHandler). ws.Route(ws.GET("/").To(resourceHandler).
Doc("get available resources"). Doc("get available resources").
@ -328,10 +324,10 @@ func GroupHandler(group unversioned.APIGroup) restful.RouteFunction {
} }
// SupportedResourcesHandler returns a handler which will list the provided resources as available. // SupportedResourcesHandler returns a handler which will list the provided resources as available.
func SupportedResourcesHandler(groupVersion string, apiResources []unversioned.APIResource) restful.RouteFunction { func SupportedResourcesHandler(groupVersion unversioned.GroupVersion, apiResources []unversioned.APIResource) restful.RouteFunction {
return func(req *restful.Request, resp *restful.Response) { return func(req *restful.Request, resp *restful.Response) {
// TODO: use restful's Response methods // TODO: use restful's Response methods
writeJSON(http.StatusOK, api.Codec, &unversioned.APIResourceList{GroupVersion: groupVersion, APIResources: apiResources}, resp.ResponseWriter, true) writeJSON(http.StatusOK, api.Codec, &unversioned.APIResourceList{GroupVersion: groupVersion.String(), APIResources: apiResources}, resp.ResponseWriter, true)
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -95,7 +95,7 @@ func TestProxy(t *testing.T) {
server *httptest.Server server *httptest.Server
proxyTestPattern string proxyTestPattern string
}{ }{
{namespaceServer, "/api/version2/proxy/namespaces/" + item.reqNamespace + "/foo/id" + item.path}, {namespaceServer, "/" + prefix + "/" + newGroupVersion.Group + "/" + newGroupVersion.Version + "/proxy/namespaces/" + item.reqNamespace + "/foo/id" + item.path},
} }
for _, serverPattern := range serverPatterns { for _, serverPattern := range serverPatterns {
@ -212,7 +212,7 @@ func TestProxyUpgrade(t *testing.T) {
server := httptest.NewServer(namespaceHandler) server := httptest.NewServer(namespaceHandler)
defer server.Close() defer server.Close()
ws, err := websocket.Dial("ws://"+server.Listener.Addr().String()+"/api/version2/proxy/namespaces/myns/foo/123", "", "http://127.0.0.1/") ws, err := websocket.Dial("ws://"+server.Listener.Addr().String()+"/"+prefix+"/"+newGroupVersion.Group+"/"+newGroupVersion.Version+"/proxy/namespaces/myns/foo/123", "", "http://127.0.0.1/")
if err != nil { if err != nil {
t.Errorf("%s: websocket dial err: %s", k, err) t.Errorf("%s: websocket dial err: %s", k, err)
continue continue
@ -276,7 +276,7 @@ func TestRedirectOnMissingTrailingSlash(t *testing.T) {
server := httptest.NewServer(handler) server := httptest.NewServer(handler)
defer server.Close() defer server.Close()
proxyTestPattern := "/api/version2/proxy/namespaces/ns/foo/id" + item.path proxyTestPattern := "/" + prefix + "/" + newGroupVersion.Group + "/" + newGroupVersion.Version + "/proxy/namespaces/ns/foo/id" + item.path
req, err := http.NewRequest( req, err := http.NewRequest(
"GET", "GET",
server.URL+proxyTestPattern+"?"+item.query, server.URL+proxyTestPattern+"?"+item.query,

View File

@ -62,7 +62,7 @@ func TestWatchWebsocket(t *testing.T) {
dest, _ := url.Parse(server.URL) dest, _ := url.Parse(server.URL)
dest.Scheme = "ws" // Required by websocket, though the server never sees it. dest.Scheme = "ws" // Required by websocket, though the server never sees it.
dest.Path = "/api/version/watch/simples" dest.Path = "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/watch/simples"
dest.RawQuery = "" dest.RawQuery = ""
ws, err := websocket.Dial(dest.String(), "", "http://localhost") ws, err := websocket.Dial(dest.String(), "", "http://localhost")
@ -114,7 +114,7 @@ func TestWatchHTTP(t *testing.T) {
client := http.Client{} client := http.Client{}
dest, _ := url.Parse(server.URL) dest, _ := url.Parse(server.URL)
dest.Path = "/api/version/watch/simples" dest.Path = "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/watch/simples"
dest.RawQuery = "" dest.RawQuery = ""
request, err := http.NewRequest("GET", dest.String(), nil) request, err := http.NewRequest("GET", dest.String(), nil)
@ -178,8 +178,8 @@ func TestWatchParamParsing(t *testing.T) {
dest, _ := url.Parse(server.URL) dest, _ := url.Parse(server.URL)
rootPath := "/api/" + testVersion + "/watch/simples" rootPath := "/" + prefix + "/" + testVersion + "/watch/simples"
namespacedPath := "/api/" + testVersion + "/watch/namespaces/other/simpleroots" namespacedPath := "/" + prefix + "/" + testVersion + "/watch/namespaces/other/simpleroots"
table := []struct { table := []struct {
path string path string
@ -286,7 +286,7 @@ func TestWatchProtocolSelection(t *testing.T) {
client := http.Client{} client := http.Client{}
dest, _ := url.Parse(server.URL) dest, _ := url.Parse(server.URL)
dest.Path = "/api/version/watch/simples" dest.Path = "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/watch/simples"
dest.RawQuery = "" dest.RawQuery = ""
table := []struct { table := []struct {
@ -358,7 +358,7 @@ func TestWatchHTTPTimeout(t *testing.T) {
// Setup a client // Setup a client
dest, _ := url.Parse(s.URL) dest, _ := url.Parse(s.URL)
dest.Path = "/api/" + newVersion + "/simple" dest.Path = "/" + prefix + "/" + newVersion + "/simple"
dest.RawQuery = "watch=true" dest.RawQuery = "watch=true"
req, _ := http.NewRequest("GET", dest.String(), nil) req, _ := http.NewRequest("GET", dest.String(), nil)

View File

@ -670,8 +670,8 @@ func (m *Master) init(c *Config) {
} }
expAPIVersions := []unversioned.GroupVersionForDiscovery{ expAPIVersions := []unversioned.GroupVersionForDiscovery{
{ {
GroupVersion: expVersion.Version, GroupVersion: expVersion.GroupVersion.String(),
Version: apiutil.GetVersion(expVersion.Version), Version: expVersion.GroupVersion.Version,
}, },
} }
storageVersion, found := c.StorageVersions[g.Group] storageVersion, found := c.StorageVersions[g.Group]
@ -685,7 +685,7 @@ func (m *Master) init(c *Config) {
} }
apiserver.AddGroupWebService(m.handlerContainer, c.APIGroupPrefix+"/"+latest.GroupOrDie("extensions").Group, group) apiserver.AddGroupWebService(m.handlerContainer, c.APIGroupPrefix+"/"+latest.GroupOrDie("extensions").Group, group)
allGroups = append(allGroups, group) allGroups = append(allGroups, group)
apiserver.InstallServiceErrorHandler(m.handlerContainer, m.newRequestInfoResolver(), []string{expVersion.Version}) apiserver.InstallServiceErrorHandler(m.handlerContainer, m.newRequestInfoResolver(), []string{expVersion.GroupVersion.String()})
} }
// This should be done after all groups are registered // This should be done after all groups are registered
@ -896,7 +896,7 @@ func (m *Master) api_v1() *apiserver.APIGroupVersion {
} }
version := m.defaultAPIGroupVersion() version := m.defaultAPIGroupVersion()
version.Storage = storage version.Storage = storage
version.Version = "v1" version.GroupVersion = unversioned.GroupVersion{Version: "v1"}
version.Codec = v1.Codec version.Codec = v1.Codec
return version return version
} }
@ -1009,7 +1009,7 @@ func (m *Master) InstallThirdPartyResource(rsrc *expapi.ThirdPartyResource) erro
} }
apiserver.AddGroupWebService(m.handlerContainer, path, apiGroup) apiserver.AddGroupWebService(m.handlerContainer, path, apiGroup)
m.addThirdPartyResourceStorage(path, thirdparty.Storage[strings.ToLower(kind)+"s"].(*thirdpartyresourcedataetcd.REST)) m.addThirdPartyResourceStorage(path, thirdparty.Storage[strings.ToLower(kind)+"s"].(*thirdpartyresourcedataetcd.REST))
apiserver.InstallServiceErrorHandler(m.handlerContainer, m.newRequestInfoResolver(), []string{thirdparty.Version}) apiserver.InstallServiceErrorHandler(m.handlerContainer, m.newRequestInfoResolver(), []string{thirdparty.GroupVersion.String()})
return nil return nil
} }
@ -1022,20 +1022,22 @@ func (m *Master) thirdpartyapi(group, kind, version string) *apiserver.APIGroupV
strings.ToLower(kind) + "s": resourceStorage, strings.ToLower(kind) + "s": resourceStorage,
} }
serverGroupVersion := unversioned.ParseGroupVersionOrDie(latest.GroupOrDie("").GroupVersion)
return &apiserver.APIGroupVersion{ return &apiserver.APIGroupVersion{
Root: apiRoot, Root: apiRoot,
Version: apiutil.GetGroupVersion(group, version), GroupVersion: unversioned.GroupVersion{Group: group, Version: version},
RequestInfoResolver: m.newRequestInfoResolver(), RequestInfoResolver: m.newRequestInfoResolver(),
Creater: thirdpartyresourcedata.NewObjectCreator(group, version, api.Scheme), Creater: thirdpartyresourcedata.NewObjectCreator(group, version, api.Scheme),
Convertor: api.Scheme, Convertor: api.Scheme,
Typer: api.Scheme, Typer: api.Scheme,
Mapper: thirdpartyresourcedata.NewMapper(latest.GroupOrDie("extensions").RESTMapper, kind, version, group), Mapper: thirdpartyresourcedata.NewMapper(latest.GroupOrDie("extensions").RESTMapper, kind, version, group),
Codec: thirdpartyresourcedata.NewCodec(latest.GroupOrDie("extensions").Codec, kind), Codec: thirdpartyresourcedata.NewCodec(latest.GroupOrDie("extensions").Codec, kind),
Linker: latest.GroupOrDie("extensions").SelfLinker, Linker: latest.GroupOrDie("extensions").SelfLinker,
Storage: storage, Storage: storage,
ServerVersion: latest.GroupOrDie("").GroupVersion, ServerGroupVersion: &serverGroupVersion,
Context: m.requestContextMapper, Context: m.requestContextMapper,
@ -1110,6 +1112,7 @@ func (m *Master) experimental(c *Config) *apiserver.APIGroupVersion {
} }
extensionsGroup := latest.GroupOrDie("extensions") extensionsGroup := latest.GroupOrDie("extensions")
serverGroupVersion := unversioned.ParseGroupVersionOrDie(latest.GroupOrDie("").GroupVersion)
return &apiserver.APIGroupVersion{ return &apiserver.APIGroupVersion{
Root: m.apiGroupPrefix, Root: m.apiGroupPrefix,
@ -1119,12 +1122,12 @@ func (m *Master) experimental(c *Config) *apiserver.APIGroupVersion {
Convertor: api.Scheme, Convertor: api.Scheme,
Typer: api.Scheme, Typer: api.Scheme,
Mapper: extensionsGroup.RESTMapper, Mapper: extensionsGroup.RESTMapper,
Codec: extensionsGroup.Codec, Codec: extensionsGroup.Codec,
Linker: extensionsGroup.SelfLinker, Linker: extensionsGroup.SelfLinker,
Storage: storage, Storage: storage,
Version: extensionsGroup.GroupVersion, GroupVersion: unversioned.ParseGroupVersionOrDie(extensionsGroup.GroupVersion),
ServerVersion: latest.GroupOrDie("").GroupVersion, ServerGroupVersion: &serverGroupVersion,
Admit: m.admissionControl, Admit: m.admissionControl,
Context: m.requestContextMapper, Context: m.requestContextMapper,

View File

@ -176,7 +176,7 @@ func TestFindExternalAddress(t *testing.T) {
func TestApi_v1(t *testing.T) { func TestApi_v1(t *testing.T) {
master, _, assert := setUp(t) master, _, assert := setUp(t)
version := master.api_v1() version := master.api_v1()
assert.Equal("v1", version.Version, "Version was not v1: %s", version.Version) assert.Equal(unversioned.GroupVersion{Version: "v1"}, version.GroupVersion, "Version was not v1: %s", version.GroupVersion)
assert.Equal(v1.Codec, version.Codec, "version.Codec was not for v1: %s", version.Codec) assert.Equal(v1.Codec, version.Codec, "version.Codec was not for v1: %s", version.Codec)
for k, v := range master.storage { for k, v := range master.storage {
assert.Contains(version.Storage, v, "Value %s not found (key: %s)", k, v) assert.Contains(version.Storage, v, "Value %s not found (key: %s)", k, v)
@ -323,12 +323,14 @@ func TestDefaultAPIGroupVersion(t *testing.T) {
func TestExpapi(t *testing.T) { func TestExpapi(t *testing.T) {
master, config, assert := setUp(t) master, config, assert := setUp(t)
extensionsGroupMeta := latest.GroupOrDie("extensions")
expAPIGroup := master.experimental(&config) expAPIGroup := master.experimental(&config)
assert.Equal(expAPIGroup.Root, master.apiGroupPrefix) assert.Equal(expAPIGroup.Root, master.apiGroupPrefix)
assert.Equal(expAPIGroup.Mapper, latest.GroupOrDie("extensions").RESTMapper) assert.Equal(expAPIGroup.Mapper, extensionsGroupMeta.RESTMapper)
assert.Equal(expAPIGroup.Codec, latest.GroupOrDie("extensions").Codec) assert.Equal(expAPIGroup.Codec, extensionsGroupMeta.Codec)
assert.Equal(expAPIGroup.Linker, latest.GroupOrDie("extensions").SelfLinker) assert.Equal(expAPIGroup.Linker, extensionsGroupMeta.SelfLinker)
assert.Equal(expAPIGroup.Version, latest.GroupOrDie("extensions").GroupVersion) assert.Equal(expAPIGroup.GroupVersion, unversioned.GroupVersion{Group: extensionsGroupMeta.Group, Version: extensionsGroupMeta.Version})
} }
// TestGetNodeAddresses verifies that proper results are returned // TestGetNodeAddresses verifies that proper results are returned