diff --git a/lib/kamal/commander/specifics.rb b/lib/kamal/commander/specifics.rb index 190d2b69a..238cc012e 100644 --- a/lib/kamal/commander/specifics.rb +++ b/lib/kamal/commander/specifics.rb @@ -43,7 +43,12 @@ def specified_roles end def specified_hosts - (specific_hosts || config.all_hosts) \ - .select { |host| (specific_roles || config.roles).flat_map(&:hosts).include?(host) } + specified_hosts = specific_hosts || config.all_hosts + + if (specific_role_hosts = specific_roles&.flat_map(&:hosts)).present? + specified_hosts.select { |host| specific_role_hosts.include?(host) } + else + specified_hosts + end end end diff --git a/test/commander_test.rb b/test/commander_test.rb index 54031e803..4f0a829eb 100644 --- a/test/commander_test.rb +++ b/test/commander_test.rb @@ -150,6 +150,27 @@ class CommanderTest < ActiveSupport::TestCase assert_equal [ "1.1.1.2" ], @kamal.proxy_hosts end + test "accessory hosts without filtering" do + configure_with(:deploy_with_single_accessory) + assert_equal [ "1.1.1.5" ], @kamal.accessory_hosts + + configure_with(:deploy_with_accessories_on_independent_server) + assert_equal [ "1.1.1.5", "1.1.1.1", "1.1.1.2" ], @kamal.accessory_hosts + end + + test "accessory hosts with role filtering" do + configure_with(:deploy_with_single_accessory) + @kamal.specific_roles = [ "web" ] + assert_equal [], @kamal.accessory_hosts + + configure_with(:deploy_with_accessories_on_independent_server) + @kamal.specific_roles = [ "web" ] + assert_equal [ "1.1.1.1", "1.1.1.2" ], @kamal.accessory_hosts + + @kamal.specific_roles = [ "workers" ] + assert_equal [], @kamal.accessory_hosts + end + private def configure_with(variant) @kamal = Kamal::Commander.new.tap do |kamal| diff --git a/test/fixtures/deploy_with_accessories_on_independent_server.yml b/test/fixtures/deploy_with_accessories_on_independent_server.yml new file mode 100644 index 000000000..e6c6825f5 --- /dev/null +++ b/test/fixtures/deploy_with_accessories_on_independent_server.yml @@ -0,0 +1,38 @@ +service: app +image: dhh/app +servers: + web: + - "1.1.1.1" + - "1.1.1.2" + workers: + - "1.1.1.3" + - "1.1.1.4" +registry: + username: user + password: pw +builder: + arch: amd64 + +accessories: + mysql: + image: mysql:5.7 + host: 1.1.1.5 + port: 3306 + env: + clear: + MYSQL_ROOT_HOST: '%' + secret: + - MYSQL_ROOT_PASSWORD + files: + - test/fixtures/files/my.cnf:/etc/mysql/my.cnf + directories: + - data:/var/lib/mysql + redis: + image: redis:latest + roles: + - web + port: 6379 + directories: + - data:/data + +readiness_delay: 0 diff --git a/test/fixtures/deploy_with_single_accessory.yml b/test/fixtures/deploy_with_single_accessory.yml new file mode 100644 index 000000000..4af4a9e6a --- /dev/null +++ b/test/fixtures/deploy_with_single_accessory.yml @@ -0,0 +1,29 @@ +service: app +image: dhh/app +servers: + web: + - "1.1.1.1" + - "1.1.1.2" + workers: + - "1.1.1.3" + - "1.1.1.4" +registry: + username: user + password: pw +builder: + arch: amd64 + +accessories: + mysql: + image: mysql:5.7 + host: 1.1.1.5 + port: 3306 + env: + clear: + MYSQL_ROOT_HOST: '%' + secret: + - MYSQL_ROOT_PASSWORD + files: + - test/fixtures/files/my.cnf:/etc/mysql/my.cnf + directories: + - data:/var/lib/mysql