diff --git a/debian/control b/debian/control index 80c3325..9de33cb 100644 --- a/debian/control +++ b/debian/control @@ -2,12 +2,12 @@ Source: repoapi Priority: extra Maintainer: Sipwise Development Team Build-Depends: - debhelper (>= 8~), + debhelper (>= 9~), dh-systemd (>= 1.5), libpq-dev, python-dev, virtualenv, -Standards-Version: 3.9.7 +Standards-Version: 3.9.8 Section: python Homepage: http://sipwise.com/ @@ -21,6 +21,7 @@ Depends: postgresql, python, python-dev, + sipwise-repos-scripts-helpers, uwsgi, uwsgi-plugin-python, virtualenv, diff --git a/repoapi/models/wni.py b/repoapi/models/wni.py index 81f6670..2ec38f1 100644 --- a/repoapi/models/wni.py +++ b/repoapi/models/wni.py @@ -21,6 +21,7 @@ from repoapi import utils logger = logging.getLogger(__name__) workfront_re = re.compile(r"TT#(\d+)") +workfront_re_branch = re.compile('^mr[0-9]+\.[0-9]+\.[0-9]+$') commit_re = re.compile(r"^(\w{7}) ") @@ -58,7 +59,16 @@ class WorkfrontNoteInfo(models.Model): return "%s:%s" % (self.workfront_id, self.gerrit_change) -def workfront_note_add(instance, message): +def workfront_release_target(instance, wid): + branch = instance.param_branch + if workfront_re_branch.search(branch): + release = branch + else: + release = utils.get_next_release(branch) + utils.workfront_set_release_target(wid, release) + + +def workfront_note_add(instance, message, release_target=False): wni = WorkfrontNoteInfo.objects workfront_ids = WorkfrontNoteInfo.getIds(instance.git_commit_msg) @@ -79,6 +89,8 @@ def workfront_note_add(instance, message): if not utils.workfront_note_send(wid, "%s %s " % (message, url)): logger.error("remove releated WorkfrontNoteInfo") note.delete() + if release_target: + workfront_release_target(instance, wid) def workfront_note_manage(sender, **kwargs): @@ -90,11 +102,14 @@ def workfront_note_manage(sender, **kwargs): instance = kwargs["instance"] if instance.jobname.endswith("-get-code") and \ instance.result == "SUCCESS": + set_release_target = True if instance.gerrit_eventtype == 'change-merged': msg = "%s[%s] review merged" elif instance.gerrit_eventtype == 'patchset-created': msg = "%s[%s] review created" + set_release_target = False else: msg = "%s[%s] commit created" workfront_note_add(instance, msg % (instance.projectname, - instance.param_branch)) + instance.param_branch), + set_release_target) diff --git a/repoapi/test/test_utils.py b/repoapi/test/test_utils.py new file mode 100644 index 0000000..756060e --- /dev/null +++ b/repoapi/test/test_utils.py @@ -0,0 +1,41 @@ +# Copyright (C) 2017 The Sipwise Team - http://sipwise.com + +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. + +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . + +from django.test import TestCase +from repoapi.test.base import BaseTest +from mock import patch + +from repoapi import utils + + +class UtilsTestCase(BaseTest): + + @patch('repoapi.utils.executeAndReturnOutput') + def test_get_next_release_ko(self, ear): + ear.return_value = [1, "", ""] + val = utils.get_next_release("whatever") + self.assertIsNone(val) + + @patch('repoapi.utils.executeAndReturnOutput') + def test_get_next_release0(self, ear): + ear.return_value = [0, "mr5.5.1\n", ""] + val = utils.get_next_release("master") + self.assertEquals(val, 'mr5.5.1') + + @patch('repoapi.utils.executeAndReturnOutput') + def test_get_next_release0(self, ear): + ear.return_value = [0, "mr5.4.2\n", ""] + val = utils.get_next_release("mr5.4") + self.assertEquals(val, 'mr5.4.2') diff --git a/repoapi/test/test_workfrontnote.py b/repoapi/test/test_workfrontnote.py index 8ded622..eeb5ac8 100644 --- a/repoapi/test/test_workfrontnote.py +++ b/repoapi/test/test_workfrontnote.py @@ -65,8 +65,10 @@ class WorkfrontNoteTestCase(BaseTest): del defaults['gerrit_eventtype'] return defaults + @patch('repoapi.utils.workfront_set_release_target') + @patch('repoapi.utils.get_next_release') @patch('repoapi.utils.workfront_note_send') - def test_note_gerrit(self, utils): + def test_note_gerrit(self, wns, gnr, wsrt): param = self.get_defaults() JenkinsBuildInfo.objects.create(**param) @@ -87,10 +89,14 @@ class WorkfrontNoteTestCase(BaseTest): param['projectname'], param['param_branch'], settings.GERRIT_URL.format("2054")) - utils.assert_called_once_with("0001", msg) + wsrt.assert_not_called() + gnr.assert_not_called() + wns.assert_called_once_with("0001", msg) + @patch('repoapi.utils.workfront_set_release_target') + @patch('repoapi.utils.get_next_release') @patch('repoapi.utils.workfront_note_send') - def test_note_merge(self, utils): + def test_note_merge(self, wns, gnr, wsrt): param = self.get_defaults() JenkinsBuildInfo.objects.create(**param) @@ -116,11 +122,14 @@ class WorkfrontNoteTestCase(BaseTest): param['projectname'], param['param_branch'], settings.GERRIT_URL.format("2054")) - utils.assert_called_once_with("0001", msg) + wsrt.assert_not_called() + gnr.assert_not_called() + wns.assert_called_once_with("0001", msg) param['jobname'] = "kamailio-get-code" param['buildnumber'] = 898 param['gerrit_eventtype'] = "change-merged" + gnr.return_value = "mr5.5.1" JenkinsBuildInfo.objects.create(**param) gri = WorkfrontNoteInfo.objects.filter( @@ -136,12 +145,17 @@ class WorkfrontNoteTestCase(BaseTest): param['projectname'], param['param_branch'], settings.GERRIT_URL.format("2054")) - utils.assert_called_with("0001", msg) + wsrt.assert_called_once_with("0001", "mr5.5.1") + gnr.assert_called_once_with("master") + wns.assert_called_with("0001", msg) + @patch('repoapi.utils.workfront_set_release_target') + @patch('repoapi.utils.get_next_release') @patch('repoapi.utils.workfront_note_send') - def test_note_commit(self, utils): + def test_note_commit(self, wns, gnr, wsrt): param = self.get_non_gerrit_defaults() param['jobname'] = 'kamailio-get-code' + gnr.return_value = "mr5.5.1" JenkinsBuildInfo.objects.create(**param) gri = WorkfrontNoteInfo.objects.filter( @@ -161,4 +175,68 @@ class WorkfrontNoteTestCase(BaseTest): param['projectname'], param['param_branch'], settings.GITWEB_URL.format("kamailio", "7fg4567")) - utils.assert_called_once_with("0001", msg) + wsrt.assert_called_once_with("0001", "mr5.5.1") + gnr.assert_called_once_with("master") + wns.assert_called_once_with("0001", msg) + + @patch('repoapi.utils.workfront_set_release_target') + @patch('repoapi.utils.get_next_release') + @patch('repoapi.utils.workfront_note_send') + def test_note_commit_mrXX(self, wns, gnr, wsrt): + param = self.get_non_gerrit_defaults() + param['jobname'] = 'kamailio-get-code' + param['param_branch'] = 'mr5.5' + param['param_release'] = 'release-mr5.5-update' + gnr.return_value = "mr5.5.2" + JenkinsBuildInfo.objects.create(**param) + + gri = WorkfrontNoteInfo.objects.filter( + workfront_id="0001", + gerrit_change="7fg4567") + self.assertEquals(gri.count(), 1) + + param['jobname'] = "kamailio-binaries" + param['buildnumber'] = 897 + JenkinsBuildInfo.objects.create(**param) + + gri = WorkfrontNoteInfo.objects.filter( + workfront_id="0001", + gerrit_change="7fg4567") + self.assertEquals(gri.count(), 1) + msg = "%s[%s] commit created %s " % ( + param['projectname'], + param['param_branch'], + settings.GITWEB_URL.format("kamailio", "7fg4567")) + wsrt.assert_called_once_with("0001", "mr5.5.2") + gnr.assert_called_once_with("mr5.5") + wns.assert_called_once_with("0001", msg) + + @patch('repoapi.utils.workfront_set_release_target') + @patch('repoapi.utils.get_next_release') + @patch('repoapi.utils.workfront_note_send') + def test_note_commit_mrXXX(self, wns, gnr, wsrt): + param = self.get_non_gerrit_defaults() + param['jobname'] = 'kamailio-get-code' + param['param_branch'] = 'mr5.5.2' + JenkinsBuildInfo.objects.create(**param) + + gri = WorkfrontNoteInfo.objects.filter( + workfront_id="0001", + gerrit_change="7fg4567") + self.assertEquals(gri.count(), 1) + + param['jobname'] = "kamailio-binaries" + param['buildnumber'] = 897 + JenkinsBuildInfo.objects.create(**param) + + gri = WorkfrontNoteInfo.objects.filter( + workfront_id="0001", + gerrit_change="7fg4567") + self.assertEquals(gri.count(), 1) + msg = "%s[%s] commit created %s " % ( + param['projectname'], + param['param_branch'], + settings.GITWEB_URL.format("kamailio", "7fg4567")) + wsrt.assert_called_once_with("0001", "mr5.5.2") + gnr.assert_not_called() + wns.assert_called_once_with("0001", msg) diff --git a/repoapi/utils.py b/repoapi/utils.py index 58e0948..913f266 100644 --- a/repoapi/utils.py +++ b/repoapi/utils.py @@ -137,3 +137,33 @@ def workfront_note_send(_id, message): logger.error("can't post workfront note. %s. %s", res[1], res[2]) return False return True + + +def get_next_release(branch): + command = [ + "/usr/bin/meta-release-helper", + "--next-release", + branch + ] + logger.debug("meta-release-helper command: %s", command) + res = executeAndReturnOutput(command) + if res[0] != 0: + logger.error( + "can't find out next release version. %s. %s", res[1], res[2]) + return None + return res[1].rstrip() + + +def workfront_set_release_target(_id, release): + command = [ + "/usr/bin/workfront-target-task", + "--credfile=%s" % settings.WORKFRONT_CREDENTIALS, + "--taskid=%s" % _id, + '--release="%s"' % release + ] + logger.debug("workfront-target-task command: %s", command) + res = executeAndReturnOutput(command) + if res[0] != 0: + logger.error("can't set release target. %s. %s", res[1], res[2]) + return False + return True