@@ -720,12 +720,101 @@ addons:
720720 name: Cluster Upgrade
721721 description: Upgrade Kubernetes cluster to a newer version
722722 logo: /images/k8s-upgrade.png
723+ settings:
724+ fields:
725+ - type: displayfield
726+ hideLabel: true
727+ markup: |
728+ Press **Start** to automatically upgrade Kubernetes cluster to a newer version.
729+ Depending from the current version in the cluster, it will be either a switch to a new major Kubernetes version, or a minor update within the same branch.
730+ submitUnchanged: true
731+
732+ onBeforeInit: |
733+ function compareVersions(a, b) {
734+ a = a.replace("v", "").split("."); b = b.replace("v", "").split(".");
735+ for (var i = 0, l = Math.max(a.length, b.length), x, y; i < l; i++) {x = parseInt(a[i], 10) || 0; y = parseInt(b[i], 10) || 0; if (x != y) return x > y ? 1 : -1 }
736+ return 0;
737+ }
738+
739+ var resp = api.system.service.GetVersion();
740+ if (resp.result != 0) return resp;
741+
742+ if (compareVersions([resp.version, resp.build].join("."), '6.1.4') >= 0) {
743+ var envName = "${env.envName}", nodeId = "${nodes.k8sm.master.id}";
744+ var resp = api.env.control.GetNodeInfo(envName, session, nodeId);
745+ if (resp.result != 0) return {result:"warning", message:"Cannot retrieve Kubernetes environment settings!"};
746+
747+ const version = resp.node.version;
748+ resp = api.env.control.GetContainerNodeTags(envName, session, nodeId);
749+ if (resp.result != 0) return {result:"warning", message:"Cannot retrieve Kubernetes tags!"};
750+
751+ var tags = resp.object, upgrades = [];
752+ tags.sort(compareVersions);
753+ const major_version = version.substr(0, version.lastIndexOf("."));
754+ var major_next = major_version;
755+
756+ for (var i = 0; i < tags.length; i++)
757+ if (compareVersions(tags[i], version) > 0) {
758+ var major_tag = tags[i].substr(0, tags[i].lastIndexOf("."));
759+ if (compareVersions(major_tag, major_version) == 0) {
760+ upgrades = [ tags[i] ];
761+ } else if (compareVersions(major_tag, major_next) > 0) {
762+ upgrades.push(tags[i]);
763+ major_next = major_tag;
764+ }
765+ }
766+ if (!upgrades.length) return {result:"info", message:"Current version " + version + " is the latest. No upgrades are available."};
767+
768+ const last_version = tags.pop();
769+ if (compareVersions(last_version, upgrades[upgrades.length-1]) > 0) {
770+ upgrades.push(last_version);
771+ }
772+
773+ var uplist = {}, updefault;
774+ for (var i=0; i < upgrades.length; i++) {
775+ var major_upgrade = upgrades[i].substr(0, upgrades[i].lastIndexOf("."));
776+ var val = compareVersions(major_upgrade, major_version);
777+ uplist[upgrades[i]] = upgrades[i];
778+ updefault = upgrades[i];
779+ if (val > 0) break;
780+ }
781+ if (!Object.keys(uplist).length) return {result:"warning", message:"Cannot determine cluster versions to upgrade!"};
782+
783+ settings.fields = [{
784+ type: "displayfield",
785+ hideLabel: true,
786+ markup: "Upgrade Kubernetes cluster to a newer version. Depending from the current Kubernetes version in the cluster, a few options may be available."
787+ }, {
788+ type: "displayfield",
789+ hideLabel: true
790+ }, {
791+ type: "list",
792+ name: "uplist",
793+ values: uplist,
794+ required: true,
795+ editable: false,
796+ default: updefault,
797+ caption: "Version to upgrade"
798+ }];
799+
800+ api.env.control.ApplyNodeGroupData({
801+ envName: "${env.name}",
802+ nodeGroup: "k8sm",
803+ data: {
804+ version: version,
805+ avail: upgrades.join(",")
806+ }
807+ });
808+
809+ }
810+ return settings;
723811
724812 buttons:
725813 - caption: Start Cluster Upgrade
814+ settings: main
726815 action: addon-upgrade-init
727816 loadingText: Updating...
728- confirmText: Do you want to upgrade Kubernetes Cluster?
817+ submitButtonText: Start
729818 successText: Kubernetes Cluster has been successfully upgraded!
730819
731820 actions:
@@ -743,48 +832,72 @@ addons:
743832 return 0;
744833 }
745834
746- var envName = "${env.envName}", nodeId = "${nodes.k8sm.master.id}";
747- var resp = jelastic.env.control.GetNodeInfo(envName, session, nodeId);
748- if (resp.result != 0) return resp;
749- var version = resp.node.version;
750- var image = resp.node.name;
751- resp = jelastic.env.control.GetContainerNodeTags(envName, session, nodeId);
752- if (resp.result != 0) return resp;
753-
754- var tags = resp.object;
755- tags.sort(compareVersions);
756- var upgrades = [];
757- var check_version = version;
758- var major_version = version.substr(0, version.lastIndexOf("."));
759-
760- for (var i = 0; i < tags.length; i++) {
761- var major_tag = tags[i].substr(0, tags[i].lastIndexOf("."));
762- if (compareVersions(major_tag, major_version) > 0) {
763- check_version = tags[i];
764- upgrades.push(check_version);
765- major_version = major_tag;
766- }
767- }
768-
769- var last_version = tags.pop();
770- if (compareVersions(last_version, check_version) > 0) upgrades.push(last_version);
771- var message = "Current version " + version + " is the latest. No upgrades are available.";
772- if (upgrades.length) {
773- upgrades.sort(compareVersions);
774- var next = upgrades.shift();
835+ function startUpgrade(version, next, upgrades) {
775836 var baseUrl = "${baseUrl}".split("/"); baseUrl.pop(); baseUrl = baseUrl.join("/");
776- var url = baseUrl+ "/"+ next+ "/addons/upgrade.jps";
837+ var url = baseUrl + "/" + next + "/addons/upgrade.jps";
777838 var huc = new java.net.URL(url).openConnection();
778839 huc.setRequestMethod("HEAD");
779840 var code = huc.getResponseCode();
780841 if (code == 200){
781842 return {result:0, onAfterReturn:{"addon-upgrade-start":{current:version, next:next, avail:upgrades.join(", "), jps: url}}};
782843 } else {
783- message = "The next version is " + next + ". However, automated upgrade procedure is not available yet. Please check it later, or contact support team if upgrade is required urgently.";
844+ var message = "The next version is " + next + ". However, automated upgrade procedure is not available yet. Please check it later, or contact support team if upgrade is required urgently.";
784845 return {result:"info", message:message};
785846 }
847+ }
848+
849+ var resp = api.system.service.GetVersion();
850+ if (resp.result != 0) return {result:"error", message:"Cannot determine platform version!"};
851+
852+ if (compareVersions([resp.version, resp.build].join("."), '6.1.4') >= 0) {
853+ resp = api.env.control.GetNodeGroups("${env.name}", session);
854+ if (resp.result !=0) return {result:"error", message:"Cannot obtain node groups!"};
855+ var groups = resp.object, next = "${settings.uplist}", upgrades = [], version;
856+ for (var i = 0, n = groups.length; i < n; i++)
857+ if (groups[i].name == "k8sm" && groups[i].version && groups[i].avail) {
858+ upgrades = groups[i].avail.split(",");
859+ version = groups[i].version;
860+ break;
861+ }
862+ if (!upgrades.length || !version) return {result:"warning", message:"Cannot determine cluster upgrade parameters!"};
863+
864+ while (upgrades.length && compareVersions(next, upgrades[0]) >= 0) upgrades.shift();
865+
866+ return startUpgrade(version, next, upgrades);
867+
786868 } else {
787- return {result:"info", message:message};
869+ var envName = "${env.envName}", nodeId = "${nodes.k8sm.master.id}";
870+ resp = jelastic.env.control.GetNodeInfo(envName, session, nodeId);
871+ if (resp.result != 0) return {result:"error", message:"Cannot obtain node info!"};
872+ var version = resp.node.version;
873+ resp = jelastic.env.control.GetContainerNodeTags(envName, session, nodeId);
874+ if (resp.result != 0) return {result:"error", message:"Cannot obtain node tags!"};
875+
876+ var tags = resp.object;
877+ tags.sort(compareVersions);
878+ var check_version = version, upgrades = [];
879+ var major_version = version.substr(0, version.lastIndexOf("."));
880+
881+ for (var i = 0; i < tags.length; i++) {
882+ var major_tag = tags[i].substr(0, tags[i].lastIndexOf("."));
883+ if (compareVersions(major_tag, major_version) > 0) {
884+ check_version = tags[i];
885+ upgrades.push(check_version);
886+ major_version = major_tag;
887+ }
888+ }
889+
890+ var last_version = tags.pop();
891+ if (compareVersions(last_version, check_version) > 0) upgrades.push(last_version);
892+ if (!upgrades.length) {
893+ var message = "Current version " + version + " is the latest. No upgrades are available.";
894+ return {result:"info", message:message};
895+ }
896+
897+ upgrades.sort(compareVersions);
898+ var next = upgrades.shift();
899+
900+ return startUpgrade(version, next, upgrades);
788901 }
789902
790903 addon-upgrade-start:
@@ -830,7 +943,7 @@ addons:
830943
831944 buttons:
832945 - caption: Configure
833- settings: gitlab
946+ settings: main
834947 action: addon-gitlab-config
835948 loadingText: Configuration...
836949 confirmText: Are you sure?
@@ -1038,7 +1151,7 @@ addons:
10381151 name: certificate_domain
10391152 buttons:
10401153 - caption: Install Certificate Manager
1041- settings: certman
1154+ settings: main
10421155 action: addon-certman-config
10431156 loadingText: Installing...
10441157 successText: Certficate manager has been successfully installed!
@@ -1168,7 +1281,7 @@ addons:
11681281 name: creds_email
11691282 buttons:
11701283 - caption: DockerHub Credentials
1171- settings: regcreds
1284+ settings: main
11721285 action: addon-regcreds-config
11731286 loadingText: Setting up...
11741287 successText: DockerHub registry user credentials have been successfully set!
0 commit comments