@mhoshi-vm/plugin-crossplane-aws 0.1.2 → 0.1.3

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.
@@ -2,7 +2,7 @@ import { useEntity } from '@backstage/plugin-catalog-react';
2
2
  import React, { useState, useEffect } from 'react';
3
3
  import { Routes, Route } from 'react-router-dom';
4
4
  import { useKubernetesObjects } from '@backstage/plugin-kubernetes';
5
- import { Table, Page, Content, Progress, ResponseErrorPanel } from '@backstage/core-components';
5
+ import { Table, StatusOK, StatusPending, StatusAborted, Page, Content, Progress, ResponseErrorPanel } from '@backstage/core-components';
6
6
  import { Grid } from '@material-ui/core';
7
7
 
8
8
  const ResourceTable = (props) => {
@@ -12,16 +12,27 @@ const ResourceTable = (props) => {
12
12
  { title: "Name", field: "name" },
13
13
  { title: "Ready", field: "ready" },
14
14
  { title: "Synced", field: "synced" },
15
- { title: "External Name", field: "externalName" }
15
+ { title: "ARN", field: "externalName" }
16
16
  ];
17
17
  const data = [];
18
+ const statusLogo = [
19
+ { status: "True", field: /* @__PURE__ */ React.createElement(StatusOK, null) },
20
+ { status: "False", field: /* @__PURE__ */ React.createElement(StatusPending, null) },
21
+ { status: void 0, field: /* @__PURE__ */ React.createElement(StatusAborted, null) }
22
+ ];
18
23
  resources.map((resource) => {
19
24
  resource.resources.map((resourceStatus) => {
25
+ const readyIndex = statusLogo.findIndex(
26
+ (item) => item.status === resourceStatus.ready
27
+ );
28
+ const syncedIndex = statusLogo.findIndex(
29
+ (item) => item.status === resourceStatus.synced
30
+ );
20
31
  data.push({
21
32
  kind: resource.kind,
22
33
  name: resourceStatus.name,
23
- ready: resourceStatus.ready,
24
- synced: resourceStatus.synced,
34
+ ready: statusLogo[readyIndex].field,
35
+ synced: statusLogo[syncedIndex].field,
25
36
  externalName: resourceStatus.externalName
26
37
  });
27
38
  });
@@ -137,4 +148,4 @@ const Router = (props) => {
137
148
  };
138
149
 
139
150
  export { Router };
140
- //# sourceMappingURL=Router-7e4981b2.esm.js.map
151
+ //# sourceMappingURL=Router-6e363902.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router-6e363902.esm.js","sources":["../../src/components/ResourceTable/ResourceTable.tsx","../../src/components/CrossplaneAws/CrossplaneAwsComponent.tsx","../../src/Router.tsx"],"sourcesContent":["import React from \"react\";\nimport {Resource} from \"../../type\";\nimport {StatusAborted, StatusOK, StatusPending, Table, TableColumn} from \"@backstage/core-components\";\n\nexport const ResourceTable = (props: { app: string, resources: Resource[] }) => {\n const {app, resources} = props;\n\n\n const columns: TableColumn[] = [\n {title: 'Kind', field: 'kind'},\n {title: 'Name', field: 'name'},\n {title: 'Ready', field: 'ready'},\n {title: 'Synced', field: 'synced'},\n {title: 'ARN', field: 'externalName'},\n ];\n\n const data = [] as {\n kind: string,\n name: string,\n ready: string,\n synced: string,\n externalName: string\n }[];\n\n const statusLogo = [\n {status: 'True', field: <StatusOK />},\n {status: 'False', field: <StatusPending />},\n {status: undefined, field: <StatusAborted />},\n ];\n\n resources.map(resource => {\n resource.resources.map(resourceStatus => {\n\n\n const readyIndex = statusLogo.findIndex(\n (item) => item.status === resourceStatus.ready\n )\n\n const syncedIndex = statusLogo.findIndex(\n (item) => item.status === resourceStatus.synced\n )\n data.push({\n kind: resource.kind,\n name: resourceStatus.name,\n ready: statusLogo[readyIndex].field as unknown as string,\n synced: statusLogo[syncedIndex].field as unknown as string,\n externalName: resourceStatus.externalName,\n })\n })\n });\n\n return (\n <Table\n title={app}\n columns={columns}\n data={data}\n\n />\n );\n};","import {Entity} from '@backstage/catalog-model';\nimport React, {useEffect, useState} from \"react\";\nimport {useKubernetesObjects} from \"@backstage/plugin-kubernetes\";\nimport {Ecs, Resource, ResourceStatus, UpboundAwsCrd} from \"../../type\";\nimport {FetchResponse} from \"@backstage/plugin-kubernetes-common\";\nimport {Content, Page, Progress, ResponseErrorPanel} from \"@backstage/core-components\";\nimport {Grid} from \"@material-ui/core\";\nimport {ResourceTable} from \"../ResourceTable\";\n\ntype KubernetesContentProps = {\n entity: Entity;\n refreshIntervalMs?: number;\n children?: React.ReactNode;\n}\n\nexport const CrossplaneAwsComponent = ({entity, refreshIntervalMs}: KubernetesContentProps) => {\n const {kubernetesObjects, error} = useKubernetesObjects(\n entity,\n refreshIntervalMs,\n );\n\n const [loading, setLoading] = useState(true); // State to manage loading state\n\n useEffect(() => {\n // This useEffect will run whenever kubernetesObjects changes\n // If kubernetesObjects is not undefined or null, setLoading to false\n if (kubernetesObjects !== undefined && kubernetesObjects !== null) {\n setLoading(false);\n }\n }, [kubernetesObjects]);\n\n const ecss = [] as Ecs[];\n\n if (kubernetesObjects !== undefined) {\n for (let clusterCnt = 0; clusterCnt < kubernetesObjects.items.length; clusterCnt++) {\n const customResources = kubernetesObjects?.items[clusterCnt].resources.filter(isCustomResource);\n\n // get ecsCrs\n const upboundEcsCRs = customResources?.map((r) => {\n return {...r, resources: r.resources.filter(isUpboundEcs)}\n });\n\n // flatMap\n const flattenUpboundEcsAny = upboundEcsCRs?.flatMap(({resources}) =>\n [...resources]\n ) ?? [];\n\n const ecsCrds = flattenUpboundEcsAny as UpboundAwsCrd[];\n\n for (let crdCnt = 0; crdCnt < ecsCrds.length; crdCnt++) {\n\n const appName = ecsCrds[crdCnt].metadata.labels[\"app.kubernetes.io/part-of\"]\n\n const kind = ecsCrds[crdCnt].kind\n\n const resource = {\n name: ecsCrds[crdCnt].metadata.name,\n externalName: ecsCrds[crdCnt].metadata.annotations[\"crossplane.io/external-name\"],\n } as ResourceStatus;\n\n for (let condCnt = 0; condCnt < ecsCrds[crdCnt].status.conditions.length; condCnt++) {\n const condition = ecsCrds[crdCnt].status.conditions[condCnt];\n const type = condition.type;\n switch (type) {\n case (\"Ready\"):\n resource.ready = condition.status;\n break;\n case(\"Synced\"):\n resource.synced = condition.status;\n break;\n default:\n break;\n }\n }\n\n let ecs = {} as Ecs;\n const appIndex = ecss.findIndex(\n (item) => item.name === appName\n )\n if (appIndex !== -1) {\n ecs = ecss[appIndex];\n } else {\n ecs.name = appName;\n ecs.resources = [];\n }\n\n const kindIndex = ecs.resources.findIndex(\n (item) => item.kind === kind\n )\n\n if (kindIndex !== -1) {\n ecs.resources[kindIndex].resources.push(resource);\n } else {\n ecs.resources.push({\n kind: kind,\n resources: [resource]\n })\n }\n\n if (appIndex === -1) {\n ecss.push(ecs);\n }\n }\n\n }\n }\n\n return (\n <Page themeId=\"tool\">\n <Content>\n {loading ? ( // Display progress bar while loading\n <div className=\"progress-bar-container\">\n <Progress/>\n </div>\n ) : (kubernetesObjects?.items !== undefined && ecss?.length > 0 &&\n (ecss.map((ecs) =>\n (<Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ResourceTable app={ecs.name} resources={ecs.resources}/>\n </Grid>\n </Grid>)\n )))\n }\n {error !== undefined &&\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ResponseErrorPanel error={(new Error(error))}/>;\n </Grid>\n </Grid>\n }\n </Content>\n </Page>\n );\n}\n\nfunction isCustomResource(n: FetchResponse) {\n return n.type === 'customresources';\n}\n\nfunction isUpboundEcs(n: any): n is Resource {\n return n.apiVersion.endsWith('aws.upbound.io/v1beta1');\n}","import {useEntity} from \"@backstage/plugin-catalog-react\";\nimport React from \"react\";\nimport {Route, Routes} from \"react-router-dom\";\nimport {CrossplaneAwsComponent} from \"./components/CrossplaneAws\";\n\nexport const Router = (props: { refreshIntervalMs?: number }) => {\n const {entity} = useEntity();\n\n\n return (\n\n <Routes>\n <Route\n path=\"/\"\n element={\n <CrossplaneAwsComponent\n entity={entity}\n refreshIntervalMs={props.refreshIntervalMs}\n />\n }\n />\n </Routes>\n\n );\n}"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -15,4 +15,4 @@ declare const EntityCrossplaneAwsContent: (props: EntityCrossplaneAwsContentProp
15
15
 
16
16
  declare const TanzuAWSPlugin: AppPluginInterface;
17
17
 
18
- export { EntityCrossplaneAwsContent, TanzuAWSPlugin, crossplaneAwsPlugin };
18
+ export { EntityCrossplaneAwsContent, crossplaneAwsPlugin, TanzuAWSPlugin as plugin };
package/dist/index.esm.js CHANGED
@@ -16,7 +16,7 @@ const crossplaneAwsPlugin = createPlugin({
16
16
  const EntityCrossplaneAwsContent = crossplaneAwsPlugin.provide(
17
17
  createRoutableExtension({
18
18
  name: "EntityCrossplaneAwsContent",
19
- component: () => import('./esm/Router-7e4981b2.esm.js').then((m) => m.Router),
19
+ component: () => import('./esm/Router-6e363902.esm.js').then((m) => m.Router),
20
20
  mountPoint: rootRouteRef
21
21
  })
22
22
  );
@@ -34,5 +34,5 @@ const TanzuAWSPlugin = () => (context) => {
34
34
  );
35
35
  };
36
36
 
37
- export { EntityCrossplaneAwsContent, TanzuAWSPlugin, crossplaneAwsPlugin };
37
+ export { EntityCrossplaneAwsContent, crossplaneAwsPlugin, TanzuAWSPlugin as plugin };
38
38
  //# sourceMappingURL=index.esm.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mhoshi-vm/plugin-crossplane-aws",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "main": "dist/index.esm.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",
package/src/index.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export {crossplaneAwsPlugin, EntityCrossplaneAwsContent} from './plugin';
2
- export {TanzuAWSPlugin} from "./TanzuAWSPlugin";
2
+ export {TanzuAWSPlugin as plugin} from "./TanzuAWSPlugin";
@@ -1 +0,0 @@
1
- {"version":3,"file":"Router-7e4981b2.esm.js","sources":["../../src/components/ResourceTable/ResourceTable.tsx","../../src/components/CrossplaneAws/CrossplaneAwsComponent.tsx","../../src/Router.tsx"],"sourcesContent":["import React from \"react\";\nimport {Resource} from \"../../type\";\nimport {Table, TableColumn} from \"@backstage/core-components\";\n\nexport const ResourceTable = (props: { app: string, resources: Resource[] }) => {\n const {app, resources} = props;\n\n\n const columns: TableColumn[] = [\n {title: 'Kind', field: 'kind'},\n {title: 'Name', field: 'name'},\n {title: 'Ready', field: 'ready'},\n {title: 'Synced', field: 'synced'},\n {title: 'External Name', field: 'externalName'},\n ];\n\n const data = [] as {\n kind: string,\n name: string,\n ready: string,\n synced: string,\n externalName: string\n }[];\n\n resources.map(resource => {\n resource.resources.map(resourceStatus => {\n data.push({\n kind: resource.kind,\n name: resourceStatus.name,\n ready: resourceStatus.ready,\n synced: resourceStatus.synced,\n externalName: resourceStatus.externalName,\n })\n })\n });\n\n return (\n <Table\n title={app}\n columns={columns}\n data={data}\n\n />\n );\n};","import {Entity} from '@backstage/catalog-model';\nimport React, {useEffect, useState} from \"react\";\nimport {useKubernetesObjects} from \"@backstage/plugin-kubernetes\";\nimport {Ecs, Resource, ResourceStatus, UpboundECSCrd} from \"../../type\";\nimport {FetchResponse} from \"@backstage/plugin-kubernetes-common\";\nimport {Content, Page, Progress, ResponseErrorPanel} from \"@backstage/core-components\";\nimport {Grid} from \"@material-ui/core\";\nimport {ResourceTable} from \"../ResourceTable\";\n\ntype KubernetesContentProps = {\n entity: Entity;\n refreshIntervalMs?: number;\n children?: React.ReactNode;\n}\n\nexport const CrossplaneAwsComponent = ({entity, refreshIntervalMs}: KubernetesContentProps) => {\n const {kubernetesObjects, error} = useKubernetesObjects(\n entity,\n refreshIntervalMs,\n );\n\n const [loading, setLoading] = useState(true); // State to manage loading state\n\n useEffect(() => {\n // This useEffect will run whenever kubernetesObjects changes\n // If kubernetesObjects is not undefined or null, setLoading to false\n if (kubernetesObjects !== undefined && kubernetesObjects !== null) {\n setLoading(false);\n }\n }, [kubernetesObjects]);\n\n const ecss = [] as Ecs[];\n\n if (kubernetesObjects !== undefined) {\n for (let clusterCnt = 0; clusterCnt < kubernetesObjects.items.length; clusterCnt++) {\n const customResources = kubernetesObjects?.items[clusterCnt].resources.filter(isCustomResource);\n\n // get ecsCrs\n const upboundEcsCRs = customResources?.map((r) => {\n return {...r, resources: r.resources.filter(isUpboundEcs)}\n });\n\n // flatMap\n const flattenUpboundEcsAny = upboundEcsCRs?.flatMap(({resources}) =>\n [...resources]\n ) ?? [];\n\n const ecsCrds = flattenUpboundEcsAny as UpboundECSCrd[];\n\n for (let crdCnt = 0; crdCnt < ecsCrds.length; crdCnt++) {\n\n const appName = ecsCrds[crdCnt].metadata.labels[\"app.kubernetes.io/part-of\"]\n\n const kind = ecsCrds[crdCnt].kind\n\n const resource = {\n name: ecsCrds[crdCnt].metadata.name,\n externalName: ecsCrds[crdCnt].metadata.annotations[\"crossplane.io/external-name\"],\n } as ResourceStatus;\n\n for (let condCnt = 0; condCnt < ecsCrds[crdCnt].status.conditions.length; condCnt++) {\n const condition = ecsCrds[crdCnt].status.conditions[condCnt];\n const type = condition.type;\n switch (type) {\n case (\"Ready\"):\n resource.ready = condition.status;\n break;\n case(\"Synced\"):\n resource.synced = condition.status;\n break;\n default:\n break;\n }\n }\n\n let ecs = {} as Ecs;\n const appIndex = ecss.findIndex(\n (item) => item.name === appName\n )\n if (appIndex !== -1) {\n ecs = ecss[appIndex];\n } else {\n ecs.name = appName;\n ecs.resources = [];\n }\n\n const kindIndex = ecs.resources.findIndex(\n (item) => item.kind === kind\n )\n\n if (kindIndex !== -1) {\n ecs.resources[kindIndex].resources.push(resource);\n } else {\n ecs.resources.push({\n kind: kind,\n resources: [resource]\n })\n }\n\n if (appIndex === -1) {\n ecss.push(ecs);\n }\n }\n\n }\n }\n\n return (\n <Page themeId=\"tool\">\n <Content>\n {loading ? ( // Display progress bar while loading\n <div className=\"progress-bar-container\">\n <Progress/>\n </div>\n ) : (kubernetesObjects?.items !== undefined && ecss?.length > 0 &&\n (ecss.map((ecs) =>\n (<Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ResourceTable app={ecs.name} resources={ecs.resources}/>\n </Grid>\n </Grid>)\n )))\n }\n {error !== undefined &&\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ResponseErrorPanel error={(new Error(error))}/>;\n </Grid>\n </Grid>\n }\n </Content>\n </Page>\n );\n}\n\nfunction isCustomResource(n: FetchResponse) {\n return n.type === 'customresources';\n}\n\nfunction isUpboundEcs(n: any): n is Resource {\n return n.apiVersion.endsWith('aws.upbound.io/v1beta1');\n}","import {useEntity} from \"@backstage/plugin-catalog-react\";\nimport React from \"react\";\nimport {Route, Routes} from \"react-router-dom\";\nimport {CrossplaneAwsComponent} from \"./components/CrossplaneAws\";\n\nexport const Router = (props: { refreshIntervalMs?: number }) => {\n const {entity} = useEntity();\n\n\n return (\n\n <Routes>\n <Route\n path=\"/\"\n element={\n <CrossplaneAwsComponent\n entity={entity}\n refreshIntervalMs={props.refreshIntervalMs}\n />\n }\n />\n </Routes>\n\n );\n}"],"names":[],"mappings":"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"}