@backstage/plugin-kubernetes 0.7.2 → 0.7.3-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @backstage/plugin-kubernetes
2
2
 
3
+ ## 0.7.3-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 51af8361de: Add useCustomResources react hook for fetching Kubernetes Custom Resources
8
+ - 35a6cfe257: Fix infinite call bug in `useCustomResources` hook
9
+ - Updated dependencies
10
+ - @backstage/catalog-model@1.1.2-next.0
11
+ - @backstage/core-components@0.11.2-next.0
12
+ - @backstage/plugin-catalog-react@1.1.5-next.0
13
+ - @backstage/plugin-kubernetes-common@0.4.3-next.0
14
+ - @backstage/config@1.0.3-next.0
15
+ - @backstage/core-plugin-api@1.0.7-next.0
16
+ - @backstage/theme@0.2.16
17
+
3
18
  ## 0.7.2
4
19
 
5
20
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
3
3
  import { DiscoveryApi, IdentityApi, OAuthApi, OpenIdConnectApi } from '@backstage/core-plugin-api';
4
4
  import { Entity } from '@backstage/catalog-model';
5
- import { KubernetesRequestBody, ObjectsByEntityResponse, WorkloadsByEntityRequest, CustomObjectsByEntityRequest, ClusterObjects, ClientPodStatus, ClusterAttributes } from '@backstage/plugin-kubernetes-common';
5
+ import { KubernetesRequestBody, ObjectsByEntityResponse, WorkloadsByEntityRequest, CustomObjectsByEntityRequest, ClusterObjects, CustomResourceMatcher, ClientPodStatus, ClusterAttributes } from '@backstage/plugin-kubernetes-common';
6
6
  import { JsonObject } from '@backstage/types';
7
7
  import { V1Pod, V1ReplicaSet, V1Deployment, V1HorizontalPodAutoscaler, V1Service, V1ConfigMap, V1Ingress, V1Job, V1CronJob, V1StatefulSet, V1ObjectMeta } from '@kubernetes/client-node';
8
8
  import React from 'react';
@@ -251,10 +251,18 @@ declare const KubernetesContent: ({ entity, refreshIntervalMs, }: KubernetesCont
251
251
 
252
252
  interface KubernetesObjects {
253
253
  kubernetesObjects?: ObjectsByEntityResponse;
254
+ loading: boolean;
254
255
  error?: string;
255
256
  }
256
257
  declare const useKubernetesObjects: (entity: Entity, intervalMs?: number) => KubernetesObjects;
257
258
 
259
+ /**
260
+ * Retrieves the provided custom resources related to the provided entity, refreshes at an interval.
261
+ *
262
+ * @public
263
+ */
264
+ declare const useCustomResources: (entity: Entity, customResourceMatchers: CustomResourceMatcher[], intervalMs?: number) => KubernetesObjects;
265
+
258
266
  declare const PodNamesWithErrorsContext: React.Context<Set<string>>;
259
267
 
260
268
  declare const PodNamesWithMetricsContext: React.Context<Map<string, ClientPodStatus>>;
@@ -263,4 +271,4 @@ declare const GroupedResponsesContext: React.Context<GroupedResponses>;
263
271
 
264
272
  declare const ClusterContext: React.Context<ClusterAttributes>;
265
273
 
266
- export { Cluster, ClusterContext, ClusterLinksFormatter, ClusterLinksFormatterOptions, CronJobsAccordions, CustomResources, DeploymentResources, DetectedError, DetectedErrorsByCluster, EntityKubernetesContent, EntityKubernetesContentProps, ErrorDetectableKind, ErrorPanel, ErrorReporting, ErrorSeverity, GoogleKubernetesAuthProvider, GroupedResponses, GroupedResponsesContext, HorizontalPodAutoscalerDrawer, IngressesAccordions, JobsAccordions, KubernetesApi, KubernetesAuthProviders, KubernetesAuthProvidersApi, KubernetesBackendClient, KubernetesContent, KubernetesDrawer, KubernetesObjects, PodDrawer, PodNamesWithErrorsContext, PodNamesWithMetricsContext, PodsTable, Router, ServerSideKubernetesAuthProvider, ServicesAccordions, clusterLinksFormatters, detectErrors, formatClusterLink, isKubernetesAvailable, kubernetesApiRef, kubernetesAuthProvidersApiRef, kubernetesPlugin, kubernetesPlugin as plugin, useKubernetesObjects };
274
+ export { Cluster, ClusterContext, ClusterLinksFormatter, ClusterLinksFormatterOptions, CronJobsAccordions, CustomResources, DeploymentResources, DetectedError, DetectedErrorsByCluster, EntityKubernetesContent, EntityKubernetesContentProps, ErrorDetectableKind, ErrorPanel, ErrorReporting, ErrorSeverity, GoogleKubernetesAuthProvider, GroupedResponses, GroupedResponsesContext, HorizontalPodAutoscalerDrawer, IngressesAccordions, JobsAccordions, KubernetesApi, KubernetesAuthProviders, KubernetesAuthProvidersApi, KubernetesBackendClient, KubernetesContent, KubernetesDrawer, KubernetesObjects, PodDrawer, PodNamesWithErrorsContext, PodNamesWithMetricsContext, PodsTable, Router, ServerSideKubernetesAuthProvider, ServicesAccordions, clusterLinksFormatters, detectErrors, formatClusterLink, isKubernetesAvailable, kubernetesApiRef, kubernetesAuthProvidersApiRef, kubernetesPlugin, kubernetesPlugin as plugin, useCustomResources, useKubernetesObjects };
package/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { stringifyEntityRef } from '@backstage/catalog-model';
2
2
  import { createApiRef, createRouteRef, createPlugin, createApiFactory, discoveryApiRef, identityApiRef, googleAuthApiRef, microsoftAuthApiRef, oktaAuthApiRef, oneloginAuthApiRef, createRoutableExtension, useApi } from '@backstage/core-plugin-api';
3
3
  import * as React from 'react';
4
- import React__default, { Fragment, useState, useEffect, useContext } from 'react';
4
+ import React__default, { Fragment, useCallback, useState, useContext } from 'react';
5
5
  import { useEntity } from '@backstage/plugin-catalog-react';
6
6
  import { Routes, Route } from 'react-router-dom';
7
7
  import { Typography, Chip, Grid, makeStyles, createStyles, Button, Drawer, IconButton, FormControlLabel, Switch, Accordion, AccordionSummary, AccordionDetails, Divider, Stepper, Step, StepLabel } from '@material-ui/core';
@@ -13,6 +13,7 @@ import OpenInNewIcon from '@material-ui/icons/OpenInNew';
13
13
  import { withStyles } from '@material-ui/core/styles';
14
14
  import jsYaml from 'js-yaml';
15
15
  import useInterval from 'react-use/lib/useInterval';
16
+ import useAsyncRetry from 'react-use/lib/useAsyncRetry';
16
17
  import cronstrue from 'cronstrue';
17
18
  import lodash from 'lodash';
18
19
  import PauseIcon from '@material-ui/icons/Pause';
@@ -711,57 +712,83 @@ const detectErrors = (objects) => {
711
712
  return errors;
712
713
  };
713
714
 
715
+ const generateAuth = async (entity, kubernetesApi, kubernetesAuthProvidersApi) => {
716
+ var _a;
717
+ const clusters = await kubernetesApi.getClusters();
718
+ const authProviders = [
719
+ ...new Set(
720
+ clusters.map(
721
+ (c) => `${c.authProvider}${c.oidcTokenProvider ? `.${c.oidcTokenProvider}` : ""}`
722
+ )
723
+ )
724
+ ];
725
+ let requestBody = {
726
+ entity
727
+ };
728
+ for (const authProviderStr of authProviders) {
729
+ requestBody = await kubernetesAuthProvidersApi.decorateRequestBodyForAuth(
730
+ authProviderStr,
731
+ requestBody
732
+ );
733
+ }
734
+ return (_a = requestBody.auth) != null ? _a : {};
735
+ };
736
+
714
737
  const useKubernetesObjects = (entity, intervalMs = 1e4) => {
715
738
  const kubernetesApi = useApi(kubernetesApiRef);
716
739
  const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);
717
- const [result, setResult] = useState({
718
- kubernetesObjects: void 0,
719
- error: void 0
720
- });
721
- const getObjects = async () => {
722
- let clusters = [];
723
- try {
724
- clusters = await kubernetesApi.getClusters();
725
- } catch (e) {
726
- setResult({ error: e.message });
727
- return;
728
- }
729
- const authProviders = [
730
- ...new Set(
731
- clusters.map(
732
- (c) => `${c.authProvider}${c.oidcTokenProvider ? `.${c.oidcTokenProvider}` : ""}`
733
- )
734
- )
735
- ];
736
- let requestBody = {
740
+ const getObjects = useCallback(async () => {
741
+ const auth = await generateAuth(
742
+ entity,
743
+ kubernetesApi,
744
+ kubernetesAuthProvidersApi
745
+ );
746
+ return await kubernetesApi.getObjectsByEntity({
747
+ auth,
737
748
  entity
738
- };
739
- for (const authProviderStr of authProviders) {
740
- try {
741
- requestBody = await kubernetesAuthProvidersApi.decorateRequestBodyForAuth(
742
- authProviderStr,
743
- requestBody
744
- );
745
- } catch (e) {
746
- setResult({ error: e.message });
747
- return;
748
- }
749
- }
750
- try {
751
- const objects = await kubernetesApi.getObjectsByEntity(requestBody);
752
- setResult({ kubernetesObjects: objects });
753
- } catch (e) {
754
- setResult({ error: e.message });
755
- return;
756
- }
749
+ });
750
+ }, [kubernetesApi, entity, kubernetesAuthProvidersApi]);
751
+ const { value, loading, error, retry } = useAsyncRetry(
752
+ () => getObjects(),
753
+ [getObjects]
754
+ );
755
+ useInterval(() => retry(), intervalMs);
756
+ return {
757
+ kubernetesObjects: value,
758
+ loading,
759
+ error: error == null ? void 0 : error.message
760
+ };
761
+ };
762
+
763
+ const useCustomResources = (entity, customResourceMatchers, intervalMs = 1e4) => {
764
+ const kubernetesApi = useApi(kubernetesApiRef);
765
+ const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);
766
+ const matchersString = JSON.stringify(customResourceMatchers);
767
+ const getCustomObjects = useCallback(
768
+ async () => {
769
+ const auth = await generateAuth(
770
+ entity,
771
+ kubernetesApi,
772
+ kubernetesAuthProvidersApi
773
+ );
774
+ return await kubernetesApi.getCustomObjectsByEntity({
775
+ auth,
776
+ customResources: customResourceMatchers,
777
+ entity
778
+ });
779
+ },
780
+ [kubernetesApi, entity, kubernetesAuthProvidersApi, matchersString]
781
+ );
782
+ const { value, loading, error, retry } = useAsyncRetry(
783
+ () => getCustomObjects(),
784
+ [getCustomObjects]
785
+ );
786
+ useInterval(() => retry(), intervalMs);
787
+ return {
788
+ kubernetesObjects: value,
789
+ loading,
790
+ error: error == null ? void 0 : error.message
757
791
  };
758
- useEffect(() => {
759
- getObjects();
760
- }, [entity.metadata.name, kubernetesApi, kubernetesAuthProvidersApi]);
761
- useInterval(() => {
762
- getObjects();
763
- }, intervalMs);
764
- return result;
765
792
  };
766
793
 
767
794
  const PodNamesWithErrorsContext = React__default.createContext(
@@ -2649,5 +2676,5 @@ var Router$1 = /*#__PURE__*/Object.freeze({
2649
2676
  Router: Router
2650
2677
  });
2651
2678
 
2652
- export { Cluster, ClusterContext, CronJobsAccordions, CustomResources, EntityKubernetesContent, ErrorPanel$1 as ErrorPanel, ErrorReporting, GoogleKubernetesAuthProvider, GroupedResponsesContext, HorizontalPodAutoscalerDrawer, IngressesAccordions, JobsAccordions, KubernetesAuthProviders, KubernetesBackendClient, KubernetesContent, KubernetesDrawer, PodDrawer, PodNamesWithErrorsContext, PodNamesWithMetricsContext, PodsTable, Router, ServerSideKubernetesAuthProvider, ServicesAccordions, clusterLinksFormatters, detectErrors, formatClusterLink, isKubernetesAvailable, kubernetesApiRef, kubernetesAuthProvidersApiRef, kubernetesPlugin, kubernetesPlugin as plugin, useKubernetesObjects };
2679
+ export { Cluster, ClusterContext, CronJobsAccordions, CustomResources, EntityKubernetesContent, ErrorPanel$1 as ErrorPanel, ErrorReporting, GoogleKubernetesAuthProvider, GroupedResponsesContext, HorizontalPodAutoscalerDrawer, IngressesAccordions, JobsAccordions, KubernetesAuthProviders, KubernetesBackendClient, KubernetesContent, KubernetesDrawer, PodDrawer, PodNamesWithErrorsContext, PodNamesWithMetricsContext, PodsTable, Router, ServerSideKubernetesAuthProvider, ServicesAccordions, clusterLinksFormatters, detectErrors, formatClusterLink, isKubernetesAvailable, kubernetesApiRef, kubernetesAuthProvidersApiRef, kubernetesPlugin, kubernetesPlugin as plugin, useCustomResources, useKubernetesObjects };
2653
2680
  //# sourceMappingURL=index.esm.js.map