foreman_wreckingball 3.3.0 → 3.4.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/app/assets/javascripts/foreman_wreckingball/status_managed_hosts_dashboard.js +8 -2
- data/app/controllers/foreman_wreckingball/hosts_controller.rb +29 -16
- data/app/views/foreman_wreckingball/hosts/_status_managed_hosts_dashboard_cards.html.erb +5 -5
- data/app/views/foreman_wreckingball/hosts/status_managed_hosts_dashboard.html.erb +53 -26
- data/lib/foreman_wreckingball/engine.rb +13 -4
- data/lib/foreman_wreckingball/version.rb +1 -1
- data/test/actions/foreman_wreckingball/host/refresh_vmware_facet_test.rb +3 -3
- data/test/actions/foreman_wreckingball/host/remediate_hardware_version_test.rb +2 -2
- data/test/actions/foreman_wreckingball/host/remediate_spectre_v2_test.rb +2 -2
- data/test/actions/foreman_wreckingball/host/remediate_vmware_operatingsystem_test.rb +1 -1
- data/test/controllers/foreman_wreckingball/hosts_controller_test.rb +2 -2
- data/test/integration/hosts_status_managed_hosts_test.rb +30 -18
- data/test/integration_test_plugin_helper.rb +1 -0
- data/test/models/foreman_wreckingball/vmware_facet_test.rb +5 -5
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6f9adf6349a9a378c18d5be9f632245d0861f63b53ba5ce89b1d72849e0e8c0a
|
|
4
|
+
data.tar.gz: '09d87212258ae239f338beed765cf7f9685505e446b458c030e49b33cfc11f27'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ad1fd61579be1231af29fd18b660e7b8185923f21cef0fad379bede4464eef6fc3cffb1b36da738bf3323918838a97003221a1a23500328ef2f6db9cdf690dc6
|
|
7
|
+
data.tar.gz: 2a2afce44f557b74509e3b9833f8ca8b3c95564146e2d16f8c733f0ea62ccc15bcc902da4a510f0b18d7fe76e22617c963aacbf4d073a9af66fa9c647c9bace6
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
$(document).ready(() => {
|
|
2
|
-
$('table#missing_vms').add('table#
|
|
2
|
+
$('table#missing_vms').add('table#wrong_hosts').add('table#more_than_one_hosts')
|
|
3
3
|
.DataTable({
|
|
4
4
|
bLengthChange: true,
|
|
5
5
|
lengthMenu: [20, 50, 100],
|
|
6
|
-
order: [[ 0, 'desc' ]]
|
|
6
|
+
order: [[ 0, 'desc' ]],
|
|
7
|
+
columnDefs: [
|
|
8
|
+
{
|
|
9
|
+
'targets': 'no-sort',
|
|
10
|
+
'orderable': false,
|
|
11
|
+
}
|
|
12
|
+
]
|
|
7
13
|
});
|
|
8
14
|
});
|
|
@@ -42,35 +42,48 @@ module ForemanWreckingball
|
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
def status_managed_hosts_dashboard
|
|
45
|
+
vmware_compute_resources = Foreman::Model::Vmware.unscoped.all
|
|
46
|
+
|
|
45
47
|
# NOTE The call to ComputeResource#vms may slow things down
|
|
46
|
-
vms_by_compute_resource_id =
|
|
47
|
-
memo[cr.id] = cr.vms
|
|
48
|
+
vms_by_compute_resource_id = vmware_compute_resources.each_with_object({}) do |cr, memo|
|
|
49
|
+
memo[cr.id] = cr.vms.all
|
|
48
50
|
end
|
|
49
51
|
|
|
50
|
-
#
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
# Get all VM UUIDs found in any of the compute resources
|
|
53
|
+
all_vm_uuids = vms_by_compute_resource_id.values.flatten.group_by(&:id).keys
|
|
54
|
+
|
|
55
|
+
# Map all VM UUIDs to all compute resources that have access to this VM
|
|
56
|
+
@vm_compute_resource_mapping = all_vm_uuids.each_with_object({}) do |uuid, obj|
|
|
57
|
+
cr_ids = vms_by_compute_resource_id.select { |_cr_id, vms| vms.find { |vm| vm.id == uuid } }.keys
|
|
58
|
+
obj[uuid] = vmware_compute_resources.select { |cr| cr_ids.include?(cr.id) }
|
|
59
|
+
end
|
|
55
60
|
|
|
56
61
|
@missing_hosts = []
|
|
57
|
-
@
|
|
62
|
+
@wrong_hosts = []
|
|
63
|
+
@more_than_one_hosts = []
|
|
58
64
|
|
|
59
65
|
Host::Managed.authorized(:view_hosts, Host)
|
|
60
|
-
.
|
|
66
|
+
.includes(:compute_resource)
|
|
67
|
+
.where(compute_resource: vmware_compute_resources)
|
|
61
68
|
.try { |query| params[:owned_only] ? query.owned_by_current_user_or_group_with_current_user : query }
|
|
62
69
|
.each do |host|
|
|
63
|
-
# find the compute resource id of the host in the vm map
|
|
64
|
-
cr_id, _vms = vms_by_compute_resource_id.find { |_cr_id, vms| vms.find { |vm| vm.uuid == host.uuid } }
|
|
65
70
|
|
|
66
|
-
|
|
67
|
-
|
|
71
|
+
compute_resources = @vm_compute_resource_mapping[host.uuid]
|
|
72
|
+
|
|
73
|
+
if compute_resources.empty?
|
|
74
|
+
# VM is not found on any compute resource, vSphere does not have the vm uuid
|
|
68
75
|
@missing_hosts << host
|
|
69
|
-
elsif
|
|
70
|
-
# The
|
|
71
|
-
@
|
|
76
|
+
elsif compute_resources.count > 1
|
|
77
|
+
# The vm uuid is found on more than one compute resource
|
|
78
|
+
@more_than_one_hosts << host
|
|
79
|
+
elsif host.compute_resource_id != compute_resources.first.id
|
|
80
|
+
# The host is associated to a wrong compute resource
|
|
81
|
+
@wrong_hosts << host
|
|
72
82
|
end
|
|
73
83
|
end
|
|
84
|
+
|
|
85
|
+
@compute_resource_authorizer = Authorizer.new(User.current, collection: vmware_compute_resources)
|
|
86
|
+
@host_authorizer = Authorizer.new(User.current)
|
|
74
87
|
end
|
|
75
88
|
|
|
76
89
|
# ajax method
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
<div class='status-managed-hosts-dashboard-cards container-fluid container-cards-pf'>
|
|
2
2
|
<div class='row row-cards-pf'>
|
|
3
3
|
<%= render partial: 'status_managed_hosts_dashboard_cards_card', locals: {
|
|
4
|
-
title: _('
|
|
4
|
+
title: _('Hosts not found in vSphere'),
|
|
5
5
|
count: missing_hosts_count
|
|
6
6
|
} %>
|
|
7
7
|
<%= render partial: 'status_managed_hosts_dashboard_cards_card', locals: {
|
|
8
|
-
title: _('
|
|
9
|
-
count:
|
|
8
|
+
title: _('Hosts associated to wrong Compute Resource'),
|
|
9
|
+
count: wrong_hosts_count
|
|
10
10
|
} %>
|
|
11
11
|
<%= render partial: 'status_managed_hosts_dashboard_cards_card', locals: {
|
|
12
|
-
title: _('
|
|
13
|
-
count:
|
|
12
|
+
title: _('Hosts found on more than one Compute Resource'),
|
|
13
|
+
count: more_than_one_hosts_count
|
|
14
14
|
} %>
|
|
15
15
|
</div>
|
|
16
16
|
</div>
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
|
|
15
15
|
<%= render partial: 'status_managed_hosts_dashboard_cards', locals: {
|
|
16
16
|
missing_hosts_count: @missing_hosts.count,
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
wrong_hosts_count: @wrong_hosts.count,
|
|
18
|
+
more_than_one_hosts_count: @more_than_one_hosts.count
|
|
19
19
|
} %>
|
|
20
20
|
|
|
21
21
|
<ul class='nav nav-tabs' data-tabs='tabs'>
|
|
@@ -23,74 +23,101 @@
|
|
|
23
23
|
<%= content_tag :a, _('List of Hosts not found in vSphere'), href: '#missing_vms_tab', 'data-toggle': 'tab' %>
|
|
24
24
|
</li>
|
|
25
25
|
<li>
|
|
26
|
-
<%= content_tag :a, _('List of
|
|
26
|
+
<%= content_tag :a, _('List of Hosts associated to wrong Compute Resource'), href: '#wrong_hosts_tab', 'data-toggle': 'tab' %>
|
|
27
27
|
</li>
|
|
28
28
|
<li>
|
|
29
|
-
<%= content_tag :a, _('List of
|
|
29
|
+
<%= content_tag :a, _('List of Hosts found on more than one Compute Resource'), href: '#more_than_one_hosts_tab', 'data-toggle': 'tab' %>
|
|
30
30
|
</li>
|
|
31
31
|
</ul>
|
|
32
32
|
|
|
33
33
|
<div class='tab-content'>
|
|
34
34
|
<div class='tab-pane active' id='missing_vms_tab'>
|
|
35
35
|
<% if @missing_hosts.empty? %>
|
|
36
|
-
<%= content_tag :p, _('No
|
|
36
|
+
<%= content_tag :p, _('No Hosts to show'), class: 'ca' %>
|
|
37
37
|
<% else %>
|
|
38
38
|
<%= content_tag :table, id: 'missing_vms', class: table_css_classes do %>
|
|
39
39
|
<thead>
|
|
40
40
|
<tr>
|
|
41
41
|
<%= content_tag :th, _('Name') %>
|
|
42
|
+
<%= content_tag :th, nil, class: 'no-sort' %>
|
|
42
43
|
</tr>
|
|
43
44
|
</thead>
|
|
44
45
|
<tbody>
|
|
45
46
|
<% @missing_hosts.each do |host| %>
|
|
46
47
|
<tr>
|
|
47
|
-
<%= content_tag :td, link_to_if_authorized(host.name, hash_for_host_path(id: host)) %>
|
|
48
|
+
<%= content_tag :td, link_to_if_authorized(host.name, hash_for_host_path(id: host).merge(permission: 'view_hosts', auth_object: host, authorizer: @host_authorizer)) %>
|
|
49
|
+
<td>
|
|
50
|
+
<%= action_buttons(display_delete_if_authorized(hash_for_host_path(id: host).merge(permission: 'destroy_hosts', auth_object: host, authorizer: @host_authorizer),
|
|
51
|
+
:data => { :confirm => _('Are you sure you want to delete host %s? This action is irreversible.') % host.name })) %>
|
|
52
|
+
</td>
|
|
48
53
|
</tr>
|
|
49
54
|
<% end %>
|
|
50
55
|
</tbody>
|
|
51
56
|
<% end %>
|
|
52
57
|
<% end %>
|
|
53
58
|
</div>
|
|
54
|
-
<div class='tab-pane' id='
|
|
55
|
-
<% if @
|
|
56
|
-
<%= content_tag :p, _('No
|
|
59
|
+
<div class='tab-pane' id='wrong_hosts_tab'>
|
|
60
|
+
<% if @wrong_hosts.empty? %>
|
|
61
|
+
<%= content_tag :p, _('No Hosts to show'), class: 'ca' %>
|
|
57
62
|
<% else %>
|
|
58
|
-
<%= content_tag :table, id: '
|
|
63
|
+
<%= content_tag :table, id: 'wrong_hosts', class: table_css_classes do %>
|
|
59
64
|
<thead>
|
|
60
65
|
<tr>
|
|
61
|
-
<%= content_tag :th, _('UUID') %>
|
|
62
66
|
<%= content_tag :th, _('Name') %>
|
|
67
|
+
<%= content_tag :th, _('Associated to') %>
|
|
68
|
+
<%= content_tag :th, _('Found on') %>
|
|
69
|
+
<%= content_tag :th, nil, class: 'no-sort' %>
|
|
63
70
|
</tr>
|
|
64
71
|
</thead>
|
|
65
72
|
<tbody>
|
|
66
|
-
<% @
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
+
<% @wrong_hosts.each do |host| %>
|
|
74
|
+
<tr>
|
|
75
|
+
<%= content_tag :td, link_to_if_authorized(host.name, hash_for_host_path(id: host).merge(permission: 'view_hosts', auth_object: host, authorizer: @host_authorizer)) %>
|
|
76
|
+
<%= content_tag :td, link_to_if_authorized(host.compute_resource.name, hash_for_compute_resource_path(id: host.compute_resource).merge(permission: 'view_compute_resources', auth_object: host.compute_resource, authorizer: @compute_resource_authorizer)) %>
|
|
77
|
+
<%= content_tag :td, link_to_if_authorized(@vm_compute_resource_mapping[host.uuid].first.name, hash_for_compute_resource_path(id: @vm_compute_resource_mapping[host.uuid].first).merge(permission: 'view_compute_resources', auth_object: @vm_compute_resource_mapping[host.uuid].first, authorizer: @compute_resource_authorizer)) %>
|
|
78
|
+
<td>
|
|
79
|
+
<%= action_buttons(
|
|
80
|
+
display_link_if_authorized(
|
|
81
|
+
_('Fix Association'),
|
|
82
|
+
hash_for_associate_compute_resource_vm_path(
|
|
83
|
+
compute_resource_id: @vm_compute_resource_mapping[host.uuid].first,
|
|
84
|
+
id: host.uuid
|
|
85
|
+
).merge(
|
|
86
|
+
auth_object: @vm_compute_resource_mapping[host.uuid].first,
|
|
87
|
+
authorizer: @compute_resource_authorizer,
|
|
88
|
+
permission: 'edit_compute_resources'
|
|
89
|
+
),
|
|
90
|
+
title: _('Associate Host to correct Compute Resouce'),
|
|
91
|
+
method: :put
|
|
92
|
+
)
|
|
93
|
+
) %>
|
|
94
|
+
</td>
|
|
95
|
+
</tr>
|
|
73
96
|
<% end %>
|
|
74
97
|
</tbody>
|
|
75
98
|
<% end %>
|
|
76
99
|
<% end %>
|
|
77
100
|
</div>
|
|
78
|
-
<div class='tab-pane' id='
|
|
79
|
-
<% if @
|
|
80
|
-
<%= content_tag :p, _('No
|
|
101
|
+
<div class='tab-pane' id='more_than_one_hosts_tab'>
|
|
102
|
+
<% if @more_than_one_hosts.empty? %>
|
|
103
|
+
<%= content_tag :p, _('No Hosts to show'), class: 'ca' %>
|
|
81
104
|
<% else %>
|
|
82
|
-
<%= content_tag :table, id: '
|
|
105
|
+
<%= content_tag :table, id: 'more_than_one_hosts', class: table_css_classes do %>
|
|
83
106
|
<thead>
|
|
84
107
|
<tr>
|
|
85
|
-
<%= content_tag :th, _('UUID') %>
|
|
86
108
|
<%= content_tag :th, _('Name') %>
|
|
109
|
+
<%= content_tag :th, _('Associated to') %>
|
|
110
|
+
<%= content_tag :th, _('Found on') %>
|
|
87
111
|
</tr>
|
|
88
112
|
</thead>
|
|
89
113
|
<tbody>
|
|
90
|
-
<% @
|
|
114
|
+
<% @more_than_one_hosts.each do |host| %>
|
|
91
115
|
<tr>
|
|
92
|
-
<%= content_tag :td, host.
|
|
93
|
-
<%= content_tag :td, link_to_if_authorized(host.name,
|
|
116
|
+
<%= content_tag :td, link_to_if_authorized(host.name, hash_for_host_path(id: host).merge(permission: 'view_hosts', auth_object: host, authorizer: authorizer)) %>
|
|
117
|
+
<%= content_tag :td, (link_to_if_authorized(host.compute_resource.name, hash_for_compute_resource_path(id: host.compute_resource).merge(permission: 'view_compute_resources', auth_object: host.compute_resource, authorizer: @compute_resource_authorizer)) if host.compute_resource) %>
|
|
118
|
+
<td>
|
|
119
|
+
<%= safe_join(@vm_compute_resource_mapping[host.uuid].map { |compute_resource| link_to_if_authorized(compute_resource.name, hash_for_compute_resource_path(id: compute_resource).merge(permission: 'view_compute_resources', auth_object: compute_resource, authorizer: @compute_resource_authorizer))}, ', ') %>
|
|
120
|
+
</td>
|
|
94
121
|
</tr>
|
|
95
122
|
<% end %>
|
|
96
123
|
</tbody>
|
|
@@ -110,10 +110,10 @@ module ForemanWreckingball
|
|
|
110
110
|
::Usergroup.send(:include, ForemanWreckingball::UsergroupExtensions)
|
|
111
111
|
|
|
112
112
|
if ForemanWreckingball.fog_patches_required?
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
113
|
+
ForemanWreckingball.fog_vsphere_namespace::Host.send(:include, FogExtensions::ForemanWreckingball::Vsphere::Host)
|
|
114
|
+
ForemanWreckingball.fog_vsphere_namespace::Server.send(:include, FogExtensions::ForemanWreckingball::Vsphere::Server)
|
|
115
|
+
ForemanWreckingball.fog_vsphere_namespace::Real.send(:include, FogExtensions::ForemanWreckingball::Vsphere::Real)
|
|
116
|
+
ForemanWreckingball.fog_vsphere_namespace::Mock.send(:include, FogExtensions::ForemanWreckingball::Vsphere::Mock)
|
|
117
117
|
end
|
|
118
118
|
rescue StandardError => e
|
|
119
119
|
Rails.logger.warn "ForemanWreckingball: skipping engine hook (#{e})\n#{e.backtrace.join("\n")}"
|
|
@@ -138,4 +138,13 @@ module ForemanWreckingball
|
|
|
138
138
|
rescue LoadError
|
|
139
139
|
false
|
|
140
140
|
end
|
|
141
|
+
|
|
142
|
+
def self.fog_vsphere_namespace
|
|
143
|
+
require 'fog/vsphere/version'
|
|
144
|
+
@fog_vsphere_namespace ||= if Gem::Version.new(Fog::Vsphere::VERSION) >= Gem::Version.new('3.0.0')
|
|
145
|
+
Fog::Vsphere::Compute
|
|
146
|
+
else
|
|
147
|
+
Fog::Compute::Vsphere
|
|
148
|
+
end
|
|
149
|
+
end
|
|
141
150
|
end
|
|
@@ -13,11 +13,11 @@ module Actions
|
|
|
13
13
|
|
|
14
14
|
setup do
|
|
15
15
|
::Fog.mock!
|
|
16
|
-
::
|
|
17
|
-
::
|
|
16
|
+
::ForemanWreckingball.fog_vsphere_namespace::Mock.any_instance.stubs(:get_vm_ref).returns(vm)
|
|
17
|
+
::ForemanWreckingball.fog_vsphere_namespace::Server.any_instance.stubs(:ready?).returns(false)
|
|
18
18
|
::ForemanWreckingball::SpectreV2Status.any_instance.stubs(:recent_hw_version?).returns(true)
|
|
19
19
|
# this is not stubbed correctly in fog-vsphere
|
|
20
|
-
|
|
20
|
+
::ForemanWreckingball.fog_vsphere_namespace::Server.any_instance.stubs(:cpuHotAddEnabled).returns(false)
|
|
21
21
|
Setting::Wreckingball.load_defaults
|
|
22
22
|
end
|
|
23
23
|
teardown { ::Fog.unmock! }
|
|
@@ -10,8 +10,8 @@ module Actions
|
|
|
10
10
|
setup do
|
|
11
11
|
::Fog.mock!
|
|
12
12
|
# this is not stubbed correctly in fog-vsphere
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
::ForemanWreckingball.fog_vsphere_namespace::Server.any_instance.stubs(:cpuHotAddEnabled).returns(false)
|
|
14
|
+
::ForemanWreckingball.fog_vsphere_namespace::Server.any_instance.stubs(:hardware_version).returns('vmx-13')
|
|
15
15
|
::ForemanWreckingball::SpectreV2Status.any_instance.stubs(:recent_hw_version?).returns(true)
|
|
16
16
|
::PowerManager::Virt.any_instance.stubs(:ready?).returns(true)
|
|
17
17
|
Setting::Wreckingball.load_defaults
|
|
@@ -10,8 +10,8 @@ module Actions
|
|
|
10
10
|
setup do
|
|
11
11
|
::Fog.mock!
|
|
12
12
|
# this is not stubbed correctly in fog-vsphere
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
::ForemanWreckingball.fog_vsphere_namespace::Server.any_instance.stubs(:cpuHotAddEnabled).returns(false)
|
|
14
|
+
::ForemanWreckingball.fog_vsphere_namespace::Server.any_instance.stubs(:hardware_version).returns('vmx-13')
|
|
15
15
|
::ForemanWreckingball::SpectreV2Status.any_instance.stubs(:recent_hw_version?).returns(true)
|
|
16
16
|
::PowerManager::Virt.any_instance.stubs(:ready?).returns(true)
|
|
17
17
|
Setting::Wreckingball.load_defaults
|
|
@@ -10,7 +10,7 @@ module Actions
|
|
|
10
10
|
setup do
|
|
11
11
|
::Fog.mock!
|
|
12
12
|
# this is not stubbed correctly in fog-vsphere
|
|
13
|
-
|
|
13
|
+
::ForemanWreckingball.fog_vsphere_namespace::Server.any_instance.stubs(:cpuHotAddEnabled).returns(false)
|
|
14
14
|
::ForemanWreckingball::SpectreV2Status.any_instance.stubs(:recent_hw_version?).returns(true)
|
|
15
15
|
::PowerManager::Virt.any_instance.stubs(:ready?).returns(true)
|
|
16
16
|
Setting::Wreckingball.load_defaults
|
|
@@ -116,9 +116,9 @@ module ForemanWreckingball
|
|
|
116
116
|
@missing_host = FactoryBot.create(:host, :managed, :with_vmware_facet, compute_resource: cr, owner: admin, uuid: 2)
|
|
117
117
|
|
|
118
118
|
mock_vm = mock('vm')
|
|
119
|
-
mock_vm.stubs(:
|
|
119
|
+
mock_vm.stubs(:id).returns(@managed_host.uuid)
|
|
120
120
|
mock_vm.stubs(:name).returns(@managed_host.name)
|
|
121
|
-
Foreman::Model::Vmware.any_instance.stubs(:vms).returns(Array(mock_vm))
|
|
121
|
+
Foreman::Model::Vmware.any_instance.stubs(:vms).returns(OpenStruct.new(all: Array(mock_vm)))
|
|
122
122
|
end
|
|
123
123
|
|
|
124
124
|
test 'shows a status page' do
|
|
@@ -25,9 +25,9 @@ class HostsStatusManagedHostsTest < ActionDispatch::IntegrationTest
|
|
|
25
25
|
missing_host = FactoryBot.create(:host, :managed, compute_resource: cr, owner: admin, uuid: 2)
|
|
26
26
|
|
|
27
27
|
mock_vm = mock('vm')
|
|
28
|
-
mock_vm.stubs(:
|
|
28
|
+
mock_vm.stubs(:id).returns(managed_host.uuid)
|
|
29
29
|
mock_vm.stubs(:name).returns(managed_host.name)
|
|
30
|
-
Foreman::Model::Vmware.any_instance.stubs(:vms).returns(Array(mock_vm))
|
|
30
|
+
Foreman::Model::Vmware.any_instance.stubs(:vms).returns(OpenStruct.new(all: Array(mock_vm)))
|
|
31
31
|
|
|
32
32
|
visit status_managed_hosts_dashboard_hosts_path
|
|
33
33
|
|
|
@@ -36,25 +36,37 @@ class HostsStatusManagedHostsTest < ActionDispatch::IntegrationTest
|
|
|
36
36
|
refute_includes list.text, managed_host.name
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
-
test 'shows
|
|
40
|
-
|
|
39
|
+
test 'shows hosts associated to wrong compute resource' do
|
|
40
|
+
other_cr = FactoryBot.create(
|
|
41
|
+
:vmware_cr,
|
|
42
|
+
uuid: 'bla',
|
|
43
|
+
organizations: [organization],
|
|
44
|
+
locations: [tax_location]
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
correct_host = FactoryBot.create(:host, :managed, compute_resource: cr, owner: admin, uuid: 1)
|
|
48
|
+
incorrect_host = FactoryBot.create(:host, :managed, compute_resource: cr, owner: admin, uuid: 2)
|
|
41
49
|
|
|
42
50
|
mock1_vm = mock('vm1')
|
|
43
|
-
mock1_vm.stubs(:
|
|
51
|
+
mock1_vm.stubs(:id).returns(correct_host.uuid)
|
|
44
52
|
mock1_vm.stubs(:name).returns('foo01.example.com')
|
|
45
53
|
mock2_vm = mock('vm2')
|
|
46
|
-
mock2_vm.stubs(:
|
|
54
|
+
mock2_vm.stubs(:id).returns(incorrect_host.uuid)
|
|
47
55
|
mock2_vm.stubs(:name).returns('foo02.example.com')
|
|
48
|
-
|
|
56
|
+
|
|
57
|
+
cr.stubs(:vms).returns(OpenStruct.new(all: [mock1_vm]))
|
|
58
|
+
other_cr.stubs(:vms).returns(OpenStruct.new(all: [mock2_vm]))
|
|
59
|
+
|
|
60
|
+
Foreman::Model::Vmware.stubs(:unscoped).returns(OpenStruct.new(all: [cr, other_cr]))
|
|
49
61
|
|
|
50
62
|
visit status_managed_hosts_dashboard_hosts_path
|
|
51
63
|
|
|
52
|
-
list = page.find('#
|
|
53
|
-
|
|
54
|
-
assert_includes list.text,
|
|
64
|
+
list = page.find('#wrong_hosts')
|
|
65
|
+
refute_includes list.text, correct_host.name
|
|
66
|
+
assert_includes list.text, incorrect_host.name
|
|
55
67
|
end
|
|
56
68
|
|
|
57
|
-
test 'shows hosts
|
|
69
|
+
test 'shows hosts that can be found one more than one compute resource' do
|
|
58
70
|
other_cr = FactoryBot.create(
|
|
59
71
|
:vmware_cr,
|
|
60
72
|
uuid: 'bla',
|
|
@@ -69,23 +81,23 @@ class HostsStatusManagedHostsTest < ActionDispatch::IntegrationTest
|
|
|
69
81
|
managed3_host = FactoryBot.create(:host, :managed, compute_resource: other_cr, owner: admin, uuid: 3)
|
|
70
82
|
|
|
71
83
|
mock1_vm = mock('vm1')
|
|
72
|
-
mock1_vm.stubs(:
|
|
84
|
+
mock1_vm.stubs(:id).returns(managed1_host.uuid)
|
|
73
85
|
mock1_vm.stubs(:name).returns(managed1_host.name)
|
|
74
86
|
mock2_vm = mock('vm2')
|
|
75
|
-
mock2_vm.stubs(:
|
|
87
|
+
mock2_vm.stubs(:id).returns(managed2_host.uuid)
|
|
76
88
|
mock2_vm.stubs(:name).returns(managed2_host.name)
|
|
77
89
|
mock3_vm = mock('vm3')
|
|
78
|
-
mock3_vm.stubs(:
|
|
90
|
+
mock3_vm.stubs(:id).returns(managed3_host.uuid)
|
|
79
91
|
mock3_vm.stubs(:name).returns(managed3_host.name)
|
|
80
92
|
|
|
81
|
-
cr.stubs(:vms).returns([mock1_vm, mock2_vm])
|
|
82
|
-
other_cr.stubs(:vms).returns([mock3_vm])
|
|
93
|
+
cr.stubs(:vms).returns(OpenStruct.new(all: [mock1_vm, mock2_vm]))
|
|
94
|
+
other_cr.stubs(:vms).returns(OpenStruct.new(all: [mock2_vm, mock3_vm]))
|
|
83
95
|
|
|
84
|
-
Foreman::Model::Vmware.stubs(:
|
|
96
|
+
Foreman::Model::Vmware.stubs(:unscoped).returns(OpenStruct.new(all: [cr, other_cr]))
|
|
85
97
|
|
|
86
98
|
visit status_managed_hosts_dashboard_hosts_path
|
|
87
99
|
|
|
88
|
-
list = page.find('#
|
|
100
|
+
list = page.find('#more_than_one_hosts')
|
|
89
101
|
refute_includes list.text, managed1_host.name
|
|
90
102
|
assert_includes list.text, managed2_host.name
|
|
91
103
|
refute_includes list.text, managed3_host.name
|
|
@@ -6,6 +6,7 @@ require 'webmock/minitest'
|
|
|
6
6
|
require 'webmock'
|
|
7
7
|
|
|
8
8
|
# Add plugin to FactoryBot's paths
|
|
9
|
+
FactoryBot.definition_file_paths << File.join(ForemanTasks::Engine.root, 'test', 'factories')
|
|
9
10
|
FactoryBot.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
|
|
10
11
|
FactoryBot.reload
|
|
11
12
|
|
|
@@ -62,12 +62,12 @@ module ForemanWreckingball
|
|
|
62
62
|
|
|
63
63
|
setup do
|
|
64
64
|
::Fog.mock!
|
|
65
|
-
::
|
|
65
|
+
::ForemanWreckingball.fog_vsphere_namespace::Mock.any_instance.stubs(:get_vm_ref).returns(vm)
|
|
66
66
|
# this is not stubbed correctly in fog-vsphere
|
|
67
|
-
::
|
|
68
|
-
::
|
|
69
|
-
::
|
|
70
|
-
::
|
|
67
|
+
::ForemanWreckingball.fog_vsphere_namespace::Server.any_instance.stubs(:cpuHotAddEnabled).returns(false)
|
|
68
|
+
::ForemanWreckingball.fog_vsphere_namespace::Server.any_instance.stubs(:hardware_version).returns('vmx-9')
|
|
69
|
+
::ForemanWreckingball.fog_vsphere_namespace::Server.any_instance.stubs(:corespersocket).returns(1)
|
|
70
|
+
::ForemanWreckingball.fog_vsphere_namespace::Server.any_instance.stubs(:power_state).returns('poweredOn')
|
|
71
71
|
end
|
|
72
72
|
teardown { ::Fog.unmock! }
|
|
73
73
|
|
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: 3.
|
|
4
|
+
version: 3.4.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: 2019-
|
|
11
|
+
date: 2019-04-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: foreman-tasks
|