From 5bcf351bdc05f9e97fd4bce1d210466d494a5193 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 18 Oct 2023 15:49:44 -0700 Subject: [PATCH] 8356 add virtual disk model --- .../migrations/0037_virtualdisk.py | 54 +++++++++++++++++++ .../virtualization/models/virtualmachines.py | 39 ++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 netbox/virtualization/migrations/0037_virtualdisk.py diff --git a/netbox/virtualization/migrations/0037_virtualdisk.py b/netbox/virtualization/migrations/0037_virtualdisk.py new file mode 100644 index 000000000..07085a79e --- /dev/null +++ b/netbox/virtualization/migrations/0037_virtualdisk.py @@ -0,0 +1,54 @@ +# Generated by Django 4.2.5 on 2023-10-18 22:49 + +from django.db import migrations, models +import django.db.models.deletion +import taggit.managers +import utilities.fields +import utilities.json +import utilities.ordering +import utilities.tracking + + +class Migration(migrations.Migration): + dependencies = [ + ('extras', '0098_webhook_custom_field_data_webhook_tags'), + ('virtualization', '0036_virtualmachine_config_template'), + ] + + operations = [ + migrations.CreateModel( + name='VirtualDisk', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ( + 'custom_field_data', + models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder), + ), + ('name', models.CharField(max_length=64)), + ( + '_name', + utilities.fields.NaturalOrderingField( + 'name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize + ), + ), + ('size', models.PositiveIntegerField(blank=True, null=True)), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ( + 'virtual_machine', + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='%(class)ss', + to='virtualization.virtualmachine', + ), + ), + ], + options={ + 'verbose_name': 'virtual disk', + 'verbose_name_plural': 'virtual disks', + 'ordering': ('_name', 'pk'), + }, + bases=(models.Model, utilities.tracking.TrackingModelMixin), + ), + ] diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index eb6c2a8b0..35b3ff4af 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -371,3 +371,42 @@ class VMInterface(NetBoxModel, BaseInterface, TrackingModelMixin): @property def l2vpn_termination(self): return self.l2vpn_terminations.first() + + +class VirtualDisk(NetBoxModel, TrackingModelMixin): + virtual_machine = models.ForeignKey( + to=VirtualMachine, + on_delete=models.CASCADE, + related_name='%(class)ss' + ) + name = models.CharField( + verbose_name=_('name'), + max_length=64 + ) + _name = NaturalOrderingField( + target_field='name', + max_length=100, + blank=True + ) + size = models.PositiveIntegerField( + verbose_name=_('size'), + blank=True, + null=True, + help_text=_("Size") + ) + + class Meta: + ordering = ('_name', 'pk') # Name may be non-unique + verbose_name = _('virtual disk') + verbose_name_plural = _('virtual disks') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('virtualization:virtualdisk', args=[self.pk]) + + def to_objectchange(self, action): + objectchange = super().to_objectchange(action) + objectchange.related_object = self.virtual_machine + return objectchange