diff --git a/config/application.rb b/config/application.rb index b3a084e..116b8cd 100644 --- a/config/application.rb +++ b/config/application.rb @@ -20,6 +20,18 @@ class Application < Rails::Application config.action_mailer.default_options = { from: 'fake@berkeley.edu' } config.lit_gtag_id = ENV.fetch('LIT_GTAG_ID', nil) + config.x.servers ||= {} + + # These will be removed before merging code + config.x.servers[:geoserver] = ENV.fetch('GEOSERVER_URL', 'https://geoserver-public.ucblib.org/geoserver') + config.x.servers[:secure_geoserver] = ENV.fetch('GEOSERVER_URL', 'https://geoserver-secure.ucblib.org/geoserver') + config.x.servers[:spatial_server] = ENV.fetch('SPATIAL_URL', 'https://spatial.ucblib.org') + + # These comments will be removed before merging code + # config.x.servers[:geoserver] = ENV.fetch('GEOSERVER_URL', nil) + # config.x.servers[:secure_geoserver] = ENV.fetch('GEOSERVER_URL', nil) + # config.x.servers[:spatial_server] = ENV.fetch('SPATIAL_URL', nil) + # The Base URL for the generated sitemap config.x.sitemap.base_url = ENV.fetch('GEODATA_BASE_URL', 'http://localhost:3000') # Silenced by default to minimize log noise diff --git a/config/initializers/okcomputer.rb b/config/initializers/okcomputer.rb index 2a41f10..12c3d77 100644 --- a/config/initializers/okcomputer.rb +++ b/config/initializers/okcomputer.rb @@ -1,6 +1,9 @@ # initializers/okcomputer.rb # Health checks configuration +require_relative '../../lib/http_head_check' +require_relative '../../lib/endpoint_url' + OkComputer.logger = Rails.logger OkComputer.check_in_parallel = true @@ -11,3 +14,15 @@ # Requires the ping handler on the solr core (/admin/ping). core_baseurl = Blacklight.default_index.connection.uri.to_s.chomp('/') OkComputer::Registry.register 'solr', OkComputer::SolrCheck.new(core_baseurl) + +# Perform a Head request to check geoserver endpoint +geoserver_url = EndpointUrl.geoserver(:geoserver) +OkComputer::Registry.register 'geoserver', GeoDataHealthCheck::HttpHeadCheck.new(geoserver_url) + +# Perform a Head request to check secure_geoserver endpoint +secure_geoserver_url = EndpointUrl.geoserver(:secure_geoserver) +OkComputer::Registry.register 'secure_geoserver', GeoDataHealthCheck::HttpHeadCheck.new(secure_geoserver_url) + +# Perform a Head request to check spatial server endpoint +spatial_server_url = EndpointUrl.spatial_server(:spatial_server) +OkComputer::Registry.register 'spatial_server', GeoDataHealthCheck::HttpHeadCheck.new(spatial_server_url) diff --git a/lib/endpoint_url.rb b/lib/endpoint_url.rb new file mode 100644 index 0000000..e3771a7 --- /dev/null +++ b/lib/endpoint_url.rb @@ -0,0 +1,13 @@ +class EndpointUrl + class << self + def geoserver(server_name) + url = Rails.configuration.x.servers[server_name] + url && "#{url.chomp('/')}/wms?service=WMS&request=GetCapabilities" + end + + def spatial_server(server_name) + url = Rails.configuration.x.servers[server_name] + url && "#{url.chomp('/')}/public/berkeley-status/data.zip" + end + end +end diff --git a/lib/http_head_check.rb b/lib/http_head_check.rb new file mode 100644 index 0000000..0f0995a --- /dev/null +++ b/lib/http_head_check.rb @@ -0,0 +1,43 @@ +module GeoDataHealthCheck + class HttpHeadCheck < OkComputer::HttpCheck + + def check + response = perform_request + + if response.is_a?(Net::HTTPOK) || response.is_a?(Net::HTTPRedirection) + mark_message 'Http head check successful.' + else + mark_failure + mark_message "Error: '#{url.request_uri}' http head check responded, but returned unexpeced HTTP status: #{response.code} #{response.class}. Expected 200 Net::HTTPOK." + end + rescue StandardError => e + mark_message "Error: '#{e}'" + mark_failure + end + + def perform_request + head_request + rescue Net::OpenTimeout, Net::ReadTimeout => e + msg = "#{url.request_uri} did not respond within #{request_timeout} seconds: " + raise ConnectionFailed, msg + e.message + rescue StandardError => e + raise ConnectionFailed, e.message + end + + private + + def head_request + Net::HTTP.start( + url.host, + url.port, + use_ssl: url.scheme == 'https', + verify_mode: OpenSSL::SSL::VERIFY_PEER, + open_timeout: request_timeout, + read_timeout: request_timeout + ) do |http| + http.head(url.request_uri) + end + end + + end +end diff --git a/spec/requests/okcomputer_spec.rb b/spec/requests/okcomputer_spec.rb index a04d1c8..0f98aa5 100644 --- a/spec/requests/okcomputer_spec.rb +++ b/spec/requests/okcomputer_spec.rb @@ -14,6 +14,9 @@ database database-migrations solr + geoserver + secure_geoserver + spatial_server ] end end