Module: Kdeploy::DSL

Included in:
CLI
Defined in:
lib/kdeploy/dsl.rb

Overview

Domain-specific language for defining hosts, roles, and tasks

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object



8
9
10
11
12
# File 'lib/kdeploy/dsl.rb', line 8

def self.extended(base)
  base.instance_variable_set(:@kdeploy_hosts, {})
  base.instance_variable_set(:@kdeploy_tasks, {})
  base.instance_variable_set(:@kdeploy_roles, {})
end

Instance Method Details

#add_explicit_hosts(task, hosts) ⇒ Object



104
105
106
107
108
# File 'lib/kdeploy/dsl.rb', line 104

def add_explicit_hosts(task, hosts)
  task[:hosts]&.each do |host|
    hosts.add(host) if kdeploy_hosts.key?(host)
  end
end

#add_role_hosts(task, hosts) ⇒ Object



110
111
112
113
114
115
116
117
118
119
# File 'lib/kdeploy/dsl.rb', line 110

def add_role_hosts(task, hosts)
  task[:roles]&.each do |role|
    role_hosts = kdeploy_roles[role]
    next unless role_hosts

    role_hosts.each do |host|
      hosts.add(host) if kdeploy_hosts.key?(host)
    end
  end
end

#create_task_block(block) ⇒ Object



58
59
60
61
62
63
64
# File 'lib/kdeploy/dsl.rb', line 58

def create_task_block(block)
  lambda {
    @kdeploy_commands = []
    instance_eval(&block)
    @kdeploy_commands
  }
end

#get_task_hosts(task_name) ⇒ Object



90
91
92
93
94
95
96
97
98
# File 'lib/kdeploy/dsl.rb', line 90

def get_task_hosts(task_name)
  task = kdeploy_tasks[task_name]
  return kdeploy_hosts.keys if task_empty?(task)

  hosts = Set.new
  add_explicit_hosts(task, hosts)
  add_role_hosts(task, hosts)
  hosts.to_a
end

#host(name, **options) ⇒ Object



26
27
28
# File 'lib/kdeploy/dsl.rb', line 26

def host(name, **options)
  kdeploy_hosts[name] = options.merge(name: name)
end

#inventory(&block) ⇒ Object



86
87
88
# File 'lib/kdeploy/dsl.rb', line 86

def inventory(&block)
  instance_eval(&block) if block_given?
end

#kdeploy_hostsObject



14
15
16
# File 'lib/kdeploy/dsl.rb', line 14

def kdeploy_hosts
  @kdeploy_hosts ||= {}
end

#kdeploy_rolesObject



22
23
24
# File 'lib/kdeploy/dsl.rb', line 22

def kdeploy_roles
  @kdeploy_roles ||= {}
end

#kdeploy_tasksObject



18
19
20
# File 'lib/kdeploy/dsl.rb', line 18

def kdeploy_tasks
  @kdeploy_tasks ||= {}
end

#normalize_hosts_option(on) ⇒ Object



42
43
44
45
46
47
48
# File 'lib/kdeploy/dsl.rb', line 42

def normalize_hosts_option(on)
  return on if on.is_a?(Array)

  return [on] if on

  nil
end

#normalize_roles_option(roles) ⇒ Object



50
51
52
53
54
55
56
# File 'lib/kdeploy/dsl.rb', line 50

def normalize_roles_option(roles)
  return roles if roles.is_a?(Array)

  return [roles] if roles

  nil
end

#role(name, hosts) ⇒ Object



30
31
32
# File 'lib/kdeploy/dsl.rb', line 30

def role(name, hosts)
  kdeploy_roles[name] = hosts
end

#run(command, sudo: nil) ⇒ Object



66
67
68
69
# File 'lib/kdeploy/dsl.rb', line 66

def run(command, sudo: nil)
  @kdeploy_commands ||= []
  @kdeploy_commands << { type: :run, command: command, sudo: sudo }
end

#task(name, on: nil, roles: nil, &block) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/kdeploy/dsl.rb', line 34

def task(name, on: nil, roles: nil, &block)
  kdeploy_tasks[name] = {
    hosts: normalize_hosts_option(on),
    roles: normalize_roles_option(roles),
    block: create_task_block(block)
  }
end

#task_empty?(task) ⇒ Boolean

Returns:

  • (Boolean)


100
101
102
# File 'lib/kdeploy/dsl.rb', line 100

def task_empty?(task)
  !task || (!task[:hosts] && !task[:roles])
end

#upload(source, destination) ⇒ Object



71
72
73
74
# File 'lib/kdeploy/dsl.rb', line 71

def upload(source, destination)
  @kdeploy_commands ||= []
  @kdeploy_commands << { type: :upload, source: source, destination: destination }
end

#upload_template(source, destination, variables = {}) ⇒ Object



76
77
78
79
80
81
82
83
84
# File 'lib/kdeploy/dsl.rb', line 76

def upload_template(source, destination, variables = {})
  @kdeploy_commands ||= []
  @kdeploy_commands << {
    type: :upload_template,
    source: source,
    destination: destination,
    variables: variables
  }
end