In my previous post, I showed how to create a quick Grails app on Cloudfoundry.
It was a very simple ‘Hello World’ type example app. In this post we are going to dig little deeper into cloudfoundry.
At the time of this writing, Cloudfoundry supports 3 different type of data store.
1. MongoDb – No SQL Database
2. redis – A persistent key value database
3. MySQL – Most popular free database
CloudFoundry calls these “Services”. You can create/instantiate these services for your application.
Let’s continue on with our previous example. We will create a MySQL database service and we will call it ‘hcfmysql-db’ (abbreviation to HelloCloudFoundryMySQL)
1. Creating CloudFoundry Service
You can create an instance by invoking the ‘cf-create-service’ command, Lets create ‘hcfmysql-db’
grails cf-create-service mysql hcfmysql-db
You should see an output like upon successful creation.
.... Service 'hcfmysql-db' provisioned.
You can verify that instance was created by running the following Grails command
grails cf-services
You should see output like follows:
============== System Services ============== +---------+---------+-------------------------------+ | Service | Version | Description | +---------+---------+-------------------------------+ | mysql | 5.1 | MySQL database service | | redis | 2.2 | Redis key-value store service | | mongodb | 1.8 | MongoDB NoSQL store | +---------+---------+-------------------------------+ =========== Provisioned Services ============ +---------------+---------+ | Name | Service | +---------------+---------+ | hcfmysql-db | mysql | +---------------+---------+
2. Binding the Database to the application
In Cloudfoundry, you will have to “bind” the services you created to the application you are working with.
In our example above, we will have to bind the hcfmysql-db with our HelloCloudFoundry app .
to do so, you can run “cf-bind-service” command.
For instance, in our example we can do:
grails cf-bind-service hcfmysql-db --appname=hellocloudfoundry
You should see the following output
Creating new service binding to 'hcfmysql-db' for 'hellocloudfoundry'. Application 'hellocloudfoundry' updated Service 'hcfmysql-db' added Application 'hellocloudfoundry' stopped. Trying to start Application: 'hellocloudfoundry'. ......... Application 'hellocloudfoundry' started.
3. Setting up the app to use the database
When we do the binding to a cloud foundry application, CF will set up the connection settings to the services at runtime. This makes the settings very transparent and intuitive.
Lets configure our app for the data.
Edit the DataSource.groovy found under /grails-app/config
production { dataSource { dialect = org.hibernate.dialect.MySQLInnoDBDialect driverClassName = "com.mysql.jdbc.Driver" username = "n/a" password = "n/a" url = "n/a" dbCreate = "update" } }
Note that i have set up ‘n/a’, under username, password and url. You can put anything you want here as these will be overridden by cloudfoundry at runtime.
This is it! You are done.
4. Putting it all together
Let’s verify that our database is working. To do this we can create a “Domain” Class and we will do a scaffolding.
Lets create a Domain class called “Person” with id and name as two attributes.
grails create-domain-class Person
We will update the class as follows
package hellocloudfoundry class Person { long id String name static constraints = { } }
We will create a controller as follows
grails create-controller Person
Update the controller as follows
package hellocloudfoundry class PersonController { def scaffold = Person }
Lets the deploy the app on the cloudfoundry.
Since we had already deployed the app before you can do an update
grails prod cf-update
Now you can navigate to your app in my example I deployed my app as manijshrestha.cloudfoundry.com
so i can navigate to
http://manijshrestha.cloudfoundry.com/person/list
hi manij
i am using cloud foundry with STS, should i do what you said to deploy my project?
i run my project well on local but get 404 after deploy to cloud foundry
Hi Wang,
You might want to check my another posting about deploying to cloudfoundry. Follow the link below:
https://manijshrestha.wordpress.com/2011/04/21/setting-up-a-grails-app-on-cloud-foundry/
Please make sure that while deploying the project it was successfully pushed out to cloudfoundry.
Hope this helps. Let me know if you still face some issues.
hi manij,
First, thanks a lot for replying
i found the problem in mysql service provisioning and binding
but in STS,it still does not work after i add service of mysql database to my application
should i edit the DataSource.groovy exactly like what you said?
Hi Wang,
Did you get your issue resolved yet?
If not let me know what type of errors you are seeing.
Thanks,