ManageIQ/manageiq-ui-classic

View on GitHub
app/javascript/angular/miq_ae_class/ae_method_form_controller.js

Summary

Maintainability
D
2 days
Test Coverage
ManageIQ.angular.app.controller('aeMethodFormController', aeMethodFormController);
aeMethodFormController.$inject = ['$http', '$scope', 'aeMethodFormId', 'currentRegion', 'miqService', 'playbookReusableCodeMixin', 'location', 'API'];

function aeMethodFormController($http, $scope, aeMethodFormId, currentRegion, miqService, playbookReusableCodeMixin, location, API) {
  var vm = this;
  var init = function() {
    vm.aeMethodModel = {
      name: '',
      display_name: '',
      location: '',
      namespace_path: '',
      class_id: '',
      language: '',
      scope: '',
      key: '',
      key_value: '',
      key_type: 'string',
      available_datatypes: '',
      managers: [],
      manager: null,
      ansible_templates: [],
      ansible_template: {},
      provisioning_repository_id: '',
      provisioning_playbook_id: '',
      provisioning_machine_credential_id: '',
      provisioning_network_credential_id: '',
      provisioning_cloud_credential_id: '',
      provisioning_vault_credential_id: '',
      provisioning_key: '',
      provisioning_value: '',
      provisioning_type: 'string',
      provisioning_inputs: [],
      provisioning_verbosity: '0',
      provisioning_editMode: false,
      provisioning_become_enabled: false,
      provisioning_execution_ttl: '',
      provisioning_inventory: 'localhost',
      provisioning_log_output: 'on_error',
    };
    vm.verbosity_types = playbookReusableCodeMixin.getVerbosityTypes();
    vm.log_output_types = playbookReusableCodeMixin.getLogOutputTypes();
    vm.provisioning_cloud_type = '';
    vm.currentRegion = currentRegion;
    vm.formId = aeMethodFormId;
    vm.afterGet = false;
    vm.model = 'aeMethodModel';
    vm.inventory_mode = 'localhost';

    ManageIQ.angular.scope = $scope;

    $http.get('/miq_ae_class/method_form_fields/' + aeMethodFormId + '?location=' + location)
      .then(getMethodFormData)
      .catch(miqService.handleFailure);
    vm.saveable = miqService.saveable;
    vm.newRecord = aeMethodFormId === 'new';
  };

  function getMethodFormData(response) {
    var data = response.data;
    vm.aeMethodModel.name = data.name;
    vm.aeMethodModel.display_name = data.display_name;
    vm.aeMethodModel.namespace_path = data.namespace_path;
    vm.aeMethodModel.location = data.location;
    vm.aeMethodModel.location_fancy_name = data.location_fancy_name;
    vm.aeMethodModel.class_id = data.class_id;
    vm.aeMethodModel.language = data.language;
    vm.aeMethodModel.scope = data.scope;
    vm.aeMethodModel.available_datatypes = data.available_datatypes;
    playbookReusableCodeMixin.formOptions(vm);
    playbookReusableCodeMixin.formCloudCredentials(vm, data.config_info.cloud_credential_id, null);
    getConfigInfo(data.config_info);

    vm.aeMethodModel.managers = data.managers;
    vm.aeMethodModel.manager = _.find(data.managers, function(m) {
      return m.id === data.manager_id;
    });
    $scope.managerChanged().then(function() {
      vm.aeMethodModel.ansible_template = _.find(vm.aeMethodModel.ansible_templates, function(m) {
        return m.id === data.config_info.ansible_template_id;
      });

      vm.modelCopy = angular.copy(vm.aeMethodModel);
    });
  }

  var getConfigInfo = function(configData) {
    vm.aeMethodModel.provisioning_repository_id = configData.repository_id;
    vm.aeMethodModel.provisioning_playbook_id = configData.playbook_id;
    vm.aeMethodModel.provisioning_machine_credential_id = configData.credential_id;
    vm.aeMethodModel.provisioning_network_credential_id = configData.network_credential_id;
    vm.aeMethodModel.provisioning_vault_credential_id = configData.vault_credential_id;
    vm.aeMethodModel.provisioning_cloud_credential_id = playbookReusableCodeMixin.setIfDefined(configData.cloud_credential_id);
    vm.aeMethodModel.provisioning_become_enabled = configData.become_enabled === true;
    vm.aeMethodModel.provisioning_key = '';
    vm.aeMethodModel.provisioning_value = '';
    vm.aeMethodModel.provisioning_execution_ttl = configData.execution_ttl;
    vm.aeMethodModel.provisioning_inventory = configData.hosts;
    if (configData.hosts !== 'localhost') {
      vm.inventory_mode = 'specify';
    }
    vm.aeMethodModel.provisioning_log_output = configData.log_output;

    if (configData.verbosity === undefined || configData.verbosity === '') {
      vm.aeMethodModel.provisioning_verbosity = '0';
    } else {
      vm.aeMethodModel.provisioning_verbosity = configData.verbosity;
    }
    setExtraVars('provisioning_inputs', configData.extra_vars);
  };

  var setExtraVars = function(variableName, extraVars) {
    if (extraVars) {
      vm.aeMethodModel[variableName] = [];
      extraVars.forEach(function(arrayItem) {
        var inputVars = [arrayItem.name, arrayItem.default_value, arrayItem.datatype, arrayItem.id];
        vm.aeMethodModel[variableName].push(inputVars);
      });
    }
    playbookReusableCodeMixin.checkFormPristine(vm.aeMethodModel, vm.modelCopy, $scope.angularForm);
  };

  vm.resetClicked = function() {
    vm.aeMethodModel = angular.copy(vm.modelCopy);
    playbookReusableCodeMixin.formOptions(vm);
    playbookReusableCodeMixin.cloudCredentialsList(vm, vm.aeMethodModel.provisioning_cloud_credential_id);
    playbookReusableCodeMixin.checkFormDataRetrieval(vm);
    $scope.angularForm.$setUntouched(true);
    $scope.angularForm.$setPristine(true);
    miqService.miqFlash('warn', __('All changes have been reset'));
  };

  var methodEditButtonClicked = function(buttonName) {
    miqService.sparkleOn();
    var url = '/miq_ae_class/add_update_method/' + aeMethodFormId + '?button=' + buttonName;
    miqService.miqAjaxButton(url, setConfigInfo(vm.aeMethodModel, vm.modelCopy));
  };

  vm.cancelClicked = function() {
    methodEditButtonClicked('cancel');
    $scope.angularForm.$setPristine(true);
  };

  vm.saveClicked = function() {
    methodEditButtonClicked('save');
  };

  vm.addClicked = function() {
    methodEditButtonClicked('add');
  };

  var setConfigInfo = function(configData) {
    var method = {
      name: configData.name,
      display_name: configData.display_name,
      class_id: configData.class_id,
      language: configData.language,
      scope: configData.scope,
      location: configData.location,
      manager_id: configData.manager && configData.manager.id,
      ansible_template_id: configData.ansible_template && configData.ansible_template.id,
      repository_id: configData.provisioning_repository_id,
      playbook_id: configData.provisioning_playbook_id,
      credential_id: configData.provisioning_machine_credential_id,
      vault_credential_id: configData.provisioning_vault_credential_id,
      verbosity: configData.provisioning_verbosity,
      become_enabled: configData.provisioning_become_enabled,
      execution_ttl: configData.provisioning_execution_ttl,
      log_output: configData.provisioning_log_output,
      hosts: configData.provisioning_inventory,
      extra_vars: configData.provisioning_inputs,
    };
    if (configData.provisioning_network_credential_id !== '') {
      method.network_credential_id = configData.provisioning_network_credential_id;
    }

    if (configData.provisioning_cloud_credential_id !== '') {
      method.cloud_credential_id = configData.provisioning_cloud_credential_id;
    }
    return method;
  };

  $scope.managerChanged = function() {
    const manager = $scope.vm.aeMethodModel.manager;
    if (! manager) {
      return Promise.resolve();
    }

    const klass = $scope.vm.aeMethodModel.location === 'ansible_job_template' ?
      'ManageIQ::Providers::AnsibleTower::AutomationManager::ConfigurationScript' :
      'ManageIQ::Providers::AnsibleTower::AutomationManager::ConfigurationWorkflow';

    return API.get(`/api/configuration_scripts?expand=resources&collection_class=${klass}&filter[]=manager_id=${manager.id}&sort_by=name&sort_order=asc`)
      .then(function(data) {
        $scope.vm.aeMethodModel.ansible_templates = data.resources;
      })
      .catch(miqService.handleFailure);
  };

  $scope.$watch('vm._provisioning_repository', function(value) {
    if (value) {
      playbookReusableCodeMixin.repositoryChanged(vm, 'provisioning', value.id);
    } else {
      vm.aeMethodModel.provisioning_repository_id = '';
    }
    playbookReusableCodeMixin.checkFormPristine(vm.aeMethodModel, vm.modelCopy, $scope.angularForm);
  });

  $scope.$watch('vm.aeMethodModel.key_type', function(value) {
    if (value && vm.aeMethodModel.key_type === vm.aeMethodModel.original_key_type) {
      vm.aeMethodModel.key_value = '';
    }
    playbookReusableCodeMixin.checkFormPristine(vm.aeMethodModel, vm.modelCopy, $scope.angularForm);
  });

  $scope.$watch('vm.aeMethodModel.provisioning_type', function(value) {
    if (value) {
      vm.aeMethodModel.provisioning_value = '';
    }
    playbookReusableCodeMixin.checkFormPristine(vm.aeMethodModel, vm.modelCopy, $scope.angularForm);
  });

  vm.fieldsRequired = function(prefix) {
    return prefix === 'provisioning';
  };

  $scope.$watch('vm._provisioning_cloud_type', function(value) {
    playbookReusableCodeMixin.cloudTypeChanged(vm, 'provisioning', value);
    playbookReusableCodeMixin.checkFormPristine(vm.aeMethodModel, vm.modelCopy, $scope.angularForm);
  });

  vm.addKeyValue = function() {
    var valid = validateInputName(vm.aeMethodModel.provisioning_key, 0, 'add');
    if (!valid) {
      return miqService.miqFlash('error', __('Inputs name must be unique'));
    }
    vm.aeMethodModel.provisioning_inputs.push(
      [vm.aeMethodModel.provisioning_key, vm.aeMethodModel.provisioning_value, vm.aeMethodModel.provisioning_type]);
    vm.aeMethodModel.provisioning_key = '';
    vm.aeMethodModel.provisioning_value = '';
    vm.aeMethodModel.provisioning_type = 'string';
    return true;
  };

  vm.provisioning_repository_selected = function() {
    return vm.aeMethodModel.provisioning_repository_id !== '';
  };

  vm.removeKeyValue = function(index) {
    vm.aeMethodModel.provisioning_inputs.splice(index, 1);
    playbookReusableCodeMixin.checkFormPristine(vm.aeMethodModel, vm.modelCopy, $scope.angularForm);
  };

  vm.editKeyValue = function(key, keyValue, keyType, index) {
    vm.aeMethodModel.provisioning_editMode = true;
    vm.aeMethodModel.s_index = index;
    vm.aeMethodModel.key = key;
    vm.aeMethodModel.key_value = keyValue;
    vm.aeMethodModel.key_type = keyType;
    vm.aeMethodModel.original_key = key;
    vm.aeMethodModel.original_key_value = keyValue;
    vm.aeMethodModel.original_key_type = keyType;
  };

  vm.cancelKeyValue = function(index) {
    vm.aeMethodModel.provisioning_editMode = false;
    vm.aeMethodModel.s_index = '';
    vm.aeMethodModel.provisioning_inputs[index][0] = vm.aeMethodModel.original_key;
    vm.aeMethodModel.provisioning_inputs[index][1] = vm.aeMethodModel.original_key_value;
    vm.aeMethodModel.provisioning_inputs[index][2] = vm.aeMethodModel.original_key_type;
  };

  vm.saveKeyValue = function(index) {
    var valid = validateInputName(vm.aeMethodModel.key, index, 'edit');
    if (!valid) {
      return miqService.miqFlash('error', __('Input Name must be unique'));
    }
    vm.aeMethodModel.provisioning_editMode = false;
    vm.aeMethodModel.s_index = '';
    vm.aeMethodModel.provisioning_inputs[index][0] = vm.aeMethodModel.key;
    vm.aeMethodModel.provisioning_inputs[index][1] = vm.aeMethodModel.key_value;
    vm.aeMethodModel.provisioning_inputs[index][2] = vm.aeMethodModel.key_type;
    return true;
  };

  var validateInputName = function(inputName, index, type) {
    var valid = true;
    vm.aeMethodModel.provisioning_inputs.forEach(function(input, i) {
      // validate input name if input name is changed for current input parameter
      // or when new one is being added
      if ((type === 'add' && input[0] === inputName) || (type === 'edit' && index !== i && input[0] === inputName)) {
        valid = false;
      }
    });
    return valid;
  };

  // watch for all the drop downs on screen
  'provisioning_playbook provisioning_machine_credential provisioning_vault_credential provisioning_network_credential provisioning_cloud_credential'.split(' ').forEach(idWatch);

  function idWatch(name) {
    var fieldName = 'vm._' + name;
    $scope.$watch(fieldName, function(value) {
      vm.aeMethodModel[name + '_id'] = value ? value.id : '';
      playbookReusableCodeMixin.checkFormPristine(vm.aeMethodModel, vm.modelCopy, $scope.angularForm);
    });
  }

  init();
}