Skip to content

Commit

Permalink
Merge pull request #5166 from ZitaNemeckova/add_ansible_to_GOD
Browse files Browse the repository at this point in the history
Add Ansible related inputs to GOD haml
  • Loading branch information
himdel authored Jun 21, 2019
2 parents 5c66951 + 285c611 commit 655f798
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 69 deletions.
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 @@ -136,6 +136,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
34 changes: 34 additions & 0 deletions app/views/static/generic_object/main_custom_button_form.html.haml
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 @@ -1988,6 +1988,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

0 comments on commit 655f798

Please sign in to comment.