Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions libs/localenv/envkey.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ import (
// by 3.10.6, so only the former bumps the minor.
var clauseRe = regexp.MustCompile(`^(>=|<=|===|==|~=|!=|<|>)?\s*(\d+)\.(\d+)(\.\d+)?`)

// defaultServerlessVersion is the serverless environment version used when the
// source (a serverless job with no recorded version, or a bundle that only
// records "serverless") does not pin one. It is a documented stand-in for the
// latest LTS (spec §4.3 / §target-resolution); VS Code resolves the real version
// itself and passes --serverless-version explicitly, so this fallback only
// applies when the version is genuinely unknown.
const defaultServerlessVersion = "v5"

// NormalizeServerless returns the canonical "vN" spelling of a serverless
// version accepting "4", "v4", or "V4".
func NormalizeServerless(version string) string {
Expand Down
14 changes: 7 additions & 7 deletions libs/localenv/target.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,11 +118,11 @@ func ResolveTarget(ctx context.Context, f TargetFlags, c ComputeClient, bt Bundl
}
if isServerless {
// Use the job's recorded serverless environment version when present;
// fall back to v4 when the job did not pin one (documented stand-in from
// the original script, spec §4.3).
// fall back to the default when the job did not pin one (documented
// stand-in, spec §4.3).
v := version
if v == "" {
v = "v4"
v = defaultServerlessVersion
}
return &TargetInfo{
Source: "job",
Expand All @@ -145,12 +145,12 @@ func ResolveTarget(ctx context.Context, f TargetFlags, c ComputeClient, bt Bundl
}

if bt.Serverless {
// Default to serverless-v4: the serverless env version is not recorded
// in the bundle/project (documented stand-in from the original script).
// The bundle records that the target is serverless but not which version,
// so use the default stand-in (spec §4.3).
return &TargetInfo{
Source: "bundle",
ServerlessVersion: "v4",
EnvKey: EnvKeyForServerless("v4"),
ServerlessVersion: NormalizeServerless(defaultServerlessVersion),
EnvKey: EnvKeyForServerless(defaultServerlessVersion),
}, nil
}

Expand Down
11 changes: 6 additions & 5 deletions libs/localenv/target_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,10 +93,11 @@ func TestResolveBundleNothingSelected(t *testing.T) {
}

func TestResolveBundleServerless(t *testing.T) {
// The bundle records serverless but no version, so the default stand-in applies.
ti, err := ResolveTarget(t.Context(), TargetFlags{}, stubCompute{}, BundleTarget{Selected: true, Serverless: true})
require.NoError(t, err)
assert.Equal(t, "bundle", ti.Source)
assert.Equal(t, "serverless/serverless-v4", ti.EnvKey)
assert.Equal(t, "serverless/serverless-"+defaultServerlessVersion, ti.EnvKey)
}

// jobStubCompute returns distinct values for the first (sparkVersion) and third
Expand Down Expand Up @@ -143,13 +144,13 @@ func TestResolveJobServerlessUsesRecordedVersion(t *testing.T) {
assert.Equal(t, "serverless/serverless-v3", ti.EnvKey)
}

func TestResolveJobServerlessEmptyVersionFallsBackToV4(t *testing.T) {
// When the job records no serverless version, ResolveTarget defaults to v4
// (documented stand-in), matching the bundle serverless path.
func TestResolveJobServerlessEmptyVersionFallsBackToDefault(t *testing.T) {
// When the job records no serverless version, ResolveTarget uses the default
// stand-in, matching the bundle serverless path.
c := jobStubCompute{isServerless: true, version: ""}
ti, err := ResolveTarget(t.Context(), TargetFlags{Job: "42"}, c, BundleTarget{})
require.NoError(t, err)
assert.Equal(t, "serverless/serverless-v4", ti.EnvKey)
assert.Equal(t, "serverless/serverless-"+defaultServerlessVersion, ti.EnvKey)
}

func TestValidateTargetFlagsMutuallyExclusive(t *testing.T) {
Expand Down
Loading