cmd/tailscale/cli: fix ai comments and fix a test

Signed-off-by: KevinLiang10 <37811973+KevinLiang10@users.noreply.github.com>
This commit is contained in:
KevinLiang10 2025-06-04 13:32:18 -04:00
parent b8f2e27675
commit 1ec61b9992
3 changed files with 77 additions and 68 deletions

View File

@ -558,15 +558,15 @@ func (e *serveEnv) handleTCPServe(ctx context.Context, srcType string, srcPort u
fwdAddr := "127.0.0.1:" + dstPortStr
if sc.IsServingWeb(srcPort, "") {
return fmt.Errorf("cannot serve TCP; already serving web on %d", srcPort)
}
dnsName, err := e.getSelfDNSName(ctx)
if err != nil {
return err
}
if sc.IsServingWeb(srcPort, dnsName) {
return fmt.Errorf("cannot serve TCP; already serving web on %d", srcPort)
}
sc.SetTCPForwarding(srcPort, fwdAddr, terminateTLS, dnsName)
if !reflect.DeepEqual(cursc, sc) {

View File

@ -47,7 +47,7 @@ type bgBoolFlag struct {
SetByUser bool // tracks if the flag was set by the user
}
// Set sets the boolean flag and wether it's explicitly set by user based on the string value.
// Set sets the boolean flag and whether it's explicitly set by user based on the string value.
func (b *bgBoolFlag) Set(s string) error {
if s == "true" {
b.Value = true
@ -238,9 +238,11 @@ func (e *serveEnv) runServeCombined(subcmd serveMode) execFunc {
}
return e.lc.SetServeConfig(ctx, sc)
}
if err := e.validateArgs(subcmd, args); err != nil {
return err
}
ctx, cancel := signal.NotifyContext(ctx, os.Interrupt)
defer cancel()
@ -265,7 +267,7 @@ func (e *serveEnv) runServeCombined(subcmd serveMode) execFunc {
return fmt.Errorf("failed to clean the mount point: %w", err)
}
srvType, srvPort, wasDefaultServe, err := srvTypeAndPortFromFlags(e)
srvType, srvPort, isDefaultService, err := srvTypeAndPortFromFlags(e)
if err != nil {
fmt.Fprintf(e.stderr(), "error: %v\n\n", err)
return errHelpFunc(subcmd)
@ -313,7 +315,7 @@ func (e *serveEnv) runServeCombined(subcmd serveMode) execFunc {
if forService {
err = tailcfg.ServiceName(e.service).Validate()
if err != nil {
return fmt.Errorf("failed to parse service name: %w", err)
return fmt.Errorf("invalid service name: %w", err)
}
dnsName = e.service
}
@ -348,7 +350,7 @@ func (e *serveEnv) runServeCombined(subcmd serveMode) execFunc {
}
var msg string
if turnOff && !wasDefaultServe {
if turnOff && !isDefaultService {
// only unset serve when trying to unset with type and port flags.
err = e.unsetServe(sc, st, dnsName, srvType, srvPort, mount)
} else {
@ -511,7 +513,7 @@ var (
msgServeAvailable = "Available within your tailnet:"
msgServiceIPNotAssigned = "This service doesn't have VIPs assigned yet, once VIP is assigned, it will be available in your Tailnet as:"
msgRunningInBackground = "%s started and running in the background."
msgRunningTunServie = "IPv4 and IPv6 traffic to %s is being routed to your operating system."
msgRunningTunService = "IPv4 and IPv6 traffic to %s is being routed to your operating system."
msgDisableProxy = "To disable the proxy, run: tailscale %s --%s=%d off"
msgDisableServiceProxy = "To disable the proxy, run: tailscale serve --service=%s --%s=%d off"
msgDisableServiceTun = "To disable the service in TUN mode, run: tailscale serve --service=%s --tun off"
@ -571,7 +573,7 @@ func (e *serveEnv) messageForPort(sc *ipn.ServeConfig, st *ipnstate.Status, dnsN
output.WriteString("\n\n")
svc := sc.FindServiceConfig(svcName)
if srvType == serveTypeTun && svc.Tun {
output.WriteString(fmt.Sprintf(msgRunningTunServie, host))
output.WriteString(fmt.Sprintf(msgRunningTunService, host))
output.WriteString("\n")
output.WriteString(fmt.Sprintf(msgDisableServiceTun, dnsName))
output.WriteString("\n")
@ -762,7 +764,7 @@ func (e *serveEnv) unsetServe(sc *ipn.ServeConfig, st *ipnstate.Status, dnsName
return nil
}
func srvTypeAndPortFromFlags(e *serveEnv) (srvType serveType, srvPort uint16, wasDefault bool, err error) {
func srvTypeAndPortFromFlags(e *serveEnv) (srvType serveType, srvPort uint16, isDefaultService bool, err error) {
sourceMap := map[serveType]uint{
serveTypeHTTP: e.http,
serveTypeHTTPS: e.https,
@ -771,6 +773,7 @@ func srvTypeAndPortFromFlags(e *serveEnv) (srvType serveType, srvPort uint16, wa
}
var srcTypeCount int
var defaultFlags bool
for k, v := range sourceMap {
if v != 0 {
@ -780,14 +783,14 @@ func srvTypeAndPortFromFlags(e *serveEnv) (srvType serveType, srvPort uint16, wa
srcTypeCount++
srvType = k
srvPort = uint16(v)
wasDefault = false
defaultFlags = false
}
}
if e.tun {
srcTypeCount++
srvType = serveTypeTun
wasDefault = false
defaultFlags = false
}
if srcTypeCount > 1 {
@ -795,10 +798,9 @@ func srvTypeAndPortFromFlags(e *serveEnv) (srvType serveType, srvPort uint16, wa
} else if srcTypeCount == 0 {
srvType = serveTypeHTTPS
srvPort = 443
wasDefault = true
defaultFlags = true
}
return srvType, srvPort, wasDefault, nil
return srvType, srvPort, defaultFlags && e.service != "", nil
}
// isLegacyInvocation helps transition customers who have been using the beta
@ -912,7 +914,7 @@ func (e *serveEnv) removeWebServe(sc *ipn.ServeConfig, st *ipnstate.Status, dnsN
dnsNameForService := svcName.WithoutPrefix() + "." + st.CurrentTailnet.MagicDNSSuffix
hp = ipn.HostPort(net.JoinHostPort(dnsNameForService, portStr))
if svc, ok := sc.Services[svcName]; !ok || svc == nil {
return errors.New("error: service does not exist")
return errors.New("service does not exist")
} else {
webServeMap = svc.Web
}
@ -941,7 +943,7 @@ func (e *serveEnv) removeWebServe(sc *ipn.ServeConfig, st *ipnstate.Status, dnsN
}
if !targetExists {
return errors.New("error: handler does not exist")
return errors.New("handler does not exist")
}
if len(mounts) > 1 {
@ -966,7 +968,7 @@ func (e *serveEnv) removeTCPServe(sc *ipn.ServeConfig, dnsName string, src uint1
return nil
}
if sc.GetTCPPortHandler(src, dnsName) == nil {
return errors.New("error: serve config does not exist")
return errors.New("serve config does not exist")
}
if sc.IsServingWeb(src, dnsName) {
return fmt.Errorf("unable to remove; serving web, not TCP forwarding on serve port %d", src)
@ -982,10 +984,10 @@ func (e *serveEnv) removeTunServe(sc *ipn.ServeConfig, dnsName string) error {
svcName := tailcfg.ServiceName(dnsName)
svc, ok := sc.Services[svcName]
if !ok || svc == nil {
return errors.New("error: service does not exist")
return errors.New("service does not exist")
}
if !svc.Tun {
return errors.New("error: service is not being served in TUN mode")
return errors.New("service is not being served in TUN mode")
}
delete(sc.Services, svcName)
if len(sc.Services) == 0 {

View File

@ -553,7 +553,7 @@ func TestServeDevConfigMutations(t *testing.T) {
},
},
},
{
{ // error here
name: "combos",
steps: []step{
{
@ -1063,65 +1063,73 @@ func TestValidateConfig(t *testing.T) {
func TestSrcTypeFromFlags(t *testing.T) {
tests := []struct {
name string
env *serveEnv
expectedType serveType
expectedPort uint16
expectedErr bool
expectedWasDefault bool
name string
env *serveEnv
expectedType serveType
expectedPort uint16
expectedErr bool
expectedIsDefaultService bool
}{
{
name: "only http set",
env: &serveEnv{http: 80},
expectedType: serveTypeHTTP,
expectedPort: 80,
expectedErr: false,
expectedWasDefault: false,
name: "only http set",
env: &serveEnv{http: 80},
expectedType: serveTypeHTTP,
expectedPort: 80,
expectedErr: false,
expectedIsDefaultService: false,
},
{
name: "only https set",
env: &serveEnv{https: 10000},
expectedType: serveTypeHTTPS,
expectedPort: 10000,
expectedErr: false,
expectedWasDefault: false,
name: "only https set",
env: &serveEnv{https: 10000},
expectedType: serveTypeHTTPS,
expectedPort: 10000,
expectedErr: false,
expectedIsDefaultService: false,
},
{
name: "only tcp set",
env: &serveEnv{tcp: 8000},
expectedType: serveTypeTCP,
expectedPort: 8000,
expectedErr: false,
expectedWasDefault: false,
name: "only tcp set",
env: &serveEnv{tcp: 8000},
expectedType: serveTypeTCP,
expectedPort: 8000,
expectedErr: false,
expectedIsDefaultService: false,
},
{
name: "only tls-terminated-tcp set",
env: &serveEnv{tlsTerminatedTCP: 8080},
expectedType: serveTypeTLSTerminatedTCP,
expectedPort: 8080,
expectedErr: false,
expectedWasDefault: false,
name: "only tls-terminated-tcp set",
env: &serveEnv{tlsTerminatedTCP: 8080},
expectedType: serveTypeTLSTerminatedTCP,
expectedPort: 8080,
expectedErr: false,
expectedIsDefaultService: false,
},
{
name: "defaults to https, port 443",
env: &serveEnv{},
expectedType: serveTypeHTTPS,
expectedPort: 443,
expectedErr: false,
expectedWasDefault: true,
name: "defaults to https, port 443",
env: &serveEnv{},
expectedType: serveTypeHTTPS,
expectedPort: 443,
expectedErr: false,
expectedIsDefaultService: false,
},
{
name: "multiple types set",
env: &serveEnv{http: 80, https: 443},
expectedPort: 0,
expectedErr: true,
expectedWasDefault: false,
name: "defaults to https, port 443 for service",
env: &serveEnv{service: "svc:foo"},
expectedType: serveTypeHTTPS,
expectedPort: 443,
expectedErr: false,
expectedIsDefaultService: true,
},
{
name: "multiple types set",
env: &serveEnv{http: 80, https: 443},
expectedPort: 0,
expectedErr: true,
expectedIsDefaultService: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
srcType, srcPort, explicitSet, err := srvTypeAndPortFromFlags(tt.env)
srcType, srcPort, isDefaultService, err := srvTypeAndPortFromFlags(tt.env)
if (err != nil) != tt.expectedErr {
t.Errorf("Expected error: %v, got: %v", tt.expectedErr, err)
}
@ -1131,8 +1139,8 @@ func TestSrcTypeFromFlags(t *testing.T) {
if srcPort != tt.expectedPort {
t.Errorf("Expected srcPort: %d, got: %d", tt.expectedPort, srcPort)
}
if explicitSet != tt.expectedWasDefault {
t.Errorf("Expected defaultFlag: %v, got: %v", tt.expectedWasDefault, explicitSet)
if isDefaultService != tt.expectedIsDefaultService {
t.Errorf("Expected defaultFlag: %v, got: %v", tt.expectedIsDefaultService, isDefaultService)
}
})
}
@ -1445,7 +1453,7 @@ func TestMessageForPort(t *testing.T) {
expected: strings.Join([]string{
msgServeAvailable,
"",
fmt.Sprintf(msgRunningTunServie, "foo.test.ts.net"),
fmt.Sprintf(msgRunningTunService, "foo.test.ts.net"),
fmt.Sprintf(msgDisableServiceTun, "svc:foo"),
fmt.Sprintf(msgDisableService, "svc:foo"),
}, "\n"),
@ -1786,7 +1794,6 @@ func TestSetServe(t *testing.T) {
t.Fatalf("got no error; expected error.")
}
if !tt.expectErr && !reflect.DeepEqual(tt.cfg, tt.expected) {
t.Logf("got: %v", tt.cfg.Services["svc:bar"].TCP[80])
t.Fatalf("got: %v; expected: %v", tt.cfg, tt.expected)
}
})