func()

in portforward/portforward.go [67:110]


func (pf *PodPortForwarder) Start() error {
	transport, upgrader, err := spdy.RoundTripperFor(pf.restCfg)
	if err != nil {
		return fmt.Errorf("failed to create spdy transport: %w", err)
	}

	dialer := spdy.NewDialer(
		upgrader,
		&http.Client{Transport: transport},
		"POST",
		pf.portforwardURL,
	)

	startCh := make(chan struct{})

	// pick available local port randomly.
	kubePortForwarder, err := kubepf.New(
		dialer,
		[]string{fmt.Sprintf("0:%d", pf.targetPort)},
		nil,
		startCh,
		&debugLogger{},
		&debugLogger{},
	)
	if err != nil {
		return fmt.Errorf("failed to init kube port forward: %w", err)
	}

	errCh := make(chan error, 1)
	go func() {
		errCh <- kubePortForwarder.ForwardPorts()
	}()

	select {
	case <-startCh:
	case err := <-errCh:
		return fmt.Errorf("failed to start kube port forward: %w", err)
	case <-time.After(120 * time.Second):
		return fmt.Errorf("timeout to start kube port forward")
	}

	pf.portForwarder = kubePortForwarder
	return nil
}