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
# File 'lib/kamal/configuration/role.rb', line 8

def initialize(name, config:)
  @name, @config = name.inquiry, 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



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

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

#asset_pathObject



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

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

#asset_volume(version = nil) ⇒ Object



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

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



61
62
63
# File 'lib/kamal/configuration/role.rb', line 61

def asset_volume_args
  asset_volume&.docker_args
end

#asset_volume_path(version = nil) ⇒ Object



162
163
164
# File 'lib/kamal/configuration/role.rb', line 162

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

#assets?Boolean

Returns:

  • (Boolean)


147
148
149
# File 'lib/kamal/configuration/role.rb', line 147

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

#cmdObject



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

def cmd
  specializations["cmd"]
end

#container_name(version = nil) ⇒ Object



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

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

#container_prefixObject



138
139
140
# File 'lib/kamal/configuration/role.rb', line 138

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

#cord_container_directoryObject



125
126
127
# File 'lib/kamal/configuration/role.rb', line 125

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

#cord_container_fileObject



129
130
131
# File 'lib/kamal/configuration/role.rb', line 129

def cord_container_file
  File.join cord_volume.container_path, CORD_FILE
end

#cord_host_directoryObject



109
110
111
# File 'lib/kamal/configuration/role.rb', line 109

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

#cord_host_fileObject



121
122
123
# File 'lib/kamal/configuration/role.rb', line 121

def cord_host_file
  File.join cord_volume.host_path, CORD_FILE
end

#cord_volumeObject



113
114
115
116
117
118
119
# File 'lib/kamal/configuration/role.rb', line 113

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

#envObject



53
54
55
# File 'lib/kamal/configuration/role.rb', line 53

def env
  @env ||= base_env.merge(specialized_env)
end

#env_argsObject



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

def env_args
  env.args
end

#health_check_args(cord: true) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/kamal/configuration/role.rb', line 66

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



79
80
81
# File 'lib/kamal/configuration/role.rb', line 79

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



83
84
85
# File 'lib/kamal/configuration/role.rb', line 83

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

#health_check_intervalObject



87
88
89
# File 'lib/kamal/configuration/role.rb', line 87

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

#hostsObject



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

def hosts
  @hosts ||= extract_hosts_from_config
end

#label_argsObject



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

def label_args
  argumentize "--label", labels
end

#labelsObject



32
33
34
# File 'lib/kamal/configuration/role.rb', line 32

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

#logging_argsObject



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/kamal/configuration/role.rb', line 40

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



24
25
26
27
28
29
30
# File 'lib/kamal/configuration/role.rb', line 24

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

#primary?Boolean

Returns:

  • (Boolean)


100
101
102
# File 'lib/kamal/configuration/role.rb', line 100

def primary?
  self == @config.primary_role
end

#primary_hostObject



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

def primary_host
  hosts.first
end

#running_traefik?Boolean

Returns:

  • (Boolean)


92
93
94
95
96
97
98
# File 'lib/kamal/configuration/role.rb', line 92

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

#uses_cord?Boolean

Returns:

  • (Boolean)


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

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