useKubernetes.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. const App = require('../../../models/App');
  2. const k8s = require('@kubernetes/client-node');
  3. const Logger = require('../../../utils/Logger');
  4. const logger = new Logger();
  5. const loadConfig = require('../../../utils/loadConfig');
  6. const useKubernetes = async (apps) => {
  7. const { useOrdering: orderType, unpinStoppedApps } = await loadConfig();
  8. let ingresses = null;
  9. try {
  10. const kc = new k8s.KubeConfig();
  11. kc.loadFromCluster();
  12. const k8sNetworkingV1Api = kc.makeApiClient(k8s.NetworkingV1Api);
  13. await k8sNetworkingV1Api.listIngressForAllNamespaces().then((res) => {
  14. ingresses = res.body.items;
  15. });
  16. } catch {
  17. logger.log("Can't connect to the Kubernetes API", 'ERROR');
  18. }
  19. if (ingresses) {
  20. apps = await App.findAll({
  21. order: [[orderType, 'ASC']],
  22. });
  23. ingresses = ingresses.filter(
  24. (e) => Object.keys(e.metadata.annotations).length !== 0
  25. );
  26. const kubernetesApps = [];
  27. for (const ingress of ingresses) {
  28. const annotations = ingress.metadata.annotations;
  29. if (
  30. 'flame.pawelmalak/name' in annotations &&
  31. 'flame.pawelmalak/url' in annotations &&
  32. /^app/.test(annotations['flame.pawelmalak/type'])
  33. ) {
  34. kubernetesApps.push({
  35. name: annotations['flame.pawelmalak/name'],
  36. url: annotations['flame.pawelmalak/url'],
  37. icon: annotations['flame.pawelmalak/icon'] || 'kubernetes',
  38. description: annotations['flame.pawelmalak/description']
  39. });
  40. }
  41. }
  42. if (unpinStoppedApps) {
  43. for (const app of apps) {
  44. await app.update({ isPinned: false });
  45. }
  46. }
  47. for (const item of kubernetesApps) {
  48. if (apps.some((app) => app.name === item.name)) {
  49. const app = apps.find((a) => a.name === item.name);
  50. await app.update({ ...item, isPinned: true });
  51. } else {
  52. await App.create({
  53. ...item,
  54. isPinned: true,
  55. });
  56. }
  57. }
  58. }
  59. };
  60. module.exports = useKubernetes;