|
|
@ -6,10 +6,13 @@ import Docker from "dockerode";
|
|
|
|
import * as shvl from "shvl";
|
|
|
|
import * as shvl from "shvl";
|
|
|
|
import { NetworkingV1Api } from "@kubernetes/client-node";
|
|
|
|
import { NetworkingV1Api } from "@kubernetes/client-node";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import createLogger from "utils/logger";
|
|
|
|
import checkAndCopyConfig from "utils/config/config";
|
|
|
|
import checkAndCopyConfig from "utils/config/config";
|
|
|
|
import getDockerArguments from "utils/config/docker";
|
|
|
|
import getDockerArguments from "utils/config/docker";
|
|
|
|
import getKubeConfig from "utils/config/kubernetes";
|
|
|
|
import getKubeConfig from "utils/config/kubernetes";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const logger = createLogger("service-helpers");
|
|
|
|
|
|
|
|
|
|
|
|
export async function servicesFromConfig() {
|
|
|
|
export async function servicesFromConfig() {
|
|
|
|
checkAndCopyConfig("services.yaml");
|
|
|
|
checkAndCopyConfig("services.yaml");
|
|
|
|
|
|
|
|
|
|
|
@ -105,54 +108,80 @@ export async function servicesFromDocker() {
|
|
|
|
return mappedServiceGroups;
|
|
|
|
return mappedServiceGroups;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function getUrlFromIngress(ingress) {
|
|
|
|
|
|
|
|
let url = ingress.metadata.annotations['homepage/url'];
|
|
|
|
|
|
|
|
if(!url) {
|
|
|
|
|
|
|
|
const host = ingress.spec.rules[0].host;
|
|
|
|
|
|
|
|
const path = ingress.spec.rules[0].http.paths[0].path;
|
|
|
|
|
|
|
|
const schema = ingress.spec.tls ? 'https' : 'http';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
url = `${schema}://${host}${path}`;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return url;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export async function servicesFromKubernetes() {
|
|
|
|
export async function servicesFromKubernetes() {
|
|
|
|
checkAndCopyConfig("kubernetes.yaml");
|
|
|
|
checkAndCopyConfig("kubernetes.yaml");
|
|
|
|
|
|
|
|
|
|
|
|
const kc = getKubeConfig();
|
|
|
|
try {
|
|
|
|
const networking = kc.makeApiClient(NetworkingV1Api);
|
|
|
|
const kc = getKubeConfig();
|
|
|
|
|
|
|
|
const networking = kc.makeApiClient(NetworkingV1Api);
|
|
|
|
const ingressResponse = await networking.listIngressForAllNamespaces(null, null, null, "homepage/enabled=true");
|
|
|
|
|
|
|
|
const services = ingressResponse.body.items.map((ingress) => {
|
|
|
|
const ingressList = await networking.listIngressForAllNamespaces(null, null, null, "homepage/enabled=true")
|
|
|
|
const constructedService = {
|
|
|
|
.then((response) => response.body)
|
|
|
|
app: ingress.metadata.name,
|
|
|
|
.catch((error) => {
|
|
|
|
namespace: ingress.metadata.namespace,
|
|
|
|
logger.error("Error getting ingresses: %d %s %s", error.statusCode, error.body, error.response);
|
|
|
|
href: `https://${ingress.spec.rules[0].host}`,
|
|
|
|
return null;
|
|
|
|
name: ingress.metadata.annotations['homepage/name'],
|
|
|
|
});
|
|
|
|
group: ingress.metadata.annotations['homepage/group'],
|
|
|
|
if (!ingressList) {
|
|
|
|
icon: ingress.metadata.annotations['homepage/icon'],
|
|
|
|
return [];
|
|
|
|
description: ingress.metadata.annotations['homepage/description']
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const services = ingressList.items.map((ingress) => {
|
|
|
|
Object.keys(ingress.metadata.labels).forEach((label) => {
|
|
|
|
const constructedService = {
|
|
|
|
if (label.startsWith("homepage/widget/")) {
|
|
|
|
app: ingress.metadata.name,
|
|
|
|
shvl.set(constructedService, label.replace("homepage/widget/", ""), ingress.metadata.labels[label]);
|
|
|
|
namespace: ingress.metadata.namespace,
|
|
|
|
}
|
|
|
|
href: getUrlFromIngress(ingress),
|
|
|
|
|
|
|
|
name: ingress.metadata.annotations['homepage/name'] || ingress.metadata.name,
|
|
|
|
|
|
|
|
group: ingress.metadata.annotations['homepage/group'] || "Kubernetes",
|
|
|
|
|
|
|
|
icon: ingress.metadata.annotations['homepage/icon'] || '',
|
|
|
|
|
|
|
|
description: ingress.metadata.annotations['homepage/description'] || ''
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
Object.keys(ingress.metadata.annotations).forEach((annotation) => {
|
|
|
|
|
|
|
|
if (annotation.startsWith("homepage/widget/")) {
|
|
|
|
|
|
|
|
shvl.set(constructedService, annotation.replace("homepage/widget/", ""), ingress.metadata.annotations[annotation]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return constructedService;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return constructedService;
|
|
|
|
const mappedServiceGroups = [];
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const mappedServiceGroups = [];
|
|
|
|
services.forEach((serverService) => {
|
|
|
|
|
|
|
|
let serverGroup = mappedServiceGroups.find((searchedGroup) => searchedGroup.name === serverService.group);
|
|
|
|
|
|
|
|
if (!serverGroup) {
|
|
|
|
|
|
|
|
mappedServiceGroups.push({
|
|
|
|
|
|
|
|
name: serverService.group,
|
|
|
|
|
|
|
|
services: [],
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
serverGroup = mappedServiceGroups[mappedServiceGroups.length - 1];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
services.forEach((serverService) => {
|
|
|
|
const { name: serviceName, group: serverServiceGroup, ...pushedService } = serverService;
|
|
|
|
let serverGroup = mappedServiceGroups.find((searchedGroup) => searchedGroup.name === serverService.group);
|
|
|
|
const result = {
|
|
|
|
if (!serverGroup) {
|
|
|
|
name: serviceName,
|
|
|
|
mappedServiceGroups.push({
|
|
|
|
...pushedService,
|
|
|
|
name: serverService.group,
|
|
|
|
};
|
|
|
|
services: [],
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
serverGroup = mappedServiceGroups[mappedServiceGroups.length - 1];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const { name: serviceName, group: serverServiceGroup, ...pushedService } = serverService;
|
|
|
|
serverGroup.services.push(result);
|
|
|
|
const result = {
|
|
|
|
});
|
|
|
|
name: serviceName,
|
|
|
|
|
|
|
|
...pushedService,
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
serverGroup.services.push(result);
|
|
|
|
return mappedServiceGroups;
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return mappedServiceGroups;
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
logger.error(e);
|
|
|
|
|
|
|
|
throw e;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function cleanServiceGroups(groups) {
|
|
|
|
export function cleanServiceGroups(groups) {
|
|
|
|