foreman_wreckingball 3.1.0 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -1
- data/app/assets/javascripts/foreman_wreckingball/modal.js +0 -1
- data/app/assets/javascripts/foreman_wreckingball/status_hosts_table.js +2 -2
- data/app/assets/javascripts/foreman_wreckingball/status_row.js +17 -0
- data/app/controllers/foreman_wreckingball/hosts_controller.rb +65 -35
- data/app/lib/actions/foreman_wreckingball/host/remediate_spectre_v2.rb +58 -0
- data/app/models/concerns/foreman_wreckingball/host_extensions.rb +10 -25
- data/app/models/concerns/foreman_wreckingball/host_status_extensions.rb +13 -0
- data/app/models/concerns/foreman_wreckingball/user_extensions.rb +12 -0
- data/app/models/concerns/foreman_wreckingball/usergroup_extensions.rb +18 -0
- data/app/models/concerns/foreman_wreckingball/vmware_facet_host_extensions.rb +10 -0
- data/app/models/foreman_wreckingball/cpu_hot_add_status.rb +8 -0
- data/app/models/foreman_wreckingball/hardware_version_status.rb +8 -0
- data/app/models/foreman_wreckingball/operatingsystem_status.rb +8 -0
- data/app/models/foreman_wreckingball/spectre_v2_status.rb +17 -1
- data/app/models/foreman_wreckingball/tools_status.rb +8 -0
- data/app/models/foreman_wreckingball/vmware_facet.rb +1 -5
- data/app/services/foreman_wreckingball/vmware_cluster_importer.rb +1 -6
- data/app/views/foreman_wreckingball/hosts/_status_dashboard_content.erb +10 -21
- data/app/views/foreman_wreckingball/hosts/_status_row_hosts_table.html.erb +1 -1
- data/app/views/foreman_wreckingball/hosts/status_dashboard.html.erb +1 -0
- data/app/views/foreman_wreckingball/hosts/status_managed_hosts_dashboard.html.erb +49 -0
- data/config/environments/production.rb +7 -0
- data/config/routes.rb +1 -0
- data/lib/foreman_wreckingball/engine.rb +21 -6
- data/lib/foreman_wreckingball/version.rb +1 -1
- data/test/actions/foreman_wreckingball/host/remediate_spectre_v2_test.rb +62 -0
- data/test/controllers/foreman_wreckingball/hosts_controller_test.rb +180 -12
- data/test/factories/foreman_wreckingball_factories.rb +32 -0
- data/test/factories/host.rb +8 -0
- data/test/factories/task.rb +17 -0
- data/test/integration/hosts_status_dashboard_test.rb +50 -0
- data/test/integration/hosts_status_managed_hosts_test.rb +93 -0
- data/test/integration_test_plugin_helper.rb +12 -0
- data/test/models/host_status_test.rb +22 -0
- data/test/models/host_test.rb +64 -5
- data/test/models/usergroup_test.rb +25 -0
- data/test/test_plugin_helper.rb +17 -0
- data/test/unit/foreman_wreckingball/vmware_cluster_importer_test.rb +17 -2
- metadata +23 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de6be68d909a39447b86fc7b8ce9f372cc12c929364910205beac6d8dc244829
|
4
|
+
data.tar.gz: 2908a912c935764b978d0f094306ecbad458c70c9bed5138051f52d73f83697f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4de761155c5e670000022056211ad3f4064a303914b869c8624f40679b723e6d90d7aa2ba3f156c9f2b535a02a9474cf8c817b7e967f537e7ca8e843a764a84
|
7
|
+
data.tar.gz: 84e82bf20310a20cde12e50dcacd5fb84ab638e1eabf280aefbf3f1cb3d9a1253cbb57136dbb29ea618e95425380cd296a011f8dc40738b7339837833fd5bfa5
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# ForemanWreckingball
|
2
2
|
|
3
|
+
[<img src="https://opensourcelogos.aws.dmtech.cloud/dmTECH_opensource_logo%401x.svg" height="21" width="130">](https://www.dmtech.de/)
|
4
|
+
|
3
5
|
This is a plugin for Foreman that adds several VMware related status checks to your Hosts in Foreman. For performance reasons, these checks are only run periodically.
|
4
6
|
|
5
7
|
## Compatibility
|
@@ -23,7 +25,7 @@ Fork and send a Pull Request. Thanks!
|
|
23
25
|
|
24
26
|
## Copyright
|
25
27
|
|
26
|
-
Copyright (c) 2018
|
28
|
+
Copyright (c) 2018 dmTECH GmbH, [dmtech.de](https://www.dmtech.de/)
|
27
29
|
|
28
30
|
This program is free software: you can redistribute it and/or modify
|
29
31
|
it under the terms of the GNU General Public License as published by
|
@@ -1,7 +1,7 @@
|
|
1
1
|
$(document).ready(() => {
|
2
2
|
$.fn.dataTable.ext.errMode = 'none';
|
3
|
-
$('.status-row.list-group-item').one('click', (
|
4
|
-
$(
|
3
|
+
$('.status-row.list-group-item').one('click', function() {
|
4
|
+
$(this).find('table.status-hosts').each((_index, element) => {
|
5
5
|
$(element).dataTable({
|
6
6
|
searching: false,
|
7
7
|
ordering: false,
|
@@ -0,0 +1,17 @@
|
|
1
|
+
$(document).ready(() => {
|
2
|
+
// click the list-view heading then expand a row
|
3
|
+
$('.list-group-item-header').click(function(event) {
|
4
|
+
if(!$(event.target).is('button, a, input, .fa-ellipsis-v')) {
|
5
|
+
$(this).find('.fa-angle-right').toggleClass('fa-angle-down')
|
6
|
+
.end().parent().toggleClass('list-view-pf-expand-active')
|
7
|
+
.find('.list-group-item-container').toggleClass('hidden');
|
8
|
+
}
|
9
|
+
});
|
10
|
+
|
11
|
+
// click the close button, hide the expand row and remove the active status
|
12
|
+
$('.list-group-item-container .close').click(function() {
|
13
|
+
$(this).parent().addClass('hidden')
|
14
|
+
.parent().removeClass('list-view-pf-expand-active')
|
15
|
+
.find('.fa-angle-right').removeClass('fa-angle-down');
|
16
|
+
});
|
17
|
+
});
|
@@ -16,23 +16,18 @@ module ForemanWreckingball
|
|
16
16
|
before_action :find_status, :only => [:submit_remediate, :schedule_remediate]
|
17
17
|
|
18
18
|
def status_dashboard
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
.joins(host_association)
|
32
|
-
.includes(host_association)
|
33
|
-
.map { |host| host.public_send(host_association).to_global }
|
34
|
-
.group_by { |global_status| global_status }
|
35
|
-
.each_with_object({}) { |(global_status, items), hash| hash[global_status] = items.size }
|
19
|
+
@newest_data = Host.authorized(:view_hosts).joins(:vmware_facet).maximum('vmware_facets.updated_at')
|
20
|
+
host_ids = Host.authorized(:view_hosts)
|
21
|
+
.try { |query| params[:owned_only] ? query.owned_by_current_user_or_group_with_current_user : query }
|
22
|
+
.pluck(:id)
|
23
|
+
|
24
|
+
@data = HostStatus.wreckingball_statuses.map do |status|
|
25
|
+
counter = status.where(host_id: host_ids)
|
26
|
+
.select(:status)
|
27
|
+
.group(:status)
|
28
|
+
.count
|
29
|
+
.transform_keys { |key| status.to_global(key) }
|
30
|
+
|
36
31
|
{
|
37
32
|
name: status.status_name,
|
38
33
|
description: status.description,
|
@@ -47,25 +42,55 @@ module ForemanWreckingball
|
|
47
42
|
end
|
48
43
|
end
|
49
44
|
|
45
|
+
def status_managed_hosts_dashboard
|
46
|
+
@hosts = Host::Managed.authorized(:view_hosts, Host)
|
47
|
+
.try { |query| params[:owned_only] ? query.owned_by_current_user_or_group_with_current_user : query }
|
48
|
+
|
49
|
+
compute_resources = ComputeResource.where(:type => 'Foreman::Model::Vmware')
|
50
|
+
|
51
|
+
# get all vms by compute resource id
|
52
|
+
vms_by_compute_resource_id = {}
|
53
|
+
# NOTE The call to ComputeResource#vms may slow things down
|
54
|
+
compute_resources.each { |cr| vms_by_compute_resource_id[cr.id] = cr.vms(eager_loading: true) }
|
55
|
+
|
56
|
+
vms_by_uuid = vms_by_compute_resource_id.values.flatten.group_by(&:uuid)
|
57
|
+
|
58
|
+
# Find all hosts with duplicate VMs
|
59
|
+
@duplicate_vms = vms_by_uuid.select { |_uuid, vms| vms.size > 1 }
|
60
|
+
|
61
|
+
@missing_hosts = []
|
62
|
+
@different_hosts = []
|
63
|
+
|
64
|
+
@hosts.each do |host|
|
65
|
+
next unless host.compute_resource_id
|
66
|
+
|
67
|
+
# find the compute resource id of the host in the vm map
|
68
|
+
cr_id, _vms = vms_by_compute_resource_id.find { |_cr_id, vms| vms.find { |vm| vm.uuid == host.uuid } }
|
69
|
+
|
70
|
+
if cr_id.nil?
|
71
|
+
# No compute resource id is found, vSphere does not have the vm uuid
|
72
|
+
@missing_hosts << host
|
73
|
+
elsif cr_id != host.compute_resource_id
|
74
|
+
# The host uuid is found in a different compute resource
|
75
|
+
@different_hosts << host
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
50
80
|
# ajax method
|
51
81
|
def status_hosts
|
52
|
-
|
53
|
-
|
54
|
-
vmware_operatingsystem_status_object: ForemanWreckingball::OperatingsystemStatus,
|
55
|
-
vmware_cpu_hot_add_status_object: ForemanWreckingball::CpuHotAddStatus,
|
56
|
-
vmware_spectre_v2_status_object: ForemanWreckingball::SpectreV2Status,
|
57
|
-
vmware_hardware_version_status_object: ForemanWreckingball::HardwareVersionStatus
|
58
|
-
}
|
59
|
-
|
60
|
-
@status = statuses_map[params[:status].to_sym]
|
82
|
+
@status = HostStatus.find_wreckingball_status_by_host_association(params.fetch(:status).to_sym)
|
83
|
+
|
61
84
|
all_hosts = Host.authorized(:view_hosts, Host)
|
62
85
|
.joins(@status.host_association)
|
86
|
+
.try { |query| params[:owned_only] ? query.owned_by_current_user_or_group_with_current_user : query }
|
63
87
|
.includes(@status.host_association, :vmware_facet, :environment)
|
88
|
+
.where.not('host_status.status': @status.global_ok_list)
|
64
89
|
.preload(:owner)
|
65
90
|
.order(:name)
|
66
|
-
|
67
|
-
@
|
68
|
-
|
91
|
+
|
92
|
+
@count = all_hosts.size
|
93
|
+
@hosts = all_hosts.paginate(page: params.fetch(:page, 1), per_page: params.fetch(:per_page, 100))
|
69
94
|
|
70
95
|
respond_to do |format|
|
71
96
|
format.json do
|
@@ -77,11 +102,16 @@ module ForemanWreckingball
|
|
77
102
|
end
|
78
103
|
|
79
104
|
def refresh_status_dashboard
|
80
|
-
|
81
|
-
|
82
|
-
|
105
|
+
if ForemanTasks::Task.active.where(label: ::Actions::ForemanWreckingball::Vmware::ScheduleVmwareSync.to_s).empty?
|
106
|
+
flash[:success] = _('Refresh Compute Resource data task was successfully scheduled.')
|
107
|
+
task = User.as_anonymous_admin do
|
108
|
+
::ForemanTasks.async_task(::Actions::ForemanWreckingball::Vmware::ScheduleVmwareSync)
|
109
|
+
end
|
110
|
+
redirect_to(foreman_tasks_task_path(task.id))
|
111
|
+
else
|
112
|
+
flash[:warning] = _('Refresh Compute Resource data task is already running. Please wait for the running task to finish.')
|
113
|
+
redirect_to status_dashboard_hosts_path
|
83
114
|
end
|
84
|
-
redirect_to(foreman_tasks_task_path(task.id))
|
85
115
|
end
|
86
116
|
|
87
117
|
def schedule_remediate
|
@@ -89,7 +119,7 @@ module ForemanWreckingball
|
|
89
119
|
end
|
90
120
|
|
91
121
|
def submit_remediate
|
92
|
-
raise Foreman::Exception, 'VMware Status can not be remediated.' unless @status.class.respond_to?(:supports_remediate?) && @status.class.supports_remediate?
|
122
|
+
raise Foreman::Exception, _('VMware Status can not be remediated.') unless @status.class.respond_to?(:supports_remediate?) && @status.class.supports_remediate?
|
93
123
|
task = User.as_anonymous_admin do
|
94
124
|
triggering = ::ForemanTasks::Triggering.new_from_params(triggering_params)
|
95
125
|
if triggering.future?
|
@@ -119,7 +149,7 @@ module ForemanWreckingball
|
|
119
149
|
|
120
150
|
def action_permission
|
121
151
|
case params[:action]
|
122
|
-
when 'status_dashboard'
|
152
|
+
when 'status_dashboard', 'status_hosts'
|
123
153
|
'view'
|
124
154
|
when 'refresh_status_dashboard'
|
125
155
|
'refresh_vmware_status'
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Actions
|
4
|
+
module ForemanWreckingball
|
5
|
+
module Host
|
6
|
+
class RemediateSpectreV2 < Actions::EntryAction
|
7
|
+
middleware.use Actions::Middleware::KeepCurrentUser
|
8
|
+
|
9
|
+
def delay(delay_options, host)
|
10
|
+
action_subject(host)
|
11
|
+
super(delay_options, host)
|
12
|
+
end
|
13
|
+
|
14
|
+
def plan(host)
|
15
|
+
action_subject(host)
|
16
|
+
plan_self
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
host = ::Host.find(input[:host][:id])
|
21
|
+
|
22
|
+
initially_powered_on = host.power.ready?
|
23
|
+
output[:initially_powered_on] = initially_powered_on
|
24
|
+
|
25
|
+
vm = host.compute_object
|
26
|
+
|
27
|
+
if initially_powered_on
|
28
|
+
vm.stop
|
29
|
+
vm.wait_for { power_state == 'poweredOff' }
|
30
|
+
fail _('Could not shut down VM.') if vm.ready?
|
31
|
+
end
|
32
|
+
|
33
|
+
vm.start if vm && initially_powered_on
|
34
|
+
|
35
|
+
state = host.refresh_vmware_facet!
|
36
|
+
output[:state] = state
|
37
|
+
end
|
38
|
+
|
39
|
+
def humanized_name
|
40
|
+
_('Power-Cycle VM')
|
41
|
+
end
|
42
|
+
|
43
|
+
def humanized_input
|
44
|
+
input[:host] && input[:host][:name]
|
45
|
+
end
|
46
|
+
|
47
|
+
def append_error(message)
|
48
|
+
output[:errors] ||= []
|
49
|
+
output[:errors] << message
|
50
|
+
end
|
51
|
+
|
52
|
+
def rescue_strategy
|
53
|
+
Dynflow::Action::Rescue::Skip
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -6,31 +6,16 @@ module ForemanWreckingball
|
|
6
6
|
include ForemanTasks::Concerns::ActionSubject
|
7
7
|
|
8
8
|
included do
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
has_one :vmware_cpu_hot_add_status_object,
|
20
|
-
:class_name => 'ForemanWreckingball::CpuHotAddStatus',
|
21
|
-
:foreign_key => 'host_id',
|
22
|
-
:inverse_of => :host,
|
23
|
-
:dependent => :destroy
|
24
|
-
has_one :vmware_spectre_v2_status_object,
|
25
|
-
:class_name => 'ForemanWreckingball::SpectreV2Status',
|
26
|
-
:foreign_key => 'host_id',
|
27
|
-
:inverse_of => :host,
|
28
|
-
:dependent => :destroy
|
29
|
-
has_one :vmware_hardware_version_status_object,
|
30
|
-
:class_name => 'ForemanWreckingball::HardwareVersionStatus',
|
31
|
-
:foreign_key => 'host_id',
|
32
|
-
:inverse_of => :host,
|
33
|
-
:dependent => :destroy
|
9
|
+
ForemanWreckingball::Engine::WRECKINGBALL_STATUSES.map(&:constantize).each do |status|
|
10
|
+
has_one(status.host_association, class_name: status.to_s,
|
11
|
+
foreign_key: 'host_id',
|
12
|
+
inverse_of: :host,
|
13
|
+
dependent: :destroy)
|
14
|
+
end
|
15
|
+
|
16
|
+
scope :owned_by_current_user, -> { where(owner_type: 'User', owner_id: User.current.id) }
|
17
|
+
scope :owned_by_group_with_current_user, -> { where(owner_type: 'Usergroup', owner_id: User.current.usergroup_ids_with_parents) }
|
18
|
+
scope :owned_by_current_user_or_group_with_current_user, -> { owned_by_current_user.or(owned_by_group_with_current_user) }
|
34
19
|
end
|
35
20
|
|
36
21
|
def action_input_key
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ForemanWreckingball
|
4
|
+
module HostStatusExtensions
|
5
|
+
def wreckingball_statuses
|
6
|
+
status_registry.select { |s| s.to_s.start_with?('ForemanWreckingball') }
|
7
|
+
end
|
8
|
+
|
9
|
+
def find_wreckingball_status_by_host_association(host_association)
|
10
|
+
wreckingball_statuses.find { |s| s.host_association == host_association }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ForemanWreckingball
|
4
|
+
module UsergroupExtensions
|
5
|
+
def parent_usergroup_ids
|
6
|
+
@parent_usergroup_ids ||= get_parent_ids(parent_ids)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def get_parent_ids(member_ids, result_ids = parent_ids)
|
12
|
+
return result_ids if member_ids.empty?
|
13
|
+
|
14
|
+
new_parent_ids = UsergroupMember.usergroup_memberships.where(member_id: member_ids).pluck(:usergroup_id)
|
15
|
+
get_parent_ids(new_parent_ids, result_ids + new_parent_ids)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -8,6 +8,16 @@ module ForemanWreckingball
|
|
8
8
|
has_one :vmware_facet, :class_name => '::ForemanWreckingball::VmwareFacet', :foreign_key => :host_id, :inverse_of => :host, :dependent => :destroy
|
9
9
|
|
10
10
|
before_provision :queue_vmware_facet_refresh
|
11
|
+
|
12
|
+
scoped_search on: :hardware_version, relation: :vmware_facet, rename: :vsphere_hardware_version, complete_value: true, only_explicit: true
|
13
|
+
scoped_search on: :guest_id, relation: :vmware_facet, rename: :vsphere_guest_id, complete_value: true, only_explicit: true
|
14
|
+
scoped_search on: :cpus, relation: :vmware_facet, rename: :vsphere_cpus, complete_value: true, only_explicit: true
|
15
|
+
scoped_search on: :corespersocket, relation: :vmware_facet, rename: :vsphere_corespersocket, complete_value: true, only_explicit: true
|
16
|
+
scoped_search on: :memory_mb, relation: :vmware_facet, rename: :vsphere_memory_mb, complete_value: true, only_explicit: true
|
17
|
+
scoped_search on: :power_state, relation: :vmware_facet, rename: :vsphere_power_state, only_explicit: true,
|
18
|
+
complete_value: ForemanWreckingball::VmwareFacet::VALID_POWER_STATES.map { |status| [status, ForemanWreckingball::VmwareFacet.power_states[status]] }.to_h
|
19
|
+
scoped_search on: :tools_state, relation: :vmware_facet, rename: :vsphere_tools_state, only_explicit: true,
|
20
|
+
complete_value: ForemanWreckingball::VmwareFacet::VALID_GUEST_STATUSES.map { |status| [status, ForemanWreckingball::VmwareFacet.tools_states[status]] }.to_h
|
11
21
|
end
|
12
22
|
|
13
23
|
def refresh_vmware_facet!
|
@@ -26,6 +26,10 @@ module ForemanWreckingball
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def to_global(_options = {})
|
29
|
+
self.class.to_global(status)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.to_global(status)
|
29
33
|
case status
|
30
34
|
when PERFORMANCE_DEGRATION
|
31
35
|
HostStatus::Global::ERROR
|
@@ -34,6 +38,10 @@ module ForemanWreckingball
|
|
34
38
|
end
|
35
39
|
end
|
36
40
|
|
41
|
+
def self.global_ok_list
|
42
|
+
[OK]
|
43
|
+
end
|
44
|
+
|
37
45
|
def to_label(_options = {})
|
38
46
|
case status
|
39
47
|
when PERFORMANCE_DEGRATION
|
@@ -34,6 +34,10 @@ module ForemanWreckingball
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def to_global(_options = {})
|
37
|
+
self.class.to_global(status)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.to_global(status)
|
37
41
|
case status
|
38
42
|
when OUTOFDATE
|
39
43
|
HostStatus::Global::WARN
|
@@ -42,6 +46,10 @@ module ForemanWreckingball
|
|
42
46
|
end
|
43
47
|
end
|
44
48
|
|
49
|
+
def self.global_ok_list
|
50
|
+
[OK]
|
51
|
+
end
|
52
|
+
|
45
53
|
def to_label(_options = {})
|
46
54
|
case status
|
47
55
|
when OUTOFDATE
|
@@ -34,6 +34,10 @@ module ForemanWreckingball
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def to_global(_options = {})
|
37
|
+
self.class.to_global(status)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.to_global(status)
|
37
41
|
case status
|
38
42
|
when MISMATCH
|
39
43
|
HostStatus::Global::WARN
|
@@ -42,6 +46,10 @@ module ForemanWreckingball
|
|
42
46
|
end
|
43
47
|
end
|
44
48
|
|
49
|
+
def self.global_ok_list
|
50
|
+
[OK]
|
51
|
+
end
|
52
|
+
|
45
53
|
def to_label(_options = {})
|
46
54
|
case status
|
47
55
|
when MISMATCH
|
@@ -18,7 +18,15 @@ module ForemanWreckingball
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def self.supports_remediate?
|
21
|
-
|
21
|
+
true
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.dangerous_remediate?
|
25
|
+
true
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.remediate_action
|
29
|
+
::Actions::ForemanWreckingball::Host::RemediateSpectreV2
|
22
30
|
end
|
23
31
|
|
24
32
|
def to_status(_options = {})
|
@@ -26,6 +34,10 @@ module ForemanWreckingball
|
|
26
34
|
end
|
27
35
|
|
28
36
|
def to_global(_options = {})
|
37
|
+
self.class.to_global(status)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.to_global(status)
|
29
41
|
case status
|
30
42
|
when MISSING
|
31
43
|
HostStatus::Global::ERROR
|
@@ -34,6 +46,10 @@ module ForemanWreckingball
|
|
34
46
|
end
|
35
47
|
end
|
36
48
|
|
49
|
+
def self.global_ok_list
|
50
|
+
[ENABLED]
|
51
|
+
end
|
52
|
+
|
37
53
|
def to_label(_options = {})
|
38
54
|
case status
|
39
55
|
when MISSING
|
@@ -26,6 +26,10 @@ module ForemanWreckingball
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def to_global(_options = {})
|
29
|
+
self.class.to_global(status)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.to_global(status)
|
29
33
|
case status
|
30
34
|
when VmwareFacet.tools_states[:toolsOk], POWERDOWN
|
31
35
|
HostStatus::Global::OK
|
@@ -36,6 +40,10 @@ module ForemanWreckingball
|
|
36
40
|
end
|
37
41
|
end
|
38
42
|
|
43
|
+
def self.global_ok_list
|
44
|
+
[VmwareFacet.tools_states[:toolsOk], POWERDOWN]
|
45
|
+
end
|
46
|
+
|
39
47
|
def to_label(_options = {})
|
40
48
|
return N_('Powered down') if status == POWERDOWN
|
41
49
|
host.vmware_facet.tools_state_label
|
@@ -57,11 +57,7 @@ module ForemanWreckingball
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def refresh_statuses
|
60
|
-
host.get_status(
|
61
|
-
host.get_status(::ForemanWreckingball::CpuHotAddStatus).refresh!
|
62
|
-
host.get_status(::ForemanWreckingball::OperatingsystemStatus).refresh!
|
63
|
-
host.get_status(::ForemanWreckingball::SpectreV2Status).refresh!
|
64
|
-
host.get_status(::ForemanWreckingball::HardwareVersionStatus).refresh!
|
60
|
+
::HostStatus.wreckingball_statuses.each { |status| host.get_status(status).refresh! }
|
65
61
|
host.refresh_global_status!
|
66
62
|
end
|
67
63
|
|
@@ -18,12 +18,7 @@ module ForemanWreckingball
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def delete_removed_clusters
|
21
|
-
|
22
|
-
counters[:deleted] = if ActiveRecord::Base.connection.adapter_name.downcase.starts_with? 'mysql'
|
23
|
-
::ForemanWreckingball::VmwareCluster.where(:id => delete_query.pluck(:id)).delete_all
|
24
|
-
else
|
25
|
-
delete_query.delete_all
|
26
|
-
end
|
21
|
+
counters[:deleted] = ::ForemanWreckingball::VmwareCluster.where(compute_resource: compute_resource).where.not(name: cluster_names).destroy_all
|
27
22
|
end
|
28
23
|
|
29
24
|
def create_new_clusters
|
@@ -5,6 +5,16 @@
|
|
5
5
|
)
|
6
6
|
%>
|
7
7
|
|
8
|
+
<%= title_actions(
|
9
|
+
button_group(
|
10
|
+
if params[:owned_only]
|
11
|
+
link_to _('Show all hosts'), status_dashboard_hosts_path, class: 'btn btn-default'
|
12
|
+
else
|
13
|
+
link_to _('Show only owned hosts'), status_dashboard_hosts_path(owned_only: true), class: 'btn btn-default'
|
14
|
+
end
|
15
|
+
)
|
16
|
+
) %>
|
17
|
+
|
8
18
|
<div class="list-group list-view-pf list-view-pf-equalized-column" style="max-height: initial;">
|
9
19
|
<% @data.each_with_index do |status, idx| %>
|
10
20
|
<%=
|
@@ -19,24 +29,3 @@
|
|
19
29
|
%>
|
20
30
|
<% end %>
|
21
31
|
</div>
|
22
|
-
<script>
|
23
|
-
$(document).ready(function () {
|
24
|
-
// click the list-view heading then expand a row
|
25
|
-
$(".list-group-item-header").click(function(event){
|
26
|
-
if(!$(event.target).is("button, a, input, .fa-ellipsis-v")){
|
27
|
-
$(this).find(".fa-angle-right").toggleClass("fa-angle-down")
|
28
|
-
.end().parent().toggleClass("list-view-pf-expand-active")
|
29
|
-
.find(".list-group-item-container").toggleClass("hidden");
|
30
|
-
} else {
|
31
|
-
}
|
32
|
-
})
|
33
|
-
|
34
|
-
// click the close button, hide the expand row and remove the active status
|
35
|
-
$(".list-group-item-container .close").on("click", function (){
|
36
|
-
$(this).parent().addClass("hidden")
|
37
|
-
.parent().removeClass("list-view-pf-expand-active")
|
38
|
-
.find(".fa-angle-right").removeClass("fa-angle-down");
|
39
|
-
})
|
40
|
-
|
41
|
-
});
|
42
|
-
</script>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<%= content_tag :table, id: status,
|
2
2
|
class: 'table table-striped table-fixed status-hosts',
|
3
|
-
'data-hosts-url': ajax_status_dashboard_hosts_path(status) do %>
|
3
|
+
'data-hosts-url': ajax_status_dashboard_hosts_path(status, owned_only: params[:owned_only]) do %>
|
4
4
|
<%= content_tag :thead do %>
|
5
5
|
<%= content_tag :tr do %>
|
6
6
|
<%= content_tag :th, _('Hostname') %>
|
@@ -2,6 +2,7 @@
|
|
2
2
|
<% javascript 'foreman_wreckingball/modal' %>
|
3
3
|
<% javascript 'foreman_wreckingball/status_hosts_table' %>
|
4
4
|
<% stylesheet 'foreman_wreckingball/status_hosts_table' %>
|
5
|
+
<% javascript 'foreman_wreckingball/status_row' %>
|
5
6
|
<% javascript 'foreman_tasks/trigger_form' %>
|
6
7
|
<% stylesheet 'foreman_tasks/trigger_form' %>
|
7
8
|
|
@@ -0,0 +1,49 @@
|
|
1
|
+
<% title _('VMware Managed Hosts Overview') %>
|
2
|
+
<% javascript 'foreman_wreckingball/modal' %>
|
3
|
+
<% javascript 'foreman_wreckingball/status_hosts_table' %>
|
4
|
+
<% stylesheet 'foreman_wreckingball/status_hosts_table' %>
|
5
|
+
|
6
|
+
<%= title_actions(
|
7
|
+
button_group(
|
8
|
+
if params[:owned_only]
|
9
|
+
link_to _('Show all hosts'), status_managed_hosts_dashboard_hosts_path, class: 'btn btn-default'
|
10
|
+
else
|
11
|
+
link_to _('Show only owned hosts'), status_managed_hosts_dashboard_hosts_path(owned_only: true), class: 'btn btn-default'
|
12
|
+
end
|
13
|
+
)
|
14
|
+
) %>
|
15
|
+
|
16
|
+
<% if @missing_hosts.any? %>
|
17
|
+
<div id="missing_vms">
|
18
|
+
<h2>List of hosts not found in vSphere</h2>
|
19
|
+
<div class="list-group list-view-pf list-view-pf-equalized-column" style="max-height: initial;">
|
20
|
+
<% @missing_hosts.each do |host| %>
|
21
|
+
<div><%= host.name %></div>
|
22
|
+
<% end %>
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
<% if @duplicate_vms.any? %>
|
28
|
+
<div id="duplicate_vms">
|
29
|
+
<h2>List of VMs with same uuid</h2>
|
30
|
+
<div class="list-group list-view-pf list-view-pf-equalized-column" style="max-height: initial;">
|
31
|
+
<% @duplicate_vms.each do |uuid, hosts| %>
|
32
|
+
<% hosts.each do |host| %>
|
33
|
+
<div><%= host.uuid %> - <%= host.name %></div>
|
34
|
+
<% end %>
|
35
|
+
<% end %>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
<% end %>
|
39
|
+
|
40
|
+
<% if @different_hosts.any? %>
|
41
|
+
<div id="different_vms">
|
42
|
+
<h2>List of VMs associated with different compute resources</h2>
|
43
|
+
<div class="list-group list-view-pf list-view-pf-equalized-column" style="max-height: initial;">
|
44
|
+
<% @different_hosts.each do |host| %>
|
45
|
+
<div><%= host.uuid %> - <%= host.name %></div>
|
46
|
+
<% end %>
|
47
|
+
</div>
|
48
|
+
</div>
|
49
|
+
<% end %>
|
data/config/routes.rb
CHANGED
@@ -10,6 +10,7 @@ Rails.application.routes.draw do
|
|
10
10
|
end
|
11
11
|
collection do
|
12
12
|
get :status_dashboard
|
13
|
+
get :status_managed_hosts_dashboard
|
13
14
|
get 'status_dashboard/hosts(/:status)', as: :ajax_status_dashboard, action: :status_hosts, defaults: { format: :json }
|
14
15
|
put :refresh_status_dashboard
|
15
16
|
end
|