foreman_scc_manager 1.6.3 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/Rakefile +1 -1
  4. data/app/controllers/api/v2/scc_accounts_controller.rb +159 -0
  5. data/app/controllers/api/v2/scc_products_controller.rb +64 -0
  6. data/app/models/scc_account.rb +2 -1
  7. data/app/models/scc_product.rb +1 -0
  8. data/app/views/api/v2/scc_accounts/base.json.rabl +5 -0
  9. data/app/views/api/v2/scc_accounts/index.json.rabl +4 -0
  10. data/app/views/api/v2/scc_accounts/main.json.rabl +5 -0
  11. data/app/views/api/v2/scc_accounts/show.json.rabl +4 -0
  12. data/app/views/api/v2/scc_products/base.json.rabl +5 -0
  13. data/app/views/api/v2/scc_products/index.json.rabl +4 -0
  14. data/app/views/api/v2/scc_products/main.json.rabl +5 -0
  15. data/app/views/api/v2/scc_products/show.json.rabl +5 -0
  16. data/config/routes.rb +30 -1
  17. data/lib/foreman_scc_manager/engine.rb +28 -9
  18. data/lib/foreman_scc_manager/version.rb +1 -1
  19. data/lib/tasks/rubocop.rake +0 -1
  20. data/locale/action_names.rb +5 -61
  21. data/locale/de/LC_MESSAGES/foreman_scc_manager.mo +0 -0
  22. data/locale/de/foreman_scc_manager.po +139 -210
  23. data/locale/en/LC_MESSAGES/foreman_scc_manager.mo +0 -0
  24. data/locale/en/foreman_scc_manager.po +129 -152
  25. data/locale/foreman_scc_manager.pot +120 -212
  26. data/test/controllers/api/v2/scc_accounts_test.rb +302 -0
  27. data/test/controllers/api/v2/scc_products_test.rb +40 -0
  28. data/test/features/sync_test.rb +3 -6
  29. data/test/{features → fixtures/files}/data_products_page1.json +0 -0
  30. data/test/{features → fixtures/files}/data_products_page2.json +0 -0
  31. data/test/fixtures/files/data_repositories.json +502 -0
  32. data/test/{features → fixtures/files}/data_subscriptions.json +0 -0
  33. data/test/models/scc_account_test.rb +4 -4
  34. data/test/models/scc_product_test.rb +2 -2
  35. data/test/test_plugin_helper.rb +2 -0
  36. metadata +25 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e046f783a69d37d132094313fbeed914c9d246e315bc238ca8ca8c2ae806dace
4
- data.tar.gz: e9b8af6dd55a5756c76d4ba93f93b39919251930b281e694b5099add68147457
3
+ metadata.gz: 1049862eb94d3a0e5da9add1afcf83da6a7edf3e8e315f126c3ec531f3b8d3fc
4
+ data.tar.gz: aae14c2ae2305b52281b4c270dcec231b01bfe3745fc4b66b0da084d26b57a15
5
5
  SHA512:
6
- metadata.gz: 3814c9b796a0b9869f00fdc49da07e46d71a73c9fbf32628c2dd11185fa84535b3469a6c7ee6b81f5fa3d0fe4a75f651f1f2d92bce35bf8289e0231c8c65f0c9
7
- data.tar.gz: c8a7483a75e235b2499c99b885dcead01e57c5511e29655d5ec9013b604af70dd5cb3d9eb9042455080b6a4861435447907b73656944e96e0ea58502049ab7b0
6
+ metadata.gz: 87c896f8ad3c8e279e068ebe14d6a7a7c1648d94ae4c677500232208f6d8f181d67e4120d4cd1cd8aa3bfed1961851f49cda1e786cd2a7bbf11a20d604bdd030
7
+ data.tar.gz: 7cf6d36616da6866fb1f641e2f28b927bf789467c7bea6c6adecef0dc1bf4a841c603b79fac309cb3626b9ad2846eae16cdf8a7ac79f4569d47ea4e5c9bb1fb8
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Build Status master](https://travis-ci.org/ATIX-AG/foreman_scc_manager.svg?branch=master)](https://travis-ci.org/ATIX-AG/foreman_scc_manager)
2
+
1
3
  # ForemanSccManager
2
4
 
3
5
  Foreman plugin to sync SUSE Customer Center products and repositories into Katello
@@ -11,6 +13,7 @@ for how to install Foreman plugins
11
13
 
12
14
  | Foreman Version | Katello Version | Plugin Version |
13
15
  | --------------- | --------------- | -------------- |
16
+ | 1.22 | 3.12 | ~> 1.7.0 |
14
17
  | 1.21 | 3.10 | ~> 1.6.0 |
15
18
  | 1.20 | 3.9 | ~> 1.6.0 |
16
19
  | 1.19 | 3.8 | ~> 1.5.1 |
data/Rakefile CHANGED
@@ -38,7 +38,7 @@ task default: :test
38
38
  begin
39
39
  require 'rubocop/rake_task'
40
40
  RuboCop::RakeTask.new
41
- rescue StandardError => _
41
+ rescue StandardError => _e
42
42
  puts 'Rubocop not loaded.'
43
43
  end
44
44
 
@@ -0,0 +1,159 @@
1
+ module Api
2
+ module V2
3
+ class SccAccountsController < ::Api::V2::BaseController
4
+ include Api::Version2
5
+ include Foreman::Controller::AutoCompleteSearch
6
+
7
+ resource_description do
8
+ resource_id 'scc_accounts'
9
+ api_version 'v2'
10
+ api_base_url '/api/v2'
11
+ end
12
+
13
+ before_action :find_resource, :only => [:show, :update, :destroy, :sync, :bulk_subscribe]
14
+
15
+ api :GET, '/scc_accounts/', N_('List all scc_accounts')
16
+ param :organization_id, :identifier, :required => true
17
+ param_group :search_and_pagination, ::Api::V2::BaseController
18
+ def index
19
+ scope = resource_scope
20
+ scope = scope.where(:organization => params[:organization_id]) if params[:organization_id].present?
21
+ @scc_accounts = scope.search_for(params[:search], :order => params[:order]).paginate(:page => params[:page])
22
+ end
23
+
24
+ api :GET, '/scc_accounts/:id/', N_('Show scc_account')
25
+ param :id, :identifier_dottable, :required => true
26
+ param :organization_id, :identifier, :required => true
27
+ def show; end
28
+
29
+ def_param_group :scc_account do
30
+ param :scc_account, Hash, :required => true, :action_aware => true do
31
+ param :organization_id, :identifier, :required => true
32
+ param :name, String, :required => true, :desc => N_('Name of the scc_account')
33
+ param :login, String, :required => true, :desc => N_('Login id of scc_account')
34
+ param :password, String, :required => true, :desc => N_('Password of scc_account')
35
+ param :base_url, String, :required => false, :desc => N_('URL of SUSE for scc_account')
36
+ param :interval, ['never', 'daily', 'weekly', 'monthy'], :desc => N_('Interval for syncing scc_account')
37
+ param :sync_date, String, :desc => N_('Last Sync time of scc_account')
38
+ end
39
+ end
40
+
41
+ api :POST, '/scc_accounts/', N_('Create an scc_account')
42
+ param_group :scc_account, :as => :create
43
+ def create
44
+ @scc_account = resource_class.new(scc_account_params)
45
+ process_response @scc_account.save_with_logic!
46
+ end
47
+
48
+ api :PUT, '/scc_accounts/:id', N_('Update scc_account')
49
+ param :id, :identifier_dottable, :required => true
50
+ param_group :scc_account
51
+ def update
52
+ process_response @scc_account.update(scc_account_params)
53
+ end
54
+
55
+ api :DELETE, '/scc_accounts/:id', N_('Delete scc_account')
56
+ param :id, :identifier_dottable, :required => true
57
+ def destroy
58
+ process_response @scc_account.destroy
59
+ end
60
+
61
+ api :POST, '/scc_accounts/test_connection', N_('Test connection for scc_account')
62
+ api :PUT, '/scc_accounts/:id/test_connection', N_('Test connection for scc_account')
63
+ param :id, :identifier_dottable, :required => false
64
+ param :login, String, :required => false, :desc => N_('Login id of scc_account')
65
+ param :password, String, :required => false, :desc => N_('Password of scc_account')
66
+ param :base_url, String, :required => false, :desc => N_('URL of SUSE for scc_account')
67
+ def test_connection
68
+ if params[:id].present?
69
+ find_resource
70
+ begin
71
+ local_scc_account_params = scc_account_params
72
+ rescue ActionController::ParameterMissing
73
+ local_scc_account_params = {}
74
+ end
75
+ @scc_account.login = local_scc_account_params[:login] unless local_scc_account_params[:login].empty?
76
+ @scc_account.password = local_scc_account_params[:password] unless local_scc_account_params[:password].empty?
77
+ else
78
+ @scc_account = resource_class.new(scc_account_params)
79
+ end
80
+ respond_to do |format|
81
+ if @scc_account.test_connection
82
+ format.json { render json: 'Success'.to_json, status: :ok }
83
+ else
84
+ format.json { render json: 'Failed'.to_json, status: :not_found }
85
+ end
86
+ end
87
+ end
88
+
89
+ api :PUT, '/scc_accounts/:id/sync', N_('Sync scc_account')
90
+ param :id, :identifier_dottable, :required => true
91
+ def sync
92
+ sync_task = ForemanTasks.async_task(::Actions::SccManager::Sync, @scc_account)
93
+ synced = @scc_account.update! sync_task: sync_task
94
+ respond_to do |format|
95
+ format.json { render json: sync_task.to_json } if synced
96
+ end
97
+ rescue ::Foreman::Exception => e
98
+ render json: { error: ('Failed to add task to queue: %s' % e).to_s }, status: :unprocessable_entity
99
+ rescue ForemanTasks::Lock::LockConflict => e
100
+ render json: { error: ('Lock on SCC account already taken: %s' % e).to_s }, status: :unprocessable_entity
101
+ end
102
+
103
+ api :PUT, '/scc_accounts/:id/bulk_subscribe/', N_('Bulk subscription of scc_products for scc_account')
104
+ param :id, :identifier_dottable, :required => true
105
+ param :scc_subscribe_product_ids, Array
106
+ def bulk_subscribe
107
+ scc_products_to_subscribe = @scc_account.scc_products.where(:id => params[:scc_subscribe_product_ids])
108
+ respond_to do |format|
109
+ if scc_products_to_subscribe.count > 0
110
+ subscribe_task = ForemanTasks.async_task(::Actions::BulkAction,
111
+ ::Actions::SccManager::SubscribeProduct,
112
+ scc_products_to_subscribe)
113
+ format.json { render json: subscribe_task.to_json, status: :ok }
114
+ else
115
+ format.json { render json: 'No Product selected'.to_json, status: :expectation_failed }
116
+ end
117
+ end
118
+ rescue ::Foreman::Exception => e
119
+ render json: { error: ('Failed to add task to queue: %s' % e).to_s }, status: :unprocessable_entity
120
+ rescue ForemanTasks::Lock::LockConflict => e
121
+ render json: { error: ('Lock on SCC account already taken: %s' % e).to_s }, status: :unprocessable_entity
122
+ end
123
+
124
+ private
125
+
126
+ def scc_account_params
127
+ params[:scc_account].delete(:password) if params[:scc_account][:password].blank?
128
+ params.require(:scc_account).permit(
129
+ :name,
130
+ :login,
131
+ :password,
132
+ :base_url,
133
+ :interval,
134
+ :sync_date,
135
+ :organization_id
136
+ )
137
+ end
138
+
139
+ def find_resource
140
+ @scc_account = resource_class.find(params[:id])
141
+ end
142
+
143
+ def resource_class
144
+ ::SccAccount
145
+ end
146
+
147
+ def action_permission
148
+ case params[:action]
149
+ when 'sync', 'test_connection'
150
+ :sync
151
+ when 'bulk_subscribe'
152
+ :bulk_subscribe
153
+ else
154
+ super
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,64 @@
1
+ module Api
2
+ module V2
3
+ class SccProductsController < ::Api::V2::BaseController
4
+ include Api::Version2
5
+ include Foreman::Controller::AutoCompleteSearch
6
+
7
+ resource_description do
8
+ resource_id 'scc_products'
9
+ api_version 'v2'
10
+ api_base_url '/api/v2'
11
+ end
12
+
13
+ before_action :find_resource, :only => [:show, :subscribe]
14
+
15
+ api :GET, '/scc_accounts/:scc_account_id/scc_products/', N_('List all products for scc_account')
16
+ param :scc_account_id, :identifier_dottable, :required => true
17
+ param_group :search_and_pagination, ::Api::V2::BaseController
18
+ def index
19
+ scope = resource_scope
20
+ scope = scope.where(:organization => params[:organization_id]) if params[:organization_id].present?
21
+ @scc_products = scope.search_for(params[:search], :order => params[:order]).paginate(:page => params[:page])
22
+ end
23
+
24
+ api :GET, '/scc_accounts/:scc_account_id/scc_products/:id/', N_('Show an scc_account product')
25
+ param :id, :identifier_dottable, :required => true
26
+ param :scc_account_id, :identifier_dottable, :required => true
27
+ def show; end
28
+
29
+ api :PUT, '/scc_accounts/:scc_account_id/scc_products/:id/subscribe/', N_('Subscribe product')
30
+ param :id, :identifier_dottable, :required => true
31
+ param :scc_account_id, :identifier_dottable, :required => true
32
+ def subscribe
33
+ subcribe_task = ForemanTasks.async_task(::Actions::SccManager::SubscribeProduct, @scc_product) if @scc_product
34
+ respond_to do |format|
35
+ if subcribe_task
36
+ format.json { render json: subcribe_task.to_json, status: :ok }
37
+ else
38
+ format.json { render json: 'Failed to subscribe product'.to_json, status: :not_found }
39
+ end
40
+ end
41
+ rescue ::Foreman::Exception => e
42
+ render json: { error: ('Failed to add task to queue: %s' % e).to_s }, status: :unprocessable_entity
43
+ rescue ForemanTasks::Lock::LockConflict => e
44
+ render json: { error: ('Lock on SCC account already taken: %s' % e).to_s }, status: :unprocessable_entity
45
+ end
46
+
47
+ private
48
+
49
+ def find_resource
50
+ @scc_account = ::SccAccount.find_by!(id: params[:scc_account_id])
51
+ @scc_product = @scc_account.scc_products.find_by!(id: params[:id])
52
+ end
53
+
54
+ def action_permission
55
+ case params[:action]
56
+ when 'subscribe'
57
+ :subscribe
58
+ else
59
+ super
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -34,6 +34,7 @@ class SccAccount < ApplicationRecord
34
34
  default_scope -> { order(:login) }
35
35
 
36
36
  scoped_search on: :login, complete_value: true
37
+ scoped_search on: :name
37
38
 
38
39
  def init
39
40
  # set default values
@@ -84,7 +85,7 @@ class SccAccount < ApplicationRecord
84
85
 
85
86
  def update_attributes_with_logic!(params)
86
87
  transaction do
87
- self.update_attributes!(params)
88
+ self.update!(params)
88
89
  if rec_logic_changed?
89
90
  old_rec_logic = self.foreman_tasks_recurring_logic
90
91
  associate_recurring_logic
@@ -19,6 +19,7 @@ class SccProduct < ApplicationRecord
19
19
 
20
20
  default_scope -> { order(:name) }
21
21
  scoped_search on: :name, complete_value: true
22
+ scoped_search on: :friendly_name
22
23
 
23
24
  def uniq_name
24
25
  "#{scc_id} " + friendly_name
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ object @scc_account
4
+
5
+ attributes :id, :name
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ collection @scc_accounts
4
+ extends 'api/v2/scc_accounts/main'
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ object @scc_account
4
+ extends 'api/v2/scc_accounts/base'
5
+ attributes :organization_id, :organization_name, :login, :base_url, :interval, :sync_date
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ object @scc_account
4
+ extends 'api/v2/scc_accounts/main'
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ object @scc_product
4
+
5
+ attributes :id, :name
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ collection @scc_products
4
+ extends 'api/v2/scc_products/main'
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ object @scc_product
4
+ extends 'api/v2/scc_products/base'
5
+ attributes :organization_id, :organization_name, :scc_account_id, :name, :arch, :friendly_name, :description
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ object @scc_product
4
+
5
+ extends 'api/v2/scc_products/main'
@@ -1,10 +1,11 @@
1
1
  Rails.application.routes.draw do
2
2
  resources :scc_accounts do
3
3
  collection do
4
- put 'test_connection'
4
+ post 'test_connection'
5
5
  get 'auto_complete_search'
6
6
  end
7
7
  member do
8
+ put 'test_connection'
8
9
  put 'sync'
9
10
  put 'bulk_subscribe'
10
11
  end
@@ -15,4 +16,32 @@ Rails.application.routes.draw do
15
16
  put 'unsubscribe'
16
17
  end
17
18
  end
19
+
20
+ namespace :api, :defaults => { :format => 'json' } do
21
+ scope '(:apiv)', :module => :v2,
22
+ :defaults => { :apiv => 'v2' },
23
+ :apiv => /v1|v2/,
24
+ :constraints => ApiConstraints.new(:version => 2, :default => true) do
25
+ resources :scc_accounts do
26
+ collection do
27
+ post 'test_connection'
28
+ get 'auto_complete_search'
29
+ end
30
+ member do
31
+ put 'test_connection'
32
+ put 'sync'
33
+ put 'bulk_subscribe'
34
+ end
35
+ end
36
+ constraints(:scc_account_id => /[^\/]+/) do
37
+ resources :scc_accounts, :only => [] do
38
+ resources :scc_products, only: %i[index show] do
39
+ member do
40
+ put 'subscribe'
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
18
47
  end
@@ -22,18 +22,37 @@ module ForemanSccManager
22
22
 
23
23
  initializer 'foreman_scc_manager.register_plugin', :before => :finisher_hook do |_app|
24
24
  Foreman::Plugin.register :foreman_scc_manager do
25
- requires_foreman '>= 1.18'
26
- requires_foreman_plugin 'katello', '>= 3.7.0'
25
+ requires_foreman '>= 1.22'
26
+ requires_foreman_plugin 'katello', '>= 3.12.0'
27
+
28
+ apipie_documented_controllers ["#{ForemanSccManager::Engine.root}/app/controllers/api/v2/*.rb"]
27
29
 
28
30
  # Add permissions
29
31
  security_block :foreman_scc_manager do
30
- permission :view_scc, :scc_account => %i[index show]
31
- permission :use_scc, :scc_account => [:bulk_subscribe]
32
- # permission :use_scc, :scc_product => [:subscribe, :unsubscribe]
33
- permission :new_scc, :scc_account => %i[new create]
34
- permission :edit_scc, :scc_account => %i[edit update]
35
- permission :delete_scc, :scc_account => [:destroy]
36
- permission :sync_scc, :scc_account => [:sync]
32
+ permission :view_scc, {
33
+ :'foreman_scc_manager/scc_accounts' => [:show, :index],
34
+ :'api/v2/scc_accounts' => [:show, :index]
35
+ }
36
+ permission :use_scc, {
37
+ :'foreman_scc_manager/scc_accounts' => [:bulk_subscribe],
38
+ :'api/v2/scc_accounts' => [:bulk_subscribe]
39
+ }
40
+ permission :new_scc, {
41
+ :'foreman_scc_manager/scc_accounts' => [:new, :create],
42
+ :'api/v2/scc_accounts' => [:create]
43
+ }
44
+ permission :edit_scc, {
45
+ :'foreman_scc_manager/scc_accounts' => [:edit, :update],
46
+ :'api/v2/scc_accounts' => [:update]
47
+ }
48
+ permission :delete_scc, {
49
+ :'foreman_scc_manager/scc_accounts' => [:destroy],
50
+ :'api/v2/scc_accounts' => [:destroy]
51
+ }
52
+ permission :sync_scc, {
53
+ :'foreman_scc_manager/scc_accounts' => [:sync],
54
+ :'api/v2/scc_accounts' => [:sync]
55
+ }
37
56
  end
38
57
 
39
58
  # Add a new role called 'SccManager' if it doesn't exist
@@ -1,3 +1,3 @@
1
1
  module ForemanSccManager
2
- VERSION = '1.6.3'.freeze
2
+ VERSION = '1.7.0'.freeze
3
3
  end
@@ -9,7 +9,6 @@ begin
9
9
  "#{ForemanSccManager::Engine.root}/db/**/*.rb",
10
10
  "#{ForemanSccManager::Engine.root}/lib/**/*.rake",
11
11
  "#{ForemanSccManager::Engine.root}/lib/**/*.rb",
12
- "#{ForemanSccManager::Engine.root}/locale/**/*.rb",
13
12
  "#{ForemanSccManager::Engine.root}/test/**/*.rb"
14
13
  ]
15
14