Puppet selenium Module
Table of Contents
Overview
Manages Selenium Server 2 - Standalone and Grid
Description
This is a puppet module for installation and configuration of the Selenium
Server 2 browser
automation package. Support is provided for configuring Selenium Server in
standalone
mode or as a Selenium grid
with composed of the hub
and node
modes.
The design intent of this module is to only manage Selenium server and not any of the other packages that might be required to required to create a selenium server profile/role.
Usage
The selenium::server
class is used to setup a standalone
Selenium instance
to allow the use of a single server as a test node. The selenium::hub
class
acts as a proxy in front of one or more selenium::node
instances. A hub +
node(s) setup is referred to as a Selenium grid
. Running selenium::server
is
similar to creating a Selenium grid
by declaring selenium::hub
and
selenium::node
on the same host.
It is highly recommend that you read the Selenium Grid documentation to determine what the best approach for your usage case(s) is.
Simple
Stand alone server setup with display :99
(default is :0
).
class { 'selenium::server': display => ':99' }
Grid in a box setup with the Selenium node
talking to the hub
via
127.0.0.1
.
class { 'selenium::hub': }
class { 'selenium::node': }
Example "profiles"/"roles"
Here are some examples "profiles" and "roles" based on Craig Dunn's blog post on Designing Puppet – Roles and Profiles..
These examples assume the presence of these two modules in your Puppet environment.
Selenium Server Profile
class mysite::profile::seleniumserver {
include java
# WSXGA+ 1680x1050 -- should nicely fit on a 1920x1280 screen
class { 'display':
width => 1680,
height => 1050,
} ->
class { 'selenium::server': }
Class['java'] -> Class['selenium::server']
}
Selenium Hub Profile
class mysite::profile::seleniumhub {
include java
class { 'selenium::hub': }
Class['java'] -> Class['selenium::hub']
}
Selenium Node Profile
class mysite::profile::seleniumnode {
include java
# WSXGA+ 1680x1050 -- should nicely fit on a 1920x1280 screen
class { 'display':
width => 1680,
height => 1050,
} ->
class { 'selenium::node':
# If your intending to have node(s) that don't sit on the same system as
# the hub, you need to point the node at a hub by passing in the hub's url
# in or using an exported resource from the hub system. Eg.
# hub => 'http://<myseleniumhub>:4444/grid/register',
}
Class['java'] -> Class['selenium::node']
}
Selenium Server Role
class mysite::role::seleniumserver {
include mysite::profile::seleniumserver
}
Selenium Hub Role
class mysite::role::seleniumhub {
include mysite::profile::seleniumhub
include mysite::profile::seleniumnode
}
Files
Unless class selenium
has $install_root
changed from the default, these
files paths will be used. Note that the log files and init scripts are only
created for the relevant configured service.
The log files are set to mode 0644
, so that they can be inspected by users
other than the selenium role account.
/opt/selenium
|-- jars
| `-- selenium-server-standalone-x.xx.x.jar
`-- log
|-- hub_stderr.log
|-- hub_stdout.log
|-- node_stderr.log
|-- node_stdout.log
|-- server_stderr.log
`-- server_stdout.log
/var/log/selenium -> /opt/selenium/log
/etc/init.d/seleniumhub
/etc/init.d/seleniumnode
/etc/init.d/seleniumserver
Classes
selenium
This class controls common configuration values used by the
selenium::{server,hub,node}
classes. It is automatically included in the
manifest by those classes and it need not be explicitly declared except to
override the default values.
# defaults
class { 'selenium':
user => 'selenium',
manage_user => true,
group => 'selenium',
manage_group => true,
install_root => '/opt/selenium',
java => 'java',
version => '2.45.0',
url => undef,
download_timeout => '90',
nocheckcertificate => false,
manage_logrotate => true,
manage_installation => true,
}
user
String
defaults to: selenium
The name/uid of the system role account to execute the server process under and will have ownership of files.
manage_user
Boolean
defaults to: true
Whether or not this module should manage the system role account to execute the server process under.
group
String
defaults to: selenium
The group/gid of the system role account and group ownership of files.
manage_group
Boolean
defaults to: true
Weather or not this module should manage the group of the system role account.
install_root
String
defaults to: /opt/selenium
The dirname under which Selenium Server files (including logs) will be created.
java
String
defaults to: java
The path of the java
interpreter to use.
version
String
defaults to: 2.45.0
(the latest release as of 2015-05-23)
The version of Selenium Server to download. Used to form the URL used to fetch the jar file.
url
String
defaults to: undef
If defined, url
will be used to download the Selenium Server jar file.
However, the version
parameter just match the version of the downloaded file
as this information is needed when starting up the server (this may change to
be be automatically parsed from the url
in a later release).
download_timeout
String
defaults to: 90
Timeout to download of the package.
nocheckcertificate
Boolean
defaults to: false
Disables validation of the x509 certificate the Selenium jar file is retrieved from.
manage_logrotate
Boolean
defaults to: true
Uses the Logrotate module to rotate the log file of Selenium.
manage_installation
Boolean
defaults to: true
Let the module handle the installation of the Selenium jar file.
selenium::server
# defaults
class { 'selenium::server':
display => ':0',
options => '-Dwebdriver.enable.native.events=1',
classpath => ['/custom/lib1.jar', '/custom/lib2.jar'],
}
display
String
defaults to: :0
The name of the X
display to render too. This is set as an environment
variable passed to Selenium Server
options
String
defaults to: -Dwebdriver.enable.native.events=1
Options passed to Selenium Server at startup.
classpath
Array
defaults to: []
Optional classpath to pass to Selenium Server at startup. If this array is empty Selenium will be started with '-jar /path/to/selenium.jar', if not empty Selenium will be started with '-cp /path/to/selenium.jar: org.openqa.grid.selenium.GridLauncher' See http://www.seleniumhq.org/docs/07_selenium_grid.jsp#customizing-the-grid
selenium::hub
Note that by default selenium::server
and selenium::hub
will try to listen
on the same TCP port (4444
) and only one of them will be able to function.
# defaults
class { 'selenium::hub':
options => '-role hub',
classpath => ['/custom/lib1.jar', '/custom/lib2.jar'],
}
options
String
defaults to: -role hub
Options passed to Selenium Server Hub at startup.
classpath
Array
defaults to: []
Optional classpath to pass to Selenium Server Hub at startup. If this array is empty Selenium will be started with '-jar /path/to/selenium.jar', if not empty Selenium will be started with '-cp /path/to/selenium.jar: org.openqa.grid.selenium.GridLauncher' See http://www.seleniumhq.org/docs/07_selenium_grid.jsp#customizing-the-grid
selenium::node
# defaults
class { 'selenium::node':
display => ':0',
options => '-Dwebdriver.enable.native.events=1 -role node',
hub => 'http://localhost:4444/grid/register',
classpath => ['/custom/lib1.jar', '/custom/lib2.jar'],
}
display
String
defaults to: :0
The name of the X
display to render too. This is set as an environment
variable passed to Selenium Server
options
String
defaults to: -Dwebdriver.enable.native.events=1 -role node
Options passed to Selenium Server Node at startup.
hub
String
defaults to: http://localhost:4444/grid/register
The URL of the Selenium Server Hub to connect to.
classpath
Array
defaults to: []
Optional classpath to pass to Selenium Server Node at startup. If this array is empty Selenium will be started with '-jar /path/to/selenium.jar', if not empty Selenium will be started with '-cp /path/to/selenium.jar: org.openqa.grid.selenium.GridLauncher' See http://www.seleniumhq.org/docs/07_selenium_grid.jsp#customizing-the-grid
Why Another Module?
At the time work on this module was started, there were no other Selenium Server modules published on the Puppet Forge. A number of existing modules were identified on github but none of them fit the author's needs of:
- Allowing the external setup of things like
Xvfb
,java
, etc. and to allow the composition of site specific profiles/roles. - Supporting a mixed environment of Scientific, Centos, and RedHat Linux
(basically
$::osfamily == 'RedHat'
- Enough
rspec-puppet
coverage to prevent regressions
The later is the most important issue. Attempting to add additional
$::operatingsystem/$::osfamily
support to a puppet module without
rspec-puppet
tests is a process fraught with peril.
The modules that were identified were:
- adamgoucher/selenium-puppet
- Mostly aimed at Windows but with some Linux/POSIX support
- no
rspec-puppet
tests (deal breaker)
- StoryIQ/puppet-selenium-grid
- Debian only
- no
rspec-puppet
tests (deal breaker)
- kayakco/puppet-selenium
- Unreleased deps (deal breaker)
- Very role like with lots of magic setup (deal breaker)
- debian-ish (may support Centos)
- Doesn't appear to be in a ready state
Limitations
Tested Platforms
- el6.x
- el7.x
- Debian 7
- Ubuntu 12.04
- Ubuntu 14.04
Puppet Version Compatibility
Versions | Puppet 2.7 | Puppet 3.x | Puppet 4.x |
---|---|---|---|
0.x | yes | yes | no |
1.x | no | yes | yes |
Certificate Errors
A number of users have reported "certificate validation errors" when this
module downloads the Selenium jar file. The most likely explanation is that
the CA certificates on that node are out of date. It may also be an
indication of a MITM attack on the TLS connection. Certificate validation
errors do not occur on the nodesets used for acceptance tests. The
nocheckcertificate
param may be set to true
to
bypass this error but be sure the security implications of this setting are
well understood before enabling it.
Versioning
This module is versioned according to the Semantic Versioning 2.0.0 specification.
Support
Please log tickets and issues at github
Contributing
- Fork it on github
- Make a local clone of your fork
- Create a topic branch. Eg,
feature/mousetrap
- Make/commit changes
- Commit messages should be in imperative tense
- Check that linter warnings or errors are not introduced -
bundle exec rake lint
- Check that
Rspec-puppet
unit tests are not broken and coverage is added for new features -bundle exec rake spec
- Documentation of API/features is updated as appropriate in the README
- If present,
beaker
acceptance tests should be run and potentially updated -bundle exec rake beaker
- When the feature is complete, rebase / squash the branch history as necessary to remove "fix typo", "oops", "whitespace" and other trivial commits
- Push the topic branch to github
- Open a Pull Request (PR) from the topic branch onto parent repo's
master
branch