mirror of
https://github.com/tailscale/tailscale.git
synced 2025-03-27 11:32:24 +00:00
tstest/natlab/vnet: standardize on 1-based naming of nodes, networks, MACs
We had a mix of 0-based and 1-based nodes and MACs in logs. Updates #13038 Change-Id: I36d1b00f7f94b37b4ae2cd439bcdc5dbee6eda4d Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
parent
10d0ce8dde
commit
84adfa1ba3
@ -283,35 +283,35 @@ func (nt *natTest) runTest(node1, node2 addNodeFunc) pingRoute {
|
|||||||
for i, c := range clients {
|
for i, c := range clients {
|
||||||
i, c := i, c
|
i, c := i, c
|
||||||
eg.Go(func() error {
|
eg.Go(func() error {
|
||||||
|
node := nodes[i]
|
||||||
st, err := c.Status(ctx)
|
st, err := c.Status(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("node%d status: %w", i, err)
|
return fmt.Errorf("%v status: %w", node, err)
|
||||||
}
|
}
|
||||||
t.Logf("node%d status: %v", i, st)
|
t.Logf("%v status: %v", node, st)
|
||||||
|
|
||||||
node := nodes[i]
|
|
||||||
if node.HostFirewall() {
|
if node.HostFirewall() {
|
||||||
if err := c.EnableHostFirewall(ctx); err != nil {
|
if err := c.EnableHostFirewall(ctx); err != nil {
|
||||||
return fmt.Errorf("node%d firewall: %w", i, err)
|
return fmt.Errorf("%v firewall: %w", node, err)
|
||||||
}
|
}
|
||||||
t.Logf("node%d firewalled", i)
|
t.Logf("%v firewalled", node)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := up(ctx, c); err != nil {
|
if err := up(ctx, c); err != nil {
|
||||||
return fmt.Errorf("node%d up: %w", i, err)
|
return fmt.Errorf("%v up: %w", node, err)
|
||||||
}
|
}
|
||||||
t.Logf("node%d up!", i)
|
t.Logf("%v up!", node)
|
||||||
|
|
||||||
st, err = c.Status(ctx)
|
st, err = c.Status(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("node%d status: %w", i, err)
|
return fmt.Errorf("%v status: %w", node, err)
|
||||||
}
|
}
|
||||||
sts[i] = st
|
sts[i] = st
|
||||||
|
|
||||||
if st.BackendState != "Running" {
|
if st.BackendState != "Running" {
|
||||||
return fmt.Errorf("node%d state = %q", i, st.BackendState)
|
return fmt.Errorf("%v state = %q", node, st.BackendState)
|
||||||
}
|
}
|
||||||
t.Logf("node%d up with %v", i, sts[i].Self.TailscaleIPs)
|
t.Logf("%v up with %v", node, sts[i].Self.TailscaleIPs)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,8 @@ func (c *Config) FirstNetwork() *Network {
|
|||||||
func (c *Config) AddNode(opts ...any) *Node {
|
func (c *Config) AddNode(opts ...any) *Node {
|
||||||
num := len(c.nodes)
|
num := len(c.nodes)
|
||||||
n := &Node{
|
n := &Node{
|
||||||
mac: MAC{0x52, 0xcc, 0xcc, 0xcc, 0xcc, byte(num)}, // 52=TS then 0xcc for ccclient
|
num: num + 1,
|
||||||
|
mac: MAC{0x52, 0xcc, 0xcc, 0xcc, 0xcc, byte(num) + 1}, // 52=TS then 0xcc for ccclient
|
||||||
}
|
}
|
||||||
c.nodes = append(c.nodes, n)
|
c.nodes = append(c.nodes, n)
|
||||||
for _, o := range opts {
|
for _, o := range opts {
|
||||||
@ -119,7 +120,7 @@ type TailscaledEnv struct {
|
|||||||
func (c *Config) AddNetwork(opts ...any) *Network {
|
func (c *Config) AddNetwork(opts ...any) *Network {
|
||||||
num := len(c.networks)
|
num := len(c.networks)
|
||||||
n := &Network{
|
n := &Network{
|
||||||
mac: MAC{0x52, 0xee, 0xee, 0xee, 0xee, byte(num)}, // 52=TS then 0xee for 'etwork
|
mac: MAC{0x52, 0xee, 0xee, 0xee, 0xee, byte(num) + 1}, // 52=TS then 0xee for 'etwork
|
||||||
}
|
}
|
||||||
c.networks = append(c.networks, n)
|
c.networks = append(c.networks, n)
|
||||||
for _, o := range opts {
|
for _, o := range opts {
|
||||||
@ -150,6 +151,7 @@ func (c *Config) AddNetwork(opts ...any) *Network {
|
|||||||
// Node is the configuration of a node in the virtual network.
|
// Node is the configuration of a node in the virtual network.
|
||||||
type Node struct {
|
type Node struct {
|
||||||
err error
|
err error
|
||||||
|
num int // 1-based node number
|
||||||
n *node // nil until NewServer called
|
n *node // nil until NewServer called
|
||||||
|
|
||||||
env []TailscaledEnv
|
env []TailscaledEnv
|
||||||
@ -163,6 +165,16 @@ type Node struct {
|
|||||||
nets []*Network
|
nets []*Network
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Num returns the 1-based node number.
|
||||||
|
func (n *Node) Num() int {
|
||||||
|
return n.num
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns the string "nodeN" where N is the 1-based node number.
|
||||||
|
func (n *Node) String() string {
|
||||||
|
return fmt.Sprintf("node%d", n.num)
|
||||||
|
}
|
||||||
|
|
||||||
// MAC returns the MAC address of the node.
|
// MAC returns the MAC address of the node.
|
||||||
func (n *Node) MAC() MAC {
|
func (n *Node) MAC() MAC {
|
||||||
return n.mac
|
return n.mac
|
||||||
@ -285,17 +297,18 @@ func (s *Server) initFromConfig(c *Config) error {
|
|||||||
LinkType: layers.LinkTypeIPv4,
|
LinkType: layers.LinkTypeIPv4,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
for i, conf := range c.nodes {
|
for _, conf := range c.nodes {
|
||||||
if conf.err != nil {
|
if conf.err != nil {
|
||||||
return conf.err
|
return conf.err
|
||||||
}
|
}
|
||||||
n := &node{
|
n := &node{
|
||||||
|
num: conf.num,
|
||||||
mac: conf.mac,
|
mac: conf.mac,
|
||||||
net: netOfConf[conf.Network()],
|
net: netOfConf[conf.Network()],
|
||||||
verboseSyslog: conf.VerboseSyslog(),
|
verboseSyslog: conf.VerboseSyslog(),
|
||||||
}
|
}
|
||||||
n.interfaceID = must.Get(s.pcapWriter.AddInterface(pcapgo.NgInterface{
|
n.interfaceID = must.Get(s.pcapWriter.AddInterface(pcapgo.NgInterface{
|
||||||
Name: fmt.Sprintf("node%d", i+1),
|
Name: n.String(),
|
||||||
LinkType: layers.LinkTypeEthernet,
|
LinkType: layers.LinkTypeEthernet,
|
||||||
}))
|
}))
|
||||||
conf.n = n
|
conf.n = n
|
||||||
|
@ -69,3 +69,12 @@ func TestConfig(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNodeString(t *testing.T) {
|
||||||
|
if g, w := (&Node{num: 1}).String(), "node1"; g != w {
|
||||||
|
t.Errorf("got %q; want %q", g, w)
|
||||||
|
}
|
||||||
|
if g, w := (&node{num: 1}).String(), "node1"; g != w {
|
||||||
|
t.Errorf("got %q; want %q", g, w)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -277,14 +277,21 @@ func (n *network) acceptTCP(r *tcp.ForwarderRequest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if destPort == 124 {
|
if destPort == 124 {
|
||||||
|
node, ok := n.nodesByIP[clientRemoteIP]
|
||||||
|
if !ok {
|
||||||
|
log.Printf("no node for TCP 124 connection from %v", clientRemoteIP)
|
||||||
|
r.Complete(true)
|
||||||
|
return
|
||||||
|
}
|
||||||
r.Complete(false)
|
r.Complete(false)
|
||||||
tc := gonet.NewTCPConn(&wq, ep)
|
tc := gonet.NewTCPConn(&wq, ep)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer tc.Close()
|
defer tc.Close()
|
||||||
bs := bufio.NewScanner(tc)
|
bs := bufio.NewScanner(tc)
|
||||||
for bs.Scan() {
|
for bs.Scan() {
|
||||||
line := bs.Text()
|
line := bs.Text()
|
||||||
log.Printf("LOG from guest %v: %s", clientRemoteIP, line)
|
log.Printf("LOG from %v: %s", node, line)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
return
|
return
|
||||||
@ -503,6 +510,7 @@ func (n *network) MACOfIP(ip netip.Addr) (_ MAC, ok bool) {
|
|||||||
|
|
||||||
type node struct {
|
type node struct {
|
||||||
mac MAC
|
mac MAC
|
||||||
|
num int // 1-based node number
|
||||||
interfaceID int
|
interfaceID int
|
||||||
net *network
|
net *network
|
||||||
lanIP netip.Addr // must be in net.lanIP prefix + unique in net
|
lanIP netip.Addr // must be in net.lanIP prefix + unique in net
|
||||||
@ -516,6 +524,11 @@ type node struct {
|
|||||||
logCatcherWrites int
|
logCatcherWrites int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// String returns the string "nodeN" where N is the 1-based node number.
|
||||||
|
func (n *node) String() string {
|
||||||
|
return fmt.Sprintf("node%d", n.num)
|
||||||
|
}
|
||||||
|
|
||||||
type derpServer struct {
|
type derpServer struct {
|
||||||
srv *derp.Server
|
srv *derp.Server
|
||||||
handler http.Handler
|
handler http.Handler
|
||||||
@ -801,8 +814,13 @@ func (s *Server) routeUDPPacket(up UDPPacket) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
netw, ok := s.networkByWAN[up.Dst.Addr()]
|
dstIP := up.Dst.Addr()
|
||||||
|
netw, ok := s.networkByWAN[dstIP]
|
||||||
if !ok {
|
if !ok {
|
||||||
|
if dstIP.IsPrivate() {
|
||||||
|
// Not worth spamming logs. RFC 1918 space doesn't route.
|
||||||
|
return
|
||||||
|
}
|
||||||
log.Printf("no network to route UDP packet for %v", up.Dst)
|
log.Printf("no network to route UDP packet for %v", up.Dst)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -1018,7 +1036,7 @@ func (n *network) HandleEthernetIPv4PacketForRouter(ep EthernetPacket) {
|
|||||||
if node.verboseSyslog {
|
if node.verboseSyslog {
|
||||||
// TODO(bradfitz): parse this and capture it, structured, into
|
// TODO(bradfitz): parse this and capture it, structured, into
|
||||||
// node's log buffer.
|
// node's log buffer.
|
||||||
log.Printf("syslog from %v: %s", srcIP, udp.Payload)
|
log.Printf("syslog from %v: %s", node, udp.Payload)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user