Files
jpictl/pkg/rings/rings.go
T
amery 032273e67e rings: WIP
Signed-off-by: Alejandro Mery <amery@jpi.io>
2024-05-19 03:33:22 +00:00

119 lines
2.9 KiB
Go

// Package rings implements ...
package rings
import (
"net/netip"
)
const (
RegionBits = 4
ZoneBits = 4
NodeBits = 12
NodeZeroBits = 8
RegionMax = (1 << RegionBits) - 1
ZoneMax = (1 << ZoneBits) - 1
NodeMax = (1 << NodeBits) - 1
NodeZeroMax = (1 << NodeZeroBits) - 1
RingZeroBits = 20
RingOneBits = 20
RingTwoBits = 20
RingThreeBits = 12
)
type (
RegionID int
ZoneID int
NodeID int
)
func (n RegionID) Valid() bool { return n > 0 && n <= RegionMax }
func (n ZoneID) Valid() bool { return n > 0 && n <= ZoneMax }
func (n NodeID) Valid() bool { return n > 0 && n <= NodeMax }
func (n NodeID) ValidZero() bool { return n > 0 && n <= NodeZeroMax }
// 10.0.(region_id << 4 + zone_id).(node_id)/20 for ring 0
func RingZeroAddress(region RegionID, zone ZoneID, node NodeID) (addr netip.Addr, err error) {
switch {
case !region.Valid():
err = ErrOutOfRange(region, "region")
case !zone.Valid():
err = ErrOutOfRange(zone, "zone")
case !node.ValidZero():
err = ErrOutOfRange(node, "node")
default:
addr = addrFrom4(10, 0, uint(region)<<4+uint(zone), uint(node))
}
return addr, err
}
func RingZeroPrefix(region RegionID, zone ZoneID) (cidr netip.Prefix, err error) {
switch {
case !region.Valid():
err = ErrOutOfRange(region, "region")
case !zone.Valid():
err = ErrOutOfRange(zone, "zone")
default:
addr := addrFrom4(10, 0, uint(region)<<4+uint(zone), 0)
cidr = netip.PrefixFrom(addr, RingZeroBits)
}
return cidr, err
}
// 10.(region_id).(zone_id << 4).(node_id)/20 for ring 1
func RingOneAddress(region RegionID, zone ZoneID, node NodeID) (addr netip.Addr, err error) {
switch {
case !region.Valid():
err = ErrOutOfRange(region, "region")
case !zone.Valid():
err = ErrOutOfRange(zone, "zone")
case !node.Valid():
err = ErrOutOfRange(node, "node")
default:
n1 := uint(node) / 8
n2 := uint(node) % 8
addr = addrFrom4(10, uint(region), uint(zone)<<4+n1, n2)
}
return addr, err
}
func RingOnePrefix(region RegionID, zone ZoneID) (cidr netip.Prefix, err error) {
switch {
case !region.Valid():
err = ErrOutOfRange(region, "region")
case !zone.Valid():
err = ErrOutOfRange(zone, "zone")
default:
addr := addrFrom4(10, uint(region), uint(zone)<<4, 0)
cidr = netip.PrefixFrom(addr, RingOneBits)
}
return cidr, err
}
// 10.(region_id).0.0/20 for ring 2
func RingTwoPrefix(region RegionID) (cidr netip.Prefix, err error) {
switch {
case !region.Valid():
err = ErrOutOfRange(region, "region")
default:
addr := addrFrom4(10, uint(region), 0, 0)
cidr = netip.PrefixFrom(addr, RingTwoBits)
}
return cidr, err
}
// 10.(region_id << 4).0.0/12 for ring 3
func RingThreePrefix(region RegionID) (cidr netip.Prefix, err error) {
switch {
case !region.Valid():
err = ErrOutOfRange(region, "region")
default:
addr := addrFrom4(10, uint(region)<<4, 0, 0)
cidr = netip.PrefixFrom(addr, RingThreeBits)
}
return cidr, err
}