Setting up MySQL on Cloudfoundry

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

Advertisements