From 6b05407646140b4ce2b16463bb96bf471dd5e646 Mon Sep 17 00:00:00 2001 From: Ansgar Burchardt Date: Sat, 16 Jan 2016 15:23:39 +0100 Subject: [PATCH] Add option to forbid source and/or binary uploads to a suite This is intended to be used to forbid uploads to policy queues and build queues which would result in confusing results. While we already have a "reject" option in the dak.conf's SuiteMappings, having the option in the database means we don't have to edit dak.conf when configuring new suites. Another usecase will be the "unstable" suite for Debian Ports: here we want to import the source packages (and arch:all) from the main archive and only accept binary uploads. Additional source packages must go into the "unreleased-*" suites. This was not possible via SuiteMappings. Bug: https://bugs.debian.org/783115 --- dak/dakdb/update113.py | 63 ++++++++++++++++++++++++++++++++++++++++++ daklib/archive.py | 1 + daklib/checks.py | 8 ++++++ 3 files changed, 72 insertions(+) create mode 100644 dak/dakdb/update113.py diff --git a/dak/dakdb/update113.py b/dak/dakdb/update113.py new file mode 100644 index 00000000..87e00e6e --- /dev/null +++ b/dak/dakdb/update113.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# coding=utf8 + +""" +Add accept_{source,binary}_uploads to suite + +@contact: Debian FTP Master +@copyright: 2016, Ansgar Burchardt +@license: GNU General Public License version 2 or later +""" + +# This program 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; either version 2 of the License, or +# (at your option) any later version. + +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +################################################################################ + +import psycopg2 +from daklib.dak_exceptions import DBUpdateError +from daklib.config import Config + +statements = [ +""" +ALTER TABLE suite + ADD COLUMN accept_source_uploads BOOLEAN DEFAULT TRUE, + ADD COLUMN accept_binary_uploads BOOLEAN DEFAULT TRUE +""", +""" +UPDATE suite + SET accept_source_uploads = FALSE, accept_binary_uploads = FALSE + WHERE id IN (SELECT suite_id FROM policy_queue) + OR id IN (SELECT suite_id FROM build_queue) + OR id IN (SELECT debugsuite_id FROM suite) +""" +] + +################################################################################ +def do_update(self): + print __doc__ + try: + cnf = Config() + + c = self.db.cursor() + + for stmt in statements: + c.execute(stmt) + + c.execute("UPDATE config SET value = '113' WHERE name = 'db_revision'") + self.db.commit() + + except psycopg2.ProgrammingError as msg: + self.db.rollback() + raise DBUpdateError('Unable to apply sick update 113, rollback issued. Error message: {0}'.format(msg)) diff --git a/daklib/archive.py b/daklib/archive.py index e4140a12..6577d359 100644 --- a/daklib/archive.py +++ b/daklib/archive.py @@ -972,6 +972,7 @@ class ArchiveUpload(object): self.final_suites = final_suites for chk in ( + checks.SuiteCheck, checks.TransitionCheck, checks.ACLCheck, checks.NoSourceOnlyCheck, diff --git a/daklib/checks.py b/daklib/checks.py index b187f030..e17a191e 100644 --- a/daklib/checks.py +++ b/daklib/checks.py @@ -799,6 +799,14 @@ class SourceFormatCheck(Check): if query.first() is None: raise Reject('source format {0} is not allowed in suite {1}'.format(source_format, suite.suite_name)) +class SuiteCheck(Check): + def per_suite_check(self, upload, suite): + if not suite.accept_source_uploads and upload.changes.source is not None: + raise Reject('The suite "{0}" does not accept source uploads.'.format(suite.suite_name)) + if not suite.accept_binary_uploads and len(upload.changes.binaries) != 0: + raise Reject('The suite "{0}" does not accept binary uploads.'.format(suite.suite_name)) + return True + class SuiteArchitectureCheck(Check): def per_suite_check(self, upload, suite): session = upload.session -- 2.39.2