Check out the new USENIX Web site.


USENIX, The Advanced Computing Systems Association

LISA '06 Paper

Unifying Unified Voice Messaging

Jon Finke - Rensselaer Polytechnic Institute

Pp. 275-285 of the Proceedings of LISA '06: 20th Large Installation System Administration Conference
(Washington, DC: USENIX Association, December 3-8, 2006).

Abstract

Roughly 18 months after installing a unified voice messaging system, we picked it up and merged it into our pre-existing production email domain. This paper deals with both technical aspects deploying a unified messaging system, as well as the cultural shock of merging the very different operational domains of Email support with Telecommunications support into a shared support model. As an added bonus we will discuss the merging two Exchange/Active Directory worlds into one with minimal impact on the existing users of both systems. Lastly, we will discuss some issues of operating a partially unified voice messaging system.

Introduction

After 12 years of service, our campus voicemail system failed. We were finally able to restore service after a 10 day[Note 1] outage, but it was now clear to everyone, that this system needed to be replaced. Although we had been evaluating replacement voicemail systems prior to the failure, this changed the process from a theoretical exercise into a crash product selection and deployment exercise. Several years earlier [3], our division had implemented a Microsoft Exchange email service and this was in use by about 700, mostly administrative users. The eventual proposal was to install a Unified voice messaging system from Cisco that uses Exchange as a back end message store.

One of the attractive features of this product was unified voice messaging - that is your voicemails would appear as emails with .WAV files attached in your inbox. You could listen to them via the telephone like normal voicemail, or you could ``play'' the message via your email client. Since they were email messages, you could also use your email client to file or forward the message to other people. You could also get the system to ``read'' your email to you over the telephone (although good spam filtering is helpful here). Another benefit is that the new system could join the existing Windows 2000 domain and use the existing exchange servers. This allows us to leverage both existing hardware and existing support staff. The proposal went forward to the President's cabinet and emergency funding was allocated.

Unfortunately, no one had actually talked with folks who supported the existing Exchange installation and we received some push-back from them when we mentioned making changes to the Active Directory schema and creating another 5000 mailboxes to go along with the 700 they currently supported, as well as adding this new service with full administrator rights to the domain. So instead, we found a few more servers and installed a second Windows 2000 domain with it's own Exchange server. Although this allowed us to cut over from the creaky old voicemail system so we had new hardware, it created some new problems for us. The first was that we now had to support a number of windows machines, along with a our own exchange server, and between our PBX Switch engineers and our Network Engineers, we were not in a happy place [6]. The second, and perhaps bigger problem, is that we had promised to deliver Unified Messaging, not just a replacement for the old, telephone only interface, voicemail system. In order to deliver on this promise, we had to find a way to merge the two domains. We also wanted to avoid another hard cut over like the initial installation, where all of our users had to set up their mailboxes and record greetings but then lost all of their existing messages.

Initial Installation

Our initial installation was a replacement of our Octel voice messaging system with the Cisco Unity voicemail system. Since we were setting up a stand alone Exchange domain for this system, we did not have to worry about unified messaging at this point, just plain old voicemail accessed via a telephone set. At that time, we had an Intecom S80 PBX and a few experimental (for us) Voice Over IP (VOIP) phones. The PBX communicated with the voicemail system using a bunch of analog telephone lines and a single RS232 serial line for control and switching information. This single interface would prove to be a major factor in how we managed the switchover. Since the PBX only understood (and could communicate with) a single voicemail system, we had to do a hard switchover; bring up the new system, move the wires from old to new, and shut off the old system.

The Unity product includes a web based tool for administration, as well as several bulk load tools to process CSV files. Through these tools, an administer could create and destroy subscribers (which includes the exchange mailbox). We had two issues with this approach; the first is that a GUI interface is just too much work to manage ongoing changes,[Note 2] and the second is that we would have the creation and deletion of Exchange accounts in the hands of Telecom staff[Note 3] instead of the Exchange Administrator. We needed a way to give telecom staff the ability to add and delete voicemail boxes, and we wanted to automate and integrate with other systems as much as possible. Although the Cisco interfaces had some provisions to enable individual users to do some of their own maintenance, we also wanted the ability of departmental administrators to manage the people in their departments. We have found the departmental administrator concept a very useful and powerful thing on our directory (white pages) deployment [2] and we wanted to be able to use that with the voice mail system.

In our deployment of our original windows domain, we had automated a good deal of our data flow [3] and were comfortable with that concept. But in order to enable the distributed control and management that we wanted, we had to strictly enforce our policy and practices. To do this, we really needed to replace the Cisco tools with our own tools. To this end, we wrote our own web tool to allow the management of mailboxes and call handlers, and enforce our naming conventions and additional record keeping along the way. One of our new rules, is that all mailboxes need to be ``owned'' by either a department or an individual, thus the new tool can display all of the mailboxes (and call handlers) owned by a specific person or department. In fact, the only way to create a new mailbox or call handler, is to first select the owner, and from there, creation can continue. The tool also attempts to avoid errors and do as much of the ``thinking'' as possible. When a new mailbox is created, the tool first checks to see if that number (telephone extension) is already assigned to another mailbox. If it is in use, it will note that fact, and give several options such as expiring the existing mailbox which would free up the number, or creating an Enhanced Call Processor.[Note 4] Creating the ECP automatically and then assigning the original mailbox to ``1'' and the new mailbox to ``2'' saved a few steps for the telecom staff and helped avoid procedural errors. This would also generate a ``work item.'' In the initial deployment, a staff member would still need to record the greeting (``Press one for Sam, press two for John'').

One of the tasks our telecom staff dreaded at the start of the semester, was setting up all of the student ECPs. They would have to record greetings for over 800 call handlers (``press one for Marquia, press two for Sharon''). We made two changes to this process. The first was to use some Text to Speech routines to preset the subscribers name when we created a mailbox. We were actually pretty pleased with how well these routines did with many of the names. The second change was when we set up the call handler, we would generate the greeting by concatenating the names for each mailbox with the appropriate ``press paper.css for'' phrases. This has the additional feature that if the subscriber records their own name, when we regenerate the greeting for the call handler, it will use the subscribers name recorded in their own voice.

We had previously written a tool to manage student voice mail accounts. This tool would look at the room assignments from residence life, and automatically assign mailboxes based on the room (which determined the phone number.) In the earlier version, this would generate a CSV file that would be loaded into the Octel system. This tool was modified to create the mailboxes and populate the appropriate call handlers. In this case, there were two types of handlers, a ``Direct Transfer to xxxx'' for single rooms and ``Student Residence ECP xxxx'' for shared rooms. Each student mailbox was assigned a six digit ``directory number.''[Note 5] By using a call handler to access all student mailboxes, we did not need to worry about changing the extension assigned to mailbox, and as students changed rooms, they could keep the same six digit directory number, even as their room number (and phone number in their room) changed.

Subscribers, Call Handlers and Distribution Lists, Oh My!

A detailed discussion of the Unity Voice Messaging system would take a few days, and during our deployment, we purchased a web based training package to help jump start the Unified Messaging Team. But a brief overview of how Unity works would be helpful. The core building block of the Unity system is the call handler. This defines how a call is processed, what messages are played, what options the caller has during the call, and what happens after the greeting has been played.

Each call handler has some basic attributes including a name, an owner (which is a unity subscriber or unity distribution list) and an optional recorded name and an optional extension. It can also have a number of different types of greetings; a standard greeting, a ``closed'' greeting to be used when the university is closed, and alternate greeting, a busy greeting and an internal greeting. Each of these greetings can be enabled or disabled (the standard is always enabled), a source for the greeting which can be a recorded message (stored in a .WAV file, a system greeting (if there is a recorded name, it will be ``RECORDED NAME is busy or unavailable'' otherwise just ``Extension XXXX is busy or unavailable'') or simply blank. There are some switches to control if caller input is accepted during the greeting, how many times to replay the message and finally, what to do after the greeting is played. These options include taking a message, transferring to another subscriber or call handler, transferring to another extension or simply hanging up.

Call handlers can also accept caller input - a touch tone key press that can transfer to another subscriber - or any of the options for after playing the greeting. This can be configured for each of the 12 touch tone key presses. You can also configure how long a message can be left, who the message goes to, and what happens after the message is recorded. There are more options and settings available, but we are not currently using all of them.

The next part of the Unity system is the subscriber. This is a call handler with a message store attached, and some user information such as a PIN, a display name for the directory (both Active Directory and some directory lookup functions in Unity) and the location of the mail store. In general, the messages are stored in an Exchange server. This allows subscribers to access the messages via Outlook, or via the telephone (The Unity system is also an Exchange user that can open any mailbox). There is an option for messages to be sent immediately via SMTP to some other mail server. Although this means they can't access their voicemail via the telephone, since it is out of Unity's reach, they do get it via their preferred email client. This option is attractive to some of our users who don't use Exchange.

Unlike stand alone call handlers, subscribers (or their call handlers) must have an extension. Subscribers can also have alternate extensions, which allows a person with more than one phone line to have all of their calls go to one voice mailbox. Another attribute of subscribers, is notification and the message waiting indicator (MWI). The MWI is set when there are ``unread'' voice messages in their inbox.[Note 6] The system can also notify you of voicemail (and emails if you wish) via phone calls, pagers or email notification.

Another part of the Unity system, are distribution lists. These can be used to send group messages to folks and they can also be the owner of call handlers. We have two categories of automatically maintained lists, an ``All Hands XXXX'' list for some departments who request it, and ``department admin XXXX'' list with the department administrators for any department that owns call handlers. These are created automatically when a call handler is created. The owner of a call handler can update the greeting, this allows several folks in a department to maintain the greetings easily.

Although Unity has an ``owner'' for each object, we maintain our own owner information in our Oracle database which allows us to delegate control and administration more effectively.

Functional Layout

In Figure 1, we have a diagram of our configuration. We have our old legacy phone system (PBX), which is connected to the voicemail system via both analog lines for voice traffic, and a serial line for control information. This PBX is also connected to our Call manager to provide a path for VOIP phones to talk with PBX based telephones. Both the Call manager and the PBX are have trunks to connect to our regular phone carriers for inbound and outbound phone service.



Figure 1: Function Diagram.

The call manager and the voicemail system (Unity) are also connected to the campus network, albeit behind firewalls. They use the network to communicate with each other, and Unity also connects to the Exchange message store. The call manager also uses the network to communicate with the individual voip telephones. The configuration (user provisioning at least) of the active directory domain, the call manager and the Unity system are all driven by an Oracle database. This database also handles our Identity Management functions and also drives our LDAP directory databases and many other aspects of our operation.

Write Only Memory

In our initial version of Unity, Cisco offered a C# API [7], so we built a process (the Unity Queue Runner) that would run on the Unity server, accept commands via a queue in our database [5] and process them via the API. We were pressed for time on this installation (recall that the original system had already failed hard for 10 days and was showing signs of additional failures) and this command path was one way only. We had to issue commands and assume that they worked. We kept track of what we thought we had done, and hoped that we were right.[Note 7] At this point, we had no way to read back the contents of the configuration database on the Unity server.

What's In A Name

We ran into a few issues with our naming conventions. One of the first problems we had, is that when the Unity Queue Runner was passing commands to Unity, it would reference the mailbox or call handler by it's name. On a few occasions, someone using the Cisco tool, had changed the name directly in Unity. As a result, the command would fail - since the object wouldn't be found. Although there were only a few of them, they generated quite a few headaches for the technical staff, as well as problems for the front office folks. Eventually we were able to convince the front office folks that ``never change a name,'' meant exactly that. We actually could go into the SQLServer database on Unity to find and fix them, but it was very annoying.

A more common problem, and very annoying, is that we used names like `Fac/Staff ECP nnnn or `Student ECP nnnn' for our call handlers. What we did not know at the time, that the call handler search function on the Cisco tool only used the first eight characters, and there was no way to search by extension. Thus, the search tool would return a list of all `Fac/Staff ECPs,' an unsorted list at that. This did have the minor benefit of making the Cisco tool almost useless for working with call handlers, which forced the front office staff to use our own tools and reduced the first problem a bit.

Another part of our early naming convention, was to embed the department name or abbreviation into the name of call handlers for departments (ECPs and Voicemail trees). While this made some degree of sense for the Octel system (where we inherited the practice), it proved to have several issues with Unity. In the original deployment, we ran into departments that did not have abbreviations, and the resulting name was too long. Even with the abbreviations, the search problem mentioned above hit us just about every time. The other issue that we ran into, is that departments changed their name and abbreviations periodically, which then meant that we had to rename call handlers, which we can't easily do.

Since our tools to manage the Unity system had additional fields to capture owner information (and whatever else we wanted), we no longer needed to overload the call handler names like we did with the Octel system. Some of these naming problems we were able to correct before our second upgrade; we were able to destroy and recreate all student call handlers over the semester break. In other cases, we kept the old (longer) names and new call handlers would get the shorter names following the new convention.

Octel to Unity Switchover

The migration from the old Octel system to the Cisco Unity system was in some respects easier. People understood that the Octel system was about ready to die, and had lower expectations. On the other hand, there was a lot more busy work required. We were able to get a dump of the Octel configuration, which included the directory number, class of service, the owner ``name'' (this was a free text field, with no validation) and some other configuration information. We needed to map this information on to the new system, and assign owners to everything.

The student voicemail was pretty easy - we were already generating those assignments in Oracle and loading them into the Octel; we wrote some interface code, and that process could talk to Unity. That left the fac/staff mailboxes to be migrated. We wrote a tool that helped us assign owners to Octel mailboxes (and save this info in Oracle). Some of this could be done automatically. If an Octel mailbox (directory number) was listed exactly once in the telephone directory, and that person was an active employee, we made the match. The rest needed to be cleaned up manually. The tool would display unmapped mailboxes, and the front office staff could work through the list, displaying each one and attempting to match. The tool would display matching directory and billing information.[Note 8] Other choices included marking the mailbox as obsolete, or just tossing it to the end of the list. Eventually, all Octel mailboxes got an owner or marked as obsolete.

The matching tool let us work with preliminary data (an earlier snapshot) and one week before the switchover, we froze the Octel database - we had campus announcements out, and after the freeze date, we would process no more changes to the Octel system. We then took that snapshot and finished matching mailboxes with people. At that point, we were able to pre-create all of the new mailboxes on the Unity system. Up to that point, we just had a few pilot users, mostly accessing it via the few VOIP phones we had deployed at that time. Another tool we wrote allowed individuals to pick up their voicemail PIN via the web. We had previously done this for students, and now we were able to expand this for all users.

The cut-over was scheduled for a weekend at the start of the summer (June 6th) - we swung the wires, moved the direct access numbers (there was a number for folks to call to get their old messages) and we were done. On Monday, everyone with a mailbox had to set it up, record their name, set up their greetings, change their PIN, and remember to call the special access number to get any last messages from the Octel. Messages were not transfered from the old system. After 60 days, the old system was turned off and removed from service. If you had not picked up your old voicemail, too bad. We also made the decision to NOT offer voicemail service for students during the summer. This gave us time to handle problems with the fac/staff mailboxes.

Preparing to Merge the Domains

After a year of running a stand alone voice mail system, the decision was finally made to move the voicemail domain into the regular email domain. This was required to allow us to offer fully unified voice messaging, and would also reduce the support overhead coming from two exchange domains. Shortly after our initial voicemail roll-out, we started a roll out of VOIP service to some new buildings. Part of this roll-out included our own control interface to the Cisco Call Manager, similar to what we did for the Unity project. Unlike the Unity interface, this one used XML [4] and was bidirectional. One of the side effects of this, was the appearance of VOIP phones on the desks of staff who were involved with the Unity project. This was mostly to enable testing of the VOIP service, but proved to be handy in other ways. One of the very valuable features, is that unlike the Intecom PBX, the Call Manager (the ``brains'' of the VOIP system) understood how to talk to more than one voicemail system, and could talk to them via TCP/IP.

When we first deployed Unity in the Stand Alone configuration, we contracted with IBM to provide us with a consultant to assist us in the planning (including system requirements), configuration and deployment. Ben worked out very well, he certainly knew his stuff and got us going. As an added bonus, Ben was a Rensselaer graduate, so he was familiar with the campus and the general operation. But going forward, we wanted to break the dependency. It got annoying to the technical staff, that when some issue came up, the first reaction was to ``Call Ben,'' before even attempting to handle the problem ourselves. The decision was made to handle the migration entirely in house; we had to develop our own expertise.

This is Only a Test

We decided that we should replace the Unity server as part of the upgrade. One of the challenges we had with the initial deployment, is that once we went live, we had no test system - all changes had to be made on the production system. It also meant that we had no backup system available. Although the Unity server was a pretty standard box running Windows 2000, it did have some special interface cards in it to talk to the PBX. In the 12 months from the original deployment, the cost of the server hardware came down considerably and since it was going into an existing domain, we did not need domain controllers, an exchange server, etc. So although the new server was part of the production windows domain, it was not in production and we could use it for development and practicing the migration.

When we originally installed Unity, we knew that we would eventually be merging into the win.rpi.edu domain. But since we were concentrating on the move from Octel to Unity, this sort of slipped our mind. One of our first projects to get ready for the merge, was to modify every package, interface, queue and tool to understand the concept of more than one domain. Although the changes were generally pretty small, it touched everything we had developed. Although a Domain_Id field was added to just about every table, it really only mattered for the call handlers, subscribers and extension (directory number) tables. All other objects were associated with call handler or subscriber and could inherit the domain where needed. The main Unity interface tool had a switch added, to let the user select which domain they were working in. All searches, displays and other functions would be limited to records from that domain. Up until the cut-over, this switch defaulted to the stand alone Unity installation. The other key place for this information was in the command processing stream. Although the Meta_Change_Queue understood multiple queues, the Unity_Maint package had to select the appropriate queue for each command. During the testing of these changes, it was amusing to see a ``Create Call Handler'' going to the new system, and all of the caller input configuration go to the old system.

We got the new Unity server installed, and made it part of our production Windows domain (win.rpi.edu). Despite having a queue runner program working on the stand alone system, we wanted to merge the queue runner for the Unified[Note 9] system with the original ADSI_Sync program that we were already running to maintain the windows domain. We also needed to be very cautious in making changes in this domain - just about all of our administrative staff was already using this exchange server and active directory, and disruptions or bad entries were not acceptable. Up until we got very close to switch over, the queue runner process was being run on demand, often times with break points in it, so we could be very sure of what was happening. Another significant operational change, is that although the front office telecom staff got admin accounts on the new Unity server, these accounts were read only. Their only create/modify access was via the interfaces we developed. Fortunately, running the stand alone system gave us time to make available most, if not all, of the needed commands and functions.

Code Generator

Our command interface was much like a checkbook. We made transactions and recorded them, and so maintained a picture of what we thought was the state of the system. But we never had the facility to ``balance'' the checkbook, and it was possible to miss transactions. In addition, one of our objectives with the cut over to the Unified system, that no one would know that we had done it - greetings needed to be preserved, PINs stay the same, and so on. These changes were all made directly in Unity via telephones, often by the end users and our system never saw them.

After our initial cut over from Octel to the Stand Alone Unity system, our next big project was a Voice over IP deployment. Despite there being a GUI tool from Cisco, we wanted to have our own interface the the Call Manager[Note 10] to handle provisioning of telephones with better integration with our billing and network systems. The call manager used a SQLServer database internally and provided an XML based interface that could both make configuration changes and return information from the database. It also provided a general SQL interface so that we could make arbitrary queries. Implementing our front end required that we maintain shadow copies of many validation tables in our Oracle database. Writing this interface code was tedious and prone to error, but was also very consistent in format. We developed a code generator; we would define the Oracle shadow table, and then point the code generator at it, and it would spit back paragraphs of PL/SQL code and record definitions that we could then use.

When we returned to the Unity project, we also wanted to get data out of SQLServer, and we had a very limited interface[Note 11] that would allow us to query the SQLServer database on the Unity system. We wrote a PL/SQL package for Oracle, that would generate a query to be passed to SQLServer, that would concatenate multiple columns into one, doing appropriate type conversions to produce a CSV format return that we could then write more PL/SQL code to parse and store. Getting all of this to actually work (part of one query required seven single quotes in row to get the appropriate single quote in the final result) cried out for automation, and so we wrote another tool to handle all of this. One of the things that SQLServer has, is a set of tables known as the data dictionary, that define all of the table and columns (and other things) in the database. With this, we could query the data dictionary and get back descriptions of all the table and columns in the database and store them in the Oracle database. We then added a tool that allows you to select a table, and columns of interest, the type of query (just one record based on a primary key, a list of all keys in a table, etc.) and eventually build up a set of queries of interest. Then with this, we would generate an entire PL/SQL package with record definitions, parsing routines, query routines, etc. This package could then be compiled in Oracle in used by other parts of the system.

The first application of the code generator, was to regenerate the interface used by the code generator itself to get data dictionary information. The code generator made it very easy to access almost all of the data we needed from the SQLServer database on the Unity system. We could get lots of the mailbox configuration information, some statistics about the mailboxes and even the PIN. We actually could only get an MD5 hash of the PIN, but we discovered that when you pass a 32 character hex hash of a PIN to the Set_DTMF_Access routine, it would recognise it as already hashed and set it directly. Thus although we could not determine what someone had set the PIN to,[Note 12] we could determine that they HAD set it, and we could copy that value to the new system.

Call Manager Integration

Between our initial deployment and the migration to Unified messaging, we had one major change in our environment; the VOIP deployment. When a voice mailbox is configured, you need to indicate which phone switch it is on. This is so Unity knows which switch receives the MWI. As people were moved from the PBX to VOIP, we sometimes forgot to update Unity, so a few days after someone got moved to VOIP, we would get a trouble call that their message waiting light wasn't working anymore. We modified our call manager configuration tool, to check the Unity configuration and change it automatically if needed. This greatly reduced the number of MWI trouble calls we were getting. This type of cross system integration is a nice feature of doing our own tool development.

Recorded Names and Greetings

Much of the subscriber configuration information was stored in the SQLServer database, and the actual voice messages were stored as email on the Exchange server. But the recorded names and greetings were stored as .wav files on the file system on the Unity server. We could at least get the name of the file from the SQLServer database. Our next step was to define a new command for the queue runner that would ask it to open a sound file and save it into the Oracle database. The file would get converted to Hex, passed to a an interface routine in Oracle, that would convert it back into binary and store it as a BLOB.[Note 13] We were already saving ID card photos as BLOBs and we had reasonable support for managing this information and spitting it back out via web tools. This was pretty neat, as it allowed our admin tools to ``play'' the greetings and recorded names for subscribers and call handlers. We were able to ``recognize'' names that we had recorded and greetings that we had generated by the file names, so we didn't bother to actually save these in the Oracle database. Collecting names and greetings was not a fast operation.

Since it took so long to copy all of the recorded names and greetings, we next wanted to develop a system that would just get new recordings. Unfortunately, although the SQLServer database had the file name, it did not know the file size or last changed information. So, we added yet another command, a request for file information. When the queue runner got this, it would get the file size and last data info, and store that in the Oracle database. This made for some complex update code; it would check to see if a subscriber had a recorded name. If it did, it would send a request for the file info for it. But it might be minutes or even hours before it got a response (an update in the table), so it would request info on a lot of files, and mark them all as pending. Some time later, it would look at the pending to see if they had been updated, and if so, it would then ask for a fresh copy of the file. A more direct query approach have made writing this a lot easier. But in the end, we had a system that could, in the span of less than a day, ensure that we the most recent greetings and names.

Migration Tool

When we moved from Octel to the Stand Alone Unity system, we had written a migration tool to help us with that project. So, we wrote a new tool that would let us examine all of the call handlers and subscribers on the stand alone system and figure out how to map them to the Unified system. This also provided a platform to test the migration procedures. When we had installed the Unified system, we did not populate it with subscribers, and just set up a few call handlers and templates to provide a starting point.

The first folks migrated were part of the pilot group - generally the technical people who were actually doing the migration, and would not (or could not) complain if their voicemail got messed up. Since these were going to be ``unified'' clients, we did not need to change their mailbox name. The first step in migrating someone, made an entry in the migration table, and changed their status. The first state was generally ``wave wait'' - which also generated a request for the sound files. Once the sound files arrived, the new name could be set and when we were ready, we pressed the ``create'' button. As time went on, we got better, identifying more special cases we had to handle, and getting all of the configuration information that we needed. These early adopters did not get their messages copied over until much later.

The tool was then changed to list sets of subscribers, based on class of service, who were not yet in the migration table. Check boxes made it pretty simple to decide if we wanted to migrate them, and what their new mailbox name should be. This allowed us to review every subscriber and call handler well ahead of time and get them started down the path. Once a subscriber or call handler was created, a link to the new entry was also stored in the migration table, so we built up a record of everyone and everything that got moved.

Prior to Cut-over Weekend

We had originally planned on doing the migration during the week between Christmas and New Years. This had the advantage of the students being out of the dorms and most of the staff on vacation. However, the wife of the exchange administrator was due to deliver their third child[Note 14] that week, and since it wasn't critical that we migrate, we decided to wait until the entire upgrade team was available. The cut over was moved to the first weekend of Spring break. The real driving force was that was the first weekend that all members of the upgrade team (at least the key members) did not have other obligations. It certainly is nice to be able to select a time that works well for everyone.

Despite having had the pilot group using the new server, and many of them still unified, there were still things that we were unable to test. For example, we were pretty sure that creating 5000 new mailboxes on our exchange server would not have any unexpected side effects, but we wouldn't know until we tried. So two weeks before the cut-over, we started creating the new mailboxes using the migration tool. After the first few batches of 100 went through ok, and backup ran ok, we sent over 1000, things again looked ok, and we were able to finish the bulk of them a week before the cut over. We also added some bulk processing options to the migration tool, to speed the processing along.

How Long?

Another process we started early, was setting up the sound files. We did not want to load the sound files too early - users of the voicemail system were still updating their greetings and we did not want to ``freeze'' changes until shortly before the cut over. But since our collection process was able to detect files that had changed, we started loading sound files, and a good thing we did! Although everything worked in tests, and the extraction of all sound files only took 36 hours, moving the sound files from the database and converting them back into .WAV files on the Unified system was very slow and our initial estimate was almost two weeks! Some research into that determined that most of the time was in the hex to bin conversion, and some web searches revealed discussion of just how slow some of the library routines that did this are. An alternate library gave us a speed increase of 20, which was good enough to get us in under the deadline.

We wrote another program that would copy mailboxes from the Stand Along exchange server and deposit their contents into the Unified exchange server. It would take a crosswalk file, since almost all of the mailbox names were changing as part of the process. This also was going to append email, since members of the pilot group already had exchange mailboxes as their primary mail service. We couldn't figure a good way to test this - although we had a Exchange test domain, it is isolated from the ``real world,'' since it tries very hard to get out. We were also concerned that any testing here would raise more questions than it answered. Since this program was based on some tools we had used during an Exchange recovery operation, we had some feel for the timing, and we were confident that it could run in less than two days - well within our planned upgrade window.

Cut Over!

Friday at 6:00 PM rolled around, and we started going through the step by step upgrade plan. We had taken some concepts from Brent Chapman's Invited Talk [1] from LISA last year, and we had a communications person and a communications plan, so that people who needed to know what was happening, were informed as milestones were reached (or not).

In the months leading up to the cut over, we had developed an implementation plan including time estimates, deadlines, dependencies and staff for each step. We also developed a more detailed tactical plan for the upgrade weekend, including communication schedules (i.e., - we were going to give the CIO a status report at 9:45 PM, he wasn't supposed to call us prior to that time.) The plan even included dinner menu selections for the team members. Some aspects of the plan called for processes to run - instead of standing around watching, most of the team could eat dinner.

We also had a test plan, which involved other people from the division testing aspects later on in the weekend, as well as specific things to test. We also requested that these testers try those same tests on the existing system prior to the cut-over, so that they would know what to expect. We did not want to waste timing troubleshooting a problem that existing on the old system and was ``successfully'' migrated (and we found bunches of these.)

Final Results

We had reserved the entire weekend for the upgrade. Within an hour of the start, the wiring changes were done and the new system, was accepting messages for people on the PBX. Within an hour after that, we had moved most of the VOIP people over. We encountered some problems that did not show up in testing, where some phones did not want to change their voicemail profile and continued to direct calls to the old system. Migration of old messages was scheduled to start Saturday at 9:00 am and by noon, we had copied all of the voice messages over from the old system to the new system, and although we were still doing testing, for all intents and purposes, the upgrade was done and most of our users did not notice any outages. Their messages were available, their greetings and recorded names were intact and their PINs still worked.

Oops

We missed a few things. Although we were finally able to get all of the VOIP phones switched over, we overlooked the tool used to add new phones - it was carefully assigning new phones to the old system. Fortunately, once we figured this out, we were able to correct it and had the users get their messages from the old system. A few months after the cut-over, we were still occasionally finding new VOIP phones with voicemail on the old system. This was finally tracked down one module that had a literal string with the PKID of the old voicemail profile embedded in it. This was noticed when the old voicemail profile was deleted from the VOIP Call Manager and certain configuration functions started to fail.

We had instructed our users that changes made after a certain date (a week before the cut-over) may not be migrated. We had a few cases where people recorded alternate greetings and enabled them and left for vacation. Unfortunately, the process to migrate greetings was not synchronized with the process that copied the state of the greeting switch, so as a result, a few people had voicemail greetings wishing folks a ``Happy Thanksgiving'' during the week of spring break.

The Unity system (at the release we had), could be configured to work with two phone systems. So in the initial deployment, the IBX was switch 0 and the call manager was switch 1. When the new Unity system was installed, the first switch that was configured was the call manager so it became switch 0, and the IBX was switch 1. This didn't matter too much, since phones are generally configured by name. What this did do, was change the default switch for lots of mailboxes. Since this didn't matter for mailboxes that didn't have a real phone, this shouldn't be a problem.

One of the nightly jobs the Unity server runs, is to refresh the Message Waiting Indicator (MWI) on all the telephones. This is that nice little red light that tells you that you have a message waiting. Or for the folks with standard telephone sets, the ``stutter'' dial tone, so that when you pick up the phone, you get some indication that you have voicemail. Of course, we have found that many of the folks who have the standard phones, don't make a lot of phone calls, and so never pick up the phone to hear dial tone, and so never learn that they have voicemail. This also doesn't work well where you have shared phones. Which mailbox controls the single light? One option here is to use email notification - when you have a new voicemail, it sends you email telling you about this. While this makes no sense for unified people (sending you an email to tell you that you have an email?), it is nice for folks with just the basic voicemail service. Many of our mailboxes are set up with 5 or 6 digit ``extensions'' (fac/staff shared phones that were migrated from the Octel system often kept a 5 digit extension, where the first 4 digits matched the phone, and the 5th was the ``press N'' value.) So every night, Unity would attempt to update the MWI setting for 5000 phones - many of which did not actually exist. The connection to the IBX was a serial line - so this update would take almost an hour. While this was going on, new MWI changes would get stuck at the back of the queue. This wasn't a big problem at 4 am, but was mildly annoying.

When the new system went live (or actually when created 4900 more mailboxes), we noticed that the default switch was the call manager and not the IBX, but hey, the update of the MWI would run a LOT faster via TCP/IP. Shortly after that, we noticed that the job that was processing the call detail records (CDR) for phone billing, was timing out - it was taking too long to run. Further investigation revealed that each of these MWI updates was generating two CDR records for each mailbox, one for invalid extension and one for service not available. This increased the number of CDR records each day from around 2000 to over 10,000. This was also filling up the CDR space on the call manager a lot faster, and wasting space on the billing system. For a short term fix, we wrote yet another process to pre-delete these CDR from the call manager before the billing job runs. Who would have thought that such a trivial decision would prove to be so annoying.

Another thing that bit us was with licensing limits. We originally had 5000 licenses, and our usage was getting really close to the line, so we got 50 more. This involves loading a new license file and restarting the system. We did this and operations continued. However, this happened after we had built the new system, but before we cut over, so it was still running with the license limit of 5000 and not 5050. Shortly after the migration, we learned that you do NOT want to exceed your license limit. An updated license file, a brief outage and full service was restored.

Conclusions

In retrospect, doing the initial installation as a stand alone exchange domain, and then later migrating it into our production email domain was a good thing. We had no operational experience with the Cisco Unity product, and despite having run the previous voicemail system for 12 years, there were some significant differences. We had to make a lot of decisions when we first deployed Unity, and several turned out to be sub optimal.[Note 15] We were able to correct a number of these as part of the migration process.

We also got a test system out of the whole process. One of the first things we want to try, is does our system restore actually work.

Are We Done Yet

A rather annoying oversight from an implementors standpoint, is that we had not defined a way to determine when the migration was ``done.'' There is a different mindset, sense of urgency, etc. between ``Cut over Weekend'' and ``Normal Operations.'' It may seem like a trivial point, but it has an impact on the people involved. One of the problems we had, is that there were things that were configured wrong on the old system and we ``successfully'' duplicated those wrong configurations on the new system. It was nice to finally just fix problems as they were encountered, and not worry was it a migration problem or a new or even an existing problem. It was really annoying to get a complaint about someone's message waiting indicator not working, and after an hour of digging, determine that it NEVER worked in the first place.

We also left the old system on line - perhaps for too long. This allowed some folks to continue to use the old system without anyone knowing it - which led to some confusing problems. This was only a problem with the call manager. The PBX was a hard switchover, a physical cable move, but the call manager continued to talk to both system, and it wasn't until we deleted the voice mail profile on the call manager the referenced the old system, did we shake out the that last few references to it.

Culture Clash

The email folks and the voicemail folks had developed many years of policies and procedures. With the merging of the two worlds, these differences need to be identified and resolved. For example, in the past when a new person got a telephone, they would often have to flush out the messages and greetings from the previous owner of the phone. We have NEVER re-used email accounts! What was once a reasonable and acceptable practice, is now obsolete!

Another issue we have the actual deletion of mailboxes. In the stand alone domain, the module that deleted a subscriber record, would also delete the exchange mailbox. But with our ``real'' windows domain, the administrators still review and delete mailboxes by hand. I expect once the mailboxes from last springs students hits the ``delete'' queue, they may reconsider this. For now, we delete them as subscribers (which frees up the Unity license) and they are marked as disabled in Exchange.

One of the more annoying problems, is dealing with full mailboxes. With the stand alone domain, we had a rule that would permanently delete messages that had been ``deleted'' by the user. Mailboxes would still occasionally fill up, but that didn't really cause much of fuss. Unfortunately, we have some users of the exchange service, who have decided that the trash can, is just another folder and that it is a good place for long term storage (I would hate to see their office). We have missed our chance to put the same rule we had on the stand alone system, trash gets emptied automatically!

Futures

Although we are now positioned to provide unified voice messaging to anyone on campus, there are some issues to be worked out. We have the basic problem that while anyone with a telephone (and in some cases, that may not be a requirement) can have a voicemail box, the requirements to get an exchange mailbox are much stricter. There are also some additional features we would like to offer, and some other minor problems that we would like to fix.

Partially Unified Environment

Unlike many Unity installations, we will be operating in a mixed environment where many people are not unified. This can result in some potential issues for our non unified users. Although we have attempted to hide voicemail only users in active directory, and we also tag their names with the word ``voicemail,'' these addresses can still ``leak'' out. The simplest way would be when a unified user receives voicemail from a non unified, but on campus, user. The voicemail will be from a recognizable name (i.e., ``David Hudson (Voicemail).'' It is a trivial matter in outlook to then add that address to your address book, and then you can easily access what is supposed to be a hidden name. Ok, so what is the problem here? Say some wacko (perhaps with tenure) leaves me voicemail saying that he wants some specific hostname changed. As a unified user, I forward this, after typing some comments like ``Ignore this idiot - let me know if he contacts you,'' but I accidentally get Dave's voicemail entry. Dave then listens to his voicemail, is told by Unity that I forwarded a voicemail to him, and plays him the original message, But since there is a voice message, it does NOT read him my comments. If I had just sent Dave a regular email to his voicemail address, he would have been told he has an email (which might confuse him), and it would then read it to him, but in this case, since there was voice, only that would be played.

There are a few other oddball cases like this, but we were concerned enough that we have delayed widespread deployment until we can resolve this. Work is underway to add some hooks in the Exchange server that will detect these cases and generate a bounce to the sender. Once that is done, I expect that we will resume the more general deployment.

Student Voicemail Becomes Opt-In

One of the things we had overlooked in this project, was anti-virus scanning. In the original stand alone deployment, we did not need anti virus scanning, as the exchange server was pretty well isolated from the rest of the world. However, in the unified environment, we need the scanning, and you have to scan all mailboxes. This is licensed on a per mailbox basis, so there was a jump in the licensing cost. Cisco is also changing their licensing, and the per mailbox cost is going to be going up.

Historically, we had provided voicemail service to all on campus students. Not only was the old Octel system paid for, the vendor had gone out of business, so even if there had been per mailbox licensing costs, there was no one to pay them to. It was easier to create mailboxes for everyone, and ignore the idle ones. Now that model has changed, and there is significant costs for mailboxes. We don't mind paying for active ones, but paying for idle ones is a bit annoying. Many of our students come to campus now with their own cell phones. One of the things we have noticed, is a large drop in long distance revenue from students - they are no longer using their dorm room phones to make long distance calls. What is more, they don't seem to be using them all that much to receive calls - at least many are not bothering to set up their voicemail boxes. We did some analysis of usage; one of the fields saved by Unity is the last time a mailbox was opened via the phone. For the spring semester, of the 2500 student voicemail boxes we had on line, only 500 actually called it! We had enabled email notification for students, and all mailboxes had a recorded name (done automatically), but it was pretty clear that we were wasting a lot of licenses.

After some discussions with the CIO, Residence Life and the Office of the First Year Experience, we decided to make student voicemail an opt in service. The web tool they use to pick up their voicemail PIN, will let them request/create a voicemail box if they so chose. After about three weeks since the dorms opened, we have had 370 out of a possible 2925 students request a voice mailbox for their dorm room.

Department Administrator Tools

We have identified departmental administrators for each department. These people can update directory information for people in their departments, as well as issue short term VPN/Wireless access accounts and manage guests. We will be adding a tool to help these people administer the voice mailboxes owned by their department or people in their department. This will likely be rolled out when a similar tool to administer VOIP equipment is released.

User Call Handler Options

One feature we hope to release to users once we understand the billing issues, is the ability to maintain your own caller input selections. For instance, when you listen to my message, you are given the option to press six, and your call will be transferred to my cell phone. This allows people to contact me via my cell phone, yet I don't need to give out my cell phone number.

There are a number of other advanced features in the Unity systems that we may be exploring as well.

References and Availability

The bulk of this project is written in PL/SQL. The core package is the Unity_Maint package (see Figure 2) that provides access the to Oracle tables that store our version of the configuration, and communicates with the Unity server via the Meta_Change _Queue package. This package is basically site independent - none of our business rules are applied here, just the basic communication and configuration. The bulk of the site specific operations, and those requiring work in more than one table (such as creating ECPs) is in the Unity_Functions package. Later efforts to work in expiring mailboxes was put in the Unity_Expire package. This division was mostly to accommodate a lot of changes in expiration processing without impacting tools using the Unity_Functions package. The primary administrative tool is provided via the Web_Unity_ Admin package. The student voicemail tool predated this project by several years and is in the Web_Voicemail_Admin package which in turn used the Tcom_Voicemail_Maint package. These existing packages were joined to the new project via the Unity_Dorm_Functions package. Some of this structure is the result of when things were deployed and several packages could be merged.



Figure 2: Code Structure.

The Unity Queue Runner program took commands from the Meta_Change_Queue, translate them via the Unity_Record package and then processes them appropriately. Although in our original Windows 2000 integration process we were maintaining Active Directory directly, in this case, we made the changes in the Unity server (which has it's own SQLServer database), and the Unity application would make the changes in Active Directory. The Unity application would also create Exchange mailboxes as needed (Deleting mailboxes has been disabled for now).

Most of the PL/SQL source code for the Simon system as well as the full table and view descriptions are available via the web at https://www.rpi.edu/campus/rpi/simon/misc/Tables/simon.Index.html and https://www.rpi.edu/campus/rpi/simon/misc/Tables/SIS-index.html. Some of the modules that interface with the Cisco Call Manager are currently under contract with another vendor, and we are not making them publicly available until the details of the contract are worked out. The migration tools were changing during the course of the migration, what we used at the start is different from tool we used at the end of the project. These tools were not intended for extended use, although we will keep the source code around in case we migrate again. There are also a number of scripts that were put together as needed.

If you ask nicely, I will try to answer questions and might be able to dig out some of the C and JAVA code that makes up other parts of the system.

Acknowledgments

I would like to thank Rudi van Drunen for his shepherding of this paper with me. I also want to thank Rob Kolstad for his excellent (as usual) job of typesetting this paper. I also want to thank the other members of the Unified Messaging Team here at Rensselaer for their contributions to the project, as well as my girlfriend Joyce who encouraged me throughout the entire process.

Author Biography

Jon Finke graduated from Rensselaer in 1983 with a BS-ECSE. After stints doing communications programming for PCs and later general networking development on the mainframe, he then inherited the Simon project, which has been his primary focus for the past 15 years. He is currently a Senior Systems Programmer in the Communication and Middleware Technology department at Rensselaer, where he is developing identity management systems and integrating Simon with the rest of the Institute information systems. In addition to the Simon project, Jon is also involved with the support of the Telecommunications billing system, and providing data and interfaces for Unity Voice Messaging and CISCO VOIP deployment projects at Rensselaer. He hopes to someday find out what Middleware is. When not playing with computers, you can often find him merging a pair of adjacent row houses into one, or inventing new methods of double entry accounting as treasurer for Habitat for Humanity of Rensselaer County. Reach him via USMail at RPI; VCC 319; 110 8th St; Troy, NY 12180-3590. Reach him electronically at Find out more via https://www.rpi.edu/~finkej.

Bibliography

[1] Chapman, Brent, ``Incident command for IT: What we can learn from the fire department,'' The 19th Large Installation Systems Administration Conference (LISA 2005), December, 2005.
[2] Finke, Jon, ``Institute white pages as a system administration problem,'' The Tenth Systems Administration Conference (LISA 96) Proceedings, pp. 233-240, USENIX, October, 1996.
[3] Finke, Jon, ``Embracing and extending Windows 2000,'' The Sixteenth Systems Administration Conference (LISA 2002), USENIX, November, 2002.
[4] Finke, Jon, ``Generating configuration files: The directors cut,'' The Seventeenth Systems Administration Conference (LISA 2003), USENIX, October, 2003.
[5] Finke, Jon, ``Meta change queue: Tracking changes to people, places and things,'' The Eighteenth Large Installation Systems Administration Conference (LISA 2004), pp. 231-239, USENIX, November, 2004.
[6] Finke, Jon, ``When worlds collide: The two-sided sword of technology integration,'' ;Login: The USENIX Magazine, Vol. 30, Num. 3, pp. 6-7, June, 2005.
[7] Microsoft, Visual c#.net, 2001, https://msdn.microsoft.com/vcsharp.
Footnotes:
Note 1: Some replacement parts were obtained via EBay
Note 2: We had previously automated the creating and expiration of student voicemail assignments based on room assignments in the Housing Office database.
Note 3: It isn't that we don't trust our Telecom staff, but they do not have the training to administer Exchange and they are not in the department that is responsible for the Exchange service.
Note 4: ECP - A TLA we inherited from the Octel voicemail system - press 1 for John, press 2 for Sam
Note 5: Our campus uses four digit dialing - these six digit numbers are not directly dial-able, but can be dialed from within the voicemail system.
Note 6: There is a childlike attraction to selecting ``mark as unread'' in Outlook and having the red light on your phone turn on.
Note 7: This actually worked quite well, after 18 months of operation, we had only had a handful of errors - all due to human intervention
Note 8: Although we do not charge for voicemail, we often would have owner information for a number (telephone) that we did bill for in the telephone billing system. Sadly, this information did not include a validated owner.
Note 9: We eventually settled on the name ``Unified'' for the new system and ``Stand Alone'' for the old one.
Note 10: The Call Manager is the ``brains'' of the VOIP system.
Note 11: Only the first column of the query would be returned and the total returned data was truncated at 32 Kbytes.
Note 12: OK, 5-8 numeric digits and known hash, we could brute force it.
Note 13: Binary Large Object - how Oracle can store large binary data values such as a .WAV file.
Note 14: Katia Birgit Hill, 7 lb, 13 oz
Note 15: Which is a nice way of saying ``wrong.'' But we didn't know any better at the time.
Last changed: 1 Dec. 2006 jel