@kuadrant/kuadrant-backstage-plugin-backend 0.0.1-test.1-d62c1cdb → 0.0.1-test.1-464d7760

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/dist/alpha.cjs.js CHANGED
@@ -6,6 +6,10 @@ var backendPluginApi = require('@backstage/backend-plugin-api');
6
6
  var alpha = require('@backstage/plugin-catalog-node/alpha');
7
7
  var APIProductEntityProvider = require('./providers/APIProductEntityProvider.cjs.js');
8
8
 
9
+ let apiProductProviderInstance = null;
10
+ function getAPIProductEntityProvider() {
11
+ return apiProductProviderInstance;
12
+ }
9
13
  const catalogModuleApiProductEntityProvider = backendPluginApi.createBackendModule({
10
14
  pluginId: "catalog",
11
15
  moduleId: "kuadrant-apiproduct-provider",
@@ -19,6 +23,7 @@ const catalogModuleApiProductEntityProvider = backendPluginApi.createBackendModu
19
23
  async init({ catalog, config, logger }) {
20
24
  logger.info("registering kuadrant apiproduct entity provider");
21
25
  const provider = new APIProductEntityProvider.APIProductEntityProvider(config);
26
+ apiProductProviderInstance = provider;
22
27
  catalog.addEntityProvider(provider);
23
28
  logger.info("apiproduct entity provider registered successfully");
24
29
  }
@@ -28,4 +33,5 @@ const catalogModuleApiProductEntityProvider = backendPluginApi.createBackendModu
28
33
 
29
34
  exports.catalogModuleApiProductEntityProvider = catalogModuleApiProductEntityProvider;
30
35
  exports.default = catalogModuleApiProductEntityProvider;
36
+ exports.getAPIProductEntityProvider = getAPIProductEntityProvider;
31
37
  //# sourceMappingURL=alpha.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alpha.cjs.js","sources":["../src/module.ts"],"sourcesContent":["import {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\nimport { APIProductEntityProvider } from './providers/APIProductEntityProvider';\n\n/**\n * backend module for apiproduct entity provider\n * @public\n */\nexport const catalogModuleApiProductEntityProvider = createBackendModule({\n pluginId: 'catalog',\n moduleId: 'kuadrant-apiproduct-provider',\n register(env) {\n env.registerInit({\n deps: {\n catalog: catalogProcessingExtensionPoint,\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n },\n async init({ catalog, config, logger }) {\n logger.info('registering kuadrant apiproduct entity provider');\n const provider = new APIProductEntityProvider(config);\n catalog.addEntityProvider(provider);\n logger.info('apiproduct entity provider registered successfully');\n },\n });\n },\n});\n\nexport default catalogModuleApiProductEntityProvider;\n\n"],"names":["createBackendModule","catalogProcessingExtensionPoint","coreServices","APIProductEntityProvider"],"mappings":";;;;;;;;AAWO,MAAM,wCAAwCA,oCAAoB,CAAA;AAAA,EACvE,QAAU,EAAA,SAAA;AAAA,EACV,QAAU,EAAA,8BAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,OAAS,EAAAC,qCAAA;AAAA,QACT,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA;AAAA,OACvB;AAAA,MACA,MAAM,IAAK,CAAA,EAAE,OAAS,EAAA,MAAA,EAAQ,QAAU,EAAA;AACtC,QAAA,MAAA,CAAO,KAAK,iDAAiD,CAAA;AAC7D,QAAM,MAAA,QAAA,GAAW,IAAIC,iDAAA,CAAyB,MAAM,CAAA;AACpD,QAAA,OAAA,CAAQ,kBAAkB,QAAQ,CAAA;AAClC,QAAA,MAAA,CAAO,KAAK,oDAAoD,CAAA;AAAA;AAClE,KACD,CAAA;AAAA;AAEL,CAAC;;;;;"}
1
+ {"version":3,"file":"alpha.cjs.js","sources":["../src/module.ts"],"sourcesContent":["import {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\nimport { APIProductEntityProvider } from './providers/APIProductEntityProvider';\n\n// singleton instance for sharing provider between module and router\nlet apiProductProviderInstance: APIProductEntityProvider | null = null;\n\n/**\n * get the apiproduct entity provider instance\n * @public\n */\nexport function getAPIProductEntityProvider(): APIProductEntityProvider | null {\n return apiProductProviderInstance;\n}\n\n/**\n * backend module for apiproduct entity provider\n * @public\n */\nexport const catalogModuleApiProductEntityProvider = createBackendModule({\n pluginId: 'catalog',\n moduleId: 'kuadrant-apiproduct-provider',\n register(env) {\n env.registerInit({\n deps: {\n catalog: catalogProcessingExtensionPoint,\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n },\n async init({ catalog, config, logger }) {\n logger.info('registering kuadrant apiproduct entity provider');\n const provider = new APIProductEntityProvider(config);\n apiProductProviderInstance = provider;\n catalog.addEntityProvider(provider);\n logger.info('apiproduct entity provider registered successfully');\n },\n });\n },\n});\n\nexport default catalogModuleApiProductEntityProvider;\n\n"],"names":["createBackendModule","catalogProcessingExtensionPoint","coreServices","APIProductEntityProvider"],"mappings":";;;;;;;;AAQA,IAAI,0BAA8D,GAAA,IAAA;AAM3D,SAAS,2BAA+D,GAAA;AAC7E,EAAO,OAAA,0BAAA;AACT;AAMO,MAAM,wCAAwCA,oCAAoB,CAAA;AAAA,EACvE,QAAU,EAAA,SAAA;AAAA,EACV,QAAU,EAAA,8BAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,OAAS,EAAAC,qCAAA;AAAA,QACT,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA;AAAA,OACvB;AAAA,MACA,MAAM,IAAK,CAAA,EAAE,OAAS,EAAA,MAAA,EAAQ,QAAU,EAAA;AACtC,QAAA,MAAA,CAAO,KAAK,iDAAiD,CAAA;AAC7D,QAAM,MAAA,QAAA,GAAW,IAAIC,iDAAA,CAAyB,MAAM,CAAA;AACpD,QAA6B,0BAAA,GAAA,QAAA;AAC7B,QAAA,OAAA,CAAQ,kBAAkB,QAAQ,CAAA;AAClC,QAAA,MAAA,CAAO,KAAK,oDAAoD,CAAA;AAAA;AAClE,KACD,CAAA;AAAA;AAEL,CAAC;;;;;;"}
@@ -0,0 +1,27 @@
1
+ import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
+ import { RootConfigService } from '@backstage/backend-plugin-api';
3
+ import { EntityProvider, EntityProviderConnection } from '@backstage/plugin-catalog-node';
4
+
5
+ declare class APIProductEntityProvider implements EntityProvider {
6
+ private readonly k8sClient;
7
+ private connection?;
8
+ private readonly providerId;
9
+ constructor(config: RootConfigService);
10
+ getProviderName(): string;
11
+ connect(connection: EntityProviderConnection): Promise<void>;
12
+ refresh(): Promise<void>;
13
+ private transformToEntity;
14
+ }
15
+
16
+ /**
17
+ * get the apiproduct entity provider instance
18
+ * @public
19
+ */
20
+ declare function getAPIProductEntityProvider(): APIProductEntityProvider | null;
21
+ /**
22
+ * backend module for apiproduct entity provider
23
+ * @public
24
+ */
25
+ declare const catalogModuleApiProductEntityProvider: _backstage_backend_plugin_api.BackendFeature;
26
+
27
+ export { catalogModuleApiProductEntityProvider, catalogModuleApiProductEntityProvider as default, getAPIProductEntityProvider };
package/dist/index.cjs.js CHANGED
@@ -15,9 +15,12 @@ exports.kuadrantApiKeyDeleteOwnPermission = permissions.kuadrantApiKeyDeleteOwnP
15
15
  exports.kuadrantApiKeyReadAllPermission = permissions.kuadrantApiKeyReadAllPermission;
16
16
  exports.kuadrantApiKeyReadOwnPermission = permissions.kuadrantApiKeyReadOwnPermission;
17
17
  exports.kuadrantApiKeyRequestCreatePermission = permissions.kuadrantApiKeyRequestCreatePermission;
18
+ exports.kuadrantApiKeyRequestDeleteAllPermission = permissions.kuadrantApiKeyRequestDeleteAllPermission;
19
+ exports.kuadrantApiKeyRequestDeleteOwnPermission = permissions.kuadrantApiKeyRequestDeleteOwnPermission;
18
20
  exports.kuadrantApiKeyRequestListPermission = permissions.kuadrantApiKeyRequestListPermission;
19
21
  exports.kuadrantApiKeyRequestReadAllPermission = permissions.kuadrantApiKeyRequestReadAllPermission;
20
22
  exports.kuadrantApiKeyRequestReadOwnPermission = permissions.kuadrantApiKeyRequestReadOwnPermission;
23
+ exports.kuadrantApiKeyRequestUpdateOwnPermission = permissions.kuadrantApiKeyRequestUpdateOwnPermission;
21
24
  exports.kuadrantApiKeyRequestUpdatePermission = permissions.kuadrantApiKeyRequestUpdatePermission;
22
25
  exports.kuadrantApiProductCreatePermission = permissions.kuadrantApiProductCreatePermission;
23
26
  exports.kuadrantApiProductDeletePermission = permissions.kuadrantApiProductDeletePermission;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,50 @@
1
+ import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
+ import * as _backstage_plugin_permission_common from '@backstage/plugin-permission-common';
3
+ export { default as catalogModuleApiProductEntityProvider } from './alpha.js';
4
+ export { default as kuadrantRbacModule } from './rbac.js';
5
+ import '@backstage/plugin-catalog-node';
6
+
7
+ /**
8
+ * kuadrantPlugin backend plugin
9
+ *
10
+ * @public
11
+ */
12
+ declare const kuadrantPlugin: _backstage_backend_plugin_api.BackendFeature;
13
+
14
+ /**
15
+ * Permission definitions for the Kuadrant plugin
16
+ *
17
+ * These permissions control access to PlanPolicy, APIProduct, APIKeyRequest,
18
+ * and API key management within the Kuadrant Backstage plugin.
19
+ *
20
+ * Permissions are composable - use them to build custom roles beyond the
21
+ * three reference personas (Platform Engineer, API Owner, API Consumer).
22
+ */
23
+ declare const kuadrantPlanPolicyCreatePermission: _backstage_plugin_permission_common.BasicPermission;
24
+ declare const kuadrantPlanPolicyReadPermission: _backstage_plugin_permission_common.BasicPermission;
25
+ declare const kuadrantPlanPolicyUpdatePermission: _backstage_plugin_permission_common.BasicPermission;
26
+ declare const kuadrantPlanPolicyDeletePermission: _backstage_plugin_permission_common.BasicPermission;
27
+ declare const kuadrantPlanPolicyListPermission: _backstage_plugin_permission_common.BasicPermission;
28
+ declare const kuadrantApiProductCreatePermission: _backstage_plugin_permission_common.BasicPermission;
29
+ declare const kuadrantApiProductReadPermission: _backstage_plugin_permission_common.BasicPermission;
30
+ declare const kuadrantApiProductUpdatePermission: _backstage_plugin_permission_common.BasicPermission;
31
+ declare const kuadrantApiProductDeletePermission: _backstage_plugin_permission_common.BasicPermission;
32
+ declare const kuadrantApiProductListPermission: _backstage_plugin_permission_common.BasicPermission;
33
+ declare const kuadrantApiKeyRequestCreatePermission: _backstage_plugin_permission_common.ResourcePermission<"apiproduct">;
34
+ declare const kuadrantApiKeyRequestReadOwnPermission: _backstage_plugin_permission_common.BasicPermission;
35
+ declare const kuadrantApiKeyRequestReadAllPermission: _backstage_plugin_permission_common.BasicPermission;
36
+ declare const kuadrantApiKeyRequestUpdatePermission: _backstage_plugin_permission_common.BasicPermission;
37
+ declare const kuadrantApiKeyRequestListPermission: _backstage_plugin_permission_common.BasicPermission;
38
+ declare const kuadrantApiKeyRequestUpdateOwnPermission: _backstage_plugin_permission_common.BasicPermission;
39
+ declare const kuadrantApiKeyRequestDeleteOwnPermission: _backstage_plugin_permission_common.BasicPermission;
40
+ declare const kuadrantApiKeyRequestDeleteAllPermission: _backstage_plugin_permission_common.BasicPermission;
41
+ declare const kuadrantApiKeyReadOwnPermission: _backstage_plugin_permission_common.BasicPermission;
42
+ declare const kuadrantApiKeyReadAllPermission: _backstage_plugin_permission_common.BasicPermission;
43
+ declare const kuadrantApiKeyDeleteOwnPermission: _backstage_plugin_permission_common.BasicPermission;
44
+ declare const kuadrantApiKeyDeleteAllPermission: _backstage_plugin_permission_common.BasicPermission;
45
+ /**
46
+ * All Kuadrant permissions as an array for easy iteration
47
+ */
48
+ declare const kuadrantPermissions: (_backstage_plugin_permission_common.BasicPermission | _backstage_plugin_permission_common.ResourcePermission<"apiproduct">)[];
49
+
50
+ export { kuadrantPlugin as default, kuadrantApiKeyDeleteAllPermission, kuadrantApiKeyDeleteOwnPermission, kuadrantApiKeyReadAllPermission, kuadrantApiKeyReadOwnPermission, kuadrantApiKeyRequestCreatePermission, kuadrantApiKeyRequestDeleteAllPermission, kuadrantApiKeyRequestDeleteOwnPermission, kuadrantApiKeyRequestListPermission, kuadrantApiKeyRequestReadAllPermission, kuadrantApiKeyRequestReadOwnPermission, kuadrantApiKeyRequestUpdateOwnPermission, kuadrantApiKeyRequestUpdatePermission, kuadrantApiProductCreatePermission, kuadrantApiProductDeletePermission, kuadrantApiProductListPermission, kuadrantApiProductReadPermission, kuadrantApiProductUpdatePermission, kuadrantPermissions, kuadrantPlanPolicyCreatePermission, kuadrantPlanPolicyDeletePermission, kuadrantPlanPolicyListPermission, kuadrantPlanPolicyReadPermission, kuadrantPlanPolicyUpdatePermission };
@@ -236,7 +236,15 @@ class KuadrantK8sClient {
236
236
  namespace,
237
237
  plural,
238
238
  name,
239
- patch
239
+ patch,
240
+ void 0,
241
+ void 0,
242
+ void 0,
243
+ {
244
+ headers: {
245
+ "Content-Type": "application/merge-patch+json"
246
+ }
247
+ }
240
248
  );
241
249
  return response.body;
242
250
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"k8s-client.cjs.js","sources":["../src/k8s-client.ts"],"sourcesContent":["import * as k8s from '@kubernetes/client-node';\nimport { RootConfigService } from '@backstage/backend-plugin-api';\n\nexport interface K8sResource {\n apiVersion: string;\n kind: string;\n metadata: {\n name: string;\n namespace?: string;\n creationTimestamp?: string;\n labels?: Record<string, string>;\n annotations?: Record<string, string>;\n [key: string]: any;\n };\n spec?: any;\n status?: any;\n data?: any;\n stringData?: any;\n [key: string]: any;\n}\n\nexport interface K8sList {\n items: K8sResource[];\n}\n\nexport class KuadrantK8sClient {\n private kc: k8s.KubeConfig;\n private customApi: k8s.CustomObjectsApi;\n private coreApi: k8s.CoreV1Api;\n\n constructor(config: RootConfigService) {\n this.kc = new k8s.KubeConfig();\n\n const hasK8sConfig = config.has('kubernetes');\n\n if (hasK8sConfig) {\n const clusterLocatorMethods = config.getOptionalConfigArray('kubernetes.clusterLocatorMethods') || [];\n\n // look for type: config with explicit cluster configuration\n const configLocator = clusterLocatorMethods.find(c => c.getString('type') === 'config');\n\n if (configLocator) {\n const clusters = configLocator.getOptionalConfigArray('clusters') || [];\n\n if (clusters.length > 0) {\n // use the first cluster config\n const clusterConfig = clusters[0];\n const clusterName = clusterConfig.getString('name');\n const clusterUrl = clusterConfig.getString('url');\n const authProvider = clusterConfig.getOptionalString('authProvider');\n const skipTLSVerify = clusterConfig.getOptionalBoolean('skipTLSVerify') || false;\n\n if (authProvider === 'serviceAccount') {\n const serviceAccountToken = clusterConfig.getString('serviceAccountToken');\n\n // configure kubeconfig manually with service account\n const cluster = {\n name: clusterName,\n server: clusterUrl,\n skipTLSVerify: skipTLSVerify,\n };\n\n const user = {\n name: `${clusterName}-service-account`,\n token: serviceAccountToken,\n };\n\n const context = {\n name: `${clusterName}-context`,\n cluster: clusterName,\n user: user.name,\n };\n\n this.kc.loadFromOptions({\n clusters: [cluster],\n users: [user],\n contexts: [context],\n currentContext: context.name,\n });\n\n console.log(`k8s client initialised with explicit cluster config`);\n console.log(` cluster: ${clusterName}`);\n console.log(` url: ${clusterUrl}`);\n console.log(` auth: serviceAccount`);\n console.log(` skipTLSVerify: ${skipTLSVerify}`);\n } else {\n // unsupported auth provider, fall back to default\n console.log(`unsupported authProvider: ${authProvider}, falling back to default`);\n this.kc.loadFromDefault();\n }\n } else {\n // no clusters defined, fall back to default\n this.kc.loadFromDefault();\n this.logDefaultConfig('no clusters defined');\n }\n } else {\n // no type: config locator, fall back to default\n this.kc.loadFromDefault();\n this.logDefaultConfig('no config locator found');\n }\n } else {\n // no kubernetes config, use default (in-cluster or local kubeconfig)\n this.kc.loadFromDefault();\n this.logDefaultConfig('no kubernetes config in app-config.yaml');\n }\n\n this.customApi = this.kc.makeApiClient(k8s.CustomObjectsApi);\n this.coreApi = this.kc.makeApiClient(k8s.CoreV1Api);\n }\n\n private logDefaultConfig(reason: string): void {\n console.log(`k8s client initialised using default config (${reason})`);\n\n // determine if running in-cluster or using local kubeconfig\n const inClusterToken = process.env.KUBERNETES_SERVICE_HOST;\n\n if (inClusterToken) {\n console.log(' auth: in-cluster service account');\n console.log(' location: /var/run/secrets/kubernetes.io/serviceaccount/');\n } else {\n const kubeconfig = process.env.KUBECONFIG || '~/.kube/config';\n console.log(' auth: local kubeconfig');\n console.log(` location: ${kubeconfig}`);\n }\n }\n\n async listCustomResources(\n group: string,\n version: string,\n plural: string,\n namespace?: string,\n ): Promise<K8sList> {\n try {\n const response = namespace\n ? await this.customApi.listNamespacedCustomObject(group, version, namespace, plural)\n : await this.customApi.listClusterCustomObject(group, version, plural);\n\n return response.body as K8sList;\n } catch (error: any) {\n throw new Error(`failed to list ${plural}: ${error.message}`);\n }\n }\n\n async getCustomResource(\n group: string,\n version: string,\n namespace: string,\n plural: string,\n name: string,\n ): Promise<K8sResource> {\n try {\n const response = await this.customApi.getNamespacedCustomObject(\n group,\n version,\n namespace,\n plural,\n name,\n );\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to get ${plural}/${name}: ${error.message}`);\n }\n }\n\n async createSecret(namespace: string, secret: K8sResource): Promise<K8sResource> {\n try {\n const response = await this.coreApi.createNamespacedSecret(namespace, secret as k8s.V1Secret);\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to create secret: ${error.message}`);\n }\n }\n\n async listSecrets(namespace: string): Promise<K8sList> {\n try {\n const response = await this.coreApi.listNamespacedSecret(namespace);\n return { items: (response.body.items || []) as unknown as K8sResource[] };\n } catch (error: any) {\n throw new Error(`failed to list secrets: ${error.message}`);\n }\n }\n\n async getSecret(namespace: string, name: string): Promise<K8sResource> {\n try {\n const response = await this.coreApi.readNamespacedSecret(name, namespace);\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to get secret: ${error.message}`);\n }\n }\n\n async deleteSecret(namespace: string, name: string): Promise<void> {\n try {\n await this.coreApi.deleteNamespacedSecret(name, namespace);\n } catch (error: any) {\n throw new Error(`failed to delete secret: ${error.message}`);\n }\n }\n\n async createConfigMap(namespace: string, configMap: K8sResource): Promise<K8sResource> {\n try {\n const response = await this.coreApi.createNamespacedConfigMap(namespace, configMap as k8s.V1ConfigMap);\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to create configmap: ${error.message}`);\n }\n }\n\n async listConfigMaps(namespace: string, labelSelector?: string): Promise<K8sList> {\n try {\n const response = await this.coreApi.listNamespacedConfigMap(namespace, undefined, undefined, undefined, undefined, labelSelector);\n return { items: (response.body.items || []) as unknown as K8sResource[] };\n } catch (error: any) {\n throw new Error(`failed to list configmaps: ${error.message}`);\n }\n }\n\n async getConfigMap(namespace: string, name: string): Promise<K8sResource> {\n try {\n const response = await this.coreApi.readNamespacedConfigMap(name, namespace);\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to get configmap: ${error.message}`);\n }\n }\n\n async updateConfigMap(namespace: string, name: string, configMap: K8sResource): Promise<K8sResource> {\n try {\n const response = await this.coreApi.replaceNamespacedConfigMap(name, namespace, configMap as k8s.V1ConfigMap);\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to update configmap: ${error.message}`);\n }\n }\n\n async deleteConfigMap(namespace: string, name: string): Promise<void> {\n try {\n await this.coreApi.deleteNamespacedConfigMap(name, namespace);\n } catch (error: any) {\n throw new Error(`failed to delete configmap: ${error.message}`);\n }\n }\n\n async createCustomResource(\n group: string,\n version: string,\n namespace: string,\n plural: string,\n resource: K8sResource,\n ): Promise<K8sResource> {\n try {\n const response = await this.customApi.createNamespacedCustomObject(\n group,\n version,\n namespace,\n plural,\n resource as any,\n );\n return response.body as K8sResource;\n } catch (error: any) {\n // extract detailed error from kubernetes api response\n const statusCode = error.response?.statusCode || error.statusCode;\n const body = error.response?.body || error.body;\n const message = body?.message || error.message;\n const reason = body?.reason;\n const details = body?.details;\n\n console.error(`failed to create ${plural}:`, {\n statusCode,\n message,\n reason,\n details: JSON.stringify(details),\n });\n\n throw new Error(`failed to create ${plural}: ${message}${reason ? ` (${reason})` : ''}`);\n }\n }\n\n async deleteCustomResource(\n group: string,\n version: string,\n namespace: string,\n plural: string,\n name: string,\n ): Promise<void> {\n try {\n await this.customApi.deleteNamespacedCustomObject(\n group,\n version,\n namespace,\n plural,\n name,\n );\n } catch (error: any) {\n throw new Error(`failed to delete ${plural}/${name}: ${error.message}`);\n }\n }\n\n async patchCustomResource(\n group: string,\n version: string,\n namespace: string,\n plural: string,\n name: string,\n patch: any,\n ): Promise<K8sResource> {\n try {\n const response = await this.customApi.patchNamespacedCustomObject(\n group,\n version,\n namespace,\n plural,\n name,\n patch,\n );\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to patch ${plural}/${name}: ${error.message}`);\n }\n }\n\n async patchCustomResourceStatus(\n group: string,\n version: string,\n namespace: string,\n plural: string,\n name: string,\n status: any,\n ): Promise<K8sResource> {\n try {\n // get the existing resource first\n const existing = await this.getCustomResource(group, version, namespace, plural, name);\n\n // replace the entire resource with updated status\n const updated = {\n ...existing,\n status,\n };\n\n const response = await this.customApi.replaceNamespacedCustomObjectStatus(\n group,\n version,\n namespace,\n plural,\n name,\n updated,\n );\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to patch ${plural}/${name} status: ${error.message}`);\n }\n }\n}\n\n"],"names":["k8s"],"mappings":"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"}
1
+ {"version":3,"file":"k8s-client.cjs.js","sources":["../src/k8s-client.ts"],"sourcesContent":["import * as k8s from '@kubernetes/client-node';\nimport { RootConfigService } from '@backstage/backend-plugin-api';\n\nexport interface K8sResource {\n apiVersion: string;\n kind: string;\n metadata: {\n name: string;\n namespace?: string;\n creationTimestamp?: string;\n labels?: Record<string, string>;\n annotations?: Record<string, string>;\n [key: string]: any;\n };\n spec?: any;\n status?: any;\n data?: any;\n stringData?: any;\n [key: string]: any;\n}\n\nexport interface K8sList {\n items: K8sResource[];\n}\n\nexport class KuadrantK8sClient {\n private kc: k8s.KubeConfig;\n private customApi: k8s.CustomObjectsApi;\n private coreApi: k8s.CoreV1Api;\n\n constructor(config: RootConfigService) {\n this.kc = new k8s.KubeConfig();\n\n const hasK8sConfig = config.has('kubernetes');\n\n if (hasK8sConfig) {\n const clusterLocatorMethods = config.getOptionalConfigArray('kubernetes.clusterLocatorMethods') || [];\n\n // look for type: config with explicit cluster configuration\n const configLocator = clusterLocatorMethods.find(c => c.getString('type') === 'config');\n\n if (configLocator) {\n const clusters = configLocator.getOptionalConfigArray('clusters') || [];\n\n if (clusters.length > 0) {\n // use the first cluster config\n const clusterConfig = clusters[0];\n const clusterName = clusterConfig.getString('name');\n const clusterUrl = clusterConfig.getString('url');\n const authProvider = clusterConfig.getOptionalString('authProvider');\n const skipTLSVerify = clusterConfig.getOptionalBoolean('skipTLSVerify') || false;\n\n if (authProvider === 'serviceAccount') {\n const serviceAccountToken = clusterConfig.getString('serviceAccountToken');\n\n // configure kubeconfig manually with service account\n const cluster = {\n name: clusterName,\n server: clusterUrl,\n skipTLSVerify: skipTLSVerify,\n };\n\n const user = {\n name: `${clusterName}-service-account`,\n token: serviceAccountToken,\n };\n\n const context = {\n name: `${clusterName}-context`,\n cluster: clusterName,\n user: user.name,\n };\n\n this.kc.loadFromOptions({\n clusters: [cluster],\n users: [user],\n contexts: [context],\n currentContext: context.name,\n });\n\n console.log(`k8s client initialised with explicit cluster config`);\n console.log(` cluster: ${clusterName}`);\n console.log(` url: ${clusterUrl}`);\n console.log(` auth: serviceAccount`);\n console.log(` skipTLSVerify: ${skipTLSVerify}`);\n } else {\n // unsupported auth provider, fall back to default\n console.log(`unsupported authProvider: ${authProvider}, falling back to default`);\n this.kc.loadFromDefault();\n }\n } else {\n // no clusters defined, fall back to default\n this.kc.loadFromDefault();\n this.logDefaultConfig('no clusters defined');\n }\n } else {\n // no type: config locator, fall back to default\n this.kc.loadFromDefault();\n this.logDefaultConfig('no config locator found');\n }\n } else {\n // no kubernetes config, use default (in-cluster or local kubeconfig)\n this.kc.loadFromDefault();\n this.logDefaultConfig('no kubernetes config in app-config.yaml');\n }\n\n this.customApi = this.kc.makeApiClient(k8s.CustomObjectsApi);\n this.coreApi = this.kc.makeApiClient(k8s.CoreV1Api);\n }\n\n private logDefaultConfig(reason: string): void {\n console.log(`k8s client initialised using default config (${reason})`);\n\n // determine if running in-cluster or using local kubeconfig\n const inClusterToken = process.env.KUBERNETES_SERVICE_HOST;\n\n if (inClusterToken) {\n console.log(' auth: in-cluster service account');\n console.log(' location: /var/run/secrets/kubernetes.io/serviceaccount/');\n } else {\n const kubeconfig = process.env.KUBECONFIG || '~/.kube/config';\n console.log(' auth: local kubeconfig');\n console.log(` location: ${kubeconfig}`);\n }\n }\n\n async listCustomResources(\n group: string,\n version: string,\n plural: string,\n namespace?: string,\n ): Promise<K8sList> {\n try {\n const response = namespace\n ? await this.customApi.listNamespacedCustomObject(group, version, namespace, plural)\n : await this.customApi.listClusterCustomObject(group, version, plural);\n\n return response.body as K8sList;\n } catch (error: any) {\n throw new Error(`failed to list ${plural}: ${error.message}`);\n }\n }\n\n async getCustomResource(\n group: string,\n version: string,\n namespace: string,\n plural: string,\n name: string,\n ): Promise<K8sResource> {\n try {\n const response = await this.customApi.getNamespacedCustomObject(\n group,\n version,\n namespace,\n plural,\n name,\n );\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to get ${plural}/${name}: ${error.message}`);\n }\n }\n\n async createSecret(namespace: string, secret: K8sResource): Promise<K8sResource> {\n try {\n const response = await this.coreApi.createNamespacedSecret(namespace, secret as k8s.V1Secret);\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to create secret: ${error.message}`);\n }\n }\n\n async listSecrets(namespace: string): Promise<K8sList> {\n try {\n const response = await this.coreApi.listNamespacedSecret(namespace);\n return { items: (response.body.items || []) as unknown as K8sResource[] };\n } catch (error: any) {\n throw new Error(`failed to list secrets: ${error.message}`);\n }\n }\n\n async getSecret(namespace: string, name: string): Promise<K8sResource> {\n try {\n const response = await this.coreApi.readNamespacedSecret(name, namespace);\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to get secret: ${error.message}`);\n }\n }\n\n async deleteSecret(namespace: string, name: string): Promise<void> {\n try {\n await this.coreApi.deleteNamespacedSecret(name, namespace);\n } catch (error: any) {\n throw new Error(`failed to delete secret: ${error.message}`);\n }\n }\n\n async createConfigMap(namespace: string, configMap: K8sResource): Promise<K8sResource> {\n try {\n const response = await this.coreApi.createNamespacedConfigMap(namespace, configMap as k8s.V1ConfigMap);\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to create configmap: ${error.message}`);\n }\n }\n\n async listConfigMaps(namespace: string, labelSelector?: string): Promise<K8sList> {\n try {\n const response = await this.coreApi.listNamespacedConfigMap(namespace, undefined, undefined, undefined, undefined, labelSelector);\n return { items: (response.body.items || []) as unknown as K8sResource[] };\n } catch (error: any) {\n throw new Error(`failed to list configmaps: ${error.message}`);\n }\n }\n\n async getConfigMap(namespace: string, name: string): Promise<K8sResource> {\n try {\n const response = await this.coreApi.readNamespacedConfigMap(name, namespace);\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to get configmap: ${error.message}`);\n }\n }\n\n async updateConfigMap(namespace: string, name: string, configMap: K8sResource): Promise<K8sResource> {\n try {\n const response = await this.coreApi.replaceNamespacedConfigMap(name, namespace, configMap as k8s.V1ConfigMap);\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to update configmap: ${error.message}`);\n }\n }\n\n async deleteConfigMap(namespace: string, name: string): Promise<void> {\n try {\n await this.coreApi.deleteNamespacedConfigMap(name, namespace);\n } catch (error: any) {\n throw new Error(`failed to delete configmap: ${error.message}`);\n }\n }\n\n async createCustomResource(\n group: string,\n version: string,\n namespace: string,\n plural: string,\n resource: K8sResource,\n ): Promise<K8sResource> {\n try {\n const response = await this.customApi.createNamespacedCustomObject(\n group,\n version,\n namespace,\n plural,\n resource as any,\n );\n return response.body as K8sResource;\n } catch (error: any) {\n // extract detailed error from kubernetes api response\n const statusCode = error.response?.statusCode || error.statusCode;\n const body = error.response?.body || error.body;\n const message = body?.message || error.message;\n const reason = body?.reason;\n const details = body?.details;\n\n console.error(`failed to create ${plural}:`, {\n statusCode,\n message,\n reason,\n details: JSON.stringify(details),\n });\n\n throw new Error(`failed to create ${plural}: ${message}${reason ? ` (${reason})` : ''}`);\n }\n }\n\n async deleteCustomResource(\n group: string,\n version: string,\n namespace: string,\n plural: string,\n name: string,\n ): Promise<void> {\n try {\n await this.customApi.deleteNamespacedCustomObject(\n group,\n version,\n namespace,\n plural,\n name,\n );\n } catch (error: any) {\n throw new Error(`failed to delete ${plural}/${name}: ${error.message}`);\n }\n }\n\n async patchCustomResource(\n group: string,\n version: string,\n namespace: string,\n plural: string,\n name: string,\n patch: any,\n ): Promise<K8sResource> {\n try {\n const response = await this.customApi.patchNamespacedCustomObject(\n group,\n version,\n namespace,\n plural,\n name,\n patch,\n undefined,\n undefined,\n undefined,\n {\n headers: {\n 'Content-Type': 'application/merge-patch+json',\n },\n }\n );\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to patch ${plural}/${name}: ${error.message}`);\n }\n }\n\n async patchCustomResourceStatus(\n group: string,\n version: string,\n namespace: string,\n plural: string,\n name: string,\n status: any,\n ): Promise<K8sResource> {\n try {\n // get the existing resource first\n const existing = await this.getCustomResource(group, version, namespace, plural, name);\n\n // replace the entire resource with updated status\n const updated = {\n ...existing,\n status,\n };\n\n const response = await this.customApi.replaceNamespacedCustomObjectStatus(\n group,\n version,\n namespace,\n plural,\n name,\n updated,\n );\n return response.body as K8sResource;\n } catch (error: any) {\n throw new Error(`failed to patch ${plural}/${name} status: ${error.message}`);\n }\n }\n}\n\n"],"names":["k8s"],"mappings":"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"}
@@ -63,6 +63,18 @@ const kuadrantApiKeyRequestListPermission = pluginPermissionCommon.createPermiss
63
63
  name: "kuadrant.apikeyrequest.list",
64
64
  attributes: { action: "read" }
65
65
  });
66
+ const kuadrantApiKeyRequestUpdateOwnPermission = pluginPermissionCommon.createPermission({
67
+ name: "kuadrant.apikeyrequest.update.own",
68
+ attributes: { action: "update" }
69
+ });
70
+ const kuadrantApiKeyRequestDeleteOwnPermission = pluginPermissionCommon.createPermission({
71
+ name: "kuadrant.apikeyrequest.delete.own",
72
+ attributes: { action: "delete" }
73
+ });
74
+ const kuadrantApiKeyRequestDeleteAllPermission = pluginPermissionCommon.createPermission({
75
+ name: "kuadrant.apikeyrequest.delete.all",
76
+ attributes: { action: "delete" }
77
+ });
66
78
  const kuadrantApiKeyReadOwnPermission = pluginPermissionCommon.createPermission({
67
79
  name: "kuadrant.apikey.read.own",
68
80
  attributes: { action: "read" }
@@ -94,7 +106,10 @@ const kuadrantPermissions = [
94
106
  kuadrantApiKeyRequestReadOwnPermission,
95
107
  kuadrantApiKeyRequestReadAllPermission,
96
108
  kuadrantApiKeyRequestUpdatePermission,
109
+ kuadrantApiKeyRequestUpdateOwnPermission,
97
110
  kuadrantApiKeyRequestListPermission,
111
+ kuadrantApiKeyRequestDeleteOwnPermission,
112
+ kuadrantApiKeyRequestDeleteAllPermission,
98
113
  kuadrantApiKeyReadOwnPermission,
99
114
  kuadrantApiKeyReadAllPermission,
100
115
  kuadrantApiKeyDeleteOwnPermission,
@@ -106,9 +121,12 @@ exports.kuadrantApiKeyDeleteOwnPermission = kuadrantApiKeyDeleteOwnPermission;
106
121
  exports.kuadrantApiKeyReadAllPermission = kuadrantApiKeyReadAllPermission;
107
122
  exports.kuadrantApiKeyReadOwnPermission = kuadrantApiKeyReadOwnPermission;
108
123
  exports.kuadrantApiKeyRequestCreatePermission = kuadrantApiKeyRequestCreatePermission;
124
+ exports.kuadrantApiKeyRequestDeleteAllPermission = kuadrantApiKeyRequestDeleteAllPermission;
125
+ exports.kuadrantApiKeyRequestDeleteOwnPermission = kuadrantApiKeyRequestDeleteOwnPermission;
109
126
  exports.kuadrantApiKeyRequestListPermission = kuadrantApiKeyRequestListPermission;
110
127
  exports.kuadrantApiKeyRequestReadAllPermission = kuadrantApiKeyRequestReadAllPermission;
111
128
  exports.kuadrantApiKeyRequestReadOwnPermission = kuadrantApiKeyRequestReadOwnPermission;
129
+ exports.kuadrantApiKeyRequestUpdateOwnPermission = kuadrantApiKeyRequestUpdateOwnPermission;
112
130
  exports.kuadrantApiKeyRequestUpdatePermission = kuadrantApiKeyRequestUpdatePermission;
113
131
  exports.kuadrantApiProductCreatePermission = kuadrantApiProductCreatePermission;
114
132
  exports.kuadrantApiProductDeletePermission = kuadrantApiProductDeletePermission;
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.cjs.js","sources":["../src/permissions.ts"],"sourcesContent":["import { createPermission } from '@backstage/plugin-permission-common';\n\n/**\n * Permission definitions for the Kuadrant plugin\n *\n * These permissions control access to PlanPolicy, APIProduct, APIKeyRequest,\n * and API key management within the Kuadrant Backstage plugin.\n *\n * Permissions are composable - use them to build custom roles beyond the\n * three reference personas (Platform Engineer, API Owner, API Consumer).\n */\n\n// planpolicy permissions (rate limit tiers)\nexport const kuadrantPlanPolicyCreatePermission = createPermission({\n name: 'kuadrant.planpolicy.create',\n attributes: { action: 'create' },\n});\n\nexport const kuadrantPlanPolicyReadPermission = createPermission({\n name: 'kuadrant.planpolicy.read',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantPlanPolicyUpdatePermission = createPermission({\n name: 'kuadrant.planpolicy.update',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPlanPolicyDeletePermission = createPermission({\n name: 'kuadrant.planpolicy.delete',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantPlanPolicyListPermission = createPermission({\n name: 'kuadrant.planpolicy.list',\n attributes: { action: 'read' },\n});\n\n// apiproduct permissions (catalog entries)\nexport const kuadrantApiProductCreatePermission = createPermission({\n name: 'kuadrant.apiproduct.create',\n attributes: { action: 'create' },\n});\n\nexport const kuadrantApiProductReadPermission = createPermission({\n name: 'kuadrant.apiproduct.read',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantApiProductUpdatePermission = createPermission({\n name: 'kuadrant.apiproduct.update',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantApiProductDeletePermission = createPermission({\n name: 'kuadrant.apiproduct.delete',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantApiProductListPermission = createPermission({\n name: 'kuadrant.apiproduct.list',\n attributes: { action: 'read' },\n});\n\n// apikeyrequest permissions (access requests)\nexport const kuadrantApiKeyRequestCreatePermission = createPermission({\n name: 'kuadrant.apikeyrequest.create',\n attributes: { action: 'create' },\n resourceType: 'apiproduct',\n});\n\nexport const kuadrantApiKeyRequestReadOwnPermission = createPermission({\n name: 'kuadrant.apikeyrequest.read.own',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantApiKeyRequestReadAllPermission = createPermission({\n name: 'kuadrant.apikeyrequest.read.all',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantApiKeyRequestUpdatePermission = createPermission({\n name: 'kuadrant.apikeyrequest.update',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantApiKeyRequestListPermission = createPermission({\n name: 'kuadrant.apikeyrequest.list',\n attributes: { action: 'read' },\n});\n\n// api key permissions (managed secrets)\nexport const kuadrantApiKeyReadOwnPermission = createPermission({\n name: 'kuadrant.apikey.read.own',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantApiKeyReadAllPermission = createPermission({\n name: 'kuadrant.apikey.read.all',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantApiKeyDeleteOwnPermission = createPermission({\n name: 'kuadrant.apikey.delete.own',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantApiKeyDeleteAllPermission = createPermission({\n name: 'kuadrant.apikey.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * All Kuadrant permissions as an array for easy iteration\n */\nexport const kuadrantPermissions = [\n kuadrantPlanPolicyCreatePermission,\n kuadrantPlanPolicyReadPermission,\n kuadrantPlanPolicyUpdatePermission,\n kuadrantPlanPolicyDeletePermission,\n kuadrantPlanPolicyListPermission,\n kuadrantApiProductCreatePermission,\n kuadrantApiProductReadPermission,\n kuadrantApiProductUpdatePermission,\n kuadrantApiProductDeletePermission,\n kuadrantApiProductListPermission,\n kuadrantApiKeyRequestCreatePermission,\n kuadrantApiKeyRequestReadOwnPermission,\n kuadrantApiKeyRequestReadAllPermission,\n kuadrantApiKeyRequestUpdatePermission,\n kuadrantApiKeyRequestListPermission,\n kuadrantApiKeyReadOwnPermission,\n kuadrantApiKeyReadAllPermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n];\n"],"names":["createPermission"],"mappings":"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"}
1
+ {"version":3,"file":"permissions.cjs.js","sources":["../src/permissions.ts"],"sourcesContent":["import { createPermission } from '@backstage/plugin-permission-common';\n\n/**\n * Permission definitions for the Kuadrant plugin\n *\n * These permissions control access to PlanPolicy, APIProduct, APIKeyRequest,\n * and API key management within the Kuadrant Backstage plugin.\n *\n * Permissions are composable - use them to build custom roles beyond the\n * three reference personas (Platform Engineer, API Owner, API Consumer).\n */\n\n// planpolicy permissions (rate limit tiers)\nexport const kuadrantPlanPolicyCreatePermission = createPermission({\n name: 'kuadrant.planpolicy.create',\n attributes: { action: 'create' },\n});\n\nexport const kuadrantPlanPolicyReadPermission = createPermission({\n name: 'kuadrant.planpolicy.read',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantPlanPolicyUpdatePermission = createPermission({\n name: 'kuadrant.planpolicy.update',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantPlanPolicyDeletePermission = createPermission({\n name: 'kuadrant.planpolicy.delete',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantPlanPolicyListPermission = createPermission({\n name: 'kuadrant.planpolicy.list',\n attributes: { action: 'read' },\n});\n\n// apiproduct permissions (catalog entries)\nexport const kuadrantApiProductCreatePermission = createPermission({\n name: 'kuadrant.apiproduct.create',\n attributes: { action: 'create' },\n});\n\nexport const kuadrantApiProductReadPermission = createPermission({\n name: 'kuadrant.apiproduct.read',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantApiProductUpdatePermission = createPermission({\n name: 'kuadrant.apiproduct.update',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantApiProductDeletePermission = createPermission({\n name: 'kuadrant.apiproduct.delete',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantApiProductListPermission = createPermission({\n name: 'kuadrant.apiproduct.list',\n attributes: { action: 'read' },\n});\n\n// apikeyrequest permissions (access requests)\nexport const kuadrantApiKeyRequestCreatePermission = createPermission({\n name: 'kuadrant.apikeyrequest.create',\n attributes: { action: 'create' },\n resourceType: 'apiproduct',\n});\n\nexport const kuadrantApiKeyRequestReadOwnPermission = createPermission({\n name: 'kuadrant.apikeyrequest.read.own',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantApiKeyRequestReadAllPermission = createPermission({\n name: 'kuadrant.apikeyrequest.read.all',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantApiKeyRequestUpdatePermission = createPermission({\n name: 'kuadrant.apikeyrequest.update',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantApiKeyRequestListPermission = createPermission({\n name: 'kuadrant.apikeyrequest.list',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantApiKeyRequestUpdateOwnPermission = createPermission({\n name: 'kuadrant.apikeyrequest.update.own',\n attributes: { action: 'update' },\n});\n\nexport const kuadrantApiKeyRequestDeleteOwnPermission = createPermission({\n name: 'kuadrant.apikeyrequest.delete.own',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantApiKeyRequestDeleteAllPermission = createPermission({\n name: 'kuadrant.apikeyrequest.delete.all',\n attributes: { action: 'delete' },\n});\n\n// api key permissions (managed secrets)\nexport const kuadrantApiKeyReadOwnPermission = createPermission({\n name: 'kuadrant.apikey.read.own',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantApiKeyReadAllPermission = createPermission({\n name: 'kuadrant.apikey.read.all',\n attributes: { action: 'read' },\n});\n\nexport const kuadrantApiKeyDeleteOwnPermission = createPermission({\n name: 'kuadrant.apikey.delete.own',\n attributes: { action: 'delete' },\n});\n\nexport const kuadrantApiKeyDeleteAllPermission = createPermission({\n name: 'kuadrant.apikey.delete.all',\n attributes: { action: 'delete' },\n});\n\n/**\n * All Kuadrant permissions as an array for easy iteration\n */\nexport const kuadrantPermissions = [\n kuadrantPlanPolicyCreatePermission,\n kuadrantPlanPolicyReadPermission,\n kuadrantPlanPolicyUpdatePermission,\n kuadrantPlanPolicyDeletePermission,\n kuadrantPlanPolicyListPermission,\n kuadrantApiProductCreatePermission,\n kuadrantApiProductReadPermission,\n kuadrantApiProductUpdatePermission,\n kuadrantApiProductDeletePermission,\n kuadrantApiProductListPermission,\n kuadrantApiKeyRequestCreatePermission,\n kuadrantApiKeyRequestReadOwnPermission,\n kuadrantApiKeyRequestReadAllPermission,\n kuadrantApiKeyRequestUpdatePermission,\n kuadrantApiKeyRequestUpdateOwnPermission,\n kuadrantApiKeyRequestListPermission,\n kuadrantApiKeyRequestDeleteOwnPermission,\n kuadrantApiKeyRequestDeleteAllPermission,\n kuadrantApiKeyReadOwnPermission,\n kuadrantApiKeyReadAllPermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n];\n"],"names":["createPermission"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"APIProductEntityProvider.cjs.js","sources":["../../src/providers/APIProductEntityProvider.ts"],"sourcesContent":["import { ApiEntity } from '@backstage/catalog-model';\nimport { EntityProvider, EntityProviderConnection } from '@backstage/plugin-catalog-node';\nimport { RootConfigService } from '@backstage/backend-plugin-api';\nimport { KuadrantK8sClient } from '../k8s-client';\n\ninterface APIProduct {\n apiVersion: string;\n kind: string;\n metadata: {\n name: string;\n namespace: string;\n uid: string;\n resourceVersion: string;\n creationTimestamp: string;\n annotations?: Record<string, string>;\n labels?: Record<string, string>;\n };\n spec: {\n displayName?: string;\n description?: string;\n version?: string;\n tags?: string[];\n publishStatus?: 'Draft' | 'Published';\n plans?: Array<{\n tier: string;\n description?: string;\n limits?: any;\n }>;\n planPolicyRef?: {\n name: string;\n namespace: string;\n };\n documentation?: {\n openAPISpec?: string;\n docsURL?: string;\n gitRepository?: string;\n techdocsRef?: string;\n };\n contact?: {\n team?: string;\n email?: string;\n slack?: string;\n };\n };\n}\n\nexport class APIProductEntityProvider implements EntityProvider {\n private readonly k8sClient: KuadrantK8sClient;\n private connection?: EntityProviderConnection;\n private readonly providerId = 'kuadrant-apiproduct-provider';\n\n constructor(config: RootConfigService) {\n console.log('apiproduct provider: constructor called');\n this.k8sClient = new KuadrantK8sClient(config);\n }\n\n getProviderName(): string {\n return this.providerId;\n }\n\n async connect(connection: EntityProviderConnection): Promise<void> {\n console.log('apiproduct provider: connect called');\n this.connection = connection;\n\n console.log('apiproduct provider: starting initial sync');\n // initial full sync\n await this.refresh();\n\n // schedule periodic refresh (every 30 seconds for development)\n // note: in production, consider 5-10 minutes to reduce api load\n console.log('apiproduct provider: scheduling periodic refresh every 30 seconds');\n setInterval(async () => {\n await this.refresh();\n }, 30 * 1000);\n }\n\n private async refresh(): Promise<void> {\n console.log('apiproduct provider: refresh called');\n if (!this.connection) {\n console.log('apiproduct provider: no connection, skipping refresh');\n return;\n }\n\n try {\n console.log('apiproduct provider: fetching apiproducts from kubernetes');\n // fetch all apiproducts from kubernetes\n const response = await this.k8sClient.listCustomResources(\n 'extensions.kuadrant.io',\n 'v1alpha1',\n 'apiproducts'\n );\n\n const apiProducts = (response.items || []) as APIProduct[];\n console.log(`apiproduct provider: found ${apiProducts.length} apiproducts`);\n\n // filter out Draft API products - only include Published ones\n const publishedProducts = apiProducts.filter(product => {\n const publishStatus = product.spec.publishStatus || 'Draft'; // default to Draft if not specified\n return publishStatus === 'Published';\n });\n console.log(`apiproduct provider: filtered to ${publishedProducts.length} published apiproducts (${apiProducts.length - publishedProducts.length} drafts excluded)`);\n\n // transform apiproducts to backstage api entities\n const entities = publishedProducts.map(product => this.transformToEntity(product));\n console.log(`apiproduct provider: transformed ${entities.length} entities`);\n\n // submit entities to catalog\n console.log('apiproduct provider: submitting entities to catalog');\n await this.connection.applyMutation({\n type: 'full',\n entities: entities.map(entity => ({\n entity,\n locationKey: `kuadrant-apiproduct:${entity.metadata.namespace}/${entity.metadata.name}`,\n })),\n });\n\n console.log(`apiproduct provider: synced ${entities.length} api products`);\n } catch (error) {\n console.error('error refreshing apiproduct entities:', error);\n }\n }\n\n private transformToEntity(product: APIProduct): ApiEntity {\n const namespace = product.metadata.namespace || 'default';\n const name = product.metadata.name;\n const displayName = product.spec.displayName || name;\n const description = product.spec.description || `api product: ${displayName}`;\n\n // determine lifecycle from labels or default to production\n const lifecycle = product.metadata.labels?.lifecycle || 'production';\n\n // determine owner from contact info or default to guests\n const owner = product.spec.contact?.team || 'guests';\n\n // build tags from product tags\n const tags = product.spec.tags || [];\n\n // create entity with proper backstage structure\n const entity: ApiEntity = {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'API',\n metadata: {\n name: `${name}`,\n namespace: 'default',\n title: displayName,\n description,\n annotations: {\n 'backstage.io/managed-by-location': `kuadrant:${namespace}/${name}`,\n 'backstage.io/managed-by-origin-location': `kuadrant:${namespace}/${name}`,\n 'backstage.io/orphan-strategy': 'keep',\n 'kuadrant.io/namespace': namespace,\n 'kuadrant.io/apiproduct': name,\n // add httproute annotation if we can infer it (usually same as apiproduct name without -api suffix)\n 'kuadrant.io/httproute': name.endsWith('-api') ? name.slice(0, -4) : name,\n ...(product.spec.documentation?.openAPISpec && {\n 'kuadrant.io/openapi-spec-url': product.spec.documentation.openAPISpec,\n }),\n ...(product.spec.documentation?.docsURL && {\n 'kuadrant.io/docs-url': product.spec.documentation.docsURL,\n }),\n ...(product.spec.documentation?.gitRepository && {\n 'backstage.io/source-location': `url:${product.spec.documentation.gitRepository}`,\n }),\n ...(product.spec.documentation?.techdocsRef && {\n 'backstage.io/techdocs-ref': product.spec.documentation.techdocsRef,\n }),\n ...(product.spec.contact?.email && {\n 'kuadrant.io/contact-email': product.spec.contact.email,\n }),\n ...(product.spec.contact?.slack && {\n 'kuadrant.io/contact-slack': product.spec.contact.slack,\n }),\n },\n tags: [...tags, 'kuadrant', 'apiproduct'],\n labels: {\n 'kuadrant.io/synced': 'true',\n ...(product.metadata.labels || {}),\n },\n },\n spec: {\n type: 'openapi',\n lifecycle,\n owner,\n definition: product.spec.documentation?.openAPISpec\n ? `# openapi spec available at: ${product.spec.documentation.openAPISpec}\\n\\nopenapi: 3.0.0\\ninfo:\\n title: ${displayName}\\n version: ${product.spec.version || '1.0.0'}\\n description: ${description}\\n`\n : `# no openapi spec configured\\n\\nopenapi: 3.0.0\\ninfo:\\n title: ${displayName}\\n version: ${product.spec.version || '1.0.0'}\\n description: ${description}\\n`,\n },\n };\n\n return entity;\n }\n}\n"],"names":["KuadrantK8sClient"],"mappings":"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"}
1
+ {"version":3,"file":"APIProductEntityProvider.cjs.js","sources":["../../src/providers/APIProductEntityProvider.ts"],"sourcesContent":["import { ApiEntity } from '@backstage/catalog-model';\nimport { EntityProvider, EntityProviderConnection } from '@backstage/plugin-catalog-node';\nimport { RootConfigService } from '@backstage/backend-plugin-api';\nimport { KuadrantK8sClient } from '../k8s-client';\n\ninterface APIProduct {\n apiVersion: string;\n kind: string;\n metadata: {\n name: string;\n namespace: string;\n uid: string;\n resourceVersion: string;\n creationTimestamp: string;\n annotations?: Record<string, string>;\n labels?: Record<string, string>;\n };\n spec: {\n displayName?: string;\n description?: string;\n version?: string;\n tags?: string[];\n publishStatus?: 'Draft' | 'Published';\n plans?: Array<{\n tier: string;\n description?: string;\n limits?: any;\n }>;\n planPolicyRef?: {\n name: string;\n namespace: string;\n };\n documentation?: {\n openAPISpec?: string;\n docsURL?: string;\n gitRepository?: string;\n techdocsRef?: string;\n };\n contact?: {\n team?: string;\n email?: string;\n slack?: string;\n };\n };\n}\n\nexport class APIProductEntityProvider implements EntityProvider {\n private readonly k8sClient: KuadrantK8sClient;\n private connection?: EntityProviderConnection;\n private readonly providerId = 'kuadrant-apiproduct-provider';\n\n constructor(config: RootConfigService) {\n console.log('apiproduct provider: constructor called');\n this.k8sClient = new KuadrantK8sClient(config);\n }\n\n getProviderName(): string {\n return this.providerId;\n }\n\n async connect(connection: EntityProviderConnection): Promise<void> {\n console.log('apiproduct provider: connect called');\n this.connection = connection;\n\n console.log('apiproduct provider: starting initial sync');\n // initial full sync\n await this.refresh();\n\n // schedule periodic refresh (every 30 seconds for development)\n // note: in production, consider 5-10 minutes to reduce api load\n console.log('apiproduct provider: scheduling periodic refresh every 30 seconds');\n setInterval(async () => {\n await this.refresh();\n }, 30 * 1000);\n }\n\n public async refresh(): Promise<void> {\n console.log('apiproduct provider: refresh called');\n if (!this.connection) {\n console.log('apiproduct provider: no connection, skipping refresh');\n return;\n }\n\n try {\n console.log('apiproduct provider: fetching apiproducts from kubernetes');\n // fetch all apiproducts from kubernetes\n const response = await this.k8sClient.listCustomResources(\n 'extensions.kuadrant.io',\n 'v1alpha1',\n 'apiproducts'\n );\n\n const apiProducts = (response.items || []) as APIProduct[];\n console.log(`apiproduct provider: found ${apiProducts.length} apiproducts`);\n\n // filter out Draft API products - only include Published ones\n const publishedProducts = apiProducts.filter(product => {\n const publishStatus = product.spec.publishStatus || 'Draft'; // default to Draft if not specified\n return publishStatus === 'Published';\n });\n console.log(`apiproduct provider: filtered to ${publishedProducts.length} published apiproducts (${apiProducts.length - publishedProducts.length} drafts excluded)`);\n\n // transform apiproducts to backstage api entities\n const entities = publishedProducts.map(product => this.transformToEntity(product));\n console.log(`apiproduct provider: transformed ${entities.length} entities`);\n\n // submit entities to catalog\n console.log('apiproduct provider: submitting entities to catalog');\n await this.connection.applyMutation({\n type: 'full',\n entities: entities.map(entity => ({\n entity,\n locationKey: `kuadrant-apiproduct:${entity.metadata.namespace}/${entity.metadata.name}`,\n })),\n });\n\n console.log(`apiproduct provider: synced ${entities.length} api products`);\n } catch (error) {\n console.error('error refreshing apiproduct entities:', error);\n }\n }\n\n private transformToEntity(product: APIProduct): ApiEntity {\n const namespace = product.metadata.namespace || 'default';\n const name = product.metadata.name;\n const displayName = product.spec.displayName || name;\n const description = product.spec.description || `api product: ${displayName}`;\n\n // determine lifecycle from labels or default to production\n const lifecycle = product.metadata.labels?.lifecycle || 'production';\n\n // determine owner from contact info or default to guests\n const owner = product.spec.contact?.team || 'guests';\n\n // build tags from product tags\n const tags = product.spec.tags || [];\n\n // create entity with proper backstage structure\n const entity: ApiEntity = {\n apiVersion: 'backstage.io/v1alpha1',\n kind: 'API',\n metadata: {\n name: `${name}`,\n namespace: 'default',\n title: displayName,\n description,\n annotations: {\n 'backstage.io/managed-by-location': `kuadrant:${namespace}/${name}`,\n 'backstage.io/managed-by-origin-location': `kuadrant:${namespace}/${name}`,\n 'backstage.io/orphan-strategy': 'keep',\n 'kuadrant.io/namespace': namespace,\n 'kuadrant.io/apiproduct': name,\n // add httproute annotation if we can infer it (usually same as apiproduct name without -api suffix)\n 'kuadrant.io/httproute': name.endsWith('-api') ? name.slice(0, -4) : name,\n ...(product.spec.documentation?.openAPISpec && {\n 'kuadrant.io/openapi-spec-url': product.spec.documentation.openAPISpec,\n }),\n ...(product.spec.documentation?.docsURL && {\n 'kuadrant.io/docs-url': product.spec.documentation.docsURL,\n }),\n ...(product.spec.documentation?.gitRepository && {\n 'backstage.io/source-location': `url:${product.spec.documentation.gitRepository}`,\n }),\n ...(product.spec.documentation?.techdocsRef && {\n 'backstage.io/techdocs-ref': product.spec.documentation.techdocsRef,\n }),\n ...(product.spec.contact?.email && {\n 'kuadrant.io/contact-email': product.spec.contact.email,\n }),\n ...(product.spec.contact?.slack && {\n 'kuadrant.io/contact-slack': product.spec.contact.slack,\n }),\n },\n tags: [...tags, 'kuadrant', 'apiproduct'],\n labels: {\n 'kuadrant.io/synced': 'true',\n ...(product.metadata.labels || {}),\n },\n },\n spec: {\n type: 'openapi',\n lifecycle,\n owner,\n definition: product.spec.documentation?.openAPISpec\n ? `# openapi spec available at: ${product.spec.documentation.openAPISpec}\\n\\nopenapi: 3.0.0\\ninfo:\\n title: ${displayName}\\n version: ${product.spec.version || '1.0.0'}\\n description: ${description}\\n`\n : `# no openapi spec configured\\n\\nopenapi: 3.0.0\\ninfo:\\n title: ${displayName}\\n version: ${product.spec.version || '1.0.0'}\\n description: ${description}\\n`,\n },\n };\n\n return entity;\n }\n}\n"],"names":["KuadrantK8sClient"],"mappings":"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"}
package/dist/rbac.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
+
3
+ /**
4
+ * backend module that registers kuadrant plugin id with rbac
5
+ * this makes kuadrant permissions discoverable in the rbac ui
6
+ *
7
+ * @public
8
+ */
9
+ declare const kuadrantRbacModule: _backstage_backend_plugin_api.BackendFeature;
10
+
11
+ export { kuadrantRbacModule as default, kuadrantRbacModule };