[Checkins] SVN: lovely.remotetask/trunk/ enhanced autostart
behaviour. services can be started like: site@*, *@service and *@*
Bernd Roessl
bernd.roessl at lovelysystems.com
Mon Sep 24 05:10:10 EDT 2007
Log message for revision 79872:
enhanced autostart behaviour. services can be started like: site@*, *@service and *@*
Changed:
U lovely.remotetask/trunk/CHANGES.txt
U lovely.remotetask/trunk/src/lovely/remotetask/README.txt
U lovely.remotetask/trunk/src/lovely/remotetask/service.py
-=-
Modified: lovely.remotetask/trunk/CHANGES.txt
===================================================================
--- lovely.remotetask/trunk/CHANGES.txt 2007-09-23 23:19:11 UTC (rev 79871)
+++ lovely.remotetask/trunk/CHANGES.txt 2007-09-24 09:10:09 UTC (rev 79872)
@@ -5,16 +5,22 @@
after 0.2.7:
============
+- enhanced autostart behaviour: Services can be started like: site@*,
+ *@service and *@*
+
+
2007/08/07 0.2.6:
=================
- fix bug in sorting that causes column headers to never be clickable
+
2007/08/07 0.2.5:
=================
- no longer require session support for "Jobs" ZMI view
+
2007/08/06 0.2.4:
=================
Modified: lovely.remotetask/trunk/src/lovely/remotetask/README.txt
===================================================================
--- lovely.remotetask/trunk/src/lovely/remotetask/README.txt 2007-09-23 23:19:11 UTC (rev 79871)
+++ lovely.remotetask/trunk/src/lovely/remotetask/README.txt 2007-09-24 09:10:09 UTC (rev 79872)
@@ -39,22 +39,32 @@
>>> from lovely import remotetask
>>> service = remotetask.TaskService()
+The object should be located, so it get's a name:
+
+ >>> from zope.app.folder import Folder
+ >>> site1 = Folder()
+ >>> root['site1'] = site1
+ >>> from zope.app.component.site import LocalSiteManager
+ >>> from zope.security.proxy import removeSecurityProxy
+ >>> sm = LocalSiteManager(removeSecurityProxy(site1))
+ >>> site1.setSiteManager(sm)
+
+ >>> sm['default']['testTaskService1'] = service
+ >>> service = sm['default']['testTaskService1'] # caution! proxy
+ >>> service.__name__
+ u'testTaskService1'
+ >>> service.__parent__ is sm['default']
+ True
+
Let's register it under the name `TestTaskService`:
>>> from zope import component
>>> from lovely.remotetask import interfaces
- >>> component.provideUtility(service, interfaces.ITaskService,
+ >>> sm = site1.getSiteManager()
+ >>> sm.registerUtility(service, interfaces.ITaskService,
... name='TestTaskService1')
-The object should be located, so it get's a name:
- >>> root['testTaskService1'] = service
- >>> service = root['testTaskService1'] # caution! proxy
- >>> service.__name__
- u'testTaskService1'
- >>> service.__parent__ is root
- True
-
We can discover the available tasks:
>>> service.getAvailableTasks()
@@ -147,8 +157,6 @@
>>> from zope.app.publication.zopepublication import ZopePublication
>>> conn = db.open()
>>> conn.root()[ZopePublication.root_name] = root
- >>> from zope.app.folder import Folder
- >>> root['site1'] = Folder()
>>> transaction.commit()
Fire the event::
@@ -166,6 +174,62 @@
The verification for the jobs in the root-level service is done in another
footnote [#2]_
+To deal with a lot of services in one sites it possible to use asterisks (*)
+to start services. In case of using site@* means start all services in that site::
+
+But first stop all processing services::
+
+ >>> service.stopProcessing()
+ >>> service.isProcessing()
+ False
+
+ >>> root_service.stopProcessing()
+ >>> root_service.isProcessing()
+ False
+
+Reset the product configuration with the asterisked service names::
+
+ >>> servicenames = ('site1@*')
+ >>> config.mapping['autostart'] = servicenames
+ >>> setProductConfigurations([config])
+ >>> getAutostartServiceNames()
+ ['site1@*']
+
+Fireing the event again will start all services in the configured site::
+
+ >>> bootStrapSubscriber(event)
+
+ >>> service.isProcessing()
+ True
+
+ >>> root_service.isProcessing()
+ False
+
+To deal with a lot of services in a lot of sites it possible to use asterisks (*)
+to start services. In case of using *@* means start all services on all sites::
+
+ >>> service.stopProcessing()
+ >>> service.isProcessing()
+ False
+
+Reset the product configuration with the asterisked service names::
+
+ >>> servicenames = ('*@*')
+ >>> config.mapping['autostart'] = servicenames
+ >>> setProductConfigurations([config])
+ >>> getAutostartServiceNames()
+ ['*@*']
+
+And fire the event again. All services should be started now::
+
+ >>> bootStrapSubscriber(event)
+
+ >>> service.isProcessing()
+ True
+
+ >>> root_service.isProcessing()
+ True
+
Finally stop processing and kill the thread. We'll call service.process()
manually as we don't have the right environment in the tests.
@@ -173,6 +237,10 @@
>>> service.isProcessing()
False
+ >>> root_service.stopProcessing()
+ >>> root_service.isProcessing()
+ False
+
Let's now read a job:
>>> jobid = service.add(u'echo', {'foo': 'bar'})
Modified: lovely.remotetask/trunk/src/lovely/remotetask/service.py
===================================================================
--- lovely.remotetask/trunk/src/lovely/remotetask/service.py 2007-09-23 23:19:11 UTC (rev 79871)
+++ lovely.remotetask/trunk/src/lovely/remotetask/service.py 2007-09-24 09:10:09 UTC (rev 79872)
@@ -31,6 +31,7 @@
from zope.app import zapi
from zope.app.appsetup.product import getProductConfiguration
from zope.app.container import contained
+from zope.app.component.interfaces import ISite
from zope.app.publication.zopepublication import ZopePublication
from zope.security.proxy import removeSecurityProxy
from zope.traversing.api import traverse
@@ -324,19 +325,38 @@
for siteName, serviceName in [name.split('@')
for name in serviceNames if name]:
if siteName == '':
- site = root_folder
+ sites = [root_folder]
+ elif siteName == '*':
+ sites = []
+ sites.append(root_folder)
+ for folder in root_folder.values():
+ if ISite.providedBy(folder):
+ sites.append(folder)
else:
- site = root_folder.get(siteName)
- if site is not None:
- service = component.queryUtility(interfaces.ITaskService,
- context=site,
- name=serviceName)
- if service is not None and not service.isProcessing():
- service.startProcessing()
- log.info('service %s on site %s started' % (serviceName,
- siteName))
+ sites = [root_folder.get(siteName)]
+
+ rootSM = root_folder.getSiteManager()
+ rootServices = list(rootSM.getUtilitiesFor(interfaces.ITaskService))
+
+ for site in sites:
+ if site is not None:
+ sm = site.getSiteManager()
+ if serviceName == '*':
+ services = list(sm.getUtilitiesFor(interfaces.ITaskService))
+ if siteName != "*" and siteName != '':
+ services = [s for s in services if s not in rootServices]
+ else:
+ services = [(serviceName,
+ component.queryUtility(interfaces.ITaskService,
+ context=site,
+ name=serviceName))]
+ for name, service in services:
+ if service is not None and not service.isProcessing():
+ service.startProcessing()
+ log.info('service %s on site %s started' % (name,
+ siteName))
+ else:
+ log.error('service %s on site %s not found' % (name,
+ siteName))
else:
- log.error('service %s on site %s not found' % (serviceName,
- siteName))
- else:
- log.error('site %s not found' % siteName)
+ log.error('site %s not found' % siteName)
More information about the Checkins
mailing list