Pivotal CloudFoundy is one of the leading PaaS provider. So, it was just mandatory to test it.

They propose a 60 days free trial. After registration, you have to install their CLI tool, available for Windows, Mac OS X and GNU/Linux (at least Debian and RPM-based distros).

I am a Debian 64 bits user, so I downloaded and installed the proper .deb, then as suggested logged in

lpenet@dsi-lpenet-personnel:~/Downloads$ cf login -a https://api.run.pivotal.io
Endpoint de l'API: https://api.run.pivotal.io

Email> ludovic@penet.org

Password> 
Authentification en cours ...
OK

Org ciblée lpenet

Espace ciblé development


                   
Endpoint API:   https://api.run.pivotal.io (Version API: 2.18.0)   
Utilisateur:    ludovic@penet.org   
Org:            lpenet   
Espace:         development   

(everything is in French, the offer seems to be properly localized).

CloudFoundry is more complex to learn than the other offers I tested. It is more of an open source project used as the basis of other offers. It seems very powerful, versatile and so on, but getting the pieces of the puzzle together requires some time.

I finally got a grasp on it by reading the following docs :

After reading the three first ones, I felt confident building and deploying my very simple test webapp :

$ git clone https://github.com/lpenet/test-jelastic.git
...
$ cd test-jelastic
$ mvn clean install
...
$ LANG=C cf push testlp -p target/test##1.0-SNAPSHOT.war 
Creating app testlp in org lpenet / space development as ludovic@penet.org...
OK

Creating route testlp.cfapps.io...
OK

Binding testlp.cfapps.io to testlp...
OK

Uploading testlp...
Uploading app files from: target/test##1.0-SNAPSHOT.war
Uploading 69.2M, 44 files
Done uploading               
OK

Starting app testlp in org lpenet / space development as ludovic@penet.org...
-----> Downloaded app package (16M)
-----> Java Buildpack Version: v2.5 | https://github.com/cloudfoundry/java-buildpack.git#840500e
-----> Downloading Open Jdk JRE 1.8.0_25 from https://download.run.pivotal.io/openjdk/lucid/x86_64/openjdk-1.8.0_25.tar.gz (2.2s)
       Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.1s)
-----> Downloading Tomcat Instance 8.0.15 from https://download.run.pivotal.io/tomcat/tomcat-8.0.15.tar.gz (0.9s)
       Expanding Tomcat to .java-buildpack/tomcat (0.1s)
-----> Downloading Tomcat Lifecycle Support 2.4.0_RELEASE from https://download.run.pivotal.io/tomcat-lifecycle-support/tomcat-lifecycle-support-2.4.0_RELEASE.jar (0.0s)
-----> Downloading Tomcat Logging Support 2.4.0_RELEASE from https://download.run.pivotal.io/tomcat-logging-support/tomcat-logging-support-2.4.0_RELEASE.jar (0.0s)
-----> Downloading Tomcat Access Logging Support 2.4.0_RELEASE from https://download.run.pivotal.io/tomcat-access-logging-support/tomcat-access-logging-support-2.4.0_RELEASE.jar (0.0s)

-----> Uploading droplet (61M)

0 of 1 instances running, 1 starting
1 of 1 instances running

App started


OK
Showing health and status for app testlp in org lpenet / space development as ludovic@penet.org...
OK

requested state: started
instances: 1/1
usage: 1G x 1 instances
urls: testlp.cfapps.io
last uploaded: Mon Dec 1 21:02:10 +0000 2014

     state     since                    cpu     memory         disk   
#0   running   2014-12-01 10:03:00 PM   26.2%   446.9M of 1G   181M of 1G   

And the magic is: it worked at first attempt. So,my webapp was running with a JDK8 in a Tomcat 8 container in a snap.

Wow.

As far as I understand, I can customize almost everything by tweaking (which often implies forking) the java buildpack.

Accessing logs and performing basic operations is simple. To get logs, juste use cf logs <APP>. Exemple :

$ LANG=C cf logs testlp
Connected, tailing logs for app testlp in org lpenet / space development as ludovic@penet.org...

2014-12-01T22:19:02.78+0100 [API]     OUT Tried to stop app that never received a start event
2014-12-01T22:19:02.80+0100 [API]     OUT Updated app with guid be8a1ecc-a006-4554-8549-2606843734e7 ({"state"=>"STOPPED"})
2014-12-01T22:19:02.86+0100 [App/0]   OUT [CONTAINER] org.apache.coyote.http11.Http11NioProtocol         INFO    Pausing ProtocolHandler ["http-nio-64570"]
2014-12-01T22:19:02.93+0100 [App/0]   OUT [CONTAINER] org.apache.catalina.core.StandardService           INFO    Stopping service Catalina
2014-12-01T22:19:02.98+0100 [App/0]   OUT [CONTAINER] pache.webbeans.web.lifecycle.WebContainerLifecycle INFO    OpenWebBeans Container was stopped for context path, []
2014-12-01T22:19:03.04+0100 [App/0]   OUT [CONTAINER] org.apache.coyote.http11.Http11NioProtocol         INFO    Stopping ProtocolHandler ["http-nio-64570"]
2014-12-01T22:19:03.04+0100 [App/0]   OUT [CONTAINER] org.apache.coyote.http11.Http11NioProtocol         INFO    Destroying ProtocolHandler ["http-nio-64570"]
2014-12-01T22:19:03.13+0100 [App/0]   ERR 
2014-12-01T22:19:03.98+0100 [DEA]     OUT Stopping app instance (index 0) with guid be8a1ecc-a006-4554-8549-2606843734e7
2014-12-01T22:19:03.98+0100 [DEA]     OUT Stopped app instance (index 0) with guid be8a1ecc-a006-4554-8549-2606843734e7
2014-12-01T22:19:05.48+0100 [API]     OUT Updated app with guid be8a1ecc-a006-4554-8549-2606843734e7 ({"state"=>"STARTED"})
2014-12-01T22:19:05.49+0100 [DEA]     OUT Starting app instance (index 0) with guid be8a1ecc-a006-4554-8549-2606843734e7
2014-12-01T22:19:09.78+0100 [App/0]   OUT [CONTAINER] org.apache.coyote.http11.Http11NioProtocol         INFO    Initializing ProtocolHandler ["http-nio-63959"]
2014-12-01T22:19:09.79+0100 [App/0]   OUT [CONTAINER] org.apache.catalina.startup.Catalina               INFO    Initialization processed in 545 ms
2014-12-01T22:19:09.80+0100 [App/0]   OUT [CONTAINER] org.apache.catalina.core.StandardService           INFO    Starting service Catalina
2014-12-01T22:19:09.80+0100 [App/0]   OUT [CONTAINER] org.apache.catalina.core.StandardEngine            INFO    Starting Servlet Engine: Apache Tomcat/8.0.15
2014-12-01T22:19:09.82+0100 [App/0]   OUT [CONTAINER] org.apache.catalina.startup.HostConfig             INFO    Deploying web application directory /home/vcap/app/.java-buildpack/tomcat/webapps/ROOT
2014-12-01T22:19:09.88+0100 [App/0]   OUT [CONTAINER] org.apache.tomcat.util.digester.Digester           WARNING [SetContextPropertiesRule]{Context} Setting property 'antiJARLocking' to 'true' did not find a matching property.
2014-12-01T22:19:12.08+0100 [App/0]   OUT [CONTAINER] pache.webbeans.web.lifecycle.WebContainerLifecycle INFO    OpenWebBeans Container is starting...
2014-12-01T22:19:12.08+0100 [App/0]   OUT [CONTAINER] org.apache.webbeans.plugins.PluginLoader           INFO    Adding OpenWebBeansPlugin : [OpenWebBeansJsfPlugin]
2014-12-01T22:19:12.08+0100 [App/0]   OUT [CONTAINER] webbeans.corespi.scanner.AbstractMetaDataDiscovery INFO    added beans.xml marker: jar:file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/lib/deltaspike-core-api-1.1.0.jar!/META-INF/beans.xml
2014-12-01T22:19:12.08+0100 [App/0]   OUT [CONTAINER] webbeans.corespi.scanner.AbstractMetaDataDiscovery INFO    added beans.xml marker: jar:file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/lib/deltaspike-core-impl-1.1.0.jar!/META-INF/beans.xml
2014-12-01T22:19:12.08+0100 [App/0]   OUT [CONTAINER] webbeans.corespi.scanner.AbstractMetaDataDiscovery INFO    added beans.xml marker: jar:file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/lib/deltaspike-jsf-module-impl-1.1.0.jar!/META-INF/beans.xml
2014-12-01T22:19:12.08+0100 [App/0]   OUT [CONTAINER] webbeans.corespi.scanner.AbstractMetaDataDiscovery INFO    added beans.xml marker: jar:file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/lib/deltaspike-security-module-api-1.1.0.jar!/META-INF/beans.xml
2014-12-01T22:19:12.08+0100 [App/0]   OUT [CONTAINER] webbeans.corespi.scanner.AbstractMetaDataDiscovery INFO    added beans.xml marker: jar:file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/lib/deltaspike-security-module-impl-1.1.0.jar!/META-INF/beans.xml
2014-12-01T22:19:12.08+0100 [App/0]   OUT [CONTAINER] webbeans.corespi.scanner.AbstractMetaDataDiscovery INFO    added beans.xml marker: jar:file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/lib/deltaspike-jsf-module-api-1.1.0.jar!/META-INF/beans.xml
2014-12-01T22:19:12.09+0100 [App/0]   OUT [CONTAINER] webbeans.corespi.scanner.AbstractMetaDataDiscovery INFO    added beans.xml marker: file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/beans.xml
2014-12-01T22:19:12.29+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.jsf.impl.scope.mapped.MappedJsf2ScopeExtension activated=true
2014-12-01T22:19:12.30+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.core.impl.jmx.MBeanExtension activated=true
2014-12-01T22:19:12.30+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.core.impl.message.MessageBundleExtension activated=true
2014-12-01T22:19:12.31+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.core.impl.message.NamedMessageBundleInvocationHandler activated=true
2014-12-01T22:19:12.31+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.security.impl.extension.SecurityExtension activated=true
2014-12-01T22:19:12.31+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.core.impl.scope.DeltaSpikeContextExtension activated=true
2014-12-01T22:19:12.31+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.core.impl.config.ConfigurationExtension activated=true
2014-12-01T22:19:12.31+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.jsf.impl.injection.proxy.ConverterAndValidatorProxyExtension activated=true
2014-12-01T22:19:12.31+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.core.impl.exclude.extension.ExcludeExtension activated=true
2014-12-01T22:19:12.31+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.core.impl.exclude.CustomProjectStageBeanFilter activated=true
2014-12-01T22:19:12.31+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.core.impl.exclude.GlobalAlternative activated=true
2014-12-01T22:19:12.31+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.core.impl.exception.control.extension.ExceptionControlExtension activated=true
2014-12-01T22:19:12.31+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.jsf.impl.scope.view.ViewScopedExtension activated=true
2014-12-01T22:19:12.31+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.jsf.impl.config.view.ViewConfigExtension activated=true
2014-12-01T22:19:12.33+0100 [App/0]   OUT [CONTAINER] g.apache.deltaspike.core.util.ProjectStageProducer INFO    Computed the following DeltaSpike ProjectStage: Production
2014-12-01T22:19:13.13+0100 [App/0]   OUT [CONTAINER] org.apache.webbeans.config.BeansDeployer           INFO    All injection points were validated successfully.
2014-12-01T22:19:13.16+0100 [App/0]   OUT [CONTAINER] pache.webbeans.web.lifecycle.WebContainerLifecycle INFO    OpenWebBeans Container has started, it took [1080] ms.
2014-12-01T22:19:13.16+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.jsf.impl.config.view.ViewConfigPathValidator activated=true
2014-12-01T22:19:13.25+0100 [App/0]   OUT [CONTAINER] e.myfaces.config.DefaultFacesConfigurationProvider INFO    Reading standard config META-INF/standard-faces-config.xml
2014-12-01T22:19:13.54+0100 [App/0]   OUT [CONTAINER] e.myfaces.config.DefaultFacesConfigurationProvider INFO    Reading config /WEB-INF/faces-config.xml
2014-12-01T22:19:13.93+0100 [App/0]   OUT [CONTAINER] e.myfaces.config.DefaultFacesConfigurationProvider INFO    Reading config : jar:file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/lib/deltaspike-jsf-module-impl-1.1.0.jar!/META-INF/faces-config.xml
2014-12-01T22:19:13.93+0100 [App/0]   OUT [CONTAINER] e.myfaces.config.DefaultFacesConfigurationProvider INFO    Reading config : jar:file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/lib/openwebbeans-jsf-1.2.6.jar!/META-INF/faces-config.xml
2014-12-01T22:19:13.93+0100 [App/0]   OUT [CONTAINER] e.myfaces.config.DefaultFacesConfigurationProvider INFO    Reading config : jar:file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/lib/primefaces-5.1.jar!/META-INF/faces-config.xml
2014-12-01T22:19:13.96+0100 [App/0]   OUT [CONTAINER] e.myfaces.config.DefaultFacesConfigurationProvider INFO    Reading config : jar:file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/lib/openwebbeans-el22-1.2.6.jar!/META-INF/faces-config.xml
2014-12-01T22:19:14.09+0100 [App/0]   OUT [CONTAINER] org.apache.myfaces.config.LogMetaInfUtils          INFO    Artifact 'myfaces-api' was found in version '2.2.6' from path 'file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/lib/myfaces-api-2.2.6.jar'
2014-12-01T22:19:14.09+0100 [App/0]   OUT [CONTAINER] org.apache.myfaces.config.LogMetaInfUtils          INFO    Artifact 'myfaces-impl' was found in version '2.2.6' from path 'file:/home/vcap/app/.java-buildpack/tomcat/webapps/ROOT/WEB-INF/lib/myfaces-impl-2.2.6.jar'
2014-12-01T22:19:14.10+0100 [App/0]   OUT [CONTAINER] org.apache.myfaces.util.ExternalSpecifications     INFO    MyFaces CDI support enabled
2014-12-01T22:19:14.10+0100 [App/0]   OUT [CONTAINER] e.myfaces.spi.impl.DefaultInjectionProviderFactory INFO    Using InjectionProvider org.apache.myfaces.spi.impl.CDIAnnotationDelegateInjectionProvider
2014-12-01T22:19:14.13+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.jsf.impl.listener.action.DeltaSpikeActionListener activated=true
2014-12-01T22:19:14.13+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler activated=true
2014-12-01T22:19:14.15+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.jsf.impl.listener.system.JsfSystemEventBroadcaster activated=true
2014-12-01T22:19:14.16+0100 [App/0]   OUT [CONTAINER] org.apache.myfaces.util.ExternalSpecifications     INFO    MyFaces Bean Validation support disabled
2014-12-01T22:19:14.26+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.jsf.impl.listener.request.DeltaSpikeLifecycleFactoryWrapper activated=true
2014-12-01T22:19:14.26+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.jsf.impl.listener.phase.JsfRequestLifecyclePhaseListener activated=true
2014-12-01T22:19:14.26+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.jsf.impl.listener.phase.DeltaSpikePhaseListener activated=true
2014-12-01T22:19:14.27+0100 [App/0]   OUT [CONTAINER] org.apache.myfaces.application.ApplicationImpl     INFO    Couldn't discover the current project stage, using Production
2014-12-01T22:19:14.27+0100 [App/0]   OUT [CONTAINER] org.apache.myfaces.config.FacesConfigurator        INFO    Serialization provider : class org.apache.myfaces.shared_impl.util.serial.DefaultSerialFactory
2014-12-01T22:19:14.27+0100 [App/0]   OUT [CONTAINER] .config.annotation.DefaultLifecycleProviderFactory INFO    Using LifecycleProvider org.apache.myfaces.config.annotation.Tomcat7AnnotationLifecycleProvider
2014-12-01T22:19:14.33+0100 [App/0]   OUT [CONTAINER] faces.webapp.PostConstructApplicationEventListener INFO    Running on PrimeFaces 5.1
2014-12-01T22:19:14.33+0100 [App/0]   OUT [CONTAINER] org.apache.myfaces.webapp.AbstractFacesInitializer INFO    ServletContext initialized.
2014-12-01T22:19:14.33+0100 [App/0]   OUT [CONTAINER] org.apache.myfaces.util.ExternalSpecifications     INFO    MyFaces Unified EL support enabled
2014-12-01T22:19:14.34+0100 [App/0]   OUT [CONTAINER] org.apache.myfaces.view.facelets.ViewPoolProcessor INFO    org.apache.myfaces.CACHE_EL_EXPRESSIONS web config parameter is set to "noCache". To enable view pooling this param must be set to "alwaysRecompile". View Pooling disabled.
2014-12-01T22:19:14.37+0100 [App/0]   OUT [CONTAINER] apache.deltaspike.core.util.ClassDeactivationUtils INFO    class: org.apache.deltaspike.jsf.impl.listener.request.DeltaSpikeFacesContextFactory activated=true
2014-12-01T22:19:14.38+0100 [App/0]   OUT [CONTAINER] org.apache.catalina.startup.HostConfig             INFO    Deployment of web application directory /home/vcap/app/.java-buildpack/tomcat/webapps/ROOT has finished in 4,557 ms
2014-12-01T22:19:14.38+0100 [App/0]   OUT [CONTAINER] org.apache.coyote.http11.Http11NioProtocol         INFO    Starting ProtocolHandler ["http-nio-63959"]
2014-12-01T22:19:14.39+0100 [App/0]   OUT [CONTAINER] org.apache.tomcat.util.net.NioSelectorPool         INFO    Using a shared selector for servlet write/read
2014-12-01T22:19:14.40+0100 [App/0]   OUT [CONTAINER] org.apache.catalina.startup.Catalina               INFO    Server startup in 4614 ms

(log on a @@cf restart testlp).

Emboldened by this somewhat easy start, I wanted to go further and to get up and running this other simple test app, dosleg-test, which also uses JPA 2.0, Hibernate 4.2 and PostgreSQL.

So, I followed the Deploying Community Services tutorial, starting with installing BOSH :

$ sudo apt-get install build-essential ruby ruby-dev libxml2-dev libsqlite3-dev libxslt1-dev libpq-dev libmysqlclient-dev
$ sudo gem install bosh_cli bosh_cli_plugin_micro

When I tried to install bosh, rubygems.org was unreachable, because of DNS problems. So, I set up my /etc/resolv.conf to use Google public DNS. At last, the domain was correctly resolved, but the gems where however not available on AWS...

So, I ended installing ElephantSQL, which claims to be PostgreSQL in the cloud, using Pivotal console.

Once this is done, you can "manage" this service. On the "management" page, the first provided info is the DB URL, which is like :

URL	postgres://<login>:<postgresql>@<host:port>/<instance>
/

We shall use

  • <host:port>/<instance> as JNDI URL
  • login as... login
  • password as... password (really).

Then, we deploy the app

$ LANG=C cf push dosleg-test -p target/dosleg-test##1.1-SNAPSHOT.war 
Updating app dosleg-test in org lpenet / space development as ludovic@penet.org...
OK

Uploading dosleg-test...
Uploading app files from: target/dosleg-test##1.1-SNAPSHOT.war
Uploading 676.1K, 48 files
Done uploading               
OK

Stopping app dosleg-test in org lpenet / space development as ludovic@penet.org...
OK

Starting app dosleg-test in org lpenet / space development as ludovic@penet.org...
-----> Downloaded app package (16M)
-----> Downloaded app buildpack cache (46M)
-----> Java Buildpack Version: v2.5 | https://github.com/cloudfoundry/java-buildpack.git#840500e
-----> Downloading Open Jdk JRE 1.8.0_25 from https://download.run.pivotal.io/openjdk/lucid/x86_64/openjdk-1.8.0_25.tar.gz (found in cache)
       Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.9s)
-----> Downloading Tomcat Instance 8.0.15 from https://download.run.pivotal.io/tomcat/tomcat-8.0.15.tar.gz (found in cache)
       Expanding Tomcat to .java-buildpack/tomcat (0.2s)
-----> Downloading Tomcat Lifecycle Support 2.4.0_RELEASE from https://download.run.pivotal.io/tomcat-lifecycle-support/tomcat-lifecycle-support-2.4.0_RELEASE.jar (found in cache)
-----> Downloading Tomcat Logging Support 2.4.0_RELEASE from https://download.run.pivotal.io/tomcat-logging-support/tomcat-logging-support-2.4.0_RELEASE.jar (found in cache)
-----> Downloading Tomcat Access Logging Support 2.4.0_RELEASE from https://download.run.pivotal.io/tomcat-access-logging-support/tomcat-access-logging-support-2.4.0_RELEASE.jar (found in cache)

-----> Uploading droplet (60M)

0 of 1 instances running, 1 starting
1 of 1 instances running

App started


OK
Showing health and status for app dosleg-test in org lpenet / space development as ludovic@penet.org...
OK

requested state: started
instances: 1/1
usage: 1G x 1 instances
urls: dosleg-test.cfapps.io
last uploaded: Mon Dec 1 22:48:39 +0000 2014

     state     since                    cpu    memory         disk   
#0   running   2014-12-01 11:49:41 PM   0.0%   421.3M of 1G   126.6M of 1G   

...and it just runs.

It has an high latency as Pivotal Web Services are accross the ocean, but it is still quite acceptable.

Conclusion

My favorite application stack just works out of the box on CloudFoundry. Given the enormous amount of documentation available on this software, the fact that it can manage AWS, vSphere, etc. nodes, I have no doubts it can fulfill all my needs. A private PaaS offer is available. I only wonder whether I can CloudFoundry usable enough for a fluid development experience.

It seems that I am not the only one to find some edges of CloudFoundry a bit rough... Several offers of PaaS based on CloudFoundry emerged those last month, including Atos Canopy, Stackato, AppFog, and IBM BlueMix. SAP also has a strong interest in CloudFoundry.