From 0b7ce98e7b689054de8d13e4eda9aa70600e6521 Mon Sep 17 00:00:00 2001 From: Jon Edvald Date: Sat, 4 May 2019 12:58:52 -0700 Subject: [PATCH] fix(k8s): helm modules weren't identified as hot reloadable This adds an explicit flag to service configs to tell the framework when they are valid for hot reloading. --- garden-service/src/commands/deploy.ts | 2 +- garden-service/src/commands/helpers.ts | 4 +--- garden-service/src/config/service.ts | 5 +++++ garden-service/src/plugins/container/container.ts | 4 +++- garden-service/src/plugins/google/google-cloud-functions.ts | 1 + garden-service/src/plugins/kubernetes/helm/config.ts | 2 ++ .../src/plugins/kubernetes/kubernetes-module/config.ts | 1 + .../src/plugins/local/local-google-cloud-functions.ts | 1 + garden-service/src/plugins/openfaas/openfaas.ts | 1 + garden-service/test/helpers.ts | 1 + garden-service/test/unit/src/actions.ts | 1 + garden-service/test/unit/src/plugins/container.ts | 1 + .../test/unit/src/plugins/kubernetes/container/ingress.ts | 1 + .../test/unit/src/plugins/kubernetes/helm/config.ts | 1 + 14 files changed, 21 insertions(+), 5 deletions(-) diff --git a/garden-service/src/commands/deploy.ts b/garden-service/src/commands/deploy.ts index 969cbf64b2..e78525632e 100644 --- a/garden-service/src/commands/deploy.ts +++ b/garden-service/src/commands/deploy.ts @@ -87,7 +87,7 @@ export class DeployCommand extends Command { async prepare({ log, logFooter, opts }: PrepareParams) { logHeader({ log, emoji: "rocket", command: "Deploy" }) - if (!!opts.watch) { + if (!!opts.watch || !!opts["hot-reload"]) { this.server = await startServer(logFooter) } } diff --git a/garden-service/src/commands/helpers.ts b/garden-service/src/commands/helpers.ts index e9c8a42246..4705da0050 100644 --- a/garden-service/src/commands/helpers.ts +++ b/garden-service/src/commands/helpers.ts @@ -40,8 +40,6 @@ export async function validateHotReloadServiceNames( } } -// TODO: Add hotReload to baseModuleSpecSchema. It's bad form to dig into module type-specific fields -// outside the scope of its plugins. function supportsHotReloading(service: Service) { - return !!service.module.spec.hotReload + return service.config.hotReloadable } diff --git a/garden-service/src/config/service.ts b/garden-service/src/config/service.ts index 02fa20d1a5..f2dcc43672 100644 --- a/garden-service/src/config/service.ts +++ b/garden-service/src/config/service.ts @@ -38,13 +38,18 @@ export const baseServiceSchema = Joi.object() .description("The required attributes of a service. This is generally further defined by plugins.") export interface ServiceConfig extends CommonServiceSpec { + hotReloadable: boolean sourceModuleName?: string + // Plugins can add custom fields that are kept here spec: T } export const serviceConfigSchema = baseServiceSchema .keys({ + hotReloadable: Joi.boolean() + .default(false) + .description("Set this to true if the module and service configuration supports hot reloading."), sourceModuleName: joiIdentifier() .optional() .description(deline` diff --git a/garden-service/src/plugins/container/container.ts b/garden-service/src/plugins/container/container.ts index 7bcd3ec33f..6127238e56 100644 --- a/garden-service/src/plugins/container/container.ts +++ b/garden-service/src/plugins/container/container.ts @@ -48,6 +48,8 @@ export async function configureContainerModule({ ctx, moduleConfig }: ConfigureM } } + const hotReloadable = !!moduleConfig.spec.hotReload + // validate services moduleConfig.serviceConfigs = moduleConfig.spec.services.map(spec => { // make sure ports are correctly configured @@ -91,7 +93,7 @@ export async function configureContainerModule({ ctx, moduleConfig }: ConfigureM return { name, dependencies: spec.dependencies, - outputs: spec.outputs, + hotReloadable, spec, } }) diff --git a/garden-service/src/plugins/google/google-cloud-functions.ts b/garden-service/src/plugins/google/google-cloud-functions.ts index 25c9c44aaa..0f760fa01c 100644 --- a/garden-service/src/plugins/google/google-cloud-functions.ts +++ b/garden-service/src/plugins/google/google-cloud-functions.ts @@ -89,6 +89,7 @@ export async function configureGcfModule( name, dependencies: spec.dependencies, outputs: spec.outputs, + hotReloadable: false, spec, }] diff --git a/garden-service/src/plugins/kubernetes/helm/config.ts b/garden-service/src/plugins/kubernetes/helm/config.ts index 20361ed0f1..c7d658dacd 100644 --- a/garden-service/src/plugins/kubernetes/helm/config.ts +++ b/garden-service/src/plugins/kubernetes/helm/config.ts @@ -222,6 +222,8 @@ export async function validateHelmModule({ moduleConfig }: ConfigureModuleParams name: moduleConfig.name, dependencies, outputs: {}, + // Note: We can't tell here if the source module supports hot-reloading, so we catch it in the handler if need be. + hotReloadable: !!sourceModuleName, sourceModuleName, spec: moduleConfig.spec, }] diff --git a/garden-service/src/plugins/kubernetes/kubernetes-module/config.ts b/garden-service/src/plugins/kubernetes/kubernetes-module/config.ts index b7bfbfc13a..151c27f365 100644 --- a/garden-service/src/plugins/kubernetes/kubernetes-module/config.ts +++ b/garden-service/src/plugins/kubernetes/kubernetes-module/config.ts @@ -90,6 +90,7 @@ export async function configureKubernetesModule({ moduleConfig }: ConfigureModul name: moduleConfig.name, dependencies: moduleConfig.spec.dependencies, outputs: {}, + hotReloadable: false, spec: moduleConfig.spec, }] diff --git a/garden-service/src/plugins/local/local-google-cloud-functions.ts b/garden-service/src/plugins/local/local-google-cloud-functions.ts index 951d36d501..df6a02d243 100644 --- a/garden-service/src/plugins/local/local-google-cloud-functions.ts +++ b/garden-service/src/plugins/local/local-google-cloud-functions.ts @@ -72,6 +72,7 @@ export const gardenPlugin = (): GardenPlugin => ({ return { name: spec.name, dependencies: spec.dependencies, + hotReloadable: false, outputs: spec.outputs, spec, } diff --git a/garden-service/src/plugins/openfaas/openfaas.ts b/garden-service/src/plugins/openfaas/openfaas.ts index 0fd8976928..ac27e75935 100644 --- a/garden-service/src/plugins/openfaas/openfaas.ts +++ b/garden-service/src/plugins/openfaas/openfaas.ts @@ -192,6 +192,7 @@ export function gardenPlugin(): GardenPlugin { moduleConfig.serviceConfigs = [{ dependencies: [], + hotReloadable: false, name: moduleConfig.name, outputs: {}, spec: { diff --git a/garden-service/test/helpers.ts b/garden-service/test/helpers.ts index e39a50f75b..b2b41b7056 100644 --- a/garden-service/test/helpers.ts +++ b/garden-service/test/helpers.ts @@ -242,6 +242,7 @@ const defaultModuleConfig: ModuleConfig = { name: "test-service", dependencies: [], outputs: {}, + hotReloadable: false, spec: {}, }, ], diff --git a/garden-service/test/unit/src/actions.ts b/garden-service/test/unit/src/actions.ts index 0e0bb81832..2e7fae3bbf 100644 --- a/garden-service/test/unit/src/actions.ts +++ b/garden-service/test/unit/src/actions.ts @@ -453,6 +453,7 @@ const testPlugin: PluginFactory = async () => ({ name: spec.name, dependencies: spec.dependencies || [], outputs: {}, + hotReloadable: false, spec, })) diff --git a/garden-service/test/unit/src/plugins/container.ts b/garden-service/test/unit/src/plugins/container.ts index c2f18e7dba..d366adc49b 100644 --- a/garden-service/test/unit/src/plugins/container.ts +++ b/garden-service/test/unit/src/plugins/container.ts @@ -476,6 +476,7 @@ describe("plugins.container", () => { name: "service-a", dependencies: [], outputs: {}, + hotReloadable: false, spec: { name: "service-a", diff --git a/garden-service/test/unit/src/plugins/kubernetes/container/ingress.ts b/garden-service/test/unit/src/plugins/kubernetes/container/ingress.ts index e3997ecdbd..d234172d61 100644 --- a/garden-service/test/unit/src/plugins/kubernetes/container/ingress.ts +++ b/garden-service/test/unit/src/plugins/kubernetes/container/ingress.ts @@ -368,6 +368,7 @@ describe("createIngressResources", () => { name: spec.name, dependencies: [], outputs: {}, + hotReloadable: false, spec, }, module, diff --git a/garden-service/test/unit/src/plugins/kubernetes/helm/config.ts b/garden-service/test/unit/src/plugins/kubernetes/helm/config.ts index 57970059ad..7d88679002 100644 --- a/garden-service/test/unit/src/plugins/kubernetes/helm/config.ts +++ b/garden-service/test/unit/src/plugins/kubernetes/helm/config.ts @@ -61,6 +61,7 @@ describe("validateHelmModule", () => { name: "api", dependencies: [], outputs: {}, + hotReloadable: true, sourceModuleName: "api-image", spec: { build: {