[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