Register the API versions to the DefaultRESTMapper in the order of preferred versions first.

This makes kubectl sends requests to URLs in the format defined by the latest API version.
This commit is contained in:
Chao Xu 2015-04-29 11:17:55 -07:00
parent f74fab4e56
commit 4787c66214
7 changed files with 15 additions and 13 deletions

View File

@ -31,4 +31,4 @@ source "${KUBE_VERSION_ROOT}/cluster/${KUBERNETES_PROVIDER}/util.sh"
prepare-e2e prepare-e2e
${KUBECTL} get minions --no-headers | wc -l ${KUBECTL} get nodes --no-headers | wc -l

View File

@ -126,14 +126,14 @@ for version in "${kube_api_versions[@]}"; do
-s "http://127.0.0.1:${API_PORT}" -s "http://127.0.0.1:${API_PORT}"
--match-server-version --match-server-version
) )
[ "$(kubectl get minions -t $'{{ .apiVersion }}' "${kube_flags[@]}")" == "v1beta3" ] [ "$(kubectl get minions -t '{{ .apiVersion }}' "${kube_flags[@]}")" == "v1beta3" ]
else else
kube_flags=( kube_flags=(
-s "http://127.0.0.1:${API_PORT}" -s "http://127.0.0.1:${API_PORT}"
--match-server-version --match-server-version
--api-version="${version}" --api-version="${version}"
) )
[ "$(kubectl get minions -t $'{{ .apiVersion }}' "${kube_flags[@]}")" == "${version}" ] [ "$(kubectl get minions -t '{{ .apiVersion }}' "${kube_flags[@]}")" == "${version}" ]
fi fi
id_field=".metadata.name" id_field=".metadata.name"
labels_field=".metadata.labels" labels_field=".metadata.labels"
@ -625,7 +625,7 @@ __EOF__
# Minions # # Minions #
########### ###########
if [[ "${version}" != "v1beta3" ]]; then if [[ "${version}" = "v1beta1" ]] || [[ "${version}" = "v1beta2" ]]; then
kube::log::status "Testing kubectl(${version}:minions)" kube::log::status "Testing kubectl(${version}:minions)"
kube::test::get_object_assert minions "{{range.items}}{{$id_field}}:{{end}}" '127.0.0.1:' kube::test::get_object_assert minions "{{range.items}}{{$id_field}}:{{end}}" '127.0.0.1:'

View File

@ -110,7 +110,8 @@ func init() {
}, },
) )
// list of versions we support on the server // list of versions we support on the server
versions := []string{"v1beta1", "v1beta2", "v1beta3", "v1"} // versions should be listed in the order of perferred versions first
versions := []string{"v1beta3", "v1beta2", "v1beta1", "v1"}
// versions that used mixed case URL formats // versions that used mixed case URL formats
versionMixedCase := map[string]bool{ versionMixedCase := map[string]bool{

View File

@ -72,11 +72,10 @@ func TestInterfacesFor(t *testing.T) {
} }
func TestRESTMapper(t *testing.T) { func TestRESTMapper(t *testing.T) {
// TODO: This test does not seem right. The version returned here depends on the order in which API versions were registered. This will just return the API version that was registered first. Fix this. if v, k, err := RESTMapper.VersionAndKindForResource("replicationControllers"); err != nil || v != "v1beta3" || k != "ReplicationController" {
if v, k, err := RESTMapper.VersionAndKindForResource("replicationControllers"); err != nil || v != "v1beta1" || k != "ReplicationController" {
t.Errorf("unexpected version mapping: %s %s %v", v, k, err) t.Errorf("unexpected version mapping: %s %s %v", v, k, err)
} }
if v, k, err := RESTMapper.VersionAndKindForResource("replicationcontrollers"); err != nil || v != "v1beta1" || k != "ReplicationController" { if v, k, err := RESTMapper.VersionAndKindForResource("replicationcontrollers"); err != nil || v != "v1beta3" || k != "ReplicationController" {
t.Errorf("unexpected version mapping: %s %s %v", v, k, err) t.Errorf("unexpected version mapping: %s %s %v", v, k, err)
} }

View File

@ -115,7 +115,9 @@ func NewDefaultRESTMapper(versions []string, f VersionInterfacesFunc) *DefaultRE
func (m *DefaultRESTMapper) Add(scope RESTScope, kind string, version string, mixedCase bool) { func (m *DefaultRESTMapper) Add(scope RESTScope, kind string, version string, mixedCase bool) {
plural, singular := kindToResource(kind, mixedCase) plural, singular := kindToResource(kind, mixedCase)
meta := typeMeta{APIVersion: version, Kind: kind} meta := typeMeta{APIVersion: version, Kind: kind}
if _, ok := m.mapping[plural]; !ok { _, ok1 := m.mapping[plural]
_, ok2 := m.mapping[strings.ToLower(plural)]
if !ok1 && !ok2 {
m.mapping[plural] = meta m.mapping[plural] = meta
m.mapping[singular] = meta m.mapping[singular] = meta
if strings.ToLower(plural) != plural { if strings.ToLower(plural) != plural {
@ -155,7 +157,7 @@ func kindToResource(kind string, mixedCase bool) (plural, singular string) {
// VersionAndKindForResource implements RESTMapper // VersionAndKindForResource implements RESTMapper
func (m *DefaultRESTMapper) VersionAndKindForResource(resource string) (defaultVersion, kind string, err error) { func (m *DefaultRESTMapper) VersionAndKindForResource(resource string) (defaultVersion, kind string, err error) {
meta, ok := m.mapping[resource] meta, ok := m.mapping[strings.ToLower(resource)]
if !ok { if !ok {
return "", "", fmt.Errorf("no resource %q has been defined", resource) return "", "", fmt.Errorf("no resource %q has been defined", resource)
} }

View File

@ -53,7 +53,7 @@ func TestDeleteObjectByTuple(t *testing.T) {
cmd.Flags().Set("cascade", "false") cmd.Flags().Set("cascade", "false")
cmd.Run(cmd, []string{"replicationcontrollers/redis-master-controller"}) cmd.Run(cmd, []string{"replicationcontrollers/redis-master-controller"})
if buf.String() != "replicationControllers/redis-master-controller\n" { if buf.String() != "replicationcontrollers/redis-master-controller\n" {
t.Errorf("unexpected output: %s", buf.String()) t.Errorf("unexpected output: %s", buf.String())
} }
} }
@ -84,7 +84,7 @@ func TestDeleteNamedObject(t *testing.T) {
cmd.Flags().Set("cascade", "false") cmd.Flags().Set("cascade", "false")
cmd.Run(cmd, []string{"replicationcontrollers", "redis-master-controller"}) cmd.Run(cmd, []string{"replicationcontrollers", "redis-master-controller"})
if buf.String() != "replicationControllers/redis-master-controller\n" { if buf.String() != "replicationcontrollers/redis-master-controller\n" {
t.Errorf("unexpected output: %s", buf.String()) t.Errorf("unexpected output: %s", buf.String())
} }
} }

View File

@ -163,7 +163,7 @@ func TestGetUnknownSchemaObjectListGeneric(t *testing.T) {
output: "unlikelyversion", output: "unlikelyversion",
list: "v1beta3", list: "v1beta3",
obj1: "unlikelyversion", // doesn't have v1beta3 obj1: "unlikelyversion", // doesn't have v1beta3
obj2: "v1beta1", // version of the API response obj2: "v1beta3", // version of the API response
}, },
"handles common version": { "handles common version": {
output: "v1beta1", output: "v1beta1",