Skip to main content

Managing multiple Plone buildouts

I recently had situation in work where I needed to update several of our Plone sites with few addon products. So far we haven't thought how we'll manage our sites update story as we've basically just recently entered to the amazing world of buildouts and several Plone-sites instead of one huge plone-site with zeo.

Gotta say I had few ideas popping in my head when I was manually running buildout scripts for each of our sites and stopping and restarting them after buildout was completed. My first though was to just simply write some script which does the job and then I was already imaging some web based service so we could manage our sites buildouts ttw. Well.. that might be a bit overkill.. at least for the starters, so I went back to roots and wrote a small python application which does the job. Basically it just takes the list of buildouts and runs buildout-script with -Nv parameters and restarts the site.

Source code is below and in the github.


#!/usr/bin/python2.5

from subprocess import check_call
from subprocess import CalledProcessError

#BUILDOUT_LIST is a list of folders where you're sites are
BUILDOUT_LIST = ['Site1',
'Site2']
class Buildout:
"""Takes care of managing one buildout"""

def __init__(self, path):
self.path = path
self.dev_null = open('/dev/null','wb')

def instance_cmd(self, command):
try:
if command == 'start':
print "Starting %s instance..." % self.path
elif command == 'stop':
print "Stopping %s instance..." % self.path

check_call(['./' + self.path + '/bin/instance', command],)

except CalledProcessError, e:
print e.returncode

def run_buildout(self):
try:
print "Trying to run buildout for %s " % self.path
dev_null = open('/dev/null','wb')
check_call(['bin/buildout', '-Nv'],
cwd='./'+self.path,
stderr=dev_null, stdout=dev_null)
print "Buildout for %s completed succesfully" % self.path

except CalledProcessError, e:
print "Error while running buildout for %s: %s" % (self.path,
str(e))

class BOManager:
""" Launches buildout scripts """

def __init__(self, buildouts):
self.buildouts = buildouts

def giveitago(self):
for buildout in self.buildouts:
print "-"*40
bo = Buildout(buildout)
bo.run_buildout()
bo.instance_cmd('stop')
bo.instance_cmd('start')
print "-"*40+"\n"

if __name__ == '__main__':
buildout = BOManager(BUILDOUT_LIST)
buildout.giveitago()

Comments

Popular posts from this blog

Usability and Plone

I've seen in here and there someone mentioning that usability of Plone is very good. Lot's of people - me included - like the fact that in Plone you don't have separate content management interface compared to some of Plones rivals. That counts for something when we're talking about good usability. Still that is only one quite small part of the whole picture. So what else is there? What do people like in Plone and where are the rough edges for end users? If general consensus is that Plone does have good usability, where is the actual proof of that? On plone.org I found one page in developer documentation mentioning following:  "Plone differentiates itself on usability. The intuitiveness of the user interface is what attracts people to Plone the most." I interpret this sentence meaning about the "one view for all" approach. What bugs me in this is that this whole sentence about good usability is about how the UI works compared to Plones competi...

Speed comparsions between Plone and Wordpress

Jon Stahl wrote recently a blogpost about Plone being three times faster than Dropal, Joomla and Wordpress . We had a small discussion about this in my workplace and as my colleague pointed out this wasn't a really that comprehensive test that you could state Plone being 3 times faster than it's competitors. This seemed a bit unfair test considering how fast this has been spread in tweet/blogosphere, so I decided to repeat the test with a bit more critical viewpoint. What's wrong in the original test? No one would consider opinion poll with 10 answers nowhere near trustworthy - it's all the same with requests. I didn't want to put up all the cms so I just set up second best (Wordpress 2.9.1) and compared that to my Plone development site (4.0a3). As a comparsion I did the first test with same ab command Jon used and my iMac gave following results: Wordpress: 7.13 requests / second Plone: 17.10 requests / second So far we have clear winner and Jons data hol...

Plone 4, ZEO and supervisor

This post belongs also to the "lessons learned" category. With Plone 3, ZEO and supervisor combination you've probably configured your supervisor to start plone instances by running $BUILDOUT/parts/client1/bin/runzope. Problem is that with Plone 4 your $BUILDOUT/parts/client folder doesn't contain anything else than etc folder. You know starting instances by targeting supervisor to use $BUILDOUT/bin/client1 fg doesn't work like you'd expect (supervisor would control the client1 script - not the actual plone process). My colleague Jussi Talaskivi figured that using 'console' argument instead of 'fg' for bin/client1 script should do the trick. With 'console' argument stopping, starting and restarting Plone 4 instances with supervisor works like a charm. Below is full example of working supervisor configuration. [buildout] parts = supervisor [supervisor] recipe = collective.recipe.supervisor port = 8200 user = xxxx password = ...