Skip to content

Commit ab6d0f1

Browse files
committed
K8S-505 select version for cluster upgrade
1 parent 6fb0604 commit ab6d0f1

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
@@ -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

Comments
 (0)