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

Fixes #24487 - Ansible Variables API #195

Merged
merged 1 commit into from Oct 23, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
68 changes: 68 additions & 0 deletions app/controllers/api/v2/ansible_variables_controller.rb
@@ -0,0 +1,68 @@
# frozen_string_literal: true

module Api
module V2
# API controller for Ansible Variables
class AnsibleVariablesController < ::Api::V2::BaseController
include ::Api::Version2

resource_description do
api_version 'v2'
api_base_url '/ansible/api'
end

before_action :find_resource, :only => [:show, :destroy]
before_action :find_proxy, :only => [:import, :obsolete]
before_action :create_importer, :only => [:import, :obsolete]

api :GET, '/ansible_variables/:id', N_('Show variable')
param :id, :identifier, :required => true
def show; end

api :GET, '/ansible_variables', N_('List Ansible variables')
param_group :search_and_pagination, ::Api::V2::BaseController
def index
@ansible_variables = resource_scope_for_index
end

api :DELETE, '/ansible_variables/:id', N_('Deletes Ansible variable')
param :id, :identifier, :required => true
def destroy
process_response @ansible_variable.destroy
end

api :PUT, '/ansible_variables/import',
N_('Import Ansible variables. This will only import variables '\
'for already existing roles, it will not import any new roles')
param :proxy_id, :identifier, N_('Smart Proxy to import from')
def import
new_variables = @importer.import_variable_names([])[:new]
new_variables.map(&:save)
@imported = new_variables
end

api :PUT, '/ansible_variables/obsolete',
N_('Obsolete Ansible variables. This will only obsolete variables '\
'for already existing roles, it will not delete any old roles')
param :proxy_id, :identifier, N_('Smart Proxy to import from')
def obsolete
old_variables = @importer.import_variable_names([])[:obsolete]
old_variables.map(&:destroy)
@obsoleted = old_variables
end

private

def find_proxy
return nil unless params[:proxy_id]
@proxy = SmartProxy.
authorized(:view_smart_proxies).
find(params[:proxy_id])
end

def create_importer
@importer = ForemanAnsible::VariablesImporter.new(@proxy)
end
end
end
end
5 changes: 5 additions & 0 deletions app/models/ansible_variable.rb
Expand Up @@ -15,4 +15,9 @@ def ansible?
def self.humanize_class_name
'Ansible variable'
end

def editable_by_user?
AnsibleVariable.authorized(:edit_external_parameters).
where(:id => id).exists?
end
end
3 changes: 3 additions & 0 deletions app/views/api/v2/ansible_variables/import.json.rabl
@@ -0,0 +1,3 @@
collection @imported => :imported

extends 'api/v2/ansible_variables/show'
3 changes: 3 additions & 0 deletions app/views/api/v2/ansible_variables/index.json.rabl
@@ -0,0 +1,3 @@
collection @ansible_variables

extends 'api/v2/ansible_variables/show'
3 changes: 3 additions & 0 deletions app/views/api/v2/ansible_variables/obsolete.json.rabl
@@ -0,0 +1,3 @@
collection @obsoleted => :obsoleted

extends 'api/v2/ansible_variables/show'
20 changes: 20 additions & 0 deletions app/views/api/v2/ansible_variables/show.json.rabl
@@ -0,0 +1,20 @@
object @ansible_variable

attribute :parameter
attributes :id, :ansible_role, :description, :override, :parameter_type,
:hidden_value?, :omit, :required, :validator_type, :validator_rule,
:merge_overrides, :merge_default, :avoid_duplicates,
:override_value_order, :created_at, :updated_at

node do |ansible_variable|
{
:override_values => partial(
'api/v2/override_values/index',
:object => ansible_variable.lookup_values
)
}
end

node :override_values_count do |lk|
lk.lookup_values.count
end
7 changes: 7 additions & 0 deletions config/routes.rb
Expand Up @@ -68,6 +68,13 @@
put :obsolete
end
end

resources :ansible_variables, :only => [:show, :index, :destroy] do
collection do
put :import
put :obsolete
end
end
end
end
end
Expand Down
15 changes: 12 additions & 3 deletions lib/foreman_ansible/register.rb
Expand Up @@ -28,16 +28,25 @@
:'api/v2/ansible_roles' => [:import] },
:resource_type => 'AnsibleRole'
permission :view_ansible_variables,
{ :ansible_variables => [:index, :auto_complete_search] },
{
:ansible_variables => [:index, :auto_complete_search],
:'api/v2/ansible_variables' => [:index, :show]
},
:resource_type => 'AnsibleVariable'
permission :edit_ansible_variables,
{ :ansible_variables => [:edit, :update] },
:resource_type => 'AnsibleVariable'
permission :destroy_ansible_variables,
{ :ansible_variables => [:destroy] },
{
:ansible_variables => [:destroy],
:'api/v2/ansible_variables' => [:destroy, :obsolete]
},
:resource_type => 'AnsibleVariable'
permission :import_ansible_variables,
{ :ansible_variables => [:import, :confirm_import] },
{
:ansible_variables => [:import, :confirm_import],
:'api/v2/ansible_variables' => [:import]
},
:resource_type => 'AnsibleVariable'
end

Expand Down
41 changes: 41 additions & 0 deletions test/functional/api/v2/ansible_variables_controller_test.rb
@@ -0,0 +1,41 @@
# frozen_string_literal: true

require 'test_plugin_helper'

module Api
module V2
# Tests for the controller to CRUD Ansible Variables
class AnsibleVariablesControllerTest < ActionController::TestCase
setup do
@variable = FactoryBot.create(:ansible_variable)
end

test 'should get index' do
get :index, :session => set_session_user
response = JSON.parse(@response.body)
refute_empty response['results']
assert_response :success
end

test 'should destroy' do
delete :destroy,
:params => { :id => @variable.id },
:session => set_session_user
assert_response :ok
refute AnsibleVariable.exists?(@variable.id)
end

test 'should import' do
put :import,
:session => set_session_user
assert_response :success
end

test 'should obsolete' do
put :obsolete,
:session => set_session_user
assert_response :success
end
end
end
end