diff --git a/repoapi/models.py b/repoapi/models.py
deleted file mode 100644
index c46c1a6..0000000
--- a/repoapi/models.py
+++ /dev/null
@@ -1,242 +0,0 @@
-# Copyright (C) 2015 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 .
-import logging
-import re
-
-from django.db import models
-from django.db.models import signals
-from django.conf import settings
-from repoapi import utils
-from .tasks import get_jbi_files
-
-logger = logging.getLogger(__name__)
-workfront_re = re.compile(r"TT#(\d+)")
-commit_re = re.compile(r"^(\w{7}) ")
-
-
-class JenkinsBuildInfoManager(models.Manager):
-
- def releases(self, flat=True):
- res = self.get_queryset().values('param_release').distinct()
- if flat:
- return res.values_list('param_release', flat=True)
- else:
- return res.values('param_release')
-
- def release_projects(self, release, flat=True):
- res = self.get_queryset().filter(
- param_release=release).values('projectname').distinct()
- if flat:
- return res.values_list('projectname', flat=True)
- else:
- return res.values('projectname')
-
- def release_project_uuids_set(self, release, project):
- res = self.get_queryset().filter(
- param_release=release, projectname=project).distinct()
- return res.order_by('projectname')
-
- def release_project_uuids(self, release, project, flat=True):
- res = self.get_queryset().filter(
- param_release=release, projectname=project).distinct()
- if flat:
- return res.order_by('projectname').values_list('tag', flat=True)
- else:
- return res.order_by('projectname').values('tag')
-
- def jobs_by_uuid(self, release, project, uuid):
- return self.get_queryset().filter(tag=uuid, param_release=release,
- projectname=project).order_by('date')
-
- def latest_uuid(self, release, project):
- qs = self.get_queryset()
- latest_uuid = qs.filter(
- param_release=release, projectname=project).latest('date')
- return {'tag': latest_uuid.tag, 'date': latest_uuid.date}
-
-
-class JenkinsBuildInfo(models.Model):
- tag = models.CharField(max_length=64, null=True)
- projectname = models.CharField(max_length=100)
- jobname = models.CharField(max_length=100)
- buildnumber = models.IntegerField()
- date = models.DateTimeField(auto_now_add=True)
- result = models.CharField(max_length=50)
- job_url = models.URLField()
-
- gerrit_patchset = models.CharField(max_length=50, null=True)
- gerrit_change = models.CharField(max_length=50, null=True)
- gerrit_eventtype = models.CharField(max_length=50, null=True)
-
- param_tag = models.CharField(max_length=50, null=True)
- param_branch = models.CharField(max_length=50, null=True)
- param_release = models.CharField(max_length=50, null=True,
- db_index=True)
- param_distribution = models.CharField(max_length=50, null=True)
- param_ppa = models.CharField(max_length=50, null=True)
-
- repo_name = models.CharField(max_length=50, null=True)
- git_commit_msg = models.TextField(null=True)
-
- objects = JenkinsBuildInfoManager()
-
- class Meta:
- index_together = [
- ["param_release", "projectname"],
- ["param_release", "projectname", "tag"],
- ]
-
- def __str__(self):
- return "%s:%d[%s]" % (self.jobname,
- self.buildnumber, self.tag)
-
-def jbi_manage(sender, **kwargs):
- if kwargs["created"]:
- instance = kwargs["instance"]
- get_jbi_files.delay(instance.jobname, instance.buildnumber)
-
-signals.post_save.connect(jbi_manage, sender=JenkinsBuildInfo)
-
-class GerritRepoInfo(models.Model):
- param_ppa = models.CharField(max_length=50, null=False)
- gerrit_change = models.CharField(max_length=50, null=False)
-
- class Meta:
- unique_together = ["param_ppa", "gerrit_change"]
-
- def __str__(self):
- return "%s:%s" % (self.param_ppa, self.gerrit_change)
-
-
-def gerrit_repo_add(instance):
- gri = GerritRepoInfo.objects
- ppa, created = gri.get_or_create(
- param_ppa=instance.param_ppa,
- gerrit_change=instance.gerrit_change)
- if created:
- logging.info("%s created", ppa)
-
-
-def gerrit_repo_del(instance):
- if instance.param_ppa == '$ppa':
- logger.warn("ppa unset, skip removal")
- return
- gri = GerritRepoInfo.objects
- try:
- ppa = gri.get(param_ppa=instance.param_ppa,
- gerrit_change=instance.gerrit_change)
- ppa.delete()
- logger.info("removed %s", ppa)
- except GerritRepoInfo.DoesNotExist:
- pass
- if gri.filter(param_ppa=instance.param_ppa).count() == 0:
- utils.jenkins_remove_ppa(instance.param_ppa)
-
-
-def gerrit_repo_manage(sender, **kwargs):
- if kwargs["created"]:
- instance = kwargs["instance"]
- if instance.jobname.endswith("-repos") and \
- instance.result == "SUCCESS":
- logger.info("we need to count this %s", instance.param_ppa)
- if instance.gerrit_eventtype == "patchset-created":
- gerrit_repo_add(instance)
- elif instance.gerrit_eventtype == "change-merged":
- gerrit_repo_del(instance)
- elif instance.jobname.endswith("-cleanup") and \
- instance.result == "SUCCESS" and \
- instance.gerrit_eventtype == "change-abandoned":
- logger.info("we need to count this %s", instance.param_ppa)
- gerrit_repo_del(instance)
-
-signals.post_save.connect(gerrit_repo_manage, sender=JenkinsBuildInfo)
-
-
-class WorkfrontNoteInfo(models.Model):
- workfront_id = models.CharField(max_length=50, null=False)
- gerrit_change = models.CharField(max_length=50, null=False)
- eventtype = models.CharField(max_length=50, null=False)
-
- class Meta:
- unique_together = ["workfront_id", "gerrit_change", "eventtype"]
-
- @staticmethod
- def getIds(git_comment):
- """
- parses git_commit_msg searching for Workfront TT# ocurrences
- returns a list of IDs
- """
- if git_comment:
- res = workfront_re.findall(git_comment)
- return set(res)
- else:
- return set()
-
- @staticmethod
- def getCommit(git_comment):
- """
- parses git_commit_msg searching for short GIT_COMMIT
- """
- if git_comment:
- res = commit_re.search(git_comment)
- if res:
- return res.group(1)
-
- def __str__(self):
- return "%s:%s" % (self.workfront_id, self.gerrit_change)
-
-
-def workfront_note_add(instance, message):
- wni = WorkfrontNoteInfo.objects
- workfront_ids = WorkfrontNoteInfo.getIds(instance.git_commit_msg)
-
- for wid in workfront_ids:
- if not instance.gerrit_eventtype:
- change = WorkfrontNoteInfo.getCommit(instance.git_commit_msg)
- url = settings.GITWEB_URL.format(instance.projectname, change)
- eventtype = 'git-commit'
- else:
- change = instance.gerrit_change
- url = settings.GERRIT_URL.format(instance.gerrit_change)
- eventtype = instance.gerrit_eventtype
- note, created = wni.get_or_create(
- workfront_id=wid,
- gerrit_change=change,
- eventtype=eventtype)
- if created:
- if not utils.workfront_note_send(wid, "%s %s" % (message, url)):
- logger.error("remove releated WorkfrontNoteInfo")
- note.delete()
-
-
-def workfront_note_manage(sender, **kwargs):
- """
- -get-code job is the first in the flow that has the proper
- GIT_CHANGE_SUBJECT envVar set, so git_commit_msg is fine
- """
- if kwargs["created"]:
- instance = kwargs["instance"]
- if instance.jobname.endswith("-get-code") and \
- instance.result == "SUCCESS":
- if instance.gerrit_eventtype == 'change-merged':
- msg = "review merged"
- elif instance.gerrit_eventtype == 'patchset-created':
- msg = "review created"
- else:
- msg = "commit created"
- workfront_note_add(instance, msg)
-
-
-signals.post_save.connect(workfront_note_manage, sender=JenkinsBuildInfo)
diff --git a/repoapi/models/__init__.py b/repoapi/models/__init__.py
new file mode 100644
index 0000000..6650f4d
--- /dev/null
+++ b/repoapi/models/__init__.py
@@ -0,0 +1,22 @@
+# Copyright (C) 2015 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.db.models import signals
+from .jbi import JenkinsBuildInfo, jbi_manage
+from .gri import GerritRepoInfo, gerrit_repo_manage
+from .wni import WorkfrontNoteInfo, workfront_note_manage
+
+signals.post_save.connect(jbi_manage, sender=JenkinsBuildInfo)
+signals.post_save.connect(gerrit_repo_manage, sender=JenkinsBuildInfo)
+signals.post_save.connect(workfront_note_manage, sender=JenkinsBuildInfo)
diff --git a/repoapi/models/gri.py b/repoapi/models/gri.py
new file mode 100644
index 0000000..93172f6
--- /dev/null
+++ b/repoapi/models/gri.py
@@ -0,0 +1,73 @@
+# Copyright (C) 2015 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 .
+import logging
+
+from django.db import models
+from repoapi import utils
+
+logger = logging.getLogger(__name__)
+
+
+class GerritRepoInfo(models.Model):
+ param_ppa = models.CharField(max_length=50, null=False)
+ gerrit_change = models.CharField(max_length=50, null=False)
+
+ class Meta:
+ unique_together = ["param_ppa", "gerrit_change"]
+
+ def __str__(self):
+ return "%s:%s" % (self.param_ppa, self.gerrit_change)
+
+
+def gerrit_repo_add(instance):
+ gri = GerritRepoInfo.objects
+ ppa, created = gri.get_or_create(
+ param_ppa=instance.param_ppa,
+ gerrit_change=instance.gerrit_change)
+ if created:
+ logging.info("%s created", ppa)
+
+
+def gerrit_repo_del(instance):
+ if instance.param_ppa == '$ppa':
+ logger.warn("ppa unset, skip removal")
+ return
+ gri = GerritRepoInfo.objects
+ try:
+ ppa = gri.get(param_ppa=instance.param_ppa,
+ gerrit_change=instance.gerrit_change)
+ ppa.delete()
+ logger.info("removed %s", ppa)
+ except GerritRepoInfo.DoesNotExist:
+ pass
+ if gri.filter(param_ppa=instance.param_ppa).count() == 0:
+ utils.jenkins_remove_ppa(instance.param_ppa)
+
+
+def gerrit_repo_manage(sender, **kwargs):
+ if kwargs["created"]:
+ instance = kwargs["instance"]
+ if instance.jobname.endswith("-repos") and \
+ instance.result == "SUCCESS":
+ logger.info("we need to count this %s", instance.param_ppa)
+ if instance.gerrit_eventtype == "patchset-created":
+ gerrit_repo_add(instance)
+ elif instance.gerrit_eventtype == "change-merged":
+ gerrit_repo_del(instance)
+ elif instance.jobname.endswith("-cleanup") and \
+ instance.result == "SUCCESS" and \
+ instance.gerrit_eventtype == "change-abandoned":
+ logger.info("we need to count this %s", instance.param_ppa)
+ gerrit_repo_del(instance)
diff --git a/repoapi/models/jbi.py b/repoapi/models/jbi.py
new file mode 100644
index 0000000..46310cf
--- /dev/null
+++ b/repoapi/models/jbi.py
@@ -0,0 +1,109 @@
+# Copyright (C) 2015 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 .
+import logging
+import re
+
+from django.db import models
+
+from django.conf import settings
+from repoapi import utils
+from repoapi.tasks import get_jbi_files
+
+logger = logging.getLogger(__name__)
+workfront_re = re.compile(r"TT#(\d+)")
+commit_re = re.compile(r"^(\w{7}) ")
+
+
+class JenkinsBuildInfoManager(models.Manager):
+
+ def releases(self, flat=True):
+ res = self.get_queryset().values('param_release').distinct()
+ if flat:
+ return res.values_list('param_release', flat=True)
+ else:
+ return res.values('param_release')
+
+ def release_projects(self, release, flat=True):
+ res = self.get_queryset().filter(
+ param_release=release).values('projectname').distinct()
+ if flat:
+ return res.values_list('projectname', flat=True)
+ else:
+ return res.values('projectname')
+
+ def release_project_uuids_set(self, release, project):
+ res = self.get_queryset().filter(
+ param_release=release, projectname=project).distinct()
+ return res.order_by('projectname')
+
+ def release_project_uuids(self, release, project, flat=True):
+ res = self.get_queryset().filter(
+ param_release=release, projectname=project).distinct()
+ if flat:
+ return res.order_by('projectname').values_list('tag', flat=True)
+ else:
+ return res.order_by('projectname').values('tag')
+
+ def jobs_by_uuid(self, release, project, uuid):
+ return self.get_queryset().filter(tag=uuid, param_release=release,
+ projectname=project).order_by('date')
+
+ def latest_uuid(self, release, project):
+ qs = self.get_queryset()
+ latest_uuid = qs.filter(
+ param_release=release, projectname=project).latest('date')
+ return {'tag': latest_uuid.tag, 'date': latest_uuid.date}
+
+
+class JenkinsBuildInfo(models.Model):
+ tag = models.CharField(max_length=64, null=True)
+ projectname = models.CharField(max_length=100)
+ jobname = models.CharField(max_length=100)
+ buildnumber = models.IntegerField()
+ date = models.DateTimeField(auto_now_add=True)
+ result = models.CharField(max_length=50)
+ job_url = models.URLField()
+
+ gerrit_patchset = models.CharField(max_length=50, null=True)
+ gerrit_change = models.CharField(max_length=50, null=True)
+ gerrit_eventtype = models.CharField(max_length=50, null=True)
+
+ param_tag = models.CharField(max_length=50, null=True)
+ param_branch = models.CharField(max_length=50, null=True)
+ param_release = models.CharField(max_length=50, null=True,
+ db_index=True)
+ param_distribution = models.CharField(max_length=50, null=True)
+ param_ppa = models.CharField(max_length=50, null=True)
+
+ repo_name = models.CharField(max_length=50, null=True)
+ git_commit_msg = models.TextField(null=True)
+
+ objects = JenkinsBuildInfoManager()
+
+ class Meta:
+ index_together = [
+ ["param_release", "projectname"],
+ ["param_release", "projectname", "tag"],
+ ]
+
+ def __str__(self):
+ return "%s:%d[%s]" % (self.jobname,
+ self.buildnumber, self.tag)
+
+
+def jbi_manage(sender, **kwargs):
+ if kwargs["created"]:
+ instance = kwargs["instance"]
+ get_jbi_files.delay(instance.jobname, instance.buildnumber)
diff --git a/repoapi/models/wni.py b/repoapi/models/wni.py
new file mode 100644
index 0000000..2bd7a68
--- /dev/null
+++ b/repoapi/models/wni.py
@@ -0,0 +1,99 @@
+# Copyright (C) 2015 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 .
+import logging
+import re
+
+from django.db import models
+from django.conf import settings
+from repoapi import utils
+
+logger = logging.getLogger(__name__)
+workfront_re = re.compile(r"TT#(\d+)")
+commit_re = re.compile(r"^(\w{7}) ")
+
+
+class WorkfrontNoteInfo(models.Model):
+ workfront_id = models.CharField(max_length=50, null=False)
+ gerrit_change = models.CharField(max_length=50, null=False)
+ eventtype = models.CharField(max_length=50, null=False)
+
+ class Meta:
+ unique_together = ["workfront_id", "gerrit_change", "eventtype"]
+
+ @staticmethod
+ def getIds(git_comment):
+ """
+ parses git_commit_msg searching for Workfront TT# ocurrences
+ returns a list of IDs
+ """
+ if git_comment:
+ res = workfront_re.findall(git_comment)
+ return set(res)
+ else:
+ return set()
+
+ @staticmethod
+ def getCommit(git_comment):
+ """
+ parses git_commit_msg searching for short GIT_COMMIT
+ """
+ if git_comment:
+ res = commit_re.search(git_comment)
+ if res:
+ return res.group(1)
+
+ def __str__(self):
+ return "%s:%s" % (self.workfront_id, self.gerrit_change)
+
+
+def workfront_note_add(instance, message):
+ wni = WorkfrontNoteInfo.objects
+ workfront_ids = WorkfrontNoteInfo.getIds(instance.git_commit_msg)
+
+ for wid in workfront_ids:
+ if not instance.gerrit_eventtype:
+ change = WorkfrontNoteInfo.getCommit(instance.git_commit_msg)
+ url = settings.GITWEB_URL.format(instance.projectname, change)
+ eventtype = 'git-commit'
+ else:
+ change = instance.gerrit_change
+ url = settings.GERRIT_URL.format(instance.gerrit_change)
+ eventtype = instance.gerrit_eventtype
+ note, created = wni.get_or_create(
+ workfront_id=wid,
+ gerrit_change=change,
+ eventtype=eventtype)
+ if created:
+ if not utils.workfront_note_send(wid, "%s %s" % (message, url)):
+ logger.error("remove releated WorkfrontNoteInfo")
+ note.delete()
+
+
+def workfront_note_manage(sender, **kwargs):
+ """
+ -get-code job is the first in the flow that has the proper
+ GIT_CHANGE_SUBJECT envVar set, so git_commit_msg is fine
+ """
+ if kwargs["created"]:
+ instance = kwargs["instance"]
+ if instance.jobname.endswith("-get-code") and \
+ instance.result == "SUCCESS":
+ if instance.gerrit_eventtype == 'change-merged':
+ msg = "review merged"
+ elif instance.gerrit_eventtype == 'patchset-created':
+ msg = "review created"
+ else:
+ msg = "commit created"
+ workfront_note_add(instance, msg)