JSF in the cloud : Finding the PaaS - Part 4 : CloudFoundry
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 :
- CloudFoundry Concepts, which offers an high level overview of the system ;
- Tips for java developers, which helps getting quickly something simple up and running ;
- Understanding the Cloud Foundry Java Buildpack Code with Tomcat Example, which helped me understand some of the magic (CF does lot of guessing in filenames, archive content, etc.) ;
- Deploying community services, which explains how to deploy (among other things) a PostgreSQL database (I use this later);
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.