diff --git a/definitions/checks/qpid_queues_not_clear.rb b/definitions/checks/qpid_queues_not_clear.rb new file mode 100644 index 000000000..89351792f --- /dev/null +++ b/definitions/checks/qpid_queues_not_clear.rb @@ -0,0 +1,14 @@ +class Checks::QpidQueuesNotClear < ForemanMaintain::Check + metadata do + for_feature :qpid + description 'check for qpid queues' + tags :pre_upgrade + end + + def run + qpid_queues_count = feature(:qpid).count + assert(qpid_queues_count == 0, + "There are #{qpid_queues_count} persistent qpid queue(s) present in the system", + :next_steps => Procedures::QpidQueuesClear.new) + end +end diff --git a/definitions/features/katello_service.rb b/definitions/features/katello_service.rb new file mode 100644 index 000000000..f77d4d63e --- /dev/null +++ b/definitions/features/katello_service.rb @@ -0,0 +1,57 @@ +class Features::KatelloService < ForemanMaintain::Feature + metadata do + label :katello_service + end + + def make_stop(spinner, options = {}) + services = find_services_for_only_filter(running_services, options) + if services.empty? + spinner.update 'No any running katello service..' + yield + else + begin + filters = "--only #{services.join(',')}" + spinner.update 'Stopping katello running services..' + execute!("katello-service stop #{filters}") + yield + ensure + spinner.update 'Starting the katello services..' + execute("katello-service start #{filters}") + end + end + end + + def make_start(spinner, options = {}) + services = find_services_for_only_filter(stopped_services, options) + if services.empty? + spinner.update 'No any katello service to start.' + else + filters = "--only #{services.join(',')}" + spinner.update 'Starting the katello services..' + execute!("katello-service start #{filters}") + end + end + + private + + def find_services_for_only_filter(curr_services, options) + defaults = { :only => [], :exclude => [] } + options = defaults.merge(options) + curr_services &= options[:only] unless options[:only].empty? + curr_services - options[:exclude] + end + + def running_services + find_services_by_state(" -w 'running'") + end + + def stopped_services + find_services_by_state(" -w 'dead'") + end + + def find_services_by_state(state) + katello_service_names = execute("katello-service list|awk '{print $1}'").split(/\n/) + services_by_state = execute("systemctl --all |grep #{state}|awk '{print $1}'").split(/\n/) + (katello_service_names & services_by_state).map { |s| s.gsub('.service', '') } + end +end diff --git a/definitions/features/qpid.rb b/definitions/features/qpid.rb new file mode 100644 index 000000000..cd7edc19d --- /dev/null +++ b/definitions/features/qpid.rb @@ -0,0 +1,47 @@ +class Features::Qpid < ForemanMaintain::Feature + metadata do + label :qpid + + confine do + execute?('rpm -qa |grep qpid-tools') & File.exist?('/etc/pki/katello/qpid_client_striped.crt') + end + end + + def clear_all + queues_cleared = [] + available_qpid_queues.each do |qname| + clear(qname) + queues_cleared << qname + end + queues_cleared + rescue => e + logger.error e.message + return queues_cleared + end + + def count + available_qpid_queues.length + end + + private + + def available_qpid_queues + output = qpid_config("list queue --show-property=name \ + --show-property=autoDelete | awk '$2 ~ /False/{ print $1 }'") + output ? output.split(' ') : [] + rescue => e + logger.error e.message + logger.error e.backtrace.join('\n') + end + + def clear(queue_name) + qpid_config("del queue #{queue_name} --force") + end + + def qpid_config(sub_cmd) + cmd = 'qpid-config --ssl-certificate=/etc/pki/katello/qpid_client_striped.crt\ + -b amqps://localhost:5671 ' + cmd += sub_cmd + execute(cmd) + end +end diff --git a/definitions/procedures/qpid_queues_clear.rb b/definitions/procedures/qpid_queues_clear.rb new file mode 100644 index 000000000..72329b3ad --- /dev/null +++ b/definitions/procedures/qpid_queues_clear.rb @@ -0,0 +1,17 @@ +class Procedures::QpidQueuesClear < ForemanMaintain::Procedure + metadata do + for_feature :qpid + description 'clear qpid queues' + end + + def run + with_spinner('clear qpid queues') do |spinner| + feature(:katello_service).make_stop(spinner, :exclude => ['qpidd']) do + spinner.update 'Clearing qpid queues..' + total_queues_cleared = feature(:qpid).clear_all + spinner.update "#{total_queues_cleared.length} queues cleared.\ + These queues will be recreated using installer." + end + end + end +end diff --git a/test/definitions/checks/qpid_queues_not_clear_test.rb b/test/definitions/checks/qpid_queues_not_clear_test.rb new file mode 100644 index 000000000..2d6d79507 --- /dev/null +++ b/test/definitions/checks/qpid_queues_not_clear_test.rb @@ -0,0 +1,23 @@ +require 'test_helper' + +describe Checks::QpidQueuesNotClear do + include DefinitionsTestHelper + + subject do + Checks::QpidQueuesNotClear.new + end + + it 'runs on empty qpid queue' do + assume_feature_present(:qpid, :count => 0) + result = run_check(subject) + assert result.success? + end + + it 'fails when qpid queues are present' do + assume_feature_present(:qpid, :count => 2) + result = run_check(subject) + assert result.fail? + assert_match 'There are 2 persistent qpid queue(s) present in the system', result.output + assert_equal [Procedures::QpidQueuesClear], subject.next_steps.map(&:class) + end +end