foreman_wreckingball 3.1.0 → 3.2.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 +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
|