foreman_pipeline 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. checksums.yaml +15 -0
  2. data/LICENSE +674 -0
  3. data/README.md +36 -0
  4. data/Rakefile +40 -0
  5. data/app/assets/javascripts/foreman_pipeline/foreman_pipeline-bootstrap.js +8 -0
  6. data/app/assets/javascripts/foreman_pipeline/foreman_pipeline.js +20 -0
  7. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/details/jenkins-instance-details-info.controller.js +46 -0
  8. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/details/jenkins-instance-details-users.controller.js +72 -0
  9. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/details/jenkins-instance-details.controller.js +40 -0
  10. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/details/views/jenkins-instance-details-info.html +36 -0
  11. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/details/views/jenkins-instance-details-users.html +107 -0
  12. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/details/views/jenkins-instance-details.html +53 -0
  13. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/jenkins-instances.controller.js +34 -0
  14. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/jenkins-instances.factory.js +14 -0
  15. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/jenkins-instances.module.js +93 -0
  16. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/new/new-jenkins-instance.controller.js +40 -0
  17. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/new/views/new-jenkins-instance-form.html +50 -0
  18. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/new/views/new-jenkins-instance.html +16 -0
  19. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/views/jenkins-instances-table-collapsed.html +20 -0
  20. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/views/jenkins-instances-table-full.html +30 -0
  21. data/app/assets/javascripts/foreman_pipeline/jenkins-instances/views/jenkins-instances.html +17 -0
  22. data/app/assets/javascripts/foreman_pipeline/jenkins-project-params/jenkins-project-params.factory.js +11 -0
  23. data/app/assets/javascripts/foreman_pipeline/jenkins-project-params/jenkins-project-params.module.js +6 -0
  24. data/app/assets/javascripts/foreman_pipeline/jenkins-projects/jenkins-projects.factory.js +9 -0
  25. data/app/assets/javascripts/foreman_pipeline/jenkins-projects/jenkins-projects.module.js +10 -0
  26. data/app/assets/javascripts/foreman_pipeline/jenkins-requests/jenkins-requests.factory.js +11 -0
  27. data/app/assets/javascripts/foreman_pipeline/jenkins-requests/jenkins-requests.module.js +10 -0
  28. data/app/assets/javascripts/foreman_pipeline/jenkins-users/details/jenkins-user-info.controller.js +39 -0
  29. data/app/assets/javascripts/foreman_pipeline/jenkins-users/details/views/jenkins-user-info.html +37 -0
  30. data/app/assets/javascripts/foreman_pipeline/jenkins-users/jenkins-users.factory.js +10 -0
  31. data/app/assets/javascripts/foreman_pipeline/jenkins-users/jenkins-users.module.js +6 -0
  32. data/app/assets/javascripts/foreman_pipeline/jenkins-users/new/new-jenkins-user.controller.js +45 -0
  33. data/app/assets/javascripts/foreman_pipeline/jenkins-users/new/views/new-jenkins-user.html +32 -0
  34. data/app/assets/javascripts/foreman_pipeline/jobs/details/job-details-add-paths.controller.js +63 -0
  35. data/app/assets/javascripts/foreman_pipeline/jobs/details/job-details-content-views.controller.js +55 -0
  36. data/app/assets/javascripts/foreman_pipeline/jobs/details/job-details-environments.controller.js +56 -0
  37. data/app/assets/javascripts/foreman_pipeline/jobs/details/job-details-hostgroups.controller.js +59 -0
  38. data/app/assets/javascripts/foreman_pipeline/jobs/details/job-details-info.controller.js +69 -0
  39. data/app/assets/javascripts/foreman_pipeline/jobs/details/job-details-jenkins-projects.controller.js +49 -0
  40. data/app/assets/javascripts/foreman_pipeline/jobs/details/job-details-jenkins.controller.js +56 -0
  41. data/app/assets/javascripts/foreman_pipeline/jobs/details/job-details-resources.controller.js +60 -0
  42. data/app/assets/javascripts/foreman_pipeline/jobs/details/job-details-to-environments.controller.js +157 -0
  43. data/app/assets/javascripts/foreman_pipeline/jobs/details/job-details.controller.js +34 -0
  44. data/app/assets/javascripts/foreman_pipeline/jobs/details/project-discovery/job-projects-discovery.controller.js +96 -0
  45. data/app/assets/javascripts/foreman_pipeline/jobs/details/project-discovery/job-projects-parameters.controller.js +54 -0
  46. data/app/assets/javascripts/foreman_pipeline/jobs/details/project-discovery/views/job-jenkins-projects.html +1 -0
  47. data/app/assets/javascripts/foreman_pipeline/jobs/details/project-discovery/views/job-projects-discovery.html +91 -0
  48. data/app/assets/javascripts/foreman_pipeline/jobs/details/project-discovery/views/job-projects-parameters.html +77 -0
  49. data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details-content-views.html +83 -0
  50. data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details-environments.html +50 -0
  51. data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details-hostgroups.html +81 -0
  52. data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details-info.html +117 -0
  53. data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details-jenkins-projects.html +75 -0
  54. data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details-jenkins.html +88 -0
  55. data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details-paths-list.html +72 -0
  56. data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details-resources.html +86 -0
  57. data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details-to-environments.html +51 -0
  58. data/app/assets/javascripts/foreman_pipeline/jobs/details/views/job-details.html +80 -0
  59. data/app/assets/javascripts/foreman_pipeline/jobs/jobs.controller.js +40 -0
  60. data/app/assets/javascripts/foreman_pipeline/jobs/jobs.factory.js +54 -0
  61. data/app/assets/javascripts/foreman_pipeline/jobs/jobs.module.js +142 -0
  62. data/app/assets/javascripts/foreman_pipeline/jobs/new/new-job.controller.js +31 -0
  63. data/app/assets/javascripts/foreman_pipeline/jobs/new/views/new-job-form.html +47 -0
  64. data/app/assets/javascripts/foreman_pipeline/jobs/new/views/new-job.html +17 -0
  65. data/app/assets/javascripts/foreman_pipeline/jobs/views/jobs-table-collapsed.html +20 -0
  66. data/app/assets/javascripts/foreman_pipeline/jobs/views/jobs-table-full.html +66 -0
  67. data/app/assets/javascripts/foreman_pipeline/jobs/views/jobs.html +19 -0
  68. data/app/assets/javascripts/foreman_pipeline/jobs/views/pln-path-selector.html +10 -0
  69. data/app/assets/stylesheets/foreman_pipeline/foreman_pipeline.css +13 -0
  70. data/app/controllers/foreman_pipeline/api/jenkins_instances_controller.rb +124 -0
  71. data/app/controllers/foreman_pipeline/api/jenkins_project_params_controller.rb +34 -0
  72. data/app/controllers/foreman_pipeline/api/jenkins_projects_controller.rb +29 -0
  73. data/app/controllers/foreman_pipeline/api/jenkins_requests_controller.rb +28 -0
  74. data/app/controllers/foreman_pipeline/api/jenkins_users_controller.rb +89 -0
  75. data/app/controllers/foreman_pipeline/api/jobs_controller.rb +271 -0
  76. data/app/controllers/foreman_pipeline/application_controller.rb +4 -0
  77. data/app/helpers/foreman_pipeline/application_helper.rb +4 -0
  78. data/app/lib/actions/foreman_pipeline/jenkins/abstract_jenkins_action.rb +20 -0
  79. data/app/lib/actions/foreman_pipeline/jenkins/build.rb +35 -0
  80. data/app/lib/actions/foreman_pipeline/jenkins/build_project.rb +31 -0
  81. data/app/lib/actions/foreman_pipeline/jenkins/bulk_build.rb +23 -0
  82. data/app/lib/actions/foreman_pipeline/jenkins/get_build_details.rb +11 -0
  83. data/app/lib/actions/foreman_pipeline/jenkins/get_build_params.rb +11 -0
  84. data/app/lib/actions/foreman_pipeline/jenkins/get_version.rb +17 -0
  85. data/app/lib/actions/foreman_pipeline/jenkins/list.rb +15 -0
  86. data/app/lib/actions/foreman_pipeline/jenkins/wait_and_poll.rb +33 -0
  87. data/app/lib/actions/foreman_pipeline/jenkins/wait_for_build.rb +42 -0
  88. data/app/lib/actions/foreman_pipeline/jenkins/wait_host_ready.rb +36 -0
  89. data/app/lib/actions/foreman_pipeline/jenkins_instance/abstract_jenkins_instance_action.rb +17 -0
  90. data/app/lib/actions/foreman_pipeline/jenkins_instance/create_jenkins_instance_keys.rb +45 -0
  91. data/app/lib/actions/foreman_pipeline/job/create_activation_key.rb +20 -0
  92. data/app/lib/actions/foreman_pipeline/job/create_host.rb +88 -0
  93. data/app/lib/actions/foreman_pipeline/job/cv_promote_job_hook.rb +22 -0
  94. data/app/lib/actions/foreman_pipeline/job/cv_publish_job_hook.rb +22 -0
  95. data/app/lib/actions/foreman_pipeline/job/deploy_new_host.rb +25 -0
  96. data/app/lib/actions/foreman_pipeline/job/find_packages_to_install.rb +16 -0
  97. data/app/lib/actions/foreman_pipeline/job/job_hook.rb +24 -0
  98. data/app/lib/actions/foreman_pipeline/job/multiple_promotions.rb +18 -0
  99. data/app/lib/actions/foreman_pipeline/job/promote.rb +38 -0
  100. data/app/lib/actions/foreman_pipeline/job/redeploy.rb +45 -0
  101. data/app/lib/actions/foreman_pipeline/job/repo_sync_job_hook.rb +33 -0
  102. data/app/lib/actions/foreman_pipeline/job/run_job_manually.rb +25 -0
  103. data/app/lib/actions/foreman_pipeline/job/suspend_until_provisioned.rb +13 -0
  104. data/app/lib/actions/foreman_pipeline/mixins/ssh_extension.rb +41 -0
  105. data/app/lib/actions/foreman_pipeline/mixins/uri_extension.rb +14 -0
  106. data/app/lib/foreman_pipeline/api/rendering.rb +18 -0
  107. data/app/models/foreman_pipeline/authorization/base_model.rb +31 -0
  108. data/app/models/foreman_pipeline/authorization/jenkins_instance.rb +8 -0
  109. data/app/models/foreman_pipeline/authorization/jenkins_project.rb +8 -0
  110. data/app/models/foreman_pipeline/authorization/jenkins_project_param.rb +8 -0
  111. data/app/models/foreman_pipeline/authorization/jenkins_user.rb +7 -0
  112. data/app/models/foreman_pipeline/authorization/job.rb +7 -0
  113. data/app/models/foreman_pipeline/concerns/compute_resource_extension.rb +11 -0
  114. data/app/models/foreman_pipeline/concerns/content_view_extension.rb +12 -0
  115. data/app/models/foreman_pipeline/concerns/content_view_repository_extension.rb +12 -0
  116. data/app/models/foreman_pipeline/concerns/hostgroup_extension.rb +12 -0
  117. data/app/models/foreman_pipeline/concerns/kt_environment_extension.rb +18 -0
  118. data/app/models/foreman_pipeline/concerns/repository_extension.rb +12 -0
  119. data/app/models/foreman_pipeline/glue/elastic_search/base_model.rb +21 -0
  120. data/app/models/foreman_pipeline/glue/elastic_search/jenkins_instance.rb +11 -0
  121. data/app/models/foreman_pipeline/glue/elastic_search/jenkins_project.rb +11 -0
  122. data/app/models/foreman_pipeline/glue/elastic_search/jenkins_user.rb +11 -0
  123. data/app/models/foreman_pipeline/glue/elastic_search/job.rb +11 -0
  124. data/app/models/foreman_pipeline/jenkins_instance.rb +51 -0
  125. data/app/models/foreman_pipeline/jenkins_project.rb +18 -0
  126. data/app/models/foreman_pipeline/jenkins_project_param.rb +21 -0
  127. data/app/models/foreman_pipeline/jenkins_user.rb +15 -0
  128. data/app/models/foreman_pipeline/job.rb +72 -0
  129. data/app/models/foreman_pipeline/job_jenkins_project.rb +25 -0
  130. data/app/models/foreman_pipeline/job_to_environment.rb +19 -0
  131. data/app/views/foreman/unattended/snippets/_jenkins_instance_pubkey.erb +10 -0
  132. data/app/views/foreman_pipeline/api/common/async.json.rabl +3 -0
  133. data/app/views/foreman_pipeline/api/common/index.json.rabl +7 -0
  134. data/app/views/foreman_pipeline/api/compute_resources/index.json.rabl +3 -0
  135. data/app/views/foreman_pipeline/api/compute_resources/show.json.rabl +5 -0
  136. data/app/views/foreman_pipeline/api/content_views/index.json.rabl +3 -0
  137. data/app/views/foreman_pipeline/api/content_views/show.json.rabl +5 -0
  138. data/app/views/foreman_pipeline/api/environments/show.json.rabl +11 -0
  139. data/app/views/foreman_pipeline/api/hostgroups/index.json.rabl +3 -0
  140. data/app/views/foreman_pipeline/api/hostgroups/show.json.rabl +5 -0
  141. data/app/views/foreman_pipeline/api/jenkins_instances/index.json.rabl +3 -0
  142. data/app/views/foreman_pipeline/api/jenkins_instances/show.json.rabl +7 -0
  143. data/app/views/foreman_pipeline/api/jenkins_project_params/index.json.rabl +3 -0
  144. data/app/views/foreman_pipeline/api/jenkins_project_params/show.json.rabl +3 -0
  145. data/app/views/foreman_pipeline/api/jenkins_projects/index.json.rabl +3 -0
  146. data/app/views/foreman_pipeline/api/jenkins_projects/show.json.rabl +7 -0
  147. data/app/views/foreman_pipeline/api/jenkins_users/index.json.rabl +2 -0
  148. data/app/views/foreman_pipeline/api/jenkins_users/show.json.rabl +3 -0
  149. data/app/views/foreman_pipeline/api/jobs/available_paths.json.rabl +9 -0
  150. data/app/views/foreman_pipeline/api/jobs/index.json.rabl +3 -0
  151. data/app/views/foreman_pipeline/api/jobs/show.json.rabl +32 -0
  152. data/config/mount_engine.rb +3 -0
  153. data/config/routes.rb +53 -0
  154. data/db/migrate/20141003121914_create_job_table.rb +13 -0
  155. data/db/migrate/20141003145152_add_organization_to_jobs_table.rb +9 -0
  156. data/db/migrate/20141014125836_make_content_view_and_hostgroup_optional_for_job.rb +11 -0
  157. data/db/migrate/20141029121444_create_test_table.rb +11 -0
  158. data/db/migrate/20141029125423_add_organization_to_test_table.rb +9 -0
  159. data/db/migrate/20141030154210_create_jobs_tests_table.rb +12 -0
  160. data/db/migrate/20141120130350_add_resource_to_job.rb +9 -0
  161. data/db/migrate/20150121134503_create_jenkins_instances_table.rb +13 -0
  162. data/db/migrate/20150121134748_add_jenkins_instances_to_job_table.rb +9 -0
  163. data/db/migrate/20150122155819_add_kt_environment_to_jobs_table.rb +9 -0
  164. data/db/migrate/20150127101153_add_trigger_options_to_jobs_table.rb +13 -0
  165. data/db/migrate/20150202180711_add_content_column_to_tests_table.rb +9 -0
  166. data/db/migrate/20150209145400_add_pubkey_to_jenkins_instance_table.rb +9 -0
  167. data/db/migrate/20150209160604_add_jenkins_home_to_jenkins_instance_table.rb +9 -0
  168. data/db/migrate/20150212115234_add_uniqueness_to_jenkins_instance_url.rb +9 -0
  169. data/db/migrate/20150212125901_add_uniqueness_to_test_name.rb +9 -0
  170. data/db/migrate/20150213095447_add_cert_path_to_jenkins_instances.rb +9 -0
  171. data/db/migrate/20150216170951_add_build_step_to_tests_table.rb +9 -0
  172. data/db/migrate/20150223142315_change_jenkins_instance_cert_path_column.rb +9 -0
  173. data/db/migrate/20150224090100_create_jenkins_projects_table.rb +19 -0
  174. data/db/migrate/20150226182211_add_org_to_jenkins_project.rb +9 -0
  175. data/db/migrate/20150301134121_create_jenkins_project_params_table.rb +16 -0
  176. data/db/migrate/20150303134951_change_jenkins_project_param_value_column.rb +9 -0
  177. data/db/migrate/20150304123529_change_jenkins_project_params_table.rb +9 -0
  178. data/db/migrate/20150305122212_drop_tests_table.rb +5 -0
  179. data/db/migrate/20150312153833_create_jenkins_users.rb +15 -0
  180. data/db/migrate/20150313093244_add_jenkins_user_to_jobs.rb +9 -0
  181. data/db/migrate/20150313115956_change_jenkins_user_owner.rb +9 -0
  182. data/db/migrate/20150318141859_rename_tables.rb +19 -0
  183. data/db/migrate/20150323153355_remove_owner_from_jenkins_user.rb +9 -0
  184. data/db/migrate/20150323165954_add_jenkins_user_to_instance.rb +9 -0
  185. data/db/migrate/20150323175436_remove_jenkins_user_from_job.rb +9 -0
  186. data/db/migrate/20150324082437_remove_jenkins_instance_from_user.rb +9 -0
  187. data/db/migrate/20150324093416_add_promote_to_jobs.rb +9 -0
  188. data/db/migrate/20150324124034_create_job_path.rb +13 -0
  189. data/db/migrate/20150408143011_remove_cv_promote_from_job.rb +9 -0
  190. data/db/migrate/20150408145022_rename_job_path.rb +11 -0
  191. data/db/migrate/20150923073033_drop_orphaned_table.rb +8 -0
  192. data/lib/foreman_pipeline.rb +5 -0
  193. data/lib/foreman_pipeline/engine.rb +67 -0
  194. data/lib/foreman_pipeline/permissions.rb +3 -0
  195. data/lib/foreman_pipeline/permissions/jenkins_instance_permissions.rb +25 -0
  196. data/lib/foreman_pipeline/permissions/jenkins_project_params_permissions.rb +9 -0
  197. data/lib/foreman_pipeline/permissions/jenkins_projects_permissions.rb +9 -0
  198. data/lib/foreman_pipeline/permissions/jenkins_request_permissions.rb +9 -0
  199. data/lib/foreman_pipeline/permissions/jenkins_user_permissions.rb +24 -0
  200. data/lib/foreman_pipeline/permissions/job_permissions.rb +27 -0
  201. data/lib/foreman_pipeline/plugin.rb +17 -0
  202. data/lib/foreman_pipeline/roles.rb +13 -0
  203. data/lib/foreman_pipeline/tasks/foreman_pipeline_seed.rake +18 -0
  204. data/lib/foreman_pipeline/tasks/foreman_pipeline_test.rake +34 -0
  205. data/lib/foreman_pipeline/version.rb +3 -0
  206. data/test/factories/hostgroup_factory.rb +6 -0
  207. data/test/factories/jenkins_instance_related_factory.rb +20 -0
  208. data/test/foreman_pipeline_plugin_test_helper.rb +28 -0
  209. data/test/unit/job_test.rb +26 -0
  210. data/test/unit/sanity_test.rb +12 -0
  211. metadata +327 -0
@@ -0,0 +1,10 @@
1
+ <div class="path-selector" ng-repeat="path in paths">
2
+ <ul class="path-list">
3
+ <li class="path-list-item" ng-repeat="item in path" ng-class="{ 'disabled-item': item.disabled }">
4
+ <label class="path-list-item-label" ng-disabled="item.disabled" ng-class="{ active: item.selected }" ng-mouseenter="hover" ng-mouseleave="hover = false">
5
+ <input type="checkbox" ng-model="item.selected" ng-change="itemChanged(item)" ng-disabled="item.disabled"/>
6
+ {{ item.name }}
7
+ </label>
8
+ </li>
9
+ </ul>
10
+ </div>
@@ -0,0 +1,13 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ */
@@ -0,0 +1,124 @@
1
+ module ForemanPipeline
2
+ class Api::JenkinsInstancesController < Katello::Api::V2::ApiController
3
+ respond_to :json
4
+
5
+ include Api::Rendering
6
+
7
+ before_filter :find_jenkins_instance, :only => [:show, :update, :destroy, :check_jenkins, :set_jenkins_user]
8
+ before_filter :find_organization, :only => [:index, :create]
9
+ before_filter :load_search_service, :only => [:index]
10
+
11
+ def_param_group :jenkins_instance do
12
+ param :name, String, :desc => N_("Jenkins instance's name")
13
+ param :url, String, :desc => N_("Jenkins instance's url")
14
+ param :cert_path, String, :desc => ("Path to the private certificate for passwordless access to jenkins server")
15
+ param :jenkins_home, String, :desc => ("Location of $JENKINS_HOME")
16
+ end
17
+
18
+ def_param_group :jenkins_instance_id do
19
+ param :organization_id, :number, :desc => N_("Organization identifier"), :required => true
20
+ param :id, :number, :desc => N_("Jenkins instance identifier"), :required => true
21
+ end
22
+
23
+ api :GET, "/organizations/:organization_id/jenkins_instances", N_("List jenkins instances")
24
+ param :organization_id, :number, :desc => N_("organization identifier"), :required => true
25
+ param :name, String, :desc => N_("Name of the jenkins instance")
26
+ def index
27
+ ids = JenkinsInstance.readable.where(:organization_id => @organization.id).pluck(:id)
28
+ filters = [:terms => {:id => ids}]
29
+ filters << {:term => {:name => params[:name]}} if params[:name]
30
+
31
+ options = {
32
+ :filters => filters,
33
+ :load_records? => true
34
+ }
35
+
36
+ respond_for_index(:collection => item_search(JenkinsInstance, params, options))
37
+ end
38
+
39
+ api :POST, "/organizations/:organization_id/jenkins_instances/:id", N_("Create jenkins instance")
40
+ param_group :jenkins_instance_id
41
+ param_group :jenkins_instance
42
+ def create
43
+ @jenkins_instance = JenkinsInstance.new(jenkins_instance_params)
44
+ @jenkins_instance.organization = @organization
45
+
46
+ rollback = false
47
+ JenkinsInstance.transaction do
48
+ @jenkins_instance.save!
49
+ task = sync_task(::Actions::ForemanPipeline::JenkinsInstance::CreateJenkinsInstanceKeys,
50
+ :jenkins_url => jenkins_instance_params[:url],
51
+ :cert_path => @jenkins_instance.cert_path,
52
+ :jenkins_home => jenkins_instance_params[:jenkins_home])
53
+
54
+ @jenkins_instance.pubkey = task.output.fetch(:pubkey)
55
+ @jenkins_instance.save!
56
+
57
+ if task.output.fetch(:status) == 1
58
+ raise ActiveRecord::Rollback
59
+ rollback = true
60
+ end
61
+ end
62
+
63
+ if rollback
64
+ fail ::Katello::HttpErrors::Conflict, "Could not access Jenkins server, are you sure you set up certificates?"
65
+ else
66
+ respond_for_show(:resource => @jenkins_instance)
67
+ end
68
+ end
69
+
70
+ api :PUT, "/organizations/:organization_id/jenkins_instances/:id", N_("Update jenkins instance")
71
+ param_group :jenkins_instance_id
72
+ param_group :jenkins_instance
73
+ def update
74
+ @jenkins_instance.update_attributes!(jenkins_instance_params.except(:url).except(:jenkins_home))
75
+ @jenkins_instance.save!
76
+
77
+ respond_for_show(:resource => @jenkins_instance)
78
+ end
79
+
80
+ api :GET, "/organizations/:organization_id/jenkins_instances/:id", N_("Get jenkins_instance by identifier")
81
+ param_group :jenkins_instance_id
82
+ def show
83
+ respond_for_show(:resource => @jenkins_instance)
84
+ end
85
+
86
+ api :DELETE, "/organizations/:organization_id/jenkins_instances/:id", N_("Delete jenkins_instance")
87
+ param_group :jenkins_instance_id
88
+ def destroy
89
+ @jenkins_instance.destroy
90
+ respond_for_show(:resource => @jenkins_instance)
91
+ end
92
+
93
+ api :GET, "/organizations/:organization_id/jenkins_instances/:id/check_jenkins", N_("Check jenkins instance reachability")
94
+ param_group :jenkins_instance_id
95
+ def check_jenkins
96
+ task = sync_task(::Actions::ForemanPipeline::Jenkins::GetVersion,
97
+ :id => @jenkins_instance.id,
98
+ :name => @jenkins_instance.name)
99
+ @jenkins_instance.server_version = task.output[:version]
100
+ respond_for_show
101
+ end
102
+
103
+ api :PUT, "/organizations/:organization_id/jenkins_instances/:id", N_("Set jenkins user")
104
+ param_group :jenkins_instance_id
105
+ param :jenkins_user_id, :number, :desc => N_("Jenkins user identifier to be set")
106
+ def set_jenkins_user
107
+ @jenkins_instance.jenkins_user = JenkinsUser.find(params[:jenkins_user_id])
108
+ @jenkins_instance.save!
109
+ respond_for_show
110
+ end
111
+
112
+ protected
113
+
114
+ def find_jenkins_instance
115
+ @jenkins_instance = JenkinsInstance.find_by_id(params[:id])
116
+ fail ::Katello::HttpErrors::NotFound, "Could not find Jenkins Instance with id: #{params[:id]}" if @jenkins_instance.nil?
117
+ @jenkins_instance
118
+ end
119
+
120
+ def jenkins_instance_params
121
+ params.require(:jenkins_instance).permit(:name, :url, :jenkins_home, :cert_path)
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,34 @@
1
+ module ForemanPipeline
2
+ class Api::JenkinsProjectParamsController < Katello::Api::V2::ApiController
3
+ respond_to :json
4
+
5
+ include Api::Rendering
6
+
7
+ before_filter :find_jenkins_project_param, :only => [:update]
8
+
9
+ api :PUT, "/organizations/:organization_id/jenkins_project_params/:id", N_("Update jenkins project param")
10
+ param :organization_id, :number, :desc => N_("Organization identifier"), :required => true
11
+ param :id, :number, :desc => N_("Jenkins project parameter identifier")
12
+ param :name, String, :desc => N_("Parameter's name")
13
+ param :type, ["boolean", "string", "text"], :desc => N_("Parameter's type")
14
+ param :value, String, :desc => N_("Parameter's value")
15
+ param :description, String, :desc => N_("Parameter's description")
16
+ def update
17
+ @jenkins_project_param.update_attributes!(jenkins_project_param_params)
18
+ @jenkins_project_param.save!
19
+ respond_for_show(:resource => @jenkins_project_param)
20
+ end
21
+
22
+ private
23
+
24
+ def find_jenkins_project_param
25
+ @jenkins_project_param = JenkinsProjectParam.find_by_id(params[:id])
26
+ fail ::Katello::HttpErrors::NotFound, "Could not find Jenkins Project Param with id: #{params[:id]}" if @jenkins_project_param.nil?
27
+ @jenkins_project_param
28
+ end
29
+
30
+ def jenkins_project_param_params
31
+ params.require(:jenkins_project_param).permit(:name, :type, :value, :description)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,29 @@
1
+ module ForemanPipeline
2
+ class Api::JenkinsProjectsController < Katello::Api::V2::ApiController
3
+ respond_to :json
4
+
5
+ include Api::Rendering
6
+
7
+ before_filter :find_jenkins_project, :only => [:show]
8
+
9
+ api :GET, "/organizations/:organization_id/jenkins_projects/:id", N_("Get jenkins project by identifier")
10
+ param :organization_id, :number, :desc => N_("Organization identifier")
11
+ param :id, :number, :desc => N_("Jenkins project identifier")
12
+ def show
13
+ respond_for_show(:resource => @jenkins_project)
14
+ end
15
+
16
+ private
17
+
18
+ def find_jenkins_project
19
+ @jenkins_project = JenkinsProject.find_by_id(params[:id])
20
+ fail ::Katello::HttpErrors::NotFound, "Could not find Jenkins Project with id: #{params[:id]}" if @jenkins_project.nil?
21
+ @jenkins_project
22
+ end
23
+
24
+ def jenkins_project_params
25
+ params.require(:jenkins_project).permit(:name)
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ module ForemanPipeline
2
+ class Api::JenkinsRequestsController < Katello::Api::V2::ApiController
3
+ respond_to :json
4
+
5
+ include Api::Rendering
6
+
7
+ before_filter :find_job
8
+
9
+ api :GET, "/organizations/:organization_id/jenkins_requests/list"
10
+ param :organization_id, :number, :desc => N_("Organization identifier"), :required => true
11
+ param :job_id, :number, :desc => N_("Job identifier")
12
+ param :filter, String, :desc => N_("All jenkins projects with name matching this string will be retrieved")
13
+ def list
14
+ fail "filter string not given" if params[:filter].blank?
15
+ task = async_task(::Actions::ForemanPipeline::Jenkins::List, :job_id => params[:job_id], :filter => params[:filter])
16
+ respond_for_async(:resource => task)
17
+ end
18
+
19
+ private
20
+
21
+ def find_job
22
+ @job = Job.find_by_id(params[:job_id])
23
+ fail ::Katello::HttpErrors::NotFound, "Could not find job with id #{params[:job_id]}" if @job.nil?
24
+ @job
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,89 @@
1
+ module ForemanPipeline
2
+ class Api::JenkinsUsersController < Katello::Api::V2::ApiController
3
+ respond_to :json
4
+
5
+ include Api::Rendering
6
+
7
+ before_filter :find_organization, :only => [:create, :index]
8
+ before_filter :find_jenkins_user, :only => [:show, :destroy, :update]
9
+
10
+ def_param_group :jenkins_user_id do
11
+ param :organization_id, :number, :desc => N_("organization identifier"), :required => true
12
+ param :id, :number, :desc => N_("Jenkins user identifier"), :required => true
13
+ end
14
+
15
+ def_param_group :jenkins_user do
16
+ param :name, String, :desc => N_("Jenkins user name")
17
+ param :token, String, :desc => N_("Jenkins user token")
18
+ end
19
+
20
+ api :GET, "/organizations/:organization_id/jenkins_users", N_("List jenkins users")
21
+ param :organization_id, :number, :desc => N_("organization identifier"), :required => true
22
+ param :name, String, :desc => N_("Name of the jenkins instance")
23
+ def index
24
+ ids = JenkinsUser.readable
25
+ .where(:organization_id => @organization.id)
26
+ .pluck(:id)
27
+ filters = [:terms => {:id => ids}]
28
+ filters << {:term => {:name => params[:name]}} if params[:name]
29
+
30
+ options = {
31
+ :filters => filters,
32
+ :load_records? => true
33
+ }
34
+ respond_for_index(:collection => item_search(JenkinsUser, params, options))
35
+ end
36
+
37
+ api :GET, "/organizations/:organization_id/jenkins_users/:id", N_("Get jenkins user by identifier")
38
+ param_group :jenkins_user_id
39
+ def show
40
+ respond_for_show(:resource => @jenkins_user)
41
+ end
42
+
43
+ api :PUT, "/organizations/:organization_id/jenkins_users/:id", N_("Update jenkins user")
44
+ param_group :jenkins_user_id
45
+ param_group :jenkins_user
46
+ def update
47
+ if jenkins_user_params[:token].empty? || jenkins_user_params[:token].nil?
48
+ @jenkins_user.update_attributes!(jenkins_user_params.except(:token).except(:name))
49
+ else
50
+ @jenkins_user.update_attributes!(jenkins_user_params.except(:name))
51
+ end
52
+ @jenkins_user.save!
53
+
54
+ respond_for_show(:resource => @jenkins_user)
55
+ end
56
+
57
+ api :POST, "/organizations/:organization_id/jenkins_users/:id", N_("Update jenkins user")
58
+ param_group :jenkins_user_id
59
+ param_group :jenkins_user
60
+ def create
61
+ @jenkins_user = JenkinsUser.new(jenkins_user_params)
62
+ @jenkins_user.organization = @organization
63
+ @jenkins_user.save!
64
+
65
+ respond_for_show(:resource => @jenkins_user)
66
+ end
67
+
68
+ api :DELETE, "/organizations/:organization_id/jenkins_users/:id", N_("Update jenkins user")
69
+ param_group :jenkins_user_id
70
+ def destroy
71
+ @jenkins_user.destroy
72
+ respond_for_show(:resource => @jenkins_user)
73
+ end
74
+
75
+
76
+ protected
77
+
78
+ def find_jenkins_user
79
+ @jenkins_user = JenkinsUser.find_by_id(params[:id])
80
+ fail ::Katello::HttpErrors::NotFound, "Could not find Jenkins User with id #{params[:id]}" if @jenkins_user.nil?
81
+ @jenkins_user
82
+ end
83
+
84
+ def jenkins_user_params
85
+ params.require(:jenkins_user).permit(:name, :token)
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,271 @@
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, :available_paths]
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, :set_to_environments,
13
+ :available_paths]
14
+
15
+ before_filter :load_search_service, :only => [:index]
16
+
17
+ def_param_group :job do
18
+ param :name, String, :desc => N_("Name of the job"), :required => true
19
+ param :manual_trigger, :bool, :desc => N_("Allow starting job manually"), :required => false
20
+ param :sync_trigger, :bool, :desc => N_("Allow starting job on successful repo sync"), :required => false
21
+ param :levelup_trigger, :bool, :desc => N_("Allow starting job on successful content view publish/promote"), :required => false
22
+ param :promote, :bool, :desc => N_("Allow starting job manually"), :required => false
23
+ end
24
+
25
+ def_param_group :job_id do
26
+ param :organization_id, :number, :desc => N_("organization identifier"), :required => true
27
+ param :id, :number, :desc => N_("job identifier"), :required => true
28
+ end
29
+
30
+ api :GET, "/organizations/:organization_id/jobs", N_("List jobs")
31
+ param :organization_id, :number, :desc => N_("organization identifier"), :required => true
32
+ param :name, String, :desc => N_("Name of the job")
33
+ def index
34
+ ids = Job.readable.where(:organization_id => @organization.id).pluck(:id)
35
+ filters = [:terms => {:id => ids}]
36
+ filters << {:term => {:name => params[:name]}} if params[:name]
37
+
38
+ options = {
39
+ :filters => filters,
40
+ :load_records? => true
41
+ }
42
+ respond_for_index(:collection => item_search(Job, params, options))
43
+ end
44
+
45
+ api :GET, "/organizations/:organization_id/jobs/:id", N_("Get job by identifier")
46
+ param_group :job_id
47
+ def show
48
+ respond_for_show(:resource => @job)
49
+ end
50
+
51
+ api :POST, "/organizations/:organization_id/jobs/", N_("Create new job")
52
+ param :organization_id, :number, :desc => N_("Organization identifier"), :required => true
53
+ param_group :job
54
+ def create
55
+ @job = Job.new(job_params)
56
+ @job.organization = @organization
57
+ @job.save!
58
+
59
+ respond_for_show(:resource => @job)
60
+ end
61
+
62
+ api :PUT, "/organizations/:organization_id/jobs/:id", N_("Update job")
63
+ param_group :job_id
64
+ param_group :job
65
+ def update
66
+ @job.update_attributes!(job_params)
67
+ @job.save!
68
+ respond_for_show(:resource => @job)
69
+ end
70
+
71
+ api :DELETE, "/organizations/:organization_id/jobs/:id", N_("Delete job")
72
+ param_group :job_id
73
+ def destroy
74
+ @job.destroy
75
+ respond_for_show(:resource => @job)
76
+ end
77
+
78
+ api :PUT, "/organizations/:organization_id/jobs/:id/set_content_view", N_("Set content view for job")
79
+ param_group :job_id
80
+ param :content_view_id, :number, :desc => N_("Content view id which will be set"), :required => true
81
+ def set_content_view
82
+ cv = Katello::ContentView.find(params[:content_view_id])
83
+ fail Katello::HttpErrors::Conflict, "Only non-composite views are accepted" if cv.composite?
84
+ @job.content_view = cv
85
+ @job.save!
86
+ respond_for_show
87
+ end
88
+
89
+ api :PUT, "/organizations/:organization_id/jobs/:id/set_hostgroup", N_("Set hostgroup for job")
90
+ param_group :job_id
91
+ param :hostgroup_id, :number, :desc => N_("Hostgroup id which will be set"), :required => true
92
+ def set_hostgroup
93
+ @job.hostgroup = Hostgroup.find(params[:hostgroup_id])
94
+ @job.compute_resource = nil
95
+ @job.save!
96
+ respond_for_show
97
+ end
98
+
99
+ api :PUT, "/organizations/:organization_id/jobs/:id/set_jenkins", N_("Set jenkins instance for job")
100
+ param_group :job_id
101
+ param :jenkins_instance_id, :number, :desc => N_("Jenkins Instance id which will be set"), :required => true
102
+ def set_jenkins
103
+ instance = JenkinsInstance.find(params[:jenkins_instance_id])
104
+ @job.jenkins_instance = instance
105
+ @job.save!
106
+ respond_for_show
107
+ end
108
+
109
+ api :PUT, "/organizations/:organization_id/jobs/:id/set_environment", N_("Set environment for job")
110
+ param_group :job_id
111
+ param :environment_id, :number, :desc => N_("Environment id which will be set"), :required => true
112
+ def set_environment
113
+ @job.environment = Katello::KTEnvironment.find(params[:environment_id])
114
+ @job.to_environments = []
115
+ @job.save!
116
+ respond_for_show
117
+ end
118
+
119
+ api :PUT, "/organizations/:organization_id/jobs/:id/set_resource", N_("Set compute resource for job")
120
+ param_group :job_id
121
+ param :resource_id, :number, :desc => N_("Compute resource id which will be set"), :required => true
122
+ def set_resource
123
+ if @job.available_compute_resources.map(&:id).include? params[:resource_id]
124
+ @job.compute_resource = ComputeResource.find(params[:resource_id])
125
+ @job.save!
126
+ respond_for_show
127
+ else
128
+ fail Katello::HttpErrors::Conflict, "Only a Compute Resource configured for Job's Hostgroup may be set."
129
+ end
130
+ end
131
+
132
+ api :PUT, "/organizations/:organization_id/jobs/:id/set_to_environments", N_("Set 'to environments' for the job")
133
+ param_group :job_id
134
+ param :path_ids, Array, :desc => N_("Identifiers of environments which are successors of job's environment")
135
+ def set_to_environments
136
+ fail Katello::HttpErrors::Conflict, "Job's environment must be assigned before setting 'to environments'." if @job.environment.nil?
137
+ fail Katello::HttpErrors::Conflict, "Job's environment does not have any successors" if @job.environment.successors.empty?
138
+ is_ok = params[:to_environment_ids].map do |new_id|
139
+ @job.environment.successors.map(&:id).include? new_id
140
+ end.all?
141
+ if is_ok
142
+ @job.to_environment_ids = params[:to_environment_ids]
143
+ @job.save!
144
+ respond_for_show
145
+ else
146
+ fail Katello::HttpErrors::Conflict, "Only environments that are direct successors of Job's Environment may be set as 'to environments'."
147
+ end
148
+ end
149
+
150
+ api :GET, "/organizations/:organization_id/jobs/:id/available_paths", N_("List environment paths available for a job")
151
+ param_group :job_id
152
+ def available_paths
153
+ available = []
154
+ paths = []
155
+ if params[:all_paths]
156
+ available = @organization.readable_promotion_paths
157
+ paths = available.inject([]) do |result, path|
158
+ result << { :environments => [@organization.library] + path }
159
+ end
160
+ paths = [{ :environments => [@organization.library] }] if paths.empty?
161
+ else
162
+ available = @job.environment.full_paths rescue []
163
+ paths = available.inject([]) do |result, path|
164
+ result << { :environments => path }
165
+ end
166
+ paths = [{ :environments => [] }] if paths.empty?
167
+ end
168
+
169
+ collection = {
170
+ :results => paths,
171
+ :total => paths.size,
172
+ :subtotal => paths.size
173
+ }
174
+
175
+ respond_for_index(:collection => collection)
176
+ end
177
+
178
+ api :GET, "/organizations/:organization_id/jobs/:id/available_resources", N_("List compute resources available for the job")
179
+ param_group :job_id
180
+ def available_resources
181
+ @compute_resources = @job.available_compute_resources
182
+ render "api/v2/compute_resources/index"
183
+ end
184
+
185
+ api :GET, "/organizations/:organization_id/jobs/:id/run_job", N_("Start job execution")
186
+ param_group :job_id
187
+ def run_job
188
+ if @job.manual_trigger
189
+ task = async_task(::Actions::ForemanPipeline::Job::RunJobManually, @job)
190
+ render :nothing => true
191
+ else
192
+ fail ::Katello::HttpErrors::Forbidden, "Running manually not allowed for Job: #{@job.name}. Try setting it's :manual_trigger property."
193
+ end
194
+ end
195
+
196
+ api :GET, "/organizations/:organization_id/jobs/:id/add_projects", N_("Add jenkins projects to the job")
197
+ param_group :job_id
198
+ param :projects, Array, :desc => N_("Names of the jenkins projects to be added to the job")
199
+ def add_projects
200
+ rollback = {:occured => false}
201
+ Job.transaction do
202
+ projects = params[:projects].map do |p|
203
+ JenkinsProject.create(:name => p, :organization => @organization)
204
+ end
205
+ projects_to_add = projects.delete_if { |p| @job.jenkins_projects.include? p }
206
+ @job.jenkins_projects = @job.jenkins_projects + projects_to_add
207
+ @job.save!
208
+
209
+ projects_to_add.each do |project|
210
+ project.reload
211
+ task = sync_task(::Actions::ForemanPipeline::Jenkins::GetBuildParams, :job_id => @job.id, :name => project.name)
212
+
213
+ unless task.output[:build_params]
214
+ raise ActiveRecord::Rollback
215
+ rollback[:occured] = true
216
+ rollback[:project_name] = project.name
217
+ end
218
+ task.output[:build_params].each do |param|
219
+ new_param = JenkinsProjectParam.new(:name => param[:name],
220
+ :type => param[:type],
221
+ :description => param[:description],
222
+ :value => param[:default])
223
+ new_param.organization = @organization
224
+ new_param.jenkins_project = project
225
+ new_param.save!
226
+ end
227
+ end
228
+ end
229
+ if rollback[:occured]
230
+ fail ::Katello::HttpErrors::NotFound, "Could not retrieve build params for Jenkins project: #{rollback[:project_name]}"
231
+ else
232
+ respond_for_show
233
+ end
234
+ end
235
+
236
+ api :GET, "/organizations/:organization_id/jobs/:id/remove_projects", N_("Remove jenkins projects from the job")
237
+ param_group :job_id
238
+ param :projects, Array, :desc => N_("Identifiers of the projects to be removed from the job")
239
+ def remove_projects
240
+ ids = params[:project_ids]
241
+ jj_projects = JobJenkinsProject.where(:jenkins_project_id => ids)
242
+ jj_projects.map(&:destroy)
243
+ respond_for_show
244
+ end
245
+
246
+ protected
247
+
248
+ def find_job
249
+ @job = Job.find_by_id(params[:id])
250
+ fail ::Katello::HttpErrors::NotFound, "Could not find job with id #{params[:id]}" if @job.nil?
251
+ @job
252
+ end
253
+
254
+ def job_params
255
+ params.require(:job).permit(:name, :manual_trigger, :sync_trigger, :levelup_trigger, :projects, :promote)
256
+ end
257
+
258
+ def format_paths(paths)
259
+ formated_paths = paths.inject([]) do |result, path|
260
+ result << { :environments => path }
261
+ end
262
+ collection = {
263
+ :results => formated_paths,
264
+ :total => formated_paths.size,
265
+ :subtotal => formated_paths.size
266
+ }
267
+ respond_for_index(:collection => collection)
268
+ end
269
+
270
+ end
271
+ end