foreman_scc_manager 1.6.1 → 1.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/scc_accounts_controller.rb +17 -11
- data/app/lib/actions/scc_manager/subscribe_product.rb +1 -0
- data/app/lib/actions/scc_manager/sync.rb +1 -0
- data/app/lib/actions/scc_manager/sync_plan_account_repositories.rb +38 -0
- data/app/lib/actions/scc_manager/sync_repositories.rb +3 -2
- data/app/lib/scc_manager.rb +1 -0
- data/app/models/concerns/recurring_logic_extensions.rb +9 -0
- data/app/models/scc_account.rb +123 -1
- data/app/models/scc_account_sync_plan_task_group.rb +7 -0
- data/app/models/scc_product.rb +1 -0
- data/app/views/scc_account_sync_plan_task_groups/_scc_account_sync_plan_task_groups.html.erb +4 -0
- data/app/views/scc_accounts/_form.html.erb +4 -0
- data/config/routes.rb +1 -0
- data/db/migrate/20190417202427_add_recurring_sync.foreman_scc_manager.rb +26 -0
- data/lib/foreman_scc_manager/engine.rb +4 -0
- data/lib/foreman_scc_manager/version.rb +1 -1
- data/lib/tasks/rubocop.rake +32 -0
- data/lib/tasks/test.rake +26 -0
- data/test/features/data_products_page1.json +10468 -0
- data/test/features/data_products_page2.json +11277 -0
- data/test/features/data_subscriptions.json +88 -0
- data/test/features/sync_test.rb +141 -0
- data/test/fixtures/models/scc_accounts.yml +24 -0
- data/test/fixtures/models/scc_products.yml +21 -0
- data/test/models/scc_account_test.rb +74 -0
- data/test/models/scc_product_test.rb +32 -0
- data/test/support/fixtures_support.rb +12 -0
- data/test/test_plugin_helper.rb +54 -0
- metadata +43 -5
- data/lib/tasks/foreman_scc_manager_tasks.rake +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3107d456ab7e1c5f822a4cbd7bd7ab1892d9f44fbcceb8bd60ec0ffb0746a685
|
4
|
+
data.tar.gz: 4d048099707ca69af205df6ffa0dc31b178e96fcd4a817f4ec4106e6927b255d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba3d694f7bdf5978877b7304b6d71a2a035bf58122ac7e1969914d4cd8b6a55adabd174965b10092b32986ec31d31f9e585f0d6a6ebf8045edae20305223538c
|
7
|
+
data.tar.gz: 998d9f9d79624bb1f42e69c8ad546d6dd1c309c373a9a5db11cf849da266ecf0e83d54b77a1e260476b40169d1183c600cafcef1bf99fb8854fc61a3594e783d
|
@@ -18,11 +18,10 @@ class SccAccountsController < ApplicationController
|
|
18
18
|
# POST /scc_accounts
|
19
19
|
def create
|
20
20
|
@scc_account = SccAccount.new(scc_account_params)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
21
|
+
@scc_account.save_with_logic!
|
22
|
+
process_success
|
23
|
+
rescue ActiveRecord::RecordInvalid
|
24
|
+
process_error
|
26
25
|
end
|
27
26
|
|
28
27
|
# GET /scc_accounts/1/edit
|
@@ -43,11 +42,10 @@ class SccAccountsController < ApplicationController
|
|
43
42
|
|
44
43
|
# PATCH/PUT /scc_accounts/1
|
45
44
|
def update
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
45
|
+
@scc_account.update_attributes_with_logic!(scc_account_params)
|
46
|
+
process_success
|
47
|
+
rescue ActiveRecord::RecordInvalid
|
48
|
+
process_error
|
51
49
|
end
|
52
50
|
|
53
51
|
# DELETE /scc_accounts/1
|
@@ -103,7 +101,15 @@ class SccAccountsController < ApplicationController
|
|
103
101
|
# Only allow a trusted parameter "white list" through.
|
104
102
|
def scc_account_params
|
105
103
|
params[:scc_account].delete(:password) if params[:scc_account][:password].blank?
|
106
|
-
params.require(:scc_account).permit(
|
104
|
+
params.require(:scc_account).permit(
|
105
|
+
:name,
|
106
|
+
:login,
|
107
|
+
:password,
|
108
|
+
:base_url,
|
109
|
+
:interval,
|
110
|
+
:sync_date,
|
111
|
+
:organization_id
|
112
|
+
)
|
107
113
|
end
|
108
114
|
|
109
115
|
def scc_bulk_subscribe_params
|
@@ -3,6 +3,7 @@ module Actions
|
|
3
3
|
class SubscribeProduct < Actions::EntryAction
|
4
4
|
def plan(scc_product)
|
5
5
|
raise _('Product already subscribed!') if scc_product.product
|
6
|
+
|
6
7
|
::Foreman::Logging.logger('foreman_scc_manager')
|
7
8
|
.info("Initiating subscription for SccProduct '#{scc_product.friendly_name}'.")
|
8
9
|
sequence do
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Actions
|
2
|
+
module SccManager
|
3
|
+
class SyncPlanAccountRepositories < Actions::EntryAction
|
4
|
+
include Actions::RecurringAction
|
5
|
+
def plan(scc_account)
|
6
|
+
add_missing_task_group(scc_account)
|
7
|
+
action_subject(scc_account)
|
8
|
+
|
9
|
+
User.as_anonymous_admin do
|
10
|
+
plan_action(::Actions::SccManager::SyncRepositories, scc_account)
|
11
|
+
plan_self(:sync_plan_name => scc_account.name)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_missing_task_group(sync_plan)
|
16
|
+
if sync_plan.task_group.nil?
|
17
|
+
sync_plan.task_group = ::SccAccountSyncPlanTaskGroup.create!
|
18
|
+
sync_plan.save!
|
19
|
+
end
|
20
|
+
task.add_missing_task_groups(sync_plan.task_group)
|
21
|
+
end
|
22
|
+
|
23
|
+
def rescue_strategy
|
24
|
+
# Dynflow::Action::Rescue::Skip
|
25
|
+
# REMOVEME
|
26
|
+
Dynflow::Action::Rescue::Fail
|
27
|
+
end
|
28
|
+
|
29
|
+
def humanized_name
|
30
|
+
if input.try(:[], :sync_plan_name)
|
31
|
+
_('Update SUSE repositories %s') % (input[:sync_plan_name] || _('Unknown'))
|
32
|
+
else
|
33
|
+
_('Update SUSE repositories')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -9,12 +9,13 @@ module Actions
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def run
|
12
|
-
output[:status] = '
|
12
|
+
output[:status] = 'IN PROGRESS'
|
13
13
|
begin
|
14
14
|
output[:data] = ::SccManager.get_scc_data(input[:base_url],
|
15
15
|
'/connect/organizations/repositories',
|
16
16
|
input[:login],
|
17
17
|
input[:password])
|
18
|
+
output[:status] = 'SUCCESS'
|
18
19
|
rescue StandardError
|
19
20
|
output[:status] = 'FAILURE'
|
20
21
|
end
|
@@ -37,7 +38,7 @@ module Actions
|
|
37
38
|
end
|
38
39
|
|
39
40
|
def humanized_output
|
40
|
-
output.dup.update(data:
|
41
|
+
output.dup.update(data: "Trimmed (got #{output[:data]&.length} repositories")
|
41
42
|
end
|
42
43
|
end
|
43
44
|
end
|
data/app/lib/scc_manager.rb
CHANGED
@@ -21,6 +21,7 @@ module SccManager
|
|
21
21
|
loop do
|
22
22
|
response = RestClient.get url, auth_header
|
23
23
|
raise 'Connection to SUSE costomer center failed.' unless response.code == 200
|
24
|
+
|
24
25
|
links = (response.headers[:link] || '').split(', ').map do |link|
|
25
26
|
href, rel = /<(.*?)>; rel="(\w+)"/.match(link).captures
|
26
27
|
[rel.to_sym, href]
|
data/app/models/scc_account.rb
CHANGED
@@ -4,12 +4,20 @@ class SccAccount < ApplicationRecord
|
|
4
4
|
include ForemanTasks::Concerns::ActionSubject
|
5
5
|
encrypts :password
|
6
6
|
|
7
|
+
NEVER = 'never'.freeze
|
8
|
+
DAILY = 'daily'.freeze
|
9
|
+
WEEKLY = 'weekly'.freeze
|
10
|
+
MONTHLY = 'monthly'.freeze
|
11
|
+
TYPES = [NEVER, DAILY, WEEKLY, MONTHLY].freeze
|
12
|
+
|
7
13
|
self.include_root_in_json = false
|
8
14
|
|
9
15
|
belongs_to :organization
|
10
16
|
belongs_to :sync_task, class_name: 'ForemanTasks::Task'
|
11
17
|
has_many :scc_products, dependent: :destroy
|
12
18
|
has_many :scc_repositories, dependent: :destroy
|
19
|
+
belongs_to :foreman_tasks_recurring_logic, :inverse_of => :scc_account, :class_name => 'ForemanTasks::RecurringLogic', :dependent => :destroy
|
20
|
+
belongs_to :task_group, :class_name => 'SccAccountSyncPlanTaskGroup', :inverse_of => :scc_account
|
13
21
|
|
14
22
|
validates_lengths_from_database
|
15
23
|
validates :name, presence: true
|
@@ -17,11 +25,30 @@ class SccAccount < ApplicationRecord
|
|
17
25
|
validates :login, presence: true
|
18
26
|
validates :password, presence: true
|
19
27
|
validates :base_url, presence: true
|
28
|
+
validates :interval, :inclusion => { :in => TYPES }, :allow_blank => false
|
29
|
+
validate :sync_date_is_valid_datetime
|
30
|
+
|
31
|
+
after_initialize :init
|
32
|
+
before_destroy :cancel_recurring_logic
|
20
33
|
|
21
34
|
default_scope -> { order(:login) }
|
22
35
|
|
23
36
|
scoped_search on: :login, complete_value: true
|
24
37
|
|
38
|
+
def init
|
39
|
+
# set default values
|
40
|
+
self.sync_date ||= Time.new if self.new_record?
|
41
|
+
end
|
42
|
+
|
43
|
+
def sync_date_is_valid_datetime
|
44
|
+
errors.add(:sync_date, 'must be a valid datetime') if interval != NEVER &&
|
45
|
+
sync_date.present? &&
|
46
|
+
!sync_date.respond_to?(:min) &&
|
47
|
+
!sync_date.respond_to?(:hour) &&
|
48
|
+
!sync_date.respond_to?(:wday) &&
|
49
|
+
!sync_date.respond_to?(:day)
|
50
|
+
end
|
51
|
+
|
25
52
|
def to_s
|
26
53
|
name
|
27
54
|
end
|
@@ -40,8 +67,103 @@ class SccAccount < ApplicationRecord
|
|
40
67
|
end
|
41
68
|
end
|
42
69
|
|
70
|
+
def use_recurring_logic?
|
71
|
+
self.interval != NEVER
|
72
|
+
end
|
73
|
+
|
74
|
+
def save_with_logic!
|
75
|
+
self.task_group ||= SccAccountSyncPlanTaskGroup.create!
|
76
|
+
|
77
|
+
associate_recurring_logic if self.valid?
|
78
|
+
|
79
|
+
self.save!
|
80
|
+
start_recurring_logic if self.use_recurring_logic?
|
81
|
+
|
82
|
+
true
|
83
|
+
end
|
84
|
+
|
85
|
+
def update_attributes_with_logic!(params)
|
86
|
+
transaction do
|
87
|
+
self.update_attributes!(params)
|
88
|
+
if rec_logic_changed?
|
89
|
+
old_rec_logic = self.foreman_tasks_recurring_logic
|
90
|
+
associate_recurring_logic
|
91
|
+
self.save!
|
92
|
+
old_rec_logic&.cancel
|
93
|
+
# Can/Should we do that???
|
94
|
+
old_rec_logic&.destroy
|
95
|
+
start_recurring_logic
|
96
|
+
end
|
97
|
+
toggle_enabled if enabled_toggle?
|
98
|
+
end
|
99
|
+
true
|
100
|
+
end
|
101
|
+
|
102
|
+
def add_recurring_logic(sync_date, interval)
|
103
|
+
sd = sync_date
|
104
|
+
|
105
|
+
raise _('Interval cannot be nil') if interval.nil?
|
106
|
+
|
107
|
+
cron = case interval.downcase
|
108
|
+
when DAILY then "#{sd.min} #{sd.hour} * * *"
|
109
|
+
when WEEKLY then "#{sd.min} #{sd.hour} * * #{sd.wday}"
|
110
|
+
when MONTHLY then "#{sd.min} #{sd.hour} #{sd.day} * *"
|
111
|
+
else
|
112
|
+
raise _('Interval not set correctly')
|
113
|
+
end
|
114
|
+
|
115
|
+
recurring_logic = ForemanTasks::RecurringLogic.new_from_cronline(cron)
|
116
|
+
|
117
|
+
raise _('Cron expression is not valid!') unless recurring_logic.valid_cronline?
|
118
|
+
|
119
|
+
recurring_logic.save!
|
120
|
+
recurring_logic
|
121
|
+
end
|
122
|
+
|
123
|
+
def associate_recurring_logic
|
124
|
+
if self.use_recurring_logic?
|
125
|
+
self.foreman_tasks_recurring_logic = add_recurring_logic(self.sync_date, self.interval)
|
126
|
+
else
|
127
|
+
self.foreman_tasks_recurring_logic = nil
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def toggle_enabled
|
132
|
+
self.foreman_tasks_recurring_logic&.enabled = self.enabled
|
133
|
+
end
|
134
|
+
|
135
|
+
def start_recurring_logic
|
136
|
+
# rubocop:disable Style/GuardClause
|
137
|
+
if self.use_recurring_logic?
|
138
|
+
User.as_anonymous_admin do
|
139
|
+
if self.sync_date.to_time < Time.now
|
140
|
+
self.foreman_tasks_recurring_logic.start(::Actions::SccManager::SyncPlanAccountRepositories, self)
|
141
|
+
else
|
142
|
+
self.foreman_tasks_recurring_logic.start_after(::Actions::SccManager::SyncPlanAccountRepositories, self.sync_date, self)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
# rubocop:enable Style/GuardClause
|
147
|
+
end
|
148
|
+
|
149
|
+
def cancel_recurring_logic
|
150
|
+
self.foreman_tasks_recurring_logic&.cancel
|
151
|
+
end
|
152
|
+
|
153
|
+
def rec_logic_changed?
|
154
|
+
saved_change_to_attribute?(:sync_date) || saved_change_to_attribute?(:interval)
|
155
|
+
end
|
156
|
+
|
157
|
+
def enabled_toggle?
|
158
|
+
saved_change_to_attribute?(:enabled)
|
159
|
+
end
|
160
|
+
|
161
|
+
def get_scc_data(rel_url)
|
162
|
+
SccManager.get_scc_data(base_url, rel_url, login, password)
|
163
|
+
end
|
164
|
+
|
43
165
|
def test_connection
|
44
|
-
|
166
|
+
get_scc_data('/connect/organizations/subscriptions')
|
45
167
|
true
|
46
168
|
rescue StandardError
|
47
169
|
false
|
data/app/models/scc_product.rb
CHANGED
@@ -13,6 +13,10 @@
|
|
13
13
|
<%= text_f f, :login, :help_block => _("Use your 'Organization credentials' obtained from the SUSE Customer Center.") %>
|
14
14
|
<%= password_f f, :password %>
|
15
15
|
<%= text_f f, :base_url, label: _('Base URL') %>
|
16
|
+
<%= selectable_f f, :interval, SccAccount::TYPES, label: _('Interval') %>
|
17
|
+
<%= field f, :sync_date, label: _('Sync Date') do
|
18
|
+
f.datetime_field :sync_date, placeholder: Time.now
|
19
|
+
end %>
|
16
20
|
<div class='clearfix'>
|
17
21
|
<div class='form-group'>
|
18
22
|
<div class='col-md-2'></div>
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
class AddRecurringSync < ActiveRecord::Migration[5.2]
|
2
|
+
class FakeSccAccount < ApplicationRecord
|
3
|
+
self.table_name = 'scc_accounts'
|
4
|
+
end
|
5
|
+
|
6
|
+
def up
|
7
|
+
add_column :scc_accounts, :foreman_tasks_recurring_logic_id, :integer
|
8
|
+
add_column :scc_accounts, :interval, :string, default: 'never'
|
9
|
+
add_column :scc_accounts, :sync_date, :datetime
|
10
|
+
add_foreign_key :scc_accounts, :foreman_tasks_recurring_logics, :name => 'scc_accounts_foreman_tasks_recurring_logic_fk', :column => 'foreman_tasks_recurring_logic_id'
|
11
|
+
add_column :scc_accounts, :task_group_id, :integer, index: true
|
12
|
+
add_foreign_key :scc_accounts, :foreman_tasks_task_groups, column: :task_group_id
|
13
|
+
FakeSccAccount.all.each do |scca|
|
14
|
+
scca.task_group_id ||= SccAccountSyncPlanTaskGroup.create!.id
|
15
|
+
scca.save!
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def down
|
20
|
+
remove_column :scc_accounts, :foreman_tasks_recurring_logic_id
|
21
|
+
remove_column :scc_accounts, :interval
|
22
|
+
remove_column :scc_accounts, :sync_date
|
23
|
+
remove_column :scc_accounts, :task_group_id
|
24
|
+
ForemanTasks::TaskGroup.where(:type => 'SccAccountSyncPlanTaskGroup').delete_all
|
25
|
+
end
|
26
|
+
end
|
@@ -9,6 +9,10 @@ module ForemanSccManager
|
|
9
9
|
config.autoload_paths += Dir["#{config.root}/app/models/concerns"]
|
10
10
|
config.autoload_paths += Dir["#{config.root}/app/overrides"]
|
11
11
|
|
12
|
+
config.to_prepare do
|
13
|
+
ForemanTasks::RecurringLogic.send :include, Concerns::RecurringLogicExtensions
|
14
|
+
end
|
15
|
+
|
12
16
|
# Add any db migrations
|
13
17
|
initializer 'foreman_scc_manager.load_app_instance_data' do |app|
|
14
18
|
ForemanSccManager::Engine.paths['db/migrate'].existent.each do |path|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
begin
|
2
|
+
require 'rubocop/rake_task'
|
3
|
+
|
4
|
+
test_patterns = [
|
5
|
+
"#{ForemanSccManager::Engine.root}/*.gemspec",
|
6
|
+
"#{ForemanSccManager::Engine.root}/*.rb",
|
7
|
+
"#{ForemanSccManager::Engine.root}/app/**/*.rb",
|
8
|
+
"#{ForemanSccManager::Engine.root}/config/**/*.rb",
|
9
|
+
"#{ForemanSccManager::Engine.root}/db/**/*.rb",
|
10
|
+
"#{ForemanSccManager::Engine.root}/lib/**/*.rake",
|
11
|
+
"#{ForemanSccManager::Engine.root}/lib/**/*.rb",
|
12
|
+
"#{ForemanSccManager::Engine.root}/locale/**/*.rb",
|
13
|
+
"#{ForemanSccManager::Engine.root}/test/**/*.rb"
|
14
|
+
]
|
15
|
+
|
16
|
+
namespace :foreman_scc_manager do
|
17
|
+
desc 'Runs Rubocop style checker'
|
18
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
19
|
+
task.patterns = test_patterns
|
20
|
+
end
|
21
|
+
|
22
|
+
desc 'Runs Rubocop style checker with xml output for Jenkins'
|
23
|
+
RuboCop::RakeTask.new('rubocop:jenkins') do |task|
|
24
|
+
task.patterns = test_patterns
|
25
|
+
task.requires = ['rubocop/formatter/checkstyle_formatter']
|
26
|
+
task.formatters = ['RuboCop::Formatter::CheckstyleFormatter']
|
27
|
+
task.options = ['--no-color', '--out', 'rubocop.xml']
|
28
|
+
end
|
29
|
+
end
|
30
|
+
rescue LoadError
|
31
|
+
puts 'Rubocop not loaded.'
|
32
|
+
end
|
data/lib/tasks/test.rake
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
|
3
|
+
# Tests
|
4
|
+
namespace :test do
|
5
|
+
desc 'Test ForemanSccManager'
|
6
|
+
Rake::TestTask.new(:foreman_scc_manager) do |t|
|
7
|
+
test_dir = File.join(File.dirname(__FILE__), '../..', 'test')
|
8
|
+
t.libs << ['test', test_dir]
|
9
|
+
t.pattern = "#{test_dir}/**/*_test.rb"
|
10
|
+
t.verbose = true
|
11
|
+
t.warning = false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
namespace :jenkins do
|
16
|
+
desc 'Test ForemanSccManager with XML output for jenkins'
|
17
|
+
task 'foreman_scc_manager' do
|
18
|
+
Rake::Task['jenkins:setup:minitest'].invoke
|
19
|
+
Rake::Task['rake:test:foreman_scc_manager'].invoke
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
Rake::Task[:test].enhance ['test:foreman_scc_manager']
|
24
|
+
|
25
|
+
load 'tasks/jenkins.rake'
|
26
|
+
Rake::Task['jenkins:unit'].enhance ['test:foreman_scc_manager', 'foreman_scc_manager:rubocop'] if Rake::Task.task_defined?(:'jenkins:unit')
|