From 7c8489f170e9ee1eb9cc418487b4f1b044711c31 Mon Sep 17 00:00:00 2001 From: helmutm Date: Mon, 25 Feb 2008 14:12:37 +0000 Subject: [PATCH] completed sample implementation (without Twisted), with simple logging git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2420 fd906abe-77d9-0310-91a1-e0d9ade77398 --- agent/README.txt | 18 +++++++++++++++--- agent/base/agent.py | 14 +++++++++----- agent/base/control.py | 3 ++- agent/base/job.py | 1 + agent/base/log.py | 3 ++- agent/base/sample.cfg | 2 +- agent/interfaces.py | 3 +++ 7 files changed, 33 insertions(+), 11 deletions(-) diff --git a/agent/README.txt b/agent/README.txt index 481888b..e31b8cd 100644 --- a/agent/README.txt +++ b/agent/README.txt @@ -107,7 +107,7 @@ the path to the configuration file. >>> master.config controller.name = 'sample' logger.name = 'default' - logger.standard = 20 + logger.standard = 30 scheduler.name = 'sample' Controllers @@ -158,9 +158,9 @@ We schedule a sample job by taking the role of the controller and simply call the master agent's callback method for entering jobs. >>> from cybertools.agent.base.control import JobSpecification - >>> jobSpec = JobSpecification('sample', agent='sample01') + >>> jobSpec = JobSpecification('sample', '00001', agent='sample01') >>> master.setupJobs([jobSpec]) - Job <...Job object ...> on agent <...SampleAgent object ...> has been executed. + Job 00001 on agent sample01 has been executed. Logging ------- @@ -169,3 +169,15 @@ Logging >>> agent01.logger is master.logger True + + >>> master.config.logger.standard = 20 + >>> master.logger.setup() + >>> jobSpec = JobSpecification('sample', '00002', agent='sample01') + >>> master.setupJobs([jobSpec]) + Job 00002 on agent sample01 has been executed. + 2... agent:sample01 job:00002 message:job execution + + >>> for r in master.logger.records: + ... print r + 2... agent:sample01 job:00001 message:job execution + 2... agent:sample01 job:00002 message:job execution diff --git a/agent/base/agent.py b/agent/base/agent.py index 54ac3ef..9acd09c 100644 --- a/agent/base/agent.py +++ b/agent/base/agent.py @@ -34,6 +34,7 @@ class Agent(object): implements(IAgent) + name = '???' master = None config = None logger = None @@ -49,6 +50,7 @@ class Agent(object): class Master(Agent): + name = 'master' scheduler = None def __init__(self, configuration=None): @@ -69,24 +71,26 @@ class Master(Agent): def setupAgents(self, agentSpecs): for spec in agentSpecs: agent = agents(self, spec.type) + agent.name = spec.name self.children[spec.name] = agent def setupJobs(self, jobSpecs): for spec in jobSpecs: job = jobs(self.scheduler, spec.type) job.agent = self.children[spec.agent] + job.identifier = spec.identifier self.scheduler.schedule(job, spec.startTime) class SampleAgent(Agent): def execute(self, job, params=None): - msg = 'Job %s on agent %s has been executed.' % (job, self) - print msg - self.log(msg) + print 'Job %s on agent %s has been executed.' % (job.identifier, self.name) + self.log(job) - def log(self, msg): - self.logger.log(dict(msg=msg)) + def log(self, job): + self.logger.log(dict(message='job execution', job=job.identifier, + agent=self.name)) agents.register(SampleAgent, Master, name='sample') diff --git a/agent/base/control.py b/agent/base/control.py index 70cb9e2..726d019 100644 --- a/agent/base/control.py +++ b/agent/base/control.py @@ -68,8 +68,9 @@ class JobSpecification(object): startTime = None - def __init__(self, type, **kw): + def __init__(self, type, identifier, **kw): self.type = type + self.identifier = identifier for k, v in kw.items(): setattr(self, k, v) diff --git a/agent/base/job.py b/agent/base/job.py index 2acb2d3..3b1ce35 100644 --- a/agent/base/job.py +++ b/agent/base/job.py @@ -33,6 +33,7 @@ class Job(object): implements(IScheduledJob) + identifier = '???' agent = None startTime = None repeat = 0 diff --git a/agent/base/log.py b/agent/base/log.py index 26a7197..95917b7 100644 --- a/agent/base/log.py +++ b/agent/base/log.py @@ -59,11 +59,12 @@ class Logger(object): def __init__(self, agent): self.agent = agent self.records = [] - self.externalLoggers = [] self.setup() + self.externalLoggers = [] def setup(self): conf = self.agent.config.logger + self.externalLoggers = [] if conf.standard: logger = logging.getLogger() logger.level = conf.standard diff --git a/agent/base/sample.cfg b/agent/base/sample.cfg index 8338d97..fca1099 100644 --- a/agent/base/sample.cfg +++ b/agent/base/sample.cfg @@ -6,4 +6,4 @@ controller(name='sample') scheduler(name='sample') -logger(name='default', standard=20) +logger(name='default', standard=30) diff --git a/agent/interfaces.py b/agent/interfaces.py index 5865bb2..debbbd9 100644 --- a/agent/interfaces.py +++ b/agent/interfaces.py @@ -31,6 +31,7 @@ class IAgent(Interface): """ An agent waits for jobs to execute. """ + name = Attribute('A name identifying the agent.') master = Attribute('IMaster instance.') config = Attribute('Configuration settings.') logger = Attribute('Logger instance to be used for recording ' @@ -154,6 +155,8 @@ class IScheduledJob(Interface): a predefined date and time - this is the basic job interface. """ + identifier = Attribute('A name/ID unique within the realm of the ' + 'controller.') scheduler = Attribute('Scheduler that controls this job.') agent = Attribute('Agent responsible for executing the job.') startTime = Attribute('Date/time at which the job should be executed.')