Skip to content

Commit 8a1c50a

Browse files
DespireCI/CD pipeline
and
CI/CD pipeline
authored
correctly assign cidr to lb nodepools (#1654)
Co-authored-by: CI/CD pipeline <CI/[email protected]>
1 parent cfe2346 commit 8a1c50a

File tree

4 files changed

+230
-9
lines changed

4 files changed

+230
-9
lines changed

manifests/claudie/kustomization.yaml

+8-8
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,18 @@ apiVersion: kustomize.config.k8s.io/v1beta1
5757
kind: Kustomization
5858
images:
5959
- name: ghcr.io/berops/claudie/ansibler
60-
newTag: 6b6ef10-3236
60+
newTag: 4789f19-3239
6161
- name: ghcr.io/berops/claudie/autoscaler-adapter
62-
newTag: 6b6ef10-3236
62+
newTag: 4789f19-3239
6363
- name: ghcr.io/berops/claudie/builder
64-
newTag: 6b6ef10-3236
64+
newTag: 4789f19-3239
6565
- name: ghcr.io/berops/claudie/claudie-operator
66-
newTag: 6b6ef10-3236
66+
newTag: 4789f19-3239
6767
- name: ghcr.io/berops/claudie/kube-eleven
68-
newTag: 6b6ef10-3236
68+
newTag: 4789f19-3239
6969
- name: ghcr.io/berops/claudie/kuber
70-
newTag: 6b6ef10-3236
70+
newTag: 4789f19-3239
7171
- name: ghcr.io/berops/claudie/manager
72-
newTag: 6b6ef10-3236
72+
newTag: 4789f19-3239
7373
- name: ghcr.io/berops/claudie/terraformer
74-
newTag: 6b6ef10-3236
74+
newTag: 4789f19-3239

manifests/testing-framework/kustomization.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,4 @@ secretGenerator:
9191

9292
images:
9393
- name: ghcr.io/berops/claudie/testing-framework
94-
newTag: 6b6ef10-3236
94+
newTag: 4789f19-3239

services/manager/internal/service/create_desired_state.go

+20
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"slices"
1212
"strings"
1313

14+
"github.com/berops/claudie/internal/clusters"
1415
"github.com/berops/claudie/internal/hash"
1516
"github.com/berops/claudie/internal/manifest"
1617
"github.com/berops/claudie/internal/nodepools"
@@ -376,6 +377,7 @@ func generateMissingDynamicNodes(nodepoolID string, usedNames map[string]struct{
376377

377378
func fillMissingCIDR(c *spec.ClusterState) error {
378379
// https://github.com/berops/claudie/issues/647
380+
// 1. generate cidrs for k8s nodepools.
379381
existing := make(map[string][]string)
380382
for p, nps := range nodepools.ByProviderRegion(c.GetCurrent().GetK8S().GetClusterInfo().GetNodePools()) {
381383
for _, np := range nodepools.ExtractDynamic(nps) {
@@ -388,6 +390,24 @@ func fillMissingCIDR(c *spec.ClusterState) error {
388390
return fmt.Errorf("error while generating cidr for nodepool: %w", err)
389391
}
390392
}
393+
394+
// 2. generate cidrs for each lb nodepool
395+
for _, desired := range c.GetDesired().GetLoadBalancers().GetClusters() {
396+
existing := make(map[string][]string)
397+
if i := clusters.IndexLoadbalancerById(desired.GetClusterInfo().Id(), c.GetCurrent().GetLoadBalancers().GetClusters()); i >= 0 {
398+
current := c.GetCurrent().GetLoadBalancers().GetClusters()[i]
399+
for p, nps := range nodepools.ByProviderRegion(current.GetClusterInfo().GetNodePools()) {
400+
for _, np := range nodepools.ExtractDynamic(nps) {
401+
existing[p] = append(existing[p], np.Cidr)
402+
}
403+
}
404+
}
405+
for p, nps := range nodepools.ByProviderRegion(desired.GetClusterInfo().GetNodePools()) {
406+
if err := calculateCIDR(baseSubnetCIDR, p, existing, nodepools.ExtractDynamic(nps)); err != nil {
407+
return fmt.Errorf("error while generating cidr for loadbalancer %q, nodepools: %w", desired.GetClusterInfo().Id(), err)
408+
}
409+
}
410+
}
391411
return nil
392412
}
393413

services/manager/internal/service/create_desired_state_test.go

+201
Original file line numberDiff line numberDiff line change
@@ -797,3 +797,204 @@ func TestGetCIDR(t *testing.T) {
797797
}
798798
}
799799
}
800+
801+
func Test_fillMissingCIDR(t *testing.T) {
802+
type args struct {
803+
c *spec.ClusterState
804+
}
805+
tests := []struct {
806+
name string
807+
args args
808+
wantErr bool
809+
validate func(t *testing.T, args args)
810+
}{
811+
{
812+
name: "test01",
813+
args: args{
814+
c: &spec.ClusterState{
815+
Current: &spec.Clusters{
816+
K8S: &spec.K8Scluster{ClusterInfo: &spec.ClusterInfo{
817+
Name: "k8s-current-test-01",
818+
Hash: "01",
819+
NodePools: []*spec.NodePool{
820+
{
821+
Name: "k8s-01",
822+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
823+
Cidr: "10.0.0.0/24",
824+
Region: "europe-west",
825+
Provider: &spec.Provider{SpecName: "hetzner-1", CloudProviderName: "hetzner"},
826+
}},
827+
},
828+
{
829+
Name: "k8s-02",
830+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
831+
Cidr: "10.0.1.0/24",
832+
Region: "europe-east",
833+
Provider: &spec.Provider{SpecName: "gcp-1", CloudProviderName: "gcp"},
834+
}},
835+
},
836+
}}},
837+
LoadBalancers: &spec.LoadBalancers{Clusters: []*spec.LBcluster{
838+
{
839+
ClusterInfo: &spec.ClusterInfo{
840+
Name: "lb-current-test-01",
841+
Hash: "03",
842+
NodePools: []*spec.NodePool{
843+
{
844+
Name: "lb-01",
845+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
846+
Cidr: "10.0.0.0/24",
847+
Region: "europe-east",
848+
Provider: &spec.Provider{SpecName: "gcp-1", CloudProviderName: "gcp"},
849+
}},
850+
},
851+
{
852+
Name: "lb-02",
853+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
854+
Cidr: "10.0.1.0/24",
855+
Region: "europe-east",
856+
Provider: &spec.Provider{SpecName: "gcp-1", CloudProviderName: "gcp"},
857+
}},
858+
},
859+
}},
860+
},
861+
{
862+
ClusterInfo: &spec.ClusterInfo{
863+
Name: "lb-current-test-02",
864+
Hash: "04",
865+
NodePools: []*spec.NodePool{
866+
{
867+
Name: "lb-02-01",
868+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
869+
Cidr: "10.0.0.0/24",
870+
Region: "europe-north",
871+
Provider: &spec.Provider{SpecName: "oci-1", CloudProviderName: "oci"},
872+
}},
873+
},
874+
{
875+
Name: "lb-02-02",
876+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
877+
Cidr: "10.0.1.0/24",
878+
Region: "europe-north",
879+
Provider: &spec.Provider{SpecName: "oci-2", CloudProviderName: "oci"},
880+
}},
881+
},
882+
}},
883+
},
884+
}},
885+
},
886+
Desired: &spec.Clusters{
887+
K8S: &spec.K8Scluster{ClusterInfo: &spec.ClusterInfo{
888+
Name: "k8s-current-test-01",
889+
Hash: "01",
890+
NodePools: []*spec.NodePool{
891+
{
892+
Name: "k8s-01",
893+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
894+
Cidr: "10.0.0.0/24",
895+
Region: "europe-west",
896+
Provider: &spec.Provider{SpecName: "hetzner-1", CloudProviderName: "hetzner"},
897+
}},
898+
},
899+
{
900+
Name: "k8s-03",
901+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
902+
Cidr: "",
903+
Region: "europe-west",
904+
Provider: &spec.Provider{SpecName: "hetzner-1", CloudProviderName: "hetzner"},
905+
}},
906+
},
907+
}}},
908+
LoadBalancers: &spec.LoadBalancers{Clusters: []*spec.LBcluster{
909+
{
910+
ClusterInfo: &spec.ClusterInfo{
911+
Name: "lb-current-test-01",
912+
Hash: "03",
913+
NodePools: []*spec.NodePool{
914+
{
915+
Name: "lb-01",
916+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
917+
Cidr: "10.0.0.0/24",
918+
Region: "europe-east",
919+
Provider: &spec.Provider{SpecName: "gcp-1", CloudProviderName: "gcp"},
920+
}},
921+
},
922+
{
923+
Name: "lb-03",
924+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
925+
Cidr: "",
926+
Region: "europe-east",
927+
Provider: &spec.Provider{SpecName: "gcp-1", CloudProviderName: "gcp"},
928+
}},
929+
},
930+
}},
931+
},
932+
{
933+
ClusterInfo: &spec.ClusterInfo{
934+
Name: "lb-current-test-02",
935+
Hash: "04",
936+
NodePools: []*spec.NodePool{
937+
{
938+
Name: "lb-02-01",
939+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
940+
Cidr: "10.0.0.0/24",
941+
Region: "europe-north",
942+
Provider: &spec.Provider{SpecName: "oci-1", CloudProviderName: "oci"},
943+
}},
944+
},
945+
{
946+
Name: "lb-02-02",
947+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
948+
Cidr: "10.0.1.0/24",
949+
Region: "europe-north",
950+
Provider: &spec.Provider{SpecName: "oci-2", CloudProviderName: "oci"},
951+
}},
952+
},
953+
}},
954+
},
955+
{
956+
ClusterInfo: &spec.ClusterInfo{
957+
Name: "lb-current-test-03",
958+
Hash: "04",
959+
NodePools: []*spec.NodePool{
960+
{
961+
Name: "lb-02-01",
962+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
963+
Cidr: "",
964+
Region: "europe-north",
965+
Provider: &spec.Provider{SpecName: "oci-1", CloudProviderName: "oci"},
966+
}},
967+
},
968+
{
969+
Name: "lb-02-02",
970+
Type: &spec.NodePool_DynamicNodePool{DynamicNodePool: &spec.DynamicNodePool{
971+
Cidr: "",
972+
Region: "europe-north",
973+
Provider: &spec.Provider{SpecName: "oci-2", CloudProviderName: "oci"},
974+
}},
975+
},
976+
}},
977+
},
978+
}},
979+
},
980+
},
981+
},
982+
wantErr: false,
983+
validate: func(t *testing.T, args args) {
984+
assert.Equal(t, "10.0.1.0/24", args.c.Desired.K8S.ClusterInfo.NodePools[1].GetDynamicNodePool().Cidr)
985+
assert.Equal(t, "10.0.2.0/24", args.c.Desired.LoadBalancers.Clusters[0].ClusterInfo.NodePools[1].GetDynamicNodePool().Cidr)
986+
assert.Equal(t, "10.0.0.0/24", args.c.Desired.LoadBalancers.Clusters[2].ClusterInfo.NodePools[0].GetDynamicNodePool().Cidr)
987+
assert.Equal(t, "10.0.0.0/24", args.c.Desired.LoadBalancers.Clusters[2].ClusterInfo.NodePools[1].GetDynamicNodePool().Cidr)
988+
},
989+
},
990+
}
991+
992+
for _, tt := range tests {
993+
t.Run(tt.name, func(t *testing.T) {
994+
if err := fillMissingCIDR(tt.args.c); (err != nil) != tt.wantErr {
995+
t.Errorf("fillMissingCIDR() = %v want = %v", err, tt.wantErr)
996+
}
997+
tt.validate(t, tt.args)
998+
})
999+
}
1000+
}

0 commit comments

Comments
 (0)