summaryrefslogtreecommitdiff
path: root/funcs
diff options
context:
space:
mode:
authorDave Henderson <dhenderson@gmail.com>2022-03-31 18:29:20 -0400
committerDave Henderson <dhenderson@gmail.com>2022-05-06 22:58:04 -0400
commit254de4e4e97fe1550d7092bbf25a8a6c31f0fd74 (patch)
tree43130543e5ddb045db63a8b90d689c44ceb17e6d /funcs
parent2f294d7884667800579e3ac3a16241e2df8698bb (diff)
Rename to CIDR*, generate docs
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'funcs')
-rw-r--r--funcs/net.go108
-rw-r--r--funcs/net_test.go70
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())