useEvents.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import { unionBy } from "lodash";
  2. import { useContext, useEffect, useMemo, useState } from "react";
  3. import api from "shared/api";
  4. import { Context } from "shared/Context";
  5. import { KubeEvent } from "shared/types";
  6. export const useKubeEvents = (
  7. resourceType: "NODE" | "POD" | "HPA",
  8. ownerName?: string,
  9. ownerType?: string
  10. ) => {
  11. const { currentCluster, currentProject } = useContext(Context);
  12. const [hasPorterAgent, setHasPorterAgent] = useState(false);
  13. const [isLoading, setIsLoading] = useState(true);
  14. const [kubeEvents, setKubeEvents] = useState<KubeEvent[]>([]);
  15. const [hasMore, setHasMore] = useState(true);
  16. const [totalCount, setTotalCount] = useState(0);
  17. // Check if the porter agent is installed or not
  18. useEffect(() => {
  19. let isSubscribed = true;
  20. const project_id = currentProject?.id;
  21. const cluster_id = currentCluster?.id;
  22. api
  23. .detectPorterAgent("<token>", {}, { project_id, cluster_id })
  24. .then(() => {
  25. setHasPorterAgent(true);
  26. })
  27. .catch(() => {
  28. setHasPorterAgent(false);
  29. setIsLoading(false);
  30. });
  31. return () => {
  32. isSubscribed = false;
  33. };
  34. }, [currentProject, currentCluster]);
  35. // Get events
  36. useEffect(() => {
  37. let isSubscribed = true;
  38. if (hasPorterAgent) {
  39. fetchData(true).then(() => {
  40. if (isSubscribed) {
  41. setIsLoading(false);
  42. }
  43. });
  44. }
  45. return () => {
  46. isSubscribed = false;
  47. };
  48. }, [
  49. currentProject?.id,
  50. currentCluster?.id,
  51. hasPorterAgent,
  52. resourceType,
  53. ownerType,
  54. ownerName,
  55. ]);
  56. const fetchData = async (clear?: boolean) => {
  57. const project_id = currentProject?.id;
  58. const cluster_id = currentCluster?.id;
  59. let skipBy;
  60. if (!clear) {
  61. skipBy = kubeEvents?.length;
  62. } else {
  63. setHasMore(true);
  64. }
  65. const type = resourceType;
  66. try {
  67. const data = await api
  68. .getKubeEvents(
  69. "<token>",
  70. {
  71. skip: skipBy,
  72. resource_type: type,
  73. owner_name: ownerName,
  74. owner_type: ownerType,
  75. },
  76. { project_id, cluster_id }
  77. )
  78. .then((res) => res.data);
  79. const newKubeEvents = data?.kube_events;
  80. const totalCount = data?.count;
  81. setTotalCount(totalCount);
  82. if (!newKubeEvents?.length) {
  83. setHasMore(false);
  84. return;
  85. }
  86. if (clear) {
  87. setKubeEvents(newKubeEvents);
  88. if (totalCount === newKubeEvents.length) {
  89. setHasMore(false);
  90. } else {
  91. setHasMore(true);
  92. }
  93. return;
  94. }
  95. const newEvents = unionBy(kubeEvents, newKubeEvents, "id");
  96. if (totalCount === newEvents.length) {
  97. setHasMore(false);
  98. } else {
  99. setHasMore(true);
  100. }
  101. setKubeEvents(newEvents);
  102. } catch (error) {
  103. console.log(error);
  104. }
  105. };
  106. const installPorterAgent = () => {
  107. const project_id = currentProject?.id;
  108. const cluster_id = currentCluster?.id;
  109. api
  110. .installPorterAgent("<token>", {}, { project_id, cluster_id })
  111. .then(() => {
  112. setHasPorterAgent(true);
  113. })
  114. .catch(() => {
  115. setHasPorterAgent(false);
  116. });
  117. };
  118. const getLastSubEvent = (
  119. subEvents: {
  120. event_type: string;
  121. message: string;
  122. reason: string;
  123. timestamp: string;
  124. }[]
  125. ) => {
  126. const sortedEvents = subEvents
  127. .map((s) => {
  128. return {
  129. ...s,
  130. timestamp: new Date(s.timestamp).getTime(),
  131. };
  132. })
  133. .sort((prev, next) => next.timestamp - prev.timestamp);
  134. return sortedEvents[0];
  135. };
  136. // Fill up the data missing on events with the subevents
  137. const processedKubeEvents = useMemo(() => {
  138. return kubeEvents
  139. .map((e: any) => {
  140. const lastSubEvent = getLastSubEvent(e.sub_events);
  141. return {
  142. ...e,
  143. event_type: lastSubEvent.event_type,
  144. timestamp: new Date(lastSubEvent.timestamp).getTime(),
  145. last_message: lastSubEvent.message,
  146. };
  147. })
  148. .sort((prev, next) => next.timestamp - prev.timestamp)
  149. .map((s) => ({
  150. ...s,
  151. timestamp: new Date(s.timestamp).toUTCString(),
  152. }));
  153. }, [kubeEvents]);
  154. return {
  155. hasPorterAgent,
  156. isLoading,
  157. kubeEvents: processedKubeEvents,
  158. hasMore,
  159. totalCount,
  160. loadMoreEvents: () => fetchData(),
  161. triggerInstall: installPorterAgent,
  162. };
  163. };