diff --git a/build/migrations/0003_buildrelease_triggered_projects.py b/build/migrations/0003_buildrelease_triggered_projects.py new file mode 100644 index 0000000..1e65d50 --- /dev/null +++ b/build/migrations/0003_buildrelease_triggered_projects.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.28 on 2020-03-09 17:11 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("build", "0002_smart_build"), + ] + + operations = [ + migrations.AddField( + model_name="buildrelease", + name="triggered_projects", + field=models.TextField(editable=False, null=True), + ), + ] diff --git a/build/models/__init__.py b/build/models/__init__.py index 014cd22..085972a 100644 --- a/build/models/__init__.py +++ b/build/models/__init__.py @@ -86,10 +86,10 @@ def jbi_manage(sender, **kwargs): "trigger:%s for BuildRelease:%s", params["project"], br ) trigger_build(**params) - br.pool_size += 1 - br.save(update_fields=["pool_size"]) + br.append_triggered(prj) else: logger.debug("BuildRelease:%s has no next", br) + break post_save = signals.post_save.connect diff --git a/build/models/br.py b/build/models/br.py index d4d07ee..a6936d2 100644 --- a/build/models/br.py +++ b/build/models/br.py @@ -88,6 +88,7 @@ class BuildRelease(models.Model): distribution = models.CharField(max_length=50, null=False, editable=False) projects = models.TextField(null=False, editable=False) built_projects = models.TextField(null=True, editable=False) + triggered_projects = models.TextField(null=True, editable=False) failed_projects = models.TextField(null=True, editable=False) pool_size = models.SmallIntegerField(default=0, editable=False) objects = BuildReleaseManager() @@ -117,6 +118,23 @@ class BuildRelease(models.Model): return [x.strip() for x in self.failed_projects.split(",")] return [] + @property + def triggered_projects_list(self): + if self.triggered_projects is not None: + return [x.strip() for x in self.triggered_projects.split(",")] + return [] + + def append_triggered(self, value): + if value in self.triggered_projects_list: + return False + if self.triggered_projects is None: + self.triggered_projects = value + else: + self.triggered_projects += ",{}".format(value) + self.pool_size += 1 + self.save() + return True + def _append_falied(self, value): if value in self.failed_projects_list: return False @@ -149,8 +167,21 @@ class BuildRelease(models.Model): self.save() return True + def remove_triggered(self, jbi): + value = jbi.projectname + triggered_list = self.triggered_projects_list + if value in triggered_list: + triggered_list.remove(value) + tl = ",".join(triggered_list) + if len(tl) > 0: + self.triggered_projects = tl + else: + self.triggered_projects = None + self.save() + def append_built(self, jbi): jobname = jbi.jobname + self.remove_triggered(jbi) if jbi.result == "FAILURE": if jobname.endswith("-piuparts"): return False @@ -173,13 +204,14 @@ class BuildRelease(models.Model): release_jobs_len = len(",".join(settings.RELEASE_JOBS)) if built_len == release_jobs_len + 1 + len(self.projects): return + t_list = self.triggered_projects_list built_list = self.built_projects_list for grp in self.build_deps: for prj in grp: - if prj not in built_list: + if prj not in built_list and prj not in t_list: return prj for prj in self.projects_list: - if prj not in built_list: + if prj not in built_list and prj not in t_list: return prj @property diff --git a/build/test/test_models.py b/build/test/test_models.py index cf096a5..4e35def 100644 --- a/build/test/test_models.py +++ b/build/test/test_models.py @@ -12,6 +12,7 @@ # # You should have received a copy of the GNU General Public License along # with this program. If not, see . +from unittest.mock import call from unittest.mock import MagicMock from unittest.mock import patch @@ -344,14 +345,16 @@ class JBIManageTest(TestCase): } tb.assert_called_once_with(**params) self.assertEqual(br.pool_size, 1) + self.assertEqual(br.triggered_projects, "data-hal") @patch("build.models.trigger_build") def test_jbi_manage_skip(self, tb, dl): br = BuildRelease.objects.create_build_release("UUID_mr8.1", "mr8.1") br.pool_size = 1 + br.triggered_projects = "kamailio" br.save() jbi = JenkinsBuildInfo.objects.create( - job_url="http://fake.local/job/release-copy-debs-yml/", + job_url="http://fake.local/job/kamailio-get-code/", projectname="kamailio", jobname="kamailio-get-code", tag="UUIDA", @@ -366,6 +369,67 @@ class JBIManageTest(TestCase): jbi_manage(JenkinsBuildInfo, **params) tb.assert_not_called() self.assertEqual(br.pool_size, 1) + self.assertEqual(br.triggered_projects, "kamailio") + + @override_settings(BUILD_POOL=2) + @patch("build.models.trigger_build") + def test_jbi_manage_pool(self, tb, dl): + br = BuildRelease.objects.create_build_release("UUID_mr8.1", "mr8.1") + self.assertEqual(br.pool_size, 0) + JenkinsBuildInfo.objects.create( + job_url="http://fake.local/job/release-copy-debs-yml/", + projectname="release-copy-debs-yml", + jobname="release-copy-debs-yml", + tag="UUIDA", + param_release="mr8.1", + param_release_uuid="UUID_mr8.1", + buildnumber=1, + result="SUCCESS", + ) + br = BuildRelease.objects.get(pk=br.pk) + self.assertEqual(br.built_projects, "release-copy-debs-yml") + params = { + "project": "data-hal-get-code", + "release_uuid": br.uuid, + "trigger_release": br.release, + "trigger_branch_or_tag": br.branch_or_tag, + "trigger_distribution": br.distribution, + } + calls = [call(**params)] + params["project"] = "libinewrate-get-code" + calls.append(call(**params)) + tb.assert_has_calls(calls) + self.assertEqual(br.pool_size, 2) + self.assertEqual(br.triggered_projects, "data-hal,libinewrate") + + @override_settings(BUILD_POOL=2) + @patch("build.models.trigger_build") + def test_jbi_manage_pool_next(self, tb, dl): + self.test_jbi_manage_pool() + br = BuildRelease.objects.first() + self.assertEqual(br.pool_size, 2) + JenkinsBuildInfo.objects.create( + job_url="http://fake.local/job/data-hal-repos/", + projectname="data-hal", + jobname="data-hal-repos", + tag="UUIDA", + param_release="release-mr8.1", + param_release_uuid="UUID_mr8.1", + buildnumber=1, + result="SUCCESS", + ) + br = BuildRelease.objects.get(pk=br.pk) + self.assertEqual(br.built_projects, "release-copy-debs-yml,data-hal") + params = { + "project": "libswrate-get-code", + "release_uuid": br.uuid, + "trigger_release": br.release, + "trigger_branch_or_tag": br.branch_or_tag, + "trigger_distribution": br.distribution, + } + tb.assert_called_once_with(**params) + self.assertEqual(br.pool_size, 2) + self.assertEqual(br.triggered_projects, "libinewrate,libswrate") @override_settings(