foreman_scc_manager 1.8.4 → 1.8.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5ad2397229cd491566c2860224641db959be83c82254864cd06f5c37648cd60e
4
- data.tar.gz: f9a8e1e8f6ab872e1e0528beab2563421d498e5aaa32a38c21b00756d4cf84b6
3
+ metadata.gz: f4d297d61cfdedf0fb329cba44d7925c052c1c8e80f8f0ec58b1435b90b229fe
4
+ data.tar.gz: 3b434307e158ce5b45ad3e719a7538895a8bcf8d01c98f449561c8d18d4ba87f
5
5
  SHA512:
6
- metadata.gz: 962060eff9906bfb01a629a3700adaa460d5120d57e2823a19ce786f1aecafad65ddd903d2430a40a431f53a7ed341fd39103324382c9cf33fd07380b1cc49e4
7
- data.tar.gz: 2d3fd9536db98424c81f7b730727d5c7fd6034428e9cbd64eb238ed4b4b022267b4f6c2a39b1f6d6008f28e751d05da3341476d7f9366151f481d3ec95b8c91c
6
+ metadata.gz: b31980bb5ef8302a4015ddc5338a7cbb217e666c271ae03781ba530d3823a8608e8afd9d686f80113280ed9033a033b9988fcf8a7a376e791ed2e4a30d7bf159
7
+ data.tar.gz: 8ebaf1d499fbe65e28c61177ddfbbc6efdf6d1438dc854493686b3842d41ae8a0d9f3bb6ef66bede4ecb2c5c0c82a40da50221e376d96974e0bca18a684a6eb5
data/README.md CHANGED
@@ -13,6 +13,8 @@ for how to install Foreman plugins
13
13
 
14
14
  | Foreman Version | Katello Version | Plugin Version |
15
15
  | --------------- | --------------- | -------------- |
16
+ | 2.1 | 3.16 | ~> 1.8.5 |
17
+ | 2.0 | 3.16 | ~> 1.8.4 |
16
18
  | 1.24 | 3.14 | ~> 1.8.0 |
17
19
  | 1.22 | 3.12 | ~> 1.7.0 |
18
20
  | 1.21 | 3.10 | ~> 1.6.0 |
@@ -23,6 +25,9 @@ for how to install Foreman plugins
23
25
  | 1.16 | 3.5 | <= 1.3.0 |
24
26
  | 1.15 | 3.4 | ~> 1.1.0 |
25
27
 
28
+ ## Documentation
29
+ The plugin documentation can be found at https://docs.orcharhino.com/sources/management_ui/the_content_menu/suse_subscriptions.html.
30
+
26
31
  ## Contributing
27
32
 
28
33
  Fork and send a Pull Request. Thanks!
@@ -1,4 +1,5 @@
1
1
  class SccAccountsController < ApplicationController
2
+ helper_method :scc_filtered_products
2
3
  before_action :find_organization
3
4
  before_action :find_resource, only: %i[show edit update destroy sync bulk_subscribe]
4
5
  include Foreman::Controller::AutoCompleteSearch
@@ -7,6 +8,11 @@ class SccAccountsController < ApplicationController
7
8
  def index
8
9
  @scc_accounts = resource_base.search_for(params[:search], order: params[:order])
9
10
  .paginate(page: params[:page])
11
+
12
+ # overwrite the product list with filtered products that do not include products with empty repositories
13
+ @scc_accounts.each do |scc_account|
14
+ scc_account.scc_products_with_repos_count = scc_account.scc_products.only_products_with_repos.count
15
+ end
10
16
  end
11
17
 
12
18
  # GET /scc_accounts/new
@@ -121,9 +127,22 @@ class SccAccountsController < ApplicationController
121
127
  when 'sync', 'test_connection'
122
128
  :sync
123
129
  when 'bulk_subscribe'
124
- :bulk_subscribe
130
+ :use
125
131
  else
126
132
  super
127
133
  end
128
134
  end
135
+
136
+ # Function filters a product list and removes all products without valid repositories
137
+ # The .order call is necessary to apply the ordering to repository that have already been loaded from the database.
138
+ # Input parameters:
139
+ # product_list: list of SccProduct
140
+ # product_type: return only base products if type is set (default), else all
141
+ def scc_filtered_products(product_list, product_type = 'base')
142
+ if product_type == 'base'
143
+ product_list.only_products_with_repos.where(product_type: 'base').order(:friendly_name)
144
+ else
145
+ product_list.only_products_with_repos.order(:friendly_name)
146
+ end
147
+ end
129
148
  end
@@ -2,6 +2,9 @@ class SccAccount < ApplicationRecord
2
2
  include Authorizable
3
3
  include Encryptable
4
4
  include ForemanTasks::Concerns::ActionSubject
5
+
6
+ attr_accessor :scc_products_with_repos_count
7
+
5
8
  encrypts :password
6
9
 
7
10
  NEVER = 'never'.freeze
@@ -2,6 +2,8 @@ class SccProduct < ApplicationRecord
2
2
  include Authorizable
3
3
  include ForemanTasks::Concerns::ActionSubject
4
4
 
5
+ scope :only_products_with_repos, -> { joins(:scc_repositories).distinct }
6
+
5
7
  self.include_root_in_json = false
6
8
 
7
9
  belongs_to :scc_account
@@ -17,15 +17,16 @@
17
17
  <td class="display-two-pane ellipsis">
18
18
  <%= link_to_if_authorized(scc_account.name, hash_for_edit_scc_account_path(:id => scc_account).merge(:auth_object => scc_account, :authorizer => authorizer)) %>
19
19
  </td>
20
- <td><%= scc_account.scc_products.count.to_s %></td>
20
+ <td><%= scc_account.scc_products_with_repos_count.to_s %></td>
21
21
  <td><%= link_to_if(scc_account.sync_task, scc_account.sync_status, scc_account.sync_task) %></td>
22
22
  <td>
23
23
  <%= action_buttons(
24
- display_link_if_authorized(_("Select products"), hash_for_scc_account_path(:id => scc_account).merge(:auth_object => scc_account, :authorizer => authorizer)),
24
+ display_link_if_authorized(_("Select products"), hash_for_scc_account_path(:id => scc_account).merge(:auth_object => scc_account, :authorizer => authorizer, :permission => 'view_scc_accounts')),
25
25
  display_link_if_authorized(_("Sync"), hash_for_sync_scc_account_path(:id => scc_account).merge(:auth_object => scc_account, :authorizer => authorizer),
26
26
  :method => :put),
27
- display_delete_if_authorized(hash_for_scc_account_path(:id => scc_account).merge(:auth_object => scc_account, :authorizer => authorizer),
27
+ display_delete_if_authorized(hash_for_scc_account_path(:id => scc_account).merge(:auth_object => scc_account, :authorizer => authorizer, :permission => 'delete_scc_accounts'),
28
28
  :data => { :confirm => _("Delete %s?") % scc_account.to_s })
29
+
29
30
  ) %>
30
31
  </td>
31
32
  </tr>
@@ -11,8 +11,8 @@
11
11
  </span>
12
12
  <%= scc_product.friendly_name %>
13
13
  <% if scc_product.scc_extensions.any? %>
14
- <ul>
15
- <% scc_product.scc_extensions.order(:friendly_name).each do |scc_extension| %>
14
+ <ul style='padding-left: 20px;'>
15
+ <% scc_filtered_products(scc_product.scc_extensions, 'extension').each do |scc_extension| %>
16
16
  <% render_list_node(f, scc_extension, parent_id + "_" + scc_product.id.to_s) %>
17
17
  <% end %>
18
18
  </ul>
@@ -29,7 +29,7 @@
29
29
  <div class="tab-pane active" id="primary">
30
30
  <ul>
31
31
  <% if @scc_account.synced %>
32
- <% @scc_account.scc_products.where(product_type: 'base').order(:friendly_name).each do |scc_product| %>
32
+ <% scc_filtered_products(@scc_account.scc_products).each do |scc_product| %>
33
33
  <% render_list_node(f, scc_product) %>
34
34
  <% end %>
35
35
  <% else %>
@@ -0,0 +1,22 @@
1
+ class FixSccPermissions < ActiveRecord::Migration[5.2]
2
+ PERMISSION_NAMES = {
3
+ :view_scc => :view_scc_accounts,
4
+ :use_scc => :use_scc_accounts,
5
+ :new_scc => :new_scc_accounts,
6
+ :edit_scc => :edit_scc_accounts,
7
+ :delete_scc => :delete_scc_accounts,
8
+ :sync_scc => :sync_scc_accounts
9
+ }.freeze
10
+
11
+ def up
12
+ PERMISSION_NAMES.each do |old_n, new_n|
13
+ Permission.find_by(name: old_n)&.update(name: new_n, resource_type: 'SccAccount')
14
+ end
15
+ end
16
+
17
+ def down
18
+ PERMISSION_NAMES.each do |old_n, new_n|
19
+ Permission.find_by(name: new_n)&.update(name: old_n, resource_type: nil)
20
+ end
21
+ end
22
+ end
@@ -29,37 +29,48 @@ module ForemanSccManager
29
29
 
30
30
  # Add permissions
31
31
  security_block :foreman_scc_manager do
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
- }
32
+ permission :view_scc_accounts,
33
+ { :scc_accounts => [:show, :index],
34
+ :'api/v2/scc_accounts' => [:show, :index] },
35
+ :resource_type => 'SccAccount'
36
+
37
+ permission :use_scc_accounts,
38
+ { :scc_accounts => [:bulk_subscribe],
39
+ :'api/v2/scc_accounts' => [:bulk_subscribe] },
40
+ :resource_type => 'SccAccount'
41
+
42
+ permission :new_scc_accounts,
43
+ { :scc_accounts => [:new, :create],
44
+ :'api/v2/scc_accounts' => [:create] },
45
+ :resource_type => 'SccAccount'
46
+
47
+ permission :edit_scc_accounts,
48
+ { :scc_accounts => [:edit, :update],
49
+ :'api/v2/scc_accounts' => [:update] },
50
+ :resource_type => 'SccAccount'
51
+
52
+ permission :delete_scc_accounts,
53
+ { :scc_accounts => [:destroy],
54
+ :'api/v2/scc_accounts' => [:destroy] },
55
+ :resource_type => 'SccAccount'
56
+
57
+ permission :sync_scc_accounts,
58
+ { :scc_accounts => [:sync],
59
+ :'api/v2/scc_accounts' => [:sync] },
60
+ :resource_type => 'SccAccount'
56
61
  end
57
62
 
58
63
  # Add a new role called 'SccManager' if it doesn't exist
59
64
  role 'SccManager',
60
- %i[view_scc use_scc new_scc edit_scc delete_scc sync_scc],
65
+ %i[view_scc_accounts use_scc_accounts new_scc_accounts edit_scc_accounts delete_scc_accounts sync_scc_accounts],
61
66
  'Role granting permissons to manage SUSE Subscriptions'
62
67
 
68
+ role 'SccViewer',
69
+ %i[view_scc_accounts use_scc_accounts sync_scc_accounts create_products view_products],
70
+ 'Role granting permissons to view and use SUSE Subscriptions'
71
+
72
+ add_all_permissions_to_default_roles
73
+
63
74
  # add menu entry
64
75
  menu :top_menu, :scc_manager,
65
76
  url_hash: { controller: :scc_accounts, action: :index },
@@ -1,3 +1,3 @@
1
1
  module ForemanSccManager
2
- VERSION = '1.8.4'.freeze
2
+ VERSION = '1.8.5'.freeze
3
3
  end
@@ -14,7 +14,7 @@ end
14
14
 
15
15
  namespace :jenkins do
16
16
  desc 'Test ForemanSccManager with XML output for jenkins'
17
- task 'foreman_scc_manager' do
17
+ task 'foreman_scc_manager' => :environment do
18
18
  Rake::Task['jenkins:setup:minitest'].invoke
19
19
  Rake::Task['rake:test:foreman_scc_manager'].invoke
20
20
  end
@@ -19,3 +19,27 @@ two:
19
19
  friendly_name: number two
20
20
  description: lorem ipsum dolor sit amet
21
21
  product_type: extras
22
+
23
+ three:
24
+ scc_account_id: test_account1
25
+ scc_id: 333
26
+ name: three
27
+ version: 3
28
+ arch: x86_128
29
+ friendly_name: number three
30
+ description: lorem ipsum dolor sit amet
31
+ product_type: base
32
+
33
+ # create a couple of products as scc_extensions
34
+ <% 1.upto(10) do |i| %>
35
+ p_extension_<%= i %>:
36
+ scc_account_id: test_account1
37
+ scc_id: <%= i %>
38
+ name: p_ext_<%= i%>
39
+ version: 3
40
+ arch: x86_128
41
+ friendly_name: number <%= i%>
42
+ description: lorem ipsum dolor sit amet
43
+ product_type: extension
44
+ <% end %>
45
+
@@ -0,0 +1,15 @@
1
+ # repositories for testing the empty repository filtering
2
+ <% 1.upto(8) do |i| %>
3
+ repo_<%= i %>:
4
+ id: <%= i %>
5
+ scc_account_id: 1
6
+ scc_id: <%= 63 + i %>
7
+ name: SLE10-Debuginfo-Updates_<%= i %>
8
+ distro_target: sles_<%= i %>
9
+ description: SLE10-Debuginfo-Updates for sles-10-ppc_<%= i %>
10
+ url: https://updates.suse.com/repo/example_<%= i %>
11
+ token: token_<%= i %>
12
+ autorefresh: true
13
+ installer_updates: false
14
+ <% end %>
15
+
@@ -17,7 +17,11 @@ end
17
17
 
18
18
  class SccProductSearchTest < ActiveSupport::TestCase
19
19
  test 'default ordered by name' do
20
- assert_equal SccProduct.all.pluck(:name), ['one', 'two'].sort
20
+ product_names = ['one', 'two', 'three',
21
+ 'p_ext_1', 'p_ext_10', 'p_ext_2', 'p_ext_3',
22
+ 'p_ext_4', 'p_ext_5', 'p_ext_6', 'p_ext_7',
23
+ 'p_ext_8', 'p_ext_9']
24
+ assert_equal SccProduct.all.pluck(:name), product_names.sort
21
25
  end
22
26
 
23
27
  test 'search name' do
@@ -30,3 +34,54 @@ class SccProductSearchTest < ActiveSupport::TestCase
30
34
  assert_empty empty
31
35
  end
32
36
  end
37
+
38
+ # These produt extension tests are pre-tests for the class ProductEmptyRepoAvailableTests.
39
+ # They do not test any direct functionality of the plugin.
40
+ class SccProductExtensionsTest < ActiveSupport::TestCase
41
+ def setup
42
+ @product_with_extensions = scc_products(:one)
43
+ @product_with_extensions.scc_extensions = scc_products.select { |p| p.product_type == 'extension' }
44
+ @product_with_wrong_extensions = scc_products(:two)
45
+ @product_with_wrong_extensions.scc_extensions = [scc_products(:three)]
46
+ @product_without_extensions = scc_products(:three)
47
+ end
48
+
49
+ test 'check product extensions available' do
50
+ assert_equal @product_with_extensions.scc_extensions.count, 10
51
+ assert_not_empty @product_with_extensions.scc_extensions
52
+ assert_empty @product_without_extensions.scc_extensions
53
+ end
54
+
55
+ test 'product extension of correct type' do
56
+ assert_empty(@product_with_extensions.scc_extensions.reject { |p| p.product_type == 'extension' })
57
+ assert_not_empty(@product_with_wrong_extensions.scc_extensions.reject { |p| p.product_type == 'extension' })
58
+ end
59
+ end
60
+
61
+ class SccProductEmptyRepoAvailableTest < ActiveSupport::TestCase
62
+ def setup
63
+ @product_with_repos = scc_products(:one)
64
+ @product_with_repos.scc_extensions = scc_products.select { |p| p.product_type == 'extension' }
65
+ @product_with_repos.scc_repositories = scc_repositories[0..2]
66
+ @product_with_repos.scc_extensions[1].scc_repositories = scc_repositories[3..4]
67
+ @product_with_repos.scc_extensions[2].scc_repositories = scc_repositories[5..7]
68
+ end
69
+
70
+ test 'products with empty repositories' do
71
+ products_with_repos = SccProduct.only_products_with_repos
72
+ assert_equal SccProduct.all.count { |prod| !prod.scc_repositories.empty? }, 3
73
+ assert_equal products_with_repos.count, 3
74
+ end
75
+ end
76
+
77
+ class SccProductNoRepoTest < ActiveSupport::TestCase
78
+ def setup
79
+ @product_with_repos = scc_products(:one)
80
+ @product_with_repos.scc_extensions = scc_products.select { |p| p.product_type == 'extension' }
81
+ end
82
+
83
+ test 'products without any repositories' do
84
+ products_with_repos = SccProduct.only_products_with_repos
85
+ assert_empty products_with_repos
86
+ end
87
+ end
@@ -1,8 +1,9 @@
1
1
  module ForemanSccManager
2
2
  module FixturesSupport
3
3
  FIXTURE_CLASSES = {
4
- scc_accounts: ForemanSccManager::SccAccount,
5
- scc_products: ForemanSccManager::SccProduct
4
+ scc_accounts: ::SccAccount,
5
+ scc_products: ::SccProduct,
6
+ scc_repositories: ::SccRepository
6
7
  }.freeze
7
8
 
8
9
  def self.set_fixture_classes(test_class)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_scc_manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.4
4
+ version: 1.8.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - ATIX AG
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-04 00:00:00.000000000 Z
11
+ date: 2020-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdoc
@@ -153,6 +153,7 @@ files:
153
153
  - db/migrate/20170505063726_add_sync_status_to_scc_account.rb
154
154
  - db/migrate/20180321000000_change_sync_status_to_sync_task.rb
155
155
  - db/migrate/20190417202427_add_recurring_sync.foreman_scc_manager.rb
156
+ - db/migrate/20200520281300_fix_scc_permissions.rb
156
157
  - lib/foreman_scc_manager.rb
157
158
  - lib/foreman_scc_manager/engine.rb
158
159
  - lib/foreman_scc_manager/version.rb
@@ -176,6 +177,7 @@ files:
176
177
  - test/fixtures/files/data_subscriptions.json
177
178
  - test/fixtures/models/scc_accounts.yml
178
179
  - test/fixtures/models/scc_products.yml
180
+ - test/fixtures/models/scc_repositories.yml
179
181
  - test/models/scc_account_test.rb
180
182
  - test/models/scc_product_test.rb
181
183
  - test/support/fixtures_support.rb
@@ -200,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
200
202
  - !ruby/object:Gem::Version
201
203
  version: '0'
202
204
  requirements: []
203
- rubygems_version: 3.0.6
205
+ rubygems_version: 3.1.2
204
206
  signing_key:
205
207
  specification_version: 4
206
208
  summary: Suse Customer Center plugin for Foreman
@@ -210,6 +212,7 @@ test_files:
210
212
  - test/test_plugin_helper.rb
211
213
  - test/features/sync_test.rb
212
214
  - test/support/fixtures_support.rb
215
+ - test/fixtures/models/scc_repositories.yml
213
216
  - test/fixtures/models/scc_products.yml
214
217
  - test/fixtures/models/scc_accounts.yml
215
218
  - test/fixtures/files/data_subscriptions.json