From 3c16777784b5aba68208ef632f0f93566f937d91 Mon Sep 17 00:00:00 2001 From: Sami Tiilikainen <97873007+samitiilikainen@users.noreply.github.com> Date: Thu, 1 Jun 2023 12:10:28 +0300 Subject: [PATCH] Extract pod metrics and cluster frame context Signed-off-by: Sami Tiilikainen <97873007+samitiilikainen@users.noreply.github.com> --- package-lock.json | 20 +++++++++ packages/cluster-frame-context/.eslintrc.js | 6 +++ packages/cluster-frame-context/.prettierrc | 1 + packages/cluster-frame-context/CHANGELOG.md | 4 ++ packages/cluster-frame-context/index.ts | 2 + packages/cluster-frame-context/jest.config.js | 1 + packages/cluster-frame-context/package.json | 44 +++++++++++++++++++ packages/cluster-frame-context/src/token.ts | 10 +++++ .../src/types.ts} | 8 ---- packages/cluster-frame-context/tsconfig.json | 4 ++ .../cluster-frame-context/webpack.config.js | 1 + packages/core/package.json | 2 + .../src/common/k8s-api/kube-object.store.ts | 2 +- .../core/src/extensions/common-api/k8s-api.ts | 2 +- ...for-cluster-scoped-resources.injectable.ts | 4 +- .../for-namespaced-resources.injectable.ts | 2 +- .../kube-object-list-layout.tsx | 2 +- .../namespace-select-filter-model.tsx | 2 +- .../namespaces/namespace-select.tsx | 2 +- .../workloads-overview/overview.tsx | 2 +- .../renderer/kube-watch-api/kube-watch-api.ts | 2 +- .../pod-metrics-api-injection-token.ts | 10 +++++ .../specifics/pod-metrics.api.injectable.ts | 4 +- .../pod-metrics.kube-api.injectable.ts | 15 +++++++ 24 files changed, 133 insertions(+), 19 deletions(-) create mode 100644 packages/cluster-frame-context/.eslintrc.js create mode 100644 packages/cluster-frame-context/.prettierrc create mode 100644 packages/cluster-frame-context/CHANGELOG.md create mode 100644 packages/cluster-frame-context/index.ts create mode 100644 packages/cluster-frame-context/jest.config.js create mode 100644 packages/cluster-frame-context/package.json create mode 100644 packages/cluster-frame-context/src/token.ts rename packages/{core/src/renderer/cluster-frame-context/cluster-frame-context.ts => cluster-frame-context/src/types.ts} (62%) mode change 100755 => 100644 create mode 100644 packages/cluster-frame-context/tsconfig.json create mode 100644 packages/cluster-frame-context/webpack.config.js create mode 100644 packages/utility-features/kube-api-specifics/src/specifics/pod-metrics-api-injection-token.ts create mode 100644 packages/utility-features/kube-api-specifics/src/specifics/pod-metrics.kube-api.injectable.ts diff --git a/package-lock.json b/package-lock.json index 552593e91c..4802c0680a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3711,6 +3711,10 @@ "resolved": "packages/ui-components/button", "link": true }, + "node_modules/@k8slens/cluster-frame-context": { + "resolved": "packages/cluster-frame-context", + "link": true + }, "node_modules/@k8slens/cluster-settings": { "resolved": "packages/cluster-settings", "link": true @@ -34177,6 +34181,20 @@ "react": "^17 || ^18" } }, + "packages/cluster-frame-context": { + "version": "1.0.0-alpha.1", + "license": "MIT", + "devDependencies": { + "@k8slens/eslint-config": "^6.5.0-alpha.3", + "@k8slens/jest": "^6.5.0-alpha.5", + "@k8slens/typescript": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.5" + }, + "peerDependencies": { + "@ogre-tools/injectable": "^17.2.0", + "react": "^17.0.2" + } + }, "packages/cluster-settings": { "name": "@k8slens/cluster-settings", "version": "6.5.0", @@ -34326,11 +34344,13 @@ "@k8slens/application": "^6.5.0-alpha.0", "@k8slens/application-for-electron-main": "^6.5.0-alpha.0", "@k8slens/button": "^1.0.0-alpha.5", + "@k8slens/cluster-frame-context": "^1.0.0-alpha.1", "@k8slens/cluster-settings": "^6.5.0-alpha.1", "@k8slens/cluster-sidebar": "^1.0.0", "@k8slens/error-boundary": "^1.0.0-alpha.5", "@k8slens/event-emitter": "^1.0.0-alpha.1", "@k8slens/icon": "^1.0.0-alpha.7", + "@k8slens/json-api": "^1.0.0-alpha.3", "@k8slens/kube-api": "^1.0.0-alpha.1", "@k8slens/kube-api-specifics": "^1.0.0-alpha.1", "@k8slens/kube-object": "^1.0.0-alpha.5", diff --git a/packages/cluster-frame-context/.eslintrc.js b/packages/cluster-frame-context/.eslintrc.js new file mode 100644 index 0000000000..19a14e85a4 --- /dev/null +++ b/packages/cluster-frame-context/.eslintrc.js @@ -0,0 +1,6 @@ +module.exports = { + extends: "@k8slens/eslint-config/eslint", + parserOptions: { + project: "./tsconfig.json", + }, +}; \ No newline at end of file diff --git a/packages/cluster-frame-context/.prettierrc b/packages/cluster-frame-context/.prettierrc new file mode 100644 index 0000000000..edd47b479e --- /dev/null +++ b/packages/cluster-frame-context/.prettierrc @@ -0,0 +1 @@ +"@k8slens/eslint-config/prettier" diff --git a/packages/cluster-frame-context/CHANGELOG.md b/packages/cluster-frame-context/CHANGELOG.md new file mode 100644 index 0000000000..e4d87c4d45 --- /dev/null +++ b/packages/cluster-frame-context/CHANGELOG.md @@ -0,0 +1,4 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. diff --git a/packages/cluster-frame-context/index.ts b/packages/cluster-frame-context/index.ts new file mode 100644 index 0000000000..a082c89278 --- /dev/null +++ b/packages/cluster-frame-context/index.ts @@ -0,0 +1,2 @@ +export { clusterFrameContextForClusterScopedResourcesInjectionToken } from "./src/token"; +export type { ClusterContext } from "./src/types"; diff --git a/packages/cluster-frame-context/jest.config.js b/packages/cluster-frame-context/jest.config.js new file mode 100644 index 0000000000..38d54ab7b6 --- /dev/null +++ b/packages/cluster-frame-context/jest.config.js @@ -0,0 +1 @@ +module.exports = require("@k8slens/jest").monorepoPackageConfig(__dirname).configForReact; diff --git a/packages/cluster-frame-context/package.json b/packages/cluster-frame-context/package.json new file mode 100644 index 0000000000..db4c3b00f9 --- /dev/null +++ b/packages/cluster-frame-context/package.json @@ -0,0 +1,44 @@ +{ + "name": "@k8slens/cluster-frame-context", + "private": false, + "version": "1.0.0-alpha.1", + "description": "Injection tokens for cluster frame context", + "type": "commonjs", + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + }, + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/lensapp/lens.git" + }, + "main": "dist/index.js", + "types": "dist/index.d.ts", + "author": { + "name": "OpenLens Authors", + "email": "info@k8slens.dev" + }, + "license": "MIT", + "homepage": "https://github.com/lensapp/lens", + "scripts": { + "build": "lens-webpack-build", + "clean": "rimraf dist/", + "dev": "webpack --mode=development --watch", + "test": "jest --coverage --runInBand", + "lint": "lens-lint", + "lint:fix": "lens-lint --fix" + }, + "peerDependencies": { + "@ogre-tools/injectable": "^17.2.0", + "react": "^17.0.2" + }, + "devDependencies": { + "@k8slens/eslint-config": "^6.5.0-alpha.3", + "@k8slens/jest": "^6.5.0-alpha.5", + "@k8slens/typescript": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.5" + } +} diff --git a/packages/cluster-frame-context/src/token.ts b/packages/cluster-frame-context/src/token.ts new file mode 100644 index 0000000000..94cb23d34f --- /dev/null +++ b/packages/cluster-frame-context/src/token.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { ClusterContext } from "./types"; + +export const clusterFrameContextForClusterScopedResourcesInjectionToken = getInjectionToken({ + id: "cluster-frame-context-for-cluster-scoped-resources-injection-token", +}); diff --git a/packages/core/src/renderer/cluster-frame-context/cluster-frame-context.ts b/packages/cluster-frame-context/src/types.ts old mode 100755 new mode 100644 similarity index 62% rename from packages/core/src/renderer/cluster-frame-context/cluster-frame-context.ts rename to packages/cluster-frame-context/src/types.ts index e23bac5fd4..b531f548e3 --- a/packages/core/src/renderer/cluster-frame-context/cluster-frame-context.ts +++ b/packages/cluster-frame-context/src/types.ts @@ -1,11 +1,3 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -/** - * This type is used for KubeObjectStores - */ export interface ClusterContext { readonly allNamespaces: string[]; // available / allowed namespaces from cluster.ts readonly contextNamespaces: string[]; // selected by user (see: namespace-select.tsx) diff --git a/packages/cluster-frame-context/tsconfig.json b/packages/cluster-frame-context/tsconfig.json new file mode 100644 index 0000000000..1819203dc1 --- /dev/null +++ b/packages/cluster-frame-context/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "@k8slens/typescript/config/base.json", + "include": ["**/*.ts"] +} diff --git a/packages/cluster-frame-context/webpack.config.js b/packages/cluster-frame-context/webpack.config.js new file mode 100644 index 0000000000..3183f30179 --- /dev/null +++ b/packages/cluster-frame-context/webpack.config.js @@ -0,0 +1 @@ +module.exports = require("@k8slens/webpack").configForNode; diff --git a/packages/core/package.json b/packages/core/package.json index 59a4d351cc..b2f5d170bb 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -211,11 +211,13 @@ "@k8slens/application": "^6.5.0-alpha.0", "@k8slens/application-for-electron-main": "^6.5.0-alpha.0", "@k8slens/button": "^1.0.0-alpha.5", + "@k8slens/cluster-frame-context": "^1.0.0-alpha.1", "@k8slens/cluster-settings": "^6.5.0-alpha.1", "@k8slens/cluster-sidebar": "^1.0.0", "@k8slens/error-boundary": "^1.0.0-alpha.5", "@k8slens/event-emitter": "^1.0.0-alpha.1", "@k8slens/icon": "^1.0.0-alpha.7", + "@k8slens/json-api": "^1.0.0-alpha.3", "@k8slens/kube-api": "^1.0.0-alpha.1", "@k8slens/kube-api-specifics": "^1.0.0-alpha.1", "@k8slens/kube-object": "^1.0.0-alpha.5", diff --git a/packages/core/src/common/k8s-api/kube-object.store.ts b/packages/core/src/common/k8s-api/kube-object.store.ts index 78cf4f7fe2..694c291636 100644 --- a/packages/core/src/common/k8s-api/kube-object.store.ts +++ b/packages/core/src/common/k8s-api/kube-object.store.ts @@ -16,7 +16,7 @@ import type { Patch } from "rfc6902"; import type { Logger } from "@k8slens/logger"; import assert from "assert"; import type { PartialDeep } from "type-fest"; -import type { ClusterContext } from "../../renderer/cluster-frame-context/cluster-frame-context"; +import type { ClusterContext } from "@k8slens/cluster-frame-context"; import autoBind from "auto-bind"; export type OnLoadFailure = (error: unknown) => void; diff --git a/packages/core/src/extensions/common-api/k8s-api.ts b/packages/core/src/extensions/common-api/k8s-api.ts index 7c9e2ad763..38d81bc000 100644 --- a/packages/core/src/extensions/common-api/k8s-api.ts +++ b/packages/core/src/extensions/common-api/k8s-api.ts @@ -19,7 +19,7 @@ import { KubeObjectStore as InternalKubeObjectStore } from "../../common/k8s-api import type { KubeJsonApiDataFor, KubeObject } from "@k8slens/kube-object"; import type { DerivedKubeApiOptions, KubeApiDependencies, KubeApiOptions, KubeJsonApi as InternalKubeJsonApi } from "@k8slens/kube-api"; import clusterFrameContextForNamespacedResourcesInjectable from "../../renderer/cluster-frame-context/for-namespaced-resources.injectable"; -import type { ClusterContext } from "../../renderer/cluster-frame-context/cluster-frame-context"; +import type { ClusterContext } from "@k8slens/cluster-frame-context"; import { logErrorInjectionToken, loggerInjectionToken, logInfoInjectionToken, logWarningInjectionToken } from "@k8slens/logger"; import { maybeKubeApiInjectable, storesAndApisCanBeCreatedInjectionToken } from "@k8slens/kube-api-specifics"; import { DeploymentApi as InternalDeploymentApi, IngressApi as InternalIngressApi, NodeApi, PersistentVolumeClaimApi, PodApi, KubeApi as InternalKubeApi } from "@k8slens/kube-api"; diff --git a/packages/core/src/renderer/cluster-frame-context/for-cluster-scoped-resources.injectable.ts b/packages/core/src/renderer/cluster-frame-context/for-cluster-scoped-resources.injectable.ts index 12e74cdc1f..20c5cae261 100644 --- a/packages/core/src/renderer/cluster-frame-context/for-cluster-scoped-resources.injectable.ts +++ b/packages/core/src/renderer/cluster-frame-context/for-cluster-scoped-resources.injectable.ts @@ -2,8 +2,9 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ +import { clusterFrameContextForClusterScopedResourcesInjectionToken } from "@k8slens/cluster-frame-context"; import { getInjectable } from "@ogre-tools/injectable"; -import type { ClusterContext } from "./cluster-frame-context"; +import type { ClusterContext } from "@k8slens/cluster-frame-context"; const clusterFrameContextForClusterScopedResourcesInjectable = getInjectable({ id: "cluster-frame-context-for-cluster-scoped-resources", @@ -16,6 +17,7 @@ const clusterFrameContextForClusterScopedResourcesInjectable = getInjectable({ contextNamespaces: [], hasSelectedAll: true, }), + injectionToken: clusterFrameContextForClusterScopedResourcesInjectionToken, }); export default clusterFrameContextForClusterScopedResourcesInjectable; diff --git a/packages/core/src/renderer/cluster-frame-context/for-namespaced-resources.injectable.ts b/packages/core/src/renderer/cluster-frame-context/for-namespaced-resources.injectable.ts index 6ebd193bb7..e5986759a8 100644 --- a/packages/core/src/renderer/cluster-frame-context/for-namespaced-resources.injectable.ts +++ b/packages/core/src/renderer/cluster-frame-context/for-namespaced-resources.injectable.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import type { ClusterContext } from "./cluster-frame-context"; +import type { ClusterContext } from "@k8slens/cluster-frame-context"; import namespaceStoreInjectable from "../components/namespaces/store.injectable"; import hostedClusterInjectable from "./hosted-cluster.injectable"; import assert from "assert"; diff --git a/packages/core/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx b/packages/core/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx index 9280d55ac8..27663bbf79 100644 --- a/packages/core/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx +++ b/packages/core/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx @@ -27,7 +27,7 @@ import type { PageParam } from "../../navigation/page-param"; import type { ToggleKubeDetailsPane } from "../kube-detail-params/toggle-details.injectable"; import kubeSelectedUrlParamInjectable from "../kube-detail-params/kube-selected-url.injectable"; import toggleKubeDetailsPaneInjectable from "../kube-detail-params/toggle-details.injectable"; -import type { ClusterContext } from "../../cluster-frame-context/cluster-frame-context"; +import type { ClusterContext } from "@k8slens/cluster-frame-context"; import type { GeneralKubeObjectListLayoutColumn, SpecificKubeListLayoutColumn } from "@k8slens/list-layout"; import { kubeObjectListLayoutColumnInjectionToken } from "@k8slens/list-layout"; import { sortBy } from "lodash"; diff --git a/packages/core/src/renderer/components/namespaces/namespace-select-filter-model/namespace-select-filter-model.tsx b/packages/core/src/renderer/components/namespaces/namespace-select-filter-model/namespace-select-filter-model.tsx index c0ad194dfb..70ddea4cda 100644 --- a/packages/core/src/renderer/components/namespaces/namespace-select-filter-model/namespace-select-filter-model.tsx +++ b/packages/core/src/renderer/components/namespaces/namespace-select-filter-model/namespace-select-filter-model.tsx @@ -11,7 +11,7 @@ import { Icon } from "@k8slens/icon"; import type { SelectOption } from "../../select"; import { observableCrate } from "@k8slens/utilities"; import type { IsMultiSelectionKey } from "./is-selection-key.injectable"; -import type { ClusterContext } from "../../../cluster-frame-context/cluster-frame-context"; +import type { ClusterContext } from "@k8slens/cluster-frame-context"; interface Dependencies { context: ClusterContext; diff --git a/packages/core/src/renderer/components/namespaces/namespace-select.tsx b/packages/core/src/renderer/components/namespaces/namespace-select.tsx index 3c1e095d8f..a864fe8b69 100644 --- a/packages/core/src/renderer/components/namespaces/namespace-select.tsx +++ b/packages/core/src/renderer/components/namespaces/namespace-select.tsx @@ -14,7 +14,7 @@ import { cssNames } from "@k8slens/utilities"; import { Icon } from "@k8slens/icon"; import { withInjectables } from "@ogre-tools/injectable-react"; import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable"; -import type { ClusterContext } from "../../cluster-frame-context/cluster-frame-context"; +import type { ClusterContext } from "@k8slens/cluster-frame-context"; export type NamespaceSelectSort = (left: string, right: string) => number; diff --git a/packages/core/src/renderer/components/workloads-overview/overview.tsx b/packages/core/src/renderer/components/workloads-overview/overview.tsx index 3ea0a8c2d7..79433e728b 100644 --- a/packages/core/src/renderer/components/workloads-overview/overview.tsx +++ b/packages/core/src/renderer/components/workloads-overview/overview.tsx @@ -34,7 +34,7 @@ import jobStoreInjectable from "../workloads-jobs/store.injectable"; import statefulSetStoreInjectable from "../workloads-statefulsets/store.injectable"; import type { EventStore } from "../events/store"; import eventStoreInjectable from "../events/store.injectable"; -import type { ClusterContext } from "../../cluster-frame-context/cluster-frame-context"; +import type { ClusterContext } from "@k8slens/cluster-frame-context"; interface Dependencies { detailComponents: IComputedValue[]>; diff --git a/packages/core/src/renderer/kube-watch-api/kube-watch-api.ts b/packages/core/src/renderer/kube-watch-api/kube-watch-api.ts index 56af7a9b11..3eb2292232 100644 --- a/packages/core/src/renderer/kube-watch-api/kube-watch-api.ts +++ b/packages/core/src/renderer/kube-watch-api/kube-watch-api.ts @@ -8,7 +8,7 @@ import { disposer, getOrInsert, noop, WrappedAbortController } from "@k8slens/ut import { once } from "lodash"; import type { Logger } from "@k8slens/logger"; import type { KubeObjectStoreLoadAllParams, KubeObjectStoreSubscribeParams } from "../../common/k8s-api/kube-object.store"; -import type { ClusterContext } from "../cluster-frame-context/cluster-frame-context"; +import type { ClusterContext } from "@k8slens/cluster-frame-context"; // Kubernetes watch-api client // API: https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Using_readable_streams diff --git a/packages/utility-features/kube-api-specifics/src/specifics/pod-metrics-api-injection-token.ts b/packages/utility-features/kube-api-specifics/src/specifics/pod-metrics-api-injection-token.ts new file mode 100644 index 0000000000..bcb19fe42f --- /dev/null +++ b/packages/utility-features/kube-api-specifics/src/specifics/pod-metrics-api-injection-token.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { PodMetricsApi } from "@k8slens/kube-api"; + +export const podMetricsApiInjectionToken = getInjectionToken({ + id: "pod-metrics-api-injection-token", +}); diff --git a/packages/utility-features/kube-api-specifics/src/specifics/pod-metrics.api.injectable.ts b/packages/utility-features/kube-api-specifics/src/specifics/pod-metrics.api.injectable.ts index 9c8a34ee4e..6ca16765cb 100644 --- a/packages/utility-features/kube-api-specifics/src/specifics/pod-metrics.api.injectable.ts +++ b/packages/utility-features/kube-api-specifics/src/specifics/pod-metrics.api.injectable.ts @@ -6,9 +6,9 @@ import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "./can-be-created-token"; import { PodMetricsApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "./token"; import { logErrorInjectionToken, logInfoInjectionToken, logWarningInjectionToken } from "@k8slens/logger"; import { maybeKubeApiInjectable } from "./maybe-kube-api.injectable"; +import { podMetricsApiInjectionToken } from "./pod-metrics-api-injection-token"; export const podMetricsApiInjectable = getInjectable({ id: "pod-metrics-api", @@ -26,5 +26,5 @@ export const podMetricsApiInjectable = getInjectable({ }); }, - injectionToken: kubeApiInjectionToken, + injectionToken: podMetricsApiInjectionToken, }); diff --git a/packages/utility-features/kube-api-specifics/src/specifics/pod-metrics.kube-api.injectable.ts b/packages/utility-features/kube-api-specifics/src/specifics/pod-metrics.kube-api.injectable.ts new file mode 100644 index 0000000000..5dbfed8025 --- /dev/null +++ b/packages/utility-features/kube-api-specifics/src/specifics/pod-metrics.kube-api.injectable.ts @@ -0,0 +1,15 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { podMetricsApiInjectable } from "./pod-metrics.api.injectable"; + +const podMetricsKubeApiInjectable = getInjectable({ + id: "pod-metrics-kube-api", + instantiate: (di) => di.inject(podMetricsApiInjectable), + injectionToken: kubeApiInjectionToken, +}); + +export default podMetricsKubeApiInjectable;