const clusterSelect = $("#cluster"); const chartsCards = $("#charts"); const revRow = $("#sectionDetails .row"); function reportError(err, xhr) { $("#errorAlert h4 span").text(err) $("#errorAlert p").text(xhr.responseText) $("#errorAlert").show() } function revisionClicked(namespace, name, self) { let active = "active border-primary border-2 bg-opacity-25 bg-primary"; let inactive = "border-secondary bg-white"; revRow.find(".active").removeClass(active).addClass(inactive) self.removeClass(inactive).addClass(active) const elm = self.data("elm") setHashParam("revision", elm.revision) $("#sectionDetails h1 span.rev").text(elm.revision) $("#chartName").text(elm.chart) $("#revDescr").text(elm.description).removeClass("text-danger") if (elm.status === "failed") { $("#revDescr").addClass("text-danger") } const rev = $("#specRev").data("last-rev") == elm.revision ? elm.revision - 1 : elm.revision console.log(rev, $("#specRev").data("first-rev")) if (!rev || getHashParam("revision") === $("#specRev").data("first-rev")) { $("#btnRollback").hide() } else { $("#btnRollback").show().data("rev", rev).find("span").text("Rollback to #" + rev) } const tab = getHashParam("tab") if (!tab) { $("#nav-tab [data-tab=resources]").click() } else { $("#nav-tab [data-tab=" + tab + "]").click() } } $("#nav-tab [data-tab]").click(function () { const self = $(this) setHashParam("tab", self.data("tab")) if (self.data("tab") === "values") { $("#userDefinedVals").parent().show() } else { $("#userDefinedVals").parent().hide() } const flag = getHashParam("udv") === "true"; $("#userDefinedVals").prop("checked", flag) if (self.data("tab") === "resources") { showResources(getHashParam("namespace"), getHashParam("chart"), getHashParam("revision")) } else { const mode = getHashParam("mode") if (!mode) { $("#modePanel [data-mode=view]").trigger('click') } else { $("#modePanel [data-mode=" + mode + "]").trigger('click') } } }) $("#modePanel [data-mode]").click(function () { const self = $(this) const mode = self.data("mode") setHashParam("mode", mode) loadContentWrapper() }) $("#userDefinedVals").change(function () { const self = $(this) const flag = $("#userDefinedVals").prop("checked"); setHashParam("udv", flag) loadContentWrapper() }) function loadContentWrapper() { let revDiff = 0 const revision = parseInt(getHashParam("revision")); if (revision === $("#specRev").data("first-rev")) { revDiff = 0 } else if (getHashParam("mode") === "diff-prev") { revDiff = revision - 1 } else if (getHashParam("mode") === "diff-rev") { revDiff = $("#specRev").val() } const flag = $("#userDefinedVals").prop("checked"); loadContent(getHashParam("tab"), getHashParam("namespace"), getHashParam("chart"), revision, revDiff, flag) } function loadContent(mode, namespace, name, revision, revDiff, flag) { let qstr = "name=" + name + "&namespace=" + namespace + "&revision=" + revision if (revDiff) { qstr += "&revisionDiff=" + revDiff } if (flag) { qstr += "&flag=" + flag } let url = "/api/helm/charts/" + mode url += "?" + qstr const diffDisplay = $("#manifestText"); diffDisplay.empty().append('') $.get(url).fail(function () { reportError("Failed to get diff of " + mode) }).done(function (data) { diffDisplay.empty(); if (data === "") { diffDisplay.text("No differences to display") } else { if (revDiff) { const targetElement = document.getElementById('manifestText'); const configuration = { inputFormat: 'diff', outputFormat: 'side-by-side', drawFileList: false, showFiles: false, highlight: true, //matching: 'lines', }; const diff2htmlUi = new Diff2HtmlUI(targetElement, data, configuration); diff2htmlUi.draw() } else { data = hljs.highlight(data, {language: 'yaml'}).value const code = $("#manifestText").empty().append("
").find("pre"); code.html(data) } } }) } $('#specRev').keyup(function (event) { let keycode = (event.keyCode ? event.keyCode : event.which); if (keycode == '13') { $("#diffModeRev").click() } event.preventDefault() }); function fillChartHistory(data, namespace, name) { revRow.empty() for (let x = 0; x < data.length; x++) { const elm = data[x] $("#specRev").val(elm.revision).data("last-rev", elm.revision).data("last-chart-ver", elm.chart_ver) if (!x) { $("#specRev").data("first-rev", elm.revision) } const rev = $(`Age:
Following changes will happen to cluster:
") if (!data) { $("#upgradeModalBody").html("No changes will happen to cluster") } }) }) $("#upgradeModal .btn-secondary").click(function () { const self = $(this) self.find(".fa").removeClass("fa-cloud-download").addClass("fa-spin fa-spinner").prop("disabled", true) $("#btnUpgradeCheck").click() $("#upgradeModal .btn-close").click() }) function popUpUpgrade(self, verCur, elm) { const name = getHashParam("chart"); let url = "/api/helm/charts/install?namespace=" + getHashParam("namespace") + "&name=" + name + "&chart=" + elm.name; $('#upgradeModalLabel select').data("url", url) self.prop("disabled", true) $("#upgradeModalLabel .name").text(name) $("#upgradeModalLabel .ver-old").text(verCur) $('#upgradeModalLabel select').val(elm.version).trigger("change") const myModal = new bootstrap.Modal(document.getElementById('upgradeModal'), {}); myModal.show() $("#upgradeModal .btn-success").prop("disabled", true).off('click').click(function () { $("#upgradeModal .btn-success").prop("disabled", true).prepend('') $.ajax({ url: url + "&version=" + $('#upgradeModalLabel select').val(), type: 'POST', }).fail(function () { reportError("Failed to upgrade the chart") }).done(function (data) { setHashParam("revision", data.version) window.location.reload() }) }) } function getHashParam(name) { const params = new URLSearchParams(window.location.hash.substring(1)) return params.get(name) } function setHashParam(name, val) { const params = new URLSearchParams(window.location.hash.substring(1)) params.set(name, val) window.location.hash = new URLSearchParams(params).toString() } function buildChartCard(elm) { const header = $("") header.append($('Following resources will be deleted from the cluster:
"); $("#confirmModal .btn-primary").prop("disabled", false) for (let i = 0; i < data.length; i++) { const res = data[i] $("#confirmModalBody").append("" + res.kind + "" + res.metadata.name + "
") } }) }) $("#btnRollback").click(function () { const chart = getHashParam('chart'); const namespace = getHashParam('namespace'); const revisionNew = $("#btnRollback").data("rev") const revisionCur = $("#specRev").data("last-rev") $("#confirmModalLabel").html("Rollback " + chart + " from revision " + revisionCur + " to " + revisionNew) $("#confirmModalBody").empty().append('') $("#confirmModal .btn-primary").prop("disabled", true).off('click').click(function () { $("#confirmModal .btn-primary").prop("disabled", true).append('') const url = "/api/helm/charts/rollback?namespace=" + namespace + "&name=" + chart + "&revision=" + revisionNew; $.ajax({ url: url, type: 'POST', }).fail(function (xhr) { reportError("Failed to rollback the chart", xhr) }).done(function () { window.location.reload() }) }) const myModal = new bootstrap.Modal(document.getElementById('confirmModal'), {}); myModal.show() let qstr = "name=" + chart + "&namespace=" + namespace + "&revision=" + revisionNew + "&revisionDiff=" + revisionCur let url = "/api/helm/charts/manifests" url += "?" + qstr $.get(url).fail(function () { reportError("Failed to get list of resources") }).done(function (data) { $("#confirmModalBody").empty(); $("#confirmModal .btn-primary").prop("disabled", false) const targetElement = document.getElementById('confirmModalBody'); const configuration = { inputFormat: 'diff', outputFormat: 'side-by-side', drawFileList: false, showFiles: false, highlight: true, }; const diff2htmlUi = new Diff2HtmlUI(targetElement, data, configuration); diff2htmlUi.draw() if (data) { $("#confirmModalBody").prepend("Following changes will happen to cluster:
") } else { $("#confirmModalBody").html("No changes will happen to cluster
") } }) }) function isNewerVersion(oldVer, newVer) { const oldParts = oldVer.split('.') const newParts = newVer.split('.') for (let i = 0; i < newParts.length; i++) { const a = ~~newParts[i] // parse int const b = ~~oldParts[i] // parse int if (a > b) return true if (a < b) return false } return false }