summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Styk <mastyk@redhat.com>2019-01-18 15:53:33 +0100
committerMartin Styk <mastyk@redhat.com>2019-01-18 15:53:33 +0100
commit506373616d80b676fe455b457b1a21148e5fbd61 (patch)
tree1a72158d989c271cc50696cce2a45ef49b39e78c
parentd9c2ddbc320eaaece6cc1f15162e053aa2fe1201 (diff)
parent9cdad4ab445ddf9c0040a4337d5596f59d13749b (diff)
Merge branch 'release-26' into developHEADdevelop
-rw-r--r--Client/setup.py2
-rw-r--r--Common/bkr/common/__init__.py2
-rw-r--r--Common/bkr/common/hub.py7
-rw-r--r--Common/setup.py2
-rw-r--r--IntegrationTests/setup.py2
-rw-r--r--IntegrationTests/src/bkr/inttest/server/selenium/test_task_by_name.py23
-rw-r--r--IntegrationTests/src/bkr/inttest/server/test_kickstart.py187
-rw-r--r--LabController/setup.py2
-rw-r--r--Server/bkr/server/snippets/print_anaconda_repos5
-rw-r--r--Server/bkr/server/snippets/print_repos6
-rw-r--r--Server/bkr/server/tasks.py14
-rw-r--r--Server/bkr/server/templates/master.kid30
-rw-r--r--Server/server.cfg7
-rw-r--r--Server/setup.py2
-rw-r--r--beaker.spec4
-rw-r--r--documentation/admin-guide/distro-import.rst4
-rw-r--r--documentation/admin-guide/man/beaker-log-delete.rst75
-rw-r--r--documentation/admin-guide/man/index.rst1
-rw-r--r--documentation/architecture-guide/log-storage.rst2
-rw-r--r--documentation/user-guide/customizing-installation.rst22
-rw-r--r--documentation/whats-new/release-26.rst115
21 files changed, 418 insertions, 96 deletions
diff --git a/Client/setup.py b/Client/setup.py
index a36428a..70e84b8 100644
--- a/Client/setup.py
+++ b/Client/setup.py
@@ -13,7 +13,7 @@ def bash_completion_dir():
setup(
name='beaker-client',
- version='26.2',
+ version='26.3',
description='Command-line client for interacting with Beaker',
author='Red Hat, Inc.',
author_email='beaker-devel@lists.fedorahosted.org',
diff --git a/Common/bkr/common/__init__.py b/Common/bkr/common/__init__.py
index 5c93f42..3f6dbc9 100644
--- a/Common/bkr/common/__init__.py
+++ b/Common/bkr/common/__init__.py
@@ -2,4 +2,4 @@
# code in bkr.__init__), the version details are retrieved from here in
# order to correctly handle module shadowing on sys.path
-__version__ = '26.2'
+__version__ = '26.3'
diff --git a/Common/bkr/common/hub.py b/Common/bkr/common/hub.py
index e26b9c6..4292ed8 100644
--- a/Common/bkr/common/hub.py
+++ b/Common/bkr/common/hub.py
@@ -56,6 +56,13 @@ class HubProxy(object):
ssl_context = ssl.create_default_context()
ssl_context.load_verify_locations(cafile=self._conf['CA_CERT'])
transport_args['context'] = ssl_context
+ elif (hasattr(ssl, '_create_unverified_context')
+ and not self._conf.get('SSL_VERIFY', True)):
+ # Python 2.6 doesn't have context argument for xmlrpclib.ServerProxy
+ # therefore transport needs to be modified
+ ssl_context = ssl._create_unverified_context()
+ transport_args['context'] = ssl_context
+
else:
TransportClass = retry_request_decorator(CookieTransport)
self._transport = TransportClass(**transport_args)
diff --git a/Common/setup.py b/Common/setup.py
index 75ac84f..e8c3010 100644
--- a/Common/setup.py
+++ b/Common/setup.py
@@ -12,7 +12,7 @@ from setuptools import setup, find_packages
setup(
name='beaker-common',
- version='26.2',
+ version='26.3',
description='Common components for Beaker packages',
author='Red Hat, Inc.',
author_email='beaker-devel@lists.fedorahosted.org',
diff --git a/IntegrationTests/setup.py b/IntegrationTests/setup.py
index a3f3ca6..ec0d495 100644
--- a/IntegrationTests/setup.py
+++ b/IntegrationTests/setup.py
@@ -12,7 +12,7 @@ def get_compose_layout():
setup(
name='beaker-integration-tests',
- version='26.2',
+ version='26.3',
description='Integration tests for Beaker',
author='Red Hat, Inc.',
author_email='beaker-devel@lists.fedorahosted.org',
diff --git a/IntegrationTests/src/bkr/inttest/server/selenium/test_task_by_name.py b/IntegrationTests/src/bkr/inttest/server/selenium/test_task_by_name.py
index 6b7906a..5cc6e7c 100644
--- a/IntegrationTests/src/bkr/inttest/server/selenium/test_task_by_name.py
+++ b/IntegrationTests/src/bkr/inttest/server/selenium/test_task_by_name.py
@@ -9,6 +9,7 @@ from bkr.inttest import data_setup, get_server_base
from bkr.inttest.server.webdriver_utils import is_text_present
import unittest
from turbogears.database import session
+import requests
class TaskByName(WebDriverTestCase):
@@ -27,3 +28,25 @@ class TaskByName(WebDriverTestCase):
b.get(get_server_base() + 'tasks/%s' % task_id)
self.assert_('Task %s' % task_name in b.find_element_by_xpath('//body').text)
+
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1614171
+ def test_task_404_by_name(self):
+ task_name_without_slash = 'no/such/name/exists/in/our/database'
+ task_name_with_slash = '/%s' % task_name_without_slash
+
+ # testing name 404 without slash
+ response = requests.get(get_server_base() + 'tasks/%s/' % task_name_without_slash)
+ self.assertEqual(response.status_code, 404)
+
+ # testing name 404 with starting slash
+ response = requests.get(get_server_base() + 'tasks/%s/' % task_name_with_slash)
+ self.assertEqual(response.status_code, 404)
+
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1614171
+ # Searching for ID returns human friendly error as well as 404
+ def test_task_404_by_id(self):
+ task_id = 123456789099999
+
+ response = requests.get(get_server_base() + 'tasks/%s' % task_id)
+ self.assertEqual(response.status_code, 404)
+ self.assertEqual(response.text, 'No such task with ID: %s' % task_id)
diff --git a/IntegrationTests/src/bkr/inttest/server/test_kickstart.py b/IntegrationTests/src/bkr/inttest/server/test_kickstart.py
index 5670ad9..d0e338d 100644
--- a/IntegrationTests/src/bkr/inttest/server/test_kickstart.py
+++ b/IntegrationTests/src/bkr/inttest/server/test_kickstart.py
@@ -334,7 +334,27 @@ class KickstartTest(unittest.TestCase):
repo_id=u'AppStream-debuginfo',
repo_type=u'debug',
path=u'../../../AppStream/x86_64/debug/tree'
- )
+ ),
+ DistroTreeRepo(
+ repo_id=u'CRB-debuginfo',
+ repo_type=u'debug',
+ path=u'../../../CRB/x86_64/debug/tree'
+ ),
+ DistroTreeRepo(
+ repo_id=u'CRB',
+ repo_type=u'variant',
+ path=u'../../../CRB/x86_64/os'
+ ),
+ DistroTreeRepo(
+ repo_id=u'BaseOS',
+ repo_type=u'variant',
+ path=u'../../../BaseOS/x86_64/os'
+ ),
+ DistroTreeRepo(
+ repo_id=u'AppStream',
+ repo_type=u'variant',
+ path=u'../../../AppStream/x86_64/os'
+ ),
]
@@ -2350,6 +2370,171 @@ install
self.assert_('/etc/yum.repos.d/beaker-debug.repo' not in k, k)
self.assert_('/etc/yum.repos.d/beaker-optional-x86_64-debug.repo' not in k, k)
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1664750
+ def test_no_repo_CRB(self):
+ recipe = self.provision_recipe('''
+ <job>
+ <whiteboard/>
+ <recipeSet>
+ <recipe ks_meta="no_repo_CRB">
+ <distroRequires>
+ <distro_name op="=" value="RHEL-8.0-20181114.n.0" />
+ <distro_variant op="=" value="BaseOS" />
+ <distro_arch op="=" value="x86_64" />
+ </distroRequires>
+ <hostRequires/>
+ <task name="/distribution/install" />
+ <task name="/distribution/reservesys" />
+ </recipe>
+ </recipeSet>
+ </job>
+ ''', self.system)
+ k = recipe.installation.rendered_kickstart.kickstart
+ self.assert_('repo --name=beaker-CRB --cost' not in k, k)
+ self.assert_('repo --name=beaker-CRB-debuginfo' in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-CRB.repo' not in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-CRB-debuginfo.repo' in k, k)
+
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1664750
+ def test_no_repo_CRB_disable_repo_CRB(self):
+ recipe = self.provision_recipe('''
+ <job>
+ <whiteboard/>
+ <recipeSet>
+ <recipe ks_meta="no_repo_CRB disable_repo_CRB">
+ <distroRequires>
+ <distro_name op="=" value="RHEL-8.0-20181114.n.0" />
+ <distro_variant op="=" value="BaseOS" />
+ <distro_arch op="=" value="x86_64" />
+ </distroRequires>
+ <hostRequires/>
+ <task name="/distribution/install" />
+ <task name="/distribution/reservesys" />
+ </recipe>
+ </recipeSet>
+ </job>
+ ''', self.system)
+ k = recipe.installation.rendered_kickstart.kickstart
+ self.assert_('repo --name=beaker-CRB --cost' not in k, k)
+ self.assert_('repo --name=beaker-CRB-debuginfo' in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-CRB.repo' not in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-CRB-debuginfo.repo' in k, k)
+
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1664750
+ def test_disable_repo_CRB(self):
+ recipe = self.provision_recipe('''
+ <job>
+ <whiteboard/>
+ <recipeSet>
+ <recipe ks_meta="disable_repo_CRB">
+ <distroRequires>
+ <distro_name op="=" value="RHEL-8.0-20181114.n.0" />
+ <distro_variant op="=" value="BaseOS" />
+ <distro_arch op="=" value="x86_64" />
+ </distroRequires>
+ <hostRequires/>
+ <task name="/distribution/install" />
+ <task name="/distribution/reservesys" />
+ </recipe>
+ </recipeSet>
+ </job>
+ ''', self.system)
+ k = recipe.installation.rendered_kickstart.kickstart
+ self.assert_('repo --name=beaker-CRB --cost' not in k, k)
+ self.assert_('repo --name=beaker-CRB-debuginfo' in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-CRB.repo' in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-CRB-debuginfo.repo' in k, k)
+ self.assert_('CRB/x86_64/os\nenabled=0\n' in k, k)
+ self.assert_('CRB/x86_64/debug/tree\nenabled=1\n' in k, k)
+
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1664750
+ def test_disable_debug_repos(self):
+ recipe = self.provision_recipe('''
+ <job>
+ <whiteboard/>
+ <recipeSet>
+ <recipe ks_meta="disable_debug_repos">
+ <distroRequires>
+ <distro_name op="=" value="RHEL-8.0-20181114.n.0" />
+ <distro_variant op="=" value="BaseOS" />
+ <distro_arch op="=" value="x86_64" />
+ </distroRequires>
+ <hostRequires/>
+ <task name="/distribution/install" />
+ <task name="/distribution/reservesys" />
+ </recipe>
+ </recipeSet>
+ </job>
+ ''', self.system)
+ k = recipe.installation.rendered_kickstart.kickstart
+ self.assert_('repo --name=beaker-CRB --cost' in k, k)
+ self.assert_('repo --name=beaker-CRB-debuginfo' not in k, k)
+ self.assert_('repo --name=beaker-AppStream-debuginfo' not in k, k)
+ self.assert_('repo --name=beaker-BaseOS-debuginfo' not in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-CRB.repo' in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-CRB-debuginfo.repo' in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-AppStream-debuginfo.repo' in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-BaseOS-debuginfo.repo' in k, k)
+ self.assert_('CRB/x86_64/os\nenabled=1\n' in k, k)
+ self.assert_('CRB/x86_64/debug/tree\nenabled=0\n' in k, k)
+ self.assert_('AppStream/x86_64/debug/tree\nenabled=0\n' in k, k)
+ self.assert_('BaseOS/x86_64/debug/tree\nenabled=0\n' in k, k)
+
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1664750
+ def test_disable_repo_CRB_and_debuginfo(self):
+ recipe = self.provision_recipe('''
+ <job>
+ <whiteboard/>
+ <recipeSet>
+ <recipe ks_meta="disable_repo_CRB disable_repo_CRB-debuginfo">
+ <distroRequires>
+ <distro_name op="=" value="RHEL-8.0-20181114.n.0" />
+ <distro_variant op="=" value="BaseOS" />
+ <distro_arch op="=" value="x86_64" />
+ </distroRequires>
+ <hostRequires/>
+ <task name="/distribution/install" />
+ <task name="/distribution/reservesys" />
+ </recipe>
+ </recipeSet>
+ </job>
+ ''', self.system)
+ k = recipe.installation.rendered_kickstart.kickstart
+ self.assert_('repo --name=beaker-CRB --cost' not in k, k)
+ self.assert_('repo --name=beaker-CRB-debuginfo' not in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-CRB.repo' in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-CRB-debuginfo.repo' in k, k)
+ self.assert_('CRB/x86_64/os\nenabled=0\n' in k, k)
+ self.assert_('CRB/x86_64/debug/tree\nenabled=0\n' in k, k)
+
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1664750
+ def test_no_debug_repos_disable_repo_CRB(self):
+ recipe = self.provision_recipe('''
+ <job>
+ <whiteboard/>
+ <recipeSet>
+ <recipe ks_meta="no_debug_repos disable_repo_CRB">
+ <distroRequires>
+ <distro_name op="=" value="RHEL-8.0-20181114.n.0" />
+ <distro_variant op="=" value="BaseOS" />
+ <distro_arch op="=" value="x86_64" />
+ </distroRequires>
+ <hostRequires/>
+ <task name="/distribution/install" />
+ <task name="/distribution/reservesys" />
+ </recipe>
+ </recipeSet>
+ </job>
+ ''', self.system)
+ k = recipe.installation.rendered_kickstart.kickstart
+ self.assert_('repo --name=beaker-CRB --cost' not in k, k)
+ self.assert_('repo --name=beaker-CRB-debuginfo' not in k, k)
+ self.assert_('repo --name=beaker-AppStream-debuginfo' not in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-CRB.repo' in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-CRB-debuginfo.repo' not in k, k)
+ self.assert_('/etc/yum.repos.d/beaker-AppSteam-debuginfo.repo' not in k, k)
+ self.assert_('CRB/x86_64/os\nenabled=0\n' in k, k)
+
# https://bugzilla.redhat.com/show_bug.cgi?id=874191
def test_no_updates_repos_fedora(self):
recipe = self.provision_recipe('''
diff --git a/LabController/setup.py b/LabController/setup.py
index 7a5f5ac..2724cd8 100644
--- a/LabController/setup.py
+++ b/LabController/setup.py
@@ -49,7 +49,7 @@ else:
setup(
name='beaker-lab-controller',
- version='26.2',
+ version='26.3',
description='Daemons for controlling a Beaker lab',
author='Red Hat, Inc.',
author_email='beaker-devel@lists.fedorahosted.org',
diff --git a/Server/bkr/server/snippets/print_anaconda_repos b/Server/bkr/server/snippets/print_anaconda_repos
index 5d58fc7..c581c50 100644
--- a/Server/bkr/server/snippets/print_anaconda_repos
+++ b/Server/bkr/server/snippets/print_anaconda_repos
@@ -2,7 +2,10 @@
{% set repo_base = distro_tree.url_in_lab(lab_controller, scheme=['http', 'ftp']) %}
{% if repo_base %}
{% for repo in distro_tree.repos %}
-{% if var('no_%s_repos' % repo.repo_type) is undefined %}
+{% if var('no_%s_repos' % repo.repo_type) is undefined
+ and var('disable_%s_repos' % repo.repo_type) is undefined
+ and var('no_repo_%s' % repo.repo_id) is undefined
+ and var('disable_repo_%s' % repo.repo_id) is undefined %}
repo --name=beaker-{{ repo.repo_id }} --cost=100 --baseurl={{ repo_base|urljoin(repo.path) }}
{% endif %}
{% endfor %}
diff --git a/Server/bkr/server/snippets/print_repos b/Server/bkr/server/snippets/print_repos
index 6d0a98d..266762b 100644
--- a/Server/bkr/server/snippets/print_repos
+++ b/Server/bkr/server/snippets/print_repos
@@ -2,12 +2,16 @@
{% set repo_base = distro_tree.url_in_lab(lab_controller, scheme=['http', 'ftp']) %}
{% if repo_base %}
{% for repo in distro_tree.repos %}
-{% if var('no_%s_repos' % repo.repo_type) is undefined %}
+{% if var('no_%s_repos' % repo.repo_type) is undefined and var('no_repo_%s' % repo.repo_id) is undefined %}
cat <<"EOF" >/etc/yum.repos.d/beaker-{{ repo.repo_id }}.repo
[beaker-{{ repo.repo_id }}]
name=beaker-{{ repo.repo_id }}
baseurl={{ repo_base|urljoin(repo.path) }}
+{% if var('disable_%s_repos' % repo.repo_type) is undefined and var('disable_repo_%s' % repo.repo_id) is undefined %}
enabled=1
+{% else %}
+enabled=0
+{% endif %}
gpgcheck=0
skip_if_unavailable=1
EOF
diff --git a/Server/bkr/server/tasks.py b/Server/bkr/server/tasks.py
index 9bb84c1..400d50e 100644
--- a/Server/bkr/server/tasks.py
+++ b/Server/bkr/server/tasks.py
@@ -364,8 +364,7 @@ class Tasks(RPCRoot):
#This is the simplest way of dealing with it
redirect("/tasks/%s" % task.id)
except DatabaseLookupError as e:
- flash(unicode(e))
- redirect("/tasks")
+ raise cherrypy.HTTPError(status=404, message='%s' % e)
attributes = task.to_dict()
attributes['can_disable'] = bool(
@@ -448,11 +447,20 @@ def get_tasks():
})
return result
+# This route is used whenever user enters any integer past /tasks/.
+# Paths that don't match this template are rerouted by either default function or their specific function
+# eq. path .../tasks//custom/name/of/task - will NOT be picked up (processed by default function)
+# .../tasks/custom_name - will NOT be picked up
+# .../tasks/name/with/slash - will NOT be picked up
+# .../tasks/123456 - will be picked up
@app.route('/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
# Dummy handler to fall back to CherryPy
# so that other methods such as PATCH/DELETE work.
- raise NotFound404('Fall back to CherryPy')
+ # ---
+ # Because Flask defined 404 has priority before CherryPy's 404,
+ # message defined in here will be presented to user when CherryPy's 404 is raised.
+ raise NotFound404('No such task with ID: %s' % task_id)
@app.route('/tasks/<int:task_id>', methods=['PATCH'])
@admin_auth_required
diff --git a/Server/bkr/server/templates/master.kid b/Server/bkr/server/templates/master.kid
index 6c68a73..2137e5c 100644
--- a/Server/bkr/server/templates/master.kid
+++ b/Server/bkr/server/templates/master.kid
@@ -190,36 +190,6 @@ from bkr.server.reports import Reports
<p><a href="https://beaker-project.org/">Beaker</a> ${tg.beaker_version()}</p>
</footer>
-<span py:if="tg.config('piwik.base_url') and tg.config('piwik.site_id')" py:strip="True">
-<!--! This is a modified version of the Piwik tracking code that uses DOM
- manipulation instead of document.write to inject the Piwik <script/>.
- This lets the document.ready event fire without waiting for Piwik to be
- loaded (in case the Piwik server is nonresponsive).
-
- The basic technique is described here:
- http://www.nczonline.net/blog/2009/06/23/loading-javascript-without-blocking/
- but we can use jQuery.getScript() to do all the hard work for us.
- -->
-<!-- Piwik -->
-<script type="text/javascript">
-var pkBaseURL = (("https:" == document.location.protocol) ? "https:${tg.config('piwik.base_url')}" : "http:${tg.config('piwik.base_url')}");
-jQuery.ajax({
- url: pkBaseURL + 'piwik.js',
- dataType: 'script',
- cache: true, // prevent jQuery appending a stupid timestamp parameter
- success: function () {
-try {
-var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", ${tg.config('piwik.site_id')});
-piwikTracker.setCustomVariable(1, 'beaker_user', '${tg.identity.user}');
-piwikTracker.trackPageView();
-piwikTracker.enableLinkTracking();
-} catch( err ) {}
- }
-});
-</script><noscript><p><img src="${tg.config('piwik.base_url')}piwik.php?idsite=${tg.config('piwik.site_id')}" style="border:0" alt="" /></p></noscript>
-<!-- End Piwik Tracking Code -->
-</span>
-
<div py:for="js in tg_js_bodybottom" py:replace="js.display()" />
</body>
diff --git a/Server/server.cfg b/Server/server.cfg
index 590da51..fae6bbd 100644
--- a/Server/server.cfg
+++ b/Server/server.cfg
@@ -102,13 +102,6 @@ sqlalchemy.pool_recycle = 3600
# default no message is shown.
#beaker.reservation_policy_url = "http://example.com/reservation-policy"
-# If both of these options are set, the Piwik tracking javascript snippet will
-# be embedded in all pages, reporting statistics back to the given Piwik
-# installation.
-# Make sure that piwik.base_url is a protocol-relative URL starting with //
-#piwik.base_url = "//analytics.example.invalid/piwik/"
-#piwik.site_id = 123
-
# These install options are used as global defaults for every provision. They
# can be overriden by options on the distro tree, the system, or the recipe.
#beaker.ks_meta = ""
diff --git a/Server/setup.py b/Server/setup.py
index c5f764c..44c0eb2 100644
--- a/Server/setup.py
+++ b/Server/setup.py
@@ -186,7 +186,7 @@ else:
setup(
name='beaker-server',
namespace_packages = ['bkr'],
- version='26.2',
+ version='26.3',
description='Beaker scheduler and web interface',
long_description=
'Beaker is a system for full stack software integration testing '
diff --git a/beaker.spec b/beaker.spec
index 3f71c52..298f4bb 100644
--- a/beaker.spec
+++ b/beaker.spec
@@ -14,10 +14,10 @@
# not representable in RPM. For example, a release candidate might be 0.15.0rc1
# but that is not usable for the RPM Version because it sorts higher than
# 0.15.0, so the RPM will have Version 0.15.0 and Release 0.rc1 in that case.
-%global upstream_version 26.2
+%global upstream_version 26.3
Name: beaker
-Version: 26.2
+Version: 26.3
Release: 1%{?dist}
Summary: Full-stack software and hardware integration testing system
Group: Applications/Internet
diff --git a/documentation/admin-guide/distro-import.rst b/documentation/admin-guide/distro-import.rst
index f4f28b7..ed97351 100644
--- a/documentation/admin-guide/distro-import.rst
+++ b/documentation/admin-guide/distro-import.rst
@@ -19,6 +19,10 @@ Distros must be imported separately on each lab controller, and you can import
from a different set of URLs in each lab. This allows you to import distros
from the nearest mirror in each lab.
+When importing, at least one of the URLs has to be type of ``http``, ``https``
+or ``ftp``. Specifying only ``nfs`` won't work, since it's currently not supported
+as a valid primary install method.
+
Normally a distro will have a :file:`.composeinfo` or :file:`.treeinfo` file, which
provides metadata required by :program:`beaker-import`. If those files are not available
you can perform a "naked" import by specifying ``--family``,
diff --git a/documentation/admin-guide/man/beaker-log-delete.rst b/documentation/admin-guide/man/beaker-log-delete.rst
new file mode 100644
index 0000000..00b1750
--- /dev/null
+++ b/documentation/admin-guide/man/beaker-log-delete.rst
@@ -0,0 +1,75 @@
+.. _beaker-log-delete:
+
+beaker-log-delete: Delete expired jobs
+======================================
+
+.. program:: beaker-log-delete
+
+Synopsis
+--------
+
+| :program:`beaker-log-delete` [*options*]
+
+Description
+-----------
+
+Deletes expired jobs and permanently purges log files from Beaker and/or archive server.
+
+This command reads the server configuration and connects to the database in the same way
+as the Beaker application itself does. Ensure you have configured the database
+in :file:`/etc/beaker/server.cfg` before you run this command so that it can connect to
+the database in order to find expired jobs and remove them.
+
+HTTP server must be able to handle WebDAV DELETE operations on the log directory’s base
+path (HTTP digest and Kerberos authentication are supported).
+
+To enable HTTP digest, configure account in :file:`/etc/beaker/server.cfg`::
+
+ beaker.log_delete_user = ""
+ beaker.log_delete_password = ""
+
+This command requires read access to the Beaker server configuration. Run it as root.
+
+Options
+-------
+
+.. option:: -c <path>, --config <path>
+
+ Read server configuration from <path> instead of the default /etc/beaker/server.cfg.
+
+.. option:: -v, --verbose
+
+ Print the path/URL of deleted files to stdout
+
+.. option:: --debug
+
+ Show detailed progress information and debugging messages.
+
+.. option:: --dry-run
+
+ Expired jobs are not removed.
+
+.. option:: --limit
+
+ Limit number of expired jobs whose logs will be deleted.
+
+Exit status
+-----------
+
+For normal operations the exit status is zero on success, or non-zero on error.
+
+Examples
+--------
+
+Delete first 50 expired jobs::
+
+ beaker-log-delete --limit 50
+
+Delete expired jobs and display debug messages::
+
+ beaker-log-delete --debug
+
+Expired jobs are only listed and not deleted::
+
+ beaker-log-delete --dry-run --verbose
+
diff --git a/documentation/admin-guide/man/index.rst b/documentation/admin-guide/man/index.rst
index c54cc08..cc9cff4 100644
--- a/documentation/admin-guide/man/index.rst
+++ b/documentation/admin-guide/man/index.rst
@@ -8,6 +8,7 @@ Administrative command reference
beaker-create-kickstart
beaker-import
beaker-init
+ beaker-log-delete
beaker-repo-update
beaker-usage-reminder
beaker-sync-tasks
diff --git a/documentation/architecture-guide/log-storage.rst b/documentation/architecture-guide/log-storage.rst
index b37c39f..63810de 100644
--- a/documentation/architecture-guide/log-storage.rst
+++ b/documentation/architecture-guide/log-storage.rst
@@ -16,7 +16,7 @@ You can configure the lab controller to work with an
:ref:`archive server <archive-server>`.
Beaker requires the archive server to be running a HTTP server and
`rsyncd <http://linux.die.net/man/5/rsyncd.conf>`_.
-If you wish to be able to delete log files via `beaker-log-delete`,
+If you wish to be able to delete log files via :ref:`beaker-log-delete <beaker-log-delete>`,
you must `configure <http://httpd.apache.org/docs/2.2/mod/mod_dav.html>`_
the HTTP server to handle WebDAV DELETE operations on the log directory's
base path (HTTP digest and kerberos authentication are supported by
diff --git a/documentation/user-guide/customizing-installation.rst b/documentation/user-guide/customizing-installation.rst
index 3f6ed22..a697a75 100644
--- a/documentation/user-guide/customizing-installation.rst
+++ b/documentation/user-guide/customizing-installation.rst
@@ -192,6 +192,23 @@ correspond to the similarly-named kickstart option.
For example, ``harness_rw_host_volumes='/myvolume'`` will then only
mount the ``/myvolume`` with write permissions.
+``disable_repo_<id>``
+ Disable repo of the given id. By default, the kickstart will include repo.
+ Repo is also created in yum.repos.d/ and enabled. Set this variable if you
+ want to omit ``repo`` command in kickstart and disable it in yum.repos.d/.
+ You can find repo id for a particular distro tree under the
+ :guilabel:`Repos` tab on the distro tree page.
+ For example disable_repo_CRB.
+
+``disable_<type>_repos``
+ Disable repos of the given types. Valid types include ``variant``, ``addon``,
+ ``optional``, and ``debug``. By default, the kickstart will include all repos
+ of the given type. Repos are also created in yum.repos.d/ and enabled.
+ Set this variable if you want to omit ``repo`` command in kickstart and
+ disable them in yum.repos.d/. You can find repo id for a particular distro
+ tree under the :guilabel:`Repos` tab on the distro tree page.
+ For example disable_debug_repos.
+
``ethdevices=<module>[,<module>...]``
Comma-separated list of network modules to be loaded during installation.
@@ -288,6 +305,11 @@ correspond to the similarly-named kickstart option.
variable if you want to supply explicit partitioning commands in some other
way, for example in a ``<ks_append/>`` section.
+``no_repo_<id>``
+ Omits repo of the given id. You can find repo id for a particular distro
+ tree under the :guilabel:`Repos` tab on the distro tree page.
+ For example no_repo_CRB-debuginfo.
+
``no_<type>_repos``
Omits repos of the given type. Valid types include ``variant``, ``addon``,
``optional``, and ``debug``. You can find which repo types are available
diff --git a/documentation/whats-new/release-26.rst b/documentation/whats-new/release-26.rst
index 15780b4..fd736c5 100644
--- a/documentation/whats-new/release-26.rst
+++ b/documentation/whats-new/release-26.rst
@@ -143,51 +143,78 @@ The following fixes have been included in Beaker 26 maintenance updates.
Beaker 26.1
~~~~~~~~~~~
-* :issue:`1618344`: Previously, the /distribution/virt/install task would fail
- to install the guest on RHEL8 because Python 2 was not available. The task
- now correctly requires a Python 2 interpreter.
- (Contributed by Dan Callaghan)
-* :issue:`1619545`: Previously, the /distribution/reservesys task would fail
- to send email when the system was ready on RHEL8 recipes. The task now
- correctly starts the Postfix MTA on RHEL8.
- (Contributed by Dan Callaghan)
-* :issue:`1640892`: In Beaker 26.0, the default harness for RHEL-ALT-7 was
- unintentionally changed to Restraint. The default harness for RHEL-ALT-7 has
- been fixed to use Beah.
- (Contributed by Bill Peck)
-* :issue:`1642525`: The :program:`beaker-init` tool now recognizes 26 as a
- valid Beaker version.
- (Contributed by Chris Beer)
-* :issue:`1643139`: Fixed a regression introduced in Beaker 26 which caused a
- 'RuntimeError: dictionary changed size during iteration' failure to appear
- in the :program:`beaker-watchdog` logs.
- (Contributed by Chris Beer)
+* | :issue:`1618344`: Previously, the /distribution/virt/install task would fail
+ to install the guest on RHEL8 because Python 2 was not available. The task
+ now correctly requires a Python 2 interpreter.
+ | (Contributed by Dan Callaghan)
+* | :issue:`1619545`: Previously, the /distribution/reservesys task would fail
+ to send email when the system was ready on RHEL8 recipes. The task now
+ correctly starts the Postfix MTA on RHEL8.
+ | (Contributed by Dan Callaghan)
+* | :issue:`1640892`: In Beaker 26.0, the default harness for RHEL-ALT-7 was
+ unintentionally changed to Restraint. The default harness for RHEL-ALT-7 has
+ been fixed to use Beah.
+ | (Contributed by Bill Peck)
+* | :issue:`1642525`: The :program:`beaker-init` tool now recognizes 26 as a
+ valid Beaker version.
+ | (Contributed by Chris Beer)
+* | :issue:`1643139`: Fixed a regression introduced in Beaker 26 which caused a
+ 'RuntimeError: dictionary changed size during iteration' failure to appear
+ in the :program:`beaker-watchdog` logs.
+ | (Contributed by Chris Beer)
Beaker 26.2
~~~~~~~~~~~
-* :issue:`1638258`: Fixed: ks_meta=manual adds "ignoredisk --interactive" to
- the kickstart even if this is deprecated
- (Contributed by Martin Styk)
-* :issue:`1644032`: Fixed: RESERVE_IF_FAIL always reserves all systems
- (including PASSing ones) [rhel-8]
- (Contributed by Martin Styk)
-* :issue:`1636550`: Fixed: s390x: add "--cdl" parameter to "clearpart"
- kickstart command
- (Contributed by Martin Styk)
-* :issue:`1652476`: Fixed: beaker-repo-update did not fetch harness for
- distros
- (Contributed by Martin Styk)
-* :issue:`1650337`: Updated internal test code to use new URL for dogfood jobs
- (Contributed by Chris Beer)
-* :issue:`1657864`: Fixed: Beaker checkbugs failing after Bugzilla v5 upgrade
- (Contributed by Chris Beer)
-* :issue:`1579161`: Added option dry-run to beaker-expire-distros
- (Contributed by Martin Styk)
-* :issue:`1656272`: beaker-wizard: grammar improvements in the library skeleton
- description
- (Contributed by Martin Styk)
-* :issue:`1653339`: Documented bkr group-list default limit
- (Contributed by Martin Styk)
-* :issue:`1652641`: Fixed: unable to add a task with binary database data
- (Contributed by Martin Styk)
+* | :issue:`1638258`: Previously, kickstart installation would fail
+ with ks_meta=manual. Kickstart command ignoredisk --interactive
+ is used in manual mode, however option --interactive is deprecated.
+ Beaker kickstart file now correctly contains kickstart command ignoredisk
+ without --interactive option.
+ | (Contributed by Martin Styk)
+* | :issue:`1644032`: Previously, the /distribution/reservesys task would fail
+ with option RESERVE_IF_FAIL and always reserves all systems. The task now
+ correctly reserves a system only when one of the previous task fail.
+ | (Contributed by Martin Styk)
+* | :issue:`1636550`: To increase the reliability of installations on S390x
+ Beaker added --cdl option to the clearpart kickstart command.
+ | (Contributed by Martin Styk)
+* | :issue:`1652476`: Previously, :program:`beaker-repo-update` would fail to
+ update repositories because the default URL was incorrect.
+ :program:`beaker-repo-update` now uses correct default URL.
+ | (Contributed by Martin Styk)
+* | :issue:`1650337`: Updated internal test code to use new URL for dogfood jobs
+ | (Contributed by Chris Beer)
+* | :issue:`1579161`: The :program:`beaker-expire-distros` tool now accepts
+ dry-run parameter.
+ | (Contributed by Martin Styk)
+* | :issue:`1656272`: Improved grammar in :program:`beaker-wizard`.
+ | (Contributed by Martin Styk)
+* | :issue:`1653339`: Added documentation for limit parameter in :program:`bkr`
+ group-list.
+ | (Contributed by Martin Styk)
+* | :issue:`1652641`: Previously, beaker client would fail to add a task to
+ Beaker task library because the task contained binary data.
+ Beaker client now allows adding a task containing binary data.
+ | (Contributed by Martin Styk)
+
+
+Beaker 26.3
+~~~~~~~~~~~
+* | :issue:`1566859`: Retired Piwik integration with Beaker.
+ | (Contributed by Martin Styk)
+* | :issue:`1614171`: Beaker now gives 404 when accessing a non-existent task.
+ | (Contributed by Tomas Klohna)
+* | :issue:`1663317`: Previously, Beaker Jenkins Jobs (BJJ) contained deprecated
+ commands. BJJ now uses up-to-date commands.
+ | (Contributed by Chris Beer)
+* | :issue:`968828`: Created documentation for :program:`beaker-log-delete`.
+ | (Contributed by Martin Styk)
+* | :issue:`1663121`: BJJ now uses unified Koji instance.
+ | (Contributed by Martin Styk)
+* | :issue:`978824`: Extended documentation for importing distros.
+ | (Contributed by Tomas Klohna)
+* | :issue:`1664750`: Beaker now allows to remove/disable repo by Repo ID. You
+ can find which repo IDs are available for a particular distro tree under the
+ Repos tab on the distro tree page.
+ | (Contributed by Martin Styk)