foreman_virt_who_configure 0.0.2 → 0.1.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_virt_who_configure/config_copy_and_paste.js +8 -0
- data/app/assets/javascripts/foreman_virt_who_configure/config_edit.js +23 -8
- data/app/controllers/foreman_virt_who_configure/api/v2/configs_controller.rb +120 -0
- data/app/controllers/foreman_virt_who_configure/configs_controller.rb +17 -2
- data/app/helpers/foreman_virt_who_configure/compatibility_helper.rb +9 -0
- data/app/helpers/foreman_virt_who_configure/configs_helper.rb +4 -10
- data/app/models/foreman_virt_who_configure/auth_source_hidden_with_authentication.rb +10 -1
- data/app/models/foreman_virt_who_configure/config.rb +24 -29
- data/app/models/foreman_virt_who_configure/output_generator.rb +99 -17
- data/app/services/sso/basic_with_hidden.rb +1 -1
- data/app/views/dashboard/_foreman_virt_who_configs_status_widget.html.erb +7 -8
- data/app/views/foreman_virt_who_configure/api/v2/configs/base.json.rabl +3 -0
- data/app/views/foreman_virt_who_configure/api/v2/configs/create.json.rabl +3 -0
- data/app/views/foreman_virt_who_configure/api/v2/configs/deploy_script.json.rabl +3 -0
- data/app/views/foreman_virt_who_configure/api/v2/configs/index.json.rabl +3 -0
- data/app/views/foreman_virt_who_configure/api/v2/configs/main.json.rabl +8 -0
- data/app/views/foreman_virt_who_configure/api/v2/configs/show.json.rabl +3 -0
- data/app/views/foreman_virt_who_configure/api/v2/configs/update.json.rabl +3 -0
- data/app/views/foreman_virt_who_configure/configs/show.html.erb +10 -4
- data/app/views/foreman_virt_who_configure/configs/steps/_connection_form.erb +13 -13
- data/app/views/foreman_virt_who_configure/configs/steps/_general_information_form.erb +4 -4
- data/app/views/foreman_virt_who_configure/configs/steps/_schedule_form.erb +1 -2
- data/config/routes.rb +19 -0
- data/lib/foreman_virt_who_configure/engine.rb +18 -4
- data/lib/foreman_virt_who_configure/version.rb +1 -1
- data/locale/action_names.rb +1 -0
- data/locale/en/LC_MESSAGES/foreman_virt_who_configure.mo +0 -0
- data/locale/en/foreman_virt_who_configure.edit.po +733 -0
- data/locale/en/foreman_virt_who_configure.po +262 -2
- data/locale/en/foreman_virt_who_configure.po.time_stamp +0 -0
- data/locale/foreman_virt_who_configure.pot +441 -8
- data/test/functional/api/v2/configs_controller_test.rb +178 -0
- data/test/unit/output_generator_test.rb +29 -0
- metadata +19 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fcd1a62a927233569d45344186f1797f8f83f858
|
4
|
+
data.tar.gz: d85400e71ed4d0beb6de66f47a793cf0083cb35e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4bc9ac6611d4c47f0323afdf087759cba98545e4d101a8b61ad974e2c97a8cc6a7ef05627bbf5c842261a03edb2a7063ab434ae1e12ad745ecd2ddef36be8ee3
|
7
|
+
data.tar.gz: bfb46ba995b7574ebd567e5f6017835bb27d688a85f24f9de7c368f2ff37cc64ffb44e80b79d215a85e67dfffecc2991fc2fe32a9d34714c80bec1bd2878d18f
|
@@ -16,16 +16,31 @@ function virt_who_update_listing_mode() {
|
|
16
16
|
}
|
17
17
|
}
|
18
18
|
|
19
|
-
|
20
|
-
$('#foreman_virt_who_configure_config_hypervisor_type').
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
19
|
+
function virt_who_update_hypervisor_fields() {
|
20
|
+
selected_type = $('#foreman_virt_who_configure_config_hypervisor_type').val();
|
21
|
+
var element = $('#foreman_virt_who_configure_config_hypervisor_password');
|
22
|
+
element.closest('.form-group').toggle(selected_type != 'libvirt');
|
23
|
+
}
|
24
|
+
|
25
|
+
function virt_who_update_credentials_help() {
|
26
|
+
selected_type = $(this).val();
|
27
|
+
$.each(['hypervisor_server', 'hypervisor_username'], function(index, value) {
|
28
|
+
var element = $('#foreman_virt_who_configure_config_' + value);
|
29
|
+
var help = element.data("help")[selected_type];
|
30
|
+
var inline_help_popover = element.parents('.form-group').find('.help-inline a[rel=popover]');
|
31
|
+
if (inline_help_popover[0]) {
|
32
|
+
// pre Foreman 1.15
|
33
|
+
inline_help_popover.attr('data-content', help);
|
34
|
+
} else {
|
35
|
+
element.parents('.form-group').find('label a[rel=popover]').attr('data-content', help);
|
36
|
+
}
|
27
37
|
});
|
38
|
+
}
|
28
39
|
|
40
|
+
$(document).ready(function () {
|
29
41
|
virt_who_update_listing_mode();
|
42
|
+
virt_who_update_hypervisor_fields();
|
30
43
|
$('#foreman_virt_who_configure_config_listing_mode').change(virt_who_update_listing_mode);
|
44
|
+
$('#foreman_virt_who_configure_config_hypervisor_type').change(virt_who_update_credentials_help);
|
45
|
+
$('#foreman_virt_who_configure_config_hypervisor_type').change(virt_who_update_hypervisor_fields);
|
31
46
|
});
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module ForemanVirtWhoConfigure
|
2
|
+
module Api
|
3
|
+
module V2
|
4
|
+
class ConfigsController < ::Api::V2::BaseController
|
5
|
+
include ::Api::Version2
|
6
|
+
include ForemanVirtWhoConfigure::Concerns::ConfigParameters if Foreman::Version.new.short >= '1.13'
|
7
|
+
resource_description do
|
8
|
+
api_base_url "/foreman_virt_who_configure/api"
|
9
|
+
end
|
10
|
+
|
11
|
+
before_action :find_resource, :only => %w{show deploy_script update destroy}
|
12
|
+
|
13
|
+
api :GET, '/configs', N_("List of virt-who configurations")
|
14
|
+
api :GET, "/organizations/:organization_id/configs", N_("List of virt-who configurations per organization")
|
15
|
+
param_group :search_and_pagination, ::Api::V2::BaseController
|
16
|
+
|
17
|
+
def index
|
18
|
+
@configs = resource_scope_for_index
|
19
|
+
end
|
20
|
+
|
21
|
+
api :GET, "/configs/:id/", N_("Show a virt-who configuration")
|
22
|
+
param :id, :identifier, :required => true
|
23
|
+
|
24
|
+
def show
|
25
|
+
end
|
26
|
+
|
27
|
+
api :GET, "/configs/:id/deploy_script/", N_("Renders a deploy script for the specified virt-who configuration")
|
28
|
+
param :id, :identifier, :required => true
|
29
|
+
def deploy_script
|
30
|
+
respond_to do |format|
|
31
|
+
format.text { render :text => @config.virt_who_bash_script }
|
32
|
+
format.sh { render :text => @config.virt_who_bash_script }
|
33
|
+
format.json
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def_param_group :config do
|
38
|
+
param :foreman_virt_who_configure_config, Hash, :required => true, :action_aware => true do
|
39
|
+
param :name, String, :desc => N_("Configuration name"), :required => true
|
40
|
+
param :interval, Config::AVAILABLE_INTERVALS.keys.map(&:to_i), :desc => N_("Configuration interval in minutes"), :required => true
|
41
|
+
param :filtering_mode, Config::FILTERING_MODES.keys.map(&:to_i), :desc => N_("Hypervisor filtering mode, %{unlimited} means no filtering, %{whitelist} means whitelist, %{blacklist} means blacklist") % { :unlimited => Config::UNLIMITED, :whitelist => Config::WHITELIST, :blacklist => Config::BLACKLIST }, :required => true
|
42
|
+
param :whitelist, String, :desc => N_("Hypervisor whitelist, applicable only when filtering mode is set to 1. Wildcards and regular expressions are supported, multiple records must be separated by comma."), :required => false
|
43
|
+
param :blacklist, String, :desc => N_("Hypervisor blacklist, applicable only when filtering mode is set to 2. Wildcards and regular expressions are supported, multiple records must be separated by comma."), :required => false
|
44
|
+
param :hypervisor_id, Config::HYPERVISOR_IDS, :desc => N_("Specifies how the hypervisor will be identified."), :required => true
|
45
|
+
param :hypervisor_type, Config::HYPERVISOR_TYPES.keys, :desc => N_("Hypervisor type"), :required => true
|
46
|
+
param :hypervisor_server, String, :desc => N_("Fully qualified host name or IP address of the hypervisor"), :required => true
|
47
|
+
param :hypervisor_username, String, :desc => N_("Account name by which virt-who is to connect to the hypervisor."), :required => true
|
48
|
+
param :hypervisor_password, String, :desc => N_("Hypervisor password, required for all hypervisor types except for libvirt"), :required => false
|
49
|
+
param :satellite_url, String, :desc => N_("Satellite server FQDN"), :required => true
|
50
|
+
param :debug, :bool, :desc => N_("Enable debugging output")
|
51
|
+
param :proxy, String, :desc => N_('HTTP proxy that should be used for communication between the server on which virt-who is running and the hypervisors and virtualization managers.'), :required => false
|
52
|
+
param :no_proxy, String, :desc => N_("Ignore proxy. A comma-separated list of hostnames or domains or ip addresses to ignore proxy settings for. Optionally this may be set to * to bypass proxy settings for all hostnames domains or ip addresses.")
|
53
|
+
param :organization_id, Integer, :required => true, :desc => N_("Organization of the virt-who configuration") if ::SETTINGS[:organizations_enabled]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
api :POST, '/configs', N_("Create a virt-who configuration")
|
58
|
+
param_group :config, :as => :create
|
59
|
+
|
60
|
+
def create
|
61
|
+
@config = Config.new(config_params)
|
62
|
+
process_response @config.save
|
63
|
+
end
|
64
|
+
|
65
|
+
api :PUT, '/configs/:id', N_("Update a virt-who configuration")
|
66
|
+
param :id, :number, :desc => N_("Configuration numeric identifier"), :required => true
|
67
|
+
param_group :config
|
68
|
+
|
69
|
+
def update
|
70
|
+
process_response @config.update_attributes(config_params)
|
71
|
+
end
|
72
|
+
|
73
|
+
api :DELETE, '/configs/:id', N_("Delete a virt-who configuration")
|
74
|
+
param :id, :number, :desc => N_("Configuration numeric identifier"), :required => true
|
75
|
+
|
76
|
+
def destroy
|
77
|
+
process_response @config.destroy
|
78
|
+
end
|
79
|
+
|
80
|
+
def apply_organization_filter(scope)
|
81
|
+
scope.for_organization(Organization.current)
|
82
|
+
end
|
83
|
+
|
84
|
+
def resource_scope(*args)
|
85
|
+
apply_organization_filter(super)
|
86
|
+
end
|
87
|
+
|
88
|
+
def resource_class
|
89
|
+
ForemanVirtWhoConfigure::Config
|
90
|
+
end
|
91
|
+
|
92
|
+
protected
|
93
|
+
|
94
|
+
def action_permission
|
95
|
+
case params[:action]
|
96
|
+
when 'deploy_script'
|
97
|
+
'view'
|
98
|
+
else
|
99
|
+
super
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
# compatibility layer for 1.11 - pre strong params patch
|
106
|
+
def config_params
|
107
|
+
if defined?(super)
|
108
|
+
super
|
109
|
+
else
|
110
|
+
params[:foreman_virt_who_configure_config]
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def allowed_nested_id
|
115
|
+
%w(organization_id)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -2,7 +2,7 @@ module ForemanVirtWhoConfigure
|
|
2
2
|
class ConfigsController < ::ForemanVirtWhoConfigure::ApplicationController
|
3
3
|
include Foreman::Controller::AutoCompleteSearch
|
4
4
|
include ForemanVirtWhoConfigure::Concerns::ConfigParameters if Foreman::Version.new.short >= '1.13'
|
5
|
-
before_action :find_resource, :only => [:edit, :update, :destroy, :show]
|
5
|
+
before_action :find_resource, :only => [:edit, :update, :destroy, :show, :deploy_script]
|
6
6
|
|
7
7
|
# in 1.11 we can't use welcome from application controller since it does not work with namespaces
|
8
8
|
def welcome
|
@@ -30,7 +30,7 @@ module ForemanVirtWhoConfigure
|
|
30
30
|
end
|
31
31
|
@config.hypervisor_type ||= Config::HYPERVISOR_DEFAULT_TYPE
|
32
32
|
@config.organization ||= Organization.current
|
33
|
-
@config.satellite_url ||= URI.parse(Setting
|
33
|
+
@config.satellite_url ||= URI.parse(Setting[:foreman_url]).host
|
34
34
|
end
|
35
35
|
|
36
36
|
def create
|
@@ -64,6 +64,10 @@ module ForemanVirtWhoConfigure
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
+
def deploy_script
|
68
|
+
send_data @config.virt_who_bash_script, :filename => "deploy_virt_who_config_#{@config.id}.sh", :type => 'text/x-shellscript', :disposition => :attachment
|
69
|
+
end
|
70
|
+
|
67
71
|
def auto_complete_controller_name
|
68
72
|
'foreman_virt_who_configure_configs'
|
69
73
|
end
|
@@ -90,5 +94,16 @@ module ForemanVirtWhoConfigure
|
|
90
94
|
def resource_scope(*args)
|
91
95
|
apply_organization_filter(super)
|
92
96
|
end
|
97
|
+
|
98
|
+
# equivalent to which was added after 1.11
|
99
|
+
# define_action_permission ['deploy_script'], :view
|
100
|
+
def action_permission
|
101
|
+
case params[:action]
|
102
|
+
when 'deploy_script'
|
103
|
+
:view
|
104
|
+
else
|
105
|
+
super
|
106
|
+
end
|
107
|
+
end
|
93
108
|
end
|
94
109
|
end
|
@@ -18,5 +18,14 @@ module ForemanVirtWhoConfigure
|
|
18
18
|
help_path
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
def inline_help_popover(message)
|
23
|
+
version = Foreman::Version.new
|
24
|
+
if version.major.to_i >= 1 && version.minor.to_i >= 15
|
25
|
+
{ :label_help => message.html_safe }
|
26
|
+
else
|
27
|
+
{ :help_inline => popover('', message).html_safe }
|
28
|
+
end
|
29
|
+
end
|
21
30
|
end
|
22
31
|
end
|
@@ -18,7 +18,7 @@ module ForemanVirtWhoConfigure
|
|
18
18
|
# 'vdsm' => '',
|
19
19
|
'hyperv' => _('Account name by which virt-who is to connect to the hypervisor. By default this is <code>Administrator</code>. To use an alternate account, create a user account and assign that account to the following groups (Windows 2012 Server): Hyper-V Administrators and Remote Management Users.'),
|
20
20
|
'xen' => _('Account name by which virt-who is to connect to the hypervisor.'),
|
21
|
-
'libvirt' => _('Account name by which virt-who is to connect to the hypervisor.')
|
21
|
+
'libvirt' => _('Account name by which virt-who is to connect to the hypervisor. Virt-who does not support password based authentication, you must manually setup SSH key, see <a href="https://access.redhat.com/solutions/1515983">Red Hat Knowledgebase solution How to configure virt-who for a KVM host</a> for more information.')
|
22
22
|
}
|
23
23
|
end
|
24
24
|
|
@@ -26,9 +26,7 @@ module ForemanVirtWhoConfigure
|
|
26
26
|
message = case config.status
|
27
27
|
when :unknown
|
28
28
|
_('No Report Yet')
|
29
|
-
when :ok
|
30
|
-
l(config.last_report_at, :format => :long)
|
31
|
-
when :error
|
29
|
+
when :ok, :out_of_date
|
32
30
|
l(config.last_report_at, :format => :long)
|
33
31
|
else
|
34
32
|
_('Unknown configuration status')
|
@@ -43,10 +41,8 @@ module ForemanVirtWhoConfigure
|
|
43
41
|
|
44
42
|
def report_status_class(status)
|
45
43
|
icon_class = case status
|
46
|
-
when :ok
|
44
|
+
when :ok, :out_of_date
|
47
45
|
'pficon-ok'
|
48
|
-
when :error
|
49
|
-
'pficon-error-circle-o'
|
50
46
|
when :unknown
|
51
47
|
'pficon-info'
|
52
48
|
else
|
@@ -58,12 +54,10 @@ module ForemanVirtWhoConfigure
|
|
58
54
|
|
59
55
|
def status_class(status)
|
60
56
|
case status
|
61
|
-
when :ok
|
57
|
+
when :ok, :out_of_date
|
62
58
|
'status-ok'.html_safe
|
63
59
|
when :unknown
|
64
60
|
'status-info'.html_safe
|
65
|
-
when :error
|
66
|
-
'status-error'.html_safe
|
67
61
|
else
|
68
62
|
'status-warn'.html_safe
|
69
63
|
end
|
@@ -6,8 +6,17 @@ module ForemanVirtWhoConfigure
|
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
|
+
def auth_method_name
|
10
|
+
"HIDDEN with API access"
|
11
|
+
end
|
12
|
+
alias_method :to_label, :auth_method_name
|
13
|
+
|
9
14
|
def authenticate(login, password)
|
10
|
-
|
15
|
+
# the authentication should only happen if our SSO signals that it's available
|
16
|
+
# we need to reset the signal since for non API calls the SSO is not used at all and does not set signal to false
|
17
|
+
result = Thread.current[:service_user_login] ? AuthSourceInternal.new.authenticate(login, password) : false
|
18
|
+
Thread.current[:service_user_login] = nil
|
19
|
+
result
|
11
20
|
end
|
12
21
|
end
|
13
22
|
end
|
@@ -6,22 +6,22 @@ module ForemanVirtWhoConfigure
|
|
6
6
|
:satellite_url, :proxy, :no_proxy, :name
|
7
7
|
]
|
8
8
|
include Authorizable
|
9
|
-
audited
|
9
|
+
audited :except => [ :hypervisor_password, :last_report_at, :out_of_date_at ]
|
10
10
|
validates_lengths_from_database
|
11
11
|
|
12
12
|
UNLIMITED = 0
|
13
13
|
WHITELIST = 1
|
14
14
|
BLACKLIST = 2
|
15
15
|
FILTERING_MODES = {
|
16
|
-
UNLIMITED.to_s =>
|
17
|
-
WHITELIST.to_s =>
|
18
|
-
BLACKLIST.to_s =>
|
16
|
+
UNLIMITED.to_s => N_('Unlimited'),
|
17
|
+
WHITELIST.to_s => N_('Whitelist'),
|
18
|
+
BLACKLIST.to_s => N_('Blacklist'),
|
19
19
|
}
|
20
20
|
|
21
21
|
WIZARD_STEPS = {
|
22
|
-
'general_information' =>
|
23
|
-
'schedule' =>
|
24
|
-
'connection' =>
|
22
|
+
'general_information' => N_('General information'),
|
23
|
+
'schedule' => N_('Schedule'),
|
24
|
+
'connection' => N_('Connection')
|
25
25
|
}
|
26
26
|
|
27
27
|
HYPERVISOR_IDS = [ 'hostname', 'uuid', 'hwuuid' ]
|
@@ -38,18 +38,18 @@ module ForemanVirtWhoConfigure
|
|
38
38
|
HYPERVISOR_DEFAULT_TYPE = 'esx'
|
39
39
|
|
40
40
|
AVAILABLE_INTERVALS = {
|
41
|
-
'60' =>
|
42
|
-
'120' =>
|
43
|
-
'240' =>
|
44
|
-
'480' =>
|
45
|
-
'720' =>
|
41
|
+
'60' => N_('Every hour'),
|
42
|
+
'120' => N_('Every 2 hours'),
|
43
|
+
'240' => N_('Every 4 hours'),
|
44
|
+
'480' => N_('Every 8 hours'),
|
45
|
+
'720' => N_('Every 12 hours'),
|
46
46
|
}
|
47
47
|
|
48
48
|
DEFAULT_INTERVAL = 120
|
49
49
|
|
50
50
|
STATUSES = {
|
51
51
|
'ok' => N_('OK'),
|
52
|
-
'
|
52
|
+
'out_of_date' => N_('No change'),
|
53
53
|
'unknown' => N_('Unknown')
|
54
54
|
}
|
55
55
|
|
@@ -57,7 +57,7 @@ module ForemanVirtWhoConfigure
|
|
57
57
|
{
|
58
58
|
:unknown => N_('The configuration was not deployed yet or the virt-who was unable to report the status'),
|
59
59
|
:ok => N_('The virt-who report arrived within the interval'),
|
60
|
-
:
|
60
|
+
:out_of_date => N_('The virt-who report has not arrived within the interval, which indicates there was no change on hypervisor')
|
61
61
|
}
|
62
62
|
)
|
63
63
|
|
@@ -77,16 +77,6 @@ module ForemanVirtWhoConfigure
|
|
77
77
|
scoped_search :on => :last_report_at, :complete_value => true, :only_explicit => true
|
78
78
|
# TODO add more related objects and attributes
|
79
79
|
|
80
|
-
# Foreman 1.11 specifics, can be removed later, otherwise when string does not start with "encrypts" prefix
|
81
|
-
# we get 500 when we try to create log message that relies on name method
|
82
|
-
def name
|
83
|
-
title
|
84
|
-
end
|
85
|
-
|
86
|
-
def title
|
87
|
-
compute_resource ? compute_resource.name : hypervisor_server
|
88
|
-
end
|
89
|
-
|
90
80
|
# compatibility layer for 1.11 - pre strong params patch
|
91
81
|
if self.respond_to?(:attr_accessible)
|
92
82
|
attr_accessible(*PERMITTED_PARAMS)
|
@@ -117,7 +107,7 @@ module ForemanVirtWhoConfigure
|
|
117
107
|
sanitize_sql_for_conditions([' out_of_date_at >= ? ', DateTime.now.utc.to_s(:db)])
|
118
108
|
when 'unknown'
|
119
109
|
sanitize_sql_for_conditions({:last_report_at => nil})
|
120
|
-
when '
|
110
|
+
when 'out_of_date'
|
121
111
|
sanitize_sql_for_conditions([' out_of_date_at < ? ', DateTime.now.utc.to_s(:db)])
|
122
112
|
end
|
123
113
|
{ :conditions => condition }
|
@@ -169,17 +159,21 @@ module ForemanVirtWhoConfigure
|
|
169
159
|
end
|
170
160
|
|
171
161
|
def step_name(step_key)
|
172
|
-
WIZARD_STEPS[step_key]
|
162
|
+
_(WIZARD_STEPS[step_key])
|
173
163
|
end
|
174
164
|
|
175
165
|
def steps
|
176
166
|
WIZARD_STEPS.keys
|
177
167
|
end
|
178
168
|
|
179
|
-
def
|
169
|
+
def virt_who_bash_script
|
170
|
+
virt_who_config_script(:bash_script)
|
171
|
+
end
|
172
|
+
|
173
|
+
def virt_who_config_script(format = nil)
|
180
174
|
generator = OutputGenerator.new(self)
|
181
175
|
if generator.ready_for_virt_who_output?
|
182
|
-
generator.virt_who_output
|
176
|
+
generator.virt_who_output(format)
|
183
177
|
else
|
184
178
|
generator.missing_virt_who_input_messages.join("\n")
|
185
179
|
end
|
@@ -198,7 +192,8 @@ module ForemanVirtWhoConfigure
|
|
198
192
|
when !self.out_of_date?
|
199
193
|
:ok
|
200
194
|
else
|
201
|
-
|
195
|
+
# out of date is currently considered ok too, virt-who does not send any report if there's no change on hypervisor
|
196
|
+
:out_of_date
|
202
197
|
end
|
203
198
|
end
|
204
199
|
|
@@ -1,11 +1,35 @@
|
|
1
1
|
module ForemanVirtWhoConfigure
|
2
2
|
class OutputGenerator
|
3
|
+
class ConfigurationResult
|
4
|
+
attr_reader :code, :identifier, :message
|
5
|
+
def initialize(code, identifier, message)
|
6
|
+
@code, @message, @identifier = code, message, identifier
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
MINIMUM_VIRT_WHO_VERSION = '0.19'
|
11
|
+
|
12
|
+
CONFIGURATION_RESULTS = [
|
13
|
+
ConfigurationResult.new(0, 'success', N_('Success')),
|
14
|
+
ConfigurationResult.new(1, 'virt_who_too_old', N_('Newer version of virt-who is required, minimum version is %s') % MINIMUM_VIRT_WHO_VERSION),
|
15
|
+
ConfigurationResult.new(2, 'virt_who_config_file_issue', N_('Unable to create virt-who config file')),
|
16
|
+
ConfigurationResult.new(4, 'virt_who_sysconfig_file_issue', N_('Unable to create sysconfig file')),
|
17
|
+
ConfigurationResult.new(8, 'virt_who_chkconfig_issue', N_('Unable to enable virt-who service using chkconfig')),
|
18
|
+
ConfigurationResult.new(16, 'virt_who_service_issue', N_('Unable to start virt-who service, please see virt-who logs for more details')),
|
19
|
+
ConfigurationResult.new(32, 'virt_who_installation', N_('Unable to install virt-who package, make sure the host is properly subscribed and has access to satellite-tools repository')),
|
20
|
+
]
|
21
|
+
|
3
22
|
attr_reader :config
|
4
23
|
|
5
24
|
def initialize(config)
|
6
25
|
@config = config
|
7
26
|
end
|
8
27
|
|
28
|
+
def error_code(error_name)
|
29
|
+
result = CONFIGURATION_RESULTS.find { |result| result.identifier == error_name.to_s }
|
30
|
+
result.try(:code)
|
31
|
+
end
|
32
|
+
|
9
33
|
def ready_for_virt_who_output?
|
10
34
|
missing_virt_who_input_messages.empty?
|
11
35
|
end
|
@@ -19,16 +43,50 @@ module ForemanVirtWhoConfigure
|
|
19
43
|
messages
|
20
44
|
end
|
21
45
|
|
22
|
-
def virt_who_output
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
46
|
+
def virt_who_output(format = nil)
|
47
|
+
result = ''
|
48
|
+
result += "#!/usr/bin/bash\n" if format == :bash_script
|
49
|
+
result += <<EOS
|
50
|
+
heading() {
|
51
|
+
echo -e "\\n== $1 =="
|
52
|
+
}
|
53
|
+
|
54
|
+
step() {
|
55
|
+
step_count=5
|
56
|
+
heading "[$1/$step_count] $2"
|
57
|
+
}
|
58
|
+
|
59
|
+
version_lte() {
|
60
|
+
[ "$1" = "`echo -e "$1\\n$2" | sort -V | head -n1`" ]
|
61
|
+
}
|
62
|
+
|
63
|
+
version_lt() {
|
64
|
+
[ "$1" = "$2" ] && return 1 || version_lte $1 $2
|
65
|
+
}
|
66
|
+
|
67
|
+
verify_minimal_version() {
|
68
|
+
minimal_version=#{MINIMUM_VIRT_WHO_VERSION}
|
69
|
+
installed_version=`rpm -q --queryformat '%{VERSION}' virt-who`
|
70
|
+
|
71
|
+
if version_lt $installed_version $minimal_version; then
|
72
|
+
echo "virt-who $installed_version does not meet minimum requirements, please make sure this host is properly subscribed and has access to satellite-tools repository, minimal virt-who version is $minimal_version"
|
73
|
+
return 1
|
74
|
+
else
|
75
|
+
return 0
|
76
|
+
fi
|
77
|
+
}
|
78
|
+
|
79
|
+
result_code=#{error_code(:success)}
|
80
|
+
step 1 "Installing virt-who"
|
81
|
+
yum install -y virt-who || result_code=$(($result_code|#{error_code(:virt_who_installation)}))
|
82
|
+
|
83
|
+
if verify_minimal_version; then
|
84
|
+
step 2 "Encrypting password"
|
85
|
+
cr_password=`virt-who-password --password "#{cr_password}" 2> /dev/null`
|
86
|
+
user_password=`virt-who-password --password "#{service_user_password}" 2> /dev/null`
|
87
|
+
|
88
|
+
step 3 "Creating virt-who configuration"
|
89
|
+
cat > #{config_file_path} << EOF
|
32
90
|
[#{identifier}]
|
33
91
|
type=#{type}
|
34
92
|
hypervisor_id=#{hypervisor_id}
|
@@ -42,20 +100,40 @@ rhsm_username=#{service_user_username}
|
|
42
100
|
rhsm_encrypted_password=$user_password
|
43
101
|
rhsm_prefix=/rhsm
|
44
102
|
EOF
|
103
|
+
if [ $? -ne 0 ]; then result_code=$(($result_code|#{error_code(:virt_who_config_file_issue)})); fi
|
45
104
|
|
46
|
-
|
47
|
-
cat >
|
105
|
+
step 4 "Creating sysconfig virt-who configuration"
|
106
|
+
cat > #{sysconfig_file_path} << EOF
|
48
107
|
VIRTWHO_SATELLITE6=1
|
49
108
|
VIRTWHO_DEBUG=#{config.debug? ? 1 : 0}
|
50
109
|
VIRTWHO_INTERVAL=#{config.interval * 60}#{proxy_strings}
|
51
110
|
EOF
|
111
|
+
if [ $? -ne 0 ]; then result_code=$(($result_code|#{error_code(:virt_who_sysconfig_file_issue)})); fi
|
112
|
+
|
113
|
+
step 5 "Enabling and restarting the virt-who service"
|
114
|
+
chkconfig virt-who on || result_code=$(($result_code|#{error_code(:virt_who_chkconfig_issue)}))
|
115
|
+
service virt-who restart || result_code=$(($result_code|#{error_code(:virt_who_service_issue)}))
|
116
|
+
else
|
117
|
+
result_code=$(($result_code|#{error_code(:virt_who_too_old)}))
|
118
|
+
fi
|
119
|
+
|
120
|
+
heading "Finished"
|
121
|
+
if [ $result_code -ne 0 ]; then
|
122
|
+
echo "There were some errors during configuration:"
|
123
|
+
#{error_handling}
|
124
|
+
else
|
125
|
+
echo "Finished successully"
|
126
|
+
fi
|
52
127
|
|
53
|
-
echo "Enabling and restarting the virt-who service"
|
54
|
-
chkconfig virt-who on
|
55
|
-
service virt-who restart
|
56
|
-
|
57
|
-
echo "Done."
|
58
128
|
EOS
|
129
|
+
result += "exit $result_code\n" if format == :bash_script
|
130
|
+
result
|
131
|
+
end
|
132
|
+
|
133
|
+
def error_handling
|
134
|
+
CONFIGURATION_RESULTS.map do |result|
|
135
|
+
"[ $(($result_code&#{result.code})) -ge 1 ] && echo '#{result.message}'"
|
136
|
+
end.join("\n ")
|
59
137
|
end
|
60
138
|
|
61
139
|
def filtering
|
@@ -81,6 +159,10 @@ EOS
|
|
81
159
|
"/etc/virt-who.d/#{identifier}.conf"
|
82
160
|
end
|
83
161
|
|
162
|
+
def sysconfig_file_path
|
163
|
+
'/etc/sysconfig/virt-who'
|
164
|
+
end
|
165
|
+
|
84
166
|
def identifier
|
85
167
|
"virt-who-config-#{config.id}"
|
86
168
|
end
|