From ef2eaa4f8f7ce85478310775a134047a77a8e310 Mon Sep 17 00:00:00 2001 From: Marius Ziemke Date: Sun, 8 Mar 2020 17:49:18 +0100 Subject: [PATCH 1/2] fix kubectl port-forward for services with explicit local port --- .../pkg/cmd/portforward/portforward.go | 5 +++- .../pkg/cmd/portforward/portforward_test.go | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward.go b/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward.go index 3d656a8b5135..ceaec5ab3fc9 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward.go @@ -185,7 +185,10 @@ func translateServicePortToTargetPort(ports []string, svc corev1.Service, pod co return nil, err } - if int32(portnum) != containerPort || localPort == "" { + // should fail when localPort is empty (=> use random local port) + localportnum, err := strconv.Atoi(localPort) + + if int32(portnum) != containerPort || localPort == "" || (int32(localportnum) != containerPort && err == nil) { translated = append(translated, fmt.Sprintf("%s:%d", localPort, containerPort)) } else { translated = append(translated, fmt.Sprintf("%d", containerPort)) diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward_test.go b/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward_test.go index 06fa258c28ca..0ec6b934f0c4 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward_test.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward_test.go @@ -209,6 +209,35 @@ func TestTranslateServicePortToTargetPort(t *testing.T) { translated: []string{":8080"}, err: false, }, + { + name: "test success 1 (int port with explicit local port)", + svc: corev1.Service{ + Spec: corev1.ServiceSpec{ + Ports: []corev1.ServicePort{ + { + Port: 8080, + TargetPort: intstr.FromInt(8080), + }, + }, + }, + }, + pod: corev1.Pod{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Ports: []corev1.ContainerPort{ + { + Name: "http", + ContainerPort: int32(8080)}, + }, + }, + }, + }, + }, + ports: []string{"8000:8080"}, + translated: []string{"8000:8080"}, + err: false, + }, { name: "test success 2 (clusterIP: None)", svc: corev1.Service{ From dfeb617cc0e6a7b4c595eb5f7e927e9ceec1e18d Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Mon, 23 Mar 2020 22:04:14 -0400 Subject: [PATCH 2/2] Simplify dual or single port logic --- .../k8s.io/kubectl/pkg/cmd/portforward/portforward.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward.go b/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward.go index ceaec5ab3fc9..8fd25b87d861 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward.go @@ -185,13 +185,13 @@ func translateServicePortToTargetPort(ports []string, svc corev1.Service, pod co return nil, err } - // should fail when localPort is empty (=> use random local port) - localportnum, err := strconv.Atoi(localPort) + // convert the resolved target port back to a string + remotePort = strconv.Itoa(int(containerPort)) - if int32(portnum) != containerPort || localPort == "" || (int32(localportnum) != containerPort && err == nil) { - translated = append(translated, fmt.Sprintf("%s:%d", localPort, containerPort)) + if localPort != remotePort { + translated = append(translated, fmt.Sprintf("%s:%s", localPort, remotePort)) } else { - translated = append(translated, fmt.Sprintf("%d", containerPort)) + translated = append(translated, remotePort) } } return translated, nil