From 6e43194f71e6cadf6759b7c3d1262f2264613d12 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Fischer Date: Mon, 18 Sep 2023 01:49:03 +0200 Subject: [PATCH] Fix: Kubernetes discovery & Check for Custom Resource Definitions (#2003) * Implement a CRD existence check * test adding patch --- src/utils/config/service-helpers.js | 33 ++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index 921d3ef68..619c0cb21 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -4,7 +4,7 @@ import path from "path"; import yaml from "js-yaml"; import Docker from "dockerode"; import * as shvl from "shvl"; -import { CustomObjectsApi, NetworkingV1Api } from "@kubernetes/client-node"; +import { CustomObjectsApi, NetworkingV1Api, ApiextensionsV1Api } from "@kubernetes/client-node"; import createLogger from "utils/logger"; import checkAndCopyConfig, { CONF_DIR, substituteEnvironmentVars } from "utils/config/config"; @@ -141,6 +141,26 @@ function getUrlFromIngress(ingress) { return `${urlSchema}://${urlHost}${urlPath}`; } +export async function checkCRD(kc, name) { + const apiExtensions = kc.makeApiClient(ApiextensionsV1Api); + const exist = await apiExtensions + .readCustomResourceDefinitionStatus(name) + .then(() => true) + .catch(async (error) => { + if (error.statusCode === 403) { + logger.error( + "Error checking if CRD %s exists. Make sure to add the following permission to your RBAC: %d %s %s", + name, + error.statusCode, + error.body.message + ); + } + return false + }); + + return exist +} + export async function servicesFromKubernetes() { const ANNOTATION_BASE = "gethomepage.dev"; const ANNOTATION_WIDGET_BASE = `${ANNOTATION_BASE}/widget.`; @@ -164,11 +184,14 @@ export async function servicesFromKubernetes() { return null; }); + const traefikContainoExists = await checkCRD(kc, "ingressroutes.traefik.containo.us"); + const traefikExists = await checkCRD(kc, "ingressroutes.traefik.io"); + const traefikIngressListContaino = await crd .listClusterCustomObject("traefik.containo.us", "v1alpha1", "ingressroutes") .then((response) => response.body ?? []) .catch(async (error) => { - if (![403, 404].includes(error.statusCode)) { + if (traefikContainoExists) { logger.error( "Error getting traefik ingresses from traefik.containo.us: %d %s %s", error.statusCode, @@ -184,7 +207,7 @@ export async function servicesFromKubernetes() { .listClusterCustomObject("traefik.io", "v1alpha1", "ingressroutes") .then((response) => response.body ?? []) .catch(async (error) => { - if (![403, 404].includes(error.statusCode)) { + if (traefikExists) { logger.error( "Error getting traefik ingresses from traefik.io: %d %s %s", error.statusCode, @@ -196,9 +219,9 @@ export async function servicesFromKubernetes() { return []; }); - const traefikIngressList = [...traefikIngressListContaino, ...traefikIngressListIo]; + const traefikIngressList = [...traefikIngressListContaino?.items ?? [], ...traefikIngressListIo?.items ?? []]; - if (traefikIngressList?.items?.length > 0) { + if (traefikIngressList.length > 0) { const traefikServices = traefikIngressList.items.filter( (ingress) => ingress.metadata.annotations && ingress.metadata.annotations[`${ANNOTATION_BASE}/href`] );