@@ -904,12 +904,28 @@ func (s *awsSdkEC2) DescribeInstances(request *ec2.DescribeInstancesInput) ([]*e
904
904
905
905
// Implements EC2.DescribeSecurityGroups
906
906
func (s * awsSdkEC2 ) DescribeSecurityGroups (request * ec2.DescribeSecurityGroupsInput ) ([]* ec2.SecurityGroup , error ) {
907
- // Security groups are not paged
908
- response , err := s .ec2 .DescribeSecurityGroups (request )
909
- if err != nil {
910
- return nil , fmt .Errorf ("error listing AWS security groups: %q" , err )
907
+ // Security groups are paged
908
+ results := []* ec2.SecurityGroup {}
909
+ var nextToken * string
910
+ requestTime := time .Now ()
911
+ for {
912
+ response , err := s .ec2 .DescribeSecurityGroups (request )
913
+ if err != nil {
914
+ recordAWSMetric ("describe_security_groups" , 0 , err )
915
+ return nil , fmt .Errorf ("error listing AWS security groups: %q" , err )
916
+ }
917
+
918
+ results = append (results , response .SecurityGroups ... )
919
+
920
+ nextToken = response .NextToken
921
+ if aws .StringValue (nextToken ) == "" {
922
+ break
923
+ }
924
+ request .NextToken = nextToken
911
925
}
912
- return response .SecurityGroups , nil
926
+ timeTaken := time .Since (requestTime ).Seconds ()
927
+ recordAWSMetric ("describe_security_groups" , timeTaken , nil )
928
+ return results , nil
913
929
}
914
930
915
931
func (s * awsSdkEC2 ) AttachVolume (request * ec2.AttachVolumeInput ) (* ec2.VolumeAttachment , error ) {
@@ -1034,12 +1050,27 @@ func (s *awsSdkEC2) CreateTags(request *ec2.CreateTagsInput) (*ec2.CreateTagsOut
1034
1050
}
1035
1051
1036
1052
func (s * awsSdkEC2 ) DescribeRouteTables (request * ec2.DescribeRouteTablesInput ) ([]* ec2.RouteTable , error ) {
1037
- // Not paged
1038
- response , err := s .ec2 .DescribeRouteTables (request )
1039
- if err != nil {
1040
- return nil , fmt .Errorf ("error listing AWS route tables: %q" , err )
1053
+ results := []* ec2.RouteTable {}
1054
+ var nextToken * string
1055
+ requestTime := time .Now ()
1056
+ for {
1057
+ response , err := s .ec2 .DescribeRouteTables (request )
1058
+ if err != nil {
1059
+ recordAWSMetric ("describe_route_tables" , 0 , err )
1060
+ return nil , fmt .Errorf ("error listing AWS route tables: %q" , err )
1061
+ }
1062
+
1063
+ results = append (results , response .RouteTables ... )
1064
+
1065
+ nextToken = response .NextToken
1066
+ if aws .StringValue (nextToken ) == "" {
1067
+ break
1068
+ }
1069
+ request .NextToken = nextToken
1041
1070
}
1042
- return response .RouteTables , nil
1071
+ timeTaken := time .Since (requestTime ).Seconds ()
1072
+ recordAWSMetric ("describe_route_tables" , timeTaken , nil )
1073
+ return results , nil
1043
1074
}
1044
1075
1045
1076
func (s * awsSdkEC2 ) CreateRoute (request * ec2.CreateRouteInput ) (* ec2.CreateRouteOutput , error ) {
@@ -1573,13 +1604,32 @@ func (c *Cloud) GetCandidateZonesForDynamicVolume() (sets.String, error) {
1573
1604
// TODO: Caching / expose v1.Nodes to the cloud provider?
1574
1605
// TODO: We could also query for subnets, I think
1575
1606
1576
- filters := []* ec2.Filter {newEc2Filter ("instance-state-name" , "running" )}
1607
+ // Note: It is more efficient to call the EC2 API twice with different tag
1608
+ // filters than to call it once with a tag filter that results in a logical
1609
+ // OR. For really large clusters the logical OR will result in EC2 API rate
1610
+ // limiting.
1611
+ instances := []* ec2.Instance {}
1577
1612
1578
- instances , err := c .describeInstances (filters )
1613
+ baseFilters := []* ec2.Filter {newEc2Filter ("instance-state-name" , "running" )}
1614
+
1615
+ filters := c .tagging .addFilters (baseFilters )
1616
+ di , err := c .describeInstances (filters )
1579
1617
if err != nil {
1580
1618
return nil , err
1581
1619
}
1582
1620
1621
+ instances = append (instances , di ... )
1622
+
1623
+ if c .tagging .usesLegacyTags {
1624
+ filters = c .tagging .addLegacyFilters (baseFilters )
1625
+ di , err = c .describeInstances (filters )
1626
+ if err != nil {
1627
+ return nil , err
1628
+ }
1629
+
1630
+ instances = append (instances , di ... )
1631
+ }
1632
+
1583
1633
if len (instances ) == 0 {
1584
1634
return nil , fmt .Errorf ("no instances returned" )
1585
1635
}
@@ -3022,17 +3072,16 @@ func (c *Cloud) ensureSecurityGroup(name string, description string, additionalT
3022
3072
for {
3023
3073
attempt ++
3024
3074
3025
- request := & ec2.DescribeSecurityGroupsInput {}
3026
- filters := []* ec2.Filter {
3027
- newEc2Filter ("group-name" , name ),
3028
- newEc2Filter ("vpc-id" , c .vpcID ),
3029
- }
3030
3075
// Note that we do _not_ add our tag filters; group-name + vpc-id is the EC2 primary key.
3031
3076
// However, we do check that it matches our tags.
3032
3077
// If it doesn't have any tags, we tag it; this is how we recover if we failed to tag before.
3033
3078
// If it has a different cluster's tags, that is an error.
3034
3079
// This shouldn't happen because name is expected to be globally unique (UUID derived)
3035
- request .Filters = filters
3080
+ request := & ec2.DescribeSecurityGroupsInput {}
3081
+ request .Filters = []* ec2.Filter {
3082
+ newEc2Filter ("group-name" , name ),
3083
+ newEc2Filter ("vpc-id" , c .vpcID ),
3084
+ }
3036
3085
3037
3086
securityGroups , err := c .ec2 .DescribeSecurityGroups (request )
3038
3087
if err != nil {
@@ -3108,8 +3157,7 @@ func findTag(tags []*ec2.Tag, key string) (string, bool) {
3108
3157
// However, in future this will likely be treated as an error.
3109
3158
func (c * Cloud ) findSubnets () ([]* ec2.Subnet , error ) {
3110
3159
request := & ec2.DescribeSubnetsInput {}
3111
- filters := []* ec2.Filter {newEc2Filter ("vpc-id" , c .vpcID )}
3112
- request .Filters = c .tagging .addFilters (filters )
3160
+ request .Filters = []* ec2.Filter {newEc2Filter ("vpc-id" , c .vpcID )}
3113
3161
3114
3162
subnets , err := c .ec2 .DescribeSubnets (request )
3115
3163
if err != nil {
@@ -3131,8 +3179,7 @@ func (c *Cloud) findSubnets() ([]*ec2.Subnet, error) {
3131
3179
klog .Warningf ("No tagged subnets found; will fall-back to the current subnet only. This is likely to be an error in a future version of k8s." )
3132
3180
3133
3181
request = & ec2.DescribeSubnetsInput {}
3134
- filters = []* ec2.Filter {newEc2Filter ("subnet-id" , c .selfAWSInstance .subnetID )}
3135
- request .Filters = filters
3182
+ request .Filters = []* ec2.Filter {newEc2Filter ("subnet-id" , c .selfAWSInstance .subnetID )}
3136
3183
3137
3184
subnets , err = c .ec2 .DescribeSubnets (request )
3138
3185
if err != nil {
@@ -3888,7 +3935,6 @@ func findSecurityGroupForInstance(instance *ec2.Instance, taggedSecurityGroups m
3888
3935
// Return all the security groups that are tagged as being part of our cluster
3889
3936
func (c * Cloud ) getTaggedSecurityGroups () (map [string ]* ec2.SecurityGroup , error ) {
3890
3937
request := & ec2.DescribeSecurityGroupsInput {}
3891
- request .Filters = c .tagging .addFilters (nil )
3892
3938
groups , err := c .ec2 .DescribeSecurityGroups (request )
3893
3939
if err != nil {
3894
3940
return nil , fmt .Errorf ("error querying security groups: %q" , err )
@@ -3937,10 +3983,9 @@ func (c *Cloud) updateInstanceSecurityGroupsForLoadBalancer(lb *elb.LoadBalancer
3937
3983
var actualGroups []* ec2.SecurityGroup
3938
3984
{
3939
3985
describeRequest := & ec2.DescribeSecurityGroupsInput {}
3940
- filters : = []* ec2.Filter {
3986
+ describeRequest . Filters = []* ec2.Filter {
3941
3987
newEc2Filter ("ip-permission.group-id" , loadBalancerSecurityGroupID ),
3942
3988
}
3943
- describeRequest .Filters = c .tagging .addFilters (filters )
3944
3989
response , err := c .ec2 .DescribeSecurityGroups (describeRequest )
3945
3990
if err != nil {
3946
3991
return fmt .Errorf ("error querying security groups for ELB: %q" , err )
@@ -4098,10 +4143,9 @@ func (c *Cloud) EnsureLoadBalancerDeleted(ctx context.Context, clusterName strin
4098
4143
{
4099
4144
// Server side filter
4100
4145
describeRequest := & ec2.DescribeSecurityGroupsInput {}
4101
- filters : = []* ec2.Filter {
4146
+ describeRequest . Filters = []* ec2.Filter {
4102
4147
newEc2Filter ("ip-permission.protocol" , "tcp" ),
4103
4148
}
4104
- describeRequest .Filters = c .tagging .addFilters (filters )
4105
4149
response , err := c .ec2 .DescribeSecurityGroups (describeRequest )
4106
4150
if err != nil {
4107
4151
return fmt .Errorf ("Error querying security groups for NLB: %q" , err )
@@ -4229,10 +4273,9 @@ func (c *Cloud) EnsureLoadBalancerDeleted(ctx context.Context, clusterName strin
4229
4273
var loadBalancerSGs = aws .StringValueSlice (lb .SecurityGroups )
4230
4274
4231
4275
describeRequest := & ec2.DescribeSecurityGroupsInput {}
4232
- filters : = []* ec2.Filter {
4276
+ describeRequest . Filters = []* ec2.Filter {
4233
4277
newEc2Filter ("group-id" , loadBalancerSGs ... ),
4234
4278
}
4235
- describeRequest .Filters = c .tagging .addFilters (filters )
4236
4279
response , err := c .ec2 .DescribeSecurityGroups (describeRequest )
4237
4280
if err != nil {
4238
4281
return fmt .Errorf ("error querying security groups for ELB: %q" , err )
@@ -4444,7 +4487,6 @@ func (c *Cloud) getInstancesByNodeNames(nodeNames []string, states ...string) ([
4444
4487
4445
4488
// TODO: Move to instanceCache
4446
4489
func (c * Cloud ) describeInstances (filters []* ec2.Filter ) ([]* ec2.Instance , error ) {
4447
- filters = c .tagging .addFilters (filters )
4448
4490
request := & ec2.DescribeInstancesInput {
4449
4491
Filters : filters ,
4450
4492
}
0 commit comments