1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

#6454 fix merge conflicts

This commit is contained in:
Arthur
2022-08-18 15:31:54 -07:00
458 changed files with 14069 additions and 6039 deletions

View File

@@ -119,6 +119,11 @@ class Cluster(NetBoxModel):
blank=True,
null=True
)
status = models.CharField(
max_length=50,
choices=ClusterStatusChoices,
default=ClusterStatusChoices.STATUS_ACTIVE
)
tenant = models.ForeignKey(
to='tenancy.Tenant',
on_delete=models.PROTECT,
@@ -148,9 +153,9 @@ class Cluster(NetBoxModel):
to='tenancy.ContactAssignment'
)
clone_fields = [
'type', 'group', 'tenant', 'site',
]
clone_fields = (
'type', 'group', 'status', 'tenant', 'site',
)
class Meta:
ordering = ['name']
@@ -169,6 +174,9 @@ class Cluster(NetBoxModel):
def get_absolute_url(self):
return reverse('virtualization:cluster', args=[self.pk])
def get_status_color(self):
return ClusterStatusChoices.colors.get(self.status)
def clean(self):
super().clean()
@@ -191,10 +199,26 @@ class VirtualMachine(NetBoxModel, ConfigContextModel):
"""
A virtual machine which runs inside a Cluster.
"""
site = models.ForeignKey(
to='dcim.Site',
on_delete=models.PROTECT,
related_name='virtual_machines',
blank=True,
null=True
)
cluster = models.ForeignKey(
to='virtualization.Cluster',
on_delete=models.PROTECT,
related_name='virtual_machines'
related_name='virtual_machines',
blank=True,
null=True
)
device = models.ForeignKey(
to='dcim.Device',
on_delete=models.PROTECT,
related_name='virtual_machines',
blank=True,
null=True
)
tenant = models.ForeignKey(
to='tenancy.Tenant',
@@ -279,9 +303,9 @@ class VirtualMachine(NetBoxModel, ConfigContextModel):
objects = ConfigContextModelQuerySet.as_manager()
clone_fields = [
'cluster', 'tenant', 'platform', 'status', 'role', 'vcpus', 'memory', 'disk',
]
clone_fields = (
'site', 'cluster', 'device', 'tenant', 'platform', 'status', 'role', 'vcpus', 'memory', 'disk',
)
class Meta:
ordering = ('_name', 'pk') # Name may be non-unique
@@ -316,6 +340,32 @@ class VirtualMachine(NetBoxModel, ConfigContextModel):
def clean(self):
super().clean()
# Must be assigned to a site and/or cluster
if not self.site and not self.cluster:
raise ValidationError({
'cluster': f'A virtual machine must be assigned to a site and/or cluster.'
})
# Validate site for cluster & device
if self.cluster and self.cluster.site != self.site:
raise ValidationError({
'cluster': f'The selected cluster ({self.cluster} is not assigned to this site ({self.site}).'
})
if self.device and self.device.site != self.site:
raise ValidationError({
'device': f'The selected device ({self.device} is not assigned to this site ({self.site}).'
})
# Validate assigned cluster device
if self.device and not self.cluster:
raise ValidationError({
'device': f'Must specify a cluster when assigning a host device.'
})
if self.device and self.device not in self.cluster.devices.all():
raise ValidationError({
'device': f'The selected device ({self.device} is not assigned to this cluster ({self.cluster}).'
})
# Validate primary IP addresses
interfaces = self.interfaces.all()
for field in ['primary_ip4', 'primary_ip6']:
@@ -344,10 +394,6 @@ class VirtualMachine(NetBoxModel, ConfigContextModel):
else:
return None
@property
def site(self):
return self.cluster.site
#
# Interfaces
@@ -406,6 +452,12 @@ class VMInterface(NetBoxModel, BaseInterface):
object_id_field='interface_id',
related_query_name='+'
)
l2vpn_terminations = GenericRelation(
to='ipam.L2VPNTermination',
content_type_field='assigned_object_type',
object_id_field='assigned_object_id',
related_query_name='vminterface',
)
class Meta:
verbose_name = 'interface'
@@ -464,3 +516,7 @@ class VMInterface(NetBoxModel, BaseInterface):
@property
def parent_object(self):
return self.virtual_machine
@property
def l2vpn_termination(self):
return self.l2vpn_terminations.first()