@ -28,6 +28,7 @@ import (
expect "github.com/google/goexpect"
"golang.org/x/crypto/ssh"
"inet.af/netaddr"
"tailscale.com/tstest/integration/testcontrol"
)
@ -298,17 +299,17 @@ func TestVMIntegrationEndToEnd(t *testing.T) {
{ "fedora-34" , "https://download.fedoraproject.org/pub/fedora/linux/releases/34/Cloud/x86_64/images/Fedora-Cloud-Base-34-1.2.x86_64.qcow2" , "b9b621b26725ba95442d9a56cbaa054784e0779a9522ec6eafff07c6e6f717ea" , 768 , "dnf" } ,
{ "opensuse-leap-15.1" , "https://download.opensuse.org/repositories/Cloud:/Images:/Leap_15.1/images/openSUSE-Leap-15.1-OpenStack.x86_64.qcow2" , "3203e256dab5981ca3301408574b63bc522a69972fbe9850b65b54ff44a96e0a" , 512 , "zypper" } ,
{ "opensuse-leap-15.2" , "https://download.opensuse.org/repositories/Cloud:/Images:/Leap_15.2/images/openSUSE-Leap-15.2-OpenStack.x86_64.qcow2" , "4df9cee9281d1f57d20f79dc65d76e255592b904760e73c0dd44ac753a54330f" , 512 , "zypper" } ,
{ "opensuse-tumbleweed" , "https://download.opensuse.org/tumbleweed/appliances/openSUSE-Tumbleweed-JeOS.x86_64-OpenStack-Cloud.qcow2" , " f5a40c693187dddc524b0877b0aba31cdb6f2e78f12acce0bbb2975ec120dfc0 ", 512 , "zypper" } ,
{ "opensuse-tumbleweed" , "https://download.opensuse.org/tumbleweed/appliances/openSUSE-Tumbleweed-JeOS.x86_64-OpenStack-Cloud.qcow2" , " ba3ecd281045b5019f0fb11378329a644a41870b77631ea647b128cd07eb804b ", 512 , "zypper" } ,
{ "ubuntu-16-04" , "https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img" , "50a21bc067c05e0c73bf5d8727ab61152340d93073b3dc32eff18b626f7d813b" , 512 , "apt" } ,
{ "ubuntu-18-04" , "https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img" , " 78f09b6086367914d23f26e38c3cd88a2aaf1a6a4500ebd46c74ad60c56c1585 ", 512 , "apt" } ,
{ "ubuntu-18-04" , "https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img" , " 08396cf95c18534a2e3f88289bd92d18eee76f0e75813636b3ab9f1e603816d7 ", 512 , "apt" } ,
{ "ubuntu-20-04" , "https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img" , "513158b22ff0f08d0a078d8d60293bcddffdb17094a7809c76c52aba415ecc54" , 512 , "apt" } ,
{ "ubuntu-20-10" , "https://cloud-images.ubuntu.com/groovy/current/groovy-server-cloudimg-amd64.img" , " c1332c24557389a129ff98fa169e34cb53c02555ed702a235e26b8978dd004c3 ", 512 , "apt" } ,
{ "ubuntu-21-04" , "https://cloud-images.ubuntu.com/hirsute/current/hirsute-server-cloudimg-amd64.img" , " 2f8a562637340a026f712594f1257673543d74725d8e3daf88d533d7b8bf448f ", 512 , "apt" } ,
{ "ubuntu-20-10" , "https://cloud-images.ubuntu.com/groovy/current/groovy-server-cloudimg-amd64.img" , " e470df72fce4fb8d0ee4ef8af8eed740ee3bf51290515eb42e5c747725e98b6d ", 512 , "apt" } ,
{ "ubuntu-21-04" , "https://cloud-images.ubuntu.com/hirsute/current/hirsute-server-cloudimg-amd64.img" , " 7fab8eda0bcf6f8f6e63845ccf1e29de4706e3359c82d3888835093020fe6f05 ", 512 , "apt" } ,
}
dir := t . TempDir ( )
ln , err := net . Listen ( "tcp" , " 192.168.122.1 :0")
ln , err := net . Listen ( "tcp" , deriveBindhost ( t ) + " :0")
if err != nil {
t . Fatalf ( "can't make TCP listener: %v" , err )
}
@ -359,6 +360,7 @@ func TestVMIntegrationEndToEnd(t *testing.T) {
}
loginServer := fmt . Sprintf ( "http://%s" , ln . Addr ( ) )
t . Logf ( "loginServer: %s" , loginServer )
cancels := make ( chan func ( ) , len ( distros ) )
@ -457,6 +459,42 @@ func TestVMIntegrationEndToEnd(t *testing.T) {
}
}
func deriveBindhost ( t * testing . T ) string {
t . Helper ( )
ifaces , err := net . Interfaces ( )
if err != nil {
t . Fatal ( err )
}
rex := regexp . MustCompile ( ` ^(eth|enp|wlp|wlan) ` )
for _ , iface := range ifaces {
t . Logf ( "found interface %s: %d" , iface . Name , iface . Flags & net . FlagUp )
if ( iface . Flags & net . FlagUp ) == 0 {
continue
}
if rex . MatchString ( iface . Name ) {
addrs , err := iface . Addrs ( )
if err != nil {
t . Fatalf ( "can't get address for %s: %v" , iface . Name , err )
}
for _ , addr := range addrs {
return netaddr . MustParseIPPrefix ( addr . String ( ) ) . IP ( ) . String ( )
}
}
}
t . Fatal ( "can't find a bindhost" )
return "invalid"
}
func TestDeriveBindhost ( t * testing . T ) {
t . Log ( deriveBindhost ( t ) )
}
const metaDataTemplate = ` instance - id : { { . ID } }
local - hostname : { { . Hostname } } `