diff --git a/core/src/cloud/api.ts b/core/src/cloud/api.ts index 0073a77fcc..3fdadae3f1 100644 --- a/core/src/cloud/api.ts +++ b/core/src/cloud/api.ts @@ -631,7 +631,7 @@ export class CloudApi { sessionId: string projectId: string commandInfo: CommandInfo - localServerPort?: number + localServerPort: number | undefined environment: string namespace: string isDevCommand: boolean diff --git a/core/src/commands/base.ts b/core/src/commands/base.ts index 0f16c7115c..aa27ba49c9 100644 --- a/core/src/commands/base.ts +++ b/core/src/commands/base.ts @@ -317,7 +317,8 @@ export abstract class Command< sessionId: garden.sessionId, projectId: garden.projectId, commandInfo: garden.commandInfo, - localServerPort: server?.port, + // localServerPort only needs to be set for dev/serve commands + localServerPort: undefined, environment: garden.environmentName, namespace: garden.namespace, isDevCommand: garden.commandInfo.name === "dev", diff --git a/core/src/commands/serve.ts b/core/src/commands/serve.ts index 8bb55d1115..8e2b2a0794 100644 --- a/core/src/commands/serve.ts +++ b/core/src/commands/serve.ts @@ -179,7 +179,7 @@ export class ServeCommand< const session = await cloudApi.registerSession({ parentSessionId: undefined, projectId, - // Use the process (i.e. parent command) session ID for the serve command session + // Use the process (i.e. parent command) session ID for the serve/dev command session sessionId: manager.sessionId, commandInfo: garden.commandInfo, localServerPort: this.server.port, diff --git a/core/src/server/instance-manager.ts b/core/src/server/instance-manager.ts index c225fe66ac..38ee99969f 100644 --- a/core/src/server/instance-manager.ts +++ b/core/src/server/instance-manager.ts @@ -51,7 +51,7 @@ interface GardenInstanceManagerParams { log: Log sessionId: string plugins: GardenPluginReference[] - serveCommand?: ServeCommand + serveCommand: ServeCommand extraCommands?: Command[] defaultOpts?: Partial cloudApiFactory?: CloudApiFactory @@ -104,6 +104,7 @@ export class GardenInstanceManager { this.defaultOpts = defaultOpts || {} this.plugins = plugins this.cloudApiFactory = cloudApiFactory || CloudApi.factory + this.serveCommand = serveCommand this.events = new EventBus() this.monitors = new MonitorManager(log, this.events) @@ -381,7 +382,7 @@ export class GardenInstanceManager { const gardenParams = await resolveGardenParamsPartial(projectRoot, gardenOpts) - return this.ensureInstance( + const garden = await this.ensureInstance( log, { projectRoot, @@ -391,5 +392,28 @@ export class GardenInstanceManager { }, gardenOpts ) + + if (cloudApi && garden.projectId && this.serveCommand?.server) { + // Ensure cloud session is registered for the domain and server session, since this may not happen on startup + // if the command isn't started in a Garden project root. This is a no-op if it's already registered. + // FIXME: We still need to rethink on the Cloud side how sessions are scoped + await cloudApi.registerSession({ + parentSessionId: undefined, + projectId: garden.projectId, + // Use the process (i.e. parent command) session ID for the serve/dev command session + sessionId: this.sessionId, + commandInfo: garden.commandInfo, + // set localServerPort only for dev/serve commands + localServerPort: + this.serveCommand.server.port && ["dev", "serve"].includes(garden.commandInfo.name) + ? this.serveCommand.server.port + : undefined, + environment: garden.environmentName, + namespace: garden.namespace, + isDevCommand: true, + }) + } + + return garden } }