===================== Using Zope 2 Instance ===================== The use of Zope 2 Instance is best demonstrated by example. The :file:`buildout.cfg` below shows all the elements of the recipe you are likely to need: - You should lock down the versions of packages used to those in the "known good set" for the Zope version you are targetting using an `extends` key pointing at the configuration containing the relevent "known good set". - You specify the name of the deployment section the instance should use with the `deployment` key. - Any extension packages you wish to use in your instance, such as those containing Zope Products, should be specified in the `eggs` key. - The full contents of the :file:`zope.conf` you require should be put in the key of the same name. You should use buildout's templating to define the paths required within :file:`zope.conf`. In particular, you should use the locations provided by the deployment section to build the paths for the relevent resources, as shown in he example below. .. topic:: buildout.cfg :class: write-file :: [buildout] parts = instance # if you want to use a particular zope version, include a line # such as: # extends = http://download.zope.org/Zope2/index/2.12.7/versions.cfg [instance] recipe = zope2instance:server deployment = demo eggs = mailinglogger zope.conf = instancehome ${buildout:directory} address 8080 %import mailinglogger level info path ${demo:log-directory}/${demo:name}-event.log level info level critical from support@example.com to monkeys@example.com level WARN path ${demo:log-directory}/${demo:name}-Z2.log format %(message)s path ${buildout:directory}/Data.fs mount-point / name temporary storage for sessioning mount-point /temp_folder container-class Products.TemporaryFolder.TemporaryContainer [demo] recipe = gocept.recipe.deploymentsandbox Running the buildout will show you the locations of the normal :file:`zopectl` and :file:`runzope` scripts:: Installing demo. Installing instance. Generated script '/sample-buildout/parts/demo/etc/init.d/demo-instance-zopectl'. Generated interpreter '/sample-buildout/parts/demo/etc/init.d/demo-instance-py'. Generated script '/sample-buildout/parts/demo/etc/init.d/demo-instance-runzope'. .. -> output A python interpreter with a name ending in :file:`-py` will also be created. This is required for :file:`runzope` to work but can also be a handy way of getting a python prompt with all your packages available but without the overhead of start up a `zopectl debug` session. A :file:`zope.conf` will also de created in the `etc-directory` defined by the deployment. For the above example, it would contain:: instancehome /sample-buildout address 8080 %import mailinglogger level info path /sample-buildout/parts/demo/var/log/demo/demo-event.log level info level critical from support@example.com to monkeys@example.com level WARN path /sample-buildout/parts/demo/var/log/demo/demo-Z2.log format %(message)s path /sample-buildout/Data.fs mount-point / name temporary storage for sessioning mount-point /temp_folder container-class Products.TemporaryFolder.TemporaryContainer .. -> zope_conf .. invisible-code-block: python # check the buildout worked check(output,system(buildout)) # check the contents of zope.conf check(zope_conf.strip(), td.read('parts/demo/etc/demo/demo-instance-zope.conf').strip()) # fix the port to the one we know is free replace('parts/demo/etc/demo/demo-instance-zope.conf', '8080',port) # Mac OS has funny ideas about how long socket paths can be replace( 'parts/demo/etc/init.d/demo-instance-zopectl', td.path+'/parts/demo/var/run/demo/demo-instance-zdaemon.sock', dir+'/z.sock' ) .. some tests: Check the instance starts: >>> print system(td.path+'/parts/demo/etc/init.d/demo-instance-zopectl start').strip().lstrip('.').strip() daemon process started, pid=... >>> wait_for_started('parts/demo/var/log/demo/demo-event.log') Check we can connect to it: >>> from urllib import urlopen >>> 'Welcome to Zope' in urlopen('http://127.0.0.1:'+port).read() True Check the instance stops: >>> print system(td.path+'/parts/demo/etc/init.d/demo-instance-zopectl stop').strip().lstrip('.').strip() daemon process stopped .. invisible-code-block: python # check for zc.recipe.rhrc compatability from ConfigParser import RawConfigParser from testfixtures import compare p = RawConfigParser() p.read(td.getpath('.installed.cfg')) compare( p.get('instance','run-script'), td.getpath('parts/demo/etc/init.d/demo-instance-zopectl') )