foreman_scc_manager 1.8.3 → 1.8.8

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -0
  3. data/app/controllers/api/v2/scc_accounts_controller.rb +9 -7
  4. data/app/controllers/scc_accounts_controller.rb +30 -4
  5. data/app/lib/actions/scc_manager/subscribe_product.rb +26 -13
  6. data/app/lib/actions/scc_manager/sync.rb +5 -5
  7. data/app/lib/actions/scc_manager/sync_products.rb +10 -13
  8. data/app/lib/actions/scc_manager/sync_repositories.rb +9 -13
  9. data/app/models/scc_account.rb +63 -5
  10. data/app/models/scc_product.rb +20 -2
  11. data/app/models/scc_repository.rb +11 -9
  12. data/app/views/scc_accounts/_form.html.erb +6 -0
  13. data/app/views/scc_accounts/index.html.erb +4 -3
  14. data/app/views/scc_accounts/show.html.erb +13 -4
  15. data/db/migrate/20200520281300_fix_scc_permissions.rb +22 -0
  16. data/db/migrate/20201119084201_add_gpg_key_to_scc_account.rb +6 -0
  17. data/db/migrate/20210205082733_add_subscription_valid_to_scc_products_and_repos.rb +6 -0
  18. data/db/migrate/20210210104407_add_root_repository_id_to_scc_repository.rb +6 -0
  19. data/db/migrate/20210224095050_connect_katello_root_repository_to_scc_repository.rb +28 -0
  20. data/lib/foreman_scc_manager/engine.rb +36 -25
  21. data/lib/foreman_scc_manager/version.rb +1 -1
  22. data/lib/tasks/test.rake +1 -1
  23. data/locale/de/LC_MESSAGES/foreman_scc_manager.mo +0 -0
  24. data/locale/de/foreman_scc_manager.edit.po +574 -0
  25. data/locale/de/foreman_scc_manager.po +40 -21
  26. data/locale/de/foreman_scc_manager.po.time_stamp +0 -0
  27. data/locale/en/foreman_scc_manager.edit.po +566 -0
  28. data/locale/en/foreman_scc_manager.po +21 -3
  29. data/locale/en/foreman_scc_manager.po.time_stamp +0 -0
  30. data/locale/foreman_scc_manager.pot +65 -38
  31. data/test/controllers/api/v2/scc_accounts_test.rb +9 -3
  32. data/test/controllers/scc_accounts_controller_test.rb +104 -0
  33. data/test/controllers/scc_accounts_controller_test2.rb +51 -0
  34. data/test/fixtures/models/scc_extendings.yml +6 -0
  35. data/test/fixtures/models/scc_products.yml +30 -2
  36. data/test/fixtures/models/scc_repositories.yml +29 -0
  37. data/test/models/scc_account_test.rb +70 -0
  38. data/test/models/scc_product_test.rb +69 -1
  39. data/test/support/fixtures_support.rb +3 -2
  40. data/test/test_controller_helper.rb +15 -0
  41. data/test/test_plugin_helper.rb +9 -0
  42. metadata +33 -14
@@ -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
@@ -25,12 +27,28 @@ class SccProduct < ApplicationRecord
25
27
  "#{scc_id} " + friendly_name
26
28
  end
27
29
 
30
+ def pretty_name
31
+ friendly_name + " (id: #{scc_id})"
32
+ end
33
+
34
+ # Remove HTML tags (currently assumed that there are only paragraph tags)
35
+ # Remove second HTML paragraph if available
36
+ def pretty_description
37
+ new_description = Nokogiri::XML(description).xpath('//p')
38
+ # No tags to remove
39
+ if new_description.count == 0
40
+ description
41
+ else
42
+ new_description.first.children.first.text.strip
43
+ end
44
+ end
45
+
28
46
  def subscribe
29
47
  raise 'Product already subscribed!' if product
30
48
 
31
49
  new_product = Katello::Product.new
32
- new_product.name = uniq_name
33
- new_product.description = description
50
+ new_product.name = pretty_name
51
+ new_product.description = pretty_description
34
52
  ForemanTasks.sync_task(::Actions::Katello::Product::Create, new_product, scc_account.organization)
35
53
  new_product.reload
36
54
  scc_repositories.each do |repo|
@@ -4,6 +4,7 @@ class SccRepository < ApplicationRecord
4
4
  self.include_root_in_json = false
5
5
 
6
6
  belongs_to :scc_account
7
+ belongs_to :katello_root_repository, class_name: 'Katello::RootRepository'
7
8
  has_one :organization, through: :scc_account
8
9
  has_and_belongs_to_many :scc_products
9
10
 
@@ -12,18 +13,19 @@ class SccRepository < ApplicationRecord
12
13
  end
13
14
 
14
15
  def uniq_name(scc_product)
15
- scc_product.uniq_name + ' ' + description
16
+ scc_product.scc_id.to_s + ' ' + description
17
+ end
18
+
19
+ def pretty_name
20
+ description
16
21
  end
17
22
 
18
23
  def token_changed_callback
19
24
  User.current ||= User.anonymous_admin
20
- scc_products.where.not(product: nil).find_each do |sp|
21
- reponame = uniq_name(sp)
22
- repository = sp.product.root_repositories.find_by(name: reponame)
23
- unless repository.nil? || repository.url == full_url
24
- ::Foreman::Logging.logger('foreman_scc_manager').info "Update URL-token for repository '#{reponame}'."
25
- ForemanTasks.async_task(::Actions::Katello::Repository::Update, repository, url: full_url)
26
- end
27
- end
25
+ repo = self.katello_root_repository
26
+ return if repo.nil? || repo.url == full_url
27
+
28
+ ::Foreman::Logging.logger('foreman_scc_manager').info "Update URL-token for repository '#{repo.name}'."
29
+ ForemanTasks.async_task(::Actions::Katello::Repository::Update, repo, url: full_url)
28
30
  end
29
31
  end
@@ -1,3 +1,4 @@
1
+ <!-- see foreman/app/helper/form_helper.rb -->
1
2
  <% javascript 'foreman_scc_manager/scc_accounts' %>
2
3
 
3
4
  <%= form_for(@scc_account) do |f| %>
@@ -18,6 +19,11 @@
18
19
  <%= field f, :sync_date, label: _('Sync Date') do
19
20
  f.datetime_field :sync_date, placeholder: Time.now
20
21
  end %>
22
+ <%= selectable_f f, :katello_gpg_key_id, @selectable_gpg_keys, {},
23
+ { :include_blank => _("None"),
24
+ :label => _('Use GPG key for SUSE products'),
25
+ :selected => @scc_account.katello_gpg_key_id,
26
+ :help_block => _("Use this setting if you want to automatically add a GPG key to your SUSE products upon subscription. You can change this setting in the 'Content' > 'Products' menu, later.") } %>
21
27
  <div class='clearfix'>
22
28
  <div class='form-group'>
23
29
  <div class='col-md-2'></div>
@@ -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>
@@ -1,3 +1,5 @@
1
+ <% title (_("Product Selection for Account %s") % @scc_account) %>
2
+
1
3
  <% javascript 'foreman_scc_manager/scc_accounts' %>
2
4
  <%= form_for([:bulk_subscribe, @scc_account], method: :put) do |f| %>
3
5
  <% def render_list_node(f, scc_product, parent_id = "") %>
@@ -5,14 +7,20 @@
5
7
  <span class="scc_product_checkbox" id="<%= "scc_product_span_#{parent_id + "_" + scc_product.id.to_s}" %>" <%= "data-parent=scc_product_span_#{parent_id}" if parent_id != "" %>>
6
8
  <% if scc_product.product %>
7
9
  <%= check_box_tag("scc_account[scc_unsubscribe_product_ids][]", scc_product.id, true, disabled: true) %>
10
+ <%= link_to(scc_product.pretty_name, "/products/#{scc_product.product_id}") %>
8
11
  <% else %>
9
12
  <%= check_box_tag("scc_account[scc_subscribe_product_ids][]", scc_product.id, false) %>
13
+ <%= scc_product.pretty_name %>
14
+ <% end %>
15
+ <% unless scc_product.subscription_valid? %>
16
+ <span style="color:red">
17
+ <%= _('(WARNING: Please check your SUSE subscription)') %>
18
+ </span>
10
19
  <% end %>
11
20
  </span>
12
- <%= scc_product.friendly_name %>
13
21
  <% if scc_product.scc_extensions.any? %>
14
- <ul>
15
- <% scc_product.scc_extensions.order(:friendly_name).each do |scc_extension| %>
22
+ <ul style='padding-left: 20px;'>
23
+ <% scc_filtered_products(scc_product.scc_extensions, 'extension').each do |scc_extension| %>
16
24
  <% render_list_node(f, scc_extension, parent_id + "_" + scc_product.id.to_s) %>
17
25
  <% end %>
18
26
  </ul>
@@ -29,7 +37,7 @@
29
37
  <div class="tab-pane active" id="primary">
30
38
  <ul>
31
39
  <% if @scc_account.synced %>
32
- <% @scc_account.scc_products.where(product_type: 'base').order(:friendly_name).each do |scc_product| %>
40
+ <% scc_filtered_products(@scc_account.scc_products).each do |scc_product| %>
33
41
  <% render_list_node(f, scc_product) %>
34
42
  <% end %>
35
43
  <% else %>
@@ -41,3 +49,4 @@
41
49
  <%= submit_or_cancel f, false, {disabled: submit_disabled || false} %>
42
50
  </div>
43
51
  <% end %>
52
+
@@ -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
@@ -0,0 +1,6 @@
1
+ class AddGpgKeyToSccAccount < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :scc_accounts, :katello_gpg_key_id, :integer, null: true
4
+ add_foreign_key :scc_accounts, :katello_gpg_keys, column: :katello_gpg_key_id, on_delete: :nullify
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ class AddSubscriptionValidToSccProductsAndRepos < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :scc_products, :subscription_valid, :boolean, null: true
4
+ add_column :scc_repositories, :subscription_valid, :boolean, null: true
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ class AddRootRepositoryIdToSccRepository < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :scc_repositories, :katello_root_repository_id, :integer, index: true, null: true
4
+ add_foreign_key :scc_repositories, :katello_root_repositories, column: :katello_root_repository_id, on_delete: :nullify
5
+ end
6
+ end
@@ -0,0 +1,28 @@
1
+ class ConnectKatelloRootRepositoryToSccRepository < ActiveRecord::Migration[5.2]
2
+ # add SccRepository class, because original one triggers the token_changed_callback
3
+ # which tried to update Katello root repositories
4
+ class SccRepository < ApplicationRecord
5
+ belongs_to :katello_root_repository, class_name: 'Katello::RootRepository'
6
+ end
7
+
8
+ class SccProduct < ApplicationRecord
9
+ belongs_to :product, class_name: 'Katello::Product'
10
+ has_and_belongs_to_many :scc_repositories
11
+ end
12
+
13
+ def up
14
+ SccProduct.where.not(product_id: nil).each do |scc_p|
15
+ # extract all katello root repository ids from subscribed products
16
+ katello_root_repositories = scc_p.product.root_repositories.map { |r| [r.label, r.id] }.to_h
17
+ # match scc repository and katello repository names
18
+ # katello repository name can be
19
+ # 1) equal to scc repo name
20
+ # 2) equal to scc product id + scc product name + scc repo name
21
+ scc_p.scc_repositories.each do |scc_r|
22
+ katello_root_repositories.each do |katello_label, katello_id|
23
+ scc_r.update!(katello_root_repository_id: katello_id) if katello_label.end_with?(::Katello::Util::Model.labelize(scc_r.name))
24
+ end
25
+ end
26
+ end
27
+ end
28
+ 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.3'.freeze
2
+ VERSION = '1.8.8'.freeze
3
3
  end
data/lib/tasks/test.rake CHANGED
@@ -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
@@ -0,0 +1,574 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the foreman_scc_manager package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ # Translators:
7
+ # Wiederoder <stefanwiederoder@googlemail.com>, 2019
8
+ # Bryan Kearney <bryan.kearney@gmail.com>, 2019
9
+ # simon11 <simon.stieger.98@live.de>, 2019
10
+ # Crited <Alexander.Stoll@netways.de>, 2019
11
+ # Michael Moll, 2019
12
+ # Lukas K. <kallies@puzzle.ch>, 2019
13
+ # Markus Bucher <bucher@atix.de>, 2019
14
+ #
15
+ msgid ""
16
+ msgstr ""
17
+ "Project-Id-Version: foreman_scc_manager 1.7.0\n"
18
+ "Report-Msgid-Bugs-To: \n"
19
+ "PO-Revision-Date: 2019-10-17 13:28+0000\n"
20
+ "Last-Translator: Markus Bucher <bucher@atix.de>, 2019\n"
21
+ "Language-Team: German (https://www.transifex.com/foreman/teams/114/de/)\n"
22
+ "MIME-Version: 1.0\n"
23
+ "Content-Type: text/plain; charset=UTF-8\n"
24
+ "Content-Transfer-Encoding: 8bit\n"
25
+ "Language: de\n"
26
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
27
+
28
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:15
29
+ msgid "List all scc_accounts"
30
+ msgstr ""
31
+
32
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:24
33
+ msgid "Show scc_account"
34
+ msgstr ""
35
+
36
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:32
37
+ msgid "Name of the scc_account"
38
+ msgstr ""
39
+
40
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:33 ../app/controllers/api/v2/scc_accounts_controller.rb:65
41
+ msgid "Login id of scc_account"
42
+ msgstr ""
43
+
44
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:34 ../app/controllers/api/v2/scc_accounts_controller.rb:66
45
+ msgid "Password of scc_account"
46
+ msgstr ""
47
+
48
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:35 ../app/controllers/api/v2/scc_accounts_controller.rb:67
49
+ msgid "URL of SUSE for scc_account"
50
+ msgstr ""
51
+
52
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:36
53
+ msgid "Interval for syncing scc_account"
54
+ msgstr ""
55
+
56
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:37
57
+ msgid "Date and time relative to which the sync interval is run"
58
+ msgstr ""
59
+
60
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:38
61
+ msgid "Associated gpg key of scc_account"
62
+ msgstr ""
63
+
64
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:42
65
+ msgid "Create an scc_account"
66
+ msgstr ""
67
+
68
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:49
69
+ msgid "Update scc_account"
70
+ msgstr ""
71
+
72
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:56
73
+ msgid "Delete scc_account"
74
+ msgstr ""
75
+
76
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:62 ../app/controllers/api/v2/scc_accounts_controller.rb:63
77
+ msgid "Test connection for scc_account"
78
+ msgstr ""
79
+
80
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:90
81
+ msgid "Sync scc_account"
82
+ msgstr ""
83
+
84
+ #: ../app/controllers/api/v2/scc_accounts_controller.rb:104
85
+ msgid "Bulk subscription of scc_products for scc_account"
86
+ msgstr ""
87
+
88
+ #: ../app/controllers/api/v2/scc_products_controller.rb:15
89
+ msgid "List all products for scc_account"
90
+ msgstr ""
91
+
92
+ #: ../app/controllers/api/v2/scc_products_controller.rb:24
93
+ msgid "Show an scc_account product"
94
+ msgstr ""
95
+
96
+ #: ../app/controllers/api/v2/scc_products_controller.rb:29
97
+ msgid "Subscribe product"
98
+ msgstr ""
99
+
100
+ #: ../app/controllers/scc_accounts_controller.rb:71
101
+ msgid "Sync task started."
102
+ msgstr "Sync Job gestartet."
103
+
104
+ #: ../app/controllers/scc_accounts_controller.rb:73 ../app/controllers/scc_accounts_controller.rb:93
105
+ msgid "Failed to add task to queue: %s"
106
+ msgstr "Aufgabe konnte nicht in die Warteschlange gestellt werden: %s"
107
+
108
+ #: ../app/controllers/scc_accounts_controller.rb:75 ../app/controllers/scc_accounts_controller.rb:95
109
+ msgid "Lock on SCC account already taken: %s"
110
+ msgstr "Lock für SCC Zugang bereits vergeben: %s"
111
+
112
+ #: ../app/controllers/scc_accounts_controller.rb:88
113
+ msgid "Task to subscribe products started."
114
+ msgstr "Job zum abonnieren von Produkten gestartet."
115
+
116
+ #: ../app/controllers/scc_accounts_controller.rb:90
117
+ msgid "No products selected."
118
+ msgstr "Keine Produkte ausgewählt."
119
+
120
+ #: ../app/lib/actions/scc_manager/subscribe_product.rb:5
121
+ msgid "Product already subscribed!"
122
+ msgstr "Produkt wurde bereits abonniert!"
123
+
124
+ #: ../app/lib/actions/scc_manager/subscribe_product.rb:46 action_names.rb:5
125
+ msgid "Subscribe SCC Product"
126
+ msgstr "SCC Produkt abonnieren"
127
+
128
+ #: ../app/lib/actions/scc_manager/sync.rb:27 action_names.rb:4
129
+ msgid "Sync SUSE subscriptions"
130
+ msgstr "SUSE Abonnements synchronisieren"
131
+
132
+ #: ../app/lib/actions/scc_manager/sync_plan_account_repositories.rb:31
133
+ msgid "Update SUSE repositories %s"
134
+ msgstr "SUSE Repositorien %s aktualisieren"
135
+
136
+ #: ../app/lib/actions/scc_manager/sync_plan_account_repositories.rb:31
137
+ msgid "Unknown"
138
+ msgstr "Unbekannt"
139
+
140
+ #: ../app/lib/actions/scc_manager/sync_plan_account_repositories.rb:33 action_names.rb:9
141
+ msgid "Update SUSE repositories"
142
+ msgstr "SUSE Repositorien aktualisieren"
143
+
144
+ #: ../app/lib/actions/scc_manager/sync_products.rb:36 action_names.rb:3
145
+ msgid "Sync SUSE subscriptions (Products)"
146
+ msgstr "SUSE Abonnements (Produkte) synchronisieren"
147
+
148
+ #: ../app/lib/actions/scc_manager/sync_repositories.rb:34 action_names.rb:2
149
+ msgid "Sync SUSE subscriptions (Repositories)"
150
+ msgstr "SUSE Abonnements (Repositorien) synchronisieren"
151
+
152
+ #: ../app/models/scc_account.rb:62
153
+ msgid "never synced"
154
+ msgstr "Nie synchronisiert"
155
+
156
+ #: ../app/models/scc_account.rb:109
157
+ msgid "Interval cannot be nil"
158
+ msgstr "Intervall darf nicht Null sein"
159
+
160
+ #: ../app/models/scc_account.rb:116
161
+ msgid "Interval not set correctly"
162
+ msgstr "Intervall nicht richtig gesetzt"
163
+
164
+ #: ../app/models/scc_account.rb:121
165
+ msgid "Cron expression is not valid!"
166
+ msgstr "Cron-Ausdruck ungültig!"
167
+
168
+ #: ../app/models/scc_account_sync_plan_task_group.rb:5
169
+ msgid "SUSE Subscription"
170
+ msgstr "SUSE Abonnement"
171
+
172
+ #: ../app/views/scc_account_sync_plan_task_groups/_scc_account_sync_plan_task_groups.html.erb:1
173
+ msgid "SUSE Subscription: "
174
+ msgstr "SUSE Abonnement:"
175
+
176
+ #: ../app/views/scc_accounts/_form.html.erb:7
177
+ msgid "SUSE Customer Center account"
178
+ msgstr "SUSE Customer Center Konto"
179
+
180
+ #: ../app/views/scc_accounts/_form.html.erb:14
181
+ msgid "Use your 'Organization credentials' obtained from the SUSE Customer Center."
182
+ msgstr "Verwenden Sie die \"Organisationszugangsdaten\" aus dem SUSE Customer Center."
183
+
184
+ #: ../app/views/scc_accounts/_form.html.erb:16
185
+ msgid "Base URL"
186
+ msgstr "Basis URL"
187
+
188
+ #: ../app/views/scc_accounts/_form.html.erb:18
189
+ msgid "Sync interval"
190
+ msgstr ""
191
+
192
+ #: ../app/views/scc_accounts/_form.html.erb:18
193
+ msgid "The sync interval is used to periodically update the SCC authentication tokens of any imported products."
194
+ msgstr ""
195
+
196
+ #: ../app/views/scc_accounts/_form.html.erb:19
197
+ msgid "Sync Date"
198
+ msgstr "Synchronisationsdatum"
199
+
200
+ #: ../app/views/scc_accounts/_form.html.erb:23
201
+ msgid "None"
202
+ msgstr ""
203
+
204
+ #: ../app/views/scc_accounts/_form.html.erb:24
205
+ msgid "Use GPG key for SUSE products"
206
+ msgstr ""
207
+
208
+ #: ../app/views/scc_accounts/_form.html.erb:26
209
+ msgid "Use this setting if you want to automatically add a GPG key to your SUSE products upon subscription. You can change this setting in the 'Content' > 'Products' menu, later."
210
+ msgstr ""
211
+
212
+ #: ../app/views/scc_accounts/_form.html.erb:31
213
+ msgid "Test Connection"
214
+ msgstr "Verbindung testen"
215
+
216
+ #: ../app/views/scc_accounts/edit.html.erb:1
217
+ msgid "Edit %s"
218
+ msgstr "%s bearbeiten"
219
+
220
+ #: ../app/views/scc_accounts/index.html.erb:2
221
+ msgid "SUSE subscriptions"
222
+ msgstr "SUSE Abonnements"
223
+
224
+ #: ../app/views/scc_accounts/index.html.erb:3
225
+ msgid "Add SCC account"
226
+ msgstr "SCC Konto hinzufügen"
227
+
228
+ #: ../app/views/scc_accounts/index.html.erb:9
229
+ msgid "Products"
230
+ msgstr "Produkte"
231
+
232
+ #: ../app/views/scc_accounts/index.html.erb:10
233
+ msgid "Last synced"
234
+ msgstr "Letzte Synchronisation"
235
+
236
+ #: ../app/views/scc_accounts/index.html.erb:11
237
+ msgid "Actions"
238
+ msgstr "Aktionen"
239
+
240
+ #: ../app/views/scc_accounts/index.html.erb:24
241
+ msgid "Select products"
242
+ msgstr "Produkte auswählen"
243
+
244
+ #: ../app/views/scc_accounts/index.html.erb:25
245
+ msgid "Sync"
246
+ msgstr "Synchronisation"
247
+
248
+ #: ../app/views/scc_accounts/index.html.erb:28
249
+ msgid "Delete %s?"
250
+ msgstr "%s löschen?"
251
+
252
+ #: ../app/views/scc_accounts/new.html.erb:1
253
+ msgid "Add SUSE Customer Center Account"
254
+ msgstr "SUSE Customer Center Konto hinzufügen"
255
+
256
+ #: ../app/views/scc_accounts/show.html.erb:1
257
+ msgid "Product Selection for Account %s"
258
+ msgstr ""
259
+
260
+ #: ../app/views/scc_accounts/show.html.erb:17
261
+ msgid "(WARNING: Please check your SUSE subscription)"
262
+ msgstr ""
263
+
264
+ #: ../app/views/scc_accounts/show.html.erb:33
265
+ msgid "SUSE Customer Center"
266
+ msgstr "SUSE Customer Center"
267
+
268
+ #: ../app/views/scc_accounts/show.html.erb:44
269
+ msgid "Please sync your SUSE subscriptions first."
270
+ msgstr "Bitte synchronisieren Sie zuerst Ihre SUSE Abonnements."
271
+
272
+ #: ../lib/foreman_scc_manager/engine.rb:77
273
+ msgid "SUSE Subscriptions"
274
+ msgstr "SUSE Abonnements"
275
+
276
+ #: action_names.rb:6
277
+ msgid "Action with sub plans"
278
+ msgstr ""
279
+
280
+ #: action_names.rb:7
281
+ msgid "Import facts"
282
+ msgstr ""
283
+
284
+ #: action_names.rb:8
285
+ msgid "Import Puppet classes"
286
+ msgstr ""
287
+
288
+ #: action_names.rb:10
289
+ msgid "Abstract async task"
290
+ msgstr ""
291
+
292
+ #: action_names.rb:11
293
+ msgid "Export"
294
+ msgstr ""
295
+
296
+ #: action_names.rb:12
297
+ msgid "Import"
298
+ msgstr ""
299
+
300
+ #: action_names.rb:13
301
+ msgid "Copy version units to library"
302
+ msgstr ""
303
+
304
+ #: action_names.rb:14
305
+ msgid "Create"
306
+ msgstr ""
307
+
308
+ #: action_names.rb:15
309
+ msgid "Delete Activation Key"
310
+ msgstr ""
311
+
312
+ #: action_names.rb:16
313
+ msgid "Update"
314
+ msgstr ""
315
+
316
+ #: action_names.rb:17
317
+ msgid "Generate host applicability"
318
+ msgstr ""
319
+
320
+ #: action_names.rb:18
321
+ msgid "Bulk generate applicability for hosts"
322
+ msgstr ""
323
+
324
+ #: action_names.rb:19
325
+ msgid "Generate repository applicability"
326
+ msgstr ""
327
+
328
+ #: action_names.rb:20
329
+ msgid "Synchronize smart proxy"
330
+ msgstr ""
331
+
332
+ #: action_names.rb:21
333
+ msgid "Sync capsule"
334
+ msgstr ""
335
+
336
+ #: action_names.rb:22
337
+ msgid "Delete"
338
+ msgstr ""
339
+
340
+ #: action_names.rb:23
341
+ msgid "Errata mail"
342
+ msgstr ""
343
+
344
+ #: action_names.rb:24
345
+ msgid "Incremental Update of Content View Version(s) "
346
+ msgstr ""
347
+
348
+ #: action_names.rb:25
349
+ msgid "Promote"
350
+ msgstr ""
351
+
352
+ #: action_names.rb:26
353
+ msgid "Promotion to Environment"
354
+ msgstr ""
355
+
356
+ #: action_names.rb:27
357
+ msgid "Publish"
358
+ msgstr ""
359
+
360
+ #: action_names.rb:28
361
+ msgid "Remove Versions and Associations"
362
+ msgstr ""
363
+
364
+ #: action_names.rb:29
365
+ msgid "Remove from Environment"
366
+ msgstr ""
367
+
368
+ #: action_names.rb:30
369
+ msgid "Remove Version"
370
+ msgstr ""
371
+
372
+ #: action_names.rb:31
373
+ msgid "Auto attach subscriptions"
374
+ msgstr ""
375
+
376
+ #: action_names.rb:32
377
+ msgid "Destroy Content Host"
378
+ msgstr ""
379
+
380
+ #: action_names.rb:33
381
+ msgid "Install Applicable Errata"
382
+ msgstr ""
383
+
384
+ #: action_names.rb:34
385
+ msgid "Install erratum"
386
+ msgstr ""
387
+
388
+ #: action_names.rb:35
389
+ msgid "Hypervisors"
390
+ msgstr ""
391
+
392
+ #: action_names.rb:36
393
+ msgid "Import Content View Version"
394
+ msgstr ""
395
+
396
+ #: action_names.rb:37
397
+ msgid "Incremental Update"
398
+ msgstr ""
399
+
400
+ #: action_names.rb:38
401
+ msgid "Republish Version Repositories"
402
+ msgstr ""
403
+
404
+ #: action_names.rb:39
405
+ msgid "Delete Lifecycle Environment"
406
+ msgstr ""
407
+
408
+ #: action_names.rb:40
409
+ msgid "Publish Lifecycle Environment Repositories"
410
+ msgstr ""
411
+
412
+ #: action_names.rb:41
413
+ msgid "Attach subscriptions"
414
+ msgstr ""
415
+
416
+ #: action_names.rb:42
417
+ msgid "Remove subscriptions"
418
+ msgstr ""
419
+
420
+ #: action_names.rb:43
421
+ msgid "Update Content Overrides"
422
+ msgstr ""
423
+
424
+ #: action_names.rb:44
425
+ msgid "Hypervisors update"
426
+ msgstr ""
427
+
428
+ #: action_names.rb:45
429
+ msgid "Install package"
430
+ msgstr ""
431
+
432
+ #: action_names.rb:46
433
+ msgid "Remove package"
434
+ msgstr ""
435
+
436
+ #: action_names.rb:47
437
+ msgid "Update package"
438
+ msgstr ""
439
+
440
+ #: action_names.rb:48
441
+ msgid "Install package group"
442
+ msgstr ""
443
+
444
+ #: action_names.rb:49
445
+ msgid "Remove package group"
446
+ msgstr ""
447
+
448
+ #: action_names.rb:50
449
+ msgid "Updating System Purpose for host"
450
+ msgstr ""
451
+
452
+ #: action_names.rb:51
453
+ msgid "Package Profile Update"
454
+ msgstr ""
455
+
456
+ #: action_names.rb:52
457
+ msgid "Update for host"
458
+ msgstr ""
459
+
460
+ #: action_names.rb:53
461
+ msgid "Update release version for host"
462
+ msgstr ""
463
+
464
+ #: action_names.rb:54
465
+ msgid "Combined Profile Update"
466
+ msgstr ""
467
+
468
+ #: action_names.rb:55
469
+ msgid "Destroy"
470
+ msgstr ""
471
+
472
+ #: action_names.rb:56
473
+ msgid "Run Sync Plan:"
474
+ msgstr ""
475
+
476
+ #: action_names.rb:57
477
+ msgid "Product Create"
478
+ msgstr ""
479
+
480
+ #: action_names.rb:58
481
+ msgid "Disable"
482
+ msgstr ""
483
+
484
+ #: action_names.rb:59
485
+ msgid "Delete Product"
486
+ msgstr ""
487
+
488
+ #: action_names.rb:60
489
+ msgid "Enable"
490
+ msgstr ""
491
+
492
+ #: action_names.rb:61
493
+ msgid "Create Package Group"
494
+ msgstr ""
495
+
496
+ #: action_names.rb:62
497
+ msgid "Reindex subscriptions"
498
+ msgstr ""
499
+
500
+ #: action_names.rb:63
501
+ msgid "Verify checksum"
502
+ msgstr ""
503
+
504
+ #: action_names.rb:64
505
+ msgid "Upload into"
506
+ msgstr ""
507
+
508
+ #: action_names.rb:65
509
+ msgid "Upload errata into"
510
+ msgstr ""
511
+
512
+ #: action_names.rb:66
513
+ msgid "Update http proxy"
514
+ msgstr ""
515
+
516
+ #: action_names.rb:67
517
+ msgid "Update redhat repository"
518
+ msgstr ""
519
+
520
+ #: action_names.rb:68
521
+ msgid "Update http proxy details"
522
+ msgstr ""
523
+
524
+ #: action_names.rb:69
525
+ msgid "Update content urls"
526
+ msgstr ""
527
+
528
+ #: action_names.rb:70
529
+ msgid "Synchronize"
530
+ msgstr ""
531
+
532
+ #: action_names.rb:71
533
+ msgid "Remove Content"
534
+ msgstr ""
535
+
536
+ #: action_names.rb:72
537
+ msgid "Delete Package Group"
538
+ msgstr ""
539
+
540
+ #: action_names.rb:73
541
+ msgid "Discover"
542
+ msgstr ""
543
+
544
+ #: action_names.rb:74
545
+ msgid "Instance update"
546
+ msgstr ""
547
+
548
+ #: action_names.rb:75
549
+ msgid "Fetch pxe files"
550
+ msgstr ""
551
+
552
+ #: action_names.rb:76
553
+ msgid "Index module streams"
554
+ msgstr ""
555
+
556
+ #: action_names.rb:77
557
+ msgid "Index package groups"
558
+ msgstr ""
559
+
560
+ #: action_names.rb:78
561
+ msgid "Filtered index content"
562
+ msgstr ""
563
+
564
+ #: action_names.rb:79
565
+ msgid "Index errata"
566
+ msgstr ""
567
+
568
+ #: action_names.rb:80
569
+ msgid "Index content"
570
+ msgstr ""
571
+
572
+ #: gemspec.rb:2
573
+ msgid "Foreman plugin to sync SUSE Customer Center products and repositories into Katello."
574
+ msgstr "Foreman Plugin um SUSE Customer Center Produkte und Repositorien in Katello zu importieren."