OpenShift Configure


December 5, 2013 Maithilish

12.3. OpenShift Configure

This section explains the changes required in application configuration and code to run Fins on OpenShift.
JDO config for MySQL

In JDO configuration file META-INF/jdoconfig.xml, we have to add a new persistence-manager-factory for MySQL.

Configuration requires connection URL, User Name and Password and we obtain them through

$ rhc app ssh demo
> env | grep -i mysql
OPENSHIFT_MYSQL_DB_PORT=60311
OPENSHIFT_MYSQL_DB_HOST=51fb####-finsdemo.rhcloud.com
OPENSHIFT_MYSQL_DB_PASSWORD=w1pd####
OPENSHIFT_MYSQL_DB_USERNAME=admin####

Use the values for configuration in jdoconfig.xml.
META-INF/jdoconfig.xml

        <persistence-manager-factory name="datastore">
                <property name="javax.jdo.PersistenceManagerFactoryClass"
                        value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory" />
                <property name="javax.jdo.option.ConnectionDriverName"
                          value="com.mysql.jdbc.Driver" />
                <property name="javax.jdo.option.ConnectionURL" 
                      value="jdbc:mysql://51fb####-finsdemo.rhcloud.com:60311/demo" />
                <property name="javax.jdo.option.ConnectionUserName" value="admin####" />
                <property name="javax.jdo.option.ConnectionPassword" value="w1pd####" />
           ....

This hard coded configuration works, but problem with this approach is that, OpenShift may change the Host and Port in future and then application fails to connect to MySQL. To overcome these nasty surprises, OpenShift suggests to use environment variables as shown in following snippet.
META-INF/jdoconfig.xml

   <persistence-manager-factory name="datastore">
      ....
       <property name="javax.jdo.option.ConnectionURL"
          value="jdbc:mysql://$OPENSHIFT_MYSQL_DB_HOST:$OPENSHIFT_MYSQL_DB_PORT/demo" />
 
      ....

But, when JDO tries create the connection it doesn’t patch the env variables with their actual values and throws exception. OpenShift forum suggests to use ${env.OPENSHIFT_MYSQL_DB_HOST} but that too fails.
Another option is to add a JNDI datasource to Tomcat context file – META-INF/context.xml with these env variables. But, even Tomcat fails to patch the variable with actual values.
Fortunately OpenShift JBoss EWS comes with a pre-configured JNDI datasource for MySQL and PostgreSQL, which is in .openshift/config/context.xml in cloned application folder . It defines two JNDI resources; jdbc/MysqlDS and jdbc/PostgreSQLDS using OpenShift environment variables and we may use this resource for our JDO config.
The new persistence-manager-factory configuration for MySQL is added to jdoconfig.xml.
META-INF/jdoconfig.xml

       <persistence-manager-factory name="datastore">
                <property name="javax.jdo.PersistenceManagerFactoryClass"
                        value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory" />
                <property name="javax.jdo.option.ConnectionFactoryName"
                          value="java:comp/env/jdbc/MysqlDS" />

                <property name="javax.jdo.option.NontransactionalRead" value="true" />
                <property name="javax.jdo.option.NontransactionalWrite"
                        value="true" />
                <property name="javax.jdo.option.RetainValues" value="true" />
                <property name="datanucleus.appengine.autoCreateDatastoreTxns"
                        value="true" />
                <property name="datanucleus.cache.level2.type" value="soft" />
                <property name="datanucleus.metadata.validate" value="false" />
                <property name="datanucleus.autoCreateSchema" value="true" />
        </persistence-manager-factory>

To use JNDI resource, we require a resource-ref definition in web.xml.
war/WEB-INF/web.xml

        <resource-ref>
                <description>DataSource</description>
                <res-ref-name>jdbc/MysqlDS</res-ref-name>
                <res-type>javax.sql.DataSource</res-type>
                <res-auth>Container</res-auth>
        </resource-ref>

Value generator uuid-string throws duplicate key exception for MySQL, instead it requires auid as value generator. In src/in/fins/shared/package.jdo value-strategy attribute of Data and DataGroup is set to auid.
Form URL

For FormPanel, we had given form action as /upload, but this fails to work in OpenShift. For OpenShift, we have to remove the leading / from /upload in in/fins/client/widget/UploadPanel.ui.xml and in/fins/client/widget/CachePanel.ui.xml.

With these changes, Fins is ready for deployment and the next section explains how it done.