aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/schedulers/trysched.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/schedulers/trysched.py')
-rw-r--r--lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/schedulers/trysched.py304
1 files changed, 0 insertions, 304 deletions
diff --git a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/schedulers/trysched.py b/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/schedulers/trysched.py
deleted file mode 100644
index 79179ba8..00000000
--- a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/schedulers/trysched.py
+++ /dev/null
@@ -1,304 +0,0 @@
-# This file is part of Buildbot. Buildbot is free software: you can
-# redistribute it and/or modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation, version 2.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc., 51
-# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Copyright Buildbot Team Members
-
-import os
-
-from twisted.internet import defer
-from twisted.python import log
-from twisted.protocols import basic
-
-from buildbot import pbutil
-from buildbot.util.maildir import MaildirService
-from buildbot.util import json
-from buildbot.util import netstrings
-from buildbot.process.properties import Properties
-from buildbot.schedulers import base
-from buildbot.status.buildset import BuildSetStatus
-
-
-class TryBase(base.BaseScheduler):
-
- def filterBuilderList(self, builderNames):
- """
- Make sure that C{builderNames} is a subset of the configured
- C{self.builderNames}, returning an empty list if not. If
- C{builderNames} is empty, use C{self.builderNames}.
-
- @returns: list of builder names to build on
- """
-
- # self.builderNames is the configured list of builders
- # available for try. If the user supplies a list of builders,
- # it must be restricted to the configured list. If not, build
- # on all of the configured builders.
- if builderNames:
- for b in builderNames:
- if not b in self.builderNames:
- log.msg("%s got with builder %s" % (self, b))
- log.msg(" but that wasn't in our list: %s"
- % (self.builderNames,))
- return []
- else:
- builderNames = self.builderNames
- return builderNames
-
-
-class BadJobfile(Exception):
- pass
-
-
-class JobdirService(MaildirService):
- # NOTE: tightly coupled with Try_Jobdir, below
-
- def messageReceived(self, filename):
- f = self.moveToCurDir(filename)
- return self.parent.handleJobFile(filename, f)
-
-
-class Try_Jobdir(TryBase):
-
- compare_attrs = TryBase.compare_attrs + ('jobdir',)
-
- def __init__(self, name, builderNames, jobdir,
- properties={}):
- TryBase.__init__(self, name=name, builderNames=builderNames,
- properties=properties)
- self.jobdir = jobdir
- self.watcher = JobdirService()
- self.watcher.setServiceParent(self)
-
- def startService(self):
- # set the watcher's basedir now that we have a master
- jobdir = os.path.join(self.master.basedir, self.jobdir)
- self.watcher.setBasedir(jobdir)
- for subdir in "cur new tmp".split():
- if not os.path.exists(os.path.join(jobdir, subdir)):
- os.mkdir(os.path.join(jobdir, subdir))
- TryBase.startService(self)
-
- def parseJob(self, f):
- # jobfiles are serialized build requests. Each is a list of
- # serialized netstrings, in the following order:
- # format version number:
- # "1" the original
- # "2" introduces project and repository
- # "3" introduces who
- # "4" introduces comment
- # "5" introduces properties and JSON serialization of values after
- # version
- # jobid: arbitrary string, used to find the buildSet later
- # branch: branch name, "" for default-branch
- # baserev: revision, "" for HEAD
- # patch_level: usually "1"
- # patch_body: patch to be applied for build
- # repository
- # project
- # who: user requesting build
- # comment: comment from user about diff and/or build
- # builderNames: list of builder names
- # properties: dict of build properties
- p = netstrings.NetstringParser()
- f.seek(0,2)
- if f.tell() > basic.NetstringReceiver.MAX_LENGTH:
- raise BadJobfile("The patch size is greater that NetStringReceiver.MAX_LENGTH. Please Set this higher in the master.cfg")
- f.seek(0,0)
- try:
- p.feed(f.read())
- except basic.NetstringParseError:
- raise BadJobfile("unable to parse netstrings")
- if not p.strings:
- raise BadJobfile("could not find any complete netstrings")
- ver = p.strings.pop(0)
-
- v1_keys = ['jobid', 'branch', 'baserev', 'patch_level', 'patch_body']
- v2_keys = v1_keys + ['repository', 'project']
- v3_keys = v2_keys + ['who']
- v4_keys = v3_keys + ['comment']
- keys = [v1_keys, v2_keys, v3_keys, v4_keys]
- # v5 introduces properties and uses JSON serialization
-
- parsed_job = {}
-
- def extract_netstrings(p, keys):
- for i, key in enumerate(keys):
- parsed_job[key] = p.strings[i]
-
- def postprocess_parsed_job():
- # apply defaults and handle type casting
- parsed_job['branch'] = parsed_job['branch'] or None
- parsed_job['baserev'] = parsed_job['baserev'] or None
- parsed_job['patch_level'] = int(parsed_job['patch_level'])
- for key in 'repository project who comment'.split():
- parsed_job[key] = parsed_job.get(key, '')
- parsed_job['properties'] = parsed_job.get('properties', {})
-
- if ver <= "4":
- i = int(ver) - 1
- extract_netstrings(p, keys[i])
- parsed_job['builderNames'] = p.strings[len(keys[i]):]
- postprocess_parsed_job()
- elif ver == "5":
- try:
- parsed_job = json.loads(p.strings[0])
- except ValueError:
- raise BadJobfile("unable to parse JSON")
- postprocess_parsed_job()
- else:
- raise BadJobfile("unknown version '%s'" % ver)
- return parsed_job
-
- def handleJobFile(self, filename, f):
- try:
- parsed_job = self.parseJob(f)
- builderNames = parsed_job['builderNames']
- except BadJobfile:
- log.msg("%s reports a bad jobfile in %s" % (self, filename))
- log.err()
- return defer.succeed(None)
-
- # Validate/fixup the builder names.
- builderNames = self.filterBuilderList(builderNames)
- if not builderNames:
- log.msg(
- "incoming Try job did not specify any allowed builder names")
- return defer.succeed(None)
-
- who = ""
- if parsed_job['who']:
- who = parsed_job['who']
-
- comment = ""
- if parsed_job['comment']:
- comment = parsed_job['comment']
-
- d = self.master.db.sourcestampsets.addSourceStampSet()
-
- def addsourcestamp(setid):
- self.master.db.sourcestamps.addSourceStamp(
- sourcestampsetid=setid,
- branch=parsed_job['branch'],
- revision=parsed_job['baserev'],
- patch_body=parsed_job['patch_body'],
- patch_level=parsed_job['patch_level'],
- patch_author=who,
- patch_comment=comment,
- patch_subdir='', # TODO: can't set this remotely - #1769
- project=parsed_job['project'],
- repository=parsed_job['repository'])
- return setid
-
- d.addCallback(addsourcestamp)
-
- def create_buildset(setid):
- reason = "'try' job"
- if parsed_job['who']:
- reason += " by user %s" % parsed_job['who']
- properties = parsed_job['properties']
- requested_props = Properties()
- requested_props.update(properties, "try build")
- return self.addBuildsetForSourceStamp(
- ssid=None, setid=setid,
- reason=reason, external_idstring=parsed_job['jobid'],
- builderNames=builderNames, properties=requested_props)
- d.addCallback(create_buildset)
- return d
-
-
-class Try_Userpass_Perspective(pbutil.NewCredPerspective):
- def __init__(self, scheduler, username):
- self.scheduler = scheduler
- self.username = username
-
- @defer.inlineCallbacks
- def perspective_try(self, branch, revision, patch, repository, project,
- builderNames, who="", comment="", properties={}):
- db = self.scheduler.master.db
- log.msg("user %s requesting build on builders %s" % (self.username,
- builderNames))
-
- # build the intersection of the request and our configured list
- builderNames = self.scheduler.filterBuilderList(builderNames)
- if not builderNames:
- return
-
- reason = "'try' job"
-
- if who:
- reason += " by user %s" % who
-
- if comment:
- reason += " (%s)" % comment
-
- sourcestampsetid = yield db.sourcestampsets.addSourceStampSet()
-
- yield db.sourcestamps.addSourceStamp(
- branch=branch, revision=revision, repository=repository,
- project=project, patch_level=patch[0], patch_body=patch[1],
- patch_subdir='', patch_author=who or '',
- patch_comment=comment or '',
- sourcestampsetid=sourcestampsetid)
- # note: no way to specify patch subdir - #1769
-
- requested_props = Properties()
- requested_props.update(properties, "try build")
- (bsid, brids) = yield self.scheduler.addBuildsetForSourceStamp(
- setid=sourcestampsetid, reason=reason,
- properties=requested_props, builderNames=builderNames)
-
- # return a remotely-usable BuildSetStatus object
- bsdict = yield db.buildsets.getBuildset(bsid)
-
- bss = BuildSetStatus(bsdict, self.scheduler.master.status)
- from buildbot.status.client import makeRemote
- defer.returnValue(makeRemote(bss))
-
- def perspective_getAvailableBuilderNames(self):
- # Return a list of builder names that are configured
- # for the try service
- # This is mostly intended for integrating try services
- # into other applications
- return self.scheduler.listBuilderNames()
-
-
-class Try_Userpass(TryBase):
- compare_attrs = ('name', 'builderNames', 'port', 'userpass', 'properties')
-
- def __init__(self, name, builderNames, port, userpass,
- properties={}):
- TryBase.__init__(self, name=name, builderNames=builderNames,
- properties=properties)
- self.port = port
- self.userpass = userpass
-
- def startService(self):
- TryBase.startService(self)
-
- # register each user/passwd with the pbmanager
- def factory(mind, username):
- return Try_Userpass_Perspective(self, username)
- self.registrations = []
- for user, passwd in self.userpass:
- self.registrations.append(
- self.master.pbmanager.register(
- self.port, user, passwd, factory))
-
- def stopService(self):
- d = defer.maybeDeferred(TryBase.stopService, self)
-
- def unreg(_):
- return defer.gatherResults(
- [reg.unregister() for reg in self.registrations])
- d.addCallback(unreg)
- return d