TT#18651 provide beat service for periodic tasks

* purge trunk release

Change-Id: I783e45de40d6c6aa69db41c00ed8115a8eacecac
changes/40/14340/4
Victor Seva 9 years ago
parent 5045755776
commit 7c335c3b42

@ -0,0 +1,17 @@
[Unit]
Description=Celery Beat Service
After=network.target rabbitmq-server.service
[Service]
Type=simple
User=www-data
Group=www-data
Environment=DJANGO_SETTINGS_MODULE=repoapi.settings.prod
PIDFile=/var/lib/repoapi/celery-beat.pid
WorkingDirectory=/usr/share/repoapi
ExecStart=/var/lib/repoapi/venv_prod/bin/python ./manage.py celery beat \
--schedule=/var/lib/repoapi/celery-beat.schedule \
--pidfile=/var/lib/repoapi/celery-beat.pid --loglevel=INFO
[Install]
WantedBy=multi-user.target

1
debian/rules vendored

@ -31,4 +31,5 @@ override_dh_fixperms:
override_dh_systemd_enable: override_dh_systemd_enable:
dh_systemd_enable --name=repoapi-worker dh_systemd_enable --name=repoapi-worker
dh_systemd_enable --name=repoapi-flower dh_systemd_enable --name=repoapi-flower
dh_systemd_enable --name=repoapi-beat

@ -15,6 +15,7 @@
import logging import logging
import re import re
from collections import OrderedDict from collections import OrderedDict
from datetime import datetime, timedelta
from django.db import models from django.db import models
from django.forms.models import model_to_dict from django.forms.models import model_to_dict
@ -134,6 +135,12 @@ class JenkinsBuildInfoManager(models.Manager):
latest_uuid['latest'] = (res.tag == uuid) latest_uuid['latest'] = (res.tag == uuid)
return latest_uuid return latest_uuid
def purge_release(self, release, _timedelta=timedelta(weeks=3)):
_date = datetime.now() - _timedelta
self.get_queryset().filter(
param_release=release,
date__date__lt=_date).delete()
class JenkinsBuildInfo(models.Model): class JenkinsBuildInfo(models.Model):
tag = models.CharField(max_length=64, null=True) tag = models.CharField(max_length=64, null=True)

@ -18,6 +18,7 @@ import os
from ConfigParser import RawConfigParser from ConfigParser import RawConfigParser
# pylint: disable=W0401,W0614 # pylint: disable=W0401,W0614
from .common import * from .common import *
from celery.schedules import crontab
BASE_DIR = os.path.dirname( BASE_DIR = os.path.dirname(
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
@ -77,6 +78,16 @@ BUILD_KEY_AUTH = True
# celery # celery
BROKER_URL = server_config.get('server', 'BROKER_URL') BROKER_URL = server_config.get('server', 'BROKER_URL')
CELERYBEAT_SCHEDULE = {
# Executes every Sunday morning at 7:30 A.M
'purge-trunk': {
'task': 'repoapi.tasks.jbi_purge',
'schedule': crontab(hour=7, minute=30, day_of_week='sunday'),
'args': ('none', 4),
},
}
CELERY_TIMEZONE = 'UTC'
JBI_BASEDIR = os.path.join(VAR_DIR, 'jbi_files') JBI_BASEDIR = os.path.join(VAR_DIR, 'jbi_files')
JBI_ARTIFACT_JOBS = [ JBI_ARTIFACT_JOBS = [
'release-tools-runner', 'release-tools-runner',

@ -13,12 +13,13 @@
# 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 __future__ import absolute_import from __future__ import absolute_import
from datetime import timedelta
import json import json
import logging import logging
from os.path import basename from os.path import basename
from celery import shared_task from celery import shared_task
from django.conf import settings from django.conf import settings
from django.apps import apps
from .celery import jbi_parse_hotfix from .celery import jbi_parse_hotfix
from .utils import jenkins_get_console, jenkins_get_artifact from .utils import jenkins_get_console, jenkins_get_artifact
from .utils import jenkins_get_build, jenkins_get_env from .utils import jenkins_get_build, jenkins_get_env
@ -46,3 +47,12 @@ def get_jbi_files(jbi_id, jobname, buildnumber):
jbi_get_artifact.delay(jbi_id, jobname, buildnumber, artifact) jbi_get_artifact.delay(jbi_id, jobname, buildnumber, artifact)
else: else:
logger.debug("skip artifacts download for jobname: %s", jobname) logger.debug("skip artifacts download for jobname: %s", jobname)
@shared_task(ignore_result=True)
def jbi_purge(release, weeks):
JenkinsBuildInfo = apps.get_model("repoapi", "JenkinsBuildInfo")
JenkinsBuildInfo.objects.purge_release(
release,
timedelta(weeks=weeks))
logger.info("purged release %s jbi older than %s weeks" % (release, weeks))

@ -16,6 +16,7 @@
from django.utils.dateparse import parse_datetime from django.utils.dateparse import parse_datetime
from repoapi.models import JenkinsBuildInfo from repoapi.models import JenkinsBuildInfo
from repoapi.test.base import BaseTest from repoapi.test.base import BaseTest
from datetime import datetime, timedelta
class JBIQueriesTestCase(BaseTest): class JBIQueriesTestCase(BaseTest):
@ -59,3 +60,13 @@ class JBIQueriesTestCase(BaseTest):
date = parse_datetime("2015-05-04T17:04:57.802Z") date = parse_datetime("2015-05-04T17:04:57.802Z")
self.assertEquals(JenkinsBuildInfo.objects.latest_uuid( self.assertEquals(JenkinsBuildInfo.objects.latest_uuid(
'mr3.1-fake', 'fake'), {'tag': 'UUID1', 'date': date}) 'mr3.1-fake', 'fake'), {'tag': 'UUID1', 'date': date})
def test_purge_release(self):
jbi = JenkinsBuildInfo.objects.get(pk=1)
jbi.date = datetime.now()
jbi.save()
self.assertEquals(JenkinsBuildInfo.objects.count(), 5)
JenkinsBuildInfo.objects.purge_release(
'mr3.1-fake',
timedelta(weeks=3))
self.assertEquals(JenkinsBuildInfo.objects.count(), 1)

@ -0,0 +1,32 @@
# 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 <http://www.gnu.org/licenses/>.
from repoapi.models import JenkinsBuildInfo
from django.test import override_settings
from repoapi.test.base import BaseTest
from repoapi import tasks
from datetime import datetime, timedelta
class TasksTestCase(BaseTest):
fixtures = ['test_model_queries.json']
def test_purge(self):
jbi = JenkinsBuildInfo.objects.get(pk=1)
jbi.date = datetime.now()
jbi.save()
self.assertEquals(JenkinsBuildInfo.objects.count(), 5)
tasks.jbi_purge.delay('mr3.1-fake', 3)
self.assertEquals(JenkinsBuildInfo.objects.count(), 1)
Loading…
Cancel
Save