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  }