From 1e08355c0131f3de6d5c01d6b4d37596b21f875c Mon Sep 17 00:00:00 2001 From: jainvishesh11 Date: Fri, 18 Sep 2026 14:32:51 +0530 Subject: [PATCH] fix(sfcompute): build instance name from RefID and environment ID --- v1/providers/sfcomputev2/instance.go | 8 +++++--- v1/providers/sfcomputev2/instance_test.go | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/v1/providers/sfcomputev2/instance.go b/v1/providers/sfcomputev2/instance.go index 185a6e2..34cf70a 100644 --- a/v1/providers/sfcomputev2/instance.go +++ b/v1/providers/sfcomputev2/instance.go @@ -36,6 +36,10 @@ func sanitizeSFCName(name string) string { return name } +func makeSFCName(refID string, tags v1.Tags) string { + return sanitizeSFCName(refID + "-" + tags["dev-plane-x-environmentId"]) +} + func (c *SFCClientV2) CreateInstance(ctx context.Context, attrs v1.CreateInstanceAttrs) (*v1.Instance, error) { c.logger.Debug(ctx, "sfcv2: CreateInstance start", v1.LogField("name", attrs.Name), @@ -61,9 +65,7 @@ func (c *SFCClientV2) CreateInstance(ctx context.Context, attrs v1.CreateInstanc CloudInitUserData: &cloudInit, Tags: tags, } - // name is optional; sanitize the requested name to SFC's format and send it only if - // something valid remains. Otherwise omit it — identity is preserved in the tags above. - if name := sanitizeSFCName(attrs.Name); sfcNamePattern.MatchString(name) { + if name := makeSFCName(attrs.RefID, attrs.Tags); sfcNamePattern.MatchString(name) { req.Name = &name } resp, err := c.client.createInstance(ctx, req) diff --git a/v1/providers/sfcomputev2/instance_test.go b/v1/providers/sfcomputev2/instance_test.go index a84554e..85dcd59 100644 --- a/v1/providers/sfcomputev2/instance_test.go +++ b/v1/providers/sfcomputev2/instance_test.go @@ -34,3 +34,26 @@ func TestNormalizeTerminateInstanceErrorPreservesRetryableFailure(t *testing.T) require.ErrorIs(t, err, providerErr) } + +func TestMakeSFCNameIsDeterministic(t *testing.T) { + t.Parallel() + + tags := v1.Tags{"dev-plane-x-environmentId": "p82qfn5qs"} + + first := makeSFCName("inst-2toqsvHXfalevkjPXY2QNJZL9HF", tags) + second := makeSFCName("inst-2toqsvHXfalevkjPXY2QNJZL9HF", tags) + + require.Equal(t, first, second) +} + +func TestMakeSFCNameIsUniquePerInstance(t *testing.T) { + t.Parallel() + + // Same environment, two instances: re-provisioning must not reuse the previous name. + tags := v1.Tags{"dev-plane-x-environmentId": "p82qfn5qs"} + + first := makeSFCName("inst-2toqsvHXfalevkjPXY2QNJZL9HF", tags) + second := makeSFCName("inst-2gAgPPd3QC1nmSjaWg8kc7UfyDx", tags) + + require.NotEqual(t, first, second) +}