Merge pull request #1547 from basecamp/pin-accessories-to-tags
Pin accessories to tags
This commit is contained in:
@@ -32,7 +32,7 @@ class Kamal::Configuration::Accessory
|
||||
end
|
||||
|
||||
def hosts
|
||||
hosts_from_host || hosts_from_hosts || hosts_from_roles
|
||||
hosts_from_host || hosts_from_hosts || hosts_from_roles || hosts_from_tags
|
||||
end
|
||||
|
||||
def port
|
||||
@@ -206,6 +206,24 @@ class Kamal::Configuration::Accessory
|
||||
end
|
||||
end
|
||||
|
||||
def hosts_from_tags
|
||||
if accessory_config.key?("tag")
|
||||
extract_hosts_from_config_with_tag(accessory_config["tag"])
|
||||
elsif accessory_config.key?("tags")
|
||||
accessory_config["tags"].flat_map { |tag| extract_hosts_from_config_with_tag(tag) }
|
||||
end
|
||||
end
|
||||
|
||||
def extract_hosts_from_config_with_tag(tag)
|
||||
if (servers_with_roles = config.raw_config.servers).is_a?(Hash)
|
||||
servers_with_roles.flat_map do |role, servers_in_role|
|
||||
servers_in_role.filter_map do |host|
|
||||
host.keys.first if host.is_a?(Hash) && host.values.first.include?(tag)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def network
|
||||
accessory_config["network"] || DEFAULT_NETWORK
|
||||
end
|
||||
|
||||
@@ -46,13 +46,17 @@ accessories:
|
||||
|
||||
# Accessory hosts
|
||||
#
|
||||
# Specify one of `host`, `hosts`, or `roles`:
|
||||
# Specify one of `host`, `hosts`, `roles`, or `tags`:
|
||||
host: mysql-db1
|
||||
hosts:
|
||||
- mysql-db1
|
||||
- mysql-db2
|
||||
roles:
|
||||
- mysql
|
||||
tag: writer
|
||||
tags:
|
||||
- writer
|
||||
- reader
|
||||
|
||||
# Custom command
|
||||
#
|
||||
|
||||
@@ -2,8 +2,8 @@ class Kamal::Configuration::Validator::Accessory < Kamal::Configuration::Validat
|
||||
def validate!
|
||||
super
|
||||
|
||||
if (config.keys & [ "host", "hosts", "roles" ]).size != 1
|
||||
error "specify one of `host`, `hosts` or `roles`"
|
||||
if (config.keys & [ "host", "hosts", "roles", "tag", "tags" ]).size != 1
|
||||
error "specify one of `host`, `hosts`, `roles`, `tag` or `tags`"
|
||||
end
|
||||
|
||||
validate_docker_options!(config["options"])
|
||||
|
||||
@@ -7,8 +7,8 @@ class ConfigurationAccessoryTest < ActiveSupport::TestCase
|
||||
image: "dhh/app",
|
||||
registry: { "username" => "dhh", "password" => "secret" },
|
||||
servers: {
|
||||
"web" => [ "1.1.1.1", "1.1.1.2" ],
|
||||
"workers" => [ "1.1.1.3", "1.1.1.4" ]
|
||||
"web" => [ { "1.1.1.1" => "writer" }, { "1.1.1.2" => "reader" } ],
|
||||
"workers" => [ { "1.1.1.3" => "writer" }, "1.1.1.4" ]
|
||||
},
|
||||
builder: { "arch" => "amd64" },
|
||||
env: { "REDIS_URL" => "redis://x/y" },
|
||||
@@ -70,6 +70,14 @@ class ConfigurationAccessoryTest < ActiveSupport::TestCase
|
||||
"proxy" => {
|
||||
"host" => "monitoring.example.com"
|
||||
}
|
||||
},
|
||||
"proxy" => {
|
||||
"image" => "proxy:latest",
|
||||
"tags" => [ "writer", "reader" ]
|
||||
},
|
||||
"logger" => {
|
||||
"image" => "logger:latest",
|
||||
"tag" => "writer"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -107,6 +115,8 @@ class ConfigurationAccessoryTest < ActiveSupport::TestCase
|
||||
assert_equal [ "1.1.1.5" ], @config.accessory(:mysql).hosts
|
||||
assert_equal [ "1.1.1.6", "1.1.1.7" ], @config.accessory(:redis).hosts
|
||||
assert_equal [ "1.1.1.1", "1.1.1.2" ], @config.accessory(:monitoring).hosts
|
||||
assert_equal [ "1.1.1.1", "1.1.1.3", "1.1.1.2" ], @config.accessory(:proxy).hosts
|
||||
assert_equal [ "1.1.1.1", "1.1.1.3" ], @config.accessory(:logger).hosts
|
||||
end
|
||||
|
||||
test "missing host" do
|
||||
@@ -117,14 +127,14 @@ class ConfigurationAccessoryTest < ActiveSupport::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
test "setting host, hosts and roles" do
|
||||
test "setting host, hosts, roles and tags" do
|
||||
@deploy[:accessories]["mysql"]["hosts"] = [ "mysql-db1" ]
|
||||
@deploy[:accessories]["mysql"]["roles"] = [ "db" ]
|
||||
|
||||
exception = assert_raises(Kamal::ConfigurationError) do
|
||||
Kamal::Configuration.new(@deploy)
|
||||
end
|
||||
assert_equal "accessories/mysql: specify one of `host`, `hosts` or `roles`", exception.message
|
||||
assert_equal "accessories/mysql: specify one of `host`, `hosts`, `roles`, `tag` or `tags`", exception.message
|
||||
end
|
||||
|
||||
test "all hosts" do
|
||||
|
||||
Reference in New Issue
Block a user