Trying CloudFoundry with Vagrant ... and some patience

This post is an updated, working and complete version of an older one I published mistakenly.

I suppose you have a functional ruby env for installing Vagrant, and that you have VirtualBox v4.1 already installed.

Let’s go!

mkdir ~/cloudfoundry
cd ~/cloudfoundry
#(optional) rvm 1.9.2@vagrant --create
gem install vagrant
vagrant box add ubuntu-lucid-64
vagrant init ubuntu-lucid-64
vagrant up

NB: if you’re getting a general protection fault: 0000 [#3] SMP error, it might be the sign you’re running an other virtualization system on this host (see this post about VirtualBox + kvm errors)

Then connect to your VM with vagrant ssh.

I used to install RVM manually and then install CloudFoundry step by step, manually too. But now the community provided a good install script, so let’s use it directly.

Before that, we should just fix a problem in our Vagrant image, the /home/vagrant/.gem is owned by root:root:

sudo chown vagrant:vagrant /home/vagrant/.gem -R

Then we follow the standard installation steps mentionned in the README:

sudo apt-get install curl -y
bash < <(curl -s -k -B

When it’s finished (it lasted more than 1.5 hour on my old desktop computer!), log out and vagrant ssh again (so that your groups / env get reloaded).

Before starting cloud foundry, I strongly encourage you to adapt the memory and CPU of your VM if you didn’t before (min 1G RAM and 4 cores for my setup).

Then I logged in again to the VM and prepared to start the whole thing:

rvm rvmrc trust ~/cloudfoundry/vcap
cd ~/cloudfoundry/vcap
bin/vcap start #=>BOOM :/

But I had problems at this point. I think I hit that bug. You should run this commands before starting everything, it won’t hurt if you’re not in my case, because our instance is just a test instance so we don’t need to change default configuration choices:

sed -i 's#.*db:migrate.*#Dir.chdir("\#{File.dirname(__FILE__)}/../cloud_controller") { `bundle exec rake db:migrate` }#' bin/vcap

Then you can finally start everything:

cd ~/cloudfoundry/vcap
bin/vcap start

You should see:

router              :         RUNNING
cloud_controller    :         RUNNING
dea                 :         RUNNING
health_manager      :         RUNNING
stager              :         RUNNING
redis_gateway       :         RUNNING
redis_node          :         RUNNING
mysql_gateway       :         RUNNING
mysql_node          :         RUNNING
mongodb_gateway     :         RUNNING
mongodb_node        :         RUNNING
neo4j_gateway       :         RUNNING
neo4j_node          :         RUNNING

Some components may appear as “STOPPED” if your VM is too slow (cloud_controller in my case). So maybe it’s a good idea to issue a bin/vcap status afterwards to see if everything has booted properly. If not, you can restart a specific service like that: bin/vcap start cloud_controller. It’s probably a good idea to watch the log ‘live’ too: bin/vcap tail to detect any problem. Be careful, it’s really verbose.

One other step, you need to make a local SSL tunnel so that commands sent to (a conventional domain in cloud foundry ecosystem, which resolves to are forwarded to the VM. If you find a solution to forward your local 80 port to the VM one, go ahead. But communicating to your vagrant VM directly didn’t seem to be that easy for me, so I uncommented the config.vm.forward_port (forward local 8080 to VM’s 80) in the Vagrantfile, restarted the VM (vagrant halt; vagrant up), and started CF services as described above.

When everything’s ok, log out and, from the host:

gem install vmc
vmc target
vmc info

You should see something like:

VMware's Cloud Application Platform
For support visit

Target: (v0.999)
Client:   v0.3.14

Now we can (finally!) play with your new toy. First register and login:

vmc register --email --passwd password
vmc login --email --passwd password

And build our first app (adapted from the README):

mkdir env && cd env
echo -e "require 'rubygems'\nrequire 'sinatra'\nget('/'){ host = ENV['VMC_APP_HOST']; port = ENV['VMC_APP_PORT']; %(<h1>XXXXX Hello from the Cloud! via: #{host}:#{port}</h1>) }" > env.rb

Then deploy it, as easy as:

vmc push env --instances 4 --mem 64M --url -n

In case it doesn’t work, and you want to consult logs manually, apps are stored in /var/vcap.local/dea/apps/ in the VM. Note that you can see an Error on startup even if the application starts correctly, don’t know why.

Anyway, the result in should be OK, you’ll see your four instances answer alternatively like a charm.

Run vmc help if you want to scale the app because of an excessive load!

Conclusion: the product seems great, but it’s not really well-documented and it can be hard to find informations or people with the same problems. Community seems to be super-reactive tho. In the past I tried to play with more complex app (rails+mysql) and had other problems, so I let you test and see if you’re happy with CloudFoundry.