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 diff --git a/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx b/cyclops-ui/src/components/pages/Helm/MigrateRelease/MigrateRelease.tsx index 71704c7d..f297d1e5 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 } 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 = `/helm/releases/${releaseNamespace}/${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 883f2cb6..ed2ec71f 100644 --- a/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx +++ b/cyclops-ui/src/components/pages/Helm/Releases/Releases.tsx @@ -25,6 +25,7 @@ import { ClockCircleTwoTone, CloseCircleTwoTone, ExportOutlined, + InfoCircleOutlined, LoadingOutlined, } from "@ant-design/icons"; import { HelmReleaseMigrationTemplateModal } from "../../../shared/HelmReleaseDetails/HelmReleaseDetails"; @@ -49,6 +50,10 @@ const HelmReleases = () => { message: "", description: "", }); + const [releasesMigrationError, setReleasesMigrationError] = useState({ + message: "", + description: "", + }); const [selectedRowKeys, setSelectedRowKeys] = useState([]); @@ -107,7 +112,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(); @@ -129,7 +140,7 @@ const HelmReleases = () => { }); }; - const handleSubmitMigrateModal = async () => { + const runReleaseBatchMigration = async () => { selectedRowKeys.forEach((r) => { const k = r.toString(); @@ -166,7 +177,8 @@ const HelmReleases = () => { ...prevState, [k]: "success", })); - } catch (error) { + } catch (e) { + setReleasesMigrationError(mapResponseError(e)); setReleaseMigrationModalProgress((prevState) => ({ ...prevState, [k]: "error", @@ -178,6 +190,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); @@ -333,7 +363,7 @@ const HelmReleases = () => { type="error" closable afterClose={() => { - setError({ + setMigrationTemplateError({ message: "", description: "", }); @@ -365,14 +395,14 @@ const HelmReleases = () => { confirmLoading={templateMigrationModalLoading} width={"80%"} > - {migrationTemplateError.message.length !== 0 && ( + {releasesMigrationError.message.length !== 0 && ( { - setError({ + setReleasesMigrationError({ message: "", description: "", }); 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 = ({ )} > - +
/
- +
@
- +