tun_bsd_reload_test.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. //go:build (openbsd || netbsd) && !e2e_testing
  2. package overlay
  3. import (
  4. "net/netip"
  5. "testing"
  6. "github.com/slackhq/nebula/config"
  7. "github.com/slackhq/nebula/test"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/require"
  10. )
  11. // A tun.dev that isn't tunN is ignored like darwin does, and the first free tun is used. Only naming a different tun
  12. // asks for a restart
  13. func TestTunReloadDevRestart(t *testing.T) {
  14. newWithDev := func(dev string) (*config.C, *tun, error) {
  15. c := config.NewC(test.NewLogger())
  16. require.NoError(t, c.LoadString("tun:\n dev: "+dev+"\n"))
  17. tn, err := newTun(c, test.NewLogger(), []netip.Prefix{netip.MustParsePrefix("10.1.0.2/24")}, false)
  18. if err == nil {
  19. t.Cleanup(func() { _ = tn.Close() })
  20. }
  21. return c, tn, err
  22. }
  23. if _, _, err := newWithDev(""); err != nil {
  24. t.Skipf("can't create a tun device here: %v", err)
  25. }
  26. c, tn, err := newWithDev("nope")
  27. require.NoError(t, err, "a bad name should fall back to a free tun")
  28. require.Regexp(t, `^tun[0-9]+$`, tn.Device)
  29. for _, dev := range []string{"nope", "", tn.Device, "nope"} {
  30. res := c.ReloadConfigString("tun:\n dev: " + dev + "\n")
  31. require.NoError(t, res.Err)
  32. assert.False(t, res.Failed, dev)
  33. assert.False(t, res.RestartRequired, dev)
  34. }
  35. other := "tun0"
  36. if tn.Device == other {
  37. other = "tun1"
  38. }
  39. res := c.ReloadConfigString("tun:\n dev: " + other + "\n")
  40. require.NoError(t, res.Err)
  41. assert.Equal(t, []string{"tun.dev"}, res.RestartKeys)
  42. }
  43. // An empty tun.dev takes the first tun nothing else has open. Reloading it empty, or naming the one we have, needs
  44. // no restart
  45. func TestTunEmptyDevPicksAFreeOne(t *testing.T) {
  46. newEmpty := func() (*config.C, *tun, error) {
  47. c := config.NewC(test.NewLogger())
  48. require.NoError(t, c.LoadString("tun: {}\n"))
  49. tn, err := newTun(c, test.NewLogger(), []netip.Prefix{netip.MustParsePrefix("10.1.0.2/24")}, false)
  50. if err == nil {
  51. t.Cleanup(func() { _ = tn.Close() })
  52. }
  53. return c, tn, err
  54. }
  55. c, first, err := newEmpty()
  56. if err != nil {
  57. t.Skipf("can't create a tun device here: %v", err)
  58. }
  59. _, second, err := newEmpty()
  60. require.NoError(t, err, "the second tun should skip the one the first has open")
  61. assert.NotEqual(t, first.Device, second.Device)
  62. for _, cfg := range []string{
  63. "tun: {}\npunchy:\n punch: true\n",
  64. "tun:\n dev: " + first.Device + "\n",
  65. "tun: {}\n",
  66. } {
  67. res := c.ReloadConfigString(cfg)
  68. require.NoError(t, res.Err)
  69. assert.False(t, res.Failed)
  70. assert.False(t, res.RestartRequired, cfg)
  71. }
  72. }