Multi network integration tests (#2464)
This commit is contained in:
parent
707438f25e
commit
603f3ad490
29 changed files with 2385 additions and 1449 deletions
|
@ -13,6 +13,7 @@ import (
|
|||
"net/url"
|
||||
"os"
|
||||
"reflect"
|
||||
"runtime/debug"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
@ -81,6 +82,7 @@ type TailscaleInContainer struct {
|
|||
workdir string
|
||||
netfilter string
|
||||
extraLoginArgs []string
|
||||
withAcceptRoutes bool
|
||||
|
||||
// build options, solely for HEAD
|
||||
buildConfig TailscaleInContainerBuildConfig
|
||||
|
@ -101,26 +103,10 @@ func WithCACert(cert []byte) Option {
|
|||
}
|
||||
}
|
||||
|
||||
// WithOrCreateNetwork sets the Docker container network to use with
|
||||
// the Tailscale instance, if the parameter is nil, a new network,
|
||||
// isolating the TailscaleClient, will be created. If a network is
|
||||
// passed, the Tailscale instance will join the given network.
|
||||
func WithOrCreateNetwork(network *dockertest.Network) Option {
|
||||
// WithNetwork sets the Docker container network to use with
|
||||
// the Tailscale instance.
|
||||
func WithNetwork(network *dockertest.Network) Option {
|
||||
return func(tsic *TailscaleInContainer) {
|
||||
if network != nil {
|
||||
tsic.network = network
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
network, err := dockertestutil.GetFirstOrCreateNetwork(
|
||||
tsic.pool,
|
||||
fmt.Sprintf("%s-network", tsic.hostname),
|
||||
)
|
||||
if err != nil {
|
||||
log.Fatalf("failed to create network: %s", err)
|
||||
}
|
||||
|
||||
tsic.network = network
|
||||
}
|
||||
}
|
||||
|
@ -212,11 +198,17 @@ func WithExtraLoginArgs(args []string) Option {
|
|||
}
|
||||
}
|
||||
|
||||
// WithAcceptRoutes tells the node to accept incomming routes.
|
||||
func WithAcceptRoutes() Option {
|
||||
return func(tsic *TailscaleInContainer) {
|
||||
tsic.withAcceptRoutes = true
|
||||
}
|
||||
}
|
||||
|
||||
// New returns a new TailscaleInContainer instance.
|
||||
func New(
|
||||
pool *dockertest.Pool,
|
||||
version string,
|
||||
network *dockertest.Network,
|
||||
opts ...Option,
|
||||
) (*TailscaleInContainer, error) {
|
||||
hash, err := util.GenerateRandomStringDNSSafe(tsicHashLength)
|
||||
|
@ -230,8 +222,7 @@ func New(
|
|||
version: version,
|
||||
hostname: hostname,
|
||||
|
||||
pool: pool,
|
||||
network: network,
|
||||
pool: pool,
|
||||
|
||||
withEntrypoint: []string{
|
||||
"/bin/sh",
|
||||
|
@ -244,6 +235,10 @@ func New(
|
|||
opt(tsic)
|
||||
}
|
||||
|
||||
if tsic.network == nil {
|
||||
return nil, fmt.Errorf("no network set, called from: \n%s", string(debug.Stack()))
|
||||
}
|
||||
|
||||
tailscaleOptions := &dockertest.RunOptions{
|
||||
Name: hostname,
|
||||
Networks: []*dockertest.Network{tsic.network},
|
||||
|
@ -442,7 +437,7 @@ func (t *TailscaleInContainer) Login(
|
|||
"--login-server=" + loginServer,
|
||||
"--authkey=" + authKey,
|
||||
"--hostname=" + t.hostname,
|
||||
"--accept-routes=false",
|
||||
fmt.Sprintf("--accept-routes=%t", t.withAcceptRoutes),
|
||||
}
|
||||
|
||||
if t.extraLoginArgs != nil {
|
||||
|
@ -597,6 +592,33 @@ func (t *TailscaleInContainer) IPs() ([]netip.Addr, error) {
|
|||
return ips, nil
|
||||
}
|
||||
|
||||
func (t *TailscaleInContainer) MustIPs() []netip.Addr {
|
||||
ips, err := t.IPs()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return ips
|
||||
}
|
||||
|
||||
func (t *TailscaleInContainer) MustIPv4() netip.Addr {
|
||||
for _, ip := range t.MustIPs() {
|
||||
if ip.Is4() {
|
||||
return ip
|
||||
}
|
||||
}
|
||||
panic("no ipv4 found")
|
||||
}
|
||||
|
||||
func (t *TailscaleInContainer) MustIPv6() netip.Addr {
|
||||
for _, ip := range t.MustIPs() {
|
||||
if ip.Is6() {
|
||||
return ip
|
||||
}
|
||||
}
|
||||
panic("no ipv6 found")
|
||||
}
|
||||
|
||||
// Status returns the ipnstate.Status of the Tailscale instance.
|
||||
func (t *TailscaleInContainer) Status(save ...bool) (*ipnstate.Status, error) {
|
||||
command := []string{
|
||||
|
@ -992,6 +1014,7 @@ func (t *TailscaleInContainer) Ping(hostnameOrIP string, opts ...PingOption) err
|
|||
),
|
||||
)
|
||||
if err != nil {
|
||||
log.Printf("command: %v", command)
|
||||
log.Printf(
|
||||
"failed to run ping command from %s to %s, err: %s",
|
||||
t.Hostname(),
|
||||
|
@ -1108,6 +1131,26 @@ func (t *TailscaleInContainer) Curl(url string, opts ...CurlOption) (string, err
|
|||
return result, nil
|
||||
}
|
||||
|
||||
func (t *TailscaleInContainer) Traceroute(ip netip.Addr) (util.Traceroute, error) {
|
||||
command := []string{
|
||||
"traceroute",
|
||||
ip.String(),
|
||||
}
|
||||
|
||||
var result util.Traceroute
|
||||
stdout, stderr, err := t.Execute(command)
|
||||
if err != nil {
|
||||
return result, err
|
||||
}
|
||||
|
||||
result, err = util.ParseTraceroute(stdout + stderr)
|
||||
if err != nil {
|
||||
return result, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// WriteFile save file inside the Tailscale container.
|
||||
func (t *TailscaleInContainer) WriteFile(path string, data []byte) error {
|
||||
return integrationutil.WriteFileToContainer(t.pool, t.container, path, data)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue