models.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. from __future__ import unicode_literals
  2. from django.contrib.contenttypes.fields import GenericRelation
  3. from django.db import models
  4. from django.urls import reverse
  5. from django.utils.encoding import python_2_unicode_compatible
  6. from extras.models import CustomFieldModel, CustomFieldValue
  7. from utilities.models import CreatedUpdatedModel
  8. #
  9. # Cluster types
  10. #
  11. @python_2_unicode_compatible
  12. class ClusterType(models.Model):
  13. """
  14. A type of Cluster.
  15. """
  16. name = models.CharField(
  17. max_length=50,
  18. unique=True
  19. )
  20. slug = models.SlugField(
  21. unique=True
  22. )
  23. class Meta:
  24. ordering = ['name']
  25. def __str__(self):
  26. return self.name
  27. def get_absolute_url(self):
  28. return "{}?type={}".format(reverse('virtualization:cluster_list'), self.slug)
  29. #
  30. # Cluster groups
  31. #
  32. @python_2_unicode_compatible
  33. class ClusterGroup(models.Model):
  34. """
  35. An organizational group of Clusters.
  36. """
  37. name = models.CharField(
  38. max_length=50,
  39. unique=True
  40. )
  41. slug = models.SlugField(
  42. unique=True
  43. )
  44. class Meta:
  45. ordering = ['name']
  46. def __str__(self):
  47. return self.name
  48. def get_absolute_url(self):
  49. return "{}?group={}".format(reverse('virtualization:cluster_list'), self.slug)
  50. #
  51. # Clusters
  52. #
  53. @python_2_unicode_compatible
  54. class Cluster(CreatedUpdatedModel, CustomFieldModel):
  55. """
  56. A cluster of VirtualMachines. Each Cluster may optionally be associated with one or more Devices.
  57. """
  58. name = models.CharField(
  59. max_length=100,
  60. unique=True
  61. )
  62. type = models.ForeignKey(
  63. to=ClusterType,
  64. on_delete=models.PROTECT,
  65. related_name='clusters'
  66. )
  67. group = models.ForeignKey(
  68. to=ClusterGroup,
  69. on_delete=models.PROTECT,
  70. related_name='clusters',
  71. blank=True,
  72. null=True
  73. )
  74. comments = models.TextField(
  75. blank=True
  76. )
  77. custom_field_values = GenericRelation(
  78. to=CustomFieldValue,
  79. content_type_field='obj_type',
  80. object_id_field='obj_id'
  81. )
  82. class Meta:
  83. ordering = ['name']
  84. def __str__(self):
  85. return self.name
  86. def get_absolute_url(self):
  87. return reverse('virtualization:cluster', args=[self.pk])
  88. #
  89. # Virtual machines
  90. #
  91. @python_2_unicode_compatible
  92. class VirtualMachine(CreatedUpdatedModel, CustomFieldModel):
  93. """
  94. A virtual machine which runs inside a Cluster.
  95. """
  96. cluster = models.ForeignKey(
  97. to=Cluster,
  98. on_delete=models.PROTECT,
  99. related_name='virtual_machines'
  100. )
  101. tenant = models.ForeignKey(
  102. to='tenancy.Tenant',
  103. on_delete=models.PROTECT,
  104. related_name='virtual_machines',
  105. blank=True,
  106. null=True
  107. )
  108. platform = models.ForeignKey(
  109. to='dcim.Platform',
  110. on_delete=models.SET_NULL,
  111. related_name='virtual_machines',
  112. blank=True,
  113. null=True
  114. )
  115. name = models.CharField(
  116. max_length=64,
  117. unique=True
  118. )
  119. primary_ip4 = models.OneToOneField(
  120. to='ipam.IPAddress',
  121. on_delete=models.SET_NULL,
  122. related_name='+',
  123. blank=True,
  124. null=True,
  125. verbose_name='Primary IPv4'
  126. )
  127. primary_ip6 = models.OneToOneField(
  128. to='ipam.IPAddress',
  129. on_delete=models.SET_NULL,
  130. related_name='+',
  131. blank=True,
  132. null=True,
  133. verbose_name='Primary IPv6'
  134. )
  135. vcpus = models.PositiveSmallIntegerField(
  136. blank=True,
  137. null=True,
  138. verbose_name='vCPUs'
  139. )
  140. memory = models.PositiveIntegerField(
  141. blank=True,
  142. null=True,
  143. verbose_name='Memory (MB)'
  144. )
  145. disk = models.PositiveIntegerField(
  146. blank=True,
  147. null=True,
  148. verbose_name='Disk (GB)'
  149. )
  150. comments = models.TextField(
  151. blank=True
  152. )
  153. custom_field_values = GenericRelation(
  154. to=CustomFieldValue,
  155. content_type_field='obj_type',
  156. object_id_field='obj_id'
  157. )
  158. class Meta:
  159. ordering = ['name']
  160. def __str__(self):
  161. return self.name
  162. def get_absolute_url(self):
  163. return reverse('virtualization:virtualmachine', args=[self.pk])