in pkg/providers/v1/aws_loadbalancer.go [399:490]
func (c *Cloud) reconcileLBAttributes(loadBalancerArn string, annotations map[string]string) error {
desiredLoadBalancerAttributes := map[string]string{}
desiredLoadBalancerAttributes[lbAttrLoadBalancingCrossZoneEnabled] = "false"
crossZoneLoadBalancingEnabledAnnotation := annotations[ServiceAnnotationLoadBalancerCrossZoneLoadBalancingEnabled]
if crossZoneLoadBalancingEnabledAnnotation != "" {
crossZoneEnabled, err := strconv.ParseBool(crossZoneLoadBalancingEnabledAnnotation)
if err != nil {
return fmt.Errorf("error parsing service annotation: %s=%s",
ServiceAnnotationLoadBalancerCrossZoneLoadBalancingEnabled,
crossZoneLoadBalancingEnabledAnnotation,
)
}
if crossZoneEnabled {
desiredLoadBalancerAttributes[lbAttrLoadBalancingCrossZoneEnabled] = "true"
}
}
desiredLoadBalancerAttributes[lbAttrAccessLogsS3Enabled] = "false"
accessLogsS3EnabledAnnotation := annotations[ServiceAnnotationLoadBalancerAccessLogEnabled]
if accessLogsS3EnabledAnnotation != "" {
accessLogsS3Enabled, err := strconv.ParseBool(accessLogsS3EnabledAnnotation)
if err != nil {
return fmt.Errorf("error parsing service annotation: %s=%s",
ServiceAnnotationLoadBalancerAccessLogEnabled,
accessLogsS3EnabledAnnotation,
)
}
if accessLogsS3Enabled {
desiredLoadBalancerAttributes[lbAttrAccessLogsS3Enabled] = "true"
}
}
desiredLoadBalancerAttributes[lbAttrAccessLogsS3Bucket] = annotations[ServiceAnnotationLoadBalancerAccessLogS3BucketName]
desiredLoadBalancerAttributes[lbAttrAccessLogsS3Prefix] = annotations[ServiceAnnotationLoadBalancerAccessLogS3BucketPrefix]
currentLoadBalancerAttributes := map[string]string{}
describeAttributesOutput, err := c.elbv2.DescribeLoadBalancerAttributes(&elbv2.DescribeLoadBalancerAttributesInput{
LoadBalancerArn: aws.String(loadBalancerArn),
})
if err != nil {
return fmt.Errorf("unable to retrieve load balancer attributes during attribute sync: %q", err)
}
for _, attr := range describeAttributesOutput.Attributes {
currentLoadBalancerAttributes[aws.StringValue(attr.Key)] = aws.StringValue(attr.Value)
}
var changedAttributes []*elbv2.LoadBalancerAttribute
if desiredLoadBalancerAttributes[lbAttrLoadBalancingCrossZoneEnabled] != currentLoadBalancerAttributes[lbAttrLoadBalancingCrossZoneEnabled] {
changedAttributes = append(changedAttributes, &elbv2.LoadBalancerAttribute{
Key: aws.String(lbAttrLoadBalancingCrossZoneEnabled),
Value: aws.String(desiredLoadBalancerAttributes[lbAttrLoadBalancingCrossZoneEnabled]),
})
}
if desiredLoadBalancerAttributes[lbAttrAccessLogsS3Enabled] != currentLoadBalancerAttributes[lbAttrAccessLogsS3Enabled] {
changedAttributes = append(changedAttributes, &elbv2.LoadBalancerAttribute{
Key: aws.String(lbAttrAccessLogsS3Enabled),
Value: aws.String(desiredLoadBalancerAttributes[lbAttrAccessLogsS3Enabled]),
})
}
// ELBV2 API forbids us to set bucket to an empty bucket, so we keep it unchanged if AccessLogsS3Enabled==false.
if desiredLoadBalancerAttributes[lbAttrAccessLogsS3Enabled] == "true" {
if desiredLoadBalancerAttributes[lbAttrAccessLogsS3Bucket] != currentLoadBalancerAttributes[lbAttrAccessLogsS3Bucket] {
changedAttributes = append(changedAttributes, &elbv2.LoadBalancerAttribute{
Key: aws.String(lbAttrAccessLogsS3Bucket),
Value: aws.String(desiredLoadBalancerAttributes[lbAttrAccessLogsS3Bucket]),
})
}
if desiredLoadBalancerAttributes[lbAttrAccessLogsS3Prefix] != currentLoadBalancerAttributes[lbAttrAccessLogsS3Prefix] {
changedAttributes = append(changedAttributes, &elbv2.LoadBalancerAttribute{
Key: aws.String(lbAttrAccessLogsS3Prefix),
Value: aws.String(desiredLoadBalancerAttributes[lbAttrAccessLogsS3Prefix]),
})
}
}
if len(changedAttributes) > 0 {
klog.V(2).Infof("updating load-balancer attributes for %q", loadBalancerArn)
_, err = c.elbv2.ModifyLoadBalancerAttributes(&elbv2.ModifyLoadBalancerAttributesInput{
LoadBalancerArn: aws.String(loadBalancerArn),
Attributes: changedAttributes,
})
if err != nil {
return fmt.Errorf("unable to update load balancer attributes during attribute sync: %q", err)
}
}
return nil
}