Project

General

Profile

Download (4.71 KB) Statistics
| Branch: | Tag: | Revision:

foreman_pipeline / app / controllers / foreman_pipeline / api / jobs_controller.rb @ d667d1b9

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
    # TODO: refactor and remove repetitive methods -> map all set actions onto update
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