So I’m using the time to do the following:
- Close as many small, easy tickets as I can for the upcoming Review Board release. I’ve already posted some patches for review. More forthcoming.
- Get to know the tools I’ll be using. Review Board is hosted on Github, and I’m relatively new to the whole DVCS thing. I’ve been figuring out how to use Git, how to post patches, merging, branching, etc.
- Get to know the area I’ll be working in. I’ve been figuring out how Django apps organize themselves. I’ve also drawn up a map of the current state of the extension framework to help me visualize it.
- Get to know the other developers working on Review Board. I’ve been hanging out in the #reviewboard-soc FreeNode IRC channel. Very nice, and helpful people to work with.
- Develop a plan of attack for my project
And this last point is the one I want to talk about.
The Review Board Extension Life-Cycle
An extension isn’t just some isolated piece of code that gets crammed into an application. When you’ve got multiple extensions already installed and running, installing and activating a new extension is like introducing a new animal into an ecosystem. You have to make sure that your new animal plays nice with the others, and that, in the morning, there won’t be a pile of rotting corpses where your application used to be.
I may have gotten carried away with my metaphor.
So let’s look at what I’m envisioning as the life-cycle for a Review Board extension. I’ll start right from the top.
Getting the Extension
Ideally, this will work as nicely as WordPress’s implementation: a Review Board administrator is given a catalog of extensions to choose from within the Administrator interface, and one click later, the desired extensions are downloaded and ready to be installed.
For all you system administrators out there, that last idea might make your toes curl. A Review Board administrator is not necessarily a system administrator, and the system administrator knows what he/she likes on their machine. An application that can go and download other applications can be dangerous. We have to ensure that the application that we’re downloading is the one we’re trying to download. The last thing we need is some man-in-the-middle to do something cute and bork the code review machine. And we want to ensure that the extension functions as advertised. No hidden features. No self-destruct mechanisms. No back doors.
Do I have a plan for this part? Well….no, not really. I don’t imagine I’ll get that far – I consider it a little out of my scope. So, for my project, I think it’ll satisfy if the system admin (or Review Board admin) can manually download the extension, decompress it, and place it where Review Board can work with it. That other stuff can come later (and I’ll try to design so that it can come later easily).
Installing the Extension
Ok, so at this point, we’ve got our extension downloaded in a place where Review Board can see it.
So now what?
Now we need to install the extension. To me, that means letting the extension put its roots into the RB install by creating database tables, preparing initial data, and generally doing everything to make conditions suitable for the extension to function.
When an extension install begins, I imagine it will consider the following questions (in no particular order):
- Do I (the extension) depend on other extensions to function? If so, are those extensions present? If not, let the user know so that they can go get them.
- Are there some extensions already installed that will conflict with me, or make me behave badly? If so, let the user know so that they can either remove that conflict, or find an alternative extension.
- Is the user entirely aware of what I can do? Make sure that my capabilities, limitations, and behavioural quirks are known to the user.
Once those 3 questions are answered, and everything is looking good for the install, the extension will create the database tables it needs (if any) in order to function. If anything goes wrong during this process, the database changes will be rolled back, and the user will get a full read out about what went wrong.
If nothing goes wrong, the extension will be installed. The user might then be asked to set some initial operating parameters for the extension.
Ok great – the extension is installed. Now what?
Activating the Extension
For something that sounds so dramatic, the explanation about what happens is pretty short: Review Board simply becomes aware that the extension is activated, and passes data through the necessary hooks in order for the extension to function properly. Upon activation, the extension should do a quick double-check to ensure that all prerequisites for the extension have been met. This is because we can’t trust users to activate an extension immediately after downloading them.
The Extension Runs
While it’s activated, the extension will probably react to various events that happen on Review Board. Tables will be updated. View methods will be run. Templates will be rendered.
If anything, ever, goes horribly wrong with an extension, the following will happen:
- A log entry will be written, dumping the error, and information about what the user was trying to do
- An error message will be displayed to the user, trying to tell them what exactly happened
- The extension (and its dependents) will be deactivated. They will no longer react to events on Review Board. Their tables will still be there, the settings will still, but the extension will be, in essence, asleep. Dormant. Non-reactive.
The administrator could try to reactivate the extension at this point. They might try to contact the extension developer for support.
The Extension is Un-installed
If the user wants to rid themselves of an extension, they must first deactivate it. This will put it (and its dependents) in the dormant state. It just switches them off, nothing else.
Deactivated extensions can then be un-installed. If the user chooses to un-install the extension, the extension database tables and settings will be wiped out.
The extension itself won’t be deleted though – at least, not within the scope of my project. The extension files will need to be removed from Review Board manually.
At this point, any dependents that this uninstalled extension had will no longer be able to be activated.
Anyhow, that’s how I envision the life-cycle. It’s my first go at it, so I’d love to hear some feedback if you have any.