// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. (function (cloudStack) { var rootCaCert = ""; var downloadCaCert = function() { var blob = new Blob([rootCaCert], {type: 'application/x-x509-ca-cert'}); var filename = "cloudstack-ca.pem"; if(window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveBlob(blob, filename); } else{ var elem = window.document.createElement('a'); elem.href = window.URL.createObjectURL(blob); elem.download = filename; document.body.appendChild(elem) elem.click(); document.body.removeChild(elem); } }; var clusterKubeConfig = ""; var downloadClusterKubeConfig = function() { var blob = new Blob([clusterKubeConfig], {type: 'text/plain'}); var filename = "kube.conf"; if(window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveBlob(blob, filename); } else{ var elem = window.document.createElement('a'); elem.href = window.URL.createObjectURL(blob); elem.download = filename; document.body.appendChild(elem) elem.click(); document.body.removeChild(elem); } }; var minCpu = 0; var minRamSize = 0; cloudStack.plugins.cks = function(plugin) { plugin.ui.addSection({ id: 'cks', title: 'label.kubernetes.service', preFilter: function(args) { var pluginEnabled = false; $.ajax({ url: createURL('listCapabilities'), async: false, success: function(json) { pluginEnabled = json.listcapabilitiesresponse.capability.kubernetesserviceenabled; }, error: function(XMLHttpResponse) { pluginEnabled = false; } }); return pluginEnabled; }, showOnNavigation: true, sectionSelect: { label: 'label.select-view', preFilter: function() { return ['kubernetesclusters', 'kubernetesversions']; } }, sections: { kubernetesclusters: { id: 'kubernetesclusters', type: 'select', title: "label.clusters", listView: { filters: { all: { label: 'ui.listView.filters.all' }, running: { label: 'state.Running' }, stopped: { label: 'state.Stopped' }, destroyed: { label: 'state.Destroyed' } }, fields: { name: { label: 'label.name' }, zonename: { label: 'label.zone.name' }, size : { label: 'label.size' }, cpunumber: { label: 'label.num.cpu.cores' }, memory: { label: 'label.memory.mb' }, state: { label: 'label.state', indicator: { 'Running': 'on', 'Stopped': 'off', 'Destroyed': 'off', 'Error': 'off' } } }, advSearchFields: { name: { label: 'label.name' }, zoneid: { label: 'label.zone', select: function(args) { $.ajax({ url: createURL('listZones'), data: { listAll: true }, success: function(json) { var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : []; args.response.success({ data: $.map(zones, function(zone) { return { id: zone.id, description: zone.name }; }) }); } }); } }, }, // List view actions actions: { add: { label: 'label.add.kubernetes.cluster', createForm: { title: 'label.add.kubernetes.cluster', preFilter: function(args) { args.$form.find('.form-item[rel=masternodes]').find('input[name=masternodes]').val('2'); args.$form.find('.form-item[rel=size]').find('input[name=size]').val('1'); var experimentalFeaturesEnabled = false; $.ajax({ url: createURL('listCapabilities'), async: false, success: function(json) { experimentalFeaturesEnabled = json.listcapabilitiesresponse.capability.kubernetesclusterexperimentalfeaturesenabled; } }); if (experimentalFeaturesEnabled == true) { args.$form.find('.form-item[rel=supportPrivateRegistry]').css('display', 'inline-block'); } }, fields: { name: { label: 'label.name', //docID: 'Name of the cluster', validation: { required: true } }, description: { label: 'label.description', //docID: 'helpKubernetesClusterDesc', validation: { required: true } }, zone: { label: 'label.zone', //docID: 'helpKubernetesClusterZone', validation: { required: true }, select: function(args) { $.ajax({ url: createURL("listZones&available=true"), dataType: "json", async: true, success: function(json) { var items = []; var zoneObjs = json.listzonesresponse.zone; if (zoneObjs != null) { for (var i = 0; i < zoneObjs.length; i++) { items.push({ id: zoneObjs[i].id, description: zoneObjs[i].name }); } } args.response.success({ data: items }); } }); } }, kubernetesversion: { label: 'label.kubernetes.version', dependsOn: ['zone'], //docID: 'helpKubernetesClusterZone', validation: { required: true }, select: function(args) { var versionObjs; var filterData = { zoneid: args.zone }; $.ajax({ url: createURL("listKubernetesSupportedVersions"), data: filterData, dataType: "json", async: true, success: function(json) { var items = []; versionObjs = json.listkubernetessupportedversionsresponse.kubernetessupportedversion; if (versionObjs != null) { for (var i = 0; i < versionObjs.length; i++) { if (versionObjs[i].state == 'Enabled' && versionObjs[i].isostate == 'Ready') { items.push({ id: versionObjs[i].id, description: versionObjs[i].name }); } } } args.response.success({ data: items }); } }); args.$select.change(function() { var $form = $(this).closest("form"); $form.find('.form-item[rel=multimaster]').find('input[name=multimaster]').prop('checked', false); $form.find('.form-item[rel=multimaster]').hide(); $form.find('.form-item[rel=masternodes]').hide(); var currentVersionId = $(this).val(); if (currentVersionId != null && versionObjs != null) { for (var i = 0; i < versionObjs.length; i++) { if (currentVersionId == versionObjs[i].id) { if (versionObjs[i].supportsha === true) { $form.find('.form-item[rel=multimaster]').css('display', 'inline-block'); } minCpu = 0; if (versionObjs[i].mincpunumber != null && versionObjs[i].mincpunumber != undefined) { minCpu = versionObjs[i].mincpunumber; } minRamSize = 0; if (versionObjs[i].minmemory != null && versionObjs[i].minmemory != undefined) { minRamSize = versionObjs[i].minmemory; } break; } } } }); } }, serviceoffering: { label: 'label.menu.service.offerings', dependsOn: ['kubernetesversion'], //docID: 'helpKubernetesClusterServiceOffering', validation: { required: true }, select: function(args) { $.ajax({ url: createURL("listServiceOfferings"), dataType: "json", async: true, success: function(json) { var offeringObjs = []; var items = json.listserviceofferingsresponse.serviceoffering; if (items != null) { for (var i = 0; i < items.length; i++) { if (items[i].iscustomized == false && items[i].cpunumber >= minCpu && items[i].memory >= minRamSize) { offeringObjs.push({ id: items[i].id, description: items[i].name }); } } } args.response.success({ data: offeringObjs }); } }); } }, noderootdisksize: { label: 'label.node.root.disk.size.gb', //docID: 'helpKubernetesClusterNodeRootDiskSize', validation: { number: true } }, network: { label: 'label.network', //docID: 'helpKubernetesClusterNetwork', select: function(args) { $.ajax({ url: createURL("listNetworks"), dataType: "json", async: true, success: function(json) { var networkObjs = []; networkObjs.push({ id: "", description: "" }); var items = json.listnetworksresponse.network; if (items != null) { for (var i = 0; i < items.length; i++) { networkObjs.push({ id: items[i].id, description: items[i].name }); } } args.response.success({ data: networkObjs }); } }); } }, multimaster: { label: "label.ha.enabled", dependsOn: 'kubernetesversion', isBoolean: true, isChecked: false, }, masternodes: { label: 'label.master.nodes', //docID: 'helpKubernetesClusterSize', validation: { required: true, multiplecountnumber: true }, dependsOn: "multimaster", isHidden: true, }, externalloadbalanceripaddress: { label: 'label.external.loadbalancer.ip.address', validation: { ipv4AndIpv6AddressValidator: true }, dependsOn: "multimaster", isHidden: true, }, size: { label: 'label.cluster.size.worker.nodes', //docID: 'helpKubernetesClusterSize', validation: { required: true, naturalnumber: true }, }, sshkeypair: { label: 'label.ssh.key.pair', //docID: 'helpKubernetesClusterSSH', select: function(args) { $.ajax({ url: createURL("listSSHKeyPairs"), dataType: "json", async: true, success: function(json) { var keypairObjs = []; keypairObjs.push({ id: "", description: "" }); var items = json.listsshkeypairsresponse.sshkeypair; if (items != null) { for (var i = 0; i < items.length; i++) { keypairObjs.push({ id: items[i].name, description: items[i].name }); } } args.response.success({ data: keypairObjs }); } }); } }, supportPrivateRegistry: { label: 'label.private.registry', isBoolean: true, isChecked: false, isHidden: true }, username: { label: 'label.username', dependsOn: 'supportPrivateRegistry', validation: { required: true }, isHidden: true }, password: { label: 'label.password', dependsOn: 'supportPrivateRegistry', validation: { required: true }, isHidden: true, isPassword: true }, url: { label: 'label.url', dependsOn: 'supportPrivateRegistry', validation: { required: true }, isHidden: true, }, email: { label: 'label.email', dependsOn: 'supportPrivateRegistry', validation: { required: true }, isHidden: true, } } }, action: function(args) { var data = { name: args.data.name, description: args.data.description, zoneid: args.data.zone, kubernetesversionid: args.data.kubernetesversion, serviceofferingid: args.data.serviceoffering, size: args.data.size, keypair: args.data.sshkeypair }; if (args.data.noderootdisksize != null && args.data.noderootdisksize != "" && args.data.noderootdisksize > 0) { $.extend(data, { noderootdisksize: args.data.noderootdisksize }); } var masterNodes = 1; if (args.data.multimaster === 'on') { masterNodes = args.data.masternodes; if (args.data.externalloadbalanceripaddress != null && args.data.externalloadbalanceripaddress != "") { $.extend(data, { externalloadbalanceripaddress: args.data.externalloadbalanceripaddress }); } } $.extend(data, { masternodes: masterNodes }); if (args.data.supportPrivateRegistry) { $.extend(data, { dockerregistryusername: args.data.username, dockerregistrypassword: args.data.password, dockerregistryurl: args.data.url, dockerregistryemail: args.data.email }); } if (args.data.network != null && args.data.network.length > 0) { $.extend(data, { networkid: args.data.network }); } $.ajax({ url: createURL('createKubernetesCluster'), data: data, success: function(json) { var jid = json.createkubernetesclusterresponse.jobid; args.response.success({ _custom: { jobId: jid } }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); args.response.error(errorMsg); } }); }, messages: { notification: function(args) { return 'Kubernetes Cluster Add'; } }, notification: { poll: pollAsyncJobResult } } }, dataProvider: function(args) { var data = { page: args.page, pagesize: pageSize }; listViewDataProvider(args, data); if (args.filterBy != null) { //filter dropdown if (args.filterBy.kind != null) { switch (args.filterBy.kind) { case "all": break; case "running": $.extend(data, { state: 'Running' }); break; case "stopped": $.extend(data, { state: 'Stopped' }); break; case "destroyed": $.extend(data, { state: 'Destroyed' }); break; } } } $.ajax({ url: createURL("listKubernetesClusters"), data: data, dataType: "json", sync: true, success: function(json) { var items = []; if (json.listkubernetesclustersresponse.kubernetescluster != null) { items = json.listkubernetesclustersresponse.kubernetescluster; } args.response.success({ actionFilter: cksActionfilter, data: items }); } }); }, detailView: { name: 'label.kubernetes.cluster.details', isMaximized: true, actions: { start: { label: 'label.start.kuberentes.cluster', action: function(args) { $.ajax({ url: createURL("startKubernetesCluster"), data: {"id": args.context.kubernetesclusters[0].id}, dataType: "json", async: true, success: function(json) { var jid = json.startkubernetesclusterresponse.jobid; args.response.success({ _custom: { jobId: jid } }); } }); }, messages: { confirm: function(args) { return 'message.confirm.start.kubernetes.cluster'; }, notification: function(args) { return 'Started Kubernetes cluster.'; } }, notification: { poll: pollAsyncJobResult } }, stop: { label: 'label.stop.kuberentes.cluster', action: function(args) { $.ajax({ url: createURL("stopKubernetesCluster"), data: {"id": args.context.kubernetesclusters[0].id}, dataType: "json", async: true, success: function(json) { var jid = json.stopkubernetesclusterresponse.jobid; args.response.success({ _custom: { jobId: jid } }); } }); }, messages: { confirm: function(args) { return 'message.confirm.stop.kubernetes.cluster'; }, notification: function(args) { return 'Stopped Kubernetes cluster.'; } }, notification: { poll: pollAsyncJobResult } }, destroy: { label: 'label.destroy.kubernetes.cluster', compactLabel: 'label.destroy', createForm: { title: 'label.destroy.kubernetes.cluster', desc: 'label.destroy.kubernetes.cluster', isWarning: true, fields: { } }, messages: { confirm: function(args) { return 'message.confirm.destroy.kubernetes.cluster'; }, notification: function(args) { return 'Destroyed Kubernetes cluster.'; } }, action: function(args) { var data = { id: args.context.kubernetesclusters[0].id }; $.ajax({ url: createURL('deleteKubernetesCluster'), data: data, dataType: "json", async: true, success: function(json) { args.response.success({ _custom: { jobId: json.deletekubernetesclusterresponse.jobid, getUpdatedItem: function(json) { return { 'toRemove': true }; } } }); } }); }, notification: { poll: pollAsyncJobResult } }, downloadKubernetesClusterKubeConfig: { label: 'label.download.kubernetes.cluster.config', messages: { notification: function(args) { return 'label.download.kubernetes.cluster.config'; } }, action: function(args) { var data = { id: args.context.kubernetesclusters[0].id } $.ajax({ url: createURL("getKubernetesClusterConfig"), dataType: "json", data: data, async: false, success: function(json) { var jsonObj; if (json.getkubernetesclusterconfigresponse.clusterconfig != null && json.getkubernetesclusterconfigresponse.clusterconfig.configdata != null ) { jsonObj = json.getkubernetesclusterconfigresponse.clusterconfig; clusterKubeConfig = jsonObj.configdata; downloadClusterKubeConfig(); args.response.success({}); } else { args.response.error("Unable to retrieve Kubernetes cluster config"); } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); args.response.error(errorMsg); } }); }, notification: { poll: function(args) { args.complete(); } } }, scaleKubernetesCluster: { label: 'label.scale.kubernetes.cluster', messages: { notification: function(args) { return 'label.scale.kubernetes.cluster'; } }, createForm: { title: 'label.scale.kubernetes.cluster', desc: '', preFilter: function(args) { var options = args.$form.find('.form-item[rel=serviceoffering]').find('option'); $.each(options, function(optionIndex, option) { if ($(option).val() === args.context.kubernetesclusters[0].serviceofferingid) { $(option).attr('selected','selected'); } }); args.$form.find('.form-item[rel=size]').find('input[name=size]').val(args.context.kubernetesclusters[0].size); }, fields: { serviceoffering: { label: 'label.menu.service.offerings', //docID: 'helpKubernetesClusterServiceOffering', validation: { required: true }, select: function(args) { $.ajax({ url: createURL("listKubernetesSupportedVersions"), data: {id: args.context.kubernetesclusters[0].kubernetesversionid}, dataType: "json", async: false, success: function(json) { var versionObjs = json.listkubernetessupportedversionsresponse.kubernetessupportedversion; if (versionObjs != null && versionObjs.length > 0) { minCpu = 0; if (versionObjs[0].mincpunumber != null && versionObjs[0].mincpunumber != undefined) { minCpu = versionObjs[0].mincpunumber; } minRamSize = 0; if (versionObjs[0].minmemory != null && versionObjs[0].minmemory != undefined) { minRamSize = versionObjs[0].minmemory; } } } }); $.ajax({ url: createURL("listServiceOfferings"), dataType: "json", async: true, success: function(json) { var offeringObjs = []; var items = json.listserviceofferingsresponse.serviceoffering; if (items != null) { for (var i = 0; i < items.length; i++) { if (items[i].iscustomized == false && items[i].cpunumber >= minCpu && items[i].memory >= minRamSize) { offeringObjs.push({ id: items[i].id, description: items[i].name }); } } } args.response.success({ data: offeringObjs }); } }); } }, size: { label: 'label.cluster.size', //docID: 'helpKubernetesClusterSize', validation: { required: true, number: true }, } } }, action: function(args) { var data = { id: args.context.kubernetesclusters[0].id, serviceofferingid: args.data.serviceoffering, size: args.data.size }; $.ajax({ url: createURL('scaleKubernetesCluster'), data: data, dataType: "json", success: function (json) { var jid = json.scalekubernetesclusterresponse.jobid; args.response.success({ _custom: { jobId: jid, getActionFilter: function() { return cksActionfilter; } } }); } }); //end ajax }, notification: { poll: pollAsyncJobResult } }, upgradeKubernetesCluster: { label: 'label.upgrade.kubernetes.cluster', messages: { notification: function(args) { return 'label.upgrade.kubernetes.cluster'; } }, createForm: { title: 'label.upgrade.kubernetes.cluster', desc: '', preFilter: function(args) {}, fields: { kubernetesversion: { label: 'label.kubernetes.version', //docID: 'helpKubernetesClusterZone', validation: { required: true }, select: function(args) { var filterData = { minimumkubernetesversionid: args.context.kubernetesclusters[0].kubernetesversionid }; $.ajax({ url: createURL("listKubernetesSupportedVersions"), data: filterData, dataType: "json", async: true, success: function(json) { var items = []; var versionObjs = json.listkubernetessupportedversionsresponse.kubernetessupportedversion; if (versionObjs != null) { var clusterVersion = null; for (var j = 0; j < versionObjs.length; j++) { if (versionObjs[j].id == args.context.kubernetesclusters[0].kubernetesversionid) { clusterVersion = versionObjs[j]; break; } } for (var i = 0; i < versionObjs.length; i++) { if (versionObjs[i].id != args.context.kubernetesclusters[0].kubernetesversionid && (clusterVersion == null || (clusterVersion != null && versionObjs[i].semanticversion != clusterVersion.semanticversion)) && versionObjs[i].state == 'Enabled' && versionObjs[i].isostate == 'Ready') { items.push({ id: versionObjs[i].id, description: versionObjs[i].name }); } } } args.response.success({ data: items }); } }); } }, } }, action: function(args) { var data = { id: args.context.kubernetesclusters[0].id, kubernetesversionid: args.data.kubernetesversion }; $.ajax({ url: createURL('upgradeKubernetesCluster'), data: data, dataType: "json", success: function (json) { var jid = json.upgradekubernetesclusterresponse.jobid; args.response.success({ _custom: { jobId: jid, getActionFilter: function() { return cksActionfilter; } } }); } }); //end ajax }, notification: { poll: pollAsyncJobResult } }, }, tabs: { // Details tab details: { title: 'label.details', fields: [{ id: { label: 'label.id' }, name: { label: 'label.name' }, zonename: { label: 'label.zone.name' }, kubernetesversionname: { label: 'label.kubernetes.version' }, masternodes : { label: 'label.master.nodes' }, size : { label: 'label.cluster.size' }, cpunumber: { label: 'label.num.cpu.cores' }, memory: { label: 'label.memory.mb' }, state: { label: 'label.state', }, serviceofferingname: { label: 'label.compute.offering' }, associatednetworkname: { label: 'label.network' }, keypair: { label: 'label.ssh.key.pair' } }], dataProvider: function(args) { $.ajax({ url: createURL("listKubernetesClusters&id=" + args.context.kubernetesclusters[0].id), dataType: "json", async: true, success: function(json) { var jsonObj; if (json.listkubernetesclustersresponse.kubernetescluster != null && json.listkubernetesclustersresponse.kubernetescluster.length > 0) { jsonObj = json.listkubernetesclustersresponse.kubernetescluster[0]; } args.response.success({ actionFilter: cksActionfilter, data: jsonObj }); } }); } }, clusteraccess: { title: 'label.access', custom : function (args) { var showAccess = function() { var state = args.context.kubernetesclusters[0].state; if (state == "Created") { // Created return jQuery('

').html("Kubernetes cluster setup is under progress, please check again in few minutes."); } else if (state == "Error") { // Error return jQuery('

').html("Kubernetes cluster is in error state, it cannot be accessed."); } else if (state == "Destroying") { // Destroying return jQuery('

').html("Kubernetes cluster is in destroying state, it cannot be accessed."); } else if (state == "Destroyed") { // Destroyed return jQuery('

').html("Kubernetes cluster is already destroyed, it cannot be accessed."); } var data = { id: args.context.kubernetesclusters[0].kubernetesversionid } var version = ''; $.ajax({ url: createURL("listKubernetesSupportedVersions"), dataType: "json", data: data, async: false, success: function(json) { var jsonObj; if (json.listkubernetessupportedversionsresponse.kubernetessupportedversion != null) { version = json.listkubernetessupportedversionsresponse.kubernetessupportedversion[0].semanticversion; } } }); return jQuery('

').html("Access Kubernetes cluster

Download cluster's kubeconfig file using action from Details tab.
Download kubectl tool for cluster's Kubernetes version from,
Linux: https://storage.googleapis.com/kubernetes-release/release/v" + version + "/bin/linux/amd64/kubectl
MacOS: https://storage.googleapis.com/kubernetes-release/release/v" + version + "/bin/darwin/amd64/kubectl
Windows: https://storage.googleapis.com/kubernetes-release/release/v" + version + "/bin/windows/amd64/kubectl.exe

Using kubectl and kubeconfig file to access cluster
kubectl --kubeconfig /custom/path/kube.conf {COMMAND}

List pods
kubectl --kubeconfig /custom/path/kube.conf get pods --all-namespaces
List nodes
kubectl --kubeconfig /custom/path/kube.conf get nodes --all-namespaces
List services
kubectl --kubeconfig /custom/path/kube.conf get services --all-namespaces

Access dashboard web UI
Run proxy locally
kubectl --kubeconfig /custom/path/kube.conf proxy
Open URL in browser
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

Token for dashboard login can be retrieved using following command
kubectl --kubeconfig /custom/path/kube.conf describe secret $(kubectl --kubeconfig /custom/path/kube.conf get secrets -n kubernetes-dashboard | grep kubernetes-dashboard-token | awk '{print $1}') -n kubernetes-dashboard

More about accessing dashboard UI, https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/#accessing-the-dashboard-ui"); }; return showAccess(); } }, clusterinstances: { title: 'label.instances', listView: { section: 'clusterinstances', preFilter: function(args) { var hiddenFields = []; if (!isAdmin()) { hiddenFields.push('instancename'); } return hiddenFields; }, fields: { name: { label: 'label.name', truncate: true }, instancename: { label: 'label.internal.name' }, displayname: { label: 'label.display.name', truncate: true }, ipaddress: { label: 'label.ip.address' }, zonename: { label: 'label.zone.name' }, state: { label: 'label.state', indicator: { 'Running': 'on', 'Stopped': 'off', 'Destroyed': 'off', 'Error': 'off' } } }, dataProvider: function(args) { var data = {}; listViewDataProvider(args, data); $.ajax({ url: createURL("listKubernetesClusters"), data: {"id": args.context.kubernetesclusters[0].id}, success: function(json) { var items = json.listkubernetesclustersresponse.kubernetescluster; var vmlist = []; $.each(items, function(idx, item) { if ("virtualmachineids" in item) { vmlist = vmlist.concat(item.virtualmachineids); } }); $.extend(data, { ids: vmlist.join() }); if (items && items.length > 0 && items[0].projectid != null && items[0].projectid != undefined && items[0].projectid.length > 0) { $.extend(data, { projectid: items[0].projectid }); } if (data.ids.length == 0) { args.response.success({ data: [] }); } else { $.ajax({ url: createURL('listVirtualMachines'), data: data, success: function(json) { var items = json.listvirtualmachinesresponse.virtualmachine; if (items) { $.each(items, function(idx, vm) { if (vm.nic && vm.nic.length > 0 && vm.nic[0].ipaddress) { items[idx].ipaddress = vm.nic[0].ipaddress; } }); } args.response.success({ data: items }); }, error: function(XMLHttpResponse) { cloudStack.dialog.notice({ message: parseXMLHttpResponse(XMLHttpResponse) }); args.response.error(); } }); } } }); }, } }, firewall: { title: 'label.firewall', custom: function(args) { var data = { id: args.context.kubernetesclusters[0].networkid, listAll: true } if (args.context.kubernetesclusters[0].projectid != null && args.context.kubernetesclusters[0].projectid != undefined && args.context.kubernetesclusters[0].projectid.length > 0) { $.extend(data, { projectid: args.context.kubernetesclusters[0].projectid }); $.extend(args.context, {"projectid": args.context.kubernetesclusters[0].projectid}); } $.ajax({ url: createURL('listNetworks'), data: data, async: false, dataType: "json", success: function(json) { var network = json.listnetworksresponse.network; $.extend(args.context, {"networks": [network]}); } }); data = { associatedNetworkId: args.context.kubernetesclusters[0].networkid, listAll: true, forvirtualnetwork: true } if (args.context.kubernetesclusters[0].projectid != null && args.context.kubernetesclusters[0].projectid != undefined && args.context.kubernetesclusters[0].projectid.length > 0) { $.extend(data, { projectid: args.context.kubernetesclusters[0].projectid }); } $.ajax({ url: createURL('listPublicIpAddresses'), data: data, async: false, dataType: "json", success: function(json) { var ips = json.listpublicipaddressesresponse.publicipaddress; var fwip = ips[0]; $.each(ips, function(idx, ip) { if (ip.issourcenat || ip.isstaticnat) { fwip = ip; return false; } }); $.extend(args.context, {"ipAddresses": [fwip]}); } }); return cloudStack.sections.network.sections.ipAddresses.listView.detailView.tabs.ipRules.custom(args); }, }, } } } }, kubernetesversions: { id: 'kubernetesversions', type: 'select', title: "label.versions", listView: { fields: { name: { label: 'label.name' }, semanticversion: { label: 'label.kubernetes.version' }, zonename: { label: 'label.zone.name' }, isoname: { label: 'label.iso.name' }, isostate: { label: 'label.iso.state' }, mincpunumber: { label: 'label.min.cpu.cores' }, minmemory: { label: 'label.memory.minimum.mb' }, state: { label: 'label.state', indicator: { 'Enabled': 'on', 'Disabled': 'off' } } }, advSearchFields: { name: { label: 'label.name' }, zoneid: { label: 'label.zone', select: function(args) { $.ajax({ url: createURL('listZones'), data: { listAll: true }, success: function(json) { var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : []; args.response.success({ data: $.map(zones, function(zone) { return { id: zone.id, description: zone.name }; }) }); } }); } }, }, // List view actions actions: { add: { label: 'label.add.kubernetes.version', preFilter: function(args) { return isAdmin(); }, createForm: { title: 'label.add.kubernetes.version', preFilter: cloudStack.preFilter.createTemplate, fields: { version: { label: 'label.semantic.version', //docID: 'Name of the cluster', validation: { required: true } }, name: { label: 'label.name', //docID: 'Name of the cluster', }, zone: { label: 'label.zone', //docID: 'helpKubernetesClusterZone', validation: { required: true }, select: function(args) { $.ajax({ url: createURL("listZones&available=true"), dataType: "json", async: true, success: function(json) { var items = []; var zoneObjs = json.listzonesresponse.zone; if (zoneObjs != null) { for (var i = 0; i < zoneObjs.length; i++) { items.push({ id: zoneObjs[i].id, description: zoneObjs[i].name }); } } items.sort(function(a, b) { return a.description.localeCompare(b.description); }); items.unshift({ id: -1, description: 'label.all.zones' }); args.response.success({ data: items }); } }); } }, isourl: { label: 'label.url', //docID: 'Name of the cluster', validation: { required: true } }, isochecksum: { label: 'label.checksum', //docID: 'Name of the cluster', }, mincpunumber: { label: 'label.min.cpu.cores', validation: { required: true, number: true }, }, minmemory: { label: 'label.memory.minimum.mb', validation: { required: true, number: true } } } }, action: function(args) { var data = { name: args.data.name, semanticversion: args.data.version, url: args.data.isourl, checksum: args.data.isochecksum }; if (args.data.zone != null && args.data.zone != -1) { $.extend(data, { zoneid: args.data.zone }); } if (args.data.mincpunumber != null && args.data.mincpunumber != "" && args.data.mincpunumber > 0) { $.extend(data, { mincpunumber: args.data.mincpunumber }); } if (args.data.minmemory != null && args.data.minmemory != "" && args.data.minmemory > 0) { $.extend(data, { minmemory: args.data.minmemory }); } $.ajax({ url: createURL('addKubernetesSupportedVersion'), data: data, success: function(json) { var version = json.addkubernetessupportedversionresponse.kubernetessupportedversion; args.response.success({ data: version }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); args.response.error(errorMsg); } }); }, messages: { notification: function(args) { return 'Kubernetes Supported Version Add'; } } } }, dataProvider: function(args) { var data = { page: args.page, pagesize: pageSize }; listViewDataProvider(args, data); $.ajax({ url: createURL("listKubernetesSupportedVersions"), data: data, dataType: "json", sync: true, success: function(json) { var items = []; if (json.listkubernetessupportedversionsresponse.kubernetessupportedversion != null) { items = json.listkubernetessupportedversionsresponse.kubernetessupportedversion; } args.response.success({ data: items }); } }); }, detailView: { name: 'label.kubernetes.version.details', isMaximized: true, actions: { update: { label: 'label.edit', messages: { notification: function(args) { return 'label.update.kubernetes.version'; } }, createForm: { title: 'label.update.kubernetes.version', desc: '', preFilter: function(args) { var formVersion = args.context.kubernetesversions[0]; $.ajax({ url: createURL('listKubernetesSupportedVersions'), data: { id: args.context.kubernetesversions[0].id }, dataType: "json", async: false, success: function (json) { if (json.listkubernetessupportedversionsresponse.kubernetessupportedversion != null && json.listkubernetessupportedversionsresponse.kubernetessupportedversion.length > 0) { formVersion = json.listkubernetessupportedversionsresponse.kubernetessupportedversion[0]; } } }); if (formVersion.state != null) { var options = args.$form.find('.form-item[rel=state]').find('option'); $.each(options, function(optionIndex, option) { if ($(option).val() === formVersion.state) { $(option).attr('selected','selected'); } }); } }, fields: { state: { label: 'label.state', //docID: 'helpKubernetesClusterZone', validation: { required: true }, select: function(args) { var items = []; items.push({ id: 'Enabled', description: 'state.Enabled' }, { id: 'Disabled', description: 'state.Disabled' }); args.response.success({ data: items }); } }, } }, action: function(args) { var data = { id: args.context.kubernetesversions[0].id, state: args.data.state }; $.ajax({ url: createURL('updateKubernetesSupportedVersion'), data: data, dataType: "json", success: function (json) { var jsonObj; if (json.updatekubernetessupportedversionresponse.kubernetessupportedversion != null) { jsonObj = json.updatekubernetessupportedversionresponse.kubernetessupportedversion; } args.response.success({ data: jsonObj }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); args.response.error(errorMsg); } }); //end ajax } }, destroy: { label: 'label.delete.kubernetes.version', compactLabel: 'label.delete', preFilter: function(args) { return isAdmin(); }, createForm: { title: 'label.delete.kubernetes.version', desc: 'label.delete.kubernetes.version', isWarning: true, fields: {} }, messages: { confirm: function(args) { return 'message.confirm.delete.kubernetes.version'; }, notification: function(args) { return 'Deleted Kubernetes version.'; } }, action: function(args) { var data = { id: args.context.kubernetesversions[0].id }; $.ajax({ url: createURL('deleteKubernetesSupportedVersion'), data: data, dataType: "json", async: true, success: function(json) { args.response.success({ _custom: { jobId: json.deletekubernetessupportedversionresponse.jobid, getUpdatedItem: function(json) { return { 'toRemove': true }; } } }); } }); }, notification: { poll: pollAsyncJobResult } } }, tabs: { // Details tab details: { title: 'label.details', fields: [{ id: { label: 'label.id' }, name: { label: 'label.name' }, zonename: { label: 'label.zone.name' }, isoid: { label: 'label.iso.id' }, isoname: { label: 'label.iso.name' }, isostate: { label: 'label.iso.name' } }], dataProvider: function(args) { $.ajax({ url: createURL("listKubernetesSupportedVersions&id=" + args.context.kubernetesversions[0].id), dataType: "json", async: true, success: function(json) { var jsonObj; if (json.listkubernetessupportedversionsresponse.kubernetessupportedversion != null && json.listkubernetessupportedversionsresponse.kubernetessupportedversion.length > 0) { jsonObj = json.listkubernetessupportedversionsresponse.kubernetessupportedversion[0]; } args.response.success({ data: jsonObj }); } }); } } } } } }, } }); }; var cksActionfilter = cloudStack.actionFilter.cksActionfilter = function(args) { var jsonObj = args.context.item; var allowedActions = []; if (jsonObj.state != "Destroyed" && jsonObj.state != "Destroying") { if (jsonObj.state == "Stopped") { allowedActions.push("start"); } else { allowedActions.push("downloadKubernetesClusterKubeConfig"); allowedActions.push("stop"); } if (jsonObj.state == "Created" || jsonObj.state == "Running") { allowedActions.push("scaleKubernetesCluster"); allowedActions.push("upgradeKubernetesCluster"); } allowedActions.push("destroy"); } return allowedActions; } }(cloudStack));