From 282c1a265c348f9a35df4df83d7dcf3c0656ef3b Mon Sep 17 00:00:00 2001 From: Victor Seva Date: Thu, 7 May 2015 17:49:20 +0200 Subject: [PATCH] MT#7247 add jobname field - support get projects by release Change-Id: Iab2729b3cd1e8934ce68495b9aae73556684c3d4 --- panel/templates/panel/project.html | 8 +++- panel/templates/panel/release.html | 8 +++- repoapi/fixtures/test_model_queries.json | 12 ++++-- repoapi/migrations/0001_initial.py | 16 +++----- repoapi/migrations/0002_auto_20150507_0746.py | 19 ---------- repoapi/models.py | 23 ++++++++---- repoapi/serializers.py | 4 -- repoapi/test/test_basic_model.py | 2 + repoapi/test/test_model_queries.py | 19 ++++++---- repoapi/test/test_rest.py | 2 + repoapi/urls.py | 3 ++ repoapi/views.py | 37 ++++++++++++++++--- 12 files changed, 92 insertions(+), 61 deletions(-) delete mode 100644 repoapi/migrations/0002_auto_20150507_0746.py diff --git a/panel/templates/panel/project.html b/panel/templates/panel/project.html index 50fb73e..b21d4be 100644 --- a/panel/templates/panel/project.html +++ b/panel/templates/panel/project.html @@ -179,7 +179,7 @@ function update_job_info(release, project, uuid, job) { if (! $.project[uuid][job].failed ) { $.ajax({ url: '/jenkinsbuildinfo/?format=json&tag=' + uuid - + '¶m_release={{ release}}&projectname=' + job, + + '¶m_release={{ release}}&jobname=' + job, method: 'GET', contentType: "application/json; charset=utf-8", dataType: "json", @@ -203,7 +203,7 @@ function update_uuid_info(release, project, uuid) { function successFunc(data, textStatus, jqXHR ) { $(data).each(function() { - var job = this.projectname; + var job = this.jobname; $.project[uuid].jobs.add(job); if (! $.project[uuid][job]) { @@ -256,6 +256,9 @@ function get_uuids_for_project(release, project) { console.warn(project + " skip null uuid"); return; } + if ($.project.uuids.has(uuid)) { + return; + } $.project.uuids.add(uuid); if (! $.project[uuid] ) { $.project[uuid] = { failed: false, jobs: new Set(),}; @@ -283,6 +286,7 @@ function get_uuids_for_project(release, project) { $('#' + project + '-error').html(error); $.project.failed = true; } + $.ajax({ url: '/release/{{ release }}/' + project + '/?format=json', method: 'GET', diff --git a/panel/templates/panel/release.html b/panel/templates/panel/release.html index 407fec1..a06a226 100644 --- a/panel/templates/panel/release.html +++ b/panel/templates/panel/release.html @@ -181,7 +181,7 @@ function update_job_info(release, project, uuid, job) { if (! $.release[project][uuid][job].failed ) { $.ajax({ url: '/jenkinsbuildinfo/?format=json&tag=' + uuid - + '¶m_release={{ release}}&projectname=' + job, + + '¶m_release={{ release}}&jobname=' + job, method: 'GET', contentType: "application/json; charset=utf-8", dataType: "json", @@ -205,7 +205,7 @@ function update_uuid_info(release, project, uuid) { function successFunc(data, textStatus, jqXHR ) { $(data).each(function() { - var job = this.projectname; + var job = this.jobname; $.release[project][uuid].jobs.add(job); if (! $.release[project][uuid][job]) { @@ -258,6 +258,9 @@ function get_uuids_for_project(release, project) { console.warn(project + " skip null uuid"); return; } + if ($.release[project].uuids.has(uuid)) { + return; + } $.release[project].uuids.add(uuid); if (! $.release[project][uuid] ) { $.release[project][uuid] = { failed: false, jobs: new Set(),}; @@ -285,6 +288,7 @@ function get_uuids_for_project(release, project) { $('#' + project + '-error').html(error); $.release[project].failed = true; } + $.ajax({ url: '/release/{{ release }}/' + project + '/?format=json', method: 'GET', diff --git a/repoapi/fixtures/test_model_queries.json b/repoapi/fixtures/test_model_queries.json index 96a1bcc..ed3c7f5 100644 --- a/repoapi/fixtures/test_model_queries.json +++ b/repoapi/fixtures/test_model_queries.json @@ -12,7 +12,8 @@ "param_ppa": null, "param_release": "mr3.1-fake", "param_tag": null, - "projectname": "fake-source", + "projectname": "fake", + "jobname": "fake-source", "repo_name": null, "result": "FAILED", "tag": "UUID1" @@ -33,7 +34,8 @@ "param_ppa": null, "param_release": "mr3.1-fake", "param_tag": null, - "projectname": "fake-get-code", + "projectname": "fake", + "jobname": "fake-get-code", "repo_name": null, "result": "FAILED", "tag": "UUID0" @@ -54,7 +56,8 @@ "param_ppa": null, "param_release": "mr3.1-fake", "param_tag": null, - "projectname": "fake-source-tests", + "projectname": "fake", + "jobname": "fake-source-tests", "repo_name": null, "result": "SUCCESS", "tag": "UUID1" @@ -75,7 +78,8 @@ "param_ppa": null, "param_release": "mr3.1-fake", "param_tag": null, - "projectname": "fake-get-code", + "projectname": "fake", + "jobname": "fake-get-code", "repo_name": null, "result": "SUCCESS", "tag": "UUID1" diff --git a/repoapi/migrations/0001_initial.py b/repoapi/migrations/0001_initial.py index 942d9e7..38ba19e 100644 --- a/repoapi/migrations/0001_initial.py +++ b/repoapi/migrations/0001_initial.py @@ -13,25 +13,21 @@ class Migration(migrations.Migration): migrations.CreateModel( name='JenkinsBuildInfo', fields=[ - ('id', models.AutoField( - verbose_name='ID', serialize=False, - auto_created=True, primary_key=True)), - ('tag', models.CharField(max_length=32, null=True)), + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('tag', models.CharField(max_length=64, null=True)), ('projectname', models.CharField(max_length=100)), + ('jobname', models.CharField(max_length=100)), ('buildnumber', models.IntegerField()), ('date', models.DateTimeField(auto_now_add=True)), ('result', models.CharField(max_length=50)), ('job_url', models.URLField()), - ('gerrit_patchset', models.CharField( - max_length=50, null=True)), + ('gerrit_patchset', models.CharField(max_length=50, null=True)), ('gerrit_change', models.CharField(max_length=50, null=True)), - ('gerrit_eventtype', models.CharField( - max_length=50, null=True)), + ('gerrit_eventtype', models.CharField(max_length=50, null=True)), ('param_tag', models.CharField(max_length=50, null=True)), ('param_branch', models.CharField(max_length=50, null=True)), ('param_release', models.CharField(max_length=50, null=True)), - ('param_distribution', models.CharField( - max_length=50, null=True)), + ('param_distribution', models.CharField(max_length=50, null=True)), ('param_ppa', models.CharField(max_length=50, null=True)), ('repo_name', models.CharField(max_length=50, null=True)), ], diff --git a/repoapi/migrations/0002_auto_20150507_0746.py b/repoapi/migrations/0002_auto_20150507_0746.py deleted file mode 100644 index 1fd7446..0000000 --- a/repoapi/migrations/0002_auto_20150507_0746.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('repoapi', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='jenkinsbuildinfo', - name='tag', - field=models.CharField(max_length=64, null=True), - ), - ] diff --git a/repoapi/models.py b/repoapi/models.py index 52fdc27..a16d68d 100644 --- a/repoapi/models.py +++ b/repoapi/models.py @@ -25,26 +25,35 @@ class JenkinsBuildInfoManager(models.Manager): else: return res.values('param_release') - def release_uuids_by_project(self, release, project, flat=True): + def release_projects(self, release, flat=True): res = self.get_queryset().filter( - param_release=release, projectname__startswith=project).distinct() + param_release=release).values('projectname').distinct() + if flat: + return res.values_list('projectname', flat=True) + else: + return res.values('projectname') + + def release_project_uuids(self, release, project, flat=True): + res = self.get_queryset().filter( + param_release=release, projectname=project).distinct() if flat: return res.values_list('tag', flat=True) else: return res.values('tag') - def projects_by_uuid(self, release, project, uuid, flat=True): + def jobs_by_uuid(self, release, project, uuid, flat=True): res = self.get_queryset().filter(tag=uuid, param_release=release, - projectname__startswith=project) + projectname=project) if flat: - return res.order_by('-date').values_list('projectname', flat=True) + return res.order_by('-date').values_list('jobname', flat=True) else: - return res.order_by('-date').values('projectname') + return res.order_by('-date').values('jobname') class JenkinsBuildInfo(models.Model): tag = models.CharField(max_length=64, null=True) projectname = models.CharField(max_length=100) + jobname = models.CharField(max_length=100) buildnumber = models.IntegerField() date = models.DateTimeField(auto_now_add=True) result = models.CharField(max_length=50) @@ -65,5 +74,5 @@ class JenkinsBuildInfo(models.Model): objects = JenkinsBuildInfoManager() def __str__(self): - return "%s:%d[%s]" % (self.projectname, + return "%s:%d[%s]" % (self.jobname, self.buildnumber, self.tag) diff --git a/repoapi/serializers.py b/repoapi/serializers.py index 966e584..96fec61 100644 --- a/repoapi/serializers.py +++ b/repoapi/serializers.py @@ -21,7 +21,3 @@ class JenkinsBuildInfoSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = models.JenkinsBuildInfo - - -class ReleaseListSerializer(serializers.Serializer): - param_release = serializers.CharField(max_length=50) diff --git a/repoapi/test/test_basic_model.py b/repoapi/test/test_basic_model.py index d6369c4..066584e 100644 --- a/repoapi/test/test_basic_model.py +++ b/repoapi/test/test_basic_model.py @@ -22,6 +22,7 @@ class JenkinsBuildInfoTestCase(TestCase): def test_creation_no_tag(self): jbi = JenkinsBuildInfo.objects.create( projectname='fake', + jobname='fake-get-code', buildnumber=1, result='OK') self.assertIsNone(jbi.tag) @@ -29,6 +30,7 @@ class JenkinsBuildInfoTestCase(TestCase): def test_empty_tag_with_release(self): jbi = JenkinsBuildInfo.objects.create( projectname='fake', + jobname='fake-get-code', buildnumber=1, result='OK', param_release='release-mr4.0') diff --git a/repoapi/test/test_model_queries.py b/repoapi/test/test_model_queries.py index d664057..54ba60a 100644 --- a/repoapi/test/test_model_queries.py +++ b/repoapi/test/test_model_queries.py @@ -24,22 +24,27 @@ class JBIQueriesTestCase(TestCase): releases = JenkinsBuildInfo.objects.releases() self.assertItemsEqual(releases, ['mr3.1-fake', ]) - def test_release_uuids_by_project(self): + def test_release_projects(self): + projects = ['fake', ] + p = JenkinsBuildInfo.objects.release_projects('mr3.1-fake') + self.assertItemsEqual(p, projects) + + def test_release_project_uuids(self): projects = ['fake', ] uuids_ok = dict() uuids = dict() uuids_ok['fake'] = ['UUID1', 'UUID0'] for p in projects: - uuids[p] = JenkinsBuildInfo.objects.release_uuids_by_project( + uuids[p] = JenkinsBuildInfo.objects.release_project_uuids( 'mr3.1-fake', p) self.assertItemsEqual(uuids_ok[p], uuids[p]) - def test_projects_by_uuid(self): - projects = JenkinsBuildInfo.objects.projects_by_uuid( + def test_jobs_by_uuid(self): + jobs = JenkinsBuildInfo.objects.jobs_by_uuid( 'mr3.1-fake', 'fake', 'UUID0') - self.assertItemsEqual(['fake-get-code', ], projects) - projects = JenkinsBuildInfo.objects.projects_by_uuid( + self.assertItemsEqual(['fake-get-code', ], jobs) + jobs = JenkinsBuildInfo.objects.jobs_by_uuid( 'mr3.1-fake', 'fake', 'UUID1') self.assertItemsEqual( - ['fake-get-code', 'fake-source-tests', 'fake-source'], projects) + ['fake-get-code', 'fake-source-tests', 'fake-source'], jobs) diff --git a/repoapi/test/test_rest.py b/repoapi/test/test_rest.py index 8bc486d..01bc2db 100644 --- a/repoapi/test/test_rest.py +++ b/repoapi/test/test_rest.py @@ -27,6 +27,7 @@ class TestRest(APITestCase): def test_jbi_creation(self): data = {"url": "http://127.0.0.1:8000/jenkinsbuildinfo/1/", "projectname": "fake", + "jobname": "fake-get-code", "buildnumber": 1, "result": "OK", "job_url": "http://fake.org/gogo", } @@ -34,6 +35,7 @@ class TestRest(APITestCase): "url": "http://testserver/jenkinsbuildinfo/1/", "tag": None, "projectname": "fake", + "jobname": "fake-get-code", "buildnumber": 1, "result": "OK", "job_url": "http://fake.org/gogo", diff --git a/repoapi/urls.py b/repoapi/urls.py index 31cafcf..744f0a3 100644 --- a/repoapi/urls.py +++ b/repoapi/urls.py @@ -29,6 +29,9 @@ api_patterns = [ url(r'^release/$', views.ReleaseList.as_view(), name='release-list'), + url(r'^release/(?P[\w\d\.-]+)/$', + views.ProjectList.as_view(), + name='project-list'), url(r'^release/(?P[\w\d\.-]+)/(?P[\w\d\.-]+)/$', views.ProjectUUIDList.as_view(), name='projectuuid-list'), diff --git a/repoapi/views.py b/repoapi/views.py index b0e3d35..050d865 100644 --- a/repoapi/views.py +++ b/repoapi/views.py @@ -37,7 +37,7 @@ class JenkinsBuildInfoFilter(django_filters.FilterSet): class Meta: model = jbi - fields = ['tag', 'projectname', 'param_release', 'date'] + fields = ['tag', 'projectname', 'jobname', 'param_release', 'date'] order_by = ['-date', ] @@ -52,22 +52,47 @@ class JenkinsBuildInfoDetail(generics.RetrieveUpdateDestroyAPIView): serializer_class = serializers.JenkinsBuildInfoSerializer -class ReleaseList(generics.ListAPIView): - queryset = jbi.objects.releases(flat=False) - serializer_class = serializers.ReleaseListSerializer +class ReleaseList(APIView): + + def get(self, request, format=None): + res = jbi.objects.releases(flat=False) + for r in res: + r['url'] = reverse( + 'project-list', + args=[r['param_release']], + request=request) + return Response(res) + + +class ProjectList(APIView): + + def get(self, request, release, format=None): + res = jbi.objects.release_projects( + release, flat=False) + for r in res: + r['url'] = reverse( + 'projectuuid-list', + args=[release, r['projectname']], + request=request) + return Response(res) class ProjectUUIDList(APIView): def get(self, request, release, project, format=None): - res = jbi.objects.release_uuids_by_project( + res = jbi.objects.release_project_uuids( release, project, flat=False) + for r in res: + r['url'] = reverse( + 'uuidinfo-list', + args=[release, project, r['tag']], + request=request) return Response(res) class UUIDInfoList(APIView): def get(self, request, release, project, uuid, format=None): - res = jbi.objects.projects_by_uuid( + res = jbi.objects.jobs_by_uuid( release, project, uuid, flat=False) return Response(res)