blob: f613292f72ada9f34fe0a6e88533759e589599df [file] [log] [blame]
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +03001from django.core.files.storage import FileSystemStorage
2from django.db import models
Anna Arhipova22ea6bf2024-02-20 15:25:30 +01003from django.utils.timezone import now, timedelta
4from django_celery_beat.models import PeriodicTask
Anna Arhipovae9258f32023-11-04 12:31:19 +01005
6
7class IntegerListField(models.Field):
8 def __init__(self, *args, **kwargs):
stavrovska28772bc2024-05-22 09:33:50 +02009 kwargs["editable"] = False
Anna Arhipovae9258f32023-11-04 12:31:19 +010010 super(IntegerListField, self).__init__(*args, **kwargs)
11
12 def db_type(self, connection):
stavrovska28772bc2024-05-22 09:33:50 +020013 return "text"
Anna Arhipovae9258f32023-11-04 12:31:19 +010014
15 def from_db_value(self, value, expression, connection):
16 if not value:
17 return []
stavrovska28772bc2024-05-22 09:33:50 +020018 return [int(x) for x in value.split(",")]
Anna Arhipovae9258f32023-11-04 12:31:19 +010019
20 def to_python(self, value):
21 if isinstance(value, list):
22 return value
23 if not value:
24 return []
stavrovska28772bc2024-05-22 09:33:50 +020025 return [int(x) for x in value.split(",")]
Anna Arhipovae9258f32023-11-04 12:31:19 +010026
27 def get_prep_value(self, value):
28 if not value:
stavrovska28772bc2024-05-22 09:33:50 +020029 return ""
30 return ",".join(str(int(x)) for x in value)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030031
32
Anna Arhipova22ea6bf2024-02-20 15:25:30 +010033def default_created_after():
34 return now() + timedelta(days=-3 * 30)
35
36
Oleksii Petrenko68268172020-09-28 16:58:13 +030037class TestRailTestRun(models.Model):
stavrovska28772bc2024-05-22 09:33:50 +020038 project_name = models.CharField(
39 max_length=300, default="Mirantis Cloud Platform"
40 )
Sofiia Andriichenko4b440da2023-02-10 12:29:46 +010041 plan_name = models.CharField(max_length=300, default="[MCP2.0]OSCORE")
42 run_name = models.CharField(max_length=300, blank=True)
Anna Arhipovaf1ea3ee2024-01-24 13:29:09 +010043 testrun_pattern = models.CharField(max_length=300, blank=True)
Sofiia Andriichenko4b440da2023-02-10 12:29:46 +010044 run_id = models.CharField(max_length=300)
Anna Arhipovae9258f32023-11-04 12:31:19 +010045 checked_tests = IntegerListField(default=list())
Anna Arhipovaec725222024-01-21 00:10:37 +010046 caching_tests_enabled = models.BooleanField(default=False)
stavrovska28772bc2024-05-22 09:33:50 +020047 created_by_id = models.IntegerField(default="109")
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030048 filter_func = models.TextField(null=True, blank=True)
Sofiia Andriichenko4b440da2023-02-10 12:29:46 +010049 ip_filter = models.BooleanField(default=True)
50 uuid_filter = models.BooleanField(default=True)
Anna Arhipova53461592024-01-10 11:18:05 +010051 filter_last_traceback = models.BooleanField(default=True)
52 created_before = models.DateField(default=now)
Anna Arhipova22ea6bf2024-02-20 15:25:30 +010053 created_after = models.DateField(default=default_created_after)
Pavel Glazov12492922024-06-17 03:32:48 -070054 created_at = models.DateTimeField(auto_now_add=True)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030055
Anna Arhipovae9258f32023-11-04 12:31:19 +010056 @property
57 def text_filters(self):
58 return {
59 "filter_last_traceback": self.filter_last_traceback,
60 "uuid_filter": self.uuid_filter,
61 "ip_filter": self.ip_filter,
62 "filter_func": self.filter_func,
63 }
64
65 @property
66 def testrail_filters(self):
67 return {
68 "created_by_id": self.created_by_id,
Anna Arhipova62760612023-11-28 23:20:38 +010069 "created_after": self.created_after,
70 "created_before": self.created_before,
Anna Arhipovaf1ea3ee2024-01-24 13:29:09 +010071 "testrun_pattern": self.testrun_pattern,
Anna Arhipovae9258f32023-11-04 12:31:19 +010072 "plan_name": self.plan_name,
Anna Arhipovae9258f32023-11-04 12:31:19 +010073 }
74
Anna Arhipova614e5fc2024-02-27 18:17:15 +010075 class Meta:
76 ordering = ["-run_id"]
77
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030078
79fs = FileSystemStorage()
80
81
Oleksii Petrenko68268172020-09-28 16:58:13 +030082class TestRailReport(models.Model):
Oleksii Petrenko1de4bab2020-07-21 15:49:04 +030083 path = models.FileField(storage=fs, null=True, blank=True, max_length=500)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030084 report_name = models.CharField(max_length=300)
85 finished = models.BooleanField(default=False)
Oleksii Petrenko7118f8c2020-07-17 12:45:09 +030086 created_at = models.DateTimeField(auto_now_add=True)
Oleksii Petrenko68268172020-09-28 16:58:13 +030087
88
89class ActionLog(models.Model):
90 name = models.CharField(max_length=500)
91 date = models.DateTimeField(null=True)
Anna Arhipova7cdcc852023-11-15 18:20:45 +010092
93
94class SuitePassRate(models.Model):
95 SUITE_CHOICES = [
stavrovska28772bc2024-05-22 09:33:50 +020096 (
97 "Tempest",
98 (
99 ("10650", "[MCP2.0_QUEENS]Tempest"),
100 ("10651", "[MCP2.0_ROCKY]Tempest"),
101 ("10635", "[MCP2.0_STEIN]Tempest"),
102 ("10653", "[MCP2.0_TRAIN]Tempest"),
103 ("10710", "[MCP2.0_USSURI]Tempest"),
104 ("10888", "[MCP2.0_VICTORIA]Tempest"),
105 ("11167", "[MCP2.0_WALLABY]Tempest"),
106 ("11188", "[MCP2.0_XENA]Tempest"),
107 ("11170", "[MCP2.0_YOGA]Tempest"),
108 ("11192", "[MCP2.0_ANTELOPE]Tempest"),
109 ("11195", "[MCP2.0_CARACAL]Tempest"),
110 ),
111 ),
112 (
113 "Stepler",
114 (
115 ("10886", "[MCP2.0_USSURI]Stepler"),
116 ("10887", "[MCP2.0_VICTORIA]Stepler"),
117 ("11171", "[MCP2.0_YOGA]Stepler"),
118 ("11193", "[MCP2.0_ANTELOPE]Stepler"),
119 ("11196", "[MCP2.0_CARACAL]Stepler"),
120 ),
121 ),
Anna Arhipova7cdcc852023-11-15 18:20:45 +0100122 ]
123 suite_id = models.CharField(max_length=20, choices=SUITE_CHOICES)
124 suite_name = models.CharField(max_length=100, blank=True)
125 passrate_by_tests = models.JSONField(default="{}", blank=True)
126 status = models.TextField(max_length=300, blank=True)
127 finished = models.BooleanField(default=False, blank=True)
128
129
130class DiffOfSuitesPassRates(models.Model):
131 limit = models.IntegerField(default=10, blank=True)
132 test_keyword = models.CharField(default="", max_length=300, blank=True)
stavrovska28772bc2024-05-22 09:33:50 +0200133 report1 = models.ForeignKey(
134 to=SuitePassRate,
135 related_name="report1",
136 on_delete=models.CASCADE,
137 blank=True,
138 )
139 report2 = models.ForeignKey(
140 to=SuitePassRate,
141 related_name="report2",
142 on_delete=models.CASCADE,
143 blank=True,
144 )
145 started_at = models.DateTimeField(auto_created=True, auto_now=True)
Anna Arhipova22ea6bf2024-02-20 15:25:30 +0100146
147
Anna Arhipovad2d4d9b2024-03-18 20:57:44 +0100148TASKS = [
stavrovska28772bc2024-05-22 09:33:50 +0200149 (
150 "control.celery_tasks.tasks.check_today_testplan",
151 "Check today testplan",
152 [],
153 ),
154 (
155 "control.celery_tasks.tasks.check_specific_testplan",
156 "Check specific testplan",
157 ["testplan_id_arg"],
158 ),
Pavel Glazov12492922024-06-17 03:32:48 -0700159 (
160 "control.celery_tasks.tasks.delete_old_2m_testruns",
161 "Delete previous 2-month TestRuns(for bot view)",
162 [],
163 ),
164 (
165 "control.celery_tasks.tasks.delete_old_2m_reports",
166 "Delete previous 2-month Reports(for bot view)",
167 [],
168 ),
stavrovska28772bc2024-05-22 09:33:50 +0200169]
Anna Arhipova22ea6bf2024-02-20 15:25:30 +0100170
stavrovska28772bc2024-05-22 09:33:50 +0200171TASK_CHOICES = list(map(lambda x: x[:-1], TASKS))
Anna Arhipovad2d4d9b2024-03-18 20:57:44 +0100172
Anna Arhipova22ea6bf2024-02-20 15:25:30 +0100173
174class CronPeriodicTask(PeriodicTask):
stavrovska28772bc2024-05-22 09:33:50 +0200175 cron = models.CharField(default="", max_length=300, blank=False)
176 task_name = models.CharField(
177 max_length=300, choices=TASK_CHOICES, default=TASK_CHOICES[0][0]
178 )
Anna Arhipovad2d4d9b2024-03-18 20:57:44 +0100179 testplan_id_arg = models.CharField(max_length=30, blank=True, null=True)
Anna Arhipova22ea6bf2024-02-20 15:25:30 +0100180
181 class Meta:
182 ordering = ["id"]