bfd_transaction_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package dynamicrouting
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "testing"
  8. )
  9. func TestBFDSaveFailureRestoresMemory(t *testing.T) {
  10. root := t.TempDir()
  11. bad := filepath.Join(root, "directory")
  12. if err := os.Mkdir(bad, 0700); err != nil {
  13. t.Fatal(err)
  14. }
  15. old := BFDNeighbor{ID: "peer", Address: "192.0.2.1", Disabled: true}
  16. m := &Manager{configPath: bad, config: DynamicConfig{BFDNeighbors: []BFDNeighbor{old}}}
  17. _, err := m.SaveBFDNeighbor(BFDNeighbor{ID: "peer", Address: old.Address, Disabled: false})
  18. if err == nil {
  19. t.Fatal("expected failure")
  20. }
  21. if got := m.ListBFDNeighbors(); len(got) != 1 || !got[0].Disabled {
  22. t.Fatalf("configuration changed: %+v", got)
  23. }
  24. }
  25. func TestBFDApplyFailureRestoresConfig(t *testing.T) {
  26. root := t.TempDir()
  27. birdDir := filepath.Join(root, "bird.conf.new")
  28. if err := os.Mkdir(birdDir, 0700); err != nil {
  29. t.Fatal(err)
  30. }
  31. old := BFDNeighbor{ID: "peer", Address: "192.0.2.1", Disabled: true}
  32. path := filepath.Join(root, "dynamic.json")
  33. m := &Manager{configPath: path, birdConfigPath: filepath.Join(root, "bird.conf"), config: DynamicConfig{BFDNeighbors: []BFDNeighbor{old}}}
  34. if err := m.save(); err != nil {
  35. t.Fatal(err)
  36. }
  37. _, err := m.SaveBFDNeighbor(BFDNeighbor{ID: "peer", Address: old.Address, Disabled: false})
  38. if err == nil || !strings.Contains(err.Error(), "apply BFD") {
  39. t.Fatalf("unexpected: %v", err)
  40. }
  41. var saved DynamicConfig
  42. data, err := os.ReadFile(path)
  43. if err != nil {
  44. t.Fatal(err)
  45. }
  46. if err = json.Unmarshal(data, &saved); err != nil {
  47. t.Fatal(err)
  48. }
  49. if len(saved.BFDNeighbors) != 1 || !saved.BFDNeighbors[0].Disabled || !m.ListBFDNeighbors()[0].Disabled {
  50. t.Fatalf("configuration not restored: %+v", saved.BFDNeighbors)
  51. }
  52. }
  53. func TestActiveEIGRPRequiresVtysh(t *testing.T) {
  54. t.Setenv("PATH", t.TempDir())
  55. m := &Manager{config: DynamicConfig{EIGRPInstances: []EIGRPInstance{{Name: "test", Disabled: false}}}}
  56. if err := m.applyFRREigrpConfig(); err == nil || !strings.Contains(err.Error(), "vtysh") {
  57. t.Fatalf("expected vtysh error, got %v", err)
  58. }
  59. m.config.EIGRPInstances[0].Disabled = true
  60. if err := m.applyFRREigrpConfig(); err != nil {
  61. t.Fatalf("inactive EIGRP: %v", err)
  62. }
  63. }
  64. func TestRoutingFilterApplyFailureRestoresPreviousConfig(t *testing.T) {
  65. root := t.TempDir()
  66. if err := os.Mkdir(filepath.Join(root, "bird.conf.new"), 0700); err != nil {
  67. t.Fatal(err)
  68. }
  69. path := filepath.Join(root, "dynamic.json")
  70. old := RoutingFilterRule{ID: "rule-1", Chain: "test", Action: "accept", RuleOrder: 10}
  71. m := &Manager{configPath: path, birdConfigPath: filepath.Join(root, "bird.conf"), config: DynamicConfig{RoutingFilters: []RoutingFilterRule{old}}}
  72. if err := m.save(); err != nil {
  73. t.Fatal(err)
  74. }
  75. edited := old
  76. edited.Action = "discard"
  77. if err := m.SaveRoutingFilter(&edited); err == nil || !strings.Contains(err.Error(), "applying routing policies") {
  78. t.Fatalf("apply failure: %v", err)
  79. }
  80. rules := m.ListRoutingFilters()
  81. if len(rules) != 1 || rules[0].Action != "accept" {
  82. t.Fatalf("memory not restored: %+v", rules)
  83. }
  84. data, err := os.ReadFile(path)
  85. if err != nil {
  86. t.Fatal(err)
  87. }
  88. var stored DynamicConfig
  89. if err = json.Unmarshal(data, &stored); err != nil {
  90. t.Fatal(err)
  91. }
  92. if len(stored.RoutingFilters) != 1 || stored.RoutingFilters[0].Action != "accept" {
  93. t.Fatalf("storage not restored: %+v", stored.RoutingFilters)
  94. }
  95. }
  96. func TestRoutingFilterSaveFailureRestoresMemory(t *testing.T) {
  97. root := t.TempDir()
  98. bad := filepath.Join(root, "dir")
  99. if err := os.Mkdir(bad, 0700); err != nil {
  100. t.Fatal(err)
  101. }
  102. old := RoutingFilterRule{ID: "rule", Chain: "x", Action: "accept"}
  103. m := &Manager{configPath: bad, config: DynamicConfig{RoutingFilters: []RoutingFilterRule{old}}}
  104. next := old
  105. next.Action = "discard"
  106. if err := m.SaveRoutingFilter(&next); err == nil {
  107. t.Fatal("save failure ignored")
  108. }
  109. if got := m.ListRoutingFilters(); len(got) != 1 || got[0].Action != "accept" {
  110. t.Fatalf("memory changed: %+v", got)
  111. }
  112. }