tables.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import django_tables2 as tables
  2. from django_tables2.utils import Accessor
  3. from dcim.models import Interface
  4. from tenancy.tables import COL_TENANT
  5. from utilities.tables import BaseTable, ColoredLabelColumn, TagColumn, ToggleColumn
  6. from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine
  7. CLUSTERTYPE_ACTIONS = """
  8. <a href="{% url 'virtualization:clustertype_changelog' slug=record.slug %}" class="btn btn-default btn-xs" title="Change log">
  9. <i class="fa fa-history"></i>
  10. </a>
  11. {% if perms.virtualization.change_clustertype %}
  12. <a href="{% url 'virtualization:clustertype_edit' slug=record.slug %}?return_url={{ request.path }}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
  13. {% endif %}
  14. """
  15. CLUSTERGROUP_ACTIONS = """
  16. <a href="{% url 'virtualization:clustergroup_changelog' slug=record.slug %}" class="btn btn-default btn-xs" title="Change log">
  17. <i class="fa fa-history"></i>
  18. </a>
  19. {% if perms.virtualization.change_clustergroup %}
  20. <a href="{% url 'virtualization:clustergroup_edit' slug=record.slug %}?return_url={{ request.path }}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
  21. {% endif %}
  22. """
  23. VIRTUALMACHINE_STATUS = """
  24. <span class="label label-{{ record.get_status_class }}">{{ record.get_status_display }}</span>
  25. """
  26. VIRTUALMACHINE_PRIMARY_IP = """
  27. {{ record.primary_ip6.address.ip|default:"" }}
  28. {% if record.primary_ip6 and record.primary_ip4 %}<br />{% endif %}
  29. {{ record.primary_ip4.address.ip|default:"" }}
  30. """
  31. CLUSTER_DEVICE_COUNT = """
  32. <a href="{% url 'dcim:device_list' %}?cluster_id={{ record.pk }}">{{ value|default:0 }}</a>
  33. """
  34. CLUSTER_VM_COUNT = """
  35. <a href="{% url 'virtualization:virtualmachine_list' %}?cluster_id={{ record.pk }}">{{ value|default:0 }}</a>
  36. """
  37. #
  38. # Cluster types
  39. #
  40. class ClusterTypeTable(BaseTable):
  41. pk = ToggleColumn()
  42. name = tables.LinkColumn()
  43. cluster_count = tables.Column(
  44. verbose_name='Clusters'
  45. )
  46. actions = tables.TemplateColumn(
  47. template_code=CLUSTERTYPE_ACTIONS,
  48. attrs={'td': {'class': 'text-right noprint'}},
  49. verbose_name=''
  50. )
  51. class Meta(BaseTable.Meta):
  52. model = ClusterType
  53. fields = ('pk', 'name', 'slug', 'cluster_count', 'description', 'actions')
  54. default_columns = ('pk', 'name', 'cluster_count', 'description', 'actions')
  55. #
  56. # Cluster groups
  57. #
  58. class ClusterGroupTable(BaseTable):
  59. pk = ToggleColumn()
  60. name = tables.LinkColumn()
  61. cluster_count = tables.Column(
  62. verbose_name='Clusters'
  63. )
  64. actions = tables.TemplateColumn(
  65. template_code=CLUSTERGROUP_ACTIONS,
  66. attrs={'td': {'class': 'text-right noprint'}},
  67. verbose_name=''
  68. )
  69. class Meta(BaseTable.Meta):
  70. model = ClusterGroup
  71. fields = ('pk', 'name', 'slug', 'cluster_count', 'description', 'actions')
  72. default_columns = ('pk', 'name', 'cluster_count', 'description', 'actions')
  73. #
  74. # Clusters
  75. #
  76. class ClusterTable(BaseTable):
  77. pk = ToggleColumn()
  78. name = tables.LinkColumn()
  79. tenant = tables.LinkColumn(
  80. viewname='tenancy:tenant',
  81. args=[Accessor('tenant.slug')]
  82. )
  83. site = tables.LinkColumn(
  84. viewname='dcim:site',
  85. args=[Accessor('site.slug')]
  86. )
  87. device_count = tables.TemplateColumn(
  88. template_code=CLUSTER_DEVICE_COUNT,
  89. verbose_name='Devices'
  90. )
  91. vm_count = tables.TemplateColumn(
  92. template_code=CLUSTER_VM_COUNT,
  93. verbose_name='VMs'
  94. )
  95. tags = TagColumn(
  96. url_name='virtualization:cluster_list'
  97. )
  98. class Meta(BaseTable.Meta):
  99. model = Cluster
  100. fields = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'device_count', 'vm_count', 'tags')
  101. default_columns = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'device_count', 'vm_count')
  102. #
  103. # Virtual machines
  104. #
  105. class VirtualMachineTable(BaseTable):
  106. pk = ToggleColumn()
  107. name = tables.LinkColumn()
  108. status = tables.TemplateColumn(
  109. template_code=VIRTUALMACHINE_STATUS
  110. )
  111. cluster = tables.LinkColumn(
  112. viewname='virtualization:cluster',
  113. args=[Accessor('cluster.pk')]
  114. )
  115. role = ColoredLabelColumn()
  116. tenant = tables.TemplateColumn(
  117. template_code=COL_TENANT
  118. )
  119. class Meta(BaseTable.Meta):
  120. model = VirtualMachine
  121. fields = ('pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk')
  122. class VirtualMachineDetailTable(VirtualMachineTable):
  123. primary_ip4 = tables.LinkColumn(
  124. viewname='ipam:ipaddress',
  125. args=[Accessor('primary_ip4.pk')],
  126. verbose_name='IPv4 Address'
  127. )
  128. primary_ip6 = tables.LinkColumn(
  129. viewname='ipam:ipaddress',
  130. args=[Accessor('primary_ip6.pk')],
  131. verbose_name='IPv6 Address'
  132. )
  133. primary_ip = tables.TemplateColumn(
  134. orderable=False,
  135. verbose_name='IP Address',
  136. template_code=VIRTUALMACHINE_PRIMARY_IP
  137. )
  138. tags = TagColumn(
  139. url_name='virtualization:virtualmachine_list'
  140. )
  141. class Meta(BaseTable.Meta):
  142. model = VirtualMachine
  143. fields = (
  144. 'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'primary_ip4',
  145. 'primary_ip6', 'primary_ip', 'tags',
  146. )
  147. default_columns = (
  148. 'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk', 'primary_ip',
  149. )
  150. #
  151. # VM components
  152. #
  153. class InterfaceTable(BaseTable):
  154. class Meta(BaseTable.Meta):
  155. model = Interface
  156. fields = ('name', 'enabled', 'description')