github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/network/fan_test.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package network_test 5 6 import ( 7 "net" 8 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/network" 13 "github.com/juju/juju/testing" 14 ) 15 16 type FanConfigSuite struct { 17 testing.BaseSuite 18 } 19 20 var _ = gc.Suite(&FanConfigSuite{}) 21 22 func (*FanConfigSuite) TestFanConfigParseEmpty(c *gc.C) { 23 config, err := network.ParseFanConfig("") 24 c.Check(config, gc.IsNil) 25 c.Check(err, jc.ErrorIsNil) 26 } 27 28 func (*FanConfigSuite) TestFanConfigParseSingle(c *gc.C) { 29 input := "172.31.0.0/16=253.0.0.0/8" 30 config, err := network.ParseFanConfig(input) 31 c.Assert(err, jc.ErrorIsNil) 32 c.Assert(config, gc.HasLen, 1) 33 _, underlay, _ := net.ParseCIDR("172.31.0.0/16") 34 _, overlay, _ := net.ParseCIDR("253.0.0.0/8") 35 c.Check(config[0].Underlay, gc.DeepEquals, underlay) 36 c.Check(config[0].Overlay, gc.DeepEquals, overlay) 37 c.Check(config.String(), gc.Equals, input) 38 } 39 40 func (*FanConfigSuite) TestFanConfigParseMultiple(c *gc.C) { 41 input := "172.31.0.0/16=253.0.0.0/8 172.32.0.0/16=254.0.0.0/8" 42 config, err := network.ParseFanConfig(input) 43 c.Assert(err, jc.ErrorIsNil) 44 c.Assert(config, gc.HasLen, 2) 45 _, underlay0, _ := net.ParseCIDR("172.31.0.0/16") 46 _, overlay0, _ := net.ParseCIDR("253.0.0.0/8") 47 c.Check(config[0].Underlay, gc.DeepEquals, underlay0) 48 c.Check(config[0].Overlay, gc.DeepEquals, overlay0) 49 _, underlay1, _ := net.ParseCIDR("172.32.0.0/16") 50 _, overlay1, _ := net.ParseCIDR("254.0.0.0/8") 51 c.Check(config[1].Underlay, gc.DeepEquals, underlay1) 52 c.Check(config[1].Overlay, gc.DeepEquals, overlay1) 53 c.Check(config.String(), gc.Equals, input) 54 } 55 56 func (*FanConfigSuite) TestFanConfigErrors(c *gc.C) { 57 // Colonless garbage. 58 config, err := network.ParseFanConfig("172.31.0.0/16=253.0.0.0/8 foobar") 59 c.Check(config, gc.IsNil) 60 c.Check(err, gc.ErrorMatches, "invalid FAN config entry:.*") 61 62 // Invalid IP address. 63 config, err = network.ParseFanConfig("172.31.0.0/16=253.0.0.0/8 333.122.142.17/18=1.2.3.0/24") 64 c.Check(config, gc.IsNil) 65 c.Check(err, gc.ErrorMatches, "invalid address in FAN config:.*") 66 config, err = network.ParseFanConfig("172.31.0.0/16=253.0.0.0/8 1.2.3.0/24=333.122.142.17/18") 67 c.Check(config, gc.IsNil) 68 c.Check(err, gc.ErrorMatches, "invalid address in FAN config:.*") 69 70 // Underlay mask smaller than overlay. 71 config, err = network.ParseFanConfig("1.0.0.0/8=2.0.0.0/16") 72 c.Check(config, gc.IsNil) 73 c.Check(err, gc.ErrorMatches, "invalid FAN config, underlay mask must be larger than overlay:.*") 74 } 75 76 func (*FanConfigSuite) TestCalculateOverlaySegment(c *gc.C) { 77 config, err := network.ParseFanConfig("172.31.0.0/16=253.0.0.0/8 10.0.0.0/12=252.0.0.0/7") 78 c.Assert(err, jc.ErrorIsNil) 79 80 // Regular case 81 net, err := network.CalculateOverlaySegment("172.31.16.0/20", config[0]) 82 c.Assert(err, jc.ErrorIsNil) 83 c.Assert(net, gc.NotNil) 84 c.Check(net.String(), gc.Equals, "253.16.0.0/12") 85 86 // Underlay outside of FAN scope 87 net, err = network.CalculateOverlaySegment("172.99.16.0/20", config[0]) 88 c.Assert(err, jc.ErrorIsNil) 89 c.Check(net, gc.IsNil) 90 91 // Garbage in underlay 92 net, err = network.CalculateOverlaySegment("something", config[0]) 93 c.Check(net, gc.IsNil) 94 c.Check(err, gc.ErrorMatches, "invalid CIDR address: something") 95 96 // Funky case 97 // We have overlay 252.0.0.0/7 underlay 10.0.0.0/12 and local underlay 10.2.224.0/19 98 // We need to transplant 19-12=7 bits out of local underlay to overlay 99 // 10.2.224.0/19 is 00001010.00000010.11100000.00000000 100 // the bits we want to cut **** *** 101 // 252.0.0.0/7 is 11111100.00000000.00000000.00000000 102 // After transplanting those 7 bits we get 103 // 11111100.01011100.00000000.00000000 104 // * ****** 105 // which is 252.92.0.0/14 106 net, err = network.CalculateOverlaySegment("10.2.224.0/19", config[1]) 107 c.Assert(err, jc.ErrorIsNil) 108 c.Assert(net, gc.NotNil) 109 c.Check(net.String(), gc.Equals, "252.92.0.0/14") 110 } 111 112 func (*FanConfigSuite) TestCalculateOverlaySegmentNonIPv4FanAddress(c *gc.C) { 113 // Use mapping from smaller IPv6 subnet to larger overlay. 114 config, err := network.ParseFanConfig("2001:db8::/16=2001:db7::/8") 115 116 // CalculateOverlaySegment does not support IPv6 addresses. 117 _, err = network.CalculateOverlaySegment("2001:db8::/16", config[0]) 118 c.Assert(err, gc.ErrorMatches, "fan address is not an IPv4 address.") 119 }