foreman_dlm 1.1.0 → 2.0.0

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: 5be1f946127eae4cab43fdd6ec4337fc1b3980ed40de368aa895c89f0714c459
4
- data.tar.gz: 3f9df625f01d5c1bc64f36628388a5de2e1a38f84aac3f00be0a36c9b33a75f3
3
+ metadata.gz: 46b88d4ab255520440c5a8aeb4222e8ab62e167027ca0a833eaa03bf4ee32885
4
+ data.tar.gz: 9b953cde9907b2e7be6282aedbf44fad05d447f13d97e420c62ffd47a3ccf685
5
5
  SHA512:
6
- metadata.gz: 752c99cf8b373c6aec85803c3bd8c16104bdb50cee490138da55dcf1e924174f27121308f3a319b9632c97843b2e8f69277fc6900f881a8159b2679d6bdacbbf
7
- data.tar.gz: 9b4d6b7903914234db467d42d44e33dd3d78126a3219a15b221e5a9080e84881e249b64f6fd506440fa3eb509d00e12eb3d5526445ab8bf455a0e7a5d57042e6
6
+ metadata.gz: 3f07de80a511db25bbfdc37d01726a611678b8be5c360c1020ad6ff3e69fdac0d269fe2312fbed24770d8ebec21f05148eb5d629ea69e8b6f2298597adfdea1f
7
+ data.tar.gz: 9ced134c94780300383e6096e968fdadf1035ac6323f053a0ffcffa8027c660447ce1fd49c830a9d9c103389c7412021e96243fe63e8581fbe743f314b8a605d
data/README.md CHANGED
@@ -14,6 +14,7 @@ With this plugin servers can acquire a lock in Foreman to ensure only one server
14
14
  | --------------- | -------------- |
15
15
  | >= 1.15 | ~> 0.1 |
16
16
  | >= 1.17 | ~> 1.0 |
17
+ | >= 3.0 | ~> 2.0 |
17
18
 
18
19
  ## Installation
19
20
 
@@ -34,6 +35,7 @@ Use the HTTP method `GET` to show a lock, `PUT` to acquire a lock and `DELETE` t
34
35
  Foreman will respond with the HTTP status code `200 OK` if the action was successful and `412 Precondition Failed` if the lock could not be acquired or release. This may happen, if the lock is taken by another host.
35
36
 
36
37
  To process the HTTP status code in a bash script, you can do something like this:
38
+
37
39
  ```
38
40
  curl --write-out %{http_code} -H 'Content-Type: application/json' -sS -o /dev/null -X PUT --key $(puppet config print hostprivkey) --cert $(puppet config print hostcert) https://foreman.example.com/api/dlmlocks/test/lock
39
41
  ```
@@ -59,17 +61,19 @@ $ brew link curl --force
59
61
  ```
60
62
 
61
63
  After that `curl --version` changes from
64
+
62
65
  ```
63
66
  $ curl --version
64
67
  curl 7.54.0 (x86_64-apple-darwin16.0) libcurl/7.54.0 SecureTransport zlib/1.2.8
65
68
  ```
69
+
66
70
  to
71
+
67
72
  ```
68
73
  $ curl --version
69
74
  curl 7.56.1 (x86_64-apple-darwin16.7.0) libcurl/7.56.1 OpenSSL/1.0.2m zlib/1.2.8
70
75
  ```
71
76
 
72
-
73
77
  ## Contributing
74
78
 
75
79
  Fork and send a Pull Request. Thanks!
@@ -85,9 +89,8 @@ the Free Software Foundation, either version 3 of the License, or
85
89
 
86
90
  This program is distributed in the hope that it will be useful,
87
91
  but WITHOUT ANY WARRANTY; without even the implied warranty of
88
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
92
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
89
93
  GNU General Public License for more details.
90
94
 
91
95
  You should have received a copy of the GNU General Public License
92
- along with this program. If not, see <http://www.gnu.org/licenses/>.
93
-
96
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
@@ -34,6 +34,7 @@ module Api
34
34
  def resource_class_for(resource)
35
35
  return ForemanDlm::Dlmlock if resource == 'dlmlock'
36
36
  return ForemanDlm::DlmlockEvent if resource == 'dlmlock_event'
37
+
37
38
  super
38
39
  end
39
40
  end
@@ -73,7 +73,7 @@ module Api
73
73
 
74
74
  == Authentication & Host Identification
75
75
  The host is authenticated via a client certificate and identified via the CN of that certificate.
76
- DOCS
76
+ DOCS
77
77
 
78
78
  def acquire
79
79
  process_lock_response @dlmlock.acquire!(@host)
@@ -91,7 +91,7 @@ module Api
91
91
 
92
92
  == Authentication & Host Identification
93
93
  The host is authenticated via a client certificate and identified via the CN of that certificate.
94
- DOCS
94
+ DOCS
95
95
 
96
96
  def release
97
97
  process_lock_response @dlmlock.release!(@host)
@@ -108,6 +108,7 @@ module Api
108
108
  rescue ActiveRecord::RecordNotFound
109
109
  result = scope.find_by(:name => id)
110
110
  raise ActiveRecord::RecordNotFound unless result
111
+
111
112
  result
112
113
  end
113
114
 
@@ -46,17 +46,11 @@ module ForemanDlm
46
46
  end
47
47
 
48
48
  def get_client_cert_hostname
49
- verify = request.env[Setting[:ssl_client_verify_env]]
50
- unless verify == 'SUCCESS'
51
- logger.info { "Client certificate is invalid: #{verify}" }
52
- return
53
- end
54
-
55
- dn = request.env[Setting[:ssl_client_dn_env]]
56
- return unless dn && dn =~ /CN=([^\s\/,]+)/i
49
+ client_certificate = Foreman::ClientCertificate.new(request: request)
50
+ return unless client_certificate.verified?
57
51
 
58
- hostname = Regexp.last_match(1).downcase
59
- logger.debug "Extracted hostname '#{hostname}' from client certificate."
52
+ hostname = client_certificate.subject
53
+ logger.debug "Extracted hostname '#{hostname}' from client certificate." if hostname
60
54
  hostname
61
55
  end
62
56
  end
@@ -13,6 +13,7 @@ module ForemanDlm
13
13
  # Updates the last_checkin timestamp of a user
14
14
  def update_detected_host_checkin_time
15
15
  return unless @detected_host
16
+
16
17
  facet = @detected_host.dlm_facet || @detected_host.build_dlm_facet
17
18
  facet.save unless facet.persisted?
18
19
  facet.touch(:last_checkin_at)
@@ -59,6 +59,15 @@ module ForemanDlm
59
59
  ForemanDlm::Dlmlock
60
60
  end
61
61
 
62
+ # see https://projects.theforeman.org/issues/25976
63
+ # can be removed for Foreman 1.22+
64
+ def auto_complete_controller_name
65
+ current_version = Gem::Version.new(Foreman::Version.new.notag)
66
+ return '/foreman_dlm/dlmlocks' if current_version >= Gem::Version.new('1.20') && current_version < Gem::Version.new('1.22')
67
+
68
+ controller_name
69
+ end
70
+
62
71
  private
63
72
 
64
73
  def action_permission
@@ -3,12 +3,14 @@ module ForemanDlm
3
3
  def dlmlock_status_icon_class(lock)
4
4
  return 'ban' if lock.disabled?
5
5
  return 'lock' if lock.taken?
6
+
6
7
  'unlock'
7
8
  end
8
9
 
9
10
  def dlmlock_status_icon_color_class(lock)
10
11
  return 'text-danger' if lock.disabled?
11
12
  return 'text-success' if lock.taken?
13
+
12
14
  'text-info'
13
15
  end
14
16
 
@@ -22,6 +22,7 @@ module ForemanDlm
22
22
  total_count += count
23
23
 
24
24
  break if event_ids.blank?
25
+
25
26
  sleep sleep_time
26
27
  end
27
28
  duration = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time) / 60).to_i
@@ -19,6 +19,13 @@ module ForemanDlm
19
19
  define_model_callbacks :unlock, :only => :after
20
20
  end
21
21
 
22
+ def can_acquire_update_locks?
23
+ param = host_param('can_acquire_update_locks')
24
+ return true if param.blank?
25
+
26
+ Foreman::Cast.to_bool(param)
27
+ end
28
+
22
29
  def refresh_dlmlock_status
23
30
  refresh_statuses([HostStatus::DlmlockStatus])
24
31
  end
@@ -9,6 +9,7 @@ module ForemanDlm
9
9
 
10
10
  def add_lock_monitoring_downtime
11
11
  return unless monitored?
12
+
12
13
  logger.info "Setting Monitoring downtime for #{self}"
13
14
  monitoring.set_downtime_host(self, lock_monitoring_downtime_options)
14
15
  true
@@ -18,6 +19,7 @@ module ForemanDlm
18
19
 
19
20
  def remove_lock_monitoring_downtime
20
21
  return unless monitored?
22
+
21
23
  logger.info "Deleting Monitoring downtime for #{self}"
22
24
  monitoring.del_downtime_host(self, lock_monitoring_downtime_options)
23
25
  true
@@ -7,14 +7,13 @@ module ForemanDlm
7
7
  end
8
8
 
9
9
  def self.dlm_stale_time
10
- (Setting::General[:dlm_stale_time] || 4).hours
10
+ (Setting[:dlm_stale_time] || 4).hours
11
11
  end
12
12
 
13
13
  belongs_to_host
14
14
 
15
15
  has_many :dlmlock_events,
16
16
  class_name: '::ForemanDlm::DlmlockEvent',
17
- foreign_key: 'dlmlock_id',
18
17
  dependent: :destroy,
19
18
  inverse_of: :dlmlock
20
19
 
@@ -46,6 +45,8 @@ module ForemanDlm
46
45
  attr_accessor :old
47
46
 
48
47
  def acquire!(host)
48
+ return false unless host.can_acquire_update_locks?
49
+
49
50
  result = atomic_update(nil, host)
50
51
  ForemanDlm::RefreshDlmlockStatus.set(wait: self.class.dlm_stale_time).perform_later([host.id]) if result
51
52
  result
@@ -1,2 +1,2 @@
1
- <% title _("Locks") %>
1
+ <% title _('Distributed Locks') %>
2
2
  <%= render :partial => 'list' %>
@@ -1,6 +1,6 @@
1
1
  <% title @dlmlock.name %>
2
2
  <% breadcrumbs(
3
- resource_url: api_dlmlocks_path
3
+ resource_url: api_dlmlocks_path
4
4
  ) if respond_to?(:breadcrumbs) # Requires Foreman >= 1.18 %>
5
5
 
6
6
  <%= title_actions link_to(_('Back'), foreman_dlm_dlmlocks_path, :class => 'btn btn-default'),
@@ -6,9 +6,9 @@
6
6
  <p>
7
7
  <%= _('You don\'t seem to have any locks.') %></br>
8
8
  <%= _('The distributed lock manager allows you to automatically schedule system updates across a cluster of hosts.') %>
9
- <%= link_to _('Learn more about this in the documentation.'), 'https://github.com/timogoebel/foreman_dlm', :rel => "external" %>.
9
+ <%= link_to _('Learn more about this in the documentation.'), 'https://github.com/dm-drogeriemarkt/foreman_dlm', :rel => "external" %>.
10
10
  </p>
11
11
  <div class="blank-slate-pf-main-action">
12
- <%= link_to _('Documentation'), 'https://github.com/timogoebel/foreman_dlm', :rel => 'external', :class => 'btn btn-primary btn-lg' %>
12
+ <%= link_to _('Documentation'), 'https://github.com/dm-drogeriemarkt/foreman_dlm', :rel => 'external', :class => 'btn btn-primary btn-lg' %>
13
13
  </div>
14
14
  </div>
@@ -2,14 +2,14 @@
2
2
  <%= alert class: 'alert-info',
3
3
  header: '',
4
4
  text: n_(
5
- 'This host holds %s lock.',
5
+ 'This host holds one lock.',
6
6
  'This host holds %s locks.',
7
7
  @host.dlmlocks.count
8
8
  ) % @host.dlmlocks.count
9
9
  %>
10
10
  <% end %>
11
11
 
12
- <table class="<%= table_css_classes %> table-fixed">
12
+ <table class="<%= table_css_classes %>">
13
13
  <thead>
14
14
  <tr>
15
15
  <th colspan="2"><%= _('Locks') %></th>
@@ -17,7 +17,7 @@
17
17
  </thead>
18
18
  <tbody>
19
19
  <tr>
20
- <td><%= _('Last checkin') %></td>
20
+ <td class="text-nowrap"><%= _('Last check-in') %></td>
21
21
  <td><%= @host.dlm_facet && @host.dlm_facet.last_checkin_at ? date_time_relative(@host.dlm_facet.last_checkin_at) : _('N/A') %></td>
22
22
  </tr>
23
23
  <tr>
@@ -6,14 +6,6 @@ module ForemanDlm
6
6
  config.autoload_paths += Dir["#{config.root}/app/models/concerns"]
7
7
  config.autoload_paths += Dir["#{config.root}/app/jobs"]
8
8
 
9
- initializer 'foreman_dlm.load_default_settings', before: :load_config_initializers do
10
- require_dependency File.expand_path('../../app/models/settings/dlm.rb', __dir__) if begin
11
- Setting.table_exists?
12
- rescue StandardError
13
- (false)
14
- end
15
- end
16
-
17
9
  # Add any db migrations
18
10
  initializer 'foreman_dlm.load_app_instance_data' do |app|
19
11
  ForemanDlm::Engine.paths['db/migrate'].existent.each do |path|
@@ -23,10 +15,21 @@ module ForemanDlm
23
15
 
24
16
  initializer 'foreman_dlm.register_plugin', :before => :finisher_hook do |_app|
25
17
  Foreman::Plugin.register :foreman_dlm do
26
- requires_foreman '>= 1.17'
18
+ requires_foreman '>= 3.0'
27
19
 
28
20
  apipie_documented_controllers ["#{ForemanDlm::Engine.root}/app/controllers/api/v2/*.rb"]
29
21
 
22
+ settings do
23
+ category(:general) do
24
+ setting('dlm_stale_time',
25
+ type: :integer,
26
+ default: 4,
27
+ description: N_('Number of hours after which locked Distributed Lock is stale'),
28
+ full_name: N_('Distributed Lock stale time'),
29
+ validate: { numericality: { greater_than: 0 } })
30
+ end
31
+ end
32
+
30
33
  # Add permissions
31
34
  security_block :foreman_dlm do
32
35
  permission :view_dlmlocks, {
@@ -58,10 +61,11 @@ module ForemanDlm
58
61
  :create_dlmlocks,
59
62
  :edit_dlmlocks,
60
63
  :destroy_dlmlocks,
61
- :view_dlmlock_events]
64
+ :view_dlmlock_events],
65
+ 'Role granting full access permissions to distributed locks'
62
66
 
63
67
  # add menu entry
64
- menu :top_menu, :distributed_locks,
68
+ menu :top_menu, :foreman_dlm_dlmlocks,
65
69
  url_hash: { controller: :'foreman_dlm/dlmlocks', action: :index },
66
70
  caption: N_('Distributed Locks'),
67
71
  parent: :monitor_menu,
@@ -86,19 +90,17 @@ module ForemanDlm
86
90
 
87
91
  # Include concerns in this config.to_prepare block
88
92
  config.to_prepare do
89
- begin
90
- Host::Managed.send(:include, ForemanDlm::HostExtensions)
91
- User.send(:include, ForemanDlm::UserExtensions)
92
- Host::Managed.send(:include, ForemanDlm::DlmFacetHostExtensions)
93
-
94
- Host::Managed.send(:include, ForemanDlm::HostMonitoringExtensions) if ForemanDlm.with_monitoring?
95
- rescue StandardError => e
96
- Rails.logger.warn "ForemanDlm: skipping engine hook (#{e})"
97
- end
93
+ Host::Managed.include ForemanDlm::HostExtensions
94
+ User.include ForemanDlm::UserExtensions
95
+ Host::Managed.include ForemanDlm::DlmFacetHostExtensions
96
+
97
+ Host::Managed.include ForemanDlm::HostMonitoringExtensions if ForemanDlm.with_monitoring?
98
+ rescue StandardError => e
99
+ Rails.logger.warn "ForemanDlm: skipping engine hook (#{e})"
98
100
  end
99
101
 
100
102
  initializer 'foreman_dlm.register_gettext', after: :load_config_initializers do |_app|
101
- locale_dir = File.join(File.expand_path('../../..', __FILE__), 'locale')
103
+ locale_dir = File.join(File.expand_path('../..', __dir__), 'locale')
102
104
  locale_domain = 'foreman_dlm'
103
105
  Foreman::Gettext::Support.add_text_domain locale_domain, locale_dir
104
106
  end
@@ -1,3 +1,3 @@
1
1
  module ForemanDlm
2
- VERSION = '1.1.0'.freeze
2
+ VERSION = '2.0.0'.freeze
3
3
  end
@@ -44,7 +44,7 @@ class Api::V2::DlmlocksControllerTest < ActionController::TestCase
44
44
  get :show, params: { :id => dlmlock.to_param }
45
45
  assert_response :success
46
46
  body = ActiveSupport::JSON.decode(@response.body)
47
- refute_empty body
47
+ assert_not_empty body
48
48
  assert_equal dlmlock.name, body['name']
49
49
  assert_equal dlmlock.type, body['type']
50
50
  assert_equal true, body['enabled']
@@ -56,7 +56,7 @@ class Api::V2::DlmlocksControllerTest < ActionController::TestCase
56
56
  get :show, params: { :id => dlmlock.to_param }
57
57
  assert_response :success
58
58
  body = ActiveSupport::JSON.decode(@response.body)
59
- refute_empty body
59
+ assert_not_empty body
60
60
  assert_equal dlmlock.name, body['name']
61
61
  assert_equal dlmlock.type, body['type']
62
62
  assert_equal false, body['enabled']
@@ -68,13 +68,13 @@ class Api::V2::DlmlocksControllerTest < ActionController::TestCase
68
68
  get :show, params: { :id => dlmlock.name }
69
69
  assert_response :success
70
70
  body = ActiveSupport::JSON.decode(@response.body)
71
- refute_empty body
71
+ assert_not_empty body
72
72
  assert_equal dlmlock.id, body['id']
73
73
  assert_equal dlmlock.name, body['name']
74
74
  host = body['host']
75
75
  assert host
76
76
  assert_equal host1.name, host['name']
77
- refute host.key?('self')
77
+ assert_not host.key?('self')
78
78
  end
79
79
 
80
80
  test 'should not find dlmlock with invalid id' do
@@ -178,7 +178,7 @@ class Api::V2::DlmlocksControllerTest < ActionController::TestCase
178
178
  get :show, params: { :id => dlmlock.to_param }
179
179
  assert_response :success
180
180
  body = ActiveSupport::JSON.decode(@response.body)
181
- refute_empty body
181
+ assert_not_empty body
182
182
  assert_equal dlmlock.name, body['name']
183
183
  assert_equal dlmlock.type, body['type']
184
184
  assert_equal true, body['enabled']
@@ -191,7 +191,7 @@ class Api::V2::DlmlocksControllerTest < ActionController::TestCase
191
191
  get :show, params: { :id => dlmlock.to_param }
192
192
  assert_response :success
193
193
  body = ActiveSupport::JSON.decode(@response.body)
194
- refute_empty body
194
+ assert_not_empty body
195
195
  assert_equal dlmlock.name, body['name']
196
196
  assert_equal dlmlock.type, body['type']
197
197
  assert_equal true, body['enabled']
@@ -207,7 +207,7 @@ class Api::V2::DlmlocksControllerTest < ActionController::TestCase
207
207
  get :show, params: { :id => dlmlock.to_param }
208
208
  assert_response :success
209
209
  body = ActiveSupport::JSON.decode(@response.body)
210
- refute_empty body
210
+ assert_not_empty body
211
211
  assert_equal dlmlock.name, body['name']
212
212
  assert_equal dlmlock.type, body['type']
213
213
  assert_equal true, body['enabled']
@@ -220,7 +220,7 @@ class Api::V2::DlmlocksControllerTest < ActionController::TestCase
220
220
 
221
221
  test 'should update checkin time' do
222
222
  dlmlock = as_admin { FactoryBot.create(:dlmlock) }
223
- refute as_admin { host1.dlm_facet }
223
+ assert_not as_admin { host1.dlm_facet }
224
224
  put :show, params: { :id => dlmlock.to_param }
225
225
  assert as_admin { host1.reload.dlm_facet.last_checkin_at }
226
226
  end
@@ -260,7 +260,7 @@ class Api::V2::DlmlocksControllerTest < ActionController::TestCase
260
260
 
261
261
  test 'should update checkin time' do
262
262
  dlmlock = as_admin { FactoryBot.create(:dlmlock) }
263
- refute as_admin { host1.dlm_facet }
263
+ assert_not as_admin { host1.dlm_facet }
264
264
  put :acquire, params: { :id => dlmlock.to_param }
265
265
  assert as_admin { host1.reload.dlm_facet.last_checkin_at }
266
266
  end
@@ -300,7 +300,7 @@ class Api::V2::DlmlocksControllerTest < ActionController::TestCase
300
300
 
301
301
  test 'should update checkin time' do
302
302
  dlmlock = as_admin { FactoryBot.create(:dlmlock) }
303
- refute as_admin { host1.dlm_facet }
303
+ assert_not as_admin { host1.dlm_facet }
304
304
  put :release, params: { :id => dlmlock.to_param }
305
305
  assert as_admin { host1.reload.dlm_facet.last_checkin_at }
306
306
  end
@@ -27,7 +27,7 @@ module ForemanDlm
27
27
  dlmlock = FactoryBot.create(:dlmlock)
28
28
  delete :destroy, params: { :id => dlmlock.id }, session: set_session_user
29
29
  assert_redirected_to foreman_dlm_dlmlocks_url
30
- refute Dlmlock.exists?(dlmlock.id)
30
+ assert_not Dlmlock.exists?(dlmlock.id)
31
31
  end
32
32
 
33
33
  test '#enable' do
@@ -49,7 +49,7 @@ module ForemanDlm
49
49
  dlmlock = FactoryBot.create(:dlmlock, host: host)
50
50
  put :release, params: { :id => dlmlock.id }, session: set_session_user
51
51
  assert_redirected_to foreman_dlm_dlmlocks_url
52
- refute dlmlock.reload.taken?
52
+ assert_not dlmlock.reload.taken?
53
53
  end
54
54
  end
55
55
  end
@@ -1,7 +1,7 @@
1
1
  FactoryBot.define do
2
2
  factory :dlmlock, class: ::ForemanDlm::Dlmlock::Update do
3
3
  sequence(:name) { |n| "Lock #{n}" }
4
- type 'ForemanDlm::Dlmlock::Update'
4
+ type { 'ForemanDlm::Dlmlock::Update' }
5
5
 
6
6
  trait :locked do
7
7
  host
@@ -1,7 +1,7 @@
1
1
  FactoryBot.define do
2
2
  factory :dlmlock_event, class: ::ForemanDlm::DlmlockEvent do
3
3
  dlmlock
4
- event_type 'release'
4
+ event_type { 'release' }
5
5
  host
6
6
 
7
7
  trait :old_event do
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_plugin_helper'
4
+ require 'integration_test_helper'
5
+
6
+ class DlmlocksTest < IntegrationTestWithJavascript
7
+ setup do
8
+ User.current = users(:admin)
9
+ end
10
+
11
+ test 'the index page works' do
12
+ FactoryBot.create_list(:dlmlock, 10)
13
+ assert_index_page(foreman_dlm_dlmlocks_path, 'Distributed Locks')
14
+ end
15
+
16
+ test 'the search bar has autocomplete' do
17
+ skip if Gem::Version.new(Foreman::Version.new.notag) < Gem::Version.new('1.20')
18
+ FactoryBot.create_list(:dlmlock, 10)
19
+
20
+ visit foreman_dlm_dlmlocks_path
21
+
22
+ search_bar = page.first('#search-bar')
23
+ search_bar.first('input').set('ho')
24
+
25
+ list = search_bar.find_all('a.dropdown-item').map(&:text)
26
+ assert_includes list, 'host'
27
+ end
28
+ end
@@ -82,6 +82,18 @@ module ForemanDlm
82
82
  assert dlmlock.acquire!(host)
83
83
  assert_equal ['callback1'], host.callbacks
84
84
  end
85
+
86
+ context 'with a parameter disabeling the locking' do
87
+ setup do
88
+ FactoryBot.create(:host_parameter, host: host1, name: 'can_acquire_update_locks', value: 'false')
89
+ end
90
+
91
+ test 'can not be acquired' do
92
+ assert_nil dlmlock.host
93
+ assert_not dlmlock.acquire!(host1)
94
+ assert_nil dlmlock.reload.host
95
+ end
96
+ end
85
97
  end
86
98
 
87
99
  context 'a free and disabled DLM lock' do
@@ -212,15 +224,11 @@ module ForemanDlm
212
224
  not_locked = FactoryBot.create(:dlmlock)
213
225
 
214
226
  assert_includes subject, locked
215
- refute_includes subject, not_locked
227
+ assert_not_includes subject, not_locked
216
228
  end
217
229
  end
218
230
 
219
231
  describe '#stale' do
220
- setup do
221
- FactoryBot.create(:setting, category: Setting::General, name: 'dlm_stale_time', value: 4)
222
- end
223
-
224
232
  subject { Dlmlock.stale }
225
233
 
226
234
  it 'includes only Distributed Locks that are stale' do
@@ -232,8 +240,8 @@ module ForemanDlm
232
240
  not_locked = FactoryBot.create(:dlmlock)
233
241
 
234
242
  assert_includes subject, stale
235
- refute_includes subject, not_stale
236
- refute_includes subject, not_locked
243
+ assert_not_includes subject, not_stale
244
+ assert_not_includes subject, not_locked
237
245
  end
238
246
  end
239
247
  end
@@ -6,6 +6,24 @@ module Host
6
6
  should have_many(:dlmlock_events)
7
7
  should have_one(:dlm_facet)
8
8
 
9
+ describe '#can_acquire_update_locks?' do
10
+ let(:host) { FactoryBot.create(:host, :managed) }
11
+
12
+ it 'should be true without a host parameter' do
13
+ assert host.can_acquire_update_locks?
14
+ end
15
+
16
+ it 'should be true if parameter is true' do
17
+ FactoryBot.create(:host_parameter, host: host, name: 'can_acquire_update_locks', value: 'true')
18
+ assert host.can_acquire_update_locks?
19
+ end
20
+
21
+ it 'should be false if parameter is false' do
22
+ FactoryBot.create(:host_parameter, host: host, name: 'can_acquire_update_locks', value: 'false')
23
+ assert_not host.can_acquire_update_locks?
24
+ end
25
+ end
26
+
9
27
  context 'scoped search on' do
10
28
  context 'a host' do
11
29
  let(:host) { FactoryBot.create(:host, :with_dlm_facet) }
@@ -3,10 +3,6 @@
3
3
  require 'test_plugin_helper'
4
4
 
5
5
  class DlmlockStatusTest < ActiveSupport::TestCase
6
- setup do
7
- FactoryBot.create(:setting, category: Setting::General, name: 'dlm_stale_time', value: 4)
8
- end
9
-
10
6
  let(:host) { FactoryBot.create(:host, :managed) }
11
7
 
12
8
  describe '#to_status' do
@@ -17,7 +13,7 @@ class DlmlockStatusTest < ActiveSupport::TestCase
17
13
  FactoryBot.create(:dlmlock, :locked, host: host, updated_at: now - 5.hours)
18
14
  status = host.get_status(HostStatus::DlmlockStatus)
19
15
 
20
- refute_empty host.dlmlocks.stale
16
+ assert_not_empty host.dlmlocks.stale
21
17
  assert_equal HostStatus::DlmlockStatus::STALE, status.to_status
22
18
  end
23
19
  end
@@ -35,7 +31,7 @@ class DlmlockStatusTest < ActiveSupport::TestCase
35
31
  FactoryBot.create(:dlmlock, host: host)
36
32
  status = host.get_status(HostStatus::DlmlockStatus)
37
33
 
38
- refute_empty host.dlmlocks
34
+ assert_not_empty host.dlmlocks
39
35
  assert_equal true, status.relevant?
40
36
  end
41
37
 
@@ -3,5 +3,9 @@ require 'test_helper'
3
3
 
4
4
  # Add plugin to FactoryBot's paths
5
5
  FactoryBot.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
6
+
7
+ # Add factories of external plugin dependencies
6
8
  FactoryBot.definition_file_paths << "#{ForemanMonitoring::Engine.root}/test/factories" if ForemanDlm.with_monitoring?
9
+
10
+ # Reload factory paths
7
11
  FactoryBot.reload
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_dlm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Timo Goebel
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-06 00:00:00.000000000 Z
11
+ date: 2022-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdoc
@@ -28,16 +28,44 @@ dependencies:
28
28
  name: rubocop
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.52.1
33
+ version: 1.25.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.52.1
40
+ version: 1.25.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop-performance
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.13.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.13.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop-rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 2.9.1
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 2.9.1
41
69
  description: Adds a Distributed Lock Manager to Foreman. This enables painless system
42
70
  updates for clusters.
43
71
  email:
@@ -69,7 +97,6 @@ files:
69
97
  - app/models/foreman_dlm/dlmlock/update.rb
70
98
  - app/models/foreman_dlm/dlmlock_event.rb
71
99
  - app/models/host_status/dlmlock_status.rb
72
- - app/models/settings/dlm.rb
73
100
  - app/views/api/v2/dlmlock_events/index.json.rabl
74
101
  - app/views/api/v2/dlmlocks/acquire.json.rabl
75
102
  - app/views/api/v2/dlmlocks/base.json.rabl
@@ -117,6 +144,7 @@ files:
117
144
  - test/factories/dlmlock.rb
118
145
  - test/factories/dlmlock_events.rb
119
146
  - test/factories/host.rb
147
+ - test/integration/foreman_dlm/dlmlocks_test.rb
120
148
  - test/jobs/refresh_dlmlock_status_test.rb
121
149
  - test/models/foreman_dlm/dlm_facet_test.rb
122
150
  - test/models/foreman_dlm/dlmlock_event_test.rb
@@ -129,8 +157,10 @@ files:
129
157
  homepage: https://github.com/dm-drogeriemarkt/foreman_dlm
130
158
  licenses:
131
159
  - GPL-3.0
132
- metadata: {}
133
- post_install_message:
160
+ metadata:
161
+ rubygems_mfa_required: 'true'
162
+ is_foreman_plugin: 'true'
163
+ post_install_message:
134
164
  rdoc_options: []
135
165
  require_paths:
136
166
  - lib
@@ -145,28 +175,28 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
175
  - !ruby/object:Gem::Version
146
176
  version: '0'
147
177
  requirements: []
148
- rubyforge_project:
149
- rubygems_version: 2.7.3
150
- signing_key:
178
+ rubygems_version: 3.3.3
179
+ signing_key:
151
180
  specification_version: 4
152
181
  summary: Distributed Lock Manager for Foreman.
153
182
  test_files:
154
- - test/models/host_managed_test.rb
155
- - test/models/foreman_dlm/dlmlock_event_test.rb
183
+ - test/controllers/api/v2/dlmlocks_controller_test.rb
184
+ - test/controllers/api/v2/dlmlocks_dlmlock_events_controller_test.rb
185
+ - test/controllers/api/v2/hosts_controller_test.rb
186
+ - test/controllers/find_host_by_client_cert_test.rb
187
+ - test/controllers/foreman_dlm/dlmlocks_test.rb
188
+ - test/controllers/hosts_controller_test.rb
189
+ - test/factories/dlm_facets.rb
190
+ - test/factories/dlmlock.rb
191
+ - test/factories/dlmlock_events.rb
192
+ - test/factories/host.rb
193
+ - test/integration/foreman_dlm/dlmlocks_test.rb
194
+ - test/jobs/refresh_dlmlock_status_test.rb
156
195
  - test/models/foreman_dlm/dlm_facet_test.rb
196
+ - test/models/foreman_dlm/dlmlock_event_test.rb
157
197
  - test/models/foreman_dlm/dlmlock_test.rb
158
- - test/models/host_status/dlmlock_status_test.rb
198
+ - test/models/host_managed_test.rb
159
199
  - test/models/host_monitoring_test.rb
200
+ - test/models/host_status/dlmlock_status_test.rb
160
201
  - test/models/user_test.rb
161
- - test/factories/dlm_facets.rb
162
- - test/factories/host.rb
163
- - test/factories/dlmlock_events.rb
164
- - test/factories/dlmlock.rb
165
202
  - test/test_plugin_helper.rb
166
- - test/jobs/refresh_dlmlock_status_test.rb
167
- - test/controllers/foreman_dlm/dlmlocks_test.rb
168
- - test/controllers/api/v2/dlmlocks_controller_test.rb
169
- - test/controllers/api/v2/hosts_controller_test.rb
170
- - test/controllers/api/v2/dlmlocks_dlmlock_events_controller_test.rb
171
- - test/controllers/hosts_controller_test.rb
172
- - test/controllers/find_host_by_client_cert_test.rb
@@ -1,20 +0,0 @@
1
- class Setting
2
- class Dlm < ::Setting
3
- def self.load_defaults
4
- return unless ActiveRecord::Base.connection.table_exists?('settings')
5
- return unless super
6
-
7
- Setting.transaction do
8
- [
9
- set('dlm_stale_time', N_('Number of hours after which locked Distributed Lock is stale'), 4, N_('Distributed Lock stale time'))
10
- ].compact.each { |s| Setting::General.create s.update(category: 'Setting::General') }
11
- end
12
-
13
- true
14
- end
15
-
16
- def self.humanized_category
17
- N_('Distributed Locks')
18
- end
19
- end
20
- end