From 1e161bb329b54e4ec7f41443be02f653ff9c93a3 Mon Sep 17 00:00:00 2001 From: Sean Sullivan Date: Wed, 31 Oct 2018 15:11:40 -0700 Subject: [PATCH] kubectl: change legacyscheme codecs to direct codecs (no conversion) --- pkg/kubectl/cmd/util/BUILD | 2 + pkg/kubectl/cmd/util/kubectl_match_version.go | 8 +++- .../polymorphichelpers/protocolsforobject.go | 8 ++++ .../protocolsforobject_test.go | 40 ++++++++++++++++--- 4 files changed, 50 insertions(+), 8 deletions(-) diff --git a/pkg/kubectl/cmd/util/BUILD b/pkg/kubectl/cmd/util/BUILD index 936a98459c3..6d15cca7e0a 100644 --- a/pkg/kubectl/cmd/util/BUILD +++ b/pkg/kubectl/cmd/util/BUILD @@ -17,6 +17,7 @@ go_library( "//pkg/api/legacyscheme:go_default_library", "//pkg/kubectl/cmd/util/openapi:go_default_library", "//pkg/kubectl/cmd/util/openapi/validation:go_default_library", + "//pkg/kubectl/scheme:go_default_library", "//pkg/kubectl/util/templates:go_default_library", "//pkg/kubectl/validation:go_default_library", "//pkg/version:go_default_library", @@ -27,6 +28,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", diff --git a/pkg/kubectl/cmd/util/kubectl_match_version.go b/pkg/kubectl/cmd/util/kubectl_match_version.go index bf5745c2a6c..99ba2baeec6 100644 --- a/pkg/kubectl/cmd/util/kubectl_match_version.go +++ b/pkg/kubectl/cmd/util/kubectl_match_version.go @@ -23,12 +23,13 @@ import ( "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/client-go/discovery" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/version" ) @@ -120,7 +121,10 @@ func setKubernetesDefaults(config *rest.Config) error { config.APIPath = "/api" } if config.NegotiatedSerializer == nil { - config.NegotiatedSerializer = legacyscheme.Codecs + // This codec factory ensures the resources are not converted. Therefore, resources + // will not be round-tripped through internal versions. Defaulting does not happen + // on the client. + config.NegotiatedSerializer = &serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} } return rest.SetKubernetesDefaults(config) } diff --git a/pkg/kubectl/polymorphichelpers/protocolsforobject.go b/pkg/kubectl/polymorphichelpers/protocolsforobject.go index c1d09da9b37..2e5e5a2086d 100644 --- a/pkg/kubectl/polymorphichelpers/protocolsforobject.go +++ b/pkg/kubectl/polymorphichelpers/protocolsforobject.go @@ -65,6 +65,10 @@ func getProtocols(spec corev1.PodSpec) map[string]string { result := make(map[string]string) for _, container := range spec.Containers { for _, port := range container.Ports { + // Empty protocol must be defaulted (TCP) + if len(port.Protocol) == 0 { + port.Protocol = corev1.ProtocolTCP + } result[strconv.Itoa(int(port.ContainerPort))] = string(port.Protocol) } } @@ -75,6 +79,10 @@ func getProtocols(spec corev1.PodSpec) map[string]string { func getServiceProtocols(spec corev1.ServiceSpec) map[string]string { result := make(map[string]string) for _, servicePort := range spec.Ports { + // Empty protocol must be defaulted (TCP) + if len(servicePort.Protocol) == 0 { + servicePort.Protocol = corev1.ProtocolTCP + } result[strconv.Itoa(int(servicePort.Port))] = string(servicePort.Protocol) } return result diff --git a/pkg/kubectl/polymorphichelpers/protocolsforobject_test.go b/pkg/kubectl/polymorphichelpers/protocolsforobject_test.go index 6a94cef76b9..d31da061485 100644 --- a/pkg/kubectl/polymorphichelpers/protocolsforobject_test.go +++ b/pkg/kubectl/polymorphichelpers/protocolsforobject_test.go @@ -39,7 +39,23 @@ func TestProtocolsForObject(t *testing.T) { Ports: []corev1.ContainerPort{ { ContainerPort: 101, - Protocol: "tcp", + Protocol: "TCP", + }, + }, + }, + }, + }, + }, + }, + // No protocol--should default to TCP. + { + object: &corev1.Pod{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Ports: []corev1.ContainerPort{ + { + ContainerPort: 101, }, }, }, @@ -53,7 +69,19 @@ func TestProtocolsForObject(t *testing.T) { Ports: []corev1.ServicePort{ { Port: 101, - Protocol: "tcp", + Protocol: "TCP", + }, + }, + }, + }, + }, + // No protocol for service port--default to TCP + { + object: &corev1.Service{ + Spec: corev1.ServiceSpec{ + Ports: []corev1.ServicePort{ + { + Port: 101, }, }, }, @@ -69,7 +97,7 @@ func TestProtocolsForObject(t *testing.T) { Ports: []corev1.ContainerPort{ { ContainerPort: 101, - Protocol: "tcp", + Protocol: "TCP", }, }, }, @@ -89,7 +117,7 @@ func TestProtocolsForObject(t *testing.T) { Ports: []corev1.ContainerPort{ { ContainerPort: 101, - Protocol: "tcp", + Protocol: "TCP", }, }, }, @@ -109,7 +137,7 @@ func TestProtocolsForObject(t *testing.T) { Ports: []corev1.ContainerPort{ { ContainerPort: 101, - Protocol: "tcp", + Protocol: "TCP", }, }, }, @@ -124,7 +152,7 @@ func TestProtocolsForObject(t *testing.T) { expectErr: true, }, } - expectedPorts := map[string]string{"101": "tcp"} + expectedPorts := map[string]string{"101": "TCP"} for _, test := range tests { actual, err := protocolsForObject(test.object)