Armada Highlights

Manage services on any server from any server.

$ armada run fraud-finder --ship behemot
Running microservice fraud-finder from dockyard: dockyard.initech.com on remote ship: behemot... Service is running in container c803fd8129a7 available at addresses: 192.168.3.141:49168 (80/tcp)
$ armada stop daily-promo-mailing
Stopping microservice daily-promo-mailing... Service has been stopped.

Manage multiple image repositories (development, production etc.).

$ armada dockyard list
Default Alias Address User Password -> dev dockyard.local production dockyard.example.com:5000 admin secret
$ armada push fraud-finder -d production
Pushing microservice fraud-finder to dockyard: dockyard.example.com:5000 (alias: production)... ...(skipped)... Image has been pushed.

Create new services right away based on convenient templates.

$ armada create killer-service -b python
Service killer-service has been created in /home/maria/killer-service from python template.
$ ...edit files...
$ armada build killer-service
Pulling repository dockyard.armada.sh/microservice_python ...(skipped)... Successfully built 3be42e99ca6a
$ armada push killer-service
Pushing microservice killer-service to dockyard: dockyard.local... ...(skipped)... Image has been pushed.
$ armada run killer-service
Running microservice killer-service from dockyard: dockyard.local locally... Service is running in container 81d6b5473e39 available at addresses: 192.168.0.50:49397 (80/tcp)

Utilize power of vagrant to quickly setup services on your own box.

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider ...(skipped)... ==> default: Machine booted and ready! ...(skipped)...
$ vagrant ssh
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-24-generic x86_64) * Documentation: https://help.ubuntu.com/ Last login: Wed Sep 24 10:43:28 2014 from 10.0.2.2
vagrant@ubuntu-14:~$ armada run
Running microservice killer-service from dockyard: dockyard.local locally... Service is running in container cda8e994567b available at addresses: 192.168.0.50:4999 (80/tcp)

Build and deploy new versions of all your services in consistent way.

$ armada build killer-service
Pulling repository dockyard.local/microservice_python ...(skipped)... Successfully built 3be42e99ca6a
$ armada push killer-service
Pushing microservice killer-service to dockyard: dockyard.local... ...(skipped)... Image has been pushed.
production.initech.com$ armada restart killer-service
Restarting service killer-service... Service has been restarted and is running in container 275a58a771ec available at addresses: 192.168.0.50:49399 (80/tcp)

Discover services via nice urls.

$ armada run games-portal --env green-theme
Running microservice games-portal from dockyard: dockyard.local locally... Service is running in container fc6776c8f6da available at addresses: 192.168.1.43:49272 (80/tcp)
$ curl http://green-theme.games-portal.example.com
<!doctype html> <html> ...(skipped)...

Service monitoring based on user defined health checks.

$ armada list
Name Address ID Status Tags analytics 192.168.0.11:49341 db7966f53c3a critical ['env:production'] backend 192.168.0.17:49367 2939313eb2c1 passing ['env:production'] mailing 192.168.0.7:49322 1e07320224a6 warning ['env:production'] web 192.168.0.13:49361 f1e824c44786 passing ['env:production']

Separate code from configuration.

Armada automatically delivers right configuration for your service environment taking it from configurable source such as git. If you run the service with:

$ armada run game --env production

and have the config repo:

Configuration repository

then you can use the following code to access config files:

games_db_config = hermes.get_config('games_db.json') mysql_connect(games_db_config['host'], games_db_config['user'], games_db_config['password'])

The code is the same for dev and production.

Connect to dependent services (and load balance between them) in the simplest way possible.

There's a HAProxy instance running in each container responsible for discovering and load balancing services.

def get_affiliates_list(): AFFILIATES_LIST_PORT = 4001 url = 'http://localhost:{port}/list'.format(port = AFFILIATES_LIST_PORT) return requests.get(url).text