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
-
#add_role(host, role) ⇒ Object
Add the provided role to the host.
-
#add_role_def(role) ⇒ Object
Create a new role method for a given arbitrary role name.
-
#agent_only(host) ⇒ Boolean
Determine if this host is exclusively an agent (only has a single role ‘agent’).
-
#agents ⇒ Array<Host>
The hosts for which [‘roles’] include ‘agent’.
-
#aio_agent?(host) ⇒ Boolean
Determine if the host is an AIO agent.
-
#aio_version?(host) ⇒ Boolean
Determine whether a host has an AIO version or not.
-
#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.
-
#dashboard ⇒ Host
The host for which [‘roles’] include ‘dashboard’.
-
#database ⇒ Host
The host for which [‘roles’] include ‘database’.
-
#default ⇒ Host
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.
-
#find_at_most_one(role) ⇒ Host
Returns the host, or nil if not found.
-
#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.
-
#find_only_one(role) ⇒ Host
Returns the host, if one and only one is found.
-
#hosts_as(desired_role = nil) ⇒ Array<Host>
Select hosts that include a desired role from #hosts.
-
#master ⇒ Host
The host for which [‘roles’] include ‘master’.
-
#not_controller(host) ⇒ Boolean
Determine if host is not a controller, does not have roles ‘master’, ‘dashboard’ or ‘database’.
Instance Method Details
#add_role(host, role) ⇒ Object
Add the provided role to the 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.
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
# File 'lib/beaker/dsl/roles.rb', line 171 def add_role_def role if role.kind_of?(Array) role.each do |r| add_role_def r end else if not respond_to? role if role !~ /\A[[:alpha:]]+[a-zA-Z0-9_]*[!?=]?\Z/ 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 if hosts_with_role.length == 1 hosts_with_role = hosts_with_role.pop end hosts_with_role end end end end |
#agent_only(host) ⇒ Boolean
Determine if this host is exclusively an agent (only has a single role ‘agent’)
118 119 120 |
# File 'lib/beaker/dsl/roles.rb', line 118 def agent_only(host) host['roles'].length == 1 && host['roles'].include?('agent') end |
#agents ⇒ Array<Host>
The hosts for which [‘roles’] include ‘agent’
27 28 29 |
# File 'lib/beaker/dsl/roles.rb', line 27 def agents hosts_as 'agent' end |
#aio_agent?(host) ⇒ Boolean
Determine if the host is an AIO agent
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
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'
136 137 138 139 140 141 142 143 144 |
# File 'lib/beaker/dsl/roles.rb', line 136 def aio_version?(host) [: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] && !!(host[:type] =~ /(\A|-)aio(\Z|-)/ ) 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
200 201 202 |
# File 'lib/beaker/dsl/roles.rb', line 200 def any_hosts_as?(role) hosts_as(role).length > 0 end |
#dashboard ⇒ Host
The host for which [‘roles’] include ‘dashboard’
70 71 72 |
# File 'lib/beaker/dsl/roles.rb', line 70 def dashboard find_host_with_role :dashboard end |
#database ⇒ Host
The host for which [‘roles’] include ‘database’
57 58 59 |
# File 'lib/beaker/dsl/roles.rb', line 57 def database find_host_with_role :database end |
#default ⇒ Host
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
88 89 90 |
# File 'lib/beaker/dsl/roles.rb', line 88 def default find_host_with_role :default end |
#find_at_most_one(role) ⇒ Host
Returns the host, or nil if not found
250 251 252 253 254 |
# File 'lib/beaker/dsl/roles.rb', line 250 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
228 229 230 231 232 233 234 |
# File 'lib/beaker/dsl/roles.rb', line 228 def find_host_with_role role if (defined? ) && [: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
240 241 242 243 244 |
# File 'lib/beaker/dsl/roles.rb', line 240 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
216 217 218 |
# File 'lib/beaker/dsl/roles.rb', line 216 def hosts_as(desired_role = nil) hosts_with_role(hosts, desired_role) end |
#master ⇒ Host
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)
44 45 46 |
# File 'lib/beaker/dsl/roles.rb', line 44 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’.
102 103 104 105 106 |
# File 'lib/beaker/dsl/roles.rb', line 102 def not_controller(host) controllers = ['dashboard', 'database', 'master', 'console'] matched_roles = host['roles'].select { |v| controllers.include?(v) } matched_roles.length == 0 end |