diff --git a/tailnet/conn.go b/tailnet/conn.go index 59ddefc636d13..89b3b7d483d0c 100644 --- a/tailnet/conn.go +++ b/tailnet/conn.go @@ -354,6 +354,13 @@ func NewConn(options *Options) (conn *Conn, err error) { return server, nil } +// A FQDN to be mapped to `tsaddr.CoderServiceIPv6`. This address can be used +// when you want to know if Coder Connect is running, but are not trying to +// connect to a specific known workspace. +const IsCoderConnectEnabledFQDNString = "is.coder--connect--enabled--right--now.coder." + +var IsCoderConnectEnabledFQDN, _ = dnsname.ToFQDN(IsCoderConnectEnabledFQDNString) + type ServicePrefix [6]byte var ( diff --git a/tailnet/controllers.go b/tailnet/controllers.go index bf2ec1d964f56..7a077ffabfaa0 100644 --- a/tailnet/controllers.go +++ b/tailnet/controllers.go @@ -16,6 +16,7 @@ import ( "golang.org/x/xerrors" "storj.io/drpc" "storj.io/drpc/drpcerr" + "tailscale.com/net/tsaddr" "tailscale.com/tailcfg" "tailscale.com/util/dnsname" @@ -1265,6 +1266,7 @@ func (t *tunnelUpdater) updateDNSNamesLocked() map[dnsname.FQDN][]netip.Addr { } } } + names[IsCoderConnectEnabledFQDN] = []netip.Addr{tsaddr.CoderServiceIPv6()} return names } diff --git a/tailnet/controllers_test.go b/tailnet/controllers_test.go index 16f254e3240a7..3cfa47e3adca2 100644 --- a/tailnet/controllers_test.go +++ b/tailnet/controllers_test.go @@ -22,6 +22,7 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" "storj.io/drpc" "storj.io/drpc/drpcerr" + "tailscale.com/net/tsaddr" "tailscale.com/tailcfg" "tailscale.com/types/key" "tailscale.com/util/dnsname" @@ -1563,13 +1564,14 @@ func TestTunnelAllWorkspaceUpdatesController_Initial(t *testing.T) { // Also triggers setting DNS hosts expectedDNS := map[dnsname.FQDN][]netip.Addr{ - "w1a1.w1.me.coder.": {ws1a1IP}, - "w2a1.w2.me.coder.": {w2a1IP}, - "w2a2.w2.me.coder.": {w2a2IP}, - "w1a1.w1.testy.coder.": {ws1a1IP}, - "w2a1.w2.testy.coder.": {w2a1IP}, - "w2a2.w2.testy.coder.": {w2a2IP}, - "w1.coder.": {ws1a1IP}, + "w1a1.w1.me.coder.": {ws1a1IP}, + "w2a1.w2.me.coder.": {w2a1IP}, + "w2a2.w2.me.coder.": {w2a2IP}, + "w1a1.w1.testy.coder.": {ws1a1IP}, + "w2a1.w2.testy.coder.": {w2a1IP}, + "w2a2.w2.testy.coder.": {w2a2IP}, + "w1.coder.": {ws1a1IP}, + tailnet.IsCoderConnectEnabledFQDNString: {tsaddr.CoderServiceIPv6()}, } dnsCall := testutil.RequireRecvCtx(ctx, t, fDNS.calls) require.Equal(t, expectedDNS, dnsCall.hosts) @@ -1661,9 +1663,10 @@ func TestTunnelAllWorkspaceUpdatesController_DeleteAgent(t *testing.T) { // DNS for w1a1 expectedDNS := map[dnsname.FQDN][]netip.Addr{ - "w1a1.w1.testy.coder.": {ws1a1IP}, - "w1a1.w1.me.coder.": {ws1a1IP}, - "w1.coder.": {ws1a1IP}, + "w1a1.w1.testy.coder.": {ws1a1IP}, + "w1a1.w1.me.coder.": {ws1a1IP}, + "w1.coder.": {ws1a1IP}, + tailnet.IsCoderConnectEnabledFQDNString: {tsaddr.CoderServiceIPv6()}, } dnsCall := testutil.RequireRecvCtx(ctx, t, fDNS.calls) require.Equal(t, expectedDNS, dnsCall.hosts) @@ -1716,9 +1719,10 @@ func TestTunnelAllWorkspaceUpdatesController_DeleteAgent(t *testing.T) { // DNS contains only w1a2 expectedDNS = map[dnsname.FQDN][]netip.Addr{ - "w1a2.w1.testy.coder.": {ws1a2IP}, - "w1a2.w1.me.coder.": {ws1a2IP}, - "w1.coder.": {ws1a2IP}, + "w1a2.w1.testy.coder.": {ws1a2IP}, + "w1a2.w1.me.coder.": {ws1a2IP}, + "w1.coder.": {ws1a2IP}, + tailnet.IsCoderConnectEnabledFQDNString: {tsaddr.CoderServiceIPv6()}, } dnsCall = testutil.RequireRecvCtx(ctx, t, fDNS.calls) require.Equal(t, expectedDNS, dnsCall.hosts) @@ -1798,9 +1802,10 @@ func TestTunnelAllWorkspaceUpdatesController_DNSError(t *testing.T) { // DNS for w1a1 expectedDNS := map[dnsname.FQDN][]netip.Addr{ - "w1a1.w1.me.coder.": {ws1a1IP}, - "w1a1.w1.testy.coder.": {ws1a1IP}, - "w1.coder.": {ws1a1IP}, + "w1a1.w1.me.coder.": {ws1a1IP}, + "w1a1.w1.testy.coder.": {ws1a1IP}, + "w1.coder.": {ws1a1IP}, + tailnet.IsCoderConnectEnabledFQDNString: {tsaddr.CoderServiceIPv6()}, } dnsCall := testutil.RequireRecvCtx(ctx, t, fDNS.calls) require.Equal(t, expectedDNS, dnsCall.hosts) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy