@@ -21,7 +21,11 @@ import (
2121 "reflect"
2222 "testing"
2323
24+ "github.com/aws/aws-sdk-go-v2/aws"
25+ "github.com/aws/aws-sdk-go-v2/service/ec2"
26+ "k8s.io/kops/cloudmock/aws/mockec2"
2427 "k8s.io/kops/pkg/apis/kops"
28+ "k8s.io/kops/upup/pkg/fi/cloudup/awsup"
2529)
2630
2731func Test_AssignSubnets (t * testing.T ) {
@@ -147,3 +151,73 @@ func Test_AssignSubnets(t *testing.T) {
147151 })
148152 }
149153}
154+
155+ func Test_AssignSubnetZones (t * testing.T ) {
156+ buildCloud := func () * awsup.MockAWSCloud {
157+ cloud := awsup .BuildMockAWSCloud ("us-test-1" , "abc" )
158+ mockEC2 := & mockec2.MockEC2 {}
159+ cloud .MockEC2 = mockEC2
160+
161+ mockEC2 .CreateVpcWithId (& ec2.CreateVpcInput {
162+ CidrBlock : aws .String ("172.20.0.0/16" ),
163+ }, "vpc-12345678" )
164+ mockEC2 .CreateSubnetWithId (& ec2.CreateSubnetInput {
165+ VpcId : aws .String ("vpc-12345678" ),
166+ AvailabilityZone : aws .String ("us-test-1a" ),
167+ CidrBlock : aws .String ("172.20.32.0/19" ),
168+ }, "subnet-a" )
169+ mockEC2 .CreateSubnetWithId (& ec2.CreateSubnetInput {
170+ VpcId : aws .String ("vpc-12345678" ),
171+ AvailabilityZone : aws .String ("us-test-1b" ),
172+ Ipv6CidrBlock : aws .String ("2001:db8::/64" ),
173+ }, "subnet-b" )
174+ return cloud
175+ }
176+
177+ buildCluster := func (subnets []kops.ClusterSubnetSpec ) * kops.Cluster {
178+ c := & kops.Cluster {}
179+ c .Spec .CloudProvider .AWS = & kops.AWSSpec {}
180+ c .Spec .Networking .NetworkID = "vpc-12345678"
181+ c .Spec .Networking .NetworkCIDR = "172.20.0.0/16"
182+ c .Spec .Networking .Subnets = subnets
183+ return c
184+ }
185+
186+ t .Run ("zone is backfilled from the cloud" , func (t * testing.T ) {
187+ c := buildCluster ([]kops.ClusterSubnetSpec {
188+ {Name : "a" , ID : "subnet-a" , CIDR : "172.20.32.0/19" , Type : kops .SubnetTypePublic },
189+ })
190+
191+ if err := assignCIDRsToSubnets (c , buildCloud ()); err != nil {
192+ t .Fatalf ("unexpected error: %v" , err )
193+ }
194+ if zone := c .Spec .Networking .Subnets [0 ].Zone ; zone != "us-test-1a" {
195+ t .Fatalf ("unexpected zone: %q" , zone )
196+ }
197+ })
198+
199+ t .Run ("IPv6-only private subnets do not require an IPv4 CIDR" , func (t * testing.T ) {
200+ c := buildCluster ([]kops.ClusterSubnetSpec {
201+ {Name : "a" , ID : "subnet-a" , CIDR : "172.20.32.0/19" , Type : kops .SubnetTypePublic },
202+ {Name : "b" , ID : "subnet-b" , IPv6CIDR : "2001:db8::/64" , Zone : "us-test-1b" , Type : kops .SubnetTypePrivate },
203+ })
204+
205+ if err := assignCIDRsToSubnets (c , buildCloud ()); err != nil {
206+ t .Fatalf ("unexpected error: %v" , err )
207+ }
208+ if zone := c .Spec .Networking .Subnets [0 ].Zone ; zone != "us-test-1a" {
209+ t .Fatalf ("unexpected zone: %q" , zone )
210+ }
211+ })
212+
213+ t .Run ("errors when the zone cannot be determined" , func (t * testing.T ) {
214+ c := buildCluster ([]kops.ClusterSubnetSpec {
215+ {Name : "a" , ID : "subnet-a" , CIDR : "172.20.32.0/19" , Type : kops .SubnetTypePublic },
216+ })
217+ c .Spec .Networking .NetworkID = ""
218+
219+ if err := assignCIDRsToSubnets (c , buildCloud ()); err == nil {
220+ t .Fatalf ("expected error assigning zones" )
221+ }
222+ })
223+ }
0 commit comments