Module: Beaker::DSL::Roles

Included in:
Beaker::DSL
Defined in:
lib/beaker/dsl/roles.rb

Overview

Identifying hosts.

This aids in reaching common subsets of hosts in a testing matrix.

It requires the class it is mixed into to provide the attribute ‘hosts` which contain the hosts to search, these should implement Host’s interface. They, at least, must have #[] and #to_s available and provide an array when #[](‘roles’) is called.

Also the constant Outcomes::FailTest needs to be defined it will be raised in error conditions

Instance Method Summary collapse

Instance Method Details

#add_role(host, role) ⇒ Object

Add the provided role to the host

Parameters:

  • host (Host)

    Host to add role to

  • role (String)

    The role to add to host



159
160
161
# File 'lib/beaker/dsl/roles.rb', line 159

def add_role(host, role)
  host[:roles] = host[:roles] | [role]
end

#add_role_def(role) ⇒ Object

Create a new role method for a given arbitrary role name. Makes it possible to be able to run commands without having to refer to role by String or Symbol. Will not add a new method definition if the name is already in use. Symbol or an Array of Strings or Symbols.

Examples:

Basic usage

add_role_def('myrole')
on myrole, "run command"

Parameters:

  • role (String, Symbol, Array[String,Symbol])

    The role that you wish to create a definition for, either a String



171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/beaker/dsl/roles.rb', line 171

def add_role_def role
  if role.is_a?(Array)
    role.each do |r|
      add_role_def r
    end
  elsif not respond_to? role
    if !/\A[[:alpha:]]+[a-zA-Z0-9_]*[!?=]?\Z/.match?(role)
      raise ArgumentError, "Role name format error for '#{role}'.  Allowed characters are: \na-Z\n0-9 (as long as not at the beginning of name)\n'_'\n'?', '!' and '=' (only as individual last character at end of name)"
    end

    self.class.send :define_method, role.to_s do
      hosts_with_role = hosts_as role.to_sym
      hosts_with_role = hosts_with_role.pop if hosts_with_role.length == 1
      hosts_with_role
    end
  end
end

#agent_only(host) ⇒ Boolean

Determine if this host is exclusively an agent (only has a single role ‘agent’)

Examples:

Basic usage

if agent_only(host)
  puts "this host is ONLY an agent!"
end

Parameters:

  • host (Host)

    Beaker host to check

Returns:

  • (Boolean)

    True if agent-only, false otherwise



117
118
119
# File 'lib/beaker/dsl/roles.rb', line 117

def agent_only(host)
  host['roles'].length == 1 && host['roles'].include?('agent')
end

#agentsArray<Host>

The hosts for which [‘roles’] include ‘agent’

Examples:

Basic usage

agents.each do |agent|
  ...test each agent in turn...
end

Returns:

  • (Array<Host>)

    May be empty



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

def agents
  hosts_as 'agent'
end

#aio_agent?(host) ⇒ Boolean

Determine if the host is an AIO agent

Parameters:

  • host (Host)

    Beaker host to check

Returns:

  • (Boolean)

    whether this host is an AIO agent or not



151
152
153
# File 'lib/beaker/dsl/roles.rb', line 151

def aio_agent?(host)
  aio_version?(host) && agent_only(host)
end

#aio_version?(host) ⇒ Boolean

Note:

aio version is just a base-line condition. If you want to check that a host is an aio agent, refer to #aio_agent?.

Determine whether a host has an AIO version or not. If a host :pe_ver or :version is not specified, then either the ‘aio’ role or type will be needed for a host to be the AIO version.

True if host has

* PE version (:pe_ver) >= 4.0
* FOSS version (:version) >= 4.0
* the role 'aio'
* the type 'aio'

Returns:

  • (Boolean)

    whether or not a host is AIO-capable



135
136
137
138
139
140
141
142
143
144
# File 'lib/beaker/dsl/roles.rb', line 135

def aio_version?(host)
  %i[pe_ver version].each do |key|
    version = host[key]
    return !version_is_less(version, '4.0') if version && !version.empty?
  end
  return true if host[:roles] && host[:roles].include?('aio')
  return true if host[:type] && /(\A|-)aio(\Z|-)/.match(host[:type])

  false
end

#any_hosts_as?(role) ⇒ Boolean

Determine if there is a host or hosts with the given role defined if any_hosts_as?(:master)

puts "master is defined"

end

Examples:

Usage

Returns:

  • (Boolean)

    True if there is a host with role, false otherwise



197
198
199
# File 'lib/beaker/dsl/roles.rb', line 197

def any_hosts_as?(role)
  hosts_as(role).length > 0
end

#dashboardHost

The host for which [‘roles’] include ‘dashboard’

Examples:

Basic usage

on, agent, "curl https://#{database}/nodes/#{agent}"

Returns:

  • (Host)

    Returns the host, or nil if not found & masterless

Raises:



69
70
71
# File 'lib/beaker/dsl/roles.rb', line 69

def dashboard
  find_host_with_role :dashboard
end

#databaseHost

The host for which [‘roles’] include ‘database’

Examples:

Basic usage

on, agent, "curl -k http://#{database}:8080"

Returns:

  • (Host)

    Returns the host, or nil if not found & masterless

Raises:



56
57
58
# File 'lib/beaker/dsl/roles.rb', line 56

def database
  find_host_with_role :database
end

#defaultHost

The default host

- if only one host defined, then that host
OR
- host with 'default' as a role
OR
- host with 'master' as a role

Examples:

Basic usage

on, default, "curl https://#{database}/nodes/#{agent}"

Returns:

  • (Host)

    Returns the host, or nil if not found & masterless

Raises:



87
88
89
# File 'lib/beaker/dsl/roles.rb', line 87

def default
  find_host_with_role :default
end

#find_at_most_one(role) ⇒ Host

Returns the host, or nil if not found

Parameters:

  • role (Symbol, String)

    The role to find a host for

Returns:

  • (Host)

    Returns the host, or nil if not found

Raises:

  • Raises a failure exception if more than one host that matches the specified role is found.



247
248
249
250
251
# File 'lib/beaker/dsl/roles.rb', line 247

def find_at_most_one role
  find_at_most_one_host_with_role(hosts, role)
rescue ArgumentError => e
  raise DSL::Outcomes::FailTest, e.to_s
end

#find_host_with_role(role) ⇒ Host

finds the appropriate number of hosts for a given role determines whether to allow no server using the masterless option

Parameters:

  • role (Symbol, String)

    The role to find a host for

Returns:

  • (Host)

    Returns the host, or nil if masterless and none are found for that role

Raises:

  • Throws an exception if an inappropriate number of hosts are found for that role



225
226
227
228
229
230
231
# File 'lib/beaker/dsl/roles.rb', line 225

def find_host_with_role role
  if (defined? options) && options[:masterless]
    find_at_most_one role
  else
    find_only_one role
  end
end

#find_only_one(role) ⇒ Host

Returns the host, if one and only one is found

Parameters:

  • role (Symbol, String)

    The role to find a host for

Returns:

  • (Host)

    Returns the host, if one and only one is found

Raises:

  • Raises a failure exception if one and only one host that matches the specified role is NOT found.



237
238
239
240
241
# File 'lib/beaker/dsl/roles.rb', line 237

def find_only_one role
  only_host_with_role(hosts, role)
rescue ArgumentError => e
  raise DSL::Outcomes::FailTest, e.to_s
end

#hosts_as(desired_role = nil) ⇒ Array<Host>

Select hosts that include a desired role from #hosts

Examples:

Basic usage

hairy = hosts_as :yak
hairy.each do |yak|
  on yak, 'shave'
end

Parameters:

  • desired_role (String, Symbol) (defaults to: nil)

    The role to select for

Returns:

  • (Array<Host>)

    The hosts that match desired_role, may be empty



213
214
215
# File 'lib/beaker/dsl/roles.rb', line 213

def hosts_as(desired_role = nil)
  hosts_with_role(hosts, desired_role)
end

#masterHost

The host for which [‘roles’] include ‘master’. If no host has the ‘master’ role, then use the host defined as ‘default’. If no host is defined as a ‘master’ and there is no ‘default’ host defined then it either raises an error (has a master), or it returns nil (masterless)

Examples:

Basic usage

on, master, 'cat /etc/puppet/puppet.conf'

Returns:

  • (Host)

    Returns the host, or nil if not found & masterless

Raises:



43
44
45
# File 'lib/beaker/dsl/roles.rb', line 43

def master
  find_host_with_role :master
end

#not_controller(host) ⇒ Boolean

Determine if host is not a controller, does not have roles ‘master’, ‘dashboard’ or ‘database’.

Examples:

Basic usage

if not_controller(host)
  puts "this host isn't in charge!"
end

Returns:

  • (Boolean)

    True if agent-only, false otherwise



101
102
103
104
105
# File 'lib/beaker/dsl/roles.rb', line 101

def not_controller(host)
  controllers = %w[dashboard database master console]
  matched_roles = host['roles'].select { |v| controllers.include?(v) }
  matched_roles.length == 0
end