vlan_sync_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package bridge
  2. import (
  3. "os"
  4. "os/exec"
  5. "path/filepath"
  6. "strings"
  7. "testing"
  8. )
  9. func TestMembershipChangesRepresentRemovalAndAddition(t *testing.T) {
  10. before := members(&BridgeVLAN{Bridge: "br0", VlanIDs: "10", Tagged: []string{"p1"}})
  11. after := members(&BridgeVLAN{Bridge: "br0", VlanIDs: "20", Untagged: []string{"p2"}})
  12. if len(before) != 1 || len(after) != 1 || before[vlanMember{"p2", 20, true, false}] || !after[vlanMember{"p2", 20, true, false}] {
  13. t.Fatal(before, after)
  14. }
  15. }
  16. func TestVLANEditInNamespace(t *testing.T) {
  17. if os.Getenv("DEBTIK_BRIDGE_INTEGRATION") != "1" {
  18. t.Skip("isolated namespace only")
  19. }
  20. run := func(binary string, args ...string) string {
  21. t.Helper()
  22. out, err := exec.Command(binary, args...).CombinedOutput()
  23. if err != nil {
  24. t.Fatalf("%s %v: %s: %v", binary, args, out, err)
  25. }
  26. return string(out)
  27. }
  28. run("ip", "link", "add", "br0", "type", "bridge", "vlan_filtering", "1")
  29. for _, name := range []string{"p1", "p2"} {
  30. run("ip", "link", "add", name, "type", "dummy")
  31. run("ip", "link", "set", name, "master", "br0")
  32. }
  33. m := &BridgeManager{storePath: filepath.Join(t.TempDir(), "bridge.json"), bridges: map[string]*BridgeInstance{}, ports: map[string]*BridgePort{}, vlans: map[string]*BridgeVLAN{}}
  34. if err := m.SavePort(BridgePort{ID: "p1", Bridge: "br0", Interface: "p1", PVID: 1, Learn: true}); err != nil {
  35. t.Fatal(err)
  36. }
  37. v := BridgeVLAN{ID: "v1", Bridge: "br0", VlanIDs: "10", Tagged: []string{"p1"}}
  38. if err := m.SaveVLAN(v); err != nil {
  39. t.Fatal(err)
  40. }
  41. v.VlanIDs = "20"
  42. v.Tagged = nil
  43. v.Untagged = []string{"p2"}
  44. if err := m.SaveVLAN(v); err != nil {
  45. t.Fatal(err)
  46. }
  47. p1 := run("bridge", "vlan", "show", "dev", "p1")
  48. p2 := run("bridge", "vlan", "show", "dev", "p2")
  49. if strings.Contains(p1, "10") || !strings.Contains(p2, "20") {
  50. t.Fatal(p1, p2)
  51. }
  52. if err := m.SetVLANState("v1", true); err != nil {
  53. t.Fatal(err)
  54. }
  55. if strings.Contains(run("bridge", "vlan", "show", "dev", "p2"), "20") {
  56. t.Fatal("disabled VLAN retained")
  57. }
  58. }