Catch up with main
This commit is contained in:
@@ -5,7 +5,9 @@ class CommandsAccessoryTest < ActiveSupport::TestCase
|
||||
setup_test_secrets("secrets" => "MYSQL_ROOT_PASSWORD=secret123")
|
||||
|
||||
@config = {
|
||||
service: "app", image: "dhh/app", registry: { "server" => "private.registry", "username" => "dhh", "password" => "secret" },
|
||||
service: "app",
|
||||
image: "dhh/app",
|
||||
registry: { "server" => "private.registry", "username" => "dhh", "password" => "secret" },
|
||||
servers: [ "1.1.1.1" ],
|
||||
builder: { "arch" => "amd64" },
|
||||
accessories: {
|
||||
@@ -39,6 +41,7 @@ class CommandsAccessoryTest < ActiveSupport::TestCase
|
||||
"busybox" => {
|
||||
"service" => "custom-busybox",
|
||||
"image" => "busybox:latest",
|
||||
"registry" => { "server" => "other.registry", "username" => "user", "password" => "pw" },
|
||||
"host" => "1.1.1.7",
|
||||
"proxy" => {
|
||||
"host" => "busybox.example.com"
|
||||
@@ -62,7 +65,7 @@ class CommandsAccessoryTest < ActiveSupport::TestCase
|
||||
new_command(:redis).run.join(" ")
|
||||
|
||||
assert_equal \
|
||||
"docker run --name custom-busybox --detach --restart unless-stopped --network kamal --log-opt max-size=\"10m\" --env-file .kamal/apps/app/env/accessories/busybox.env --label service=\"custom-busybox\" busybox:latest",
|
||||
"docker run --name custom-busybox --detach --restart unless-stopped --network kamal --log-opt max-size=\"10m\" --env-file .kamal/apps/app/env/accessories/busybox.env --label service=\"custom-busybox\" other.registry/busybox:latest",
|
||||
new_command(:busybox).run.join(" ")
|
||||
end
|
||||
|
||||
@@ -70,7 +73,7 @@ class CommandsAccessoryTest < ActiveSupport::TestCase
|
||||
@config[:logging] = { "driver" => "local", "options" => { "max-size" => "100m", "max-file" => "3" } }
|
||||
|
||||
assert_equal \
|
||||
"docker run --name custom-busybox --detach --restart unless-stopped --network kamal --log-driver \"local\" --log-opt max-size=\"100m\" --log-opt max-file=\"3\" --env-file .kamal/apps/app/env/accessories/busybox.env --label service=\"custom-busybox\" busybox:latest",
|
||||
"docker run --name custom-busybox --detach --restart unless-stopped --network kamal --log-driver \"local\" --log-opt max-size=\"100m\" --log-opt max-file=\"3\" --env-file .kamal/apps/app/env/accessories/busybox.env --label service=\"custom-busybox\" other.registry/busybox:latest",
|
||||
new_command(:busybox).run.join(" ")
|
||||
end
|
||||
|
||||
@@ -100,7 +103,6 @@ class CommandsAccessoryTest < ActiveSupport::TestCase
|
||||
new_command(:mysql).info.join(" ")
|
||||
end
|
||||
|
||||
|
||||
test "execute in new container" do
|
||||
assert_equal \
|
||||
"docker run --rm --network kamal --env MYSQL_ROOT_HOST=\"%\" --env-file .kamal/apps/app/env/accessories/mysql.env private.registry/mysql:8.0 mysql -u root",
|
||||
@@ -127,8 +129,6 @@ class CommandsAccessoryTest < ActiveSupport::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
test "logs" do
|
||||
assert_equal \
|
||||
"docker logs app-mysql --timestamps 2>&1",
|
||||
|
||||
@@ -157,6 +157,12 @@ class CommandsAppTest < ActiveSupport::TestCase
|
||||
new_command.logs.join(" ")
|
||||
end
|
||||
|
||||
test "logs with container_id" do
|
||||
assert_equal \
|
||||
"echo C137 | xargs docker logs --timestamps 2>&1",
|
||||
new_command.logs(container_id: "C137").join(" ")
|
||||
end
|
||||
|
||||
test "logs with since" do
|
||||
assert_equal \
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=destination= --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=destination= --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --timestamps --since 5m 2>&1",
|
||||
@@ -208,6 +214,10 @@ class CommandsAppTest < ActiveSupport::TestCase
|
||||
"ssh -t root@app-1 -p 22 'sh -c '\\''docker ps --latest --quiet --filter label=service=app --filter label=destination= --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''\\'\\'''\\''{{.ID}}'\\''\\'\\'''\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=destination= --filter label=role=web --filter status=running --filter status=restarting'\\'' | head -1 | xargs docker logs --timestamps --follow 2>&1 | grep \"Completed\"'",
|
||||
new_command.follow_logs(host: "app-1", grep: "Completed")
|
||||
|
||||
assert_equal \
|
||||
"ssh -t root@app-1 -p 22 'echo ID321 | xargs docker logs --timestamps --follow 2>&1'",
|
||||
new_command.follow_logs(host: "app-1", container_id: "ID321")
|
||||
|
||||
assert_equal \
|
||||
"ssh -t root@app-1 -p 22 'sh -c '\\''docker ps --latest --quiet --filter label=service=app --filter label=destination= --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''\\'\\'''\\''{{.ID}}'\\''\\'\\'''\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=destination= --filter label=role=web --filter status=running --filter status=restarting'\\'' | head -1 | xargs docker logs --timestamps --tail 123 --follow 2>&1'",
|
||||
new_command.follow_logs(host: "app-1", lines: 123)
|
||||
@@ -224,29 +234,43 @@ class CommandsAppTest < ActiveSupport::TestCase
|
||||
|
||||
test "execute in new container" do
|
||||
assert_equal \
|
||||
"docker run --rm --network kamal --env-file .kamal/apps/app/env/roles/web.env dhh/app:999 bin/rails db:setup",
|
||||
"docker run --rm --network kamal --env-file .kamal/apps/app/env/roles/web.env --log-opt max-size=\"10m\" dhh/app:999 bin/rails db:setup",
|
||||
new_command.execute_in_new_container("bin/rails", "db:setup", env: {}).join(" ")
|
||||
end
|
||||
|
||||
test "execute in new container with logging" do
|
||||
@config[:logging] = { "driver" => "local", "options" => { "max-size" => "100m", "max-file" => "3" } }
|
||||
|
||||
assert_equal \
|
||||
"docker run --rm --network kamal --env-file .kamal/apps/app/env/roles/web.env --log-driver \"local\" --log-opt max-size=\"100m\" --log-opt max-file=\"3\" dhh/app:999 bin/rails db:setup",
|
||||
new_command.execute_in_new_container("bin/rails", "db:setup", env: {}).join(" ")
|
||||
end
|
||||
|
||||
test "execute in new container with env" do
|
||||
assert_equal \
|
||||
"docker run --rm --network kamal --env-file .kamal/apps/app/env/roles/web.env --env foo=\"bar\" dhh/app:999 bin/rails db:setup",
|
||||
"docker run --rm --network kamal --env-file .kamal/apps/app/env/roles/web.env --env foo=\"bar\" --log-opt max-size=\"10m\" dhh/app:999 bin/rails db:setup",
|
||||
new_command.execute_in_new_container("bin/rails", "db:setup", env: { "foo" => "bar" }).join(" ")
|
||||
end
|
||||
|
||||
test "execute in new detached container" do
|
||||
assert_equal \
|
||||
"docker run --detach --network kamal --env-file .kamal/apps/app/env/roles/web.env --log-opt max-size=\"10m\" dhh/app:999 bin/rails db:setup",
|
||||
new_command.execute_in_new_container("bin/rails", "db:setup", detach: true, env: {}).join(" ")
|
||||
end
|
||||
|
||||
test "execute in new container with tags" do
|
||||
@config[:servers] = [ { "1.1.1.1" => "tag1" } ]
|
||||
@config[:env]["tags"] = { "tag1" => { "ENV1" => "value1" } }
|
||||
|
||||
assert_equal \
|
||||
"docker run --rm --network kamal --env ENV1=\"value1\" --env-file .kamal/apps/app/env/roles/web.env dhh/app:999 bin/rails db:setup",
|
||||
"docker run --rm --network kamal --env ENV1=\"value1\" --env-file .kamal/apps/app/env/roles/web.env --log-opt max-size=\"10m\" dhh/app:999 bin/rails db:setup",
|
||||
new_command.execute_in_new_container("bin/rails", "db:setup", env: {}).join(" ")
|
||||
end
|
||||
|
||||
test "execute in new container with custom options" do
|
||||
@config[:servers] = { "web" => { "hosts" => [ "1.1.1.1" ], "options" => { "mount" => "somewhere", "cap-add" => true } } }
|
||||
assert_equal \
|
||||
"docker run --rm --network kamal --env-file .kamal/apps/app/env/roles/web.env --mount \"somewhere\" --cap-add dhh/app:999 bin/rails db:setup",
|
||||
"docker run --rm --network kamal --env-file .kamal/apps/app/env/roles/web.env --log-opt max-size=\"10m\" --mount \"somewhere\" --cap-add dhh/app:999 bin/rails db:setup",
|
||||
new_command.execute_in_new_container("bin/rails", "db:setup", env: {}).join(" ")
|
||||
end
|
||||
|
||||
@@ -263,7 +287,7 @@ class CommandsAppTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
test "execute in new container over ssh" do
|
||||
assert_match %r{docker run -it --rm --network kamal --env-file .kamal/apps/app/env/roles/web.env dhh/app:999 bin/rails c},
|
||||
assert_match %r{docker run -it --rm --network kamal --env-file .kamal/apps/app/env/roles/web.env --log-opt max-size="10m" dhh/app:999 bin/rails c},
|
||||
new_command.execute_in_new_container_over_ssh("bin/rails", "c", env: {})
|
||||
end
|
||||
|
||||
@@ -271,13 +295,13 @@ class CommandsAppTest < ActiveSupport::TestCase
|
||||
@config[:servers] = [ { "1.1.1.1" => "tag1" } ]
|
||||
@config[:env]["tags"] = { "tag1" => { "ENV1" => "value1" } }
|
||||
|
||||
assert_equal "ssh -t root@1.1.1.1 -p 22 'docker run -it --rm --network kamal --env ENV1=\"value1\" --env-file .kamal/apps/app/env/roles/web.env dhh/app:999 bin/rails c'",
|
||||
assert_equal "ssh -t root@1.1.1.1 -p 22 'docker run -it --rm --network kamal --env ENV1=\"value1\" --env-file .kamal/apps/app/env/roles/web.env --log-opt max-size=\"10m\" dhh/app:999 bin/rails c'",
|
||||
new_command.execute_in_new_container_over_ssh("bin/rails", "c", env: {})
|
||||
end
|
||||
|
||||
test "execute in new container with custom options over ssh" do
|
||||
@config[:servers] = { "web" => { "hosts" => [ "1.1.1.1" ], "options" => { "mount" => "somewhere", "cap-add" => true } } }
|
||||
assert_match %r{docker run -it --rm --network kamal --env-file .kamal/apps/app/env/roles/web.env --mount \"somewhere\" --cap-add dhh/app:999 bin/rails c},
|
||||
assert_match %r{docker run -it --rm --network kamal --env-file .kamal/apps/app/env/roles/web.env --log-opt max-size=\"10m\" --mount \"somewhere\" --cap-add dhh/app:999 bin/rails c},
|
||||
new_command.execute_in_new_container_over_ssh("bin/rails", "c", env: {})
|
||||
end
|
||||
|
||||
@@ -315,6 +339,16 @@ class CommandsAppTest < ActiveSupport::TestCase
|
||||
assert_equal "ssh -J root@2.2.2.2 -t app@1.1.1.1 -p 22 'ls'", new_command.run_over_ssh("ls", host: "1.1.1.1")
|
||||
end
|
||||
|
||||
test "run over ssh with keys config" do
|
||||
@config[:ssh] = { "keys" => [ "path_to_key.pem" ] }
|
||||
assert_equal "ssh -i path_to_key.pem -t root@1.1.1.1 -p 22 'ls'", new_command.run_over_ssh("ls", host: "1.1.1.1")
|
||||
end
|
||||
|
||||
test "run over ssh with keys config with keys_only" do
|
||||
@config[:ssh] = { "keys" => [ "path_to_key.pem" ], "keys_only" => true }
|
||||
assert_equal "ssh -i path_to_key.pem -o IdentitiesOnly=yes -t root@1.1.1.1 -p 22 'ls'", new_command.run_over_ssh("ls", host: "1.1.1.1")
|
||||
end
|
||||
|
||||
test "run over ssh with proxy_command" do
|
||||
@config[:ssh] = { "proxy_command" => "ssh -W %h:%p user@proxy-server" }
|
||||
assert_equal "ssh -o ProxyCommand='ssh -W %h:%p user@proxy-server' -t root@1.1.1.1 -p 22 'ls'", new_command.run_over_ssh("ls", host: "1.1.1.1")
|
||||
@@ -435,10 +469,10 @@ class CommandsAppTest < ActiveSupport::TestCase
|
||||
test "extract assets" do
|
||||
assert_equal [
|
||||
:mkdir, "-p", ".kamal/apps/app/assets/extracted/web-999", "&&",
|
||||
:docker, :stop, "-t 1", "app-web-assets", "2> /dev/null", "|| true", "&&",
|
||||
:docker, :run, "--name", "app-web-assets", "--detach", "--rm", "--entrypoint", "sleep", "dhh/app:999", "1000000", "&&",
|
||||
:docker, :cp, "-L", "app-web-assets:/public/assets/.", ".kamal/apps/app/assets/extracted/web-999", "&&",
|
||||
:docker, :stop, "-t 1", "app-web-assets"
|
||||
:docker, :container, :rm, "app-web-assets", "2> /dev/null", "|| true", "&&",
|
||||
:docker, :container, :create, "--name", "app-web-assets", "dhh/app:999", "&&",
|
||||
:docker, :container, :cp, "-L", "app-web-assets:/public/assets/.", ".kamal/apps/app/assets/extracted/web-999", "&&",
|
||||
:docker, :container, :rm, "app-web-assets"
|
||||
], new_command(asset_path: "/public/assets").extract_assets
|
||||
end
|
||||
|
||||
|
||||
@@ -87,6 +87,14 @@ class CommandsBuilderTest < ActiveSupport::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
test "cloud builder" do
|
||||
builder = new_builder_command(builder: { "arch" => [ "#{local_arch}" ], "driver" => "cloud docker-org-name/builder-name" })
|
||||
assert_equal "cloud", builder.name
|
||||
assert_equal \
|
||||
"docker buildx build --push --platform linux/#{local_arch} --builder cloud-docker-org-name-builder-name -t dhh/app:123 -t dhh/app:latest --label service=\"app\" --file Dockerfile .",
|
||||
builder.push.join(" ")
|
||||
end
|
||||
|
||||
test "build args" do
|
||||
builder = new_builder_command(builder: { "args" => { "a" => 1, "b" => 2 } })
|
||||
assert_equal \
|
||||
|
||||
@@ -2,14 +2,27 @@ require "test_helper"
|
||||
|
||||
class CommandsRegistryTest < ActiveSupport::TestCase
|
||||
setup do
|
||||
@config = { service: "app",
|
||||
@config = {
|
||||
service: "app",
|
||||
image: "dhh/app",
|
||||
registry: { "username" => "dhh",
|
||||
registry: {
|
||||
"username" => "dhh",
|
||||
"password" => "secret",
|
||||
"server" => "hub.docker.com"
|
||||
},
|
||||
builder: { "arch" => "amd64" },
|
||||
servers: [ "1.1.1.1" ]
|
||||
servers: [ "1.1.1.1" ],
|
||||
accessories: {
|
||||
"db" => {
|
||||
"image" => "mysql:8.0",
|
||||
"hosts" => [ "1.1.1.1" ],
|
||||
"registry" => {
|
||||
"username" => "user",
|
||||
"password" => "pw",
|
||||
"server" => "other.hub.docker.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
@@ -19,13 +32,24 @@ class CommandsRegistryTest < ActiveSupport::TestCase
|
||||
registry.login.join(" ")
|
||||
end
|
||||
|
||||
test "given registry login" do
|
||||
assert_equal \
|
||||
"docker login other.hub.docker.com -u \"user\" -p \"pw\"",
|
||||
registry.login(registry_config: accessory_registry_config).join(" ")
|
||||
end
|
||||
|
||||
test "registry login with ENV password" do
|
||||
with_test_secrets("secrets" => "KAMAL_REGISTRY_PASSWORD=more-secret") do
|
||||
with_test_secrets("secrets" => "KAMAL_REGISTRY_PASSWORD=more-secret\nKAMAL_MYSQL_REGISTRY_PASSWORD=secret-pw") do
|
||||
@config[:registry]["password"] = [ "KAMAL_REGISTRY_PASSWORD" ]
|
||||
@config[:accessories]["db"]["registry"]["password"] = [ "KAMAL_MYSQL_REGISTRY_PASSWORD" ]
|
||||
|
||||
assert_equal \
|
||||
"docker login hub.docker.com -u \"dhh\" -p \"more-secret\"",
|
||||
registry.login.join(" ")
|
||||
|
||||
assert_equal \
|
||||
"docker login other.hub.docker.com -u \"user\" -p \"secret-pw\"",
|
||||
registry.login(registry_config: accessory_registry_config).join(" ")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -55,8 +79,22 @@ class CommandsRegistryTest < ActiveSupport::TestCase
|
||||
registry.logout.join(" ")
|
||||
end
|
||||
|
||||
test "given registry logout" do
|
||||
assert_equal \
|
||||
"docker logout other.hub.docker.com",
|
||||
registry.logout(registry_config: accessory_registry_config).join(" ")
|
||||
end
|
||||
|
||||
private
|
||||
def registry
|
||||
Kamal::Commands::Registry.new Kamal::Configuration.new(@config)
|
||||
Kamal::Commands::Registry.new main_config
|
||||
end
|
||||
|
||||
def main_config
|
||||
Kamal::Configuration.new(@config)
|
||||
end
|
||||
|
||||
def accessory_registry_config
|
||||
main_config.accessory("db").registry
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user