Skip to content

Commit

Permalink
improvement(dashboard): start dashboard before init and keep same port
Browse files Browse the repository at this point in the history
We no longer restart the dashboard instance after config changes, and
instead just swap out the Garden instance from the running server.
  • Loading branch information
edvald authored and eysi09 committed Apr 30, 2019
1 parent 04937af commit e3bc9ee
Show file tree
Hide file tree
Showing 34 changed files with 405 additions and 198 deletions.
2 changes: 1 addition & 1 deletion dashboard/src/context/events.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import React from "react"

import { useEffect, useState } from "react"
import { ServerWebsocketMessage } from "garden-cli/src/server/websocket"
import { ServerWebsocketMessage } from "garden-cli/src/server/server"
import { Events, EventName } from "garden-cli/src/events"

import getApiUrl from "../api/get-api-url"
Expand Down
9 changes: 9 additions & 0 deletions garden-service/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions garden-service/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@
"@types/uniqid": "^4.1.2",
"@types/unzip": "^0.1.1",
"@types/unzipper": "^0.9.1",
"@types/uuid": "^3.4.4",
"@types/wrap-ansi": "^3.0.0",
"chai": "^4.2.0",
"gulp": "^4.0.0",
Expand Down
10 changes: 8 additions & 2 deletions garden-service/src/cli/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -271,8 +271,14 @@ export class GardenCli {
contextOpts.config = MOCK_CONFIG
}
let garden: Garden
let result
await command.printHeader(log)
let result: any

await command.prepare({
log,
logFooter,
args: parsedArgs,
opts: parsedOpts,
})

do {
garden = await Garden.factory(root, contextOpts)
Expand Down
11 changes: 7 additions & 4 deletions garden-service/src/commands/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -205,12 +205,15 @@ export interface CommandResult<T = any> {
errors?: GardenError[]
}

export interface CommandParams<T extends Parameters = {}, U extends Parameters = {}> {
export interface PrepareParams<T extends Parameters = {}, U extends Parameters = {}> {
args: ParameterValues<T>
opts: ParameterValues<U>
garden: Garden
log: LogEntry
logFooter?: LogEntry
logFooter: LogEntry
}

export interface CommandParams<T extends Parameters = {}, U extends Parameters = {}> extends PrepareParams<T, U> {
garden: Garden
}

export abstract class Command<T extends Parameters = {}, U extends Parameters = {}> {
Expand Down Expand Up @@ -277,7 +280,7 @@ export abstract class Command<T extends Parameters = {}, U extends Parameters =
* Called by the CLI before the command's action is run, but is not called again
* if the command restarts. Useful for commands in watch mode.
*/
async printHeader(_: LogEntry) {
async prepare(_: PrepareParams<T, U>) {
}

// Note: Due to a current TS limitation (apparently covered by https://github.com/Microsoft/TypeScript/issues/7011),
Expand Down
22 changes: 17 additions & 5 deletions garden-service/src/commands/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ import {
CommandParams,
handleTaskResults,
StringsParameter,
PrepareParams,
} from "./base"
import { BuildTask } from "../tasks/build"
import { TaskResults } from "../task-graph"
import dedent = require("dedent")
import { processModules } from "../process"
import { logHeader } from "../logger/util"
import { startServer, GardenServer } from "../server/server"

const buildArguments = {
modules: new StringsParameter({
Expand All @@ -35,10 +37,10 @@ const buildOptions = {
}),
}

type BuildArguments = typeof buildArguments
type BuildOptions = typeof buildOptions
type Args = typeof buildArguments
type Opts = typeof buildOptions

export class BuildCommand extends Command<BuildArguments, BuildOptions> {
export class BuildCommand extends Command<Args, Opts> {
name = "build"
help = "Build your modules."

Expand All @@ -57,13 +59,23 @@ export class BuildCommand extends Command<BuildArguments, BuildOptions> {
arguments = buildArguments
options = buildOptions

async printHeader(log) {
private server: GardenServer

async prepare({ log, logFooter, opts }: PrepareParams<Args, Opts>) {
logHeader({ log, emoji: "hammer", command: "Build" })

if (!!opts.watch) {
this.server = await startServer(logFooter)
}
}

async action(
{ args, opts, garden, log, logFooter }: CommandParams<BuildArguments, BuildOptions>,
{ args, opts, garden, log, logFooter }: CommandParams<Args, Opts>,
): Promise<CommandResult<TaskResults>> {
if (this.server) {
this.server.setGarden(garden)
}

await garden.clearBuilds()

const graph = await garden.getConfigGraph()
Expand Down
17 changes: 15 additions & 2 deletions garden-service/src/commands/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
CommandResult,
handleTaskResults,
StringsParameter,
PrepareParams,
} from "./base"
import { getDependantTasksForModule } from "../tasks/helpers"
import { TaskResults } from "../task-graph"
Expand All @@ -24,6 +25,7 @@ import { logHeader } from "../logger/util"
import { HotReloadTask } from "../tasks/hot-reload"
import { BaseTask } from "../tasks/base"
import { getHotReloadServiceNames, validateHotReloadServiceNames } from "./helpers"
import { startServer, GardenServer } from "../server/server"

const deployArgs = {
services: new StringsParameter({
Expand Down Expand Up @@ -80,11 +82,21 @@ export class DeployCommand extends Command<Args, Opts> {
arguments = deployArgs
options = deployOpts

async printHeader(log) {
private server: GardenServer

async prepare({ log, logFooter, opts }: PrepareParams<Args, Opts>) {
logHeader({ log, emoji: "rocket", command: "Deploy" })

if (!!opts.watch) {
this.server = await startServer(logFooter)
}
}

async action({ garden, log, logFooter, args, opts }: CommandParams<Args, Opts>): Promise<CommandResult<TaskResults>> {
if (this.server) {
this.server.setGarden(garden)
}

const initGraph = await garden.getConfigGraph()
const services = await initGraph.getServices(args.services)

Expand All @@ -94,7 +106,8 @@ export class DeployCommand extends Command<Args, Opts> {
}

const hotReloadServiceNames = await getHotReloadServiceNames(opts["hot-reload"], initGraph)
let watch
let watch: boolean

if (hotReloadServiceNames.length > 0) {
await initGraph.getServices(hotReloadServiceNames) // validate the existence of these services
const errMsg = await validateHotReloadServiceNames(hotReloadServiceNames, initGraph)
Expand Down
10 changes: 9 additions & 1 deletion garden-service/src/commands/dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
CommandParams,
StringsParameter,
handleTaskResults,
PrepareParams,
} from "./base"
import { STATIC_DIR } from "../constants"
import { processModules } from "../process"
Expand All @@ -31,6 +32,7 @@ import { getTestTasks } from "../tasks/test"
import { HotReloadTask } from "../tasks/hot-reload"
import { ConfigGraph } from "../config-graph"
import { getHotReloadServiceNames, validateHotReloadServiceNames } from "./helpers"
import { GardenServer, startServer } from "../server/server"

const ansiBannerPath = join(STATIC_DIR, "garden-banner-2.txt")

Expand Down Expand Up @@ -73,15 +75,21 @@ export class DevCommand extends Command<Args, Opts> {

options = devOpts

async printHeader(log) {
private server: GardenServer

async prepare({ log, logFooter }: PrepareParams<Args, Opts>) {
// print ANSI banner image
const data = await readFile(ansiBannerPath)
log.info(data.toString())

log.info(chalk.gray.italic(`\nGood ${getGreetingTime()}! Let's get your environment wired up...\n`))

this.server = await startServer(logFooter)
}

async action({ garden, log, logFooter, opts }: CommandParams<Args, Opts>): Promise<CommandResult> {
this.server.setGarden(garden)

const graph = await garden.getConfigGraph()
const modules = await graph.getModules()

Expand Down
9 changes: 5 additions & 4 deletions garden-service/src/commands/get/get-tasks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
CommandResult,
CommandParams,
StringsParameter,
PrepareParams,
} from "../base"
import { logHeader } from "../../logger/util"
import { Task } from "../../types/task"
Expand All @@ -24,7 +25,7 @@ const getTasksArgs = {
}),
}

type GetTasksArguments = typeof getTasksArgs
type Args = typeof getTasksArgs

export function prettyPrintTask(task: Task): string {
let out = `${chalk.cyan.bold(task.name)}`
Expand Down Expand Up @@ -54,17 +55,17 @@ function printField(name: string, value: string | null) {
return `${chalk.gray(name)}: ${value || ""}`
}

export class GetTasksCommand extends Command<GetTasksArguments> {
export class GetTasksCommand extends Command<Args> {
name = "tasks"
help = "Lists the tasks defined in your project's modules."

arguments = getTasksArgs

async printHeader(log) {
async prepare({ log }: PrepareParams<Args>) {
logHeader({ log, emoji: "open_book", command: "Tasks" })
}

async action({ args, garden, log }: CommandParams<GetTasksArguments>): Promise<CommandResult> {
async action({ args, garden, log }: CommandParams<Args>): Promise<CommandResult> {
const graph = await garden.getConfigGraph()
const tasks = await graph.getTasks(args.tasks)
const taskModuleNames = uniq(tasks.map(t => t.module.name))
Expand Down
14 changes: 10 additions & 4 deletions garden-service/src/commands/serve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

import dedent = require("dedent")
import { LoggerType } from "../logger/logger"
import { IntegerParameter } from "./base"
import { IntegerParameter, PrepareParams } from "./base"
import { Command, CommandResult, CommandParams } from "./base"
import { sleep } from "../util/util"
import { startServer, DEFAULT_PORT } from "../server/server"
import { DEFAULT_PORT, GardenServer, startServer } from "../server/server"

const serveArgs = {}

Expand Down Expand Up @@ -41,8 +41,14 @@ export class ServeCommand extends Command<Args, Opts> {
arguments = serveArgs
options = serveOpts

async action({ garden, log, opts }: CommandParams<Args, Opts>): Promise<CommandResult<{}>> {
await startServer(garden, log, opts.port)
private server: GardenServer

async prepare({ logFooter, opts }: PrepareParams<Args, Opts>) {
this.server = await startServer(logFooter, opts.port)
}

async action({ garden }: CommandParams<Args, Opts>): Promise<CommandResult<{}>> {
this.server.setGarden(garden)

// The server doesn't block, so we need to loop indefinitely here.
while (true) {
Expand Down
15 changes: 14 additions & 1 deletion garden-service/src/commands/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,14 @@ import {
handleTaskResults,
StringOption,
StringsParameter,
PrepareParams,
} from "./base"
import { TaskResults } from "../task-graph"
import { processModules } from "../process"
import { Module } from "../types/module"
import { getTestTasks } from "../tasks/test"
import { logHeader } from "../logger/util"
import { GardenServer, startServer } from "../server/server"

const testArgs = {
modules: new StringsParameter({
Expand Down Expand Up @@ -72,16 +74,27 @@ export class TestCommand extends Command<Args, Opts> {
arguments = testArgs
options = testOpts

async printHeader(log) {
private server: GardenServer

async prepare({ log, logFooter, opts }: PrepareParams<Args, Opts>) {
logHeader({
log,
emoji: "thermometer",
command: `Running tests`,
})

if (!!opts.watch) {
this.server = await startServer(logFooter)
}
}

async action({ garden, log, logFooter, args, opts }: CommandParams<Args, Opts>): Promise<CommandResult<TaskResults>> {
if (this.server) {
this.server.setGarden(garden)
}

const graph = await garden.getConfigGraph()

let modules: Module[]
if (args.modules) {
modules = await graph.withDependantModules(await graph.getModules(args.modules))
Expand Down
6 changes: 0 additions & 6 deletions garden-service/src/process.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import { TaskResults } from "./task-graph"
import { isModuleLinked } from "./util/ext-source-util"
import { Garden } from "./garden"
import { LogEntry } from "./logger/log-entry"
import { startServer } from "./server/server"
import { ConfigGraph } from "./config-graph"
import { dedent } from "./util/string"
import { ConfigurationError } from "./exceptions"
Expand Down Expand Up @@ -169,11 +168,6 @@ export async function processModules(
})
})

// Start HTTP API and dashboard server.
// allow overriding automatic port picking
const port = Number(process.env.GARDEN_SERVER_PORT) || undefined
await startServer(garden, log, port)

await restartPromise

return {
Expand Down
3 changes: 2 additions & 1 deletion garden-service/src/server/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import Joi = require("joi")
import Koa = require("koa")
import { Command, Parameters } from "../commands/base"
import { validate } from "../config/common"
import { coreCommands } from "../commands/commands"
import { mapValues, omitBy } from "lodash"
import { Garden } from "../garden"
import { LogLevel } from "../logger/log-node"
Expand Down Expand Up @@ -108,6 +107,8 @@ export async function prepareCommands(): Promise<CommandMap> {
command.getSubCommands().forEach(addCommand)
}

// Need to import this here to avoid circular import issues
const { coreCommands } = require("../commands/commands")
coreCommands.forEach(addCommand)

return commands
Expand Down
Loading

0 comments on commit e3bc9ee

Please sign in to comment.