| // 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 = $('<div>Your load balancer will automatically perform health checks on your cloudstack instances and only route traffic to instances that pass the health check </div>').addClass('health-check-description'); |
| var $healthCheckConfigTitle = $('<div><br><br>Configuration Options :</div>').addClass('health-check-config-title'); |
| var $healthCheckAdvancedTitle = $('<div><br><br> Advanced Options : </div>').addClass('health-check-advanced-title'); |
| |
| var $healthCheckDialog = $('<div>').addClass('health-check'); |
| $healthCheckDialog.append($healthCheckDesc); |
| $healthCheckDialog.append($healthCheckConfigTitle); |
| var $loadingOnDialog = $('<div>').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)); |
| |
| |