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.



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

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

Instance Attribute Details

#nameObject

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



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

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

#asset_pathObject



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

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

#asset_volume(version = nil) ⇒ Object



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

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



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

def asset_volume_args
  asset_volume&.docker_args
end

#asset_volume_path(version = nil) ⇒ Object



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

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

#assets?Boolean

Returns:

  • (Boolean)


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

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

#cmdObject



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

def cmd
  specializations["cmd"]
end

#container_name(version = nil) ⇒ Object



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

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

#container_prefixObject



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

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

#cord_container_directoryObject



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

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

#cord_container_fileObject



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

def cord_container_file
  File.join cord_volume.container_path, CORD_FILE
end

#cord_host_directoryObject



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

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

#cord_host_fileObject



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

def cord_host_file
  File.join cord_volume.host_path, CORD_FILE
end

#cord_volumeObject



108
109
110
111
112
113
114
# File 'lib/kamal/configuration/role.rb', line 108

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



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

def env
  if config.env && config.env["secret"]
    merged_env_with_secrets
  else
    merged_env
  end
end

#env_argsObject



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

def env_args
  argumentize "--env-file", host_env_file_path
end

#env_fileObject



48
49
50
# File 'lib/kamal/configuration/role.rb', line 48

def env_file
  Kamal::EnvFile.new(env)
end

#health_check_args(cord: true) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/kamal/configuration/role.rb', line 69

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



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

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



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

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

#health_check_intervalObject



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

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

#host_env_directoryObject



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

def host_env_directory
  File.join config.host_env_directory, "roles"
end

#host_env_file_pathObject



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

def host_env_file_path
  File.join host_env_directory, "#{[config.service, name, config.destination].compact.join("-")}.env"
end

#hostsObject



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

def hosts
  @hosts ||= extract_hosts_from_config
end

#label_argsObject



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

def label_args
  argumentize "--label", labels
end

#labelsObject



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

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

#option_argsObject



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

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

#primary_hostObject



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

def primary_host
  hosts.first
end

#running_traefik?Boolean

Returns:

  • (Boolean)


95
96
97
# File 'lib/kamal/configuration/role.rb', line 95

def running_traefik?
  name.web? || specializations["traefik"]
end

#uses_cord?Boolean

Returns:

  • (Boolean)


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

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