diff --git a/lib/mrsk/cli/accessory.rb b/lib/mrsk/cli/accessory.rb index 90a4be2a..cf3775ec 100644 --- a/lib/mrsk/cli/accessory.rb +++ b/lib/mrsk/cli/accessory.rb @@ -18,7 +18,8 @@ class Mrsk::Cli::Accessory < Mrsk::Cli::Base accessory = MRSK.accessory(name) on(accessory.host) do accessory.files.each do |(local, remote)| - execute *accessory.make_directory_for(local, remote) + accessory.ensure_local_file_present(local) + execute *accessory.make_directory_for(remote) upload! local, remote execute :chmod, "755", remote end diff --git a/lib/mrsk/commands/accessory.rb b/lib/mrsk/commands/accessory.rb index d9542967..894d2530 100644 --- a/lib/mrsk/commands/accessory.rb +++ b/lib/mrsk/commands/accessory.rb @@ -46,10 +46,6 @@ class Mrsk::Commands::Accessory < Mrsk::Commands::Base ).join(" "), host: host end - def make_directory_for(local, remote) - if Pathname.new(local).exist? - [ :mkdir, "-p", Pathname.new(remote).dirname.to_s ] - else def exec(*command, interactive: false) docker :exec, ("-it" if interactive), @@ -73,10 +69,16 @@ class Mrsk::Commands::Accessory < Mrsk::Commands::Base exec_over_ssh "bash", host: host end + def ensure_local_file_present(local) + if !local.is_a?(StringIO) && !Pathname.new(local).exist? raise "Missing file: #{local}" end end + def make_directory_for(remote) + [ :mkdir, "-p", Pathname.new(remote).dirname.to_s ] + end + def remove_files [ :rm, "-rf", service_name ] end diff --git a/lib/mrsk/configuration/accessory.rb b/lib/mrsk/configuration/accessory.rb index 163742cd..5d36063c 100644 --- a/lib/mrsk/configuration/accessory.rb +++ b/lib/mrsk/configuration/accessory.rb @@ -46,7 +46,7 @@ class Mrsk::Configuration::Assessory def files specifics["files"]&.to_h do |local_to_remote_mapping| local_file, remote_file = local_to_remote_mapping.split(":") - [ expand_local_file_path(local_file), expand_remote_file_path(remote_file) ] + [ expand_local_file(local_file), expand_remote_file(remote_file) ] end || {} end @@ -65,18 +65,26 @@ class Mrsk::Configuration::Assessory { "service" => service_name } end - def expand_local_file_path(local_file) - Pathname.new(File.expand_path(local_file)).to_s + def expand_local_file(local_file) + if local_file.end_with?("erb") + read_dynamic_file(local_file) + else + Pathname.new(File.expand_path(local_file)).to_s + end end - def expand_remote_file_path(remote_file) + def expand_remote_file(remote_file) service_name + remote_file end def remote_files_as_volumes specifics["files"]&.collect do |local_to_remote_mapping| _, remote_file = local_to_remote_mapping.split(":") - "$PWD/#{expand_remote_file_path(remote_file)}:#{remote_file}" + "$PWD/#{expand_remote_file(remote_file)}:#{remote_file}" end || [] end + + def read_dynamic_file(local_file) + StringIO.new(ERB.new(IO.read(local_file)).result) + end end diff --git a/test/configuration/accessory_test.rb b/test/configuration/accessory_test.rb index 1bc42a0a..54c39bfa 100644 --- a/test/configuration/accessory_test.rb +++ b/test/configuration/accessory_test.rb @@ -90,4 +90,11 @@ class ConfigurationAccessoryTest < ActiveSupport::TestCase assert_equal ["--volume", "$PWD/app-mysql/etc/mysql/my.cnf:/etc/mysql/my.cnf", "--volume", "$PWD/app-mysql/docker-entrypoint-initdb.d/structure.sql:/docker-entrypoint-initdb.d/structure.sql"], @config.accessory(:mysql).volume_args assert_equal ["--volume", "/var/lib/redis:/data"], @config.accessory(:redis).volume_args end + + test "dynamic file expansion" do + @deploy[:accessories]["mysql"]["files"] << "test/fixtures/files/structure.sql.erb:/docker-entrypoint-initdb.d/structure.sql" + @config = Mrsk::Configuration.new(@deploy) + + assert_equal "This was dynamically expanded", @config.accessory(:mysql).files.keys[2].read + end end diff --git a/test/fixtures/files/structure.sql.erb b/test/fixtures/files/structure.sql.erb new file mode 100644 index 00000000..102f8132 --- /dev/null +++ b/test/fixtures/files/structure.sql.erb @@ -0,0 +1 @@ +<%= "This was dynamically expanded" %> \ No newline at end of file