Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Ansible related inputs to GOD haml #5166

Merged
merged 8 commits into from
Jun 21, 2019
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,6 @@ mainCustomButtonFormController.$inject = ['API', 'miqService', '$q', '$http'];
function mainCustomButtonFormController(API, miqService, $q, $http) {
var vm = this;

var optionsPromise = null;
var serviceDialogsPromise = null;
var rolesPromise = null;
var instancesPromise = null;

vm.$onInit = function() {
vm.entity = __('Custom Button');
vm.saveable = miqService.saveable;
Expand Down Expand Up @@ -47,11 +42,14 @@ function mainCustomButtonFormController(API, miqService, $q, $http) {
attributeValuesTableChanged: false,
current_visibility: 'all',
available_roles: [],
uri_attributes: {"request": "", service_template: null, hosts: null},
};

vm.dialogs = [];
vm.button_types = [];
vm.ae_instances = [];
vm.templates = [];
vm.inventory = 'localhost';

vm.attributeValueTableHeaders = [__('Name'), __('Value'), __('Actions')];

Expand All @@ -72,35 +70,55 @@ function mainCustomButtonFormController(API, miqService, $q, $http) {
];

miqService.sparkleOn();
optionsPromise = API.options('/api/custom_buttons')
.then(getCustomButtonOptions)
.catch(miqService.handleFailure);

serviceDialogsPromise = API.get('/api/service_dialogs?expand=resources&attributes=label')
.then(getServiceDialogs)
.catch(miqService.handleFailure);

rolesPromise = API.get('/api/roles?expand=resources&attributes=name')
.then(getRoles)
.catch(miqService.handleFailure);

instancesPromise = $http.get('/generic_object_definition/retrieve_distinct_instances_across_domains')
.then(getDistinctInstancesAcrossDomains)
.catch(miqService.handleFailure);

var optionsPromise = API.options('/api/custom_buttons')
.then(function(response) {
_.forEach(response.data.custom_button_types, function(name, id) {
vm.button_types.push({id: id, name: name});
});
});
var dataPromise;
if (vm.customButtonRecordId) {
vm.newRecord = false;
miqService.sparkleOn();
var dataPromise = API.get('/api/custom_buttons/' + vm.customButtonRecordId + '?attributes=resource_action')
dataPromise = API.get('/api/custom_buttons/' + vm.customButtonRecordId + '?attributes=resource_action,uri_attributes')
.then(getCustomButtonFormData)
.catch(miqService.handleFailure);
} else {
vm.newRecord = true;
vm.modelCopy = angular.copy( vm.customButtonModel );
}

$q.all([optionsPromise, serviceDialogsPromise, rolesPromise, instancesPromise, dataPromise])
.then(promisesResolvedForLoad);
var serviceDialogsPromise = API.get('/api/service_dialogs?expand=resources&attributes=label')
.then(function(response) {
_.forEach(response.resources, function(item) {
vm.dialogs.push({id: item.id, label: item.label});
});
});

var rolesPromise = API.get('/api/roles?expand=resources&attributes=name')
.then(function(response) {
_.forEach(response.resources, function(item) {
vm.customButtonModel.available_roles.push({name: item.name, value: false});
});
});

var instancesPromise = $http.get('/generic_object_definition/retrieve_distinct_instances_across_domains')
.then(function(response) {
_.forEach(response.data.distinct_instances_across_domains, function(item) {
vm.ae_instances.push({id: item, name: item});
});
});

var serviceTemplateAnsiblePlaybooks = $http.get('/generic_object_definition/service_template_ansible_playbooks')
.then(function(response) {
vm.templates = response.data.templates;
});

$q.all([optionsPromise, dataPromise, serviceDialogsPromise, rolesPromise, instancesPromise, serviceTemplateAnsiblePlaybooks])
.then(function() {
vm.afterGet = true;
miqService.sparkleOff();
})
.catch(miqService.handleFailure);
};

vm.cancelClicked = function() {
Expand Down Expand Up @@ -187,6 +205,10 @@ function mainCustomButtonFormController(API, miqService, $q, $http) {
return role.value === true;
}), 'name');
}
// set uri_attributes to default for non-Ansible button
if (vm.customButtonModel.button_type == "default") {
vm.customButtonModel.uri_attributes = {"request": "", service_template: null, hosts: null};
};

vm.customButtonModel.visibility = {
roles: vm.customButtonModel.roles.length === 0 ? ['_ALL_'] : vm.customButtonModel.roles,
Expand All @@ -200,6 +222,7 @@ function mainCustomButtonFormController(API, miqService, $q, $http) {
options: vm.customButtonModel.options,
resource_action: vm.customButtonModel.resource_action,
visibility: vm.customButtonModel.visibility,
uri_attributes: vm.customButtonModel.uri_attributes,
};
};

Expand Down Expand Up @@ -243,23 +266,30 @@ function mainCustomButtonFormController(API, miqService, $q, $http) {

vm.genericObjectDefinitionRecordId = response.applies_to_id;

optionsPromise.then(function() {
if (vm.customButtonModel.current_visibility === 'role') {
_.forEach(vm.customButtonModel.available_roles, function(role, index) {
if (_.includes(response.visibility.roles, role.name)) {
vm.customButtonModel.available_roles[index].value = true;
}
});
}
vm.customButtonModel.uri_attributes = response.uri_attributes;

if (vm.customButtonModel.current_visibility === 'role') {
_.forEach(vm.customButtonModel.available_roles, function(role, index) {
if (_.includes(response.visibility.roles, role.name)) {
vm.customButtonModel.available_roles[index].value = true;
}
});
}

delete vm.customButtonModel.resource_action.ae_attributes.request;
vm.customButtonModel.noOfAttributeValueRows = assignObjectToKeyValueArrays(
vm.customButtonModel.resource_action.ae_attributes,
vm.customButtonModel.attribute_names,
vm.customButtonModel.attribute_values);
delete vm.customButtonModel.resource_action.ae_attributes.request;
vm.customButtonModel.noOfAttributeValueRows = assignObjectToKeyValueArrays(
vm.customButtonModel.resource_action.ae_attributes,
vm.customButtonModel.attribute_names,
vm.customButtonModel.attribute_values);

vm.modelCopy = angular.element.extend(true, {}, vm.customButtonModel);
});
if (!vm.customButtonModel.uri_attributes.hosts || vm.customButtonModel.uri_attributes.hosts === "localhost") {
vm.inventory = "localhost";
} else if (vm.customButtonModel.uri_attributes.hosts === "vmdb_object") {
vm.inventory = "vmdb_object";
} else {
vm.inventory = "manual";
}
vm.modelCopy = angular.element.extend(true, {}, vm.customButtonModel);
}

function assignAllObjectsToKeyValueArrays(purge) {
Expand Down Expand Up @@ -291,33 +321,4 @@ function mainCustomButtonFormController(API, miqService, $q, $http) {
}
return _.size(keyArray);
}

function getCustomButtonOptions(response) {
_.forEach(response.data.custom_button_types, function(name, id) {
vm.button_types.push({id: id, name: name});
});
}

function getServiceDialogs(response) {
_.forEach(response.resources, function(item) {
vm.dialogs.push({id: item.id, label: item.label});
});
}

function getRoles(response) {
_.forEach(response.resources, function(item) {
vm.customButtonModel.available_roles.push({name: item.name, value: false});
});
}

function getDistinctInstancesAcrossDomains(response) {
_.forEach(response.data.distinct_instances_across_domains, function(item) {
vm.ae_instances.push({id: item, name: item});
});
}

function promisesResolvedForLoad() {
vm.afterGet = true;
miqService.sparkleOff();
}
}
5 changes: 5 additions & 0 deletions app/controllers/generic_object_definition_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,11 @@ def retrieve_distinct_instances_across_domains
render :json => {:distinct_instances_across_domains => distinct_instances_across_domains}
end

def service_template_ansible_playbooks
templates = ServiceTemplateAnsiblePlaybook.order(:name).map { |item| {:name => item.name, :id => item.id} } || []
render :json => {:templates => templates}
end

def add_button_in_group
custom_button_set = CustomButtonSet.find(params[:id])
custom_button_set.set_data[:button_order] ||= []
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,40 @@
= "<#{_('Choose')}>"
%span.help-block{"ng-show" => "angularForm.button_type.$error.required"}
= _("Required")
.form-group{"ng-if" => "vm.customButtonModel.button_type == 'ansible_playbook'",
"ng-class" => "{'has-error': angularForm.playbook_catalog_item.$invalid}"}
%label.control-label.col-md-2
= _("Playbook Catalog Item")
.col-md-8
%select{"name" => "playbook_catalog_item",
"ng-model" => "vm.customButtonModel.uri_attributes.service_template",
"ng-options" => "item.id as item.name for item in vm.templates",
"data-live-search" => "true",
"selectpicker-for-select-tag" => "",
:required => true,
"miq-select" => true,}
%option{"value" => "", "disabled" => ""}
= "<#{_('Choose')}>"
%span.help-block{"ng-show" => "angularForm.playbook_catalog_item.$error.required"}
= _("Required")
.form-group{"ng-if" => "vm.customButtonModel.button_type == 'ansible_playbook'"}
%label.control-label.col-md-2
= _("Inventory")
.col-md-8
%input{:name => "inventory", :type => "radio", :id => "inventory_localhost", :value => "localhost", 'ng-model' => 'vm.inventory'}
= label_tag('inventory_localhost', _("Localhost"), "title" => _('Run on localhost'))
%br
%input{:name => "inventory", :type => "radio", :id => "inventory_event_target", :value => "event_target", 'ng-model' => "vm.inventory"}
= label_tag('inventory_event_target', _("Target Machine"), "title" => _('Run on the target of the Policy Event'))
%br
%input{:name => "inventory",
:type => "radio", :id => "inventory_manual", :value => "manual", 'ng-model' => "vm.inventory"}
= label_tag('inventory_manual', _("Specific Hosts"))
#manual_inventory_div{'ng-if' => "vm.inventory === 'manual'"}
.form-group
.col-md-8
%input{:type => 'text', :maxlength => ViewHelper::MAX_DESC_LEN, "ng-model" => "vm.customButtonModel.uri_attributes.hosts", :class => 'form-control'}
= _('Enter a comma separated list of IP or DNS names')
%custom-button-group-form{"model" => "vm.customButtonModel",
"angular-form" => "angularForm"}
.form-group{"ng-class" => "{'has-error': angularForm.dialog.$invalid}"}
Expand Down
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1981,6 +1981,7 @@
edit
new
retrieve_distinct_instances_across_domains
service_template_ansible_playbooks
show
show_list
tagging_edit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,13 @@ describe('main-custom-button-form', function() {
distinct_instances_across_domains: ["Automation", "Event", "GenericObject", "MiqEvent", "Request", "parse_automation_request", "parse_event_stream", "parse_provider_category"]
}
};
var serviceTemplatesResponse = {
data: {
templates: [{name: "Ansible Catalog Item", id: 0}],
}
};
$httpBackend.whenGET('/generic_object_definition/retrieve_distinct_instances_across_domains').respond(domainsResponse);
$httpBackend.whenGET('/generic_object_definition/service_template_ansible_playbooks').respond(serviceTemplatesResponse);
vm.$onInit();
$httpBackend.flush();
}));
Expand Down