Skip to content

Commit

Permalink
improvement(core): set consistent header logs on all commands
Browse files Browse the repository at this point in the history
  • Loading branch information
eysi09 authored and thsig committed Jan 18, 2021
1 parent c9650fa commit 3c2747a
Show file tree
Hide file tree
Showing 60 changed files with 381 additions and 251 deletions.
2 changes: 2 additions & 0 deletions cli/test/unit/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ describe("runCli", () => {
name = randomString(10)
help = "halp!"

printHeader() {}
async action({}: CommandParams) {
const allProcesses = await GardenProcess.getActiveProcesses()
const record = find(allProcesses, (p) => p.command)
Expand All @@ -66,6 +67,7 @@ describe("runCli", () => {
name = randomString(10)
help = "halp!"

printHeader() {}
async action({}: CommandParams) {
return { result: {} }
}
Expand Down
2 changes: 2 additions & 0 deletions core/src/cli/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,8 @@ ${renderCommands(commands)}
const log = logger.placeholder()
const footerLog = logger.placeholder()

command.printHeader({ headerLog, args: parsedArgs, opts: parsedOpts })

// Init event & log streaming.
const sessionId = uuidv4()
const bufferedEventStream = new BufferedEventStream(log, sessionId)
Expand Down
11 changes: 10 additions & 1 deletion core/src/commands/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ export interface CommandParamsBase<T extends Parameters = {}, U extends Paramete
opts: ParameterValues<GlobalOptions & U>
}

export interface PrintHeaderParams<T extends Parameters = {}, U extends Parameters = {}>
extends CommandParamsBase<T, U> {
headerLog: LogEntry
}

export interface PrepareParams<T extends Parameters = {}, U extends Parameters = {}> extends CommandParamsBase<T, U> {
headerLog: LogEntry
footerLog: LogEntry
Expand Down Expand Up @@ -163,11 +168,13 @@ export abstract class Command<T extends Parameters = {}, U extends Parameters =
return { persistent: false }
}

abstract printHeader(params: PrintHeaderParams<T, U>): void

// Note: Due to a current TS limitation (apparently covered by https://github.com/Microsoft/TypeScript/issues/7011),
// subclass implementations need to explicitly set the types in the implemented function signature. So for now we
// can't enforce the types of `args` and `opts` automatically at the abstract class level and have to specify
// the types explicitly on the subclassed methods.
abstract async action(params: CommandParams<T, U>): Promise<CommandResult>
abstract action(params: CommandParams<T, U>): Promise<CommandResult>

/**
* Called on all commands and checks if the command is protected.
Expand Down Expand Up @@ -245,6 +252,8 @@ export abstract class CommandGroup extends Command {
})
}

printHeader() {}

async action() {
return {}
}
Expand Down
12 changes: 5 additions & 7 deletions core/src/commands/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,29 +70,27 @@ export class BuildCommand extends Command<Args, Opts> {

private isPersistent = (opts) => !!opts.watch

async prepare({ headerLog, footerLog, opts }: PrepareParams<Args, Opts>) {
async prepare({ footerLog, opts }: PrepareParams<Args, Opts>) {
const persistent = this.isPersistent(opts)

if (persistent) {
printHeader(headerLog, "Build", "hammer")
this.server = await startServer({ log: footerLog })
}

return { persistent }
}

printHeader({ headerLog }) {
printHeader(headerLog, "Build", "hammer")
}

async action({
garden,
log,
headerLog,
footerLog,
args,
opts,
}: CommandParams<Args, Opts>): Promise<CommandResult<ProcessCommandResult>> {
if (!this.isPersistent(opts)) {
printHeader(headerLog, "Build", "hammer")
}

if (this.server) {
this.server.setGarden(garden)
}
Expand Down
4 changes: 3 additions & 1 deletion core/src/commands/call.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,11 @@ export class CallCommand extends Command<Args> {

arguments = callArgs

async action({ garden, log, headerLog, args }: CommandParams<Args>): Promise<CommandResult<CallResult>> {
printHeader({ headerLog }) {
printHeader(headerLog, "Call", "telephone_receiver")
}

async action({ garden, log, args }: CommandParams<Args>): Promise<CommandResult<CallResult>> {
let [serviceName, path] = splitFirst(args.serviceAndPath, "/")

// TODO: better error when service doesn't exist
Expand Down
3 changes: 3 additions & 0 deletions core/src/commands/config/config-analytics-enabled.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ export class ConfigAnalyticsEnabled extends Command {
garden config analytics-enabled false # disable analytics
`

// Skip printing header
printHeader() {}

async action({ garden, log, args }: CommandParams<Args>): Promise<CommandResult> {
const analyticsClient = await AnalyticsHandler.init(garden, log)
await analyticsClient.setAnalyticsOptIn(args.enable)
Expand Down
5 changes: 2 additions & 3 deletions core/src/commands/create/create-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import chalk from "chalk"
import dedent from "dedent"
import { pathExists } from "fs-extra"
import inquirer from "inquirer"
import { Command, CommandResult, CommandParams, PrepareParams } from "../base"
import { Command, CommandResult, CommandParams } from "../base"
import { printHeader } from "../../logger/util"
import { isDirectory, defaultConfigFilename } from "../../util/fs"
import { loadConfigResources, findProjectConfig } from "../../config/base"
Expand Down Expand Up @@ -95,9 +95,8 @@ export class CreateModuleCommand extends Command<CreateModuleArgs, CreateModuleO
return "basic"
}

async prepare({ headerLog }: PrepareParams<CreateModuleArgs, CreateModuleOpts>) {
printHeader({ headerLog }) {
printHeader(headerLog, "Create new module", "pencil2")
return { persistent: false }
}

async action({
Expand Down
5 changes: 2 additions & 3 deletions core/src/commands/create/create-project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import chalk from "chalk"
import dedent from "dedent"
import { pathExists, writeFile, copyFile } from "fs-extra"
import inquirer from "inquirer"
import { Command, CommandResult, CommandParams, PrepareParams } from "../base"
import { Command, CommandResult, CommandParams } from "../base"
import { printHeader } from "../../logger/util"
import { isDirectory } from "../../util/fs"
import { loadConfigResources } from "../../config/base"
Expand Down Expand Up @@ -91,9 +91,8 @@ export class CreateProjectCommand extends Command<CreateProjectArgs, CreateProje
return "basic"
}

async prepare({ headerLog }: PrepareParams<CreateProjectArgs, CreateProjectOpts>) {
printHeader({ headerLog }) {
printHeader(headerLog, "Create new project", "pencil2")
return { persistent: false }
}

async action({
Expand Down
5 changes: 4 additions & 1 deletion core/src/commands/dashboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,11 @@ export class DashboardCommand extends Command<Args, Opts> {
arguments = dashboardArgs
options = dashboardOpts

async prepare({ headerLog, log, footerLog, opts }: PrepareParams<Args, Opts>) {
printHeader({ headerLog }) {
printHeader(headerLog, "Dashboard", "bar_chart")
}

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

// Print nicer error message when address is not available
Expand Down
18 changes: 13 additions & 5 deletions core/src/commands/delete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ export class DeleteSecretCommand extends Command<typeof deleteSecretArgs> {

arguments = deleteSecretArgs

printHeader({ headerLog }) {
printHeader(headerLog, "Delete secrete", "skull_and_crossbones")
}

async action({ garden, log, args }: CommandParams<DeleteSecretArgs>): Promise<CommandResult<DeleteSecretResult>> {
const key = args.key!
const actions = await garden.getActionRouter()
Expand Down Expand Up @@ -102,9 +106,11 @@ export class DeleteEnvironmentCommand extends Command {
),
})

async action({ garden, log, headerLog }: CommandParams): Promise<CommandResult<DeleteEnvironmentResult>> {
printHeader(headerLog, `Deleting ${garden.environmentName} environment`, "skull_and_crossbones")
printHeader({ headerLog }) {
printHeader(headerLog, `Deleting environment`, "skull_and_crossbones")
}

async action({ garden, log }: CommandParams): Promise<CommandResult<DeleteEnvironmentResult>> {
const actions = await garden.getActionRouter()

const serviceStatuses = await actions.deleteServices(log)
Expand Down Expand Up @@ -148,7 +154,11 @@ export class DeleteServiceCommand extends Command {
outputsSchema = () =>
joiIdentifierMap(serviceStatusSchema()).description("A map of statuses for all the deleted services.")

async action({ garden, log, headerLog, args }: CommandParams<DeleteServiceArgs>): Promise<CommandResult> {
printHeader({ headerLog }) {
printHeader(headerLog, "Delete service", "skull_and_crossbones")
}

async action({ garden, log, args }: CommandParams<DeleteServiceArgs>): Promise<CommandResult> {
const graph = await garden.getConfigGraph(log)
const services = graph.getServices({ names: args.services })

Expand All @@ -157,8 +167,6 @@ export class DeleteServiceCommand extends Command {
return { result: {} }
}

printHeader(headerLog, "Delete service", "skull_and_crossbones")

const deleteServiceTasks = services.map((service) => {
return new DeleteServiceTask({ garden, graph, log, service })
})
Expand Down
11 changes: 5 additions & 6 deletions core/src/commands/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,14 @@ export class DeployCommand extends Command<Args, Opts> {

private isPersistent = (opts) => !!opts.watch || !!opts["hot-reload"]

async prepare({ headerLog, footerLog, opts }: PrepareParams<Args, Opts>) {
printHeader({ headerLog }) {
printHeader(headerLog, "Deploy", "rocket")
}

async prepare({ footerLog, opts }: PrepareParams<Args, Opts>) {
const persistent = this.isPersistent(opts)

if (persistent) {
printHeader(headerLog, "Deploy", "rocket")
this.server = await startServer({ log: footerLog })
}

Expand All @@ -107,14 +110,10 @@ export class DeployCommand extends Command<Args, Opts> {
async action({
garden,
log,
headerLog,
footerLog,
args,
opts,
}: CommandParams<Args, Opts>): Promise<CommandResult<ProcessCommandResult>> {
if (!this.isPersistent(opts)) {
printHeader(headerLog, "Deploy", "rocket")
}
if (this.server) {
this.server.setGarden(garden)
}
Expand Down
5 changes: 5 additions & 0 deletions core/src/commands/dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import { DeployTask } from "../tasks/deploy"
import { Garden } from "../garden"
import { LogEntry } from "../logger/log-entry"
import { StringsParameter, BooleanParameter } from "../cli/params"
import { printHeader } from "../logger/util"

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

Expand Down Expand Up @@ -86,6 +87,10 @@ export class DevCommand extends Command<DevCommandArgs, DevCommandOpts> {

options = devOpts

printHeader({ headerLog }) {
printHeader(headerLog, "Dev", "keyboard")
}

async prepare({ log, footerLog }: PrepareParams<DevCommandArgs, DevCommandOpts>) {
// print ANSI banner image
const data = await readFile(ansiBannerPath)
Expand Down
14 changes: 6 additions & 8 deletions core/src/commands/exec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,21 +64,19 @@ export class ExecCommand extends Command<Args> {
return "basic"
}

async action({
garden,
log,
headerLog,
args,
opts,
}: CommandParams<Args, Opts>): Promise<CommandResult<ExecInServiceResult>> {
printHeader({ headerLog, args }) {
const serviceName = args.service
const command = args.command || []

printHeader(
headerLog,
`Running command ${chalk.cyan(command.join(" "))} in service ${chalk.cyan(serviceName)}`,
"runner"
)
}

async action({ garden, log, args, opts }: CommandParams<Args, Opts>): Promise<CommandResult<ExecInServiceResult>> {
const serviceName = args.service
const command = args.command || []

const graph = await garden.getConfigGraph(log)
const service = graph.getService(serviceName)
Expand Down
5 changes: 5 additions & 0 deletions core/src/commands/get/get-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { providerConfigBaseSchema, providerSchema } from "../../config/provider"
import { moduleConfigSchema } from "../../config/module"
import { workflowConfigSchema } from "../../config/workflow"
import { BooleanParameter, ChoicesParameter } from "../../cli/params"
import { printHeader } from "../../logger/util"

export const getConfigOptions = {
"exclude-disabled": new BooleanParameter({
Expand Down Expand Up @@ -54,6 +55,10 @@ export class GetConfigCommand extends Command<{}, Opts> {

options = getConfigOptions

printHeader({ headerLog }) {
printHeader(headerLog, "Get config", "open_file_folder")
}

async action({ garden, log, opts }: CommandParams<{}, Opts>): Promise<CommandResult<ConfigDump>> {
const config = await garden.dumpConfig({
log,
Expand Down
5 changes: 5 additions & 0 deletions core/src/commands/get/get-debug-info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import chalk from "chalk"
import { GitHandler } from "../../vcs/git"
import { ValidationError } from "../../exceptions"
import { ChoicesParameter, BooleanParameter } from "../../cli/params"
import { printHeader } from "../../logger/util"

export const TEMP_DEBUG_ROOT = "tmp"
export const SYSTEM_INFO_FILENAME_NO_EXT = "system-info"
Expand Down Expand Up @@ -268,6 +269,10 @@ export class GetDebugInfoCommand extends Command<Args, Opts> {
arguments = debugInfoArguments
options = debugInfoOptions

printHeader({ headerLog }) {
printHeader(headerLog, "Get debug info", "information_source")
}

async action({ garden, log, opts }: CommandParams<Args, Opts>) {
const tempPath = join(garden.gardenDirPath, TEMP_DEBUG_ROOT)

Expand Down
2 changes: 2 additions & 0 deletions core/src/commands/get/get-doddi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ export class GetDoddiCommand extends Command {
hidden = true
noProject = true

printHeader() {}

async action(): Promise<CommandResult> {
const image = (await readFile(join(STATIC_DIR, "doddi.txt"))).toString()
// tslint:disable-next-line: no-console
Expand Down
2 changes: 2 additions & 0 deletions core/src/commands/get/get-eysi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ export class GetEysiCommand extends Command {
hidden = true
noProject = true

printHeader() {}

async action(): Promise<CommandResult> {
const eysi = (await readFile(join(STATIC_DIR, "eysi.txt"))).toString()
// tslint:disable-next-line: no-console
Expand Down
5 changes: 5 additions & 0 deletions core/src/commands/get/get-graph.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
*/

import { RenderedEdge, RenderedNode } from "../../config-graph"
import { printHeader } from "../../logger/util"
import { Command, CommandResult, CommandParams } from "../base"

export interface GraphOutput {
Expand All @@ -18,6 +19,10 @@ export class GetGraphCommand extends Command {
name = "graph"
help = "Outputs the dependency relationships specified in this project's garden.yml files."

printHeader({ headerLog }) {
printHeader(headerLog, "Get graph", "chart_with_upwards_trend")
}

async action({ garden, log }: CommandParams): Promise<CommandResult<GraphOutput>> {
const graph = await garden.getConfigGraph(log)
const renderedGraph = graph.render()
Expand Down
4 changes: 3 additions & 1 deletion core/src/commands/get/get-linked-repos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@ export class GetLinkedReposCommand extends Command {
name = "linked-repos"
help = "Outputs a list of all linked remote sources and modules for this project."

async action({ garden, log, headerLog }: CommandParams<Args>): Promise<CommandResult<LinkedSource[]>> {
printHeader({ headerLog }) {
printHeader(headerLog, "List linked modules and sources", "open_book")
}

async action({ garden, log }: CommandParams<Args>): Promise<CommandResult<LinkedSource[]>> {
const linkedProjectSources = sortBy(await getLinkedSources(garden, "project"), (s) => s.name)
const linkedModuleSources = sortBy(await getLinkedSources(garden, "module"), (s) => s.name)

Expand Down

0 comments on commit 3c2747a

Please sign in to comment.