Skip to content

Commit 8d3e7fe

Browse files
committed
K8S-505 select version for cluster upgrade
1 parent c6a0bd3 commit 8d3e7fe

File tree

1 file changed

+149
-36
lines changed

1 file changed

+149
-36
lines changed

manifest.jps

Lines changed: 149 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -719,12 +719,101 @@ addons:
719719
name: Cluster Upgrade
720720
description: Upgrade Kubernetes cluster to a newer version
721721
logo: /images/k8s-upgrade.png
722+
settings:
723+
fields:
724+
- type: displayfield
725+
hideLabel: true
726+
markup: |
727+
Press **Start** to automatically upgrade Kubernetes cluster to a newer version.
728+
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.
729+
submitUnchanged: true
730+
731+
onBeforeInit: |
732+
function compareVersions(a, b) {
733+
a = a.replace("v", "").split("."); b = b.replace("v", "").split(".");
734+
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 }
735+
return 0;
736+
}
737+
738+
var resp = api.system.service.GetVersion();
739+
if (resp.result != 0) return resp;
740+
741+
if (compareVersions([resp.version, resp.build].join("."), '6.1.4') >= 0) {
742+
var envName = "${env.envName}", nodeId = "${nodes.k8sm.master.id}";
743+
var resp = api.env.control.GetNodeInfo(envName, session, nodeId);
744+
if (resp.result != 0) return {result:"warning", message:"Cannot retrieve Kubernetes environment settings!"};
745+
746+
const version = resp.node.version;
747+
resp = api.env.control.GetContainerNodeTags(envName, session, nodeId);
748+
if (resp.result != 0) return {result:"warning", message:"Cannot retrieve Kubernetes tags!"};
749+
750+
var tags = resp.object, upgrades = [];
751+
tags.sort(compareVersions);
752+
const major_version = version.substr(0, version.lastIndexOf("."));
753+
var major_next = major_version;
754+
755+
for (var i = 0; i < tags.length; i++)
756+
if (compareVersions(tags[i], version) > 0) {
757+
var major_tag = tags[i].substr(0, tags[i].lastIndexOf("."));
758+
if (compareVersions(major_tag, major_version) == 0) {
759+
upgrades = [ tags[i] ];
760+
} else if (compareVersions(major_tag, major_next) > 0) {
761+
upgrades.push(tags[i]);
762+
major_next = major_tag;
763+
}
764+
}
765+
if (!upgrades.length) return {result:"info", message:"Current version " + version + " is the latest. No upgrades are available."};
766+
767+
const last_version = tags.pop();
768+
if (compareVersions(last_version, upgrades[upgrades.length-1]) > 0) {
769+
upgrades.push(last_version);
770+
}
771+
772+
var uplist = {}, updefault;
773+
for (var i=0; i < upgrades.length; i++) {
774+
var major_upgrade = upgrades[i].substr(0, upgrades[i].lastIndexOf("."));
775+
var val = compareVersions(major_upgrade, major_version);
776+
uplist[upgrades[i]] = upgrades[i];
777+
updefault = upgrades[i];
778+
if (val > 0) break;
779+
}
780+
if (!Object.keys(uplist).length) return {result:"warning", message:"Cannot determine cluster versions to upgrade!"};
781+
782+
settings.fields = [{
783+
type: "displayfield",
784+
hideLabel: true,
785+
markup: "Upgrade Kubernetes cluster to a newer version. Depending from the current Kubernetes version in the cluster, a few options may be available."
786+
}, {
787+
type: "displayfield",
788+
hideLabel: true
789+
}, {
790+
type: "list",
791+
name: "uplist",
792+
values: uplist,
793+
required: true,
794+
editable: false,
795+
default: updefault,
796+
caption: "Version to upgrade"
797+
}];
798+
799+
api.env.control.ApplyNodeGroupData({
800+
envName: "${env.name}",
801+
nodeGroup: "k8sm",
802+
data: {
803+
version: version,
804+
avail: upgrades.join(",")
805+
}
806+
});
807+
808+
}
809+
return settings;
722810

723811
buttons:
724812
- caption: Start Cluster Upgrade
813+
settings: main
725814
action: addon-upgrade-init
726815
loadingText: Updating...
727-
confirmText: Do you want to upgrade Kubernetes Cluster?
816+
submitButtonText: Start
728817
successText: Kubernetes Cluster has been successfully upgraded!
729818

730819
actions:
@@ -742,48 +831,72 @@ addons:
742831
return 0;
743832
}
744833

745-
var envName = "${env.envName}", nodeId = "${nodes.k8sm.master.id}";
746-
var resp = jelastic.env.control.GetNodeInfo(envName, session, nodeId);
747-
if (resp.result != 0) return resp;
748-
var version = resp.node.version;
749-
var image = resp.node.name;
750-
resp = jelastic.env.control.GetContainerNodeTags(envName, session, nodeId);
751-
if (resp.result != 0) return resp;
752-
753-
var tags = resp.object;
754-
tags.sort(compareVersions);
755-
var upgrades = [];
756-
var check_version = version;
757-
var major_version = version.substr(0, version.lastIndexOf("."));
758-
759-
for (var i = 0; i < tags.length; i++) {
760-
var major_tag = tags[i].substr(0, tags[i].lastIndexOf("."));
761-
if (compareVersions(major_tag, major_version) > 0) {
762-
check_version = tags[i];
763-
upgrades.push(check_version);
764-
major_version = major_tag;
765-
}
766-
}
767-
768-
var last_version = tags.pop();
769-
if (compareVersions(last_version, check_version) > 0) upgrades.push(last_version);
770-
var message = "Current version " + version + " is the latest. No upgrades are available.";
771-
if (upgrades.length) {
772-
upgrades.sort(compareVersions);
773-
var next = upgrades.shift();
834+
function startUpgrade(version, next, upgrades) {
774835
var baseUrl = "${baseUrl}".split("/"); baseUrl.pop(); baseUrl = baseUrl.join("/");
775-
var url = baseUrl+"/"+next+"/addons/upgrade.jps";
836+
var url = baseUrl + "/" + next + "/addons/upgrade.jps";
776837
var huc = new java.net.URL(url).openConnection();
777838
huc.setRequestMethod("HEAD");
778839
var code = huc.getResponseCode();
779840
if (code == 200){
780841
return {result:0, onAfterReturn:{"addon-upgrade-start":{current:version, next:next, avail:upgrades.join(", "), jps: url}}};
781842
} else {
782-
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.";
843+
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.";
783844
return {result:"info", message:message};
784845
}
846+
}
847+
848+
var resp = api.system.service.GetVersion();
849+
if (resp.result != 0) return {result:"error", message:"Cannot determine platform version!"};
850+
851+
if (compareVersions([resp.version, resp.build].join("."), '6.1.4') >= 0) {
852+
resp = api.env.control.GetNodeGroups("${env.name}", session);
853+
if (resp.result !=0) return {result:"error", message:"Cannot obtain node groups!"};
854+
var groups = resp.object, next = "${settings.uplist}", upgrades = [], version;
855+
for (var i = 0, n = groups.length; i < n; i++)
856+
if (groups[i].name == "k8sm" && groups[i].version && groups[i].avail) {
857+
upgrades = groups[i].avail.split(",");
858+
version = groups[i].version;
859+
break;
860+
}
861+
if (!upgrades.length || !version) return {result:"warning", message:"Cannot determine cluster upgrade parameters!"};
862+
863+
while (upgrades.length && compareVersions(next, upgrades[0]) >= 0) upgrades.shift();
864+
865+
return startUpgrade(version, next, upgrades);
866+
785867
} else {
786-
return {result:"info", message:message};
868+
var envName = "${env.envName}", nodeId = "${nodes.k8sm.master.id}";
869+
resp = jelastic.env.control.GetNodeInfo(envName, session, nodeId);
870+
if (resp.result != 0) return {result:"error", message:"Cannot obtain node info!"};
871+
var version = resp.node.version;
872+
resp = jelastic.env.control.GetContainerNodeTags(envName, session, nodeId);
873+
if (resp.result != 0) return {result:"error", message:"Cannot obtain node tags!"};
874+
875+
var tags = resp.object;
876+
tags.sort(compareVersions);
877+
var check_version = version, upgrades = [];
878+
var major_version = version.substr(0, version.lastIndexOf("."));
879+
880+
for (var i = 0; i < tags.length; i++) {
881+
var major_tag = tags[i].substr(0, tags[i].lastIndexOf("."));
882+
if (compareVersions(major_tag, major_version) > 0) {
883+
check_version = tags[i];
884+
upgrades.push(check_version);
885+
major_version = major_tag;
886+
}
887+
}
888+
889+
var last_version = tags.pop();
890+
if (compareVersions(last_version, check_version) > 0) upgrades.push(last_version);
891+
if (!upgrades.length) {
892+
var message = "Current version " + version + " is the latest. No upgrades are available.";
893+
return {result:"info", message:message};
894+
}
895+
896+
upgrades.sort(compareVersions);
897+
var next = upgrades.shift();
898+
899+
return startUpgrade(version, next, upgrades);
787900
}
788901

789902
addon-upgrade-start:
@@ -829,7 +942,7 @@ addons:
829942

830943
buttons:
831944
- caption: Configure
832-
settings: gitlab
945+
settings: main
833946
action: addon-gitlab-config
834947
loadingText: Configuration...
835948
confirmText: Are you sure?
@@ -1037,7 +1150,7 @@ addons:
10371150
name: certificate_domain
10381151
buttons:
10391152
- caption: Install Certificate Manager
1040-
settings: certman
1153+
settings: main
10411154
action: addon-certman-config
10421155
loadingText: Installing...
10431156
successText: Certficate manager has been successfully installed!
@@ -1164,7 +1277,7 @@ addons:
11641277
name: creds_email
11651278
buttons:
11661279
- caption: DockerHub Credentials
1167-
settings: regcreds
1280+
settings: main
11681281
action: addon-regcreds-config
11691282
loadingText: Setting up...
11701283
successText: DockerHub registry user credentials have been successfully set!

0 commit comments

Comments
 (0)