Merge lp:~cjohnston/ubuntu-ci-services-itself/new-ticket-defaults into lp:ubuntu-ci-services-itself

Proposed by Chris Johnston
Status: Merged
Approved by: Chris Johnston
Approved revision: 227
Merged at revision: 231
Proposed branch: lp:~cjohnston/ubuntu-ci-services-itself/new-ticket-defaults
Merge into: lp:ubuntu-ci-services-itself
Diff against target: 277 lines (+60/-11)
9 files modified
juju-deployer/configs/unit_config.yaml.tmpl (+5/-0)
juju-deployer/ticket-system.yaml (+1/-2)
ticket_system/setup.py (+1/-0)
ticket_system/ticket/migrations/0001_initial.py (+7/-3)
ticket_system/ticket/models.py (+10/-0)
ticket_system/ticket/tests/test_full_read_api.py (+2/-0)
ticket_system/ticket/tests/test_models.py (+4/-2)
ticket_system/ticket/tests/test_read_api.py (+10/-0)
ticket_system/ticket_system/settings.py (+20/-4)
To merge this branch: bzr merge lp:~cjohnston/ubuntu-ci-services-itself/new-ticket-defaults
Reviewer Review Type Date Requested Status
Andy Doan (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+205640@code.launchpad.net

Commit message

Add 'series' and 'master ppa' defaults to a ticket

Description of the change

* Add 'series' and 'master ppa' defaults to a ticket
* switch from defining extra settings in the deployer yaml to using unit_config

To post a comment you must log in.
Revision history for this message
Andy Doan (doanac) wrote :

hard to argue against this, since 50% of this was my idea :)

review: Approve
226. By Chris Johnston

cleanup

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:226
http://s-jenkins.ubuntu-ci:8080/job/uci-engine-ci/131/
Executed test runs:

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/uci-engine-ci/131/rebuild

review: Approve (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:227
http://s-jenkins.ubuntu-ci:8080/job/uci-engine-ci/133/
Executed test runs:

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/uci-engine-ci/133/rebuild

review: Approve (continuous-integration)
227. By Chris Johnston

Add choices

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:227
http://s-jenkins.ubuntu-ci:8080/job/uci-engine-ci/139/
Executed test runs:

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/uci-engine-ci/139/rebuild

review: Approve (continuous-integration)
Revision history for this message
Andy Doan (doanac) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'juju-deployer/configs/unit_config.yaml.tmpl'
--- juju-deployer/configs/unit_config.yaml.tmpl 2014-02-03 20:29:42 +0000
+++ juju-deployer/configs/unit_config.yaml.tmpl 2014-02-11 16:41:21 +0000
@@ -14,3 +14,8 @@
14oauth_token_secret: TODO14oauth_token_secret: TODO
1515
16ppa_pattern: "ci-pool-\\d+"16ppa_pattern: "ci-pool-\\d+"
17
18# for ticket system
19base_image: "http://cloud-images.ubuntu.com/releases/13.10/release-20131015/ubuntu-13.10-server-cloudimg-amd64-disk1.img"
20series: SAUCY
21master_ppa: TODO
1722
=== modified file 'juju-deployer/ticket-system.yaml'
--- juju-deployer/ticket-system.yaml 2014-01-29 20:13:31 +0000
+++ juju-deployer/ticket-system.yaml 2014-02-11 16:41:21 +0000
@@ -16,13 +16,12 @@
16 options:16 options:
17 vcs: bzr17 vcs: bzr
18 repos_url: lp:ubuntu-ci-services-itself18 repos_url: lp:ubuntu-ci-services-itself
19 additional_distro_packages: python-mock,lazr.enum19 additional_distro_packages: python-mock,lazr.enum, python-yaml
20 additional_pip_packages: django-tastypie==0.9.1520 additional_pip_packages: django-tastypie==0.9.15
21 application_path: ticket_system/21 application_path: ticket_system/
22 django_settings: ticket_system.settings22 django_settings: ticket_system.settings
23 django_south: True23 django_south: True
24 django_debug: True24 django_debug: True
25 django_extra_settings: BASE_IMAGE_DEFAULT="http://cloud-images.ubuntu.com/releases/13.10/release-20131015/ubuntu-13.10-server-cloudimg-amd64-disk1.img"
26 python_path: /srv/ts_django/ci-utils:/srv/ts_django/ticket_system25 python_path: /srv/ts_django/ci-utils:/srv/ts_django/ticket_system
27 # this gets shared with gunicorn via a relation-set in this charm26 # this gets shared with gunicorn via a relation-set in this charm
28 wsgi_wsgi_file: ticket_system.wsgi:application27 wsgi_wsgi_file: ticket_system.wsgi:application
2928
=== modified file 'ticket_system/setup.py'
--- ticket_system/setup.py 2014-01-14 19:16:51 +0000
+++ ticket_system/setup.py 2014-02-11 16:41:21 +0000
@@ -49,6 +49,7 @@
49 'mock==1.0.1',49 'mock==1.0.1',
50 'model_mommy==1.2',50 'model_mommy==1.2',
51 'lazr.enum>=1.1.2',51 'lazr.enum>=1.1.2',
52 'PyYAML==3.10',
52]53]
5354
54setup(55setup(
5556
=== modified file 'ticket_system/ticket/migrations/0001_initial.py'
--- ticket_system/ticket/migrations/0001_initial.py 2014-01-24 16:39:35 +0000
+++ ticket_system/ticket/migrations/0001_initial.py 2014-02-11 16:41:21 +0000
@@ -17,7 +17,9 @@
17 ('bug_id', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),17 ('bug_id', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
18 ('current_workflow_step', self.gf('django.db.models.fields.IntegerField')(default=0, max_length=4096)),18 ('current_workflow_step', self.gf('django.db.models.fields.IntegerField')(default=0, max_length=4096)),
19 ('status', self.gf('django.db.models.fields.IntegerField')(default=0, max_length=4096)),19 ('status', self.gf('django.db.models.fields.IntegerField')(default=0, max_length=4096)),
20 ('base_image', self.gf('django.db.models.fields.CharField')(max_length=4096)),20 ('base_image', self.gf('django.db.models.fields.CharField')(default='', max_length=4096)),
21 ('series', self.gf('django.db.models.fields.CharField')(default=None, max_length=4096)),
22 ('master_ppa', self.gf('django.db.models.fields.CharField')(default=None, max_length=4096)),
21 ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),23 ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
22 ('updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),24 ('updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
23 ('added_binaries', self.gf('django.db.models.fields.CharField')(max_length=4096, null=True, blank=True)),25 ('added_binaries', self.gf('django.db.models.fields.CharField')(max_length=4096, null=True, blank=True)),
@@ -86,7 +88,7 @@
86 u'project.sourcepackage': {88 u'project.sourcepackage': {
87 'Meta': {'object_name': 'SourcePackage', 'db_table': "'sourcepackage'"},89 'Meta': {'object_name': 'SourcePackage', 'db_table': "'sourcepackage'"},
88 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),90 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
89 'name': ('django.db.models.fields.CharField', [], {'max_length': '4096'})91 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '4096'})
90 },92 },
91 u'ticket.sourcepackageupload': {93 u'ticket.sourcepackageupload': {
92 'Meta': {'object_name': 'SourcePackageUpload', 'db_table': "'sourcepackageupload'"},94 'Meta': {'object_name': 'SourcePackageUpload', 'db_table': "'sourcepackageupload'"},
@@ -114,14 +116,16 @@
114 u'ticket.ticket': {116 u'ticket.ticket': {
115 'Meta': {'object_name': 'Ticket', 'db_table': "'ticket'"},117 'Meta': {'object_name': 'Ticket', 'db_table': "'ticket'"},
116 'added_binaries': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True', 'blank': 'True'}),118 'added_binaries': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True', 'blank': 'True'}),
117 'base_image': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),119 'base_image': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '4096'}),
118 'bug_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),120 'bug_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
119 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),121 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
120 'current_workflow_step': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '4096'}),122 'current_workflow_step': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '4096'}),
121 'description': ('django.db.models.fields.TextField', [], {}),123 'description': ('django.db.models.fields.TextField', [], {}),
122 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),124 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
125 'master_ppa': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '4096'}),
123 'owner': ('django.db.models.fields.EmailField', [], {'max_length': '254'}),126 'owner': ('django.db.models.fields.EmailField', [], {'max_length': '254'}),
124 'removed_binaries': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True', 'blank': 'True'}),127 'removed_binaries': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'null': 'True', 'blank': 'True'}),
128 'series': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '4096'}),
125 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '4096'}),129 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '4096'}),
126 'title': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),130 'title': ('django.db.models.fields.CharField', [], {'max_length': '4096'}),
127 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})131 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
128132
=== modified file 'ticket_system/ticket/models.py'
--- ticket_system/ticket/models.py 2014-01-28 12:28:13 +0000
+++ ticket_system/ticket/models.py 2014-02-11 16:41:21 +0000
@@ -38,6 +38,12 @@
38 class Meta:38 class Meta:
39 db_table = 'ticket'39 db_table = 'ticket'
4040
41 SERIES_CHOICES = (
42 ('PRECISE', 'Precise'),
43 ('QUANTAL', 'Quantal'),
44 ('SAUCY', 'Saucy'),
45 ('TRUSTY', 'Trusty'),
46 )
41 owner = models.EmailField(max_length=254)47 owner = models.EmailField(max_length=254)
42 title = models.CharField(max_length=4096)48 title = models.CharField(max_length=4096)
43 description = models.TextField()49 description = models.TextField()
@@ -50,6 +56,10 @@
50 default=000)56 default=000)
51 base_image = models.CharField(max_length=4096,57 base_image = models.CharField(max_length=4096,
52 default=settings.BASE_IMAGE_DEFAULT)58 default=settings.BASE_IMAGE_DEFAULT)
59 series = models.CharField(max_length=4096, choices=SERIES_CHOICES,
60 default=settings.SERIES_DEFAULT)
61 master_ppa = models.CharField(max_length=4096,
62 default=settings.MASTER_PPA_DEFAULT)
53 created = models.DateTimeField(auto_now_add=True)63 created = models.DateTimeField(auto_now_add=True)
54 updated = models.DateTimeField(auto_now=True)64 updated = models.DateTimeField(auto_now=True)
55 # Comma-separated list of binary names to install or not install when65 # Comma-separated list of binary names to install or not install when
5666
=== modified file 'ticket_system/ticket/tests/test_full_read_api.py'
--- ticket_system/ticket/tests/test_full_read_api.py 2014-01-24 16:58:12 +0000
+++ ticket_system/ticket/tests/test_full_read_api.py 2014-02-11 16:41:21 +0000
@@ -89,7 +89,9 @@
89 u'owner': unicode(self.ticket.owner),89 u'owner': unicode(self.ticket.owner),
90 u'base_image': unicode(self.ticket.base_image),90 u'base_image': unicode(self.ticket.base_image),
91 u'id': self.ticket.pk,91 u'id': self.ticket.pk,
92 u'master_ppa': unicode(self.ticket.master_ppa),
92 u'resource_uri': u'/api/v1/fullticket/{0}/'.format(self.ticket.pk),93 u'resource_uri': u'/api/v1/fullticket/{0}/'.format(self.ticket.pk),
94 u'series': unicode(self.ticket.series),
93 u'updated': unicode(self.ticket.updated.strftime(95 u'updated': unicode(self.ticket.updated.strftime(
94 "%Y-%m-%dT%H:%M:%S.%f")),96 "%Y-%m-%dT%H:%M:%S.%f")),
95 u'removed_binaries': self.ticket.removed_binaries,97 u'removed_binaries': self.ticket.removed_binaries,
9698
=== modified file 'ticket_system/ticket/tests/test_models.py'
--- ticket_system/ticket/tests/test_models.py 2014-01-24 16:39:35 +0000
+++ ticket_system/ticket/tests/test_models.py 2014-02-11 16:41:21 +0000
@@ -42,8 +42,8 @@
42 bug_id='12345', owner='test@example.com',42 bug_id='12345', owner='test@example.com',
43 current_workflow_step=TicketWorkflowStep.PKG_BUILDING,43 current_workflow_step=TicketWorkflowStep.PKG_BUILDING,
44 status=TicketWorkflowStepStatus.PKG_BUILDING_INPROGRESS,44 status=TicketWorkflowStepStatus.PKG_BUILDING_INPROGRESS,
45 base_image='17', added_binaries="foo,bar",45 base_image='17', added_binaries="foo,bar", series='saucy',
46 removed_binaries="baz"):46 removed_binaries="baz", master_ppa='ci-engine/ppa'):
47 ticket = Ticket()47 ticket = Ticket()
48 ticket.owner = owner48 ticket.owner = owner
49 ticket.title = title49 ticket.title = title
@@ -54,6 +54,8 @@
54 ticket.base_image = base_image54 ticket.base_image = base_image
55 ticket.added_binaries = added_binaries55 ticket.added_binaries = added_binaries
56 ticket.removed_binaries = removed_binaries56 ticket.removed_binaries = removed_binaries
57 ticket.series = series
58 ticket.master_ppa = master_ppa
57 ticket.save()59 ticket.save()
58 return ticket60 return ticket
5961
6062
=== modified file 'ticket_system/ticket/tests/test_read_api.py'
--- ticket_system/ticket/tests/test_read_api.py 2014-01-24 16:58:12 +0000
+++ ticket_system/ticket/tests/test_read_api.py 2014-02-11 16:41:21 +0000
@@ -77,8 +77,10 @@
77 u'removed_binaries': self.ticket.removed_binaries,77 u'removed_binaries': self.ticket.removed_binaries,
78 u'base_image': unicode(self.ticket.base_image),78 u'base_image': unicode(self.ticket.base_image),
79 u'id': self.ticket.pk,79 u'id': self.ticket.pk,
80 u'master_ppa': unicode(self.ticket.master_ppa),
80 u'resource_uri': u'/api/v1/ticket/{0}/'.format(81 u'resource_uri': u'/api/v1/ticket/{0}/'.format(
81 self.ticket.pk),82 self.ticket.pk),
83 u'series': unicode(self.ticket.series),
82 u'updated': unicode(self.ticket.updated.strftime(84 u'updated': unicode(self.ticket.updated.strftime(
83 "%Y-%m-%dT%H:%M:%S.%f"))},85 "%Y-%m-%dT%H:%M:%S.%f"))},
84 u'id': self.subticket.pk,86 u'id': self.subticket.pk,
@@ -111,8 +113,10 @@
111 u'removed_binaries': self.ticket.removed_binaries,113 u'removed_binaries': self.ticket.removed_binaries,
112 u'base_image': unicode(self.ticket.base_image),114 u'base_image': unicode(self.ticket.base_image),
113 u'id': self.ticket.pk,115 u'id': self.ticket.pk,
116 u'master_ppa': unicode(self.ticket.master_ppa),
114 u'resource_uri': u'/api/v1/ticket/{0}/'.format(117 u'resource_uri': u'/api/v1/ticket/{0}/'.format(
115 self.ticket.pk),118 self.ticket.pk),
119 u'series': unicode(self.ticket.series),
116 u'updated': unicode(self.ticket.updated.strftime(120 u'updated': unicode(self.ticket.updated.strftime(
117 "%Y-%m-%dT%H:%M:%S.%f"))},121 "%Y-%m-%dT%H:%M:%S.%f"))},
118 u'type': unicode(self.artifact_2.type),122 u'type': unicode(self.artifact_2.type),
@@ -154,6 +158,7 @@
154 TicketWorkflowStep)),158 TicketWorkflowStep)),
155 u'description': unicode(self.ticket.description),159 u'description': unicode(self.ticket.description),
156 u'id': self.ticket.pk,160 u'id': self.ticket.pk,
161 u'master_ppa': unicode(self.ticket.master_ppa),
157 u'owner': unicode(self.ticket.owner),162 u'owner': unicode(self.ticket.owner),
158 u'removed_binaries': self.ticket.removed_binaries,163 u'removed_binaries': self.ticket.removed_binaries,
159 u'status': unicode(get_enum_title(self.ticket.status,164 u'status': unicode(get_enum_title(self.ticket.status,
@@ -161,6 +166,7 @@
161 u'title': unicode(self.ticket.title),166 u'title': unicode(self.ticket.title),
162 u'resource_uri': u'/api/v1/ticket/{0}/'.format(167 u'resource_uri': u'/api/v1/ticket/{0}/'.format(
163 self.ticket.pk),168 self.ticket.pk),
169 u'series': unicode(self.ticket.series),
164 u'updated': unicode(self.ticket.updated.strftime(170 u'updated': unicode(self.ticket.updated.strftime(
165 "%Y-%m-%dT%H:%M:%S.%f"))},171 "%Y-%m-%dT%H:%M:%S.%f"))},
166 })172 })
@@ -183,8 +189,10 @@
183 u'removed_binaries': self.ticket.removed_binaries,189 u'removed_binaries': self.ticket.removed_binaries,
184 u'base_image': unicode(self.ticket.base_image),190 u'base_image': unicode(self.ticket.base_image),
185 u'id': self.ticket.pk,191 u'id': self.ticket.pk,
192 u'master_ppa': unicode(self.ticket.master_ppa),
186 u'resource_uri': u'/api/v1/ticket/{0}/'.format(193 u'resource_uri': u'/api/v1/ticket/{0}/'.format(
187 self.ticket.pk),194 self.ticket.pk),
195 u'series': unicode(self.ticket.series),
188 u'updated': unicode(self.ticket.updated.strftime(196 u'updated': unicode(self.ticket.updated.strftime(
189 "%Y-%m-%dT%H:%M:%S.%f")),197 "%Y-%m-%dT%H:%M:%S.%f")),
190 })198 })
@@ -380,8 +388,10 @@
380 u'removed_binaries': self.ticket_6.removed_binaries,388 u'removed_binaries': self.ticket_6.removed_binaries,
381 u'base_image': unicode(self.ticket_6.base_image),389 u'base_image': unicode(self.ticket_6.base_image),
382 u'id': self.ticket_6.pk,390 u'id': self.ticket_6.pk,
391 u'master_ppa': unicode(self.ticket_6.master_ppa),
383 u'resource_uri': u'/api/v1/opentickets/{0}/'.format(392 u'resource_uri': u'/api/v1/opentickets/{0}/'.format(
384 self.ticket_6.pk),393 self.ticket_6.pk),
394 u'series': unicode(self.ticket_6.series),
385 u'updated': unicode(self.ticket_6.updated.strftime(395 u'updated': unicode(self.ticket_6.updated.strftime(
386 "%Y-%m-%dT%H:%M:%S.%f")),396 "%Y-%m-%dT%H:%M:%S.%f")),
387 })397 })
388398
=== modified file 'ticket_system/ticket_system/settings.py'
--- ticket_system/ticket_system/settings.py 2014-01-27 15:48:03 +0000
+++ ticket_system/ticket_system/settings.py 2014-02-11 16:41:21 +0000
@@ -1,5 +1,5 @@
1# Ubuntu Continuous Integration Engine1# Ubuntu Continuous Integration Engine
2# Copyright 2013 Canonical Ltd.2# Copyright 2013, 2014 Canonical Ltd.
33
4# This program is free software: you can redistribute it and/or modify it4# This program is free software: you can redistribute it and/or modify it
5# under the terms of the GNU Affero General Public License version 3, as5# under the terms of the GNU Affero General Public License version 3, as
@@ -13,7 +13,10 @@
13# You should have received a copy of the GNU Affero General Public License13# You should have received a copy of the GNU Affero General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.14# along with this program. If not, see <http://www.gnu.org/licenses/>.
1515
16import glob
16import os17import os
18import yaml
19
17BASEDIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))20BASEDIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
1821
19DEBUG = False22DEBUG = False
@@ -25,6 +28,22 @@
2528
26MANAGERS = ADMINS29MANAGERS = ADMINS
2730
31
32def _unit_config():
33 path = os.path.join(BASEDIR, '../unit_config')
34 config = {}
35 try:
36 with open(path) as f:
37 config = yaml.safe_load(f.read())
38 except:
39 print('Unable to use unit_config(%s), defaulting values' % path)
40 return config
41_cfg = _unit_config()
42
43BASE_IMAGE_DEFAULT = _cfg.get('base_image', '')
44SERIES_DEFAULT = _cfg.get('series', '')
45MASTER_PPA_DEFAULT = _cfg.get('master_ppa', '')
46
28DATABASES = {47DATABASES = {
29 'default': {48 'default': {
30 'ENGINE': 'django.db.backends.sqlite3',49 'ENGINE': 'django.db.backends.sqlite3',
@@ -186,8 +205,6 @@
186 }205 }
187}206}
188207
189BASE_IMAGE_DEFAULT = ""
190
191# Use local settings if available208# Use local settings if available
192try:209try:
193 from local_settings import *210 from local_settings import *
@@ -196,7 +213,6 @@
196213
197# Pull in juju_settings214# Pull in juju_settings
198try:215try:
199 import glob, os
200 p = os.path.join(os.path.dirname(__file__), '../juju_settings')216 p = os.path.join(os.path.dirname(__file__), '../juju_settings')
201 p = os.path.join(os.path.abspath(p), '*.py')217 p = os.path.join(os.path.abspath(p), '*.py')
202 for f in sorted(glob.glob(p)):218 for f in sorted(glob.glob(p)):

Subscribers

People subscribed via source and target branches