@pagerduty/backstage-plugin 0.12.1-next.2 → 0.12.1-next.21

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.
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { P as PagerDutyCard } from './index-3dd8801b.esm.js';
2
+ import { P as PagerDutyCard } from './index-fce893e2.esm.js';
3
3
  import '@backstage/core-plugin-api';
4
4
  import '@backstage/errors';
5
5
  import '@backstage/plugin-home-react';
@@ -34,4 +34,4 @@ const Content = (props) => {
34
34
  };
35
35
 
36
36
  export { Content };
37
- //# sourceMappingURL=index-c99fd03f.esm.js.map
37
+ //# sourceMappingURL=index-628dfe24.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-c99fd03f.esm.js","sources":["../../src/components/HomePagePagerDutyCard/Content.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport React from 'react';\n\nimport { PagerDutyEntity } from '../../types';\nimport { PagerDutyCard } from '../PagerDutyCard';\n\n/** @public */\nexport type HomePagePagerDutyCardProps = PagerDutyEntity & {\n readOnly?: boolean;\n};\n\n/** @public */\nexport const Content = (props: HomePagePagerDutyCardProps) => {\n return <PagerDutyCard {...props} />;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2Ba,MAAA,OAAA,GAAU,CAAC,KAAsC,KAAA;AAC5D,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,aAAe,EAAA,EAAA,GAAG,KAAO,EAAA,CAAA,CAAA;AACnC;;;;"}
1
+ {"version":3,"file":"index-628dfe24.esm.js","sources":["../../src/components/HomePagePagerDutyCard/Content.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport React from 'react';\n\nimport { PagerDutyEntity } from '../../types';\nimport { PagerDutyCard } from '../PagerDutyCard';\n\n/** @public */\nexport type HomePagePagerDutyCardProps = PagerDutyEntity & {\n readOnly?: boolean;\n};\n\n/** @public */\nexport const Content = (props: HomePagePagerDutyCardProps) => {\n return <PagerDutyCard {...props} />;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2Ba,MAAA,OAAA,GAAU,CAAC,KAAsC,KAAA;AAC5D,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,aAAe,EAAA,EAAA,GAAG,KAAO,EAAA,CAAA,CAAA;AACnC;;;;"}
@@ -1,9 +1,8 @@
1
- import React, { useState } from 'react';
1
+ import React, { useState, useEffect } from 'react';
2
2
  import { Typography, FormControl, InputLabel, Select, MenuItem, Button, Grid } from '@material-ui/core';
3
3
  import { Table, Page, Header, Content } from '@backstage/core-components';
4
4
  import { useApi } from '@backstage/core-plugin-api';
5
- import { p as pagerDutyApiRef } from './index-3dd8801b.esm.js';
6
- import { useAsync } from 'react-use';
5
+ import { p as pagerDutyApiRef } from './index-fce893e2.esm.js';
7
6
  import { catalogApiRef } from '@backstage/plugin-catalog-react';
8
7
  import '@backstage/errors';
9
8
  import '@backstage/plugin-home-react';
@@ -24,85 +23,86 @@ import '@material-ui/icons/Info';
24
23
  import '@material-ui/icons/CheckCircle';
25
24
  import '@material-ui/icons/RadioButtonUnchecked';
26
25
  import '@material-ui/core/styles';
26
+ import 'react-use';
27
27
  import '@material-ui/lab/Alert/Alert';
28
28
  import '@backstage/catalog-model';
29
29
  import '@material-ui/icons/AddAlert';
30
30
  import '@material-ui/icons/ExpandMore';
31
31
 
32
- function getMappingStatus(serviceName) {
33
- if (serviceName === "Ads") {
34
- return "In Sync" /* InSync */;
35
- }
36
- return "Out Of Sync" /* OutOfSync */;
37
- }
38
32
  function getColorFromStatus(status) {
39
33
  switch (status) {
40
- case "In Sync" /* InSync */:
34
+ case "InSync":
41
35
  return "green";
42
- case "Out Of Sync" /* OutOfSync */:
36
+ case "OutOfSync":
43
37
  return "red";
44
- default:
38
+ case "NotMapped":
45
39
  return "orange";
40
+ default:
41
+ return "gray";
46
42
  }
47
43
  }
48
- const DenseTable = ({ BackstageServices, PagerDutyServices }) => {
44
+ const DenseTable = ({
45
+ BackstageServices,
46
+ ServiceMappings
47
+ }) => {
48
+ const pagerDutyApi = useApi(pagerDutyApiRef);
49
49
  const columns = [
50
50
  { title: "PagerDuty Service", field: "name" },
51
51
  { title: "Team", field: "team" },
52
52
  { title: "Escalation Policy", field: "escalationPolicy" },
53
53
  { title: "Mapping", field: "mapping" },
54
- { title: "Status", field: "mappingStatus", width: "10%" },
54
+ { title: "Status", field: "mappingStatus" },
55
55
  { title: "Actions", field: "actions" }
56
56
  ];
57
- const data = PagerDutyServices.map((service) => {
58
- var _a, _b;
59
- const status = getMappingStatus(service.name);
57
+ const data = ServiceMappings.map((service) => {
60
58
  return {
61
- name: service.name,
62
- team: (_b = (_a = service.teams) == null ? void 0 : _a.at(0)) == null ? void 0 : _b.summary,
63
- escalationPolicy: service.escalation_policy.name,
64
- mappingStatus: (
65
- // status of mapping
66
- /* @__PURE__ */ React.createElement(
67
- Typography,
68
- {
69
- variant: "body2",
70
- style: {
71
- color: getColorFromStatus(status)
72
- }
73
- },
74
- status
75
- )
59
+ name: service.serviceName,
60
+ team: service.team,
61
+ escalationPolicy: service.escalationPolicy,
62
+ // status of mapping
63
+ mappingStatus: /* @__PURE__ */ React.createElement(
64
+ Typography,
65
+ {
66
+ variant: "body2",
67
+ style: {
68
+ color: getColorFromStatus(service.status)
69
+ }
70
+ },
71
+ service.status
76
72
  ),
77
73
  mapping: (
78
74
  // dropdown menu with static options. If service.mapping is defined select that option
79
- /* @__PURE__ */ React.createElement(FormControl, null, /* @__PURE__ */ React.createElement(InputLabel, { id: "demo-simple-select-helper-label" }, "Service"), /* @__PURE__ */ React.createElement(
75
+ /* @__PURE__ */ React.createElement(FormControl, { variant: "standard" }, /* @__PURE__ */ React.createElement(InputLabel, { id: "demo-simple-select-helper-label" }, "Service"), /* @__PURE__ */ React.createElement(
80
76
  Select,
81
77
  {
82
78
  labelId: "demo-simple-select-helper-label",
83
- id: "demo-simple-select-helper"
79
+ id: "demo-simple-select-helper",
80
+ onChange: async (selection) => {
81
+ await pagerDutyApi.storeServiceMapping(service.service_id, selection.target.value);
82
+ },
83
+ value: service.entity_ref
84
84
  },
85
85
  /* @__PURE__ */ React.createElement(MenuItem, { value: "" }, /* @__PURE__ */ React.createElement("em", null, "None")),
86
86
  BackstageServices.map((backstageService) => {
87
87
  return /* @__PURE__ */ React.createElement(
88
88
  MenuItem,
89
89
  {
90
- key: backstageService.name,
91
- value: backstageService.name
90
+ key: backstageService.id,
91
+ value: backstageService.id
92
92
  },
93
93
  backstageService.name
94
94
  );
95
95
  })
96
96
  ))
97
97
  ),
98
- actions: /* @__PURE__ */ React.createElement(Button, { variant: "contained", color: "primary", href: service.html_url }, "Open in PagerDuty")
98
+ actions: /* @__PURE__ */ React.createElement(Button, { variant: "contained", color: "primary", href: service.serviceUrl }, "Open in PagerDuty")
99
99
  };
100
100
  });
101
101
  return /* @__PURE__ */ React.createElement(
102
102
  Table,
103
103
  {
104
104
  title: "PagerDuty Service Import",
105
- subtitle: "Use this page to import services from PagerDuty and map them to existing Backstage services ",
105
+ subtitle: "Use this page to import services from PagerDuty and map them to existing Backstage services. Only 1:1 mapping is allowed.",
106
106
  options: {
107
107
  search: true,
108
108
  paging: true,
@@ -124,41 +124,46 @@ const DenseTable = ({ BackstageServices, PagerDutyServices }) => {
124
124
  );
125
125
  };
126
126
  const ServiceMappingComponent = () => {
127
- const backstageServices = [];
128
127
  const [catalogEntities, setCatalogEntities] = useState([]);
128
+ const [serviceMappings, setServiceMappings] = useState([]);
129
129
  const pagerDutyApi = useApi(pagerDutyApiRef);
130
130
  const catalogApi = useApi(catalogApiRef);
131
- const {
132
- value: pagerDutyServices,
133
- loading,
134
- error
135
- } = useAsync(async () => {
136
- const { services: foundServices } = await pagerDutyApi.getAllServices();
137
- const response = await catalogApi.getEntities({
138
- filter: {
139
- kind: "Component"
131
+ useEffect(() => {
132
+ async function fetchEntities() {
133
+ const { items } = await catalogApi.getEntities({
134
+ filter: { kind: "Component" }
135
+ });
136
+ const backstageServices = [];
137
+ items.forEach((entity) => {
138
+ var _a, _b, _c, _d, _e, _f;
139
+ backstageServices.push({
140
+ name: (_a = entity.metadata) == null ? void 0 : _a.name,
141
+ id: (_c = (_b = entity.metadata) == null ? void 0 : _b.uid) != null ? _c : "",
142
+ system: JSON.stringify((_d = entity.spec) == null ? void 0 : _d.system) || "",
143
+ owner: JSON.stringify((_e = entity.spec) == null ? void 0 : _e.owner) || "",
144
+ lifecycle: JSON.stringify((_f = entity.spec) == null ? void 0 : _f.lifecycle) || ""
145
+ });
146
+ });
147
+ return backstageServices;
148
+ }
149
+ async function fetchServices() {
150
+ const { mappings: foundServices } = await pagerDutyApi.getEntityMappings();
151
+ return foundServices;
152
+ }
153
+ Promise.all([fetchEntities(), fetchServices()]).then(
154
+ ([entities, mappings]) => {
155
+ setCatalogEntities(entities);
156
+ setServiceMappings(mappings);
140
157
  }
141
- });
142
- setCatalogEntities(response.items);
143
- return foundServices;
144
- }, []);
145
- if (error) {
146
- return /* @__PURE__ */ React.createElement("p", null, "Error: ", error.message);
147
- }
148
- if (loading) {
149
- return /* @__PURE__ */ React.createElement("p", null, "Loading...");
150
- }
151
- catalogEntities == null ? void 0 : catalogEntities.forEach((entity) => {
152
- var _a, _b, _c, _d;
153
- backstageServices.push({
154
- name: entity.metadata.name,
155
- id: (_a = entity.metadata.uid) != null ? _a : "",
156
- system: JSON.stringify((_b = entity.spec) == null ? void 0 : _b.system) || "",
157
- owner: JSON.stringify((_c = entity.spec) == null ? void 0 : _c.owner) || "",
158
- lifecycle: JSON.stringify((_d = entity.spec) == null ? void 0 : _d.lifecycle) || ""
159
- });
160
- });
161
- return /* @__PURE__ */ React.createElement(DenseTable, { BackstageServices: backstageServices || [], PagerDutyServices: pagerDutyServices != null ? pagerDutyServices : [] });
158
+ );
159
+ }, [catalogApi, pagerDutyApi]);
160
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, catalogEntities.length > 0 ? /* @__PURE__ */ React.createElement(
161
+ DenseTable,
162
+ {
163
+ BackstageServices: catalogEntities,
164
+ ServiceMappings: serviceMappings != null ? serviceMappings : []
165
+ }
166
+ ) : /* @__PURE__ */ React.createElement("div", null, "Loading..."));
162
167
  };
163
168
 
164
169
  const PagerDutyPage = () => {
@@ -166,4 +171,4 @@ const PagerDutyPage = () => {
166
171
  };
167
172
 
168
173
  export { PagerDutyPage };
169
- //# sourceMappingURL=index-38e122bb.esm.js.map
174
+ //# sourceMappingURL=index-e3c0c6d8.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-e3c0c6d8.esm.js","sources":["../../src/components/PagerDutyPage/ServiceMappingComponent.tsx","../../src/components/PagerDutyPage/index.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { Table, TableColumn } from \"@backstage/core-components\";\nimport {\n Button,\n FormControl,\n InputLabel,\n MenuItem,\n Select,\n Typography,\n} from \"@material-ui/core\";\nimport { PagerDutyEntityMapping } from \"@pagerduty/backstage-plugin-common\";\nimport { useApi } from \"@backstage/core-plugin-api\";\nimport { pagerDutyApiRef } from \"../../api\";\nimport { catalogApiRef } from \"@backstage/plugin-catalog-react\";\nimport { Entity } from \"@backstage/catalog-model\";\n\ntype Service = {\n name: string; // \"Ads\"\n id: string; // \"QWe1j283n12j132\"\n system: string; // \"Production\"\n owner: string; // \"Mapped\"\n lifecycle: string; // \"Ads\"\n};\n\ntype DenseTableProps = {\n BackstageServices: Service[];\n ServiceMappings: PagerDutyEntityMapping[];\n};\n\nfunction getColorFromStatus(status?: string) {\n switch (status) {\n case \"InSync\":\n return \"green\";\n case \"OutOfSync\":\n return \"red\";\n case \"NotMapped\":\n return \"orange\";\n default:\n return \"gray\";\n }\n}\n\nexport const DenseTable = ({\n BackstageServices,\n ServiceMappings,\n}: DenseTableProps) => {\n // const classes = useStyles();\n\n const pagerDutyApi = useApi(pagerDutyApiRef);\n\n const columns: TableColumn[] = [\n { title: \"PagerDuty Service\", field: \"name\" },\n { title: \"Team\", field: \"team\" },\n { title: \"Escalation Policy\", field: \"escalationPolicy\" },\n { title: \"Mapping\", field: \"mapping\" },\n { title: \"Status\", field: \"mappingStatus\" },\n { title: \"Actions\", field: \"actions\" },\n ];\n\n const data = ServiceMappings.map((service) => {\n // const status = getMappingStatus(service.serviceName!);\n\n return {\n name: service.serviceName,\n team: service.team,\n escalationPolicy: service.escalationPolicy,\n // status of mapping\n mappingStatus: (\n <Typography\n variant=\"body2\"\n style={{\n color: getColorFromStatus(service.status),\n }}\n >\n {service.status}\n </Typography>\n ),\n mapping: (\n // dropdown menu with static options. If service.mapping is defined select that option\n <FormControl variant=\"standard\">\n <InputLabel id=\"demo-simple-select-helper-label\">Service</InputLabel>\n <Select\n labelId=\"demo-simple-select-helper-label\"\n id=\"demo-simple-select-helper\"\n onChange={async (selection) => {\n await pagerDutyApi.storeServiceMapping(service.service_id, selection.target.value as string)\n \n }}\n value={service.entity_ref}\n >\n <MenuItem value=\"\">\n <em>None</em>\n </MenuItem>\n {BackstageServices.map((backstageService) => {\n return (\n <MenuItem\n key={backstageService.id}\n value={backstageService.id}\n >\n {backstageService.name}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n // <select title=\"Mapping\" value={service.mapping}>\n // <option aria-label=\"None\" value=\"\" />\n // <option value=\"Ads\">Ads</option>\n // <option value=\"Cache\">Cache</option>\n // <option value=\"Catalog\">Catalog</option>\n // <option value=\"Checkout\">Checkout</option>\n // </select>\n ),\n actions: (\n <Button variant=\"contained\" color=\"primary\" href={service.serviceUrl}>\n Open in PagerDuty\n </Button>\n ),\n };\n });\n\n return (\n <Table\n title=\"PagerDuty Service Import\"\n subtitle=\"Use this page to import services from PagerDuty and map them to existing Backstage services. Only 1:1 mapping is allowed.\"\n options={{\n search: true,\n paging: true,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50],\n sorting: true,\n emptyRowsWhenPaging: false,\n showFirstLastPageButtons: true,\n columnResizable: true,\n columnsButton: true,\n rowStyle: {\n height: \"10px\",\n },\n padding: \"dense\",\n }}\n columns={columns}\n data={data}\n />\n );\n};\n\nexport const ServiceMappingComponent = () => {\n \n const [catalogEntities, setCatalogEntities] = useState<Service[]>([]);\n const [serviceMappings, setServiceMappings] = useState<PagerDutyEntityMapping[]>([]);\n const pagerDutyApi = useApi(pagerDutyApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n useEffect(() => {\n async function fetchEntities(): Promise<Service[]> {\n const { items } = await catalogApi.getEntities({\n filter: { kind: \"Component\" },\n });\n\n const backstageServices: Service[] = [];\n items.forEach((entity: Entity) => {\n backstageServices.push({\n name: entity.metadata?.name,\n id: entity.metadata?.uid ?? \"\",\n system: JSON.stringify(entity.spec?.system) || \"\",\n owner: JSON.stringify(entity.spec?.owner) || \"\",\n lifecycle: JSON.stringify(entity.spec?.lifecycle) || \"\",\n });\n });\n\n return backstageServices;\n }\n\n async function fetchServices(): Promise<PagerDutyEntityMapping[]> {\n const { mappings: foundServices } = await pagerDutyApi.getEntityMappings();\n\n return foundServices;\n }\n\n Promise.all([fetchEntities(), fetchServices()]).then(\n ([entities, mappings]) => {\n setCatalogEntities(entities);\n setServiceMappings(mappings);\n }\n );\n }, [catalogApi, pagerDutyApi]);\n\n return (\n <>\n {catalogEntities.length > 0 ? (\n <DenseTable\n BackstageServices={catalogEntities}\n ServiceMappings={serviceMappings ?? []}\n />\n ) : (\n <div>Loading...</div>\n )}\n </>\n );\n};\n","import React from \"react\";\nimport { Grid } from \"@material-ui/core\";\nimport { Header, Page, Content } from \"@backstage/core-components\";\nimport { ServiceMappingComponent } from \"./ServiceMappingComponent\";\n\n/** @public */\nexport const PagerDutyPage = () => {\n // const [toggleImport, setToggleImport] = useState(false);\n // const [toggleSave, setToggleSave] = useState(false);\n\n // const handleImport = () => {\n // setToggleImport(!toggleImport);\n // };\n\n // const handleSave = () => {\n // setToggleSave(!toggleSave);\n // }\n\n return (\n <Page themeId=\"home\">\n <Header title=\"PagerDuty\" subtitle=\"Advanced configurations\" />\n <Content>\n {/* <Grid container spacing={3} direction=\"column\">\n <Grid item alignContent=\"flex-end\">\n <Button variant=\"contained\" color=\"primary\" onClick={() => {handleImport()}}>\n Import\n </Button>\n <Button variant=\"outlined\" color=\"primary\" onClick={() => {handleSave()}}>\n Save\n </Button>\n </Grid>\n </Grid> */}\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ServiceMappingComponent />\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -83,12 +83,30 @@ class PagerDutyClient {
83
83
  }
84
84
  return response;
85
85
  }
86
- async getAllServices() {
86
+ async getEntityMappings() {
87
87
  const url = `${await this.config.discoveryApi.getBaseUrl(
88
88
  "pagerduty"
89
- )}/services`;
89
+ )}/mapping/entity`;
90
90
  return await this.findByUrl(url);
91
91
  }
92
+ async storeServiceMapping(serviceId, backstageEntityId) {
93
+ const body = JSON.stringify({
94
+ entity_ref: backstageEntityId,
95
+ service_id: serviceId
96
+ });
97
+ const options = {
98
+ method: "POST",
99
+ headers: {
100
+ "Content-Type": "application/json; charset=UTF-8",
101
+ Accept: "application/json, text/plain, */*"
102
+ },
103
+ body
104
+ };
105
+ const url = `${await this.config.discoveryApi.getBaseUrl(
106
+ "pagerduty"
107
+ )}/mapping/entity`;
108
+ return this.request(url, options);
109
+ }
92
110
  async getServiceByEntity(entity) {
93
111
  return await this.getServiceByPagerDutyEntity(getPagerDutyEntity(entity));
94
112
  }
@@ -211,7 +229,7 @@ const pagerDutyPlugin = createPlugin({
211
229
  const PagerDutyPage = pagerDutyPlugin.provide(
212
230
  createRoutableExtension({
213
231
  name: "PagerDutyPage",
214
- component: () => import('./index-38e122bb.esm.js').then((m) => m.PagerDutyPage),
232
+ component: () => import('./index-e3c0c6d8.esm.js').then((m) => m.PagerDutyPage),
215
233
  mountPoint: rootRouteRef
216
234
  })
217
235
  );
@@ -239,7 +257,7 @@ const HomePagePagerDutyCard = pagerDutyPlugin.provide(
239
257
  createCardExtension({
240
258
  name: "HomePagePagerDutyCard",
241
259
  title: "PagerDuty Homepage Card",
242
- components: () => import('./index-c99fd03f.esm.js'),
260
+ components: () => import('./index-628dfe24.esm.js'),
243
261
  settings: {
244
262
  schema: {
245
263
  title: "PagerDuty",
@@ -1605,4 +1623,4 @@ function TriggerButton(props) {
1605
1623
  const PagerDutyCard = EntityPagerDutyCard;
1606
1624
 
1607
1625
  export { EntityPagerDutyCard$1 as E, HomePagePagerDutyCard as H, PagerDutyCard$1 as P, TriggerButton as T, UnauthorizedError as U, pagerDutyPlugin as a, PagerDutyPage as b, EntityPagerDutySmallCard$1 as c, isPluginApplicableToEntity as d, PagerDutyClient as e, PagerDutyCard as f, isPluginApplicableToEntity$1 as i, pagerDutyApiRef as p };
1608
- //# sourceMappingURL=index-3dd8801b.esm.js.map
1626
+ //# sourceMappingURL=index-fce893e2.esm.js.map