13996: Copy config into OrderedOptions for nicer access
authorPeter Amstutz <pamstutz@veritasgenetics.com>
Wed, 10 Apr 2019 21:07:08 +0000 (17:07 -0400)
committerPeter Amstutz <pamstutz@veritasgenetics.com>
Wed, 10 Apr 2019 21:07:08 +0000 (17:07 -0400)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <pamstutz@veritasgenetics.com>

services/api/app/models/api_client_authorization.rb
services/api/app/models/collection.rb
services/api/config/arvados_config.rb
services/api/lib/config_loader.rb
services/api/test/integration/remote_user_test.rb
services/api/test/unit/container_request_test.rb

index db99c0bc17d263016e994e336cb1fda7b069f682..4aaa2ef44400fc4f707428cd002de9cdc50f7725 100644 (file)
@@ -87,8 +87,8 @@ class ApiClientAuthorization < ArvadosModel
   end
 
   def self.remote_host(uuid_prefix:)
-    Rails.configuration.RemoteClusters[uuid_prefix]["Host"] ||
-      (Rails.configuration.RemoteClusters["*"]["Proxy"] &&
+    Rails.configuration.RemoteClusters[uuid_prefix].Host ||
+      (Rails.configuration.RemoteClusters["*"].Proxy &&
        uuid_prefix+".arvadosapi.com")
   end
 
index 7f7a320074b58ed9a13c711bf29a0a1b8e9f7a29..a7d357ec6c82e154857cd1f3f8e6b47a5a021d42 100644 (file)
@@ -519,7 +519,7 @@ class Collection < ArvadosModel
       loc.strip_hints!
       coll_match = readable_by(*readers).where(portable_data_hash: loc.to_s).limit(1)
       rc = Rails.configuration.RemoteClusters.select{ |k|
-        k != "*" && k != Rails.configuration.ClusterID}
+        k != :"*" && k != Rails.configuration.ClusterID}
       if coll_match.any? or rc.length == 0
         return get_compatible_images(readers, pattern, coll_match)
       else
index 835666bddc2c43ce4490f5db5ee4ee1da9bf55e9..a9733bc7acf501b3252bdb3846759439e014f012 100644 (file)
@@ -164,8 +164,7 @@ application_config = {}
 %w(application.default application).each do |cfgfile|
   path = "#{::Rails.root.to_s}/config/#{cfgfile}.yml"
   if File.exist? path
-    yaml = ERB.new(IO.read path).result(binding)
-    confs = YAML.load(yaml, deserialize_symbols: true)
+    confs = ConfigLoader.load(path)
     # Ignore empty YAML file:
     next if confs == false
     application_config.deep_merge!(confs['common'] || {})
@@ -176,8 +175,7 @@ end
 db_config = {}
 path = "#{::Rails.root.to_s}/config/database.yml"
 if File.exist? path
-  yaml = ERB.new(IO.read path).result(binding)
-  confs = YAML.load(yaml, deserialize_symbols: true)
+  confs = ConfigLoader.load(path)
   db_config.deep_merge!(confs[::Rails.env.to_s] || {})
 end
 
@@ -220,7 +218,12 @@ end
 # For config migration, we've previously populated the PostgreSQL
 # section of the config from database.yml
 #
-ENV["DATABASE_URL"] = "postgresql://#{$arvados_config["PostgreSQL"]["Connection"]["User"]}:#{$arvados_config["PostgreSQL"]["Connection"]["Password"]}@#{dbhost}/#{$arvados_config["PostgreSQL"]["Connection"]["DBName"]}?template=#{$arvados_config["PostgreSQL"]["Connection"]["Template"]}&encoding=#{$arvados_config["PostgreSQL"]["Connection"]["client_encoding"]}&pool=#{$arvados_config["PostgreSQL"]["ConnectionPool"]}"
+ENV["DATABASE_URL"] = "postgresql://#{$arvados_config["PostgreSQL"]["Connection"]["User"]}:"+
+                      "#{$arvados_config["PostgreSQL"]["Connection"]["Password"]}@"+
+                      "#{dbhost}/#{$arvados_config["PostgreSQL"]["Connection"]["DBName"]}?"+
+                      "template=#{$arvados_config["PostgreSQL"]["Connection"]["Template"]}&"+
+                      "encoding=#{$arvados_config["PostgreSQL"]["Connection"]["client_encoding"]}&"+
+                      "pool=#{$arvados_config["PostgreSQL"]["ConnectionPool"]}"
 
 Server::Application.configure do
   ConfigLoader.copy_into_config $arvados_config, config
index 2d1ddd8b8672feb3fb8f0d7460667f9c5bf62002..5cb6e28419e1ff3b35b6e86cd68d6aac49e83e91 100644 (file)
@@ -172,8 +172,27 @@ class ConfigLoader
 
   def self.copy_into_config src, dst
     src.each do |k, v|
-      dst.send "#{k}=", Marshal.load(Marshal.dump v)
+      dst.send "#{k}=", self.to_OrderedOptions(v)
     end
   end
 
+  def self.to_OrderedOptions confs
+    if confs.is_a? Hash
+      opts = ActiveSupport::OrderedOptions.new
+      confs.each do |k,v|
+        opts[k] = self.to_OrderedOptions(v)
+      end
+      opts
+    elsif confs.is_a? Array
+      confs.map { |v| self.to_OrderedOptions v }
+    else
+      confs
+    end
+  end
+
+  def self.load path
+    yaml = ERB.new(IO.read path).result(binding)
+    YAML.load(yaml, deserialize_symbols: false)
+  end
+
 end
index 644c2b1be524b86cae82ee32c499d6e9ba76d9bd..511a02410bf0fa0f9ed90bcc7d33c3fafd32f5af 100644 (file)
@@ -63,8 +63,8 @@ class RemoteUsersTest < ActionDispatch::IntegrationTest
     ready.pop
     @remote_server = srv
     @remote_host = "127.0.0.1:#{srv.config[:Port]}"
-    Rails.configuration.RemoteClusters = Rails.configuration.RemoteClusters.merge({'zbbbb' => {"Host" => @remote_host},
-                                                                                   'zbork' => {"Host" => @remote_host}})
+    Rails.configuration.RemoteClusters = Rails.configuration.RemoteClusters.merge({zbbbb: ActiveSupport::InheritableOptions.new({Host: @remote_host}),
+                                                                                   zbork: ActiveSupport::InheritableOptions.new({Host: @remote_host})})
     Arvados::V1::SchemaController.any_instance.stubs(:root_url).returns "https://#{@remote_host}"
     @stub_status = 200
     @stub_content = {
index 6f0233306925d8cb44653c41e6b3ac6b1a69c96d..732b53dbf87c99334af74d003396668055b9d2f0 100644 (file)
@@ -535,7 +535,7 @@ class ContainerRequestTest < ActiveSupport::TestCase
 
   test "allow unrecognized container when there are remote_hosts" do
     set_user_from_auth :active
-    Rails.configuration.RemoteClusters = {"foooo" => {"Host" => "bar.com"} }
+    Rails.configuration.RemoteClusters = Rails.configuration.RemoteClusters.merge({foooo: ActiveSupport::InheritableOptions.new({Host: "bar.com"})})
     Container.resolve_container_image('acbd18db4cc2f85cedef654fccc4a4d8+3')
   end