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
}