[copr] master: use newstyle ansible variables (44acd06)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 44acd06ab4ed55e9a8a8181794292de3d96c9c1e
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Tue Dec 10 22:45:28 2013 +0100
use newstyle ansible variables
addressing:
[DEPRECATION WARNING]: Legacy variable substitution, such as using ${foo} or
$foo instead of {{ foo }} is currently valid but will be phased out and has
been out of favor since version 1.2. This is the last of legacy features on our
deprecation list. You may continue to use this if you have specific needs for
now. This feature will be removed in version 1.6. Deprecation warnings can be
disabled by setting deprecation_warnings=False in ansible.cfg.
>---------------------------------------------------------------
playbooks/builderpb.yml | 16 ++++++++--------
playbooks/terminatepb.yml | 2 +-
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/playbooks/builderpb.yml b/playbooks/builderpb.yml
index 5c1ed2e..67b3470 100644
--- a/playbooks/builderpb.yml
+++ b/playbooks/builderpb.yml
@@ -12,18 +12,18 @@
tasks:
- name: spin it up
- local_action: ec2 keypair=${keypair} image=${image} type=${instance_type} wait=true group=${security_group}
+ local_action: ec2 keypair={{ keypair }} image={{ image }} type={{ instance_type }} wait=true group={{ security_group }}
register: inst_res
- name: get its internal ip b/c openstack is sometimes stupid
- local_action: shell euca-describe-instances ${inst_res.instances[0].id} | grep INSTANCE | cut -f 18
+ local_action: shell euca-describe-instances {{ inst_res.instances[0].id }} | grep INSTANCE | cut -f 18
register: int_ip
- name: add it to the special group
- local_action: add_host hostname=${int_ip.stdout} groupname=builder_temp_group
+ local_action: add_host hostname={{ int_ip.stdout }} groupname=builder_temp_group
- name: wait for the host to be hot
- local_action: wait_for host=${int_ip.stdout} port=22 delay=5 timeout=600
+ local_action: wait_for host={{ int_ip.stdout }} port=22 delay=5 timeout=600
- debug: msg="IP={{ int_ip.stdout }}"
@@ -38,13 +38,13 @@
action: shell hostname `curl -s http://169.254.169.254/2009-04-04/meta-data/instance-id`
- name: add repos
- action: copy src=$files/$item dest=/etc/yum.repos.d/$item
+ action: copy src={{ files }}/{{ item }} dest=/etc/yum.repos.d/{{ item }}
with_items:
- builder.repo
- epel6.repo
- name: install pkgs
- action: yum state=present pkg=$item
+ action: yum state=present pkg={{ item }}
with_items:
- mock
- createrepo
@@ -62,10 +62,10 @@
action: file state=directory path=/home/mockbuilder/.ssh mode=0700 owner=mockbuilder group=mockbuilder
- name: mockbuilder authorized_keys
- action: authorized_key user=mockbuilder key='$FILE(${files}/buildsys.pub)'
+ action: authorized_key user=mockbuilder key='$FILE({{ files }}/buildsys.pub)'
- name: put updated mock configs into /etc/mock
- action: copy src=$files/mock/$item dest=/etc/mock
+ action: copy src={{ files }}/mock/{{ item }} dest=/etc/mock
with_items:
- site-defaults.cfg
- epel-5-x86_64.cfg
diff --git a/playbooks/terminatepb.yml b/playbooks/terminatepb.yml
index a95f810..ea61bad 100644
--- a/playbooks/terminatepb.yml
+++ b/playbooks/terminatepb.yml
@@ -10,7 +10,7 @@
register: instanceid
- name: terminate it
- local_action: command euca-terminate-instances ${instanceid.stdout}
+ local_action: command euca-terminate-instances {{ instanceid.stdout }}
10 years, 5 months
[copr] master: Automatic commit of package [copr] release [1.15-1]. (be0b836)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit be0b836322c9fcbd92be4adbc50535f9f8969648
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Tue Dec 10 18:36:12 2013 +0100
Automatic commit of package [copr] release [1.15-1].
>---------------------------------------------------------------
copr.spec | 71 ++++++++++++++++++++++++++++++++++++++++++++++++-
rel-eng/packages/copr | 2 +-
2 files changed, 71 insertions(+), 2 deletions(-)
diff --git a/copr.spec b/copr.spec
index d6a9584..f0a68ca 100644
--- a/copr.spec
+++ b/copr.spec
@@ -6,7 +6,7 @@
%global modulename copr
Name: copr
-Version: 1.14
+Version: 1.15
Release: 1%{?dist}
Summary: Cool Other Package Repo
@@ -383,6 +383,75 @@ fi
%{_mandir}/man8/%{name}-selinux-relabel.8*
%changelog
+* Tue Dec 10 2013 Miroslav Suchý <msuchy(a)redhat.com> 1.15-1
+- [frontend] smarter package name parsing
+- [frontend] extend range to allow 0
+- handle default timeout on backend
+- initial support for SCL
+- [backend] create word readable files in result directory
+- [backend] print tracebacks
+- [frontend] monitor: display only pkg name w/o version
+- [doc] update api docs
+- [doc] update copr-cli manpage
+- [cli] list only name, description and instructions
+- [cli] add support for build status & build monitor
+- [frontend] add build status to API
+- [playbook] do not overwrite mockchain
+- [backend] add spece between options
+- [backend] pass mock options correctly
+- [frontend] support markdown in description and instructions
+- [backend] Add macros to mockchain define arguments
+- [backend] Pass copr username and project name to MockRemote
+- [backend] Handle additional macro specification in MockRemote
+- [frontend] monitor: show results per package
+- [frontend] add favicon
+- [backend] quote strings before passing to mockchain
+- send chroots with via callback to frontend
+- [cli] change cli to new api call
+- enhance API documentation
+- add yum_repos to coprs/user API call
+- [frontend] provide link to description of allowed content
+- [backend] we pass just one chroot
+- [backend] - variable play is not defined
+- if createrepo fail, run it again
+- [cron] fix syntax error
+- [man] state that --chroot for create command is required
+- [spec] enable tests
+- [howto] add note about upgrading db schema
+- [frontend]: add copr monitor
+- [tests]: replace test_allowed_one
+- [tests]: fix for BuildChroots & new backend view
+- [frontend] rewrite backend view to use Build <-> Chroot relation
+- [frontend] add Build <-> Chroot relation
+- 1030493 - [cli] check that at least one chroot is entered
+- [frontend] typo
+- fixup! [tests]: fix test_build_logic to handle BuildChroot
+- fixup! [frontend] add ActionsLogic
+- [tests]: fix test_build_logic to handle BuildChroot
+- [spec] enable/disable test using variable
+- add migration script - add table build_chroot
+- [frontend] skip legal-flag actions when dumping waiting actions
+- [frontend] rewrite backend view to use Build <-> Chroot relation
+- [frontend] add ActionsLogic
+- [frontend] create BuildChroot objects on new build
+- [frontend] add Build <-> Chroot relation
+- [frontend] add StatusEnum
+- [frontend] fix name -> coprname typo
+- [frontend] remove unused imports
+- [frontend] add missing json import
+- [backend] rework ip address extraction
+- ownership of /etc/copr should be just normal
+- [backend] - wrap up returning action in "action" blok
+- [backend] rename backend api url
+- [backend] handle "rename" action
+- [backend] handle "delete" action
+- base handling of actions
+- move callback to frontend to separate object
+- secure waiting_actions with password
+- pick only individual builds
+- make address, where we send legal flags, configurable
+- send email to root after legal flag have been raised
+
* Fri Nov 08 2013 Miroslav Suchý <msuchy(a)redhat.com> 1.14-1
- 1028235 - add disclaimer about repos
- fix pagination
diff --git a/rel-eng/packages/copr b/rel-eng/packages/copr
index ed39ca2..21094c0 100644
--- a/rel-eng/packages/copr
+++ b/rel-eng/packages/copr
@@ -1 +1 @@
-1.14-1 ./
+1.15-1 ./
10 years, 5 months
[copr] master: [frontend] smarter package name parsing (36fe20c)
by Richard Marko
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 36fe20ce6a3223450d54e69f56dcbdd86c72c510
Author: Richard Marko <rmarko(a)fedoraproject.org>
Date: Tue Dec 10 16:02:50 2013 +0100
[frontend] smarter package name parsing
Signed-off-by: Richard Marko <rmarko(a)fedoraproject.org>
>---------------------------------------------------------------
copr.spec | 2 ++
coprs_frontend/coprs/helpers.py | 12 ++++++++----
.../coprs/views/coprs_ns/coprs_general.py | 4 ++--
coprs_frontend/tests/test_helpers.py | 6 ++++--
4 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/copr.spec b/copr.spec
index a08c781..b470078 100644
--- a/copr.spec
+++ b/copr.spec
@@ -93,6 +93,7 @@ Requires: python-whoosh >= 2.5.3
Requires: pytest
Requires: python-flexmock
Requires: python-decorator
+Requires: yum
%if 0%{?rhel} < 7 && 0%{?rhel} > 0
BuildRequires: python-argparse
%endif
@@ -105,6 +106,7 @@ BuildRequires: python-flask-whooshee
BuildRequires: python-pylibravatar
BuildRequires: python-flask-wtf
BuildRequires: pytest
+BuildRequires: yum
BuildRequires: python-flexmock
BuildRequires: python-decorator
diff --git a/coprs_frontend/coprs/helpers.py b/coprs_frontend/coprs/helpers.py
index 7cde668..f4efac0 100644
--- a/coprs_frontend/coprs/helpers.py
+++ b/coprs_frontend/coprs/helpers.py
@@ -6,6 +6,8 @@ import flask
from coprs import constants
+from rpmUtils.miscutils import splitFilename
+
def generate_api_token(size=30):
""" Generate a random string used as token to access the API
remotely.
@@ -101,13 +103,15 @@ class Paginator(object):
return flask.url_for(request.endpoint, **args)
-def guess_package_name(pkg):
+def parse_package_name(pkg):
"""
- Guess package name from possibly incomplete nvra string.
-
- Return part of `pkg` up until numeric part is found (e.g. version string)
+ Parse package name from possibly incomplete nvra string.
"""
+ if pkg.count('.') >= 3 and pkg.count('-') >= 2:
+ return splitFilename(pkg)[0]
+
+ # doesn't seem like valid pkg string, try to guess package name
result = ''
pkg = pkg.replace('.rpm', '').replace('.src', '')
diff --git a/coprs_frontend/coprs/views/coprs_ns/coprs_general.py b/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
index 6d0a8bf..8d96c32 100644
--- a/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
+++ b/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
@@ -21,7 +21,7 @@ from coprs.views.coprs_ns import coprs_ns
from coprs.logic import builds_logic
from coprs.logic import coprs_logic
-from coprs.helpers import guess_package_name
+from coprs.helpers import parse_package_name
@coprs_ns.route('/', defaults = {'page': 1})
@@ -389,7 +389,7 @@ def copr_build_monitor(username, coprname):
for pkg_url in build.pkgs.split():
pkg = os.path.basename(pkg_url)
- pkg_name = guess_package_name(pkg)
+ pkg_name = parse_package_name(pkg)
if pkg_name in out:
continue
diff --git a/coprs_frontend/tests/test_helpers.py b/coprs_frontend/tests/test_helpers.py
index 74f029c..a278d05 100644
--- a/coprs_frontend/tests/test_helpers.py
+++ b/coprs_frontend/tests/test_helpers.py
@@ -1,4 +1,4 @@
-from coprs.helpers import guess_package_name
+from coprs.helpers import parse_package_name
from tests.coprs_test_case import CoprsTestCase
@@ -17,7 +17,9 @@ class TestHelpers(CoprsTestCase):
'copr-frontend-1.14-1.git.65.9ba5393.fc20.noarch': 'copr-frontend',
'noversion.fc20.src.rpm': 'noversion',
'nothing': 'nothing',
+ 'ruby193': 'ruby193',
+ 'xorg-x11-fonts-ISO8859-1-75dpi-7.1-2.1.el5.noarch.rpm': 'xorg-x11-fonts-ISO8859-1-75dpi',
}
for pkg, expected in EXP.iteritems():
- assert guess_package_name(pkg) == expected
+ assert parse_package_name(pkg) == expected
10 years, 5 months
[copr] master: fix spec indentation (15e509d)
by Richard Marko
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 15e509dbbb60876e3fd951916233507bdef712e7
Author: Richard Marko <rmarko(a)fedoraproject.org>
Date: Tue Dec 10 16:13:08 2013 +0100
fix spec indentation
Signed-off-by: Richard Marko <rmarko(a)fedoraproject.org>
>---------------------------------------------------------------
copr.spec | 38 +++++++++++++++++++-------------------
1 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/copr.spec b/copr.spec
index b470078..d6a9584 100644
--- a/copr.spec
+++ b/copr.spec
@@ -5,21 +5,21 @@
%global moduletype apps
%global modulename copr
-Name: copr
-Version: 1.14
-Release: 1%{?dist}
-Summary: Cool Other Package Repo
-
-Group: Applications/Productivity
-License: GPLv2+
-URL: https://fedorahosted.org/copr/
+Name: copr
+Version: 1.14
+Release: 1%{?dist}
+Summary: Cool Other Package Repo
+
+Group: Applications/Productivity
+License: GPLv2+
+URL: https://fedorahosted.org/copr/
# Source is created by
# git clone https://git.fedorahosted.org/git/copr.git
# cd copr
# tito build --tgz
# content is same as https://git.fedorahosted.org/cgit/copr.git/snapshot/%{name}-%{version}-1....
# but checksum does not match due different metadata
-Source0: %{name}-%{version}.tar.gz
+Source0: %{name}-%{version}.tar.gz
BuildArch: noarch
BuildRequires: asciidoc
@@ -45,7 +45,7 @@ COPR is lightweight build system. It allows you to create new project in WebUI,
and submit new builds and COPR will create yum repository from latest builds.
%package backend
-Summary: Backend for COPR
+Summary: Backend for COPR
Requires: ansible >= 1.2
Requires: lighttpd
Requires: euca2ools
@@ -75,22 +75,22 @@ This package contains backend.
%package frontend
Summary: Frontend for COPR
Requires: httpd
-Requires: mod_wsgi
-Requires: python-alembic
+Requires: mod_wsgi
+Requires: python-alembic
Requires: python-flask
Requires: python-flask-openid
Requires: python-flask-wtf
Requires: python-flask-sqlalchemy
Requires: python-flask-script
Requires: python-flask-whooshee
-#Requires: python-virtualenv
+#Requires: python-virtualenv
Requires: python-blinker
Requires: python-markdown
-Requires: python-psycopg2
+Requires: python-psycopg2
Requires: python-pylibravatar
-Requires: python-whoosh >= 2.5.3
+Requires: python-whoosh >= 2.5.3
# for tests:
-Requires: pytest
+Requires: pytest
Requires: python-flexmock
Requires: python-decorator
Requires: yum
@@ -117,8 +117,8 @@ and submit new builds and COPR will create yum repository from latests builds.
This package contains frontend.
%package cli
-Summary: Command line interface for COPR
-Requires: python-requests
+Summary: Command line interface for COPR
+Requires: python-requests
%if 0%{?rhel} < 7 && 0%{?rhel} > 0
Requires: python-argparse
%endif
@@ -140,7 +140,7 @@ This package include documentation for COPR code. Mostly useful for developers
only.
%package selinux
-Summary: SELinux module for COPR
+Summary: SELinux module for COPR
Requires(post): policycoreutils, libselinux-utils
Requires(post): policycoreutils-python
Requires(post): selinux-policy-targeted
10 years, 5 months
[copr] master: [frontend] extend range to allow 0 (e49051e)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit e49051e9009650ccd4dcb8faaecf0a7faae9f33f
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Tue Dec 10 16:46:25 2013 +0100
[frontend] extend range to allow 0
>---------------------------------------------------------------
coprs_frontend/coprs/constants.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/coprs_frontend/coprs/constants.py b/coprs_frontend/coprs/constants.py
index afadbcf..7b9110a 100644
--- a/coprs_frontend/coprs/constants.py
+++ b/coprs_frontend/coprs/constants.py
@@ -23,5 +23,5 @@ MIN_BUILD_MEMORY = 2048
MAX_BUILD_MEMORY = 4096
## in seconds
DEFAULT_BUILD_TIMEOUT = 0
-MIN_BUILD_TIMEOUT = 180
+MIN_BUILD_TIMEOUT = 0
MAX_BUILD_TIMEOUT = 36000
10 years, 5 months
[copr] master: handle default timeout on backend (bee5867)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit bee5867e8ad679f001386c566f35a4bda2170ca2
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Mon Dec 9 22:38:56 2013 +0100
handle default timeout on backend
set default timeout on fronted to 0
and then if backend will get 0 use value from config or backend default
>---------------------------------------------------------------
backend/dispatcher.py | 5 ++++-
coprs_frontend/coprs/constants.py | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/backend/dispatcher.py b/backend/dispatcher.py
index 5e1e496..83053d1 100644
--- a/backend/dispatcher.py
+++ b/backend/dispatcher.py
@@ -216,7 +216,10 @@ class Worker(multiprocessing.Process):
jobdata.chroot = build['chroot']
jobdata.buildroot_pkgs = build['buildroot_pkgs']
jobdata.memory_reqs = build['memory_reqs']
- jobdata.timeout = build['timeout']
+ if build['timeout']:
+ jobdata.timeout = build['timeout']
+ else:
+ jobdata.timeout = self.opts.timeout
jobdata.destdir = os.path.normpath(self.opts.destdir + '/' + build['copr']['owner']['name'] + '/' + build['copr']['name'])
jobdata.build_id = build['id']
jobdata.results = self.opts.results_baseurl + '/' + build['copr']['owner']['name'] + '/' + build['copr']['name'] + '/'
diff --git a/coprs_frontend/coprs/constants.py b/coprs_frontend/coprs/constants.py
index 04b7079..afadbcf 100644
--- a/coprs_frontend/coprs/constants.py
+++ b/coprs_frontend/coprs/constants.py
@@ -22,6 +22,6 @@ DEFAULT_BUILD_MEMORY = 2048
MIN_BUILD_MEMORY = 2048
MAX_BUILD_MEMORY = 4096
## in seconds
-DEFAULT_BUILD_TIMEOUT = 1800
+DEFAULT_BUILD_TIMEOUT = 0
MIN_BUILD_TIMEOUT = 180
MAX_BUILD_TIMEOUT = 36000
10 years, 5 months
[copr] master: correct building of scl (9e2a62e)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 9e2a62e27ffd10079087ee1102ab925b883cc3ed
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Mon Dec 9 21:58:22 2013 +0100
correct building of scl
install buildsys group
and execute the line replace as root because that file is owned by root
>---------------------------------------------------------------
backend/mockremote.py | 27 ++++++++++++++++++++-------
1 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/backend/mockremote.py b/backend/mockremote.py
index a968e03..2e53416 100755
--- a/backend/mockremote.py
+++ b/backend/mockremote.py
@@ -220,11 +220,15 @@ class Builder(object):
self.chroot = mockremote.chroot
self.repos = mockremote.repos
self.mockremote = mockremote
- self.buildroot_pkgs = buildroot_pkgs
+ if buildroot_pkgs is None:
+ self.buildroot_pkgs = ''
+ else:
+ self.buildroot_pkgs = buildroot_pkgs
self.checked = False
self._tempdir = None
# if we're at this point we've connected and done stuff on the host
self.conn = _create_ans_conn(self.hostname, self.username, self.timeout)
+ self.root_conn = _create_ans_conn(self.hostname, 'root', self.timeout)
# check out the host - make sure it can build/be contacted/etc
self.check()
@@ -275,12 +279,21 @@ class Builder(object):
""" modify mock config for current chroot
packages in buildroot_pkgs are added to minimal buildroot """
- command = 'sed -i "1,\$s/config_opts\[\'chroot_setup_cmd\'\].*/config_opts\[\'chroot_setup_cmd\'\] = \'install @build %s\'/" /etc/mock/%s.cfg' % (self.buildroot_pkgs, self.chroot)
- self.mockremote.callback.log('executing: %r' % command)
- self.conn.module_name = "shell"
- self.conn.module_args = command
- # FIXME should probably check this but <shrug>
- results = self.conn.run()
+ if "'%s '" % self.buildroot_pkgs != pipes.quote(str(self.buildroot_pkgs)+' '):
+ # just different test if it contains only alphanumeric characters allowed in packages name
+ raise BuilderError("Do not try this kind of attack on me")
+ self.root_conn.module_name = "lineinfile"
+ self.root_conn.module_args = """dest=/etc/mock/%s.cfg line="config_opts['chroot_setup_cmd'] = 'install @buildsys-build %s'" regexp="^.*chroot_setup_cmd.*$" """ % (self.chroot, self.buildroot_pkgs)
+ self.mockremote.callback.log('putting %s into minimal buildroot of %s' % (self.buildroot_pkgs, self.chroot))
+ results = self.root_conn.run()
+
+ is_err, err_results = check_for_ans_error(results, self.hostname, success_codes=[0],
+ return_on_error=['stdout', 'stderr'])
+ if is_err:
+ self.mockremote.callback.log("Error: %s" % err_results)
+ myresults = get_ans_results(results, self.hostname)
+ self.mockremote.callback.log("%s" % myresults)
+
def build(self, pkg):
10 years, 5 months
[copr] master: initial support for SCL (988faed)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 988faed744ec8cd86c269cf71a9235b0e6eaec7b
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Thu Nov 28 16:34:42 2013 +0100
initial support for SCL
add column copr_chroot.buildroot_pkgs
pass it to backend job
backend - modify mock config to include those packages in minimal buildroot
frontend - allow to add packages to chroot
>---------------------------------------------------------------
backend/dispatcher.py | 3 +-
backend/mockremote.py | 21 +++++++-
.../versions/3a415c6392bc_add_buildroot_pkgs_c.py | 22 +++++++++
coprs_frontend/coprs/__init__.py | 1 +
coprs_frontend/coprs/forms.py | 4 ++
coprs_frontend/coprs/logic/coprs_logic.py | 8 +++
coprs_frontend/coprs/models.py | 20 ++++++++
.../coprs/templates/coprs/_coprs_forms.html | 12 ++++-
.../coprs/templates/coprs/detail/edit2.html | 13 +++++
.../coprs/templates/coprs/detail/edit_chroot.html | 19 +++++++
.../coprs/views/backend_ns/backend_general.py | 1 +
.../coprs/views/coprs_ns/coprs_chroots.py | 50 ++++++++++++++++++++
12 files changed, 169 insertions(+), 5 deletions(-)
diff --git a/backend/dispatcher.py b/backend/dispatcher.py
index e194d8d..5e1e496 100644
--- a/backend/dispatcher.py
+++ b/backend/dispatcher.py
@@ -214,6 +214,7 @@ class Worker(multiprocessing.Process):
jobdata.pkgs = build['pkgs'].split(' ')
jobdata.repos = [r for r in build['repos'].split(' ') if r.strip() ]
jobdata.chroot = build['chroot']
+ jobdata.buildroot_pkgs = build['buildroot_pkgs']
jobdata.memory_reqs = build['memory_reqs']
jobdata.timeout = build['timeout']
jobdata.destdir = os.path.normpath(self.opts.destdir + '/' + build['copr']['owner']['name'] + '/' + build['copr']['name'])
@@ -354,7 +355,7 @@ class Worker(multiprocessing.Process):
'copr_projectname': job.copr_name}
mr = mockremote.MockRemote(builder=ip, timeout=job.timeout,
destdir=job.destdir, chroot=job.chroot, cont=True, recurse=True,
- repos=chroot_repos, macros=macros,
+ repos=chroot_repos, macros=macros, buildroot_pkgs=job.buildroot_pkgs,
callback=mockremote.CliLogCallBack(quiet=True,logfn=chrootlogfile))
mr.build_pkgs(job.pkgs)
except mockremote.MockRemoteError, e:
diff --git a/backend/mockremote.py b/backend/mockremote.py
index 4d8d160..a968e03 100755
--- a/backend/mockremote.py
+++ b/backend/mockremote.py
@@ -49,6 +49,7 @@ DEF_CHROOT = None
DEF_USER = 'mockbuilder'
DEF_DESTDIR = os.getcwd()
DEF_MACROS = {}
+DEF_BUILDROOT_PKGS = ''
class SortedOptParser(optparse.OptionParser):
'''Optparser which sorts the options by opt before outputting --help'''
@@ -212,13 +213,14 @@ class CliLogCallBack(DefaultCallBack):
print msg
class Builder(object):
- def __init__(self, hostname, username, timeout, mockremote):
+ def __init__(self, hostname, username, timeout, mockremote, buildroot_pkgs):
self.hostname = hostname
self.username = username
self.timeout = timeout
self.chroot = mockremote.chroot
self.repos = mockremote.repos
self.mockremote = mockremote
+ self.buildroot_pkgs = buildroot_pkgs
self.checked = False
self._tempdir = None
# if we're at this point we've connected and done stuff on the host
@@ -269,6 +271,17 @@ class Builder(object):
remote_pkg_dir = os.path.normpath(self.remote_build_dir + '/results/' + self.chroot + '/' + pdn)
return remote_pkg_dir
+ def modify_base_buildroot(self):
+ """ modify mock config for current chroot
+
+ packages in buildroot_pkgs are added to minimal buildroot """
+ command = 'sed -i "1,\$s/config_opts\[\'chroot_setup_cmd\'\].*/config_opts\[\'chroot_setup_cmd\'\] = \'install @build %s\'/" /etc/mock/%s.cfg' % (self.buildroot_pkgs, self.chroot)
+ self.mockremote.callback.log('executing: %r' % command)
+ self.conn.module_name = "shell"
+ self.conn.module_args = command
+ # FIXME should probably check this but <shrug>
+ results = self.conn.run()
+
def build(self, pkg):
# build the pkg passed in
@@ -278,6 +291,7 @@ class Builder(object):
# returns success_bool, out, err
success = False
+ self.modify_base_buildroot()
# check if pkg is local or http
dest = None
@@ -407,7 +421,8 @@ class MockRemote(object):
destdir=DEF_DESTDIR, chroot=DEF_CHROOT, cont=False, recurse=False,
repos=DEF_REPOS, callback=None,
remote_basedir=DEF_REMOTE_BASEDIR, remote_tempdir=None,
- macros=DEF_MACROS):
+ macros=DEF_MACROS,
+ buildroot_pkgs=DEF_BUILDROOT_PKGS):
self.destdir = destdir
self.chroot = chroot
@@ -423,7 +438,7 @@ class MockRemote(object):
self.callback = DefaultCallBack()
self.callback.log("Setting up builder: %s" % builder)
- self.builder = Builder(builder, user, timeout, self)
+ self.builder = Builder(builder, user, timeout, self, buildroot_pkgs)
if not self.chroot:
raise MockRemoteError("No chroot specified!")
diff --git a/coprs_frontend/alembic/versions/3a415c6392bc_add_buildroot_pkgs_c.py b/coprs_frontend/alembic/versions/3a415c6392bc_add_buildroot_pkgs_c.py
new file mode 100644
index 0000000..3da52f0
--- /dev/null
+++ b/coprs_frontend/alembic/versions/3a415c6392bc_add_buildroot_pkgs_c.py
@@ -0,0 +1,22 @@
+"""add buildroot_pkgs column
+
+Revision ID: 3a415c6392bc
+Revises: 52e53e7b413e
+Create Date: 2013-11-28 15:46:24.860025
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '3a415c6392bc'
+down_revision = '52e53e7b413e'
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+ op.add_column('copr_chroot', sa.Column('buildroot_pkgs', sa.Text(), nullable=True))
+
+
+def downgrade():
+ op.drop_column('copr_chroot', 'buildroot_pkgs')
diff --git a/coprs_frontend/coprs/__init__.py b/coprs_frontend/coprs/__init__.py
index bb2157f..47a4411 100644
--- a/coprs_frontend/coprs/__init__.py
+++ b/coprs_frontend/coprs/__init__.py
@@ -37,6 +37,7 @@ from coprs.views.api_ns import api_general
from coprs.views import coprs_ns
from coprs.views.coprs_ns import coprs_builds
from coprs.views.coprs_ns import coprs_general
+from coprs.views.coprs_ns import coprs_chroots
from coprs.views import backend_ns
from coprs.views.backend_ns import backend_general
from coprs.views import misc
diff --git a/coprs_frontend/coprs/forms.py b/coprs_frontend/coprs/forms.py
index b2db8e9..d898654 100644
--- a/coprs_frontend/coprs/forms.py
+++ b/coprs_frontend/coprs/forms.py
@@ -186,6 +186,10 @@ class BuildForm(wtf.Form):
max=constants.MAX_BUILD_TIMEOUT)],
default=constants.DEFAULT_BUILD_TIMEOUT)
+class ChrootForm(wtf.Form):
+ """ Validator for editing chroots in project (adding packages to minimal chroot) """
+ buildroot_pkgs = wtforms.TextField('Additional packages to be always present in minimal buildroot')
+
class CoprLegalFlagForm(wtf.Form):
comment = wtforms.TextAreaField('Comment')
diff --git a/coprs_frontend/coprs/logic/coprs_logic.py b/coprs_frontend/coprs/logic/coprs_logic.py
index 5129a82..a34fd1e 100644
--- a/coprs_frontend/coprs/logic/coprs_logic.py
+++ b/coprs_frontend/coprs/logic/coprs_logic.py
@@ -258,6 +258,14 @@ class CoprChrootsLogic(object):
db.session.add(models.CoprChroot(copr=copr, mock_chroot=mock_chroot))
@classmethod
+ def update_buildroot_pkgs(cls, copr, chroot, buildroot_pkgs):
+ current_chroots = copr.mock_chroots
+ copr_chroot = copr.check_copr_chroot(chroot)
+ if copr_chroot:
+ copr_chroot.buildroot_pkgs = buildroot_pkgs
+ db.session.add(copr_chroot)
+
+ @classmethod
def update_from_names(cls, user, copr, names):
current_chroots = copr.mock_chroots
new_chroots = cls.mock_chroots_from_names(user, names)
diff --git a/coprs_frontend/coprs/models.py b/coprs_frontend/coprs/models.py
index 1ea63b5..e7881c0 100644
--- a/coprs_frontend/coprs/models.py
+++ b/coprs_frontend/coprs/models.py
@@ -183,6 +183,25 @@ class Copr(db.Model, Serializer):
"""Returns list of active mock_chroots of this copr"""
return filter(lambda x: x.is_active, self.mock_chroots)
+ def check_copr_chroot(self, chroot):
+ """Return object of chroot, if is related to our copr or None"""
+ result = None
+ # there will be max ~10 chroots per build, iteration will be probably faster than sql query
+ for copr_chroot in self.copr_chroots:
+ if copr_chroot.mock_chroot_id == chroot.id:
+ result = copr_chroot
+ break
+ return result
+
+ def buildroot_pkgs(self, chroot):
+ """Returns packages in minimal buildroot for given chroot."""
+ result = ''
+ # this is ugly as user can remove chroot after he submit build, but lets call this feature
+ copr_chroot = self.check_copr_chroot(chroot)
+ if copr_chroot:
+ result = copr_chroot.buildroot_pkgs
+ return result
+
class CoprPermission(db.Model, Serializer):
"""Association class for Copr<->Permission relation"""
## see helpers.PermissionEnum for possible values of the fields below
@@ -284,6 +303,7 @@ class MockChroot(db.Model, Serializer):
class CoprChroot(db.Model, Serializer):
"""Representation of Copr<->MockChroot relation"""
+ buildroot_pkgs = db.Column(db.Text)
mock_chroot_id = db.Column(db.Integer, db.ForeignKey('mock_chroot.id'), primary_key = True)
mock_chroot = db.relationship('MockChroot', backref = db.backref('copr_chroots'))
copr_id = db.Column(db.Integer, db.ForeignKey('copr.id'), primary_key = True)
diff --git a/coprs_frontend/coprs/templates/coprs/_coprs_forms.html b/coprs_frontend/coprs/templates/coprs/_coprs_forms.html
index 5d2f519..6abe22f 100644
--- a/coprs_frontend/coprs/templates/coprs/_coprs_forms.html
+++ b/coprs_frontend/coprs/templates/coprs/_coprs_forms.html
@@ -29,7 +29,17 @@
<table class="chroots-set">
{% for ch in chs %}
<tr>
- <td>{{ form|attr(ch)|attr('label') }}</td><td>{{ form|attr(ch) }}</td>
+ <td>
+ {{ form|attr(ch)|attr('label') }}
+ {% if form|attr(ch)|attr('label') %}
+ {% else %}
+ {{ form|attr(ch)|attr('label') }}
+ {% endif %}
+ </td><td>{{ form|attr(ch) }}
+ {% if copr and form|attr(ch)|attr('data') %}
+ </td><td><a href="{{ url_for('coprs_ns.chroot_edit', username = copr.owner.name, coprname = copr.name, chrootname = form|attr(ch)|attr('label')|attr('text'))}}">[Edit]</a>
+ {% endif %}
+ </td>
</tr>
{% endfor %}
</table>
diff --git a/coprs_frontend/coprs/templates/coprs/detail/edit2.html b/coprs_frontend/coprs/templates/coprs/detail/edit2.html
new file mode 100644
index 0000000..3127b20
--- /dev/null
+++ b/coprs_frontend/coprs/templates/coprs/detail/edit2.html
@@ -0,0 +1,13 @@
+{% extends "coprs/detail.html" %}
+
+{% block detail_body %}
+
+ <div class="horizontal-menu">
+ <ul>
+ <li class="{% block edit_chroot_selected %}unselected{% endblock %}">
+ <a href="#">Chroot</a>
+ </li>
+ </ul>
+ </div>
+ {% block detail_body2 %}{% endblock %}
+{% endblock %}
diff --git a/coprs_frontend/coprs/templates/coprs/detail/edit_chroot.html b/coprs_frontend/coprs/templates/coprs/detail/edit_chroot.html
new file mode 100644
index 0000000..9f0905c
--- /dev/null
+++ b/coprs_frontend/coprs/templates/coprs/detail/edit_chroot.html
@@ -0,0 +1,19 @@
+{% extends "coprs/detail/edit2.html" %}
+{% from "_helpers.html" import render_field %}
+{% block title %}Editing {{ copr.owner.name }}/{{ copr.name }}/{{ chroot.chroot_name }}{% endblock %}
+{% block edit_selected %}selected{% endblock %}
+{% block edit_chroot_selected %}selected{% endblock %}
+
+{% block detail_body2 %}
+
+ <h2>Edit chroot '{{ chroot.chroot_name }}'</h2>
+ <form action="{{ url_for('coprs_ns.chroot_update', username = copr.owner.name, coprname = copr.name, chrootname = chroot.chroot_name) }}" method=post class=add-entry>
+ <dl>
+ {{ form.csrf_token }}
+ {{ render_field(form.buildroot_pkgs, size=80, placeholder='Space separeted list of packages. E.g.: scl-utils-build rubu193-build') }}
+ <dt><input type="submit" value="Update"></dt>
+ </dl>
+ </form>
+
+
+{% endblock %}
diff --git a/coprs_frontend/coprs/views/backend_ns/backend_general.py b/coprs_frontend/coprs/views/backend_ns/backend_general.py
index fbc009a..c76c5fb 100644
--- a/coprs_frontend/coprs/views/backend_ns/backend_general.py
+++ b/coprs_frontend/coprs/views/backend_ns/backend_general.py
@@ -37,6 +37,7 @@ def waiting():
for chroot in build.chroots:
build_dict_copy = build_dict.copy()
build_dict_copy['chroot'] = chroot.chroot_name
+ build_dict_copy['buildroot_pkgs'] = build.copr.buildroot_pkgs(chroot)
builds_list.append(build_dict_copy)
return flask.jsonify({'actions': actions_list, 'builds': builds_list})
diff --git a/coprs_frontend/coprs/views/coprs_ns/coprs_chroots.py b/coprs_frontend/coprs/views/coprs_ns/coprs_chroots.py
new file mode 100644
index 0000000..45baf4a
--- /dev/null
+++ b/coprs_frontend/coprs/views/coprs_ns/coprs_chroots.py
@@ -0,0 +1,50 @@
+import flask
+
+from coprs import db
+from coprs import exceptions
+from coprs import forms
+from coprs import helpers
+from coprs import models
+
+from coprs.logic import builds_logic
+from coprs.logic import coprs_logic
+
+from coprs.views.misc import login_required, page_not_found
+from coprs.views.coprs_ns import coprs_ns
+
+
+(a)coprs_ns.route('/<username>/<coprname>/edit_chroot/<chrootname>/')
+@login_required
+def chroot_edit(username, coprname, chrootname):
+ copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
+ chroot = coprs_logic.MockChrootsLogic.get_from_name(chrootname, active_only=True).first()
+ if not copr:
+ return page_not_found('Project with name {0} does not exist.'.format(coprname))
+ if not chroot:
+ return page_not_found('Chroot name {0} does not exist.'.format(chrootname))
+ form = forms.ChrootForm(buildroot_pkgs=copr.buildroot_pkgs(chroot))
+ #FIXME - test if chroot belongs to copr
+ if flask.g.user.can_build_in(copr):
+ return flask.render_template('coprs/detail/edit_chroot.html', form=form, copr=copr, chroot=chroot)
+ else:
+ return page_not_found("You are not allowed to modify chroots in project ${0}." % coprname)
+
+(a)coprs_ns.route('/<username>/<coprname>/update_chroot/<chrootname>/', methods=['POST'])
+@login_required
+def chroot_update(username, coprname, chrootname):
+ form = forms.ChrootForm()
+ copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
+ chroot = coprs_logic.MockChrootsLogic.get_from_name(chrootname, active_only=True).first()
+ if not copr: # hey, this Copr doesn't exist
+ return page_not_found('Projec with name {0} does not exist.'.format(coprname))
+ if form.validate_on_submit() and flask.g.user.can_build_in(copr):
+ coprs_logic.CoprChrootsLogic.update_buildroot_pkgs(copr, chroot, form.buildroot_pkgs.data)
+ flask.flash("Buildroot {0} for project {1} was updated".format(chrootname, coprname))
+ db.session.commit()
+
+ return flask.redirect(flask.url_for('coprs_ns.copr_edit', username = username, coprname = copr.name))
+ else:
+ if form.validate_on_submit():
+ flask.flash("You are not allowed to modify chroots.")
+ else:
+ return chroot_edit(username, coprname, chrootname)
10 years, 5 months
[copr] master: [backend] create word readable files in result directory (8f3a90e)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 8f3a90ea1dfef9023ead786628ed30dc6d0d82f8
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Wed Dec 4 15:06:00 2013 +0100
[backend] create word readable files in result directory
>---------------------------------------------------------------
copr-be.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/copr-be.py b/copr-be.py
index 7373d5e..ce94460 100755
--- a/copr-be.py
+++ b/copr-be.py
@@ -286,7 +286,7 @@ def main(args):
gid = grp.getgrnam('copr').gr_gid,
uid = pwd.getpwnam('copr').pw_uid,
detach_process = opts.daemonize,
- umask = 077,
+ umask = 022,
stderr = sys.stderr,
signal_map = {
signal.SIGTERM: 'terminate',
10 years, 5 months