mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-24 20:24:09 +00:00
Update client library to react to changes in Decoding
This commit is contained in:
parent
24a7919002
commit
efe88e0818
@ -48,13 +48,14 @@ func (g *genGroup) Namers(c *generator.Context) namer.NameSystems {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g *genGroup) Imports(c *generator.Context) (imports []string) {
|
func (g *genGroup) Imports(c *generator.Context) (imports []string) {
|
||||||
return append(g.imports.ImportLines(), "fmt")
|
return g.imports.ImportLines()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
||||||
sw := generator.NewSnippetWriter(w, c, "$", "$")
|
sw := generator.NewSnippetWriter(w, c, "$", "$")
|
||||||
const pkgUnversioned = "k8s.io/kubernetes/pkg/client/unversioned"
|
const pkgUnversioned = "k8s.io/kubernetes/pkg/client/unversioned"
|
||||||
const pkgRegistered = "k8s.io/kubernetes/pkg/apimachinery/registered"
|
const pkgRegistered = "k8s.io/kubernetes/pkg/apimachinery/registered"
|
||||||
|
const pkgAPI = "k8s.io/kubernetes/pkg/api"
|
||||||
apiPath := func(group string) string {
|
apiPath := func(group string) string {
|
||||||
if group == "legacy" {
|
if group == "legacy" {
|
||||||
return `"/api"`
|
return `"/api"`
|
||||||
@ -81,6 +82,7 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer
|
|||||||
"latestGroup": c.Universe.Variable(types.Name{Package: pkgRegistered, Name: "Group"}),
|
"latestGroup": c.Universe.Variable(types.Name{Package: pkgRegistered, Name: "Group"}),
|
||||||
"GroupOrDie": c.Universe.Variable(types.Name{Package: pkgRegistered, Name: "GroupOrDie"}),
|
"GroupOrDie": c.Universe.Variable(types.Name{Package: pkgRegistered, Name: "GroupOrDie"}),
|
||||||
"apiPath": apiPath(g.group),
|
"apiPath": apiPath(g.group),
|
||||||
|
"latestCodecs": c.Universe.Variable(types.Name{Package: pkgAPI, Name: "Codecs"}),
|
||||||
}
|
}
|
||||||
sw.Do(groupInterfaceTemplate, m)
|
sw.Do(groupInterfaceTemplate, m)
|
||||||
sw.Do(groupClientTemplate, m)
|
sw.Do(groupClientTemplate, m)
|
||||||
@ -181,12 +183,7 @@ func setConfigDefaults(config *$.Config|raw$) error {
|
|||||||
config.GroupVersion = ©GroupVersion
|
config.GroupVersion = ©GroupVersion
|
||||||
//}
|
//}
|
||||||
|
|
||||||
versionInterfaces, err := g.InterfacesFor(*config.GroupVersion)
|
config.Codec = $.latestCodecs|raw$.LegacyCodec(*config.GroupVersion)
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("$.Group$ API version '%s' is not recognized (valid values: %s)",
|
|
||||||
config.GroupVersion, g.GroupVersions)
|
|
||||||
}
|
|
||||||
config.Codec = versionInterfaces.Codec
|
|
||||||
if config.QPS == 0 {
|
if config.QPS == 0 {
|
||||||
config.QPS = 5
|
config.QPS = 5
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ limitations under the License.
|
|||||||
package unversioned
|
package unversioned
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
api "k8s.io/kubernetes/pkg/api"
|
||||||
registered "k8s.io/kubernetes/pkg/apimachinery/registered"
|
registered "k8s.io/kubernetes/pkg/apimachinery/registered"
|
||||||
unversioned "k8s.io/kubernetes/pkg/client/unversioned"
|
unversioned "k8s.io/kubernetes/pkg/client/unversioned"
|
||||||
)
|
)
|
||||||
@ -79,12 +79,7 @@ func setConfigDefaults(config *unversioned.Config) error {
|
|||||||
config.GroupVersion = ©GroupVersion
|
config.GroupVersion = ©GroupVersion
|
||||||
//}
|
//}
|
||||||
|
|
||||||
versionInterfaces, err := g.InterfacesFor(*config.GroupVersion)
|
config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Testgroup API version '%s' is not recognized (valid values: %s)",
|
|
||||||
config.GroupVersion, g.GroupVersions)
|
|
||||||
}
|
|
||||||
config.Codec = versionInterfaces.Codec
|
|
||||||
if config.QPS == 0 {
|
if config.QPS == 0 {
|
||||||
config.QPS = 5
|
config.QPS = 5
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ func init() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
testapi.Groups[testgroup.SchemeGroupVersion.Group] = testapi.NewTestGroup(
|
testapi.Groups[testgroup.SchemeGroupVersion.Group] = testapi.NewTestGroup(
|
||||||
unversioned.GroupVersion{Group: testgroup.SchemeGroupVersion.Group, Version: registered.GroupOrDie(testgroup.SchemeGroupVersion.Group).GroupVersion.Version},
|
registered.GroupOrDie(testgroup.SchemeGroupVersion.Group).GroupVersion,
|
||||||
testgroup.SchemeGroupVersion)
|
testgroup.SchemeGroupVersion)
|
||||||
testHelper = testapi.Groups[testgroup.SchemeGroupVersion.Group]
|
testHelper = testapi.Groups[testgroup.SchemeGroupVersion.Group]
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ type objects struct {
|
|||||||
types map[string][]runtime.Object
|
types map[string][]runtime.Object
|
||||||
last map[string]int
|
last map[string]int
|
||||||
scheme ObjectScheme
|
scheme ObjectScheme
|
||||||
decoder runtime.ObjectDecoder
|
decoder runtime.Decoder
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ ObjectRetriever = &objects{}
|
var _ ObjectRetriever = &objects{}
|
||||||
@ -143,7 +143,7 @@ var _ ObjectRetriever = &objects{}
|
|||||||
// as a runtime.Object if Status == Success). If multiple PodLists are provided, they
|
// as a runtime.Object if Status == Success). If multiple PodLists are provided, they
|
||||||
// will be returned in order by the Kind call, and the last PodList will be reused for
|
// will be returned in order by the Kind call, and the last PodList will be reused for
|
||||||
// subsequent calls.
|
// subsequent calls.
|
||||||
func NewObjects(scheme ObjectScheme, decoder runtime.ObjectDecoder) ObjectRetriever {
|
func NewObjects(scheme ObjectScheme, decoder runtime.Decoder) ObjectRetriever {
|
||||||
return objects{
|
return objects{
|
||||||
types: make(map[string][]runtime.Object),
|
types: make(map[string][]runtime.Object),
|
||||||
last: make(map[string]int),
|
last: make(map[string]int),
|
||||||
|
@ -30,7 +30,7 @@ import (
|
|||||||
|
|
||||||
// Clientset returns a clientset that will respond with the provided objects
|
// Clientset returns a clientset that will respond with the provided objects
|
||||||
func NewSimpleClientset(objects ...runtime.Object) *Clientset {
|
func NewSimpleClientset(objects ...runtime.Object) *Clientset {
|
||||||
o := core.NewObjects(api.Scheme, api.Scheme)
|
o := core.NewObjects(api.Scheme, api.Codecs.UniversalDecoder())
|
||||||
for _, obj := range objects {
|
for _, obj := range objects {
|
||||||
if err := o.Add(obj); err != nil {
|
if err := o.Add(obj); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
@ -18,6 +18,7 @@ package unversioned
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
registered "k8s.io/kubernetes/pkg/apimachinery/registered"
|
registered "k8s.io/kubernetes/pkg/apimachinery/registered"
|
||||||
unversioned "k8s.io/kubernetes/pkg/client/unversioned"
|
unversioned "k8s.io/kubernetes/pkg/client/unversioned"
|
||||||
)
|
)
|
||||||
@ -109,12 +110,7 @@ func setConfigDefaults(config *unversioned.Config) error {
|
|||||||
config.GroupVersion = ©GroupVersion
|
config.GroupVersion = ©GroupVersion
|
||||||
//}
|
//}
|
||||||
|
|
||||||
versionInterfaces, err := g.InterfacesFor(*config.GroupVersion)
|
config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Extensions API version '%s' is not recognized (valid values: %s)",
|
|
||||||
config.GroupVersion, g.GroupVersions)
|
|
||||||
}
|
|
||||||
config.Codec = versionInterfaces.Codec
|
|
||||||
if config.QPS == 0 {
|
if config.QPS == 0 {
|
||||||
config.QPS = 5
|
config.QPS = 5
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ package unversioned
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
registered "k8s.io/kubernetes/pkg/apimachinery/registered"
|
registered "k8s.io/kubernetes/pkg/apimachinery/registered"
|
||||||
unversioned "k8s.io/kubernetes/pkg/client/unversioned"
|
unversioned "k8s.io/kubernetes/pkg/client/unversioned"
|
||||||
)
|
)
|
||||||
@ -149,12 +150,7 @@ func setConfigDefaults(config *unversioned.Config) error {
|
|||||||
config.GroupVersion = ©GroupVersion
|
config.GroupVersion = ©GroupVersion
|
||||||
//}
|
//}
|
||||||
|
|
||||||
versionInterfaces, err := g.InterfacesFor(*config.GroupVersion)
|
config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Legacy API version '%s' is not recognized (valid values: %s)",
|
|
||||||
config.GroupVersion, g.GroupVersions)
|
|
||||||
}
|
|
||||||
config.Codec = versionInterfaces.Codec
|
|
||||||
if config.QPS == 0 {
|
if config.QPS == 0 {
|
||||||
config.QPS = 5
|
config.QPS = 5
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,8 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/version"
|
"k8s.io/kubernetes/pkg/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const nameRequiredError = "resource name may not be empty"
|
||||||
|
|
||||||
func TestGetServerVersion(t *testing.T) {
|
func TestGetServerVersion(t *testing.T) {
|
||||||
expect := version.Info{
|
expect := version.Info{
|
||||||
Major: "foo",
|
Major: "foo",
|
||||||
@ -75,7 +77,7 @@ func TestGetServerGroupsWithV1Server(t *testing.T) {
|
|||||||
}
|
}
|
||||||
output, err := json.Marshal(obj)
|
output, err := json.Marshal(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected encoding error: %v", err)
|
t.Fatalf("unexpected encoding error: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
@ -88,7 +90,7 @@ func TestGetServerGroupsWithV1Server(t *testing.T) {
|
|||||||
// ServerGroups should not return an error even if server returns error at /api and /apis
|
// ServerGroups should not return an error even if server returns error at /api and /apis
|
||||||
apiGroupList, err := client.Discovery().ServerGroups()
|
apiGroupList, err := client.Discovery().ServerGroups()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
groupVersions := ExtractGroupVersions(apiGroupList)
|
groupVersions := ExtractGroupVersions(apiGroupList)
|
||||||
if !reflect.DeepEqual(groupVersions, []string{"v1"}) {
|
if !reflect.DeepEqual(groupVersions, []string{"v1"}) {
|
||||||
|
@ -27,6 +27,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/api/errors"
|
"k8s.io/kubernetes/pkg/api/errors"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/version"
|
"k8s.io/kubernetes/pkg/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -209,8 +210,7 @@ func (d *DiscoveryClient) SwaggerSchema(version unversioned.GroupVersion) (*swag
|
|||||||
func setDiscoveryDefaults(config *Config) error {
|
func setDiscoveryDefaults(config *Config) error {
|
||||||
config.APIPath = ""
|
config.APIPath = ""
|
||||||
config.GroupVersion = nil
|
config.GroupVersion = nil
|
||||||
// Discovery client deals with unversioned objects, so we use api.Codec.
|
config.Codec = runtime.NoopEncoder{api.Codecs.UniversalDecoder()}
|
||||||
config.Codec = api.Codec
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,8 +17,7 @@ limitations under the License.
|
|||||||
package unversioned
|
package unversioned
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/apimachinery/registered"
|
"k8s.io/kubernetes/pkg/apimachinery/registered"
|
||||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||||
)
|
)
|
||||||
@ -121,12 +120,7 @@ func setExtensionsDefaults(config *Config) error {
|
|||||||
config.GroupVersion = ©GroupVersion
|
config.GroupVersion = ©GroupVersion
|
||||||
//}
|
//}
|
||||||
|
|
||||||
versionInterfaces, err := g.InterfacesFor(*config.GroupVersion)
|
config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Extensions API group/version '%v' is not recognized (valid values: %v)",
|
|
||||||
config.GroupVersion, registered.GroupOrDie(extensions.GroupName).GroupVersions)
|
|
||||||
}
|
|
||||||
config.Codec = versionInterfaces.Codec
|
|
||||||
if config.QPS == 0 {
|
if config.QPS == 0 {
|
||||||
config.QPS = 5
|
config.QPS = 5
|
||||||
}
|
}
|
||||||
|
@ -378,12 +378,8 @@ func SetKubernetesDefaults(config *Config) error {
|
|||||||
// TODO: Unconditionally set the config.Version, until we fix the config.
|
// TODO: Unconditionally set the config.Version, until we fix the config.
|
||||||
copyGroupVersion := g.GroupVersion
|
copyGroupVersion := g.GroupVersion
|
||||||
config.GroupVersion = ©GroupVersion
|
config.GroupVersion = ©GroupVersion
|
||||||
versionInterfaces, err := g.InterfacesFor(*config.GroupVersion)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("API version '%v' is not recognized (valid values: %v)", *config.GroupVersion, registered.GroupOrDie(api.GroupName).GroupVersions)
|
|
||||||
}
|
|
||||||
if config.Codec == nil {
|
if config.Codec == nil {
|
||||||
config.Codec = versionInterfaces.Codec
|
config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
|
||||||
}
|
}
|
||||||
if config.QPS == 0.0 {
|
if config.QPS == 0.0 {
|
||||||
config.QPS = 5.0
|
config.QPS = 5.0
|
||||||
|
@ -56,7 +56,7 @@ func TestNegotiateVersion(t *testing.T) {
|
|||||||
name: "server supports client default",
|
name: "server supports client default",
|
||||||
version: &uapi.GroupVersion{Version: "version1"},
|
version: &uapi.GroupVersion{Version: "version1"},
|
||||||
config: &unversioned.Config{},
|
config: &unversioned.Config{},
|
||||||
serverVersions: []string{"/version1", testapi.Default.GroupVersion().String()},
|
serverVersions: []string{"version1", testapi.Default.GroupVersion().String()},
|
||||||
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
|
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
|
||||||
expectedVersion: &uapi.GroupVersion{Version: "version1"},
|
expectedVersion: &uapi.GroupVersion{Version: "version1"},
|
||||||
},
|
},
|
||||||
@ -64,28 +64,28 @@ func TestNegotiateVersion(t *testing.T) {
|
|||||||
name: "server falls back to client supported",
|
name: "server falls back to client supported",
|
||||||
version: testapi.Default.GroupVersion(),
|
version: testapi.Default.GroupVersion(),
|
||||||
config: &unversioned.Config{},
|
config: &unversioned.Config{},
|
||||||
serverVersions: []string{"/version1"},
|
serverVersions: []string{"version1"},
|
||||||
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
|
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
|
||||||
expectedVersion: &uapi.GroupVersion{Version: "version1"},
|
expectedVersion: &uapi.GroupVersion{Version: "version1"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "explicit version supported",
|
name: "explicit version supported",
|
||||||
config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()},
|
config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()},
|
||||||
serverVersions: []string{"/version1", testapi.Default.GroupVersion().String()},
|
serverVersions: []string{"/ersion1", testapi.Default.GroupVersion().String()},
|
||||||
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
|
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
|
||||||
expectedVersion: testapi.Default.GroupVersion(),
|
expectedVersion: testapi.Default.GroupVersion(),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "explicit version not supported",
|
name: "explicit version not supported",
|
||||||
config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()},
|
config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()},
|
||||||
serverVersions: []string{"/version1"},
|
serverVersions: []string{"version1"},
|
||||||
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
|
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
|
||||||
expectErr: func(err error) bool { return strings.Contains(err.Error(), `server does not support API version "v1"`) },
|
expectErr: func(err error) bool { return strings.Contains(err.Error(), `server does not support API version "v1"`) },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connection refused error",
|
name: "connection refused error",
|
||||||
config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()},
|
config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()},
|
||||||
serverVersions: []string{"/version1"},
|
serverVersions: []string{"version1"},
|
||||||
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
|
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
|
||||||
sendErr: errors.New("connection refused"),
|
sendErr: errors.New("connection refused"),
|
||||||
expectErr: func(err error) bool { return strings.Contains(err.Error(), "connection refused") },
|
expectErr: func(err error) bool { return strings.Contains(err.Error(), "connection refused") },
|
||||||
|
@ -222,7 +222,7 @@ func TestSetsCodec(t *testing.T) {
|
|||||||
if e, a := expected.Prefix, client.RESTClient.versionedAPIPath; e != a {
|
if e, a := expected.Prefix, client.RESTClient.versionedAPIPath; e != a {
|
||||||
t.Errorf("expected %#v, got %#v", e, a)
|
t.Errorf("expected %#v, got %#v", e, a)
|
||||||
}
|
}
|
||||||
if e, a := expected.Codec, client.RESTClient.Codec; e != a {
|
if e, a := expected.Codec, client.RESTClient.Codec; !reflect.DeepEqual(e, a) {
|
||||||
t.Errorf("expected %#v, got %#v", e, a)
|
t.Errorf("expected %#v, got %#v", e, a)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -452,7 +452,7 @@ func (r *Request) VersionedParams(obj runtime.Object, convertor runtime.ObjectCo
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if k == unversioned.FieldSelectorQueryParam(r.groupVersion.String()) {
|
if k == unversioned.FieldSelectorQueryParam(r.groupVersion.String()) {
|
||||||
if value == "" {
|
if len(value) == 0 {
|
||||||
// Don't set an empty selector for backward compatibility.
|
// Don't set an empty selector for backward compatibility.
|
||||||
// Since there is no way to get the difference between empty
|
// Since there is no way to get the difference between empty
|
||||||
// and unspecified string, we don't set it to avoid having
|
// and unspecified string, we don't set it to avoid having
|
||||||
@ -717,7 +717,7 @@ func (r *Request) Stream() (io.ReadCloser, error) {
|
|||||||
return nil, fmt.Errorf("%v while accessing %v", resp.Status, url)
|
return nil, fmt.Errorf("%v while accessing %v", resp.Status, url)
|
||||||
}
|
}
|
||||||
|
|
||||||
if runtimeObject, err := r.codec.Decode(bodyBytes); err == nil {
|
if runtimeObject, err := runtime.Decode(r.codec, bodyBytes); err == nil {
|
||||||
statusError := errors.FromObject(runtimeObject)
|
statusError := errors.FromObject(runtimeObject)
|
||||||
|
|
||||||
if _, ok := statusError.(errors.APIStatus); ok {
|
if _, ok := statusError.(errors.APIStatus); ok {
|
||||||
@ -846,8 +846,10 @@ func (r *Request) transformResponse(resp *http.Response, req *http.Request) Resu
|
|||||||
|
|
||||||
// Did the server give us a status response?
|
// Did the server give us a status response?
|
||||||
isStatusResponse := false
|
isStatusResponse := false
|
||||||
var status unversioned.Status
|
var status *unversioned.Status
|
||||||
if err := r.codec.DecodeInto(body, &status); err == nil && status.Status != "" {
|
result, err := runtime.Decode(r.codec, body)
|
||||||
|
if out, ok := result.(*unversioned.Status); err == nil && ok && len(out.Status) > 0 {
|
||||||
|
status = out
|
||||||
isStatusResponse = true
|
isStatusResponse = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -858,14 +860,14 @@ func (r *Request) transformResponse(resp *http.Response, req *http.Request) Resu
|
|||||||
if !isStatusResponse {
|
if !isStatusResponse {
|
||||||
return Result{err: r.transformUnstructuredResponseError(resp, req, body)}
|
return Result{err: r.transformUnstructuredResponseError(resp, req, body)}
|
||||||
}
|
}
|
||||||
return Result{err: errors.FromObject(&status)}
|
return Result{err: errors.FromObject(status)}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the server gave us a status back, look at what it was.
|
// If the server gave us a status back, look at what it was.
|
||||||
success := resp.StatusCode >= http.StatusOK && resp.StatusCode <= http.StatusPartialContent
|
success := resp.StatusCode >= http.StatusOK && resp.StatusCode <= http.StatusPartialContent
|
||||||
if isStatusResponse && (status.Status != unversioned.StatusSuccess && !success) {
|
if isStatusResponse && (status.Status != unversioned.StatusSuccess && !success) {
|
||||||
// "Failed" requests are clearly just an error and it makes sense to return them as such.
|
// "Failed" requests are clearly just an error and it makes sense to return them as such.
|
||||||
return Result{err: errors.FromObject(&status)}
|
return Result{err: errors.FromObject(status)}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Result{
|
return Result{
|
||||||
@ -965,7 +967,8 @@ func (r Result) Get() (runtime.Object, error) {
|
|||||||
if r.err != nil {
|
if r.err != nil {
|
||||||
return nil, r.err
|
return nil, r.err
|
||||||
}
|
}
|
||||||
return r.codec.Decode(r.body)
|
obj, err := runtime.Decode(r.codec, r.body)
|
||||||
|
return obj, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// StatusCode returns the HTTP status code of the request. (Only valid if no
|
// StatusCode returns the HTTP status code of the request. (Only valid if no
|
||||||
@ -975,12 +978,12 @@ func (r Result) StatusCode(statusCode *int) Result {
|
|||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
// Into stores the result into obj, if possible.
|
// Into stores the result into obj, if possible. If obj is nil it is ignored.
|
||||||
func (r Result) Into(obj runtime.Object) error {
|
func (r Result) Into(obj runtime.Object) error {
|
||||||
if r.err != nil {
|
if r.err != nil {
|
||||||
return r.err
|
return r.err
|
||||||
}
|
}
|
||||||
return r.codec.DecodeInto(r.body, obj)
|
return runtime.DecodeInto(r.codec, r.body, obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WasCreated updates the provided bool pointer to whether the server returned
|
// WasCreated updates the provided bool pointer to whether the server returned
|
||||||
|
@ -698,7 +698,7 @@ func TestDoRequestNewWay(t *testing.T) {
|
|||||||
Port: 12345,
|
Port: 12345,
|
||||||
TargetPort: intstr.FromInt(12345),
|
TargetPort: intstr.FromInt(12345),
|
||||||
}}}}
|
}}}}
|
||||||
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj)
|
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
|
||||||
fakeHandler := utiltesting.FakeHandler{
|
fakeHandler := utiltesting.FakeHandler{
|
||||||
StatusCode: 200,
|
StatusCode: 200,
|
||||||
ResponseBody: string(expectedBody),
|
ResponseBody: string(expectedBody),
|
||||||
@ -861,13 +861,13 @@ func BenchmarkCheckRetryClosesBody(b *testing.B) {
|
|||||||
|
|
||||||
func TestDoRequestNewWayReader(t *testing.T) {
|
func TestDoRequestNewWayReader(t *testing.T) {
|
||||||
reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
||||||
reqBodyExpected, _ := testapi.Default.Codec().Encode(reqObj)
|
reqBodyExpected, _ := runtime.Encode(testapi.Default.Codec(), reqObj)
|
||||||
expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{
|
expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{
|
||||||
Protocol: "TCP",
|
Protocol: "TCP",
|
||||||
Port: 12345,
|
Port: 12345,
|
||||||
TargetPort: intstr.FromInt(12345),
|
TargetPort: intstr.FromInt(12345),
|
||||||
}}}}
|
}}}}
|
||||||
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj)
|
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
|
||||||
fakeHandler := utiltesting.FakeHandler{
|
fakeHandler := utiltesting.FakeHandler{
|
||||||
StatusCode: 200,
|
StatusCode: 200,
|
||||||
ResponseBody: string(expectedBody),
|
ResponseBody: string(expectedBody),
|
||||||
@ -902,13 +902,13 @@ func TestDoRequestNewWayReader(t *testing.T) {
|
|||||||
|
|
||||||
func TestDoRequestNewWayObj(t *testing.T) {
|
func TestDoRequestNewWayObj(t *testing.T) {
|
||||||
reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
||||||
reqBodyExpected, _ := testapi.Default.Codec().Encode(reqObj)
|
reqBodyExpected, _ := runtime.Encode(testapi.Default.Codec(), reqObj)
|
||||||
expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{
|
expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{
|
||||||
Protocol: "TCP",
|
Protocol: "TCP",
|
||||||
Port: 12345,
|
Port: 12345,
|
||||||
TargetPort: intstr.FromInt(12345),
|
TargetPort: intstr.FromInt(12345),
|
||||||
}}}}
|
}}}}
|
||||||
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj)
|
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
|
||||||
fakeHandler := utiltesting.FakeHandler{
|
fakeHandler := utiltesting.FakeHandler{
|
||||||
StatusCode: 200,
|
StatusCode: 200,
|
||||||
ResponseBody: string(expectedBody),
|
ResponseBody: string(expectedBody),
|
||||||
@ -943,7 +943,7 @@ func TestDoRequestNewWayObj(t *testing.T) {
|
|||||||
|
|
||||||
func TestDoRequestNewWayFile(t *testing.T) {
|
func TestDoRequestNewWayFile(t *testing.T) {
|
||||||
reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
||||||
reqBodyExpected, err := testapi.Default.Codec().Encode(reqObj)
|
reqBodyExpected, err := runtime.Encode(testapi.Default.Codec(), reqObj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -964,7 +964,7 @@ func TestDoRequestNewWayFile(t *testing.T) {
|
|||||||
Port: 12345,
|
Port: 12345,
|
||||||
TargetPort: intstr.FromInt(12345),
|
TargetPort: intstr.FromInt(12345),
|
||||||
}}}}
|
}}}}
|
||||||
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj)
|
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
|
||||||
fakeHandler := utiltesting.FakeHandler{
|
fakeHandler := utiltesting.FakeHandler{
|
||||||
StatusCode: 200,
|
StatusCode: 200,
|
||||||
ResponseBody: string(expectedBody),
|
ResponseBody: string(expectedBody),
|
||||||
@ -1000,7 +1000,7 @@ func TestDoRequestNewWayFile(t *testing.T) {
|
|||||||
|
|
||||||
func TestWasCreated(t *testing.T) {
|
func TestWasCreated(t *testing.T) {
|
||||||
reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
||||||
reqBodyExpected, err := testapi.Default.Codec().Encode(reqObj)
|
reqBodyExpected, err := runtime.Encode(testapi.Default.Codec(), reqObj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -1010,7 +1010,7 @@ func TestWasCreated(t *testing.T) {
|
|||||||
Port: 12345,
|
Port: 12345,
|
||||||
TargetPort: intstr.FromInt(12345),
|
TargetPort: intstr.FromInt(12345),
|
||||||
}}}}
|
}}}}
|
||||||
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj)
|
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
|
||||||
fakeHandler := utiltesting.FakeHandler{
|
fakeHandler := utiltesting.FakeHandler{
|
||||||
StatusCode: 201,
|
StatusCode: 201,
|
||||||
ResponseBody: string(expectedBody),
|
ResponseBody: string(expectedBody),
|
||||||
@ -1138,7 +1138,7 @@ func TestBody(t *testing.T) {
|
|||||||
const data = "test payload"
|
const data = "test payload"
|
||||||
|
|
||||||
obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
||||||
bodyExpected, _ := testapi.Default.Codec().Encode(obj)
|
bodyExpected, _ := runtime.Encode(testapi.Default.Codec(), obj)
|
||||||
|
|
||||||
f, err := ioutil.TempFile("", "test_body")
|
f, err := ioutil.TempFile("", "test_body")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -28,13 +28,14 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/api/errors"
|
"k8s.io/kubernetes/pkg/api/errors"
|
||||||
"k8s.io/kubernetes/pkg/api/testapi"
|
"k8s.io/kubernetes/pkg/api/testapi"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/util"
|
"k8s.io/kubernetes/pkg/util"
|
||||||
utiltesting "k8s.io/kubernetes/pkg/util/testing"
|
utiltesting "k8s.io/kubernetes/pkg/util/testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDoRequestSuccess(t *testing.T) {
|
func TestDoRequestSuccess(t *testing.T) {
|
||||||
status := &unversioned.Status{Status: unversioned.StatusSuccess}
|
status := &unversioned.Status{Status: unversioned.StatusSuccess}
|
||||||
expectedBody, _ := testapi.Default.Codec().Encode(status)
|
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), status)
|
||||||
fakeHandler := utiltesting.FakeHandler{
|
fakeHandler := utiltesting.FakeHandler{
|
||||||
StatusCode: 200,
|
StatusCode: 200,
|
||||||
ResponseBody: string(expectedBody),
|
ResponseBody: string(expectedBody),
|
||||||
@ -60,7 +61,7 @@ func TestDoRequestSuccess(t *testing.T) {
|
|||||||
if fakeHandler.RequestReceived.Header["Authorization"] == nil {
|
if fakeHandler.RequestReceived.Header["Authorization"] == nil {
|
||||||
t.Errorf("Request is missing authorization header: %#v", fakeHandler.RequestReceived)
|
t.Errorf("Request is missing authorization header: %#v", fakeHandler.RequestReceived)
|
||||||
}
|
}
|
||||||
statusOut, err := testapi.Default.Codec().Decode(body)
|
statusOut, err := runtime.Decode(testapi.Default.Codec(), body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error %#v", err)
|
t.Errorf("Unexpected error %#v", err)
|
||||||
}
|
}
|
||||||
@ -78,7 +79,7 @@ func TestDoRequestFailed(t *testing.T) {
|
|||||||
Message: " \"\" not found",
|
Message: " \"\" not found",
|
||||||
Details: &unversioned.StatusDetails{},
|
Details: &unversioned.StatusDetails{},
|
||||||
}
|
}
|
||||||
expectedBody, _ := testapi.Default.Codec().Encode(status)
|
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), status)
|
||||||
fakeHandler := utiltesting.FakeHandler{
|
fakeHandler := utiltesting.FakeHandler{
|
||||||
StatusCode: 404,
|
StatusCode: 404,
|
||||||
ResponseBody: string(expectedBody),
|
ResponseBody: string(expectedBody),
|
||||||
@ -111,7 +112,7 @@ func TestDoRequestFailed(t *testing.T) {
|
|||||||
|
|
||||||
func TestDoRequestCreated(t *testing.T) {
|
func TestDoRequestCreated(t *testing.T) {
|
||||||
status := &unversioned.Status{Status: unversioned.StatusSuccess}
|
status := &unversioned.Status{Status: unversioned.StatusSuccess}
|
||||||
expectedBody, _ := testapi.Default.Codec().Encode(status)
|
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), status)
|
||||||
fakeHandler := utiltesting.FakeHandler{
|
fakeHandler := utiltesting.FakeHandler{
|
||||||
StatusCode: 201,
|
StatusCode: 201,
|
||||||
ResponseBody: string(expectedBody),
|
ResponseBody: string(expectedBody),
|
||||||
@ -138,7 +139,7 @@ func TestDoRequestCreated(t *testing.T) {
|
|||||||
if !created {
|
if !created {
|
||||||
t.Errorf("Expected object to be created")
|
t.Errorf("Expected object to be created")
|
||||||
}
|
}
|
||||||
statusOut, err := testapi.Default.Codec().Decode(body)
|
statusOut, err := runtime.Decode(testapi.Default.Codec(), body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error %#v", err)
|
t.Errorf("Unexpected error %#v", err)
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ type objects struct {
|
|||||||
types map[string][]runtime.Object
|
types map[string][]runtime.Object
|
||||||
last map[string]int
|
last map[string]int
|
||||||
scheme ObjectScheme
|
scheme ObjectScheme
|
||||||
decoder runtime.ObjectDecoder
|
decoder runtime.Decoder
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ ObjectRetriever = &objects{}
|
var _ ObjectRetriever = &objects{}
|
||||||
@ -143,7 +143,7 @@ var _ ObjectRetriever = &objects{}
|
|||||||
// as a runtime.Object if Status == Success). If multiple PodLists are provided, they
|
// as a runtime.Object if Status == Success). If multiple PodLists are provided, they
|
||||||
// will be returned in order by the Kind call, and the last PodList will be reused for
|
// will be returned in order by the Kind call, and the last PodList will be reused for
|
||||||
// subsequent calls.
|
// subsequent calls.
|
||||||
func NewObjects(scheme ObjectScheme, decoder runtime.ObjectDecoder) ObjectRetriever {
|
func NewObjects(scheme ObjectScheme, decoder runtime.Decoder) ObjectRetriever {
|
||||||
return objects{
|
return objects{
|
||||||
types: make(map[string][]runtime.Object),
|
types: make(map[string][]runtime.Object),
|
||||||
last: make(map[string]int),
|
last: make(map[string]int),
|
||||||
@ -153,10 +153,7 @@ func NewObjects(scheme ObjectScheme, decoder runtime.ObjectDecoder) ObjectRetrie
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (o objects) Kind(kind unversioned.GroupVersionKind, name string) (runtime.Object, error) {
|
func (o objects) Kind(kind unversioned.GroupVersionKind, name string) (runtime.Object, error) {
|
||||||
// TODO our test clients deal in internal versions. We need to plumb that knowledge down here
|
kind.Version = runtime.APIVersionInternal
|
||||||
// we might do this via an extra function to the scheme to allow getting internal group versions
|
|
||||||
// I'm punting for now
|
|
||||||
kind.Version = ""
|
|
||||||
|
|
||||||
empty, _ := o.scheme.New(kind)
|
empty, _ := o.scheme.New(kind)
|
||||||
nilValue := reflect.Zero(reflect.TypeOf(empty)).Interface().(runtime.Object)
|
nilValue := reflect.Zero(reflect.TypeOf(empty)).Interface().(runtime.Object)
|
||||||
|
@ -213,7 +213,7 @@ func body(t *testing.T, obj runtime.Object, raw *string) *string {
|
|||||||
if !found {
|
if !found {
|
||||||
t.Errorf("Group %s is not registered in testapi", fqKind.GroupVersion().Group)
|
t.Errorf("Group %s is not registered in testapi", fqKind.GroupVersion().Group)
|
||||||
}
|
}
|
||||||
bs, err = g.Codec().Encode(obj)
|
bs, err = runtime.Encode(g.Codec(), obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected encoding error: %v", err)
|
t.Errorf("unexpected encoding error: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ import (
|
|||||||
|
|
||||||
// NewSimpleFake returns a client that will respond with the provided objects
|
// NewSimpleFake returns a client that will respond with the provided objects
|
||||||
func NewSimpleFake(objects ...runtime.Object) *Fake {
|
func NewSimpleFake(objects ...runtime.Object) *Fake {
|
||||||
o := NewObjects(api.Scheme, api.Scheme)
|
o := NewObjects(api.Scheme, api.Codecs.UniversalDecoder())
|
||||||
for _, obj := range objects {
|
for _, obj := range objects {
|
||||||
if err := o.Add(obj); err != nil {
|
if err := o.Add(obj); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
@ -26,8 +26,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestNewClient(t *testing.T) {
|
func TestNewClient(t *testing.T) {
|
||||||
o := NewObjects(api.Scheme, api.Scheme)
|
o := NewObjects(api.Scheme, api.Codecs.UniversalDecoder())
|
||||||
if err := AddObjectsFromPath("../../../../examples/guestbook/frontend-service.yaml", o, api.Scheme); err != nil {
|
if err := AddObjectsFromPath("../../../../examples/guestbook/frontend-service.yaml", o, api.Codecs.UniversalDecoder()); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
client := &Fake{}
|
client := &Fake{}
|
||||||
@ -52,7 +52,7 @@ func TestNewClient(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestErrors(t *testing.T) {
|
func TestErrors(t *testing.T) {
|
||||||
o := NewObjects(api.Scheme, api.Scheme)
|
o := NewObjects(api.Scheme, api.Codecs.UniversalDecoder())
|
||||||
o.Add(&api.List{
|
o.Add(&api.List{
|
||||||
Items: []runtime.Object{
|
Items: []runtime.Object{
|
||||||
// This first call to List will return this error
|
// This first call to List will return this error
|
||||||
|
Loading…
Reference in New Issue
Block a user