diff --git a/src/utils/config/kubernetes.js b/src/utils/config/kubernetes.js index 953b43aaa..56eb57618 100644 --- a/src/utils/config/kubernetes.js +++ b/src/utils/config/kubernetes.js @@ -35,6 +35,9 @@ const extractKubeData = (config) => { }; }; +export const ANNOTATION_BASE = "gethomepage.dev"; +export const ANNOTATION_WIDGET_BASE = `${ANNOTATION_BASE}/widget.`; + export default function getKubeArguments() { checkAndCopyConfig("kubernetes.yaml"); @@ -72,4 +75,4 @@ export async function checkCRD(name,kc,logger) { }); return exist; -} \ No newline at end of file +} diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index b44b75031..cc47c4457 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -8,6 +8,7 @@ import createLogger from "utils/logger"; import checkAndCopyConfig, { CONF_DIR, getSettings, substituteEnvironmentVars } from "utils/config/config"; import getDockerArguments from "utils/config/docker"; import { getUrlSchema, getRouteList } from "utils/kubernetes/kubernetes-routes"; +import {ANNOTATION_BASE,ANNOTATION_WIDGET_BASE} from "utils/config/kubernetes" import * as shvl from "utils/config/shvl"; const logger = createLogger("service-helpers"); @@ -167,8 +168,6 @@ export async function servicesFromDocker() { } export async function servicesFromKubernetes() { - const ANNOTATION_BASE = "gethomepage.dev"; - const ANNOTATION_WIDGET_BASE = `${ANNOTATION_BASE}/widget.`; const { instanceName } = getSettings(); checkAndCopyConfig("kubernetes.yaml"); diff --git a/src/utils/kubernetes/kubernetes-httproute-list.js b/src/utils/kubernetes/kubernetes-httproute-list.js index db85ac054..87bc92820 100644 --- a/src/utils/kubernetes/kubernetes-httproute-list.js +++ b/src/utils/kubernetes/kubernetes-httproute-list.js @@ -1,50 +1,54 @@ -// import { CustomObjectsApi, CoreV1Api } from "@kubernetes/client-node"; -// import createLogger from "utils/logger"; +import { CustomObjectsApi, CoreV1Api } from "@kubernetes/client-node"; +import createLogger from "utils/logger"; +const logger = createLogger("kubernetes-httproute-list"); +const HTTPROUTE_API_GROUP = "gateway.networking.k8s.io"; +const HTTPROUTE_API_VERSION = "v1"; -// export async function getHttpRouteList(kc) { +export default async function listHttpRoute(kubeArguments) { -// const logger = createLogger("service-helpers"); -// const crd = kc.makeApiClient(CustomObjectsApi); -// const core = kc.makeApiClient(CoreV1Api); -// let httpRouteList = []; - -// // httproutes -// const getHttpRoute = async (namespace) => -// crd -// .listNamespacedCustomObject(apiGroup, version, namespace, "httproutes") -// .then((response) => { -// const [httpRoute] = response.body.items; -// return httpRoute; -// }) -// .catch((error) => { -// logger.error("Error getting httproutes: %d %s %s", error.statusCode, error.body, error.response); -// logger.debug(error); -// return null; -// }); - -// // namespaces -// const namespaces = await core -// .listNamespace() -// .then((response) => response.body.items.map((ns) => ns.metadata.name)) -// .catch((error) => { -// logger.error("Error getting namespaces: %d %s %s", error.statusCode, error.body, error.response); -// logger.debug(error); -// return null; -// }); - -// if (namespaces) { -// const httpRouteListUnfiltered = await Promise.all( -// namespaces.map(async (namespace) => { -// const httpRoute = await getHttpRoute(namespace); -// return httpRoute; -// }), -// ); - -// httpRouteList = httpRouteListUnfiltered.filter((httpRoute) => httpRoute !== undefined); -// } + const crd = kubeArguments.config.makeApiClient(CustomObjectsApi); + const core = kubeArguments.config.makeApiClient(CoreV1Api); + const { gateway } = kubeArguments; + let httpRouteList = []; -// return httpRouteList; -// } \ No newline at end of file + if (gateway === true) { + // httproutes + const getHttpRoute = async (namespace) => + crd + .listNamespacedCustomObject(HTTPROUTE_API_GROUP, HTTPROUTE_API_VERSION, namespace, "httproutes") + .then((response) => { + const [httpRoute] = response.body.items; + return httpRoute; + }) + .catch((error) => { + logger.error("Error getting httproutes: %d %s %s", error.statusCode, error.body, error.response); + logger.debug(error); + return null; + }); + + // namespaces + const namespaces = await core + .listNamespace() + .then((response) => response.body.items.map((ns) => ns.metadata.name)) + .catch((error) => { + logger.error("Error getting namespaces: %d %s %s", error.statusCode, error.body, error.response); + logger.debug(error); + return null; + }); + + if (namespaces) { + const httpRouteListUnfiltered = await Promise.all( + namespaces.map(async (namespace) => { + const httpRoute = await getHttpRoute(namespace); + return httpRoute; + }), + ); + + httpRouteList = httpRouteListUnfiltered.filter((httpRoute) => httpRoute !== undefined); + } + } + return httpRouteList; +} \ No newline at end of file diff --git a/src/utils/kubernetes/kubernetes-ingress-list.js b/src/utils/kubernetes/kubernetes-ingress-list.js index a646857c5..334dbac5b 100644 --- a/src/utils/kubernetes/kubernetes-ingress-list.js +++ b/src/utils/kubernetes/kubernetes-ingress-list.js @@ -1,18 +1,25 @@ -// import NetworkingV1Api from "@kubernetes/client-node"; +import NetworkingV1Api from "@kubernetes/client-node"; + +import createLogger from "utils/logger"; + +const logger = createLogger("kubernetes-ingress-list"); -// export async function listIngress(kc) { +export default async function listIngress(kubeArguments) { -// const networking = kc.makeApiClient(NetworkingV1Api); - -// const ingressList = await networking -// .listIngressForAllNamespaces(null, null, null, null) -// .then((response) => response.body) -// .catch((error) => { -// logger.error("Error getting ingresses: %d %s %s", error.statusCode, error.body, error.response); -// logger.debug(error); -// return null; -// }); - -// return ingressList; -// } \ No newline at end of file + const networking = kubeArguments.config.makeApiClient(NetworkingV1Api); + const { ingress} = kubeArguments; + let ingressList = [] + + if (ingress===true){ + ingressList = await networking + .listIngressForAllNamespaces(null, null, null, null) + .then((response) => response.body) + .catch((error) => { + logger.error("Error getting ingresses: %d %s %s", error.statusCode, error.body, error.response); + logger.debug(error); + return null; + }); + } + return ingressList.items; +} \ No newline at end of file diff --git a/src/utils/kubernetes/kubernetes-traefik-list.js b/src/utils/kubernetes/kubernetes-traefik-list.js index 00e81da97..46519d732 100644 --- a/src/utils/kubernetes/kubernetes-traefik-list.js +++ b/src/utils/kubernetes/kubernetes-traefik-list.js @@ -1,60 +1,63 @@ -// import CustomObjectsApi from "@kubernetes/client-node"; -// import createLogger from "utils/logger"; +import CustomObjectsApi from "@kubernetes/client-node"; -// export async function listIngress(annotationBase,kc) { +import { checkCRD,ANNOTATION_BASE } from "utils/config/kubernetes"; +import createLogger from "utils/logger"; + +const logger = createLogger("kubernetes-traefik-list"); + +export default async function listTraefikIngress(kubeArguments) { -// const logger = createLogger("service-helpers"); -// const traefik = kubeArguments.traefik; -// let traefikList = []; + const kc = kubeArguments.config; + const { traefik } = kubeArguments; + const traefikList = []; -// if (traefik) { -// const crd = kc.makeApiClient(CustomObjectsApi); -// const traefikContainoExists = await checkCRD("ingressroutes.traefik.containo.us",kc,logger); -// const traefikExists = await checkCRD("ingressroutes.traefik.io",kc,logger); + if (traefik) { + const crd = kc.makeApiClient(CustomObjectsApi); + const traefikContainoExists = await checkCRD("ingressroutes.traefik.containo.us",kc,logger); + const traefikExists = await checkCRD("ingressroutes.traefik.io",kc,logger); -// const traefikIngressListContaino = await crd -// .listClusterCustomObject("traefik.containo.us", "v1alpha1", "ingressroutes") -// .then((response) => response.body) -// .catch(async (error) => { -// if (traefikContainoExists) { -// logger.error( -// "Error getting traefik ingresses from traefik.containo.us: %d %s %s", -// error.statusCode, -// error.body, -// error.response, -// ); -// logger.debug(error); -// } + const traefikIngressListContaino = await crd + .listClusterCustomObject("traefik.containo.us", "v1alpha1", "ingressroutes") + .then((response) => response.body) + .catch(async (error) => { + if (traefikContainoExists) { + logger.error( + "Error getting traefik ingresses from traefik.containo.us: %d %s %s", + error.statusCode, + error.body, + error.response, + ); + logger.debug(error); + } -// return []; -// }); + return []; + }); -// const traefikIngressListIo = await crd -// .listClusterCustomObject("traefik.io", "v1alpha1", "ingressroutes") -// .then((response) => response.body) -// .catch(async (error) => { -// if (traefikExists) { -// logger.error( -// "Error getting traefik ingresses from traefik.io: %d %s %s", -// error.statusCode, -// error.body, -// error.response, -// ); -// logger.debug(error); -// } + const traefikIngressListIo = await crd + .listClusterCustomObject("traefik.io", "v1alpha1", "ingressroutes") + .then((response) => response.body) + .catch(async (error) => { + if (traefikExists) { + logger.error( + "Error getting traefik ingresses from traefik.io: %d %s %s", + error.statusCode, + error.body, + error.response, + ); + logger.debug(error); + } -// return []; -// }); + return []; + }); -// const traefikIngressList = [...(traefikIngressListContaino?.items ?? []), ...(traefikIngressListIo?.items ?? [])]; + const traefikIngressList = [...(traefikIngressListContaino?.items ?? []), ...(traefikIngressListIo?.items ?? [])]; -// if (traefikIngressList.length > 0) { -// const traefikServices = traefikIngressList.filter( -// (ingress) => ingress.metadata.annotations && ingress.metadata.annotations[`${annotationBase}/href`], -// ); -// traefikList.items.push(...traefikServices); -// } -// } - -// return traefikList; -// } \ No newline at end of file + if (traefikIngressList.length > 0) { + const traefikServices = traefikIngressList.filter( + (ingress) => ingress.metadata.annotations && ingress.metadata.annotations[`${ANNOTATION_BASE}/href`], + ); + traefikList.push(...traefikServices); + } + } + return traefikList; +} \ No newline at end of file