From 0dde740825a534551c7efdfa08f9efb0b3370d33 Mon Sep 17 00:00:00 2001 From: rika dewi Date: Wed, 9 Jul 2025 15:15:11 +0800 Subject: [PATCH 1/2] Fix: instance reference name from placeholder with ASG that contains `/` in its name --- .../cloudprovider/aws/aws_cloud_provider.go | 14 ++++++++++---- .../cloudprovider/aws/aws_cloud_provider_test.go | 9 +++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go b/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go index 3117b1c73654..447d443b65ef 100644 --- a/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go +++ b/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go @@ -204,18 +204,24 @@ type AwsInstanceRef struct { Name string } -var validAwsRefIdRegex = regexp.MustCompile(fmt.Sprintf(`^aws\:\/\/\/[-0-9a-z]*\/[-0-9a-z]*(\/[-0-9a-z\.]*)?$|aws\:\/\/\/[-0-9a-z]*\/%s.*$`, placeholderInstanceNamePrefix)) +var validAwsRefIdRegex = regexp.MustCompile(fmt.Sprintf(`^aws\:\/\/\/[-0-9a-z]*\/([-0-9a-z]*)(\/[-0-9a-z\.]*)?$|aws\:\/\/\/[-0-9a-z]*\/(%s.*)$`, placeholderInstanceNamePrefix)) // AwsRefFromProviderId creates AwsInstanceRef object from provider id which // must be in format: aws:///zone/name func AwsRefFromProviderId(id string) (*AwsInstanceRef, error) { - if validAwsRefIdRegex.FindStringSubmatch(id) == nil { + matches := validAwsRefIdRegex.FindStringSubmatch(id) + if matches == nil || len(matches) != 4 { return nil, fmt.Errorf("wrong id: expected format aws:////, got %v", id) } - splitted := strings.Split(id[7:], "/") + + name := matches[1] + if name == "" { + name = matches[3] + } + return &AwsInstanceRef{ ProviderID: id, - Name: splitted[1], + Name: name, }, nil } diff --git a/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider_test.go b/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider_test.go index 1910f8752fd5..1f843d8af8be 100644 --- a/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider_test.go +++ b/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider_test.go @@ -306,6 +306,15 @@ func TestAwsRefFromProviderId(t *testing.T) { ProviderID: "aws:///eu-central-1c/i-placeholder-K3-EKS-spotr5xlasgsubnet02af43b02922e710f-10QH9H0C8PG7O-14", }, }, + { + // ref: https://github.com/kubernetes/autoscaler/issues/8305 + provID: "aws:///us-east-1a/i-placeholder-some/arbitrary/cluster/local", + expErr: false, + expRef: &AwsInstanceRef{ + Name: "i-placeholder-some/arbitrary/cluster/local", + ProviderID: "aws:///us-east-1a/i-placeholder-some/arbitrary/cluster/local", + }, + }, } for _, test := range tests { From 41a247e8c09b828997eef431d839c1afe2f04388 Mon Sep 17 00:00:00 2001 From: rika dewi Date: Thu, 10 Jul 2025 17:24:24 +0800 Subject: [PATCH 2/2] Should check placeholder regex first --- .../cloudprovider/aws/aws_cloud_provider.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go b/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go index 447d443b65ef..11a3aca4e713 100644 --- a/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go +++ b/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go @@ -204,7 +204,7 @@ type AwsInstanceRef struct { Name string } -var validAwsRefIdRegex = regexp.MustCompile(fmt.Sprintf(`^aws\:\/\/\/[-0-9a-z]*\/([-0-9a-z]*)(\/[-0-9a-z\.]*)?$|aws\:\/\/\/[-0-9a-z]*\/(%s.*)$`, placeholderInstanceNamePrefix)) +var validAwsRefIdRegex = regexp.MustCompile(fmt.Sprintf(`^aws\:\/\/\/[-0-9a-z]*\/(%s.*)$|aws\:\/\/\/[-0-9a-z]*\/([-0-9a-z]*)(\/[-0-9a-z\.]*)?$`, placeholderInstanceNamePrefix)) // AwsRefFromProviderId creates AwsInstanceRef object from provider id which // must be in format: aws:///zone/name @@ -214,9 +214,11 @@ func AwsRefFromProviderId(id string) (*AwsInstanceRef, error) { return nil, fmt.Errorf("wrong id: expected format aws:////, got %v", id) } - name := matches[1] - if name == "" { - name = matches[3] + var name string + if strings.Contains(id, placeholderInstanceNamePrefix) { + name = matches[1] + } else { + name = matches[2] } return &AwsInstanceRef{