feat(itim): Prevent circular service dependencies

!43 #69
This commit is contained in:
2024-07-21 11:16:17 +09:30
parent b46c61954c
commit c95736ce14
5 changed files with 21 additions and 4 deletions

View File

@ -1,4 +1,4 @@
# Generated by Django 5.0.7 on 2024-07-21 00:05
# Generated by Django 5.0.7 on 2024-07-21 01:45
import django.db.models.deletion
from django.db import migrations, models

View File

@ -37,6 +37,8 @@ class ServiceForm(CommonModelForm):
cleaned_data = super().clean()
pk = self.instance.id
dependent_service = cleaned_data.get("dependent_service")
device = cleaned_data.get("device")
cluster = cleaned_data.get("cluster")
is_template = cleaned_data.get("is_template")
@ -60,6 +62,19 @@ class ServiceForm(CommonModelForm):
raise ValidationError('Port(s) must be assigned to a service.')
if dependent_service:
for dependency in dependent_service:
query = Service.objects.filter(
dependent_service = pk,
id = dependency.id,
)
if query.exists():
raise ValidationError('A dependent service already depends upon this service. Circular dependencies are not allowed.')

View File

@ -1,4 +1,4 @@
# Generated by Django 5.0.7 on 2024-07-21 00:05
# Generated by Django 5.0.7 on 2024-07-21 01:45
import access.fields
import access.models
@ -86,7 +86,7 @@ class Migration(migrations.Migration):
('created', access.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False)),
('modified', access.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False)),
('cluster', models.ForeignKey(blank=True, default=None, help_text='Cluster the service is assigned to', null=True, on_delete=django.db.models.deletion.CASCADE, to='itim.cluster', verbose_name='Cluster')),
('dependent_service', models.ManyToManyField(blank=True, default=None, help_text='Services that this service depends upon', to='itim.service', verbose_name='Dependent Services')),
('dependent_service', models.ManyToManyField(blank=True, default=None, help_text='Services that this service depends upon', related_name='dependentservice', to='itim.service', verbose_name='Dependent Services')),
('device', models.ForeignKey(blank=True, default=None, help_text='Device the service is assigned to', null=True, on_delete=django.db.models.deletion.CASCADE, to='itam.device', verbose_name='Device')),
('organization', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='access.organization', validators=[access.models.TenancyObject.validatate_organization_exists])),
('port', models.ManyToManyField(blank=True, help_text='Port the service is available on', to='itim.port', verbose_name='Port')),

View File

@ -166,6 +166,8 @@ class Service(TenancyObject):
blank = True,
default = None,
help_text = 'Services that this service depends upon',
related_name = 'dependentservice',
symmetrical = False,
verbose_name = 'Dependent Services',
)

View File

@ -205,7 +205,7 @@
{% if item.dependent_service.all %}
{% for service in item.dependent_service.all %}
<tr>
<td><a href="{% url 'Settings:_port_view' item.pk %}">{{ service }}</a></td>
<td><a href="{% url 'ITIM:_service_view' service.pk %}">{{ service }}</a></td>
<td>{{ service.organization }}</td>
</tr>
{% endfor%}