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