mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-11-04 00:02:37 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			315 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			315 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// 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.lbStickyPolicy = {
 | 
						|
    dialog: function(args) {
 | 
						|
      return function(args) {
 | 
						|
        var success = args.response.success;
 | 
						|
        var context = args.context;
 | 
						|
								
 | 
						|
				var network;
 | 
						|
				if('vpc' in args.context) {	//from VPC section
 | 
						|
					var data = {
 | 
						|
						listAll: true,
 | 
						|
						supportedservices: 'Lb'
 | 
						|
					};
 | 
						|
					if(args.context.ipAddresses[0].associatednetworkid == null) {
 | 
						|
						$.extend(data, {
 | 
						|
							vpcid: args.context.vpc[0].id
 | 
						|
						});
 | 
						|
					}
 | 
						|
					else {
 | 
						|
						$.extend(data, {
 | 
						|
							id: args.context.ipAddresses[0].associatednetworkid
 | 
						|
						});
 | 
						|
					}			
 | 
						|
				
 | 
						|
					$.ajax({
 | 
						|
						url: createURL("listNetworks"),		//check whether the VPC has a network including Lb service													
 | 
						|
						data: data,						
 | 
						|
            async: false,						
 | 
						|
						success: function(json) {	          					
 | 
						|
							var items = json.listnetworksresponse.network;	
 | 
						|
							if(items != null && items.length > 0) {
 | 
						|
                network = items[0];
 | 
						|
              }							
 | 
						|
						}
 | 
						|
					});	 
 | 
						|
				}				
 | 
						|
				else { //from Guest Network section				
 | 
						|
          network = args.context.networks[0];
 | 
						|
				}
 | 
						|
		
 | 
						|
        var $item = args.$item;
 | 
						|
 | 
						|
        var lbService = $.grep(network.service, function(service) {
 | 
						|
          return service.name == 'Lb';
 | 
						|
        })[0];
 | 
						|
       
 | 
						|
        var stickinessCapabilities = JSON.parse($.grep(
 | 
						|
          lbService.capability,
 | 
						|
          function(capability) {
 | 
						|
            return capability.name == 'SupportedStickinessMethods';
 | 
						|
          }
 | 
						|
        )[0].value);
 | 
						|
 | 
						|
        var baseFields = {
 | 
						|
          stickyName: { label: 'Sticky Name', validation: { required: true } }
 | 
						|
        };
 | 
						|
 | 
						|
        $.map(
 | 
						|
          $.map(
 | 
						|
            stickinessCapabilities,
 | 
						|
            function(c) { return c.paramlist; }
 | 
						|
          ),
 | 
						|
          function(p) {
 | 
						|
            baseFields[p.paramname] = {
 | 
						|
              label: _l('label.sticky.' + p.paramname),
 | 
						|
              isHidden: true,
 | 
						|
              isBoolean: p.isflag,
 | 
						|
              validation: { required: p.required }
 | 
						|
            };
 | 
						|
          }
 | 
						|
        );
 | 
						|
 | 
						|
        var conditionalFields = {
 | 
						|
          methodname: {
 | 
						|
            label: 'Stickiness method',
 | 
						|
            select: function(args) {
 | 
						|
              var $select = args.$select;
 | 
						|
              var $form = $select.closest('form');
 | 
						|
              var stickyOptions = [];
 | 
						|
 | 
						|
              stickinessCapabilities.push({ methodname: 'None', paramlist: [] });
 | 
						|
              $(stickinessCapabilities).each(function() {
 | 
						|
                var stickyCapability = this;
 | 
						|
 | 
						|
                stickyOptions.push({
 | 
						|
                  id: stickyCapability.methodname,
 | 
						|
                  description: stickyCapability.methodname
 | 
						|
                });
 | 
						|
              });
 | 
						|
 | 
						|
              stickyOptions = stickyOptions.sort(function() {
 | 
						|
                return this.id != 'None';
 | 
						|
              });
 | 
						|
 | 
						|
              args.response.success({
 | 
						|
                data: stickyOptions
 | 
						|
              }, 500);
 | 
						|
 | 
						|
              $select.change(function() {
 | 
						|
                var value = $select.val();
 | 
						|
                var showFields = [];
 | 
						|
                var targetMethod = $.grep(stickinessCapabilities, function(stickyCapability) {
 | 
						|
                  return stickyCapability.methodname == value;
 | 
						|
                })[0];
 | 
						|
                var visibleParams = $.map(targetMethod.paramlist, function(param) {
 | 
						|
                  return param.paramname;
 | 
						|
                });
 | 
						|
 | 
						|
                $select.closest('.form-item').siblings('.form-item').each(function() {
 | 
						|
                  var $field = $(this);
 | 
						|
                  var id = $field.attr('rel');
 | 
						|
 | 
						|
                  if ($.inArray(id, visibleParams) > -1) {
 | 
						|
                    $field.css('display', 'inline-block');
 | 
						|
                    $field.attr('sticky-method', value);
 | 
						|
                  } else {
 | 
						|
                    $field.hide();
 | 
						|
                    $field.attr('sticky-method', null);
 | 
						|
                  }
 | 
						|
                });
 | 
						|
 | 
						|
                // Name always is required
 | 
						|
                if ($select.val() != 'None') {
 | 
						|
                  $select.closest('.form-item').siblings('.form-item[rel=stickyName]')
 | 
						|
                    .css('display', 'inline-block');
 | 
						|
                }
 | 
						|
 | 
						|
                $select.closest(':ui-dialog').dialog('option', 'position', 'center');
 | 
						|
              });
 | 
						|
            }
 | 
						|
          }
 | 
						|
        };
 | 
						|
 | 
						|
        var fields = $.extend(conditionalFields, baseFields);
 | 
						|
 | 
						|
        if (args.data) {
 | 
						|
          var populatedFields = $.map(fields, function(field, id) {
 | 
						|
            return id;
 | 
						|
          });
 | 
						|
 | 
						|
          $(populatedFields).each(function() {
 | 
						|
            var id = this;
 | 
						|
            var field = fields[id];
 | 
						|
            var dataItem = args.data[id];
 | 
						|
 | 
						|
            if (field.isBoolean) {
 | 
						|
              field.isChecked = dataItem ? true : false;
 | 
						|
            } else {
 | 
						|
              field.defaultValue = dataItem;
 | 
						|
            }
 | 
						|
          });
 | 
						|
        }
 | 
						|
 | 
						|
        cloudStack.dialog.createForm({
 | 
						|
          form: {
 | 
						|
            title: 'Configure Sticky Policy',
 | 
						|
            desc: 'Please complete the following fields',
 | 
						|
            fields: fields
 | 
						|
          },
 | 
						|
          after: function(args) {
 | 
						|
            // Remove fields not applicable to sticky method
 | 
						|
            args.$form.find('.form-item:hidden').remove();
 | 
						|
            
 | 
						|
            var data = cloudStack.serializeForm(args.$form);
 | 
						|
 | 
						|
            /* $item indicates that this is an existing sticky rule;
 | 
						|
               re-create sticky rule with new parameters */
 | 
						|
            if ($item) {
 | 
						|
              var $loading = $('<div>').addClass('loading-overlay');
 | 
						|
 | 
						|
              $loading.prependTo($item);
 | 
						|
              cloudStack.lbStickyPolicy.actions.recreate(
 | 
						|
                $item.data('multi-custom-data').id,
 | 
						|
                $item.data('multi-custom-data').lbRuleID,
 | 
						|
                data,
 | 
						|
                function() { // Complete
 | 
						|
                  $(window).trigger('cloudStack.fullRefresh');
 | 
						|
                },
 | 
						|
                function(error) { // Error
 | 
						|
                  $(window).trigger('cloudStack.fullRefresh');
 | 
						|
                }
 | 
						|
              );
 | 
						|
            } else {
 | 
						|
              success({
 | 
						|
                data: data
 | 
						|
              });
 | 
						|
            }
 | 
						|
          }
 | 
						|
        });
 | 
						|
      };
 | 
						|
    },
 | 
						|
 | 
						|
    actions: {
 | 
						|
      add: function(lbRuleID, data, complete, error) {
 | 
						|
        var stickyURLData = '';
 | 
						|
        var stickyParams = $.map(data, function(value, key) {
 | 
						|
          return key;
 | 
						|
        });
 | 
						|
 | 
						|
        var notParams = ['methodname', 'stickyName'];
 | 
						|
 | 
						|
        var index = 0;
 | 
						|
        $(stickyParams).each(function() {
 | 
						|
          var param = '¶m[' + index + ']';
 | 
						|
          var name = this.toString();
 | 
						|
          var value = data[name];
 | 
						|
 | 
						|
          if (!value || $.inArray(name, notParams) > -1) return true;
 | 
						|
          if (value == 'on') value = true;
 | 
						|
          
 | 
						|
          stickyURLData += param + '.name=' + name + param + '.value=' + value;
 | 
						|
 | 
						|
          index++;
 | 
						|
 | 
						|
          return true;
 | 
						|
        });
 | 
						|
 | 
						|
        $.ajax({
 | 
						|
          url: createURL('createLBStickinessPolicy' + stickyURLData),
 | 
						|
          data: {
 | 
						|
            lbruleid: lbRuleID,
 | 
						|
            name: data.stickyName,
 | 
						|
            methodname: data.methodname
 | 
						|
          },
 | 
						|
          success: function(json) {
 | 
						|
            cloudStack.ui.notifications.add(
 | 
						|
              {
 | 
						|
                desc: 'Add new LB sticky rule',
 | 
						|
                section: 'Network',
 | 
						|
                poll: pollAsyncJobResult,
 | 
						|
                _custom: {
 | 
						|
                  jobId: json.createLBStickinessPolicy.jobid
 | 
						|
                }
 | 
						|
              },
 | 
						|
              complete, {},
 | 
						|
              error, {}
 | 
						|
            );
 | 
						|
          },
 | 
						|
          error: function(json) {
 | 
						|
            complete();
 | 
						|
            cloudStack.dialog.notice({ message: parseXMLHttpResponse(json) });
 | 
						|
          }
 | 
						|
        });
 | 
						|
      },
 | 
						|
      recreate: function(stickyRuleID, lbRuleID, data, complete, error) {
 | 
						|
        var addStickyPolicy = function() {
 | 
						|
          cloudStack.lbStickyPolicy.actions.add(
 | 
						|
            lbRuleID,
 | 
						|
            data,
 | 
						|
            complete,
 | 
						|
            error
 | 
						|
          );
 | 
						|
        };
 | 
						|
        
 | 
						|
        // Delete existing rule
 | 
						|
        if (stickyRuleID) {
 | 
						|
          $.ajax({
 | 
						|
            url: createURL('deleteLBStickinessPolicy'),
 | 
						|
            data: {
 | 
						|
              id: stickyRuleID
 | 
						|
            },
 | 
						|
            success: function(json) {
 | 
						|
              cloudStack.ui.notifications.add(
 | 
						|
                {
 | 
						|
                  desc: 'Remove previous LB sticky rule',
 | 
						|
                  section: 'Network',
 | 
						|
                  poll: pollAsyncJobResult,
 | 
						|
                  _custom: {
 | 
						|
                    jobId: json.deleteLBstickinessrruleresponse.jobid
 | 
						|
                  }
 | 
						|
                },
 | 
						|
                function() {
 | 
						|
                  if (data.methodname != 'None') {
 | 
						|
                    addStickyPolicy();
 | 
						|
                  } else {
 | 
						|
                    complete();
 | 
						|
                  }
 | 
						|
                }, {},
 | 
						|
                error, {}
 | 
						|
              );
 | 
						|
            },
 | 
						|
            error: function(json) {
 | 
						|
              cloudStack.dialog.notice({
 | 
						|
                message: parseXMLHttpResponse(json)
 | 
						|
              });
 | 
						|
              error();
 | 
						|
            }
 | 
						|
          });
 | 
						|
        } else if (data.methodname != 'None') {
 | 
						|
          addStickyPolicy();
 | 
						|
        } else {
 | 
						|
          complete();
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  };
 | 
						|
}(jQuery, cloudStack));
 |