@ -46,7 +46,7 @@ func TestContainerBoot(t *testing.T) {
if err := exec . Command ( "go" , "build" , "-ldflags" , "-X main.testSleepDuration=1ms" , "-o" , boot , "tailscale.com/cmd/containerboot" ) . Run ( ) ; err != nil {
t . Fatalf ( "Building containerboot: %v" , err )
}
egressStatus := egressSvcStatus ( "foo" , "foo.tailnetxyz.ts.net" )
egressStatus := egressSvcStatus ( "foo" , "foo.tailnetxyz.ts.net" , "100.64.0.2" )
metricsURL := func ( port int ) string {
return fmt . Sprintf ( "http://127.0.0.1:%d/metrics" , port )
@ -99,7 +99,7 @@ func TestContainerBoot(t *testing.T) {
NetMap : & netmap . NetworkMap {
SelfNode : ( & tailcfg . Node {
StableID : tailcfg . StableNodeID ( "myID" ) ,
Name : "test-node.test.ts.net ",
Name : "test-node.test.ts.net . ",
Addresses : [ ] netip . Prefix { netip . MustParsePrefix ( "100.64.0.1/32" ) } ,
} ) . View ( ) ,
} ,
@ -356,7 +356,7 @@ func TestContainerBoot(t *testing.T) {
return testCase {
Env : map [ string ] string {
"TS_AUTHKEY" : "tskey-key" ,
"TS_TAILNET_TARGET_FQDN" : "ipv6-node.test.ts.net ", // resolves to IPv6 address
"TS_TAILNET_TARGET_FQDN" : "ipv6-node.test.ts.net . ", // resolves to IPv6 address
"TS_USERSPACE" : "false" ,
"TS_TEST_FAKE_NETFILTER_6" : "false" ,
} ,
@ -377,13 +377,13 @@ func TestContainerBoot(t *testing.T) {
NetMap : & netmap . NetworkMap {
SelfNode : ( & tailcfg . Node {
StableID : tailcfg . StableNodeID ( "myID" ) ,
Name : "test-node.test.ts.net ",
Name : "test-node.test.ts.net . ",
Addresses : [ ] netip . Prefix { netip . MustParsePrefix ( "100.64.0.1/32" ) } ,
} ) . View ( ) ,
Peers : [ ] tailcfg . NodeView {
( & tailcfg . Node {
StableID : tailcfg . StableNodeID ( "ipv6ID" ) ,
Name : "ipv6-node.test.ts.net ",
Name : "ipv6-node.test.ts.net . ",
Addresses : [ ] netip . Prefix { netip . MustParsePrefix ( "::1/128" ) } ,
} ) . View ( ) ,
} ,
@ -481,7 +481,7 @@ func TestContainerBoot(t *testing.T) {
Notify : runningNotify ,
WantKubeSecret : map [ string ] string {
"authkey" : "tskey-key" ,
"device_fqdn" : "test-node.test.ts.net ",
"device_fqdn" : "test-node.test.ts.net . ",
"device_id" : "myID" ,
"device_ips" : ` ["100.64.0.1"] ` ,
kubetypes . KeyCapVer : capver ,
@ -580,7 +580,7 @@ func TestContainerBoot(t *testing.T) {
"/usr/bin/tailscale --socket=/tmp/tailscaled.sock set --accept-dns=false" ,
} ,
WantKubeSecret : map [ string ] string {
"device_fqdn" : "test-node.test.ts.net ",
"device_fqdn" : "test-node.test.ts.net . ",
"device_id" : "myID" ,
"device_ips" : ` ["100.64.0.1"] ` ,
kubetypes . KeyCapVer : capver ,
@ -613,7 +613,7 @@ func TestContainerBoot(t *testing.T) {
Notify : runningNotify ,
WantKubeSecret : map [ string ] string {
"authkey" : "tskey-key" ,
"device_fqdn" : "test-node.test.ts.net ",
"device_fqdn" : "test-node.test.ts.net . ",
"device_id" : "myID" ,
"device_ips" : ` ["100.64.0.1"] ` ,
kubetypes . KeyCapVer : capver ,
@ -625,14 +625,14 @@ func TestContainerBoot(t *testing.T) {
NetMap : & netmap . NetworkMap {
SelfNode : ( & tailcfg . Node {
StableID : tailcfg . StableNodeID ( "newID" ) ,
Name : "new-name.test.ts.net ",
Name : "new-name.test.ts.net . ",
Addresses : [ ] netip . Prefix { netip . MustParsePrefix ( "100.64.0.1/32" ) } ,
} ) . View ( ) ,
} ,
} ,
WantKubeSecret : map [ string ] string {
"authkey" : "tskey-key" ,
"device_fqdn" : "new-name.test.ts.net ",
"device_fqdn" : "new-name.test.ts.net . ",
"device_id" : "newID" ,
"device_ips" : ` ["100.64.0.1"] ` ,
kubetypes . KeyCapVer : capver ,
@ -927,7 +927,7 @@ func TestContainerBoot(t *testing.T) {
Notify : runningNotify ,
WantKubeSecret : map [ string ] string {
"authkey" : "tskey-key" ,
"device_fqdn" : "test-node.test.ts.net ",
"device_fqdn" : "test-node.test.ts.net . ",
"device_id" : "myID" ,
"device_ips" : ` ["100.64.0.1"] ` ,
"https_endpoint" : "no-https" ,
@ -963,11 +963,27 @@ func TestContainerBoot(t *testing.T) {
} ,
} ,
{
Notify : runningNotify ,
Notify : & ipn . Notify {
State : ptr . To ( ipn . Running ) ,
NetMap : & netmap . NetworkMap {
SelfNode : ( & tailcfg . Node {
StableID : tailcfg . StableNodeID ( "myID" ) ,
Name : "test-node.test.ts.net." ,
Addresses : [ ] netip . Prefix { netip . MustParsePrefix ( "100.64.0.1/32" ) } ,
} ) . View ( ) ,
Peers : [ ] tailcfg . NodeView {
( & tailcfg . Node {
StableID : tailcfg . StableNodeID ( "fooID" ) ,
Name : "foo.tailnetxyz.ts.net." ,
Addresses : [ ] netip . Prefix { netip . MustParsePrefix ( "100.64.0.2/32" ) } ,
} ) . View ( ) ,
} ,
} ,
} ,
WantKubeSecret : map [ string ] string {
"egress-services" : string ( mustJSON ( t , egressStatus ) ) ,
"authkey" : "tskey-key" ,
"device_fqdn" : "test-node.test.ts.net" ,
"device_fqdn" : "test-node.test.ts.net . ",
"device_id" : "myID" ,
"device_ips" : ` ["100.64.0.1"] ` ,
kubetypes . KeyCapVer : capver ,
@ -1338,6 +1354,11 @@ func (lc *localAPI) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
w . Write ( [ ] byte ( "fake metrics" ) )
return
case "/localapi/v0/prefs" :
if r . Method != "GET" {
panic ( fmt . Sprintf ( "unsupported method %q" , r . Method ) )
}
return
default :
panic ( fmt . Sprintf ( "unsupported path %q" , r . URL . Path ) )
}
@ -1563,13 +1584,14 @@ func mustJSON(t *testing.T, v any) []byte {
}
// egress services status given one named tailnet target specified by FQDN. As written by the proxy to its state Secret.
func egressSvcStatus ( name , fqdn string ) egressservices . Status {
func egressSvcStatus ( name , fqdn , ip string ) egressservices . Status {
return egressservices . Status {
Services : map [ string ] * egressservices . ServiceStatus {
name : {
TailnetTarget : egressservices . TailnetTarget {
FQDN : fqdn ,
} ,
TailnetTargetIPs : [ ] netip . Addr { netip . MustParseAddr ( ip ) } ,
} ,
} ,
}