freelens-keda-extension 1.0.0 → 1.0.2

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/README.md CHANGED
@@ -172,6 +172,6 @@ Trusted Publishing / provenance).
172
172
 
173
173
  ## License
174
174
 
175
- MIT. The sidebar icon is the official KEDA logo
176
- ([`kedacore/keda` `images/logos/keda-icon-black.svg`](https://github.com/kedacore/keda/blob/main/images/logos/keda-icon-black.svg),
177
- Apache-2.0), recolored with `currentColor` so it follows the Freelens theme.
175
+ MIT. The sidebar icon is the official KEDA logo (Kubernetes-style heptagon with the KEDA
176
+ lettering, Apache-2.0), recolored with `currentColor` and with the white knockout converted
177
+ to an SVG mask so it follows the Freelens theme.
@@ -98,17 +98,31 @@ var ScaledObject = class ScaledObject extends require_extensions.Renderer.K8sApi
98
98
  return object.spec.cooldownPeriod;
99
99
  }
100
100
  /**
101
+ * Normalizes a status list field: KEDA versions differ on the JSON shape of
102
+ * these fields, recent releases write an array, older ones a comma-separated
103
+ * string ("cpu,memory"). An array passes through, a string is split, and a
104
+ * missing value yields the fallback (the spec-derived list, or empty).
105
+ */
106
+ static normalizeList(value, fallback) {
107
+ if (Array.isArray(value)) return value;
108
+ if (typeof value === "string") return value.split(",").map((item) => item.trim()).filter(Boolean);
109
+ return fallback;
110
+ }
111
+ /**
101
112
  * The TRIGGERS column of `kubectl get so`: the scaler types, preferring the
102
113
  * list the controller wrote into the status over the one in the spec.
103
114
  */
104
115
  static getTriggerTypes(object) {
105
- return object.status?.triggersTypes ?? object.spec.triggers.map((trigger) => trigger.type);
116
+ return ScaledObject.normalizeList(object.status?.triggersTypes, object.spec.triggers.map((trigger) => trigger.type));
106
117
  }
107
118
  static getTriggerSummary(object) {
108
119
  return ScaledObject.getTriggerTypes(object).join(", ");
109
120
  }
110
121
  static getAuthenticationTypes(object) {
111
- return object.status?.authenticationsTypes;
122
+ return ScaledObject.normalizeList(object.status?.authenticationsTypes, []);
123
+ }
124
+ static getExternalMetricNames(object) {
125
+ return ScaledObject.normalizeList(object.status?.externalMetricNames, []);
112
126
  }
113
127
  /**
114
128
  * Whether the `autoscaling.keda.sh/paused-replicas` annotation is present on
@@ -1 +1 @@
1
- {"version":3,"file":"scaledobject-v1.js","names":["Renderer"],"sources":["../../../../src/renderer/api/scaledobject/scaledobject-v1.ts"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\n\nimport type { KedaCondition, KedaKubeObjectCRD, ScaledObjectSpec, ScaledObjectStatus } from \"../types\";\n\nexport type { ScaledObjectSpec, ScaledObjectStatus };\n\n/**\n * A ScaledObject of `keda.sh/v1alpha1` (KEDA v2): declares how the KEDA\n * operator scales the referenced workload, and which scalers (triggers)\n * produce the metric values.\n */\nexport class ScaledObject extends Renderer.K8sApi.KubeObject<\n Renderer.K8sApi.KubeObjectMetadata,\n ScaledObjectStatus,\n ScaledObjectSpec\n> {\n static readonly kind = \"ScaledObject\";\n static readonly namespaced = true;\n static readonly apiBase = \"/apis/keda.sh/v1alpha1/scaledobjects\";\n\n static readonly crd: KedaKubeObjectCRD = {\n apiVersions: [\"keda.sh/v1alpha1\"],\n plural: \"scaledobjects\",\n singular: \"scaledobject\",\n shortNames: [\"so\"],\n title: \"Scaled Objects\",\n };\n\n static getCondition(object: ScaledObject, type: string): KedaCondition | undefined {\n return object.status?.conditions?.find((condition) => condition.type === type);\n }\n\n /**\n * The READY column of `kubectl get so`, from the Ready condition.\n */\n static getReady(object: ScaledObject): boolean | undefined {\n const condition = ScaledObject.getCondition(object, \"Ready\");\n if (condition?.status === \"True\") return true;\n if (condition?.status === \"False\") return false;\n return undefined;\n }\n\n /**\n * From the Active condition: whether a trigger currently reports activity.\n */\n static getActive(object: ScaledObject): boolean | undefined {\n const condition = ScaledObject.getCondition(object, \"Active\");\n if (condition?.status === \"True\") return true;\n if (condition?.status === \"False\") return false;\n return undefined;\n }\n\n /**\n * From the Fallback condition: whether the fallback replicas are in use.\n */\n static getFallback(object: ScaledObject): boolean | undefined {\n const condition = ScaledObject.getCondition(object, \"Fallback\");\n if (condition?.status === \"True\") return true;\n if (condition?.status === \"False\") return false;\n return undefined;\n }\n\n /**\n * From the Paused condition: whether the `autoscaling.keda.sh/paused-replicas`\n * annotation is in effect. The controller writes no Paused condition while\n * the object is not paused (an Unknown status means the same here).\n */\n static getPaused(object: ScaledObject): boolean | undefined {\n const condition = ScaledObject.getCondition(object, \"Paused\");\n if (condition?.status === \"True\") return true;\n if (condition?.status === \"False\") return false;\n return undefined;\n }\n\n /**\n * The STATUS column of `kubectl get so`, following the controller's\n * precedence: an error of the Ready condition wins, then Paused, Fallback,\n * Active and Ready.\n */\n static getStatusText(object: ScaledObject): string {\n if (ScaledObject.getReady(object) === false) {\n return ScaledObject.getCondition(object, \"Ready\")?.reason ?? \"Error\";\n }\n if (ScaledObject.getPaused(object)) return \"Paused\";\n if (ScaledObject.getFallback(object)) return \"Fallback\";\n if (ScaledObject.getActive(object)) return \"Active\";\n if (ScaledObject.getReady(object)) return \"Ready\";\n return \"Unknown\";\n }\n\n static getStatusClass(object: ScaledObject): string {\n if (ScaledObject.getReady(object) === false) return \"error\";\n if (ScaledObject.getFallback(object)) return \"warning\";\n if (ScaledObject.getPaused(object)) return \"info\";\n if (ScaledObject.getActive(object)) return \"success\";\n if (ScaledObject.getReady(object)) return \"success\";\n return \"\";\n }\n\n /**\n * The SCALETARGET column of `kubectl get so`: `kind/name`, preferring the\n * kind the controller resolved in the status over the one in the spec, and\n * defaulting to a Deployment.\n */\n static getScaleTarget(object: ScaledObject): string {\n const kind = object.status?.scaleTargetKind ?? object.spec.scaleTargetRef.kind ?? \"Deployment\";\n return `${kind}/${object.spec.scaleTargetRef.name}`;\n }\n\n static getScaleTargetName(object: ScaledObject): string {\n return object.spec.scaleTargetRef.name;\n }\n\n static getMin(object: ScaledObject): number | undefined {\n return object.spec.minReplicaCount;\n }\n\n static getMax(object: ScaledObject): number | undefined {\n return object.spec.maxReplicaCount;\n }\n\n static getPollingInterval(object: ScaledObject): number | undefined {\n return object.spec.pollingInterval;\n }\n\n static getCooldownPeriod(object: ScaledObject): number | undefined {\n return object.spec.cooldownPeriod;\n }\n\n /**\n * The TRIGGERS column of `kubectl get so`: the scaler types, preferring the\n * list the controller wrote into the status over the one in the spec.\n */\n static getTriggerTypes(object: ScaledObject): string[] {\n return object.status?.triggersTypes ?? object.spec.triggers.map((trigger) => trigger.type);\n }\n\n static getTriggerSummary(object: ScaledObject): string {\n return ScaledObject.getTriggerTypes(object).join(\", \");\n }\n\n static getAuthenticationTypes(object: ScaledObject): string[] | undefined {\n return object.status?.authenticationsTypes;\n }\n\n /**\n * Whether the `autoscaling.keda.sh/paused-replicas` annotation is present on\n * the object, which is what the pause/resume menu item writes.\n */\n static getPausedAnnotation(object: ScaledObject): boolean {\n return \"autoscaling.keda.sh/paused-replicas\" in (object.metadata.annotations ?? {});\n }\n}\n\nexport class ScaledObjectApi extends Renderer.K8sApi.KubeApi<ScaledObject> {}\n\n// `autoRegister: false` keeps the API out of the cluster's apiManager: the\n// \"Not Available\" page of `createAvailableVersionPage` relies on the apiBase\n// being found only when the cluster actually serves the CRD. The store below\n// is registered in the extension's `onActivate` instead.\nexport const scaledObjectApi = new ScaledObjectApi({\n objectConstructor: ScaledObject,\n autoRegister: false,\n});\n\nexport class ScaledObjectStore extends Renderer.K8sApi.KubeObjectStore<ScaledObject> {\n readonly api = scaledObjectApi;\n}\n\nexport const scaledObjectStore = new ScaledObjectStore();\n"],"mappings":"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"}
1
+ {"version":3,"file":"scaledobject-v1.js","names":["Renderer"],"sources":["../../../../src/renderer/api/scaledobject/scaledobject-v1.ts"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\n\nimport type { KedaCondition, KedaKubeObjectCRD, ScaledObjectSpec, ScaledObjectStatus } from \"../types\";\n\nexport type { ScaledObjectSpec, ScaledObjectStatus };\n\n/**\n * A ScaledObject of `keda.sh/v1alpha1` (KEDA v2): declares how the KEDA\n * operator scales the referenced workload, and which scalers (triggers)\n * produce the metric values.\n */\nexport class ScaledObject extends Renderer.K8sApi.KubeObject<\n Renderer.K8sApi.KubeObjectMetadata,\n ScaledObjectStatus,\n ScaledObjectSpec\n> {\n static readonly kind = \"ScaledObject\";\n static readonly namespaced = true;\n static readonly apiBase = \"/apis/keda.sh/v1alpha1/scaledobjects\";\n\n static readonly crd: KedaKubeObjectCRD = {\n apiVersions: [\"keda.sh/v1alpha1\"],\n plural: \"scaledobjects\",\n singular: \"scaledobject\",\n shortNames: [\"so\"],\n title: \"Scaled Objects\",\n };\n\n static getCondition(object: ScaledObject, type: string): KedaCondition | undefined {\n return object.status?.conditions?.find((condition) => condition.type === type);\n }\n\n /**\n * The READY column of `kubectl get so`, from the Ready condition.\n */\n static getReady(object: ScaledObject): boolean | undefined {\n const condition = ScaledObject.getCondition(object, \"Ready\");\n if (condition?.status === \"True\") return true;\n if (condition?.status === \"False\") return false;\n return undefined;\n }\n\n /**\n * From the Active condition: whether a trigger currently reports activity.\n */\n static getActive(object: ScaledObject): boolean | undefined {\n const condition = ScaledObject.getCondition(object, \"Active\");\n if (condition?.status === \"True\") return true;\n if (condition?.status === \"False\") return false;\n return undefined;\n }\n\n /**\n * From the Fallback condition: whether the fallback replicas are in use.\n */\n static getFallback(object: ScaledObject): boolean | undefined {\n const condition = ScaledObject.getCondition(object, \"Fallback\");\n if (condition?.status === \"True\") return true;\n if (condition?.status === \"False\") return false;\n return undefined;\n }\n\n /**\n * From the Paused condition: whether the `autoscaling.keda.sh/paused-replicas`\n * annotation is in effect. The controller writes no Paused condition while\n * the object is not paused (an Unknown status means the same here).\n */\n static getPaused(object: ScaledObject): boolean | undefined {\n const condition = ScaledObject.getCondition(object, \"Paused\");\n if (condition?.status === \"True\") return true;\n if (condition?.status === \"False\") return false;\n return undefined;\n }\n\n /**\n * The STATUS column of `kubectl get so`, following the controller's\n * precedence: an error of the Ready condition wins, then Paused, Fallback,\n * Active and Ready.\n */\n static getStatusText(object: ScaledObject): string {\n if (ScaledObject.getReady(object) === false) {\n return ScaledObject.getCondition(object, \"Ready\")?.reason ?? \"Error\";\n }\n if (ScaledObject.getPaused(object)) return \"Paused\";\n if (ScaledObject.getFallback(object)) return \"Fallback\";\n if (ScaledObject.getActive(object)) return \"Active\";\n if (ScaledObject.getReady(object)) return \"Ready\";\n return \"Unknown\";\n }\n\n static getStatusClass(object: ScaledObject): string {\n if (ScaledObject.getReady(object) === false) return \"error\";\n if (ScaledObject.getFallback(object)) return \"warning\";\n if (ScaledObject.getPaused(object)) return \"info\";\n if (ScaledObject.getActive(object)) return \"success\";\n if (ScaledObject.getReady(object)) return \"success\";\n return \"\";\n }\n\n /**\n * The SCALETARGET column of `kubectl get so`: `kind/name`, preferring the\n * kind the controller resolved in the status over the one in the spec, and\n * defaulting to a Deployment.\n */\n static getScaleTarget(object: ScaledObject): string {\n const kind = object.status?.scaleTargetKind ?? object.spec.scaleTargetRef.kind ?? \"Deployment\";\n return `${kind}/${object.spec.scaleTargetRef.name}`;\n }\n\n static getScaleTargetName(object: ScaledObject): string {\n return object.spec.scaleTargetRef.name;\n }\n\n static getMin(object: ScaledObject): number | undefined {\n return object.spec.minReplicaCount;\n }\n\n static getMax(object: ScaledObject): number | undefined {\n return object.spec.maxReplicaCount;\n }\n\n static getPollingInterval(object: ScaledObject): number | undefined {\n return object.spec.pollingInterval;\n }\n\n static getCooldownPeriod(object: ScaledObject): number | undefined {\n return object.spec.cooldownPeriod;\n }\n\n /**\n * Normalizes a status list field: KEDA versions differ on the JSON shape of\n * these fields, recent releases write an array, older ones a comma-separated\n * string (\"cpu,memory\"). An array passes through, a string is split, and a\n * missing value yields the fallback (the spec-derived list, or empty).\n */\n private static normalizeList(value: string | string[] | null | undefined, fallback: string[]): string[] {\n if (Array.isArray(value)) return value;\n if (typeof value === \"string\") {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n }\n return fallback;\n }\n\n /**\n * The TRIGGERS column of `kubectl get so`: the scaler types, preferring the\n * list the controller wrote into the status over the one in the spec.\n */\n static getTriggerTypes(object: ScaledObject): string[] {\n return ScaledObject.normalizeList(\n object.status?.triggersTypes,\n object.spec.triggers.map((trigger) => trigger.type),\n );\n }\n\n static getTriggerSummary(object: ScaledObject): string {\n return ScaledObject.getTriggerTypes(object).join(\", \");\n }\n\n static getAuthenticationTypes(object: ScaledObject): string[] {\n return ScaledObject.normalizeList(object.status?.authenticationsTypes, []);\n }\n\n static getExternalMetricNames(object: ScaledObject): string[] {\n return ScaledObject.normalizeList(object.status?.externalMetricNames, []);\n }\n\n /**\n * Whether the `autoscaling.keda.sh/paused-replicas` annotation is present on\n * the object, which is what the pause/resume menu item writes.\n */\n static getPausedAnnotation(object: ScaledObject): boolean {\n return \"autoscaling.keda.sh/paused-replicas\" in (object.metadata.annotations ?? {});\n }\n}\n\nexport class ScaledObjectApi extends Renderer.K8sApi.KubeApi<ScaledObject> {}\n\n// `autoRegister: false` keeps the API out of the cluster's apiManager: the\n// \"Not Available\" page of `createAvailableVersionPage` relies on the apiBase\n// being found only when the cluster actually serves the CRD. The store below\n// is registered in the extension's `onActivate` instead.\nexport const scaledObjectApi = new ScaledObjectApi({\n objectConstructor: ScaledObject,\n autoRegister: false,\n});\n\nexport class ScaledObjectStore extends Renderer.K8sApi.KubeObjectStore<ScaledObject> {\n readonly api = scaledObjectApi;\n}\n\nexport const scaledObjectStore = new ScaledObjectStore();\n"],"mappings":"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"}
@@ -113,7 +113,7 @@ var ScaledObjectDetails = observer(({ object }) => {
113
113
  }),
114
114
  /* @__PURE__ */ require_jsx_runtime.jsx(DrawerItem, {
115
115
  name: "External Metric Names",
116
- children: object.status?.externalMetricNames?.join(", ") ?? "-"
116
+ children: require_scaledobject_v1.ScaledObject.getExternalMetricNames(object).join(", ") || "-"
117
117
  }),
118
118
  /* @__PURE__ */ require_jsx_runtime.jsx(DrawerItem, {
119
119
  name: "Original Replica Count",
@@ -1 +1 @@
1
- {"version":3,"file":"scaled-object-details.js","names":["MobxReact","Renderer","_Fragment","stylesInline","ScaledObject","styles"],"sources":["../../../src/renderer/details/scaled-object-details.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport * as MobxReact from \"mobx-react\";\nimport { ScaledObject } from \"../api/scaledobject/scaledobject-v1\";\nimport styles from \"./scaled-object-details.module.scss\";\nimport stylesInline from \"./scaled-object-details.module.scss?inline\";\n\nconst { observer } = MobxReact;\n\nconst {\n Component: { Badge, DrawerItem },\n} = Renderer;\n\nexport type ScaledObjectDetailsProps = Renderer.Component.KubeObjectDetailsProps<ScaledObject>;\n\n/**\n * A core Event of the host, as the cluster's `/api/v1/events` store keeps it.\n * The v1 API exposes no typed event model, so the panel reads the few fields\n * it renders and treats the items as this structural type.\n */\ninterface HostEvent {\n type?: string;\n reason?: string;\n message?: string;\n count?: number;\n lastTimestamp?: string;\n firstTimestamp?: string;\n source?: {\n component?: string;\n };\n involvedObject?: {\n kind?: string;\n name?: string;\n namespace?: string;\n uid?: string;\n };\n}\n\n/** A store shaped like the host's event store: enough to read its items. */\ntype HostEventStore = { items: HostEvent[] };\n\nfunction conditionClass(status: string): string {\n switch (status) {\n case \"True\":\n return \"success\";\n case \"False\":\n return \"error\";\n default:\n return \"warning\";\n }\n}\n\n/** Whether an event involves this ScaledObject (kind, name, namespace, uid). */\nfunction eventInvolvesScaledObject(event: HostEvent, object: ScaledObject): boolean {\n const involved = event.involvedObject;\n if (involved?.kind !== \"ScaledObject\") return false;\n if (involved.name !== object.getName()) return false;\n if (involved.namespace !== object.getNs()) return false;\n // Defensive: only when the event carries a uid, require it to match.\n if (involved.uid && involved.uid !== object.getId()) return false;\n return true;\n}\n\n/** Milliseconds of an event's lastTimestamp, or 0 when absent/unparsable. */\nfunction eventTime(event: HostEvent): number {\n if (!event.lastTimestamp) return 0;\n const parsed = Date.parse(event.lastTimestamp);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\n\nexport const ScaledObjectDetails = observer(({ object }: ScaledObjectDetailsProps) => {\n const conditions = object.status?.conditions;\n const triggers = object.spec.triggers ?? [];\n const fallback = object.spec.fallback;\n\n // The host keeps the cluster's core events in its apiManager under the\n // events apiBase; the store resolves only while the cluster serves it. The\n // panel is an observer, so it renders again when new events arrive.\n let eventsStore: HostEventStore | undefined;\n try {\n eventsStore = Renderer.K8sApi.apiManager.getStore(\"/api/v1/events\") as unknown as HostEventStore | undefined;\n } catch {\n eventsStore = undefined;\n }\n\n const events = (eventsStore?.items ?? [])\n .filter((event) => eventInvolvesScaledObject(event, object))\n .sort((a, b) => eventTime(b) - eventTime(a))\n .slice(0, 20);\n\n return (\n <>\n <style>{stylesInline}</style>\n <DrawerItem name=\"Scale Target\">\n {ScaledObject.getScaleTarget(object)}\n {object.spec.scaleTargetRef.apiVersion ? ` (${object.spec.scaleTargetRef.apiVersion})` : \"\"}\n </DrawerItem>\n <DrawerItem name=\"Min Replicas\">{object.spec.minReplicaCount ?? \"-\"}</DrawerItem>\n <DrawerItem name=\"Max Replicas\">{object.spec.maxReplicaCount ?? \"-\"}</DrawerItem>\n <DrawerItem name=\"Polling Interval\">\n {object.spec.pollingInterval !== undefined ? `${object.spec.pollingInterval}s` : \"-\"}\n </DrawerItem>\n <DrawerItem name=\"Cooldown Period\">\n {object.spec.cooldownPeriod !== undefined ? `${object.spec.cooldownPeriod}s` : \"-\"}\n </DrawerItem>\n <DrawerItem name=\"Idle Replica Count\">{object.spec.idleReplicaCount ?? \"-\"}</DrawerItem>\n <DrawerItem name=\"Initial Cooldown Period\">\n {object.spec.initialCooldownPeriod !== undefined ? `${object.spec.initialCooldownPeriod}s` : \"-\"}\n </DrawerItem>\n <DrawerItem name=\"Restore To Original\">\n {object.spec.advanced?.restoreToOriginalReplicaCount !== undefined\n ? String(object.spec.advanced.restoreToOriginalReplicaCount)\n : \"-\"}\n </DrawerItem>\n <DrawerItem name=\"Triggers\" labelsOnly hidden={triggers.length === 0}>\n {triggers.map((trigger, index) => (\n <DrawerItem\n key={`${trigger.type}-${trigger.name ?? index}`}\n name={\n <>\n <Badge label={trigger.type} /> {trigger.name}\n </>\n }\n >\n {trigger.metadata &&\n Object.entries(trigger.metadata).map(([key, value]) => (\n <DrawerItem key={key} name={key}>\n {value}\n </DrawerItem>\n ))}\n {trigger.authenticationRef && (\n <DrawerItem name=\"Authentication Ref\">\n {trigger.authenticationRef.kind ?? \"TriggerAuthentication\"}/{trigger.authenticationRef.name}\n </DrawerItem>\n )}\n </DrawerItem>\n ))}\n </DrawerItem>\n <DrawerItem name=\"Fallback\">\n {fallback\n ? `enabled (failureThreshold: ${fallback.failureThreshold}, replicas: ${fallback.replicas})`\n : \"Disabled\"}\n </DrawerItem>\n <DrawerItem name=\"Conditions\" labelsOnly hidden={!conditions?.length}>\n {conditions?.map((condition, index) => (\n <Badge\n key={condition.type + index}\n label={condition.reason || condition.type}\n className={conditionClass(condition.status)}\n tooltip={condition.message}\n />\n ))}\n </DrawerItem>\n <DrawerItem name=\"External Metric Names\">{object.status?.externalMetricNames?.join(\", \") ?? \"-\"}</DrawerItem>\n <DrawerItem name=\"Original Replica Count\">{object.status?.originalReplicaCount ?? \"-\"}</DrawerItem>\n <DrawerItem name=\"Last Active Time\">{object.status?.lastActiveTime ?? \"-\"}</DrawerItem>\n <DrawerItem name=\"Paused\">{ScaledObject.getPausedAnnotation(object) ? \"Yes\" : \"No\"}</DrawerItem>\n {eventsStore && (\n <DrawerItem name=\"Scaling Events\">\n {events.length === 0 ? (\n \"No events\"\n ) : (\n <table className={styles.eventsTable}>\n <thead>\n <tr>\n <th className={styles.eventsType}>Type</th>\n <th className={styles.eventsReason}>Reason</th>\n <th className={styles.eventsMessage}>Message</th>\n <th className={styles.eventsCount}>Count</th>\n <th className={styles.eventsLastSeen}>Last Seen</th>\n </tr>\n </thead>\n <tbody>\n {events.map((event, index) => (\n <tr key={`${event.reason ?? \"event\"}-${event.count ?? 0}-${index}`}>\n <td>\n <Badge label={event.type ?? \"Normal\"} className={event.type === \"Warning\" ? \"warning\" : \"\"} />\n </td>\n <td>{event.reason ?? \"-\"}</td>\n <td className={styles.eventsMessage}>{event.message ?? \"-\"}</td>\n <td>{event.count ?? 1}</td>\n <td>{event.lastTimestamp ?? event.firstTimestamp ?? \"-\"}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </DrawerItem>\n )}\n </>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"scaled-object-details.js","names":["MobxReact","Renderer","_Fragment","stylesInline","ScaledObject","styles"],"sources":["../../../src/renderer/details/scaled-object-details.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport * as MobxReact from \"mobx-react\";\nimport { ScaledObject } from \"../api/scaledobject/scaledobject-v1\";\nimport styles from \"./scaled-object-details.module.scss\";\nimport stylesInline from \"./scaled-object-details.module.scss?inline\";\n\nconst { observer } = MobxReact;\n\nconst {\n Component: { Badge, DrawerItem },\n} = Renderer;\n\nexport type ScaledObjectDetailsProps = Renderer.Component.KubeObjectDetailsProps<ScaledObject>;\n\n/**\n * A core Event of the host, as the cluster's `/api/v1/events` store keeps it.\n * The v1 API exposes no typed event model, so the panel reads the few fields\n * it renders and treats the items as this structural type.\n */\ninterface HostEvent {\n type?: string;\n reason?: string;\n message?: string;\n count?: number;\n lastTimestamp?: string;\n firstTimestamp?: string;\n source?: {\n component?: string;\n };\n involvedObject?: {\n kind?: string;\n name?: string;\n namespace?: string;\n uid?: string;\n };\n}\n\n/** A store shaped like the host's event store: enough to read its items. */\ntype HostEventStore = { items: HostEvent[] };\n\nfunction conditionClass(status: string): string {\n switch (status) {\n case \"True\":\n return \"success\";\n case \"False\":\n return \"error\";\n default:\n return \"warning\";\n }\n}\n\n/** Whether an event involves this ScaledObject (kind, name, namespace, uid). */\nfunction eventInvolvesScaledObject(event: HostEvent, object: ScaledObject): boolean {\n const involved = event.involvedObject;\n if (involved?.kind !== \"ScaledObject\") return false;\n if (involved.name !== object.getName()) return false;\n if (involved.namespace !== object.getNs()) return false;\n // Defensive: only when the event carries a uid, require it to match.\n if (involved.uid && involved.uid !== object.getId()) return false;\n return true;\n}\n\n/** Milliseconds of an event's lastTimestamp, or 0 when absent/unparsable. */\nfunction eventTime(event: HostEvent): number {\n if (!event.lastTimestamp) return 0;\n const parsed = Date.parse(event.lastTimestamp);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\n\nexport const ScaledObjectDetails = observer(({ object }: ScaledObjectDetailsProps) => {\n const conditions = object.status?.conditions;\n const triggers = object.spec.triggers ?? [];\n const fallback = object.spec.fallback;\n\n // The host keeps the cluster's core events in its apiManager under the\n // events apiBase; the store resolves only while the cluster serves it. The\n // panel is an observer, so it renders again when new events arrive.\n let eventsStore: HostEventStore | undefined;\n try {\n eventsStore = Renderer.K8sApi.apiManager.getStore(\"/api/v1/events\") as unknown as HostEventStore | undefined;\n } catch {\n eventsStore = undefined;\n }\n\n const events = (eventsStore?.items ?? [])\n .filter((event) => eventInvolvesScaledObject(event, object))\n .sort((a, b) => eventTime(b) - eventTime(a))\n .slice(0, 20);\n\n return (\n <>\n <style>{stylesInline}</style>\n <DrawerItem name=\"Scale Target\">\n {ScaledObject.getScaleTarget(object)}\n {object.spec.scaleTargetRef.apiVersion ? ` (${object.spec.scaleTargetRef.apiVersion})` : \"\"}\n </DrawerItem>\n <DrawerItem name=\"Min Replicas\">{object.spec.minReplicaCount ?? \"-\"}</DrawerItem>\n <DrawerItem name=\"Max Replicas\">{object.spec.maxReplicaCount ?? \"-\"}</DrawerItem>\n <DrawerItem name=\"Polling Interval\">\n {object.spec.pollingInterval !== undefined ? `${object.spec.pollingInterval}s` : \"-\"}\n </DrawerItem>\n <DrawerItem name=\"Cooldown Period\">\n {object.spec.cooldownPeriod !== undefined ? `${object.spec.cooldownPeriod}s` : \"-\"}\n </DrawerItem>\n <DrawerItem name=\"Idle Replica Count\">{object.spec.idleReplicaCount ?? \"-\"}</DrawerItem>\n <DrawerItem name=\"Initial Cooldown Period\">\n {object.spec.initialCooldownPeriod !== undefined ? `${object.spec.initialCooldownPeriod}s` : \"-\"}\n </DrawerItem>\n <DrawerItem name=\"Restore To Original\">\n {object.spec.advanced?.restoreToOriginalReplicaCount !== undefined\n ? String(object.spec.advanced.restoreToOriginalReplicaCount)\n : \"-\"}\n </DrawerItem>\n <DrawerItem name=\"Triggers\" labelsOnly hidden={triggers.length === 0}>\n {triggers.map((trigger, index) => (\n <DrawerItem\n key={`${trigger.type}-${trigger.name ?? index}`}\n name={\n <>\n <Badge label={trigger.type} /> {trigger.name}\n </>\n }\n >\n {trigger.metadata &&\n Object.entries(trigger.metadata).map(([key, value]) => (\n <DrawerItem key={key} name={key}>\n {value}\n </DrawerItem>\n ))}\n {trigger.authenticationRef && (\n <DrawerItem name=\"Authentication Ref\">\n {trigger.authenticationRef.kind ?? \"TriggerAuthentication\"}/{trigger.authenticationRef.name}\n </DrawerItem>\n )}\n </DrawerItem>\n ))}\n </DrawerItem>\n <DrawerItem name=\"Fallback\">\n {fallback\n ? `enabled (failureThreshold: ${fallback.failureThreshold}, replicas: ${fallback.replicas})`\n : \"Disabled\"}\n </DrawerItem>\n <DrawerItem name=\"Conditions\" labelsOnly hidden={!conditions?.length}>\n {conditions?.map((condition, index) => (\n <Badge\n key={condition.type + index}\n label={condition.reason || condition.type}\n className={conditionClass(condition.status)}\n tooltip={condition.message}\n />\n ))}\n </DrawerItem>\n <DrawerItem name=\"External Metric Names\">\n {ScaledObject.getExternalMetricNames(object).join(\", \") || \"-\"}\n </DrawerItem>\n <DrawerItem name=\"Original Replica Count\">{object.status?.originalReplicaCount ?? \"-\"}</DrawerItem>\n <DrawerItem name=\"Last Active Time\">{object.status?.lastActiveTime ?? \"-\"}</DrawerItem>\n <DrawerItem name=\"Paused\">{ScaledObject.getPausedAnnotation(object) ? \"Yes\" : \"No\"}</DrawerItem>\n {eventsStore && (\n <DrawerItem name=\"Scaling Events\">\n {events.length === 0 ? (\n \"No events\"\n ) : (\n <table className={styles.eventsTable}>\n <thead>\n <tr>\n <th className={styles.eventsType}>Type</th>\n <th className={styles.eventsReason}>Reason</th>\n <th className={styles.eventsMessage}>Message</th>\n <th className={styles.eventsCount}>Count</th>\n <th className={styles.eventsLastSeen}>Last Seen</th>\n </tr>\n </thead>\n <tbody>\n {events.map((event, index) => (\n <tr key={`${event.reason ?? \"event\"}-${event.count ?? 0}-${index}`}>\n <td>\n <Badge label={event.type ?? \"Normal\"} className={event.type === \"Warning\" ? \"warning\" : \"\"} />\n </td>\n <td>{event.reason ?? \"-\"}</td>\n <td className={styles.eventsMessage}>{event.message ?? \"-\"}</td>\n <td>{event.count ?? 1}</td>\n <td>{event.lastTimestamp ?? event.firstTimestamp ?? \"-\"}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </DrawerItem>\n )}\n </>\n );\n});\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  // src/renderer/icons/keda.svg?raw
2
- var keda_default = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 625 625\">\n <defs>\n <mask id=\"keda-letters\" maskUnits=\"userSpaceOnUse\">\n <rect width=\"625\" height=\"625\" fill=\"#fff\" />\n <polygon\n fill=\"#000\"\n points=\"446.7,363.3 451.6,354.6 432.8,354.6 438.4,315.5 438.1,315 408.3,369 407.4,370.6 426.5,370.4 421.5,408.9 421.6,409.4 444.7,367.1 444.6,367.1\"\n />\n <path fill=\"#fff\" d=\"M444.7,367.1l6.9-12.5h-18.8l5.9-40.5l-29.3,53h-6.5l34-63.7l34,63.7L444.7,367.1z\" />\n </mask>\n </defs>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"30\"\n d=\"M522.2,172.9c-1.9-5.4-6.3-10.4-12.4-13.6L318.8,68.7l-0.1-0.1c-2.1-1-5.1-1.6-9-1.6c-3.6,0-5.1,0-7,0.1c-1.3,0.1-2.6,0.2-3.9,0.4l-189.7,90.5l-0.2,0.1c-5.3,2.4-9.2,7.1-10.5,12.8L51.5,374.8c-1,6.2,0.5,12.6,4.1,17.8l131.5,161c5,4.7,11.4,7.6,18.3,8.2h211.1l0.8,0.1c5.8,0.6,11.3-1.9,15.2-7.1l0.2-0.3l132.3-162c3.7-5.3,5.3-11.8,4.7-18.2L522.2,172.9z\"\n />\n <g fill=\"currentColor\">\n <circle cx=\"438\" cy=\"553\" r=\"39\" />\n <circle cx=\"196\" cy=\"553\" r=\"39\" />\n <circle cx=\"307\" cy=\"73\" r=\"39\" />\n <circle cx=\"518\" cy=\"165\" r=\"39\" />\n <circle cx=\"100\" cy=\"165\" r=\"39\" />\n <circle cx=\"567\" cy=\"384\" r=\"39\" />\n <circle cx=\"59\" cy=\"384\" r=\"39\" />\n <g mask=\"url(#keda-letters)\">\n <path\n d=\"M195.8,367l-23-41.1l-6.9,7.1v34h-18v-89.9h18v29l26.3-29h24.3L185,312.3l32.2,54.7H195.8z M295.7,277.1v18h-60v-18H295.7z M235.7,329.8v-18h49.7v18H235.7z M235.7,367.1v-18h59.6v18H235.7z M314.1,277.1h25.4c11.9-0.1,23.3,4.6,31.7,13.1c4.2,4.1,7.4,9,9.6,14.4c4.8,11.2,4.8,23.9,0,35c-2.2,5.4-5.4,10.2-9.6,14.2c-8.4,8.4-19.8,13.2-31.7,13.2h-18V367h-7.3L314.1,277.1z M332.1,349.1h7.5c14.9,0,27-12.1,27-27s-12.1-27-27-27l0,0h-7.5V349.1z M434.7,277.1h5.3l42.5,90h-19.9l-25.7-54.7L409,367.1h-20.2L434.7,277.1z\"\n />\n </g>\n </g>\n</svg>\n";
2
+ var keda_default = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"20 34 586 558\">\n <g transform=\"translate(20.000000, 34.000000)\">\n <g transform=\"translate(16.000000, 18.000000)\">\n <path d=\"M486.244672,120.896665 C484.376746,115.462531 479.964514,110.54997 473.883129,107.268203 L282.770169,16.7096327 L282.655314,16.652786 C280.589058,15.630104 277.581077,15.1046512 273.627273,15.1046512 C270.073773,15.1046512 268.485666,15.1281146 266.658318,15.2345188 C265.170733,15.321139 263.894462,15.4581224 262.808945,15.6458625 L73.086245,106.161412 L72.9177436,106.240523 C67.4973603,108.744459 63.8151513,113.179346 62.4131023,119.022059 L15.4749911,322.841987 C14.4490325,329.07767 15.8874543,335.279846 19.5967327,340.586198 L151.080297,501.582508 C156.01892,506.229077 162.862619,509.310252 169.36094,509.790698 L380.458791,509.790698 L381.276289,509.880612 C387.076497,510.518564 392.601291,508.001119 396.438031,502.822102 L396.648934,502.537415 L528.912176,340.586421 C532.561202,335.365345 534.176834,329.028028 533.557738,322.409007 L486.244671,120.896662 Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"30\"/>\n </g>\n <g transform=\"translate(125.000000, 243.000000)\">\n <polygon points=\"0 78 96 78 48 0\" fill=\"currentColor\"/>\n <mask id=\"keda-icon-knockout\" maskUnits=\"userSpaceOnUse\">\n <rect x=\"0\" y=\"0\" width=\"600\" height=\"200\" fill=\"white\"/>\n <polygon points=\"302.004425 40 296.566095 77.5 313.96875 77.5 284.964325 130 290.402655 92.5 273 92.5\" fill=\"black\"/>\n </mask>\n <g mask=\"url(#keda-icon-knockout)\">\n <path d=\"M49.7310407,89.9714693 L25.8654742,48.8416548 L18.6658062,55.9108417 L18.6658062,89.9714693 L0,89.9714693 L0,0 L18.6658062,0 L18.6658062,29.0479315 L45.9978794,0 L71.1967178,0 L38.531557,35.2174037 L71.9966809,89.9714693 L49.7310407,89.9714693 Z M153.467925,0 L153.467925,17.9942939 L91.2041287,17.9942939 L91.2041287,0 L153.467925,0 Z M91.2041287,52.6975749 L91.2041287,34.703281 L142.80175,34.703281 L142.80175,52.6975749 L91.2041287,52.6975749 Z M91.2041287,90.1 L91.2041287,72.1057061 L153.067943,72.1057061 L153.067943,90.1 L91.2041287,90.1 Z M172.675373,0 L199.074156,0 C205.340534,0 211.473584,1.15677603 217.206653,3.4703281 C222.806395,5.78388017 227.739501,8.99714693 232.005971,13.1101284 C236.405768,17.3516405 239.738948,22.1072753 242.00551,27.5055635 C244.538727,33.0323823 245.738671,38.9447932 245.738671,44.9857347 C245.738671,51.1552068 244.538727,57.0676177 242.00551,62.5944365 C239.738948,67.9927247 236.405768,72.7483595 232.005971,76.8613409 C227.739501,80.9743224 222.806395,84.3161198 217.206653,86.5011412 C211.473584,88.943224 205.340534,90.1 199.074156,90.1 L180.275022,90.1 L180.275022,89.9714693 L172.675373,89.9714693 L172.675373,0 Z M191.341179,72.1057061 L199.074156,72.1057061 C214.540109,72.1057061 227.072865,59.8952924 227.072865,44.9857347 C227.072865,30.0761769 214.540109,17.9942939 199.074156,17.9942939 L191.341179,17.9942939 L191.341179,72.1057061 Z M297.877934,0 L303.344349,0 L347.475648,90.1 L326.809934,90.1 L300.144496,35.3459344 L271.212497,90.1 L250.280128,90.1 L297.877934,0 Z\" fill=\"currentColor\"/>\n </g>\n </g>\n <g fill=\"currentColor\">\n <circle cx=\"418\" cy=\"519\" r=\"39\"/>\n <circle cx=\"176\" cy=\"519\" r=\"39\"/>\n <circle cx=\"287\" cy=\"39\" r=\"39\"/>\n <circle cx=\"498\" cy=\"131\" r=\"39\"/>\n <circle cx=\"80\" cy=\"131\" r=\"39\"/>\n <circle cx=\"547\" cy=\"350\" r=\"39\"/>\n <circle cx=\"39\" cy=\"350\" r=\"39\"/>\n </g>\n </g>\n</svg>\n";
3
3
  exports.default = keda_default;
4
4
 
5
5
  //# sourceMappingURL=keda.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "freelens-keda-extension",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Freelens extension for KEDA",
5
5
  "repository": {
6
6
  "type": "git",