diff --git a/gerrit/conf.py b/gerrit/conf.py index f3d52b2..d97890f 100644 --- a/gerrit/conf.py +++ b/gerrit/conf.py @@ -21,6 +21,7 @@ class GerritConf(AppConf): URL = "https://gerrit.local/{}" REST_HTTP_USER = "jenkins" REST_HTTP_PASSWD = "verysecrethttppasswd" + DATETIME_FMT = "%Y-%m-%d %H:%M:%S.%f000" class Meta: prefix = "gerrit" diff --git a/gerrit/fixtures/test_gerrit_commands.yaml b/gerrit/fixtures/test_gerrit_commands.yaml new file mode 100644 index 0000000..755ba5b --- /dev/null +++ b/gerrit/fixtures/test_gerrit_commands.yaml @@ -0,0 +1,24 @@ +- model: repoapi.gerritrepoinfo + pk: 47979 + fields: + created: '2023-03-03 08:46:17' + gerrit_change: '67631' + modified: '2023-03-03 09:09:25' + param_ppa: gerrit_alessio_56718_bis_10_5_1, + projectname: templates +- model: repoapi.gerritrepoinfo + pk: 47877 + fields: + created: '1977-01-01 00:00:00' + gerrit_change: '67510' + modified: '2023-03-02 16:24:25' + param_ppa: gerrit_alessio_56718_bis_11_1 + projectname: sems-pbx +- model: repoapi.gerritrepoinfo + pk: 12 + fields: + created: '1977-01-01 00:00:00' + gerrit_change: '13200' + modified: '2023-03-02 07:57:21' + param_ppa: gerrit_pu_collectd-abolition + projectname: unknown diff --git a/gerrit/management/__init__.py b/gerrit/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gerrit/management/commands/__init__.py b/gerrit/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gerrit/management/commands/gerrit.py b/gerrit/management/commands/gerrit.py new file mode 100644 index 0000000..d05bc1d --- /dev/null +++ b/gerrit/management/commands/gerrit.py @@ -0,0 +1,42 @@ +# Copyright (C) 2023 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 <http://www.gnu.org/licenses/>. +from datetime import date + +from django.core.management.base import BaseCommand + +from gerrit.utils import get_change_info +from gerrit.utils import get_datetime +from repoapi.models.gri import GerritRepoInfo + + +class Command(BaseCommand): + help = "gerrit actions" + + def add_arguments(self, parser): + parser.add_argument("action", choices=["refresh"]) + + def refresh(self, *args, **options): + qs = GerritRepoInfo.objects.filter(created__date=date(1977, 1, 1)) + for gri in qs.iterator(): + info = get_change_info(gri.gerrit_change) + gri.created = get_datetime(info["created"]) + gri.modified = get_datetime(info["updated"]) + # don't update modified field on save + gri.update_modified = False + gri.save() + + def handle(self, *args, **options): + action = getattr(self, options["action"]) + action(*args, **options) diff --git a/gerrit/test_commands.py b/gerrit/test_commands.py new file mode 100644 index 0000000..3db88f6 --- /dev/null +++ b/gerrit/test_commands.py @@ -0,0 +1,68 @@ +# Copyright (C) 2023 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 <http://www.gnu.org/licenses/>. +import datetime +import json +from unittest.mock import patch + +from django.core.management import call_command +from django.test import TestCase + +from repoapi.models.gri import GerritRepoInfo + +change_info = """ +{ + "id": "templates~mr10.5.1~I3a066ae039b06beb892a1f9e7b8dadf7aa476742", + "project": "templates", + "branch": "mr10.5.1", + "topic": "alessio_56718_bis_10_5_1", + "hashtags": [], + "change_id": "I3a066ae039b06beb892a1f9e7b8dadf7aa476742", + "subject": "MT#56718 Decrement counter of B in blind transfer", + "status": "NEW", + "created": "2023-03-03 08:45:06.000000000", + "updated": "2023-03-03 09:09:25.000000000", + "submit_type": "FAST_FORWARD_ONLY", + "mergeable": true, + "insertions": 104, + "deletions": 0, + "total_comment_count": 0, + "unresolved_comment_count": 0, + "has_review_started": true, + "_number": 67631, + "owner": { + "_account_id": 1000069 + }, + "requirements": [] +} +""" +value = json.loads(change_info) + + +class refreshTest(TestCase): + fixtures = ["test_gerrit_commands"] + + @patch("gerrit.management.commands.gerrit.get_change_info") + def test_refresh(self, gci): + gci.return_value = value + qs = GerritRepoInfo.objects + self.assertEqual(qs.count(), 3) + qs_filter = qs.filter(created__date=datetime.date(1977, 1, 1)) + self.assertEqual(qs_filter.count(), 2) + call_command("gerrit", "refresh") + self.assertEqual(qs.count(), 3) + self.assertEqual(qs_filter.count(), 0) + + qs_filter = qs.filter(modified__time=datetime.time(9, 9, 25)) + self.assertEqual(qs_filter.count(), 3) diff --git a/gerrit/test_utils.py b/gerrit/test_utils.py index fd035c2..d9b418b 100644 --- a/gerrit/test_utils.py +++ b/gerrit/test_utils.py @@ -1,4 +1,4 @@ -# Copyright (C) 2022 The Sipwise Team - http://sipwise.com +# Copyright (C) 2023 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 @@ -12,6 +12,8 @@ # # You should have received a copy of the GNU General Public License along # with this program. If not, see <http://www.gnu.org/licenses/>. +from datetime import datetime + from django.test import SimpleTestCase from gerrit import utils @@ -55,3 +57,14 @@ class GerritUtils(SimpleTestCase): res = utils.get_filtered_json(GERRIT_REST_BRANCHES) self.assertEqual(res, FILTERED_BRANCHES) + + def test_get_datetime(self): + val = "2023-03-03 08:45:06.000000000" + expected = datetime(2023, 3, 3, 8, 45, 6) + res = utils.get_datetime(val) + self.assertEqual(res, expected) + + val = "2023-03-03 09:09:25.000000000" + res = utils.get_datetime(val) + expected = datetime(2023, 3, 3, 9, 9, 25) + self.assertEqual(res, expected) diff --git a/gerrit/utils.py b/gerrit/utils.py index 1791a04..7a056e3 100644 --- a/gerrit/utils.py +++ b/gerrit/utils.py @@ -12,6 +12,7 @@ # # You should have received a copy of the GNU General Public License along # with this program. If not, see <http://www.gnu.org/licenses/>. +import datetime import json import requests @@ -60,3 +61,16 @@ def get_gerrit_tags(project: str, regex=None): def get_gerrit_branches(project: str, regex=None): url = gerrit_settings.URL.format(f"a/projects/{project}/branches/") return get_gerrit_info(url) + + +def get_gerrit_change(id: str) -> str: + url = gerrit_settings.URL.format(f"changes/{id}/") + return get_gerrit_info(url) + + +def get_change_info(id: str): + return get_filtered_json(get_gerrit_info(id)) + + +def get_datetime(val: str) -> datetime.datetime: + return datetime.datetime.strptime(val, gerrit_settings.DATETIME_FMT)