diff --git a/core/src/config/project.ts b/core/src/config/project.ts index 8904321a7d..38d040bb4f 100644 --- a/core/src/config/project.ts +++ b/core/src/config/project.ts @@ -373,9 +373,7 @@ export const projectSchema = () => environments: environmentsSchema(), }) -export function getDefaultEnvironmentName(config: ProjectConfig): string { - const { defaultEnvironment } = config - +export function getDefaultEnvironmentName(defaultEnvironment: string, config: ProjectConfig): string { // TODO: get rid of the default environment config const environments = (config.environments || []).length === 0 ? cloneDeep(defaultEnvironments) : config.environments @@ -401,11 +399,13 @@ export function getDefaultEnvironmentName(config: ProjectConfig): string { * @param config raw project configuration */ export function resolveProjectConfig({ + defaultEnvironment, config, artifactsPath, username, secrets, }: { + defaultEnvironment: string config: ProjectConfig artifactsPath: string username: string @@ -417,7 +417,6 @@ export function resolveProjectConfig({ const globalConfig = resolveTemplateStrings( { apiVersion: config.apiVersion, - defaultEnvironment: config.defaultEnvironment, sources: config.sources, varfile: config.varfile, variables: config.variables, @@ -432,6 +431,7 @@ export function resolveProjectConfig({ ...config, ...globalConfig, name, + defaultEnvironment, environments: [], }, schema: projectSchema(), @@ -462,7 +462,7 @@ export function resolveProjectConfig({ providers, } - config.defaultEnvironment = getDefaultEnvironmentName(config) + config.defaultEnvironment = getDefaultEnvironmentName(defaultEnvironment, config) // // TODO: get rid of the default environment config if (config.environments.length === 0) { diff --git a/core/src/garden.ts b/core/src/garden.ts index 66c5e90d23..13c70311fc 100644 --- a/core/src/garden.ts +++ b/core/src/garden.ts @@ -302,11 +302,13 @@ export class Garden { // Connect to the state storage await ensureConnected() - const defaultEnvironment = resolveTemplateString( - getDefaultEnvironmentName(config), + const defaultEnvironmentName = resolveTemplateString( + config.defaultEnvironment, new DefaultEnvironmentContext({ projectName, artifactsPath, username: _username }) ) as string + const defaultEnvironment = getDefaultEnvironmentName(defaultEnvironmentName, config) + if (!environmentStr) { environmentStr = defaultEnvironment } @@ -324,7 +326,13 @@ export class Garden { clientAuthToken = enterpriseInitResult.clientAuthToken } - config = resolveProjectConfig({ config, artifactsPath, username: _username, secrets }) + config = resolveProjectConfig({ + defaultEnvironment: defaultEnvironmentName, + config, + artifactsPath, + username: _username, + secrets, + }) const { sources: projectSources, path: projectRoot } = config diff --git a/core/test/data/test-project-templated/garden.yml b/core/test/data/test-project-templated/garden.yml index 18cf119ae9..2bb0f6a9a0 100644 --- a/core/test/data/test-project-templated/garden.yml +++ b/core/test/data/test-project-templated/garden.yml @@ -1,5 +1,6 @@ kind: Project name: test-project-templated +defaultEnvironment: "${local.env.TEST_VARIABLE == 'banana' ? 'local' : 'local'}" environments: - name: local providers: diff --git a/core/test/unit/src/config/project.ts b/core/test/unit/src/config/project.ts index e8e78f97d9..be6b68bc9a 100644 --- a/core/test/unit/src/config/project.ts +++ b/core/test/unit/src/config/project.ts @@ -30,12 +30,13 @@ import { keyBy } from "lodash" describe("resolveProjectConfig", () => { it("should pass through a canonical project config", async () => { + const defaultEnvironment = "default" const config: ProjectConfig = { apiVersion: DEFAULT_API_VERSION, kind: "Project", name: "my-project", path: "/tmp/foo", - defaultEnvironment: "default", + defaultEnvironment, dotIgnoreFiles: defaultDotIgnoreFiles, environments: [{ name: "default", defaultNamespace, variables: {} }], outputs: [], @@ -43,7 +44,15 @@ describe("resolveProjectConfig", () => { variables: {}, } - expect(resolveProjectConfig({ config, artifactsPath: "/tmp", username: "some-user", secrets: {} })).to.eql({ + expect( + resolveProjectConfig({ + defaultEnvironment, + config, + artifactsPath: "/tmp", + username: "some-user", + secrets: {}, + }) + ).to.eql({ ...config, environments: [ { @@ -58,12 +67,13 @@ describe("resolveProjectConfig", () => { }) it("should inject a default environment if none is specified", async () => { + const defaultEnvironment = "local" const config: ProjectConfig = { apiVersion: DEFAULT_API_VERSION, kind: "Project", name: "my-project", path: "/tmp/foo", - defaultEnvironment: "local", + defaultEnvironment, dotIgnoreFiles: defaultDotIgnoreFiles, environments: [], outputs: [], @@ -71,7 +81,15 @@ describe("resolveProjectConfig", () => { variables: {}, } - expect(resolveProjectConfig({ config, artifactsPath: "/tmp", username: "some-user", secrets: {} })).to.eql({ + expect( + resolveProjectConfig({ + defaultEnvironment, + config, + artifactsPath: "/tmp", + username: "some-user", + secrets: {}, + }) + ).to.eql({ ...config, sources: [], environments: defaultEnvironments, @@ -81,13 +99,14 @@ describe("resolveProjectConfig", () => { it("should resolve template strings on fields other than environment and provider configs", async () => { const repositoryUrl = "git://github.com/foo/bar.git#boo" + const defaultEnvironment = "default" const config: ProjectConfig = { apiVersion: DEFAULT_API_VERSION, kind: "Project", name: "my-project", path: "/tmp/foo", - defaultEnvironment: "default", + defaultEnvironment, dotIgnoreFiles: defaultDotIgnoreFiles, environments: [ { @@ -115,7 +134,13 @@ describe("resolveProjectConfig", () => { process.env.TEST_ENV_VAR = "foo" expect( - resolveProjectConfig({ config, artifactsPath: "/tmp", username: "some-user", secrets: { foo: "banana" } }) + resolveProjectConfig({ + defaultEnvironment, + config, + artifactsPath: "/tmp", + username: "some-user", + secrets: { foo: "banana" }, + }) ).to.eql({ ...config, environments: [ @@ -146,12 +171,13 @@ describe("resolveProjectConfig", () => { }) it("should pass through templated fields on provider configs", async () => { + const defaultEnvironment = "default" const config: ProjectConfig = { apiVersion: DEFAULT_API_VERSION, kind: "Project", name: "my-project", path: "/tmp/foo", - defaultEnvironment: "default", + defaultEnvironment, dotIgnoreFiles: defaultDotIgnoreFiles, environments: [ { @@ -179,7 +205,9 @@ describe("resolveProjectConfig", () => { process.env.TEST_ENV_VAR_A = "foo" process.env.TEST_ENV_VAR_B = "boo" - expect(resolveProjectConfig({ config, artifactsPath: "/tmp", username: "some-user", secrets: {} })).to.eql({ + expect( + resolveProjectConfig({ defaultEnvironment, config, artifactsPath: "/tmp", username: "some-user", secrets: {} }) + ).to.eql({ ...config, environments: [ { @@ -213,12 +241,13 @@ describe("resolveProjectConfig", () => { }) it("should pass through templated fields on environment configs", async () => { + const defaultEnvironment = "default" const config: ProjectConfig = { apiVersion: DEFAULT_API_VERSION, kind: "Project", name: "my-project", path: "/tmp/foo", - defaultEnvironment: "default", + defaultEnvironment, dotIgnoreFiles: defaultDotIgnoreFiles, environments: [ { @@ -233,18 +262,25 @@ describe("resolveProjectConfig", () => { variables: {}, } - const result = resolveProjectConfig({ config, artifactsPath: "/tmp", username: "some-user", secrets: {} }) + const result = resolveProjectConfig({ + defaultEnvironment, + config, + artifactsPath: "/tmp", + username: "some-user", + secrets: {}, + }) expect(result.environments[0].variables).to.eql(config.environments[0].variables) }) it("should set defaultEnvironment to first environment if not configured", async () => { + const defaultEnvironment = "" const config: ProjectConfig = { apiVersion: DEFAULT_API_VERSION, kind: "Project", name: "my-project", path: "/tmp/foo", - defaultEnvironment: "", + defaultEnvironment, dotIgnoreFiles: defaultDotIgnoreFiles, environments: [], outputs: [], @@ -252,7 +288,9 @@ describe("resolveProjectConfig", () => { variables: {}, } - expect(resolveProjectConfig({ config, artifactsPath: "/tmp", username: "some-user", secrets: {} })).to.eql({ + expect( + resolveProjectConfig({ defaultEnvironment, config, artifactsPath: "/tmp", username: "some-user", secrets: {} }) + ).to.eql({ ...config, defaultEnvironment: "local", environments: defaultEnvironments, @@ -262,12 +300,13 @@ describe("resolveProjectConfig", () => { }) it("should populate default values in the schema", async () => { + const defaultEnvironment = "" const config: ProjectConfig = { apiVersion: DEFAULT_API_VERSION, kind: "Project", name: "my-project", path: "/tmp/foo", - defaultEnvironment: "", + defaultEnvironment, dotIgnoreFiles: defaultDotIgnoreFiles, environments: [], outputs: [], @@ -275,7 +314,9 @@ describe("resolveProjectConfig", () => { variables: {}, } - expect(resolveProjectConfig({ config, artifactsPath: "/tmp", username: "some-user", secrets: {} })).to.eql({ + expect( + resolveProjectConfig({ defaultEnvironment, config, artifactsPath: "/tmp", username: "some-user", secrets: {} }) + ).to.eql({ ...config, defaultEnvironment: "local", environments: defaultEnvironments, @@ -285,6 +326,7 @@ describe("resolveProjectConfig", () => { }) it("should include providers in correct precedence order from all possible config keys", async () => { + const defaultEnvironment = "default" const config: ProjectConfig = { apiVersion: DEFAULT_API_VERSION, kind: "Project", @@ -317,7 +359,9 @@ describe("resolveProjectConfig", () => { variables: {}, } - expect(resolveProjectConfig({ config, artifactsPath: "/tmp", username: "some-user", secrets: {} })).to.eql({ + expect( + resolveProjectConfig({ defaultEnvironment, config, artifactsPath: "/tmp", username: "some-user", secrets: {} }) + ).to.eql({ ...config, environments: [ { @@ -350,6 +394,7 @@ describe("resolveProjectConfig", () => { }) it("should convert old-style environment/provider config to the new canonical form", async () => { + const defaultEnvironment = "default" const config: ProjectConfig = { apiVersion: DEFAULT_API_VERSION, kind: "Project", @@ -382,7 +427,9 @@ describe("resolveProjectConfig", () => { }, } - expect(resolveProjectConfig({ config, artifactsPath: "/tmp", username: "some-user", secrets: {} })).to.eql({ + expect( + resolveProjectConfig({ defaultEnvironment, config, artifactsPath: "/tmp", username: "some-user", secrets: {} }) + ).to.eql({ ...config, environments: [ {