Skip to content

Commit 8e12d49

Browse files
committed
fix: use Pods CIDR from the Cluster spec
1 parent e6fb22f commit 8e12d49

File tree

4 files changed

+108
-5
lines changed

4 files changed

+108
-5
lines changed

pkg/handlers/cni/calico/handler.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,13 +283,15 @@ func generateProviderCNICRS(
283283
},
284284
)
285285

286-
podSubnet, podSubnetSpecified := cluster.GetAnnotations()[cni.PodSubnetAnnotationKey]
286+
podSubnet, err := cni.PodCIDR(cluster)
287+
if err != nil {
288+
return nil, err
289+
}
287290

288291
var b bytes.Buffer
289292

290293
for _, o := range parsed {
291-
if podSubnetSpecified &&
292-
podSubnet != "" &&
294+
if podSubnet != "" &&
293295
o.GetObjectKind().GroupVersionKind().GroupKind() == calicoInstallationGK {
294296
obj := o.(*unstructured.Unstructured).Object
295297

pkg/handlers/cni/cluster.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package cni
2+
3+
import (
4+
"errors"
5+
6+
capiv1 "sigs.k8s.io/cluster-api/api/v1beta1"
7+
)
8+
9+
var (
10+
ErrMultiplePodsCIDRBlocks = errors.New("cluster has more than 1 Pods network CIDR blocks")
11+
)
12+
13+
// PodCIDR will return the Pods network CIDR.
14+
// If not set returns an empty string.
15+
// If more than 1 CIDRBlocks is defined will return an error.
16+
func PodCIDR(cluster *capiv1.Cluster) (string, error) {
17+
var subnets []string
18+
if cluster.Spec.ClusterNetwork != nil &&
19+
cluster.Spec.ClusterNetwork.Pods != nil {
20+
subnets = cluster.Spec.ClusterNetwork.Pods.CIDRBlocks
21+
}
22+
switch {
23+
case len(subnets) == 1:
24+
return cluster.Spec.ClusterNetwork.Pods.CIDRBlocks[0], nil
25+
case len(subnets) > 1:
26+
return "", ErrMultiplePodsCIDRBlocks
27+
default:
28+
return "", nil
29+
}
30+
}

pkg/handlers/cni/cluster_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package cni
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
"sigs.k8s.io/cluster-api/api/v1beta1"
8+
)
9+
10+
func Test_PodCIDR(t *testing.T) {
11+
t.Parallel()
12+
13+
tests := []struct {
14+
name string
15+
cluster *v1beta1.Cluster
16+
wantCIDR string
17+
wantErr error
18+
}{
19+
{
20+
name: "no Pods CIDR set",
21+
cluster: &v1beta1.Cluster{
22+
Spec: v1beta1.ClusterSpec{},
23+
},
24+
},
25+
{
26+
name: "no Pods CIDR set, but Services CIDR is set",
27+
cluster: &v1beta1.Cluster{
28+
Spec: v1beta1.ClusterSpec{
29+
ClusterNetwork: &v1beta1.ClusterNetwork{
30+
Services: &v1beta1.NetworkRanges{
31+
CIDRBlocks: []string{"192.168.0.1/16"},
32+
},
33+
},
34+
},
35+
},
36+
},
37+
{
38+
name: "Pods CIDR set",
39+
cluster: &v1beta1.Cluster{
40+
Spec: v1beta1.ClusterSpec{
41+
ClusterNetwork: &v1beta1.ClusterNetwork{
42+
Pods: &v1beta1.NetworkRanges{
43+
CIDRBlocks: []string{"192.168.0.1/16"},
44+
},
45+
},
46+
},
47+
},
48+
wantCIDR: "192.168.0.1/16",
49+
},
50+
{
51+
name: "error: multiple Pods CIDRs set",
52+
cluster: &v1beta1.Cluster{
53+
Spec: v1beta1.ClusterSpec{
54+
ClusterNetwork: &v1beta1.ClusterNetwork{
55+
Pods: &v1beta1.NetworkRanges{
56+
CIDRBlocks: []string{"192.168.0.1/16", "10.0.0.1/16"},
57+
},
58+
},
59+
},
60+
},
61+
wantErr: ErrMultiplePodsCIDRBlocks,
62+
},
63+
}
64+
for idx := range tests {
65+
tt := tests[idx]
66+
t.Run(tt.name, func(t *testing.T) {
67+
t.Parallel()
68+
cidr, err := PodCIDR(tt.cluster)
69+
assert.ErrorIs(t, err, tt.wantErr)
70+
assert.Equal(t, tt.wantCIDR, cidr)
71+
})
72+
}
73+
}

pkg/handlers/cni/constants.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,4 @@ import "github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers"
77

88
const (
99
CNIProviderLabelKey = handlers.MetadataDomain + "/cni"
10-
11-
PodSubnetAnnotationKey = handlers.MetadataDomain + "/pod-subnet"
1210
)

0 commit comments

Comments
 (0)