@backstage/plugin-kubernetes 0.7.2-next.3 → 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,40 @@
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
+
18
+ ## 0.7.2
19
+
20
+ ### Patch Changes
21
+
22
+ - 817f3196f6: Updated React Router dependencies to be peer dependencies.
23
+ - 7d47def9c4: Removed dependency on `@types/jest`.
24
+ - 0768d6dece: add new kubernetes backend endpoints to kubernetes backend client
25
+ - 19a27929fb: Reset error state on success
26
+ - 667d917488: Updated dependency `msw` to `^0.47.0`.
27
+ - 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`.
28
+ - bf5e9030eb: Updated dependency `msw` to `^0.45.0`.
29
+ - ef9ab322de: Minor API signatures cleanup
30
+ - Updated dependencies
31
+ - @backstage/core-components@0.11.1
32
+ - @backstage/core-plugin-api@1.0.6
33
+ - @backstage/plugin-catalog-react@1.1.4
34
+ - @backstage/catalog-model@1.1.1
35
+ - @backstage/config@1.0.2
36
+ - @backstage/plugin-kubernetes-common@0.4.2
37
+
3
38
  ## 0.7.2-next.3
4
39
 
5
40
  ### 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, 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';
@@ -36,6 +36,8 @@ interface KubernetesApi {
36
36
  authProvider: string;
37
37
  oidcTokenProvider?: string | undefined;
38
38
  }[]>;
39
+ getWorkloadsByEntity(request: WorkloadsByEntityRequest): Promise<ObjectsByEntityResponse>;
40
+ getCustomObjectsByEntity(request: CustomObjectsByEntityRequest): Promise<ObjectsByEntityResponse>;
39
41
  }
40
42
 
41
43
  declare class KubernetesBackendClient implements KubernetesApi {
@@ -48,6 +50,8 @@ declare class KubernetesBackendClient implements KubernetesApi {
48
50
  private handleResponse;
49
51
  private postRequired;
50
52
  getObjectsByEntity(requestBody: KubernetesRequestBody): Promise<ObjectsByEntityResponse>;
53
+ getWorkloadsByEntity(request: WorkloadsByEntityRequest): Promise<ObjectsByEntityResponse>;
54
+ getCustomObjectsByEntity(request: CustomObjectsByEntityRequest): Promise<ObjectsByEntityResponse>;
51
55
  getClusters(): Promise<{
52
56
  name: string;
53
57
  authProvider: string;
@@ -247,10 +251,18 @@ declare const KubernetesContent: ({ entity, refreshIntervalMs, }: KubernetesCont
247
251
 
248
252
  interface KubernetesObjects {
249
253
  kubernetesObjects?: ObjectsByEntityResponse;
254
+ loading: boolean;
250
255
  error?: string;
251
256
  }
252
257
  declare const useKubernetesObjects: (entity: Entity, intervalMs?: number) => KubernetesObjects;
253
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
+
254
266
  declare const PodNamesWithErrorsContext: React.Context<Set<string>>;
255
267
 
256
268
  declare const PodNamesWithMetricsContext: React.Context<Map<string, ClientPodStatus>>;
@@ -259,4 +271,4 @@ declare const GroupedResponsesContext: React.Context<GroupedResponses>;
259
271
 
260
272
  declare const ClusterContext: React.Context<ClusterAttributes>;
261
273
 
262
- 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,6 +1,7 @@
1
+ import { stringifyEntityRef } from '@backstage/catalog-model';
1
2
  import { createApiRef, createRouteRef, createPlugin, createApiFactory, discoveryApiRef, identityApiRef, googleAuthApiRef, microsoftAuthApiRef, oktaAuthApiRef, oneloginAuthApiRef, createRoutableExtension, useApi } from '@backstage/core-plugin-api';
2
3
  import * as React from 'react';
3
- import React__default, { Fragment, useState, useEffect, useContext } from 'react';
4
+ import React__default, { Fragment, useCallback, useState, useContext } from 'react';
4
5
  import { useEntity } from '@backstage/plugin-catalog-react';
5
6
  import { Routes, Route } from 'react-router-dom';
6
7
  import { Typography, Chip, Grid, makeStyles, createStyles, Button, Drawer, IconButton, FormControlLabel, Switch, Accordion, AccordionSummary, AccordionDetails, Divider, Stepper, Step, StepLabel } from '@material-ui/core';
@@ -12,6 +13,7 @@ import OpenInNewIcon from '@material-ui/icons/OpenInNew';
12
13
  import { withStyles } from '@material-ui/core/styles';
13
14
  import jsYaml from 'js-yaml';
14
15
  import useInterval from 'react-use/lib/useInterval';
16
+ import useAsyncRetry from 'react-use/lib/useAsyncRetry';
15
17
  import cronstrue from 'cronstrue';
16
18
  import lodash from 'lodash';
17
19
  import PauseIcon from '@material-ui/icons/Pause';
@@ -57,6 +59,19 @@ class KubernetesBackendClient {
57
59
  requestBody
58
60
  );
59
61
  }
62
+ async getWorkloadsByEntity(request) {
63
+ return await this.postRequired("/resources/workloads/query", {
64
+ auth: request.auth,
65
+ entityRef: stringifyEntityRef(request.entity)
66
+ });
67
+ }
68
+ async getCustomObjectsByEntity(request) {
69
+ return await this.postRequired(`/resources/custom/query`, {
70
+ entityRef: stringifyEntityRef(request.entity),
71
+ auth: request.auth,
72
+ customResources: request.customResources
73
+ });
74
+ }
60
75
  async getClusters() {
61
76
  const { token: idToken } = await this.identityApi.getCredentials();
62
77
  const url = `${await this.discoveryApi.getBaseUrl("kubernetes")}/clusters`;
@@ -697,57 +712,83 @@ const detectErrors = (objects) => {
697
712
  return errors;
698
713
  };
699
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
+
700
737
  const useKubernetesObjects = (entity, intervalMs = 1e4) => {
701
738
  const kubernetesApi = useApi(kubernetesApiRef);
702
739
  const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);
703
- const [result, setResult] = useState({
704
- kubernetesObjects: void 0,
705
- error: void 0
706
- });
707
- const getObjects = async () => {
708
- let clusters = [];
709
- try {
710
- clusters = await kubernetesApi.getClusters();
711
- } catch (e) {
712
- setResult({ error: e.message });
713
- return;
714
- }
715
- const authProviders = [
716
- ...new Set(
717
- clusters.map(
718
- (c) => `${c.authProvider}${c.oidcTokenProvider ? `.${c.oidcTokenProvider}` : ""}`
719
- )
720
- )
721
- ];
722
- 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,
723
748
  entity
724
- };
725
- for (const authProviderStr of authProviders) {
726
- try {
727
- requestBody = await kubernetesAuthProvidersApi.decorateRequestBodyForAuth(
728
- authProviderStr,
729
- requestBody
730
- );
731
- } catch (e) {
732
- setResult({ error: e.message });
733
- return;
734
- }
735
- }
736
- try {
737
- const objects = await kubernetesApi.getObjectsByEntity(requestBody);
738
- setResult({ kubernetesObjects: objects });
739
- } catch (e) {
740
- setResult({ error: e.message });
741
- return;
742
- }
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
743
791
  };
744
- useEffect(() => {
745
- getObjects();
746
- }, [entity.metadata.name, kubernetesApi, kubernetesAuthProvidersApi]);
747
- useInterval(() => {
748
- getObjects();
749
- }, intervalMs);
750
- return result;
751
792
  };
752
793
 
753
794
  const PodNamesWithErrorsContext = React__default.createContext(
@@ -2635,5 +2676,5 @@ var Router$1 = /*#__PURE__*/Object.freeze({
2635
2676
  Router: Router
2636
2677
  });
2637
2678
 
2638
- 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 };
2639
2680
  //# sourceMappingURL=index.esm.js.map