VirtualMachine.status to slug

This commit is contained in:
Jeremy Stretch 2019-12-04 20:40:18 -05:00
parent 4ecbfc4e5e
commit ca11b9a2f5
7 changed files with 77 additions and 28 deletions

View File

@ -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)

View File

@ -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,
}

View File

@ -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',
}

View File

@ -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(

View File

@ -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()
) )

View File

@ -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
),
]

View File

@ -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( status = models.CharField(
choices=VM_STATUS_CHOICES, max_length=50,
default=1, # TODO: Replace with ChoiceSet value 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):