MT#56231 gerrit: cleanup tool

* add dry-run option

checks gerrit review status and if merged, will trigger removal
of PPA if necessary

NOTE: this will not trigger removal of projects from PPA, just
removal of full PPA if no reviews are left

Change-Id: Iddebc80a92615d99ff8cd2f643ea49b5bfc106d6
master
Victor Seva 2 years ago
parent 44e869875d
commit 3d8ea950b6

@ -4,14 +4,14 @@
created: '2023-03-03 08:46:17' created: '2023-03-03 08:46:17'
gerrit_change: '67631' gerrit_change: '67631'
modified: '2023-03-03 09:09:25' modified: '2023-03-03 09:09:25'
param_ppa: gerrit_alessio_56718_bis_10_5_1, param_ppa: gerrit_alessio_56718_bis_10_5_1
projectname: templates projectname: templates
- model: repoapi.gerritrepoinfo - model: repoapi.gerritrepoinfo
pk: 47877 pk: 47877
fields: fields:
created: '1977-01-01 00:00:00' created: '1977-01-01 00:00:00'
gerrit_change: '67510' gerrit_change: '67510'
modified: '2023-03-02 16:24:25' modified: '2022-03-02 16:24:25'
param_ppa: gerrit_alessio_56718_bis_11_1 param_ppa: gerrit_alessio_56718_bis_11_1
projectname: sems-pbx projectname: sems-pbx
- model: repoapi.gerritrepoinfo - model: repoapi.gerritrepoinfo
@ -19,6 +19,6 @@
fields: fields:
created: '1977-01-01 00:00:00' created: '1977-01-01 00:00:00'
gerrit_change: '13200' gerrit_change: '13200'
modified: '2023-03-02 07:57:21' modified: '2022-03-02 07:57:21'
param_ppa: gerrit_pu_collectd-abolition param_ppa: gerrit_pu_collectd-abolition
projectname: unknown projectname: unknown

@ -13,7 +13,10 @@
# You should have received a copy of the GNU General Public License along # You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>. # with this program. If not, see <http://www.gnu.org/licenses/>.
from datetime import date from datetime import date
from datetime import datetime
from datetime import timedelta
from django.conf import settings
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
@ -26,7 +29,20 @@ class Command(BaseCommand):
help = "gerrit actions" help = "gerrit actions"
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument("action", choices=["refresh"]) parser.add_argument("action", choices=["refresh", "cleanup"])
parser.add_argument("--dry-run", type=bool, default=False)
parser.add_argument(
"--weeks",
type=int,
default=6,
help="filter reviews older than this value in weeks",
)
parser.add_argument(
"--today",
type=date.fromisoformat,
default=datetime.today(),
help="set today value in isoformat 'YYYY-MM-DD'",
)
def refresh(self, *args, **options): def refresh(self, *args, **options):
qs = GerritRepoInfo.objects.filter(created__date=date(1977, 1, 1)) qs = GerritRepoInfo.objects.filter(created__date=date(1977, 1, 1))
@ -37,11 +53,38 @@ class Command(BaseCommand):
gri.modified = get_datetime(info["updated"]) gri.modified = get_datetime(info["updated"])
# don't update modified field on save # don't update modified field on save
gri.update_modified = False gri.update_modified = False
gri.save() if options["dry_run"]:
self.stdout.write(
f"{gri} would be changed to "
f" created:{gri.created}"
f" modified:{gri.modified}"
)
else:
gri.save()
except HTTPError: except HTTPError:
self.stderr.write(f"{gri} not found, remove it from db") self.stderr.write(f"{gri} not found, remove it from db")
gri.delete() gri.delete()
def cleanup(self, *args, **options):
max_date = options["today"] - timedelta(weeks=options["weeks"])
self.stderr.write(f"max_date:{max_date}")
if settings.DEBUG:
self.stderr.write("debug ON")
manager = GerritRepoInfo.objects
qs = manager.filter(modified__lt=max_date)
for gri in qs.iterator():
info = get_change_info(gri.gerrit_change)
if info["status"] == "MERGED":
if options["dry_run"]:
self.stdout.write(
f"{gri} merged, remove from db, [dry-run]"
)
else:
self.stdout.write(f"{gri} merged, remove from db")
manager.review_removed(
gri.param_ppa, gri.gerrit_change, gri.projectname
)
def handle(self, *args, **options): def handle(self, *args, **options):
action = getattr(self, options["action"]) action = getattr(self, options["action"])
action(*args, **options) action(*args, **options)

@ -14,6 +14,7 @@
# with this program. If not, see <http://www.gnu.org/licenses/>. # with this program. If not, see <http://www.gnu.org/licenses/>.
import datetime import datetime
import json import json
from unittest.mock import call
from unittest.mock import patch from unittest.mock import patch
from django.core.management import call_command from django.core.management import call_command
@ -66,3 +67,22 @@ class refreshTest(TestCase):
qs_filter = qs.filter(modified__time=datetime.time(9, 9, 25)) qs_filter = qs.filter(modified__time=datetime.time(9, 9, 25))
self.assertEqual(qs_filter.count(), 3) self.assertEqual(qs_filter.count(), 3)
@patch("repoapi.models.gri.jenkins_remove_ppa")
@patch("gerrit.management.commands.gerrit.get_change_info")
def test_cleanup(self, gci, jrp):
value["status"] = "MERGED"
gci.return_value = value
qs = GerritRepoInfo.objects
self.assertEqual(qs.count(), 3)
call_command(
"gerrit",
"cleanup",
"--today=2023-03-03",
)
calls = [
call("gerrit_pu_collectd-abolition"),
call("gerrit_alessio_56718_bis_11_1"),
]
self.assertListEqual(jrp.mock_calls, calls)
self.assertEqual(qs.count(), 1)

Loading…
Cancel
Save