@@ -519,6 +519,44 @@ func TestReconcileRouteTables(t *testing.T) {
519
519
}, nil )
520
520
},
521
521
},
522
+ {
523
+ name : "failed to create route, delete route table and fail" ,
524
+ input : & infrav1.NetworkSpec {
525
+ VPC : infrav1.VPCSpec {
526
+ InternetGatewayID : aws .String ("igw-01" ),
527
+ ID : "vpc-rtbs" ,
528
+ Tags : infrav1.Tags {
529
+ infrav1 .ClusterTagKey ("test-cluster" ): "owned" ,
530
+ },
531
+ },
532
+ Subnets : infrav1.Subnets {
533
+ infrav1.SubnetSpec {
534
+ ID : "subnet-rtbs-public" ,
535
+ IsPublic : true ,
536
+ NatGatewayID : aws .String ("nat-01" ),
537
+ AvailabilityZone : "us-east-1a" ,
538
+ },
539
+ },
540
+ },
541
+ expect : func (m * mocks.MockEC2APIMockRecorder ) {
542
+ m .DescribeRouteTablesWithContext (context .TODO (), gomock .AssignableToTypeOf (& ec2.DescribeRouteTablesInput {})).
543
+ Return (& ec2.DescribeRouteTablesOutput {}, nil )
544
+
545
+ m .CreateRouteTableWithContext (context .TODO (), matchRouteTableInput (& ec2.CreateRouteTableInput {VpcId : aws .String ("vpc-rtbs" )})).
546
+ Return (& ec2.CreateRouteTableOutput {RouteTable : & ec2.RouteTable {RouteTableId : aws .String ("rt-1" )}}, nil )
547
+
548
+ m .CreateRouteWithContext (context .TODO (), gomock .Eq (& ec2.CreateRouteInput {
549
+ GatewayId : aws .String ("igw-01" ),
550
+ DestinationCidrBlock : aws .String ("0.0.0.0/0" ),
551
+ RouteTableId : aws .String ("rt-1" ),
552
+ })).
553
+ Return (nil , awserrors .NewNotFound ("MissingParameter" ))
554
+
555
+ m .DeleteRouteTableWithContext (context .TODO (), gomock .AssignableToTypeOf (& ec2.DeleteRouteTableInput {})).
556
+ Return (& ec2.DeleteRouteTableOutput {}, nil )
557
+ },
558
+ err : errors .New (`failed to create route in route table "rt-1"` ),
559
+ },
522
560
}
523
561
524
562
for _ , tc := range testCases {
@@ -560,59 +598,65 @@ func TestReconcileRouteTables(t *testing.T) {
560
598
}
561
599
}
562
600
601
+ // Delete Route Table(s).
602
+ var (
603
+ stubEc2RouteTablePrivate = & ec2.RouteTable {
604
+ RouteTableId : aws .String ("route-table-private" ),
605
+ Associations : []* ec2.RouteTableAssociation {
606
+ {
607
+ SubnetId : nil ,
608
+ },
609
+ },
610
+ Routes : []* ec2.Route {
611
+ {
612
+ DestinationCidrBlock : aws .String ("0.0.0.0/0" ),
613
+ NatGatewayId : aws .String ("outdated-nat-01" ),
614
+ },
615
+ },
616
+ }
617
+ stubEc2RouteTablePublicWithAssociations = & ec2.RouteTable {
618
+ RouteTableId : aws .String ("route-table-public" ),
619
+ Associations : []* ec2.RouteTableAssociation {
620
+ {
621
+ SubnetId : aws .String ("subnet-routetables-public" ),
622
+ RouteTableAssociationId : aws .String ("route-table-public" ),
623
+ },
624
+ },
625
+ Routes : []* ec2.Route {
626
+ {
627
+ DestinationCidrBlock : aws .String ("0.0.0.0/0" ),
628
+ GatewayId : aws .String ("igw-01" ),
629
+ },
630
+ },
631
+ Tags : []* ec2.Tag {
632
+ {
633
+ Key : aws .String ("kubernetes.io/cluster/test-cluster" ),
634
+ Value : aws .String ("owned" ),
635
+ },
636
+ {
637
+ Key : aws .String ("sigs.k8s.io/cluster-api-provider-aws/role" ),
638
+ Value : aws .String ("common" ),
639
+ },
640
+ {
641
+ Key : aws .String ("Name" ),
642
+ Value : aws .String ("test-cluster-rt-public-us-east-1a" ),
643
+ },
644
+ {
645
+ Key : aws .String ("sigs.k8s.io/cluster-api-provider-aws/cluster/test-cluster" ),
646
+ Value : aws .String ("owned" ),
647
+ },
648
+ },
649
+ }
650
+ )
651
+
563
652
func TestDeleteRouteTables (t * testing.T ) {
564
653
mockCtrl := gomock .NewController (t )
565
654
defer mockCtrl .Finish ()
566
655
567
656
describeRouteTableOutput := & ec2.DescribeRouteTablesOutput {
568
657
RouteTables : []* ec2.RouteTable {
569
- {
570
- RouteTableId : aws .String ("route-table-private" ),
571
- Associations : []* ec2.RouteTableAssociation {
572
- {
573
- SubnetId : nil ,
574
- },
575
- },
576
- Routes : []* ec2.Route {
577
- {
578
- DestinationCidrBlock : aws .String ("0.0.0.0/0" ),
579
- NatGatewayId : aws .String ("outdated-nat-01" ),
580
- },
581
- },
582
- },
583
- {
584
- RouteTableId : aws .String ("route-table-public" ),
585
- Associations : []* ec2.RouteTableAssociation {
586
- {
587
- SubnetId : aws .String ("subnet-routetables-public" ),
588
- RouteTableAssociationId : aws .String ("route-table-public" ),
589
- },
590
- },
591
- Routes : []* ec2.Route {
592
- {
593
- DestinationCidrBlock : aws .String ("0.0.0.0/0" ),
594
- GatewayId : aws .String ("igw-01" ),
595
- },
596
- },
597
- Tags : []* ec2.Tag {
598
- {
599
- Key : aws .String ("kubernetes.io/cluster/test-cluster" ),
600
- Value : aws .String ("owned" ),
601
- },
602
- {
603
- Key : aws .String ("sigs.k8s.io/cluster-api-provider-aws/role" ),
604
- Value : aws .String ("common" ),
605
- },
606
- {
607
- Key : aws .String ("Name" ),
608
- Value : aws .String ("test-cluster-rt-public-us-east-1a" ),
609
- },
610
- {
611
- Key : aws .String ("sigs.k8s.io/cluster-api-provider-aws/cluster/test-cluster" ),
612
- Value : aws .String ("owned" ),
613
- },
614
- },
615
- },
658
+ stubEc2RouteTablePrivate ,
659
+ stubEc2RouteTablePublicWithAssociations ,
616
660
},
617
661
}
618
662
@@ -730,6 +774,81 @@ func TestDeleteRouteTables(t *testing.T) {
730
774
}
731
775
}
732
776
777
+ func TestDeleteRouteTable (t * testing.T ) {
778
+ mockCtrl := gomock .NewController (t )
779
+ defer mockCtrl .Finish ()
780
+
781
+ testCases := []struct {
782
+ name string
783
+ input * ec2.RouteTable
784
+ expect func (m * mocks.MockEC2APIMockRecorder )
785
+ wantErr bool
786
+ }{
787
+ {
788
+ name : "Should delete route table successfully" ,
789
+ input : stubEc2RouteTablePrivate ,
790
+ expect : func (m * mocks.MockEC2APIMockRecorder ) {
791
+ m .DeleteRouteTableWithContext (context .TODO (), gomock .AssignableToTypeOf (& ec2.DeleteRouteTableInput {})).
792
+ Return (& ec2.DeleteRouteTableOutput {}, nil )
793
+ },
794
+ },
795
+ {
796
+ name : "Should return error if delete route table fails" ,
797
+ input : stubEc2RouteTablePrivate ,
798
+ expect : func (m * mocks.MockEC2APIMockRecorder ) {
799
+ m .DeleteRouteTableWithContext (context .TODO (), gomock .AssignableToTypeOf (& ec2.DeleteRouteTableInput {})).
800
+ Return (nil , awserrors .NewNotFound ("not found" ))
801
+ },
802
+ wantErr : true ,
803
+ },
804
+ {
805
+ name : "Should return error if disassociate route table fails" ,
806
+ input : stubEc2RouteTablePublicWithAssociations ,
807
+ expect : func (m * mocks.MockEC2APIMockRecorder ) {
808
+ m .DisassociateRouteTableWithContext (context .TODO (), gomock .Eq (& ec2.DisassociateRouteTableInput {
809
+ AssociationId : aws .String ("route-table-public" ),
810
+ })).Return (nil , awserrors .NewNotFound ("not found" ))
811
+ },
812
+ wantErr : true ,
813
+ },
814
+ }
815
+
816
+ for _ , tc := range testCases {
817
+ t .Run (tc .name , func (t * testing.T ) {
818
+ g := NewWithT (t )
819
+ ec2Mock := mocks .NewMockEC2API (mockCtrl )
820
+
821
+ scheme := runtime .NewScheme ()
822
+ _ = infrav1 .AddToScheme (scheme )
823
+ client := fake .NewClientBuilder ().WithScheme (scheme ).Build ()
824
+ scope , err := scope .NewClusterScope (scope.ClusterScopeParams {
825
+ Client : client ,
826
+ Cluster : & clusterv1.Cluster {
827
+ ObjectMeta : metav1.ObjectMeta {Name : "test-cluster" },
828
+ },
829
+ AWSCluster : & infrav1.AWSCluster {
830
+ ObjectMeta : metav1.ObjectMeta {Name : "test" },
831
+ Spec : infrav1.AWSClusterSpec {},
832
+ },
833
+ })
834
+ g .Expect (err ).NotTo (HaveOccurred ())
835
+ if tc .expect != nil {
836
+ tc .expect (ec2Mock .EXPECT ())
837
+ }
838
+
839
+ s := NewService (scope )
840
+ s .EC2Client = ec2Mock
841
+
842
+ err = s .deleteRouteTable (tc .input )
843
+ if tc .wantErr {
844
+ g .Expect (err ).To (HaveOccurred ())
845
+ return
846
+ }
847
+ g .Expect (err ).NotTo (HaveOccurred ())
848
+ })
849
+ }
850
+ }
851
+
733
852
type routeTableInputMatcher struct {
734
853
routeTableInput * ec2.CreateRouteTableInput
735
854
}
0 commit comments