Commit bc506785 authored by Sean McGivern's avatar Sean McGivern

Merge branch 'migrate-geo-checks-to-systemcheck' into 'master'

Geo: Migrated checks to SystemChecks

See merge request !2331
parents 3a5467f3 90e5a4d3
module SystemCheck
module Geo
class EnabledCheck < SystemCheck::BaseCheck
set_name 'GitLab Geo is enabled'
def check?
Gitlab::Geo.enabled?
end
def show_error
try_fixing_it(
'Follow Geo setup instructions to configure primary and secondary nodes'
)
for_more_information('doc/gitlab-geo/README.md')
end
end
end
end
module SystemCheck
module Geo
class HttpConnectionCheck < SystemCheck::BaseCheck
set_name 'GitLab Geo HTTP(S) connectivity'
set_skip_reason 'Geo is not enabled'
def skip?
!Gitlab::Geo.enabled?
end
def multi_check
$stdout.puts
if Gitlab::Geo.primary?
Gitlab::Geo.secondary_nodes.each do |node|
$stdout.print "* Can connect to secondary node: '#{node.url}' ... "
check_gitlab_geo_node(node)
end
end
if Gitlab::Geo.secondary?
$stdout.print '* Can connect to the primary node ... '
check_gitlab_geo_node(Gitlab::Geo.primary_node)
end
end
private
def check_gitlab_geo_node(node)
response = Net::HTTP.start(node.uri.host, node.uri.port, use_ssl: (node.uri.scheme == 'https')) do |http|
http.request(Net::HTTP::Get.new(node.uri))
end
if response.code_type == Net::HTTPFound
$stdout.puts 'yes'.color(:green)
else
$stdout.puts 'no'.color(:red)
end
rescue Errno::ECONNREFUSED => e
display_exception(e)
try_fixing_it(
'Check if the machine is online and GitLab is running',
'Check your firewall rules and make sure this machine can reach the target machine',
"Make sure port and protocol are correct: '#{node.url}', or change it in Admin > Geo Nodes"
)
rescue SocketError => e
display_exception(e)
if e.cause && e.cause.message.starts_with?('getaddrinfo')
try_fixing_it(
'Check if your machine can connect to a DNS server',
"Check if your machine can resolve DNS for: '#{node.uri.host}'",
'If machine host is incorrect, change it in Admin > Geo Nodes'
)
end
rescue OpenSSL::SSL::SSLError => e
display_exception(e)
try_fixing_it(
'If you have a self-signed CA or certificate you need to whitelist it in Omnibus'
)
for_more_information(see_custom_certificate_doc)
try_fixing_it(
'If you have a valid certificate make sure you have the full certificate chain in the pem file'
)
rescue StandardError => e
display_exception(e)
end
def display_exception(exception)
$stdout.puts 'no'.color(:red)
$stdout.puts ' Reason:'.color(:blue)
$stdout.puts " #{exception.message}"
end
end
end
end
module SystemCheck
module Geo
class LicenseCheck < SystemCheck::BaseCheck
set_name 'GitLab Geo is available'
def check?
Gitlab::Geo.license_allows?
end
def show_error
try_fixing_it(
'Upload a new license that includes the GitLab Geo feature'
)
for_more_information('https://about.gitlab.com/features/gitlab-geo/')
end
end
end
end
......@@ -545,76 +545,20 @@ namespace :gitlab do
desc 'GitLab | Check Geo configuration and dependencies'
task check: :environment do
warn_user_is_not_gitlab
start_checking 'Geo'
check_geo_license
check_geo_enabled
check_nodes_http_connection
finished_checking 'Geo'
end
# Checks
########################
def check_geo_license
print 'GitLab Geo is available ... '
if Gitlab::Geo.license_allows?
puts 'yes'.color(:green)
else
puts 'no'.color(:red)
try_fixing_it(
'Upload a new license that includes GitLab Geo feature'
)
for_more_information(see_geo_features_page)
end
end
def check_geo_enabled
print 'GitLab Geo is enabled ... '
if Gitlab::Geo.enabled?
puts 'yes'.color(:green)
else
puts 'no'.color(:red)
try_fixing_it(
'Follow Geo Setup instructions to configure primary and secondary nodes'
)
for_more_information(see_geo_docs)
end
end
def check_nodes_http_connection
return unless Gitlab::Geo.enabled?
if Gitlab::Geo.primary?
Gitlab::Geo.secondary_nodes.each do |node|
print "Can connect to secondary node: '#{node.url}' ... "
check_gitlab_geo_node(node)
end
end
checks = [
SystemCheck::Geo::LicenseCheck,
SystemCheck::Geo::EnabledCheck,
SystemCheck::Geo::HttpConnectionCheck
]
if Gitlab::Geo.secondary?
print 'Can connect to the primary node ... '
check_gitlab_geo_node(Gitlab::Geo.primary_node)
end
SystemCheck.run('Geo', checks)
end
end
# Helper methods
##########################
def see_geo_features_page
'https://about.gitlab.com/features/gitlab-geo/'
end
def see_geo_docs
'doc/gitlab-geo/README.md'
end
def see_custom_certificate_doc
'https://docs.gitlab.com/omnibus/common_installation_problems/README.html#using-self-signed-certificate-or-custom-certificate-authorities'
end
......@@ -661,55 +605,4 @@ namespace :gitlab do
puts "No ref lock files exist".color(:green)
end
end
def check_gitlab_geo_node(node)
display_error = proc do |e|
puts 'no'.color(:red)
puts ' Reason:'.color(:blue)
puts " #{e.message}"
end
begin
response = Net::HTTP.start(node.uri.host, node.uri.port, use_ssl: (node.uri.scheme == 'https')) do |http|
http.request(Net::HTTP::Get.new(node.uri))
end
if response.code_type == Net::HTTPFound
puts 'yes'.color(:green)
else
puts 'no'.color(:red)
end
rescue Errno::ECONNREFUSED => e
display_error.call(e)
try_fixing_it(
'Check if the machine is online and GitLab is running',
'Check your firewall rules and make sure this machine can reach the target machine',
"Make sure port and protocol are correct: '#{node.url}', or change it in Admin > Geo Nodes"
)
rescue SocketError => e
display_error.call(e)
if e.cause && e.cause.message.starts_with?('getaddrinfo')
try_fixing_it(
'Check if your machine can connect to a DNS server',
"Check if your machine can resolve DNS for: '#{node.uri.host}'",
'If machine host is incorrect, change it in Admin > Geo Nodes'
)
end
rescue OpenSSL::SSL::SSLError => e
display_error.call(e)
try_fixing_it(
'If you have a self-signed CA or certificate you need to whitelist it in Omnibus'
)
for_more_information(see_custom_certificate_doc)
try_fixing_it(
'If you have a valid certificate make sure you have the full certificate chain in the pem file'
)
rescue Exception => e # rubocop:disable Lint/RescueException
display_error.call(e)
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment