Scalarm Experiment Manager is the main component of the Scalarm platform for data farming.
Switch branches/tags
Clone or download
Latest commit ceafa98 Sep 24, 2017
Failed to load latest commit information.
app Issue-180 Copying hacky changes from current production docker image Sep 24, 2017
bin Info about GSISSH CRL and update script Mar 1, 2016
config Removing RinRuby creation from application.rb May 4, 2017
db New rails 4 based version. Nov 27, 2013
doc Documentation: preparing for YARD and apiDoc coexistence Nov 24, 2015
lib New rails 4 based version. Nov 27, 2013
log .gitignore updates Nov 8, 2014
public SCAL-1236: Removing simulation manaeger ruby fetch tasks invoked by d… Apr 6, 2016
r_libs SCAL-347 - if AlgDesign library missing, initializer installs it in r… Dec 16, 2014
test Issue-180 Copying hacky changes from current production docker image Sep 24, 2017
test_end_to_end SCAL-1145: changing rescue "Exception => e" to "rescue => e" May 18, 2016
test_old SCAL-1145: changing rescue "Exception => e" to "rescue => e" May 18, 2016
vendor/assets Showing host info and performance statistics about executed simulatio… Feb 17, 2017
.gitignore Adding sample mongoid configuration. Feb 19, 2017
.gitmodules SCAL-450: Using external simulation managers and monitoring git and b… Nov 26, 2014
.travis.yml Update .travis.yml Aug 4, 2017
Dockerfile Issue-180 Removing passenger as in hacky production docker image Sep 24, 2017
Gemfile EXPERIMENTAL: Using minitest and ci reporter outside test group in Ge… Aug 4, 2017
Gemfile.lock EXPERIMENTAL: Using minitest and ci reporter outside test group in Ge… Aug 4, 2017
LICENSE Updating copyrigth notice (2016) Apr 6, 2016 Update Aug 4, 2017
README.rdoc New rails 4 based version. Nov 27, 2013
Rakefile Adding service for managing infrastructure monitoring. May 6, 2017
apidoc.json Documentation: preparing for YARD and apiDoc coexistence Nov 24, 2015 SCAL-738 HOTFIX: fixed May 27, 2015 SCAL-620 Setting default branch when TREE variable is not specified. Mar 3, 2015 New rails 4 based version. Nov 27, 2013 Using amd64 as default version of monitoring and Sim. Mar 8, 2017 SCAL-1103: Getting OSX simulation managers Nov 23, 2015

Build Status Codacy Badge

Scalarm Logo

Scalarm Experiment Manager

Experiment Manager is the main component of the Scalarm platform. It provides core functionalities and User Interfaces necessary to conduct data farming experiments according to the following workflow:

  • input parameter space definition,
  • simulations execution (scheduling workers onto Clouds, Grids, etc.)
  • monitoring the experiment progress and extending the initial parameter space if necessary,
  • analyse results of the finished simulations.

Running with Docker

To run core Scalarm functionality with no headache you can use Docker. Scalarm has two external dependencies: MongoDB and Redis. You can run everything with a few commands:

docker run -d --rm --name scalarm-mongo -v $HOME/scalarm-db:/data/db mongo:3.4.1 --storageEngine wiredTiger

keep in mind that if you move from previous version you may need to use previous storageEngine - mmapv1.

docker run -d --rm --name scalarm-redis redis

To run Scalarm you need to provide 2 configuration files: secrets.yml and mongoid.yml . Take a look at examples in the config folder. You can run Scalarm Experiment Manager with the following command, cnce config files are ready in your current directory.

docker run --rm -p 3000:3000 --name scalarm --link scalarm-mongo:mongo --link scalarm-redis:redis -v $PWD/secrets.yml:/scalarm/config/secrets.yml -v $PWD/mongoid.yml:/scalarm/config/mongoid.yml dkrol3/scalarm:latest

You can set RAILS_ENV to production if you intend to use it heavily. In this case please use https and a reverse proxy like NGINX.

To run Scalarm tests use the following command on your running Scalarm container:

 docker exec -it scalarm bash -c "source /etc/profile; rake test"

Developer notes

To run the services you need to fulfill the following requirements:

Ruby version

Currently we use and test Scalarm against MRI 2.3.x but other Ruby versions should be good as well.

Please install Ruby with RVM as described on

\curl -sSL | bash -s stable --ruby=2.3

Follow installation instructrions and reload shell on the end if necessary.

System dependencies

  • curl
  • R
  • gsissh
  • sysstat (mpstat/iostat)
  • any dependency required by native gems

Optionally you will need also mongos, but it will be fetched automatically if it's not found and if you use "rake db_router:setup".

Some requirements will be installed by rvm also during ruby installation.

Specific distributions


Add Globus Toolkit repository to enable grid support:

Then use this one-liner to install dependencies:

sudo apt-get update && sudo apt-get install curl r-base-core sysstat gsi-openssh-clients


For SL 6.4 you need to add nginx repo and then install:

yum install git vim nginx wget man libxml2 sqlite sqlite-devel R curl sysstat


You can download it directly from GitHub

git clone

After downloading the code you just need to install gem requirements:

cd scalarm_experiment_manager
bundle install

if any dependency is missing you will be noticed :)

To check if all dependencies are meet, and install Scalarm external modules please use:

rake db_router:setup
rake service:setup


There are two files with configuration: config/secrets.yml and config/puma.rb.

The "secrets.yml" file is a standard configuration file added in Rails 4 to have a single place for all secrets in an application. We used this approach in our Scalarm platform. Experiment Manager stores access data to Information Service in this file:

default: &DEFAULT
  ## cookies enctyption key - set the same in each ExperimentManager to allow cooperation
  secret_key_base: "<you need to change this - with $rake secret>"

  ## InformationService - a service locator
  information_service_url: "localhost:11300"
  information_service_user: "<set to custom name describing your Scalarm instance>"
  information_service_pass: "<generate strong password instead of this>"
  ## uncomment, if you want to communicate through HTTP with Scalarm Information Service
  # information_service_development: true

  ## Database configuration
  ## name of MongoDB database, it is scalarm_db by default
  db_name: 'scalarm_db'
  ## key for symmetric encryption of secret database data - please change it in production installations!
  ## NOTICE: this key should be set ONLY ONCE BEFORE first run - if you change or lost it, you will be UNABLE to read encrypted data!
  db_secret_key: "QjqjFK}7|Xw8DDMUP-O$yp"

  ## Uncomment, if you want to communicate through HTTP with Scalarm Storage Manager
  # storage_manager_development: true

  ## Configuration of optional Scalarm LoadBalancer (
      # if you installed and want to use scalarm custom load balancer set to false
      disable_registration: true
      # if you use load balancer you need to specify multicast address (to receive load balancer address)
      #multicast_address: ""
      # if you use load balancer on http you need to specify this
      #development: true
      # if you want to register service in load balancer with other host than default
      #host: localhost
      # if you want to run and register service in load balancer on other port than default
      #port: "3000"

  ## Uncomment "anonymous_user" block to create and use default user
  #    login: 'anonymous'
  #    password: 'anonymous'

  ## Configuration of ExperimentManager machine monitoring, uncomment to enable
  #  db_name: 'scalarm_monitoring'
  #  interval: 30
  #  metrics: 'cpu'

  ## CA/certificate path of ExperimentManager server to allow secure communication to it
  ## from other services
  #certificate_path: "/path/to/ca_for_information_service.pem"
  ## If you use HTTPS connections but don't have valid certificates (eg. self-signed)
  #insecure_ssl: true

  ## if you want to communicate with Storage Manager using a different URL than the one stored in Information Service
  #storage_manager_url: "localhost:20000"
  ## if you want to pass to Simulation Manager a different URL of Information Service than the one mentioned above
  #sm_information_service_url: "localhost:37128"

  <<: *DEFAULT
  ## In production environments some settings should not be stored in configuration file
  ## for security reasons.

  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  information_service_url: "<%= ENV["INFORMATION_SERVICE_URL"] %>"
  information_service_user: "<%= ENV["INFORMATION_SERVICE_LOGIN"] %>"
  information_service_pass: "<%= ENV["INFORMATION_SERVICE_PASSWORD"] %>"
    db_secret_key: "<%= ENV["DB_SECRET_KEY"] %>"

  <<: *DEFAULT

  <<: *DEFAULT

The example file is placed in config/secrets.yml.example and will be copied to config/secrets.yml if there is no configuration.

In the "config/puma.rb" configuration of the PUMA web server is stored:

bind 'unix:///tmp/scalarm_experiment_manager.sock'

threads 1,8

pidfile ''
stdout_redirect 'log/puma.log', 'log/puma.log.err', true

The example file is places in config/puma.rb.example and will be copied to config/puma.rb if there is no configuration.

To start/stop the service you can use the provided Rakefile:

export RAILS_ENV=production
rake service:start
rake service:stop

Please remember to set RAILS_ENV=production when running in the production mode.

Before the first start (in the production mode) of the service you need to compile assets:

rake service:non_digested

With the configuration as above Experiment Manager will be listening on linux socket. To make it available for other services we will use a HTTP server - nginx - which will also handle SSL.

To configure NGINX you basically need to add some information to NGINX configuration, e.g. in the /etc/nginx/conf.d/default.conf file.

upstream scalarm_experiment_manager {
  server unix:/tmp/scalarm_experiment_manager.sock;

server {
  listen 443 ssl default_server;
  client_max_body_size 0;

  ssl_certificate /etc/nginx/server.crt;
  ssl_certificate_key /etc/nginx/server.key;

  ssl_verify_client optional;
  ssl_client_certificate /etc/grid-security/certificates/PolishGrid.pem;
  ssl_verify_depth 5;
  ssl_session_timeout 30m;

  location / {
    proxy_pass http://scalarm_experiment_manager;

    proxy_set_header SSL_CLIENT_S_DN $ssl_client_s_dn;
    proxy_set_header SSL_CLIENT_I_DN $ssl_client_i_dn;
    proxy_set_header SSL_CLIENT_VERIFY $ssl_client_verify;
    proxy_set_header SSL_CLIENT_CERT $ssl_client_cert;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto https; # New header for SSL

# it is also needed to force HTTPS
server {
  listen 80;
  return 301 https://$host$request_uri;

One last thing to do is to register Experiment Manager in the Scalarm Information Service. With the presented configuration (and assuming we are working on a hypothetical IP address we just need to:

curl -k -u scalarm:scalarm --data "address=" https://localhost:11300/experiment_managers

When running in a production-like environment set the SECRET_KEY_BASE environment variable to the value generated by:

rake secret

In production mode, some options are read from environmental variables. For above configuration files, that can be for example:

export SECRET_KEY_BASE="<a value generated by rake secret>"
export INFORMATION_SERVICE_URL="localhost:11300"
export INFORMATION_SERVICE_PASSWORD="some_secret_password"
export DB_SECRET_KEY="some_secret_keys_used_for_db_encryption"

To check if Experiment Manager has been installed correctly just start the service and open a web browser and go the login page:



Every time you want to update this service, please shut down service with rake service:stop update git repository with git pull and get new Scalarm external packages with rake service:update. Then You can start service with git service:start.

Building Scalarm external modules manually (optional)

Instead of using precompiled binaries, you can build Scalarm Simulation Manager and Scalarm Monitoring packages.

Needed dependencies:

To fetch codes from git and start build, use:

rake build:all