1
|
module ForemanPipeline
|
2
|
class Api::JobsController < Katello::Api::V2::ApiController
|
3
|
respond_to :json
|
4
|
|
5
|
include Api::Rendering
|
6
|
|
7
|
before_filter :find_organization, :only => [:create, :index, :add_projects]
|
8
|
|
9
|
before_filter :find_job, :only => [:update, :show, :destroy, :set_content_view,
|
10
|
:set_hostgroup, :set_resource, :available_resources,
|
11
|
:set_jenkins, :set_environment, :run_job,
|
12
|
:add_projects, :remove_projects]
|
13
|
|
14
|
before_filter :load_search_service, :only => [:index]
|
15
|
|
16
|
def index
|
17
|
ids = Job.readable.where(:organization_id => @organization.id).pluck(:id)
|
18
|
filters = [:terms => {:id => ids}]
|
19
|
|
20
|
options = {
|
21
|
:filters => filters,
|
22
|
:load_records? => true
|
23
|
}
|
24
|
respond_for_index(:collection => item_search(Job, params, options))
|
25
|
end
|
26
|
|
27
|
def show
|
28
|
respond_for_show(:resource => @job)
|
29
|
end
|
30
|
|
31
|
def create
|
32
|
@job = Job.new(job_params)
|
33
|
@job.organization = @organization
|
34
|
@job.save!
|
35
|
|
36
|
respond_for_show(:resource => @job)
|
37
|
end
|
38
|
|
39
|
def update
|
40
|
@job.update_attributes!(job_params)
|
41
|
@job.save!
|
42
|
respond_for_show(:resource => @job)
|
43
|
end
|
44
|
|
45
|
def destroy
|
46
|
@job.destroy
|
47
|
respond_for_show(:resource => @job)
|
48
|
end
|
49
|
|
50
|
|
51
|
def set_content_view
|
52
|
@job.content_view = Katello::ContentView.find(params[:content_view_id])
|
53
|
@job.save!
|
54
|
respond_for_show
|
55
|
end
|
56
|
|
57
|
def set_hostgroup
|
58
|
@job.hostgroup = Hostgroup.find(params[:hostgroup_id])
|
59
|
@job.compute_resource = nil
|
60
|
@job.save!
|
61
|
respond_for_show
|
62
|
end
|
63
|
|
64
|
def set_jenkins
|
65
|
instance = JenkinsInstance.find(params[:jenkins_instance_id])
|
66
|
@job.jenkins_instance = instance
|
67
|
@job.save!
|
68
|
respond_for_show
|
69
|
end
|
70
|
|
71
|
def set_environment
|
72
|
@job.environment = Katello::KTEnvironment.find(params[:environment_id])
|
73
|
@job.save!
|
74
|
respond_for_show
|
75
|
end
|
76
|
|
77
|
def set_resource
|
78
|
@job.compute_resource = ComputeResource.find(params[:resource_id])
|
79
|
@job.save!
|
80
|
respond_for_show
|
81
|
end
|
82
|
|
83
|
def available_resources
|
84
|
@compute_resources = @job.hostgroup.compute_profile.compute_attributes.map(&:compute_resource) rescue []
|
85
|
render "api/v2/compute_resources/index"
|
86
|
end
|
87
|
|
88
|
def run_job
|
89
|
if @job.manual_trigger
|
90
|
task = async_task(::Actions::ForemanPipeline::Job::RunJobManually, @job)
|
91
|
render :nothing => true
|
92
|
else
|
93
|
fail ::Katello::HttpErrors::Forbidden, "Running manually not allowed for Job: #{@job.name}. Try setting it's :manual_trigger property."
|
94
|
end
|
95
|
end
|
96
|
|
97
|
def add_projects
|
98
|
rollback = {:occured => false}
|
99
|
Job.transaction do
|
100
|
projects = params[:projects].map do |p|
|
101
|
JenkinsProject.create(:name => p, :organization => @organization)
|
102
|
end
|
103
|
projects_to_add = projects.delete_if { |p| @job.jenkins_projects.include? p }
|
104
|
@job.jenkins_projects = @job.jenkins_projects + projects_to_add
|
105
|
@job.save!
|
106
|
|
107
|
projects_to_add.each do |project|
|
108
|
project.reload
|
109
|
task = sync_task(::Actions::ForemanPipeline::Jenkins::GetBuildParams, :job_id => @job.id, :name => project.name)
|
110
|
|
111
|
unless task.output[:build_params]
|
112
|
raise ActiveRecord::Rollback
|
113
|
rollback[:occured] = true
|
114
|
rollback[:project_name] = project.name
|
115
|
end
|
116
|
task.output[:build_params].each do |param|
|
117
|
new_param = JenkinsProjectParam.new(:name => param[:name],
|
118
|
:type => param[:type],
|
119
|
:description => param[:description],
|
120
|
:value => param[:default])
|
121
|
new_param.organization = @organization
|
122
|
new_param.jenkins_project = project
|
123
|
new_param.save!
|
124
|
end
|
125
|
end
|
126
|
end
|
127
|
if rollback[:occured]
|
128
|
fail ::Katello::HttpErrors::NotFound, "Could not retrieve build params for Jenkins project: #{rollback[:project_name]}"
|
129
|
else
|
130
|
respond_for_show
|
131
|
end
|
132
|
end
|
133
|
|
134
|
def remove_projects
|
135
|
ids = params[:project_ids]
|
136
|
jj_projects = JobJenkinsProject.where(:jenkins_project_id => ids)
|
137
|
jj_projects.map(&:destroy)
|
138
|
respond_for_show
|
139
|
end
|
140
|
|
141
|
protected
|
142
|
|
143
|
def find_job
|
144
|
@job = Job.find_by_id(params[:id])
|
145
|
fail ::Katello::HttpErrors::NotFound, "Could not find job with id #{params[:id]}" if @job.nil?
|
146
|
@job
|
147
|
end
|
148
|
|
149
|
def job_params
|
150
|
params.require(:job).permit(:name, :manual_trigger, :sync_trigger, :levelup_trigger, :projects)
|
151
|
end
|
152
|
end
|
153
|
end
|