Jeremy Stretch 6 лет назад
Родитель
Сommit
ca11b9a2f5

+ 2 - 2
netbox/virtualization/api/serializers.py

@@ -10,7 +10,7 @@ from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedVLANSer
 from ipam.models import VLAN
 from ipam.models import VLAN
 from tenancy.api.nested_serializers import NestedTenantSerializer
 from tenancy.api.nested_serializers import NestedTenantSerializer
 from utilities.api import ChoiceField, SerializedPKRelatedField, ValidatedModelSerializer
 from utilities.api import ChoiceField, SerializedPKRelatedField, ValidatedModelSerializer
-from virtualization.constants import VM_STATUS_CHOICES
+from virtualization.choices import *
 from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine
 from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine
 from .nested_serializers import *
 from .nested_serializers import *
 
 
@@ -57,7 +57,7 @@ class ClusterSerializer(TaggitSerializer, CustomFieldModelSerializer):
 #
 #
 
 
 class VirtualMachineSerializer(TaggitSerializer, CustomFieldModelSerializer):
 class VirtualMachineSerializer(TaggitSerializer, CustomFieldModelSerializer):
-    status = ChoiceField(choices=VM_STATUS_CHOICES, required=False)
+    status = ChoiceField(choices=VirtualMachineStatusChoices, required=False)
     site = NestedSiteSerializer(read_only=True)
     site = NestedSiteSerializer(read_only=True)
     cluster = NestedClusterSerializer()
     cluster = NestedClusterSerializer()
     role = NestedDeviceRoleSerializer(required=False, allow_null=True)
     role = NestedDeviceRoleSerializer(required=False, allow_null=True)

+ 24 - 0
netbox/virtualization/choices.py

@@ -0,0 +1,24 @@
+from utilities.choices import ChoiceSet
+
+
+#
+# VirtualMachines
+#
+
+class VirtualMachineStatusChoices(ChoiceSet):
+
+    STATUS_ACTIVE = 'active'
+    STATUS_OFFLINE = 'offline'
+    STATUS_STAGED = 'staged'
+
+    CHOICES = (
+        (STATUS_ACTIVE, 'Active'),
+        (STATUS_OFFLINE, 'Offline'),
+        (STATUS_STAGED, 'Staged'),
+    )
+
+    LEGACY_MAP = {
+        STATUS_OFFLINE: 0,
+        STATUS_ACTIVE: 1,
+        STATUS_STAGED: 3,
+    }

+ 0 - 15
netbox/virtualization/constants.py

@@ -1,15 +0,0 @@
-from dcim.choices import DeviceStatusChoices
-
-# VirtualMachine statuses (replicated from Device statuses)
-VM_STATUS_CHOICES = [
-    [1, 'Active'],
-    [0, 'Offline'],
-    [3, 'Staged'],
-]
-
-# Bootstrap CSS classes for VirtualMachine statuses
-VM_STATUS_CLASSES = {
-    0: 'warning',
-    1: 'success',
-    3: 'primary',
-}

+ 2 - 2
netbox/virtualization/filters.py

@@ -10,7 +10,7 @@ from tenancy.filtersets import TenancyFilterSet
 from utilities.filters import (
 from utilities.filters import (
     MultiValueMACAddressFilter, NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter,
     MultiValueMACAddressFilter, NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter,
 )
 )
-from .constants import *
+from .choices import *
 from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine
 from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine
 
 
 
 
@@ -96,7 +96,7 @@ class VirtualMachineFilter(TenancyFilterSet, CustomFieldFilterSet):
         label='Search',
         label='Search',
     )
     )
     status = django_filters.MultipleChoiceFilter(
     status = django_filters.MultipleChoiceFilter(
-        choices=VM_STATUS_CHOICES,
+        choices=VirtualMachineStatusChoices,
         null_value=None
         null_value=None
     )
     )
     cluster_group_id = django_filters.ModelMultipleChoiceFilter(
     cluster_group_id = django_filters.ModelMultipleChoiceFilter(

+ 4 - 4
netbox/virtualization/forms.py

@@ -15,7 +15,7 @@ from utilities.forms import (
     ConfirmationForm, CSVChoiceField, ExpandableNameField, FilterChoiceField, JSONField, SlugField,
     ConfirmationForm, CSVChoiceField, ExpandableNameField, FilterChoiceField, JSONField, SlugField,
     SmallTextarea, StaticSelect2, StaticSelect2Multiple
     SmallTextarea, StaticSelect2, StaticSelect2Multiple
 )
 )
-from .constants import *
+from .choices import *
 from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine
 from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine
 
 
 VIFACE_TYPE_CHOICES = (
 VIFACE_TYPE_CHOICES = (
@@ -428,7 +428,7 @@ class VirtualMachineForm(BootstrapMixin, TenancyForm, CustomFieldForm):
 
 
 class VirtualMachineCSVForm(forms.ModelForm):
 class VirtualMachineCSVForm(forms.ModelForm):
     status = CSVChoiceField(
     status = CSVChoiceField(
-        choices=VM_STATUS_CHOICES,
+        choices=VirtualMachineStatusChoices,
         required=False,
         required=False,
         help_text='Operational status of device'
         help_text='Operational status of device'
     )
     )
@@ -481,7 +481,7 @@ class VirtualMachineBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldB
         widget=forms.MultipleHiddenInput()
         widget=forms.MultipleHiddenInput()
     )
     )
     status = forms.ChoiceField(
     status = forms.ChoiceField(
-        choices=add_blank_choice(VM_STATUS_CHOICES),
+        choices=add_blank_choice(VirtualMachineStatusChoices),
         required=False,
         required=False,
         initial='',
         initial='',
         widget=StaticSelect2(),
         widget=StaticSelect2(),
@@ -612,7 +612,7 @@ class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFil
         )
         )
     )
     )
     status = forms.MultipleChoiceField(
     status = forms.MultipleChoiceField(
-        choices=VM_STATUS_CHOICES,
+        choices=VirtualMachineStatusChoices,
         required=False,
         required=False,
         widget=StaticSelect2Multiple()
         widget=StaticSelect2Multiple()
     )
     )

+ 33 - 0
netbox/virtualization/migrations/0011_3569_virtualmachine_fields.py

@@ -0,0 +1,33 @@
+from django.db import migrations, models
+
+
+VIRTUALMACHINE_STATUS_CHOICES = (
+    (0, 'offline'),
+    (1, 'active'),
+    (3, 'staged'),
+)
+
+
+def virtualmachine_status_to_slug(apps, schema_editor):
+    VirtualMachine = apps.get_model('virtualization', 'VirtualMachine')
+    for id, slug in VIRTUALMACHINE_STATUS_CHOICES:
+        VirtualMachine.objects.filter(status=str(id)).update(status=slug)
+
+
+class Migration(migrations.Migration):
+    atomic = False
+
+    dependencies = [
+        ('virtualization', '0010_cluster_add_tenant'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='virtualmachine',
+            name='status',
+            field=models.CharField(default='active', max_length=50),
+        ),
+        migrations.RunPython(
+            code=virtualmachine_status_to_slug
+        ),
+    ]

+ 12 - 5
netbox/virtualization/models.py

@@ -8,7 +8,7 @@ from taggit.managers import TaggableManager
 from dcim.models import Device
 from dcim.models import Device
 from extras.models import ConfigContextModel, CustomFieldModel, TaggedItem
 from extras.models import ConfigContextModel, CustomFieldModel, TaggedItem
 from utilities.models import ChangeLoggedModel
 from utilities.models import ChangeLoggedModel
-from .constants import *
+from .choices import *
 
 
 
 
 #
 #
@@ -193,9 +193,10 @@ class VirtualMachine(ChangeLoggedModel, ConfigContextModel, CustomFieldModel):
         max_length=64,
         max_length=64,
         unique=True
         unique=True
     )
     )
-    status = models.PositiveSmallIntegerField(
-        choices=VM_STATUS_CHOICES,
-        default=1,  # TODO: Replace with ChoiceSet value
+    status = models.CharField(
+        max_length=50,
+        choices=VirtualMachineStatusChoices,
+        default=VirtualMachineStatusChoices.STATUS_ACTIVE,
         verbose_name='Status'
         verbose_name='Status'
     )
     )
     role = models.ForeignKey(
     role = models.ForeignKey(
@@ -252,6 +253,12 @@ class VirtualMachine(ChangeLoggedModel, ConfigContextModel, CustomFieldModel):
         'name', 'status', 'role', 'cluster', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments',
         'name', 'status', 'role', 'cluster', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments',
     ]
     ]
 
 
+    STATUS_CLASS_MAP = {
+        'active': 'success',
+        'offline': 'warning',
+        'staged': 'primary',
+    }
+
     class Meta:
     class Meta:
         ordering = ['name']
         ordering = ['name']
 
 
@@ -294,7 +301,7 @@ class VirtualMachine(ChangeLoggedModel, ConfigContextModel, CustomFieldModel):
         )
         )
 
 
     def get_status_class(self):
     def get_status_class(self):
-        return VM_STATUS_CLASSES[self.status]
+        return self.STATUS_CLASS_MAP.get(self.status)
 
 
     @property
     @property
     def primary_ip(self):
     def primary_ip(self):