From 16f6f1141c66e1087ee727009fbc6e6c08d10104 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Sat, 25 May 2024 21:30:31 +0000 Subject: [PATCH] rings: RingTwoPrefix() Ring 2 is the service network shared by all kubernetes clusters. Signed-off-by: Alejandro Mery --- pkg/rings/rings.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/pkg/rings/rings.go b/pkg/rings/rings.go index ba88eee..46e700d 100644 --- a/pkg/rings/rings.go +++ b/pkg/rings/rings.go @@ -24,6 +24,9 @@ const ( RingZeroBits = 16 // RingOneBits indicates the size of the prefix on the ring 1 (lan) network. RingOneBits = 20 + // RingTwoBits indicates the size of the prefix on the ring 2 (services) network + // of all kubernetes clusters. + RingTwoBits = 20 // RingThreeBits indicates the size of the prefix on the ring 3 (pods) network // of the kubernetes cluster of a region. RingThreeBits = 12 @@ -131,6 +134,22 @@ func RingOneAddress(region RegionID, zone ZoneID, node NodeID) (addr netip.Addr, return addr, err } +// RingTwoPrefix represents the services of a cluster +// +// Ring 2 subnets are of the form `10.(region_id).0.0/20`, +// using the address space that would belong to the ring 3 +// region_id 0. +func RingTwoPrefix(region RegionID) (cidr netip.Prefix, err error) { + switch { + case !region.Valid(): + err = ErrOutOfRange(region, "region") + default: + addr := unsafeRingTwoAddress(region, 0) + cidr = netip.PrefixFrom(addr, RingTwoBits) + } + return cidr, err +} + // RingThreePrefix returns the subnet corresponding to // the pods of a cluster. // @@ -165,6 +184,15 @@ func unsafeRingOneAddress(region RegionID, zone ZoneID, node NodeID) netip.Addr return AddrFrom4(10, r, z<<4+n1, n0) } +func unsafeRingTwoAddress(region RegionID, n uint) netip.Addr { + r := uint(region) + + n1 := n >> 8 + n0 := n >> 0 + + return AddrFrom4(10, r, n1, n0) +} + func unsafeRingThreeAddress(region RegionID, n uint) netip.Addr { r := uint(region)