Class: Kamal::Configuration::Role

Inherits:
Object
  • Object
show all
Defined in:
lib/kamal/configuration/role.rb

Constant Summary collapse

CORD_FILE =
"cord"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, config:) ⇒ Role

Returns a new instance of Role.



8
9
10
11
# File 'lib/kamal/configuration/role.rb', line 8

def initialize(name, config:)
  @name, @config = name.inquiry, config
  @tagged_hosts ||= extract_tagged_hosts_from_config
end

Instance Attribute Details

#nameObject Also known as: to_s

Returns the value of attribute name.



5
6
7
# File 'lib/kamal/configuration/role.rb', line 5

def name
  @name
end

Instance Method Details

#asset_extracted_path(version = nil) ⇒ Object



164
165
166
# File 'lib/kamal/configuration/role.rb', line 164

def asset_extracted_path(version = nil)
  File.join config.run_directory, "assets", "extracted", container_name(version)
end

#asset_pathObject



149
150
151
# File 'lib/kamal/configuration/role.rb', line 149

def asset_path
  specializations["asset_path"] || config.asset_path
end

#asset_volume(version = nil) ⇒ Object



157
158
159
160
161
162
# File 'lib/kamal/configuration/role.rb', line 157

def asset_volume(version = nil)
  if assets?
    Kamal::Configuration::Volume.new \
      host_path: asset_volume_path(version), container_path: asset_path
  end
end

#asset_volume_argsObject



67
68
69
# File 'lib/kamal/configuration/role.rb', line 67

def asset_volume_args
  asset_volume&.docker_args
end

#asset_volume_path(version = nil) ⇒ Object



168
169
170
# File 'lib/kamal/configuration/role.rb', line 168

def asset_volume_path(version = nil)
  File.join config.run_directory, "assets", "volumes", container_name(version)
end

#assets?Boolean

Returns:

  • (Boolean)


153
154
155
# File 'lib/kamal/configuration/role.rb', line 153

def assets?
  asset_path.present? && running_traefik?
end

#cmdObject



25
26
27
# File 'lib/kamal/configuration/role.rb', line 25

def cmd
  specializations["cmd"]
end

#container_name(version = nil) ⇒ Object



140
141
142
# File 'lib/kamal/configuration/role.rb', line 140

def container_name(version = nil)
  [ container_prefix, version || config.version ].compact.join("-")
end

#container_prefixObject



144
145
146
# File 'lib/kamal/configuration/role.rb', line 144

def container_prefix
  [ config.service, name, config.destination ].compact.join("-")
end

#cord_container_directoryObject



131
132
133
# File 'lib/kamal/configuration/role.rb', line 131

def cord_container_directory
  health_check_options.fetch("cord", nil)
end

#cord_container_fileObject



135
136
137
# File 'lib/kamal/configuration/role.rb', line 135

def cord_container_file
  File.join cord_volume.container_path, CORD_FILE
end

#cord_host_directoryObject



115
116
117
# File 'lib/kamal/configuration/role.rb', line 115

def cord_host_directory
  File.join config.run_directory_as_docker_volume, "cords", [ container_prefix, config.run_id ].join("-")
end

#cord_host_fileObject



127
128
129
# File 'lib/kamal/configuration/role.rb', line 127

def cord_host_file
  File.join cord_volume.host_path, CORD_FILE
end

#cord_volumeObject



119
120
121
122
123
124
125
# File 'lib/kamal/configuration/role.rb', line 119

def cord_volume
  if (cord = health_check_options["cord"])
    @cord_volume ||= Kamal::Configuration::Volume.new \
      host_path: File.join(config.run_directory, "cords", [ container_prefix, config.run_id ].join("-")),
      container_path: cord
  end
end

#env(host) ⇒ Object



58
59
60
61
# File 'lib/kamal/configuration/role.rb', line 58

def env(host)
  @envs ||= {}
  @envs[host] ||= [ base_env, specialized_env, *env_tags(host).map(&:env) ].reduce(:merge)
end

#env_args(host) ⇒ Object



63
64
65
# File 'lib/kamal/configuration/role.rb', line 63

def env_args(host)
  env(host).args
end

#env_tags(host) ⇒ Object



21
22
23
# File 'lib/kamal/configuration/role.rb', line 21

def env_tags(host)
  tagged_hosts.fetch(host).collect { |tag| config.env_tag(tag) }
end

#health_check_args(cord: true) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/kamal/configuration/role.rb', line 72

def health_check_args(cord: true)
  if health_check_cmd.present?
    if cord && uses_cord?
      optionize({ "health-cmd" => health_check_cmd_with_cord, "health-interval" => health_check_interval })
        .concat(cord_volume.docker_args)
    else
      optionize({ "health-cmd" => health_check_cmd, "health-interval" => health_check_interval })
    end
  else
    []
  end
end

#health_check_cmdObject



85
86
87
# File 'lib/kamal/configuration/role.rb', line 85

def health_check_cmd
  health_check_options["cmd"] || http_health_check(port: health_check_options["port"], path: health_check_options["path"])
end

#health_check_cmd_with_cordObject



89
90
91
# File 'lib/kamal/configuration/role.rb', line 89

def health_check_cmd_with_cord
  "(#{health_check_cmd}) && (stat #{cord_container_file} > /dev/null || exit 1)"
end

#health_check_intervalObject



93
94
95
# File 'lib/kamal/configuration/role.rb', line 93

def health_check_interval
  health_check_options["interval"] || "1s"
end

#hostsObject



17
18
19
# File 'lib/kamal/configuration/role.rb', line 17

def hosts
  tagged_hosts.keys
end

#label_argsObject



41
42
43
# File 'lib/kamal/configuration/role.rb', line 41

def label_args
  argumentize "--label", labels
end

#labelsObject



37
38
39
# File 'lib/kamal/configuration/role.rb', line 37

def labels
  default_labels.merge(traefik_labels).merge(custom_labels)
end

#logging_argsObject



45
46
47
48
49
50
51
52
53
54
55
# File 'lib/kamal/configuration/role.rb', line 45

def logging_args
  args = config.logging || {}
  args.deep_merge!(specializations["logging"]) if specializations["logging"].present?

  if args.any?
    optionize({ "log-driver" => args["driver"] }.compact) +
      argumentize("--log-opt", args["options"])
  else
    config.logging_args
  end
end

#option_argsObject



29
30
31
32
33
34
35
# File 'lib/kamal/configuration/role.rb', line 29

def option_args
  if args = specializations["options"]
    optionize args
  else
    []
  end
end

#primary?Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/kamal/configuration/role.rb', line 106

def primary?
  self == @config.primary_role
end

#primary_hostObject



13
14
15
# File 'lib/kamal/configuration/role.rb', line 13

def primary_host
  hosts.first
end

#running_traefik?Boolean

Returns:

  • (Boolean)


98
99
100
101
102
103
104
# File 'lib/kamal/configuration/role.rb', line 98

def running_traefik?
  if specializations["traefik"].nil?
    primary?
  else
    specializations["traefik"]
  end
end

#uses_cord?Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/kamal/configuration/role.rb', line 111

def uses_cord?
  running_traefik? && cord_volume && health_check_cmd.present?
end