From 8a1c50abeb56854d7232a6e1aef1ab241559f85a Mon Sep 17 00:00:00 2001 From: Matus Mrekaj Date: Wed, 12 Feb 2025 14:53:43 +0100 Subject: [PATCH] correctly assign cidr to lb nodepools (#1654) Co-authored-by: CI/CD pipeline --- manifests/claudie/kustomization.yaml | 16 +- .../testing-framework/kustomization.yaml | 2 +- .../internal/service/create_desired_state.go | 20 ++ .../service/create_desired_state_test.go | 201 ++++++++++++++++++ 4 files changed, 230 insertions(+), 9 deletions(-) diff --git a/manifests/claudie/kustomization.yaml b/manifests/claudie/kustomization.yaml index e4982ec9c..a1abbf1a4 100644 --- a/manifests/claudie/kustomization.yaml +++ b/manifests/claudie/kustomization.yaml @@ -57,18 +57,18 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - name: ghcr.io/berops/claudie/ansibler - newTag: 6b6ef10-3236 + newTag: 4789f19-3239 - name: ghcr.io/berops/claudie/autoscaler-adapter - newTag: 6b6ef10-3236 + newTag: 4789f19-3239 - name: ghcr.io/berops/claudie/builder - newTag: 6b6ef10-3236 + newTag: 4789f19-3239 - name: ghcr.io/berops/claudie/claudie-operator - newTag: 6b6ef10-3236 + newTag: 4789f19-3239 - name: ghcr.io/berops/claudie/kube-eleven - newTag: 6b6ef10-3236 + newTag: 4789f19-3239 - name: ghcr.io/berops/claudie/kuber - newTag: 6b6ef10-3236 + newTag: 4789f19-3239 - name: ghcr.io/berops/claudie/manager - newTag: 6b6ef10-3236 + newTag: 4789f19-3239 - name: ghcr.io/berops/claudie/terraformer - newTag: 6b6ef10-3236 + newTag: 4789f19-3239 diff --git a/manifests/testing-framework/kustomization.yaml b/manifests/testing-framework/kustomization.yaml index d5541467e..48cfe210f 100644 --- a/manifests/testing-framework/kustomization.yaml +++ b/manifests/testing-framework/kustomization.yaml @@ -91,4 +91,4 @@ secretGenerator: images: - name: ghcr.io/berops/claudie/testing-framework - newTag: 6b6ef10-3236 + newTag: 4789f19-3239 diff --git a/services/manager/internal/service/create_desired_state.go b/services/manager/internal/service/create_desired_state.go index fea5bbf84..141249d08 100644 --- a/services/manager/internal/service/create_desired_state.go +++ b/services/manager/internal/service/create_desired_state.go @@ -11,6 +11,7 @@ import ( "slices" "strings" + "github.com/berops/claudie/internal/clusters" "github.com/berops/claudie/internal/hash" "github.com/berops/claudie/internal/manifest" "github.com/berops/claudie/internal/nodepools" @@ -376,6 +377,7 @@ func generateMissingDynamicNodes(nodepoolID string, usedNames map[string]struct{ func fillMissingCIDR(c *spec.ClusterState) error { // https://github.com/berops/claudie/issues/647 + // 1. generate cidrs for k8s nodepools. existing := make(map[string][]string) for p, nps := range nodepools.ByProviderRegion(c.GetCurrent().GetK8S().GetClusterInfo().GetNodePools()) { for _, np := range nodepools.ExtractDynamic(nps) { @@ -388,6 +390,24 @@ func fillMissingCIDR(c *spec.ClusterState) error { return fmt.Errorf("error while generating cidr for nodepool: %w", err) } } + + // 2. generate cidrs for each lb nodepool + for _, desired := range c.GetDesired().GetLoadBalancers().GetClusters() { + existing := make(map[string][]string) + if i := clusters.IndexLoadbalancerById(desired.GetClusterInfo().Id(), c.GetCurrent().GetLoadBalancers().GetClusters()); i >= 0 { + current := c.GetCurrent().GetLoadBalancers().GetClusters()[i] + for p, nps := range nodepools.ByProviderRegion(current.GetClusterInfo().GetNodePools()) { + for _, np := range nodepools.ExtractDynamic(nps) { + existing[p] = append(existing[p], np.Cidr) + } + } + } + for p, nps := range nodepools.ByProviderRegion(desired.GetClusterInfo().GetNodePools()) { + if err := calculateCIDR(baseSubnetCIDR, p, existing, nodepools.ExtractDynamic(nps)); err != nil { + return fmt.Errorf("error while generating cidr for loadbalancer %q, nodepools: %w", desired.GetClusterInfo().Id(), err) + } + } + } return nil } diff --git a/services/manager/internal/service/create_desired_state_test.go b/services/manager/internal/service/create_desired_state_test.go index 25536b357..e8571d17a 100644 --- a/services/manager/internal/service/create_desired_state_test.go +++ b/services/manager/internal/service/create_desired_state_test.go @@ -797,3 +797,204 @@ func TestGetCIDR(t *testing.T) { } } } + +func Test_fillMissingCIDR(t *testing.T) { + type args struct { + c *spec.ClusterState + } + tests := []struct { + name string + args args + wantErr bool + validate func(t *testing.T, args args) + }{ + { + name: "test01", + args: args{ + c: &spec.ClusterState{ + Current: &spec.Clusters{ + K8S: &spec.K8Scluster{ClusterInfo: &spec.ClusterInfo{ + Name: "k8s-current-test-01", + Hash: "01", + NodePools: []*spec.NodePool{ + { + Name: "k8s-01", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "10.0.0.0/24", + Region: "europe-west", + Provider: &spec.Provider{SpecName: "hetzner-1", CloudProviderName: "hetzner"}, + }}, + }, + { + Name: "k8s-02", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "10.0.1.0/24", + Region: "europe-east", + Provider: &spec.Provider{SpecName: "gcp-1", CloudProviderName: "gcp"}, + }}, + }, + }}}, + LoadBalancers: &spec.LoadBalancers{Clusters: []*spec.LBcluster{ + { + ClusterInfo: &spec.ClusterInfo{ + Name: "lb-current-test-01", + Hash: "03", + NodePools: []*spec.NodePool{ + { + Name: "lb-01", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "10.0.0.0/24", + Region: "europe-east", + Provider: &spec.Provider{SpecName: "gcp-1", CloudProviderName: "gcp"}, + }}, + }, + { + Name: "lb-02", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "10.0.1.0/24", + Region: "europe-east", + Provider: &spec.Provider{SpecName: "gcp-1", CloudProviderName: "gcp"}, + }}, + }, + }}, + }, + { + ClusterInfo: &spec.ClusterInfo{ + Name: "lb-current-test-02", + Hash: "04", + NodePools: []*spec.NodePool{ + { + Name: "lb-02-01", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "10.0.0.0/24", + Region: "europe-north", + Provider: &spec.Provider{SpecName: "oci-1", CloudProviderName: "oci"}, + }}, + }, + { + Name: "lb-02-02", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "10.0.1.0/24", + Region: "europe-north", + Provider: &spec.Provider{SpecName: "oci-2", CloudProviderName: "oci"}, + }}, + }, + }}, + }, + }}, + }, + Desired: &spec.Clusters{ + K8S: &spec.K8Scluster{ClusterInfo: &spec.ClusterInfo{ + Name: "k8s-current-test-01", + Hash: "01", + NodePools: []*spec.NodePool{ + { + Name: "k8s-01", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "10.0.0.0/24", + Region: "europe-west", + Provider: &spec.Provider{SpecName: "hetzner-1", CloudProviderName: "hetzner"}, + }}, + }, + { + Name: "k8s-03", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "", + Region: "europe-west", + Provider: &spec.Provider{SpecName: "hetzner-1", CloudProviderName: "hetzner"}, + }}, + }, + }}}, + LoadBalancers: &spec.LoadBalancers{Clusters: []*spec.LBcluster{ + { + ClusterInfo: &spec.ClusterInfo{ + Name: "lb-current-test-01", + Hash: "03", + NodePools: []*spec.NodePool{ + { + Name: "lb-01", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "10.0.0.0/24", + Region: "europe-east", + Provider: &spec.Provider{SpecName: "gcp-1", CloudProviderName: "gcp"}, + }}, + }, + { + Name: "lb-03", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "", + Region: "europe-east", + Provider: &spec.Provider{SpecName: "gcp-1", CloudProviderName: "gcp"}, + }}, + }, + }}, + }, + { + ClusterInfo: &spec.ClusterInfo{ + Name: "lb-current-test-02", + Hash: "04", + NodePools: []*spec.NodePool{ + { + Name: "lb-02-01", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "10.0.0.0/24", + Region: "europe-north", + Provider: &spec.Provider{SpecName: "oci-1", CloudProviderName: "oci"}, + }}, + }, + { + Name: "lb-02-02", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "10.0.1.0/24", + Region: "europe-north", + Provider: &spec.Provider{SpecName: "oci-2", CloudProviderName: "oci"}, + }}, + }, + }}, + }, + { + ClusterInfo: &spec.ClusterInfo{ + Name: "lb-current-test-03", + Hash: "04", + NodePools: []*spec.NodePool{ + { + Name: "lb-02-01", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "", + Region: "europe-north", + Provider: &spec.Provider{SpecName: "oci-1", CloudProviderName: "oci"}, + }}, + }, + { + Name: "lb-02-02", + Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{ + Cidr: "", + Region: "europe-north", + Provider: &spec.Provider{SpecName: "oci-2", CloudProviderName: "oci"}, + }}, + }, + }}, + }, + }}, + }, + }, + }, + wantErr: false, + validate: func(t *testing.T, args args) { + assert.Equal(t, "10.0.1.0/24", args.c.Desired.K8S.ClusterInfo.NodePools[1].GetDynamicNodePool().Cidr) + assert.Equal(t, "10.0.2.0/24", args.c.Desired.LoadBalancers.Clusters[0].ClusterInfo.NodePools[1].GetDynamicNodePool().Cidr) + assert.Equal(t, "10.0.0.0/24", args.c.Desired.LoadBalancers.Clusters[2].ClusterInfo.NodePools[0].GetDynamicNodePool().Cidr) + assert.Equal(t, "10.0.0.0/24", args.c.Desired.LoadBalancers.Clusters[2].ClusterInfo.NodePools[1].GetDynamicNodePool().Cidr) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := fillMissingCIDR(tt.args.c); (err != nil) != tt.wantErr { + t.Errorf("fillMissingCIDR() = %v want = %v", err, tt.wantErr) + } + tt.validate(t, tt.args) + }) + } +}