Skip to content

Commit

Permalink
Revert "Remove in-tree extensions to help facilitate a more secure an…
Browse files Browse the repository at this point in the history
…d faster booting lens (lensapp#6775)"

This reverts commit 8db81a4.
  • Loading branch information
alebcay committed Dec 28, 2022
1 parent e59ec3a commit f7d119e
Show file tree
Hide file tree
Showing 48 changed files with 2,817 additions and 5 deletions.
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ module.exports = {
"**/dist/**/*",
"**/static/**/*",
"**/site/**/*",
"extensions/*/*.tgz",
"build/webpack/**/*",
],
settings: {
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ jobs:
name: Run tests
if: ${{ matrix.type == 'unit' }}

- run: make test-extensions
name: Run In-tree Extension tests
if: ${{ matrix.type == 'unit' }}

- run: make ci-validate-dev
if: ${{ contains(github.event.pull_request.labels.*.name, 'dependencies') && matrix.type == 'unit' }}
name: Validate dev mode will work
Expand Down
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ static/build
static/types
binaries/client/
binaries/server/
src/extensions/*/*.js
src/extensions/*/*.d.ts
types/extension-api.d.ts
types/extension-renderer-api.d.ts
extensions/*/dist
docs/extensions/api
site/
build/webpack/
6 changes: 5 additions & 1 deletion .idea/lens.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 32 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ CMD_ARGS = $(filter-out $@,$(MAKECMDGOALS))

NPM_RELEASE_TAG ?= latest
ELECTRON_BUILDER_EXTRA_ARGS ?=
EXTENSIONS_DIR = ./extensions
extensions = $(foreach dir, $(wildcard $(EXTENSIONS_DIR)/*), ${dir})
extension_node_modules = $(foreach dir, $(wildcard $(EXTENSIONS_DIR)/*), ${dir}/node_modules)
extension_dists = $(foreach dir, $(wildcard $(EXTENSIONS_DIR)/*), ${dir}/dist)

ifeq ($(OS),Windows_NT)
DETECTED_OS := Windows
Expand All @@ -24,10 +28,10 @@ compile-dev: node_modules
yarn compile:renderer --cache

.PHONY: validate-dev
ci-validate-dev: binaries/client compile-dev
ci-validate-dev: binaries/client build-extensions compile-dev

.PHONY: dev
dev: binaries/client
dev: binaries/client build-extensions
rm -rf static/build/
yarn run build:tray-icons
yarn dev
Expand All @@ -50,6 +54,7 @@ integration: build

.PHONY: build
build: node_modules binaries/client
$(MAKE) build-extensions -B
yarn run build:tray-icons
yarn run compile
ifeq "$(DETECTED_OS)" "Windows"
Expand All @@ -58,6 +63,26 @@ ifeq "$(DETECTED_OS)" "Windows"
endif
yarn run electron-builder --publish onTag $(ELECTRON_BUILDER_EXTRA_ARGS)

.NOTPARALLEL: $(extension_node_modules)
$(extension_node_modules): node_modules
cd $(@:/node_modules=) && ../../node_modules/.bin/npm install --no-audit --no-fund --no-save

$(extension_dists): src/extensions/npm/extensions/dist $(extension_node_modules)
cd $(@:/dist=) && ../../node_modules/.bin/npm run build
rm -rf ./node_modules/$(shell basename $(@:/dist=))

.PHONY: clean-old-extensions
clean-old-extensions:
find ./extensions -mindepth 1 -maxdepth 1 -type d '!' -exec test -e '{}/package.json' \; -exec rm -rf {} \;

.PHONY: build-extensions
build-extensions: node_modules clean-old-extensions $(extension_dists)
yarn install --check-files --frozen-lockfile --network-timeout=100000

.PHONY: test-extensions
test-extensions: $(extension_node_modules)
$(foreach dir, $(extensions), (cd $(dir) && npm run test || exit $?);)

src/extensions/npm/extensions/__mocks__:
cp -r __mocks__ src/extensions/npm/extensions/

Expand Down Expand Up @@ -96,13 +121,17 @@ build-docs:
docs: build-docs
yarn mkdocs-serve-local

.PHONY: clean-extensions
clean-extensions:
rm -rf $(EXTENSIONS_DIR)/*/{dist,node_modules,*.tgz}

.PHONY: clean-npm
clean-npm:
rm -rf packages/extensions/{dist,__mocks__,node_modules}
rm -rf static/build/library/

.PHONY: clean
clean: clean-npm
clean: clean-npm clean-extensions
rm -rf binaries/client
rm -rf dist
rm -rf static/build
Expand Down
20 changes: 20 additions & 0 deletions extensions/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/

module.exports = {
"overrides": [
{
files: [
"**/*.ts",
"**/*.tsx",
],
rules: {
"import/no-unresolved": ["error", {
ignore: ["@k8slens/extensions"],
}],
},
},
],
};
1 change: 1 addition & 0 deletions extensions/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*/*.tgz
8 changes: 8 additions & 0 deletions extensions/kube-object-event-status/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
install-deps:
npm install

build: install-deps
npm run build

test:
npm run test
21 changes: 21 additions & 0 deletions extensions/kube-object-event-status/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "kube-object-event-status",
"version": "6.1.1",
"description": "Adds kube object status from events",
"renderer": "dist/renderer.js",
"lens": {
"metadata": {},
"styles": []
},
"scripts": {
"build": "npx webpack",
"dev": "npx webpack -- --watch",
"test": "echo NO TESTS"
},
"files": [
"dist/**/*"
],
"devDependencies": {
"@k8slens/extensions": "file:../../src/extensions/npm/extensions"
}
}
53 changes: 53 additions & 0 deletions extensions/kube-object-event-status/renderer.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/

import { Renderer } from "@k8slens/extensions";
import { resolveStatus, resolveStatusForCronJobs, resolveStatusForPods } from "./src/resolver";

export default class EventResourceStatusRendererExtension extends Renderer.LensExtension {
kubeObjectStatusTexts = [
{
kind: "Pod",
apiVersions: ["v1"],
resolve: (pod: Renderer.K8sApi.Pod) => resolveStatusForPods(pod),
},
{
kind: "ReplicaSet",
apiVersions: ["v1"],
resolve: (replicaSet: Renderer.K8sApi.ReplicaSet) => resolveStatus(replicaSet),
},
{
kind: "Deployment",
apiVersions: ["apps/v1"],
resolve: (deployment: Renderer.K8sApi.Deployment) => resolveStatus(deployment),
},
{
kind: "StatefulSet",
apiVersions: ["apps/v1"],
resolve: (statefulSet: Renderer.K8sApi.StatefulSet) => resolveStatus(statefulSet),
},
{
kind: "DaemonSet",
apiVersions: ["apps/v1"],
resolve: (daemonSet: Renderer.K8sApi.DaemonSet) => resolveStatus(daemonSet),
},
{
kind: "Job",
apiVersions: [
"batch/v1",
"batch/v1beta1",
],
resolve: (job: Renderer.K8sApi.Job) => resolveStatus(job),
},
{
kind: "CronJob",
apiVersions: [
"batch/v1",
"batch/v1beta1",
],
resolve: (cronJob: Renderer.K8sApi.CronJob) => resolveStatusForCronJobs(cronJob),
},
];
}
72 changes: 72 additions & 0 deletions extensions/kube-object-event-status/src/resolver.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/

import { Renderer } from "@k8slens/extensions";

const { apiManager, eventApi, KubeObjectStatusLevel } = Renderer.K8sApi;

type KubeObject = Renderer.K8sApi.KubeObject;
type Pod = Renderer.K8sApi.Pod;
type CronJob = Renderer.K8sApi.CronJob;
type KubeObjectStatus = Renderer.K8sApi.KubeObjectStatus;
type EventStore = Renderer.K8sApi.EventStore;

export function resolveStatus(object: KubeObject): KubeObjectStatus {
const eventStore = apiManager.getStore(eventApi);
const events = (eventStore as EventStore).getEventsByObject(object);
const warnings = events.filter(evt => evt.isWarning());

if (!events.length || !warnings.length) {
return null;
}
const event = [...warnings, ...events][0]; // get latest event

return {
level: KubeObjectStatusLevel.WARNING,
text: `${event.message}`,
timestamp: event.metadata.creationTimestamp,
};
}

export function resolveStatusForPods(pod: Pod): KubeObjectStatus {
if (!pod.hasIssues()) {
return null;
}
const eventStore = apiManager.getStore(eventApi);
const events = (eventStore as EventStore).getEventsByObject(pod);
const warnings = events.filter(evt => evt.isWarning());

if (!events.length || !warnings.length) {
return null;
}
const event = [...warnings, ...events][0]; // get latest event

return {
level: KubeObjectStatusLevel.WARNING,
text: `${event.message}`,
timestamp: event.metadata.creationTimestamp,
};
}

export function resolveStatusForCronJobs(cronJob: CronJob): KubeObjectStatus {
const eventStore = apiManager.getStore(eventApi);
let events = (eventStore as EventStore).getEventsByObject(cronJob);
const warnings = events.filter(evt => evt.isWarning());

if (cronJob.isNeverRun()) {
events = events.filter(event => event.reason != "FailedNeedsStart");
}

if (!events.length || !warnings.length) {
return null;
}
const event = [...warnings, ...events][0]; // get latest event

return {
level: KubeObjectStatusLevel.WARNING,
text: `${event.message}`,
timestamp: event.metadata.creationTimestamp,
};
}
27 changes: 27 additions & 0 deletions extensions/kube-object-event-status/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"compilerOptions": {
"outDir": "dist",
"module": "CommonJS",
"target": "ES2017",
"lib": ["ESNext", "DOM", "DOM.Iterable"],
"moduleResolution": "Node",
"sourceMap": false,
"declaration": false,
"strict": false,
"noImplicitAny": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"experimentalDecorators": true,
"useDefineForClassFields": true,
"jsx": "react"
},
"include": [
"./*.ts",
"./*.tsx"
],
"exclude": [
"node_modules",
"*.js"
]
}
44 changes: 44 additions & 0 deletions extensions/kube-object-event-status/webpack.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
const path = require("path");

module.exports = [
{
entry: "./renderer.tsx",
context: __dirname,
target: "electron-renderer",
mode: "production",
optimization: {
minimize: false,
},
module: {
rules: [
{
test: /\.tsx?$/,
use: "ts-loader",
exclude: /node_modules/,
},
],
},
externals: [
{
"@k8slens/extensions": "var global.LensExtensions",
"react": "var global.React",
"react-dom": "var global.ReactDOM",
"mobx": "var global.Mobx",
"mobx-react": "var global.MobxReact",
},
],
resolve: {
extensions: [ ".tsx", ".ts", ".js" ],
},
output: {
libraryTarget: "commonjs2",
globalObject: "this",
filename: "renderer.js",
path: path.resolve(__dirname, "dist"),
},
},
];
Loading

0 comments on commit f7d119e

Please sign in to comment.