01 Database Migration

Introduction

uPortal now has an export/import system using xml files generated by Cernunnos export scripts.  Basically, you will run an export command on your existing portal project to generate a number of xml data files.  You then run import in your uPortal3 project to import the data from these xml files into your uPortal3 database.  Take a look at the Cernunnos overview to get a better understanding of this process.  After that, move on to reading about Exporting and Importing.

TIP: Never export/import a database with portals actively connected to it.  Don't assume edits to a database will persist or take affect if portals are connected to it.  The portal does some advanced caching and may overwrite your change when it shuts down or never see a new change because it's using a cached copy of the row.

These scripts still have a few bugs.  Familiarize yourself with the known export/import bugs in JIRA and post any new bugs you find.

Default Database

The default database is populated by the db-import task in build.xml. This task is called by ant initdb, which in turn is called by ant initportal.  The db-import task actually uses crn-import to create the database:

         <antcall target="crn-import">
            <param name="dir" value="${basedir}/uportal-impl/src/main/resources/properties/db/entities" />
        </antcall>

As you can see, it simply calls crn-import on the entities directory.  Take a look at this directory to see the xml format for groups, layouts, channels, etc.

 Your Default Database

I highly recommend setting up an entities directory for your team once you've had a successful export.  This is completely optional, but it's easy to setup and allows developers on your team to populate their development databases with the groups, channels, permissions, fragment-layouts, etc that your production portal uses.  After you've completed your export copy your export folder under: uportal-impl/src/main/resources/properties/db

In my case, I called the folder calpoly_entities

The contents should look something like this (note that I've omitted the contents of the larger directories):

channel:
channel files...

channel-type:
Applet.channel-type
Bookmarks_Portlet.channel-type
Image.channel-type
Inline_Frame.channel-type
Portlet.channel-type
RSS.channel-type
SQL.channel-type
Version.channel-type
Web_Proxy.channel-type
XML_SSL.channel-type
XML_XSLT.channel-type

entity-type:
java.lang.Object.entity-type
org.jasig.portal.ChannelDefinition.entity-type
org.jasig.portal.groups.IEntity.entity-type
org.jasig.portal.groups.IEntityGroup.entity-type
org.jasig.portal.security.IPermissionSet.entity-type
org.jasig.portal.security.IPerson.entity-type
org.jasig.portal.services.entityproperties.EntityProperties.entity-type

fragment-layout:
admissions-lo.fragment-layout
advising-lo.fragment-layout
asi-lo.fragment-layout
campus-nec-lo.fragment-layout
housing-lo.fragment-layout
library-lo.fragment-layout
main-lo.fragment-layout
money-lo.fragment-layout
orientation-lo.fragment-layout
personal-lo.fragment-layout
reg-enroll-lo.fragment-layout
tech-lo.fragment-layout
whats-lo.fragment-layout

fragment-users:
admissions-lo.user
advising-lo.user
asi-lo.user
campus-nec-lo.user
housing-lo.user
library-lo.user
main-lo.user
money-lo.user
orientation-lo.user
personal-lo.user
reg-enroll-lo.user
tech-lo.user
whats-lo.user

group_membership:
group membership files...

layout:
defaultTemplateUser.layout
fragmentTemplate.layout
guest.layout
system.layout
other users...

permission:
permission files...

structure:
DLM_Tabs_and_columns-1.structure

theme:
DLM_XHTML-1.theme

user:
defaultTemplateUser.template-user
fragmentTemplate.user
guest.user
system.user

Modify build.xml

Now in your build.xml you should add a import task for your entities and change initdb to not call the default entities.

     <target name="db-import-calpoly" description="Imports the CalPoly groups, channels, memberships, permissions from a snapshot of prod Nov 2008">
        <echo message="Importing CalPoly groups, channels, memberships, permissions data" />
        <antcall target="crn-import">
            <param name="dir" value="${basedir}/uportal-impl/src/main/resources/properties/db/calpoly_entities" />
        </antcall>
    </target>

In initdb remove the call to db-import.  I also printed a message here:

 <echo message="You now need to run db-import-default, or db-import-calpoly to populate a working database." />

 Note that I renamed db-import to db-import-default in my build.xml