// 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) { cloudStack.uiCustom.healthCheck = function(args) { // Place outer args here as local variables // i.e, -- var dataProvider = args.dataProvider return function(args) { if (args.context.multiRules == undefined) { //LB rule is not created yet cloudStack.dialog.notice({ message: _l('Health Check can only be configured on a created LB rule') }); return; } var formData = args.formData; var forms = $.extend(true, {}, args.forms); var topFieldForm, bottomFieldForm, $topFieldForm, $bottomFieldForm; var topfields = forms.topFields; var $healthCheckDesc = $('
Your load balancer will automatically perform health checks on your cloudstack instances and only route traffic to instances that pass the health check
').addClass('health-check-description'); var $healthCheckConfigTitle = $('


Configuration Options :
').addClass('health-check-config-title'); var $healthCheckAdvancedTitle = $('


Advanced Options :
').addClass('health-check-advanced-title'); var $healthCheckDialog = $('
').addClass('health-check'); $healthCheckDialog.append($healthCheckDesc); $healthCheckDialog.append($healthCheckConfigTitle); var $loadingOnDialog = $('
').addClass('loading-overlay'); var policyObj = null; var pingpath1 = '/'; var responsetimeout1 = '2'; var healthinterval1 = '5'; var healthythreshold1 = '2'; var unhealthythreshold1 = '1'; $.ajax({ url: createURL('listLBHealthCheckPolicies'), data: { lbruleid: args.context.multiRules[0].id }, async: false, success: function(json) { if (json.listlbhealthcheckpoliciesresponse.healthcheckpolicies[0].healthcheckpolicy[0] != undefined) { policyObj = json.listlbhealthcheckpoliciesresponse.healthcheckpolicies[0].healthcheckpolicy[0]; pingpath1 = policyObj.pingpath; //API bug: API doesn't return it responsetimeout1 = policyObj.responsetime; healthinterval1 = policyObj.healthcheckinterval; healthythreshold1 = policyObj.healthcheckthresshold; unhealthythreshold1 = policyObj.unhealthcheckthresshold; } } }); topFieldForm = cloudStack.dialog.createForm({ context: args.context, noDialog: true, // Don't render a dialog, just return $formContainer form: { title: '', fields: { pingpath: { label: 'Ping Path', validation: { required: false }, defaultValue: pingpath1 } } } }); $topFieldForm = topFieldForm.$formContainer; $topFieldForm.appendTo($healthCheckDialog); $healthCheckDialog.append($healthCheckAdvancedTitle); bottomFieldForm = cloudStack.dialog.createForm({ context: args.context, noDialog: true, form: { title: '', fields: { responsetimeout: { label: 'Response Timeout (in sec)', validation: { required: false }, defaultValue: responsetimeout1 }, healthinterval: { label: 'Health Check Interval (in sec)', validation: { required: false }, defaultValue: healthinterval1 }, healthythreshold: { label: 'Healthy Threshold', validation: { required: false }, defaultValue: healthythreshold1 }, unhealthythreshold: { label: 'Unhealthy Threshold', validation: { required: false }, defaultValue: unhealthythreshold1 } } } }); $bottomFieldForm = bottomFieldForm.$formContainer; $bottomFieldForm.appendTo($healthCheckDialog); var buttons = [{ text: _l('label.cancel'), 'class': 'cancel', click: function() { $healthCheckDialog.dialog('destroy'); $('.overlay').remove(); } }]; if (policyObj == null) { //policy is not created yet buttons.push({ text: _l('Create'), 'class': 'ok', click: function() { $loadingOnDialog.appendTo($healthCheckDialog); var formData = cloudStack.serializeForm($healthCheckDialog.find('form')); var data = { lbruleid: args.context.multiRules[0].id, pingpath: formData.pingpath, responsetimeout: formData.responsetimeout, intervaltime: formData.healthinterval, healthythreshold: formData.healthythreshold, unhealthythreshold: formData.unhealthythreshold }; $.ajax({ url: createURL('createLBHealthCheckPolicy'), data: data, success: function(json) { var jobId = json.createlbhealthcheckpolicyresponse.jobid; var createLBHealthCheckPolicyIntervalId = setInterval(function() { $.ajax({ url: createURL('queryAsyncJobResult'), data: { jobid: jobId }, success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { clearInterval(createLBHealthCheckPolicyIntervalId); if (result.jobstatus == 1) { cloudStack.dialog.notice({ message: _l('Health Check Policy has been created') }); $loadingOnDialog.remove(); $healthCheckDialog.dialog('destroy'); $('.overlay').remove(); } else if (result.jobstatus == 2) { cloudStack.dialog.notice({ message: _s(result.jobresult.errortext) }); $loadingOnDialog.remove(); $healthCheckDialog.dialog('destroy'); $('.overlay').remove(); } } } }); }, g_queryAsyncJobResultInterval); }, error: function(json) { cloudStack.dialog.notice({ message: _s(json.responseText) }); //Error message in the API needs to be improved $healthCheckDialog.dialog('close'); $('.overlay').remove(); } }); } }); } else { //policy exists already buttons.push( //Update Button (begin) - call delete API first, then create API { text: _l('Update'), 'class': 'ok', click: function() { $loadingOnDialog.appendTo($healthCheckDialog); $.ajax({ url: createURL('deleteLBHealthCheckPolicy'), data: { id: policyObj.id }, success: function(json) { var jobId = json.deletelbhealthcheckpolicyresponse.jobid; var deleteLBHealthCheckPolicyIntervalId = setInterval(function() { $.ajax({ url: createURL('queryAsyncJobResult'), data: { jobid: jobId }, success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { clearInterval(deleteLBHealthCheckPolicyIntervalId); if (result.jobstatus == 1) { var formData = cloudStack.serializeForm($healthCheckDialog.find('form')); var data = { lbruleid: args.context.multiRules[0].id, pingpath: formData.pingpath, responsetimeout: formData.responsetimeout, intervaltime: formData.healthinterval, healthythreshold: formData.healthythreshold, unhealthythreshold: formData.unhealthythreshold }; $.ajax({ url: createURL('createLBHealthCheckPolicy'), data: data, success: function(json) { var jobId = json.createlbhealthcheckpolicyresponse.jobid; var createLBHealthCheckPolicyIntervalId = setInterval(function() { $.ajax({ url: createURL('queryAsyncJobResult'), data: { jobid: jobId }, success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { clearInterval(createLBHealthCheckPolicyIntervalId); if (result.jobstatus == 1) { cloudStack.dialog.notice({ message: _l('Health Check Policy has been updated') }); $loadingOnDialog.remove(); $healthCheckDialog.dialog('destroy'); $('.overlay').remove(); } else if (result.jobstatus == 2) { cloudStack.dialog.notice({ message: _s(result.jobresult.errortext) }); $loadingOnDialog.remove(); $healthCheckDialog.dialog('destroy'); $('.overlay').remove(); } } } }); }, g_queryAsyncJobResultInterval); } }); } else if (result.jobstatus == 2) { cloudStack.dialog.notice({ message: _s(result.jobresult.errortext) }); $loadingOnDialog.remove(); $healthCheckDialog.dialog('destroy'); $('.overlay').remove(); } } } }); }, g_queryAsyncJobResultInterval); } }); } } //Update Button (end) , //Delete Button (begin) - call delete API { text: _l('Delete'), 'class': 'delete', click: function() { $loadingOnDialog.appendTo($healthCheckDialog); $.ajax({ url: createURL('deleteLBHealthCheckPolicy'), data: { id: policyObj.id }, success: function(json) { var jobId = json.deletelbhealthcheckpolicyresponse.jobid; var deleteLBHealthCheckPolicyIntervalId = setInterval(function() { $.ajax({ url: createURL('queryAsyncJobResult'), data: { jobid: jobId }, success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { clearInterval(deleteLBHealthCheckPolicyIntervalId); if (result.jobstatus == 1) { cloudStack.dialog.notice({ message: _l('Health Check Policy has been deleted') }); $loadingOnDialog.remove(); $healthCheckDialog.dialog('destroy'); $('.overlay').remove(); } else if (result.jobstatus == 2) { cloudStack.dialog.notice({ message: _s(result.jobresult.errortext) }); $loadingOnDialog.remove(); $healthCheckDialog.dialog('destroy'); $('.overlay').remove(); } } } }); }, g_queryAsyncJobResultInterval); } }); } } //Delete Button (end) ); } $healthCheckDialog.dialog({ title: 'Health Check Wizard', width: 600, height: 600, draggable: true, closeonEscape: false, overflow: 'auto', open: function() { $("button").each(function() { $(this).attr("style", "left: 400px; position: relative; margin-right: 5px; "); }); $('.ui-dialog .delete').css('left', '140px'); }, buttons: buttons }).closest('.ui-dialog').overlay(); } } }(jQuery, cloudStack));