nautobot 2.0.0a3__py3-none-any.whl → 2.0.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (780) hide show
  1. nautobot/apps/api.py +6 -8
  2. nautobot/apps/forms.py +0 -2
  3. nautobot/apps/ui.py +0 -8
  4. nautobot/circuits/api/serializers.py +9 -117
  5. nautobot/circuits/api/urls.py +1 -1
  6. nautobot/circuits/api/views.py +0 -1
  7. nautobot/circuits/forms.py +0 -65
  8. nautobot/circuits/migrations/0014_related_name_changes.py +1 -1
  9. nautobot/circuits/migrations/0016_tagsfield.py +34 -0
  10. nautobot/circuits/migrations/0017_fixup_null_statuses.py +22 -0
  11. nautobot/circuits/migrations/0018_status_nonnullable.py +22 -0
  12. nautobot/circuits/models.py +3 -87
  13. nautobot/circuits/navigation.py +14 -69
  14. nautobot/circuits/signals.py +0 -2
  15. nautobot/circuits/tables.py +39 -1
  16. nautobot/circuits/tests/integration/test_relationships.py +9 -9
  17. nautobot/circuits/tests/test_api.py +4 -8
  18. nautobot/circuits/tests/test_filters.py +10 -4
  19. nautobot/circuits/tests/test_models.py +5 -1
  20. nautobot/circuits/tests/test_views.py +27 -5
  21. nautobot/circuits/views.py +18 -10
  22. nautobot/core/api/__init__.py +8 -2
  23. nautobot/core/api/fields.py +15 -6
  24. nautobot/core/api/filter_backends.py +3 -2
  25. nautobot/core/api/metadata.py +237 -30
  26. nautobot/core/api/mixins.py +94 -0
  27. nautobot/core/api/pagination.py +4 -0
  28. nautobot/core/api/parsers.py +154 -0
  29. nautobot/core/api/renderers.py +153 -2
  30. nautobot/core/api/schema.py +46 -2
  31. nautobot/core/api/serializers.py +377 -35
  32. nautobot/core/api/urls.py +11 -3
  33. nautobot/core/api/utils.py +174 -2
  34. nautobot/core/api/versioning.py +32 -10
  35. nautobot/core/api/views.py +266 -72
  36. nautobot/core/apps/__init__.py +138 -220
  37. nautobot/core/celery/__init__.py +112 -41
  38. nautobot/core/celery/backends.py +19 -12
  39. nautobot/core/celery/control.py +46 -0
  40. nautobot/core/celery/encoders.py +53 -0
  41. nautobot/core/celery/log.py +38 -0
  42. nautobot/core/celery/schedulers.py +23 -4
  43. nautobot/core/celery/task.py +1 -16
  44. nautobot/core/checks.py +0 -27
  45. nautobot/core/choices.py +0 -113
  46. nautobot/core/{cli.py → cli/__init__.py} +1 -1
  47. nautobot/core/cli/__main__.py +3 -0
  48. nautobot/core/constants.py +0 -24
  49. nautobot/core/context_processors.py +12 -0
  50. nautobot/core/filters.py +2 -2
  51. nautobot/core/forms/__init__.py +0 -4
  52. nautobot/core/forms/fields.py +38 -65
  53. nautobot/core/forms/forms.py +4 -1
  54. nautobot/core/forms/utils.py +0 -52
  55. nautobot/core/graphql/schema.py +4 -27
  56. nautobot/core/jobs/__init__.py +75 -0
  57. nautobot/core/management/commands/build_ui.py +255 -0
  58. nautobot/core/management/commands/generate_test_data.py +3 -2
  59. nautobot/core/management/commands/post_upgrade.py +24 -24
  60. nautobot/core/models/__init__.py +26 -1
  61. nautobot/core/models/fields.py +24 -5
  62. nautobot/core/models/generics.py +2 -42
  63. nautobot/core/models/managers.py +5 -0
  64. nautobot/core/models/name_color_content_types.py +0 -14
  65. nautobot/core/models/tree_queries.py +14 -4
  66. nautobot/core/models/utils.py +5 -6
  67. nautobot/core/models/validators.py +17 -8
  68. nautobot/core/releases.py +8 -10
  69. nautobot/core/settings.py +80 -42
  70. nautobot/core/tables.py +5 -5
  71. nautobot/core/tasks.py +4 -7
  72. nautobot/core/templates/base.html +1 -49
  73. nautobot/core/templates/base_django.html +49 -0
  74. nautobot/core/templates/base_react.html +55 -0
  75. nautobot/core/templates/buttons/export.html +6 -4
  76. nautobot/core/templates/generic/object_bulk_create.html +10 -21
  77. nautobot/core/templates/generic/object_list.html +3 -1
  78. nautobot/core/templates/generic/object_retrieve_plugin_full_width.html +3 -0
  79. nautobot/core/templates/inc/footer.html +1 -0
  80. nautobot/core/templates/inc/javascript.html +0 -14
  81. nautobot/core/templates/inc/nav_menu.html +28 -33
  82. nautobot/core/templates/inc/object_details_advanced_panel.html +13 -0
  83. nautobot/core/templates/inc/relationships_table_rows.html +2 -2
  84. nautobot/core/templates/nautobot_config.py.j2 +8 -20
  85. nautobot/core/templates/plugin_template/__init__.py-tpl +1 -2
  86. nautobot/core/templates/rest_framework/api.html +8 -0
  87. nautobot/core/templatetags/buttons.py +32 -28
  88. nautobot/core/testing/__init__.py +47 -44
  89. nautobot/core/testing/api.py +362 -47
  90. nautobot/core/testing/filters.py +1 -1
  91. nautobot/core/testing/migrations.py +2 -0
  92. nautobot/core/testing/mixins.py +22 -9
  93. nautobot/core/testing/schema.py +2 -1
  94. nautobot/core/testing/views.py +21 -46
  95. nautobot/core/tests/integration/test_filters.py +17 -8
  96. nautobot/core/tests/integration/test_navbar.py +11 -34
  97. nautobot/core/tests/integration/test_plugin_navbar.py +9 -103
  98. nautobot/core/tests/nautobot_config.py +2 -3
  99. nautobot/core/tests/test_api.py +290 -21
  100. nautobot/core/tests/test_checks.py +0 -7
  101. nautobot/core/tests/test_filters.py +107 -59
  102. nautobot/core/tests/test_forms.py +26 -92
  103. nautobot/core/tests/test_graphql.py +110 -77
  104. nautobot/core/tests/test_logging.py +4 -0
  105. nautobot/core/tests/test_managers.py +3 -1
  106. nautobot/core/tests/test_models.py +2 -0
  107. nautobot/core/tests/test_paginator.py +3 -1
  108. nautobot/core/tests/test_releases.py +12 -12
  109. nautobot/core/tests/test_templatetags_helpers.py +4 -4
  110. nautobot/core/tests/test_utils.py +32 -68
  111. nautobot/core/tests/test_views.py +12 -15
  112. nautobot/core/utils/data.py +17 -0
  113. nautobot/core/utils/deprecation.py +9 -6
  114. nautobot/core/utils/filtering.py +8 -3
  115. nautobot/core/utils/git.py +12 -4
  116. nautobot/core/utils/lookup.py +3 -1
  117. nautobot/core/utils/requests.py +1 -104
  118. nautobot/core/views/__init__.py +1 -0
  119. nautobot/core/views/generic.py +75 -110
  120. nautobot/core/views/mixins.py +52 -61
  121. nautobot/core/views/renderers.py +6 -7
  122. nautobot/core/views/utils.py +80 -0
  123. nautobot/dcim/api/serializers.py +160 -667
  124. nautobot/dcim/api/urls.py +1 -1
  125. nautobot/dcim/api/views.py +7 -44
  126. nautobot/dcim/choices.py +2 -0
  127. nautobot/dcim/filters/__init__.py +21 -0
  128. nautobot/dcim/form_mixins.py +1 -27
  129. nautobot/dcim/forms.py +19 -765
  130. nautobot/dcim/migrations/0024_alter_device_and_rack_role_add_new_role.py +2 -1
  131. nautobot/dcim/migrations/0025_device_and_rack_roles_data_migrations.py +19 -13
  132. nautobot/dcim/migrations/0027_remove_device_role_and_rack_role.py +1 -1
  133. nautobot/dcim/migrations/0028_rename_foreignkey_fields.py +1 -1
  134. nautobot/dcim/migrations/0030_migrate_region_and_site_data_to_locations.py +2 -2
  135. nautobot/dcim/migrations/0035_related_name_changes.py +1 -1
  136. nautobot/dcim/migrations/0036_remove_region_and_site.py +1 -1
  137. nautobot/dcim/migrations/0040_tagsfield.py +109 -0
  138. nautobot/dcim/migrations/{0040_ipam__namespaces.py → 0041_ipam__namespaces.py} +1 -1
  139. nautobot/dcim/migrations/0042_fixup_null_statuses.py +51 -0
  140. nautobot/dcim/migrations/0043_status_nonnullable.py +72 -0
  141. nautobot/dcim/models/cables.py +3 -33
  142. nautobot/dcim/models/device_component_templates.py +6 -0
  143. nautobot/dcim/models/device_components.py +12 -198
  144. nautobot/dcim/models/devices.py +30 -143
  145. nautobot/dcim/models/locations.py +3 -64
  146. nautobot/dcim/models/power.py +3 -50
  147. nautobot/dcim/models/racks.py +7 -84
  148. nautobot/dcim/navigation.py +141 -467
  149. nautobot/dcim/signals.py +0 -2
  150. nautobot/dcim/tables/locations.py +2 -2
  151. nautobot/dcim/tables/power.py +1 -2
  152. nautobot/dcim/templates/dcim/console_port_connection_list.html +7 -0
  153. nautobot/dcim/templates/dcim/devicetype.html +2 -2
  154. nautobot/dcim/templates/dcim/interface_connection_list.html +7 -0
  155. nautobot/dcim/templates/dcim/location.html +16 -1
  156. nautobot/dcim/templates/dcim/locationtype.html +15 -0
  157. nautobot/dcim/templates/dcim/power_port_connection_list.html +7 -0
  158. nautobot/dcim/templates/dcim/rackgroup.html +0 -12
  159. nautobot/dcim/tests/test_api.py +166 -81
  160. nautobot/dcim/tests/test_cablepaths.py +41 -35
  161. nautobot/dcim/tests/test_filters.py +67 -23
  162. nautobot/dcim/tests/test_forms.py +5 -205
  163. nautobot/dcim/tests/test_graphql.py +7 -2
  164. nautobot/dcim/tests/test_migrations.py +6 -11
  165. nautobot/dcim/tests/test_models.py +182 -110
  166. nautobot/dcim/tests/test_natural_ordering.py +11 -8
  167. nautobot/dcim/tests/test_signals.py +6 -3
  168. nautobot/dcim/tests/test_views.py +197 -175
  169. nautobot/dcim/urls.py +11 -16
  170. nautobot/dcim/views.py +7 -134
  171. nautobot/docs/additional-features/caching.md +6 -87
  172. nautobot/docs/additional-features/job-scheduling-and-approvals.md +3 -0
  173. nautobot/docs/additional-features/jobs.md +177 -195
  174. nautobot/docs/administration/nautobot-server.md +6 -21
  175. nautobot/docs/administration/replicating-nautobot.md +0 -10
  176. nautobot/docs/configuration/optional-settings.md +32 -41
  177. nautobot/docs/configuration/required-settings.md +11 -52
  178. nautobot/docs/development/application-registry.md +2 -13
  179. nautobot/docs/development/extending-models.md +15 -17
  180. nautobot/docs/development/generic-views.md +0 -2
  181. nautobot/docs/development/getting-started.md +55 -5
  182. nautobot/docs/development/navigation-menu.md +22 -93
  183. nautobot/docs/development/react-ui.md +105 -0
  184. nautobot/docs/development/role-internals.md +1 -3
  185. nautobot/docs/development/style-guide.md +6 -4
  186. nautobot/docs/index.md +3 -2
  187. nautobot/docs/installation/migrating-from-netbox.md +11 -42
  188. nautobot/docs/installation/nautobot.md +1 -1
  189. nautobot/docs/installation/tables/v2-api-behavior-changes.yaml +70 -0
  190. nautobot/docs/installation/tables/v2-api-removed-fields.yaml +142 -0
  191. nautobot/docs/installation/tables/v2-api-renamed-fields.yaml +124 -0
  192. nautobot/docs/installation/tables/v2-code-location-changes.yaml +241 -0
  193. nautobot/docs/installation/tables/v2-code-removals.yaml +67 -0
  194. nautobot/docs/installation/tables/v2-database-behavior-changes.yaml +37 -0
  195. nautobot/docs/installation/tables/v2-database-removed-fields.yaml +166 -0
  196. nautobot/docs/installation/tables/v2-database-renamed-fields.yaml +340 -0
  197. nautobot/docs/installation/tables/v2-filters-corrected-fields.yaml +28 -0
  198. nautobot/docs/installation/tables/v2-filters-enhanced-fields.yaml +241 -0
  199. nautobot/docs/installation/tables/v2-filters-removed-fields.yaml +553 -0
  200. nautobot/docs/installation/tables/v2-filters-renamed-fields.yaml +223 -0
  201. nautobot/docs/installation/tables/v2-logging-renamed-loggers.yaml +23 -0
  202. nautobot/docs/installation/upgrading-from-nautobot-v1.md +170 -747
  203. nautobot/docs/models/dcim/device.md +3 -0
  204. nautobot/docs/models/dcim/deviceredundancygroup.md +3 -3
  205. nautobot/docs/models/extras/computedfield.md +4 -4
  206. nautobot/docs/models/extras/gitrepository.md +3 -0
  207. nautobot/docs/models/extras/job.md +1 -0
  208. nautobot/docs/models/extras/jobbutton.md +18 -13
  209. nautobot/docs/models/extras/jobhook.md +7 -4
  210. nautobot/docs/models/extras/jobresult.md +6 -2
  211. nautobot/docs/models/extras/relationship.md +2 -2
  212. nautobot/docs/models/extras/status.md +6 -19
  213. nautobot/docs/models/ipam/ipaddress.md +3 -0
  214. nautobot/docs/models/virtualization/virtualmachine.md +3 -0
  215. nautobot/docs/plugins/development.md +83 -21
  216. nautobot/docs/release-notes/version-1.5.md +53 -0
  217. nautobot/docs/release-notes/version-2.0.md +180 -0
  218. nautobot/docs/requirements.txt +1 -0
  219. nautobot/docs/rest-api/overview.md +384 -215
  220. nautobot/docs/rest-api/ui-related-endpoints.md +9 -0
  221. nautobot/extras/admin.py +3 -5
  222. nautobot/extras/api/customfields.py +15 -39
  223. nautobot/extras/api/fields.py +0 -11
  224. nautobot/extras/api/mixins.py +45 -0
  225. nautobot/extras/api/relationships.py +63 -158
  226. nautobot/extras/api/serializers.py +165 -700
  227. nautobot/extras/api/urls.py +1 -1
  228. nautobot/extras/api/views.py +294 -280
  229. nautobot/extras/apps.py +4 -7
  230. nautobot/extras/choices.py +11 -9
  231. nautobot/extras/constants.py +9 -3
  232. nautobot/extras/datasources/__init__.py +2 -0
  233. nautobot/extras/datasources/git.py +135 -186
  234. nautobot/extras/datasources/registry.py +25 -35
  235. nautobot/extras/filters/__init__.py +20 -19
  236. nautobot/extras/filters/mixins.py +4 -4
  237. nautobot/extras/forms/forms.py +63 -127
  238. nautobot/extras/forms/mixins.py +23 -51
  239. nautobot/extras/health_checks.py +0 -33
  240. nautobot/extras/jobs.py +387 -565
  241. nautobot/extras/management/commands/runjob.py +24 -62
  242. nautobot/extras/managers.py +30 -7
  243. nautobot/extras/migrations/0058_jobresult_add_time_status_idxs.py +38 -0
  244. nautobot/extras/migrations/{0058_joblogentry_scheduledjob_webhook_data_migration.py → 0059_joblogentry_scheduledjob_webhook_data_migration.py} +1 -1
  245. nautobot/extras/migrations/{0059_alter_joblogentry_scheduledjob_webhook_fields.py → 0060_alter_joblogentry_scheduledjob_webhook_fields.py} +1 -1
  246. nautobot/extras/migrations/{0060_role_and_alter_status.py → 0061_role_and_alter_status.py} +1 -7
  247. nautobot/extras/migrations/{0061_collect_roles_from_related_apps_roles.py → 0062_collect_roles_from_related_apps_roles.py} +33 -32
  248. nautobot/extras/migrations/{0062_alter_role_options.py → 0063_alter_role_options.py} +1 -1
  249. nautobot/extras/migrations/{0063_alter_configcontext_and_add_new_role.py → 0064_alter_configcontext_and_add_new_role.py} +1 -1
  250. nautobot/extras/migrations/0065_configcontext_data_migrations.py +44 -0
  251. nautobot/extras/migrations/{0065_rename_configcontext_role.py → 0066_rename_configcontext_role.py} +1 -1
  252. nautobot/extras/migrations/{0066_jobresult__add_celery_fields.py → 0067_jobresult__add_celery_fields.py} +36 -2
  253. nautobot/extras/migrations/{0067_created_datetime.py → 0068_created_datetime.py} +1 -1
  254. nautobot/extras/migrations/{0068_remove_site_and_region_attributes_from_config_context.py → 0069_remove_site_and_region_attributes_from_config_context.py} +1 -1
  255. nautobot/extras/migrations/{0069_replace_related_names.py → 0070_replace_related_names.py} +1 -1
  256. nautobot/extras/migrations/{0070_rename_model_fields.py → 0071_rename_model_fields.py} +1 -1
  257. nautobot/extras/migrations/0072_job__unique_name_data_migration.py +86 -0
  258. nautobot/extras/migrations/{0072_job__unique_name.py → 0073_job__unique_name.py} +13 -9
  259. nautobot/extras/migrations/{0073_remove_gitrepository_fields.py → 0074_remove_gitrepository_fields.py} +1 -1
  260. nautobot/extras/migrations/{0074_rename_slug_to_key_for_custom_field.py → 0075_rename_slug_to_key_for_custom_field.py} +1 -1
  261. nautobot/extras/migrations/{0075_migrate_custom_field_data.py → 0076_migrate_custom_field_data.py} +1 -1
  262. nautobot/extras/migrations/{0076_remove_name_field_and_make_label_field_non_nullable.py → 0077_remove_name_field_and_make_label_field_non_nullable.py} +1 -1
  263. nautobot/extras/migrations/{0077_remove_slug.py → 0078_remove_slug.py} +1 -5
  264. nautobot/extras/migrations/0079_tagsfield.py +28 -0
  265. nautobot/extras/migrations/0080_rename_relationship_slug_to_key.py +17 -0
  266. nautobot/extras/migrations/0081_rename_relationship_name_to_label.py +29 -0
  267. nautobot/extras/migrations/0082_ensure_relationship_keys_are_unique.py +43 -0
  268. nautobot/extras/migrations/0083_rename_computed_field_slug_to_key.py +21 -0
  269. nautobot/extras/migrations/0084_taggeditem_cleanup.py +43 -0
  270. nautobot/extras/migrations/0085_taggeditem_uniqueness.py +22 -0
  271. nautobot/extras/migrations/0086_job__celery_task_fields__dryrun_support.py +81 -0
  272. nautobot/extras/migrations/0087_job__commit_default_data_migration.py +26 -0
  273. nautobot/extras/migrations/0088_joblogentry__log_level_default.py +17 -0
  274. nautobot/extras/migrations/0089_joblogentry__log_level_data_migration.py +34 -0
  275. nautobot/extras/migrations/0090_scheduledjob__data_migration.py +57 -0
  276. nautobot/extras/models/__init__.py +2 -3
  277. nautobot/extras/models/change_logging.py +0 -36
  278. nautobot/extras/models/customfields.py +39 -33
  279. nautobot/extras/models/datasources.py +48 -50
  280. nautobot/extras/models/groups.py +5 -6
  281. nautobot/extras/models/jobs.py +189 -321
  282. nautobot/extras/models/mixins.py +0 -71
  283. nautobot/extras/models/models.py +0 -19
  284. nautobot/extras/models/relationships.py +19 -13
  285. nautobot/extras/models/roles.py +0 -34
  286. nautobot/extras/models/secrets.py +2 -26
  287. nautobot/extras/models/statuses.py +6 -5
  288. nautobot/extras/models/tags.py +2 -17
  289. nautobot/extras/navigation.py +89 -307
  290. nautobot/extras/plugins/__init__.py +3 -120
  291. nautobot/extras/plugins/utils.py +0 -3
  292. nautobot/extras/plugins/validators.py +5 -4
  293. nautobot/extras/plugins/views.py +16 -3
  294. nautobot/extras/querysets.py +1 -7
  295. nautobot/extras/registry.py +3 -0
  296. nautobot/extras/signals.py +26 -60
  297. nautobot/extras/tables.py +34 -40
  298. nautobot/extras/tasks.py +0 -12
  299. nautobot/extras/templates/extras/configcontext.html +1 -1
  300. nautobot/extras/templates/extras/configcontextschema.html +16 -1
  301. nautobot/extras/templates/extras/customfield.html +0 -13
  302. nautobot/extras/templates/extras/gitrepository.html +3 -3
  303. nautobot/extras/templates/extras/inc/jobresult.html +10 -0
  304. nautobot/extras/templates/extras/inc/panel_jobhistory.html +1 -1
  305. nautobot/extras/templates/extras/job.html +35 -25
  306. nautobot/extras/templates/extras/job_approval_request.html +15 -30
  307. nautobot/extras/templates/extras/job_detail.html +13 -31
  308. nautobot/extras/templates/extras/job_edit.html +15 -17
  309. nautobot/extras/templates/extras/jobresult.html +24 -6
  310. nautobot/extras/templates/extras/scheduledjob.html +2 -2
  311. nautobot/extras/templates/extras/secret.html +28 -0
  312. nautobot/extras/templatetags/job_buttons.py +1 -0
  313. nautobot/extras/{tests/example_jobs → test_jobs}/api_test_job.py +13 -6
  314. nautobot/extras/test_jobs/atomic_transaction.py +53 -0
  315. nautobot/extras/test_jobs/dry_run.py +29 -0
  316. nautobot/extras/{tests/example_jobs/test_duplicate_name.py → test_jobs/duplicate_name.py} +4 -0
  317. nautobot/extras/test_jobs/duplicate_name2.py +9 -0
  318. nautobot/extras/test_jobs/fail.py +23 -0
  319. nautobot/extras/{tests/example_jobs/test_field_default.py → test_jobs/field_default.py} +4 -0
  320. nautobot/extras/{tests/example_jobs/test_field_order.py → test_jobs/field_order.py} +4 -0
  321. nautobot/extras/{tests/example_jobs/test_file_upload_fail.py → test_jobs/file_upload_fail.py} +11 -6
  322. nautobot/extras/test_jobs/file_upload_pass.py +25 -0
  323. nautobot/extras/test_jobs/has_sensitive_variables.py +25 -0
  324. nautobot/extras/test_jobs/ipaddress_vars.py +66 -0
  325. nautobot/extras/test_jobs/job_button_receiver.py +28 -0
  326. nautobot/extras/test_jobs/job_hook_receiver.py +29 -0
  327. nautobot/extras/test_jobs/job_variables.py +88 -0
  328. nautobot/extras/test_jobs/location_with_custom_field.py +45 -0
  329. nautobot/extras/test_jobs/log_redaction.py +20 -0
  330. nautobot/extras/test_jobs/log_skip_db_logging.py +17 -0
  331. nautobot/extras/test_jobs/modify_db.py +25 -0
  332. nautobot/extras/{tests/example_jobs/test_no_field_order.py → test_jobs/no_field_order.py} +4 -0
  333. nautobot/extras/test_jobs/object_var_optional.py +21 -0
  334. nautobot/extras/test_jobs/object_var_required.py +21 -0
  335. nautobot/extras/test_jobs/object_vars.py +26 -0
  336. nautobot/extras/test_jobs/pass.py +25 -0
  337. nautobot/extras/test_jobs/profiling.py +32 -0
  338. nautobot/extras/test_jobs/read_only_job.py +15 -0
  339. nautobot/extras/{tests/example_jobs/test_required_args.py → test_jobs/required_args.py} +4 -0
  340. nautobot/extras/{tests/example_jobs/test_soft_time_limit_greater_than_time_limit.py → test_jobs/soft_time_limit_greater_than_time_limit.py} +5 -1
  341. nautobot/extras/{tests/example_jobs/test_task_queues.py → test_jobs/task_queues.py} +5 -1
  342. nautobot/extras/tests/integration/test_computedfields.py +1 -1
  343. nautobot/extras/tests/integration/test_configcontextschema.py +5 -3
  344. nautobot/extras/tests/integration/test_customfields.py +4 -2
  345. nautobot/extras/tests/integration/test_dynamicgroups.py +1 -1
  346. nautobot/extras/tests/integration/test_jobs.py +25 -27
  347. nautobot/extras/tests/integration/test_notes.py +8 -4
  348. nautobot/extras/tests/integration/test_relationships.py +2 -2
  349. nautobot/extras/tests/test_api.py +649 -642
  350. nautobot/extras/tests/test_changelog.py +3 -3
  351. nautobot/extras/tests/test_context_managers.py +5 -3
  352. nautobot/extras/tests/test_customfields.py +92 -50
  353. nautobot/extras/tests/test_datasources.py +189 -112
  354. nautobot/extras/tests/test_dynamicgroups.py +7 -8
  355. nautobot/extras/tests/test_filters.py +137 -89
  356. nautobot/extras/tests/test_forms.py +73 -75
  357. nautobot/extras/tests/{test_scripts.py → test_job_variables.py} +43 -49
  358. nautobot/extras/tests/test_jobs.py +262 -263
  359. nautobot/extras/tests/test_migrations.py +4 -3
  360. nautobot/extras/tests/test_models.py +116 -161
  361. nautobot/extras/tests/test_plugins.py +38 -60
  362. nautobot/extras/tests/test_relationships.py +167 -120
  363. nautobot/extras/tests/test_tags.py +6 -11
  364. nautobot/extras/tests/test_utils.py +31 -1
  365. nautobot/extras/tests/test_views.py +201 -145
  366. nautobot/extras/tests/test_webhooks.py +6 -2
  367. nautobot/extras/urls.py +42 -42
  368. nautobot/extras/utils.py +137 -163
  369. nautobot/extras/views.py +78 -152
  370. nautobot/ipam/api/fields.py +17 -0
  371. nautobot/ipam/api/serializers.py +58 -164
  372. nautobot/ipam/api/urls.py +1 -1
  373. nautobot/ipam/api/views.py +3 -2
  374. nautobot/ipam/apps.py +1 -2
  375. nautobot/ipam/filters.py +1 -10
  376. nautobot/ipam/forms.py +4 -177
  377. nautobot/ipam/lookups.py +1 -0
  378. nautobot/ipam/management/commands/__init__.py +0 -0
  379. nautobot/ipam/management/commands/fix_prefix_broadcast.py +17 -0
  380. nautobot/ipam/migrations/0010_alter_ipam_role_add_new_role.py +1 -1
  381. nautobot/ipam/migrations/0011_migrate_ipam_role_data.py +32 -38
  382. nautobot/ipam/migrations/0020_related_name_changes.py +1 -1
  383. nautobot/ipam/migrations/0022_aggregate_to_prefix_data_migration.py +2 -2
  384. nautobot/ipam/migrations/0028_tagsfield.py +44 -0
  385. nautobot/ipam/migrations/0029_ip_address_to_interface_uniqueness_constraints.py +18 -0
  386. nautobot/ipam/migrations/{0028_ipam__namespaces.py → 0030_ipam__namespaces.py} +77 -28
  387. nautobot/ipam/migrations/0031_ipam__prefix__add_parent.py +58 -0
  388. nautobot/ipam/migrations/0032_ipam__namespaces_finish.py +63 -0
  389. nautobot/ipam/migrations/0033_fixup_null_statuses.py +26 -0
  390. nautobot/ipam/migrations/0034_status_nonnullable.py +36 -0
  391. nautobot/ipam/models.py +100 -236
  392. nautobot/ipam/navigation.py +36 -181
  393. nautobot/ipam/querysets.py +20 -25
  394. nautobot/ipam/signals.py +49 -6
  395. nautobot/ipam/tables.py +10 -3
  396. nautobot/ipam/templates/ipam/namespace_ipaddresses.html +11 -0
  397. nautobot/ipam/templates/ipam/namespace_prefixes.html +11 -0
  398. nautobot/ipam/templates/ipam/namespace_retrieve.html +17 -4
  399. nautobot/ipam/templates/ipam/namespace_vrfs.html +11 -0
  400. nautobot/ipam/templates/ipam/prefix.html +1 -1
  401. nautobot/ipam/templates/ipam/vlangroup.html +0 -13
  402. nautobot/ipam/templates/ipam/vrf_edit.html +6 -0
  403. nautobot/ipam/tests/integration/test_prefixes.py +3 -26
  404. nautobot/ipam/tests/test_api.py +22 -19
  405. nautobot/ipam/tests/test_filters.py +59 -23
  406. nautobot/ipam/tests/test_migrations.py +6 -10
  407. nautobot/ipam/tests/test_models.py +323 -198
  408. nautobot/ipam/tests/test_ordering.py +2 -2
  409. nautobot/ipam/tests/test_querysets.py +44 -24
  410. nautobot/ipam/tests/test_views.py +73 -26
  411. nautobot/ipam/urls.py +16 -0
  412. nautobot/ipam/{utils.py → utils/__init__.py} +2 -2
  413. nautobot/ipam/utils/migrations.py +713 -0
  414. nautobot/ipam/views.py +137 -20
  415. nautobot/project-static/docs/404.html +1178 -10
  416. nautobot/project-static/docs/additional-features/caching.html +1224 -159
  417. nautobot/project-static/docs/additional-features/change-logging.html +1180 -12
  418. nautobot/project-static/docs/additional-features/config-contexts.html +1180 -12
  419. nautobot/project-static/docs/additional-features/graphql.html +1179 -11
  420. nautobot/project-static/docs/additional-features/healthcheck.html +1180 -12
  421. nautobot/project-static/docs/additional-features/job-scheduling-and-approvals.html +1184 -12
  422. nautobot/project-static/docs/additional-features/jobs.html +1514 -328
  423. nautobot/project-static/docs/additional-features/napalm.html +1180 -12
  424. nautobot/project-static/docs/additional-features/prometheus-metrics.html +1180 -12
  425. nautobot/project-static/docs/additional-features/template-filters.html +1180 -12
  426. nautobot/project-static/docs/administration/celery-queues.html +1178 -10
  427. nautobot/project-static/docs/administration/nautobot-server.html +1451 -304
  428. nautobot/project-static/docs/administration/nautobot-shell.html +1178 -10
  429. nautobot/project-static/docs/administration/permissions.html +1178 -10
  430. nautobot/project-static/docs/administration/replicating-nautobot.html +1262 -113
  431. nautobot/project-static/docs/apps/index.html +1178 -10
  432. nautobot/project-static/docs/apps/nautobot-apps.html +1178 -10
  433. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +1580 -426
  434. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +1178 -10
  435. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +3481 -1838
  436. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +1178 -10
  437. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +1178 -10
  438. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +1185 -11
  439. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +1719 -551
  440. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +2062 -930
  441. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +1946 -659
  442. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +1180 -12
  443. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1189 -21
  444. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +9283 -6218
  445. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +2734 -2122
  446. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +1178 -10
  447. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +2337 -1300
  448. nautobot/project-static/docs/configuration/authentication/ldap.html +1178 -10
  449. nautobot/project-static/docs/configuration/authentication/remote.html +1178 -10
  450. nautobot/project-static/docs/configuration/authentication/sso.html +1178 -10
  451. nautobot/project-static/docs/configuration/index.html +1178 -10
  452. nautobot/project-static/docs/configuration/optional-settings.html +1311 -160
  453. nautobot/project-static/docs/configuration/required-settings.html +1312 -211
  454. nautobot/project-static/docs/core-functionality/circuits.html +1178 -10
  455. nautobot/project-static/docs/core-functionality/device-types.html +1178 -10
  456. nautobot/project-static/docs/core-functionality/devices.html +1182 -10
  457. nautobot/project-static/docs/core-functionality/ipam.html +1182 -10
  458. nautobot/project-static/docs/core-functionality/power.html +1178 -10
  459. nautobot/project-static/docs/core-functionality/secrets.html +1178 -10
  460. nautobot/project-static/docs/core-functionality/services.html +1178 -10
  461. nautobot/project-static/docs/core-functionality/sites-and-racks.html +1178 -10
  462. nautobot/project-static/docs/core-functionality/tenancy.html +1178 -10
  463. nautobot/project-static/docs/core-functionality/virtualization.html +1182 -10
  464. nautobot/project-static/docs/core-functionality/vlans.html +1179 -11
  465. nautobot/project-static/docs/development/application-registry.html +1190 -42
  466. nautobot/project-static/docs/development/best-practices.html +1178 -10
  467. nautobot/project-static/docs/development/docker-compose-advanced-use-cases.html +1178 -10
  468. nautobot/project-static/docs/development/extending-models.html +1238 -83
  469. nautobot/project-static/docs/development/generic-views.html +1180 -14
  470. nautobot/project-static/docs/development/getting-started.html +1365 -90
  471. nautobot/project-static/docs/development/homepage.html +1178 -10
  472. nautobot/project-static/docs/development/index.html +1178 -10
  473. nautobot/project-static/docs/development/model-features.html +1178 -10
  474. nautobot/project-static/docs/development/natural-keys.html +1178 -10
  475. nautobot/project-static/docs/development/navigation-menu.html +1215 -125
  476. nautobot/project-static/docs/development/react-ui.html +4199 -0
  477. nautobot/project-static/docs/development/release-checklist.html +1178 -10
  478. nautobot/project-static/docs/development/role-internals.html +1179 -12
  479. nautobot/project-static/docs/development/style-guide.html +1188 -19
  480. nautobot/project-static/docs/development/templates.html +1178 -10
  481. nautobot/project-static/docs/development/testing.html +1178 -10
  482. nautobot/project-static/docs/development/user-preferences.html +1178 -10
  483. nautobot/project-static/docs/docker/index.html +1178 -10
  484. nautobot/project-static/docs/index.html +1183 -12
  485. nautobot/project-static/docs/installation/centos.html +1178 -10
  486. nautobot/project-static/docs/installation/external-authentication.html +1178 -10
  487. nautobot/project-static/docs/installation/http-server.html +1178 -10
  488. nautobot/project-static/docs/installation/index.html +1178 -10
  489. nautobot/project-static/docs/installation/migrating-from-netbox.html +1305 -189
  490. nautobot/project-static/docs/installation/migrating-from-postgresql.html +1178 -10
  491. nautobot/project-static/docs/installation/nautobot.html +1179 -11
  492. nautobot/project-static/docs/installation/region-and-site-data-migration-guide.html +1178 -10
  493. nautobot/project-static/docs/installation/selinux-troubleshooting.html +1178 -10
  494. nautobot/project-static/docs/installation/services.html +1178 -10
  495. nautobot/project-static/docs/installation/tables/v2-api-behavior-changes.yaml +70 -0
  496. nautobot/project-static/docs/installation/tables/v2-api-removed-fields.yaml +142 -0
  497. nautobot/project-static/docs/installation/tables/v2-api-renamed-fields.yaml +124 -0
  498. nautobot/project-static/docs/installation/tables/v2-code-location-changes.yaml +241 -0
  499. nautobot/project-static/docs/installation/tables/v2-code-removals.yaml +67 -0
  500. nautobot/project-static/docs/installation/tables/v2-database-behavior-changes.yaml +37 -0
  501. nautobot/project-static/docs/installation/tables/v2-database-removed-fields.yaml +166 -0
  502. nautobot/project-static/docs/installation/tables/v2-database-renamed-fields.yaml +340 -0
  503. nautobot/project-static/docs/installation/tables/v2-filters-corrected-fields.yaml +28 -0
  504. nautobot/project-static/docs/installation/tables/v2-filters-enhanced-fields.yaml +241 -0
  505. nautobot/project-static/docs/installation/tables/v2-filters-removed-fields.yaml +553 -0
  506. nautobot/project-static/docs/installation/tables/v2-filters-renamed-fields.yaml +223 -0
  507. nautobot/project-static/docs/installation/tables/v2-logging-renamed-loggers.yaml +23 -0
  508. nautobot/project-static/docs/installation/ubuntu.html +1178 -10
  509. nautobot/project-static/docs/installation/upgrading-from-nautobot-v1.html +3823 -2152
  510. nautobot/project-static/docs/installation/upgrading.html +1178 -10
  511. nautobot/project-static/docs/models/circuits/circuit.html +1293 -103
  512. nautobot/project-static/docs/models/circuits/circuittermination.html +1293 -103
  513. nautobot/project-static/docs/models/circuits/circuittype.html +1293 -103
  514. nautobot/project-static/docs/models/circuits/provider.html +1293 -103
  515. nautobot/project-static/docs/models/circuits/providernetwork.html +1293 -103
  516. nautobot/project-static/docs/models/dcim/cable.html +1324 -103
  517. nautobot/project-static/docs/models/dcim/consoleport.html +1293 -103
  518. nautobot/project-static/docs/models/dcim/consoleporttemplate.html +1293 -103
  519. nautobot/project-static/docs/models/dcim/consoleserverport.html +1293 -103
  520. nautobot/project-static/docs/models/dcim/consoleserverporttemplate.html +1293 -103
  521. nautobot/project-static/docs/models/dcim/device.html +1326 -132
  522. nautobot/project-static/docs/models/dcim/devicebay.html +1293 -103
  523. nautobot/project-static/docs/models/dcim/devicebaytemplate.html +1293 -103
  524. nautobot/project-static/docs/models/dcim/deviceredundancygroup.html +1379 -97
  525. nautobot/project-static/docs/models/dcim/devicetype.html +1293 -103
  526. nautobot/project-static/docs/models/dcim/frontport.html +1293 -103
  527. nautobot/project-static/docs/models/dcim/frontporttemplate.html +1293 -103
  528. nautobot/project-static/docs/models/dcim/interface.html +1293 -103
  529. nautobot/project-static/docs/models/dcim/interfacetemplate.html +1293 -103
  530. nautobot/project-static/docs/models/dcim/inventoryitem.html +1293 -103
  531. nautobot/project-static/docs/models/dcim/location.html +1293 -103
  532. nautobot/project-static/docs/models/dcim/locationtype.html +1293 -103
  533. nautobot/project-static/docs/models/dcim/manufacturer.html +1292 -102
  534. nautobot/project-static/docs/models/dcim/platform.html +1272 -82
  535. nautobot/project-static/docs/models/dcim/powerfeed.html +1270 -80
  536. nautobot/project-static/docs/models/dcim/poweroutlet.html +1272 -82
  537. nautobot/project-static/docs/models/dcim/poweroutlettemplate.html +1272 -82
  538. nautobot/project-static/docs/models/dcim/powerpanel.html +1270 -80
  539. nautobot/project-static/docs/models/dcim/powerport.html +1272 -82
  540. nautobot/project-static/docs/models/dcim/powerporttemplate.html +1272 -82
  541. nautobot/project-static/docs/models/dcim/rack.html +1272 -82
  542. nautobot/project-static/docs/models/dcim/rackgroup.html +1272 -82
  543. nautobot/project-static/docs/models/dcim/rackreservation.html +1272 -82
  544. nautobot/project-static/docs/models/dcim/rearport.html +1286 -96
  545. nautobot/project-static/docs/models/dcim/rearporttemplate.html +1286 -96
  546. nautobot/project-static/docs/models/dcim/region.html +1178 -10
  547. nautobot/project-static/docs/models/dcim/site.html +1178 -10
  548. nautobot/project-static/docs/models/dcim/virtualchassis.html +1284 -94
  549. nautobot/project-static/docs/models/extras/computedfield.html +1184 -16
  550. nautobot/project-static/docs/models/extras/configcontext.html +1314 -86
  551. nautobot/project-static/docs/models/extras/configcontextschema.html +1276 -86
  552. nautobot/project-static/docs/models/extras/customfield.html +1180 -12
  553. nautobot/project-static/docs/models/extras/customlink.html +1180 -12
  554. nautobot/project-static/docs/models/extras/dynamicgroup.html +1180 -12
  555. nautobot/project-static/docs/models/extras/exporttemplate.html +1180 -12
  556. nautobot/project-static/docs/models/extras/gitrepository.html +1184 -12
  557. nautobot/project-static/docs/models/extras/graphqlquery.html +1321 -86
  558. nautobot/project-static/docs/models/extras/imageattachment.html +1276 -86
  559. nautobot/project-static/docs/models/extras/job.html +1277 -86
  560. nautobot/project-static/docs/models/extras/jobbutton.html +1201 -29
  561. nautobot/project-static/docs/models/extras/jobhook.html +1188 -16
  562. nautobot/project-static/docs/models/extras/joblogentry.html +1274 -84
  563. nautobot/project-static/docs/models/extras/jobresult.html +1364 -169
  564. nautobot/project-static/docs/models/extras/note.html +1180 -12
  565. nautobot/project-static/docs/models/extras/relationship.html +1182 -14
  566. nautobot/project-static/docs/models/extras/role.html +1320 -86
  567. nautobot/project-static/docs/models/extras/secret.html +1314 -86
  568. nautobot/project-static/docs/models/extras/secretsgroup.html +1276 -86
  569. nautobot/project-static/docs/models/extras/status.html +1188 -59
  570. nautobot/project-static/docs/models/extras/tag.html +1180 -12
  571. nautobot/project-static/docs/models/extras/webhook.html +1180 -12
  572. nautobot/project-static/docs/models/ipam/ipaddress.html +1327 -102
  573. nautobot/project-static/docs/models/ipam/prefix.html +1276 -86
  574. nautobot/project-static/docs/models/ipam/rir.html +1276 -86
  575. nautobot/project-static/docs/models/ipam/routetarget.html +1276 -86
  576. nautobot/project-static/docs/models/ipam/service.html +1276 -86
  577. nautobot/project-static/docs/models/ipam/vlan.html +1276 -86
  578. nautobot/project-static/docs/models/ipam/vlangroup.html +1276 -86
  579. nautobot/project-static/docs/models/ipam/vrf.html +1276 -86
  580. nautobot/project-static/docs/models/tenancy/tenant.html +1276 -86
  581. nautobot/project-static/docs/models/tenancy/tenantgroup.html +1276 -86
  582. nautobot/project-static/docs/models/users/objectpermission.html +1314 -86
  583. nautobot/project-static/docs/models/users/token.html +1276 -86
  584. nautobot/project-static/docs/models/virtualization/cluster.html +1276 -86
  585. nautobot/project-static/docs/models/virtualization/clustergroup.html +1276 -86
  586. nautobot/project-static/docs/models/virtualization/clustertype.html +1276 -86
  587. nautobot/project-static/docs/models/virtualization/virtualmachine.html +1321 -127
  588. nautobot/project-static/docs/models/virtualization/vminterface.html +1276 -86
  589. nautobot/project-static/docs/objects.inv +0 -0
  590. nautobot/project-static/docs/plugins/development.html +1726 -495
  591. nautobot/project-static/docs/plugins/index.html +1178 -10
  592. nautobot/project-static/docs/plugins/porting-from-netbox.html +1178 -10
  593. nautobot/project-static/docs/release-notes/index.html +1178 -10
  594. nautobot/project-static/docs/release-notes/version-1.0.html +1178 -10
  595. nautobot/project-static/docs/release-notes/version-1.1.html +1178 -10
  596. nautobot/project-static/docs/release-notes/version-1.2.html +1178 -10
  597. nautobot/project-static/docs/release-notes/version-1.3.html +1178 -10
  598. nautobot/project-static/docs/release-notes/version-1.4.html +1178 -10
  599. nautobot/project-static/docs/release-notes/version-1.5.html +1608 -225
  600. nautobot/project-static/docs/release-notes/version-2.0.html +1547 -47
  601. nautobot/project-static/docs/requirements.txt +1 -0
  602. nautobot/project-static/docs/rest-api/authentication.html +1179 -11
  603. nautobot/project-static/docs/rest-api/filtering.html +1178 -10
  604. nautobot/project-static/docs/rest-api/overview.html +1841 -446
  605. nautobot/project-static/docs/rest-api/ui-related-endpoints.html +4057 -0
  606. nautobot/project-static/docs/search/search_index.json +1 -1
  607. nautobot/project-static/docs/sitemap.xml +197 -187
  608. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  609. nautobot/project-static/docs/user-guides/custom-fields.html +1178 -10
  610. nautobot/project-static/docs/user-guides/getting-started/creating-devices.html +1178 -10
  611. nautobot/project-static/docs/user-guides/getting-started/index.html +1178 -10
  612. nautobot/project-static/docs/user-guides/getting-started/interfaces.html +1178 -10
  613. nautobot/project-static/docs/user-guides/getting-started/ipam.html +1178 -10
  614. nautobot/project-static/docs/user-guides/getting-started/platforms.html +1178 -10
  615. nautobot/project-static/docs/user-guides/getting-started/regions.html +1178 -10
  616. nautobot/project-static/docs/user-guides/getting-started/search-bar.html +1178 -10
  617. nautobot/project-static/docs/user-guides/getting-started/tenants.html +1178 -10
  618. nautobot/project-static/docs/user-guides/getting-started/vlans-and-vlan-groups.html +1178 -10
  619. nautobot/project-static/docs/user-guides/git-data-source.html +1178 -10
  620. nautobot/project-static/docs/user-guides/graphql.html +1178 -10
  621. nautobot/project-static/docs/user-guides/relationships.html +1178 -10
  622. nautobot/project-static/docs/user-guides/s3-django-storage.html +1178 -10
  623. nautobot/project-static/js/forms.js +16 -9
  624. nautobot/project-static/js/theme.js +5 -0
  625. nautobot/tenancy/api/serializers.py +4 -32
  626. nautobot/tenancy/api/urls.py +1 -1
  627. nautobot/tenancy/forms.py +0 -28
  628. nautobot/tenancy/migrations/0008_tagsfield.py +19 -0
  629. nautobot/tenancy/models.py +0 -25
  630. nautobot/tenancy/navigation.py +6 -39
  631. nautobot/tenancy/templates/tenancy/tenant.html +12 -12
  632. nautobot/tenancy/templates/tenancy/tenantgroup.html +1 -1
  633. nautobot/tenancy/tests/test_api.py +1 -3
  634. nautobot/tenancy/tests/test_filters.py +10 -5
  635. nautobot/tenancy/views.py +0 -2
  636. nautobot/ui/.eslintignore +6 -0
  637. nautobot/ui/.gitignore +10 -0
  638. nautobot/ui/.prettierignore +9 -0
  639. nautobot/ui/.prettierrc +4 -0
  640. nautobot/ui/README.md +33 -0
  641. nautobot/ui/app_imports.js.j2 +7 -0
  642. nautobot/ui/craco.config.js +46 -0
  643. nautobot/ui/jsconfig-base.json +11 -0
  644. nautobot/ui/jsconfig.json +5 -0
  645. nautobot/ui/lib/nautobot-craco-alias-plugin.js +40 -0
  646. nautobot/ui/package-lock.json +21451 -0
  647. nautobot/ui/package.json +70 -0
  648. nautobot/ui/public/index.html +47 -0
  649. nautobot/ui/public/logo192.png +0 -0
  650. nautobot/ui/public/logo512.png +0 -0
  651. nautobot/ui/public/manifest.json +25 -0
  652. nautobot/ui/public/nautobot_logo.svg +131 -0
  653. nautobot/ui/public/robots.txt +3 -0
  654. nautobot/ui/src/App.js +71 -0
  655. nautobot/ui/src/components/AppFullWidthComponents.js +8 -0
  656. nautobot/ui/src/components/AppTab.js +40 -0
  657. nautobot/ui/src/components/Apps.js +60 -0
  658. nautobot/ui/src/components/HomeChangelogPanel.js +98 -0
  659. nautobot/ui/src/components/HomePanel.js +58 -0
  660. nautobot/ui/src/components/JobHistoryTable.js +78 -0
  661. nautobot/ui/src/components/Layout.js +53 -0
  662. nautobot/ui/src/components/LoadingWidget.js +25 -0
  663. nautobot/ui/src/components/Navbar.js +116 -0
  664. nautobot/ui/src/components/NotificationPopover.js +27 -0
  665. nautobot/ui/src/components/ObjectListTable.js +209 -0
  666. nautobot/ui/src/components/ReferenceDataTag.js +35 -0
  667. nautobot/ui/src/components/RouterButton.js +10 -0
  668. nautobot/ui/src/components/RouterLink.js +10 -0
  669. nautobot/ui/src/components/SidebarNav.js +147 -0
  670. nautobot/ui/src/components/Table.js +48 -0
  671. nautobot/ui/src/components/TableItem.js +71 -0
  672. nautobot/ui/src/components/__tests__/AppFullWidthComponents.test.js +16 -0
  673. nautobot/ui/src/components/__tests__/AppTab.test.js +21 -0
  674. nautobot/ui/src/components/__tests__/Apps.test.js +14 -0
  675. nautobot/ui/src/components/__tests__/Layout.test.js +33 -0
  676. nautobot/ui/src/components/__tests__/Table.test.js +36 -0
  677. nautobot/ui/src/components/__tests__/TableItem.test.js +37 -0
  678. nautobot/ui/src/components/__tests__/paginator.test.js +43 -0
  679. nautobot/ui/src/components/__tests__/paginator_form.test.js +13 -0
  680. nautobot/ui/src/components/pagination.js +93 -0
  681. nautobot/ui/src/components/paginator.js +79 -0
  682. nautobot/ui/src/components/paginator_form.js +43 -0
  683. nautobot/ui/src/components/usePagination.js +57 -0
  684. nautobot/ui/src/constants/apiPath.js +10 -0
  685. nautobot/ui/src/constants/icons.js +15 -0
  686. nautobot/ui/src/constants/size.js +15 -0
  687. nautobot/ui/src/index.js +65 -0
  688. nautobot/ui/src/reportWebVitals.js +15 -0
  689. nautobot/ui/src/router.js +77 -0
  690. nautobot/ui/src/utils/api.js +131 -0
  691. nautobot/ui/src/utils/app-import.js +15 -0
  692. nautobot/ui/src/utils/color.js +15 -0
  693. nautobot/ui/src/utils/date.js +14 -0
  694. nautobot/ui/src/utils/index.js +15 -0
  695. nautobot/ui/src/utils/navigation.js +32 -0
  696. nautobot/ui/src/utils/session.js +64 -0
  697. nautobot/ui/src/utils/store.js +242 -0
  698. nautobot/ui/src/utils/string.js +6 -0
  699. nautobot/ui/src/utils/url.js +4 -0
  700. nautobot/ui/src/views/Home.js +138 -0
  701. nautobot/ui/src/views/InstalledApps.js +80 -0
  702. nautobot/ui/src/views/Login.js +48 -0
  703. nautobot/ui/src/views/Logout.js +20 -0
  704. nautobot/ui/src/views/__tests__/BSCreateViewTemplate.test.js +11 -0
  705. nautobot/ui/src/views/__tests__/BSListViewTemplate.test.js +107 -0
  706. nautobot/ui/src/views/__tests__/Login.test.js +15 -0
  707. nautobot/ui/src/views/generic/GenericView.js +142 -0
  708. nautobot/ui/src/views/generic/ObjectCreate.js +96 -0
  709. nautobot/ui/src/views/generic/ObjectList.js +127 -0
  710. nautobot/ui/src/views/generic/ObjectRetrieve.js +551 -0
  711. nautobot/users/admin.py +1 -1
  712. nautobot/users/api/serializers.py +51 -61
  713. nautobot/users/api/urls.py +1 -1
  714. nautobot/users/api/views.py +53 -2
  715. nautobot/users/tests/test_api.py +110 -25
  716. nautobot/virtualization/api/serializers.py +18 -130
  717. nautobot/virtualization/api/urls.py +1 -1
  718. nautobot/virtualization/api/views.py +1 -22
  719. nautobot/virtualization/forms.py +13 -99
  720. nautobot/virtualization/migrations/0012_alter_virtualmachine_role_add_new_role.py +1 -1
  721. nautobot/virtualization/migrations/0013_migrate_virtualmachine_role_data.py +18 -11
  722. nautobot/virtualization/migrations/0015_rename_foreignkey_fields.py +1 -1
  723. nautobot/virtualization/migrations/0018_related_name_changes.py +1 -1
  724. nautobot/virtualization/migrations/0021_tagsfield_and_vminterface_to_primarymodel.py +39 -0
  725. nautobot/virtualization/migrations/0022_vminterface_timestamps_data_migration.py +17 -0
  726. nautobot/virtualization/migrations/{0021_ipam__namespaces.py → 0023_ipam__namespaces.py} +2 -2
  727. nautobot/virtualization/migrations/0024_fixup_null_statuses.py +25 -0
  728. nautobot/virtualization/migrations/0025_status_nonnullable.py +29 -0
  729. nautobot/virtualization/models.py +31 -123
  730. nautobot/virtualization/navigation.py +18 -99
  731. nautobot/virtualization/templates/virtualization/virtualmachine.html +2 -1
  732. nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +6 -0
  733. nautobot/virtualization/tests/test_api.py +25 -26
  734. nautobot/virtualization/tests/test_filters.py +41 -15
  735. nautobot/virtualization/tests/test_models.py +31 -7
  736. nautobot/virtualization/tests/test_views.py +42 -25
  737. nautobot/virtualization/views.py +7 -6
  738. {nautobot-2.0.0a3.dist-info → nautobot-2.0.0b1.dist-info}/METADATA +3 -7
  739. {nautobot-2.0.0a3.dist-info → nautobot-2.0.0b1.dist-info}/RECORD +744 -602
  740. {nautobot-2.0.0a3.dist-info → nautobot-2.0.0b1.dist-info}/WHEEL +1 -1
  741. nautobot/circuits/api/nested_serializers.py +0 -69
  742. nautobot/core/templates/plugin_template/navigation.py-tpl +0 -22
  743. nautobot/dcim/api/nested_serializers.py +0 -356
  744. nautobot/dcim/templates/dcim/device_import.html +0 -5
  745. nautobot/dcim/templates/dcim/device_import_child.html +0 -5
  746. nautobot/dcim/templates/dcim/inc/device_import_header.html +0 -4
  747. nautobot/extras/api/nested_serializers.py +0 -353
  748. nautobot/extras/migrations/0064_configcontext_data_migrations.py +0 -41
  749. nautobot/extras/migrations/0071_job__unique_name_data_migration.py +0 -46
  750. nautobot/extras/reports.py +0 -60
  751. nautobot/extras/scripts.py +0 -72
  752. nautobot/extras/tests/example_jobs/script_variables.py +0 -67
  753. nautobot/extras/tests/example_jobs/test_duplicate_name2.py +0 -5
  754. nautobot/extras/tests/example_jobs/test_fail.py +0 -16
  755. nautobot/extras/tests/example_jobs/test_file_upload_pass.py +0 -20
  756. nautobot/extras/tests/example_jobs/test_ipaddress_vars.py +0 -52
  757. nautobot/extras/tests/example_jobs/test_job_button_receiver.py +0 -21
  758. nautobot/extras/tests/example_jobs/test_job_hook_receiver.py +0 -20
  759. nautobot/extras/tests/example_jobs/test_location_with_custom_field.py +0 -35
  760. nautobot/extras/tests/example_jobs/test_log_redaction.py +0 -14
  761. nautobot/extras/tests/example_jobs/test_modify_db.py +0 -18
  762. nautobot/extras/tests/example_jobs/test_object_var_optional.py +0 -14
  763. nautobot/extras/tests/example_jobs/test_object_var_required.py +0 -14
  764. nautobot/extras/tests/example_jobs/test_object_vars.py +0 -29
  765. nautobot/extras/tests/example_jobs/test_pass.py +0 -19
  766. nautobot/extras/tests/example_jobs/test_read_only_fail.py +0 -24
  767. nautobot/extras/tests/example_jobs/test_read_only_no_commit_field.py +0 -10
  768. nautobot/extras/tests/example_jobs/test_read_only_pass.py +0 -22
  769. nautobot/ipam/api/nested_serializers.py +0 -159
  770. nautobot/ipam/migrations/0029_ipam__prefix__add_parent.py +0 -31
  771. nautobot/ipam/migrations/0030_ipam__prefix__data_migration.py +0 -13
  772. nautobot/ipam/migrations/0031_ipam__ipaddress__add_parent.py +0 -41
  773. nautobot/ipam/migrations/0032_ipam__ipaddress__data_migration.py +0 -11
  774. nautobot/tenancy/api/nested_serializers.py +0 -31
  775. nautobot/users/api/nested_serializers.py +0 -67
  776. nautobot/virtualization/api/nested_serializers.py +0 -65
  777. /nautobot/extras/{tests/example_jobs → test_jobs}/__init__.py +0 -0
  778. /nautobot/{dcim/models/sites.py → ipam/management/__init__.py} +0 -0
  779. {nautobot-2.0.0a3.dist-info → nautobot-2.0.0b1.dist-info}/LICENSE.txt +0 -0
  780. {nautobot-2.0.0a3.dist-info → nautobot-2.0.0b1.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,4199 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+
10
+
11
+ <link rel="canonical" href="https://docs.nautobot.com/projects/core/en/stable/development/react-ui.html">
12
+
13
+
14
+
15
+ <link rel="icon" href="../assets/favicon.ico">
16
+ <meta name="generator" content="mkdocs-1.4.2, mkdocs-material-9.1.6">
17
+
18
+
19
+
20
+ <title>Building the React UI - Nautobot Documentation</title>
21
+
22
+
23
+
24
+ <link rel="stylesheet" href="../assets/stylesheets/main.ded33207.min.css">
25
+
26
+
27
+ <link rel="stylesheet" href="../assets/stylesheets/palette.a0c5b2b5.min.css">
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
38
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
39
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
40
+
41
+
42
+
43
+ <link rel="stylesheet" href="../assets/_mkdocstrings.css">
44
+
45
+ <link rel="stylesheet" href="../assets/extra.css">
46
+
47
+ <script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
48
+
49
+
50
+
51
+
52
+
53
+
54
+ </head>
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="">
65
+
66
+
67
+
68
+ <script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
69
+
70
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
71
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
72
+ <label class="md-overlay" for="__drawer"></label>
73
+ <div data-md-component="skip">
74
+
75
+
76
+ <a href="#building-the-react-ui" class="md-skip">
77
+ Skip to content
78
+ </a>
79
+
80
+ </div>
81
+ <div data-md-component="announce">
82
+
83
+ </div>
84
+
85
+
86
+
87
+
88
+
89
+
90
+ <header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
91
+ <nav class="md-header__inner md-grid" aria-label="Header">
92
+ <a href="../index.html" title="Nautobot Documentation" class="md-header__button md-logo" aria-label="Nautobot Documentation" data-md-component="logo">
93
+
94
+ <img src="../assets/nautobot_logo.svg" alt="logo">
95
+
96
+ </a>
97
+ <label class="md-header__button md-icon" for="__drawer">
98
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
99
+ </label>
100
+ <div class="md-header__title" data-md-component="header-title">
101
+ <div class="md-header__ellipsis">
102
+ <div class="md-header__topic">
103
+ <span class="md-ellipsis">
104
+ Nautobot Documentation
105
+ </span>
106
+ </div>
107
+ <div class="md-header__topic" data-md-component="header-topic">
108
+ <span class="md-ellipsis">
109
+
110
+ Building the React UI
111
+
112
+ </span>
113
+ </div>
114
+ </div>
115
+ </div>
116
+
117
+ <form class="md-header__option" data-md-component="palette">
118
+
119
+
120
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
121
+
122
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
123
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
124
+ </label>
125
+
126
+
127
+
128
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_2">
129
+
130
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
131
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
132
+ </label>
133
+
134
+
135
+ </form>
136
+
137
+
138
+
139
+ <label class="md-header__button md-icon" for="__search">
140
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
141
+ </label>
142
+ <div class="md-search" data-md-component="search" role="dialog">
143
+ <label class="md-search__overlay" for="__search"></label>
144
+ <div class="md-search__inner" role="search">
145
+ <form class="md-search__form" name="search">
146
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
147
+ <label class="md-search__icon md-icon" for="__search">
148
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
149
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
150
+ </label>
151
+ <nav class="md-search__options" aria-label="Search">
152
+
153
+ <a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
154
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
155
+ </a>
156
+
157
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
158
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
159
+ </button>
160
+ </nav>
161
+
162
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
163
+
164
+ </form>
165
+ <div class="md-search__output">
166
+ <div class="md-search__scrollwrap" data-md-scrollfix>
167
+ <div class="md-search-result" data-md-component="search-result">
168
+ <div class="md-search-result__meta">
169
+ Initializing search
170
+ </div>
171
+ <ol class="md-search-result__list" role="presentation"></ol>
172
+ </div>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ </div>
177
+
178
+
179
+ <div class="md-header__source">
180
+ <a href="https://github.com/nautobot/nautobot" title="Go to repository" class="md-source" data-md-component="source">
181
+ <div class="md-source__icon md-icon">
182
+
183
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
184
+ </div>
185
+ <div class="md-source__repository">
186
+ GitHub
187
+ </div>
188
+ </a>
189
+ </div>
190
+
191
+ </nav>
192
+
193
+
194
+
195
+ <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
196
+ <div class="md-grid">
197
+ <ul class="md-tabs__list">
198
+
199
+
200
+
201
+
202
+
203
+
204
+ <li class="md-tabs__item">
205
+ <a href="../index.html" class="md-tabs__link">
206
+ Overview
207
+ </a>
208
+ </li>
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+ <li class="md-tabs__item">
225
+ <a href="../installation/index.html" class="md-tabs__link">
226
+ Documentation
227
+ </a>
228
+ </li>
229
+
230
+
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+ <li class="md-tabs__item">
243
+ <a href="../plugins/development.html" class="md-tabs__link">
244
+ App Developer Guide
245
+ </a>
246
+ </li>
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+ <li class="md-tabs__item">
259
+ <a href="index.html" class="md-tabs__link">
260
+ Core Developer Guide
261
+ </a>
262
+ </li>
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+ <li class="md-tabs__item">
275
+ <a href="../release-notes/index.html" class="md-tabs__link">
276
+ Release Notes
277
+ </a>
278
+ </li>
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+ <li class="md-tabs__item">
291
+ <a href="../apps/index.html" class="md-tabs__link">
292
+ Nautobot Apps
293
+ </a>
294
+ </li>
295
+
296
+
297
+
298
+
299
+
300
+
301
+
302
+
303
+ <li class="md-tabs__item">
304
+ <a href="https://docs.nautobot.com/" class="md-tabs__link">
305
+ Nautobot Docs Home ↗︎
306
+ </a>
307
+ </li>
308
+
309
+
310
+ </ul>
311
+ </div>
312
+ </nav>
313
+
314
+
315
+ </header>
316
+
317
+ <div class="md-container" data-md-component="container">
318
+
319
+
320
+
321
+
322
+ <main class="md-main" data-md-component="main">
323
+ <div class="md-main__inner md-grid">
324
+
325
+
326
+
327
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
328
+ <div class="md-sidebar__scrollwrap">
329
+ <div class="md-sidebar__inner">
330
+
331
+
332
+
333
+
334
+
335
+ <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
336
+ <label class="md-nav__title" for="__drawer">
337
+ <a href="../index.html" title="Nautobot Documentation" class="md-nav__button md-logo" aria-label="Nautobot Documentation" data-md-component="logo">
338
+
339
+ <img src="../assets/nautobot_logo.svg" alt="logo">
340
+
341
+ </a>
342
+ Nautobot Documentation
343
+ </label>
344
+
345
+ <div class="md-nav__source">
346
+ <a href="https://github.com/nautobot/nautobot" title="Go to repository" class="md-source" data-md-component="source">
347
+ <div class="md-source__icon md-icon">
348
+
349
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
350
+ </div>
351
+ <div class="md-source__repository">
352
+ GitHub
353
+ </div>
354
+ </a>
355
+ </div>
356
+
357
+ <ul class="md-nav__list" data-md-scrollfix>
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+ <li class="md-nav__item">
367
+ <a href="../index.html" class="md-nav__link">
368
+ Overview
369
+ </a>
370
+ </li>
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+
381
+
382
+ <li class="md-nav__item md-nav__item--nested">
383
+
384
+
385
+
386
+
387
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
388
+
389
+
390
+
391
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
392
+ Documentation
393
+ <span class="md-nav__icon md-icon"></span>
394
+ </label>
395
+
396
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
397
+ <label class="md-nav__title" for="__nav_2">
398
+ <span class="md-nav__icon md-icon"></span>
399
+ Documentation
400
+ </label>
401
+ <ul class="md-nav__list" data-md-scrollfix>
402
+
403
+
404
+
405
+
406
+
407
+
408
+
409
+ <li class="md-nav__item md-nav__item--nested">
410
+
411
+
412
+
413
+
414
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_1" >
415
+
416
+
417
+
418
+ <label class="md-nav__link" for="__nav_2_1" id="__nav_2_1_label" tabindex="0">
419
+ Installation
420
+ <span class="md-nav__icon md-icon"></span>
421
+ </label>
422
+
423
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_1_label" aria-expanded="false">
424
+ <label class="md-nav__title" for="__nav_2_1">
425
+ <span class="md-nav__icon md-icon"></span>
426
+ Installation
427
+ </label>
428
+ <ul class="md-nav__list" data-md-scrollfix>
429
+
430
+
431
+
432
+
433
+
434
+
435
+ <li class="md-nav__item">
436
+ <a href="../installation/index.html" class="md-nav__link">
437
+ Installing Prerequisites
438
+ </a>
439
+ </li>
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+ <li class="md-nav__item">
450
+ <a href="../installation/nautobot.html" class="md-nav__link">
451
+ Installing Nautobot
452
+ </a>
453
+ </li>
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+ <li class="md-nav__item">
464
+ <a href="../installation/services.html" class="md-nav__link">
465
+ Deploying Nautobot Services
466
+ </a>
467
+ </li>
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+
476
+
477
+ <li class="md-nav__item">
478
+ <a href="../installation/http-server.html" class="md-nav__link">
479
+ Configuring an HTTP Server
480
+ </a>
481
+ </li>
482
+
483
+
484
+
485
+
486
+
487
+
488
+
489
+
490
+
491
+ <li class="md-nav__item">
492
+ <a href="../installation/external-authentication.html" class="md-nav__link">
493
+ External Authentication (Optional)
494
+ </a>
495
+ </li>
496
+
497
+
498
+
499
+
500
+
501
+
502
+
503
+
504
+
505
+ <li class="md-nav__item">
506
+ <a href="../docker/index.html" class="md-nav__link">
507
+ Nautobot Docker Images
508
+ </a>
509
+ </li>
510
+
511
+
512
+
513
+
514
+ </ul>
515
+ </nav>
516
+ </li>
517
+
518
+
519
+
520
+
521
+
522
+
523
+
524
+
525
+
526
+
527
+ <li class="md-nav__item md-nav__item--nested">
528
+
529
+
530
+
531
+
532
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_2" >
533
+
534
+
535
+
536
+ <label class="md-nav__link" for="__nav_2_2" id="__nav_2_2_label" tabindex="0">
537
+ Migration
538
+ <span class="md-nav__icon md-icon"></span>
539
+ </label>
540
+
541
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_2_label" aria-expanded="false">
542
+ <label class="md-nav__title" for="__nav_2_2">
543
+ <span class="md-nav__icon md-icon"></span>
544
+ Migration
545
+ </label>
546
+ <ul class="md-nav__list" data-md-scrollfix>
547
+
548
+
549
+
550
+
551
+
552
+
553
+ <li class="md-nav__item">
554
+ <a href="../installation/migrating-from-netbox.html" class="md-nav__link">
555
+ Migrating from NetBox
556
+ </a>
557
+ </li>
558
+
559
+
560
+
561
+
562
+
563
+
564
+
565
+
566
+
567
+ <li class="md-nav__item">
568
+ <a href="../installation/migrating-from-postgresql.html" class="md-nav__link">
569
+ Migrating from PostgreSQL to MySQL
570
+ </a>
571
+ </li>
572
+
573
+
574
+
575
+
576
+
577
+
578
+
579
+
580
+
581
+ <li class="md-nav__item">
582
+ <a href="../installation/upgrading.html" class="md-nav__link">
583
+ Upgrading Nautobot
584
+ </a>
585
+ </li>
586
+
587
+
588
+
589
+
590
+
591
+
592
+
593
+
594
+
595
+ <li class="md-nav__item">
596
+ <a href="../installation/upgrading-from-nautobot-v1.html" class="md-nav__link">
597
+ Upgrading Nautobot from v1.X to v2.0
598
+ </a>
599
+ </li>
600
+
601
+
602
+
603
+
604
+
605
+
606
+
607
+
608
+
609
+ <li class="md-nav__item">
610
+ <a href="../installation/region-and-site-data-migration-guide.html" class="md-nav__link">
611
+ Migrating from Region and Site to Location
612
+ </a>
613
+ </li>
614
+
615
+
616
+
617
+
618
+ </ul>
619
+ </nav>
620
+ </li>
621
+
622
+
623
+
624
+
625
+
626
+
627
+
628
+
629
+
630
+
631
+ <li class="md-nav__item md-nav__item--nested">
632
+
633
+
634
+
635
+
636
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3" >
637
+
638
+
639
+
640
+ <label class="md-nav__link" for="__nav_2_3" id="__nav_2_3_label" tabindex="0">
641
+ Configuration
642
+ <span class="md-nav__icon md-icon"></span>
643
+ </label>
644
+
645
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_3_label" aria-expanded="false">
646
+ <label class="md-nav__title" for="__nav_2_3">
647
+ <span class="md-nav__icon md-icon"></span>
648
+ Configuration
649
+ </label>
650
+ <ul class="md-nav__list" data-md-scrollfix>
651
+
652
+
653
+
654
+
655
+
656
+
657
+ <li class="md-nav__item">
658
+ <a href="../configuration/index.html" class="md-nav__link">
659
+ Configuring Nautobot
660
+ </a>
661
+ </li>
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+
670
+
671
+ <li class="md-nav__item">
672
+ <a href="../configuration/required-settings.html" class="md-nav__link">
673
+ Required Settings
674
+ </a>
675
+ </li>
676
+
677
+
678
+
679
+
680
+
681
+
682
+
683
+
684
+
685
+ <li class="md-nav__item">
686
+ <a href="../configuration/optional-settings.html" class="md-nav__link">
687
+ Optional Settings
688
+ </a>
689
+ </li>
690
+
691
+
692
+
693
+
694
+ </ul>
695
+ </nav>
696
+ </li>
697
+
698
+
699
+
700
+
701
+
702
+
703
+
704
+
705
+
706
+
707
+ <li class="md-nav__item md-nav__item--nested">
708
+
709
+
710
+
711
+
712
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4" >
713
+
714
+
715
+
716
+ <label class="md-nav__link" for="__nav_2_4" id="__nav_2_4_label" tabindex="0">
717
+ External Authentication
718
+ <span class="md-nav__icon md-icon"></span>
719
+ </label>
720
+
721
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_4_label" aria-expanded="false">
722
+ <label class="md-nav__title" for="__nav_2_4">
723
+ <span class="md-nav__icon md-icon"></span>
724
+ External Authentication
725
+ </label>
726
+ <ul class="md-nav__list" data-md-scrollfix>
727
+
728
+
729
+
730
+
731
+
732
+
733
+ <li class="md-nav__item">
734
+ <a href="../configuration/authentication/ldap.html" class="md-nav__link">
735
+ LDAP
736
+ </a>
737
+ </li>
738
+
739
+
740
+
741
+
742
+
743
+
744
+
745
+
746
+
747
+ <li class="md-nav__item">
748
+ <a href="../configuration/authentication/sso.html" class="md-nav__link">
749
+ SSO
750
+ </a>
751
+ </li>
752
+
753
+
754
+
755
+
756
+
757
+
758
+
759
+
760
+
761
+ <li class="md-nav__item">
762
+ <a href="../configuration/authentication/remote.html" class="md-nav__link">
763
+ Remote Header
764
+ </a>
765
+ </li>
766
+
767
+
768
+
769
+
770
+ </ul>
771
+ </nav>
772
+ </li>
773
+
774
+
775
+
776
+
777
+
778
+
779
+
780
+
781
+
782
+
783
+ <li class="md-nav__item md-nav__item--nested">
784
+
785
+
786
+
787
+
788
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5" >
789
+
790
+
791
+
792
+ <label class="md-nav__link" for="__nav_2_5" id="__nav_2_5_label" tabindex="0">
793
+ Administration
794
+ <span class="md-nav__icon md-icon"></span>
795
+ </label>
796
+
797
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_5_label" aria-expanded="false">
798
+ <label class="md-nav__title" for="__nav_2_5">
799
+ <span class="md-nav__icon md-icon"></span>
800
+ Administration
801
+ </label>
802
+ <ul class="md-nav__list" data-md-scrollfix>
803
+
804
+
805
+
806
+
807
+
808
+
809
+ <li class="md-nav__item">
810
+ <a href="../administration/nautobot-server.html" class="md-nav__link">
811
+ Nautobot Server
812
+ </a>
813
+ </li>
814
+
815
+
816
+
817
+
818
+
819
+
820
+
821
+
822
+
823
+ <li class="md-nav__item">
824
+ <a href="../administration/nautobot-shell.html" class="md-nav__link">
825
+ Nautobot Shell
826
+ </a>
827
+ </li>
828
+
829
+
830
+
831
+
832
+
833
+
834
+
835
+
836
+
837
+ <li class="md-nav__item">
838
+ <a href="../administration/permissions.html" class="md-nav__link">
839
+ Permissions
840
+ </a>
841
+ </li>
842
+
843
+
844
+
845
+
846
+
847
+
848
+
849
+
850
+
851
+ <li class="md-nav__item">
852
+ <a href="../administration/replicating-nautobot.html" class="md-nav__link">
853
+ Replicating Nautobot
854
+ </a>
855
+ </li>
856
+
857
+
858
+
859
+
860
+
861
+
862
+
863
+
864
+
865
+ <li class="md-nav__item">
866
+ <a href="../administration/celery-queues.html" class="md-nav__link">
867
+ Task Queues
868
+ </a>
869
+ </li>
870
+
871
+
872
+
873
+
874
+ </ul>
875
+ </nav>
876
+ </li>
877
+
878
+
879
+
880
+
881
+
882
+
883
+
884
+
885
+
886
+
887
+ <li class="md-nav__item md-nav__item--nested">
888
+
889
+
890
+
891
+
892
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_6" >
893
+
894
+
895
+
896
+ <label class="md-nav__link" for="__nav_2_6" id="__nav_2_6_label" tabindex="0">
897
+ User Guides
898
+ <span class="md-nav__icon md-icon"></span>
899
+ </label>
900
+
901
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_6_label" aria-expanded="false">
902
+ <label class="md-nav__title" for="__nav_2_6">
903
+ <span class="md-nav__icon md-icon"></span>
904
+ User Guides
905
+ </label>
906
+ <ul class="md-nav__list" data-md-scrollfix>
907
+
908
+
909
+
910
+
911
+
912
+
913
+ <li class="md-nav__item">
914
+ <a href="../user-guides/getting-started/creating-devices.html" class="md-nav__link">
915
+ Creating Devices
916
+ </a>
917
+ </li>
918
+
919
+
920
+
921
+
922
+
923
+
924
+
925
+
926
+
927
+ <li class="md-nav__item">
928
+ <a href="../user-guides/custom-fields.html" class="md-nav__link">
929
+ Custom Fields
930
+ </a>
931
+ </li>
932
+
933
+
934
+
935
+
936
+
937
+
938
+
939
+
940
+
941
+ <li class="md-nav__item">
942
+ <a href="../user-guides/getting-started/index.html" class="md-nav__link">
943
+ Getting Started In the Web UI
944
+ </a>
945
+ </li>
946
+
947
+
948
+
949
+
950
+
951
+
952
+
953
+
954
+
955
+ <li class="md-nav__item">
956
+ <a href="../user-guides/git-data-source.html" class="md-nav__link">
957
+ Git as a Data Source
958
+ </a>
959
+ </li>
960
+
961
+
962
+
963
+
964
+
965
+
966
+
967
+
968
+
969
+ <li class="md-nav__item">
970
+ <a href="../user-guides/graphql.html" class="md-nav__link">
971
+ GraphQL
972
+ </a>
973
+ </li>
974
+
975
+
976
+
977
+
978
+
979
+
980
+
981
+
982
+
983
+ <li class="md-nav__item">
984
+ <a href="../user-guides/getting-started/interfaces.html" class="md-nav__link">
985
+ Interfaces
986
+ </a>
987
+ </li>
988
+
989
+
990
+
991
+
992
+
993
+
994
+
995
+
996
+
997
+ <li class="md-nav__item">
998
+ <a href="../user-guides/getting-started/ipam.html" class="md-nav__link">
999
+ IP Address Management
1000
+ </a>
1001
+ </li>
1002
+
1003
+
1004
+
1005
+
1006
+
1007
+
1008
+
1009
+
1010
+
1011
+ <li class="md-nav__item">
1012
+ <a href="../user-guides/getting-started/platforms.html" class="md-nav__link">
1013
+ Platforms
1014
+ </a>
1015
+ </li>
1016
+
1017
+
1018
+
1019
+
1020
+
1021
+
1022
+
1023
+
1024
+
1025
+ <li class="md-nav__item">
1026
+ <a href="../user-guides/getting-started/regions.html" class="md-nav__link">
1027
+ Regions
1028
+ </a>
1029
+ </li>
1030
+
1031
+
1032
+
1033
+
1034
+
1035
+
1036
+
1037
+
1038
+
1039
+ <li class="md-nav__item">
1040
+ <a href="../user-guides/getting-started/tenants.html" class="md-nav__link">
1041
+ Tenants
1042
+ </a>
1043
+ </li>
1044
+
1045
+
1046
+
1047
+
1048
+
1049
+
1050
+
1051
+
1052
+
1053
+ <li class="md-nav__item">
1054
+ <a href="../user-guides/getting-started/search-bar.html" class="md-nav__link">
1055
+ The Search Bar
1056
+ </a>
1057
+ </li>
1058
+
1059
+
1060
+
1061
+
1062
+
1063
+
1064
+
1065
+
1066
+
1067
+ <li class="md-nav__item">
1068
+ <a href="../user-guides/git-data-source.html" class="md-nav__link">
1069
+ Git as a Data Source
1070
+ </a>
1071
+ </li>
1072
+
1073
+
1074
+
1075
+
1076
+
1077
+
1078
+
1079
+
1080
+
1081
+ <li class="md-nav__item">
1082
+ <a href="../user-guides/graphql.html" class="md-nav__link">
1083
+ GraphQL
1084
+ </a>
1085
+ </li>
1086
+
1087
+
1088
+
1089
+
1090
+
1091
+
1092
+
1093
+
1094
+
1095
+ <li class="md-nav__item">
1096
+ <a href="../user-guides/relationships.html" class="md-nav__link">
1097
+ Relationships
1098
+ </a>
1099
+ </li>
1100
+
1101
+
1102
+
1103
+
1104
+
1105
+
1106
+
1107
+
1108
+
1109
+ <li class="md-nav__item">
1110
+ <a href="../user-guides/s3-django-storage.html" class="md-nav__link">
1111
+ Django Storages with S3
1112
+ </a>
1113
+ </li>
1114
+
1115
+
1116
+
1117
+
1118
+
1119
+
1120
+
1121
+
1122
+
1123
+ <li class="md-nav__item">
1124
+ <a href="../user-guides/getting-started/vlans-and-vlan-groups.html" class="md-nav__link">
1125
+ VLANS and VLAN Groups
1126
+ </a>
1127
+ </li>
1128
+
1129
+
1130
+
1131
+
1132
+ </ul>
1133
+ </nav>
1134
+ </li>
1135
+
1136
+
1137
+
1138
+
1139
+
1140
+
1141
+
1142
+
1143
+
1144
+
1145
+ <li class="md-nav__item md-nav__item--nested">
1146
+
1147
+
1148
+
1149
+
1150
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_7" >
1151
+
1152
+
1153
+
1154
+ <label class="md-nav__link" for="__nav_2_7" id="__nav_2_7_label" tabindex="0">
1155
+ Core Functionality
1156
+ <span class="md-nav__icon md-icon"></span>
1157
+ </label>
1158
+
1159
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_7_label" aria-expanded="false">
1160
+ <label class="md-nav__title" for="__nav_2_7">
1161
+ <span class="md-nav__icon md-icon"></span>
1162
+ Core Functionality
1163
+ </label>
1164
+ <ul class="md-nav__list" data-md-scrollfix>
1165
+
1166
+
1167
+
1168
+
1169
+
1170
+
1171
+ <li class="md-nav__item">
1172
+ <a href="../core-functionality/circuits.html" class="md-nav__link">
1173
+ Circuits
1174
+ </a>
1175
+ </li>
1176
+
1177
+
1178
+
1179
+
1180
+
1181
+
1182
+
1183
+
1184
+
1185
+ <li class="md-nav__item">
1186
+ <a href="../core-functionality/devices.html" class="md-nav__link">
1187
+ Devices and Cabling
1188
+ </a>
1189
+ </li>
1190
+
1191
+
1192
+
1193
+
1194
+
1195
+
1196
+
1197
+
1198
+
1199
+ <li class="md-nav__item">
1200
+ <a href="../core-functionality/device-types.html" class="md-nav__link">
1201
+ Device Types
1202
+ </a>
1203
+ </li>
1204
+
1205
+
1206
+
1207
+
1208
+
1209
+
1210
+
1211
+
1212
+
1213
+ <li class="md-nav__item">
1214
+ <a href="../core-functionality/ipam.html" class="md-nav__link">
1215
+ IP Address Management
1216
+ </a>
1217
+ </li>
1218
+
1219
+
1220
+
1221
+
1222
+
1223
+
1224
+
1225
+
1226
+
1227
+ <li class="md-nav__item">
1228
+ <a href="../core-functionality/power.html" class="md-nav__link">
1229
+ Power Tracking
1230
+ </a>
1231
+ </li>
1232
+
1233
+
1234
+
1235
+
1236
+
1237
+
1238
+
1239
+
1240
+
1241
+ <li class="md-nav__item">
1242
+ <a href="../core-functionality/secrets.html" class="md-nav__link">
1243
+ Secrets
1244
+ </a>
1245
+ </li>
1246
+
1247
+
1248
+
1249
+
1250
+
1251
+
1252
+
1253
+
1254
+
1255
+ <li class="md-nav__item">
1256
+ <a href="../core-functionality/services.html" class="md-nav__link">
1257
+ Service Mapping
1258
+ </a>
1259
+ </li>
1260
+
1261
+
1262
+
1263
+
1264
+
1265
+
1266
+
1267
+
1268
+
1269
+ <li class="md-nav__item">
1270
+ <a href="../core-functionality/sites-and-racks.html" class="md-nav__link">
1271
+ Sites, Locations, and Racks
1272
+ </a>
1273
+ </li>
1274
+
1275
+
1276
+
1277
+
1278
+
1279
+
1280
+
1281
+
1282
+
1283
+ <li class="md-nav__item">
1284
+ <a href="../core-functionality/tenancy.html" class="md-nav__link">
1285
+ Tenancy
1286
+ </a>
1287
+ </li>
1288
+
1289
+
1290
+
1291
+
1292
+
1293
+
1294
+
1295
+
1296
+
1297
+ <li class="md-nav__item">
1298
+ <a href="../core-functionality/virtualization.html" class="md-nav__link">
1299
+ Virtualization
1300
+ </a>
1301
+ </li>
1302
+
1303
+
1304
+
1305
+
1306
+
1307
+
1308
+
1309
+
1310
+
1311
+ <li class="md-nav__item">
1312
+ <a href="../core-functionality/vlans.html" class="md-nav__link">
1313
+ VLAN Management
1314
+ </a>
1315
+ </li>
1316
+
1317
+
1318
+
1319
+
1320
+ </ul>
1321
+ </nav>
1322
+ </li>
1323
+
1324
+
1325
+
1326
+
1327
+
1328
+
1329
+
1330
+
1331
+
1332
+
1333
+ <li class="md-nav__item md-nav__item--nested">
1334
+
1335
+
1336
+
1337
+
1338
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8" >
1339
+
1340
+
1341
+
1342
+ <label class="md-nav__link" for="__nav_2_8" id="__nav_2_8_label" tabindex="0">
1343
+ Model Details
1344
+ <span class="md-nav__icon md-icon"></span>
1345
+ </label>
1346
+
1347
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_8_label" aria-expanded="false">
1348
+ <label class="md-nav__title" for="__nav_2_8">
1349
+ <span class="md-nav__icon md-icon"></span>
1350
+ Model Details
1351
+ </label>
1352
+ <ul class="md-nav__list" data-md-scrollfix>
1353
+
1354
+
1355
+
1356
+
1357
+
1358
+
1359
+
1360
+ <li class="md-nav__item md-nav__item--nested">
1361
+
1362
+
1363
+
1364
+
1365
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_1" >
1366
+
1367
+
1368
+
1369
+ <label class="md-nav__link" for="__nav_2_8_1" id="__nav_2_8_1_label" tabindex="0">
1370
+ Circuits
1371
+ <span class="md-nav__icon md-icon"></span>
1372
+ </label>
1373
+
1374
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_1_label" aria-expanded="false">
1375
+ <label class="md-nav__title" for="__nav_2_8_1">
1376
+ <span class="md-nav__icon md-icon"></span>
1377
+ Circuits
1378
+ </label>
1379
+ <ul class="md-nav__list" data-md-scrollfix>
1380
+
1381
+
1382
+
1383
+
1384
+
1385
+
1386
+ <li class="md-nav__item">
1387
+ <a href="../models/circuits/circuit.html" class="md-nav__link">
1388
+ Circuit
1389
+ </a>
1390
+ </li>
1391
+
1392
+
1393
+
1394
+
1395
+
1396
+
1397
+
1398
+
1399
+
1400
+ <li class="md-nav__item">
1401
+ <a href="../models/circuits/circuittermination.html" class="md-nav__link">
1402
+ Circuit Termination
1403
+ </a>
1404
+ </li>
1405
+
1406
+
1407
+
1408
+
1409
+
1410
+
1411
+
1412
+
1413
+
1414
+ <li class="md-nav__item">
1415
+ <a href="../models/circuits/circuittype.html" class="md-nav__link">
1416
+ Circuit Type
1417
+ </a>
1418
+ </li>
1419
+
1420
+
1421
+
1422
+
1423
+
1424
+
1425
+
1426
+
1427
+
1428
+ <li class="md-nav__item">
1429
+ <a href="../models/circuits/provider.html" class="md-nav__link">
1430
+ Circuit Provider
1431
+ </a>
1432
+ </li>
1433
+
1434
+
1435
+
1436
+
1437
+
1438
+
1439
+
1440
+
1441
+
1442
+ <li class="md-nav__item">
1443
+ <a href="../models/circuits/providernetwork.html" class="md-nav__link">
1444
+ Circuit Provider Network
1445
+ </a>
1446
+ </li>
1447
+
1448
+
1449
+
1450
+
1451
+ </ul>
1452
+ </nav>
1453
+ </li>
1454
+
1455
+
1456
+
1457
+
1458
+
1459
+
1460
+
1461
+
1462
+
1463
+
1464
+ <li class="md-nav__item md-nav__item--nested">
1465
+
1466
+
1467
+
1468
+
1469
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_2" >
1470
+
1471
+
1472
+
1473
+ <label class="md-nav__link" for="__nav_2_8_2" id="__nav_2_8_2_label" tabindex="0">
1474
+ DCIM
1475
+ <span class="md-nav__icon md-icon"></span>
1476
+ </label>
1477
+
1478
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_2_label" aria-expanded="false">
1479
+ <label class="md-nav__title" for="__nav_2_8_2">
1480
+ <span class="md-nav__icon md-icon"></span>
1481
+ DCIM
1482
+ </label>
1483
+ <ul class="md-nav__list" data-md-scrollfix>
1484
+
1485
+
1486
+
1487
+
1488
+
1489
+
1490
+ <li class="md-nav__item">
1491
+ <a href="../models/dcim/cable.html" class="md-nav__link">
1492
+ Cable
1493
+ </a>
1494
+ </li>
1495
+
1496
+
1497
+
1498
+
1499
+
1500
+
1501
+
1502
+
1503
+
1504
+ <li class="md-nav__item">
1505
+ <a href="../models/dcim/consoleport.html" class="md-nav__link">
1506
+ Console Port
1507
+ </a>
1508
+ </li>
1509
+
1510
+
1511
+
1512
+
1513
+
1514
+
1515
+
1516
+
1517
+
1518
+ <li class="md-nav__item">
1519
+ <a href="../models/dcim/consoleporttemplate.html" class="md-nav__link">
1520
+ Console Port Template
1521
+ </a>
1522
+ </li>
1523
+
1524
+
1525
+
1526
+
1527
+
1528
+
1529
+
1530
+
1531
+
1532
+ <li class="md-nav__item">
1533
+ <a href="../models/dcim/consoleserverport.html" class="md-nav__link">
1534
+ Console Server Port
1535
+ </a>
1536
+ </li>
1537
+
1538
+
1539
+
1540
+
1541
+
1542
+
1543
+
1544
+
1545
+
1546
+ <li class="md-nav__item">
1547
+ <a href="../models/dcim/consoleserverporttemplate.html" class="md-nav__link">
1548
+ Console Server Port Template
1549
+ </a>
1550
+ </li>
1551
+
1552
+
1553
+
1554
+
1555
+
1556
+
1557
+
1558
+
1559
+
1560
+ <li class="md-nav__item">
1561
+ <a href="../models/dcim/device.html" class="md-nav__link">
1562
+ Device
1563
+ </a>
1564
+ </li>
1565
+
1566
+
1567
+
1568
+
1569
+
1570
+
1571
+
1572
+
1573
+
1574
+ <li class="md-nav__item">
1575
+ <a href="../models/dcim/devicebay.html" class="md-nav__link">
1576
+ Device Bay
1577
+ </a>
1578
+ </li>
1579
+
1580
+
1581
+
1582
+
1583
+
1584
+
1585
+
1586
+
1587
+
1588
+ <li class="md-nav__item">
1589
+ <a href="../models/dcim/devicebaytemplate.html" class="md-nav__link">
1590
+ Device Bay Template
1591
+ </a>
1592
+ </li>
1593
+
1594
+
1595
+
1596
+
1597
+
1598
+
1599
+
1600
+
1601
+
1602
+ <li class="md-nav__item">
1603
+ <a href="../models/dcim/deviceredundancygroup.html" class="md-nav__link">
1604
+ Device Redundancy Group
1605
+ </a>
1606
+ </li>
1607
+
1608
+
1609
+
1610
+
1611
+
1612
+
1613
+
1614
+
1615
+
1616
+ <li class="md-nav__item">
1617
+ <a href="../models/dcim/devicetype.html" class="md-nav__link">
1618
+ Device Type
1619
+ </a>
1620
+ </li>
1621
+
1622
+
1623
+
1624
+
1625
+
1626
+
1627
+
1628
+
1629
+
1630
+ <li class="md-nav__item">
1631
+ <a href="../models/dcim/frontport.html" class="md-nav__link">
1632
+ Front Port
1633
+ </a>
1634
+ </li>
1635
+
1636
+
1637
+
1638
+
1639
+
1640
+
1641
+
1642
+
1643
+
1644
+ <li class="md-nav__item">
1645
+ <a href="../models/dcim/frontporttemplate.html" class="md-nav__link">
1646
+ Front Port Template
1647
+ </a>
1648
+ </li>
1649
+
1650
+
1651
+
1652
+
1653
+
1654
+
1655
+
1656
+
1657
+
1658
+ <li class="md-nav__item">
1659
+ <a href="../models/dcim/interface.html" class="md-nav__link">
1660
+ Interface
1661
+ </a>
1662
+ </li>
1663
+
1664
+
1665
+
1666
+
1667
+
1668
+
1669
+
1670
+
1671
+
1672
+ <li class="md-nav__item">
1673
+ <a href="../models/dcim/interfacetemplate.html" class="md-nav__link">
1674
+ Interface Template
1675
+ </a>
1676
+ </li>
1677
+
1678
+
1679
+
1680
+
1681
+
1682
+
1683
+
1684
+
1685
+
1686
+ <li class="md-nav__item">
1687
+ <a href="../models/dcim/inventoryitem.html" class="md-nav__link">
1688
+ Inventory Item
1689
+ </a>
1690
+ </li>
1691
+
1692
+
1693
+
1694
+
1695
+
1696
+
1697
+
1698
+
1699
+
1700
+ <li class="md-nav__item">
1701
+ <a href="../models/dcim/location.html" class="md-nav__link">
1702
+ Location
1703
+ </a>
1704
+ </li>
1705
+
1706
+
1707
+
1708
+
1709
+
1710
+
1711
+
1712
+
1713
+
1714
+ <li class="md-nav__item">
1715
+ <a href="../models/dcim/locationtype.html" class="md-nav__link">
1716
+ Location Type
1717
+ </a>
1718
+ </li>
1719
+
1720
+
1721
+
1722
+
1723
+
1724
+
1725
+
1726
+
1727
+
1728
+ <li class="md-nav__item">
1729
+ <a href="../models/dcim/manufacturer.html" class="md-nav__link">
1730
+ Manufacturer
1731
+ </a>
1732
+ </li>
1733
+
1734
+
1735
+
1736
+
1737
+
1738
+
1739
+
1740
+
1741
+
1742
+ <li class="md-nav__item">
1743
+ <a href="../models/dcim/platform.html" class="md-nav__link">
1744
+ Platform
1745
+ </a>
1746
+ </li>
1747
+
1748
+
1749
+
1750
+
1751
+
1752
+
1753
+
1754
+
1755
+
1756
+ <li class="md-nav__item">
1757
+ <a href="../models/dcim/powerfeed.html" class="md-nav__link">
1758
+ Power Feed
1759
+ </a>
1760
+ </li>
1761
+
1762
+
1763
+
1764
+
1765
+
1766
+
1767
+
1768
+
1769
+
1770
+ <li class="md-nav__item">
1771
+ <a href="../models/dcim/poweroutlet.html" class="md-nav__link">
1772
+ Power Outlet
1773
+ </a>
1774
+ </li>
1775
+
1776
+
1777
+
1778
+
1779
+
1780
+
1781
+
1782
+
1783
+
1784
+ <li class="md-nav__item">
1785
+ <a href="../models/dcim/poweroutlettemplate.html" class="md-nav__link">
1786
+ Power Outlet Template
1787
+ </a>
1788
+ </li>
1789
+
1790
+
1791
+
1792
+
1793
+
1794
+
1795
+
1796
+
1797
+
1798
+ <li class="md-nav__item">
1799
+ <a href="../models/dcim/powerpanel.html" class="md-nav__link">
1800
+ Power Panel
1801
+ </a>
1802
+ </li>
1803
+
1804
+
1805
+
1806
+
1807
+
1808
+
1809
+
1810
+
1811
+
1812
+ <li class="md-nav__item">
1813
+ <a href="../models/dcim/powerport.html" class="md-nav__link">
1814
+ Power Port
1815
+ </a>
1816
+ </li>
1817
+
1818
+
1819
+
1820
+
1821
+
1822
+
1823
+
1824
+
1825
+
1826
+ <li class="md-nav__item">
1827
+ <a href="../models/dcim/powerporttemplate.html" class="md-nav__link">
1828
+ Power Port Template
1829
+ </a>
1830
+ </li>
1831
+
1832
+
1833
+
1834
+
1835
+
1836
+
1837
+
1838
+
1839
+
1840
+ <li class="md-nav__item">
1841
+ <a href="../models/dcim/rack.html" class="md-nav__link">
1842
+ Rack
1843
+ </a>
1844
+ </li>
1845
+
1846
+
1847
+
1848
+
1849
+
1850
+
1851
+
1852
+
1853
+
1854
+ <li class="md-nav__item">
1855
+ <a href="../models/dcim/rackgroup.html" class="md-nav__link">
1856
+ Rack Group
1857
+ </a>
1858
+ </li>
1859
+
1860
+
1861
+
1862
+
1863
+
1864
+
1865
+
1866
+
1867
+
1868
+ <li class="md-nav__item">
1869
+ <a href="../models/dcim/rackreservation.html" class="md-nav__link">
1870
+ Rack Reservation
1871
+ </a>
1872
+ </li>
1873
+
1874
+
1875
+
1876
+
1877
+
1878
+
1879
+
1880
+
1881
+
1882
+ <li class="md-nav__item">
1883
+ <a href="../models/dcim/rearport.html" class="md-nav__link">
1884
+ Rear Port
1885
+ </a>
1886
+ </li>
1887
+
1888
+
1889
+
1890
+
1891
+
1892
+
1893
+
1894
+
1895
+
1896
+ <li class="md-nav__item">
1897
+ <a href="../models/dcim/rearporttemplate.html" class="md-nav__link">
1898
+ Rear Port Template
1899
+ </a>
1900
+ </li>
1901
+
1902
+
1903
+
1904
+
1905
+
1906
+
1907
+
1908
+
1909
+
1910
+ <li class="md-nav__item">
1911
+ <a href="../models/dcim/virtualchassis.html" class="md-nav__link">
1912
+ Virtual Chassis
1913
+ </a>
1914
+ </li>
1915
+
1916
+
1917
+
1918
+
1919
+ </ul>
1920
+ </nav>
1921
+ </li>
1922
+
1923
+
1924
+
1925
+
1926
+
1927
+
1928
+
1929
+
1930
+
1931
+
1932
+ <li class="md-nav__item md-nav__item--nested">
1933
+
1934
+
1935
+
1936
+
1937
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_3" >
1938
+
1939
+
1940
+
1941
+ <label class="md-nav__link" for="__nav_2_8_3" id="__nav_2_8_3_label" tabindex="0">
1942
+ Extras
1943
+ <span class="md-nav__icon md-icon"></span>
1944
+ </label>
1945
+
1946
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_3_label" aria-expanded="false">
1947
+ <label class="md-nav__title" for="__nav_2_8_3">
1948
+ <span class="md-nav__icon md-icon"></span>
1949
+ Extras
1950
+ </label>
1951
+ <ul class="md-nav__list" data-md-scrollfix>
1952
+
1953
+
1954
+
1955
+
1956
+
1957
+
1958
+ <li class="md-nav__item">
1959
+ <a href="../models/extras/configcontext.html" class="md-nav__link">
1960
+ Config Context
1961
+ </a>
1962
+ </li>
1963
+
1964
+
1965
+
1966
+
1967
+
1968
+
1969
+
1970
+
1971
+
1972
+ <li class="md-nav__item">
1973
+ <a href="../models/extras/configcontextschema.html" class="md-nav__link">
1974
+ Config Context Schema
1975
+ </a>
1976
+ </li>
1977
+
1978
+
1979
+
1980
+
1981
+
1982
+
1983
+
1984
+
1985
+
1986
+ <li class="md-nav__item">
1987
+ <a href="../models/extras/graphqlquery.html" class="md-nav__link">
1988
+ GraphQL Query
1989
+ </a>
1990
+ </li>
1991
+
1992
+
1993
+
1994
+
1995
+
1996
+
1997
+
1998
+
1999
+
2000
+ <li class="md-nav__item">
2001
+ <a href="../models/extras/imageattachment.html" class="md-nav__link">
2002
+ Image Attachment
2003
+ </a>
2004
+ </li>
2005
+
2006
+
2007
+
2008
+
2009
+
2010
+
2011
+
2012
+
2013
+
2014
+ <li class="md-nav__item">
2015
+ <a href="../models/extras/job.html" class="md-nav__link">
2016
+ Job
2017
+ </a>
2018
+ </li>
2019
+
2020
+
2021
+
2022
+
2023
+
2024
+
2025
+
2026
+
2027
+
2028
+ <li class="md-nav__item">
2029
+ <a href="../models/extras/joblogentry.html" class="md-nav__link">
2030
+ Job Log Entry
2031
+ </a>
2032
+ </li>
2033
+
2034
+
2035
+
2036
+
2037
+
2038
+
2039
+
2040
+
2041
+
2042
+ <li class="md-nav__item">
2043
+ <a href="../models/extras/jobresult.html" class="md-nav__link">
2044
+ Job Result
2045
+ </a>
2046
+ </li>
2047
+
2048
+
2049
+
2050
+
2051
+
2052
+
2053
+
2054
+
2055
+
2056
+ <li class="md-nav__item">
2057
+ <a href="../models/extras/role.html" class="md-nav__link">
2058
+ Role
2059
+ </a>
2060
+ </li>
2061
+
2062
+
2063
+
2064
+
2065
+
2066
+
2067
+
2068
+
2069
+
2070
+ <li class="md-nav__item">
2071
+ <a href="../models/extras/secret.html" class="md-nav__link">
2072
+ Secret
2073
+ </a>
2074
+ </li>
2075
+
2076
+
2077
+
2078
+
2079
+
2080
+
2081
+
2082
+
2083
+
2084
+ <li class="md-nav__item">
2085
+ <a href="../models/extras/secretsgroup.html" class="md-nav__link">
2086
+ Secrets group
2087
+ </a>
2088
+ </li>
2089
+
2090
+
2091
+
2092
+
2093
+ </ul>
2094
+ </nav>
2095
+ </li>
2096
+
2097
+
2098
+
2099
+
2100
+
2101
+
2102
+
2103
+
2104
+
2105
+
2106
+ <li class="md-nav__item md-nav__item--nested">
2107
+
2108
+
2109
+
2110
+
2111
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_4" >
2112
+
2113
+
2114
+
2115
+ <label class="md-nav__link" for="__nav_2_8_4" id="__nav_2_8_4_label" tabindex="0">
2116
+ IPAM
2117
+ <span class="md-nav__icon md-icon"></span>
2118
+ </label>
2119
+
2120
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_4_label" aria-expanded="false">
2121
+ <label class="md-nav__title" for="__nav_2_8_4">
2122
+ <span class="md-nav__icon md-icon"></span>
2123
+ IPAM
2124
+ </label>
2125
+ <ul class="md-nav__list" data-md-scrollfix>
2126
+
2127
+
2128
+
2129
+
2130
+
2131
+
2132
+ <li class="md-nav__item">
2133
+ <a href="../models/ipam/ipaddress.html" class="md-nav__link">
2134
+ IP Address
2135
+ </a>
2136
+ </li>
2137
+
2138
+
2139
+
2140
+
2141
+
2142
+
2143
+
2144
+
2145
+
2146
+ <li class="md-nav__item">
2147
+ <a href="../models/ipam/prefix.html" class="md-nav__link">
2148
+ Prefix
2149
+ </a>
2150
+ </li>
2151
+
2152
+
2153
+
2154
+
2155
+
2156
+
2157
+
2158
+
2159
+
2160
+ <li class="md-nav__item">
2161
+ <a href="../models/ipam/rir.html" class="md-nav__link">
2162
+ Rir
2163
+ </a>
2164
+ </li>
2165
+
2166
+
2167
+
2168
+
2169
+
2170
+
2171
+
2172
+
2173
+
2174
+ <li class="md-nav__item">
2175
+ <a href="../models/ipam/routetarget.html" class="md-nav__link">
2176
+ Route Target
2177
+ </a>
2178
+ </li>
2179
+
2180
+
2181
+
2182
+
2183
+
2184
+
2185
+
2186
+
2187
+
2188
+ <li class="md-nav__item">
2189
+ <a href="../models/ipam/service.html" class="md-nav__link">
2190
+ Service
2191
+ </a>
2192
+ </li>
2193
+
2194
+
2195
+
2196
+
2197
+
2198
+
2199
+
2200
+
2201
+
2202
+ <li class="md-nav__item">
2203
+ <a href="../models/ipam/vlan.html" class="md-nav__link">
2204
+ VLAN
2205
+ </a>
2206
+ </li>
2207
+
2208
+
2209
+
2210
+
2211
+
2212
+
2213
+
2214
+
2215
+
2216
+ <li class="md-nav__item">
2217
+ <a href="../models/ipam/vlangroup.html" class="md-nav__link">
2218
+ VLAN Group
2219
+ </a>
2220
+ </li>
2221
+
2222
+
2223
+
2224
+
2225
+
2226
+
2227
+
2228
+
2229
+
2230
+ <li class="md-nav__item">
2231
+ <a href="../models/ipam/vrf.html" class="md-nav__link">
2232
+ VRF
2233
+ </a>
2234
+ </li>
2235
+
2236
+
2237
+
2238
+
2239
+ </ul>
2240
+ </nav>
2241
+ </li>
2242
+
2243
+
2244
+
2245
+
2246
+
2247
+
2248
+
2249
+
2250
+
2251
+
2252
+ <li class="md-nav__item md-nav__item--nested">
2253
+
2254
+
2255
+
2256
+
2257
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_5" >
2258
+
2259
+
2260
+
2261
+ <label class="md-nav__link" for="__nav_2_8_5" id="__nav_2_8_5_label" tabindex="0">
2262
+ Tenancy
2263
+ <span class="md-nav__icon md-icon"></span>
2264
+ </label>
2265
+
2266
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_5_label" aria-expanded="false">
2267
+ <label class="md-nav__title" for="__nav_2_8_5">
2268
+ <span class="md-nav__icon md-icon"></span>
2269
+ Tenancy
2270
+ </label>
2271
+ <ul class="md-nav__list" data-md-scrollfix>
2272
+
2273
+
2274
+
2275
+
2276
+
2277
+
2278
+ <li class="md-nav__item">
2279
+ <a href="../models/tenancy/tenant.html" class="md-nav__link">
2280
+ Tenant
2281
+ </a>
2282
+ </li>
2283
+
2284
+
2285
+
2286
+
2287
+
2288
+
2289
+
2290
+
2291
+
2292
+ <li class="md-nav__item">
2293
+ <a href="../models/tenancy/tenantgroup.html" class="md-nav__link">
2294
+ Tenant Group
2295
+ </a>
2296
+ </li>
2297
+
2298
+
2299
+
2300
+
2301
+ </ul>
2302
+ </nav>
2303
+ </li>
2304
+
2305
+
2306
+
2307
+
2308
+
2309
+
2310
+
2311
+
2312
+
2313
+
2314
+ <li class="md-nav__item md-nav__item--nested">
2315
+
2316
+
2317
+
2318
+
2319
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_6" >
2320
+
2321
+
2322
+
2323
+ <label class="md-nav__link" for="__nav_2_8_6" id="__nav_2_8_6_label" tabindex="0">
2324
+ Users
2325
+ <span class="md-nav__icon md-icon"></span>
2326
+ </label>
2327
+
2328
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_6_label" aria-expanded="false">
2329
+ <label class="md-nav__title" for="__nav_2_8_6">
2330
+ <span class="md-nav__icon md-icon"></span>
2331
+ Users
2332
+ </label>
2333
+ <ul class="md-nav__list" data-md-scrollfix>
2334
+
2335
+
2336
+
2337
+
2338
+
2339
+
2340
+ <li class="md-nav__item">
2341
+ <a href="../models/users/objectpermission.html" class="md-nav__link">
2342
+ Object Permission
2343
+ </a>
2344
+ </li>
2345
+
2346
+
2347
+
2348
+
2349
+
2350
+
2351
+
2352
+
2353
+
2354
+ <li class="md-nav__item">
2355
+ <a href="../models/users/token.html" class="md-nav__link">
2356
+ Token
2357
+ </a>
2358
+ </li>
2359
+
2360
+
2361
+
2362
+
2363
+ </ul>
2364
+ </nav>
2365
+ </li>
2366
+
2367
+
2368
+
2369
+
2370
+
2371
+
2372
+
2373
+
2374
+
2375
+
2376
+ <li class="md-nav__item md-nav__item--nested">
2377
+
2378
+
2379
+
2380
+
2381
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_7" >
2382
+
2383
+
2384
+
2385
+ <label class="md-nav__link" for="__nav_2_8_7" id="__nav_2_8_7_label" tabindex="0">
2386
+ Virtualization
2387
+ <span class="md-nav__icon md-icon"></span>
2388
+ </label>
2389
+
2390
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_7_label" aria-expanded="false">
2391
+ <label class="md-nav__title" for="__nav_2_8_7">
2392
+ <span class="md-nav__icon md-icon"></span>
2393
+ Virtualization
2394
+ </label>
2395
+ <ul class="md-nav__list" data-md-scrollfix>
2396
+
2397
+
2398
+
2399
+
2400
+
2401
+
2402
+ <li class="md-nav__item">
2403
+ <a href="../models/virtualization/cluster.html" class="md-nav__link">
2404
+ Cluster
2405
+ </a>
2406
+ </li>
2407
+
2408
+
2409
+
2410
+
2411
+
2412
+
2413
+
2414
+
2415
+
2416
+ <li class="md-nav__item">
2417
+ <a href="../models/virtualization/clustergroup.html" class="md-nav__link">
2418
+ Cluster Group
2419
+ </a>
2420
+ </li>
2421
+
2422
+
2423
+
2424
+
2425
+
2426
+
2427
+
2428
+
2429
+
2430
+ <li class="md-nav__item">
2431
+ <a href="../models/virtualization/clustertype.html" class="md-nav__link">
2432
+ Cluster Type
2433
+ </a>
2434
+ </li>
2435
+
2436
+
2437
+
2438
+
2439
+
2440
+
2441
+
2442
+
2443
+
2444
+ <li class="md-nav__item">
2445
+ <a href="../models/virtualization/virtualmachine.html" class="md-nav__link">
2446
+ Virtual Machine
2447
+ </a>
2448
+ </li>
2449
+
2450
+
2451
+
2452
+
2453
+
2454
+
2455
+
2456
+
2457
+
2458
+ <li class="md-nav__item">
2459
+ <a href="../models/virtualization/vminterface.html" class="md-nav__link">
2460
+ VM Interface
2461
+ </a>
2462
+ </li>
2463
+
2464
+
2465
+
2466
+
2467
+ </ul>
2468
+ </nav>
2469
+ </li>
2470
+
2471
+
2472
+
2473
+
2474
+ </ul>
2475
+ </nav>
2476
+ </li>
2477
+
2478
+
2479
+
2480
+
2481
+
2482
+
2483
+
2484
+
2485
+
2486
+
2487
+ <li class="md-nav__item md-nav__item--nested">
2488
+
2489
+
2490
+
2491
+
2492
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_9" >
2493
+
2494
+
2495
+
2496
+ <label class="md-nav__link" for="__nav_2_9" id="__nav_2_9_label" tabindex="0">
2497
+ Additional Features
2498
+ <span class="md-nav__icon md-icon"></span>
2499
+ </label>
2500
+
2501
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_9_label" aria-expanded="false">
2502
+ <label class="md-nav__title" for="__nav_2_9">
2503
+ <span class="md-nav__icon md-icon"></span>
2504
+ Additional Features
2505
+ </label>
2506
+ <ul class="md-nav__list" data-md-scrollfix>
2507
+
2508
+
2509
+
2510
+
2511
+
2512
+
2513
+ <li class="md-nav__item">
2514
+ <a href="../additional-features/caching.html" class="md-nav__link">
2515
+ Caching
2516
+ </a>
2517
+ </li>
2518
+
2519
+
2520
+
2521
+
2522
+
2523
+
2524
+
2525
+
2526
+
2527
+ <li class="md-nav__item">
2528
+ <a href="../additional-features/change-logging.html" class="md-nav__link">
2529
+ Change Logging
2530
+ </a>
2531
+ </li>
2532
+
2533
+
2534
+
2535
+
2536
+
2537
+
2538
+
2539
+
2540
+
2541
+ <li class="md-nav__item">
2542
+ <a href="../models/extras/computedfield.html" class="md-nav__link">
2543
+ Computed Fields
2544
+ </a>
2545
+ </li>
2546
+
2547
+
2548
+
2549
+
2550
+
2551
+
2552
+
2553
+
2554
+
2555
+ <li class="md-nav__item">
2556
+ <a href="../additional-features/config-contexts.html" class="md-nav__link">
2557
+ Context Data
2558
+ </a>
2559
+ </li>
2560
+
2561
+
2562
+
2563
+
2564
+
2565
+
2566
+
2567
+
2568
+
2569
+ <li class="md-nav__item">
2570
+ <a href="../models/extras/customfield.html" class="md-nav__link">
2571
+ Custom Fields
2572
+ </a>
2573
+ </li>
2574
+
2575
+
2576
+
2577
+
2578
+
2579
+
2580
+
2581
+
2582
+
2583
+ <li class="md-nav__item">
2584
+ <a href="../models/extras/customlink.html" class="md-nav__link">
2585
+ Custom Links
2586
+ </a>
2587
+ </li>
2588
+
2589
+
2590
+
2591
+
2592
+
2593
+
2594
+
2595
+
2596
+
2597
+ <li class="md-nav__item">
2598
+ <a href="../models/extras/dynamicgroup.html" class="md-nav__link">
2599
+ Dynamic Groups
2600
+ </a>
2601
+ </li>
2602
+
2603
+
2604
+
2605
+
2606
+
2607
+
2608
+
2609
+
2610
+
2611
+ <li class="md-nav__item">
2612
+ <a href="../models/extras/exporttemplate.html" class="md-nav__link">
2613
+ Export Templates
2614
+ </a>
2615
+ </li>
2616
+
2617
+
2618
+
2619
+
2620
+
2621
+
2622
+
2623
+
2624
+
2625
+ <li class="md-nav__item">
2626
+ <a href="../models/extras/gitrepository.html" class="md-nav__link">
2627
+ Git Repositories
2628
+ </a>
2629
+ </li>
2630
+
2631
+
2632
+
2633
+
2634
+
2635
+
2636
+
2637
+
2638
+
2639
+ <li class="md-nav__item">
2640
+ <a href="../additional-features/healthcheck.html" class="md-nav__link">
2641
+ Health Check
2642
+ </a>
2643
+ </li>
2644
+
2645
+
2646
+
2647
+
2648
+
2649
+
2650
+
2651
+
2652
+
2653
+ <li class="md-nav__item">
2654
+ <a href="../additional-features/jobs.html" class="md-nav__link">
2655
+ Jobs
2656
+ </a>
2657
+ </li>
2658
+
2659
+
2660
+
2661
+
2662
+
2663
+
2664
+
2665
+
2666
+
2667
+ <li class="md-nav__item">
2668
+ <a href="../models/extras/jobbutton.html" class="md-nav__link">
2669
+ Job Buttons
2670
+ </a>
2671
+ </li>
2672
+
2673
+
2674
+
2675
+
2676
+
2677
+
2678
+
2679
+
2680
+
2681
+ <li class="md-nav__item">
2682
+ <a href="../models/extras/jobhook.html" class="md-nav__link">
2683
+ Job Hooks
2684
+ </a>
2685
+ </li>
2686
+
2687
+
2688
+
2689
+
2690
+
2691
+
2692
+
2693
+
2694
+
2695
+ <li class="md-nav__item">
2696
+ <a href="../additional-features/job-scheduling-and-approvals.html" class="md-nav__link">
2697
+ Job Scheduling and Approvals
2698
+ </a>
2699
+ </li>
2700
+
2701
+
2702
+
2703
+
2704
+
2705
+
2706
+
2707
+
2708
+
2709
+ <li class="md-nav__item">
2710
+ <a href="../additional-features/napalm.html" class="md-nav__link">
2711
+ NAPALM
2712
+ </a>
2713
+ </li>
2714
+
2715
+
2716
+
2717
+
2718
+
2719
+
2720
+
2721
+
2722
+
2723
+ <li class="md-nav__item">
2724
+ <a href="../models/extras/note.html" class="md-nav__link">
2725
+ Notes
2726
+ </a>
2727
+ </li>
2728
+
2729
+
2730
+
2731
+
2732
+
2733
+
2734
+
2735
+
2736
+
2737
+ <li class="md-nav__item">
2738
+ <a href="../additional-features/prometheus-metrics.html" class="md-nav__link">
2739
+ Prometheus Metrics
2740
+ </a>
2741
+ </li>
2742
+
2743
+
2744
+
2745
+
2746
+
2747
+
2748
+
2749
+
2750
+
2751
+ <li class="md-nav__item">
2752
+ <a href="../models/extras/relationship.html" class="md-nav__link">
2753
+ Relationships
2754
+ </a>
2755
+ </li>
2756
+
2757
+
2758
+
2759
+
2760
+
2761
+
2762
+
2763
+
2764
+
2765
+ <li class="md-nav__item">
2766
+ <a href="../models/extras/status.html" class="md-nav__link">
2767
+ Statuses
2768
+ </a>
2769
+ </li>
2770
+
2771
+
2772
+
2773
+
2774
+
2775
+
2776
+
2777
+
2778
+
2779
+ <li class="md-nav__item">
2780
+ <a href="../models/extras/tag.html" class="md-nav__link">
2781
+ Tags
2782
+ </a>
2783
+ </li>
2784
+
2785
+
2786
+
2787
+
2788
+
2789
+
2790
+
2791
+
2792
+
2793
+ <li class="md-nav__item">
2794
+ <a href="../additional-features/template-filters.html" class="md-nav__link">
2795
+ Template Filters
2796
+ </a>
2797
+ </li>
2798
+
2799
+
2800
+
2801
+
2802
+
2803
+
2804
+
2805
+
2806
+
2807
+ <li class="md-nav__item">
2808
+ <a href="../models/extras/webhook.html" class="md-nav__link">
2809
+ Webhooks
2810
+ </a>
2811
+ </li>
2812
+
2813
+
2814
+
2815
+
2816
+ </ul>
2817
+ </nav>
2818
+ </li>
2819
+
2820
+
2821
+
2822
+
2823
+
2824
+
2825
+
2826
+
2827
+
2828
+
2829
+ <li class="md-nav__item md-nav__item--nested">
2830
+
2831
+
2832
+
2833
+
2834
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_10" >
2835
+
2836
+
2837
+
2838
+ <label class="md-nav__link" for="__nav_2_10" id="__nav_2_10_label" tabindex="0">
2839
+ REST API
2840
+ <span class="md-nav__icon md-icon"></span>
2841
+ </label>
2842
+
2843
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_10_label" aria-expanded="false">
2844
+ <label class="md-nav__title" for="__nav_2_10">
2845
+ <span class="md-nav__icon md-icon"></span>
2846
+ REST API
2847
+ </label>
2848
+ <ul class="md-nav__list" data-md-scrollfix>
2849
+
2850
+
2851
+
2852
+
2853
+
2854
+
2855
+ <li class="md-nav__item">
2856
+ <a href="../rest-api/overview.html" class="md-nav__link">
2857
+ Overview
2858
+ </a>
2859
+ </li>
2860
+
2861
+
2862
+
2863
+
2864
+
2865
+
2866
+
2867
+
2868
+
2869
+ <li class="md-nav__item">
2870
+ <a href="../rest-api/filtering.html" class="md-nav__link">
2871
+ Filtering
2872
+ </a>
2873
+ </li>
2874
+
2875
+
2876
+
2877
+
2878
+
2879
+
2880
+
2881
+
2882
+
2883
+ <li class="md-nav__item">
2884
+ <a href="../rest-api/authentication.html" class="md-nav__link">
2885
+ Authentication
2886
+ </a>
2887
+ </li>
2888
+
2889
+
2890
+
2891
+
2892
+
2893
+
2894
+
2895
+
2896
+
2897
+ <li class="md-nav__item">
2898
+ <a href="../rest-api/ui-related-endpoints.html" class="md-nav__link">
2899
+ UI Endpoints
2900
+ </a>
2901
+ </li>
2902
+
2903
+
2904
+
2905
+
2906
+ </ul>
2907
+ </nav>
2908
+ </li>
2909
+
2910
+
2911
+
2912
+
2913
+
2914
+
2915
+
2916
+
2917
+
2918
+
2919
+ <li class="md-nav__item md-nav__item--nested">
2920
+
2921
+
2922
+
2923
+
2924
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_11" >
2925
+
2926
+
2927
+
2928
+ <label class="md-nav__link" for="__nav_2_11" id="__nav_2_11_label" tabindex="0">
2929
+ GraphQL API
2930
+ <span class="md-nav__icon md-icon"></span>
2931
+ </label>
2932
+
2933
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_11_label" aria-expanded="false">
2934
+ <label class="md-nav__title" for="__nav_2_11">
2935
+ <span class="md-nav__icon md-icon"></span>
2936
+ GraphQL API
2937
+ </label>
2938
+ <ul class="md-nav__list" data-md-scrollfix>
2939
+
2940
+
2941
+
2942
+
2943
+
2944
+
2945
+ <li class="md-nav__item">
2946
+ <a href="../additional-features/graphql.html" class="md-nav__link">
2947
+ Overview
2948
+ </a>
2949
+ </li>
2950
+
2951
+
2952
+
2953
+
2954
+ </ul>
2955
+ </nav>
2956
+ </li>
2957
+
2958
+
2959
+
2960
+
2961
+
2962
+
2963
+
2964
+
2965
+
2966
+ <li class="md-nav__item">
2967
+ <a href="../plugins/index.html" class="md-nav__link">
2968
+ Installing and Using Plugins
2969
+ </a>
2970
+ </li>
2971
+
2972
+
2973
+
2974
+
2975
+ </ul>
2976
+ </nav>
2977
+ </li>
2978
+
2979
+
2980
+
2981
+
2982
+
2983
+
2984
+
2985
+
2986
+
2987
+
2988
+
2989
+ <li class="md-nav__item md-nav__item--nested">
2990
+
2991
+
2992
+
2993
+
2994
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
2995
+
2996
+
2997
+
2998
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
2999
+ App Developer Guide
3000
+ <span class="md-nav__icon md-icon"></span>
3001
+ </label>
3002
+
3003
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
3004
+ <label class="md-nav__title" for="__nav_3">
3005
+ <span class="md-nav__icon md-icon"></span>
3006
+ App Developer Guide
3007
+ </label>
3008
+ <ul class="md-nav__list" data-md-scrollfix>
3009
+
3010
+
3011
+
3012
+
3013
+
3014
+
3015
+ <li class="md-nav__item">
3016
+ <a href="../plugins/development.html" class="md-nav__link">
3017
+ Developing Apps
3018
+ </a>
3019
+ </li>
3020
+
3021
+
3022
+
3023
+
3024
+
3025
+
3026
+
3027
+
3028
+
3029
+ <li class="md-nav__item">
3030
+ <a href="../plugins/porting-from-netbox.html" class="md-nav__link">
3031
+ Porting NetBox Plugins to Nautobot
3032
+ </a>
3033
+ </li>
3034
+
3035
+
3036
+
3037
+
3038
+
3039
+
3040
+
3041
+
3042
+
3043
+
3044
+ <li class="md-nav__item md-nav__item--nested">
3045
+
3046
+
3047
+
3048
+
3049
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3" >
3050
+
3051
+
3052
+
3053
+ <label class="md-nav__link" for="__nav_3_3" id="__nav_3_3_label" tabindex="0">
3054
+ Code Reference
3055
+ <span class="md-nav__icon md-icon"></span>
3056
+ </label>
3057
+
3058
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_3_label" aria-expanded="false">
3059
+ <label class="md-nav__title" for="__nav_3_3">
3060
+ <span class="md-nav__icon md-icon"></span>
3061
+ Code Reference
3062
+ </label>
3063
+ <ul class="md-nav__list" data-md-scrollfix>
3064
+
3065
+
3066
+
3067
+
3068
+
3069
+
3070
+ <li class="md-nav__item">
3071
+ <a href="../code-reference/nautobot/apps/__init__.html" class="md-nav__link">
3072
+ nautobot.apps
3073
+ </a>
3074
+ </li>
3075
+
3076
+
3077
+
3078
+
3079
+
3080
+
3081
+
3082
+
3083
+
3084
+ <li class="md-nav__item">
3085
+ <a href="../code-reference/nautobot/apps/admin.html" class="md-nav__link">
3086
+ nautobot.apps.admin
3087
+ </a>
3088
+ </li>
3089
+
3090
+
3091
+
3092
+
3093
+
3094
+
3095
+
3096
+
3097
+
3098
+ <li class="md-nav__item">
3099
+ <a href="../code-reference/nautobot/apps/api.html" class="md-nav__link">
3100
+ nautobot.apps.api
3101
+ </a>
3102
+ </li>
3103
+
3104
+
3105
+
3106
+
3107
+
3108
+
3109
+
3110
+
3111
+
3112
+ <li class="md-nav__item">
3113
+ <a href="../code-reference/nautobot/apps/choices.html" class="md-nav__link">
3114
+ nautobot.apps.choices
3115
+ </a>
3116
+ </li>
3117
+
3118
+
3119
+
3120
+
3121
+
3122
+
3123
+
3124
+
3125
+
3126
+ <li class="md-nav__item">
3127
+ <a href="../code-reference/nautobot/apps/datasources.html" class="md-nav__link">
3128
+ nautobot.apps.datasources
3129
+ </a>
3130
+ </li>
3131
+
3132
+
3133
+
3134
+
3135
+
3136
+
3137
+
3138
+
3139
+
3140
+ <li class="md-nav__item">
3141
+ <a href="../code-reference/nautobot/apps/filters.html" class="md-nav__link">
3142
+ nautobot.apps.filters
3143
+ </a>
3144
+ </li>
3145
+
3146
+
3147
+
3148
+
3149
+
3150
+
3151
+
3152
+
3153
+
3154
+ <li class="md-nav__item">
3155
+ <a href="../code-reference/nautobot/apps/forms.html" class="md-nav__link">
3156
+ nautobot.apps.forms
3157
+ </a>
3158
+ </li>
3159
+
3160
+
3161
+
3162
+
3163
+
3164
+
3165
+
3166
+
3167
+
3168
+ <li class="md-nav__item">
3169
+ <a href="../code-reference/nautobot/apps/models.html" class="md-nav__link">
3170
+ nautobot.apps.models
3171
+ </a>
3172
+ </li>
3173
+
3174
+
3175
+
3176
+
3177
+
3178
+
3179
+
3180
+
3181
+
3182
+ <li class="md-nav__item">
3183
+ <a href="../code-reference/nautobot/apps/secrets.html" class="md-nav__link">
3184
+ nautobot.apps.secrets
3185
+ </a>
3186
+ </li>
3187
+
3188
+
3189
+
3190
+
3191
+
3192
+
3193
+
3194
+
3195
+
3196
+ <li class="md-nav__item">
3197
+ <a href="../code-reference/nautobot/apps/tables.html" class="md-nav__link">
3198
+ nautobot.apps.tables
3199
+ </a>
3200
+ </li>
3201
+
3202
+
3203
+
3204
+
3205
+
3206
+
3207
+
3208
+
3209
+
3210
+ <li class="md-nav__item">
3211
+ <a href="../code-reference/nautobot/apps/testing.html" class="md-nav__link">
3212
+ nautobot.apps.testing
3213
+ </a>
3214
+ </li>
3215
+
3216
+
3217
+
3218
+
3219
+
3220
+
3221
+
3222
+
3223
+
3224
+ <li class="md-nav__item">
3225
+ <a href="../code-reference/nautobot/apps/ui.html" class="md-nav__link">
3226
+ nautobot.apps.ui
3227
+ </a>
3228
+ </li>
3229
+
3230
+
3231
+
3232
+
3233
+
3234
+
3235
+
3236
+
3237
+
3238
+ <li class="md-nav__item">
3239
+ <a href="../code-reference/nautobot/apps/urls.html" class="md-nav__link">
3240
+ nautobot.apps.urls
3241
+ </a>
3242
+ </li>
3243
+
3244
+
3245
+
3246
+
3247
+
3248
+
3249
+
3250
+
3251
+
3252
+ <li class="md-nav__item">
3253
+ <a href="../code-reference/nautobot/apps/views.html" class="md-nav__link">
3254
+ nautobot.apps.views
3255
+ </a>
3256
+ </li>
3257
+
3258
+
3259
+
3260
+
3261
+ </ul>
3262
+ </nav>
3263
+ </li>
3264
+
3265
+
3266
+
3267
+
3268
+ </ul>
3269
+ </nav>
3270
+ </li>
3271
+
3272
+
3273
+
3274
+
3275
+
3276
+
3277
+
3278
+
3279
+
3280
+
3281
+
3282
+ <li class="md-nav__item md-nav__item--nested">
3283
+
3284
+
3285
+
3286
+
3287
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
3288
+
3289
+
3290
+
3291
+ <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
3292
+ Core Developer Guide
3293
+ <span class="md-nav__icon md-icon"></span>
3294
+ </label>
3295
+
3296
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
3297
+ <label class="md-nav__title" for="__nav_4">
3298
+ <span class="md-nav__icon md-icon"></span>
3299
+ Core Developer Guide
3300
+ </label>
3301
+ <ul class="md-nav__list" data-md-scrollfix>
3302
+
3303
+
3304
+
3305
+
3306
+
3307
+
3308
+ <li class="md-nav__item">
3309
+ <a href="index.html" class="md-nav__link">
3310
+ Introduction
3311
+ </a>
3312
+ </li>
3313
+
3314
+
3315
+
3316
+
3317
+
3318
+
3319
+
3320
+
3321
+
3322
+ <li class="md-nav__item">
3323
+ <a href="getting-started.html" class="md-nav__link">
3324
+ Getting Started
3325
+ </a>
3326
+ </li>
3327
+
3328
+
3329
+
3330
+
3331
+
3332
+
3333
+
3334
+
3335
+
3336
+ <li class="md-nav__item">
3337
+ <a href="docker-compose-advanced-use-cases.html" class="md-nav__link">
3338
+ Advanced Docker Compose Usage
3339
+ </a>
3340
+ </li>
3341
+
3342
+
3343
+
3344
+
3345
+
3346
+
3347
+
3348
+
3349
+
3350
+ <li class="md-nav__item">
3351
+ <a href="best-practices.html" class="md-nav__link">
3352
+ Best Practices
3353
+ </a>
3354
+ </li>
3355
+
3356
+
3357
+
3358
+
3359
+
3360
+
3361
+
3362
+
3363
+
3364
+ <li class="md-nav__item">
3365
+ <a href="style-guide.html" class="md-nav__link">
3366
+ Style Guide
3367
+ </a>
3368
+ </li>
3369
+
3370
+
3371
+
3372
+
3373
+
3374
+
3375
+
3376
+
3377
+
3378
+ <li class="md-nav__item">
3379
+ <a href="extending-models.html" class="md-nav__link">
3380
+ Extending Models
3381
+ </a>
3382
+ </li>
3383
+
3384
+
3385
+
3386
+
3387
+
3388
+
3389
+
3390
+
3391
+
3392
+ <li class="md-nav__item">
3393
+ <a href="testing.html" class="md-nav__link">
3394
+ Testing
3395
+ </a>
3396
+ </li>
3397
+
3398
+
3399
+
3400
+
3401
+
3402
+
3403
+
3404
+
3405
+
3406
+ <li class="md-nav__item">
3407
+ <a href="application-registry.html" class="md-nav__link">
3408
+ Application Registry
3409
+ </a>
3410
+ </li>
3411
+
3412
+
3413
+
3414
+
3415
+
3416
+
3417
+
3418
+
3419
+
3420
+ <li class="md-nav__item">
3421
+ <a href="model-features.html" class="md-nav__link">
3422
+ Model Features
3423
+ </a>
3424
+ </li>
3425
+
3426
+
3427
+
3428
+
3429
+
3430
+
3431
+
3432
+
3433
+
3434
+ <li class="md-nav__item">
3435
+ <a href="natural-keys.html" class="md-nav__link">
3436
+ Natural Keys
3437
+ </a>
3438
+ </li>
3439
+
3440
+
3441
+
3442
+
3443
+
3444
+
3445
+
3446
+
3447
+
3448
+ <li class="md-nav__item">
3449
+ <a href="templates.html" class="md-nav__link">
3450
+ Page Templates
3451
+ </a>
3452
+ </li>
3453
+
3454
+
3455
+
3456
+
3457
+
3458
+
3459
+
3460
+
3461
+
3462
+ <li class="md-nav__item">
3463
+ <a href="navigation-menu.html" class="md-nav__link">
3464
+ Navigation Menu
3465
+ </a>
3466
+ </li>
3467
+
3468
+
3469
+
3470
+
3471
+
3472
+
3473
+
3474
+
3475
+
3476
+ <li class="md-nav__item">
3477
+ <a href="homepage.html" class="md-nav__link">
3478
+ Home Page Panels
3479
+ </a>
3480
+ </li>
3481
+
3482
+
3483
+
3484
+
3485
+
3486
+
3487
+
3488
+
3489
+
3490
+ <li class="md-nav__item">
3491
+ <a href="user-preferences.html" class="md-nav__link">
3492
+ User Preferences
3493
+ </a>
3494
+ </li>
3495
+
3496
+
3497
+
3498
+
3499
+
3500
+
3501
+
3502
+
3503
+
3504
+ <li class="md-nav__item">
3505
+ <a href="release-checklist.html" class="md-nav__link">
3506
+ Release Checklist
3507
+ </a>
3508
+ </li>
3509
+
3510
+
3511
+
3512
+
3513
+ </ul>
3514
+ </nav>
3515
+ </li>
3516
+
3517
+
3518
+
3519
+
3520
+
3521
+
3522
+
3523
+
3524
+
3525
+
3526
+
3527
+ <li class="md-nav__item md-nav__item--nested">
3528
+
3529
+
3530
+
3531
+
3532
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
3533
+
3534
+
3535
+
3536
+ <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
3537
+ Release Notes
3538
+ <span class="md-nav__icon md-icon"></span>
3539
+ </label>
3540
+
3541
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
3542
+ <label class="md-nav__title" for="__nav_5">
3543
+ <span class="md-nav__icon md-icon"></span>
3544
+ Release Notes
3545
+ </label>
3546
+ <ul class="md-nav__list" data-md-scrollfix>
3547
+
3548
+
3549
+
3550
+
3551
+
3552
+
3553
+ <li class="md-nav__item">
3554
+ <a href="../release-notes/index.html" class="md-nav__link">
3555
+ Overview
3556
+ </a>
3557
+ </li>
3558
+
3559
+
3560
+
3561
+
3562
+
3563
+
3564
+
3565
+
3566
+
3567
+ <li class="md-nav__item">
3568
+ <a href="../release-notes/version-2.0.html" class="md-nav__link">
3569
+ Version 2.0
3570
+ </a>
3571
+ </li>
3572
+
3573
+
3574
+
3575
+
3576
+
3577
+
3578
+
3579
+
3580
+
3581
+ <li class="md-nav__item">
3582
+ <a href="../release-notes/version-1.5.html" class="md-nav__link">
3583
+ Version 1.5
3584
+ </a>
3585
+ </li>
3586
+
3587
+
3588
+
3589
+
3590
+
3591
+
3592
+
3593
+
3594
+
3595
+ <li class="md-nav__item">
3596
+ <a href="../release-notes/version-1.4.html" class="md-nav__link">
3597
+ Version 1.4
3598
+ </a>
3599
+ </li>
3600
+
3601
+
3602
+
3603
+
3604
+
3605
+
3606
+
3607
+
3608
+
3609
+ <li class="md-nav__item">
3610
+ <a href="../release-notes/version-1.3.html" class="md-nav__link">
3611
+ Version 1.3
3612
+ </a>
3613
+ </li>
3614
+
3615
+
3616
+
3617
+
3618
+
3619
+
3620
+
3621
+
3622
+
3623
+ <li class="md-nav__item">
3624
+ <a href="../release-notes/version-1.2.html" class="md-nav__link">
3625
+ Version 1.2
3626
+ </a>
3627
+ </li>
3628
+
3629
+
3630
+
3631
+
3632
+
3633
+
3634
+
3635
+
3636
+
3637
+ <li class="md-nav__item">
3638
+ <a href="../release-notes/version-1.1.html" class="md-nav__link">
3639
+ Version 1.1
3640
+ </a>
3641
+ </li>
3642
+
3643
+
3644
+
3645
+
3646
+
3647
+
3648
+
3649
+
3650
+
3651
+ <li class="md-nav__item">
3652
+ <a href="../release-notes/version-1.0.html" class="md-nav__link">
3653
+ Version 1.0
3654
+ </a>
3655
+ </li>
3656
+
3657
+
3658
+
3659
+
3660
+ </ul>
3661
+ </nav>
3662
+ </li>
3663
+
3664
+
3665
+
3666
+
3667
+
3668
+
3669
+
3670
+
3671
+
3672
+
3673
+
3674
+ <li class="md-nav__item md-nav__item--nested">
3675
+
3676
+
3677
+
3678
+
3679
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
3680
+
3681
+
3682
+
3683
+ <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
3684
+ Nautobot Apps
3685
+ <span class="md-nav__icon md-icon"></span>
3686
+ </label>
3687
+
3688
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
3689
+ <label class="md-nav__title" for="__nav_6">
3690
+ <span class="md-nav__icon md-icon"></span>
3691
+ Nautobot Apps
3692
+ </label>
3693
+ <ul class="md-nav__list" data-md-scrollfix>
3694
+
3695
+
3696
+
3697
+
3698
+
3699
+
3700
+ <li class="md-nav__item">
3701
+ <a href="../apps/index.html" class="md-nav__link">
3702
+ Overview
3703
+ </a>
3704
+ </li>
3705
+
3706
+
3707
+
3708
+
3709
+
3710
+
3711
+
3712
+
3713
+
3714
+
3715
+ <li class="md-nav__item md-nav__item--nested">
3716
+
3717
+
3718
+
3719
+
3720
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_2" >
3721
+
3722
+
3723
+
3724
+ <label class="md-nav__link" for="__nav_6_2" id="__nav_6_2_label" tabindex="0">
3725
+ Network to Code App Docs
3726
+ <span class="md-nav__icon md-icon"></span>
3727
+ </label>
3728
+
3729
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_2_label" aria-expanded="false">
3730
+ <label class="md-nav__title" for="__nav_6_2">
3731
+ <span class="md-nav__icon md-icon"></span>
3732
+ Network to Code App Docs
3733
+ </label>
3734
+ <ul class="md-nav__list" data-md-scrollfix>
3735
+
3736
+
3737
+
3738
+
3739
+
3740
+
3741
+ <li class="md-nav__item">
3742
+ <a href="https://docs.nautobot.com/projects/chatops/en/latest/" class="md-nav__link">
3743
+ Nautobot ChatOps
3744
+ </a>
3745
+ </li>
3746
+
3747
+
3748
+
3749
+
3750
+
3751
+
3752
+
3753
+
3754
+
3755
+ <li class="md-nav__item">
3756
+ <a href="https://docs.nautobot.com/projects/circuit-maintenance/en/latest/" class="md-nav__link">
3757
+ Nautobot Circuit Maintenance
3758
+ </a>
3759
+ </li>
3760
+
3761
+
3762
+
3763
+
3764
+
3765
+
3766
+
3767
+
3768
+
3769
+ <li class="md-nav__item">
3770
+ <a href="https://docs.nautobot.com/projects/device-lifecycle/en/latest/" class="md-nav__link">
3771
+ Nautobot Device LifeCycle Management
3772
+ </a>
3773
+ </li>
3774
+
3775
+
3776
+
3777
+
3778
+
3779
+
3780
+
3781
+
3782
+
3783
+ <li class="md-nav__item">
3784
+ <a href="https://docs.nautobot.com/projects/device-onboarding/en/latest/" class="md-nav__link">
3785
+ Nautobot Device Onboarding
3786
+ </a>
3787
+ </li>
3788
+
3789
+
3790
+
3791
+
3792
+
3793
+
3794
+
3795
+
3796
+
3797
+ <li class="md-nav__item">
3798
+ <a href="https://nautobot-plugin-firewall-models.readthedocs.io/en/latest/" class="md-nav__link">
3799
+ Nautobot Firewall Models
3800
+ </a>
3801
+ </li>
3802
+
3803
+
3804
+
3805
+
3806
+
3807
+
3808
+
3809
+
3810
+
3811
+ <li class="md-nav__item">
3812
+ <a href="https://docs.nautobot.com/projects/golden-config/" class="md-nav__link">
3813
+ Nautobot Golden Configuration
3814
+ </a>
3815
+ </li>
3816
+
3817
+
3818
+
3819
+
3820
+
3821
+
3822
+
3823
+
3824
+
3825
+ <li class="md-nav__item">
3826
+ <a href="https://docs.nautobot.com/projects/plugin-nornir/en/latest/" class="md-nav__link">
3827
+ Nautobot Plugin Nornir
3828
+ </a>
3829
+ </li>
3830
+
3831
+
3832
+
3833
+
3834
+
3835
+
3836
+
3837
+
3838
+
3839
+ <li class="md-nav__item">
3840
+ <a href="https://docs.nautobot.com/projects/ssot/en/latest/" class="md-nav__link">
3841
+ Nautobot Single Source of Truth
3842
+ </a>
3843
+ </li>
3844
+
3845
+
3846
+
3847
+
3848
+ </ul>
3849
+ </nav>
3850
+ </li>
3851
+
3852
+
3853
+
3854
+
3855
+
3856
+
3857
+
3858
+
3859
+
3860
+ <li class="md-nav__item">
3861
+ <a href="../apps/nautobot-apps.html" class="md-nav__link">
3862
+ Community Apps
3863
+ </a>
3864
+ </li>
3865
+
3866
+
3867
+
3868
+
3869
+ </ul>
3870
+ </nav>
3871
+ </li>
3872
+
3873
+
3874
+
3875
+
3876
+
3877
+
3878
+
3879
+
3880
+
3881
+
3882
+ <li class="md-nav__item">
3883
+ <a href="https://docs.nautobot.com/" class="md-nav__link">
3884
+ Nautobot Docs Home ↗︎
3885
+ </a>
3886
+ </li>
3887
+
3888
+
3889
+
3890
+ </ul>
3891
+ </nav>
3892
+ </div>
3893
+ </div>
3894
+ </div>
3895
+
3896
+
3897
+
3898
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
3899
+ <div class="md-sidebar__scrollwrap">
3900
+ <div class="md-sidebar__inner">
3901
+
3902
+
3903
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
3904
+
3905
+
3906
+
3907
+
3908
+
3909
+
3910
+ <label class="md-nav__title" for="__toc">
3911
+ <span class="md-nav__icon md-icon"></span>
3912
+ Table of contents
3913
+ </label>
3914
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
3915
+
3916
+ <li class="md-nav__item">
3917
+ <a href="#introduction" class="md-nav__link">
3918
+ Introduction
3919
+ </a>
3920
+
3921
+ </li>
3922
+
3923
+ <li class="md-nav__item">
3924
+ <a href="#design-patterns" class="md-nav__link">
3925
+ Design Patterns
3926
+ </a>
3927
+
3928
+ <nav class="md-nav" aria-label="Design Patterns">
3929
+ <ul class="md-nav__list">
3930
+
3931
+ <li class="md-nav__item">
3932
+ <a href="#state-management" class="md-nav__link">
3933
+ State Management
3934
+ </a>
3935
+
3936
+ </li>
3937
+
3938
+ <li class="md-nav__item">
3939
+ <a href="#hooks" class="md-nav__link">
3940
+ Hooks
3941
+ </a>
3942
+
3943
+ </li>
3944
+
3945
+ </ul>
3946
+ </nav>
3947
+
3948
+ </li>
3949
+
3950
+ <li class="md-nav__item">
3951
+ <a href="#getting-started-with-development" class="md-nav__link">
3952
+ Getting Started With Development
3953
+ </a>
3954
+
3955
+ <nav class="md-nav" aria-label="Getting Started With Development">
3956
+ <ul class="md-nav__list">
3957
+
3958
+ <li class="md-nav__item">
3959
+ <a href="#documenting-your-code" class="md-nav__link">
3960
+ Documenting Your Code
3961
+ </a>
3962
+
3963
+ </li>
3964
+
3965
+ <li class="md-nav__item">
3966
+ <a href="#linting-formatting" class="md-nav__link">
3967
+ Linting &amp; Formatting
3968
+ </a>
3969
+
3970
+ <nav class="md-nav" aria-label="Linting &amp; Formatting">
3971
+ <ul class="md-nav__list">
3972
+
3973
+ <li class="md-nav__item">
3974
+ <a href="#linting" class="md-nav__link">
3975
+ Linting
3976
+ </a>
3977
+
3978
+ </li>
3979
+
3980
+ <li class="md-nav__item">
3981
+ <a href="#formatting" class="md-nav__link">
3982
+ Formatting
3983
+ </a>
3984
+
3985
+ </li>
3986
+
3987
+ </ul>
3988
+ </nav>
3989
+
3990
+ </li>
3991
+
3992
+ </ul>
3993
+ </nav>
3994
+
3995
+ </li>
3996
+
3997
+ <li class="md-nav__item">
3998
+ <a href="#additional-links" class="md-nav__link">
3999
+ Additional Links
4000
+ </a>
4001
+
4002
+ </li>
4003
+
4004
+ </ul>
4005
+
4006
+ </nav>
4007
+ </div>
4008
+ </div>
4009
+ </div>
4010
+
4011
+
4012
+
4013
+ <div class="md-content" data-md-component="content">
4014
+ <article class="md-content__inner md-typeset">
4015
+
4016
+
4017
+
4018
+
4019
+
4020
+
4021
+
4022
+ <h1 id="building-the-react-ui">Building the React UI<a class="headerlink" href="#building-the-react-ui" title="Permanent link">&para;</a></h1>
4023
+ <h2 id="introduction">Introduction<a class="headerlink" href="#introduction" title="Permanent link">&para;</a></h2>
4024
+ <p>Nautobot 2.0 introduces a new user interface built on React. This new UI will eventually be a complete replacement for the previous Django-based UI. It currently prioritizes read-only operations for core views. In subsequent releases, more operations and features will become available in this new UI.</p>
4025
+ <h2 id="design-patterns">Design Patterns<a class="headerlink" href="#design-patterns" title="Permanent link">&para;</a></h2>
4026
+ <p>A key change with moving to a client-side application for the user interface is that the application is now stateful. This means that the application is aware of the current state of the user interface, and can update the UI without requiring a page refresh. This is a significant change from the previous Django-based UI, which was stateless. In order to achieve this, a perspective on how the UI is rendered is required. Since much of the data is retrieved from the API, the UI is rendered in two phases:</p>
4027
+ <ul>
4028
+ <li><strong>Phase 1</strong>: The UI is rendered with placeholder data, and the API is queried for the actual data</li>
4029
+ <li><strong>Phase 2</strong>: The UI is re-rendered with the actual data</li>
4030
+ </ul>
4031
+ <p>This encourages the UI to be built in a way that is resilient to changes in the data, and allows the UI to be updated without requiring a page refresh. Placeholder data can either be empty, for example on a list view this is easy: an empty list <code>[]</code>. But in more complex cases, a view may choose to show a loading indicator until the data is available.</p>
4032
+ <p>In most cases, we build the UI with the preference we only display the final component once the data is available and display a loading indicator until then.</p>
4033
+ <h3 id="state-management">State Management<a class="headerlink" href="#state-management" title="Permanent link">&para;</a></h3>
4034
+ <p>The React UI is built with a concept of state management, which is handled by Redux. There is a single state store that is used to manage the state of the entire application, split into two core sections:</p>
4035
+ <ul>
4036
+ <li><strong>Application State</strong>: Managed by Redux<ul>
4037
+ <li>Is the user logged in?</li>
4038
+ <li>What is the current user?</li>
4039
+ <li>What is the current page?</li>
4040
+ <li>What are the models and navigation menu the user can access?</li>
4041
+ </ul>
4042
+ </li>
4043
+ <li><strong>API State</strong>: Managed by RTK Query (a subset library provided by Redux)<ul>
4044
+ <li>Previous responses to detail and list requests</li>
4045
+ </ul>
4046
+ </li>
4047
+ </ul>
4048
+ <p>These sections are known as "slices" of state, and have their own methods for updating and retrieving state. For more information on Redux, see the <a href="https://redux.js.org/">Redux documentation</a>.</p>
4049
+ <h3 id="hooks">Hooks<a class="headerlink" href="#hooks" title="Permanent link">&para;</a></h3>
4050
+ <p>The React UI uses hooks to manage state and side effects. Hooks are functions that let you "hook into" React state and lifecycle features. To learn more about hooks, see the <a href="https://react.dev/reference/react">React Hooks documentation</a>.</p>
4051
+ <h2 id="getting-started-with-development">Getting Started With Development<a class="headerlink" href="#getting-started-with-development" title="Permanent link">&para;</a></h2>
4052
+ <p>The libraries and tools used to build the React UI are:</p>
4053
+ <ul>
4054
+ <li><a href="https://reactjs.org/">React</a></li>
4055
+ <li><a href="https://reactrouter.com/">React Router</a></li>
4056
+ <li><a href="https://chakra-ui.com/">Chakra UI</a></li>
4057
+ <li><a href="https://redux.js.org/">Redux</a></li>
4058
+ <li><a href="https://react-redux.js.org/">React Redux</a></li>
4059
+ <li><a href="https://redux-toolkit.js.org/rtk-query/overview">RTK Query</a></li>
4060
+ </ul>
4061
+ <h3 id="documenting-your-code">Documenting Your Code<a class="headerlink" href="#documenting-your-code" title="Permanent link">&para;</a></h3>
4062
+ <p>The UI uses JS Doc to document the code. For more information on JS Doc, see the <a href="https://jsdoc.app/">JS Doc website</a>.</p>
4063
+ <p>We prefer to use the <code>@param</code> and <code>@returns</code> tags to document the parameters and return values of functions. For example:</p>
4064
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="cm">/**</span>
4065
+ <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="cm"> * Given an API payload with session information, updates the state with the session information</span>
4066
+ <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="cm"> * @param {Object} state - The current state</span>
4067
+ <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="cm"> * @param {Object} action - The called-with payload and action type</span>
4068
+ <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="cm"> * @returns The updated state</span>
4069
+ <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="cm"> */</span>
4070
+ <a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="nx">updateAuthStateWithSession</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">action</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
4071
+ <a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="w"> </span><span class="c1">//... </span>
4072
+ <a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="p">}</span>
4073
+ </code></pre></div>
4074
+ <h3 id="linting-formatting">Linting &amp; Formatting<a class="headerlink" href="#linting-formatting" title="Permanent link">&para;</a></h3>
4075
+ <h4 id="linting">Linting<a class="headerlink" href="#linting" title="Permanent link">&para;</a></h4>
4076
+ <p>The UI uses ESLint to lint the code. For more information on ESLint, see the <a href="https://eslint.org/">ESLint website</a>.</p>
4077
+ <p>To check for linting errors, run the following command:</p>
4078
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>invoke<span class="w"> </span>eslint
4079
+ </code></pre></div>
4080
+ <p>To automatically fix some linting errors, run the following command:</p>
4081
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>invoke<span class="w"> </span>eslint<span class="w"> </span>-a
4082
+ </code></pre></div>
4083
+ <h4 id="formatting">Formatting<a class="headerlink" href="#formatting" title="Permanent link">&para;</a></h4>
4084
+ <p>The UI uses Prettier to format the code. For more information on Prettier, see the <a href="https://prettier.io/">Prettier website</a>.</p>
4085
+ <p>To check for linting errors, run the following command:</p>
4086
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>invoke<span class="w"> </span>prettier
4087
+ </code></pre></div>
4088
+ <p>To automatically format the code, run the following command:</p>
4089
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>invoke<span class="w"> </span>prettier<span class="w"> </span>-a
4090
+ </code></pre></div>
4091
+ <h2 id="additional-links">Additional Links<a class="headerlink" href="#additional-links" title="Permanent link">&para;</a></h2>
4092
+ <p>Here are some links to resources that may be helpful when working with the React UI:</p>
4093
+ <ul>
4094
+ <li><a href="https://react.dev/learn/synchronizing-with-effects">React and Effects</a></li>
4095
+ <li><a href="https://redux-toolkit.js.org/rtk-query/usage/queries#query-hook-options">RTK Query and Asynchronous Hooks</a></li>
4096
+ <li><a href="https://react-redux.js.org/api/hooks#usedispatch">Using useDispatch</a></li>
4097
+ </ul>
4098
+
4099
+
4100
+
4101
+
4102
+
4103
+
4104
+ </article>
4105
+ </div>
4106
+
4107
+
4108
+ </div>
4109
+
4110
+ </main>
4111
+
4112
+ <footer class="md-footer">
4113
+
4114
+ <div class="md-footer-meta md-typeset">
4115
+ <div class="md-footer-meta__inner md-grid">
4116
+ <div class="md-copyright">
4117
+
4118
+ <div class="md-copyright__highlight">
4119
+ Copyright &copy; The Authors
4120
+ </div>
4121
+ <a href="https://github.com/nautobot/nautobot/blob/main/LICENSE.txt">Apache-2.0 LICENSE</a>
4122
+
4123
+ </div>
4124
+
4125
+ <div class="md-copyright">
4126
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">Made with Material for MkDocs</a>
4127
+ | <a href="https://www.networktocode.com/community/" target="_blank" rel="noopener">Join Nautobot Slack</a>
4128
+
4129
+ | <a href="https://networktocode.com" target="_blank" rel="noopener">Sponsored by <img
4130
+ src=../assets/networktocode_bw.png class="copyright-logo"></a>
4131
+
4132
+ </div>
4133
+
4134
+ <!-- RTD version flyout injected on live site -->
4135
+ <div id="readthedocs-embed-flyout"></div>
4136
+
4137
+ <div class="md-social">
4138
+
4139
+
4140
+
4141
+
4142
+
4143
+ <a href="https://blog.networktocode.com/blog/tags/nautobot" target="_blank" rel="noopener" title="Network to Code Blog" class="md-social__link">
4144
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M0 64c0-17.7 14.3-32 32-32 229.8 0 416 186.2 416 416 0 17.7-14.3 32-32 32s-32-14.3-32-32C384 253.6 226.4 96 32 96 14.3 96 0 81.7 0 64zm0 352a64 64 0 1 1 128 0 64 64 0 1 1-128 0zm32-256c159.1 0 288 128.9 288 288 0 17.7-14.3 32-32 32s-32-14.3-32-32c0-123.7-100.3-224-224-224-17.7 0-32-14.3-32-32s14.3-32 32-32z"/></svg>
4145
+ </a>
4146
+
4147
+
4148
+
4149
+
4150
+
4151
+ <a href="https://www.youtube.com/playlist?list=PLjA0bhxgryJ2Ts4GJMDA-tPzVWEncv4pb" target="_blank" rel="noopener" title="Nautobot Videos" class="md-social__link">
4152
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"/></svg>
4153
+ </a>
4154
+
4155
+
4156
+
4157
+
4158
+
4159
+ <a href="https://www.networktocode.com/community/" target="_blank" rel="noopener" title="Network to Code Community" class="md-social__link">
4160
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M94.12 315.1c0 25.9-21.16 47.06-47.06 47.06S0 341 0 315.1c0-25.9 21.16-47.06 47.06-47.06h47.06v47.06zm23.72 0c0-25.9 21.16-47.06 47.06-47.06s47.06 21.16 47.06 47.06v117.84c0 25.9-21.16 47.06-47.06 47.06s-47.06-21.16-47.06-47.06V315.1zm47.06-188.98c-25.9 0-47.06-21.16-47.06-47.06S139 32 164.9 32s47.06 21.16 47.06 47.06v47.06H164.9zm0 23.72c25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06H47.06C21.16 243.96 0 222.8 0 196.9s21.16-47.06 47.06-47.06H164.9zm188.98 47.06c0-25.9 21.16-47.06 47.06-47.06 25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06h-47.06V196.9zm-23.72 0c0 25.9-21.16 47.06-47.06 47.06-25.9 0-47.06-21.16-47.06-47.06V79.06c0-25.9 21.16-47.06 47.06-47.06 25.9 0 47.06 21.16 47.06 47.06V196.9zM283.1 385.88c25.9 0 47.06 21.16 47.06 47.06 0 25.9-21.16 47.06-47.06 47.06-25.9 0-47.06-21.16-47.06-47.06v-47.06h47.06zm0-23.72c-25.9 0-47.06-21.16-47.06-47.06 0-25.9 21.16-47.06 47.06-47.06h117.84c25.9 0 47.06 21.16 47.06 47.06 0 25.9-21.16 47.06-47.06 47.06H283.1z"/></svg>
4161
+ </a>
4162
+
4163
+
4164
+
4165
+
4166
+
4167
+ <a href="https://github.com/nautobot/nautobot" target="_blank" rel="noopener" title="GitHub Repo" class="md-social__link">
4168
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
4169
+ </a>
4170
+
4171
+
4172
+
4173
+
4174
+
4175
+ <a href="https://twitter.com/networktocode" target="_blank" rel="noopener" title="Network to Code Twitter" class="md-social__link">
4176
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg>
4177
+ </a>
4178
+
4179
+ </div>
4180
+
4181
+ </div>
4182
+ </div>
4183
+ </footer>
4184
+
4185
+ </div>
4186
+ <div class="md-dialog" data-md-component="dialog">
4187
+ <div class="md-dialog__inner md-typeset"></div>
4188
+ </div>
4189
+
4190
+ <script id="__config" type="application/json">{"base": "..", "features": ["navigation.tracking", "navigation.tabs", "navigation.tabs.sticky", "search.suggest", "search.highlight", "search.share"], "search": "../assets/javascripts/workers/search.208ed371.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
4191
+
4192
+
4193
+ <script src="../assets/javascripts/bundle.51198bba.min.js"></script>
4194
+
4195
+ <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
4196
+
4197
+
4198
+ </body>
4199
+ </html>