387 Commits
v0.2.0 ... main

Author SHA1 Message Date
dependabot[bot]
dd64b54800 Bump flatted from 3.3.3 to 3.4.2 in /frontend (#668)
Bumps [flatted](https://github.com/WebReflection/flatted) from 3.3.3 to 3.4.2.
- [Commits](https://github.com/WebReflection/flatted/compare/v3.3.3...v3.4.2)

---
updated-dependencies:
- dependency-name: flatted
  dependency-version: 3.4.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-22 20:37:23 +00:00
saudademjj
f12f60f0c7 fix(frontend): use unique installed package keys (#667) 2026-03-19 10:11:27 +00:00
dependabot[bot]
b2cbf812f2 Bump google.golang.org/grpc from 1.68.1 to 1.79.3 (#665)
Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.68.1 to 1.79.3.
- [Release notes](https://github.com/grpc/grpc-go/releases)
- [Commits](https://github.com/grpc/grpc-go/compare/v1.68.1...v1.79.3)

---
updated-dependencies:
- dependency-name: google.golang.org/grpc
  dependency-version: 1.79.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-19 08:34:56 +00:00
komodor-bot
5783095e0d Increment chart versions [skip ci] 2026-03-17 19:57:49 +00:00
dependabot[bot]
58ba15e1bd Bump dompurify and swagger-ui-react in /frontend (#664)
Bumps [dompurify](https://github.com/cure53/DOMPurify) to 3.3.3 and updates ancestor dependency [swagger-ui-react](https://github.com/swagger-api/swagger-ui). These dependencies need to be updated together.


Updates `dompurify` from 3.2.6 to 3.3.3
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/3.2.6...3.3.3)

Updates `swagger-ui-react` from 5.31.2 to 5.32.1
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.31.2...v5.32.1)

---
updated-dependencies:
- dependency-name: dompurify
  dependency-version: 3.3.3
  dependency-type: indirect
- dependency-name: swagger-ui-react
  dependency-version: 5.32.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-17 19:08:08 +00:00
Andrei Pohilko
a6b8beb25c Cleanup 2026-03-17 18:20:01 +00:00
Andrei Pohilko
2b6964dcd5 refactor: reduce cyclomatic complexity in relations extraction
Break up ExtractRelations, extractVolumes, extractEnvRefs, and
extractIngressBackends into smaller focused functions to pass CI
complexity checks.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 18:19:39 +00:00
Andrei Pohilko
e44556d100 fix: resolve DOMPurify XSS vulnerabilities (GHSA-v8jm-5vwx-cfxm, GHSA-v2wj-7wpq-c8vv)
Add yarn resolution to pin dompurify>=3.3.2, fixing transitive dependency
from swagger-ui-react that was stuck at 3.2.6.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 18:03:09 +00:00
Andrei Pohilko
cfc28cf3a0 feat: add Relations tab with force-directed resource dependency graph (#96)
Add a new "Relations" tab after "Images" that visualizes resource
dependencies within a Helm release as an interactive force-directed graph.
Detects relationships via ownerReferences, *Ref fields, volumes, env refs,
service selectors, ingress backends, and RBAC bindings. External resources
appear as dashed oval ghost nodes. Color-coded by resource category.

Closes #96

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 17:58:00 +00:00
Andrei Pohilko
443207191d feat: display container images summary on Images tab (#83)
Add a new "Images" tab on the release details page that extracts
and displays all container images (including init containers) from
the release manifest. Images are grouped by image string and show
the associated resource and container name.

Closes #83

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 16:47:59 +00:00
Andrei Pohilko
c5ae60a779 feat: add --force flag support for helm upgrade (#505)
Add a "Force upgrade" checkbox in the upgrade modal footer that passes
the --force flag to helm upgrade, causing resources to be deleted and
recreated. Also fix the version selector flashing the URL input while
loading by showing a spinner.

Closes #505

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 16:18:00 +00:00
Andrei Pohilko
4fb2eb099a fix: use apiVersion to disambiguate CRDs with same kind (#504)
When multiple CRDs share the same kind but different API groups
(e.g. Traefik's Middleware under traefik.io and traefik.containo.us),
the dashboard failed to look up the correct resource. Thread apiVersion
through the resource fetch chain and use group-qualified kind
(e.g. Widget.new.example.com) for kubectl lookups.

Closes #504

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 15:55:48 +00:00
Andrei Pohilko
62cf1dfc3e feat(health): add status display for DaemonSet and StatefulSet (#32)
Introduce extendedCarp struct to capture numeric status fields
(desiredNumberScheduled, numberReady, replicas, readyReplicas, etc.)
that are lost during standard Carp unmarshaling. Synthesize an
"Available" condition from these fields so EnhanceStatus can
determine health correctly.

Closes #32

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:40:42 +00:00
Andrei Pohilko
f7deda06f5 fix: pass resource name instead of chart name to describe API (#657)
The DescribeResource component was passing the chart/release name
instead of the actual resource name, causing all resources of the
same kind to show the same describe output.

Closes #657

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:22:22 +00:00
Andrey Pokhilko
123f674e2f feat: install and upgrade charts from URLs (#663)
* feat: add support for installing and upgrading charts from URLs

Adds "Install from URL" button to the repositories page, allowing users
to install charts directly from OCI registries and other URLs without
adding them as repositories first. Also adds URL mode to the upgrade
modal (via pencil/X toggle) for charts not found in any configured repo.

Closes #660

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Alter

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:09:11 +00:00
Andrei Pohilko
5d2a61c2ff refactor(health): reduce cyclomatic complexity in applyCustomConditions
Extract repeated healthy/unhealthy logic into applyHealthFromCondition helper
and convert if/else chain to switch statement (complexity 29 → 16).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 09:48:25 +00:00
Matt Van Horn
f857f8dfdc feat(health): add health status for ExternalSecret, Job, HPA, and Namespace (#662)
Add condition-based health status calculation for additional resource kinds:
- ExternalSecret: checks "Ready" condition
- Job: checks "Complete" and "Failed" conditions
- HorizontalPodAutoscaler: checks "AbleToScale" and "ScalingActive" conditions
- Namespace: handles "Terminating" phase as Progressing

Closes #418

Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 09:33:33 +00:00
dependabot[bot]
6b07fbe242 Bump immutable from 3.8.2 to 3.8.3 in /frontend (#661)
Bumps [immutable](https://github.com/immutable-js/immutable-js) from 3.8.2 to 3.8.3.
- [Release notes](https://github.com/immutable-js/immutable-js/releases)
- [Changelog](https://github.com/immutable-js/immutable-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/immutable-js/immutable-js/compare/v3.8.2...v3.8.3)

---
updated-dependencies:
- dependency-name: immutable
  dependency-version: 3.8.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-08 19:35:30 +00:00
dependabot[bot]
2d1fa25e7e Bump rollup from 4.58.0 to 4.59.0 in /frontend (#659)
Bumps [rollup](https://github.com/rollup/rollup) from 4.58.0 to 4.59.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.58.0...v4.59.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.59.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-28 16:01:09 +00:00
dependabot[bot]
331925900a Bump minimatch from 10.2.2 to 10.2.4 in /frontend (#658)
Bumps [minimatch](https://github.com/isaacs/minimatch) from 10.2.2 to 10.2.4.
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v10.2.2...v10.2.4)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-version: 10.2.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-28 14:37:59 +00:00
yuri-sakharov
f91daafd4a Improved EsLint performance + bump frontend packages (#656)
* Bump frontend packages to latest

* DropDown.stories.tsx fixed
2026-02-21 10:51:11 +00:00
dependabot[bot]
a15e375105 Bump systeminformation from 5.30.7 to 5.31.1 in /frontend (#655)
Bumps [systeminformation](https://github.com/sebhildebrandt/systeminformation) from 5.30.7 to 5.31.1.
- [Release notes](https://github.com/sebhildebrandt/systeminformation/releases)
- [Changelog](https://github.com/sebhildebrandt/systeminformation/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sebhildebrandt/systeminformation/compare/v5.30.7...v5.31.1)

---
updated-dependencies:
- dependency-name: systeminformation
  dependency-version: 5.31.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-19 18:16:30 +00:00
yuri-sakharov
2b7df9cfa3 Bump FE packages to latest (#654)
* Bump FE packages to latest

* Bump eslint packages to the latest available without breaking change
2026-02-15 19:08:49 +00:00
dependabot[bot]
b457be85c1 Bump axios from 1.13.2 to 1.13.5 in /frontend (#651)
Bumps [axios](https://github.com/axios/axios) from 1.13.2 to 1.13.5.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.13.2...v1.13.5)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.13.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-15 18:02:41 +00:00
yuri-sakharov
c9b8fb7809 Introduced tsconfig.app.json and tsconfig.base.json + Refactored eslint.config.js to the latest structure (#652)
* Introduced tsconfig.app.json and tsconfig.base.json

* yarn.lock

* Introduced tsconfig.app.json, tsconfig.base.jsonfig.

* Refactored eslint.config.js to latest structure

* Returned previous recommended rules.

* More rules

* Force import rules

* Check

* Check

* Cleanup ESLint configuration and plugins

* Cleanup heap: "writable",DD_RUM: "writable" from ESLint configuration

* "scripts" moved to the top of package.json
2026-02-15 17:41:04 +00:00
dependabot[bot]
939dd8ac0c Bump qs from 6.14.1 to 6.14.2 in /frontend (#653)
Bumps [qs](https://github.com/ljharb/qs) from 6.14.1 to 6.14.2.
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.14.1...v6.14.2)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.14.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-14 14:11:29 +00:00
dependabot[bot]
ae598bec68 Bump diff and diff2html in /frontend (#650)
Bumps [diff](https://github.com/kpdecker/jsdiff) to 8.0.3 and updates ancestor dependency [diff2html](https://github.com/rtfpessoa/diff2html). These dependencies need to be updated together.


Updates `diff` from 7.0.0 to 8.0.3
- [Changelog](https://github.com/kpdecker/jsdiff/blob/master/release-notes.md)
- [Commits](https://github.com/kpdecker/jsdiff/compare/7.0.0...v8.0.3)

Updates `diff2html` from 3.4.52 to 3.4.56
- [Release notes](https://github.com/rtfpessoa/diff2html/releases)
- [Commits](https://github.com/rtfpessoa/diff2html/compare/3.4.52...3.4.56)

---
updated-dependencies:
- dependency-name: diff
  dependency-version: 8.0.3
  dependency-type: indirect
- dependency-name: diff2html
  dependency-version: 3.4.56
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-08 19:12:41 +00:00
yuri-sakharov
f647a3db03 Added Error Boundary (#649)
* Added Error Boundary

* Test improvements

* Introduced useDevLogger

* Updated Cypress to latest and aligned the tests

* Added eslint-enable

* Set allowCypressEnv: false for security reasons.
2026-02-08 18:22:04 +00:00
dependabot[bot]
ea7f8722ac Bump lodash from 4.17.21 to 4.17.23 in /frontend (#647)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.21 to 4.17.23.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.17.23)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.17.23
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-22 09:16:40 +00:00
Andrei Pohilko
4714d76784 Don't resolve 2026-01-20 11:26:25 +00:00
Andrei Pohilko
5d0bdb40c1 Merge branch 'main' of github.com:komodorio/helm-dashboard 2026-01-20 11:22:48 +00:00
Andrei Pohilko
e816f5881f Problem with dep 2026-01-20 11:22:40 +00:00
S Kumar Dhananjaya
2dfc25c038 Fix: resolve rollback to same revision bug (#569) (#646)
* added more info to features.md

* added details to FEATURES.md

* .

* reset to last commit

* Update FEATURES.md

* fix: resolve rollback to same revision bug (#578)
2026-01-18 14:17:00 +00:00
S Kumar Dhananjaya
aa2cc04084 Fix: resolve incorrect upgrade recommendation (#577) (#645)
* added more info to features.md

* added details to FEATURES.md

* .

* reset to last commit

* Update FEATURES.md

* fix: resolve incorrect upgrade recommendation (#577)
2026-01-17 16:41:09 +00:00
S Kumar Dhananjaya
65a250e2a4 Feat: add flags to disable slow health and latest version checks (#493) (#644)
* added more info to features.md

* added details to FEATURES.md

* .

* reset to last commit

* Update FEATURES.md

* feat: add flags to disable slow health and latest version checks

- Introduce --no-health and --no-latest CLI flags
- Support HD_NO_HEALTH and HD_NO_LATEST environment variables
- Skip slow k8s health checks and latest version fetching when flags are set
- Optimize frontend data fetching based on these flags

* chore: fix lint errors in InstalledPackageCard.tsx

* chore: remove accidental lockfile changes
2026-01-17 12:04:55 +00:00
Olga Kruglova
323a60fe31 Fix inconsistency in README.md (#643) 2026-01-12 08:47:12 +00:00
Vedant Apraj
37af7dfbec fix: maintain cluster context after adding repo (#616) (#641)
* fix: maintain cluster context after adding repo (#616)

* chore: rollback lock file changes as requested
2026-01-09 17:47:22 +00:00
dependabot[bot]
05c7c0b5c4 Bump react-router from 7.9.6 to 7.12.0 in /frontend (#642)
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.9.6 to 7.12.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.12.0/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.12.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-09 17:33:28 +00:00
dependabot[bot]
9b3fd77105 Bump qs and @cypress/request in /frontend (#640)
Bumps [qs](https://github.com/ljharb/qs) and [@cypress/request](https://github.com/cypress-io/request). These dependencies needed to be updated together.

Updates `qs` from 6.14.0 to 6.14.1
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.14.0...v6.14.1)

Updates `@cypress/request` from 3.0.9 to 3.0.10
- [Release notes](https://github.com/cypress-io/request/releases)
- [Changelog](https://github.com/cypress-io/request/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/request/compare/v3.0.9...v3.0.10)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.14.1
  dependency-type: indirect
- dependency-name: "@cypress/request"
  dependency-version: 3.0.10
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-07 11:36:25 +00:00
Suhas Magadum
9f07cea128 fix: resolve undefined cluster context in navigation (#639)
* fix: resolve undefined cluster context in navigation

* fix: encode cluster context and resolve linting failures
2026-01-05 19:27:22 +00:00
Fahim muntasir
9d28119bc6 fix: prevent drawer overlay from being cut off (#617) (#637) 2025-12-27 20:14:34 +00:00
dependabot[bot]
4c0821307d Bump storybook from 10.0.8 to 10.1.10 in /frontend (#636)
Bumps [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/core) from 10.0.8 to 10.1.10.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v10.1.10/code/core)

---
updated-dependencies:
- dependency-name: storybook
  dependency-version: 10.1.10
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-18 22:50:15 +00:00
yuri-sakharov
077582e795 Added lazy load, visualizer and optimized bundle chunks (#635)
* Added lazy load.

* Added visualizer and improved hljs import only yaml

* Optimized manualChunks
2025-12-06 15:19:35 +00:00
yuri-sakharov
651397e2d2 Removed redundant useMemo (#634) 2025-12-06 15:16:40 +00:00
yuri-sakharov
f660411722 Added React compiler + eslint.config.ts cleanup (#633)
* Added react compiler

* Removed project field from eslint.config.js

* Cleaned up eslint.config.js

* Added comment
2025-12-06 15:16:04 +00:00
yuri-sakharov
f2eb91bc02 Enabled recommended-requiring-type-checking as result type fixes provided (#632)
* Enabled recommended-requiring-type-checking

* from .cjs to .js

* check

* check

* check

* check

* A lot of types aligned and refactored

* More strict types

* Improvement

* Improvements

* Improvements

* Fixed routs

* Fixed import types
2025-12-01 10:19:44 +02:00
yuri-sakharov
362f881b47 Fixed AddRepositoryModal borders and margin (#631) 2025-11-30 22:17:41 +00:00
yuri-sakharov
f10cc6d8a5 Added prettier-plugin-tailwindcss and sorted the classes + some small fixes (#630)
* Added prettier-plugin-tailwindcss and sorted the classes

* Added tsc into staged check + some type improvements
2025-11-30 20:11:52 +00:00
yuri-sakharov
73f74d77bb Fixed tailwindcss classes (#629) 2025-11-30 19:36:16 +00:00
yuri-sakharov
7572f00f7c Huge bump of versions + husky + fixed DropDown key issue and pointer (#628)
* Bump lint-staged

* Check

* Check

* Added husky

* Check

* Check

* Check

* Check

* Check

* Check

* Check

* Check

* Fix husky

* Used * instead **/* in lint-staged

* Bump tailwindcss and related

* Added @tailwindcss/vite and removed postcss

* Added lint into staged

* Bump @babel/core and updated .prettierignore

* Removed tailwind.config.cjs

* Added ThemeInit

* Added cursor-pointer to Help dropdown

* Bump react-router

* Removed @types/uuid and react-router-dom

* Bump diff2html, prettier, @typescript-eslint/eslint-plugin, @typescript-eslint/parser

* removed vite-plugin-html-config and @babel/core

* removed "@eslint/eslintrc" and "@eslint/js"

* Removed redundant link

* Returned plugins and source to index.css

* Set dark to false in tailwindcss

* Fixed storybook

* Fixed useGetLatestVersion with correct gcTime: 0 option

* Added eslint-plugin-prettier

* Removed spaces

* ClustersList.tsx improved and type fixes for another files

* Repository.tsx improved

* Huge fix of types

* Huge fix of types missed

* Fixed type of SingleValue

* Added cursor pointer
2025-11-29 16:49:51 +00:00
yuri-sakharov
1129651e6c Added bracketSpacing into prettier (#627) 2025-11-27 13:27:16 +02:00
yuri-sakharov
3f623458b3 Fixed queries, mutations and JSON parse (#626)
* Fixed queries ond mutations

* Fixed JSON.parse in analytics
2025-11-27 11:44:50 +02:00
yuri-sakharov
f01c19f330 Bump a lot of packages (#625)
* Bump react, luxon, swagger, uuid

* Improved imports

* Fixed vulnerabilities

* Bump highlight.js and added eslint-plugin-react-hooks with fixes

* Bump compare-versions, html-react-parser, react-intersection-observer, react-modern-drawer

* Bump @tanstack/react-query, react-select

* Added tsc:check script
2025-11-26 18:44:59 +02:00
dependabot[bot]
e50ae801a7 Bump prismjs and swagger-ui-react in /frontend (#622)
Bumps [prismjs](https://github.com/PrismJS/prism) to 1.30.0 and updates ancestor dependency [swagger-ui-react](https://github.com/swagger-api/swagger-ui). These dependencies need to be updated together.


Updates `prismjs` from 1.29.0 to 1.30.0
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/v2/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.29.0...v1.30.0)

Updates `swagger-ui-react` from 5.1.1 to 5.30.2
- [Release notes](https://github.com/swagger-api/swagger-ui/releases)
- [Changelog](https://github.com/swagger-api/swagger-ui/blob/master/.releaserc)
- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.1.1...v5.30.2)

---
updated-dependencies:
- dependency-name: prismjs
  dependency-version: 1.30.0
  dependency-type: indirect
- dependency-name: swagger-ui-react
  dependency-version: 5.30.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-26 09:15:27 +02:00
yuri-sakharov
51df16e83e Bump tailwindcss related packages and updated config. Fixed Storybook! (#624)
* Updated Story book to the latest one

* Updated tailwindcss related packages and config

* Fixed Storybook

* Added missed colors

* Fixed CSS for the error dialog
2025-11-26 08:55:42 +02:00
yuri-sakharov
210a371d06 Bumped vite, eslint, typescript, prettier and related plugins versions to latest (#623)
* Bumped vite, eslint, typescript, prettier and related plugins

* Fixed unused arg

* Fixed prettier warnings
2025-11-22 08:31:28 +02:00
dependabot[bot]
40161aee12 Bump github.com/containerd/containerd from 1.7.27 to 1.7.29 (#618)
Bumps [github.com/containerd/containerd](https://github.com/containerd/containerd) from 1.7.27 to 1.7.29.
- [Release notes](https://github.com/containerd/containerd/releases)
- [Changelog](https://github.com/containerd/containerd/blob/main/RELEASES.md)
- [Commits](https://github.com/containerd/containerd/compare/v1.7.27...v1.7.29)

---
updated-dependencies:
- dependency-name: github.com/containerd/containerd
  dependency-version: 1.7.29
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-20 14:38:41 +02:00
dependabot[bot]
71d0a4d849 Bump golang.org/x/crypto from 0.40.0 to 0.45.0 (#621)
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.40.0 to 0.45.0.
- [Commits](https://github.com/golang/crypto/compare/v0.40.0...v0.45.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-version: 0.45.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-20 09:41:29 +02:00
DONY BENNY
1d8151d41d added uid for identification (#620) 2025-11-15 17:28:12 +00:00
dependabot[bot]
b23310cb2d Bump esbuild, vite, @storybook/addon-essentials, @storybook/addon-interactions, @storybook/addon-styling, @storybook/react, @storybook/react-vite, @vitejs/plugin-react and storybook (#615)
Bumps [esbuild](https://github.com/evanw/esbuild) to 0.25.11 and updates ancestor dependencies [esbuild](https://github.com/evanw/esbuild), [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite), [@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials), [@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions), [@storybook/addon-styling](https://github.com/storybookjs/addon-styling), [@storybook/react](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react), [@storybook/react-vite](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-vite), [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) and [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/core). These dependencies need to be updated together.


Updates `esbuild` from 0.17.19 to 0.25.11
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2023.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.17.19...v0.25.11)

Updates `vite` from 5.4.21 to 7.1.11
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite)

Updates `@storybook/addon-essentials` from 7.5.0 to 8.6.14
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v8.6.14/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.6.14/code/addons/essentials)

Updates `@storybook/addon-interactions` from 7.0.24 to 7.6.20
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/7.6.20/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/7.6.20/code/addons/interactions)

Updates `@storybook/addon-styling` from 1.3.2 to 2.0.0
- [Release notes](https://github.com/storybookjs/addon-styling/releases)
- [Changelog](https://github.com/storybookjs/addon-styling/blob/main/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/addon-styling/commits)

Updates `@storybook/react` from 7.5.0 to 9.1.13
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/HEAD/code/renderers/react)

Updates `@storybook/react-vite` from 7.5.0 to 9.1.13
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/HEAD/code/frameworks/react-vite)

Updates `@vitejs/plugin-react` from 3.1.0 to 5.0.4
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@5.0.4/packages/plugin-react)

Updates `storybook` from 7.5.0 to 9.1.13
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/HEAD/code/core)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version: 0.25.11
  dependency-type: indirect
- dependency-name: vite
  dependency-version: 7.1.11
  dependency-type: direct:development
- dependency-name: "@storybook/addon-essentials"
  dependency-version: 8.6.14
  dependency-type: direct:development
- dependency-name: "@storybook/addon-interactions"
  dependency-version: 7.6.20
  dependency-type: direct:development
- dependency-name: "@storybook/addon-styling"
  dependency-version: 2.0.0
  dependency-type: direct:development
- dependency-name: "@storybook/react"
  dependency-version: 9.1.13
  dependency-type: direct:development
- dependency-name: "@storybook/react-vite"
  dependency-version: 9.1.13
  dependency-type: direct:development
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 5.0.4
  dependency-type: direct:development
- dependency-name: storybook
  dependency-version: 9.1.13
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-21 10:28:53 +01:00
dependabot[bot]
b5750ca40b Bump vite from 4.5.5 to 5.4.21 in /frontend (#613)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.5.5 to 5.4.21.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.21/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 5.4.21
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-21 10:07:44 +01:00
dependabot[bot]
63d55c1c25 Bump form-data and @cypress/request in /frontend (#611)
Bumps [form-data](https://github.com/form-data/form-data) and [@cypress/request](https://github.com/cypress-io/request). These dependencies needed to be updated together.

Updates `form-data` from 3.0.1 to 3.0.4
- [Release notes](https://github.com/form-data/form-data/releases)
- [Changelog](https://github.com/form-data/form-data/blob/v3.0.4/CHANGELOG.md)
- [Commits](https://github.com/form-data/form-data/compare/v3.0.1...v3.0.4)

Updates `@cypress/request` from 3.0.1 to 3.0.9
- [Release notes](https://github.com/cypress-io/request/releases)
- [Changelog](https://github.com/cypress-io/request/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/request/compare/v3.0.1...v3.0.9)

---
updated-dependencies:
- dependency-name: form-data
  dependency-version: 3.0.4
  dependency-type: indirect
- dependency-name: "@cypress/request"
  dependency-version: 3.0.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-28 11:48:25 +01:00
dependabot[bot]
756706dcd4 Bump brace-expansion from 1.1.11 to 1.1.12 in /frontend (#604)
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.11 to 1.1.12.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 1.1.12
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-28 09:55:05 +01:00
dependabot[bot]
b76c4e077d Bump axios from 1.8.3 to 1.12.2 in /frontend (#610)
Bumps [axios](https://github.com/axios/axios) from 1.8.3 to 1.12.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.8.3...v1.12.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.12.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-28 09:53:39 +01:00
dependabot[bot]
5e24721801 Bump tar-fs from 2.1.3 to 2.1.4 in /frontend (#609)
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 2.1.3 to 2.1.4.
- [Commits](https://github.com/mafintosh/tar-fs/compare/v2.1.3...v2.1.4)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-version: 2.1.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-28 09:35:24 +01:00
dependabot[bot]
7c8f3c29e0 Bump vite-plugin-static-copy from 0.17.0 to 2.3.2 in /frontend (#602)
Bumps [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy) from 0.17.0 to 2.3.2.
- [Release notes](https://github.com/sapphi-red/vite-plugin-static-copy/releases)
- [Changelog](https://github.com/sapphi-red/vite-plugin-static-copy/blob/vite-plugin-static-copy@2.3.2/CHANGELOG.md)
- [Commits](https://github.com/sapphi-red/vite-plugin-static-copy/compare/v0.17.0...vite-plugin-static-copy@2.3.2)

---
updated-dependencies:
- dependency-name: vite-plugin-static-copy
  dependency-version: 2.3.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-22 08:39:17 +01:00
dependabot[bot]
219e6b7392 Bump sha.js from 2.4.11 to 2.4.12 in /frontend (#603)
Bumps [sha.js](https://github.com/crypto-browserify/sha.js) from 2.4.11 to 2.4.12.
- [Changelog](https://github.com/browserify/sha.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/crypto-browserify/sha.js/compare/v2.4.11...v2.4.12)

---
updated-dependencies:
- dependency-name: sha.js
  dependency-version: 2.4.12
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-22 08:39:04 +01:00
dependabot[bot]
3ffdbba19b Bump helm.sh/helm/v3 from 3.18.4 to 3.18.5 (#600)
Bumps [helm.sh/helm/v3](https://github.com/helm/helm) from 3.18.4 to 3.18.5.
- [Release notes](https://github.com/helm/helm/releases)
- [Commits](https://github.com/helm/helm/compare/v3.18.4...v3.18.5)

---
updated-dependencies:
- dependency-name: helm.sh/helm/v3
  dependency-version: 3.18.5
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-14 19:08:48 +01:00
dependabot[bot]
f749db9c4d Bump on-headers and compression in /frontend (#598)
Bumps [on-headers](https://github.com/jshttp/on-headers) and [compression](https://github.com/expressjs/compression). These dependencies needed to be updated together.

Updates `on-headers` from 1.0.2 to 1.1.0
- [Release notes](https://github.com/jshttp/on-headers/releases)
- [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md)
- [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0)

Updates `compression` from 1.7.4 to 1.8.1
- [Release notes](https://github.com/expressjs/compression/releases)
- [Changelog](https://github.com/expressjs/compression/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/compression/compare/1.7.4...v1.8.1)

---
updated-dependencies:
- dependency-name: on-headers
  dependency-version: 1.1.0
  dependency-type: indirect
- dependency-name: compression
  dependency-version: 1.8.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-18 22:19:39 +03:00
dependabot[bot]
996f637a9d Bump helm.sh/helm/v3 from 3.18.3 to 3.18.4 (#597)
Bumps [helm.sh/helm/v3](https://github.com/helm/helm) from 3.18.3 to 3.18.4.
- [Release notes](https://github.com/helm/helm/releases)
- [Commits](https://github.com/helm/helm/compare/v3.18.3...v3.18.4)

---
updated-dependencies:
- dependency-name: helm.sh/helm/v3
  dependency-version: 3.18.4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-09 08:30:54 +01:00
Andrei Pohilko
2da8f23285 Lint 2025-07-07 14:04:09 +01:00
Andrei Pohilko
f22c84c288 Fix version upgrade notifier 2025-07-07 13:37:36 +01:00
Andrei Pohilko
285cc1fe1e Encode URL for repo
Fixes #595
2025-07-07 13:37:09 +01:00
komodor-bot
96e103ff84 Increment chart versions [skip ci] 2025-07-05 09:32:26 +00:00
Andrey Pokhilko
2717734406 Fix issue (#596) 2025-07-05 09:52:47 +01:00
Andrei Pohilko
9648f5ccce Update dependencies 2025-07-05 09:45:28 +01:00
dependabot[bot]
e1e176a22b Bump @babel/runtime from 7.21.0 to 7.27.0 in /frontend (#592)
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.21.0 to 7.27.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.0/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-version: 7.27.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-10 13:11:14 +01:00
dependabot[bot]
930eefae5d Bump tar-fs from 2.1.2 to 2.1.3 in /frontend (#593)
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 2.1.2 to 2.1.3.
- [Commits](https://github.com/mafintosh/tar-fs/commits)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-version: 2.1.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-06 08:31:40 +01:00
Andrey Pokhilko
aee1ac59ae Bump Golang to 1.24 (#591)
* Bump

* Update some libs

* Bump up

* Bump action

* More bumps

* Tidy
2025-04-24 10:54:40 +01:00
dependabot[bot]
cda3dd0c51 Bump tar-fs from 2.1.1 to 2.1.2 in /frontend (#589)
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 2.1.1 to 2.1.2.
- [Commits](https://github.com/mafintosh/tar-fs/compare/v2.1.1...v2.1.2)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-version: 2.1.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-14 22:20:15 +01:00
dependabot[bot]
2439515055 Bump github.com/containerd/containerd from 1.7.13 to 1.7.27 (#582)
Bumps [github.com/containerd/containerd](https://github.com/containerd/containerd) from 1.7.13 to 1.7.27.
- [Release notes](https://github.com/containerd/containerd/releases)
- [Changelog](https://github.com/containerd/containerd/blob/main/RELEASES.md)
- [Commits](https://github.com/containerd/containerd/compare/v1.7.13...v1.7.27)

---
updated-dependencies:
- dependency-name: github.com/containerd/containerd
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-14 21:38:05 +01:00
Saikota
6995fe957a Fixed the issue #577: Dashboard recommends updates while running the latest version (#584) 2025-03-28 13:44:16 +00:00
Yunlu Wen
5737e8495c load resource status lazily (#583)
Co-authored-by: Yunlu Wen <yunlu.wen@transwarp.io>
2025-03-27 11:47:30 +00:00
dependabot[bot]
6517c47754 Bump axios from 1.7.7 to 1.8.3 in /frontend (#581)
Bumps [axios](https://github.com/axios/axios) from 1.7.7 to 1.8.3.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.7...v1.8.3)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-13 13:01:14 +00:00
dependabot[bot]
aab9411ed2 Bump @babel/runtime-corejs3 from 7.22.6 to 7.26.10 in /frontend (#578)
Bumps [@babel/runtime-corejs3](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime-corejs3) from 7.22.6 to 7.26.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-runtime-corejs3)

---
updated-dependencies:
- dependency-name: "@babel/runtime-corejs3"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-13 12:27:37 +00:00
Andrei Pohilko
63eb98e309 Bump up action 2025-02-02 22:00:45 +00:00
Andrei Pohilko
5b2f1e2818 Fix trailing space 2025-02-02 21:51:17 +00:00
Andrei Pohilko
945e68590b Fix test 2025-02-02 21:22:53 +00:00
Andrei Pohilko
ee8bb96912 Use v2 2025-02-02 21:19:49 +00:00
Andrey Pokhilko
b0fb0e062b Update build.yml 2025-02-02 21:11:08 +00:00
Pedro González Serrano
dc6d781374 Fix modulepath (#575)
If the module is released at major version 2 or higher, the module path must end with a major version suffix like /v2. This may or may not be part of the subdirectory name

See https://go.dev/ref/mod#module-path
2025-02-02 21:07:37 +00:00
dependabot[bot]
d36bd6d09a Bump golang.org/x/net from 0.23.0 to 0.33.0 (#574)
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.23.0 to 0.33.0.
- [Commits](https://github.com/golang/net/compare/v0.23.0...v0.33.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-25 08:49:04 +00:00
dependabot[bot]
21209945f2 Bump store2 from 2.14.2 to 2.14.4 in /frontend (#573)
Bumps [store2](https://github.com/nbubna/store) from 2.14.2 to 2.14.4.
- [Commits](https://github.com/nbubna/store/compare/2.14.2...2.14.4)

---
updated-dependencies:
- dependency-name: store2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-25 08:36:27 +00:00
Idan Bunimovich
dabf99ec1f added load balancerip support (#572) 2025-01-16 09:04:05 +00:00
dependabot[bot]
13ac6385da Bump path-to-regexp and express in /frontend (#568)
Bumps [path-to-regexp](https://github.com/pillarjs/path-to-regexp) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `path-to-regexp` from 0.1.10 to 0.1.12
- [Release notes](https://github.com/pillarjs/path-to-regexp/releases)
- [Changelog](https://github.com/pillarjs/path-to-regexp/blob/master/History.md)
- [Commits](https://github.com/pillarjs/path-to-regexp/compare/v0.1.10...v0.1.12)

Updates `express` from 4.21.0 to 4.21.2
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.2/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.21.0...4.21.2)

---
updated-dependencies:
- dependency-name: path-to-regexp
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-12 10:54:06 +00:00
dependabot[bot]
2884712255 Bump nanoid from 3.3.6 to 3.3.8 in /frontend (#567)
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.6 to 3.3.8.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.6...3.3.8)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-12 10:53:48 +00:00
dependabot[bot]
751746f0d2 Bump golang.org/x/crypto from 0.21.0 to 0.31.0 (#566)
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.21.0 to 0.31.0.
- [Commits](https://github.com/golang/crypto/compare/v0.21.0...v0.31.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-12 09:07:24 +00:00
Aleksandr Cupacenko
e5e15f922c refactor persistent volume configuration (#565)
Co-authored-by: Aleksandr Cupacenko <alcu@danskebank.lt>
2024-12-02 11:51:00 +00:00
komodor-bot
1a39abbdb5 Increment chart versions [skip ci] 2024-12-01 21:44:44 +00:00
Aleksandr Cupacenko
69fe906c7d fix context decoding issue in Installed component (#563)
remove redundant code

correct encode decode

Co-authored-by: Aleksandr Cupacenko <alcu@danskebank.lt>
2024-11-26 16:15:32 +00:00
Aleksandr Cupacenko
3b0b44f392 refactor helm-dashboard.fullname template (#562)
fix ci

Co-authored-by: Aleksandr Cupacenko <alcu@danskebank.lt>
2024-11-25 10:46:36 +00:00
Aleksandr Cupacenko
922bb1c7c2 update service acccount name template logic (#561)
Co-authored-by: Aleksandr Cupacenko <alcu@danskebank.lt>
2024-11-22 09:29:55 +00:00
Aleksandr Cupacenko
f85343a173 add image digest field (#560)
Co-authored-by: Aleksandr Cupacenko <alcu@danskebank.lt>
2024-11-21 13:22:37 +00:00
dependabot[bot]
14fa9b8894 Bump cross-spawn from 7.0.3 to 7.0.6 in /frontend (#559)
Bumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.6.
- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.6)

---
updated-dependencies:
- dependency-name: cross-spawn
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-21 11:05:52 +00:00
Aleksandr Cupacenko
0436eabb51 simplify image tag assignment (#558)
Co-authored-by: Aleksandr Cupacenko <alcu@danskebank.lt>
2024-11-20 10:45:25 +00:00
komodor-bot
fb39d7e324 Increment chart versions [skip ci] 2024-11-13 11:38:40 +00:00
Andrei Pohilko
f1747b41d7 Clean yarn.lock before release 2024-11-13 11:21:03 +00:00
Andrei Pohilko
c4d4db9e68 Fix release scripts 2024-11-13 11:10:02 +00:00
dependabot[bot]
79cbd8ee31 Bump markdown-to-jsx from 7.2.1 to 7.5.0 in /frontend (#552)
Bumps [markdown-to-jsx](https://github.com/quantizor/markdown-to-jsx) from 7.2.1 to 7.5.0.
- [Release notes](https://github.com/quantizor/markdown-to-jsx/releases)
- [Changelog](https://github.com/quantizor/markdown-to-jsx/blob/main/CHANGELOG.md)
- [Commits](https://github.com/quantizor/markdown-to-jsx/compare/v7.2.1...v7.5.0)

---
updated-dependencies:
- dependency-name: markdown-to-jsx
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-15 20:20:04 +01:00
dependabot[bot]
83c4f14acb Bump vite from 4.5.3 to 4.5.5 in /frontend (#551)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.5.3 to 4.5.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.5.5/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.5.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-13 08:31:07 +01:00
dependabot[bot]
4603c12d76 Bump rollup from 3.29.4 to 3.29.5 in /frontend (#548)
Bumps [rollup](https://github.com/rollup/rollup) from 3.29.4 to 3.29.5.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.29.4...v3.29.5)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-12 16:28:35 +01:00
dependabot[bot]
eec255df66 Bump path-to-regexp and express in /frontend (#547)
Bumps [path-to-regexp](https://github.com/pillarjs/path-to-regexp) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `path-to-regexp` from 0.1.7 to 0.1.10
- [Release notes](https://github.com/pillarjs/path-to-regexp/releases)
- [Changelog](https://github.com/pillarjs/path-to-regexp/blob/master/History.md)
- [Commits](https://github.com/pillarjs/path-to-regexp/compare/v0.1.7...v0.1.10)

Updates `express` from 4.19.2 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

---
updated-dependencies:
- dependency-name: path-to-regexp
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-17 16:33:47 +03:00
dependabot[bot]
679843ede8 Bump send and express in /frontend (#546)
Bumps [send](https://github.com/pillarjs/send) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `send` from 0.18.0 to 0.19.0
- [Release notes](https://github.com/pillarjs/send/releases)
- [Changelog](https://github.com/pillarjs/send/blob/master/HISTORY.md)
- [Commits](https://github.com/pillarjs/send/compare/0.18.0...0.19.0)

Updates `express` from 4.19.2 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

---
updated-dependencies:
- dependency-name: send
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-17 16:33:34 +03:00
dependabot[bot]
c618ea1404 Bump serve-static and express in /frontend (#545)
Bumps [serve-static](https://github.com/expressjs/serve-static) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `serve-static` from 1.15.0 to 1.16.2
- [Release notes](https://github.com/expressjs/serve-static/releases)
- [Changelog](https://github.com/expressjs/serve-static/blob/v1.16.2/HISTORY.md)
- [Commits](https://github.com/expressjs/serve-static/compare/v1.15.0...v1.16.2)

Updates `express` from 4.19.2 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

---
updated-dependencies:
- dependency-name: serve-static
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-17 16:33:10 +03:00
dependabot[bot]
f739192e80 Bump axios from 1.6.1 to 1.7.7 in /frontend (#543)
Bumps [axios](https://github.com/axios/axios) from 1.6.1 to 1.7.7.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.1...v1.7.7)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-01 09:11:56 +01:00
dependabot[bot]
7af6267d58 Bump micromatch from 4.0.5 to 4.0.8 in /frontend (#542)
Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8.
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8)

---
updated-dependencies:
- dependency-name: micromatch
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-01 08:59:34 +01:00
dependabot[bot]
5397cec996 Bump github.com/docker/docker (#539)
Bumps [github.com/docker/docker](https://github.com/docker/docker) from 25.0.5+incompatible to 25.0.6+incompatible.
- [Release notes](https://github.com/docker/docker/releases)
- [Commits](https://github.com/docker/docker/compare/v25.0.5...v25.0.6)

---
updated-dependencies:
- dependency-name: github.com/docker/docker
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-11 11:00:43 +01:00
Vimal Vinod
1ec3200ce0 corrected grammar and spelling in README.md (#540) 2024-08-11 10:57:53 +01:00
dependabot[bot]
780b8c4d06 Bump braces from 3.0.2 to 3.0.3 in /frontend (#537)
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: braces
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-18 10:02:03 +01:00
dependabot[bot]
2291b92f86 Bump ws from 6.2.2 to 6.2.3 in /frontend (#536)
Bumps [ws](https://github.com/websockets/ws) from 6.2.2 to 6.2.3.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/6.2.2...6.2.3)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-18 09:51:18 +01:00
dependabot[bot]
2868149f48 Bump ejs from 3.1.9 to 3.1.10 in /frontend (#528)
Bumps [ejs](https://github.com/mde/ejs) from 3.1.9 to 3.1.10.
- [Release notes](https://github.com/mde/ejs/releases)
- [Commits](https://github.com/mde/ejs/compare/v3.1.9...v3.1.10)

---
updated-dependencies:
- dependency-name: ejs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-02 16:48:55 +01:00
dependabot[bot]
91969ab08c Bump golang.org/x/net from 0.22.0 to 0.23.0 (#527)
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.22.0 to 0.23.0.
- [Commits](https://github.com/golang/net/compare/v0.22.0...v0.23.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 14:51:12 +01:00
dependabot[bot]
e997a92c63 Bump tar from 6.1.15 to 6.2.1 in /frontend (#526)
Bumps [tar](https://github.com/isaacs/node-tar) from 6.1.15 to 6.2.1.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v6.1.15...v6.2.1)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-11 12:37:22 +01:00
dependabot[bot]
f75beae31a Bump vite from 4.5.2 to 4.5.3 in /frontend (#525)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.5.2 to 4.5.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.5.3/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.5.3/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-04 11:18:02 +01:00
Andrei Pohilko
d56ee6a42b Bump up pipeline to 1.22 2024-03-31 12:34:21 +01:00
Andrei Pohilko
d123bcee93 Golang 1.22 2024-03-31 11:52:47 +01:00
dependabot[bot]
60e599be46 Bump express from 4.18.2 to 4.19.2 in /frontend (#524)
Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-29 12:45:22 +00:00
dependabot[bot]
14d59e2900 Bump github.com/docker/docker (#522)
Bumps [github.com/docker/docker](https://github.com/docker/docker) from 25.0.3+incompatible to 25.0.5+incompatible.
- [Release notes](https://github.com/docker/docker/releases)
- [Commits](https://github.com/docker/docker/compare/v25.0.3...v25.0.5)

---
updated-dependencies:
- dependency-name: github.com/docker/docker
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 09:04:21 +00:00
dependabot[bot]
fc0b051b91 Bump helm.sh/helm/v3 from 3.14.1 to 3.14.2 (#514)
Bumps [helm.sh/helm/v3](https://github.com/helm/helm) from 3.14.1 to 3.14.2.
- [Release notes](https://github.com/helm/helm/releases)
- [Commits](https://github.com/helm/helm/compare/v3.14.1...v3.14.2)

---
updated-dependencies:
- dependency-name: helm.sh/helm/v3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-18 21:32:47 +00:00
dependabot[bot]
16e6c49de0 Bump follow-redirects from 1.15.4 to 1.15.6 in /frontend (#521)
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-17 09:02:26 +00:00
dependabot[bot]
80ad1c6c7a Bump google.golang.org/protobuf from 1.32.0 to 1.33.0 (#520)
Bumps google.golang.org/protobuf from 1.32.0 to 1.33.0.

---
updated-dependencies:
- dependency-name: google.golang.org/protobuf
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-14 08:52:55 +00:00
suchsoon
c8bf9eb05c fix typo (#519)
Signed-off-by: suchsoon <silverjadebeauty@gmail.com>
2024-03-10 19:04:19 +00:00
Alessandro Detta
aac7e7d2bc Fix resource status not enhanced for calls to /api/k8s/{kind}/get route (#517) 2024-02-28 14:04:02 +00:00
Alessandro Detta
274f1cd6cc Added ability to disable query to ArtifactHub via env (#515)
It is now possible to disable the query through environment variable HD_NO_ARTIFACT_HUB_QUERY
2024-02-23 20:37:43 +00:00
Alessandro Detta
b5bed10571 Added greater granularity for boolean environment variables (#511)
* Added greater granularity for boolean environment variables

* Improved solution as reviewed
2024-02-22 10:35:53 +00:00
dependabot[bot]
3d7f907a33 Bump ip from 2.0.0 to 2.0.1 in /frontend (#513)
Bumps [ip](https://github.com/indutny/node-ip) from 2.0.0 to 2.0.1.
- [Commits](https://github.com/indutny/node-ip/compare/v2.0.0...v2.0.1)

---
updated-dependencies:
- dependency-name: ip
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-21 08:51:56 +00:00
Andrei Pohilko
947c0aa96f Bump up setup-go in CI 2024-02-20 12:49:33 +00:00
Andrei Pohilko
20128d39f3 Bump up linter CI action 2024-02-20 12:36:20 +00:00
Andrey Pokhilko
46fef30caf Bump up golang to 1.21 and dependencies (#512)
* Bump up golang to 1.21 and dependencies

* Upgrade some deps

* Update all dependencie

* Remove deprecated
2024-02-19 16:34:16 +00:00
iiice_oo
f7e92f1744 fix: history-max does not work when exec helm upgrade (#507)
Signed-off-by: iiiceoo <iiiceoo@foxmail.com>
2024-02-02 18:27:44 +00:00
Tamir Abutbul
6a7cadef70 Cluter list test (#503)
* Render cluster list on the screen

* Init the test

* Finish the test
2024-01-23 17:46:42 +00:00
Tamir Abutbul
383760e7a7 Added "Add repo" senario testing (#502)
* Adding start of add repository flow

* Adding data-cy instead of css selectors

* Saving progress

* Adding fixture data

* Cleaning the test
2024-01-23 10:26:07 +00:00
iiice_oo
e954b7a37c feat: Use --dry-run=server to make lookup work properly while diff (#501)
Signed-off-by: iiiceoo <iiiceoo@foxmail.com>
2024-01-23 09:59:47 +00:00
iiice_oo
9481c9afed feat: Set history-max through env HELM_MAX_HISTORY (default 10) (#500)
Signed-off-by: iiiceoo <iiiceoo@foxmail.com>
2024-01-22 09:33:32 +00:00
dependabot[bot]
4afb773205 Bump vite from 4.3.9 to 4.5.2 in /frontend (#499)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.3.9 to 4.5.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.5.2/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.5.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-20 08:36:33 +00:00
dependabot[bot]
4eb1dd91b1 Bump follow-redirects from 1.15.2 to 1.15.4 in /frontend (#497)
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.2 to 1.15.4.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.2...v1.15.4)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-09 08:52:14 +00:00
Tamir Abutbul
03c2f321c4 Adding cypress + example test (#476) 2024-01-09 10:05:43 +02:00
Tamir Abutbul
37557126f0 Extract modal title to components (#496) 2024-01-07 10:03:35 +00:00
dependabot[bot]
7aeabc081c Bump golang.org/x/crypto from 0.14.0 to 0.17.0 (#494)
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.14.0 to 0.17.0.
- [Commits](https://github.com/golang/crypto/compare/v0.14.0...v0.17.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-19 08:55:16 +00:00
dependabot[bot]
436e01fcbf Bump axios from 1.4.0 to 1.6.1 in /frontend (#491)
Bumps [axios](https://github.com/axios/axios) from 1.4.0 to 1.6.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.4.0...v1.6.1)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-11 20:13:51 +00:00
warjiang
d78e0c5866 update helm charts for helm-dashboard (#490)
* update helm charts for helm-dashboard

1. fix `imagePullSecrets` bug in deployment.yaml
2. add `global` config
3. optimize image field with global registry config

* doc: update doc for charts
2023-11-07 11:07:25 +00:00
kame
4c84b795a0 Removal of ignore notation in storybook eslint and transition to actions function (#489)
* fix: desprecated .storybook/main.ts and actions-addons

* remove: ignore notation in storybook eslint and transition to actions function

* remove: unnecessary eslint ignore code
2023-11-04 15:53:26 +00:00
kame
de1915e1c2 Migrated Storybook notation from CSF2 to CSF3 (#487)
* Migrate common directory to CSF3 notation

* Migrate InstalledPackages directory to CSF3 notation

* Migrate modal directory to CSF3 notation

* Migrate repository directory to CSF3 notation

* Migrate others components to CSF3 notation

* Fix lint error in repository directory
2023-11-01 18:11:57 +00:00
dependabot[bot]
f465c83c07 Bump google.golang.org/grpc from 1.53.0 to 1.56.3 (#483)
Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.53.0 to 1.56.3.
- [Release notes](https://github.com/grpc/grpc-go/releases)
- [Commits](https://github.com/grpc/grpc-go/compare/v1.53.0...v1.56.3)

---
updated-dependencies:
- dependency-name: google.golang.org/grpc
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-26 10:23:52 +01:00
Anirudh Hegde
9ffcde1950 Updated README.md (#481) 2023-10-19 18:16:35 +01:00
dependabot[bot]
aa43dee3a4 Bump @babel/traverse, @storybook/addon-essentials, @storybook/react-vite and storybook (#480)
Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) to 7.23.2 and updates ancestor dependencies [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse), [@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials), [@storybook/react-vite](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-vite) and [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/cli). These dependencies need to be updated together.


Updates `@babel/traverse` from 7.22.5 to 7.23.2
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse)

Updates `@storybook/addon-essentials` from 7.0.24 to 7.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v7.5.0/code/addons/essentials)

Updates `@storybook/react-vite` from 7.0.24 to 7.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v7.5.0/code/frameworks/react-vite)

Updates `storybook` from 7.0.24 to 7.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v7.5.0/code/lib/cli)

---
updated-dependencies:
- dependency-name: "@babel/traverse"
  dependency-type: indirect
- dependency-name: "@storybook/addon-essentials"
  dependency-type: direct:development
- dependency-name: "@storybook/react-vite"
  dependency-type: direct:development
- dependency-name: storybook
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-19 08:42:32 +01:00
Pravesh-Sudha
1c3b69b3ec Fix Some indentation in Readme.md file to look it more professional (#479) 2023-10-13 15:47:29 +01:00
dependabot[bot]
745545f05e Bump golang.org/x/net from 0.10.0 to 0.17.0 (#478)
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.10.0 to 0.17.0.
- [Commits](https://github.com/golang/net/compare/v0.10.0...v0.17.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-12 08:37:23 +01:00
dependabot[bot]
764ad3e03a Bump postcss from 8.4.24 to 8.4.31 in /frontend (#477)
Bumps [postcss](https://github.com/postcss/postcss) from 8.4.24 to 8.4.31.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.24...8.4.31)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-08 11:00:54 +01:00
Nir Parisian
c251e6c697 Fix/chart-link-cluster-mode (#474) 2023-10-02 19:10:04 +03:00
Saptarshi Das
88ea89a5ba Improved revision block for long numbers (#473)
* Improved revision block for long numbers

* Update yarn.lock

---------

Co-authored-by: Saptarshi Das <saptarhydas9@gmail.com>
2023-09-27 21:52:51 +01:00
Andrei Pohilko
d236ca99c8 Improve Readme 2023-09-26 11:08:31 +01:00
Andrei Pohilko
e4d4baa0b1 Prepare Helm chart for new release 2023-09-26 10:51:21 +01:00
Andrey Pokhilko
dd7aca70ff Rename frontend directory (#472)
* Rename directory

* Cleanup

* Recover lost images

* remove lint
2023-09-26 10:04:44 +01:00
dependabot[bot]
133eef6745 Bump word-wrap from 1.2.3 to 1.2.5 in /dashboard (#471)
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.5.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.5)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Andrey Pokhilko <andrei@komodor.io>
2023-09-26 09:26:10 +01:00
dependabot[bot]
9a3407dbd9 Bump semver from 5.7.1 to 5.7.2 in /dashboard (#470)
Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-09-26 09:24:36 +01:00
Andrey Pokhilko
e4240ed107 v2.0 with React-based frontend (#233)
* Correct path to static dir

* Add UI build to makefile

* Fix docker build

* describe now works

* Installed page - revision view - implement url consistent state logic (#403)

* refactor

* refactor

* Fix/responsive and small stylings (#404)

* add user defined (#405)

* Fix/modal loading button (#406)

* add repo to url (#407)

* Fix/resources table badges (#408)

* filters is now good

* fix

* test results fix

* fix

* fixes - error modal, uninstall modals, typees

* fixes

* bug fix

* Helm dashboard v2 (#402)

* missing config (#409)

* fixes

* fixes

* Fix/minor responsiveness (#410)

* installed release page

* default helm icon

* guard

* refactor

* refactor

* refactor

* key

* refactor

* fixes

* fixes to install

* install, add, upgrade, reconfigure now works

* latest ver fix

* Revision page ui fixes (#411)

* link color

* Add-repository-link (#412)

* empty badge fix

* diff fix in install repo

* removed console.log

* unique key in helathstatus

* Cosmetics

* Goreleaser upgraded

* Another way to fix it

* refactor

* refactor

* chart install fix (#413)

* more maintailable

* loading, empty space and default namespace

* typed

* loading diff state is shared

* modal height fix

* upgrade and add repo connected

* add repo suggestion data connected to modal

* removed console.log

* Chart install fix (#414)

* refactor: fix text align uninstall

* install modal values big fix

* refactor

* no changes in diff msg

* refactor

* sorted versions

* typography changes

* refactor

* refactor

* refactor

* migrate to sb 7 (#416)

* Chart install fix (#415)

* Add troubleshoot in komodor (#417)

* status style

* fix

* fixes

* delete now reload the page correclty

* navigate after add repo fix

* Chart install fix (#419)

* refactor

* refactor

* Fix revision age (#420)

* refactor

* fixed redirects and nav links selected ui (#421)

* test modal ui fixes

* arrows fix

* loading ui (#422)

* test dialog now shows errors

* fixed rollback diff, redirect after rollback, and debouncing before refetching chart values after changing user defined values (#423)

* everything is working besides install chart

* install chart should work now

* no need for this anymore

* styling and naming

* improvements

* navigation fix

* flow fixes

* top bar pixel perfect

* onClose is optional

* ts optional

* pixel perfect - clusters, box shadow, error modal

* installed page pixel perfect

* fixes

* need to fix this naming

* rollback logic is now good

* buttons now similiar to the old app

* pass release instead of release date (#426)

* repository page style fixes

* rounded input

* colors like in the old app

* more rounding

* colors

* colors

* Cosmetics

* drop-shadow cause the dropdown to swallowed

* smaller text

* fixes (#428)

* fixes

* describe fix

* Fix/lint (#431)

* style fixes

* fix

* describe panel style fixes

* diff when repo is available

* diff style fixes

* fixes to install dialog

* specific version should be latests revision

* refactor

* fixes

* fixes

* cause troubles

* Fixes (#434)

* fix

* dont fetch if repo not available

* tag should not be visible

* custom-shdaow fixes

* space and shadow like in the old app

* refactor (#435)

* describe display logic aligned with the old app

* style fix

* action button style fix

* selected revision default logic fix

* font fix

* style fixes

* shutdown button fix

* latest revision is now consistent in dev and prod

* namespace should be empty on install

* fix for current version on install

* sorting fix

* checkmark should be displayed in options - install

* state jump fix

* local charts (#436)

* Several more fixes (#438)

* api docs (#439)

* html remove diff2html dep (#437)

* Refactor

* refactor

* Adding storybook for StatusLabel component (#441)

* refactor (#442)

* we need the css

* add prettier (#440)

* add prettier

* refactor

* refactor

* Fix reconfigure issue (#443)

* first diff fetch fix

* missing dep in hooks (#444)

* namespace should be from query

* triggering diff rerender by listening to loading

* missing uservalues

* no need for auto retry

* we should work against latest revision

* refactor

* Fix build merge

* refactor

* refactor

* fix

* refactor

* refactor

* age tooltip

* prettier fix

* fix bug (#447)

* Add eslint now (#449)

* repo install chart now works as expected

* release modal and eslint working good now

* we should fetch when return to the initial value

* Tailwind theme reorganized (#446)

* install release code is like reading a story !

* namespace is not needed for chart values

* install repo chart is now like reading a story :)

* Fix/filternamesapce (#451)

* not needed dep

* prettier fix

* namespace fix

* add debounce (#452)

* namespace filter fix

* now namespace filter behaves like in the old app

* more linter rules and configurations

* intial value should be empty

* no need to keep filters on cluster change

* we don't want to keep tab state between pages

* button should be disabled when loading

* prettier fix

* initial value we're not presented

* navigation fix

* namespace should always be empty

* supporting pre selected namespaces

* lint adjustments

* Refactor stories fodler (#450)

* refactor

* refactor

* if no user values, use the release values

* Adding layer to base style (#456)

* Extract duplicate type to types file (#453)

* Refactor callApi into direct usage of apiService (#454)

* Remove scanners from backend

* Give some room for multiple HealthStatus (#458)

* refactor: add dynamic api docs (#460)

* remove scanners from openapi

* was loading forever

* fix

* Extract defined values from the Modals (#461)

* refactor (#462)

* fix chart with no repo diff flow

* naming fix

* crypto UUID not available through https

* revert

* Update analytics.js with UUID fallback

* Cosmetics

* repo fetch fix

* not need to depened on versions

* forgot to push

* revert

* was causing infinite loop

* COsmetics

---------

Co-authored-by: Nir Parisian <nir.parisian@gmail.com>
Co-authored-by: dav-sap <davidsaper@gmail.com>
Co-authored-by: chad11111 <chad1111@tutanota.com>
Co-authored-by: IdanSchiller <58664272+IdanSchiller@users.noreply.github.com>
Co-authored-by: dav-sap <16819417+dav-sap@users.noreply.github.com>
Co-authored-by: rotembm12 <46103618+rotembm12@users.noreply.github.com>
Co-authored-by: naorzr <naorzruk@gmail.com>
Co-authored-by: Gary Gensler <127234894+chad11111@users.noreply.github.com>
Co-authored-by: Tamir Abutbul <1tamir198@gmail.com>
Co-authored-by: Nir Parisian <nir2002@users.noreply.github.com>
2023-09-26 09:21:04 +01:00
geekvest
227966b2f1 fix some typos (#467)
Signed-off-by: geekvest <cuimoman@sohu.com>
2023-09-25 21:56:57 +01:00
dependabot[bot]
be3a5b8605 Bump github.com/cyphar/filepath-securejoin from 0.2.3 to 0.2.4 (#466)
Bumps [github.com/cyphar/filepath-securejoin](https://github.com/cyphar/filepath-securejoin) from 0.2.3 to 0.2.4.
- [Release notes](https://github.com/cyphar/filepath-securejoin/releases)
- [Commits](https://github.com/cyphar/filepath-securejoin/compare/v0.2.3...v0.2.4)

---
updated-dependencies:
- dependency-name: github.com/cyphar/filepath-securejoin
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-09-07 14:22:28 +01:00
Andrey Pokhilko
2843830ea1 Fix debug flag in helm chart 2023-08-10 10:43:46 +01:00
Andrei Pohilko
d46d7ab1da refactoring 2023-08-03 18:05:33 +01:00
Vikas Kumar
0b354331d5 Handled resource kind PodDisruptionBudget and CRD for health status. (#448)
* Handled resource kind PodDisruptionBudget and CRD for health status.

* Handled resource kind PodDisruptionBudget and CRD for health status.

---------

Co-authored-by: vkumar3 <vkumar@aarnanetworks.com>
2023-07-28 22:01:56 +01:00
Andrei Pohilko
64331ad33a Fix helm lint 2023-07-21 16:33:07 +01:00
Andrei Pohilko
5b60263a41 Don't create ClusterRole if disabled 2023-07-21 15:19:20 +01:00
S Kumar Dhananjaya
95f14ed295 info added to FEATURES.md (#433)
* added more info to features.md

* added details to FEATURES.md

* .

* reset to last commit

* Update FEATURES.md
2023-07-20 22:20:56 +01:00
Andrei Pohilko
eb51f8a130 Fix issue of goreleaser 2023-07-08 12:49:28 +01:00
geet hirawat
5531286da6 Refactoring install plugin script (#427)
* Refactor: Improve functionality and efficiency of installation script

* Refactor: Improve functionality and efficiency of installation script

* fixed the spacing error and also added the helm debug logic
2023-07-06 21:19:24 +01:00
S Kumar Dhananjaya
e8fe75e433 FEATURES.md file #255 (#425)
* Updated FEATURES.md file

* Update FEATURES.md
2023-07-06 09:34:47 +01:00
Andrei Pohilko
aa79f67bf2 Fix crash on reconfiguring repoless release with deps 2023-06-27 11:21:24 +01:00
Andrey Pokhilko
4e2d3186a1 Optimize single release getting (#373)
* Optimize single release getting

* Disable unused releases getting

* fix build

* Remove unused code completely
2023-06-23 10:18:44 +01:00
komodor-bot
14abc28c7d Increment chart versions [skip ci] 2023-06-22 09:21:09 +00:00
Andrey Pokhilko
b61adf133f Second attempt to do multiarch image (#370)
* Second attempt to do multiarch image

* Build it

* Arch Args

* Auth for push

* Remove condition

* Fix tag name

* Another try

* Finalize changes
2023-06-21 12:42:14 +01:00
Andrey Pokhilko
27eb7949e5 Change commit message of chart release (#369) 2023-06-19 11:23:31 +01:00
komodor-bot
b90198915e Increment chart versions [skip ci] 2023-06-10 17:48:04 +00:00
Andrey Pokhilko
64975cac42 Build and release ARM docker images (#367)
* Build and release ARM docker images

* Build and release ARM docker images

* Build and release ARM docker images

* Build and release ARM docker images
2023-06-10 17:56:30 +01:00
dependabot[bot]
087399ad49 Bump github.com/docker/distribution (#366)
Bumps [github.com/docker/distribution](https://github.com/docker/distribution) from 2.8.1+incompatible to 2.8.2+incompatible.
- [Release notes](https://github.com/docker/distribution/releases)
- [Commits](https://github.com/docker/distribution/compare/v2.8.1...v2.8.2)

---
updated-dependencies:
- dependency-name: github.com/docker/distribution
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-06-10 14:12:54 +01:00
Pushkar Pandey
fc385344f4 Doc feature: Release Detail (#364)
Help user to know the capability of Helm-Dashboard
2023-06-10 13:49:46 +01:00
Andrei Pohilko
56932f2c34 Fix build 2023-06-02 13:22:22 +01:00
Andrei Pohilko
24df4a21d6 Fix linter errors after go 1.20 2023-06-02 13:06:10 +01:00
Andrei Pohilko
bea75cb011 Bump up golang to 1.20 2023-06-02 12:22:35 +01:00
dependabot[bot]
a07c8f273d Bump github.com/docker/distribution (#361)
Bumps [github.com/docker/distribution](https://github.com/docker/distribution) from 2.8.1+incompatible to 2.8.2+incompatible.
- [Release notes](https://github.com/docker/distribution/releases)
- [Commits](https://github.com/docker/distribution/compare/v2.8.1...v2.8.2)

---
updated-dependencies:
- dependency-name: github.com/docker/distribution
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-06-02 12:19:34 +01:00
dependabot[bot]
eb11a8f26e Bump github.com/gin-gonic/gin from 1.9.0 to 1.9.1 (#363)
Bumps [github.com/gin-gonic/gin](https://github.com/gin-gonic/gin) from 1.9.0 to 1.9.1.
- [Release notes](https://github.com/gin-gonic/gin/releases)
- [Changelog](https://github.com/gin-gonic/gin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gin-gonic/gin/compare/v1.9.0...v1.9.1)

---
updated-dependencies:
- dependency-name: github.com/gin-gonic/gin
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-06-02 12:19:17 +01:00
Andrei Pohilko
f0545d35f1 Bump up library dependencies 2023-05-30 09:20:35 +01:00
sachi3050
57f7c47dd1 Update build.yml (#359)
just a little bit of grammar correction.
2023-05-28 17:44:01 +01:00
Pushkar Pandey
0b4031bf24 Doc Feature: Installed Releases List (#356)
* Doc Feature: Installed Releases List

Helps user to know the features of Helm-Dashboard

* updated doc

* doc modify

* modify doc

* modify doc
2023-05-24 10:53:14 +01:00
Pushkar Pandey
e143963d46 Doc Features: Repository (#353)
* Doc Features: Repository

* Docs improvement

* modify doc

* doc correction

* doc improvement
2023-05-15 08:58:10 +01:00
dependabot[bot]
b933e2dd9b Bump github.com/docker/distribution (#354)
Bumps [github.com/docker/distribution](https://github.com/docker/distribution) from 2.8.1+incompatible to 2.8.2+incompatible.
- [Release notes](https://github.com/docker/distribution/releases)
- [Commits](https://github.com/docker/distribution/compare/v2.8.1...v2.8.2)

---
updated-dependencies:
- dependency-name: github.com/docker/distribution
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-05-12 08:22:51 +01:00
Andrey Pohilko
0e15fe2001 Fix sorting of versions
Fixes #326
Closes #349
2023-05-10 15:10:58 +03:00
Andrey Pohilko
021fe9c897 Add codecov badge 2023-05-09 11:16:41 +03:00
Andrey Pohilko
5f6104dbba Change name of UT coverage file 2023-05-09 11:09:25 +03:00
Andrey Pohilko
8e9a464d62 Merge remote-tracking branch 'origin/main' 2023-05-09 11:03:40 +03:00
Andrey Pohilko
3a7bb3efb6 Add codecov integration 2023-05-09 11:03:23 +03:00
Pushkar Pandey
d2259241e6 Doc features: Multicluster (#352)
* Doc features: Multicluster

Helps the user to switch to a different cluster.

* Added the screenshot

* Update FEATURES.md

* screenshot added
2023-05-08 20:34:07 +03:00
dependabot[bot]
aad9992302 Bump github.com/gin-gonic/gin from 1.8.1 to 1.9.0 (#350)
Bumps [github.com/gin-gonic/gin](https://github.com/gin-gonic/gin) from 1.8.1 to 1.9.0.
- [Release notes](https://github.com/gin-gonic/gin/releases)
- [Changelog](https://github.com/gin-gonic/gin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gin-gonic/gin/compare/v1.8.1...v1.9.0)

---
updated-dependencies:
- dependency-name: github.com/gin-gonic/gin
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-05-05 09:47:19 +03:00
Pushkar Pandey
30eb209043 Doc Features: Application shutdown (#347)
* Docs: To know to capability of application

* Create screenshot_shut_down.png

* Update FEATURES.md
2023-04-27 15:50:20 +01:00
Kashish Lakhara
1dcb77812f docs: fixed typos (#340) 2023-04-17 10:51:54 +01:00
Harshit Mehta
245863b2f9 bug: fix sorting of release versions (#336)
Signed-off-by: Harshit Mehta <hdm23061993@gmail.com>
2023-04-14 11:37:31 +01:00
Itiel shwartz
dd1fe05d65 fix yaml parsing (#330) 2023-04-11 17:06:42 +01:00
komodor-bot
450804ba24 Increment chart versions [skip ci] 2023-04-11 11:48:31 +00:00
Andrei Pohilko
a2ddb94c16 Merge branch 'main' of github.com:komodorio/helm-dashboard 2023-04-11 12:15:27 +01:00
Andrei Pohilko
861de33bfe Record event when error is shown 2023-04-11 12:15:09 +01:00
Andrei Pohilko
26d82dd5ab Omit storageClassName if it is null
Fixes #226
2023-04-11 12:10:30 +01:00
Andrei Pohilko
b1294cbe1a Make failed manifest parse be shown less breaking
Relates to #328
2023-04-11 12:09:12 +01:00
dependabot[bot]
d4583a222e Bump github.com/docker/docker (#317)
Bumps [github.com/docker/docker](https://github.com/docker/docker) from 20.10.21+incompatible to 20.10.24+incompatible.
- [Release notes](https://github.com/docker/docker/releases)
- [Commits](https://github.com/docker/docker/compare/v20.10.21...v20.10.24)

---
updated-dependencies:
- dependency-name: github.com/docker/docker
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-04-11 09:37:34 +01:00
Satyam Singh
a0bf59edc6 Added Link to the v1.3.0 badge (#319)
* Added Link to the v1.3.0 badge

Added link of Release v1.3.0 to the badge of v1.3.0 and it now redirects to the v1.3.0

* Added link to the release badge 

Added link to the release badge which will now redirect to the latest release
2023-04-09 16:30:07 +01:00
komodor-bot
79a79979e2 Increment chart versions [skip ci] 2023-03-30 12:38:29 +00:00
ElisarEisenbach
76e4fe51b5 Refactoring analytics (#311)
* exampple

* send call type in function

* remove heap check

---------

Co-authored-by: itielshwartz <itielshw@gmail.com>
2023-03-30 14:42:35 +03:00
ElisarEisenbach
95ea5e4d6d Send analytics to server (#310)
* start adding functions

* refactoring analytics functions

* formatting analytics
2023-03-30 09:29:01 +01:00
Andrei Pohilko
c139f3941d Merge branch 'main' of github.com:komodorio/helm-dashboard 2023-03-24 17:39:49 +00:00
Andrei Pohilko
80022c3ef8 Don't fail on single resource status error
Relates to #301
2023-03-24 17:39:29 +00:00
Viet Nguyen
a07cfcdbb4 Fix typo on readme doc (#265) 2023-03-23 10:00:06 +00:00
Andrei Pohilko
8826124f70 Merge branch 'main' of github.com:komodorio/helm-dashboard 2023-03-23 09:55:29 +00:00
Andrei Pohilko
703b4029de Cosmetic cleanup 2023-03-23 09:55:11 +00:00
Harshit Mehta
a2dc1ed96b update README (#270) 2023-03-17 14:06:14 +00:00
Harshit Mehta
29c1682bbb Removing redundant table header (#268) 2023-03-16 12:31:43 +00:00
Andrei Pohilko
c7d18a7fb7 Count API docs in user analytics 2023-03-13 17:11:20 +00:00
Andrei Pohilko
e9ee10287b Improve console message in case no k8s connection possible 2023-03-13 15:26:32 +00:00
Andrey Pokhilko
57d4d073e9 Display resource health aggregate icons on list of releases (#235)
* Display aggregate resource health status

* Reuse old API request, show icons

* Take progress indication from deployment conditions

* Improve status

* Cleanup

* Fixups

* Squares approach
2023-03-13 12:56:31 +00:00
Harshit Mehta
47dae4d35a Add username and password support to Repo add feature (#228)
* Add username and password support to Repo add in UI

* Add support for Username and Passowrd in Add Repo API
2023-03-09 13:34:05 +00:00
Harshit Mehta
0ac8eec368 Minor UI fixes (#234) 2023-03-09 08:45:41 +00:00
komodor-bot
aec46d43f7 Increment chart versions [skip ci] 2023-03-08 09:27:49 +00:00
Andrei Pohilko
37e1d44bf1 Remove survey banner code 2023-03-07 15:07:59 +00:00
Andrei Pohilko
362cb09e6d Improve logo source 2023-03-07 15:00:49 +00:00
Andrei Pohilko
209f5b5e44 Improve upgradable status display 2023-03-07 14:51:46 +00:00
Andrei Pohilko
a0680a4820 Add links to Komodor 2023-03-07 12:51:39 +00:00
Andrei Pohilko
d95cac94d5 Auto-update repositories each 10 minutes, unless HD_NO_AUTOUPDATE is set 2023-03-06 11:38:33 +00:00
Andrey Pokhilko
bbb425bfea Query ArtifactHub for repo suggestion (#225)
* Query ArtifactHub for repo suggestion

* Refactor & improve

* Add notice on local chart support
2023-03-02 10:22:32 +00:00
komodor-bot
679d31e4ab Increment chart versions [skip ci] 2023-02-22 12:45:52 +00:00
Andrei Pohilko
3119d17738 Ignore test file 2023-02-22 11:35:02 +00:00
Andrei Pohilko
778e58360c Fix the values not considered correctly when loading the upgrade preview 2023-02-22 11:24:03 +00:00
Andrei Pohilko
a7c7ba80fe Overwrite old values correctly, don't cache current resources list 2023-02-21 15:22:49 +00:00
dependabot[bot]
d86c46aabf Bump golang.org/x/net from 0.5.0 to 0.7.0 (#220)
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.5.0 to 0.7.0.
- [Release notes](https://github.com/golang/net/releases)
- [Commits](https://github.com/golang/net/compare/v0.5.0...v0.7.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-18 09:16:04 +00:00
Harshit Mehta
c79259275a Execute install script in debug mode only when HELM_DEBUG flag is set (#219) 2023-02-17 12:52:50 +00:00
Andrey Pokhilko
4a4760d5b8 Update README.md 2023-02-16 16:36:13 +00:00
dependabot[bot]
244e35bb6b Bump github.com/containerd/containerd from 1.6.15 to 1.6.18 (#216)
Bumps [github.com/containerd/containerd](https://github.com/containerd/containerd) from 1.6.15 to 1.6.18.
- [Release notes](https://github.com/containerd/containerd/releases)
- [Changelog](https://github.com/containerd/containerd/blob/main/RELEASES.md)
- [Commits](https://github.com/containerd/containerd/compare/v1.6.15...v1.6.18)

---
updated-dependencies:
- dependency-name: github.com/containerd/containerd
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-16 15:08:46 +00:00
Andrei Pohilko
709c3c600b Fix inability to reconfigure charts without corresponding repository 2023-02-16 12:32:48 +00:00
komodor-bot
3060b92f8e Increment chart versions [skip ci] 2023-02-15 18:00:36 +00:00
Andrey Pokhilko
f49f52efe4 Support working with local charts (#215)
* Basic functioning

* Support reconfiguring

* Improve tests coverage

* Always update local repo, don't offer to delete it

* Handle multi-repo correctly

* Document local charts usage

* Screenshot for docs
2023-02-15 16:45:28 +00:00
Bhargav Ravuri
6a4ca793c9 New CLI Flag --devel To Include Development/Prerelease Versions of Charts (#139)
* Include devel Flag for Toggling Dev Chart Versions

The flag `--devel` for enabling/disabling dev versions
of charts in following endpoints:
1. /api/helm/repositories/kafka-operator
2. /api/helm/repositories/versions
3. /api/helm/repositories/latestver

Signed-off-by: Bhargav Ravuri <bhargav.ravuri@infracloud.io>

* Run Tests on Devel Flag Related Changes

Signed-off-by: Bhargav Ravuri <bhargav.ravuri@infracloud.io>

---------

Signed-off-by: Bhargav Ravuri <bhargav.ravuri@infracloud.io>
2023-02-11 16:02:01 +00:00
Andrey Pokhilko
61b67f8bed Display UI indication if chart is upgradable (#211) 2023-02-10 12:36:40 +00:00
dependabot[bot]
ac690b6332 Bump helm.sh/helm/v3 from 3.10.3 to 3.11.1 (#212)
Bumps [helm.sh/helm/v3](https://github.com/helm/helm) from 3.10.3 to 3.11.1.
- [Release notes](https://github.com/helm/helm/releases)
- [Commits](https://github.com/helm/helm/compare/v3.10.3...v3.11.1)

---
updated-dependencies:
- dependency-name: helm.sh/helm/v3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-09 11:25:58 +00:00
Andrei Pohilko
b613e4e9dc Fix list of releases not displaying pending 2023-02-08 12:07:49 +00:00
Andrei Pohilko
a9939d5067 Improve tests for repositories
Relates to #210
2023-02-08 10:11:18 +00:00
Andrei Pohilko
7a25335028 Fix PVC+PV definition in chart 2023-02-05 15:56:45 +00:00
Itiel shwartz
8befc1d017 Update README.md
Update survey in the readme
2023-02-02 11:46:04 +02:00
komodor-bot
aaf6ae80c5 Increment chart versions [skip ci] 2023-02-01 16:20:28 +00:00
Andrei Pohilko
8faa5dabd5 New features of v1.0 2023-02-01 16:01:35 +00:00
Andrei Pohilko
0b891e7c28 Banner with survey link 2023-02-01 15:38:20 +00:00
Andrei Pohilko
2736777b8a Mod tidy 2023-02-01 13:41:39 +00:00
dependabot[bot]
96c789a012 Bump github.com/containerd/containerd from 1.6.6 to 1.6.12 (#207)
Bumps [github.com/containerd/containerd](https://github.com/containerd/containerd) from 1.6.6 to 1.6.12.
- [Release notes](https://github.com/containerd/containerd/releases)
- [Changelog](https://github.com/containerd/containerd/blob/main/RELEASES.md)
- [Commits](https://github.com/containerd/containerd/compare/v1.6.6...v1.6.12)

---
updated-dependencies:
- dependency-name: github.com/containerd/containerd
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-01 13:39:55 +00:00
Andrey Pokhilko
e13aa2fde6 [WIP] Major release 1.0 (#147)
* Object model with self-sufficient binary (#131)

* Code cosmetics

* Experimenting with object model and direct HELM usage

* Experiment with object model

* replacing the kubectl

* Progressing

* Save the progress

* Able to start with migration in mind

* Migrated two pieces

* List releases via Helm

* Forgotten field

* Cristallized the problem of ctx switcher

* Reworked to multi-context

* Rollback is also new style

* More migration

* Refactoring

* Describe via code

* Bye-bye kubectl binary

* Eliminate more old code

* Refactor a bit

* Merges

* No binaries in dockerfile

* Commit

* Progress with getting the data

* Learned the thing about get

* One field less

* Sstart with repos

* Repo add

* repo remove

* Repos! Icons!

* Simplified access to data

* Ver listing works

* Ver check works

* Caching and values

* fixup

* Done with repos

* Working on install

* Install work-ish

* Fix UI failing on install

* Upgrade flow works

* Fix image building

* Remove outdated test file

* Move files around

* REfactorings

* Cosmetics

* Test for cache control (#151)

* Files import formatted

* Added go-test tools

* Added test for no-cache header

* added changes

* test for cache behaviour of app

* test for static route (#153)

* Tests: route configuration & context setter (#154)

* Test for route configuration

* Test for context setter middleware

* implemented changes

* Restore coverage profile

Fixes #156

* Cosmetics

* Test for `NewRouter` function (#157)

* Test for `configureScanners` (#158)

* Test for `configureKubectls` (#163)

* Test for repository loading (#169)

- Created `repos_test.go`
- Test: `Load()` of Repositories

* Build all PRs

* Fixes failing test (#171)

* Fixes failing test
- Fixes failing test of repo loading

* handles error for

* Did some changes

* Test for listing of repos (#173)

- and did some code formatting

Signed-off-by: OmAxiani0 <aximaniom@gmail.com>

Signed-off-by: OmAxiani0 <aximaniom@gmail.com>

* Test for adding repo (#175)

- Modified the `repositories.yml` file

Signed-off-by: OmAxiani0 <aximaniom@gmail.com>

Signed-off-by: OmAxiani0 <aximaniom@gmail.com>

* Test for deleting the repository (#176)

* Test for deleting the repository
- Also added cleanup function for `TestAdd`

* Fixes failing test

* Add auto labeler for PR's (#174)

* Add auto labeler for PR's

* Add all file under .github/workflow to 'ci' label

Co-authored-by: Harshit Mehta <harshitm@nvidia.com>

* Test for getting repository (#177)

* Add github workflow for auto PR labeling (#181)

Co-authored-by: Harshit Mehta <harshitm@nvidia.com>

* Stub compilation

* Fixes around installing

* More complex test

* Using object model to execute helm test (#191)

* Expand test

* More test

* Coverage

* Add mutex for operations

* Rectore cluster detection code

* Change receiver to pointer

* Support multiple namespaces

* Cosmetics

* Update repos periodically

* fix tests

* Fix error display

* Allow reconfiguring chart without repo

* mute  linter

* Cosmetics

* Failing approach to parse manifests

Relates to #30

* Report the error properly

*  Add test for dashboard/objects/data.go NewDataLayer (#199)

* Fix problem of wrong namespace

* Added unit tests for releases (#204)

* Rework API routes (#197)

* Bootstrap OpenAPI doc

* Renaming some routes

* Listing namespaces

* k8s part of things

* Repositories section

* Document scanners API

* One more API call

* Progress

* Reworked install flow

* History endpoint

* Textual info section

* Resources endpoint

* Rollback endpoint

* Rollback endpoint

* Unit tests

* Cleanup

* Forgotten tags

* Fix tests

* TODOs

* Rework manifest scanning

* add hasTests flag

* Adding more information on UI for helm test API response (#195)

* Hide test button when no tests

Fixes #115
Improves #195

---------

Signed-off-by: OmAxiani0 <aximaniom@gmail.com>
Co-authored-by: Om Aximani <75031769+OmAximani0@users.noreply.github.com>
Co-authored-by: Harshit Mehta <hdm23061993@gmail.com>
Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
Co-authored-by: Todd Turner <todd@toddtee.sh>
Co-authored-by: arvindsundararajan98 <109727359+arvindsundararajan98@users.noreply.github.com>
2023-02-01 13:24:34 +00:00
Andrei Pohilko
6ffcdf2b8e Commit plugin.yaml update upon release 2023-02-01 09:58:26 +00:00
Andrei Pohilko
e6d6ff41a9 Revert "Update release workflow (#202)"
This reverts commit 2df533ab5b.
2023-02-01 09:34:44 +00:00
Dennis Ploeger
0e45e89a1e fix: Make PVC use storageClass from values (#206) 2023-01-31 15:34:13 +00:00
ronahk
2df533ab5b Update release workflow (#202)
* Update release workflow

* Update release workflow

* Change label
2023-01-26 14:12:51 +00:00
Todd Turner
7e32008bfe 🔧 Allow binary arguments via helm chart (#201)
This commit allows to pass arguments to the helm chart.
This is useful if you want to specify arguments for the
helm-dashboard binary whilst deploying via helm.
2023-01-26 14:12:16 +00:00
iiTidgex
23cfd2d61b support for deployment strategy (#196)
Co-authored-by: larmitage_wh <luke.armitage@williamhill.com>
2023-01-23 08:38:57 +00:00
Andrei Pohilko
0e6231dfbd Better debug flag logic 2023-01-20 13:32:55 +00:00
Andrei Pohilko
4ebf67095a Add note about auth proxies 2023-01-18 20:04:40 +00:00
Andrei Pohilko
5902bc010e remove undesired output from version check 2023-01-17 10:44:49 +00:00
Andrei Pohilko
36217401c8 Merge branch 'main' of github.com:komodorio/helm-dashboard 2023-01-17 10:39:30 +00:00
Andrei Pohilko
e6381f96e9 Add check for install script 2023-01-17 10:38:51 +00:00
Harshit Mehta
efe394c8c4 Provide execution rights to install script (#192) 2023-01-17 10:30:34 +00:00
Andrei Pohilko
a91287c2ff Convert line endings back 2023-01-16 20:09:42 +00:00
Andrei Pohilko
28a4b37bb5 Add namespace parameter to chart values
closes #189
2023-01-16 19:15:36 +00:00
Andrei Pohilko
2e1f2e481b Conditional debug flag for install script 2023-01-16 18:44:36 +00:00
Andrei Pohilko
714c0f9e02 Merge branch 'main' of github.com:komodorio/helm-dashboard 2023-01-16 09:58:29 +00:00
Andrei Pohilko
35421ede58 Change install_script.sh line endings to \r\n
Relates to #188
2023-01-16 09:58:08 +00:00
ronahk
26e0b1db32 Fix typo in readme 2023-01-15 13:40:06 +02:00
ronahk
50947e585d Break filters text when resizing window (#190) 2023-01-15 13:25:41 +02:00
ronahk
40ae829186 Use v3 checkout action in all places 2023-01-15 12:46:21 +02:00
ronahk
87ee388bfb Handle errors in regex match 2023-01-15 12:18:40 +02:00
Andrei Pohilko
b76fbb130a Merge branch 'main' of github.com:komodorio/helm-dashboard 2023-01-13 12:41:05 +00:00
Todd Turner
f3c66ecf03 🎨 Remove Superfluous Rule from helm-dashboard ClusterRole (#187)
A superfluous rule is added to the ClusterRole upon creation,
when the dashboard.allowWriteActions value is set to true.
This commit will ensure that only a single rule is created within
the ClusterRole, regardless of whether the dashboard.allowWriteActions
value is enabled or not.
The verbs within this rule will update accordingly.
2023-01-13 10:56:48 +00:00
Harshit Mehta
83e4348ace Add option to execute Tests for release (#178)
* Add button to execute tests

* Create API to execute tests

* Add modal for Test response

* Make API call to execute tests and show response in modal

* Clean up

* Update docs - feature execute tests for a release

* Add arg '--logs' to 'helm test' cmd

* Wait for API to complete before sending back response to frontend

* Add loading spinner until reponse for 'helm test' is returned from backend by API

* Clean-up

Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2023-01-12 12:35:11 +00:00
Harshit Mehta
af1c09ae02 Update Kommunity link (#184) 2023-01-12 11:21:04 +00:00
Udi Hofesh
6e5bce26e8 Update Kommunity link (#183)
The previous link has expired. Adding a never failing signup page: https://komodorkommunity.slack.com/
2023-01-12 09:29:21 +00:00
Harshit Mehta
d0d2ed3ef1 Add github workflow for auto PR labeling (#179)
Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2023-01-09 14:35:02 +00:00
Harshit Mehta
450190a1aa Add auto labeler for PR's (#172)
Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2023-01-06 08:26:13 +00:00
Harshit Mehta
74aab13e3e Use github api to fetch latest release version (#170)
* Use github api to fetch latest release version

* Use grep instead of jq for querying json response

Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2023-01-05 11:42:47 +00:00
Om Aximani
c5cd12b6b2 Ignore cover profile file (#165)
- Added `.cov` extension to gitignore
2023-01-02 13:29:10 +00:00
Om Aximani
fd650f10b6 Changed version of action (#160)
- fix: #159
2023-01-01 16:30:45 +00:00
ronahk
3e1e4be4b3 Update plugin.yaml to latest release version (#155) 2022-12-31 09:26:55 +00:00
Andrei Pohilko
d0c9de9718 Merge branch 'main' of github.com:komodorio/helm-dashboard 2022-12-24 12:14:51 +00:00
ronahk
1a1b28d09f Markdown additions (#150)
* beautify readme

* beautify readme

* merge

* remove file

* center icon
2022-12-24 09:42:22 +00:00
Nirav_Prajapati
6c4ee06d27 feat: added pull request template (#149) 2022-12-22 15:51:13 +02:00
Nirav_Prajapati
7c5ffe9c07 feat: Add issue template (#146)
added issue template
2022-12-22 10:01:47 +02:00
Om Aximani
196644683c Added 'debug' flag in values (#143)
* Added 'debug' flag in values

- Helps to set environment on debug mode
- Can fix #142

* Addressed changes
2022-12-19 19:08:30 +02:00
komodor-bot
20ee6e9695 Increment chart versions [skip ci] 2022-12-19 12:30:52 +00:00
Andrey Pohilko
e9abedbadb Merge branch 'main' of github.com:komodorio/helm-dashboard 2022-12-19 12:38:17 +02:00
Andrey Pohilko
5d0a148fea Add installMode to analytics 2022-12-19 12:38:03 +02:00
ronahk
c0cf6237e6 Helm chart updates (#141)
* update plugin version

* fix pipeline

* fix pipeline

* add needs

* update chart icon

* allow all api groups

* allow write actions by default
2022-12-19 12:29:52 +02:00
Andrey Pohilko
9876b6a12e Merge branch 'main' of github.com:komodorio/helm-dashboard 2022-12-19 12:27:20 +02:00
Andrey Pohilko
90815f2271 Pass version to container image correctly 2022-12-19 12:27:02 +02:00
Eddie Garcia
e83ddbb15d Release 0.3.0 (#140) 2022-12-19 11:35:18 +02:00
komodor-bot
78f458112b Increment chart versions [skip ci] 2022-12-18 13:07:55 +00:00
Andrey Pokhilko
f6d3e519e2 Allow installing into cluster (#128)
* Dockerize it

* Default chart layout

* Installable

* Starts and loads

* Progressing

* Hide cluster block

* Add scanners

* Add icon for helm chart (#130)

Co-authored-by: Harshit Mehta <harshitm@nvidia.com>

* Image build and push scripts

* Build local img

* Local img

* ci stuff

* ci and chart changes

* add readme

* modify readme

* move readme location

* update docs and delete file

* remove file

* allow write actions

* allow write actions

* update .gitignore

* update readme

* delete file

* add persistence and update documentation

* update logo

* update volume paths and documentation

* change pvc size

* Comment

Co-authored-by: Harshit Mehta <hdm23061993@gmail.com>
Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
Co-authored-by: ronahk <rona@komodor.io>
2022-12-18 14:09:07 +02:00
dependabot[bot]
9bac7306a4 Bump helm.sh/helm/v3 from 3.9.4 to 3.10.3 (#137)
Bumps [helm.sh/helm/v3](https://github.com/helm/helm) from 3.9.4 to 3.10.3.
- [Release notes](https://github.com/helm/helm/releases)
- [Commits](https://github.com/helm/helm/compare/v3.9.4...v3.10.3)

---
updated-dependencies:
- dependency-name: helm.sh/helm/v3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-15 20:51:34 +02:00
ronahk
030708e7cc Create artifacthub-repo.yml (#136) 2022-12-13 11:11:08 +02:00
Andrey Pohilko
0b8a258f7f Add logo for dark theme 2022-12-11 15:04:16 +02:00
Andrei Pohilko
2c25193adf Code cosmetics 2022-12-06 15:31:18 +00:00
Christfried
2c1883c835 Fix typo in readme (#129)
Co-authored-by: Christfried BALIZOU <christfriedbalizou.gmail.com>
2022-12-04 17:37:45 +00:00
Harshit Mehta
960c268224 Display correct message on installed charts page in case of an error instead of the current loading spinner (#127)
Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2022-11-30 14:32:38 +00:00
Itiel shwartz
c4e5094ce5 Update README.md (#126) 2022-11-30 09:35:07 +00:00
ronahk
74f6236ba6 Display better status message (#125) 2022-11-29 16:10:52 +00:00
Andrei Pohilko
9b8edb6a39 Merge branch 'main' of github.com:komodorio/helm-dashboard 2022-11-29 13:22:23 +00:00
Andrei Pohilko
56e9430155 Fix wrong links show for release without repo 2022-11-29 13:22:12 +00:00
siddhikhapare
a89ccbdab7 Overlay with explaination modified (#123) 2022-11-29 11:11:22 +00:00
ronahk
fa4819b353 Update installed charts number according to filter (#121) 2022-11-28 11:02:16 +00:00
Andrei Pohilko
8de7941063 Fix JS error on version parsing 2022-11-27 09:48:28 +00:00
ronahk
34158a7a9c Fix CI - change output name (#119) 2022-11-27 09:46:12 +00:00
Andrei Pohilko
3384db7193 In case no repositories configured, fall back to empty search 2022-11-24 16:25:30 +00:00
Andrei Pohilko
7de7c85426 Release 0.2.8 2022-11-24 16:01:36 +00:00
Andrei Pohilko
8e65c555e0 Fix analytics is enabled while in dev 2022-11-24 15:22:50 +00:00
Andrei Pohilko
2557e6b73d Don't complain if repo is not found for chart
Fixes #116
2022-11-24 15:15:20 +00:00
Andrei Pohilko
4f75ee06a0 Release 0.2.7 2022-11-24 12:07:29 +00:00
ronahk
717adc9e9c fix filter bug (#111) 2022-11-24 11:40:30 +00:00
Andrey Pokhilko
15adeb7cfa Only display NS that has charts (#113) 2022-11-24 13:21:20 +02:00
Itiel shwartz
0b06036a39 add stats and change heap (#108)
* add stats and change heap

* improve analytics

* revert main changes

* add repo
2022-11-24 10:35:45 +00:00
Andrei Pohilko
f7d4dcbff4 If cluster access is failed, still display UI
Fixes #109
2022-11-24 09:59:44 +00:00
Harshit Mehta
8334f2b0b2 Make the entire card clickable on Installed Charts view (#87)
Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2022-11-24 09:15:33 +00:00
Harshit Mehta
5cccb1caa0 Fixes JS part of #95 (#110)
Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2022-11-24 08:24:57 +00:00
Andrei Pohilko
db9cdeb1c9 Split data layer into separate files 2022-11-23 12:38:03 +00:00
ronahk
3abae8e49e Filter installed charts by namespace (#101)
* filter by namespace

* exists

* Some improvements, one thing resolved

* cleanup

* merge

* allow filtering by name

* filter by namespace

* changes

* change url parameter name

* keep filtered namespaces when refreshing and combine inpt and namespace filtering

* Refactoring

* Cleanup

* Forced NS handle

* remove else

Co-authored-by: Andrei Pohilko <andrei.pokhilko@gmail.com>
2022-11-23 13:38:09 +02:00
Andrey Pokhilko
bedb356b02 In-memory cache for speed-up (#88)
* Experiment with local cache

* Commit

* Cache all we can, invalidate later

* Commit

* separate cache class

* More cached

* Proper invalidate

* Complete the repos

* Fix the build

* Fix build

* Status reporting
2022-11-22 17:17:32 +02:00
ronahk
34a7dc57b2 Use namespace defined in kubeconfig as default in install view (#99)
* respect defualt namespace from kubeconfig

* respect defualt namespace from kubeconfig

* Replace exists with available - avoid confusion in status

* use data attribute

* remove commented line

* fix
2022-11-16 11:50:32 +00:00
ronahk
d0dbb42492 fix namespaces not updating when switching cluster (#102) 2022-11-16 09:59:38 +00:00
denganliang
1393b117cf fixbug: ChartAndVersion did not handle chart version correct in some case (#98)
* fixbug: ChartAndVersion did not handle chart version correct in some case

https://github.com/komodorio/helm-dashboard/issues/95

* use regexp to get version

* add test case
2022-11-15 15:12:07 +00:00
Harshit Mehta
cf407c63a2 Fixes #91 (#93)
Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2022-11-11 08:43:55 +00:00
ronahk
3f00e8ef6d Sort resources by interesting items (#89)
* sort resources by intersting items

* add body class

* reuse the name data
2022-11-10 16:51:14 +00:00
ronahk
758b03de36 Validate tag name matches plugin version in gh actions (#80)
* validate that tag name matches plugin version in gh actions

* fail workflow if tag name doesn't match plugin version
2022-11-09 13:35:28 +00:00
Harshit Mehta
76d55f8e44 Enhancement/show chart icon and description (#70)
* New API to fetch chart.yaml for an installec chart

* Show icon and description for installed chart list

Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2022-11-09 08:23:44 +00:00
Andrei Pohilko
b9392ab4c9 Merge branch 'main' of github.com:komodorio/helm-dashboard 2022-11-08 14:38:01 +00:00
Andrei Pohilko
dadf2d1bde Cosmetics 2022-11-08 14:37:48 +00:00
Harshit Mehta
74c2a3d6e7 Few UI Enhancements (#79)
- Add Install/Upgrade keywork dynamically on popup
- Sort Repo list alphabetically
- Sort CLuster list alphabetically

Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2022-11-08 14:28:13 +00:00
Andrei Pohilko
2454fcf47c Show better message for empty contexts 2022-11-08 10:10:19 +00:00
siddhikhapare
96a7a429e1 getCleanClusterName fixed (#78) 2022-11-08 10:07:30 +00:00
Bhargav Ravuri
f29800ed5b CLI Flag --bind (#77)
* CLI Flag for Bind Address

Signed-off-by: Bhargav Ravuri <bhargav.ravuri@infracloud.io>

* Update Documentation for --bind

Signed-off-by: Bhargav Ravuri <bhargav.ravuri@infracloud.io>

Signed-off-by: Bhargav Ravuri <bhargav.ravuri@infracloud.io>
2022-11-07 16:05:01 +00:00
Andrei Pohilko
15ce9170f3 Don't take Helm's default namespace into account 2022-11-06 16:40:53 +00:00
Andrei Pohilko
9a144c1c6f Release 0.2.5 2022-11-06 16:22:30 +00:00
Andrei Pohilko
f897c0f197 Display forced namespace in UI 2022-11-06 16:16:36 +00:00
Andrey Pokhilko
671fa949df Improve resource scanning flow (#68)
* List supported resources for scanners

* Don't warn on scanner discovery commands

* Use scanner-to-resource map

* Save changes

* Scan result tabs

* Own table render for Checkov

* Scannable manifest flag for scanners
2022-11-06 15:56:34 +00:00
Duy Nguyen
612352d69f Add namespace dropdown (#67)
* add get namespace endpoint

* add namespace dropdown

* misc fix
2022-11-06 13:19:32 +00:00
Dimas Yudha P
ef31263797 refactoring makefile, also adding test (#71) 2022-11-03 16:47:28 +00:00
Andrei Pohilko
f64fbd4a2e Fix analytics version 2022-11-01 21:59:16 +00:00
Harshit Mehta
dffb8a726b Allow filtering on repository charts list (#61)
Fixes #46

Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2022-11-01 21:58:34 +00:00
Andrey Pokhilko
14d4886e61 Pass the NS param from Helm correctly (#64) 2022-10-31 18:07:28 +00:00
Andrei Pohilko
0012b0a797 Explicit flag for parameters 2022-10-31 17:04:09 +00:00
Andrei Pohilko
f6b2a8c66d Release 0.2.4 2022-10-31 15:45:14 +00:00
Andrey Pokhilko
c0a1d31c8d Make user analytics optional (#59)
* Make user analytics optional

* Mention analytics in README

* Use analytics flag
2022-10-31 15:33:18 +00:00
Harshit Mehta
329ae055ee Add current cluster info to Install and Upgrade popup (#58)
Fixes #44

Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2022-10-31 08:34:51 +00:00
Andrei Pohilko
7ab0f33201 Transfer TODOs into GH issues 2022-10-28 19:10:53 +01:00
Andrei Pohilko
2e8ba39b8f Attempt to reuse the application if it's already running 2022-10-28 18:28:08 +01:00
Harshit Mehta
c5f9f71e45 Remove version check for charts without repo (#54)
Co-authored-by: Harshit Mehta <harshitm@nvidia.com>
2022-10-28 15:22:20 +01:00
Andrei Pohilko
9bb597f366 Update project logo 2022-10-28 14:28:07 +01:00
Andrey Pokhilko
786bddc478 Force namespace via cmdline parameter (#53)
* Force name via cmdline parameter

* Use a library to parse CLI flags

* Use less env vars

* Document it
2022-10-28 12:39:19 +01:00
Andrei Pohilko
d9edcf2f48 Print command hint upon install 2022-10-27 15:32:16 +01:00
Andrei Pohilko
2262445b75 Don't offer to describe historical revisions 2022-10-27 15:31:57 +01:00
Andrei Pohilko
0c486e76c0 Change new version alert display 2022-10-27 15:30:52 +01:00
Andrei Pohilko
7d50f4e620 Recognize "Bound" status as normal 2022-10-26 16:14:10 +01:00
Andrei Pohilko
b2ec371709 Correct link to Slack community 2022-10-26 15:32:46 +01:00
Andrei Pohilko
549cdd9bfb Release 0.2.3 2022-10-26 15:26:40 +01:00
Andrei Pohilko
44787b31cf Release 0.2.2 2022-10-26 13:12:58 +01:00
Andrei Pohilko
e75e653c58 Fix version information field 2022-10-26 12:55:36 +01:00
Andrei Pohilko
3eae013286 Hide upgrade menu item by default 2022-10-26 12:44:06 +01:00
Andrei Pohilko
2221fb22a0 Release 0.2.1 2022-10-26 12:37:47 +01:00
Andrei Pohilko
9dc3e6a12d Merge branch 'main' of github.com:komodorio/helm-dashboard 2022-10-26 12:35:24 +01:00
Andrey Pokhilko
de0024cd03 Check for newer version available (#47)
* Add helm version requirement notes

* Check for newer version and offer upgrade

* fix lint
2022-10-26 12:35:07 +01:00
Andrei Pohilko
ed4e970194 Merge branch 'main' of github.com:komodorio/helm-dashboard 2022-10-26 11:09:43 +01:00
Andrey Pokhilko
b0067e31ba Improvements after release (#45)
* Add helm version requirement notes

* Create Help section, no charts placeholder

* Revive missed "user-defined" values

* Fix namespace undefined upon install

* cosmetics
2022-10-26 11:05:50 +01:00
Andrei Pohilko
7e8ba4709e Merge branch 'main' of github.com:komodorio/helm-dashboard 2022-10-26 08:59:09 +01:00
Andrei Pohilko
be7b2642fc Add helm version requirement notes 2022-10-25 16:58:01 +01:00
Andrey Pokhilko
896d9e3f72 Use different library for opening the browser (#22) 2022-10-25 16:53:33 +01:00
Lior Noy
be6666373b Add version information into UI (#35)
This commit adds the tool version into the UI in the top bar.
2022-10-25 14:08:28 +01:00
Dimas Yudha P
91df9392c0 adding unit test for GetQueryProps (utils). (#39)
* adding unit test for GetQueryProps (utils).

* add unit test chart and version
2022-10-25 14:02:48 +01:00
Dimas Yudha P
bd058ee912 removing else flow (#38) 2022-10-25 12:57:25 +01:00
Andrei Pohilko
997f951d0c Fix error when no scanners are present 2022-10-24 15:42:19 +01:00
290 changed files with 38963 additions and 4218 deletions

6
.dockerignore Normal file
View File

@@ -0,0 +1,6 @@
Dockerfile
*.md
bin
.idea
.git
frontend/node_modules

59
.github/ISSUE_TEMPLATE/bug.yaml vendored Normal file
View File

@@ -0,0 +1,59 @@
name: 🐛 Bug
description: Report an issue to help improve the project.
labels: ["🛠 goal: fix"]
body:
- type: textarea
id: description
attributes:
label: Description
description: A brief description of the question or issue, also include what you tried and what didn't work
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: Please add screenshots if applicable
validations:
required: false
- type: textarea
id: extrainfo
attributes:
label: Additional information
description: Is there anything else we should know about this bug?
validations:
required: false
- type: markdown
attributes:
value: |
You can also join our slack community [here](https://komodorkommunity.slack.com)
Feel free to check out other cool repositories of the [komodorio](https://github.com/komodorio)

68
.github/labeler.yml vendored Normal file
View File

@@ -0,0 +1,68 @@
# This configures label matching for PR's.
#
# The keys are labels, and the values are lists of minimatch patterns
# to which those labels apply.
#
# NOTE: This can only add labels, not remove them.
# NOTE: Due to YAML syntax limitations, patterns or labels which start
# with a character that is part of the standard YAML syntax must be
# quoted.
#
# Please keep the labels sorted and deduplicated.
api:
- pkg/dashboard/api.go
app:
- main.go
- pkg/dashboard/server.go
- pkg/dashboard/subproc/*
- pkg/dashboard/utils/*
backend:
- pkg/dashboard/handlers/*
- pkg/dashboard/scanners/*
ci:
- .github/workflow/build.yml
- ci/*
- Makefile
- scripts/*
docs:
- CODE_OF_CONDUCT.md
- CONTRIBUTING.md
- LICENSE
- README.md
- screenshot*.png
- screenshot*.svg
docker:
- .dockerignore
- Dockerfile
helm-charts:
- charts/*
github-actions:
- .github/ISSUE_TEMPLATE/*
- .github/labeler.yml
- .github/pull_request_template
- .github/workflow/pull-request-labeler.yaml
release:
- .github/workflows/publish-chart.yaml
- .github/workflows/release.yaml
- .goreleaser.yml
- artifacthub-repo.yml
- plugin.yaml
scanners:
- pkg/dashboard/scanners/*
tests:
- pkg/dashboard/**/*_test.go
- pkg/dashboard/objects/testdata/*
frontend:
- pkg/dashboard/static/*

21
.github/pull_request_template.md vendored Normal file
View File

@@ -0,0 +1,21 @@
## Changes Proposed
<!-- Describe the proposed changes and any additional information -->
<!-- Add all the screenshots which illustrate your changes -->
## Check List
<!-- Mark all the applicable boxes. To mark the box as done follow the following conventions -->
<!--
[x] - Correct; marked as done
[X] - Correct; marked as done
[ ] - Not correct; marked as **not** done
-->
- [ ] The title of my pull request is a short description of the changes
- [ ] This PR relates to some issue: <!-- use "Closes #999" to auto-close related issue -->
- [ ] I have documented the changes made (if applicable)
- [ ] I have covered the changes with unit tests

View File

@@ -2,23 +2,46 @@ name: Build
on:
push:
branches: [ "main" ]
branches:
- main
pull_request:
branches: [ "main" ]
branches:
- "*"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v3
uses: actions/checkout@v4
# Node part
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
go-version: 1.18
cache: 'npm'
cache-dependency-path: frontend/package-lock.json
- name: NPM install
run: npm i
working-directory: ./frontend
- name: NPM build
run: npm run build
working-directory: ./frontend
# Golang part
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.24"
- name: Unit tests
run: |
go test -v -race ./... # Run all the tests with the race detector enabled
go test -v -race ./... -covermode=atomic -coverprofile=coverage.out # Run all the tests with the race detector enabled
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v3
- name: Static analysis
run: |
go vet ./... # go vet is the official Go static analyzer
@@ -29,15 +52,90 @@ jobs:
- name: Dry Run GoReleaser
uses: goreleaser/goreleaser-action@v2
with:
version: latest
args: release --snapshot --rm-dist
- name: Test Binary is Runnable
version: "1.18.2"
args: release --snapshot --clean
- name: Test if the Binary is Runnable
run: "dist/helm-dashboard_linux_amd64_v1/helm-dashboard --help"
- uses: actions/upload-artifact@v4
with:
name: binaries
path: dist/
retention-days: 1
image:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Docker meta
uses: docker/metadata-action@v3
id: meta
with:
images: komodorio/helm-dashboard
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v2
if: github.event_name != 'pull_request'
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_PASS }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: komodorio/helm-dashboard:unstable
labels: ${{ steps.meta.outputs.labels }}
build-args: VER=0.0.0-dev
platforms: linux/amd64,linux/arm64
static_and_lint:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: make dir for frontend results # don't delete this step, it will break goreleaser
run: mkdir pkg/frontend/dist && touch pkg/frontend/dist/.gitkeep
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.24"
- name: golangci-lint
uses: golangci/golangci-lint-action@v3.2.0
uses: golangci/golangci-lint-action@v4
with:
# version: latest
# skip-go-installation: true
skip-pkg-cache: true
skip-build-cache: true
# args: --timeout=15m
args: --timeout=5m
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
cache: 'npm'
cache-dependency-path: ./frontend/package-lock.json
- name: NPM install
run: npm i
working-directory: ./frontend
- name: NPM lint
run: npm run lint
working-directory: ./frontend
- name: Helm Template Check For Sanity
uses: igabaydulin/helm-check-action@0.2.1
env:
CHART_LOCATION: ./charts/helm-dashboard
CHART_VALUES: ./charts/helm-dashboard/values.yaml
- name: Test if the Helm plugin install script is runnable
run: |
scripts/install_plugin.sh

43
.github/workflows/publish-chart.yaml vendored Normal file
View File

@@ -0,0 +1,43 @@
name: publish helm chart
# for manual running in case we need to update the chart without releasing the dashboard app
on:
workflow_dispatch:
env:
HELM_REP: helm-charts
GH_OWNER: komodorio
CHART_DIR: charts/helm-dashboard
jobs:
publish_chart:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Bump versions
run: |
git config user.email komi@komodor.io
git config user.name komodor-bot
git fetch --tags
git checkout main
sh ./ci/bump-versions.sh
git add charts/helm-dashboard/Chart.yaml
git commit -m "Increment chart versions [skip ci]" || echo "Already up-to-date"
git push -f || echo "Nothing to push!"
env:
APP_VERSION: ${{ needs.pre_release.outputs.release_tag }}
- name: Push folder to helm-charts repository
uses: crykn/copy_folder_to_another_repo_action@v1.0.6
env:
API_TOKEN_GITHUB: ${{ secrets.KOMI_WORKFLOW_TOKEN }}
with:
source_folder: "charts/helm-dashboard"
destination_repo: "komodorio/helm-charts"
destination_folder: "charts/helm-dashboard"
user_email: "komi@komodor.io"
user_name: "komodor-bot"
destination_branch: "master"
commit_msg: "feat(helm-dashboard): update chart" #important!! don't change this commit message unless you change the condition in pipeline.yml on helm-charts repo

View File

@@ -0,0 +1,14 @@
name: "Pull Request Labeler"
on:
- pull_request_target
jobs:
triage:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v4
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"

View File

@@ -1,30 +1,134 @@
name: release
name: Release
on:
push:
tags:
- "*"
- "v*"
env:
HELM_REP: helm-charts
GH_OWNER: komodorio
CHART_DIR: charts/helm-dashboard
jobs:
release:
pre_release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v3
- name: Get tag name
id: get_tag_name
run: echo "TAG_NAME=$(echo ${{ github.ref_name }} | cut -d 'v' -f2)" >> $GITHUB_OUTPUT
outputs:
release_tag: ${{ steps.get_tag_name.outputs.TAG_NAME }}
release:
needs: pre_release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
# Node part
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
go-version: 1.18
cache: 'npm'
cache-dependency-path: frontend/package-lock.json
- name: NPM install
run: npm i
working-directory: ./frontend
- name: NPM build
run: npm run build
working-directory: ./frontend
# Golang part
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.24"
- name: git cleanup
run: git clean -f
run: git clean -f && git checkout frontend/yarn.lock
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v2
with:
version: latest
args: release --rm-dist
version: "1.18.2"
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Test Binary Versions
run: "dist/helm-dashboard_linux_amd64_v1/helm-dashboard --help"
image:
runs-on: ubuntu-latest
needs: [ release, pre_release ]
timeout-minutes: 60
steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Docker meta
uses: docker/metadata-action@v3
id: meta
with:
images: komodorio/helm-dashboard
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v2
if: github.event_name != 'pull_request'
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_PASS }}
- name: Build and push
uses: docker/build-push-action@v4
if: github.event_name != 'pull_request'
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: komodorio/helm-dashboard:${{ needs.pre_release.outputs.release_tag }},komodorio/helm-dashboard:latest
labels: ${{ steps.meta.outputs.labels }}
build-args: VER=${{ needs.pre_release.outputs.release_tag }}
platforms: linux/amd64,linux/arm64
publish_chart:
runs-on: ubuntu-latest
needs: [ image, pre_release ]
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Bump versions
run: |
git config user.email komi@komodor.io
git config user.name komodor-bot
git fetch --tags
git checkout main
sh ./ci/bump-versions.sh
git add charts/helm-dashboard/Chart.yaml
git add plugin.yaml
git commit -m "Increment chart versions [skip ci]" || echo "Already up-to-date"
git push -f || echo "Nothing to push!"
env:
APP_VERSION: ${{ needs.pre_release.outputs.release_tag }}
- name: Push folder to helm-charts repository
uses: crykn/copy_folder_to_another_repo_action@v1.0.6
env:
API_TOKEN_GITHUB: ${{ secrets.KOMI_WORKFLOW_TOKEN }}
with:
source_folder: "charts/helm-dashboard"
destination_repo: "komodorio/helm-charts"
destination_folder: "charts/helm-dashboard"
user_email: "komi@komodor.io"
user_name: "komodor-bot"
destination_branch: "master"
commit_msg: "feat(OSS helm-dashboard): ${{ github.event.head_commit.message }}" #important!! don't change this commit message unless you change the condition in pipeline.yml on helm-charts repo

8
.gitignore vendored
View File

@@ -15,6 +15,7 @@
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
*.cov
# Dependency directories (remove the comment below to include it)
# vendor/
@@ -24,3 +25,10 @@ go.work
/bin
/.idea/
/node_modules
.DS_Store
.vscode/
/pkg/dashboard/objects/testdata/hello-world-0.1.0.tgz
/pkg/frontend/dist/*
/dist/

View File

@@ -11,6 +11,9 @@ builds:
goarch:
- amd64
- arm64
ignore:
- goos: windows
goarch: arm64
env:
- CGO_ENABLED=0
archives:

2
.husky/pre-commit Executable file
View File

@@ -0,0 +1,2 @@
cd frontend || exit 1
npm run pre:commit

View File

@@ -60,7 +60,7 @@ representative at an online or offline event.
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
https://komodorkommunity.slack.com/archives/C044U1B0265.
itiel@komodor.com.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the

55
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,55 @@
# Contributing to Helm Dashboard
We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's:
- Reporting a bug
- Discussing the current state of the code
- Submitting a fix
- Proposing new features
## We Develop with GitHub
We use GitHub to host code, to track issues and feature requests, as well as accept pull requests.
## First-time contributors
We've tagged some issues to make it easy to get started :smile:
[Good first issues](https://github.com/komodorio/helm-dashboard/labels/good%20first%20issue)
Add a comment on the issue and wait for the issue to be assigned before you start working on it. This helps to avoid multiple people working on similar issues.
## All Code Changes Happen Through Pull Requests
Pull requests are the best way to propose changes to the codebase. We actively welcome your pull requests:
1. Fork the repo and create your branch from `main`.
2. If you've added code that should be tested, add tests.
3. Ensure the test suite passes.
4. Make sure your code lints.
5. Issue that pull request!
## Any contributions you make will be under the Apache License 2.0
In short, when you submit code changes, your submissions are understood to be under the same [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) that covers the project.
## Report bugs using GitHub's [issues](https://github.com/komodorio/helm-dashboard/issues)
We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/komodorio/helm-dashboard/issues/new) and labeling it with the `bug` label. It's that easy!
**Great Bug Reports** tend to have:
- A quick summary and/or background
- Steps to reproduce
- Be specific!
- Give sample code if you can.
- What you expected would happen
- What actually happens
- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
## License
By contributing, you agree that your contributions will be licensed under its Apache License 2.0.
## Questions?
Contact us on [Slack](https://komodorkommunity.slack.com).

52
Dockerfile Normal file
View File

@@ -0,0 +1,52 @@
# Stage - frontend
FROM node:latest as frontend
WORKDIR /build
COPY frontend ./
RUN npm i && npm run build
# Stage - builder
FROM --platform=${BUILDPLATFORM:-linux/amd64} golang as builder
ARG TARGETPLATFORM
ARG BUILDPLATFORM
ARG TARGETOS
ARG TARGETARCH
ENV GOOS=${TARGETOS:-linux}
ENV GOARCH=${TARGETARCH:-amd64}
ENV CGO_ENABLED=0
ARG VER=0.0.0
ENV VERSION=${VER}
WORKDIR /build
COPY go.mod ./
COPY go.sum ./
COPY main.go ./
RUN go mod download
ADD . src
COPY --from=frontend /pkg/frontend/dist ./src/pkg/frontend/dist/
WORKDIR /build/src
RUN make build_go
# Stage - runner
FROM --platform=${TARGETPLATFORM:-linux/amd64} alpine
ARG TARGETPLATFORM
ARG BUILDPLATFORM
EXPOSE 8080
COPY --from=builder /build/src/bin/dashboard /bin/helm-dashboard
ENTRYPOINT ["/bin/helm-dashboard", "--no-browser", "--bind=0.0.0.0", "--port=8080"]
# docker build . -t komodorio/helm-dashboard:0.0.0 && kind load docker-image komodorio/helm-dashboard:0.0.0

209
FEATURES.md Normal file
View File

@@ -0,0 +1,209 @@
# Helm Dashboard Features Overview
## General Layout and Navigation
### Shutting down the app
If you run the tool locally, you can shutdown the running process. This is useful when you can't find the console where
you started it, or when it was started without console.
To close Helm-dashboard, click on the button in the rightmost corner of the screen. Once you click on it, your
Helm-dashboard will be shut down.
![Shutdown_screenshot](images/screenshot_shut_down.png)
## Releases Management Section
### Switching Clusters
When started as local binary, the tool reads the list of available cluster connections from kubectl config file. Those
connections are displayed on the left side of the screen.
![Multicluster_screenshot](images/screenshot_multicluster.png)
If you want to switch to a different cluster, simply click on the corresponding cluster as shown in the
figure. You
can [read here](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) to
learn on how to configure access to multiple clusters.
# Reset Cache
The "Reset Cache" feature in Helm Dashboard clears the cached data and fetches the latest information from the backend or data source. It ensures that the dashboard displays up-to-date data and reflects any recent changes or updates.
![Detail1](images/screenshot_reset_cache.png)
# Repository
Essentially, a repository is a location where charts are gathered and can be shared. If you want to learn more about repositories, [click here](https://helm.sh/docs/topics/chart_repository/). You can find the repository in the home section, as depicted in the figure.
![Repository3](images/screenshot_repository3.png)
You can add the repository by clicking on 'Add Repository', as shown in the figure.
![Repository](images/screenshot_repository.png)
## Installed Releases List
A release is an installation of your Helm chart deployed in your Kubernetes Cluster. That means every time that you
install or upgrade a Helm chart, it creates a new release revision that coexists with other releases. You
can filter releases based on namespaces or search for release names
![Releases](images/screenshot_release.png)
The squares represent k8s resources installed by the release. Hover over each square to view a tooltip with details.
Yellow indicates "pending," green signifies a healthy state, and red indicates an unhealthy state.
![Releases1](images/screenshot_release1.png)
It indicates the version of chart that corresponds to this release.
![Releases2](images/screenshot_release2.png)
A revision is linked to a release to track the number of updates/changes that release encounters.
![Releases3](images/screenshot_release3.png)
Namespaces are a way to organize clusters into virtual sub-clusters — they can be helpful when different teams or
projects share a Kubernetes cluster. Any number of namespaces are supported within a cluster, each logically separated
from others but with the ability to communicate with each other.
![Releases4](images/screenshot_release4.png)
Updated" refers to the amount of time that has passed since the last revision of the release. Whenever you install or
upgrade the release, a new revision is created. You can think of it as the "age" of the latest revision.
![Releases5](images/screenshot_release5.png)
Indication of upgrade possible/repo suggested.
![Release6](images/screenshot_upgrade_available.png)
## Release details
This indicates the status of the deployed release, and 'Age' represents the amount of time that has passed since the
creation of the revision until now.
![Detail](images/screenshot_release_detail.png)
You can use the Upgrade/Downgrade button to switch to different release versions, as shown in the figure.
![Detail1](images/screenshot_upgrade_available2.png)
Confirm the upgrade settings and configuration and click on confirm button to continue
![Detail2](images/screenshot_upgrade_confirmation.png)
Once the upgrade is done, your release will show the status
![Detail3](images/screenshot_upgrade_complete.png)
It executes the test scripts or commands within the deployed application's environment and displays the results
![Detail4](images/screenshot_run_tests.png)
Running test hooks results
![Detail5](images/screenshot_test_results.png)
The Helm Dashboard provides basic information about your Helm releases, including revision number, deployment date, release message, cluster details, and deployment status.
![Detail6](images/screenshot_basic_info.png)
### Resource Tab
In the Resources tab of the Helm Dashboard, you can view the kind (type), name, status, and any associated messages for your Kubernetes resources.
![Detail7](images/screenshot_resource.png)
### Manifest Tab
Text: The Manifests tab displays the textual representation of the Kubernetes manifests associated with your Helm release. It provides the YAML or JSON configuration files that define the desired state of the resources deployed in your cluster.
![Detail8](images/screenshot_manifest_view.png)
Diff with Previous: The "Diff with Previous" feature allows you to compare the current version of the manifests with the previous version. It highlights the differences between the two versions, making it easier to identify the changes made in the deployment.
![Detail9](images/screenshot_manifest_diff_prev.png)
Diff with Specific: The "Diff with Specific" option enables you to compare the current version of the manifests with a specific past version. It allows you to select a particular revision and view the differences between that revision and the current one.
![Detail10](images/screenshot_manifest_diff_specific.png)
### Values Tab
Text: The Values tab displays the textual representation of the values file associated with your Helm chart. It shows the YAML or JSON file that contains the configuration values used during the deployment of the chart.
![Detail11](images/screenshot_values_view.png)
Diff: The "Diff" feature allows you to compare the current values with the previous values used in a previous deployment. It highlights any differences between the two versions, making it easier to identify changes made to the configuration.
![Detail12](images/screenshot_values_diff_prev.png)
### Text Tab
Text: The Notes tab displays any accompanying notes or documentation related to the Helm chart.
![Detail14](images/screenshot_notes_view.png)
Diff with previous: The "Diff" feature is not typically available in the Notes tab. This tab is primarily meant for viewing the static text-based notes associated with the chart and doesn't involve comparisons or tracking changes like in the Manifests or Values tabs.
![Detail15](images/screenshot_notes_diff_prev.png)
Diff with Specific Version: Similar to the previous point, the ability to view a diff with a specific version of the notes is not a standard feature in the Notes section of the Helm Dashboard. The Notes section usually presents the information for the specific version of the Helm chart that is currently deployed.
![Detail16](images/screenshot_notes_diff_specific_version.png)
### Execute Helm tests
For all the release(s) (installed helm charts), you can execute helm tests for that release. For the tests to execute
successfully, you need to have existing tests for that helm chart.
You can execute `helm test` for the specific release as below:
![](images/screenshot_run_test.png)
The result of executed `helm test` for the release will be displayed as below:
![](images/screenshot_run_test_result.png)
### Scanner Integrations
Upon startup, Helm Dashboard detects the presence of [Trivy](https://github.com/aquasecurity/trivy)
and [Checkov](https://github.com/bridgecrewio/checkov) scanners. When available, these scanners are offered on k8s
resources page, as well as install/upgrade preview page.
You can request scanning of the specific k8s resource in your cluster:
![](images/screenshot_scan_resource.png)
If you want to validate the k8s manifest prior to installing/reconfiguring a Helm chart, look for "Scan for Problems"
button at the bottom of the dialog:
![](images/screenshot_scan_manifest.png)
## Repository Section
Essentially, a repository is a location where charts are gathered and can be shared over network. If you want to learn
more about Helm chart
repositories, [click here](https://helm.sh/docs/topics/chart_repository/).
You can access the repository management area of Helm Dashboard in the main navigation section, as depicted in the
figure.
![Repository3](images/screenshot_repository3.png)
You can add the repository by clicking on 'Add Repository' button on the left, as shown in the figure.
![Repository](images/screenshot_repository.png)
After completing that step, enter the following data: the repository name and its URL. You can also add the username and
password, although this is optional.
![Repository2](images/screenshot_repository2.png)
Updating means refreshing your repository. You can update your repository as shown in the figure.
![Repository4](images/screenshot_repository4.png)
If you want to remove your repository from the Helm dashboard, click on the 'Remove' button as shown in the figure.
![Repository5](images/screenshot_repository5.png)
Use the filter option to find the desired chart quicker from the list of charts.
![Repository6](images/screenshot_repository6.png)
If you want to install a particular chart, simply hover the pointer over the chart name and an 'Install' button will
appear, as shown in the figure.
![Repository7](images/screenshot_repository7.png)
# Support for Local Charts
Local Helm chart is a directory with specially named files and a `Chart.yaml` file, which you can install via Helm,
without the need to publish the chart into Helm repository. Chart developers might want to experiment with the chart
locally, before uploading into public repository. Also, a proprietary application might only use non-published chart as
an approach to deploy the software.
For all the above use-cases, you may use Helm Dashboard UI, specifying the location of your local chart folders via
special `--local-chart` command-line parameter. The parameter might be specified multiple times, for example:
```shell
helm-dashboard --local-chart=/opt/charts/my-private-app --local-chart=/home/dev/sources/app/chart
```
When _valid_ local chart sources specified, the repository list would contain a surrogate `[local]` entry, with those
charts listed inside. All the chart operations are normal: installing, reconfiguring and upgrading.
![](images/screenshot_local_charts.png)

View File

@@ -1,9 +1,31 @@
pull:
git pull
DATE ?= $(shell date +%FT%T%z)
VERSION ?= $(shell git describe --tags --always --dirty --match=v* 2> /dev/null || \
cat $(CURDIR)/.version 2> /dev/null || echo "v0")
build:
go build -o bin/dashboard .
.PHONY: test
test: ; $(info $(M) start unit testing...) @
@go test $$(go list ./... | grep -v /mocks/) --race -v -short -coverpkg=./... -coverprofile=profile.cov
@echo "\n*****************************"
@echo "** TOTAL COVERAGE: $$(go tool cover -func profile.cov | grep total | grep -Eo '[0-9]+\.[0-9]+')% **"
@echo "*****************************\n"
.PHONY: pull
pull: ; $(info $(M) Pulling source...) @
@git pull
debug:
DEBUG=1 ./bin/dashboard
.PHONY: build_go
build_go: $(BIN) ; $(info $(M) Building GO...) @ ## Build program binary
go build \
-ldflags '-X main.version=$(VERSION) -X main.buildDate=$(DATE)' \
-o bin/dashboard .
.PHONY: build_ui
build_ui: $(BIN) ; $(info $(M) Building UI...) @ ## Build program binary
cd frontend && npm i && npm run build && cd ..
.PHONY: build
build: build_ui build_go ; $(info $(M) Building executable...) @ ## Build program binary
.PHONY: debug
debug: ; $(info $(M) Running dashboard in debug mode...) @
@DEBUG=1 ./bin/dashboard

121
README.md
View File

@@ -1,19 +1,26 @@
# <img src="pkg/dashboard/static/logo.png" height=30 style="height: 2rem"> Helm Dashboard
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="images/logo-header-inverted.svg">
<source media="(prefers-color-scheme: light)" srcset="images/logo-header.svg#gh-light-mode-only">
<img alt="Helm Dashboard" src="images/logo-header.svg#gh-light-mode-only">
</picture>
</p>
A simplified way of working with Helm.
<p align="center">A simplified way of working with Helm.</p>
<kbd>[<img src="screenshot.png" style="width: 100%; border: 1px solid silver;" border="1" alt="Screenshot">](screenshot.png)</kbd>
![GitHub contributors](https://img.shields.io/github/contributors/komodorio/helm-dashboard) [![GitHub issues](https://img.shields.io/github/issues-raw/komodorio/helm-dashboard)](https://github.com/komodorio/helm-dashboard/issues) ![GitHub stars](https://img.shields.io/github/stars/komodorio/helm-dashboard?style=social) ![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/komodorio/helm-dashboard) ![GitHub pull requests](https://img.shields.io/github/issues-pr/komodorio/helm-dashboard) [![GitHub release (latest by date)](https://img.shields.io/github/v/release/komodorio/helm-dashboard)](https://github.com/komodorio/helm-dashboard/releases) ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/komodorio/helm-dashboard) [![GitHub license](https://img.shields.io/github/license/komodorio/helm-dashboard)](https://github.com/komodorio/helm-dashboard) [![codecov](https://codecov.io/gh/komodorio/helm-dashboard/branch/main/graph/badge.svg?token=PXPSNVHI2T)](https://codecov.io/gh/komodorio/helm-dashboard)
## What it Does?
<kbd>[<img src="images/screenshot.png" style="width: 100%; border: 1px solid silver;" border="1" alt="Screenshot">](images/screenshot.png)</kbd>
The _Helm Dashboard_ plugin offers a UI-driven way to view the installed Helm charts, see their revision history and
corresponding k8s resources. Also, you can perform simple actions like roll back to a revision or upgrade to newer
version.
## Description
This project is part of [Komodor's](https://komodor.com/?utm_campaign=Helm-Dash&utm_source=helm-dash-gh) vision of
helping Kubernetes users to navigate and troubleshoot their clusters.
_Helm Dashboard_ is an **open-source project** which offers a UI-driven way to view the installed Helm charts, see their revision history and
corresponding k8s resources. It also allows users to perform simple actions such as rolling back to a
revision or upgrading to a newer version.
This project is part of [Komodor's](https://komodor.com/?utm_campaign=Helm-Dash&utm_source=helm-dash-gh) vision to
help Kubernetes users to navigate and troubleshoot their clusters. It is important to note that Helm Dashboard is **NOT** an official project by the [helm team](https://helm.sh/).
Some of the key capabilities of the tool:
Key capabilities of the tool:
- See all installed charts and their revision history
- See manifest diff of the past revisions
@@ -21,10 +28,22 @@ Some of the key capabilities of the tool:
- Easy rollback or upgrade version with a clear and easy manifest diff
- Integration with popular problem scanners
- Easy switch between multiple clusters
- Can be used locally, or installed into Kubernetes cluster
- Does not require Helm or Kubectl installed
## Installing
All the features of the tool can be discovered via our [features overview page](FEATURES.md).
To install it, simply run Helm command:
## Installation
### Standalone Binary
Since version 1.0, the recommended install method is to just use standalone binary. It does not require Helm or kubectl to be installed.
Download the appropriate [release package](https://github.com/komodorio/helm-dashboard/releases) for your platform, unpack it and just run `dashboard` binary from it. See below section for some more CLI parameters to use.
### Using Helm plugin manager
To install dashboard as Helm plugin, simply run Helm command:
```shell
helm plugin install https://github.com/komodorio/helm-dashboard.git
@@ -42,9 +61,7 @@ To uninstall, run:
helm plugin uninstall dashboard
```
## Running
To use the plugin, your machine needs to have working `helm` and also `kubectl` commands.
To use the plugin, your machine needs to have working `helm` and also `kubectl` commands. Helm version 3.4.0+ is required.
After installing, start the UI by running:
@@ -52,49 +69,75 @@ After installing, start the UI by running:
helm dashboard
```
The command above will launch the local Web server and will open the UI in new browser tab. The command will hang
The command above will launch the local Web server and will open the UI in a new browser tab. The command will hang
waiting for you to terminate it in command-line or web UI.
You can see the list of available command-line flags by running `helm dashboard --help`.
By default, the web server is only available locally. You can change that by specifying `HD_BIND` environment variable
to the desired value. For example, `0.0.0.0` would bind to all IPv4 addresses or `[::0]` would be all IPv6 addresses.
This can also be specified using flag `--bind <host>`, for example `--bind=0.0.0.0` or `--bind 0.0.0.0`.
If your port 8080 is busy, you can specify a different port to use via `HD_PORT` environment variable.
> Precedence order: flag `--bind=<host>` > env `HD_BIND=<host>` > default value `localhost`
If you don't want browser tab to automatically open, set `HD_NOBROWSER=1` in your environment variables.
If your port 8080 is busy, you can specify a different port to use via `--port <number>` command-line flag.
If you want to increase the logging verbosity and see all the debug info, set `DEBUG=1` environment variable.
If you need to limit the operations to a specific namespace, please use `--namespace=...` in your command-line. You can specify multiple namespaces, separated by commas.
## Scanner Integrations
If you don't want the browser tab to automatically open, add `--no-browser` flag in your command-line.
Upon startup, Helm Dashboard detects the presence of [Trivy](https://github.com/aquasecurity/trivy)
and [Checkov](https://github.com/bridgecrewio/checkov) scanners. When available, these scanners are offered on k8s
resources page, as well as install/upgrade preview page.
If you want to increase the logging verbosity and see all the debug info, use the `--verbose` flag.
You can request scanning of the specific k8s resource in your cluster:
![](screenshot_scan_resource.png)
> Disclaimer: For the sake of improving the project quality, there is user analytics collected by the tool. You can disable this collecting with `--no-analytics` option. The collection is done via DataDog RUM and Heap Analytics. Only the anonymous data is collected, no sensitive information is used.
If you want to validate the k8s manifest prior to installing/reconfiguring a Helm chart, look for "Scan for Problems"
button at the bottom of the dialog:
![](screenshot_scan_manifest.png)
### Deploying Helm Dashboard on Kubernetes
The official helm chart is [available here](https://github.com/komodorio/helm-charts/blob/master/charts/helm-dashboard)
## Support Channels
We have two main channels for supporting the Helm Dashboard
users: [Slack community](https://komodorkommunity.slack.com/archives/C044U1B0265) for general conversations
users: [Slack community](https://komodorkommunity.slack.com) for general conversations
and [GitHub issues](https://github.com/komodorio/helm-dashboard/issues) for real bugs.
## Contributing
Kindly read our [Contributing Guide](CONTRIBUTING.md) to learn and understand about our development process, how to propose bug fixes and improvements, and how to build and test your changes to Helm Dashboard. <br>
## Contributors
<a href="https://github.com/komodorio/helm-dashboard/graphs/contributors">
<img src="https://contrib.rocks/image?repo=komodorio/helm-dashboard" />
</a>
## Local Dev Testing
Prerequisites: `helm` and `kubectl` binaries installed and operational.
Prerequisites, binaries installed and operational:
There is a need to build binary for plugin to function, run:
- [Golang](https://go.dev/doc/install)
- Node.js
There is a need to build frontend and then backend as a series of commands, run:
### Linux
```shell
cd frontend && npm run build && cd ..
go build -o bin/dashboard .
```
You can just run the `bin/dashboard` binary directly, it will just work.
Or just `make build` that will do everything inside.
Then, you can run `npm run dev` from `frontend` directory to work on frontend with Vite hot reload.
### Windows
```bat
cd frontend && npm run build && cd ..
go build -o bin\dashboard.exe .
```
You can just run the `dashboard` or `dashboard.exe` binary directly.
To install, checkout the source code and run from source dir:
@@ -102,7 +145,7 @@ To install, checkout the source code and run from source dir:
helm plugin install .
```
Local installation of plugin just creates a symlink, so making the changes and rebuilding the binary would not require
A local installation of the plugin just creates a symlink, so making the changes and rebuilding the binary would not require
to
reinstall a plugin.
@@ -113,3 +156,15 @@ helm dashboard
```
Then, use the web UI.
## Development Snapshots
In our GitHub actions, we attach the built binaries as build artifacts, you can download and test it fully assembled.
Also, we upload `unstable` tag for Docker image upon every build of `main` branch, you can make our Helm chart to use that image by providing values:
```yaml
image:
pullPolicy: Always
tag: unstable
```

5
artifacthub-repo.yml Normal file
View File

@@ -0,0 +1,5 @@
# Artifact Hub repository metadata file
repositoryID: 9ed6d12d-b3d5-4efd-836e-3ac9fa9dd3d1
owners:
- name: komodor-bot
email: komi@komodor.io

View File

@@ -0,0 +1,23 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/

View File

@@ -0,0 +1,9 @@
apiVersion: v2
type: application
name: helm-dashboard
description: A GUI Dashboard for Helm by Komodor
icon: "https://raw.githubusercontent.com/komodorio/helm-dashboard/refs/heads/main/images/logo.svg"
version: 2.0.5
appVersion: "2.1.0"

View File

@@ -0,0 +1,92 @@
# Helm Dashboard
## TL;DR;
```bash
helm repo add komodorio https://helm-charts.komodor.io
helm repo update
helm upgrade --install helm-dashboard komodorio/helm-dashboard
```
## Introduction
This chart bootstraps a Helm Dashboard deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
While installed inside cluster, Helm Dashboard will run some additional background actions, for example, will automatically update Helm repositories. To enable that behavior locally, set `HD_CLUSTER_MODE` env variable.
## Prerequisites
- Kubernetes 1.16+
## Installing the Chart
To install the chart with the release name `helm-dashboard`:
```bash
helm install helm-dashboard .
```
The command deploys Helm Dashboard on the Kubernetes cluster in the default configuration. The [Parameters](#parameters) section lists the parameters that can be configured during installation.
> **Tip**: List all releases using `helm list`
## Uninstalling the Chart
To uninstall/delete the `helm-dashboard` deployment:
```bash
helm uninstall helm-dashboard
```
The command removes all the Kubernetes components associated with the chart and deletes the release.
## Adding Authentication
The task of authentication and user control is out of scope for Helm Dashboard. Luckily, there are third-party solutions which are dedicated to provide that functionality.
For instance, you can place authentication proxy in front of Helm Dashboard, like this one: https://github.com/oauth2-proxy/oauth2-proxy
## Parameters
The following table lists the configurable parameters of the chart and their default values.
| Parameter | Description | Default |
|---------------------------------------|------------------------------------------------------------------------------------------------|----------------------------------|
| `global.imageRegistry` | Registry for all images, useful for private registry | `""` |
| `global.imagePullSecrets` | Specify Docker-registry secret names as an array | `[]` |
| `image.repository` | Image registry/name | `komodorio/helm-dashboard` |
| `image.tag` | Image tag | |
| `image.imagePullSecrets` | Specify Docker-registry secret names as an array | `[]` |
| `image.pullPolicy` | Image pull policy | `IfNotPresent` |
| `replicaCount` | Number of dashboard Pods to run | `1` |
| `dashboard.allowWriteActions` | Enables write actions. Allow modifying, deleting and creating charts and kubernetes resources. | `true` |
| `resources.requests.cpu` | CPU resource requests | `200m` |
| `resources.limits.cpu` | CPU resource limits | `1` |
| `resources.requests.memory` | Memory resource requests | `256Mi` |
| `resources.limits.memory` | Memory resource limits | `1Gi` |
| `service.type ` | Kubernetes service type | `ClusterIP` |
| `service.port ` | Kubernetes service port | `8080` |
| `serviceAccount.create` | Creates a service account | `true` |
| `serviceAccount.name` | Optional name for the service account | `{RELEASE_FULLNAME}` |
| `nodeSelector` | Node labels for pod assignment | |
| `affinity` | Affinity settings for pod assignment | |
| `tolerations` | Tolerations for pod assignment | |
| `dashboard.persistence.enabled` | Enable helm data persistene using PVC | `true` |
| `dashboard.persistence.accessModes` | Persistent Volume access modes | `["ReadWriteOnce"]` |
| `dashboard.persistence.storageClass` | Persistent Volume storage class | `""` |
| `dashboard.persistence.size` | Persistent Volume size | `100M` |
| `dashboard.persistence.finalizers` | Finalizers for the Persistent Volume Claim | `[kubernetes.io/pvc-protection]` |
| `dashboard.persistence.lookupVolumeName` | Lookup volume name for the Persistent Volume Claim | `true` |
| `updateStrategy.type` | Set up update strategy for helm-dashboard installation. | `RollingUpdate` |
| `extraArgs` | Set the arguments to be supplied to the helm-dashboard binary | `[--no-browser, --bind=0.0.0.0]` |
| `testImage.repository` | Test image registry/name | `busybox` |
| `testImage.tag` | Test image tag | `lastest` |
| `testImage.imagePullSecrets` | Specify Docker-registry secret names as an array | `[]` |
| `testImage.pullPolicy` | Test image pull policy | `IfNotPresent` |
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`.
```bash
helm upgrade --install helm-dashboard komodorio/helm-dashboard --set dashboard.allowWriteActions=true --set service.port=9090
```
> **Tip**: You can use the default [values.yaml](values.yaml)

View File

@@ -0,0 +1,16 @@
Thank you for installing Helm Dashboard.
Helm Dashboard can be accessed:
* Within your cluster, at the following DNS name at port {{ .Values.service.port }}:
{{ template "helm-dashboard.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local
* From outside the cluster, run these commands in the same shell:
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "helm-dashboard.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
Visit our repo at:
https://github.com/komodorio/helm-dashboard

View File

@@ -0,0 +1,51 @@
{{/*
Return the proper image name
{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" .Values.global ) }}
*/}}
{{- define "common.images.image" -}}
{{- $registryName := .imageRoot.registry -}}
{{- $repositoryName := .imageRoot.repository -}}
{{- $separator := ":" -}}
{{- $termination := .imageRoot.tag | toString -}}
{{- if .global }}
{{- if .global.imageRegistry }}
{{- $registryName = .global.imageRegistry -}}
{{- end -}}
{{- end -}}
{{- if .imageRoot.digest }}
{{- $separator = "@" -}}
{{- $termination = .imageRoot.digest | toString -}}
{{- end -}}
{{- if $registryName }}
{{- printf "%s/%s%s%s" $registryName $repositoryName $separator $termination -}}
{{- else -}}
{{- printf "%s%s%s" $repositoryName $separator $termination -}}
{{- end -}}
{{- end -}}
{{/*
Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead)
{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }}
*/}}
{{- define "common.images.pullSecrets" -}}
{{- $pullSecrets := list }}
{{- if .global }}
{{- range .global.imagePullSecrets -}}
{{- $pullSecrets = append $pullSecrets . -}}
{{- end -}}
{{- end -}}
{{- range .images -}}
{{- range .pullSecrets -}}
{{- $pullSecrets = append $pullSecrets . -}}
{{- end -}}
{{- end -}}
{{- if (not (empty $pullSecrets)) }}
imagePullSecrets:
{{- range $pullSecrets }}
- name: {{ . }}
{{- end }}
{{- end }}
{{- end -}}

View File

@@ -0,0 +1,76 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "helm-dashboard.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "helm-dashboard.fullname" -}}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- $fullname := default (ternary .Release.Name (printf "%s-%s" .Release.Name $name) (contains $name .Release.Name)) .Values.fullnameOverride }}
{{- $fullname | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "helm-dashboard.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "helm-dashboard.labels" -}}
helm.sh/chart: {{ include "helm-dashboard.chart" . }}
{{ include "helm-dashboard.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "helm-dashboard.selectorLabels" -}}
app.kubernetes.io/name: {{ include "helm-dashboard.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Create the name of the service account to use
*/}}
{{- define "helm-dashboard.serviceAccountName" -}}
{{- default (.Values.serviceAccount.create | ternary (include "helm-dashboard.fullname" .) "default") .Values.serviceAccount.name }}
{{- end }}
{{/*
Return the proper image Registry Secret Names
*/}}
{{- define "helm-dashboard.imagePullSecrets" -}}
{{ include "common.images.pullSecrets" (dict "images" (list .Values.image) "global" .Values.global) }}
{{- end -}}
{{/*
Return the proper image name
*/}}
{{- define "helm-dashboard.image" -}}
{{- $image := .Values.image -}}
{{- $tag := default .Chart.AppVersion $image.tag -}}
{{- $_ := set $image "tag" $tag -}}
{{ include "common.images.image" (dict "imageRoot" $_ "global" .Values.global) }}
{{- end -}}
{{/*
Return the proper image name
*/}}
{{- define "test.image" -}}
{{ include "common.images.image" (dict "imageRoot" .Values.testImage "global" .Values.global) }}
{{- end -}}

View File

@@ -0,0 +1,90 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "helm-dashboard.fullname" . }}
labels:
{{- include "helm-dashboard.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "helm-dashboard.selectorLabels" . | nindent 6 }}
strategy: {{- toYaml .Values.updateStrategy | nindent 4 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "helm-dashboard.selectorLabels" . | nindent 8 }}
spec:
{{- include "helm-dashboard.imagePullSecrets" . | nindent 6 }}
serviceAccountName: {{ include "helm-dashboard.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
containers:
- name: {{ .Chart.Name }}
command:
- /bin/helm-dashboard
args:
{{- with .Values.extraArgs }}
{{- toYaml . | nindent 12 }}
{{- end }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ include "helm-dashboard.image" . }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
- name: HELM_CACHE_HOME
value: /opt/dashboard/helm/cache
- name: HELM_CONFIG_HOME
value: /opt/dashboard/helm/config
- name: HELM_DATA_HOME
value: /opt/dashboard/helm/data
- name: DEBUG
value: {{- ternary " '1'" "" .Values.debug }}
{{- if .Values.dashboard.namespace }}
- name: HELM_NAMESPACE
value: {{ .Values.dashboard.namespace }}
{{end}}
ports:
- name: http
containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /status
port: 8080
readinessProbe:
httpGet:
path: /status
port: 8080
resources:
{{- toYaml .Values.resources | nindent 12 }}
volumeMounts:
- name: data
mountPath: /opt/dashboard/helm
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
volumes:
- name: data
{{- if .Values.dashboard.persistence.enabled }}
persistentVolumeClaim:
claimName: {{ include "helm-dashboard.fullname" . }}
{{- else }}
emptyDir: { }
{{- end }}

View File

@@ -0,0 +1,61 @@
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "helm-dashboard.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
{{- end }}
{{- end }}
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "helm-dashboard.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
ingressClassName: {{ .Values.ingress.className }}
{{- end }}
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
pathType: {{ .pathType }}
{{- end }}
backend:
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
service:
name: {{ $fullName }}
port:
number: {{ $svcPort }}
{{- else }}
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}

View File

@@ -0,0 +1,31 @@
{{- if .Values.dashboard.persistence.enabled -}}
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ include "helm-dashboard.fullname" . }}
namespace: {{ .Release.Namespace | quote }}
labels:
{{- include "helm-dashboard.labels" . | nindent 4 }}
{{- with .Values.dashboard.persistence.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- with .Values.dashboard.persistence.finalizers }}
finalizers:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
accessModes:
{{- range .Values.dashboard.persistence.accessModes }}
- {{ . | quote }}
{{- end }}
resources:
requests:
storage: {{ .Values.dashboard.persistence.size | quote }}
{{- if and (.Values.dashboard.persistence.lookupVolumeName) (lookup "v1" "PersistentVolumeClaim" .Release.Namespace (include "helm-dashboard.fullname" .)) }}
volumeName: {{ (lookup "v1" "PersistentVolumeClaim" .Release.Namespace (include "helm-dashboard.fullname" .)).spec.volumeName }}
{{- end }}
{{- with .Values.dashboard.persistence.storageClassName }}
storageClassName: {{ . }}
{{- end }}
{{- end }}

View File

@@ -0,0 +1,18 @@
apiVersion: v1
kind: Service
metadata:
name: {{ include "helm-dashboard.fullname" . }}
labels:
{{- include "helm-dashboard.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "helm-dashboard.selectorLabels" . | nindent 4 }}
{{- if .Values.service.loadBalancerIP }}
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
{{- end }}

View File

@@ -0,0 +1,38 @@
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "helm-dashboard.serviceAccountName" . }}
labels:
{{- include "helm-dashboard.labels" . | nindent 4 }}
{{- with .Values.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: {{ include "helm-dashboard.serviceAccountName" . }}
rules:
- apiGroups: ["*"]
resources: ["*"]
{{- if .Values.dashboard.allowWriteActions }}
verbs: ["get", "list", "watch", "create", "delete", "patch", "update"]
{{- else }}
verbs: ["get", "list", "watch"]
{{- end }}
{{- end }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ include "helm-dashboard.serviceAccountName" . }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ include "helm-dashboard.serviceAccountName" . }}
subjects:
- kind: ServiceAccount
namespace: {{ .Release.Namespace }}
name: {{ include "helm-dashboard.serviceAccountName" . }}

View File

@@ -0,0 +1,16 @@
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "helm-dashboard.fullname" . }}-test-connection"
labels:
{{- include "helm-dashboard.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": test
spec:
{{- include "helm-dashboard.imagePullSecrets" . | nindent 2 }}
containers:
- name: wget
image: {{ include "test.image" . }}
command: ['wget']
args: ['--timeout=5', '{{ include "helm-dashboard.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never

View File

@@ -0,0 +1,149 @@
replicaCount: 1
# Flag for setting environment to debug mode
debug: false
global:
## @param global.imageRegistry Global Docker image registry
imageRegistry: ""
## Optionally specify an array of imagePullSecrets.
## Example:
## imagePullSecrets:
## - myRegistryKeySecretName
imagePullSecrets: []
image:
repository: komodorio/helm-dashboard
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: ""
# Specifies the exact image digest to pull.
digest: ""
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
# Specifies whether a service account should be created
create: true
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: ""
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 1
memory: 1Gi
dashboard:
allowWriteActions: true
# default namespace for Helm operations
namespace: ""
persistence:
enabled: true
## If defined, storageClassName: <storageClass>
## If undefined (the default) or set to null, no storageClassName spec is
## set, choosing the default provisioner. (gp2 on AWS, standard on
## GKE, AWS & OpenStack)
##
# storageClassName: default
## Helm Dashboard Persistent Volume access modes
## Must match those of existing PV or dynamic provisioner
## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
##
accessModes:
- ReadWriteOnce
## Helm Dashboard Persistent Volume labels
##
labels: {}
## Helm Dashboard Persistent Volume annotations
##
annotations: {}
## Finalizer to ensure PVC is not deleted until the pod is terminated
##
finalizers:
- kubernetes.io/pvc-protection
## Helm Dashboard data Persistent Volume size
##
size: 100M
## If 'lookupVolumeName' is set to true, Helm will attempt to retrieve
## the current value of 'spec.volumeName' and incorporate it into the template.
lookupVolumeName: true
## @param.updateStrategy.type Set up update strategy for helm-dashboard installation.
## Set to Recreate if you use persistent volume that cannot be mounted by more than one pods to make sure the pods is destroyed first.
## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
## Example:
## updateStrategy:
## type: RollingUpdate
## rollingUpdate:
## maxSurge: 25%
## maxUnavailable: 25%
##
updateStrategy:
type: RollingUpdate
podAnnotations: {}
podSecurityContext: {}
securityContext: {}
service:
type: ClusterIP
port: 8080
loadBalancerIP: null
ingress:
enabled: false
className: ""
annotations: {}
hosts:
- host: chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
tls: []
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
nodeSelector: {}
extraArgs:
- --no-browser
- --bind=0.0.0.0
tolerations: []
affinity: {}
testImage:
repository: busybox
tag: latest
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
# tag: ""
## Optionally specify an array of imagePullSecrets.
## Example:
## imagePullSecrets:
## - myRegistryKeySecretName
imagePullSecrets: []

10
ci/build-ui.sh Normal file
View File

@@ -0,0 +1,10 @@
#!/bin/bash -e
WORKING_DIRECTORY="$PWD"
cd "$WORKING_DIRECTORY/dashboard"
npm i
npm run build
cp -a "$WORKING_DIRECTORY/dashboard/static/" "$WORKING_DIRECTORY/pkg/dashboard/static/"

15
ci/bump-versions.sh Executable file
View File

@@ -0,0 +1,15 @@
#!/bin/bash -e
WORKING_DIRECTORY="$PWD"
[ -z "$HELM_CHARTS_SOURCE" ] && HELM_CHARTS_SOURCE="$WORKING_DIRECTORY/charts/helm-dashboard"
[ -z "$APP_VERSION" ] && {
APP_VERSION=$(cat ${HELM_CHARTS_SOURCE}/Chart.yaml | grep 'appVersion:' | awk -F'"' '{print $2}')
}
sed -i -e "s/appVersion.*/appVersion: \"${APP_VERSION}\"/g" ${HELM_CHARTS_SOURCE}/Chart.yaml
sed -i -e "s/version.*/version: \"${APP_VERSION}\"/g" plugin.yaml
CURRENT_VERSION=$(cat ${HELM_CHARTS_SOURCE}/Chart.yaml | grep 'version:' | awk '{print $2}')
NEW_VERSION=$(echo $CURRENT_VERSION | awk -F. '{$NF = $NF + 1;} 1' | sed 's/ /./g')
sed -i -e "s/${CURRENT_VERSION}/${NEW_VERSION}/g" ${HELM_CHARTS_SOURCE}/Chart.yaml

1
frontend/.env Normal file
View File

@@ -0,0 +1 @@
VITE_SERVER_PORT=8080

2
frontend/.flowbite-react/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
class-list.json
pid

View File

@@ -0,0 +1,10 @@
{
"$schema": "https://unpkg.com/flowbite-react/schema.json",
"components": [],
"dark": false,
"path": "src/components",
"prefix": "",
"rsc": true,
"tsx": true,
"version": 4
}

View File

@@ -0,0 +1,22 @@
/* eslint-disable */
// @ts-nocheck
// biome-ignore-all lint: auto-generated file
// This file is auto-generated by the flowbite-react CLI.
// Do not edit this file directly.
// Instead, edit the .flowbite-react/config.json file.
import { StoreInit } from "flowbite-react/store/init";
import React from "react";
export const CONFIG = {
dark: false,
prefix: "",
version: 4,
};
export function ThemeInit() {
return <StoreInit {...CONFIG} />;
}
ThemeInit.displayName = "ThemeInit";

27
frontend/.gitignore vendored Normal file
View File

@@ -0,0 +1,27 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
static
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
/storybook-static

1
frontend/.npmrc Normal file
View File

@@ -0,0 +1 @@
legacy-peer-deps=true

10
frontend/.prettierignore Normal file
View File

@@ -0,0 +1,10 @@
# Ignore artifacts:
build
coverage
.env
.gitignore
.npmrc
.prettierignore
yarn.lock
package-lock.json
.flowbite-react/*

View File

@@ -0,0 +1,8 @@
trailingComma: "es5"
tabWidth: 2
semi: true
singleQuote: false
bracketSpacing: true
plugins:
- "prettier-plugin-tailwindcss" # should be last https://github.com/tailwindlabs/prettier-plugin-tailwindcss?tab=readme-ov-file#compatibility-with-other-prettier-plugins
tailwindStylesheet: "./src/index.css"

View File

@@ -0,0 +1,15 @@
import type { StorybookConfig } from "@storybook/react-vite";
const config: StorybookConfig = {
stories: ["../src/**/*.stories.@(js|jsx|ts|tsx|mdx)"],
addons: ["@storybook/addon-links", "@storybook/addon-docs"],
core: {},
framework: {
name: "@storybook/react-vite",
options: {},
},
};
export default config;

View File

@@ -0,0 +1 @@
<div id="portal"></div>

View File

@@ -0,0 +1,3 @@
<script>
window.global = window;
</script>

View File

@@ -0,0 +1,33 @@
import "../src/index.css";
import { BrowserRouter } from "react-router";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import type { Preview, StoryFn } from "@storybook/react";
import { AppContextProvider } from "../src/context/AppContext";
const queryClient = new QueryClient();
export const parameters = {
actions: { argTypesRegex: "^on[A-Z].*" },
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/,
},
},
};
export const decorators: Preview["decorators"] = [
(Story: StoryFn) => (
<BrowserRouter>
<AppContextProvider>
<QueryClientProvider client={queryClient}>
<Story />
</QueryClientProvider>
</AppContextProvider>
</BrowserRouter>
),
];
export const tags = ["autodocs"];

72
frontend/README.md Normal file
View File

@@ -0,0 +1,72 @@
# Helm dashboard React
Welcome to the frontend of the helm dashboard.
We care most about keeping the project:
1. Maintainable
2. Extendable
3. Contributor friendly
# The FE Stack
- Vite, as our build tool.
- React, as our UI library.
- TypeScript and ESLint will keep the project safe, please keep them clean.
- Tailwind for styling.
- React-Query for fetching data from the backend.
- Storybook is utilized to develop a component library.
Please follow through the file structure to understand how things are structured and should be used.
# Contribution guide
## Setting up your development environment
1. First you should fork this repository.
2. Clone your new repository using `git clone <https_or_ssh_url>`.
## Running helm dashboard
1. Make sure you cloned the project correctly. This is explained in this [stage](https://github.com/komodorio/helm-dashboard/blob/helm-dashboard-v2/dashboard/README.md#setting-up-your-development-environment).
2. run the backend server. This is also explained in the above link.
3. go to `frontend` in your local project.
4. in order to install dependencies and start the development server
- `npm i`
- `npm run dev`
5. with the default integration the dashboard should run on http://localhost:5173/
# Component library
We created a components library to have a consistent design system throughout the project. Please rely on these components.
Additional information and examples on how to use them are available when you run Storybook, which shows them in an interactive way and in different scenarios.
Once you run it, you'll be able to see pre-made scenarios, documentation, and play with the component properties.
To run Storybook, make sure that all the dependencies are installed and run:
```shell
npm run storybook
```
Refer to the [official documentation](https://storybook.js.org/docs/react/get-started/install) for more information.
# Helpers
- Icons: https://react-icons.github.io/react-icons/
- Tailwind: https://tailwindcss.com/docs
- Typescript: https://www.typescriptlang.org/docs/handbook/intro.html
- React-query: https://react-query.tanstack.com/overview
# Coding Conventions
- Use only functional components
- Please prefer async/await over .then
- wrap every function with try/catch unless you want to display the error to the user
in such case we have a general error handler in the app.tsx file which will display the error to the user in a modal
- Please use the component library we created, it will help us keep a consistent design system
- Please use the react-query library to fetch data from the backend
- Prefer use fetch API over axios, if you see axios in the code, replace it with fetch.
- Use <Outlet> for inner routes
- User query params in the url for filters or any other state that can be represented
- Hooks:
- useCustomSearchParams - for search params

View File

@@ -0,0 +1,18 @@
import { defineConfig } from "cypress";
export default defineConfig({
allowCypressEnv: false,
component: {
devServer: {
framework: "react",
bundler: "vite",
},
},
e2e: {
baseUrl: "http://localhost:5173",
// setupNodeEvents(on, config) {
// // implement node event listeners here
// },
},
});

View File

@@ -0,0 +1,50 @@
describe("Adding repository flow", () => {
const addChartNameInput = "[data-cy='add-chart-name']";
const addChartUrlInput = "[data-cy='add-chart-url']";
const addChartRepositoryButton = "[data-cy='add-chart-repository-button']";
it("Adding new chart repository", () => {
cy.intercept("GET", "/status", {
fixture: "status.json",
}).as("status");
cy.intercept("GET", "/api/helm/releases", {
fixture: "releases.json",
}).as("releases");
cy.visit("/#/minikube/installed?filteredNamespace=default");
cy.get("[data-cy='navigation-link']").contains("Repository").click();
cy.get("[data-cy='install-repository-button']").click();
cy.get(addChartNameInput).type("Komodorio");
cy.get(addChartUrlInput).type("https://helm-charts.komodor.io");
cy.intercept("GET", "/api/helm/repositories", {
fixture: "repositories.json",
}).as("repositories");
cy.get(addChartRepositoryButton).click();
cy.wait("@repositories");
cy.contains("https://helm-charts.komodor.io");
cy.get("[data-cy='chart-viewer-install-button']")
.eq(0)
.click({ force: true })
.contains("Install")
.click();
cy.intercept("POST", "/api/helm/releases/default", {
fixture: "defaultReleases.json",
}).as("defaultReleases");
cy.intercept("GET", "/api/helm/releases/default/helm-dashboard/history", {
fixture: "history.json",
}).as("history");
cy.contains("Confirm").click();
cy.wait(["@defaultReleases", "@history"]);
});
});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
{
"name": "Using fixtures to represent data",
"email": "hello@cypress.io",
"body": "Fixtures are a great way to mock data for responses to routes"
}

View File

@@ -0,0 +1,13 @@
[
{
"revision": 1,
"updated": "2024-01-17T22:39:07.2371554+02:00",
"status": "deployed",
"chart": "helm-dashboard-0.1.10",
"app_version": "1.3.3",
"description": "Install complete",
"chart_name": "helm-dashboard",
"chart_ver": "0.1.10",
"has_tests": true
}
]

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,6 @@
[
{
"name": "Komodorio",
"url": "https://helm-charts.komodor.io"
}
]

View File

@@ -0,0 +1,7 @@
{
"CurVer": "0.0.0",
"LatestVer": "v1.3.3",
"Analytics": false,
"CacheHitRatio": 0,
"ClusterMode": false
}

View File

@@ -0,0 +1,37 @@
/// <reference types="cypress" />
// ***********************************************
// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add('login', (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
//
// declare global {
// namespace Cypress {
// interface Chainable {
// login(email: string, password: string): Chainable<void>
// drag(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
// dismiss(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
// visit(originalFn: CommandOriginalFn, url: string, options: Partial<VisitOptions>): Chainable<Element>
// }
// }
// }

View File

@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Components App</title>
</head>
<body>
<div data-cy-root></div>
</body>
</html>

View File

@@ -0,0 +1,13 @@
import "./commands";
import { mount } from "cypress/react";
/* eslint-disable @typescript-eslint/no-namespace */
declare global {
namespace Cypress {
interface Chainable {
mount: typeof mount;
}
}
}
/* eslint-enable @typescript-eslint/no-namespace */
Cypress.Commands.add("mount", mount);

View File

@@ -0,0 +1,20 @@
// ***********************************************************
// This example support/e2e.ts is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import "./commands";
// Alternatively you can use CommonJS syntax:
// require('./commands')

119
frontend/eslint.config.js Normal file
View File

@@ -0,0 +1,119 @@
import js from "@eslint/js";
import { defineConfig } from "eslint/config";
import globals from "globals";
import { configs as tseslintConf } from "typescript-eslint";
import react from "eslint-plugin-react";
import reactHooks from "eslint-plugin-react-hooks";
import { flatConfigs as importXFlatConf } from "eslint-plugin-import-x";
import prettierRecommended from "eslint-plugin-prettier/recommended";
// import tscPlugin from "eslint-plugin-tsc";
export default defineConfig(
{ ignores: ["dist", "node_modules"] },
js.configs.recommended,
tseslintConf.recommendedTypeChecked,
// tsEslint.configs.strictTypeChecked, // The project is not ready yet
// tsEslint.configs.stylisticTypeChecked, // Added for better 2026 coding standards, however the project is not ready yet
importXFlatConf.recommended,
importXFlatConf.typescript,
react.configs.flat.recommended,
react.configs.flat["jsx-runtime"],
reactHooks.configs.flat.recommended,
prettierRecommended,
{
files: ["**/*.{ts,tsx}"],
languageOptions: {
globals: {
...globals.browser,
...globals.node,
},
parserOptions: {
projectService: {
allowDefaultProject: ["eslint.config.js"],
},
tsconfigRootDir: import.meta.dirname,
},
},
settings: {
react: { version: "detect" },
"import-x/resolver": {
node: true,
typescript: {
alwaysTryTypes: true,
project: "./tsconfig.json",
},
},
},
// plugins: {
// tsc: tscPlugin,
// },
rules: {
/* ───────── Base Overrides ───────── */
"no-console": ["error", { allow: ["error", "warn"] }],
"no-debugger": "error",
quotes: ["error", "double"],
semi: ["error", "always"],
/* ───────── Import Precision ───────── */
"import-x/no-duplicates": ["error", { "prefer-inline": true }],
/* ───────── React Precision ───────── */
"no-restricted-properties": [
"error",
{
object: "React",
message:
"Use named imports instead (e.g. import { useState } from 'react')",
},
],
"no-restricted-imports": [
"error",
{
name: "react",
importNames: ["default"],
message: "Default React imports are prohibited. Use named imports.",
},
],
/* ───────── TypeScript & Verbatim Syntax ───────── */
"@typescript-eslint/consistent-type-imports": [
"error",
{
prefer: "type-imports",
fixStyle: "inline-type-imports",
},
],
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-unused-vars": [
"error",
{ argsIgnorePattern: "^_" },
],
"@typescript-eslint/no-restricted-types": [
"error",
{
types: {
"React.FC": "Use 'import type { FC }' instead.",
"React.ReactNode": "Use 'import type { ReactNode }' instead.",
// FC: "Avoid FC (Functional Component) type; prefer explicit return types.",
},
},
],
},
},
{
files: ["**/*.{js,mjs}"],
...tseslintConf.disableTypeChecked,
languageOptions: {
globals: {
...globals.node,
},
},
},
{
files: ["eslint.config.js"],
rules: { "import-x/no-unresolved": "off" },
}
);

28
frontend/index.html Normal file
View File

@@ -0,0 +1,28 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Helm Dashboard</title>
<script type="module" src="/analytics.js"></script>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.1/styles/github.min.css"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/styles/lightfair.min.css"
/>
<link
rel="stylesheet"
type="text/css"
href="https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css"
/>
</head>
<body>
<div id="root"></div>
<div id="portal"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

13777
frontend/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

103
frontend/package.json Normal file
View File

@@ -0,0 +1,103 @@
{
"name": "dashboard",
"version": "1.1.0",
"type": "module",
"description": "",
"main": "index.js",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"prepare": "cd .. && husky",
"pre:commit": "lint-staged",
"test": "echo \"Error: no test specified. Please use 'cypress:run' or 'cypress:open' commands\" && exit 1",
"tsc": "tsc",
"storybook": "storybook dev -p 6006",
"storybook:build": "storybook build",
"lint": "npx eslint src/",
"lint:fix": "npm run lint -- --fix --max-warnings=0",
"prettier": "npx prettier src/ --check",
"prettier:fix": "npm run prettier -- --write",
"cypress:open": "cypress open",
"cypress:run": "cypress run",
"cypress:component": "cypress run --component",
"cypress:component:open": "cypress open --component"
},
"dependencies": {
"@dagrejs/dagre": "^2.0.4",
"@tanstack/react-query": "^5.90.21",
"@types/d3-force": "^3.0.10",
"@xyflow/react": "^12.10.1",
"compare-versions": "^6.1.1",
"d3-force": "^3.0.0",
"diff2html": "^3.4.52",
"flowbite-react": "^0.12.17",
"highlight.js": "^11.11.1",
"html-react-parser": "^5.2.17",
"luxon": "^3.7.2",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"react-error-boundary": "^6.1.1",
"react-icons": "^5.5.0",
"react-intersection-observer": "^10.0.3",
"react-modern-drawer": "^1.4.0",
"react-router": "^7.13.0",
"react-select": "^5.10.2",
"swagger-ui-react": "^5.31.2",
"uuid": "^13.0.0"
},
"devDependencies": {
"@eslint/eslintrc": "^3.3.3",
"@eslint/js": "^9.39.2",
"@storybook/addon-docs": "^10.2.10",
"@storybook/addon-links": "^10.2.10",
"@storybook/mdx2-csf": "^1.1.0",
"@storybook/react-vite": "^10.2.10",
"@tailwindcss/vite": "^4.2.0",
"@types/luxon": "^3.7.1",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"@types/swagger-ui-react": "^5.18.0",
"@typescript-eslint/eslint-plugin": "^8.56.0",
"@typescript-eslint/parser": "^8.56.0",
"@vitejs/plugin-react": "^5.1.4",
"autoprefixer": "^10.4.24",
"babel-plugin-react-compiler": "^1.0.0",
"cypress": "15.10.0",
"eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-import-resolver-typescript": "^4.4.4",
"eslint-plugin-import-x": "^4.16.1",
"eslint-plugin-prettier": "^5.5.5",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-storybook": "^10.2.10",
"eslint-plugin-tsc": "^2.0.0",
"flowbite": "^4.0.1",
"globals": "^17.3.0",
"husky": "^9.1.7",
"lint-staged": "^16.2.7",
"prettier": "^3.8.1",
"prettier-plugin-tailwindcss": "^0.7.2",
"rollup-plugin-visualizer": "^7.0.0",
"storybook": "^10.2.10",
"tailwindcss": "^4.2.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.56.0",
"vite": "^7.3.1",
"vite-plugin-static-copy": "^3.2.0"
},
"overrides": {
"minimatch": "^10.2.2"
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": "npm run lint:fix",
"*.{js,jsx,ts,tsx,json,css,md,mdx}": "npm run prettier:fix"
},
"resolutions": {
"dompurify": "^3.3.2"
},
"keywords": [],
"author": "",
"license": "Apache-2.0"
}

View File

@@ -0,0 +1,182 @@
const xhr = new XMLHttpRequest();
const TRACK_EVENT_TYPE = "track";
const IDENTIFY_EVENT_TYPE = "identify";
const BASE_ANALYTIC_MSG = {
method: "POST",
mode: "cors",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
"api-key": "komodor.analytics@admin.com"
},
redirect: "follow",
referrerPolicy: "no-referrer"
};
xhr.onload = function() {
if (xhr.readyState !== XMLHttpRequest.DONE) {
return;
}
const responseTxt = xhr.responseText?.trim();
if (!responseTxt) {
console.warn("Analytics response is empty");
return;
}
let status;
try {
status = JSON.parse(responseTxt);
} catch (e) {
console.error("Failed to parse JSON: ", xhr.responseText, e);
return;
}
const version = status.CurVer;
if (status.Analytics) {
enableDD(version);
enableHeap(version, status.ClusterMode);
enableSegmentBackend(version, status.ClusterMode);
} else {
console.log("Analytics is disabled in this session");
}
};
xhr.open("GET", "/status", true);
xhr.send(null);
function enableDD(version) {
(function(h, o, u, n, d) {
h = h[d] = h[d] || {
q: [],
onReady: function(c) {
h.q.push(c);
}
};
d = o.createElement(u);
d.async = true;
d.src = n;
n = o.getElementsByTagName(u)[0];
n.parentNode.insertBefore(d, n);
})(
window,
document,
"script",
"https://www.datadoghq-browser-agent.com/datadog-rum-v4.js",
"DD_RUM"
);
DD_RUM.onReady(function() {
DD_RUM.init({
clientToken: "pub16d64cd1c00cf073ce85af914333bf72",
applicationId: "e75439e5-e1b3-46ba-a9e9-a2e58579a2e2",
site: "datadoghq.com",
service: "helm-dashboard",
version: version,
trackInteractions: true,
trackResources: true,
trackLongTasks: true,
defaultPrivacyLevel: "mask",
sessionReplaySampleRate: 0
});
});
}
function enableHeap(version, inCluster) {
(window.heap = window.heap || []),
(heap.load = function(e, t) {
(window.heap.appid = e), (window.heap.config = t = t || {});
let r = document.createElement("script");
(r.type = "text/javascript"),
(r.async = !0),
(r.src = "https://cdn.heapanalytics.com/js/heap-" + e + ".js");
let a = document.getElementsByTagName("script")[0];
a.parentNode.insertBefore(r, a);
for (
let n = function(e) {
return function() {
heap.push([e].concat(Array.prototype.slice.call(arguments, 0)));
};
},
p = [
"addEventProperties",
"addUserProperties",
"clearEventProperties",
"identify",
"resetIdentity",
"removeEventProperty",
"setEventProperties",
"track",
"unsetEventProperty"
],
o = 0;
o < p.length;
o++
)
heap[p[o]] = n(p[o]);
});
heap.load("4249623943");
window.heap.addEventProperties({
version: version,
installationMode: inCluster ? "cluster" : "local"
});
}
function sendStats(name, prop) {
if (window.heap) {
window.heap.track(name, prop);
}
}
function enableSegmentBackend(version, ClusterMode) {
sendToSegmentThroughAPI(
"helm dashboard loaded",
{ version, installationMode: ClusterMode ? "cluster" : "local" },
TRACK_EVENT_TYPE
);
}
function sendToSegmentThroughAPI(eventName, properties, segmentCallType) {
const userId = getUserId();
try {
sendData(properties, segmentCallType, userId, eventName);
} catch (e) {
console.log("failed sending data to segment", e);
}
}
function sendData(data, eventType, userId, eventName) {
const body = createBody(eventType, userId, data, eventName);
return fetch(`https://api.komodor.com/analytics/segment/${eventType}`, {
...BASE_ANALYTIC_MSG,
body: JSON.stringify(body)
});
}
function createBody(segmentCallType, userId, params, eventName) {
const data = { userId: userId };
if (segmentCallType === IDENTIFY_EVENT_TYPE) {
data["traits"] = params;
} else if (segmentCallType === TRACK_EVENT_TYPE) {
if (!eventName) {
throw new Error("no eventName parameter on segment track call");
}
data["properties"] = params;
data["eventName"] = eventName;
}
return data;
}
const getUserId = (() => {
let userId = null;
return () => {
if (!userId) {
userId = crypto.randomUUID ? crypto.randomUUID() : uuid();
}
return userId;
};
})();
function uuid() {
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
let r = Math.random() * 16 | 0, v = c === "x" ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}

92
frontend/public/logo.svg Normal file
View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="179"
height="164"
viewBox="0 0 179 164"
fill="none"
version="1.1"
id="svg20"
sodipodi:docname="logo.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs24" />
<sodipodi:namedview
id="namedview22"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="3.9268293"
inkscape:cx="39.090062"
inkscape:cy="109.24845"
inkscape:window-width="3840"
inkscape:window-height="2059"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg20" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke-width:22.5327"
id="rect967"
width="113.34328"
height="68.482964"
x="32.284447"
y="47.989918" />
<path
d="M106.129 93.4776C112.242 93.4776 117.336 86.7533 117.336 78.1951C117.336 69.637 112.242 62.9127 106.129 62.9127C100.016 62.9127 94.9216 69.637 94.9216 78.1951C94.9216 86.7533 100.016 93.4776 106.129 93.4776Z"
fill="#1347FF"
id="path2" />
<path
d="M84.1221 78.1951C84.1221 86.5495 79.0279 93.4776 72.915 93.4776C66.802 93.4776 61.7078 86.7533 61.7078 78.1951C61.7078 69.8408 66.802 62.9127 72.915 62.9127C79.0279 62.9127 84.1221 69.8408 84.1221 78.1951Z"
fill="#1347FF"
id="path4" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M22.5848 48.8529L34.607 37.2383H144.437L156.459 48.6492V114.873L144.437 126.488H34.607L22.5848 114.873V48.8529ZM42.3501 49.8717L37.6635 54.3546V109.575L42.3501 113.854H136.897L141.38 109.371V54.1508L136.897 49.668H42.3501V49.8717Z"
fill="#1347FF"
id="path6" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M175.817 28.68L167.87 36.8306L155.848 25.2159L163.794 17.0653C172.353 8.09963 184.579 19.918 175.817 28.68Z"
fill="#1347FF"
id="path8" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M97.7744 9.32228V20.5294H81.0656V9.32228C81.0656 -3.10743 97.9781 -3.10743 97.7744 9.32228Z"
fill="#1347FF"
id="path10" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M81.2693 154.2V142.993H97.9781V154.2C97.9781 166.629 81.0655 166.629 81.2693 154.2Z"
fill="#1347FF"
id="path12" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M15.2493 17.0653L23.1961 25.2159L11.1739 36.8306L3.22708 28.68C-5.53484 19.918 6.6911 8.09963 15.2493 17.0653Z"
fill="#1347FF"
id="path14" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M3.0233 134.842L10.9702 126.691L22.9923 138.306L15.0455 146.457C6.48732 155.422 -5.73862 143.604 3.0233 134.842Z"
fill="#1347FF"
id="path16" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M163.591 146.457L155.644 138.306L167.666 126.691L175.613 134.842C184.375 143.604 172.149 155.422 163.591 146.457Z"
fill="#1347FF"
id="path18" />
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,681 @@
{
"openapi": "3.0.3",
"info": {
"title": "Helm Dashboard API",
"version": ""
},
"tags": [
{
"name": "Releases"
},
{
"name": "Repositories"
},
{
"name": "K8s"
},
{
"name": "Miscellaneous"
}
],
"paths": {
"/api/helm/releases": {
"get": {
"tags": [
"Releases"
],
"description": "Get list of installed releases",
"responses": {
"200": {
"description": "Returns list of installed releases"
}
}
}
},
"/api/helm/releases/{ns}": {
"parameters": [
{
"name": "ns",
"in": "path",
"description": "Name of kubernetes namespace, use '[empty]' if you want to use k8s context default"
}
],
"post": {
"tags": [
"Releases"
],
"description": "Install new release",
"requestBody": {
"content": {
"multipart/form-data": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"required": true
},
"chart": {
"type": "string",
"required": true
},
"version": {
"type": "string"
},
"values": {
"type": "string",
"description": "Text of values.yaml to use"
},
"preview": {
"type": "boolean"
}
}
}
}
}
},
"responses": {
"200": {
"description": "In case preview=true, the preview diff is generated",
"content": {
"text/plain": {}
}
},
"202": {
"description": "In case preview=false, the actial install is performed and resulting release object is returned",
"content": {
"application/json": {}
}
}
}
}
},
"/api/helm/releases/{ns}/{name}": {
"parameters": [
{
"name": "ns",
"in": "path",
"description": "Name of kubernetes namespace"
},
{
"name": "name",
"in": "path",
"description": "Name of Helm release"
}
],
"post": {
"tags": [
"Releases"
],
"description": "Upgrade/reconfigure existing release",
"requestBody": {
"content": {
"multipart/form-data": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"required": true
},
"chart": {
"type": "string",
"required": true
},
"version": {
"type": "string"
},
"values": {
"type": "string",
"description": "Text of values.yaml to use"
},
"preview": {
"type": "boolean"
}
}
}
}
}
},
"responses": {
"200": {
"description": "In case preview=true, the preview diff is generated",
"content": {
"text/plain": {}
}
},
"202": {
"description": "In case preview=false, the actial install is performed and resulting release object is returned",
"content": {
"application/json": {}
}
}
}
}
},
"/api/helm/releases/{ns}/{name}/history": {
"parameters": [
{
"name": "ns",
"in": "path",
"description": "Name of kubernetes namespace"
},
{
"name": "name",
"in": "path",
"description": "Name of Helm release"
}
],
"get": {
"tags": [
"Releases"
],
"description": "Get revision history for release",
"responses": {
"200": {
"description": "List of release revisions"
}
}
}
},
"/api/helm/releases/{ns}/{name}/manifest": {
"parameters": [
{
"name": "ns",
"in": "path",
"description": "Name of kubernetes namespace"
},
{
"name": "name",
"in": "path",
"description": "Name of Helm release"
},
{
"name": "revision",
"in": "query",
"description": "Revision to get data from"
},
{
"name": "revisionDiff",
"in": "query",
"description": "Revision to diff against"
}
],
"get": {
"tags": [
"Releases"
],
"description": "Get manifest for release",
"responses": {
"200": {
"description": "Manifest text, or diff if revisionDiff is specified"
}
}
}
},
"/api/helm/releases/{ns}/{name}/values": {
"parameters": [
{
"name": "ns",
"in": "path",
"description": "Name of kubernetes namespace"
},
{
"name": "name",
"in": "path",
"description": "Name of Helm release"
},
{
"name": "revision",
"in": "query",
"description": "Revision to get data from"
},
{
"name": "revisionDiff",
"in": "query",
"description": "Revision to diff against"
},
{
"name": "userDefined",
"in": "query",
"description": "If set, only user-defined values will be listed"
}
],
"get": {
"tags": [
"Releases"
],
"description": "Get values for release",
"responses": {
"200": {
"description": "Values YAML text, or diff if revisionDiff is specified"
}
}
}
},
"/api/helm/releases/{ns}/{name}/notes": {
"parameters": [
{
"name": "ns",
"in": "path",
"description": "Name of kubernetes namespace"
},
{
"name": "name",
"in": "path",
"description": "Name of Helm release"
},
{
"name": "revision",
"in": "query",
"description": "Revision to get data from"
},
{
"name": "revisionDiff",
"in": "query",
"description": "Revision to diff against"
}
],
"get": {
"tags": [
"Releases"
],
"description": "Get textual notes for release",
"responses": {
"200": {
"description": "Notes text, or diff if revisionDiff is specified"
}
}
}
},
"/api/helm/releases/{ns}/{name}/resources": {
"parameters": [
{
"name": "ns",
"in": "path",
"description": "Name of kubernetes namespace"
},
{
"name": "name",
"in": "path",
"description": "Name of Helm release"
},
{
"name": "health",
"in": "query",
"description": "Flag to query k8s health status of resources"
}
],
"get": {
"tags": [
"Releases"
],
"description": "List of installed k8s resources for this release",
"responses": {
"200": {
"description": "Structured list of resources",
"content": {
"application/json": {}
}
}
}
}
},
"/api/helm/releases/{ns}/{name}/rollback": {
"parameters": [
{
"name": "ns",
"in": "path",
"description": "Name of kubernetes namespace"
},
{
"name": "name",
"in": "path",
"description": "Name of Helm release"
}
],
"post": {
"tags": [
"Releases"
],
"description": "Rollback the release to a previous revision",
"requestBody": {
"content": {
"application/x-www-form-urlencoded": {
"schema": {
"type": "object",
"properties": {
"revision": {
"type": "integer"
}
}
}
}
}
},
"responses": {
"202": {
"description": "Rolled back successfully"
}
}
}
},
"/api/helm/releases/{ns}/{name}/test": {
"parameters": [
{
"name": "ns",
"in": "path",
"description": "Name of kubernetes namespace"
},
{
"name": "name",
"in": "path",
"description": "Name of Helm release"
}
],
"post": {
"tags": [
"Releases"
],
"description": "Run the tests on a release",
"responses": {
"200": {
"description": "Logs of a test run"
}
}
}
},
"/api/helm/repositories": {
"get": {
"tags": [
"Repositories"
],
"description": "Get list of Helm repositories",
"responses": {
"200": {
"description": "Returns list of Helm repositories"
}
}
},
"post": {
"tags": [
"Repositories"
],
"description": "Adds new repository",
"requestBody": {
"content": {
"application/x-www-form-urlencoded": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"name",
"url"
]
}
}
}
},
"responses": {
"204": {
"description": "Empty response in case repository were added"
}
}
}
},
"/api/helm/repositories/{repo}": {
"parameters": [
{
"name": "repo",
"in": "path",
"description": "Name of Helm repository"
}
],
"get": {
"tags": [
"Repositories"
],
"description": "Get list of charts in repository",
"responses": {
"200": {
"description": "Returns list of charts"
}
}
},
"post": {
"tags": [
"Repositories"
],
"description": "Update repository from remote",
"responses": {
"204": {
"description": "Empty response"
}
}
},
"delete": {
"tags": [
"Repositories"
],
"description": "Remove repository",
"responses": {
"204": {
"description": "Empty response"
}
}
}
},
"/api/helm/repositories/latestver": {
"parameters": [
{
"name": "name",
"in": "query",
"description": "Name of Helm chart to search for",
"required": true
}
],
"description": "Find the latest available version of specified chart through all the repositories",
"get": {
"tags": [
"Repositories"
],
"responses": {
"200": {
"description": "The object with latest available version is returned"
},
"204": {
"description": "In case no matching repository found, the response is empty with status 204"
}
}
}
},
"/api/helm/repositories/versions": {
"parameters": [
{
"name": "name",
"in": "query",
"description": "Name of Helm chart to search for",
"required": true
}
],
"get": {
"description": "Get the list of versions for specified chart across the repositories",
"tags": [
"Repositories"
],
"responses": {
"200": {
"description": "The list if chart versions is returned"
}
}
}
},
"/api/helm/repositories/values": {
"parameters": [
{
"name": "chart",
"in": "query",
"description": "Name of Helm chart to search for, in format of <repository>/<chart-name>",
"required": true
},
{
"name": "version",
"in": "query",
"description": "Version of Helm chart to get values from",
"required": true
}
],
"get": {
"description": "Get the original values.yaml file for the chart",
"tags": [
"Repositories"
],
"responses": {
"200": {
"description": "The content of values.yaml"
}
}
}
},
"/api/k8s/contexts": {
"get": {
"tags": [
"K8s"
],
"description": "Get list of kubectl contexts configured locally",
"responses": {
"200": {
"description": "Returns list of contexts"
}
}
}
},
"/api/k8s/{kind}/get": {
"parameters": [
{
"name": "kind",
"in": "path",
"description": "Kind of kubernetes resource"
},
{
"name": "name",
"in": "query",
"description": "Name of kubernetes resource",
"required": true
},
{
"name": "namespace",
"in": "query",
"description": "Namespace of kubernetes resource",
"required": true
}
],
"get": {
"tags": [
"K8s"
],
"responses": {
"200": {
"description": "Returns resources information"
}
}
}
},
"/api/k8s/{kind}/list": {
"parameters": [
{
"name": "kind",
"in": "path",
"description": "Kind of kubernetes resource",
"schema": {
"enum": [
"namespaces"
]
}
}
],
"get": {
"tags": [
"K8s"
],
"responses": {
"200": {
"description": "Returns list of resources"
}
}
}
},
"/api/k8s/{kind}/describe": {
"parameters": [
{
"name": "kind",
"in": "path",
"description": "Kind of kubernetes resource"
},
{
"name": "name",
"in": "query",
"description": "Name of kubernetes resource",
"required": true
},
{
"name": "namespace",
"in": "query",
"description": "Namespace of kubernetes resource",
"required": true
}
],
"get": {
"tags": [
"K8s"
],
"responses": {
"200": {
"content": {
"text/plain": {}
},
"description": "Returns describe text"
}
}
}
},
"/": {
"delete": {
"tags": [
"Miscellaneous"
],
"description": "Shuts down the Helm Dashboard application",
"responses": {
"202": {
"description": "Shutdown command has been accepted"
}
}
}
},
"/status": {
"get": {
"tags": [
"Miscellaneous"
],
"description": "Gets application status",
"responses": {
"200": {
"description": "Returns JSON with some options",
"headers": {
"X-Application-Name": {
"description": "A string to self-identify the application"
}
}
}
}
}
}
}
}

View File

@@ -0,0 +1,182 @@
import { type QueryFunctionContext } from "@tanstack/react-query";
import type {
Chart,
ChartVersion,
Release,
ReleaseHealthStatus,
ReleaseRevision,
} from "../data/types";
interface ClustersResponse {
AuthInfo: string;
Cluster: string;
IsCurrent: boolean;
Name: string;
Namespace: string;
}
class ApiService {
currentCluster = "";
constructor(protected readonly isMockMode: boolean = false) {}
setCluster = (cluster: string) => {
this.currentCluster = cluster;
};
public async fetchWithDefaults<T>(
url: string,
options?: RequestInit
): Promise<T | string> {
let response;
if (this.currentCluster) {
const headers = new Headers(options?.headers);
if (!headers.has("X-Kubecontext")) {
headers.set("X-Kubecontext", this.currentCluster);
}
response = await fetch(url, { ...options, headers });
} else {
response = await fetch(url, options);
}
if (!response.ok) {
const error = await response.text();
throw new Error(error);
}
const contentType = response.headers.get("Content-Type") || "";
if (!contentType) {
return {} as unknown as T;
} else if (contentType.includes("text/plain")) {
return await response.text();
} else {
return (await response.json()) as T;
}
}
public async fetchWithSafeDefaults<T>({
url,
options,
fallback,
}: {
url: string;
options?: RequestInit;
fallback: T;
}): Promise<T> {
const data = await this.fetchWithDefaults<T>(url, options);
if (!data) {
console.error(url, " response is empty");
return fallback;
}
if (typeof data === "string") {
console.error(url, " response is string");
return fallback;
}
return data;
}
getToolVersion = async () => {
return await this.fetchWithDefaults("/status");
};
getRepositoryLatestVersion = async (repositoryName: string) => {
return await this.fetchWithDefaults(
`/api/helm/repositories/latestver?name=${repositoryName}`
);
};
getInstalledReleases = async () => {
return await this.fetchWithDefaults("/api/helm/releases");
};
getClusters = async (): Promise<ClustersResponse[]> => {
return await this.fetchWithSafeDefaults<ClustersResponse[]>({
url: "/api/k8s/contexts",
fallback: [],
});
};
getNamespaces = async () => {
return await this.fetchWithDefaults("/api/k8s/namespaces/list");
};
getRepositories = async () => {
return await this.fetchWithDefaults("/api/helm/repositories");
};
getRepositoryCharts = async ({
queryKey,
}: {
queryKey: readonly unknown[];
}): Promise<Chart[]> => {
const [, repository] = queryKey;
if (!repository || typeof repository !== "string") {
return [];
}
const url = `/api/helm/repositories/${repository}`;
return await this.fetchWithSafeDefaults<Chart[]>({ url, fallback: [] });
};
getChartVersions = async ({
queryKey,
}: QueryFunctionContext<ChartVersion[], Chart>) => {
const [, chart] = queryKey;
return await this.fetchWithDefaults(
`/api/helm/repositories/versions?name=${chart.name}`
);
};
getResourceStatus = async ({
release,
}: {
release: Release;
}): Promise<ReleaseHealthStatus[]> => {
if (!release) return [];
return await this.fetchWithSafeDefaults<ReleaseHealthStatus[]>({
url: `/api/helm/releases/${release.namespace}/${release.name}/resources?health=true`,
fallback: [],
});
};
getReleasesHistory = async ({
queryKey,
}: {
queryKey: readonly [string, Record<string, string | undefined>];
}): Promise<ReleaseRevision[]> => {
const [, params] = queryKey;
if (!params.namespace || !params.chart) return [];
return await this.fetchWithSafeDefaults<ReleaseRevision[]>({
url: `/api/helm/releases/${params.namespace}/${params.chart}/history`,
fallback: [],
});
};
getValues = async ({
queryKey,
}: {
queryKey: [
string,
{ namespace: string; chart: { name: string }; version: number },
];
}) => {
const [, params] = queryKey;
const { namespace, chart, version } = params;
if (!namespace || !chart || !chart.name || version === undefined)
return Promise.reject(new Error("missing parameters"));
const url = `/api/helm/repositories/values?chart=${namespace}/${chart.name}&version=${version}`;
return await this.fetchWithDefaults(url);
};
}
const apiService = new ApiService();
export default apiService;

View File

@@ -0,0 +1,99 @@
export interface HelmRepository {
name: string;
url: string;
}
export interface ChartVersion {
name: string;
version: string;
}
export interface K8sContext {
name: string;
}
export interface K8sResource {
kind: string;
name: string;
namespace: string;
}
export interface Scanner {
id: string;
name: string;
type: string;
}
export interface ScanResult {
scannerType: string;
result: string;
}
export interface ScannersList {
scanners: Scanner[];
}
export interface ScanResults {
[scannerType: string]: ScanResult;
}
export interface ApplicationStatus {
Analytics: boolean;
CacheHitRatio: number;
ClusterMode: boolean;
CurVer: string;
LatestVer: string;
NoHealth: boolean;
NoLatest: boolean;
}
export interface KubectlContexts {
contexts: string[];
}
export interface K8sResourceList {
items: K8sResource[];
}
export type HelmRepositories = Repository[];
export interface ChartList {
charts: Chart[];
}
export interface LatestChartVersion {
name: string;
version: string;
app_version: string;
description: string;
installed_namespace: string;
installed_name: string;
repository: string;
urls: string[];
isSuggestedRepo: boolean;
}
export interface ChartVersions {
versions: string[];
}
export interface ValuesYamlText {
content: string;
}
export interface Repository {
name: string;
url: string;
}
export interface Chart {
name: string;
repo: string;
version: string;
appVersion: string;
description: string;
created: string;
digest: string;
urls: string[];
icon: string;
}

82
frontend/src/API/k8s.ts Normal file
View File

@@ -0,0 +1,82 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import { type UseQueryOptions, useQuery } from "@tanstack/react-query";
import apiService from "./apiService";
import type {
K8sResource,
K8sResourceList,
KubectlContexts,
} from "./interfaces";
// Get list of kubectl contexts configured locally
// @ts-expect-error unused
function useGetKubectlContexts(options?: UseQueryOptions<KubectlContexts>) {
return useQuery<KubectlContexts>({
queryKey: ["k8s", "contexts"],
queryFn: () =>
apiService.fetchWithSafeDefaults<KubectlContexts>({
url: "/api/k8s/contexts",
fallback: { contexts: [] },
}),
...(options ?? {}),
});
}
// Get resources information
// @ts-expect-error unused
function useGetK8sResource(
kind: string,
name: string,
namespace: string,
options?: UseQueryOptions<K8sResource>
) {
return useQuery<K8sResource>({
queryKey: ["k8s", kind, "get", name, namespace],
queryFn: () =>
apiService.fetchWithSafeDefaults<K8sResource>({
url: `/api/k8s/${kind}/get?name=${name}&namespace=${namespace}`,
fallback: { kind: "", name: "", namespace: "" },
}),
...(options ?? {}),
});
}
// Get list of resources
// @ts-expect-error unused
function useGetK8sResourceList(
kind: string,
options?: UseQueryOptions<K8sResourceList>
) {
return useQuery<K8sResourceList>({
queryKey: ["k8s", kind, "list"],
queryFn: () =>
apiService.fetchWithSafeDefaults<K8sResourceList>({
url: `/api/k8s/${kind}/list`,
fallback: { items: [] },
}),
...(options ?? {}),
});
}
// Get describe text for kubernetes resource
// @ts-expect-error unused
function useGetK8sResourceDescribe(
kind: string,
name: string,
namespace: string,
options?: UseQueryOptions<string>
) {
return useQuery<string>({
queryKey: ["k8s", kind, "describe", name, namespace],
queryFn: () =>
apiService.fetchWithDefaults<string>(
`/api/k8s/${kind}/describe?name=${name}&namespace=${namespace}`,
{
headers: {
Accept: "text/plain",
},
}
),
...(options ?? {}),
});
}

38
frontend/src/API/other.ts Normal file
View File

@@ -0,0 +1,38 @@
import {
type UseMutationOptions,
type UseQueryOptions,
useMutation,
useQuery,
} from "@tanstack/react-query";
import apiService from "./apiService";
import type { ApplicationStatus } from "./interfaces";
// Shuts down the Helm Dashboard application
export function useShutdownHelmDashboard(
options?: UseMutationOptions<string, Error>
) {
return useMutation<string, Error>({
mutationFn: () =>
apiService.fetchWithDefaults("/", {
method: "DELETE",
}),
...(options ?? {}),
});
}
// Gets application status
export function useGetApplicationStatus(
options?: UseQueryOptions<ApplicationStatus | null>
) {
return useQuery<ApplicationStatus | null>({
queryKey: ["status"],
queryFn: async () =>
await apiService.fetchWithSafeDefaults<ApplicationStatus | null>({
url: "/status",
fallback: null,
}),
...(options ?? {}),
});
}

View File

@@ -0,0 +1,436 @@
import {
useMutation,
type UseMutationOptions,
useQuery,
type UseQueryOptions,
} from "@tanstack/react-query";
import type { ChartVersion, Release } from "../data/types";
import { isNewerVersion } from "../utils";
import apiService from "./apiService";
import type { LatestChartVersion } from "./interfaces";
import { getVersionManifestFormData } from "./shared";
export const HD_RESOURCE_CONDITION_TYPE = "hdHealth"; // it's our custom condition type, only one exists
export function useGetInstalledReleases(context: string) {
return useQuery<Release[]>({
queryKey: ["installedReleases", context],
queryFn: () =>
apiService.fetchWithSafeDefaults<Release[]>({
url: "/api/helm/releases",
fallback: [],
}),
retry: false,
});
}
export interface ReleaseManifest {
apiVersion: string;
kind: string;
metadata: {
name: string;
namespace: string;
labels: Record<string, string>;
};
spec: {
replicas: number;
selector: Record<string, string>;
template: {
metadata: {
labels: Record<string, string>;
};
spec: {
containers: {
name: string;
image: string;
ports: {
containerPort: number;
}[];
env: {
name: string;
value: string;
}[];
}[];
};
};
};
}
export function useGetReleaseManifest({
namespace,
chartName,
options,
}: {
namespace: string;
chartName: string;
options?: UseQueryOptions<ReleaseManifest[]>;
}) {
return useQuery<ReleaseManifest[]>({
queryKey: ["manifest", namespace, chartName],
queryFn: () =>
apiService.fetchWithSafeDefaults<ReleaseManifest[]>({
url: `/api/helm/releases/${namespace}/${chartName}/manifests`,
fallback: [],
}),
...(options ?? {}),
});
}
export interface ContainerImage {
resource: string;
kind: string;
container: string;
image: string;
}
export function useGetImages(ns: string, name: string) {
return useQuery<ContainerImage[]>({
queryKey: ["images", ns, name],
queryFn: () =>
apiService.fetchWithSafeDefaults<ContainerImage[]>({
url: `/api/helm/releases/${ns}/${name}/images`,
fallback: [],
}),
});
}
export interface RelationNode {
id: string;
kind: string;
name: string;
inRelease: boolean;
}
export interface RelationEdge {
source: string;
target: string;
type: string;
}
export interface RelationGraph {
nodes: RelationNode[];
edges: RelationEdge[];
}
export function useGetRelations(ns: string, name: string) {
return useQuery<RelationGraph>({
queryKey: ["relations", ns, name],
queryFn: () =>
apiService.fetchWithSafeDefaults<RelationGraph>({
url: `/api/helm/releases/${ns}/${name}/relations`,
fallback: { nodes: [], edges: [] },
}),
});
}
// List of installed k8s resources for this release
export function useGetResources(ns: string, name: string, enabled?: boolean) {
return useQuery<StructuredResources[]>({
queryKey: ["resources", ns, name],
queryFn: () =>
apiService.fetchWithSafeDefaults<StructuredResources[]>({
url: `/api/helm/releases/${ns}/${name}/resources?health=true`,
fallback: [],
}),
select: (data) =>
data
?.map((resource) => ({
...resource,
status: {
...resource.status,
conditions: resource.status.conditions.filter(
(c) => c.type === HD_RESOURCE_CONDITION_TYPE
),
},
}))
.sort((a, b) => {
const interestingResources = [
"STATEFULSET",
"DEAMONSET",
"DEPLOYMENT",
];
return (
interestingResources.indexOf(b.kind.toUpperCase()) -
interestingResources.indexOf(a.kind.toUpperCase())
);
}),
enabled,
});
}
export function useGetResourceDescription(
type: string,
ns: string,
name: string,
apiVersion?: string,
options?: UseQueryOptions<string>
) {
const params = new URLSearchParams({ name, namespace: ns });
if (apiVersion) {
params.set("apiVersion", apiVersion);
}
return useQuery<string>({
queryKey: ["describe", type, ns, name, apiVersion],
queryFn: () =>
apiService.fetchWithDefaults<string>(
`/api/k8s/${type}/describe?${params.toString()}`,
{
headers: { "Content-Type": "text/plain; charset=utf-8" },
}
),
...(options ?? {}),
});
}
export function useGetLatestVersion(
chartName: string,
options?: UseQueryOptions<ChartVersion[]>
) {
return useQuery<ChartVersion[]>({
queryKey: ["latestver", chartName],
queryFn: () =>
apiService.fetchWithSafeDefaults<ChartVersion[]>({
url: `/api/helm/repositories/latestver?name=${chartName}`,
fallback: [],
}),
gcTime: 0,
...(options ?? {}),
});
}
export function useGetVersions(
chartName: string,
options?: UseQueryOptions<LatestChartVersion[]>
) {
return useQuery<LatestChartVersion[]>({
queryKey: ["versions", chartName],
queryFn: async () => {
const url = `/api/helm/repositories/versions?name=${chartName}`;
return await apiService.fetchWithSafeDefaults<LatestChartVersion[]>({
url,
fallback: [],
});
},
select: (data) =>
data?.sort((a, b) => (isNewerVersion(a.version, b.version) ? 1 : -1)),
...(options ?? {}),
});
}
export function useGetReleaseInfoByType(
params: ReleaseInfoParams,
additionalParams = "",
options?: UseQueryOptions<string>
) {
const { chart, namespace, tab, revision } = params;
return useQuery<string>({
queryKey: [tab, namespace, chart, revision, additionalParams],
queryFn: () =>
apiService.fetchWithDefaults<string>(
`/api/helm/releases/${namespace}/${chart}/${tab}?revision=${revision}${additionalParams}`,
{
headers: { "Content-Type": "text/plain; charset=utf-8" },
}
),
...(options ?? {}),
});
}
export function useGetDiff(
formData: FormData,
options?: UseQueryOptions<string>
) {
return useQuery<string>({
queryKey: ["diff", formData],
queryFn: () => {
return apiService.fetchWithDefaults<string>("/diff", {
body: formData,
method: "POST",
});
},
...(options ?? {}),
});
}
// Rollback the release to a previous revision
export function useRollbackRelease(
options?: UseMutationOptions<
string,
Error,
{ ns: string; name: string; revision: number }
>
) {
return useMutation<
string,
Error,
{ ns: string; name: string; revision: number }
>({
mutationFn: ({ ns, name, revision }) => {
const formData = new FormData();
formData.append("revision", revision.toString());
return apiService.fetchWithDefaults<string>(
`/api/helm/releases/${ns}/${name}/rollback`,
{
method: "POST",
body: formData,
}
);
},
...(options ?? {}),
});
}
// Run the tests on a release
export function useTestRelease(
options?: UseMutationOptions<string, Error, { ns: string; name: string }>
) {
return useMutation<string, Error, { ns: string; name: string }>({
mutationFn: ({ ns, name }) => {
return apiService.fetchWithDefaults<string>(
`/api/helm/releases/${ns}/${name}/test`,
{
method: "POST",
}
);
},
...(options ?? {}),
});
}
export function useChartReleaseValues({
namespace = "default",
release,
userDefinedValue,
revision,
options,
version,
}: {
namespace?: string;
release: string;
userDefinedValue?: string;
revision?: number;
version?: string;
options?: UseQueryOptions<string>;
}) {
return useQuery<string>({
queryKey: ["values", namespace, release, userDefinedValue, version],
queryFn: () =>
apiService.fetchWithDefaults(
`/api/helm/releases/${namespace}/${release}/values?${"userDefined=true"}${
revision ? `&revision=${revision}` : ""
}`,
{
headers: { "Content-Type": "text/plain; charset=utf-8" },
}
),
...(options ?? {}),
});
}
export type VersionData = {
version: string;
repository?: string;
urls: string[];
};
export const useVersionData = ({
version,
userValues,
chartAddress,
releaseValues,
namespace,
releaseName,
isInstallRepoChart = false,
enabled = true,
}: {
version: string;
userValues: string;
chartAddress: string;
releaseValues: string;
namespace: string;
releaseName: string;
isInstallRepoChart?: boolean;
enabled?: boolean;
}) => {
return useQuery<{ [key: string]: string }>({
queryKey: [
version,
userValues,
chartAddress,
releaseValues,
namespace,
releaseName,
isInstallRepoChart,
],
queryFn: async () => {
const formData = getVersionManifestFormData({
version,
userValues,
chart: chartAddress,
releaseValues,
releaseName,
});
const url = isInstallRepoChart
? `/api/helm/releases/${namespace || "default"}`
: `/api/helm/releases/${
namespace ? namespace : "[empty]"
}${`/${releaseName}`}`;
return await apiService.fetchWithSafeDefaults<{
[key: string]: string;
}>({
url,
options: {
method: "post",
body: formData,
},
fallback: {},
});
},
enabled,
});
};
// Request objects
interface ReleaseInfoParams {
chart?: string;
tab: string;
namespace?: string;
revision?: string;
}
export interface StructuredResources {
kind: string;
apiVersion: string;
metadata: Metadata;
spec: Spec;
status: Status;
}
export interface Metadata {
name: string;
namespace: string;
creationTimestamp: Date;
labels: string[];
}
export interface Spec {
[key: string]: string;
}
export interface Status {
conditions: Condition[];
}
export interface Condition {
type: string;
status: string;
lastProbeTime: Date;
lastTransitionTime: Date;
reason: string;
message: string;
}

View File

@@ -0,0 +1,81 @@
import {
type UseMutationOptions,
type UseQueryOptions,
useMutation,
useQuery,
} from "@tanstack/react-query";
import apiService from "./apiService";
import type { HelmRepositories } from "./interfaces";
// Get list of Helm repositories
export function useGetRepositories(
options?: UseQueryOptions<HelmRepositories>
) {
return useQuery<HelmRepositories>({
queryKey: ["helm", "repositories"],
queryFn: () =>
apiService.fetchWithSafeDefaults<HelmRepositories>({
url: "/api/helm/repositories",
fallback: [],
}),
select: (data) => data?.sort((a, b) => a?.name?.localeCompare(b?.name)),
...(options ?? {}),
});
}
// Update repository from remote
export function useUpdateRepo(
repo: string,
options?: UseMutationOptions<string, Error>
) {
return useMutation<string, Error>({
mutationFn: () => {
return apiService.fetchWithDefaults<string>(
`/api/helm/repositories/${repo}`,
{
method: "POST",
}
);
},
...(options ?? {}),
});
}
// Remove repository
export function useDeleteRepo(
repo: string,
options?: UseMutationOptions<string, Error>
) {
return useMutation<string, Error>({
mutationFn: () => {
return apiService.fetchWithDefaults<string>(
`/api/helm/repositories/${repo}`,
{
method: "DELETE",
}
);
},
...(options ?? {}),
});
}
export function useChartRepoValues({
version,
chart,
}: {
version: string;
chart: string;
}) {
return useQuery<string>({
queryKey: ["helm", "repositories", "values", chart, version],
queryFn: () =>
apiService.fetchWithDefaults<string>(
`/api/helm/repositories/values?chart=${chart}&version=${version}`,
{
headers: { "Content-Type": "text/plain; charset=utf-8" },
}
),
enabled: Boolean(version) && Boolean(chart),
});
}

View File

@@ -0,0 +1,71 @@
/** DO NOT DELETE THESE FUNCTIONS - we left this until we support scan ops again */
/* eslint-disable @typescript-eslint/no-unused-vars */
import {
type UseMutationOptions,
type UseQueryOptions,
useMutation,
useQuery,
} from "@tanstack/react-query";
import apiService from "./apiService";
import {
type ScanResult,
type ScanResults,
type ScannersList,
} from "./interfaces";
// Get list of discovered scanners
// @ts-expect-error unused
function useGetDiscoveredScanners(options?: UseQueryOptions<ScannersList>) {
return useQuery<ScannersList>({
queryKey: ["scanners"],
queryFn: () =>
apiService.fetchWithSafeDefaults<ScannersList>({
url: "/api/scanners",
fallback: { scanners: [] },
}),
...(options ?? {}),
});
}
// Scan manifests using all applicable scanners
// @ts-expect-error unused
function useScanManifests(
manifest: string,
options?: UseMutationOptions<ScanResults, Error, string>
) {
const formData = new FormData();
formData.append("manifest", manifest);
return useMutation<ScanResults, Error, string>({
mutationFn: () =>
apiService.fetchWithSafeDefaults<ScanResults>({
url: "/api/scanners/manifests",
options: {
method: "POST",
body: formData,
},
fallback: {},
}),
...(options ?? {}),
});
}
// Scan specified k8s resource in cluster
// @ts-expect-error unused
function useScanK8sResource(
kind: string,
namespace: string,
name: string,
options?: UseQueryOptions<ScanResults>
) {
return useQuery<ScanResults>({
queryKey: ["scanners", "resource", kind, namespace, name],
queryFn: () =>
apiService.fetchWithSafeDefaults<ScanResults>({
url: `/api/scanners/resource/${kind}?namespace=${namespace}&name=${name}`,
fallback: {},
}),
...(options ?? {}),
});
}

View File

@@ -0,0 +1,69 @@
import { useQuery } from "@tanstack/react-query";
import apiService from "./apiService";
export const getVersionManifestFormData = ({
version,
userValues,
chart,
releaseValues,
releaseName,
}: {
version: string;
userValues?: string;
chart: string;
releaseValues?: string;
releaseName?: string;
}) => {
const formData = new FormData();
// preview needs to come first, for some reason it has a meaning at the backend
formData.append("preview", "true");
formData.append("chart", chart);
formData.append("version", version);
formData.append(
"values",
userValues ? userValues : releaseValues ? releaseValues : ""
);
if (releaseName) {
formData.append("name", releaseName);
}
return formData;
};
export const useDiffData = ({
selectedRepo,
versionsError,
currentVerManifest,
selectedVerData,
chart,
}: {
selectedRepo: string;
versionsError: string;
currentVerManifest: string;
selectedVerData: { [key: string]: string };
chart: string;
}) => {
return useQuery({
queryKey: [
selectedRepo,
versionsError,
chart,
currentVerManifest,
selectedVerData,
],
queryFn: async () => {
const formData = new FormData();
formData.append("a", currentVerManifest);
formData.append("b", selectedVerData.manifest);
const diff = await apiService.fetchWithDefaults("/diff", {
method: "post",
body: formData,
});
return diff;
},
enabled: Boolean(selectedVerData),
});
};

96
frontend/src/App.css Normal file
View File

@@ -0,0 +1,96 @@
.app-header {
display: flex;
justify-content: space-between;
margin: 5px;
padding: 10px;
}
.header-left {
display: flex;
align-items: center;
justify-content: space-evenly;
flex: 0.6;
}
.header-items {
display: flex;
flex: 0.8;
justify-content: space-evenly;
}
.header-right {
display: flex;
align-items: center;
flex: 0.2;
justify-content: space-around;
}
.redirect {
display: flex;
flex: 0.8;
}
.redirect > img {
margin-right: 5px;
}
.signout-btn {
display: flex;
align-items: center;
}
.signout-btn:hover {
cursor: pointer;
}
.signout-btn > span {
font-weight: bolder;
font-size: x-large;
color: gray;
}
.card {
display: flex;
height: 100vh;
}
.card-left {
flex: 0.2;
margin-top: 5px;
margin-left: 4px;
margin-right: 4px;
}
.card-left > h2,
form {
margin-bottom: 10px;
}
.btn {
margin-bottom: 10px;
}
.card-right {
flex: 0.8;
margin-top: 5px;
margin-left: 4px;
margin-right: 1px;
}
.card-right-header {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
}
.card-right-header-right-btn {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
}
.content-header {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
}
.title {
flex: 0.2;
}
.description {
flex: 0.6;
}
.version {
flex: 0.2;
}
.charts {
display: flex;
justify-content: space-between;
}
.charts > h3 {
flex: 0.2;
}

91
frontend/src/App.tsx Normal file
View File

@@ -0,0 +1,91 @@
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { type FC, useState, lazy } from "react";
import { ErrorBoundary } from "react-error-boundary";
import { HashRouter, Outlet, Route, Routes, useParams } from "react-router";
import apiService from "./API/apiService";
import ErrorFallback from "./components/ErrorFallback";
import GlobalErrorModal from "./components/modal/GlobalErrorModal";
import { AppContextProvider } from "./context/AppContext";
import {
ErrorModalContext,
type ErrorAlert,
} from "./context/ErrorModalContext";
import Header from "./layout/Header";
import Installed from "./pages/Installed";
import RepositoryPage from "./pages/Repository";
import Revision from "./pages/Revision";
const DocsPage = lazy(() => import("./pages/DocsPage"));
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: false,
retry: false,
},
},
});
const PageLayout = () => {
return (
<div className="flex h-screen flex-col">
<Header />
<div className="flex-1 bg-body-background bg-[url('./assets/body-background.svg')] bg-no-repeat">
<Outlet />
</div>
</div>
);
};
const SyncContext: FC = () => {
const { context } = useParams();
if (context) {
apiService.setCluster(decodeURIComponent(context));
}
return <Outlet />;
};
export default function App() {
const [shouldShowErrorModal, setShowErrorModal] = useState<
ErrorAlert | undefined
>(undefined);
const value = { shouldShowErrorModal, setShowErrorModal };
return (
<AppContextProvider>
<ErrorModalContext.Provider value={value}>
<QueryClientProvider client={queryClient}>
<ErrorBoundary FallbackComponent={ErrorFallback}>
<HashRouter>
<Routes>
<Route path="docs/*" element={<DocsPage />} />
<Route path="*" element={<PageLayout />}>
<Route path=":context?/*" element={<SyncContext />}>
<Route
path="repository/:selectedRepo?/*"
element={<RepositoryPage />}
/>
<Route path="installed/?" element={<Installed />} />
<Route
path=":namespace/:chart/installed/revision/:revision"
element={<Revision />}
/>
<Route path="*" element={<Installed />} />
</Route>
</Route>
</Routes>
</HashRouter>
</ErrorBoundary>
<GlobalErrorModal
isOpen={!!shouldShowErrorModal}
onClose={() => setShowErrorModal(undefined)}
titleText={shouldShowErrorModal?.title || ""}
contentText={shouldShowErrorModal?.msg || ""}
/>
</QueryClientProvider>
</ErrorModalContext.Provider>
</AppContextProvider>
);
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512.02 319.26"><path d="M5.9 48.96 48.97 5.89c7.86-7.86 20.73-7.84 28.56 0l178.48 178.48L434.5 5.89c7.86-7.86 20.74-7.82 28.56 0l43.07 43.07c7.83 7.84 7.83 20.72 0 28.56l-192.41 192.4-.36.37-43.07 43.07c-7.83 7.82-20.7 7.86-28.56 0l-43.07-43.07-.36-.37L5.9 77.52c-7.87-7.86-7.87-20.7 0-28.56z"/></svg>

After

Width:  |  Height:  |  Size: 501 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48" version="1.1" viewBox="0 0 48 48"><title>illustration/code-brackets</title><g id="illustration/code-brackets" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><path id="Combined-Shape" fill="#87E6E5" d="M11.4139325,12 C11.7605938,12 12,12.5059743 12,13.3779712 L12,17.4951758 L6.43502246,23.3839989 C5.85499251,23.9978337 5.85499251,25.0021663 6.43502246,25.6160011 L12,31.5048242 L12,35.6220288 C12,36.4939606 11.7605228,37 11.4139325,37 C11.2725831,37 11.1134406,36.9158987 10.9453839,36.7379973 L0.435022463,25.6160011 C-0.145007488,25.0021663 -0.145007488,23.9978337 0.435022463,23.3839989 L10.9453839,12.2620027 C11.1134051,12.0841663 11.2725831,12 11.4139325,12 Z M36.5860675,12 C36.7274169,12 36.8865594,12.0841013 37.0546161,12.2620027 L47.5649775,23.3839989 C48.1450075,23.9978337 48.1450075,25.0021663 47.5649775,25.6160011 L37.0546161,36.7379973 C36.8865949,36.9158337 36.7274169,37 36.5860675,37 C36.2394062,37 36,36.4940257 36,35.6220288 L36,31.5048242 L41.5649775,25.6160011 C42.1450075,25.0021663 42.1450075,23.9978337 41.5649775,23.3839989 L36,17.4951758 L36,13.3779712 C36,12.5060394 36.2394772,12 36.5860675,12 Z"/><rect id="Rectangle-7-Copy-5" width="35.57" height="4" x="5.009" y="22.662" fill="#A0DB77" rx="2" transform="translate(22.793959, 24.662305) rotate(-75.000000) translate(-22.793959, -24.662305)"/></g></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48" version="1.1" viewBox="0 0 48 48"><title>illustration/comments</title><g id="illustration/comments" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><path id="Path" fill="#96D07C" d="M2.52730803,17.9196415 C2.44329744,17.9745167 2.36370847,18.000488 2.29303375,18.000488 C2.1197031,18.000488 2,17.8443588 2,17.5752855 L2,4 C2,1.790861 3.790861,3.23296945e-13 6,3.23296945e-13 L33.9995117,3.23296945e-13 C36.2086507,3.23296945e-13 37.9995117,1.790861 37.9995117,4 L37.9995117,9.999512 C37.9995117,12.208651 36.2086507,13.999512 33.9995117,13.999512 L8,13.999512 C7.83499225,13.999512 7.6723181,13.9895206 7.51254954,13.9701099 L2.52730803,17.9196415 Z"/><path id="Path" fill="#73E1E0" d="M7.51066,44.9703679 L2.52730803,47.9186655 C2.44329744,47.9735407 2.36370847,47.999512 2.29303375,47.999512 C2.1197031,47.999512 2,47.8433828 2,47.5743095 L2,35 C2,32.790861 3.790861,31 6,31 L26,31 C28.209139,31 30,32.790861 30,35 L30,41 C30,43.209139 28.209139,45 26,45 L8,45 C7.8343417,45 7.67103544,44.9899297 7.51066,44.9703679 Z"/><path id="Path" fill="#FFD476" d="M46,19.5 L46,33.0747975 C46,33.3438708 45.8802969,33.5 45.7069663,33.5 C45.6362915,33.5 45.5567026,33.4740287 45.472692,33.4191535 L40.4887103,29.4704446 C40.3285371,29.489956 40.1654415,29.5 40,29.5 L18,29.5 C15.790861,29.5 14,27.709139 14,25.5 L14,19.5 C14,17.290861 15.790861,15.5 18,15.5 L42,15.5 C44.209139,15.5 46,17.290861 46,19.5 Z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48" version="1.1" viewBox="0 0 48 48"><title>illustration/direction</title><g id="illustration/direction" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><path id="Combined-Shape" fill="#FFD476" d="M23.4917015,33.6030641 L2.93840258,31.4321033 C2.38917316,31.3740904 1.99096346,30.8818233 2.04897631,30.3325939 C2.0747515,30.0885705 2.18934861,29.8625419 2.37095722,29.6975265 L34.2609105,0.721285325 C34.6696614,0.349881049 35.3021022,0.38015648 35.6735064,0.788907393 C35.9232621,1.06377731 36.0001133,1.45442096 35.8730901,1.80341447 L24.5364357,32.9506164 C24.3793473,33.3822133 23.9484565,33.6513092 23.4917015,33.6030641 L23.4917015,33.6030641 Z"/><path id="Combined-Shape-Copy" fill="#FFC445" d="M24.3163597,33.2881029 C24.0306575,33.0138462 23.9337246,32.5968232 24.069176,32.2246735 L35.091923,1.9399251 C35.2266075,1.56988243 35.5659249,1.31333613 35.9586669,1.28460955 C36.5094802,1.24432106 36.9886628,1.65818318 37.0289513,2.20899647 L40.2437557,46.1609256 C40.2644355,46.4436546 40.1641446,46.7218752 39.9678293,46.9263833 C39.5853672,47.3248067 38.9523344,47.3377458 38.5539111,46.9552837 L24.3163597,33.2881029 L24.3163597,33.2881029 Z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48" version="1.1" viewBox="0 0 48 48"><title>illustration/flow</title><g id="illustration/flow" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><path id="Combined-Shape" fill="#79C9FC" fill-rule="nonzero" d="M30,29 C32.7614237,29 35,26.7614237 35,24 C35,14.6111593 27.3888407,7 18,7 C8.61115925,7 1,14.6111593 1,24 C1,33.3888407 8.61115925,41 18,41 C19.3333404,41 20.6447683,40.8466238 21.9154603,40.5471706 C19.5096374,39.3319645 17.5510566,37.8612875 16.0456579,36.1314815 C14.1063138,33.9030427 12.769443,31.0725999 12.0293806,27.6556449 C11.360469,26.565281 11,25.3082308 11,24 C11,20.1340068 14.1340068,17 18,17 C21.8659932,17 25,20.1340068 25,24 C25,26.125 27.7040312,29 30,29 Z"/><path id="Combined-Shape-Copy" fill="#FFC445" fill-rule="nonzero" d="M42,29 C44.7614237,29 47,26.7614237 47,24 C47,14.6111593 39.3888407,7 30,7 C20.6111593,7 13,14.6111593 13,24 C13,33.3888407 20.6111593,41 30,41 C31.3333404,41 32.6447683,40.8466238 33.9154603,40.5471706 C31.5096374,39.3319645 29.4051056,37.9781963 28.0456579,36.1314815 C26.0625,33.4375 23,27.1875 23,24 C23,20.1340068 26.1340068,17 30,17 C33.8659932,17 37,20.1340068 37,24 C37.02301,26.3435241 39.7040312,29 42,29 Z" transform="translate(30.000000, 24.000000) scale(-1, -1) translate(-30.000000, -24.000000)"/></g></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@@ -0,0 +1,5 @@
<svg width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M47.1106 45.775C49.9376 45.775 52.2294 42.4134 52.2294 38.2667C52.2294 34.1199 49.9376 30.7583 47.1106 30.7583C44.2835 30.7583 41.9918 34.1199 41.9918 38.2667C41.9918 42.4134 44.2835 45.775 47.1106 45.775Z" fill="#1347FF"/>
<path d="M37.0077 38.2667C37.0077 42.4134 34.7159 45.775 31.8888 45.775C29.0618 45.775 26.77 42.4134 26.77 38.2667C26.77 34.12 29.0618 30.7584 31.8888 30.7584C34.7159 30.7584 37.0077 34.12 37.0077 38.2667Z" fill="#1347FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9 23.7087L14.4407 18H64.5597L70 23.6838V56.3162L64.5597 62H14.4403L9 56.3162V23.7087ZM17.9923 24.2134L15.8664 26.3861V53.6519L17.9923 55.8246H61.0736L63.1212 53.6483V26.3897L61.0736 24.2134H17.9923Z" fill="#1347FF"/>
</svg>

After

Width:  |  Height:  |  Size: 827 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48" version="1.1" viewBox="0 0 48 48"><title>illustration/plugin</title><g id="illustration/plugin" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><path id="Combined-Shape" fill="#79C9FC" d="M26,15.3994248 C26,15.4091303 26,15.4188459 26,15.4285714 L26,21.4694881 C25.8463595,21.4969567 25.6941676,21.51275 25.5873784,21.51275 C25.4974117,21.51275 25.4230979,21.4768034 25.377756,21.4206259 L25.2660784,21.2822603 L25.1317423,21.1657666 C24.2436317,20.3956144 23.100098,19.9633214 21.895551,19.9633214 C19.2039137,19.9633214 17,22.1075558 17,24.7804643 C17,27.4533728 19.2039137,29.5976071 21.895551,29.5976071 C23.1972122,29.5976071 24.3149423,29.2878193 25.1231445,28.3613697 C25.4542273,27.9818463 25.568273,27.9073214 25.5873784,27.9073214 C25.681532,27.9073214 25.8352452,27.9239643 26,27.9524591 L26,32.5714286 C26,32.5811541 26,32.5908697 26,32.6005752 L26,33 C26,35.209139 24.209139,37 22,37 L4,37 C1.790861,37 0,35.209139 0,33 L0,15 C0,12.790861 1.790861,11 4,11 L22,11 C24.209139,11 26,12.790861 26,15 L26,15.3994248 Z"/><path id="Path" fill="#87E6E5" d="M27.9998779,32.5714286 C27.9998779,33.3604068 28.6572726,34 29.4682101,34 L46.5315458,34 C47.3424832,34 47.9998779,33.3604068 47.9998779,32.5714286 L47.9998779,15.4285714 C47.9998779,14.6395932 47.3424832,14 46.5315458,14 L29.4682101,14 C28.6572726,14 27.9998779,14.6395932 27.9998779,15.4285714 L27.9998779,21.8355216 C27.9334367,22.2650514 27.8567585,22.6454496 27.746391,22.8084643 C27.4245309,23.2838571 26.2402709,23.51275 25.5873784,23.51275 C24.8705773,23.51275 24.2322714,23.1857725 23.8214379,22.6767605 C23.3096996,22.2329909 22.6349941,21.9633214 21.895551,21.9633214 C20.2963823,21.9633214 19,23.2245992 19,24.7804643 C19,26.3363293 20.2963823,27.5976071 21.895551,27.5976071 C22.5398535,27.5976071 23.2399343,27.477727 23.6160247,27.0466112 C24.1396029,26.4464286 24.7367044,25.9073214 25.5873784,25.9073214 C26.2402709,25.9073214 27.5912951,26.1766031 27.8226692,26.6116071 C27.8819199,26.7230038 27.9403239,26.921677 27.9998779,27.1556219 L27.9998779,32.5714286 Z"/></g></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img"
class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228">
<path fill="#00D8FF"
d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z">
</path>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48" version="1.1" viewBox="0 0 48 48"><title>illustration/repo</title><g id="illustration/repo" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><path id="Rectangle-62-Copy" fill="#B7F0EF" d="M27.2217723,9.04506931 L41.2217723,6.2682098 C43.3886973,5.83840648 45.4937616,7.2466219 45.9235649,9.41354696 C45.9743993,9.66983721 46,9.93049166 46,10.1917747 L46,32.581381 C46,34.4904961 44.650862,36.1335143 42.7782277,36.5049459 L28.7782277,39.2818054 C26.6113027,39.7116087 24.5062384,38.3033933 24.0764351,36.1364682 C24.0256007,35.880178 24,35.6195235 24,35.3582405 L24,12.9686342 C24,11.0595191 25.349138,9.4165009 27.2217723,9.04506931 Z" opacity=".7"/><path id="Combined-Shape" fill="#87E6E5" d="M6.77822775,6.2682098 L20.7782277,9.04506931 C22.650862,9.4165009 24,11.0595191 24,12.9686342 L24,35.3582405 C24,37.5673795 22.209139,39.3582405 20,39.3582405 C19.738717,39.3582405 19.4780625,39.3326398 19.2217723,39.2818054 L5.22177225,36.5049459 C3.34913798,36.1335143 2,34.4904961 2,32.581381 L2,10.1917747 C2,7.98263571 3.790861,6.19177471 6,6.19177471 C6.26128305,6.19177471 6.5219375,6.21737537 6.77822775,6.2682098 Z"/><path id="Rectangle-63-Copy-2" fill="#61C1FD" d="M22,10 C23.1666667,10.2291667 24.0179036,10.625 24.5537109,11.1875 C25.0895182,11.75 25.5716146,12.875 26,14.5625 C26,29.3020833 26,37.5208333 26,39.21875 C26,40.9166667 26.4241536,42.9583333 27.2724609,45.34375 L24.5537109,41.875 L22.9824219,45.34375 C22.327474,43.1979167 22,41.2291667 22,39.4375 C22,37.6458333 22,27.8333333 22,10 Z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48" version="1.1" viewBox="0 0 48 48"><title>illustration/stackalt</title><g id="illustration/stackalt" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><path id="Combined-Shape" fill="#FFAE00" d="M23.8628277,0 L23.8628277,48 L3.32291648,36.2491883 L3.32155653,11.9499781 L23.8628277,0 Z M23.8670509,0 L44.408322,11.9499781 L44.4069621,36.2491883 L23.8670509,48 L23.8670509,0 Z" opacity=".196"/><path id="Rectangle-46-Copy-3" fill="#66BF3C" d="M15.8232279,19.1155258 L24.7368455,21.4714881 C29.6053842,22.7582937 33.4077423,26.5606518 34.694548,31.4291905 L37.0505103,40.3428082 C37.6150232,42.4786032 36.3412474,44.6676353 34.2054524,45.2321482 C33.5569474,45.4035549 32.87575,45.4091235 32.2245294,45.2483418 L23.3459013,43.0562718 C18.2976962,41.809906 14.3561301,37.8683399 13.1097642,32.8201348 L10.9176943,23.9415066 C10.3881737,21.7967682 11.6975664,19.6288529 13.8423049,19.0993322 C14.4935255,18.9385505 15.1747229,18.9441191 15.8232279,19.1155258 Z" opacity=".5" transform="translate(23.999997, 32.166058) rotate(-45.000000) translate(-23.999997, -32.166058)"/><path id="Rectangle-46-Copy-2" fill="#FFAE00" d="M15.8232279,11.2216893 L24.7368455,13.5776516 C29.6053842,14.8644572 33.4077423,18.6668153 34.694548,23.5353541 L37.0505103,32.4489717 C37.6150232,34.5847667 36.3412474,36.7737988 34.2054524,37.3383117 C33.5569474,37.5097184 32.87575,37.515287 32.2245294,37.3545053 L23.3459013,35.1624353 C18.2976962,33.9160695 14.3561301,29.9745034 13.1097642,24.9262983 L10.9176943,16.0476701 C10.3881737,13.9029317 11.6975664,11.7350164 13.8423049,11.2054957 C14.4935255,11.044714 15.1747229,11.0502826 15.8232279,11.2216893 Z" opacity=".5" transform="translate(23.999997, 24.272222) rotate(-45.000000) translate(-23.999997, -24.272222)"/><path id="Rectangle-46-Copy" fill="#FC521F" d="M15.8232279,3.32785281 L24.7368455,5.68381509 C29.6053842,6.97062075 33.4077423,10.7729788 34.694548,15.6415176 L37.0505103,24.5551352 C37.6150232,26.6909302 36.3412474,28.8799623 34.2054524,29.4444752 C33.5569474,29.6158819 32.87575,29.6214505 32.2245294,29.4606688 L23.3459013,27.2685988 C18.2976962,26.022233 14.3561301,22.0806669 13.1097642,17.0324618 L10.9176943,8.15383364 C10.3881737,6.00909519 11.6975664,3.84117987 13.8423049,3.31165925 C14.4935255,3.15087753 15.1747229,3.15644615 15.8232279,3.32785281 Z" opacity=".5" transform="translate(23.999997, 16.378385) rotate(-45.000000) translate(-23.999997, -16.378385)"/></g></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,40 @@
/*
* @file Badge.stories.tsx
* @description Badge stories, using Storybook.
* We create a story for the component badge,
* and we can use it to test the component in Storybook.
* There, we can see the component in different states, and
* play with the props to see how it behaves.
* We'll use a generic story for the component, and we'll
* use the args to pass the props.
* We'll use a template to create the story.
* Refer to Badge.tsx and the BadgeProps interface to see what props
* the component accepts. The story works with the same props.
*
* @see https://storybook.js.org/docs/react/writing-stories/introduction
*/
import type { Meta } from "@storybook/react-vite";
import Badge from "./Badge";
// We set the metadata for the story.
// Refer to https://storybook.js.org/docs/react/writing-stories/introduction
// for more information.
const meta = {
title: "Badge",
component: Badge,
args: {
type: "success",
children: "Success",
},
} satisfies Meta<typeof Badge>;
export default meta;
export const Default = {
args: {
type: "success",
children: "Success",
},
};

View File

@@ -0,0 +1,73 @@
/**
* This is a generic badge component.
* By passing props you can customize the badge.
* The basic custom types are:
* warning, success, error, info, default.
* You can use this badge like any other html element.
*
* behind the scenes, it uses tailwindcss classes to imlement the badge,
* with the correct styles.
*
* @example
* <Badge type="warning">Warning</Badge>
*
* @param {string} type - The type of the badge.
* @param {string} children - The content of the badge.
* @returns {JSX.Element} - The badge component.
*
*
*/
import type { JSX, ReactNode } from "react";
export type BadgeCode = "success" | "warning" | "error" | "unknown";
export const BadgeCodes = Object.freeze({
ERROR: "error",
WARNING: "warning",
SUCCESS: "success",
UNKNOWN: "unknown",
});
export interface BadgeProps {
type: BadgeCode;
children: ReactNode;
additionalClassNames?: string;
}
export default function Badge(props: BadgeProps): JSX.Element {
const colorVariants = {
[BadgeCodes.SUCCESS]: "bg-text-success text-black-800",
[BadgeCodes.WARNING]: "bg-text-warning text-white",
[BadgeCodes.ERROR]: "bg-text-danger text-white",
[BadgeCodes.UNKNOWN]: "bg-secondary text-danger",
};
const badgeBase =
"inline-flex items-center px-1 py-1 rounded-sm text-xs font-light";
const badgeElem = (
<span
className={`${badgeBase} ${colorVariants[props.type]} ${
props.additionalClassNames ?? ""
}`}
>
{props.children}
</span>
);
return badgeElem;
}
export const getBadgeType = (status: string): BadgeCode => {
if (status === "Unknown") {
return BadgeCodes.UNKNOWN;
} else if (
status === "Healthy" ||
status.toLowerCase().includes("exists") ||
status === "available"
) {
return BadgeCodes.SUCCESS;
} else if (status === "Progressing") {
return BadgeCodes.WARNING;
} else {
return BadgeCodes.ERROR;
}
};

View File

@@ -0,0 +1,32 @@
import { mount } from "cypress/react";
import { Button } from "./common/Button/Button";
describe("Button component tests", () => {
const buttonText = "buttonText";
it("renders", () => {
mount(<Button onClick={() => {}} label=""></Button>);
cy.get("button").should("exist");
});
it("Should have correct text", () => {
mount(<Button label={buttonText} onClick={() => {}}></Button>);
cy.get("button").contains(buttonText);
});
it("calls onClick when clicked", () => {
const onClickStub = cy.stub().as("onClick");
mount(<Button onClick={onClickStub} label={""}></Button>);
cy.get("button").click();
cy.get("@onClick").should("have.been.calledOnce");
});
it("should be disabled", () => {
mount(<Button onClick={() => {}} disabled label={""}></Button>);
cy.get("button").should("be.disabled");
});
});

View File

@@ -0,0 +1,28 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import Button from "./Button";
const meta = {
/* 👇 The title prop is optional.
* See https://storybook.js.org/docs/react/configure/overview#configure-story-loading
* to learn how to generate automatic titles
*/
title: "Button",
component: Button,
} satisfies Meta<typeof Button>;
export default meta;
export const Default: StoryObj<typeof Button> = {
args: {
children: (
<>
<span>&uarr;</span>
<span>Update</span>
</>
),
},
argTypes: {
onClick: { action: "clicked" },
},
};

View File

@@ -0,0 +1,37 @@
/**
* @file Button.tsx
* This component is a generic button component using tailwind.
* You can include an optional icon.
* You can pass the action to be done when the button is clicked using
* the onClick prop.
*
* Props:
*
* @param children: children
* @param onClick: () => void
*
*
*/
import type { HTMLAttributes, JSX, ReactNode } from "react";
// this is a type declaration for the action prop.
// it is a function that takes a string as an argument and returns void.
export interface ButtonProps extends HTMLAttributes<HTMLButtonElement> {
children: ReactNode;
disabled?: boolean;
onClick: () => void;
className?: string;
}
export default function Button(props: ButtonProps): JSX.Element {
return (
<>
<button
onClick={props.onClick}
className={`${props.className} rounded-sm border border-gray-300 bg-white px-4 py-1 text-black hover:bg-gray-50`}
disabled={props.disabled}
>
{props.children}
</button>
</>
);
}

View File

@@ -0,0 +1,90 @@
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { BrowserRouter } from "react-router";
import { AppContextProvider } from "../context/AppContext";
import type { Release } from "../data/types";
import ClustersList from "./ClustersList";
import { DeploymentStatus } from "./common/StatusLabel";
type ClustersListProps = {
onClusterChange: (clusterName: string) => void;
selectedCluster: string;
filteredNamespaces: string[];
installedReleases?: Release[];
};
const generateTestReleaseData = (): Release => ({
id: "id",
name: "helm-dashboard",
namespace: "default",
revision: 1,
updated: "2024-01-23T15:37:35.0992836+02:00",
status: DeploymentStatus.DEPLOYED,
chart: "helm-dashboard-0.1.10",
chart_name: "helm-dashboard",
chart_ver: "0.1.10",
app_version: "1.3.3",
icon: "https://raw.githubusercontent.com/komodorio/helm-dashboard/main/pkg/dashboard/static/logo.svg",
description: "A GUI Dashboard for Helm by Komodor",
has_tests: true,
chartName: "helm-dashboard",
chartVersion: "0.1.10",
});
const renderClustersList = (props: ClustersListProps) => {
const queryClient = new QueryClient();
cy.mount(
<AppContextProvider>
<BrowserRouter>
<QueryClientProvider client={queryClient}>
<ClustersList {...props} />
</QueryClientProvider>
</BrowserRouter>
</AppContextProvider>
);
};
describe("ClustersList", () => {
it("Got one cluster information", () => {
cy.intercept("GET", "/api/k8s/contexts", [
{
Name: "minikube",
Namespace: "default",
IsCurrent: true,
},
]).as("getClusters");
renderClustersList({
selectedCluster: "minikube",
filteredNamespaces: ["default"],
onClusterChange: () => {},
installedReleases: [generateTestReleaseData()],
});
cy.wait("@getClusters");
cy.get(".data-cy-clusterName").contains("minikube");
cy.get(".data-cy-clusterList-namespace").contains("default");
cy.get(".data-cy-clustersInput").should("be.checked");
});
it("Dont have a cluster chekced", () => {
cy.intercept("GET", "/api/k8s/contexts", [
{
Name: "minikube",
Namespace: "default",
IsCurrent: true,
},
]).as("getClusters");
renderClustersList({
selectedCluster: "",
filteredNamespaces: [""],
onClusterChange: () => {},
installedReleases: [generateTestReleaseData()],
});
cy.wait("@getClusters");
cy.get(".data-cy-clustersInput").should("not.be.checked");
});
});

View File

@@ -0,0 +1,27 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import ClustersList from "./ClustersList";
const meta = {
/* 👇 The title prop is optional.
* See https://storybook.js.org/docs/react/configure/overview#configure-story-loading
* to learn how to generate automatic titles
*/
title: "ClustersList",
component: ClustersList,
} satisfies Meta<typeof ClustersList>;
export default meta;
//👇 We create a “template” of how args map to rendering
export const Default: StoryObj<typeof ClustersList> = {
args: {
filteredNamespaces: [""],
installedReleases: [],
selectedCluster: "",
},
argTypes: {
onClusterChange: { actions: "onClusterChange called" },
},
};

View File

@@ -0,0 +1,167 @@
import { useQuery } from "@tanstack/react-query";
import { useEffect, useEffectEvent, useMemo } from "react";
import { v4 as uuidv4 } from "uuid";
import apiService from "../API/apiService";
import { useAppContext } from "../context/AppContext";
import type { Cluster, Release } from "../data/types";
import useCustomSearchParams from "../hooks/useCustomSearchParams";
type ClustersListProps = {
onClusterChange: (clusterName: string) => void;
selectedCluster: string;
filteredNamespaces: string[];
installedReleases?: Release[];
};
function getCleanClusterName(rawClusterName: string) {
if (rawClusterName.indexOf("arn") === 0) {
// AWS cluster
const clusterSplit = rawClusterName.split(":");
const clusterName = clusterSplit.slice(-1)[0].replace("cluster/", "");
const region = clusterSplit.at(-3);
return region + "/" + clusterName + " [AWS]";
}
if (rawClusterName.indexOf("gke") === 0) {
// GKE cluster
return (
rawClusterName.split("_").at(-2) +
"/" +
rawClusterName.split("_").at(-1) +
" [GKE]"
);
}
return rawClusterName;
}
function ClustersList({
installedReleases,
selectedCluster,
filteredNamespaces,
onClusterChange,
}: ClustersListProps) {
const { upsertSearchParams, removeSearchParam } = useCustomSearchParams();
const { clusterMode } = useAppContext();
const { data: clusters = [], isSuccess } = useQuery<Cluster[]>({
queryKey: ["clusters", selectedCluster],
queryFn: apiService.getClusters,
select: (data) =>
data?.sort((a, b) =>
getCleanClusterName(a.Name).localeCompare(getCleanClusterName(b.Name))
),
});
const onSuccess = useEffectEvent((clusters: Cluster[]) => {
if (clusters && clusters.length && !selectedCluster) {
onClusterChange(clusters[0].Name);
}
if (selectedCluster) {
const cluster = clusters.find(
(cluster) => getCleanClusterName(cluster.Name) === selectedCluster
);
if (!filteredNamespaces && cluster?.Namespace) {
upsertSearchParams("filteredNamespace", cluster.Namespace);
}
}
});
useEffect(() => {
if (clusters && isSuccess) {
onSuccess(clusters);
}
}, [clusters, isSuccess]);
const namespaces = useMemo(() => {
const mapNamespaces = new Map<string, number>();
installedReleases?.forEach((release) => {
const amount = mapNamespaces.get(release.namespace)
? Number(mapNamespaces.get(release.namespace)) + 1
: 1;
mapNamespaces.set(release.namespace, amount);
});
return Array.from(mapNamespaces, ([key, value]) => ({
id: uuidv4(),
name: key,
amount: value,
}));
}, [installedReleases]);
const onNamespaceChange = (namespace: string) => {
const newSelectedNamespaces = filteredNamespaces?.includes(namespace)
? filteredNamespaces?.filter((ns) => ns !== namespace)
: [...(filteredNamespaces ?? []), namespace];
removeSearchParam("filteredNamespace");
if (newSelectedNamespaces.length > 0) {
upsertSearchParams(
"filteredNamespace",
newSelectedNamespaces.map((ns) => ns).join("+")
);
}
};
return (
<div className="custom- custom-shadow m-5 flex h-fit w-48 flex-col rounded-sm bg-white p-2 pb-4 text-cluster-list">
{!clusterMode ? (
<>
<label className="font-bold">Clusters</label>
{clusters?.map((cluster) => {
return (
<span
key={cluster.Name + cluster.Namespace}
className="data-cy-clusterName mt-2 flex items-center text-xs"
>
<input
className="data-cy-clustersInput cursor-pointer"
onChange={(e) => {
onClusterChange(e.target.value);
}}
type="radio"
id={cluster.Name}
value={cluster.Name}
checked={cluster.Name === selectedCluster}
name="clusters"
/>
<label htmlFor={cluster.Name} className="ml-1">
{getCleanClusterName(cluster.Name)}
</label>
</span>
);
})}
</>
) : null}
<label className="mt-4 font-bold">Namespaces</label>
{namespaces
?.sort((a, b) => a.name.localeCompare(b.name))
?.map((namespace) => (
<span key={namespace.name} className="mt-2 flex items-center text-xs">
<input
type="checkbox"
id={namespace.name}
onChange={(event) => {
onNamespaceChange(event.target.value);
}}
value={namespace.name}
checked={
filteredNamespaces
? filteredNamespaces.includes(namespace.name)
: false
}
/>
<label
htmlFor={namespace.name}
className="data-cy-clusterList-namespace ml-1"
>{`${namespace.name} [${namespace.amount}]`}</label>
</span>
))}
</div>
);
}
export default ClustersList;

View File

@@ -0,0 +1,114 @@
import { mount } from "cypress/react";
import { useState } from "react";
import { ErrorBoundary } from "react-error-boundary";
import ErrorFallback from "./ErrorFallback";
/**
* Component tests for ErrorFallback
* Tests the error fallback UI and reset functionality
*/
describe("ErrorFallback", () => {
beforeEach(() => {
// Ensure portal root exists for createPortal
if (!document.getElementById("portal")) {
const portalDiv = document.createElement("div");
portalDiv.id = "portal";
document.body.appendChild(portalDiv);
}
});
it("should render error modal with error message and hint", () => {
const mockError = new Error("Test error message");
const mockReset = cy.stub().as("resetErrorBoundary");
mount(<ErrorFallback error={mockError} resetErrorBoundary={mockReset} />);
// Verify modal is open (checking document directly because of portal)
cy.get("#portal").should("be.visible");
cy.get("#portal").should("contain", "Application Error");
cy.get("#portal").should("contain", "Test error message");
// Verify Komodor hint is present (from GlobalErrorModal)
cy.get("#portal").should("contain", "Sign up for free.");
cy.get("#portal a")
.should("have.attr", "href")
.and("include", "komodor.com");
});
it("should call resetErrorBoundary when modal is closed", () => {
const mockError = new Error("Test error");
const mockReset = cy.stub().as("resetErrorBoundary");
mount(<ErrorFallback error={mockError} resetErrorBoundary={mockReset} />);
// Find and click close button (using the selector from Modal.tsx)
cy.get("[data-modal-hide='staticModal']").click();
// Verify reset was called
cy.get("@resetErrorBoundary").should("have.been.calledOnce");
});
it("should handle non-Error objects gracefully", () => {
const mockError = "String error" as unknown as Error;
const mockReset = cy.stub().as("resetErrorBoundary");
mount(<ErrorFallback error={mockError} resetErrorBoundary={mockReset} />);
// Should show fallback message
cy.get("#portal").should(
"contain",
"An unexpected error occurred. Please try again."
);
});
it("should log error in development mode", () => {
const mockError = new Error("Test error for logging");
const mockReset = cy.stub();
cy.window().then((win) => {
cy.spy(win.console, "error").as("consoleError");
});
mount(<ErrorFallback error={mockError} resetErrorBoundary={mockReset} />);
// In dev mode, error should be logged
cy.get("@consoleError").should("have.been.called");
});
it("should catch errors from a real component and recover after reset (Integration)", () => {
const BuggyComponent = ({ shouldCrash }: { shouldCrash: boolean }) => {
if (shouldCrash) {
throw new Error("Integrated crash");
}
return <div data-cy="recovered">Recovered successfully!</div>;
};
const TestWrapper = () => {
const [shouldCrash, setShouldCrash] = useState(true);
return (
<ErrorBoundary
FallbackComponent={ErrorFallback}
onReset={() => setShouldCrash(false)}
>
<BuggyComponent shouldCrash={shouldCrash} />
</ErrorBoundary>
);
};
mount(<TestWrapper />);
// Verify modal caught the real throw
cy.get("#portal").should("be.visible").and("not.be.empty");
cy.get("#portal").should("contain", "Integrated crash");
// Click close to reset
cy.get("[data-modal-hide='staticModal']").click();
// Verify modal is gone (portal should be empty) and component recovered
cy.get("#portal").should("be.empty");
cy.get("[data-cy='recovered']")
.should("be.visible")
.and("contain", "Recovered successfully!");
});
});

Some files were not shown because too many files have changed in this diff Show More