From 57251ce0aff25bde3c79b08a3b5ec3fa0b7761f6 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Sat, 25 May 2024 21:26:35 +0000 Subject: [PATCH] rings: RingThreePrefix() Ring 3 corresponds to the pods of the kubernetes cluster of a region Signed-off-by: Alejandro Mery --- pkg/rings/rings.go | 3 +++ pkg/rings/three.go | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 pkg/rings/three.go diff --git a/pkg/rings/rings.go b/pkg/rings/rings.go index f75def5..73a819f 100644 --- a/pkg/rings/rings.go +++ b/pkg/rings/rings.go @@ -23,6 +23,9 @@ const ( RingZeroBits = 16 // RingOneBits indicates the size of the prefix on the ring 1 (lan) network. RingOneBits = 20 + // RingThreeBits indicates the size of the prefix on the ring 3 (pods) network + // of the kubernetes cluster of a region. + RingThreeBits = 12 ) // RegionID is the identifier of a region, valid between 1 and [RegionMax]. diff --git a/pkg/rings/three.go b/pkg/rings/three.go new file mode 100644 index 0000000..20c7c1b --- /dev/null +++ b/pkg/rings/three.go @@ -0,0 +1,18 @@ +package rings + +import "net/netip" + +// RingThreePrefix returns the subnet corresponding to +// the pods of a cluster. +// +// Ring 3 is a `10.(region_id << 4).0.0/12` network +func RingThreePrefix(region RegionID) (subnet netip.Prefix, err error) { + switch { + case !region.Valid(): + err = ErrOutOfRange(region, "region") + default: + addr := AddrFrom4(10, uint(region)<<4, 0, 0) + subnet = netip.PrefixFrom(addr, RingThreeBits) + } + return subnet, err +}