From: Tom Clegg Date: Thu, 15 Apr 2021 18:55:44 +0000 (-0400) Subject: 17528: Don't load config when doing assets:precompile in postinst. X-Git-Tag: 2.2.0~63^2~3 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/03aade6dd988f91b1037f39754438846c4844cfb 17528: Don't load config when doing assets:precompile in postinst. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- diff --git a/apps/workbench/config/application.rb b/apps/workbench/config/application.rb index 42bf4da24b..2880af2d6d 100644 --- a/apps/workbench/config/application.rb +++ b/apps/workbench/config/application.rb @@ -27,6 +27,8 @@ end module ArvadosWorkbench class Application < Rails::Application + # The following is to avoid SafeYAML's warning message + SafeYAML::OPTIONS[:default_mode] = :safe require_relative "arvados_config.rb" diff --git a/apps/workbench/config/arvados_config.rb b/apps/workbench/config/arvados_config.rb index 007e8d0687..fb99b3117a 100644 --- a/apps/workbench/config/arvados_config.rb +++ b/apps/workbench/config/arvados_config.rb @@ -31,19 +31,25 @@ clusterID, clusterConfig = confs["Clusters"].first $arvados_config_defaults = clusterConfig $arvados_config_defaults["ClusterID"] = clusterID -# Load the global config file -Open3.popen2("arvados-server", "config-dump", "-skip-legacy") do |stdin, stdout, status_thread| - confs = YAML.load(stdout, deserialize_symbols: false) - if confs && !confs.empty? - # config-dump merges defaults with user configuration, so every - # key should be set. - clusterID, clusterConfig = confs["Clusters"].first - $arvados_config_global = clusterConfig - $arvados_config_global["ClusterID"] = clusterID - else - # config-dump failed, assume we will be loading from legacy - # application.yml, initialize with defaults. - $arvados_config_global = $arvados_config_defaults.deep_dup +if ENV["ARVADOS_CONFIG"] == "none" + # Don't load config. This magic value is set by postinst so it can + # run "rake assets:precompile" without a real config. + $arvados_config_global = $arvados_config_defaults.deep_dup +else + # Load the global config file + Open3.popen2("arvados-server", "config-dump", "-skip-legacy") do |stdin, stdout, status_thread| + confs = YAML.load(stdout, deserialize_symbols: false) + if confs && !confs.empty? + # config-dump merges defaults with user configuration, so every + # key should be set. + clusterID, clusterConfig = confs["Clusters"].first + $arvados_config_global = clusterConfig + $arvados_config_global["ClusterID"] = clusterID + else + # config-dump failed, assume we will be loading from legacy + # application.yml, initialize with defaults. + $arvados_config_global = $arvados_config_defaults.deep_dup + end end end @@ -189,7 +195,8 @@ ArvadosWorkbench::Application.configure do ConfigLoader.copy_into_config $arvados_config, config ConfigLoader.copy_into_config $remaining_config, config secrets.secret_key_base = $arvados_config["Workbench"]["SecretKeyBase"] - ConfigValidators.validate_wb2_url_config() - ConfigValidators.validate_download_config() - + if ENV["ARVADOS_CONFIG"] != "none" + ConfigValidators.validate_wb2_url_config() + ConfigValidators.validate_download_config() + end end diff --git a/build/rails-package-scripts/README.md b/build/rails-package-scripts/README.md index 35549d9cd3..6ac2539f8e 100644 --- a/build/rails-package-scripts/README.md +++ b/build/rails-package-scripts/README.md @@ -15,4 +15,3 @@ postinst.sh lets the early parts define a few hooks to control behavior: * After it installs the core configuration files (database.yml, application.yml, and production.rb) to /etc/arvados/server, it calls setup_extra_conffiles. By default this is a noop function (in step2.sh). * Before it restarts nginx, it calls setup_before_nginx_restart. By default this is a noop function (in step2.sh). API server defines this to set up the internal git repository, if necessary. * $RAILSPKG_DATABASE_LOAD_TASK defines the Rake task to load the database. API server uses db:structure:load. Workbench doesn't set this, which causes the postinst to skip all database work. -* If $RAILSPKG_SUPPORTS_CONFIG_CHECK != 1, it won't run the config:check rake task. diff --git a/build/rails-package-scripts/postinst.sh b/build/rails-package-scripts/postinst.sh index 3eb2d2c5e0..6b069957a4 100644 --- a/build/rails-package-scripts/postinst.sh +++ b/build/rails-package-scripts/postinst.sh @@ -226,19 +226,19 @@ configure_version() { prepare_database fi - if [ 11 = "$RAILSPKG_SUPPORTS_CONFIG_CHECK$APPLICATION_READY" ]; then + # Here, "ARVADOS_CONFIG=none" tells arvados_config.rb not to try + # loading config from /etc: it might not exist on a new install, and + # assets:precompile doesn't depend on config anyway. + run_and_report "Precompiling assets" \ + ARVADOS_CONFIG=none $COMMAND_PREFIX bundle exec rake assets:precompile -q -s 2>/dev/null || true + + if [ -e /etc/arvados/config.yml ]; then + # warn about config errors (deprecated/removed keys from + # previous version, etc) run_and_report "Checking configuration for completeness" \ - $COMMAND_PREFIX bundle exec rake config:check || APPLICATION_READY=0 + $COMMAND_PREFIX bundle exec rake config:check || true fi - # precompile assets; thankfully this does not take long - if [ "$APPLICATION_READY" = "1" ]; then - run_and_report "Precompiling assets" \ - $COMMAND_PREFIX bundle exec rake assets:precompile -q -s 2>/dev/null \ - || APPLICATION_READY=0 - else - echo "Precompiling assets... skipped." - fi chown -R "$WWW_OWNER:" $RELEASE_PATH/tmp setup_before_nginx_restart diff --git a/build/rails-package-scripts/step2.sh b/build/rails-package-scripts/step2.sh index 482d27a6a0..41c9cd71e3 100644 --- a/build/rails-package-scripts/step2.sh +++ b/build/rails-package-scripts/step2.sh @@ -11,7 +11,7 @@ if [ -z "$INSTALL_PATH" ]; then PACKAGE BUILD ERROR: $0 is missing package metadata. -This package is buggy. Please mail to let +This package is buggy. Please mail to let us know the name and version number of the package you tried to install, and we'll get it fixed. @@ -23,7 +23,6 @@ RELEASE_PATH=$INSTALL_PATH/current RELEASE_CONFIG_PATH=$RELEASE_PATH/config SHARED_PATH=$INSTALL_PATH/shared -RAILSPKG_SUPPORTS_CONFIG_CHECK=${RAILSPKG_SUPPORTS_CONFIG_CHECK:-1} if ! type setup_extra_conffiles >/dev/null 2>&1; then setup_extra_conffiles() { return; } fi diff --git a/services/api/config/arvados_config.rb b/services/api/config/arvados_config.rb index 72c11649d8..eb48e271b9 100644 --- a/services/api/config/arvados_config.rb +++ b/services/api/config/arvados_config.rb @@ -56,19 +56,25 @@ clusterID, clusterConfig = confs["Clusters"].first $arvados_config_defaults = clusterConfig $arvados_config_defaults["ClusterID"] = clusterID -# Load the global config file -Open3.popen2("arvados-server", "config-dump", "-skip-legacy") do |stdin, stdout, status_thread| - confs = YAML.load(stdout, deserialize_symbols: false) - if confs && !confs.empty? - # config-dump merges defaults with user configuration, so every - # key should be set. - clusterID, clusterConfig = confs["Clusters"].first - $arvados_config_global = clusterConfig - $arvados_config_global["ClusterID"] = clusterID - else - # config-dump failed, assume we will be loading from legacy - # application.yml, initialize with defaults. - $arvados_config_global = $arvados_config_defaults.deep_dup +if ENV["ARVADOS_CONFIG"] == "none" + # Don't load config. This magic value is set by postinst so it can + # run "rake assets:precompile" without a real config. + $arvados_config_global = $arvados_config_defaults.deep_dup +else + # Load the global config file + Open3.popen2("arvados-server", "config-dump", "-skip-legacy") do |stdin, stdout, status_thread| + confs = YAML.load(stdout, deserialize_symbols: false) + if confs && !confs.empty? + # config-dump merges defaults with user configuration, so every + # key should be set. + clusterID, clusterConfig = confs["Clusters"].first + $arvados_config_global = clusterConfig + $arvados_config_global["ClusterID"] = clusterID + else + # config-dump failed, assume we will be loading from legacy + # application.yml, initialize with defaults. + $arvados_config_global = $arvados_config_defaults.deep_dup + end end end @@ -125,7 +131,7 @@ arvcfg.declare_config "Collections.DefaultTrashLifetime", ActiveSupport::Duratio arvcfg.declare_config "Collections.CollectionVersioning", Boolean, :collection_versioning arvcfg.declare_config "Collections.PreserveVersionIfIdle", ActiveSupport::Duration, :preserve_version_if_idle arvcfg.declare_config "Collections.TrashSweepInterval", ActiveSupport::Duration, :trash_sweep_interval -arvcfg.declare_config "Collections.BlobSigningKey", NonemptyString, :blob_signing_key +arvcfg.declare_config "Collections.BlobSigningKey", String, :blob_signing_key arvcfg.declare_config "Collections.BlobSigningTTL", ActiveSupport::Duration, :blob_signature_ttl arvcfg.declare_config "Collections.BlobSigning", Boolean, :permit_create_collection_with_unsigned_manifest, ->(cfg, k, v) { ConfigLoader.set_cfg cfg, "Collections.BlobSigning", !v } arvcfg.declare_config "Collections.ForwardSlashNameSubstitution", String @@ -266,6 +272,15 @@ if ::Rails.env.to_s == "test" $arvados_config["PostgreSQL"]["Connection"]["collation"] = "en_US.UTF-8" end +if ENV["ARVADOS_CONFIG"] == "none" + # We need the postgresql connection URI to be valid, even if we + # don't use it. + $arvados_config["PostgreSQL"]["Connection"]["host"] = "localhost" + $arvados_config["PostgreSQL"]["Connection"]["user"] = "x" + $arvados_config["PostgreSQL"]["Connection"]["password"] = "x" + $arvados_config["PostgreSQL"]["Connection"]["dbname"] = "x" +end + if $arvados_config["PostgreSQL"]["Connection"]["password"].empty? raise "Database password is empty, PostgreSQL section is: #{$arvados_config["PostgreSQL"]}" end diff --git a/services/api/config/initializers/legacy_jobs_api.rb b/services/api/config/initializers/legacy_jobs_api.rb index 2abe40566e..b6a2895f78 100644 --- a/services/api/config/initializers/legacy_jobs_api.rb +++ b/services/api/config/initializers/legacy_jobs_api.rb @@ -10,7 +10,7 @@ require 'enable_jobs_api' Rails.application.configure do begin - if ActiveRecord::Base.connection.tables.include?('jobs') + if ENV["ARVADOS_CONFIG"] != "none" && ActiveRecord::Base.connection.tables.include?('jobs') check_enable_legacy_jobs_api end rescue ActiveRecord::NoDatabaseError