Skip to content

Commit

Permalink
Add unit test for port forwarding events
Browse files Browse the repository at this point in the history
  • Loading branch information
Priya Wadhwa committed Jun 17, 2019
1 parent 6f9ac5a commit 28e44de
Show file tree
Hide file tree
Showing 2 changed files with 141 additions and 2 deletions.
8 changes: 6 additions & 2 deletions pkg/skaffold/kubernetes/port_forward.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ type kubectlForwarder struct{}
var (
// For testing
retrieveAvailablePort = util.GetAvailablePort
portForwardEvent = sendPortForwardEvent
)

// Forward port-forwards a pod using kubectl port-forward
Expand All @@ -96,8 +97,6 @@ func (*kubectlForwarder) Forward(parentCtx context.Context, pfe *portForwardEntr
return errors.Wrapf(err, "port forwarding pod: %s/%s, port: %d to local port: %d, err: %s", pfe.namespace, pfe.podName, pfe.port, pfe.localPort, buf.String())
}

event.PortForwarded(pfe.localPort, pfe.port, pfe.podName, pfe.containerName, pfe.namespace, pfe.portName, string(constants.Pod), pfe.podName)

go cmd.Wait()

return nil
Expand Down Expand Up @@ -198,11 +197,16 @@ func (p *PortForwarder) portForwardPod(ctx context.Context, pod *v1.Pod) error {
if err := p.forward(ctx, entry); err != nil {
return errors.Wrap(err, "failed to forward port")
}
portForwardEvent(entry)
}
}
return nil
}

func sendPortForwardEvent(entry *portForwardEntry) {
event.PortForwarded(entry.localPort, entry.port, entry.podName, entry.containerName, entry.namespace, entry.portName, string(constants.Pod), entry.podName)
}

func (p *PortForwarder) getCurrentEntry(pod *v1.Pod, c v1.Container, port v1.ContainerPort, resourceVersion int) *portForwardEntry {
// determine if we have seen this before
entry := &portForwardEntry{
Expand Down
135 changes: 135 additions & 0 deletions pkg/skaffold/kubernetes/port_forward_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,7 @@ func TestPortForwardPod(t *testing.T) {
taken := map[int]struct{}{}

t.Override(&retrieveAvailablePort, mockRetrieveAvailablePort(taken, test.availablePorts))
t.Override(&portForwardEvent, func(*portForwardEntry) {})

p := NewPortForwarder(ioutil.Discard, NewImageList(), []string{""})
if test.forwarder == nil {
Expand Down Expand Up @@ -479,3 +480,137 @@ func TestPortForwardEntryKey(t *testing.T) {
t.Fatal("key should not contain podname, otherwise containers will be mapped to a new port every time a pod is regenerated. See Issues #1815 and #1594.")
}
}

func TestPortForwardEvents(t *testing.T) {
var tests = []struct {
description string
pods []*v1.Pod
availablePorts []int
expectedNumEvents int
shouldErr bool
}{
{
description: "one port forward event",
expectedNumEvents: 1,
availablePorts: []int{8080},
pods: []*v1.Pod{
{
ObjectMeta: metav1.ObjectMeta{
Name: "podname",
ResourceVersion: "1",
Namespace: "namespace",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "containername",
Ports: []v1.ContainerPort{
{
ContainerPort: 8080,
Name: "portname",
},
},
},
},
},
},
},
}, {
description: "two port forward events",
expectedNumEvents: 2,
availablePorts: []int{8080, 50051},
pods: []*v1.Pod{
{
ObjectMeta: metav1.ObjectMeta{
Name: "podname",
ResourceVersion: "1",
Namespace: "namespace",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "containername",
Ports: []v1.ContainerPort{
{
ContainerPort: 8080,
Name: "portname",
},
},
},
},
},
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "podname2",
ResourceVersion: "1",
Namespace: "namespace2",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "containername2",
Ports: []v1.ContainerPort{
{
ContainerPort: 50051,
Name: "portname2",
},
},
},
},
},
},
},
}, {
description: "error port forwarding, no port forward events",
shouldErr: true,
expectedNumEvents: 0,
availablePorts: []int{8080},
pods: []*v1.Pod{
{
ObjectMeta: metav1.ObjectMeta{
Name: "podname",
ResourceVersion: "10000000000a",
Namespace: "namespace",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "containername",
Ports: []v1.ContainerPort{
{
ContainerPort: 8080,
Name: "portname",
},
},
},
},
},
},
},
},
}

for _, test := range tests {
testutil.Run(t, test.description, func(t *testutil.T) {
taken := map[int]struct{}{}
t.Override(&retrieveAvailablePort, mockRetrieveAvailablePort(taken, test.availablePorts))
numEvents := 0
t.Override(&portForwardEvent, func(*portForwardEntry) {
numEvents++
})

p := NewPortForwarder(ioutil.Discard, NewImageList(), []string{""})
p.Forwarder = newTestForwarder(nil)

for _, pod := range test.pods {
err := p.portForwardPod(context.Background(), pod)
t.CheckError(test.shouldErr, err)
}

if test.expectedNumEvents != numEvents {
t.Errorf("Number of events differ. Expected: %d, Actual: %d", test.expectedNumEvents, numEvents)
}
})
}
}

0 comments on commit 28e44de

Please sign in to comment.