From 1faa48d7acb45af9482ae9f5b8db2a5d9ff9857a Mon Sep 17 00:00:00 2001 From: Emanuele Libralato Date: Thu, 8 Aug 2019 12:14:07 +0200 Subject: [PATCH] fix: exception when retrieving logs from helm resource --- garden-service/src/plugins/kubernetes/util.ts | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/garden-service/src/plugins/kubernetes/util.ts b/garden-service/src/plugins/kubernetes/util.ts index b8b2253ff28..e2e9680ed22 100644 --- a/garden-service/src/plugins/kubernetes/util.ts +++ b/garden-service/src/plugins/kubernetes/util.ts @@ -52,11 +52,42 @@ export async function getAllPodNames(api: KubeApi, namespace: string, resources: return (await getAllPods(api, namespace, resources)).map(p => p.metadata.name) } +/** + * Given a resources, try to retrieve a valid selector or return undefined otherwise. + * NOTE: { selector: undefined } matches no pods for the resource, when using the k8s APIs. + */ +export function getSelectorFromResource(resource: KubernetesWorkload) { + let selector + // We check if the resource has its own selector + if (resource.spec.selector) { + selector = resource.spec.selector.matchLabels + } else { + // We check if the resource is from an Helm Chart + // (as in returned from kubernetes.helm.common.getChartResources(...)) + if (resource.metadata + && resource.metadata.labels + && resource.metadata.labels.chart + && resource.metadata.labels.app) { + selector = { + app: resource.metadata.labels.app, + } + } + } + if (!selector) { + // No selector found. + throw new ConfigurationError(`No selector found for ${resource.metadata.name} while retrieving pods.`, { + resource, + }) + } + + return selector +} + /** * Retrieve a list of pods based on the provided label selector. */ export async function getWorkloadPods(api: KubeApi, namespace: string, resource: KubernetesWorkload) { - const selector = resource.spec.selector.matchLabels + const selector = getSelectorFromResource(resource) const pods = await getPods(api, resource.metadata.namespace || namespace, selector) if (resource.kind === "Deployment") {