mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-16 12:12:53 -06:00
VirtualMachine.status to slug
This commit is contained in:
parent
4ecbfc4e5e
commit
ca11b9a2f5
@ -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
netbox/virtualization/choices.py
Normal file
24
netbox/virtualization/choices.py
Normal 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,
|
||||||
|
}
|
@ -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',
|
|
||||||
}
|
|
@ -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(
|
||||||
|
@ -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()
|
||||||
)
|
)
|
||||||
|
@ -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
|
||||||
|
),
|
||||||
|
]
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user