@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 +35 -0
- package/dist/index.d.ts +14 -2
- package/dist/index.esm.js +89 -48
- package/dist/index.esm.js.map +1 -1
- package/package.json +13 -14
- package/LICENSE +0 -201
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,
|
|
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
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
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
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
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
|