foreman_wreckingball 2.0.0 → 3.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: 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