diff options
Diffstat (limited to 'funcs')
| -rw-r--r-- | funcs/net.go | 108 | ||||
| -rw-r--r-- | funcs/net_test.go | 70 |
2 files changed, 106 insertions, 72 deletions
diff --git a/funcs/net.go b/funcs/net.go index 2755b9b1..2790b194 100644 --- a/funcs/net.go +++ b/funcs/net.go @@ -86,70 +86,87 @@ func (f NetFuncs) ParseIPRange(iprange interface{}) (netaddr.IPRange, error) { } func (f NetFuncs) parseStdnetIPNet(prefix interface{}) (*stdnet.IPNet, error) { - if n, ok := prefix.(*stdnet.IPNet); ok { - return n, nil - } - if n, ok := prefix.(netaddr.IPPrefix); ok { - return n.Masked().IPNet(), nil - } - if n, ok := prefix.(netip.Prefix); ok { + switch p := prefix.(type) { + case *stdnet.IPNet: + return p, nil + case netaddr.IPPrefix: + return p.Masked().IPNet(), nil + case netip.Prefix: net := &stdnet.IPNet{ - IP: n.Masked().Addr().AsSlice(), - Mask: stdnet.CIDRMask(n.Bits(), n.Addr().BitLen()), + IP: p.Masked().Addr().AsSlice(), + Mask: stdnet.CIDRMask(p.Bits(), p.Addr().BitLen()), } return net, nil + default: + _, network, err := stdnet.ParseCIDR(conv.ToString(prefix)) + return network, err } +} - _, network, err := stdnet.ParseCIDR(conv.ToString(prefix)) - return network, err +func (f NetFuncs) parseNetipPrefix(prefix interface{}) (netip.Prefix, error) { + switch p := prefix.(type) { + case *stdnet.IPNet: + return f.ipPrefixFromIPNet(p), nil + case netaddr.IPPrefix: + return f.ipPrefixFromIPNet(p.Masked().IPNet()), nil + case netip.Prefix: + return p, nil + default: + return netip.ParsePrefix(conv.ToString(prefix)) + } } -func (f NetFuncs) ipFromNetIp(n stdnet.IP) netaddr.IP { - ip, _ := netaddr.FromStdIP(n) +func (f NetFuncs) ipFromNetIP(n stdnet.IP) netip.Addr { + ip, _ := netip.AddrFromSlice(n) return ip } -func (f NetFuncs) ipPrefixFromIpNet(n *stdnet.IPNet) netaddr.IPPrefix { - prefix, _ := netaddr.FromStdIPNet(n) - return prefix +func (f NetFuncs) ipPrefixFromIPNet(n *stdnet.IPNet) netip.Prefix { + ip, _ := netip.AddrFromSlice(n.IP) + ones, _ := n.Mask.Size() + return netip.PrefixFrom(ip, ones) } -// func (f NetFuncs) addrFromNetIp(n stdnet.IP) netip.Addr { -// ip, _ := netip.AddrFromSlice(n) -// return ip -// } - -// func (f NetFuncs) prefixFromIpNet(n *stdnet.IPNet) netip.Prefix { -// ip, _ := netip.AddrFromSlice(n.IP) -// bits, _ := n.Mask.Size() -// prefix := netip.PrefixFrom(ip, bits) -// return prefix -// } +// CIDRHost - +// Experimental! +func (f NetFuncs) CIDRHost(hostnum interface{}, prefix interface{}) (netip.Addr, error) { + if err := checkExperimental(f.ctx); err != nil { + return netip.Addr{}, err + } -// CidrHost - -func (f NetFuncs) CidrHost(hostnum interface{}, prefix interface{}) (netaddr.IP, error) { network, err := f.parseStdnetIPNet(prefix) if err != nil { - return netaddr.IP{}, err + return netip.Addr{}, err } ip, err := cidr.HostBig(network, big.NewInt(conv.ToInt64(hostnum))) - return f.ipFromNetIp(ip), err + + return f.ipFromNetIP(ip), err } -// CidrNetmask - -func (f NetFuncs) CidrNetmask(prefix interface{}) (netaddr.IP, error) { +// CIDRNetmask - +// Experimental! +func (f NetFuncs) CIDRNetmask(prefix interface{}) (netip.Addr, error) { + if err := checkExperimental(f.ctx); err != nil { + return netip.Addr{}, err + } + network, err := f.parseStdnetIPNet(prefix) if err != nil { - return netaddr.IP{}, err + return netip.Addr{}, err } netmask := stdnet.IP(network.Mask) - return f.ipFromNetIp(netmask), nil + return f.ipFromNetIP(netmask), nil } -// CidrSubnets - -func (f NetFuncs) CidrSubnets(newbits interface{}, prefix interface{}) ([]netaddr.IPPrefix, error) { +// CIDRSubnets - +// Experimental! +func (f NetFuncs) CIDRSubnets(newbits interface{}, prefix interface{}) ([]netip.Prefix, error) { + if err := checkExperimental(f.ctx); err != nil { + return nil, err + } + network, err := f.parseStdnetIPNet(prefix) if err != nil { return nil, err @@ -161,20 +178,25 @@ func (f NetFuncs) CidrSubnets(newbits interface{}, prefix interface{}) ([]netadd } maxNetNum := int64(1 << uint64(nBits)) - retValues := make([]netaddr.IPPrefix, maxNetNum) + retValues := make([]netip.Prefix, maxNetNum) for i := int64(0); i < maxNetNum; i++ { subnet, err := cidr.SubnetBig(network, nBits, big.NewInt(i)) if err != nil { return nil, err } - retValues[i] = f.ipPrefixFromIpNet(subnet) + retValues[i] = f.ipPrefixFromIPNet(subnet) } return retValues, nil } -// CidrSubnetSizes - -func (f NetFuncs) CidrSubnetSizes(args ...interface{}) ([]netaddr.IPPrefix, error) { +// CIDRSubnetSizes - +// Experimental! +func (f NetFuncs) CIDRSubnetSizes(args ...interface{}) ([]netip.Prefix, error) { + if err := checkExperimental(f.ctx); err != nil { + return nil, err + } + if len(args) < 2 { return nil, errors.Errorf("wrong number of args: want 2 or more, got %d", len(args)) } @@ -189,7 +211,7 @@ func (f NetFuncs) CidrSubnetSizes(args ...interface{}) ([]netaddr.IPPrefix, erro firstLength := newbits[0] firstLength += startPrefixLen - retValues := make([]netaddr.IPPrefix, len(newbits)) + retValues := make([]netip.Prefix, len(newbits)) current, _ := cidr.PreviousSubnet(network, firstLength) @@ -226,7 +248,7 @@ func (f NetFuncs) CidrSubnetSizes(args ...interface{}) ([]netaddr.IPPrefix, erro return nil, errors.Errorf("not enough remaining address space for a subnet with a prefix of %d bits after %s", length, current.String()) } current = next - retValues[i] = f.ipPrefixFromIpNet(current) + retValues[i] = f.ipPrefixFromIPNet(current) } return retValues, nil diff --git a/funcs/net_test.go b/funcs/net_test.go index e640e471..0b20ade9 100644 --- a/funcs/net_test.go +++ b/funcs/net_test.go @@ -7,6 +7,7 @@ import ( "strconv" "testing" + "github.com/hairyhenderson/gomplate/v3/internal/config" "github.com/stretchr/testify/assert" "inet.af/netaddr" ) @@ -72,79 +73,90 @@ func TestParseIPRange(t *testing.T) { assert.Equal(t, "192.168.0.2-192.168.23.255", iprange.String()) } -func TestCidrHost(t *testing.T) { - n := NetFuncs{} +func testNetNS() *NetFuncs { + ctx := context.Background() + cfg := config.FromContext(ctx) + cfg.Experimental = true + ctx = config.ContextWithConfig(ctx, cfg) + + return &NetFuncs{ + ctx: ctx, + } +} + +func TestCIDRHost(t *testing.T) { + n := testNetNS() // net.IPNet _, netIP, _ := stdnet.ParseCIDR("10.12.127.0/20") - ip, err := n.CidrHost(16, netIP) + ip, err := n.CIDRHost(16, netIP) assert.NoError(t, err) assert.Equal(t, "10.12.112.16", ip.String()) - ip, err = n.CidrHost(268, netIP) + ip, err = n.CIDRHost(268, netIP) assert.NoError(t, err) assert.Equal(t, "10.12.113.12", ip.String()) _, netIP, _ = stdnet.ParseCIDR("fd00:fd12:3456:7890:00a2::/72") - ip, err = n.CidrHost(34, netIP) + ip, err = n.CIDRHost(34, netIP) assert.NoError(t, err) assert.Equal(t, "fd00:fd12:3456:7890::22", ip.String()) // inet.af/netaddr.IPPrefix ipPrefix, _ := n.ParseIPPrefix("10.12.127.0/20") - ip, err = n.CidrHost(16, ipPrefix) + ip, err = n.CIDRHost(16, ipPrefix) assert.NoError(t, err) assert.Equal(t, "10.12.112.16", ip.String()) - ip, err = n.CidrHost(268, ipPrefix) + ip, err = n.CIDRHost(268, ipPrefix) assert.NoError(t, err) assert.Equal(t, "10.12.113.12", ip.String()) ipPrefix, _ = n.ParseIPPrefix("fd00:fd12:3456:7890:00a2::/72") - ip, err = n.CidrHost(34, ipPrefix) + ip, err = n.CIDRHost(34, ipPrefix) assert.NoError(t, err) assert.Equal(t, "fd00:fd12:3456:7890::22", ip.String()) // net/netip.Prefix - prefix, _ := netip.ParsePrefix("10.12.127.0/20") + prefix := netip.MustParsePrefix("10.12.127.0/20") - ip, err = n.CidrHost(16, prefix) + ip, err = n.CIDRHost(16, prefix) assert.NoError(t, err) assert.Equal(t, "10.12.112.16", ip.String()) - ip, err = n.CidrHost(268, prefix) + ip, err = n.CIDRHost(268, prefix) assert.NoError(t, err) assert.Equal(t, "10.12.113.12", ip.String()) - prefix, _ = netip.ParsePrefix("fd00:fd12:3456:7890:00a2::/72") - ip, err = n.CidrHost(34, prefix) + prefix = netip.MustParsePrefix("fd00:fd12:3456:7890:00a2::/72") + ip, err = n.CIDRHost(34, prefix) assert.NoError(t, err) assert.Equal(t, "fd00:fd12:3456:7890::22", ip.String()) } -func TestCidrNetmask(t *testing.T) { - n := NetFuncs{} +func TestCIDRNetmask(t *testing.T) { + n := testNetNS() - ip, err := n.CidrNetmask("10.0.0.0/12") + ip, err := n.CIDRNetmask("10.0.0.0/12") assert.NoError(t, err) assert.Equal(t, "255.240.0.0", ip.String()) - ip, err = n.CidrNetmask("fd00:fd12:3456:7890:00a2::/72") + ip, err = n.CIDRNetmask("fd00:fd12:3456:7890:00a2::/72") assert.NoError(t, err) assert.Equal(t, "ffff:ffff:ffff:ffff:ff00::", ip.String()) } -func TestCidrSubnets(t *testing.T) { - n := NetFuncs{} - _, network, _ := stdnet.ParseCIDR("10.0.0.0/16") +func TestCIDRSubnets(t *testing.T) { + n := testNetNS() + network := netip.MustParsePrefix("10.0.0.0/16") - subnets, err := n.CidrSubnets(-1, network) + subnets, err := n.CIDRSubnets(-1, network) assert.Nil(t, subnets) assert.Error(t, err) - subnets, err = n.CidrSubnets(2, network) + subnets, err = n.CIDRSubnets(2, network) assert.NoError(t, err) assert.Len(t, subnets, 4) assert.Equal(t, "10.0.0.0/18", subnets[0].String()) @@ -153,23 +165,23 @@ func TestCidrSubnets(t *testing.T) { assert.Equal(t, "10.0.192.0/18", subnets[3].String()) } -func TestCidrSubnetSizes(t *testing.T) { - n := NetFuncs{} - _, network, _ := stdnet.ParseCIDR("10.1.0.0/16") +func TestCIDRSubnetSizes(t *testing.T) { + n := testNetNS() + network := netip.MustParsePrefix("10.1.0.0/16") - subnets, err := n.CidrSubnetSizes(network) + subnets, err := n.CIDRSubnetSizes(network) assert.Nil(t, subnets) assert.Error(t, err) - subnets, err = n.CidrSubnetSizes(32, network) + subnets, err = n.CIDRSubnetSizes(32, network) assert.Nil(t, subnets) assert.Error(t, err) - subnets, err = n.CidrSubnetSizes(-1, network) + subnets, err = n.CIDRSubnetSizes(-1, network) assert.Nil(t, subnets) assert.Error(t, err) - subnets, err = n.CidrSubnetSizes(4, 4, 8, 4, network) + subnets, err = n.CIDRSubnetSizes(4, 4, 8, 4, network) assert.NoError(t, err) assert.Len(t, subnets, 4) assert.Equal(t, "10.1.0.0/20", subnets[0].String()) |
