func portForward()

in pkg/dubboctl/cmd/subcmd/dashboard_all_cmds.go [149:207]


func portForward(args *DashboardCommonArgs, compName operator.ComponentName, writer io.Writer) error {
	// process args
	var podPort int
	podPort = ComponentPortMap[compName]
	if args.port == 0 {
		args.port = podPort
	}

	// prepare PortForward args
	labelSelector := ComponentSelectorMap[compName]
	cfg, err := kube.BuildConfig(args.KubeConfigPath, args.Context)
	if err != nil {
		return fmt.Errorf("build kube config failed, err: %s", err)
	}
	// todo: unify kube client
	cli, err := kubernetes.NewForConfig(cfg)
	if err != nil {
		return fmt.Errorf("create kube RESTClient failed, err: %s", err)
	}
	pods, err := cli.CoreV1().Pods(args.namespace).List(context.Background(), metav1.ListOptions{
		LabelSelector: labelSelector,
	})
	if len(pods.Items) < 1 {
		return fmt.Errorf("no %s pods found", string(compName))
	}
	// use name of the first pod
	podName := pods.Items[0].Name

	pf, err := kube.NewPortForward(podName, args.namespace, args.host, args.port, podPort, cfg)
	if err != nil {
		return fmt.Errorf("create PortForward failed, err: %s", err)
	}
	if err := pf.Run(); err != nil {
		pf.Stop()
		return fmt.Errorf("PortForward running failed, err: %s", err)
	}

	logger.CmdSugar().Infof("PortForward to %s pod is running", podName)

	// wait for interrupt
	go func() {
		signals := make(chan os.Signal, 1)
		signal.Notify(signals, os.Interrupt)
		defer signal.Stop(signals)
		<-signals
		logger.CmdSugar().Info("PortForward stops")
		pf.Stop()
	}()

	if args.openBrowser {
		address := net.JoinHostPort(args.host, strconv.Itoa(args.port))
		url := "http://" + address
		openBrowser(url, writer)
	}

	pf.Wait()

	return nil
}