From a77e54c01b42df9a897549847fd644247cd62611 Mon Sep 17 00:00:00 2001 From: petar-cvit Date: Mon, 3 Feb 2025 13:12:48 +0100 Subject: [PATCH 1/6] redirect to module after migration --- .../src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx b/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx index 71704c7d..5addcf1e 100644 --- a/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx +++ b/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx @@ -31,7 +31,7 @@ const MigrateRelease = () => { }); }} onSubmitSuccess={(releaseNamespace, releaseName) => { - window.location.href = `/helm/releases/${releaseNamespace}/${releaseName}`; + window.location.href = `/modules/${releaseName}`; }} onBackButton={(releaseNamespace, releaseName) => { window.location.href = `/helm/releases/${releaseNamespace}/${releaseName}`; From a5b9dc201f3558a38a4b902fcf3c2e9acfc16241 Mon Sep 17 00:00:00 2001 From: petar-cvit Date: Mon, 3 Feb 2025 13:18:33 +0100 Subject: [PATCH 2/6] migration errors handling --- .../components/pages/Helm/Releases/Releases.tsx | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx b/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx index 883f2cb6..2eee6ee2 100644 --- a/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx +++ b/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx @@ -49,6 +49,10 @@ const HelmReleases = () => { message: "", description: "", }); + const [releasesMigrationError, setReleasesMigrationError] = useState({ + message: "", + description: "", + }); const [selectedRowKeys, setSelectedRowKeys] = useState([]); @@ -166,7 +170,8 @@ const HelmReleases = () => { ...prevState, [k]: "success", })); - } catch (error) { + } catch (e) { + setReleasesMigrationError(mapResponseError(e)); setReleaseMigrationModalProgress((prevState) => ({ ...prevState, [k]: "error", @@ -333,7 +338,7 @@ const HelmReleases = () => { type="error" closable afterClose={() => { - setError({ + setMigrationTemplateError({ message: "", description: "", }); @@ -365,14 +370,14 @@ const HelmReleases = () => { confirmLoading={templateMigrationModalLoading} width={"80%"} > - {migrationTemplateError.message.length !== 0 && ( + {releasesMigrationError.message.length !== 0 && ( { - setError({ + setReleasesMigrationError({ message: "", description: "", }); From 07109437dd64a94e83de240a27e85f077c2f1171 Mon Sep 17 00:00:00 2001 From: petar-cvit Date: Mon, 3 Feb 2025 13:29:50 +0100 Subject: [PATCH 3/6] validate template on migration --- .../pages/Helm/Releases/Releases.tsx | 8 +++++- .../HelmReleaseDetails/HelmReleaseDetails.tsx | 26 ++++++++++++++++--- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx b/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx index 2eee6ee2..57264593 100644 --- a/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx +++ b/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx @@ -111,7 +111,13 @@ const HelmReleases = () => { setsearchInputFilter(query); }; - const handleSubmitMigrationTemplate = () => { + const handleSubmitMigrationTemplate = async () => { + try { + await migrateTemplateRefForm.validateFields(); + } catch (error) { + return; + } + // setTemplateMigrationModal(false); setTemplateMigrationModalLoading(true); const templateRef = migrateTemplateRefForm.getFieldsValue(); diff --git a/cyclops-ui/src/components/shared/HelmReleaseDetails/HelmReleaseDetails.tsx b/cyclops-ui/src/components/shared/HelmReleaseDetails/HelmReleaseDetails.tsx index dce78469..fe3a8052 100644 --- a/cyclops-ui/src/components/shared/HelmReleaseDetails/HelmReleaseDetails.tsx +++ b/cyclops-ui/src/components/shared/HelmReleaseDetails/HelmReleaseDetails.tsx @@ -349,7 +349,13 @@ export const HelmReleaseDetails = ({ }); }; - const handleSubmitMigrateModal = () => { + const handleSubmitMigrateModal = async () => { + try { + await migrateTemplateRefForm.validateFields(); + } catch (error) { + return; + } + // setTemplateMigrationModal(false); setTemplateMigrationModalLoading(true); const templateRef = migrateTemplateRefForm.getFieldsValue(); @@ -568,7 +574,11 @@ export const HelmReleaseMigrationTemplateModal = ({ )} > - +
/
- +
@
- + From 061246fe6764b067e877c7726f7cfddc5a80abce Mon Sep 17 00:00:00 2001 From: petar-cvit Date: Mon, 3 Feb 2025 17:40:46 +0100 Subject: [PATCH 4/6] confirm migration modal --- .../Helm/MigrateRelease/MigrateRelease.tsx | 70 +++++++++++++------ .../pages/Helm/Releases/Releases.tsx | 22 +++++- 2 files changed, 70 insertions(+), 22 deletions(-) diff --git a/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx b/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx index 5addcf1e..d06fe18b 100644 --- a/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx +++ b/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx @@ -8,6 +8,8 @@ import { migrateHelmRelease, } from "../../../../utils/api/helm"; import { getTemplate } from "../../../../utils/api/api"; +import { InfoCircleOutlined } from "@ant-design/icons"; +import { Alert, Row } from "antd"; const MigrateRelease = () => { const [searchParams] = useSearchParams(); @@ -16,27 +18,53 @@ const MigrateRelease = () => { const version = searchParams.get("version"); return ( - { - return getTemplate(repo, path, version, ""); - }} - fetchHelmReleaseValues={getHelmReleaseValues} - submitHelmReleaseUpdate={(releaseNamespace, releaseName, values) => { - return migrateHelmRelease(releaseNamespace, releaseName, values, { - repo: repo, - path: path, - version: version, - }); - }} - onSubmitSuccess={(releaseNamespace, releaseName) => { - window.location.href = `/modules/${releaseName}`; - }} - onBackButton={(releaseNamespace, releaseName) => { - window.location.href = `/helm/releases/${releaseNamespace}/${releaseName}`; - }} - /> +
+ + + Migrating Helm release +
+ } + description={ + "Migration from Helm releases to Cyclops Modules will retain the existing resources, but releases will not be visible in the the Cyclops UI or the `helm ls` command. In case you want to revert to Helm releases, you can just reinstall them." + } + type="info" + style={{ + borderColor: "#1890ff", + borderWidth: "1.5px", + marginBottom: "16px", + }} + /> + { + return getTemplate(repo, path, version, ""); + }} + fetchHelmReleaseValues={getHelmReleaseValues} + submitHelmReleaseUpdate={(releaseNamespace, releaseName, values) => { + return migrateHelmRelease(releaseNamespace, releaseName, values, { + repo: repo, + path: path, + version: version, + }); + }} + onSubmitSuccess={(releaseNamespace, releaseName) => { + window.location.href = `/modules/${releaseName}`; + }} + onBackButton={(releaseNamespace, releaseName) => { + window.location.href = `/helm/releases/${releaseNamespace}/${releaseName}`; + }} + /> + ); }; diff --git a/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx b/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx index 57264593..be8f43f1 100644 --- a/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx +++ b/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx @@ -25,6 +25,8 @@ import { ClockCircleTwoTone, CloseCircleTwoTone, ExportOutlined, + InfoCircleFilled, + InfoCircleOutlined, LoadingOutlined, } from "@ant-design/icons"; import { HelmReleaseMigrationTemplateModal } from "../../../shared/HelmReleaseDetails/HelmReleaseDetails"; @@ -139,7 +141,7 @@ const HelmReleases = () => { }); }; - const handleSubmitMigrateModal = async () => { + const runReleaseBatchMigration = async () => { selectedRowKeys.forEach((r) => { const k = r.toString(); @@ -189,6 +191,24 @@ const HelmReleases = () => { setBatchMigrationFinished(true); }; + const handleSubmitMigrateModal = () => { + Modal.confirm({ + title: "Confirm migration", + content: + "Migration from Helm releases to Cyclops Modules will retain the existing resources, but releases will not be visible in the the Cyclops UI or the `helm ls` command. In case you want to revert to Helm releases, you can just reinstall them.", + okText: "Run Migration", + cancelText: "Cancel", + icon: , // Use info icon + okButtonProps: { + style: { backgroundColor: "#ff8803" }, + }, + cancelButtonProps: { + style: { borderColor: "#ff8803", color: "#ff8803" }, + }, + onOk: runReleaseBatchMigration, + }); + }; + const handleCancelMigrateModal = () => { setReleaseMigrationModal(false); setLoadingReleases(true); From 46cd07e8093d90a42c61e7f893fcd60384a1f23c Mon Sep 17 00:00:00 2001 From: petar-cvit Date: Mon, 3 Feb 2025 17:47:14 +0100 Subject: [PATCH 5/6] return empty template on no schema --- cyclops-ctrl/internal/controller/helm.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cyclops-ctrl/internal/controller/helm.go b/cyclops-ctrl/internal/controller/helm.go index a46d4c45..a879ee5f 100644 --- a/cyclops-ctrl/internal/controller/helm.go +++ b/cyclops-ctrl/internal/controller/helm.go @@ -147,7 +147,8 @@ func (h *Helm) GetReleaseSchema(ctx *gin.Context) { } if len(release.Chart.Schema) == 0 { - ctx.JSON(http.StatusOK, nil) + ctx.JSON(http.StatusOK, models.Template{}) + return } var root *helm2.Property From b3b52edacd0002096fdc473f1f463de9ede6af7d Mon Sep 17 00:00:00 2001 From: petar-cvit Date: Mon, 3 Feb 2025 17:48:12 +0100 Subject: [PATCH 6/6] remove unused imports --- .../src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx | 2 +- cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx b/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx index d06fe18b..f297d1e5 100644 --- a/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx +++ b/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx @@ -9,7 +9,7 @@ import { } from "../../../../utils/api/helm"; import { getTemplate } from "../../../../utils/api/api"; import { InfoCircleOutlined } from "@ant-design/icons"; -import { Alert, Row } from "antd"; +import { Alert } from "antd"; const MigrateRelease = () => { const [searchParams] = useSearchParams(); diff --git a/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx b/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx index be8f43f1..ed2ec71f 100644 --- a/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx +++ b/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx @@ -25,7 +25,6 @@ import { ClockCircleTwoTone, CloseCircleTwoTone, ExportOutlined, - InfoCircleFilled, InfoCircleOutlined, LoadingOutlined, } from "@ant-design/icons";