Add file mapping to accessories

This commit is contained in:
David Heinemeier Hansson
2023-01-23 09:43:57 +01:00
parent 92565d58d5
commit 8af7e48a90
7 changed files with 61 additions and 10 deletions

View File

@@ -3,10 +3,27 @@ require "mrsk/cli/base"
class Mrsk::Cli::Accessory < Mrsk::Cli::Base class Mrsk::Cli::Accessory < Mrsk::Cli::Base
desc "boot [NAME]", "Boot accessory service on host" desc "boot [NAME]", "Boot accessory service on host"
def boot(name) def boot(name)
invoke :upload, [ name ]
accessory = MRSK.accessory(name) accessory = MRSK.accessory(name)
on(accessory.host) { execute *accessory.run } on(accessory.host) { execute *accessory.run }
end end
desc "upload [NAME]", "Upload accessory files to host"
def upload(name)
accessory = MRSK.accessory(name)
on(accessory.host) do
accessory.files.each do |(local, remote)|
if Pathname.new(local).exist?
execute :mkdir, "-p", Pathname.new(remote).dirname.to_s
upload! local.to_s, remote.to_s
else
raise "Missing file: #{local}"
end
end
end
end
desc "reboot [NAME]", "Reboot accessory on host (stop container, remove container, start new container)" desc "reboot [NAME]", "Reboot accessory on host (stop container, remove container, start new container)"
def reboot(name) def reboot(name)
invoke :stop, [ name ] invoke :stop, [ name ]

View File

@@ -2,7 +2,7 @@ require "mrsk/commands/base"
class Mrsk::Commands::Accessory < Mrsk::Commands::Base class Mrsk::Commands::Accessory < Mrsk::Commands::Base
attr_reader :accessory_config attr_reader :accessory_config
delegate :service_name, :image, :host, :port, :env_args, :volume_args, :label_args, to: :accessory_config delegate :service_name, :image, :host, :port, :files, :env_args, :volume_args, :label_args, to: :accessory_config
def initialize(config, name:) def initialize(config, name:)
super(config) super(config)

View File

@@ -43,8 +43,15 @@ class Mrsk::Configuration::Assessory
argumentize_env_with_secrets env argumentize_env_with_secrets env
end end
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) ]
end || {}
end
def volumes def volumes
specifics["volumes"] || [] (specifics["volumes"] || []) + remote_files_as_volumes
end end
def volume_args def volume_args
@@ -57,4 +64,19 @@ class Mrsk::Configuration::Assessory
def default_labels def default_labels
{ "service" => service_name } { "service" => service_name }
end end
def expand_local_file_path(local_file)
Pathname.new(File.expand_path(local_file))
end
def expand_remote_file_path(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(":")
"#{expand_remote_file_path(remote_file)}:#{remote_file}"
end || []
end
end end

View File

@@ -5,13 +5,18 @@ require "mrsk/cli"
class CliAccessoryTest < ActiveSupport::TestCase class CliAccessoryTest < ActiveSupport::TestCase
include ActiveSupport::Testing::Stream include ActiveSupport::Testing::Stream
test "boot" do setup { ENV["MYSQL_ROOT_PASSWORD"] = "secret123" }
ENV["MYSQL_ROOT_PASSWORD"] = "secret123" teardown { ENV["MYSQL_ROOT_PASSWORD"] = nil }
test "upload" do
command = stdouted { Mrsk::Cli::Accessory.start(["upload", "mysql", "-c", "test/fixtures/deploy_with_accessories.yml"]) }
assert_match "test/fixtures/files/my.cnf app-mysql/etc/mysql/my.cnf", command
end
test "boot" do
command = stdouted { Mrsk::Cli::Accessory.start(["boot", "mysql", "-c", "test/fixtures/deploy_with_accessories.yml"]) } command = stdouted { Mrsk::Cli::Accessory.start(["boot", "mysql", "-c", "test/fixtures/deploy_with_accessories.yml"]) }
assert_match "Running docker run --name app-mysql -d --restart unless-stopped -p 3306:3306 -e [REDACTED] -e MYSQL_ROOT_HOST=% --volume /var/lib/mysql:/var/lib/mysql --label service=app-mysql mysql:5.7 on 1.1.1.3", command assert_match "Running docker run --name app-mysql -d --restart unless-stopped -p 3306:3306 -e [REDACTED] -e MYSQL_ROOT_HOST=% --volume /var/lib/mysql:/var/lib/mysql --volume app-mysql/etc/mysql/my.cnf:/etc/mysql/my.cnf --label service=app-mysql mysql:5.7 on 1.1.1.3", command
ensure
ENV["MYSQL_ROOT_PASSWORD"] = nil
end end
end end

View File

@@ -18,8 +18,12 @@ class ConfigurationAccessoryTest < ActiveSupport::TestCase
}, },
"secret" => [ "secret" => [
"MYSQL_ROOT_PASSWORD" "MYSQL_ROOT_PASSWORD"
] ],
} },
"files" => [
"config/mysql/my.cnf:/etc/mysql/my.cnf",
"db/structure.sql:/docker-entrypoint-initdb.d/structure.sql"
]
}, },
"redis" => { "redis" => {
"image" => "redis:latest", "image" => "redis:latest",
@@ -83,7 +87,7 @@ class ConfigurationAccessoryTest < ActiveSupport::TestCase
end end
test "volume args" do test "volume args" do
assert_equal [], @config.accessory(:mysql).volume_args assert_equal ["--volume", "app-mysql/etc/mysql/my.cnf:/etc/mysql/my.cnf", "--volume", "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 assert_equal ["--volume", "/var/lib/redis:/data"], @config.accessory(:redis).volume_args
end end
end end

View File

@@ -19,6 +19,8 @@ accessories:
- MYSQL_ROOT_PASSWORD - MYSQL_ROOT_PASSWORD
volumes: volumes:
- /var/lib/mysql:/var/lib/mysql - /var/lib/mysql:/var/lib/mysql
files:
- test/fixtures/files/my.cnf:/etc/mysql/my.cnf
redis: redis:
image: redis:latest image: redis:latest
host: 1.1.1.4 host: 1.1.1.4

1
test/fixtures/files/my.cnf vendored Normal file
View File

@@ -0,0 +1 @@
# MySQL Config