bulk_import.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. from dcim.choices import InterfaceModeChoices
  2. from dcim.models import DeviceRole, Platform, Site
  3. from extras.forms import CustomFieldModelCSVForm
  4. from tenancy.models import Tenant
  5. from utilities.forms import CSVChoiceField, CSVModelChoiceField, SlugField
  6. from virtualization.choices import *
  7. from virtualization.models import *
  8. __all__ = (
  9. 'ClusterCSVForm',
  10. 'ClusterGroupCSVForm',
  11. 'ClusterTypeCSVForm',
  12. 'VirtualMachineCSVForm',
  13. 'VMInterfaceCSVForm',
  14. )
  15. class ClusterTypeCSVForm(CustomFieldModelCSVForm):
  16. slug = SlugField()
  17. class Meta:
  18. model = ClusterType
  19. fields = ('name', 'slug', 'description')
  20. class ClusterGroupCSVForm(CustomFieldModelCSVForm):
  21. slug = SlugField()
  22. class Meta:
  23. model = ClusterGroup
  24. fields = ('name', 'slug', 'description')
  25. class ClusterCSVForm(CustomFieldModelCSVForm):
  26. type = CSVModelChoiceField(
  27. queryset=ClusterType.objects.all(),
  28. to_field_name='name',
  29. help_text='Type of cluster'
  30. )
  31. group = CSVModelChoiceField(
  32. queryset=ClusterGroup.objects.all(),
  33. to_field_name='name',
  34. required=False,
  35. help_text='Assigned cluster group'
  36. )
  37. site = CSVModelChoiceField(
  38. queryset=Site.objects.all(),
  39. to_field_name='name',
  40. required=False,
  41. help_text='Assigned site'
  42. )
  43. tenant = CSVModelChoiceField(
  44. queryset=Tenant.objects.all(),
  45. to_field_name='name',
  46. required=False,
  47. help_text='Assigned tenant'
  48. )
  49. class Meta:
  50. model = Cluster
  51. fields = ('name', 'type', 'group', 'site', 'comments')
  52. class VirtualMachineCSVForm(CustomFieldModelCSVForm):
  53. status = CSVChoiceField(
  54. choices=VirtualMachineStatusChoices,
  55. help_text='Operational status of device'
  56. )
  57. cluster = CSVModelChoiceField(
  58. queryset=Cluster.objects.all(),
  59. to_field_name='name',
  60. help_text='Assigned cluster'
  61. )
  62. role = CSVModelChoiceField(
  63. queryset=DeviceRole.objects.filter(
  64. vm_role=True
  65. ),
  66. required=False,
  67. to_field_name='name',
  68. help_text='Functional role'
  69. )
  70. tenant = CSVModelChoiceField(
  71. queryset=Tenant.objects.all(),
  72. required=False,
  73. to_field_name='name',
  74. help_text='Assigned tenant'
  75. )
  76. platform = CSVModelChoiceField(
  77. queryset=Platform.objects.all(),
  78. required=False,
  79. to_field_name='name',
  80. help_text='Assigned platform'
  81. )
  82. class Meta:
  83. model = VirtualMachine
  84. fields = (
  85. 'name', 'status', 'role', 'cluster', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments',
  86. )
  87. class VMInterfaceCSVForm(CustomFieldModelCSVForm):
  88. virtual_machine = CSVModelChoiceField(
  89. queryset=VirtualMachine.objects.all(),
  90. to_field_name='name'
  91. )
  92. parent = CSVModelChoiceField(
  93. queryset=VMInterface.objects.all(),
  94. required=False,
  95. to_field_name='name',
  96. help_text='Parent interface'
  97. )
  98. bridge = CSVModelChoiceField(
  99. queryset=VMInterface.objects.all(),
  100. required=False,
  101. to_field_name='name',
  102. help_text='Bridged interface'
  103. )
  104. mode = CSVChoiceField(
  105. choices=InterfaceModeChoices,
  106. required=False,
  107. help_text='IEEE 802.1Q operational mode (for L2 interfaces)'
  108. )
  109. class Meta:
  110. model = VMInterface
  111. fields = (
  112. 'virtual_machine', 'name', 'parent', 'bridge', 'enabled', 'mac_address', 'mtu', 'description', 'mode',
  113. )
  114. def clean_enabled(self):
  115. # Make sure enabled is True when it's not included in the uploaded data
  116. if 'enabled' not in self.data:
  117. return True
  118. else:
  119. return self.cleaned_data['enabled']