foreman_wreckingball 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc7a11036e0646a12bade27dd0103e62ded2dfebf765635f25d4183b1ef526ec
4
- data.tar.gz: 6f699717b502e437359a62a220c54ae6ed9caaf2d8cc967dea5ba09646ecdd05
3
+ metadata.gz: 91f8e9b4e8ec69fe49517364365ff0ea5e46435998461cd967718539c9e69546
4
+ data.tar.gz: 444176c10728b0457d50ab41adf8a923d66d30f383bb0564e9b172973bace129
5
5
  SHA512:
6
- metadata.gz: 9fd15f5abf4995dc3818c4f27d6b8e4a7de4a0a23873c705f82b8b194464fa1fb7619220533bf408d1f4c9cf1e64c71b9e523965a245cd7545d650f131707f2b
7
- data.tar.gz: c836945e900b536003732099503b532504d1f298a1c59d295a73db0cc4d00d9026c4a36ab1d2f10e222f93b5f6abda2f81965aebbae6b1e2bf0a08a7c83a6cb3
6
+ metadata.gz: 21d17ab1949782bf8a6b0f2c0f2e5d7d4fa43d8c25d93112b3ac3e1412f16b5418357b82c05643248fff7c57671bbbe31bdfc04c11559b34db5d7351f90e6514
7
+ data.tar.gz: 489a9097ef263bc2e1eb4cff7d0ae695e1e53fd7462066ad8f06be48efc7aedadc5b013287198a4350f9c22908c1d99f9abe78ba46dd11bd254b8d3b9b545bd0
data/README.md CHANGED
@@ -9,6 +9,7 @@ This is a plugin for Foreman that adds several VMware related status checks to y
9
9
  | >= 1.15 | ~> 0.1 |
10
10
  | >= 1.16 | ~> 1.0 |
11
11
  | >= 1.17 | ~> 2.0 |
12
+ | >= 1.18 | ~> 3.0 |
12
13
 
13
14
  ## Installation
14
15
 
@@ -0,0 +1,42 @@
1
+ $(function() {
2
+ $('#confirmation-modal .secondary').click(function(){
3
+ $('#confirmation-modal').modal('hide');
4
+ });
5
+ });
6
+
7
+ function submit_modal_form() {
8
+ $('#confirmation-modal form').submit();
9
+ $('#confirmation-modal').modal('hide');
10
+ }
11
+
12
+ function show_modal(element, url) {
13
+ if (!url) {
14
+ url = $(element).attr('href');
15
+ }
16
+ var title = $(element).attr('data-title');
17
+ if (title) {
18
+ $('#confirmation-modal .modal-title').text(title);
19
+ }
20
+ $('#confirmation-modal .modal-body')
21
+ .empty()
22
+ .append('<div class="modal-spinner spinner spinner-lg"></div>');
23
+ $('#confirmation-modal').modal();
24
+ $('#confirmation-modal .modal-body').load(url + ' #content',
25
+ function(response, status, xhr) {
26
+ $('#confirmation-modal .form-actions').remove();
27
+
28
+ var submit_button = $('#confirmation-modal button[data-action="submit"]');
29
+ if ($(element).attr('data-submit-class')) {
30
+ submit_button.attr('class', 'btn ' + $(element).attr('data-submit-class'));
31
+ } else {
32
+ submit_button.attr('class', 'btn btn-primary');
33
+ }
34
+
35
+ $('#confirmation-modal a[rel="popover"]').popover();
36
+
37
+ trigger_form_selector_binds('schedule_remediate_form', url);
38
+ $('#loading').hide();
39
+ });
40
+ return false;
41
+ }
42
+
@@ -2,8 +2,9 @@
2
2
 
3
3
  module ForemanWreckingball
4
4
  class HostsController < ::HostsController
5
- before_action :find_resource, :only => [:remediate]
6
- before_action :find_status, :only => [:remediate]
5
+ include ::ForemanTasks::Concerns::Parameters::Triggering
6
+ before_action :find_resource, :only => [:submit_remediate, :schedule_remediate]
7
+ before_action :find_status, :only => [:submit_remediate, :schedule_remediate]
7
8
 
8
9
  def status_dashboard
9
10
  statuses = [
@@ -42,17 +43,35 @@ module ForemanWreckingball
42
43
  redirect_to(foreman_tasks_task_path(task.id))
43
44
  end
44
45
 
45
- def remediate
46
+ def schedule_remediate
47
+ @triggering = ForemanTasks::Triggering.new(mode: :immediate)
48
+ end
49
+
50
+ def submit_remediate
46
51
  raise Foreman::Exception, 'VMware Status can not be remediated.' unless @status.class.respond_to?(:supports_remediate?) && @status.class.supports_remediate?
47
- flash[:success] = _('Remediate VM task for %s was successfully scheduled.') % @host
48
52
  task = User.as_anonymous_admin do
49
- ::ForemanTasks.async_task(@status.class.remediate_action, @host)
53
+ triggering = ::ForemanTasks::Triggering.new_from_params(triggering_params)
54
+ if triggering.future?
55
+ triggering.parse_start_at!
56
+ triggering.parse_start_before!
57
+ else
58
+ triggering.start_at ||= Time.zone.now
59
+ end
60
+
61
+ triggering.trigger(@status.class.remediate_action, @host)
50
62
  end
63
+ flash[:success] = _('Remediate VM task for %s was successfully scheduled.') % @host
51
64
  redirect_to(foreman_tasks_task_path(task.id))
52
65
  end
53
66
 
54
67
  private
55
68
 
69
+ def triggering_params
70
+ %i[triggering foreman_tasks_triggering].inject({}) do |result, param_name|
71
+ result.merge(self.class.triggering_params_filter.filter_params(params, parameter_filter_context, param_name))
72
+ end
73
+ end
74
+
56
75
  def find_status
57
76
  @status = HostStatus::Status.find_by!(:id => params[:status_id], :host_id => @host.id)
58
77
  end
@@ -63,7 +82,7 @@ module ForemanWreckingball
63
82
  'view'
64
83
  when 'refresh_status_dashboard'
65
84
  'refresh_vmware_status'
66
- when 'remediate'
85
+ when 'schedule_remediate', 'submit_remediate'
67
86
  'remediate_vmware_status'
68
87
  else
69
88
  super
@@ -6,6 +6,11 @@ module Actions
6
6
  class RemediateVmwareOperatingsystem < Actions::EntryAction
7
7
  middleware.use Actions::Middleware::KeepCurrentUser
8
8
 
9
+ def delay(delay_options, host)
10
+ action_subject(host)
11
+ super(delay_options, host)
12
+ end
13
+
9
14
  def plan(host)
10
15
  action_subject(host)
11
16
  plan_self
@@ -21,6 +21,10 @@ module ForemanWreckingball
21
21
  true
22
22
  end
23
23
 
24
+ def self.dangerous_remediate?
25
+ true
26
+ end
27
+
24
28
  def self.remediate_action
25
29
  ::Actions::ForemanWreckingball::Host::RemediateVmwareOperatingsystem
26
30
  end
@@ -85,10 +85,9 @@
85
85
  action_buttons(
86
86
  display_link_if_authorized(
87
87
  _('Remediate'),
88
- hash_for_remediate_host_path(:id => host, :status_id => host.public_send(status).id).merge(:auth_object => host, :permission => 'remediate_vmware_status_hosts'),
89
- :data => { :confirm => _('Are you sure? This might cause a service interruption.') },
90
- :method => :put,
91
- :target => :blank
88
+ hash_for_schedule_remediate_host_path(:id => host, :status_id => host.public_send(status).id).merge(:auth_object => host, :permission => 'remediate_vmware_status_hosts'),
89
+ :data => { :title => _('Remediate Host OS'), :submit_class => 'btn-danger' },
90
+ :onclick => 'show_modal(this); return false;'
92
91
  )
93
92
  )
94
93
  %>
@@ -0,0 +1,35 @@
1
+ <% title _('Remediate %s') % @host %>
2
+ <% javascript 'foreman_tasks/trigger_form' %>
3
+ <% stylesheet 'foreman_tasks/trigger_form' %>
4
+
5
+
6
+ <% if @status.class.respond_to?(:dangerous_remediate?) && @status.class.dangerous_remediate? -%>
7
+ <%= alert(:text => _('This will cause a service interruption.'), :class => 'alert-warning', :close => false) %>
8
+ <% end -%>
9
+
10
+ <%= form_for @triggering, :url => submit_remediate_host_path(:id => @host.id, :status_id => @status), :html => { :class => 'form-horizontal', :id => 'schedule_remediate_form' } do |f| %>
11
+ <%= javascript_tag do %>
12
+ $(function() { trigger_form_selector_binds('<%= f.options[:html][:id] %>','<%= f.object_name %>') });
13
+ <% end %>
14
+ <div class="form-group">
15
+ <label class="col-md-2 control-label"><%= _('Schedule') %></label>
16
+ <div class="col-md-8">
17
+ <%= fields_for :triggering, @triggering do |trigger_fields| %>
18
+ <%= radio_button_f trigger_fields, :mode, :class => 'trigger_mode_selector', :value => 'immediate', :text => _("Execute now") %>
19
+ <%= radio_button_f trigger_fields, :mode, :class => 'trigger_mode_selector', :value => 'future', :text => _("Schedule future execution") %>
20
+ </div>
21
+ </div>
22
+
23
+ <div class="trigger_fields">
24
+ <%= content_tag(:fieldset, nil, :id => 'trigger_mode_future', :class => "trigger_mode_form #{'hidden' unless @triggering.future?}") do
25
+ safe_join([
26
+ text_f(f, :start_at_raw, :label => _('Start at'), :placeholder => 'YYYY-mm-dd HH:MM'),
27
+ text_f(f, :start_before_raw, :label => _('Start before'), :placeholder => 'YYYY-mm-dd HH:MM',
28
+ :label_help => _('Indicates that the action should be cancelled if it cannot be started before this time.'))
29
+ ])
30
+ end %>
31
+ </div>
32
+ <% end %>
33
+
34
+ <%= submit_or_cancel f, false, :cancel_path => { :controller => :'foreman_wreckingball/hosts', :action => :status_dashboard } %>
35
+ <% end %>
@@ -1,4 +1,7 @@
1
1
  <% title _('VMware Status Overview') %>
2
+ <% javascript 'foreman_wreckingball/modal' %>
3
+ <% javascript 'foreman_tasks/trigger_form' %>
4
+ <% stylesheet 'foreman_tasks/trigger_form' %>
2
5
 
3
6
  <%=
4
7
  if @newest_data
@@ -7,3 +10,11 @@
7
10
  render 'status_dashboard_empty'
8
11
  end
9
12
  %>
13
+ <%= render :partial => 'common/modal', :locals => {
14
+ :id => 'confirmation-modal',
15
+ :title => _('Please Confirm'),
16
+ :buttons => [
17
+ button_tag(_('Cancel'), :class => 'btn btn-default', :data => { :dismiss => 'modal' }, :type => 'button'),
18
+ button_tag(_('Submit'), :class => 'btn btn-primary', :data => { :action => 'submit' }, :onclick => 'submit_modal_form()')
19
+ ]
20
+ } %>
data/config/routes.rb CHANGED
@@ -5,7 +5,8 @@ Rails.application.routes.draw do
5
5
  constraints(:id => /[^\/]+/) do
6
6
  resources :hosts, controller: 'foreman_wreckingball/hosts', only: [] do
7
7
  member do
8
- put :remediate
8
+ get :schedule_remediate
9
+ post :submit_remediate
9
10
  end
10
11
  collection do
11
12
  get :status_dashboard
@@ -25,14 +25,14 @@ module ForemanWreckingball
25
25
 
26
26
  initializer 'foreman_wreckingball.register_plugin', :before => :finisher_hook do |_app|
27
27
  Foreman::Plugin.register :foreman_wreckingball do
28
- requires_foreman '>= 1.17'
28
+ requires_foreman '>= 1.18'
29
29
 
30
30
  security_block :foreman_wreckingball do
31
31
  permission :refresh_vmware_status_hosts, {
32
32
  :'foreman_wreckingball/hosts' => [:refresh_status_dashboard]
33
33
  }, :resource_type => 'Host'
34
34
  permission :remediate_vmware_status_hosts, {
35
- :'foreman_wreckingball/hosts' => [:remediate]
35
+ :'foreman_wreckingball/hosts' => [:schedule_remediate, :submit_remediate]
36
36
  }, :resource_type => 'Host'
37
37
  end
38
38
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ForemanWreckingball
4
- VERSION = '2.0.0'.freeze
4
+ VERSION = '3.0.0'
5
5
  end
@@ -34,14 +34,36 @@ module ForemanWreckingball
34
34
  end
35
35
  end
36
36
 
37
- describe '#remediate' do
37
+ describe '#schedule_remediate' do
38
+ let(:host) do
39
+ FactoryBot.create(:host, :with_wreckingball_statuses)
40
+ end
41
+
42
+ test 'shows a remediation schedule page' do
43
+ get :schedule_remediate, params: { status_id: host.vmware_operatingsystem_status_object.id, id: host.id }, session: set_session_user
44
+ assert_response :success
45
+ end
46
+
47
+ test 'returns not found when host id is invalid' do
48
+ get :schedule_remediate, params: { status_id: nil, id: 'invalid' }, session: set_session_user
49
+ assert_response :not_found
50
+ end
51
+
52
+ test 'returns not found when status id is invalid' do
53
+ FactoryBot.create(:host, :with_wreckingball_statuses)
54
+ get :schedule_remediate, params: { status_id: 'invalid', id: host.id }, session: set_session_user
55
+ assert_response :not_found
56
+ end
57
+ end
58
+
59
+ describe '#submit_remediate' do
38
60
  let(:host) do
39
61
  FactoryBot.create(:host, :with_wreckingball_statuses)
40
62
  end
41
63
 
42
64
  test 'redirects to scheduled task' do
43
65
  ForemanTasks.expects(:async_task).returns(fake_task)
44
- put :remediate, params: { status_id: host.vmware_operatingsystem_status_object.id, id: host.id }, session: set_session_user
66
+ post :submit_remediate, params: { status_id: host.vmware_operatingsystem_status_object.id, id: host.id }, session: set_session_user
45
67
  assert_response :redirect
46
68
  assert_includes flash[:success], 'successfully scheduled'
47
69
  assert_redirected_to foreman_tasks_task_path(123)
@@ -50,18 +72,18 @@ module ForemanWreckingball
50
72
  test 'raises error when status can not be remediated' do
51
73
  FactoryBot.create(:host, :with_wreckingball_statuses)
52
74
  assert_raises Foreman::Exception do
53
- put :remediate, params: { status_id: host.vmware_tools_status_object.id, id: host.id }, session: set_session_user
75
+ post :submit_remediate, params: { status_id: host.vmware_tools_status_object.id, id: host.id }, session: set_session_user
54
76
  end
55
77
  end
56
78
 
57
79
  test 'returns not found when host id is invalid' do
58
- put :remediate, params: { status_id: nil, id: 'invalid' }, session: set_session_user
80
+ post :submit_remediate, params: { status_id: nil, id: 'invalid' }, session: set_session_user
59
81
  assert_response :not_found
60
82
  end
61
83
 
62
84
  test 'returns not found when status id is invalid' do
63
85
  FactoryBot.create(:host, :with_wreckingball_statuses)
64
- put :remediate, params: { status_id: 'invalid', id: host.id }, session: set_session_user
86
+ post :submit_remediate, params: { status_id: 'invalid', id: host.id }, session: set_session_user
65
87
  assert_response :not_found
66
88
  end
67
89
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_wreckingball
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Timo Goebel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-04 00:00:00.000000000 Z
11
+ date: 2018-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: foreman-tasks
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.11.2
19
+ version: 0.13.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.11.2
26
+ version: 0.13.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rdoc
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -62,6 +62,7 @@ files:
62
62
  - LICENSE
63
63
  - README.md
64
64
  - Rakefile
65
+ - app/assets/javascripts/foreman_wreckingball/modal.js
65
66
  - app/controllers/foreman_wreckingball/hosts_controller.rb
66
67
  - app/helpers/concerns/foreman_wreckingball/hosts_helper_extensions.rb
67
68
  - app/jobs/update_hosts_vmware_facets.rb
@@ -90,6 +91,7 @@ files:
90
91
  - app/views/foreman_wreckingball/hosts/_status_dashboard_content.erb
91
92
  - app/views/foreman_wreckingball/hosts/_status_dashboard_empty.erb
92
93
  - app/views/foreman_wreckingball/hosts/_status_row.html.erb
94
+ - app/views/foreman_wreckingball/hosts/schedule_remediate.html.erb
93
95
  - app/views/foreman_wreckingball/hosts/status_dashboard.html.erb
94
96
  - config/routes.rb
95
97
  - db/migrate/20171106155000_create_vmware_facets.rb