|
|
|
|
@ -31,6 +31,7 @@ import ( |
|
|
|
|
"github.com/google/go-cmp/cmp" |
|
|
|
|
"golang.org/x/sys/unix" |
|
|
|
|
"tailscale.com/ipn" |
|
|
|
|
"tailscale.com/kube/egressservices" |
|
|
|
|
"tailscale.com/tailcfg" |
|
|
|
|
"tailscale.com/tstest" |
|
|
|
|
"tailscale.com/types/netmap" |
|
|
|
|
@ -57,6 +58,16 @@ func TestContainerBoot(t *testing.T) { |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("error unmarshaling tailscaled config: %v", err) |
|
|
|
|
} |
|
|
|
|
serveConf := ipn.ServeConfig{TCP: map[uint16]*ipn.TCPPortHandler{80: {HTTP: true}}} |
|
|
|
|
serveConfBytes, err := json.Marshal(serveConf) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("error unmarshaling serve config: %v", err) |
|
|
|
|
} |
|
|
|
|
egressSvcsCfg := egressservices.Configs{"foo": {TailnetTarget: egressservices.TailnetTarget{FQDN: "foo.tailnetxyx.ts.net"}}} |
|
|
|
|
egressSvcsCfgBytes, err := json.Marshal(egressSvcsCfg) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("error unmarshaling egress services config: %v", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dirs := []string{ |
|
|
|
|
"var/lib", |
|
|
|
|
@ -73,14 +84,16 @@ func TestContainerBoot(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
files := map[string][]byte{ |
|
|
|
|
"usr/bin/tailscaled": fakeTailscaled, |
|
|
|
|
"usr/bin/tailscale": fakeTailscale, |
|
|
|
|
"usr/bin/iptables": fakeTailscale, |
|
|
|
|
"usr/bin/ip6tables": fakeTailscale, |
|
|
|
|
"dev/net/tun": []byte(""), |
|
|
|
|
"proc/sys/net/ipv4/ip_forward": []byte("0"), |
|
|
|
|
"proc/sys/net/ipv6/conf/all/forwarding": []byte("0"), |
|
|
|
|
"etc/tailscaled/cap-95.hujson": tailscaledConfBytes, |
|
|
|
|
"usr/bin/tailscaled": fakeTailscaled, |
|
|
|
|
"usr/bin/tailscale": fakeTailscale, |
|
|
|
|
"usr/bin/iptables": fakeTailscale, |
|
|
|
|
"usr/bin/ip6tables": fakeTailscale, |
|
|
|
|
"dev/net/tun": []byte(""), |
|
|
|
|
"proc/sys/net/ipv4/ip_forward": []byte("0"), |
|
|
|
|
"proc/sys/net/ipv6/conf/all/forwarding": []byte("0"), |
|
|
|
|
"etc/tailscaled/cap-95.hujson": tailscaledConfBytes, |
|
|
|
|
"etc/tailscaled/serve-config.json": serveConfBytes, |
|
|
|
|
"etc/tailscaled/egress-services-config.json": egressSvcsCfgBytes, |
|
|
|
|
} |
|
|
|
|
resetFiles := func() { |
|
|
|
|
for path, content := range files { |
|
|
|
|
@ -829,6 +842,101 @@ func TestContainerBoot(t *testing.T) { |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Name: "serve_config_no_kube", |
|
|
|
|
Env: map[string]string{ |
|
|
|
|
"TS_SERVE_CONFIG": filepath.Join(d, "etc/tailscaled/serve-config.json"), |
|
|
|
|
"TS_AUTHKEY": "tskey-key", |
|
|
|
|
}, |
|
|
|
|
Phases: []phase{ |
|
|
|
|
{ |
|
|
|
|
WantCmds: []string{ |
|
|
|
|
"/usr/bin/tailscaled --socket=/tmp/tailscaled.sock --state=mem: --statedir=/tmp --tun=userspace-networking", |
|
|
|
|
"/usr/bin/tailscale --socket=/tmp/tailscaled.sock up --accept-dns=false --authkey=tskey-key", |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Notify: runningNotify, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Name: "serve_config_kube", |
|
|
|
|
Env: map[string]string{ |
|
|
|
|
"KUBERNETES_SERVICE_HOST": kube.Host, |
|
|
|
|
"KUBERNETES_SERVICE_PORT_HTTPS": kube.Port, |
|
|
|
|
"TS_SERVE_CONFIG": filepath.Join(d, "etc/tailscaled/serve-config.json"), |
|
|
|
|
}, |
|
|
|
|
KubeSecret: map[string]string{ |
|
|
|
|
"authkey": "tskey-key", |
|
|
|
|
}, |
|
|
|
|
Phases: []phase{ |
|
|
|
|
{ |
|
|
|
|
WantCmds: []string{ |
|
|
|
|
"/usr/bin/tailscaled --socket=/tmp/tailscaled.sock --state=kube:tailscale --statedir=/tmp --tun=userspace-networking", |
|
|
|
|
"/usr/bin/tailscale --socket=/tmp/tailscaled.sock up --accept-dns=false --authkey=tskey-key", |
|
|
|
|
}, |
|
|
|
|
WantKubeSecret: map[string]string{ |
|
|
|
|
"authkey": "tskey-key", |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Notify: runningNotify, |
|
|
|
|
WantKubeSecret: map[string]string{ |
|
|
|
|
"authkey": "tskey-key", |
|
|
|
|
"device_fqdn": "test-node.test.ts.net", |
|
|
|
|
"device_id": "myID", |
|
|
|
|
"device_ips": `["100.64.0.1"]`, |
|
|
|
|
"https_endpoint": "no-https", |
|
|
|
|
"tailscale_capver": capver, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Name: "egress_svcs_config_kube", |
|
|
|
|
Env: map[string]string{ |
|
|
|
|
"KUBERNETES_SERVICE_HOST": kube.Host, |
|
|
|
|
"KUBERNETES_SERVICE_PORT_HTTPS": kube.Port, |
|
|
|
|
"TS_EGRESS_SERVICES_CONFIG_PATH": filepath.Join(d, "etc/tailscaled/egress-services-config.json"), |
|
|
|
|
}, |
|
|
|
|
KubeSecret: map[string]string{ |
|
|
|
|
"authkey": "tskey-key", |
|
|
|
|
}, |
|
|
|
|
Phases: []phase{ |
|
|
|
|
{ |
|
|
|
|
WantCmds: []string{ |
|
|
|
|
"/usr/bin/tailscaled --socket=/tmp/tailscaled.sock --state=kube:tailscale --statedir=/tmp --tun=userspace-networking", |
|
|
|
|
"/usr/bin/tailscale --socket=/tmp/tailscaled.sock up --accept-dns=false --authkey=tskey-key", |
|
|
|
|
}, |
|
|
|
|
WantKubeSecret: map[string]string{ |
|
|
|
|
"authkey": "tskey-key", |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Notify: runningNotify, |
|
|
|
|
WantKubeSecret: map[string]string{ |
|
|
|
|
"authkey": "tskey-key", |
|
|
|
|
"device_fqdn": "test-node.test.ts.net", |
|
|
|
|
"device_id": "myID", |
|
|
|
|
"device_ips": `["100.64.0.1"]`, |
|
|
|
|
"tailscale_capver": capver, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Name: "egress_svcs_config_no_kube", |
|
|
|
|
Env: map[string]string{ |
|
|
|
|
"TS_EGRESS_SERVICES_CONFIG_PATH": filepath.Join(d, "etc/tailscaled/egress-services-config.json"), |
|
|
|
|
"TS_AUTHKEY": "tskey-key", |
|
|
|
|
}, |
|
|
|
|
Phases: []phase{ |
|
|
|
|
{ |
|
|
|
|
WantFatalLog: "TS_EGRESS_SERVICES_CONFIG_PATH is only supported for Tailscale running on Kubernetes", |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, test := range tests { |
|
|
|
|
|