nautobot 2.2.9__py3-none-any.whl → 2.3.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.
Potentially problematic release.
This version of nautobot might be problematic. Click here for more details.
- nautobot/apps/forms.py +4 -0
- nautobot/apps/models.py +10 -1
- nautobot/circuits/__init__.py +0 -1
- nautobot/circuits/apps.py +1 -0
- nautobot/circuits/factory.py +15 -3
- nautobot/circuits/filters.py +13 -0
- nautobot/circuits/forms.py +13 -0
- nautobot/circuits/migrations/0021_alter_circuit_status_alter_circuittermination__path.py +32 -0
- nautobot/circuits/migrations/0022_circuittermination_cloud_network.py +25 -0
- nautobot/circuits/models.py +16 -3
- nautobot/circuits/tables.py +16 -2
- nautobot/circuits/templates/circuits/circuittermination_create.html +10 -2
- nautobot/circuits/templates/circuits/circuittermination_retrieve.html +6 -0
- nautobot/circuits/templates/circuits/inc/circuit_termination.html +6 -1
- nautobot/circuits/tests/test_api.py +7 -5
- nautobot/circuits/tests/test_filters.py +12 -5
- nautobot/circuits/tests/test_models.py +33 -2
- nautobot/circuits/views.py +2 -3
- nautobot/cloud/__init__.py +0 -0
- nautobot/cloud/api/__init__.py +0 -0
- nautobot/cloud/api/serializers.py +54 -0
- nautobot/cloud/api/urls.py +16 -0
- nautobot/cloud/api/views.py +48 -0
- nautobot/cloud/apps.py +13 -0
- nautobot/cloud/factory.py +111 -0
- nautobot/cloud/filters.py +184 -0
- nautobot/cloud/forms.py +333 -0
- nautobot/cloud/homepage.py +43 -0
- nautobot/cloud/migrations/0001_initial.py +304 -0
- nautobot/cloud/migrations/__init__.py +0 -0
- nautobot/cloud/models.py +247 -0
- nautobot/cloud/navigation.py +85 -0
- nautobot/cloud/tables.py +173 -0
- nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +43 -0
- nautobot/cloud/templates/cloud/cloudnetwork_retrieve.html +128 -0
- nautobot/cloud/templates/cloud/cloudnetwork_update.html +33 -0
- nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +100 -0
- nautobot/cloud/templates/cloud/cloudservice_retrieve.html +65 -0
- nautobot/cloud/templates/cloud/cloudservice_update.html +25 -0
- nautobot/cloud/tests/__init__.py +0 -0
- nautobot/cloud/tests/test_api.py +248 -0
- nautobot/cloud/tests/test_filters.py +113 -0
- nautobot/cloud/tests/test_models.py +43 -0
- nautobot/cloud/tests/test_views.py +153 -0
- nautobot/cloud/urls.py +14 -0
- nautobot/cloud/views.py +181 -0
- nautobot/core/__init__.py +0 -3
- nautobot/core/api/metadata.py +1 -0
- nautobot/core/api/parsers.py +7 -1
- nautobot/core/api/urls.py +1 -0
- nautobot/core/api/utils.py +1 -0
- nautobot/core/api/views.py +4 -0
- nautobot/core/apps/__init__.py +6 -3
- nautobot/core/constants.py +8 -0
- nautobot/core/factory.py +32 -1
- nautobot/core/filters.py +96 -28
- nautobot/core/forms/fields.py +10 -4
- nautobot/core/forms/forms.py +1 -1
- nautobot/core/forms/widgets.py +18 -1
- nautobot/core/graphql/generators.py +2 -2
- nautobot/core/graphql/schema.py +34 -4
- nautobot/core/jobs/__init__.py +17 -6
- nautobot/core/jobs/cleanup.py +100 -0
- nautobot/core/jobs/groups.py +38 -0
- nautobot/core/management/commands/generate_test_data.py +116 -3
- nautobot/core/models/__init__.py +34 -9
- nautobot/core/models/generics.py +19 -3
- nautobot/core/models/name_color_content_types.py +7 -28
- nautobot/core/models/querysets.py +4 -3
- nautobot/core/models/tree_queries.py +1 -1
- nautobot/core/models/utils.py +21 -5
- nautobot/core/settings.py +4 -30
- nautobot/core/settings.yaml +34 -27
- nautobot/core/settings_funcs.py +103 -0
- nautobot/core/tables.py +127 -56
- nautobot/core/templates/admin/search_form.html +1 -1
- nautobot/core/templates/buttons/add.html +11 -3
- nautobot/core/templates/buttons/consolidated_bulk_action_buttons.html +13 -0
- nautobot/core/templates/buttons/consolidated_detail_view_action_buttons.html +13 -0
- nautobot/core/templates/buttons/export.html +101 -53
- nautobot/core/templates/buttons/job_import.html +11 -3
- nautobot/core/templates/generic/object_bulk_destroy.html +3 -1
- nautobot/core/templates/generic/object_bulk_update.html +3 -1
- nautobot/core/templates/generic/object_changelog.html +0 -9
- nautobot/core/templates/generic/object_list.html +156 -17
- nautobot/core/templates/generic/object_retrieve.html +80 -16
- nautobot/core/templates/inc/extras_features_edit_form_fields.html +8 -0
- nautobot/core/templates/inc/javascript.html +2 -0
- nautobot/core/templates/inc/media.html +2 -2
- nautobot/core/templates/inc/nav_menu.html +1 -0
- nautobot/core/templates/inc/paginator.html +7 -7
- nautobot/core/templates/inc/search_panel.html +2 -2
- nautobot/core/templates/inc/table.html +2 -2
- nautobot/core/templates/nautobot_config.py.j2 +13 -23
- nautobot/core/templates/utilities/templatetags/dynamic_group_assignment_modal.html +37 -0
- nautobot/core/templates/utilities/templatetags/filter_form_modal.html +2 -2
- nautobot/core/templates/utilities/templatetags/saved_view_modal.html +38 -0
- nautobot/core/templates/utilities/theme_preview.html +25 -8
- nautobot/core/templates/utilities/worker_status.html +152 -0
- nautobot/core/templatetags/buttons.py +335 -38
- nautobot/core/templatetags/form_helpers.py +1 -1
- nautobot/core/templatetags/helpers.py +181 -11
- nautobot/core/testing/api.py +5 -4
- nautobot/core/testing/filters.py +51 -13
- nautobot/core/testing/mixins.py +46 -0
- nautobot/core/testing/models.py +22 -0
- nautobot/core/testing/schema.py +4 -8
- nautobot/core/testing/views.py +31 -14
- nautobot/core/tests/integration/test_general_functionality.py +1 -1
- nautobot/core/tests/integration/test_import_objects_ui.py +1 -0
- nautobot/core/tests/integration/test_swagger.py +1 -1
- nautobot/core/tests/nautobot_config.py +0 -1
- nautobot/core/tests/runner.py +2 -2
- nautobot/core/tests/test_api.py +1 -0
- nautobot/core/tests/test_authentication.py +7 -2
- nautobot/core/tests/test_filters.py +11 -9
- nautobot/core/tests/test_forms.py +9 -0
- nautobot/core/tests/test_graphql.py +27 -16
- nautobot/core/tests/test_jobs.py +123 -74
- nautobot/core/tests/test_tables.py +3 -1
- nautobot/core/tests/test_templatetags_helpers.py +12 -5
- nautobot/core/tests/test_utils.py +31 -20
- nautobot/core/tests/test_views.py +6 -6
- nautobot/core/urls.py +8 -3
- nautobot/core/utils/deprecation.py +29 -0
- nautobot/core/utils/filtering.py +12 -9
- nautobot/core/utils/lookup.py +37 -2
- nautobot/core/utils/requests.py +4 -1
- nautobot/core/views/__init__.py +137 -24
- nautobot/core/views/generic.py +118 -66
- nautobot/core/views/mixins.py +104 -35
- nautobot/core/views/paginator.py +9 -3
- nautobot/core/views/renderers.py +121 -56
- nautobot/core/views/utils.py +79 -1
- nautobot/dcim/__init__.py +0 -1
- nautobot/dcim/api/serializers.py +180 -44
- nautobot/dcim/api/urls.py +7 -3
- nautobot/dcim/api/views.py +53 -7
- nautobot/dcim/apps.py +3 -0
- nautobot/dcim/choices.py +25 -0
- nautobot/dcim/constants.py +7 -0
- nautobot/dcim/factory.py +249 -18
- nautobot/dcim/filters/__init__.py +369 -193
- nautobot/dcim/filters/mixins.py +274 -1
- nautobot/dcim/forms.py +817 -109
- nautobot/dcim/graphql/types.py +2 -2
- nautobot/dcim/homepage.py +1 -1
- nautobot/dcim/migrations/0059_add_role_field_to_interface_models.py +27 -0
- nautobot/dcim/migrations/0060_alter_cable_status_alter_consoleport__path_and_more.py +303 -0
- nautobot/dcim/migrations/0061_module_models.py +861 -0
- nautobot/dcim/migrations/0062_module_data_migration.py +25 -0
- nautobot/dcim/models/__init__.py +8 -0
- nautobot/dcim/models/cables.py +15 -0
- nautobot/dcim/models/device_component_templates.py +207 -53
- nautobot/dcim/models/device_components.py +275 -106
- nautobot/dcim/models/devices.py +466 -13
- nautobot/dcim/navigation.py +47 -0
- nautobot/dcim/signals.py +3 -3
- nautobot/dcim/tables/__init__.py +35 -23
- nautobot/dcim/tables/devices.py +231 -59
- nautobot/dcim/tables/devicetypes.py +65 -9
- nautobot/dcim/tables/racks.py +5 -1
- nautobot/dcim/tables/template_code.py +46 -26
- nautobot/dcim/templates/dcim/cable_connect.html +76 -3
- nautobot/dcim/templates/dcim/console_port_connection_list.html +7 -5
- nautobot/dcim/templates/dcim/device/base.html +15 -7
- nautobot/dcim/templates/dcim/device/consoleports.html +2 -3
- nautobot/dcim/templates/dcim/device/consoleserverports.html +2 -3
- nautobot/dcim/templates/dcim/device/devicebays.html +6 -7
- nautobot/dcim/templates/dcim/device/frontports.html +2 -3
- nautobot/dcim/templates/dcim/device/interfaces.html +2 -3
- nautobot/dcim/templates/dcim/device/inventory.html +2 -3
- nautobot/dcim/templates/dcim/device/modulebays.html +49 -0
- nautobot/dcim/templates/dcim/device/poweroutlets.html +2 -3
- nautobot/dcim/templates/dcim/device/powerports.html +2 -3
- nautobot/dcim/templates/dcim/device/rearports.html +2 -3
- nautobot/dcim/templates/dcim/device.html +45 -1
- nautobot/dcim/templates/dcim/device_component.html +13 -5
- nautobot/dcim/templates/dcim/device_list.html +2 -1
- nautobot/dcim/templates/dcim/deviceredundancygroup_retrieve.html +0 -6
- nautobot/dcim/templates/dcim/devicetype.html +99 -98
- nautobot/dcim/templates/dcim/devicetype_list.html +8 -16
- nautobot/dcim/templates/dcim/inc/devicetype_component_table.html +1 -1
- nautobot/dcim/templates/dcim/inc/moduletype_component_table.html +39 -0
- nautobot/dcim/templates/dcim/interface.html +17 -2
- nautobot/dcim/templates/dcim/interface_connection_list.html +7 -5
- nautobot/dcim/templates/dcim/interface_edit.html +1 -0
- nautobot/dcim/templates/dcim/manufacturer.html +24 -0
- nautobot/dcim/templates/dcim/module/base.html +97 -0
- nautobot/dcim/templates/dcim/module_bulk_destroy.html +5 -0
- nautobot/dcim/templates/dcim/module_consoleports.html +53 -0
- nautobot/dcim/templates/dcim/module_consoleserverports.html +53 -0
- nautobot/dcim/templates/dcim/module_destroy.html +5 -0
- nautobot/dcim/templates/dcim/module_frontports.html +53 -0
- nautobot/dcim/templates/dcim/module_interfaces.html +57 -0
- nautobot/dcim/templates/dcim/module_list.html +20 -0
- nautobot/dcim/templates/dcim/module_modulebays.html +49 -0
- nautobot/dcim/templates/dcim/module_poweroutlets.html +53 -0
- nautobot/dcim/templates/dcim/module_powerports.html +53 -0
- nautobot/dcim/templates/dcim/module_rearports.html +53 -0
- nautobot/dcim/templates/dcim/module_retrieve.html +63 -0
- nautobot/dcim/templates/dcim/module_update.html +71 -0
- nautobot/dcim/templates/dcim/modulebay_bulk_destroy.html +5 -0
- nautobot/dcim/templates/dcim/modulebay_destroy.html +8 -0
- nautobot/dcim/templates/dcim/modulebay_retrieve.html +101 -0
- nautobot/dcim/templates/dcim/moduletype_list.html +11 -0
- nautobot/dcim/templates/dcim/moduletype_retrieve.html +142 -0
- nautobot/dcim/templates/dcim/power_port_connection_list.html +7 -5
- nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +65 -19
- nautobot/dcim/tests/integration/test_cable_connect_form.py +4 -4
- nautobot/dcim/tests/test_api.py +691 -208
- nautobot/dcim/tests/test_filters.py +836 -217
- nautobot/dcim/tests/test_models.py +1072 -39
- nautobot/dcim/tests/test_views.py +1488 -358
- nautobot/dcim/urls.py +17 -2
- nautobot/dcim/utils.py +2 -3
- nautobot/dcim/views.py +1107 -120
- nautobot/extras/__init__.py +0 -1
- nautobot/extras/api/serializers.py +115 -3
- nautobot/extras/api/urls.py +12 -0
- nautobot/extras/api/views.py +125 -7
- nautobot/extras/apps.py +2 -2
- nautobot/extras/choices.py +43 -0
- nautobot/extras/context_managers.py +13 -8
- nautobot/extras/datasources/git.py +2 -0
- nautobot/extras/factory.py +422 -9
- nautobot/extras/filters/__init__.py +174 -3
- nautobot/extras/filters/mixins.py +46 -43
- nautobot/extras/forms/base.py +17 -4
- nautobot/extras/forms/forms.py +227 -8
- nautobot/extras/forms/mixins.py +93 -0
- nautobot/extras/graphql/types.py +23 -10
- nautobot/extras/homepage.py +16 -13
- nautobot/extras/jobs.py +2 -2
- nautobot/extras/management/__init__.py +1 -0
- nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -16
- nautobot/extras/migrations/0021_customfield_changelog_data.py +1 -0
- nautobot/extras/migrations/0109_dynamicgroup_group_type_dynamicgroup_tags_and_more.py +108 -0
- nautobot/extras/migrations/0110_alter_configcontext_cluster_groups_and_more.py +111 -0
- nautobot/extras/migrations/0111_metadata.py +162 -0
- nautobot/extras/migrations/0112_dynamic_group_group_type_data_migration.py +28 -0
- nautobot/extras/migrations/0113_saved_views.py +77 -0
- nautobot/extras/models/__init__.py +15 -1
- nautobot/extras/models/change_logging.py +3 -3
- nautobot/extras/models/contacts.py +4 -0
- nautobot/extras/models/customfields.py +18 -3
- nautobot/extras/models/groups.py +389 -225
- nautobot/extras/models/jobs.py +4 -84
- nautobot/extras/models/metadata.py +441 -0
- nautobot/extras/models/mixins.py +72 -62
- nautobot/extras/models/models.py +116 -9
- nautobot/extras/models/relationships.py +9 -2
- nautobot/extras/models/tags.py +13 -2
- nautobot/extras/navigation.py +57 -0
- nautobot/extras/plugins/__init__.py +3 -1
- nautobot/extras/querysets.py +30 -66
- nautobot/extras/signals.py +96 -114
- nautobot/extras/tables.py +171 -47
- nautobot/extras/templates/extras/dynamicgroup.html +44 -15
- nautobot/extras/templates/extras/dynamicgroup_edit.html +2 -0
- nautobot/extras/templates/extras/job.html +1 -1
- nautobot/extras/templates/extras/job_detail.html +0 -11
- nautobot/extras/templates/extras/jobresult.html +61 -74
- nautobot/extras/templates/extras/metadatatype_create.html +89 -0
- nautobot/extras/templates/extras/metadatatype_retrieve.html +67 -0
- nautobot/extras/templates/extras/object_dynamicgroups.html +7 -0
- nautobot/extras/templates/extras/objectchange_list.html +0 -12
- nautobot/extras/templates/extras/plugins_list.html +1 -3
- nautobot/extras/templates/extras/role_retrieve.html +48 -0
- nautobot/extras/templates/extras/staticgroupassociation_retrieve.html +20 -0
- nautobot/extras/tests/integration/test_customfields.py +1 -0
- nautobot/extras/tests/test_api.py +501 -22
- nautobot/extras/tests/test_changelog.py +20 -9
- nautobot/extras/tests/test_context_managers.py +22 -15
- nautobot/extras/tests/test_datasources.py +13 -1
- nautobot/extras/tests/test_dynamicgroups.py +201 -171
- nautobot/extras/tests/test_filters.py +211 -12
- nautobot/extras/tests/test_jobs.py +4 -4
- nautobot/extras/tests/test_models.py +499 -4
- nautobot/extras/tests/test_relationships.py +1 -0
- nautobot/extras/tests/test_views.py +565 -28
- nautobot/extras/tests/test_webhooks.py +1 -1
- nautobot/extras/urls.py +5 -0
- nautobot/extras/utils.py +56 -45
- nautobot/extras/views.py +585 -96
- nautobot/ipam/__init__.py +0 -1
- nautobot/ipam/apps.py +1 -0
- nautobot/ipam/factory.py +17 -19
- nautobot/ipam/filters.py +14 -1
- nautobot/ipam/forms.py +9 -5
- nautobot/ipam/graphql/types.py +2 -2
- nautobot/ipam/migrations/0047_alter_ipaddress_role_alter_ipaddress_status_and_more.py +59 -0
- nautobot/ipam/models.py +23 -9
- nautobot/ipam/querysets.py +1 -1
- nautobot/ipam/signals.py +4 -2
- nautobot/ipam/tables.py +1 -0
- nautobot/ipam/templates/ipam/ipaddress_interfaces.html +1 -1
- nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +1 -1
- nautobot/ipam/templates/ipam/prefix.html +1 -0
- nautobot/ipam/tests/test_api.py +37 -18
- nautobot/ipam/tests/test_filters.py +26 -2
- nautobot/ipam/tests/test_models.py +8 -3
- nautobot/ipam/tests/test_querysets.py +1 -1
- nautobot/ipam/tests/test_views.py +3 -2
- nautobot/ipam/urls.py +2 -2
- nautobot/ipam/views.py +25 -28
- nautobot/project-static/css/base.css +20 -1
- nautobot/project-static/css/dark.css +11 -0
- nautobot/project-static/docs/404.html +884 -80
- nautobot/project-static/docs/apps/index.html +884 -80
- nautobot/project-static/docs/apps/nautobot-apps.html +884 -80
- nautobot/project-static/docs/assets/_mkdocstrings.css +5 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +911 -112
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +896 -93
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1457 -790
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +927 -136
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +969 -180
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +893 -91
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +889 -85
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +983 -185
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +938 -143
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1064 -274
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +1190 -346
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1663 -865
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +1156 -373
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2200 -1502
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +2229 -1421
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +904 -103
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +955 -155
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1002 -215
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +1911 -1275
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +1835 -1091
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +896 -93
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +2323 -1693
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1785 -1023
- nautobot/project-static/docs/development/apps/api/configuration-view.html +884 -80
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +884 -80
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +884 -80
- nautobot/project-static/docs/development/apps/api/models/global-search.html +884 -80
- nautobot/project-static/docs/development/apps/api/models/graphql.html +884 -80
- nautobot/project-static/docs/development/apps/api/models/index.html +922 -81
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +884 -80
- nautobot/project-static/docs/development/apps/api/prometheus.html +884 -80
- nautobot/project-static/docs/development/apps/api/setup.html +884 -80
- nautobot/project-static/docs/development/apps/api/testing.html +884 -80
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +884 -80
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +884 -80
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +884 -80
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +884 -80
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/base-template.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/index.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/notes.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/urls.html +884 -80
- nautobot/project-static/docs/development/apps/index.html +884 -80
- nautobot/project-static/docs/development/apps/migration/code-updates.html +884 -80
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +884 -80
- nautobot/project-static/docs/development/apps/migration/from-v1.html +884 -80
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +884 -80
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +884 -80
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +884 -80
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +884 -80
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +884 -80
- nautobot/project-static/docs/development/core/application-registry.html +884 -80
- nautobot/project-static/docs/development/core/best-practices.html +885 -80
- nautobot/project-static/docs/development/core/bootstrap-ui.html +884 -80
- nautobot/project-static/docs/development/core/caching.html +884 -80
- nautobot/project-static/docs/development/core/controllers.html +884 -80
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +884 -80
- nautobot/project-static/docs/development/core/generic-views.html +884 -80
- nautobot/project-static/docs/development/core/getting-started.html +884 -80
- nautobot/project-static/docs/development/core/homepage.html +884 -80
- nautobot/project-static/docs/development/core/index.html +884 -91
- nautobot/project-static/docs/development/core/model-checklist.html +887 -81
- nautobot/project-static/docs/development/core/model-features.html +884 -80
- nautobot/project-static/docs/development/core/natural-keys.html +884 -80
- nautobot/project-static/docs/development/core/navigation-menu.html +884 -80
- nautobot/project-static/docs/development/core/release-checklist.html +887 -83
- nautobot/project-static/docs/development/core/role-internals.html +884 -80
- nautobot/project-static/docs/development/core/settings.html +884 -80
- nautobot/project-static/docs/development/core/style-guide.html +885 -81
- nautobot/project-static/docs/development/core/templates.html +896 -81
- nautobot/project-static/docs/development/core/testing.html +884 -80
- nautobot/project-static/docs/development/core/user-preferences.html +884 -80
- nautobot/project-static/docs/development/index.html +884 -80
- nautobot/project-static/docs/development/jobs/index.html +1247 -457
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +884 -80
- nautobot/project-static/docs/index.html +13 -8228
- nautobot/project-static/docs/media/models/cloud_aws_direct_connect_dark.png +0 -0
- nautobot/project-static/docs/media/models/cloud_aws_direct_connect_light.png +0 -0
- nautobot/project-static/docs/models/cloud/cloudaccount.html +15 -0
- nautobot/project-static/docs/models/cloud/cloudnetwork.html +15 -0
- nautobot/project-static/docs/models/cloud/cloudnetworkprefixassignment.html +15 -0
- nautobot/project-static/docs/models/cloud/cloudresourcetype.html +15 -0
- nautobot/project-static/docs/models/cloud/cloudservice.html +15 -0
- nautobot/project-static/docs/models/cloud/cloudservicenetworkassignment.html +15 -0
- nautobot/project-static/docs/models/dcim/module.html +15 -0
- nautobot/project-static/docs/models/dcim/modulebay.html +15 -0
- nautobot/project-static/docs/models/dcim/modulebaytemplate.html +15 -0
- nautobot/project-static/docs/models/dcim/moduletype.html +15 -0
- nautobot/project-static/docs/models/extras/metadatachoice.html +15 -0
- nautobot/project-static/docs/models/extras/metadatatype.html +15 -0
- nautobot/project-static/docs/models/extras/objectmetadata.html +15 -0
- nautobot/project-static/docs/models/extras/role.html +15 -0
- nautobot/project-static/docs/models/extras/savedview.html +15 -0
- nautobot/project-static/docs/models/extras/staticgroupassociation.html +15 -0
- nautobot/project-static/docs/models/extras/status.html +15 -0
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/overview/application_stack.html +892 -81
- nautobot/project-static/docs/overview/design_philosophy.html +886 -82
- nautobot/project-static/docs/overview/index.html +9032 -13
- nautobot/project-static/docs/release-notes/index.html +887 -83
- nautobot/project-static/docs/release-notes/version-1.0.html +884 -80
- nautobot/project-static/docs/release-notes/version-1.1.html +884 -80
- nautobot/project-static/docs/release-notes/version-1.2.html +884 -80
- nautobot/project-static/docs/release-notes/version-1.3.html +884 -80
- nautobot/project-static/docs/release-notes/version-1.4.html +884 -80
- nautobot/project-static/docs/release-notes/version-1.5.html +885 -81
- nautobot/project-static/docs/release-notes/version-1.6.html +885 -81
- nautobot/project-static/docs/release-notes/version-2.0.html +884 -80
- nautobot/project-static/docs/release-notes/version-2.1.html +884 -80
- nautobot/project-static/docs/release-notes/version-2.2.html +990 -323
- nautobot/project-static/docs/release-notes/version-2.3.html +9524 -0
- nautobot/project-static/docs/requirements.txt +4 -4
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +335 -260
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +884 -80
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +884 -80
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +884 -80
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +884 -80
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +983 -197
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +884 -80
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +888 -84
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation/index.html +888 -80
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation/services.html +888 -80
- nautobot/project-static/docs/user-guide/administration/installation-extras/docker.html +900 -91
- nautobot/project-static/docs/user-guide/administration/installation-extras/health-checks.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation-extras/selinux-troubleshooting.html +884 -80
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +884 -80
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +884 -80
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +915 -163
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +885 -81
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +888 -80
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +887 -83
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +8984 -0
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +8828 -0
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +8829 -0
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +8828 -0
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +8829 -0
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +8833 -0
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +8828 -0
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +915 -97
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +915 -97
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +910 -92
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +915 -97
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +905 -97
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +912 -108
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +913 -109
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +910 -106
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +906 -97
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +918 -100
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +928 -110
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +920 -98
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +929 -111
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +920 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +910 -106
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +913 -109
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +914 -106
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +8828 -0
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +8846 -0
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +8843 -0
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +8823 -0
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +932 -75
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +916 -98
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +935 -78
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +913 -95
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +921 -117
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +910 -106
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +914 -96
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +916 -98
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +889 -81
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +889 -81
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +893 -88
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +889 -81
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/clear-view-button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/cleared-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/config-table-columns-to-locations.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/configure-button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/create-saved-view-success.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/current-saved-view-drop-down-menu.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/default-location-list-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/dropdown-button-after-new-saved-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-application-to-locations.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/global-default-location-list-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/location-list-view-with-saved-views.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/navigation-menu.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-as-new-view-drop-down.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-view-modal.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-buttons.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-success.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view-unchecked.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-different-user.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-modal-unchecked.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-success.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/unsaved-saved-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/updated-saved-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +884 -80
- nautobot/project-static/docs/user-guide/index.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1250 -777
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +887 -83
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +887 -83
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +888 -80
- nautobot/project-static/docs/user-guide/platform-functionality/metadata.html +8948 -0
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +887 -83
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +887 -83
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +9137 -0
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +887 -83
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +8933 -0
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +942 -113
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +884 -80
- nautobot/project-static/js/forms.js +71 -0
- nautobot/project-static/js/table_sorting_indicator.js +46 -0
- nautobot/project-static/js/tableconfig.js +6 -1
- nautobot/project-static/materialdesignicons-7.4.47/css/materialdesignicons.min.css +3 -0
- nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.eot +0 -0
- nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.ttf +0 -0
- nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff +0 -0
- nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff2 +0 -0
- nautobot/tenancy/__init__.py +0 -1
- nautobot/tenancy/apps.py +1 -0
- nautobot/tenancy/factory.py +3 -2
- nautobot/tenancy/filters/__init__.py +1 -0
- nautobot/tenancy/forms.py +1 -1
- nautobot/tenancy/templates/tenancy/tenant.html +22 -18
- nautobot/tenancy/views.py +11 -10
- nautobot/users/__init__.py +0 -1
- nautobot/users/api/serializers.py +1 -1
- nautobot/users/api/views.py +4 -2
- nautobot/users/apps.py +3 -2
- nautobot/users/factory.py +3 -3
- nautobot/users/migrations/0010_user_default_saved_views.py +20 -0
- nautobot/users/models.py +12 -0
- nautobot/users/tests/test_filters.py +6 -3
- nautobot/users/urls.py +8 -0
- nautobot/virtualization/__init__.py +0 -1
- nautobot/virtualization/apps.py +1 -0
- nautobot/virtualization/filters.py +6 -1
- nautobot/virtualization/forms.py +11 -3
- nautobot/virtualization/graphql/types.py +2 -2
- nautobot/virtualization/migrations/0029_add_role_field_to_interface_models.py +27 -0
- nautobot/virtualization/migrations/0030_alter_virtualmachine_local_config_context_data_owner_content_type_and_more.py +67 -0
- nautobot/virtualization/tables.py +15 -5
- nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -1
- nautobot/virtualization/templates/virtualization/vminterface.html +7 -1
- nautobot/virtualization/templates/virtualization/vminterface_edit.html +1 -0
- nautobot/virtualization/tests/test_api.py +9 -4
- nautobot/virtualization/tests/test_filters.py +22 -0
- nautobot/virtualization/tests/test_models.py +7 -3
- nautobot/virtualization/tests/test_views.py +19 -3
- nautobot/virtualization/urls.py +2 -2
- nautobot/virtualization/views.py +10 -32
- {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/METADATA +21 -19
- {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/RECORD +679 -559
- nautobot/project-static/materialdesignicons-6.5.95/.github/ISSUE_TEMPLATE.md +0 -3
- nautobot/project-static/materialdesignicons-6.5.95/README.md +0 -25
- nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.css +0 -26654
- nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.css.map +0 -16
- nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.min.css +0 -3
- nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.min.css.map +0 -16
- nautobot/project-static/materialdesignicons-6.5.95/fonts/materialdesignicons-webfont.woff +0 -0
- nautobot/project-static/materialdesignicons-6.5.95/fonts/materialdesignicons-webfont.woff2 +0 -0
- nautobot/project-static/materialdesignicons-6.5.95/package.json +0 -28
- nautobot/project-static/materialdesignicons-6.5.95/preview.html +0 -717
- nautobot/project-static/materialdesignicons-6.5.95/scss/_animated.scss +0 -27
- nautobot/project-static/materialdesignicons-6.5.95/scss/_core.scss +0 -10
- nautobot/project-static/materialdesignicons-6.5.95/scss/_extras.scss +0 -65
- nautobot/project-static/materialdesignicons-6.5.95/scss/_functions.scss +0 -20
- nautobot/project-static/materialdesignicons-6.5.95/scss/_icons.scss +0 -10
- nautobot/project-static/materialdesignicons-6.5.95/scss/_path.scss +0 -10
- nautobot/project-static/materialdesignicons-6.5.95/scss/_variables.scss +0 -6606
- nautobot/project-static/materialdesignicons-6.5.95/scss/materialdesignicons.scss +0 -8
- /nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/LICENSE +0 -0
- {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/NOTICE +0 -0
- {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/WHEEL +0 -0
- {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/entry_points.txt +0 -0
|
@@ -238,7 +238,7 @@
|
|
|
238
238
|
|
|
239
239
|
|
|
240
240
|
<li class="md-tabs__item">
|
|
241
|
-
<a href="../../index.html" class="md-tabs__link">
|
|
241
|
+
<a href="../../overview/index.html" class="md-tabs__link">
|
|
242
242
|
|
|
243
243
|
|
|
244
244
|
|
|
@@ -409,7 +409,7 @@
|
|
|
409
409
|
|
|
410
410
|
|
|
411
411
|
<div class="md-nav__link md-nav__container">
|
|
412
|
-
<a href="../../index.html" class="md-nav__link ">
|
|
412
|
+
<a href="../../overview/index.html" class="md-nav__link ">
|
|
413
413
|
|
|
414
414
|
|
|
415
415
|
<span class="md-ellipsis">
|
|
@@ -2484,23 +2484,702 @@
|
|
|
2484
2484
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3_3" >
|
|
2485
2485
|
|
|
2486
2486
|
|
|
2487
|
-
|
|
2487
|
+
|
|
2488
|
+
<div class="md-nav__link md-nav__container">
|
|
2489
|
+
<a href="../../user-guide/core-data-model/cloud/cloud.html" class="md-nav__link ">
|
|
2490
|
+
|
|
2491
|
+
|
|
2492
|
+
<span class="md-ellipsis">
|
|
2493
|
+
Cloud
|
|
2494
|
+
</span>
|
|
2495
|
+
|
|
2496
|
+
|
|
2497
|
+
</a>
|
|
2498
|
+
|
|
2499
|
+
|
|
2500
|
+
<label class="md-nav__link " for="__nav_2_3_3" id="__nav_2_3_3_label" tabindex="0">
|
|
2501
|
+
<span class="md-nav__icon md-icon"></span>
|
|
2502
|
+
</label>
|
|
2503
|
+
|
|
2504
|
+
</div>
|
|
2505
|
+
|
|
2506
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_3_3_label" aria-expanded="false">
|
|
2507
|
+
<label class="md-nav__title" for="__nav_2_3_3">
|
|
2508
|
+
<span class="md-nav__icon md-icon"></span>
|
|
2509
|
+
Cloud
|
|
2510
|
+
</label>
|
|
2511
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
|
2512
|
+
|
|
2513
|
+
|
|
2514
|
+
|
|
2515
|
+
|
|
2516
|
+
|
|
2517
|
+
|
|
2518
|
+
|
|
2519
|
+
<li class="md-nav__item">
|
|
2520
|
+
<a href="../../user-guide/core-data-model/cloud/cloudaccount.html" class="md-nav__link">
|
|
2521
|
+
|
|
2522
|
+
|
|
2523
|
+
<span class="md-ellipsis">
|
|
2524
|
+
Cloud Account
|
|
2525
|
+
</span>
|
|
2526
|
+
|
|
2527
|
+
|
|
2528
|
+
</a>
|
|
2529
|
+
</li>
|
|
2530
|
+
|
|
2531
|
+
|
|
2532
|
+
|
|
2533
|
+
|
|
2534
|
+
|
|
2535
|
+
|
|
2536
|
+
|
|
2537
|
+
|
|
2538
|
+
|
|
2539
|
+
|
|
2540
|
+
<li class="md-nav__item">
|
|
2541
|
+
<a href="../../user-guide/core-data-model/cloud/cloudnetwork.html" class="md-nav__link">
|
|
2542
|
+
|
|
2543
|
+
|
|
2544
|
+
<span class="md-ellipsis">
|
|
2545
|
+
Cloud Network
|
|
2546
|
+
</span>
|
|
2547
|
+
|
|
2548
|
+
|
|
2549
|
+
</a>
|
|
2550
|
+
</li>
|
|
2551
|
+
|
|
2552
|
+
|
|
2553
|
+
|
|
2554
|
+
|
|
2555
|
+
|
|
2556
|
+
|
|
2557
|
+
|
|
2558
|
+
|
|
2559
|
+
|
|
2560
|
+
|
|
2561
|
+
<li class="md-nav__item">
|
|
2562
|
+
<a href="../../user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html" class="md-nav__link">
|
|
2563
|
+
|
|
2564
|
+
|
|
2565
|
+
<span class="md-ellipsis">
|
|
2566
|
+
Cloud Network Prefix Assignment
|
|
2567
|
+
</span>
|
|
2568
|
+
|
|
2569
|
+
|
|
2570
|
+
</a>
|
|
2571
|
+
</li>
|
|
2572
|
+
|
|
2573
|
+
|
|
2574
|
+
|
|
2575
|
+
|
|
2576
|
+
|
|
2577
|
+
|
|
2578
|
+
|
|
2579
|
+
|
|
2580
|
+
|
|
2581
|
+
|
|
2582
|
+
<li class="md-nav__item">
|
|
2583
|
+
<a href="../../user-guide/core-data-model/cloud/cloudresourcetype.html" class="md-nav__link">
|
|
2584
|
+
|
|
2585
|
+
|
|
2586
|
+
<span class="md-ellipsis">
|
|
2587
|
+
Cloud Resource Type
|
|
2588
|
+
</span>
|
|
2589
|
+
|
|
2590
|
+
|
|
2591
|
+
</a>
|
|
2592
|
+
</li>
|
|
2593
|
+
|
|
2594
|
+
|
|
2595
|
+
|
|
2596
|
+
|
|
2597
|
+
|
|
2598
|
+
|
|
2599
|
+
|
|
2600
|
+
|
|
2601
|
+
|
|
2602
|
+
|
|
2603
|
+
<li class="md-nav__item">
|
|
2604
|
+
<a href="../../user-guide/core-data-model/cloud/cloudservice.html" class="md-nav__link">
|
|
2605
|
+
|
|
2606
|
+
|
|
2607
|
+
<span class="md-ellipsis">
|
|
2608
|
+
Cloud Service
|
|
2609
|
+
</span>
|
|
2610
|
+
|
|
2611
|
+
|
|
2612
|
+
</a>
|
|
2613
|
+
</li>
|
|
2614
|
+
|
|
2615
|
+
|
|
2616
|
+
|
|
2617
|
+
|
|
2618
|
+
|
|
2619
|
+
|
|
2620
|
+
|
|
2621
|
+
|
|
2622
|
+
|
|
2623
|
+
|
|
2624
|
+
<li class="md-nav__item">
|
|
2625
|
+
<a href="../../user-guide/core-data-model/cloud/cloudservicenetworkassignment.html" class="md-nav__link">
|
|
2626
|
+
|
|
2627
|
+
|
|
2628
|
+
<span class="md-ellipsis">
|
|
2629
|
+
Cloud Service Network Assignment
|
|
2630
|
+
</span>
|
|
2631
|
+
|
|
2632
|
+
|
|
2633
|
+
</a>
|
|
2634
|
+
</li>
|
|
2635
|
+
|
|
2636
|
+
|
|
2637
|
+
|
|
2638
|
+
|
|
2639
|
+
</ul>
|
|
2640
|
+
</nav>
|
|
2641
|
+
|
|
2642
|
+
</li>
|
|
2643
|
+
|
|
2644
|
+
|
|
2645
|
+
|
|
2646
|
+
|
|
2647
|
+
|
|
2648
|
+
|
|
2649
|
+
|
|
2650
|
+
|
|
2651
|
+
|
|
2652
|
+
|
|
2653
|
+
|
|
2654
|
+
|
|
2655
|
+
|
|
2656
|
+
|
|
2657
|
+
|
|
2658
|
+
|
|
2659
|
+
|
|
2660
|
+
<li class="md-nav__item md-nav__item--nested">
|
|
2661
|
+
|
|
2662
|
+
|
|
2663
|
+
|
|
2664
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3_4" >
|
|
2665
|
+
|
|
2666
|
+
|
|
2667
|
+
<label class="md-nav__link" for="__nav_2_3_4" id="__nav_2_3_4_label" tabindex="0">
|
|
2668
|
+
|
|
2669
|
+
|
|
2670
|
+
<span class="md-ellipsis">
|
|
2671
|
+
DCIM
|
|
2672
|
+
</span>
|
|
2673
|
+
|
|
2674
|
+
|
|
2675
|
+
<span class="md-nav__icon md-icon"></span>
|
|
2676
|
+
</label>
|
|
2677
|
+
|
|
2678
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_3_4_label" aria-expanded="false">
|
|
2679
|
+
<label class="md-nav__title" for="__nav_2_3_4">
|
|
2680
|
+
<span class="md-nav__icon md-icon"></span>
|
|
2681
|
+
DCIM
|
|
2682
|
+
</label>
|
|
2683
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
|
2684
|
+
|
|
2685
|
+
|
|
2686
|
+
|
|
2687
|
+
|
|
2688
|
+
|
|
2689
|
+
|
|
2690
|
+
|
|
2691
|
+
<li class="md-nav__item">
|
|
2692
|
+
<a href="../../user-guide/core-data-model/dcim/locationtype.html" class="md-nav__link">
|
|
2693
|
+
|
|
2694
|
+
|
|
2695
|
+
<span class="md-ellipsis">
|
|
2696
|
+
Location Type
|
|
2697
|
+
</span>
|
|
2698
|
+
|
|
2699
|
+
|
|
2700
|
+
</a>
|
|
2701
|
+
</li>
|
|
2702
|
+
|
|
2703
|
+
|
|
2704
|
+
|
|
2705
|
+
|
|
2706
|
+
|
|
2707
|
+
|
|
2708
|
+
|
|
2709
|
+
|
|
2710
|
+
|
|
2711
|
+
|
|
2712
|
+
<li class="md-nav__item">
|
|
2713
|
+
<a href="../../user-guide/core-data-model/dcim/location.html" class="md-nav__link">
|
|
2714
|
+
|
|
2715
|
+
|
|
2716
|
+
<span class="md-ellipsis">
|
|
2717
|
+
Location
|
|
2718
|
+
</span>
|
|
2719
|
+
|
|
2720
|
+
|
|
2721
|
+
</a>
|
|
2722
|
+
</li>
|
|
2723
|
+
|
|
2724
|
+
|
|
2725
|
+
|
|
2726
|
+
|
|
2727
|
+
|
|
2728
|
+
|
|
2729
|
+
|
|
2730
|
+
|
|
2731
|
+
|
|
2732
|
+
|
|
2733
|
+
<li class="md-nav__item">
|
|
2734
|
+
<a href="../../user-guide/core-data-model/dcim/rackgroup.html" class="md-nav__link">
|
|
2735
|
+
|
|
2736
|
+
|
|
2737
|
+
<span class="md-ellipsis">
|
|
2738
|
+
Rack Group
|
|
2739
|
+
</span>
|
|
2740
|
+
|
|
2741
|
+
|
|
2742
|
+
</a>
|
|
2743
|
+
</li>
|
|
2744
|
+
|
|
2745
|
+
|
|
2746
|
+
|
|
2747
|
+
|
|
2748
|
+
|
|
2749
|
+
|
|
2750
|
+
|
|
2751
|
+
|
|
2752
|
+
|
|
2753
|
+
|
|
2754
|
+
<li class="md-nav__item">
|
|
2755
|
+
<a href="../../user-guide/core-data-model/dcim/rack.html" class="md-nav__link">
|
|
2756
|
+
|
|
2757
|
+
|
|
2758
|
+
<span class="md-ellipsis">
|
|
2759
|
+
Rack
|
|
2760
|
+
</span>
|
|
2761
|
+
|
|
2762
|
+
|
|
2763
|
+
</a>
|
|
2764
|
+
</li>
|
|
2765
|
+
|
|
2766
|
+
|
|
2767
|
+
|
|
2768
|
+
|
|
2769
|
+
|
|
2770
|
+
|
|
2771
|
+
|
|
2772
|
+
|
|
2773
|
+
|
|
2774
|
+
|
|
2775
|
+
<li class="md-nav__item">
|
|
2776
|
+
<a href="../../user-guide/core-data-model/dcim/manufacturer.html" class="md-nav__link">
|
|
2777
|
+
|
|
2778
|
+
|
|
2779
|
+
<span class="md-ellipsis">
|
|
2780
|
+
Manufacturer
|
|
2781
|
+
</span>
|
|
2782
|
+
|
|
2783
|
+
|
|
2784
|
+
</a>
|
|
2785
|
+
</li>
|
|
2786
|
+
|
|
2787
|
+
|
|
2788
|
+
|
|
2789
|
+
|
|
2790
|
+
|
|
2791
|
+
|
|
2792
|
+
|
|
2793
|
+
|
|
2794
|
+
|
|
2795
|
+
|
|
2796
|
+
<li class="md-nav__item">
|
|
2797
|
+
<a href="../../user-guide/core-data-model/dcim/devicefamily.html" class="md-nav__link">
|
|
2798
|
+
|
|
2799
|
+
|
|
2800
|
+
<span class="md-ellipsis">
|
|
2801
|
+
Device Family
|
|
2802
|
+
</span>
|
|
2803
|
+
|
|
2804
|
+
|
|
2805
|
+
</a>
|
|
2806
|
+
</li>
|
|
2807
|
+
|
|
2808
|
+
|
|
2809
|
+
|
|
2810
|
+
|
|
2811
|
+
|
|
2812
|
+
|
|
2813
|
+
|
|
2814
|
+
|
|
2815
|
+
|
|
2816
|
+
|
|
2817
|
+
<li class="md-nav__item">
|
|
2818
|
+
<a href="../../user-guide/core-data-model/dcim/platform.html" class="md-nav__link">
|
|
2819
|
+
|
|
2820
|
+
|
|
2821
|
+
<span class="md-ellipsis">
|
|
2822
|
+
Platform
|
|
2823
|
+
</span>
|
|
2824
|
+
|
|
2825
|
+
|
|
2826
|
+
</a>
|
|
2827
|
+
</li>
|
|
2828
|
+
|
|
2829
|
+
|
|
2830
|
+
|
|
2831
|
+
|
|
2832
|
+
|
|
2833
|
+
|
|
2834
|
+
|
|
2835
|
+
|
|
2836
|
+
|
|
2837
|
+
|
|
2838
|
+
|
|
2839
|
+
|
|
2840
|
+
|
|
2841
|
+
|
|
2842
|
+
|
|
2843
|
+
|
|
2844
|
+
|
|
2845
|
+
<li class="md-nav__item md-nav__item--nested">
|
|
2846
|
+
|
|
2847
|
+
|
|
2848
|
+
|
|
2849
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3_4_8" >
|
|
2850
|
+
|
|
2851
|
+
|
|
2852
|
+
|
|
2853
|
+
<div class="md-nav__link md-nav__container">
|
|
2854
|
+
<a href="../../user-guide/core-data-model/dcim/devicetype.html" class="md-nav__link ">
|
|
2855
|
+
|
|
2856
|
+
|
|
2857
|
+
<span class="md-ellipsis">
|
|
2858
|
+
Device Type
|
|
2859
|
+
</span>
|
|
2860
|
+
|
|
2861
|
+
|
|
2862
|
+
</a>
|
|
2863
|
+
|
|
2864
|
+
|
|
2865
|
+
<label class="md-nav__link " for="__nav_2_3_4_8" id="__nav_2_3_4_8_label" tabindex="0">
|
|
2866
|
+
<span class="md-nav__icon md-icon"></span>
|
|
2867
|
+
</label>
|
|
2868
|
+
|
|
2869
|
+
</div>
|
|
2870
|
+
|
|
2871
|
+
<nav class="md-nav" data-md-level="4" aria-labelledby="__nav_2_3_4_8_label" aria-expanded="false">
|
|
2872
|
+
<label class="md-nav__title" for="__nav_2_3_4_8">
|
|
2873
|
+
<span class="md-nav__icon md-icon"></span>
|
|
2874
|
+
Device Type
|
|
2875
|
+
</label>
|
|
2876
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
|
2877
|
+
|
|
2878
|
+
|
|
2879
|
+
|
|
2880
|
+
|
|
2881
|
+
|
|
2882
|
+
|
|
2883
|
+
|
|
2884
|
+
<li class="md-nav__item">
|
|
2885
|
+
<a href="../../user-guide/core-data-model/dcim/consoleporttemplate.html" class="md-nav__link">
|
|
2886
|
+
|
|
2887
|
+
|
|
2888
|
+
<span class="md-ellipsis">
|
|
2889
|
+
Console Port Template
|
|
2890
|
+
</span>
|
|
2891
|
+
|
|
2892
|
+
|
|
2893
|
+
</a>
|
|
2894
|
+
</li>
|
|
2895
|
+
|
|
2896
|
+
|
|
2897
|
+
|
|
2898
|
+
|
|
2899
|
+
|
|
2900
|
+
|
|
2901
|
+
|
|
2902
|
+
|
|
2903
|
+
|
|
2904
|
+
|
|
2905
|
+
<li class="md-nav__item">
|
|
2906
|
+
<a href="../../user-guide/core-data-model/dcim/consoleserverporttemplate.html" class="md-nav__link">
|
|
2907
|
+
|
|
2908
|
+
|
|
2909
|
+
<span class="md-ellipsis">
|
|
2910
|
+
Console Server Port Template
|
|
2911
|
+
</span>
|
|
2912
|
+
|
|
2913
|
+
|
|
2914
|
+
</a>
|
|
2915
|
+
</li>
|
|
2916
|
+
|
|
2917
|
+
|
|
2918
|
+
|
|
2919
|
+
|
|
2920
|
+
|
|
2921
|
+
|
|
2922
|
+
|
|
2923
|
+
|
|
2924
|
+
|
|
2925
|
+
|
|
2926
|
+
<li class="md-nav__item">
|
|
2927
|
+
<a href="../../user-guide/core-data-model/dcim/devicebaytemplate.html" class="md-nav__link">
|
|
2928
|
+
|
|
2929
|
+
|
|
2930
|
+
<span class="md-ellipsis">
|
|
2931
|
+
Device Bay Template
|
|
2932
|
+
</span>
|
|
2933
|
+
|
|
2934
|
+
|
|
2935
|
+
</a>
|
|
2936
|
+
</li>
|
|
2937
|
+
|
|
2938
|
+
|
|
2939
|
+
|
|
2940
|
+
|
|
2941
|
+
|
|
2942
|
+
|
|
2943
|
+
|
|
2944
|
+
|
|
2945
|
+
|
|
2946
|
+
|
|
2947
|
+
<li class="md-nav__item">
|
|
2948
|
+
<a href="../../user-guide/core-data-model/dcim/frontporttemplate.html" class="md-nav__link">
|
|
2949
|
+
|
|
2950
|
+
|
|
2951
|
+
<span class="md-ellipsis">
|
|
2952
|
+
Front Port Template
|
|
2953
|
+
</span>
|
|
2954
|
+
|
|
2955
|
+
|
|
2956
|
+
</a>
|
|
2957
|
+
</li>
|
|
2958
|
+
|
|
2959
|
+
|
|
2960
|
+
|
|
2961
|
+
|
|
2962
|
+
|
|
2963
|
+
|
|
2964
|
+
|
|
2965
|
+
|
|
2966
|
+
|
|
2967
|
+
|
|
2968
|
+
<li class="md-nav__item">
|
|
2969
|
+
<a href="../../user-guide/core-data-model/dcim/interfacetemplate.html" class="md-nav__link">
|
|
2970
|
+
|
|
2971
|
+
|
|
2972
|
+
<span class="md-ellipsis">
|
|
2973
|
+
Interface Template
|
|
2974
|
+
</span>
|
|
2975
|
+
|
|
2976
|
+
|
|
2977
|
+
</a>
|
|
2978
|
+
</li>
|
|
2979
|
+
|
|
2980
|
+
|
|
2981
|
+
|
|
2982
|
+
|
|
2983
|
+
|
|
2984
|
+
|
|
2985
|
+
|
|
2986
|
+
|
|
2987
|
+
|
|
2988
|
+
|
|
2989
|
+
<li class="md-nav__item">
|
|
2990
|
+
<a href="../../user-guide/core-data-model/dcim/modulebaytemplate.html" class="md-nav__link">
|
|
2991
|
+
|
|
2992
|
+
|
|
2993
|
+
<span class="md-ellipsis">
|
|
2994
|
+
Module Bay Template
|
|
2995
|
+
</span>
|
|
2996
|
+
|
|
2997
|
+
|
|
2998
|
+
</a>
|
|
2999
|
+
</li>
|
|
3000
|
+
|
|
3001
|
+
|
|
3002
|
+
|
|
3003
|
+
|
|
3004
|
+
|
|
3005
|
+
|
|
3006
|
+
|
|
3007
|
+
|
|
3008
|
+
|
|
3009
|
+
|
|
3010
|
+
<li class="md-nav__item">
|
|
3011
|
+
<a href="../../user-guide/core-data-model/dcim/poweroutlettemplate.html" class="md-nav__link">
|
|
3012
|
+
|
|
3013
|
+
|
|
3014
|
+
<span class="md-ellipsis">
|
|
3015
|
+
Power Outlet Template
|
|
3016
|
+
</span>
|
|
3017
|
+
|
|
3018
|
+
|
|
3019
|
+
</a>
|
|
3020
|
+
</li>
|
|
3021
|
+
|
|
3022
|
+
|
|
3023
|
+
|
|
3024
|
+
|
|
3025
|
+
|
|
3026
|
+
|
|
3027
|
+
|
|
3028
|
+
|
|
3029
|
+
|
|
3030
|
+
|
|
3031
|
+
<li class="md-nav__item">
|
|
3032
|
+
<a href="../../user-guide/core-data-model/dcim/powerporttemplate.html" class="md-nav__link">
|
|
3033
|
+
|
|
3034
|
+
|
|
3035
|
+
<span class="md-ellipsis">
|
|
3036
|
+
Power Port Template
|
|
3037
|
+
</span>
|
|
3038
|
+
|
|
3039
|
+
|
|
3040
|
+
</a>
|
|
3041
|
+
</li>
|
|
3042
|
+
|
|
3043
|
+
|
|
3044
|
+
|
|
3045
|
+
|
|
3046
|
+
|
|
3047
|
+
|
|
3048
|
+
|
|
3049
|
+
|
|
3050
|
+
|
|
3051
|
+
|
|
3052
|
+
<li class="md-nav__item">
|
|
3053
|
+
<a href="../../user-guide/core-data-model/dcim/rearporttemplate.html" class="md-nav__link">
|
|
3054
|
+
|
|
3055
|
+
|
|
3056
|
+
<span class="md-ellipsis">
|
|
3057
|
+
Rear Port Template
|
|
3058
|
+
</span>
|
|
3059
|
+
|
|
3060
|
+
|
|
3061
|
+
</a>
|
|
3062
|
+
</li>
|
|
3063
|
+
|
|
3064
|
+
|
|
3065
|
+
|
|
3066
|
+
|
|
3067
|
+
</ul>
|
|
3068
|
+
</nav>
|
|
3069
|
+
|
|
3070
|
+
</li>
|
|
3071
|
+
|
|
3072
|
+
|
|
3073
|
+
|
|
3074
|
+
|
|
3075
|
+
|
|
3076
|
+
|
|
3077
|
+
|
|
3078
|
+
|
|
3079
|
+
|
|
3080
|
+
|
|
3081
|
+
|
|
3082
|
+
|
|
3083
|
+
|
|
3084
|
+
|
|
3085
|
+
|
|
3086
|
+
|
|
3087
|
+
|
|
3088
|
+
<li class="md-nav__item md-nav__item--nested">
|
|
3089
|
+
|
|
3090
|
+
|
|
3091
|
+
|
|
3092
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3_4_9" >
|
|
3093
|
+
|
|
3094
|
+
|
|
3095
|
+
|
|
3096
|
+
<div class="md-nav__link md-nav__container">
|
|
3097
|
+
<a href="../../user-guide/core-data-model/dcim/device.html" class="md-nav__link ">
|
|
3098
|
+
|
|
3099
|
+
|
|
3100
|
+
<span class="md-ellipsis">
|
|
3101
|
+
Device
|
|
3102
|
+
</span>
|
|
3103
|
+
|
|
3104
|
+
|
|
3105
|
+
</a>
|
|
3106
|
+
|
|
3107
|
+
|
|
3108
|
+
<label class="md-nav__link " for="__nav_2_3_4_9" id="__nav_2_3_4_9_label" tabindex="0">
|
|
3109
|
+
<span class="md-nav__icon md-icon"></span>
|
|
3110
|
+
</label>
|
|
3111
|
+
|
|
3112
|
+
</div>
|
|
3113
|
+
|
|
3114
|
+
<nav class="md-nav" data-md-level="4" aria-labelledby="__nav_2_3_4_9_label" aria-expanded="false">
|
|
3115
|
+
<label class="md-nav__title" for="__nav_2_3_4_9">
|
|
3116
|
+
<span class="md-nav__icon md-icon"></span>
|
|
3117
|
+
Device
|
|
3118
|
+
</label>
|
|
3119
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
|
3120
|
+
|
|
3121
|
+
|
|
3122
|
+
|
|
3123
|
+
|
|
3124
|
+
|
|
3125
|
+
|
|
3126
|
+
|
|
3127
|
+
<li class="md-nav__item">
|
|
3128
|
+
<a href="../../user-guide/core-data-model/dcim/consoleport.html" class="md-nav__link">
|
|
3129
|
+
|
|
3130
|
+
|
|
3131
|
+
<span class="md-ellipsis">
|
|
3132
|
+
Console Port
|
|
3133
|
+
</span>
|
|
3134
|
+
|
|
3135
|
+
|
|
3136
|
+
</a>
|
|
3137
|
+
</li>
|
|
3138
|
+
|
|
3139
|
+
|
|
3140
|
+
|
|
3141
|
+
|
|
3142
|
+
|
|
3143
|
+
|
|
3144
|
+
|
|
3145
|
+
|
|
3146
|
+
|
|
3147
|
+
|
|
3148
|
+
<li class="md-nav__item">
|
|
3149
|
+
<a href="../../user-guide/core-data-model/dcim/consoleserverport.html" class="md-nav__link">
|
|
3150
|
+
|
|
3151
|
+
|
|
3152
|
+
<span class="md-ellipsis">
|
|
3153
|
+
Console Server Port
|
|
3154
|
+
</span>
|
|
3155
|
+
|
|
3156
|
+
|
|
3157
|
+
</a>
|
|
3158
|
+
</li>
|
|
3159
|
+
|
|
3160
|
+
|
|
3161
|
+
|
|
2488
3162
|
|
|
3163
|
+
|
|
3164
|
+
|
|
3165
|
+
|
|
3166
|
+
|
|
3167
|
+
|
|
3168
|
+
|
|
3169
|
+
<li class="md-nav__item">
|
|
3170
|
+
<a href="../../user-guide/core-data-model/dcim/devicebay.html" class="md-nav__link">
|
|
3171
|
+
|
|
2489
3172
|
|
|
2490
3173
|
<span class="md-ellipsis">
|
|
2491
|
-
|
|
3174
|
+
Device Bay
|
|
2492
3175
|
</span>
|
|
2493
3176
|
|
|
2494
3177
|
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
<span class="md-nav__icon md-icon"></span>
|
|
2501
|
-
DCIM
|
|
2502
|
-
</label>
|
|
2503
|
-
<ul class="md-nav__list" data-md-scrollfix>
|
|
3178
|
+
</a>
|
|
3179
|
+
</li>
|
|
3180
|
+
|
|
3181
|
+
|
|
3182
|
+
|
|
2504
3183
|
|
|
2505
3184
|
|
|
2506
3185
|
|
|
@@ -2509,11 +3188,11 @@
|
|
|
2509
3188
|
|
|
2510
3189
|
|
|
2511
3190
|
<li class="md-nav__item">
|
|
2512
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3191
|
+
<a href="../../user-guide/core-data-model/dcim/frontport.html" class="md-nav__link">
|
|
2513
3192
|
|
|
2514
3193
|
|
|
2515
3194
|
<span class="md-ellipsis">
|
|
2516
|
-
|
|
3195
|
+
Front Port
|
|
2517
3196
|
</span>
|
|
2518
3197
|
|
|
2519
3198
|
|
|
@@ -2530,11 +3209,11 @@
|
|
|
2530
3209
|
|
|
2531
3210
|
|
|
2532
3211
|
<li class="md-nav__item">
|
|
2533
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3212
|
+
<a href="../../user-guide/core-data-model/dcim/interface.html" class="md-nav__link">
|
|
2534
3213
|
|
|
2535
3214
|
|
|
2536
3215
|
<span class="md-ellipsis">
|
|
2537
|
-
|
|
3216
|
+
Interface
|
|
2538
3217
|
</span>
|
|
2539
3218
|
|
|
2540
3219
|
|
|
@@ -2551,11 +3230,11 @@
|
|
|
2551
3230
|
|
|
2552
3231
|
|
|
2553
3232
|
<li class="md-nav__item">
|
|
2554
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3233
|
+
<a href="../../user-guide/core-data-model/dcim/inventoryitem.html" class="md-nav__link">
|
|
2555
3234
|
|
|
2556
3235
|
|
|
2557
3236
|
<span class="md-ellipsis">
|
|
2558
|
-
|
|
3237
|
+
Inventory Item
|
|
2559
3238
|
</span>
|
|
2560
3239
|
|
|
2561
3240
|
|
|
@@ -2572,11 +3251,11 @@
|
|
|
2572
3251
|
|
|
2573
3252
|
|
|
2574
3253
|
<li class="md-nav__item">
|
|
2575
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3254
|
+
<a href="../../user-guide/core-data-model/dcim/modulebay.html" class="md-nav__link">
|
|
2576
3255
|
|
|
2577
3256
|
|
|
2578
3257
|
<span class="md-ellipsis">
|
|
2579
|
-
|
|
3258
|
+
Module Bay
|
|
2580
3259
|
</span>
|
|
2581
3260
|
|
|
2582
3261
|
|
|
@@ -2593,11 +3272,11 @@
|
|
|
2593
3272
|
|
|
2594
3273
|
|
|
2595
3274
|
<li class="md-nav__item">
|
|
2596
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3275
|
+
<a href="../../user-guide/core-data-model/dcim/powerport.html" class="md-nav__link">
|
|
2597
3276
|
|
|
2598
3277
|
|
|
2599
3278
|
<span class="md-ellipsis">
|
|
2600
|
-
|
|
3279
|
+
Power Port
|
|
2601
3280
|
</span>
|
|
2602
3281
|
|
|
2603
3282
|
|
|
@@ -2614,11 +3293,11 @@
|
|
|
2614
3293
|
|
|
2615
3294
|
|
|
2616
3295
|
<li class="md-nav__item">
|
|
2617
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3296
|
+
<a href="../../user-guide/core-data-model/dcim/poweroutlet.html" class="md-nav__link">
|
|
2618
3297
|
|
|
2619
3298
|
|
|
2620
3299
|
<span class="md-ellipsis">
|
|
2621
|
-
|
|
3300
|
+
Power Outlet
|
|
2622
3301
|
</span>
|
|
2623
3302
|
|
|
2624
3303
|
|
|
@@ -2635,11 +3314,11 @@
|
|
|
2635
3314
|
|
|
2636
3315
|
|
|
2637
3316
|
<li class="md-nav__item">
|
|
2638
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3317
|
+
<a href="../../user-guide/core-data-model/dcim/rearport.html" class="md-nav__link">
|
|
2639
3318
|
|
|
2640
3319
|
|
|
2641
3320
|
<span class="md-ellipsis">
|
|
2642
|
-
|
|
3321
|
+
Rear Port
|
|
2643
3322
|
</span>
|
|
2644
3323
|
|
|
2645
3324
|
|
|
@@ -2649,6 +3328,14 @@
|
|
|
2649
3328
|
|
|
2650
3329
|
|
|
2651
3330
|
|
|
3331
|
+
</ul>
|
|
3332
|
+
</nav>
|
|
3333
|
+
|
|
3334
|
+
</li>
|
|
3335
|
+
|
|
3336
|
+
|
|
3337
|
+
|
|
3338
|
+
|
|
2652
3339
|
|
|
2653
3340
|
|
|
2654
3341
|
|
|
@@ -2666,32 +3353,32 @@
|
|
|
2666
3353
|
|
|
2667
3354
|
|
|
2668
3355
|
|
|
2669
|
-
<input class="md-nav__toggle md-toggle " type="checkbox" id="
|
|
3356
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3_4_10" >
|
|
2670
3357
|
|
|
2671
3358
|
|
|
2672
3359
|
|
|
2673
3360
|
<div class="md-nav__link md-nav__container">
|
|
2674
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3361
|
+
<a href="../../user-guide/core-data-model/dcim/moduletype.html" class="md-nav__link ">
|
|
2675
3362
|
|
|
2676
3363
|
|
|
2677
3364
|
<span class="md-ellipsis">
|
|
2678
|
-
|
|
3365
|
+
Module Type
|
|
2679
3366
|
</span>
|
|
2680
3367
|
|
|
2681
3368
|
|
|
2682
3369
|
</a>
|
|
2683
3370
|
|
|
2684
3371
|
|
|
2685
|
-
<label class="md-nav__link " for="
|
|
3372
|
+
<label class="md-nav__link " for="__nav_2_3_4_10" id="__nav_2_3_4_10_label" tabindex="0">
|
|
2686
3373
|
<span class="md-nav__icon md-icon"></span>
|
|
2687
3374
|
</label>
|
|
2688
3375
|
|
|
2689
3376
|
</div>
|
|
2690
3377
|
|
|
2691
|
-
<nav class="md-nav" data-md-level="4" aria-labelledby="
|
|
2692
|
-
<label class="md-nav__title" for="
|
|
3378
|
+
<nav class="md-nav" data-md-level="4" aria-labelledby="__nav_2_3_4_10_label" aria-expanded="false">
|
|
3379
|
+
<label class="md-nav__title" for="__nav_2_3_4_10">
|
|
2693
3380
|
<span class="md-nav__icon md-icon"></span>
|
|
2694
|
-
|
|
3381
|
+
Module Type
|
|
2695
3382
|
</label>
|
|
2696
3383
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
2697
3384
|
|
|
@@ -2744,11 +3431,11 @@
|
|
|
2744
3431
|
|
|
2745
3432
|
|
|
2746
3433
|
<li class="md-nav__item">
|
|
2747
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3434
|
+
<a href="../../user-guide/core-data-model/dcim/frontporttemplate.html" class="md-nav__link">
|
|
2748
3435
|
|
|
2749
3436
|
|
|
2750
3437
|
<span class="md-ellipsis">
|
|
2751
|
-
|
|
3438
|
+
Front Port Template
|
|
2752
3439
|
</span>
|
|
2753
3440
|
|
|
2754
3441
|
|
|
@@ -2765,11 +3452,11 @@
|
|
|
2765
3452
|
|
|
2766
3453
|
|
|
2767
3454
|
<li class="md-nav__item">
|
|
2768
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3455
|
+
<a href="../../user-guide/core-data-model/dcim/interfacetemplate.html" class="md-nav__link">
|
|
2769
3456
|
|
|
2770
3457
|
|
|
2771
3458
|
<span class="md-ellipsis">
|
|
2772
|
-
|
|
3459
|
+
Interface Template
|
|
2773
3460
|
</span>
|
|
2774
3461
|
|
|
2775
3462
|
|
|
@@ -2786,11 +3473,11 @@
|
|
|
2786
3473
|
|
|
2787
3474
|
|
|
2788
3475
|
<li class="md-nav__item">
|
|
2789
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3476
|
+
<a href="../../user-guide/core-data-model/dcim/modulebaytemplate.html" class="md-nav__link">
|
|
2790
3477
|
|
|
2791
3478
|
|
|
2792
3479
|
<span class="md-ellipsis">
|
|
2793
|
-
|
|
3480
|
+
Module Bay Template
|
|
2794
3481
|
</span>
|
|
2795
3482
|
|
|
2796
3483
|
|
|
@@ -2888,32 +3575,32 @@
|
|
|
2888
3575
|
|
|
2889
3576
|
|
|
2890
3577
|
|
|
2891
|
-
<input class="md-nav__toggle md-toggle " type="checkbox" id="
|
|
3578
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3_4_11" >
|
|
2892
3579
|
|
|
2893
3580
|
|
|
2894
3581
|
|
|
2895
3582
|
<div class="md-nav__link md-nav__container">
|
|
2896
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3583
|
+
<a href="../../user-guide/core-data-model/dcim/module.html" class="md-nav__link ">
|
|
2897
3584
|
|
|
2898
3585
|
|
|
2899
3586
|
<span class="md-ellipsis">
|
|
2900
|
-
|
|
3587
|
+
Module
|
|
2901
3588
|
</span>
|
|
2902
3589
|
|
|
2903
3590
|
|
|
2904
3591
|
</a>
|
|
2905
3592
|
|
|
2906
3593
|
|
|
2907
|
-
<label class="md-nav__link " for="
|
|
3594
|
+
<label class="md-nav__link " for="__nav_2_3_4_11" id="__nav_2_3_4_11_label" tabindex="0">
|
|
2908
3595
|
<span class="md-nav__icon md-icon"></span>
|
|
2909
3596
|
</label>
|
|
2910
3597
|
|
|
2911
3598
|
</div>
|
|
2912
3599
|
|
|
2913
|
-
<nav class="md-nav" data-md-level="4" aria-labelledby="
|
|
2914
|
-
<label class="md-nav__title" for="
|
|
3600
|
+
<nav class="md-nav" data-md-level="4" aria-labelledby="__nav_2_3_4_11_label" aria-expanded="false">
|
|
3601
|
+
<label class="md-nav__title" for="__nav_2_3_4_11">
|
|
2915
3602
|
<span class="md-nav__icon md-icon"></span>
|
|
2916
|
-
|
|
3603
|
+
Module
|
|
2917
3604
|
</label>
|
|
2918
3605
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
2919
3606
|
|
|
@@ -2966,11 +3653,11 @@
|
|
|
2966
3653
|
|
|
2967
3654
|
|
|
2968
3655
|
<li class="md-nav__item">
|
|
2969
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3656
|
+
<a href="../../user-guide/core-data-model/dcim/frontport.html" class="md-nav__link">
|
|
2970
3657
|
|
|
2971
3658
|
|
|
2972
3659
|
<span class="md-ellipsis">
|
|
2973
|
-
|
|
3660
|
+
Front Port
|
|
2974
3661
|
</span>
|
|
2975
3662
|
|
|
2976
3663
|
|
|
@@ -2987,11 +3674,11 @@
|
|
|
2987
3674
|
|
|
2988
3675
|
|
|
2989
3676
|
<li class="md-nav__item">
|
|
2990
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3677
|
+
<a href="../../user-guide/core-data-model/dcim/interface.html" class="md-nav__link">
|
|
2991
3678
|
|
|
2992
3679
|
|
|
2993
3680
|
<span class="md-ellipsis">
|
|
2994
|
-
|
|
3681
|
+
Interface
|
|
2995
3682
|
</span>
|
|
2996
3683
|
|
|
2997
3684
|
|
|
@@ -3008,11 +3695,11 @@
|
|
|
3008
3695
|
|
|
3009
3696
|
|
|
3010
3697
|
<li class="md-nav__item">
|
|
3011
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3698
|
+
<a href="../../user-guide/core-data-model/dcim/inventoryitem.html" class="md-nav__link">
|
|
3012
3699
|
|
|
3013
3700
|
|
|
3014
3701
|
<span class="md-ellipsis">
|
|
3015
|
-
|
|
3702
|
+
Inventory Item
|
|
3016
3703
|
</span>
|
|
3017
3704
|
|
|
3018
3705
|
|
|
@@ -3029,11 +3716,11 @@
|
|
|
3029
3716
|
|
|
3030
3717
|
|
|
3031
3718
|
<li class="md-nav__item">
|
|
3032
|
-
<a href="../../user-guide/core-data-model/dcim/
|
|
3719
|
+
<a href="../../user-guide/core-data-model/dcim/modulebay.html" class="md-nav__link">
|
|
3033
3720
|
|
|
3034
3721
|
|
|
3035
3722
|
<span class="md-ellipsis">
|
|
3036
|
-
|
|
3723
|
+
Module Bay
|
|
3037
3724
|
</span>
|
|
3038
3725
|
|
|
3039
3726
|
|
|
@@ -3370,10 +4057,10 @@
|
|
|
3370
4057
|
|
|
3371
4058
|
|
|
3372
4059
|
|
|
3373
|
-
<input class="md-nav__toggle md-toggle " type="checkbox" id="
|
|
4060
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3_5" >
|
|
3374
4061
|
|
|
3375
4062
|
|
|
3376
|
-
<label class="md-nav__link" for="
|
|
4063
|
+
<label class="md-nav__link" for="__nav_2_3_5" id="__nav_2_3_5_label" tabindex="0">
|
|
3377
4064
|
|
|
3378
4065
|
|
|
3379
4066
|
<span class="md-ellipsis">
|
|
@@ -3384,8 +4071,8 @@
|
|
|
3384
4071
|
<span class="md-nav__icon md-icon"></span>
|
|
3385
4072
|
</label>
|
|
3386
4073
|
|
|
3387
|
-
<nav class="md-nav" data-md-level="3" aria-labelledby="
|
|
3388
|
-
<label class="md-nav__title" for="
|
|
4074
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_3_5_label" aria-expanded="false">
|
|
4075
|
+
<label class="md-nav__title" for="__nav_2_3_5">
|
|
3389
4076
|
<span class="md-nav__icon md-icon"></span>
|
|
3390
4077
|
Extras
|
|
3391
4078
|
</label>
|
|
@@ -3500,10 +4187,10 @@
|
|
|
3500
4187
|
|
|
3501
4188
|
|
|
3502
4189
|
|
|
3503
|
-
<input class="md-nav__toggle md-toggle " type="checkbox" id="
|
|
4190
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3_6" >
|
|
3504
4191
|
|
|
3505
4192
|
|
|
3506
|
-
<label class="md-nav__link" for="
|
|
4193
|
+
<label class="md-nav__link" for="__nav_2_3_6" id="__nav_2_3_6_label" tabindex="0">
|
|
3507
4194
|
|
|
3508
4195
|
|
|
3509
4196
|
<span class="md-ellipsis">
|
|
@@ -3514,8 +4201,8 @@
|
|
|
3514
4201
|
<span class="md-nav__icon md-icon"></span>
|
|
3515
4202
|
</label>
|
|
3516
4203
|
|
|
3517
|
-
<nav class="md-nav" data-md-level="3" aria-labelledby="
|
|
3518
|
-
<label class="md-nav__title" for="
|
|
4204
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_3_6_label" aria-expanded="false">
|
|
4205
|
+
<label class="md-nav__title" for="__nav_2_3_6">
|
|
3519
4206
|
<span class="md-nav__icon md-icon"></span>
|
|
3520
4207
|
IPAM
|
|
3521
4208
|
</label>
|
|
@@ -3735,10 +4422,10 @@
|
|
|
3735
4422
|
|
|
3736
4423
|
|
|
3737
4424
|
|
|
3738
|
-
<input class="md-nav__toggle md-toggle " type="checkbox" id="
|
|
4425
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3_7" >
|
|
3739
4426
|
|
|
3740
4427
|
|
|
3741
|
-
<label class="md-nav__link" for="
|
|
4428
|
+
<label class="md-nav__link" for="__nav_2_3_7" id="__nav_2_3_7_label" tabindex="0">
|
|
3742
4429
|
|
|
3743
4430
|
|
|
3744
4431
|
<span class="md-ellipsis">
|
|
@@ -3749,8 +4436,8 @@
|
|
|
3749
4436
|
<span class="md-nav__icon md-icon"></span>
|
|
3750
4437
|
</label>
|
|
3751
4438
|
|
|
3752
|
-
<nav class="md-nav" data-md-level="3" aria-labelledby="
|
|
3753
|
-
<label class="md-nav__title" for="
|
|
4439
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_3_7_label" aria-expanded="false">
|
|
4440
|
+
<label class="md-nav__title" for="__nav_2_3_7">
|
|
3754
4441
|
<span class="md-nav__icon md-icon"></span>
|
|
3755
4442
|
Tenancy
|
|
3756
4443
|
</label>
|
|
@@ -3823,10 +4510,10 @@
|
|
|
3823
4510
|
|
|
3824
4511
|
|
|
3825
4512
|
|
|
3826
|
-
<input class="md-nav__toggle md-toggle " type="checkbox" id="
|
|
4513
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3_8" >
|
|
3827
4514
|
|
|
3828
4515
|
|
|
3829
|
-
<label class="md-nav__link" for="
|
|
4516
|
+
<label class="md-nav__link" for="__nav_2_3_8" id="__nav_2_3_8_label" tabindex="0">
|
|
3830
4517
|
|
|
3831
4518
|
|
|
3832
4519
|
<span class="md-ellipsis">
|
|
@@ -3837,8 +4524,8 @@
|
|
|
3837
4524
|
<span class="md-nav__icon md-icon"></span>
|
|
3838
4525
|
</label>
|
|
3839
4526
|
|
|
3840
|
-
<nav class="md-nav" data-md-level="3" aria-labelledby="
|
|
3841
|
-
<label class="md-nav__title" for="
|
|
4527
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_3_8_label" aria-expanded="false">
|
|
4528
|
+
<label class="md-nav__title" for="__nav_2_3_8">
|
|
3842
4529
|
<span class="md-nav__icon md-icon"></span>
|
|
3843
4530
|
Virtualization
|
|
3844
4531
|
</label>
|
|
@@ -4093,21 +4780,75 @@
|
|
|
4093
4780
|
|
|
4094
4781
|
|
|
4095
4782
|
|
|
4096
|
-
|
|
4097
|
-
|
|
4783
|
+
|
|
4784
|
+
|
|
4785
|
+
|
|
4786
|
+
|
|
4787
|
+
|
|
4788
|
+
|
|
4789
|
+
|
|
4790
|
+
<li class="md-nav__item md-nav__item--nested">
|
|
4791
|
+
|
|
4792
|
+
|
|
4098
4793
|
|
|
4794
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_5" >
|
|
4795
|
+
|
|
4796
|
+
|
|
4797
|
+
|
|
4798
|
+
<div class="md-nav__link md-nav__container">
|
|
4799
|
+
<a href="../../user-guide/platform-functionality/dynamicgroup.html" class="md-nav__link ">
|
|
4800
|
+
|
|
4099
4801
|
|
|
4100
4802
|
<span class="md-ellipsis">
|
|
4101
4803
|
Dynamic Groups
|
|
4102
4804
|
</span>
|
|
4103
4805
|
|
|
4104
4806
|
|
|
4807
|
+
</a>
|
|
4808
|
+
|
|
4809
|
+
|
|
4810
|
+
<label class="md-nav__link " for="__nav_2_4_5" id="__nav_2_4_5_label" tabindex="0">
|
|
4811
|
+
<span class="md-nav__icon md-icon"></span>
|
|
4812
|
+
</label>
|
|
4813
|
+
|
|
4814
|
+
</div>
|
|
4815
|
+
|
|
4816
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_5_label" aria-expanded="false">
|
|
4817
|
+
<label class="md-nav__title" for="__nav_2_4_5">
|
|
4818
|
+
<span class="md-nav__icon md-icon"></span>
|
|
4819
|
+
Dynamic Groups
|
|
4820
|
+
</label>
|
|
4821
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
|
4822
|
+
|
|
4823
|
+
|
|
4824
|
+
|
|
4825
|
+
|
|
4826
|
+
|
|
4827
|
+
|
|
4828
|
+
|
|
4829
|
+
<li class="md-nav__item">
|
|
4830
|
+
<a href="../../user-guide/platform-functionality/staticgroupassociation.html" class="md-nav__link">
|
|
4831
|
+
|
|
4832
|
+
|
|
4833
|
+
<span class="md-ellipsis">
|
|
4834
|
+
Static Group Associations
|
|
4835
|
+
</span>
|
|
4836
|
+
|
|
4837
|
+
|
|
4105
4838
|
</a>
|
|
4106
4839
|
</li>
|
|
4107
4840
|
|
|
4108
4841
|
|
|
4109
4842
|
|
|
4110
4843
|
|
|
4844
|
+
</ul>
|
|
4845
|
+
</nav>
|
|
4846
|
+
|
|
4847
|
+
</li>
|
|
4848
|
+
|
|
4849
|
+
|
|
4850
|
+
|
|
4851
|
+
|
|
4111
4852
|
|
|
4112
4853
|
|
|
4113
4854
|
|
|
@@ -4411,6 +5152,27 @@
|
|
|
4411
5152
|
|
|
4412
5153
|
|
|
4413
5154
|
|
|
5155
|
+
<li class="md-nav__item">
|
|
5156
|
+
<a href="../../user-guide/platform-functionality/metadata.html" class="md-nav__link">
|
|
5157
|
+
|
|
5158
|
+
|
|
5159
|
+
<span class="md-ellipsis">
|
|
5160
|
+
Metadata
|
|
5161
|
+
</span>
|
|
5162
|
+
|
|
5163
|
+
|
|
5164
|
+
</a>
|
|
5165
|
+
</li>
|
|
5166
|
+
|
|
5167
|
+
|
|
5168
|
+
|
|
5169
|
+
|
|
5170
|
+
|
|
5171
|
+
|
|
5172
|
+
|
|
5173
|
+
|
|
5174
|
+
|
|
5175
|
+
|
|
4414
5176
|
<li class="md-nav__item">
|
|
4415
5177
|
<a href="../../user-guide/platform-functionality/napalm.html" class="md-nav__link">
|
|
4416
5178
|
|
|
@@ -4485,7 +5247,7 @@
|
|
|
4485
5247
|
|
|
4486
5248
|
|
|
4487
5249
|
|
|
4488
|
-
<input class="md-nav__toggle md-toggle " type="checkbox" id="
|
|
5250
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_16" >
|
|
4489
5251
|
|
|
4490
5252
|
|
|
4491
5253
|
|
|
@@ -4501,14 +5263,14 @@
|
|
|
4501
5263
|
</a>
|
|
4502
5264
|
|
|
4503
5265
|
|
|
4504
|
-
<label class="md-nav__link " for="
|
|
5266
|
+
<label class="md-nav__link " for="__nav_2_4_16" id="__nav_2_4_16_label" tabindex="0">
|
|
4505
5267
|
<span class="md-nav__icon md-icon"></span>
|
|
4506
5268
|
</label>
|
|
4507
5269
|
|
|
4508
5270
|
</div>
|
|
4509
5271
|
|
|
4510
|
-
<nav class="md-nav" data-md-level="3" aria-labelledby="
|
|
4511
|
-
<label class="md-nav__title" for="
|
|
5272
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_16_label" aria-expanded="false">
|
|
5273
|
+
<label class="md-nav__title" for="__nav_2_4_16">
|
|
4512
5274
|
<span class="md-nav__icon md-icon"></span>
|
|
4513
5275
|
REST API
|
|
4514
5276
|
</label>
|
|
@@ -4612,6 +5374,27 @@
|
|
|
4612
5374
|
|
|
4613
5375
|
|
|
4614
5376
|
|
|
5377
|
+
<li class="md-nav__item">
|
|
5378
|
+
<a href="../../user-guide/platform-functionality/savedview.html" class="md-nav__link">
|
|
5379
|
+
|
|
5380
|
+
|
|
5381
|
+
<span class="md-ellipsis">
|
|
5382
|
+
Saved Views
|
|
5383
|
+
</span>
|
|
5384
|
+
|
|
5385
|
+
|
|
5386
|
+
</a>
|
|
5387
|
+
</li>
|
|
5388
|
+
|
|
5389
|
+
|
|
5390
|
+
|
|
5391
|
+
|
|
5392
|
+
|
|
5393
|
+
|
|
5394
|
+
|
|
5395
|
+
|
|
5396
|
+
|
|
5397
|
+
|
|
4615
5398
|
<li class="md-nav__item">
|
|
4616
5399
|
<a href="../../user-guide/platform-functionality/secret.html" class="md-nav__link">
|
|
4617
5400
|
|
|
@@ -4707,10 +5490,10 @@
|
|
|
4707
5490
|
|
|
4708
5491
|
|
|
4709
5492
|
|
|
4710
|
-
<input class="md-nav__toggle md-toggle " type="checkbox" id="
|
|
5493
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_23" >
|
|
4711
5494
|
|
|
4712
5495
|
|
|
4713
|
-
<label class="md-nav__link" for="
|
|
5496
|
+
<label class="md-nav__link" for="__nav_2_4_23" id="__nav_2_4_23_label" tabindex="0">
|
|
4714
5497
|
|
|
4715
5498
|
|
|
4716
5499
|
<span class="md-ellipsis">
|
|
@@ -4721,8 +5504,8 @@
|
|
|
4721
5504
|
<span class="md-nav__icon md-icon"></span>
|
|
4722
5505
|
</label>
|
|
4723
5506
|
|
|
4724
|
-
<nav class="md-nav" data-md-level="3" aria-labelledby="
|
|
4725
|
-
<label class="md-nav__title" for="
|
|
5507
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_23_label" aria-expanded="false">
|
|
5508
|
+
<label class="md-nav__title" for="__nav_2_4_23">
|
|
4726
5509
|
<span class="md-nav__icon md-icon"></span>
|
|
4727
5510
|
Users
|
|
4728
5511
|
</label>
|
|
@@ -7277,6 +8060,27 @@
|
|
|
7277
8060
|
|
|
7278
8061
|
|
|
7279
8062
|
|
|
8063
|
+
<li class="md-nav__item">
|
|
8064
|
+
<a href="../../release-notes/version-2.3.html" class="md-nav__link">
|
|
8065
|
+
|
|
8066
|
+
|
|
8067
|
+
<span class="md-ellipsis">
|
|
8068
|
+
Version 2.3
|
|
8069
|
+
</span>
|
|
8070
|
+
|
|
8071
|
+
|
|
8072
|
+
</a>
|
|
8073
|
+
</li>
|
|
8074
|
+
|
|
8075
|
+
|
|
8076
|
+
|
|
8077
|
+
|
|
8078
|
+
|
|
8079
|
+
|
|
8080
|
+
|
|
8081
|
+
|
|
8082
|
+
|
|
8083
|
+
|
|
7280
8084
|
<li class="md-nav__item">
|
|
7281
8085
|
<a href="../../release-notes/version-2.2.html" class="md-nav__link">
|
|
7282
8086
|
|
|
@@ -8568,21 +9372,6 @@
|
|
|
8568
9372
|
</code></pre></div>
|
|
8569
9373
|
<p>Similarly, only the <code>jobs</code> module is loaded from Git repositories. If you're using submodules, you need to ensure that your jobs are either registered in the repository's <code>jobs/__init__.py</code> or that this file imports your submodules where the jobs are registered.</p>
|
|
8570
9374
|
<p>If not using submodules, you should register your job in the file where your job is defined.</p>
|
|
8571
|
-
<p>Examples of the different directory structures when registering jobs in Git repositories: </p>
|
|
8572
|
-
<div class="admonition note">
|
|
8573
|
-
<p class="admonition-title">Note</p>
|
|
8574
|
-
<p>Take note of the <code>__init__.py</code> at the root of the repository. This is required to register jobs in a Git repository.</p>
|
|
8575
|
-
</div>
|
|
8576
|
-
<div class="highlight"><span class="filename">jobs.py</span><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>.
|
|
8577
|
-
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>├── __init__.py
|
|
8578
|
-
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>└── jobs.py
|
|
8579
|
-
</code></pre></div>
|
|
8580
|
-
<div class="highlight"><span class="filename">submodule</span><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>.
|
|
8581
|
-
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>├── __init__.py
|
|
8582
|
-
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>└── jobs
|
|
8583
|
-
<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a> ├── __init__.py
|
|
8584
|
-
<a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a> └── my_job_module.py
|
|
8585
|
-
</code></pre></div>
|
|
8586
9375
|
<h4 id="registering-jobs-in-an-app">Registering Jobs in an App<a class="headerlink" href="#registering-jobs-in-an-app" title="Permanent link">¶</a></h4>
|
|
8587
9376
|
<p>Apps should register jobs in the module defined in their <a href="../apps/api/nautobot-app-config.html#nautobotappconfig-code-location-attributes"><code>NautobotAppConfig.jobs</code></a> property. This defaults to the <code>jobs</code> module of the App.</p>
|
|
8588
9377
|
<h3 id="reserved-attribute-names">Reserved Attribute Names<a class="headerlink" href="#reserved-attribute-names" title="Permanent link">¶</a></h3>
|
|
@@ -8780,15 +9569,15 @@
|
|
|
8780
9569
|
<h4 id="description"><code>description</code><a class="headerlink" href="#description" title="Permanent link">¶</a></h4>
|
|
8781
9570
|
<p>An optional human-friendly description of what this job does.
|
|
8782
9571
|
This can accept either plain text, Markdown-formatted text, or <a href="../../user-guide/platform-functionality/template-filters.html#render_markdown">a limited subset of HTML</a>. It can also be multiple lines:</p>
|
|
8783
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
8784
|
-
<a id="__codelineno-
|
|
8785
|
-
<a id="__codelineno-
|
|
8786
|
-
<a id="__codelineno-
|
|
8787
|
-
<a id="__codelineno-
|
|
8788
|
-
<a id="__codelineno-
|
|
8789
|
-
<a id="__codelineno-
|
|
8790
|
-
<a id="__codelineno-
|
|
8791
|
-
<a id="__codelineno-
|
|
9572
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="k">class</span> <span class="nc">ExampleJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
9573
|
+
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
9574
|
+
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a> <span class="n">description</span> <span class="o">=</span> <span class="s2">"""</span>
|
|
9575
|
+
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="s2"> This job does a number of interesting things.</span>
|
|
9576
|
+
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>
|
|
9577
|
+
<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="s2"> 1. It hacks the Gibson</span>
|
|
9578
|
+
<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="s2"> 2. It immanentizes the eschaton</span>
|
|
9579
|
+
<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="s2"> 3. It's a floor wax *and* a dessert topping</span>
|
|
9580
|
+
<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="s2"> """</span>
|
|
8792
9581
|
</code></pre></div>
|
|
8793
9582
|
<p>If you code a multi-line description, the first line only will be used in the description column of the jobs list, while the full description will be rendered in the job detail view, submission, approval, and results pages.</p>
|
|
8794
9583
|
<h4 id="approval_required"><code>approval_required</code><a class="headerlink" href="#approval_required" title="Permanent link">¶</a></h4>
|
|
@@ -8801,9 +9590,9 @@ This can accept either plain text, Markdown-formatted text, or <a href="../../us
|
|
|
8801
9590
|
</details>
|
|
8802
9591
|
<p>Default: <code>False</code></p>
|
|
8803
9592
|
<p>The checkbox to enable dryrun when executing a job is unchecked by default in the Nautobot UI. You can set <code>dryrun_default</code> to <code>True</code> under the <code>Meta</code> class if you want this option to instead be checked by default.</p>
|
|
8804
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
8805
|
-
<a id="__codelineno-
|
|
8806
|
-
<a id="__codelineno-
|
|
9593
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="k">class</span> <span class="nc">MyJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
9594
|
+
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
9595
|
+
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a> <span class="n">dryrun_default</span> <span class="o">=</span> <span class="kc">True</span>
|
|
8807
9596
|
</code></pre></div>
|
|
8808
9597
|
<h4 id="field_order"><code>field_order</code><a class="headerlink" href="#field_order" title="Permanent link">¶</a></h4>
|
|
8809
9598
|
<p>Default: <code>[]</code></p>
|
|
@@ -8847,22 +9636,22 @@ This can accept either plain text, Markdown-formatted text, or <a href="../../us
|
|
|
8847
9636
|
</details>
|
|
8848
9637
|
<p>An int or float value, in seconds, which can be used to override the default <a href="../../user-guide/administration/configuration/optional-settings.html#celery_task_soft_time_limit">soft time limit</a> for a job task to complete.</p>
|
|
8849
9638
|
<p>The <code>celery.exceptions.SoftTimeLimitExceeded</code> exception will be raised when this soft time limit is exceeded. The job task can catch this to clean up before the <a href="../../user-guide/administration/configuration/optional-settings.html#celery_task_time_limit">hard time limit</a> (10 minutes by default) is reached:</p>
|
|
8850
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
8851
|
-
<a id="__codelineno-
|
|
8852
|
-
<a id="__codelineno-
|
|
8853
|
-
<a id="__codelineno-
|
|
8854
|
-
<a id="__codelineno-
|
|
8855
|
-
<a id="__codelineno-
|
|
8856
|
-
<a id="__codelineno-
|
|
8857
|
-
<a id="__codelineno-
|
|
8858
|
-
<a id="__codelineno-
|
|
8859
|
-
<a id="__codelineno-
|
|
8860
|
-
<a id="__codelineno-
|
|
8861
|
-
<a id="__codelineno-
|
|
8862
|
-
<a id="__codelineno-
|
|
8863
|
-
<a id="__codelineno-
|
|
8864
|
-
<a id="__codelineno-
|
|
8865
|
-
<a id="__codelineno-
|
|
9639
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="kn">from</span> <span class="nn">celery.exceptions</span> <span class="kn">import</span> <span class="n">SoftTimeLimitExceeded</span>
|
|
9640
|
+
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span>
|
|
9641
|
+
<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>
|
|
9642
|
+
<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="k">class</span> <span class="nc">ExampleJobWithSoftTimeLimit</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
9643
|
+
<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
9644
|
+
<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Soft Time Limit"</span>
|
|
9645
|
+
<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a> <span class="n">description</span> <span class="o">=</span> <span class="s2">"Set a soft time limit of 10 seconds`"</span>
|
|
9646
|
+
<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a> <span class="n">soft_time_limit</span> <span class="o">=</span> <span class="mi">10</span>
|
|
9647
|
+
<a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a>
|
|
9648
|
+
<a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
9649
|
+
<a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a> <span class="k">try</span><span class="p">:</span>
|
|
9650
|
+
<a id="__codelineno-5-12" name="__codelineno-5-12" href="#__codelineno-5-12"></a> <span class="c1"># code which might take longer than 10 seconds to run</span>
|
|
9651
|
+
<a id="__codelineno-5-13" name="__codelineno-5-13" href="#__codelineno-5-13"></a> <span class="n">job_code</span><span class="p">()</span>
|
|
9652
|
+
<a id="__codelineno-5-14" name="__codelineno-5-14" href="#__codelineno-5-14"></a> <span class="k">except</span> <span class="n">SoftTimeLimitExceeded</span><span class="p">:</span>
|
|
9653
|
+
<a id="__codelineno-5-15" name="__codelineno-5-15" href="#__codelineno-5-15"></a> <span class="c1"># any clean up code</span>
|
|
9654
|
+
<a id="__codelineno-5-16" name="__codelineno-5-16" href="#__codelineno-5-16"></a> <span class="n">cleanup_in_a_hurry</span><span class="p">()</span>
|
|
8866
9655
|
</code></pre></div>
|
|
8867
9656
|
<h4 id="task_queues"><code>task_queues</code><a class="headerlink" href="#task_queues" title="Permanent link">¶</a></h4>
|
|
8868
9657
|
<details class="version-added">
|
|
@@ -8880,20 +9669,20 @@ This can accept either plain text, Markdown-formatted text, or <a href="../../us
|
|
|
8880
9669
|
</details>
|
|
8881
9670
|
<p>A path relative to the job source code containing a Django template which provides additional code to customize the Job's submission form. This template should extend the existing job template, <code>extras/job.html</code>, otherwise the base form and functionality may not be available.</p>
|
|
8882
9671
|
<p>A template can provide additional JavaScript, CSS, or even display HTML. A good starting template would be:</p>
|
|
8883
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
8884
|
-
<a id="__codelineno-
|
|
8885
|
-
<a id="__codelineno-
|
|
8886
|
-
<a id="__codelineno-
|
|
8887
|
-
<a id="__codelineno-
|
|
8888
|
-
<a id="__codelineno-
|
|
8889
|
-
<a id="__codelineno-
|
|
8890
|
-
<a id="__codelineno-
|
|
8891
|
-
<a id="__codelineno-
|
|
8892
|
-
<a id="__codelineno-
|
|
8893
|
-
<a id="__codelineno-
|
|
8894
|
-
<a id="__codelineno-
|
|
8895
|
-
<a id="__codelineno-
|
|
8896
|
-
<a id="__codelineno-
|
|
9672
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>{% extends 'extras/job.html' %}
|
|
9673
|
+
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>
|
|
9674
|
+
<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>{% block extra_styles %}
|
|
9675
|
+
<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a> {{ block.super }}
|
|
9676
|
+
<a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a> <span class="cm"><!-- Add additional CSS here. --></span>
|
|
9677
|
+
<a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a>{% endblock %}
|
|
9678
|
+
<a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a>{% block content %}
|
|
9679
|
+
<a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a> {{ block.super }}
|
|
9680
|
+
<a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a> <span class="cm"><!-- Add additional HTML here. --></span>
|
|
9681
|
+
<a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a>{% endblock content %}
|
|
9682
|
+
<a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a>{% block javascript %}
|
|
9683
|
+
<a id="__codelineno-6-12" name="__codelineno-6-12" href="#__codelineno-6-12"></a> {{ block.super }}
|
|
9684
|
+
<a id="__codelineno-6-13" name="__codelineno-6-13" href="#__codelineno-6-13"></a> <span class="cm"><!-- Add additional JavaScript here. --></span>
|
|
9685
|
+
<a id="__codelineno-6-14" name="__codelineno-6-14" href="#__codelineno-6-14"></a>{% endblock javascript %}
|
|
8897
9686
|
</code></pre></div>
|
|
8898
9687
|
<details class="version-added">
|
|
8899
9688
|
<summary>Added in version 2.2.0</summary>
|
|
@@ -8907,18 +9696,18 @@ This can accept either plain text, Markdown-formatted text, or <a href="../../us
|
|
|
8907
9696
|
<p>An int or float value, in seconds, which can be used to override the
|
|
8908
9697
|
default <a href="../../user-guide/administration/configuration/optional-settings.html#celery_task_time_limit">hard time limit</a> (10 minutes by default) for a job task to complete.</p>
|
|
8909
9698
|
<p>Unlike the <code>soft_time_limit</code> above, no exceptions are raised when a <code>time_limit</code> is exceeded. The task will just terminate silently:</p>
|
|
8910
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
8911
|
-
<a id="__codelineno-
|
|
8912
|
-
<a id="__codelineno-
|
|
8913
|
-
<a id="__codelineno-
|
|
8914
|
-
<a id="__codelineno-
|
|
8915
|
-
<a id="__codelineno-
|
|
8916
|
-
<a id="__codelineno-
|
|
8917
|
-
<a id="__codelineno-
|
|
8918
|
-
<a id="__codelineno-
|
|
8919
|
-
<a id="__codelineno-
|
|
8920
|
-
<a id="__codelineno-
|
|
8921
|
-
<a id="__codelineno-
|
|
9699
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span>
|
|
9700
|
+
<a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a>
|
|
9701
|
+
<a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a><span class="k">class</span> <span class="nc">ExampleJobWithHardTimeLimit</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
9702
|
+
<a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
9703
|
+
<a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Hard Time Limit"</span>
|
|
9704
|
+
<a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a> <span class="n">description</span> <span class="o">=</span> <span class="s2">"Set a hard time limit of 10 seconds`"</span>
|
|
9705
|
+
<a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a> <span class="n">time_limit</span> <span class="o">=</span> <span class="mi">10</span>
|
|
9706
|
+
<a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a>
|
|
9707
|
+
<a id="__codelineno-7-9" name="__codelineno-7-9" href="#__codelineno-7-9"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
9708
|
+
<a id="__codelineno-7-10" name="__codelineno-7-10" href="#__codelineno-7-10"></a> <span class="c1"># code which might take longer than 10 seconds to run</span>
|
|
9709
|
+
<a id="__codelineno-7-11" name="__codelineno-7-11" href="#__codelineno-7-11"></a> <span class="c1"># this code will fail silently if the time_limit is exceeded</span>
|
|
9710
|
+
<a id="__codelineno-7-12" name="__codelineno-7-12" href="#__codelineno-7-12"></a> <span class="n">job_code</span><span class="p">()</span>
|
|
8922
9711
|
</code></pre></div>
|
|
8923
9712
|
<div class="admonition note">
|
|
8924
9713
|
<p class="admonition-title">Note</p>
|
|
@@ -8926,15 +9715,15 @@ default <a href="../../user-guide/administration/configuration/optional-settings
|
|
|
8926
9715
|
</div>
|
|
8927
9716
|
<h3 id="variables">Variables<a class="headerlink" href="#variables" title="Permanent link">¶</a></h3>
|
|
8928
9717
|
<p>Variables allow your job to accept user input via the Nautobot UI, but they are optional; if your job does not require any user input, there is no need to define any variables. Conversely, if you are making use of user input in your job, you <em>must</em> also implement the <code>run()</code> method, as it is the only entry point to your job that has visibility into the variable values provided by the user.</p>
|
|
8929
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
8930
|
-
<a id="__codelineno-
|
|
8931
|
-
<a id="__codelineno-
|
|
8932
|
-
<a id="__codelineno-
|
|
8933
|
-
<a id="__codelineno-
|
|
8934
|
-
<a id="__codelineno-
|
|
8935
|
-
<a id="__codelineno-
|
|
8936
|
-
<a id="__codelineno-
|
|
8937
|
-
<a id="__codelineno-
|
|
9718
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span><span class="p">,</span> <span class="n">StringVar</span><span class="p">,</span> <span class="n">IntegerVar</span><span class="p">,</span> <span class="n">ObjectVar</span>
|
|
9719
|
+
<a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a>
|
|
9720
|
+
<a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a><span class="k">class</span> <span class="nc">CreateDevices</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
9721
|
+
<a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a> <span class="n">var1</span> <span class="o">=</span> <span class="n">StringVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
9722
|
+
<a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a> <span class="n">var2</span> <span class="o">=</span> <span class="n">IntegerVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
9723
|
+
<a id="__codelineno-8-6" name="__codelineno-8-6" href="#__codelineno-8-6"></a> <span class="n">var3</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
9724
|
+
<a id="__codelineno-8-7" name="__codelineno-8-7" href="#__codelineno-8-7"></a>
|
|
9725
|
+
<a id="__codelineno-8-8" name="__codelineno-8-8" href="#__codelineno-8-8"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var1</span><span class="p">,</span> <span class="n">var2</span><span class="p">,</span> <span class="n">var3</span><span class="p">):</span>
|
|
9726
|
+
<a id="__codelineno-8-9" name="__codelineno-8-9" href="#__codelineno-8-9"></a> <span class="o">...</span>
|
|
8938
9727
|
</code></pre></div>
|
|
8939
9728
|
<p>The remainder of this section documents the various supported variable types and how to make use of them.</p>
|
|
8940
9729
|
<h4 id="default-variable-options">Default Variable Options<a class="headerlink" href="#default-variable-options" title="Permanent link">¶</a></h4>
|
|
@@ -8961,12 +9750,12 @@ default <a href="../../user-guide/administration/configuration/optional-settings
|
|
|
8961
9750
|
<summary>Added in version 2.1.0</summary>
|
|
8962
9751
|
</details>
|
|
8963
9752
|
<p>Accepts JSON-formatted data of any length. Renders as a multi-line text input field. The variable passed to <code>run()</code> method on the job has been serialized to the appropriate Python objects.</p>
|
|
8964
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
8965
|
-
<a id="__codelineno-
|
|
8966
|
-
<a id="__codelineno-
|
|
8967
|
-
<a id="__codelineno-
|
|
8968
|
-
<a id="__codelineno-
|
|
8969
|
-
<a id="__codelineno-
|
|
9753
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="k">class</span> <span class="nc">ExampleJSONVarJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
9754
|
+
<a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a> <span class="n">var1</span> <span class="o">=</span> <span class="n">JSONVar</span><span class="p">()</span>
|
|
9755
|
+
<a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a>
|
|
9756
|
+
<a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var1</span><span class="p">):</span>
|
|
9757
|
+
<a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a> <span class="c1"># var1 form data equals '{"key1": "value1"}'</span>
|
|
9758
|
+
<a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"The value of key1 is: </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">var1</span><span class="p">[</span><span class="s2">"key1"</span><span class="p">])</span>
|
|
8970
9759
|
</code></pre></div>
|
|
8971
9760
|
<p>In the above example <code>{"key1": "value1"}</code> is provided to the job form, on submission first the field is validated to be JSON-formatted data then is serialized and passed to the <code>run()</code> method as a dictionary without any need for the job developer to post-process the variable into a Python dictionary.</p>
|
|
8972
9761
|
<h4 id="integervar"><code>IntegerVar</code><a class="headerlink" href="#integervar" title="Permanent link">¶</a></h4>
|
|
@@ -8984,14 +9773,14 @@ default <a href="../../user-guide/administration/configuration/optional-settings
|
|
|
8984
9773
|
<ul>
|
|
8985
9774
|
<li><code>choices</code> - A list of <code>(value, label)</code> tuples representing the available choices. For example:</li>
|
|
8986
9775
|
</ul>
|
|
8987
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
8988
|
-
<a id="__codelineno-
|
|
8989
|
-
<a id="__codelineno-
|
|
8990
|
-
<a id="__codelineno-
|
|
8991
|
-
<a id="__codelineno-
|
|
8992
|
-
<a id="__codelineno-
|
|
8993
|
-
<a id="__codelineno-
|
|
8994
|
-
<a id="__codelineno-
|
|
9776
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="n">CHOICES</span> <span class="o">=</span> <span class="p">(</span>
|
|
9777
|
+
<a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a> <span class="p">(</span><span class="s1">'n'</span><span class="p">,</span> <span class="s1">'North'</span><span class="p">),</span>
|
|
9778
|
+
<a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a> <span class="p">(</span><span class="s1">'s'</span><span class="p">,</span> <span class="s1">'South'</span><span class="p">),</span>
|
|
9779
|
+
<a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-4"></a> <span class="p">(</span><span class="s1">'e'</span><span class="p">,</span> <span class="s1">'East'</span><span class="p">),</span>
|
|
9780
|
+
<a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-5"></a> <span class="p">(</span><span class="s1">'w'</span><span class="p">,</span> <span class="s1">'West'</span><span class="p">)</span>
|
|
9781
|
+
<a id="__codelineno-10-6" name="__codelineno-10-6" href="#__codelineno-10-6"></a><span class="p">)</span>
|
|
9782
|
+
<a id="__codelineno-10-7" name="__codelineno-10-7" href="#__codelineno-10-7"></a>
|
|
9783
|
+
<a id="__codelineno-10-8" name="__codelineno-10-8" href="#__codelineno-10-8"></a><span class="n">direction</span> <span class="o">=</span> <span class="n">ChoiceVar</span><span class="p">(</span><span class="n">choices</span><span class="o">=</span><span class="n">CHOICES</span><span class="p">)</span>
|
|
8995
9784
|
</code></pre></div>
|
|
8996
9785
|
<p>In the example above, selecting the choice labeled "North" will submit the value <code>n</code>.</p>
|
|
8997
9786
|
<h4 id="multichoicevar"><code>MultiChoiceVar</code><a class="headerlink" href="#multichoicevar" title="Permanent link">¶</a></h4>
|
|
@@ -9005,52 +9794,52 @@ default <a href="../../user-guide/administration/configuration/optional-settings
|
|
|
9005
9794
|
<li><code>null_option</code> - A label representing a "null" or empty choice (optional)</li>
|
|
9006
9795
|
</ul>
|
|
9007
9796
|
<p>The <code>display_field</code> argument is useful in cases where using the <code>display</code> API field is not desired for referencing the object. For example, when displaying a list of IP Addresses, you might want to use the <code>dns_name</code> field:</p>
|
|
9008
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9009
|
-
<a id="__codelineno-
|
|
9010
|
-
<a id="__codelineno-
|
|
9011
|
-
<a id="__codelineno-
|
|
9797
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="n">device_type</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
9798
|
+
<a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a> <span class="n">model</span><span class="o">=</span><span class="n">IPAddress</span><span class="p">,</span>
|
|
9799
|
+
<a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a> <span class="n">display_field</span><span class="o">=</span><span class="s2">"dns_name"</span><span class="p">,</span>
|
|
9800
|
+
<a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a><span class="p">)</span>
|
|
9012
9801
|
</code></pre></div>
|
|
9013
9802
|
<p>Additionally, the <code>.</code> notation can be used to reference nested fields:</p>
|
|
9014
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9015
|
-
<a id="__codelineno-
|
|
9016
|
-
<a id="__codelineno-
|
|
9017
|
-
<a id="__codelineno-
|
|
9018
|
-
<a id="__codelineno-
|
|
9019
|
-
<a id="__codelineno-
|
|
9020
|
-
<a id="__codelineno-
|
|
9803
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="n">device_type</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
9804
|
+
<a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a> <span class="n">model</span><span class="o">=</span><span class="n">VLAN</span><span class="p">,</span>
|
|
9805
|
+
<a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a> <span class="n">display_field</span><span class="o">=</span><span class="s2">"vlan_group.name"</span><span class="p">,</span>
|
|
9806
|
+
<a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-4"></a> <span class="n">query_params</span><span class="o">=</span><span class="p">{</span>
|
|
9807
|
+
<a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a> <span class="s2">"depth"</span><span class="p">:</span> <span class="mi">1</span>
|
|
9808
|
+
<a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a> <span class="p">},</span>
|
|
9809
|
+
<a id="__codelineno-12-7" name="__codelineno-12-7" href="#__codelineno-12-7"></a><span class="p">)</span>
|
|
9021
9810
|
</code></pre></div>
|
|
9022
9811
|
<p>In the example above, <a href="../../user-guide/platform-functionality/rest-api/overview.html#depth-query-parameter"><code>"depth": 1</code></a> was needed to influence REST API to include details of the associated records.
|
|
9023
9812
|
Another example of using the nested reference would be to access <a href="../../user-guide/platform-functionality/computedfield.html">computed fields</a> of the model:</p>
|
|
9024
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9025
|
-
<a id="__codelineno-
|
|
9026
|
-
<a id="__codelineno-
|
|
9027
|
-
<a id="__codelineno-
|
|
9028
|
-
<a id="__codelineno-
|
|
9029
|
-
<a id="__codelineno-
|
|
9030
|
-
<a id="__codelineno-
|
|
9813
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="n">device_type</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
9814
|
+
<a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a> <span class="n">model</span><span class="o">=</span><span class="n">Interface</span><span class="p">,</span>
|
|
9815
|
+
<a id="__codelineno-13-3" name="__codelineno-13-3" href="#__codelineno-13-3"></a> <span class="n">display_field</span><span class="o">=</span><span class="s2">"computed_fields.mycustomfield"</span><span class="p">,</span>
|
|
9816
|
+
<a id="__codelineno-13-4" name="__codelineno-13-4" href="#__codelineno-13-4"></a> <span class="n">query_params</span><span class="o">=</span><span class="p">{</span>
|
|
9817
|
+
<a id="__codelineno-13-5" name="__codelineno-13-5" href="#__codelineno-13-5"></a> <span class="s2">"include"</span><span class="p">:</span> <span class="s2">"computed_fields"</span>
|
|
9818
|
+
<a id="__codelineno-13-6" name="__codelineno-13-6" href="#__codelineno-13-6"></a> <span class="p">},</span>
|
|
9819
|
+
<a id="__codelineno-13-7" name="__codelineno-13-7" href="#__codelineno-13-7"></a><span class="p">)</span>
|
|
9031
9820
|
</code></pre></div>
|
|
9032
9821
|
<p>To limit the selections available within the list, additional query parameters can be passed as the <code>query_params</code> dictionary. For example, to show only devices with an "active" status:</p>
|
|
9033
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9034
|
-
<a id="__codelineno-
|
|
9035
|
-
<a id="__codelineno-
|
|
9036
|
-
<a id="__codelineno-
|
|
9037
|
-
<a id="__codelineno-
|
|
9038
|
-
<a id="__codelineno-
|
|
9822
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="n">device</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
9823
|
+
<a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a> <span class="n">model</span><span class="o">=</span><span class="n">Device</span><span class="p">,</span>
|
|
9824
|
+
<a id="__codelineno-14-3" name="__codelineno-14-3" href="#__codelineno-14-3"></a> <span class="n">query_params</span><span class="o">=</span><span class="p">{</span>
|
|
9825
|
+
<a id="__codelineno-14-4" name="__codelineno-14-4" href="#__codelineno-14-4"></a> <span class="s1">'status'</span><span class="p">:</span> <span class="s1">'active'</span>
|
|
9826
|
+
<a id="__codelineno-14-5" name="__codelineno-14-5" href="#__codelineno-14-5"></a> <span class="p">}</span>
|
|
9827
|
+
<a id="__codelineno-14-6" name="__codelineno-14-6" href="#__codelineno-14-6"></a><span class="p">)</span>
|
|
9039
9828
|
</code></pre></div>
|
|
9040
9829
|
<p>Multiple values can be specified by assigning a list to the dictionary key. It is also possible to reference the value of other fields in the form by prepending a dollar sign (<code>$</code>) to the variable's name. The keys you can use in this dictionary are the same ones that are available in the REST API - as an example it is also possible to filter the <code>Location</code> <code>ObjectVar</code> for its <code>location_type</code> and <code>tenant_group</code>.</p>
|
|
9041
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9042
|
-
<a id="__codelineno-
|
|
9043
|
-
<a id="__codelineno-
|
|
9044
|
-
<a id="__codelineno-
|
|
9045
|
-
<a id="__codelineno-
|
|
9046
|
-
<a id="__codelineno-
|
|
9047
|
-
<a id="__codelineno-
|
|
9048
|
-
<a id="__codelineno-
|
|
9049
|
-
<a id="__codelineno-
|
|
9050
|
-
<a id="__codelineno-
|
|
9051
|
-
<a id="__codelineno-
|
|
9052
|
-
<a id="__codelineno-
|
|
9053
|
-
<a id="__codelineno-
|
|
9830
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a><span class="n">location_type</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
9831
|
+
<a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a> <span class="n">model</span><span class="o">=</span><span class="n">LocationType</span>
|
|
9832
|
+
<a id="__codelineno-15-3" name="__codelineno-15-3" href="#__codelineno-15-3"></a><span class="p">)</span>
|
|
9833
|
+
<a id="__codelineno-15-4" name="__codelineno-15-4" href="#__codelineno-15-4"></a><span class="n">tenant_group</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
9834
|
+
<a id="__codelineno-15-5" name="__codelineno-15-5" href="#__codelineno-15-5"></a> <span class="n">model</span><span class="o">=</span><span class="n">TenantGroup</span>
|
|
9835
|
+
<a id="__codelineno-15-6" name="__codelineno-15-6" href="#__codelineno-15-6"></a><span class="p">)</span>
|
|
9836
|
+
<a id="__codelineno-15-7" name="__codelineno-15-7" href="#__codelineno-15-7"></a><span class="n">location</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
9837
|
+
<a id="__codelineno-15-8" name="__codelineno-15-8" href="#__codelineno-15-8"></a> <span class="n">model</span><span class="o">=</span><span class="n">Location</span><span class="p">,</span>
|
|
9838
|
+
<a id="__codelineno-15-9" name="__codelineno-15-9" href="#__codelineno-15-9"></a> <span class="n">query_params</span><span class="o">=</span><span class="p">{</span>
|
|
9839
|
+
<a id="__codelineno-15-10" name="__codelineno-15-10" href="#__codelineno-15-10"></a> <span class="s2">"location_type"</span><span class="p">:</span> <span class="s2">"$location_type"</span><span class="p">,</span>
|
|
9840
|
+
<a id="__codelineno-15-11" name="__codelineno-15-11" href="#__codelineno-15-11"></a> <span class="s2">"tenant_group"</span><span class="p">:</span> <span class="s2">"$tenant_group"</span>
|
|
9841
|
+
<a id="__codelineno-15-12" name="__codelineno-15-12" href="#__codelineno-15-12"></a> <span class="p">}</span>
|
|
9842
|
+
<a id="__codelineno-15-13" name="__codelineno-15-13" href="#__codelineno-15-13"></a><span class="p">)</span>
|
|
9054
9843
|
</code></pre></div>
|
|
9055
9844
|
<h4 id="multiobjectvar"><code>MultiObjectVar</code><a class="headerlink" href="#multiobjectvar" title="Permanent link">¶</a></h4>
|
|
9056
9845
|
<p>Similar to <code>ObjectVar</code>, but allows for the selection of multiple objects.</p>
|
|
@@ -9078,15 +9867,15 @@ Another example of using the nested reference would be to access <a href="../../
|
|
|
9078
9867
|
<p>The return value from <code>before_start()</code> is ignored, but if it raises any exception, the Job execution will be marked as a failure and <code>run()</code> will not be called.</p>
|
|
9079
9868
|
<h4 id="the-run-method">The <code>run()</code> Method<a class="headerlink" href="#the-run-method" title="Permanent link">¶</a></h4>
|
|
9080
9869
|
<p>The <code>run()</code> method is the primary worker of any Job, and must be implemented. After the <code>self</code> argument, it should accept keyword arguments for any variables defined on the job:</p>
|
|
9081
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9082
|
-
<a id="__codelineno-
|
|
9083
|
-
<a id="__codelineno-
|
|
9084
|
-
<a id="__codelineno-
|
|
9085
|
-
<a id="__codelineno-
|
|
9086
|
-
<a id="__codelineno-
|
|
9087
|
-
<a id="__codelineno-
|
|
9088
|
-
<a id="__codelineno-
|
|
9089
|
-
<a id="__codelineno-
|
|
9870
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span><span class="p">,</span> <span class="n">StringVar</span><span class="p">,</span> <span class="n">IntegerVar</span><span class="p">,</span> <span class="n">ObjectVar</span>
|
|
9871
|
+
<a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a>
|
|
9872
|
+
<a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-3"></a><span class="k">class</span> <span class="nc">CreateDevices</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
9873
|
+
<a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a> <span class="n">var1</span> <span class="o">=</span> <span class="n">StringVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
9874
|
+
<a id="__codelineno-16-5" name="__codelineno-16-5" href="#__codelineno-16-5"></a> <span class="n">var2</span> <span class="o">=</span> <span class="n">IntegerVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
9875
|
+
<a id="__codelineno-16-6" name="__codelineno-16-6" href="#__codelineno-16-6"></a> <span class="n">var3</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
9876
|
+
<a id="__codelineno-16-7" name="__codelineno-16-7" href="#__codelineno-16-7"></a>
|
|
9877
|
+
<a id="__codelineno-16-8" name="__codelineno-16-8" href="#__codelineno-16-8"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">var1</span><span class="p">,</span> <span class="n">var2</span><span class="p">,</span> <span class="n">var3</span><span class="p">):</span>
|
|
9878
|
+
<a id="__codelineno-16-9" name="__codelineno-16-9" href="#__codelineno-16-9"></a> <span class="o">...</span>
|
|
9090
9879
|
</code></pre></div>
|
|
9091
9880
|
<p>Again, defining user variables is totally optional; you may create a job with a <code>run()</code> method with only the <code>self</code> argument if no user input is needed.</p>
|
|
9092
9881
|
<div class="admonition warning">
|
|
@@ -9119,21 +9908,21 @@ Another example of using the nested reference would be to access <a href="../../
|
|
|
9119
9908
|
<p>If a <code>grouping</code> is not provided it will default to the function name that logged the message. The <code>object</code> will default to <code>None</code>.</p>
|
|
9120
9909
|
<div class="admonition example">
|
|
9121
9910
|
<p class="admonition-title">Example</p>
|
|
9122
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9123
|
-
<a id="__codelineno-
|
|
9124
|
-
<a id="__codelineno-
|
|
9125
|
-
<a id="__codelineno-
|
|
9126
|
-
<a id="__codelineno-
|
|
9911
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span>
|
|
9912
|
+
<a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a>
|
|
9913
|
+
<a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></a><span class="k">class</span> <span class="nc">MyJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
9914
|
+
<a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
9915
|
+
<a id="__codelineno-17-5" name="__codelineno-17-5" href="#__codelineno-17-5"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"This job is running!"</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"grouping"</span><span class="p">:</span> <span class="s2">"myjobisrunning"</span><span class="p">,</span> <span class="s2">"object"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">job_result</span><span class="p">})</span>
|
|
9127
9916
|
</code></pre></div>
|
|
9128
9917
|
</div>
|
|
9129
9918
|
<p>To skip writing a log entry to the database, set the <code>skip_db_logging</code> key in the "extra" kwarg to <code>True</code> when calling the log function. The output will still be written to the console.</p>
|
|
9130
9919
|
<div class="admonition example">
|
|
9131
9920
|
<p class="admonition-title">Example</p>
|
|
9132
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9133
|
-
<a id="__codelineno-
|
|
9134
|
-
<a id="__codelineno-
|
|
9135
|
-
<a id="__codelineno-
|
|
9136
|
-
<a id="__codelineno-
|
|
9921
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span>
|
|
9922
|
+
<a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a>
|
|
9923
|
+
<a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a><span class="k">class</span> <span class="nc">MyJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
9924
|
+
<a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-4"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
9925
|
+
<a id="__codelineno-18-5" name="__codelineno-18-5" href="#__codelineno-18-5"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"This job is running!"</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"skip_db_logging"</span><span class="p">:</span> <span class="kc">True</span><span class="p">})</span>
|
|
9137
9926
|
</code></pre></div>
|
|
9138
9927
|
</div>
|
|
9139
9928
|
<p>Markdown rendering is supported for log messages, as well as <a href="../../user-guide/platform-functionality/template-filters.html#render_markdown">a limited subset of HTML</a>.</p>
|
|
@@ -9154,27 +9943,27 @@ Another example of using the nested reference would be to access <a href="../../
|
|
|
9154
9943
|
<summary>Added in version 2.1.0</summary>
|
|
9155
9944
|
</details>
|
|
9156
9945
|
<p>A Job can create files that will be saved and can later be downloaded by a user. (The specifics of how and where these files are stored will depend on your system's <a href="../../user-guide/administration/configuration/optional-settings.html#job_file_io_storage"><code>JOB_FILE_IO_STORAGE</code></a> configuration.) To do so, use the <code>Job.create_file(filename, content)</code> method:</p>
|
|
9157
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9158
|
-
<a id="__codelineno-
|
|
9159
|
-
<a id="__codelineno-
|
|
9160
|
-
<a id="__codelineno-
|
|
9161
|
-
<a id="__codelineno-
|
|
9162
|
-
<a id="__codelineno-
|
|
9946
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a><span class="kn">from</span> <span class="nn">nautobot.extras.jobs</span> <span class="kn">import</span> <span class="n">Job</span>
|
|
9947
|
+
<a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-2"></a>
|
|
9948
|
+
<a id="__codelineno-19-3" name="__codelineno-19-3" href="#__codelineno-19-3"></a><span class="k">class</span> <span class="nc">MyJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
9949
|
+
<a id="__codelineno-19-4" name="__codelineno-19-4" href="#__codelineno-19-4"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
9950
|
+
<a id="__codelineno-19-5" name="__codelineno-19-5" href="#__codelineno-19-5"></a> <span class="bp">self</span><span class="o">.</span><span class="n">create_file</span><span class="p">(</span><span class="s2">"greeting.txt"</span><span class="p">,</span> <span class="s2">"Hello world!"</span><span class="p">)</span>
|
|
9951
|
+
<a id="__codelineno-19-6" name="__codelineno-19-6" href="#__codelineno-19-6"></a> <span class="bp">self</span><span class="o">.</span><span class="n">create_file</span><span class="p">(</span><span class="s2">"farewell.txt"</span><span class="p">,</span> <span class="sa">b</span><span class="s2">"Goodbye for now!"</span><span class="p">)</span> <span class="c1"># content can be a str or bytes</span>
|
|
9163
9952
|
</code></pre></div>
|
|
9164
|
-
<p>The above Job when run will create two files, "greeting.txt" and "farewell.txt", that will be made available for download from the JobResult detail view's "
|
|
9953
|
+
<p>The above Job when run will create two files, "greeting.txt" and "farewell.txt", that will be made available for download from the JobResult detail view's "Advanced" tab and via the REST API. These files will persist indefinitely, but can automatically be deleted if the JobResult itself is deleted; they can also be deleted manually by an administrator via the "File Proxies" link in the Admin UI.</p>
|
|
9165
9954
|
<p>The maximum size of any single created file (or in other words, the maximum number of bytes that can be passed to <code>self.create_file()</code>) is controlled by the <a href="../../user-guide/administration/configuration/optional-settings.html#job_create_file_max_size"><code>JOB_CREATE_FILE_MAX_SIZE</code></a> system setting. A <code>ValueError</code> exception will be raised if <code>create_file()</code> is called with an overly large <code>content</code> value.</p>
|
|
9166
9955
|
<h3 id="marking-a-job-as-failed">Marking a Job as Failed<a class="headerlink" href="#marking-a-job-as-failed" title="Permanent link">¶</a></h3>
|
|
9167
9956
|
<p>To mark a job as failed, raise an exception from within the <code>run()</code> method. The exception message will be logged to the traceback of the job result. The job result status will be set to <code>failed</code>. To output a job log message you can use the <code>self.logger.error()</code> method.</p>
|
|
9168
9957
|
<p>As an example, the following job will fail if the user does not put the word "Taco" in <code>var1</code>:</p>
|
|
9169
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9170
|
-
<a id="__codelineno-
|
|
9171
|
-
<a id="__codelineno-
|
|
9172
|
-
<a id="__codelineno-
|
|
9173
|
-
<a id="__codelineno-
|
|
9174
|
-
<a id="__codelineno-
|
|
9175
|
-
<a id="__codelineno-
|
|
9176
|
-
<a id="__codelineno-
|
|
9177
|
-
<a id="__codelineno-
|
|
9958
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span><span class="p">,</span> <span class="n">StringVar</span>
|
|
9959
|
+
<a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a>
|
|
9960
|
+
<a id="__codelineno-20-3" name="__codelineno-20-3" href="#__codelineno-20-3"></a><span class="k">class</span> <span class="nc">MyJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
9961
|
+
<a id="__codelineno-20-4" name="__codelineno-20-4" href="#__codelineno-20-4"></a> <span class="n">var1</span> <span class="o">=</span> <span class="n">StringVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
9962
|
+
<a id="__codelineno-20-5" name="__codelineno-20-5" href="#__codelineno-20-5"></a>
|
|
9963
|
+
<a id="__codelineno-20-6" name="__codelineno-20-6" href="#__codelineno-20-6"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var1</span><span class="p">):</span>
|
|
9964
|
+
<a id="__codelineno-20-7" name="__codelineno-20-7" href="#__codelineno-20-7"></a> <span class="k">if</span> <span class="n">var1</span> <span class="o">!=</span> <span class="s2">"Taco"</span><span class="p">:</span>
|
|
9965
|
+
<a id="__codelineno-20-8" name="__codelineno-20-8" href="#__codelineno-20-8"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"var1 must be 'Taco'"</span><span class="p">)</span>
|
|
9966
|
+
<a id="__codelineno-20-9" name="__codelineno-20-9" href="#__codelineno-20-9"></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Argument input validation failed."</span><span class="p">)</span>
|
|
9178
9967
|
</code></pre></div>
|
|
9179
9968
|
<h3 id="accessing-user-and-job-result">Accessing User and Job Result<a class="headerlink" href="#accessing-user-and-job-result" title="Permanent link">¶</a></h3>
|
|
9180
9969
|
<details class="version-changed">
|
|
@@ -9182,9 +9971,9 @@ Another example of using the nested reference would be to access <a href="../../
|
|
|
9182
9971
|
<p>The <code>request</code> property has been changed to a Celery request instead of a Django web request and no longer includes the information from the web request that initiated the Job. The <code>user</code> object is now available as <code>self.user</code> instead of <code>self.request.user</code>.</p>
|
|
9183
9972
|
</details>
|
|
9184
9973
|
<p>The user that initiated the job and the job result associated to the job can be accessed through properties on the job class:</p>
|
|
9185
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9186
|
-
<a id="__codelineno-
|
|
9187
|
-
<a id="__codelineno-
|
|
9974
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a><span class="n">username</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">username</span>
|
|
9975
|
+
<a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a><span class="n">job_result_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">job_result</span><span class="o">.</span><span class="n">id</span>
|
|
9976
|
+
<a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a><span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Job </span><span class="si">%s</span><span class="s2"> initiated by user </span><span class="si">%s</span><span class="s2"> is running."</span><span class="p">,</span> <span class="n">job_result_id</span><span class="p">,</span> <span class="n">username</span><span class="p">)</span>
|
|
9188
9977
|
</code></pre></div>
|
|
9189
9978
|
<h3 id="reading-data-from-files">Reading Data from Files<a class="headerlink" href="#reading-data-from-files" title="Permanent link">¶</a></h3>
|
|
9190
9979
|
<p>The <code>Job</code> class provides two convenience methods for reading data from files:</p>
|
|
@@ -9205,21 +9994,21 @@ However the import paths used in the examples requires 1.5.2 and newer.</p>
|
|
|
9205
9994
|
<p>Because of the way <code>run_job_for_testing</code> and more specifically Celery tasks work, which is somewhat complex behind the scenes, you need to inherit from <code>nautobot.apps.testing.TransactionTestCase</code> instead of <code>django.test.TestCase</code> (Refer to the <a href="https://docs.djangoproject.com/en/stable/topics/testing/tools/#provided-test-case-classes">Django documentation</a> if you're interested in the differences between these classes - <code>TransactionTestCase</code> from Nautobot is a small wrapper around Django's <code>TransactionTestCase</code>).</p>
|
|
9206
9995
|
<p>When using <code>TransactionTestCase</code> (whether from Django or from Nautobot) each tests runs on a completely empty database. Furthermore, Nautobot requires new jobs to be enabled before they can run. Therefore, we need to make sure the job is enabled before each run which <code>run_job_for_testing</code> handles for us.</p>
|
|
9207
9996
|
<p>A simple example of a Job test case might look like the following:</p>
|
|
9208
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9209
|
-
<a id="__codelineno-
|
|
9210
|
-
<a id="__codelineno-
|
|
9211
|
-
<a id="__codelineno-
|
|
9212
|
-
<a id="__codelineno-
|
|
9213
|
-
<a id="__codelineno-
|
|
9214
|
-
<a id="__codelineno-
|
|
9215
|
-
<a id="__codelineno-
|
|
9216
|
-
<a id="__codelineno-
|
|
9217
|
-
<a id="__codelineno-
|
|
9218
|
-
<a id="__codelineno-
|
|
9219
|
-
<a id="__codelineno-
|
|
9220
|
-
<a id="__codelineno-
|
|
9221
|
-
<a id="__codelineno-
|
|
9222
|
-
<a id="__codelineno-
|
|
9997
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.testing</span> <span class="kn">import</span> <span class="n">run_job_for_testing</span><span class="p">,</span> <span class="n">TransactionTestCase</span>
|
|
9998
|
+
<a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></a><span class="kn">from</span> <span class="nn">nautobot.extras.models</span> <span class="kn">import</span> <span class="n">Job</span><span class="p">,</span> <span class="n">JobLogEntry</span>
|
|
9999
|
+
<a id="__codelineno-22-3" name="__codelineno-22-3" href="#__codelineno-22-3"></a>
|
|
10000
|
+
<a id="__codelineno-22-4" name="__codelineno-22-4" href="#__codelineno-22-4"></a>
|
|
10001
|
+
<a id="__codelineno-22-5" name="__codelineno-22-5" href="#__codelineno-22-5"></a><span class="k">class</span> <span class="nc">MyJobTestCase</span><span class="p">(</span><span class="n">TransactionTestCase</span><span class="p">):</span>
|
|
10002
|
+
<a id="__codelineno-22-6" name="__codelineno-22-6" href="#__codelineno-22-6"></a> <span class="k">def</span> <span class="nf">test_my_job</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
10003
|
+
<a id="__codelineno-22-7" name="__codelineno-22-7" href="#__codelineno-22-7"></a> <span class="c1"># Testing of Job "MyJob" in file "my_job_file.py" in $JOBS_ROOT</span>
|
|
10004
|
+
<a id="__codelineno-22-8" name="__codelineno-22-8" href="#__codelineno-22-8"></a> <span class="n">job</span> <span class="o">=</span> <span class="n">Job</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">job_class_name</span><span class="o">=</span><span class="s2">"MyJob"</span><span class="p">,</span> <span class="n">module_name</span><span class="o">=</span><span class="s2">"my_job_file"</span><span class="p">,</span> <span class="n">source</span><span class="o">=</span><span class="s2">"local"</span><span class="p">)</span>
|
|
10005
|
+
<a id="__codelineno-22-9" name="__codelineno-22-9" href="#__codelineno-22-9"></a> <span class="c1"># or, job = Job.objects.get_for_class_path("local/my_job_file/MyJob")</span>
|
|
10006
|
+
<a id="__codelineno-22-10" name="__codelineno-22-10" href="#__codelineno-22-10"></a> <span class="n">job_result</span> <span class="o">=</span> <span class="n">run_job_for_testing</span><span class="p">(</span><span class="n">job</span><span class="p">,</span> <span class="n">var1</span><span class="o">=</span><span class="s2">"abc"</span><span class="p">,</span> <span class="n">var2</span><span class="o">=</span><span class="mi">123</span><span class="p">)</span>
|
|
10007
|
+
<a id="__codelineno-22-11" name="__codelineno-22-11" href="#__codelineno-22-11"></a>
|
|
10008
|
+
<a id="__codelineno-22-12" name="__codelineno-22-12" href="#__codelineno-22-12"></a> <span class="c1"># Inspect the logs created by running the job</span>
|
|
10009
|
+
<a id="__codelineno-22-13" name="__codelineno-22-13" href="#__codelineno-22-13"></a> <span class="n">log_entries</span> <span class="o">=</span> <span class="n">JobLogEntry</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">job_result</span><span class="o">=</span><span class="n">job_result</span><span class="p">)</span>
|
|
10010
|
+
<a id="__codelineno-22-14" name="__codelineno-22-14" href="#__codelineno-22-14"></a> <span class="k">for</span> <span class="n">log_entry</span> <span class="ow">in</span> <span class="n">log_entries</span><span class="p">:</span>
|
|
10011
|
+
<a id="__codelineno-22-15" name="__codelineno-22-15" href="#__codelineno-22-15"></a> <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">log_entry</span><span class="o">.</span><span class="n">message</span><span class="p">,</span> <span class="s2">"..."</span><span class="p">)</span>
|
|
9223
10012
|
</code></pre></div>
|
|
9224
10013
|
<div class="admonition tip">
|
|
9225
10014
|
<p class="admonition-title">Tip</p>
|
|
@@ -9237,10 +10026,10 @@ However the import paths used in the examples requires 1.5.2 and newer.</p>
|
|
|
9237
10026
|
</div>
|
|
9238
10027
|
<h3 id="reading-profiling-reports">Reading profiling reports<a class="headerlink" href="#reading-profiling-reports" title="Permanent link">¶</a></h3>
|
|
9239
10028
|
<p>A full description on how to deal with the output of <code>cProfile</code> can be found in the <a href="https://docs.python.org/3/library/profile.html#instant-user-s-manual">Instant User's Manual</a>, but here is something to get you started:</p>
|
|
9240
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9241
|
-
<a id="__codelineno-
|
|
9242
|
-
<a id="__codelineno-
|
|
9243
|
-
<a id="__codelineno-
|
|
10029
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-1"></a><span class="kn">import</span> <span class="nn">pstats</span>
|
|
10030
|
+
<a id="__codelineno-23-2" name="__codelineno-23-2" href="#__codelineno-23-2"></a><span class="n">job_result_uuid</span> <span class="o">=</span> <span class="s2">"66b70231-002f-412b-8cc4-1cc9609c2c9b"</span>
|
|
10031
|
+
<a id="__codelineno-23-3" name="__codelineno-23-3" href="#__codelineno-23-3"></a><span class="n">stats</span> <span class="o">=</span> <span class="n">pstats</span><span class="o">.</span><span class="n">Stats</span><span class="p">(</span><span class="sa">f</span><span class="s2">"/tmp/nautobot-jobresult-</span><span class="si">{</span><span class="n">job_result_uuid</span><span class="si">}</span><span class="s2">.pstats"</span><span class="p">)</span>
|
|
10032
|
+
<a id="__codelineno-23-4" name="__codelineno-23-4" href="#__codelineno-23-4"></a><span class="n">stats</span><span class="o">.</span><span class="n">sort_stats</span><span class="p">(</span><span class="n">pstats</span><span class="o">.</span><span class="n">SortKey</span><span class="o">.</span><span class="n">CUMULATIVE</span><span class="p">)</span><span class="o">.</span><span class="n">print_stats</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
|
|
9244
10033
|
</code></pre></div>
|
|
9245
10034
|
<p>This will print the 10 functions that the job execution spent the most time in - adapt this to your needs!</p>
|
|
9246
10035
|
<h2 id="example-jobs">Example Jobs<a class="headerlink" href="#example-jobs" title="Permanent link">¶</a></h2>
|
|
@@ -9252,116 +10041,117 @@ However the import paths used in the examples requires 1.5.2 and newer.</p>
|
|
|
9252
10041
|
<li>The number of access switches to create</li>
|
|
9253
10042
|
</ul>
|
|
9254
10043
|
<p>These variables are presented as a web form to be completed by the user. Once submitted, the job's <code>run()</code> method is called to create the appropriate objects, and it returns simple CSV output to the user summarizing the created objects.</p>
|
|
9255
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9256
|
-
<a id="__codelineno-
|
|
9257
|
-
<a id="__codelineno-
|
|
9258
|
-
<a id="__codelineno-
|
|
9259
|
-
<a id="__codelineno-
|
|
9260
|
-
<a id="__codelineno-
|
|
9261
|
-
<a id="__codelineno-
|
|
9262
|
-
<a id="__codelineno-
|
|
9263
|
-
<a id="__codelineno-
|
|
9264
|
-
<a id="__codelineno-
|
|
9265
|
-
<a id="__codelineno-
|
|
9266
|
-
<a id="__codelineno-
|
|
9267
|
-
<a id="__codelineno-
|
|
9268
|
-
<a id="__codelineno-
|
|
9269
|
-
<a id="__codelineno-
|
|
9270
|
-
<a id="__codelineno-
|
|
9271
|
-
<a id="__codelineno-
|
|
9272
|
-
<a id="__codelineno-
|
|
9273
|
-
<a id="__codelineno-
|
|
9274
|
-
<a id="__codelineno-
|
|
9275
|
-
<a id="__codelineno-
|
|
9276
|
-
<a id="__codelineno-
|
|
9277
|
-
<a id="__codelineno-
|
|
9278
|
-
<a id="__codelineno-
|
|
9279
|
-
<a id="__codelineno-
|
|
9280
|
-
<a id="__codelineno-
|
|
9281
|
-
<a id="__codelineno-
|
|
9282
|
-
<a id="__codelineno-
|
|
9283
|
-
<a id="__codelineno-
|
|
9284
|
-
<a id="__codelineno-
|
|
9285
|
-
<a id="__codelineno-
|
|
9286
|
-
<a id="__codelineno-
|
|
9287
|
-
<a id="__codelineno-
|
|
9288
|
-
<a id="__codelineno-
|
|
9289
|
-
<a id="__codelineno-
|
|
9290
|
-
<a id="__codelineno-
|
|
9291
|
-
<a id="__codelineno-
|
|
9292
|
-
<a id="__codelineno-
|
|
9293
|
-
<a id="__codelineno-
|
|
9294
|
-
<a id="__codelineno-
|
|
9295
|
-
<a id="__codelineno-
|
|
9296
|
-
<a id="__codelineno-
|
|
9297
|
-
<a id="__codelineno-
|
|
9298
|
-
<a id="__codelineno-
|
|
9299
|
-
<a id="__codelineno-
|
|
9300
|
-
<a id="__codelineno-
|
|
9301
|
-
<a id="__codelineno-
|
|
9302
|
-
<a id="__codelineno-
|
|
9303
|
-
<a id="__codelineno-
|
|
9304
|
-
<a id="__codelineno-
|
|
9305
|
-
<a id="__codelineno-
|
|
9306
|
-
<a id="__codelineno-
|
|
9307
|
-
<a id="__codelineno-
|
|
9308
|
-
<a id="__codelineno-
|
|
9309
|
-
<a id="__codelineno-
|
|
9310
|
-
<a id="__codelineno-
|
|
9311
|
-
<a id="__codelineno-
|
|
10044
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a><span class="kn">from</span> <span class="nn">django.contrib.contenttypes.models</span> <span class="kn">import</span> <span class="n">ContentType</span>
|
|
10045
|
+
<a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a>
|
|
10046
|
+
<a id="__codelineno-24-3" name="__codelineno-24-3" href="#__codelineno-24-3"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span><span class="p">,</span> <span class="n">StringVar</span><span class="p">,</span> <span class="n">IntegerVar</span><span class="p">,</span> <span class="n">ObjectVar</span><span class="p">,</span> <span class="n">register_jobs</span>
|
|
10047
|
+
<a id="__codelineno-24-4" name="__codelineno-24-4" href="#__codelineno-24-4"></a><span class="kn">from</span> <span class="nn">nautobot.dcim.models</span> <span class="kn">import</span> <span class="n">Location</span><span class="p">,</span> <span class="n">LocationType</span><span class="p">,</span> <span class="n">Device</span><span class="p">,</span> <span class="n">Manufacturer</span><span class="p">,</span> <span class="n">DeviceType</span>
|
|
10048
|
+
<a id="__codelineno-24-5" name="__codelineno-24-5" href="#__codelineno-24-5"></a><span class="kn">from</span> <span class="nn">nautobot.extras.models</span> <span class="kn">import</span> <span class="n">Status</span><span class="p">,</span> <span class="n">Role</span>
|
|
10049
|
+
<a id="__codelineno-24-6" name="__codelineno-24-6" href="#__codelineno-24-6"></a>
|
|
10050
|
+
<a id="__codelineno-24-7" name="__codelineno-24-7" href="#__codelineno-24-7"></a>
|
|
10051
|
+
<a id="__codelineno-24-8" name="__codelineno-24-8" href="#__codelineno-24-8"></a><span class="k">class</span> <span class="nc">NewBranch</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
10052
|
+
<a id="__codelineno-24-9" name="__codelineno-24-9" href="#__codelineno-24-9"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
10053
|
+
<a id="__codelineno-24-10" name="__codelineno-24-10" href="#__codelineno-24-10"></a> <span class="n">name</span> <span class="o">=</span> <span class="s2">"New Branch"</span>
|
|
10054
|
+
<a id="__codelineno-24-11" name="__codelineno-24-11" href="#__codelineno-24-11"></a> <span class="n">description</span> <span class="o">=</span> <span class="s2">"Provision a new branch location"</span>
|
|
10055
|
+
<a id="__codelineno-24-12" name="__codelineno-24-12" href="#__codelineno-24-12"></a> <span class="n">field_order</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"location_name"</span><span class="p">,</span> <span class="s2">"switch_count"</span><span class="p">,</span> <span class="s2">"switch_model"</span><span class="p">]</span>
|
|
10056
|
+
<a id="__codelineno-24-13" name="__codelineno-24-13" href="#__codelineno-24-13"></a>
|
|
10057
|
+
<a id="__codelineno-24-14" name="__codelineno-24-14" href="#__codelineno-24-14"></a> <span class="n">location_name</span> <span class="o">=</span> <span class="n">StringVar</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s2">"Name of the new location"</span><span class="p">)</span>
|
|
10058
|
+
<a id="__codelineno-24-15" name="__codelineno-24-15" href="#__codelineno-24-15"></a> <span class="n">switch_count</span> <span class="o">=</span> <span class="n">IntegerVar</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s2">"Number of access switches to create"</span><span class="p">)</span>
|
|
10059
|
+
<a id="__codelineno-24-16" name="__codelineno-24-16" href="#__codelineno-24-16"></a> <span class="n">manufacturer</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="n">Manufacturer</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
10060
|
+
<a id="__codelineno-24-17" name="__codelineno-24-17" href="#__codelineno-24-17"></a> <span class="n">switch_model</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
10061
|
+
<a id="__codelineno-24-18" name="__codelineno-24-18" href="#__codelineno-24-18"></a> <span class="n">description</span><span class="o">=</span><span class="s2">"Access switch model"</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="n">DeviceType</span><span class="p">,</span> <span class="n">query_params</span><span class="o">=</span><span class="p">{</span><span class="s2">"manufacturer_id"</span><span class="p">:</span> <span class="s2">"$manufacturer"</span><span class="p">}</span>
|
|
10062
|
+
<a id="__codelineno-24-19" name="__codelineno-24-19" href="#__codelineno-24-19"></a> <span class="p">)</span>
|
|
10063
|
+
<a id="__codelineno-24-20" name="__codelineno-24-20" href="#__codelineno-24-20"></a>
|
|
10064
|
+
<a id="__codelineno-24-21" name="__codelineno-24-21" href="#__codelineno-24-21"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">location_name</span><span class="p">,</span> <span class="n">switch_count</span><span class="p">,</span> <span class="n">switch_model</span><span class="p">):</span>
|
|
10065
|
+
<a id="__codelineno-24-22" name="__codelineno-24-22" href="#__codelineno-24-22"></a> <span class="n">STATUS_PLANNED</span> <span class="o">=</span> <span class="n">Status</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"Planned"</span><span class="p">)</span>
|
|
10066
|
+
<a id="__codelineno-24-23" name="__codelineno-24-23" href="#__codelineno-24-23"></a>
|
|
10067
|
+
<a id="__codelineno-24-24" name="__codelineno-24-24" href="#__codelineno-24-24"></a> <span class="c1"># Create the new location</span>
|
|
10068
|
+
<a id="__codelineno-24-25" name="__codelineno-24-25" href="#__codelineno-24-25"></a> <span class="n">root_type</span> <span class="o">=</span> <span class="n">LocationType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"Campus"</span><span class="p">)</span>
|
|
10069
|
+
<a id="__codelineno-24-26" name="__codelineno-24-26" href="#__codelineno-24-26"></a> <span class="n">location</span> <span class="o">=</span> <span class="n">Location</span><span class="p">(</span>
|
|
10070
|
+
<a id="__codelineno-24-27" name="__codelineno-24-27" href="#__codelineno-24-27"></a> <span class="n">name</span><span class="o">=</span><span class="n">location_name</span><span class="p">,</span>
|
|
10071
|
+
<a id="__codelineno-24-28" name="__codelineno-24-28" href="#__codelineno-24-28"></a> <span class="n">location_type</span><span class="o">=</span><span class="n">root_type</span><span class="p">,</span>
|
|
10072
|
+
<a id="__codelineno-24-29" name="__codelineno-24-29" href="#__codelineno-24-29"></a> <span class="n">status</span><span class="o">=</span><span class="n">STATUS_PLANNED</span><span class="p">,</span>
|
|
10073
|
+
<a id="__codelineno-24-30" name="__codelineno-24-30" href="#__codelineno-24-30"></a> <span class="p">)</span>
|
|
10074
|
+
<a id="__codelineno-24-31" name="__codelineno-24-31" href="#__codelineno-24-31"></a> <span class="n">location</span><span class="o">.</span><span class="n">validated_save</span><span class="p">()</span>
|
|
10075
|
+
<a id="__codelineno-24-32" name="__codelineno-24-32" href="#__codelineno-24-32"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Created new location"</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">location</span><span class="p">})</span>
|
|
10076
|
+
<a id="__codelineno-24-33" name="__codelineno-24-33" href="#__codelineno-24-33"></a>
|
|
10077
|
+
<a id="__codelineno-24-34" name="__codelineno-24-34" href="#__codelineno-24-34"></a> <span class="c1"># Create access switches</span>
|
|
10078
|
+
<a id="__codelineno-24-35" name="__codelineno-24-35" href="#__codelineno-24-35"></a> <span class="n">device_ct</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="n">Device</span><span class="p">)</span>
|
|
10079
|
+
<a id="__codelineno-24-36" name="__codelineno-24-36" href="#__codelineno-24-36"></a> <span class="n">switch_role</span> <span class="o">=</span> <span class="n">Role</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"Access Switch"</span><span class="p">)</span>
|
|
10080
|
+
<a id="__codelineno-24-37" name="__codelineno-24-37" href="#__codelineno-24-37"></a> <span class="n">switch_role</span><span class="o">.</span><span class="n">content_types</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">device_ct</span><span class="p">)</span>
|
|
10081
|
+
<a id="__codelineno-24-38" name="__codelineno-24-38" href="#__codelineno-24-38"></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">switch_count</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
|
|
10082
|
+
<a id="__codelineno-24-39" name="__codelineno-24-39" href="#__codelineno-24-39"></a> <span class="n">switch</span> <span class="o">=</span> <span class="n">Device</span><span class="p">(</span>
|
|
10083
|
+
<a id="__codelineno-24-40" name="__codelineno-24-40" href="#__codelineno-24-40"></a> <span class="n">device_type</span><span class="o">=</span><span class="n">switch_model</span><span class="p">,</span>
|
|
10084
|
+
<a id="__codelineno-24-41" name="__codelineno-24-41" href="#__codelineno-24-41"></a> <span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">location</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">-switch</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
|
|
10085
|
+
<a id="__codelineno-24-42" name="__codelineno-24-42" href="#__codelineno-24-42"></a> <span class="n">location</span><span class="o">=</span><span class="n">location</span><span class="p">,</span>
|
|
10086
|
+
<a id="__codelineno-24-43" name="__codelineno-24-43" href="#__codelineno-24-43"></a> <span class="n">status</span><span class="o">=</span><span class="n">STATUS_PLANNED</span><span class="p">,</span>
|
|
10087
|
+
<a id="__codelineno-24-44" name="__codelineno-24-44" href="#__codelineno-24-44"></a> <span class="n">role</span><span class="o">=</span><span class="n">switch_role</span><span class="p">,</span>
|
|
10088
|
+
<a id="__codelineno-24-45" name="__codelineno-24-45" href="#__codelineno-24-45"></a> <span class="p">)</span>
|
|
10089
|
+
<a id="__codelineno-24-46" name="__codelineno-24-46" href="#__codelineno-24-46"></a> <span class="n">switch</span><span class="o">.</span><span class="n">validated_save</span><span class="p">()</span>
|
|
10090
|
+
<a id="__codelineno-24-47" name="__codelineno-24-47" href="#__codelineno-24-47"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Created new switch"</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">switch</span><span class="p">})</span>
|
|
10091
|
+
<a id="__codelineno-24-48" name="__codelineno-24-48" href="#__codelineno-24-48"></a>
|
|
10092
|
+
<a id="__codelineno-24-49" name="__codelineno-24-49" href="#__codelineno-24-49"></a> <span class="c1"># Generate a CSV table of new devices</span>
|
|
10093
|
+
<a id="__codelineno-24-50" name="__codelineno-24-50" href="#__codelineno-24-50"></a> <span class="n">output</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"name,make,model"</span><span class="p">]</span>
|
|
10094
|
+
<a id="__codelineno-24-51" name="__codelineno-24-51" href="#__codelineno-24-51"></a> <span class="k">for</span> <span class="n">switch</span> <span class="ow">in</span> <span class="n">Device</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">location</span><span class="o">=</span><span class="n">location</span><span class="p">):</span>
|
|
10095
|
+
<a id="__codelineno-24-52" name="__codelineno-24-52" href="#__codelineno-24-52"></a> <span class="n">attrs</span> <span class="o">=</span> <span class="p">[</span><span class="n">switch</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">switch</span><span class="o">.</span><span class="n">device_type</span><span class="o">.</span><span class="n">manufacturer</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">switch</span><span class="o">.</span><span class="n">device_type</span><span class="o">.</span><span class="n">model</span><span class="p">]</span>
|
|
10096
|
+
<a id="__codelineno-24-53" name="__codelineno-24-53" href="#__codelineno-24-53"></a> <span class="n">output</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">","</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">attrs</span><span class="p">))</span>
|
|
10097
|
+
<a id="__codelineno-24-54" name="__codelineno-24-54" href="#__codelineno-24-54"></a>
|
|
10098
|
+
<a id="__codelineno-24-55" name="__codelineno-24-55" href="#__codelineno-24-55"></a> <span class="k">return</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">output</span><span class="p">)</span>
|
|
10099
|
+
<a id="__codelineno-24-56" name="__codelineno-24-56" href="#__codelineno-24-56"></a>
|
|
10100
|
+
<a id="__codelineno-24-57" name="__codelineno-24-57" href="#__codelineno-24-57"></a>
|
|
10101
|
+
<a id="__codelineno-24-58" name="__codelineno-24-58" href="#__codelineno-24-58"></a><span class="n">register_jobs</span><span class="p">(</span><span class="n">NewBranch</span><span class="p">)</span>
|
|
9312
10102
|
</code></pre></div>
|
|
9313
10103
|
<h3 id="device-validation">Device validation<a class="headerlink" href="#device-validation" title="Permanent link">¶</a></h3>
|
|
9314
10104
|
<p>A job to perform various validation of Device data in Nautobot. As this job does not require any user input, it does not define any variables.</p>
|
|
9315
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9316
|
-
<a id="__codelineno-
|
|
9317
|
-
<a id="__codelineno-
|
|
9318
|
-
<a id="__codelineno-
|
|
9319
|
-
<a id="__codelineno-
|
|
9320
|
-
<a id="__codelineno-
|
|
9321
|
-
<a id="__codelineno-
|
|
9322
|
-
<a id="__codelineno-
|
|
9323
|
-
<a id="__codelineno-
|
|
9324
|
-
<a id="__codelineno-
|
|
9325
|
-
<a id="__codelineno-
|
|
9326
|
-
<a id="__codelineno-
|
|
9327
|
-
<a id="__codelineno-
|
|
9328
|
-
<a id="__codelineno-
|
|
9329
|
-
<a id="__codelineno-
|
|
9330
|
-
<a id="__codelineno-
|
|
9331
|
-
<a id="__codelineno-
|
|
9332
|
-
<a id="__codelineno-
|
|
9333
|
-
<a id="__codelineno-
|
|
9334
|
-
<a id="__codelineno-
|
|
9335
|
-
<a id="__codelineno-
|
|
9336
|
-
<a id="__codelineno-
|
|
9337
|
-
<a id="__codelineno-
|
|
9338
|
-
<a id="__codelineno-
|
|
9339
|
-
<a id="__codelineno-
|
|
9340
|
-
<a id="__codelineno-
|
|
9341
|
-
<a id="__codelineno-
|
|
9342
|
-
<a id="__codelineno-
|
|
9343
|
-
<a id="__codelineno-
|
|
9344
|
-
<a id="__codelineno-
|
|
9345
|
-
<a id="__codelineno-
|
|
9346
|
-
<a id="__codelineno-
|
|
9347
|
-
<a id="__codelineno-
|
|
9348
|
-
<a id="__codelineno-
|
|
9349
|
-
<a id="__codelineno-
|
|
9350
|
-
<a id="__codelineno-
|
|
9351
|
-
<a id="__codelineno-
|
|
9352
|
-
<a id="__codelineno-
|
|
9353
|
-
<a id="__codelineno-
|
|
9354
|
-
<a id="__codelineno-
|
|
9355
|
-
<a id="__codelineno-
|
|
9356
|
-
<a id="__codelineno-
|
|
9357
|
-
<a id="__codelineno-
|
|
9358
|
-
<a id="__codelineno-
|
|
9359
|
-
<a id="__codelineno-
|
|
9360
|
-
<a id="__codelineno-
|
|
9361
|
-
<a id="__codelineno-
|
|
9362
|
-
<a id="__codelineno-
|
|
9363
|
-
<a id="__codelineno-
|
|
9364
|
-
<a id="__codelineno-
|
|
10105
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-25-1" name="__codelineno-25-1" href="#__codelineno-25-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span><span class="p">,</span> <span class="n">register_jobs</span>
|
|
10106
|
+
<a id="__codelineno-25-2" name="__codelineno-25-2" href="#__codelineno-25-2"></a><span class="kn">from</span> <span class="nn">nautobot.dcim.models</span> <span class="kn">import</span> <span class="n">ConsolePort</span><span class="p">,</span> <span class="n">Device</span><span class="p">,</span> <span class="n">PowerPort</span>
|
|
10107
|
+
<a id="__codelineno-25-3" name="__codelineno-25-3" href="#__codelineno-25-3"></a><span class="kn">from</span> <span class="nn">nautobot.extras.models</span> <span class="kn">import</span> <span class="n">Status</span>
|
|
10108
|
+
<a id="__codelineno-25-4" name="__codelineno-25-4" href="#__codelineno-25-4"></a>
|
|
10109
|
+
<a id="__codelineno-25-5" name="__codelineno-25-5" href="#__codelineno-25-5"></a>
|
|
10110
|
+
<a id="__codelineno-25-6" name="__codelineno-25-6" href="#__codelineno-25-6"></a><span class="k">class</span> <span class="nc">DeviceConnectionsReport</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
10111
|
+
<a id="__codelineno-25-7" name="__codelineno-25-7" href="#__codelineno-25-7"></a> <span class="n">description</span> <span class="o">=</span> <span class="s2">"Validate the minimum physical connections for each device"</span>
|
|
10112
|
+
<a id="__codelineno-25-8" name="__codelineno-25-8" href="#__codelineno-25-8"></a>
|
|
10113
|
+
<a id="__codelineno-25-9" name="__codelineno-25-9" href="#__codelineno-25-9"></a> <span class="k">def</span> <span class="nf">test_console_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
10114
|
+
<a id="__codelineno-25-10" name="__codelineno-25-10" href="#__codelineno-25-10"></a> <span class="n">STATUS_ACTIVE</span> <span class="o">=</span> <span class="n">Status</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">'Active'</span><span class="p">)</span>
|
|
10115
|
+
<a id="__codelineno-25-11" name="__codelineno-25-11" href="#__codelineno-25-11"></a>
|
|
10116
|
+
<a id="__codelineno-25-12" name="__codelineno-25-12" href="#__codelineno-25-12"></a> <span class="c1"># Check that every console port for every active device has a connection defined.</span>
|
|
10117
|
+
<a id="__codelineno-25-13" name="__codelineno-25-13" href="#__codelineno-25-13"></a> <span class="k">for</span> <span class="n">console_port</span> <span class="ow">in</span> <span class="n">ConsolePort</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">select_related</span><span class="p">(</span><span class="s1">'device'</span><span class="p">)</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">device__status</span><span class="o">=</span><span class="n">STATUS_ACTIVE</span><span class="p">):</span>
|
|
10118
|
+
<a id="__codelineno-25-14" name="__codelineno-25-14" href="#__codelineno-25-14"></a> <span class="k">if</span> <span class="n">console_port</span><span class="o">.</span><span class="n">connected_endpoint</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
10119
|
+
<a id="__codelineno-25-15" name="__codelineno-25-15" href="#__codelineno-25-15"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
|
|
10120
|
+
<a id="__codelineno-25-16" name="__codelineno-25-16" href="#__codelineno-25-16"></a> <span class="s2">"No console connection defined for </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span>
|
|
10121
|
+
<a id="__codelineno-25-17" name="__codelineno-25-17" href="#__codelineno-25-17"></a> <span class="n">console_port</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
|
|
10122
|
+
<a id="__codelineno-25-18" name="__codelineno-25-18" href="#__codelineno-25-18"></a> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">console_port</span><span class="o">.</span><span class="n">device</span><span class="p">},</span>
|
|
10123
|
+
<a id="__codelineno-25-19" name="__codelineno-25-19" href="#__codelineno-25-19"></a> <span class="p">)</span>
|
|
10124
|
+
<a id="__codelineno-25-20" name="__codelineno-25-20" href="#__codelineno-25-20"></a> <span class="k">else</span><span class="p">:</span>
|
|
10125
|
+
<a id="__codelineno-25-21" name="__codelineno-25-21" href="#__codelineno-25-21"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
|
|
10126
|
+
<a id="__codelineno-25-22" name="__codelineno-25-22" href="#__codelineno-25-22"></a> <span class="s2">"Console port </span><span class="si">%s</span><span class="s2"> has a connection defined"</span><span class="p">,</span>
|
|
10127
|
+
<a id="__codelineno-25-23" name="__codelineno-25-23" href="#__codelineno-25-23"></a> <span class="n">console_port</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
|
|
10128
|
+
<a id="__codelineno-25-24" name="__codelineno-25-24" href="#__codelineno-25-24"></a> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">console_port</span><span class="o">.</span><span class="n">device</span><span class="p">},</span>
|
|
10129
|
+
<a id="__codelineno-25-25" name="__codelineno-25-25" href="#__codelineno-25-25"></a> <span class="p">)</span>
|
|
10130
|
+
<a id="__codelineno-25-26" name="__codelineno-25-26" href="#__codelineno-25-26"></a>
|
|
10131
|
+
<a id="__codelineno-25-27" name="__codelineno-25-27" href="#__codelineno-25-27"></a> <span class="k">def</span> <span class="nf">test_power_connections</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
10132
|
+
<a id="__codelineno-25-28" name="__codelineno-25-28" href="#__codelineno-25-28"></a> <span class="n">STATUS_ACTIVE</span> <span class="o">=</span> <span class="n">Status</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">'Active'</span><span class="p">)</span>
|
|
10133
|
+
<a id="__codelineno-25-29" name="__codelineno-25-29" href="#__codelineno-25-29"></a>
|
|
10134
|
+
<a id="__codelineno-25-30" name="__codelineno-25-30" href="#__codelineno-25-30"></a> <span class="c1"># Check that every active device has at least two connected power supplies.</span>
|
|
10135
|
+
<a id="__codelineno-25-31" name="__codelineno-25-31" href="#__codelineno-25-31"></a> <span class="k">for</span> <span class="n">device</span> <span class="ow">in</span> <span class="n">Device</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="n">STATUS_ACTIVE</span><span class="p">):</span>
|
|
10136
|
+
<a id="__codelineno-25-32" name="__codelineno-25-32" href="#__codelineno-25-32"></a> <span class="n">connected_ports</span> <span class="o">=</span> <span class="mi">0</span>
|
|
10137
|
+
<a id="__codelineno-25-33" name="__codelineno-25-33" href="#__codelineno-25-33"></a> <span class="k">for</span> <span class="n">power_port</span> <span class="ow">in</span> <span class="n">PowerPort</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">device</span><span class="o">=</span><span class="n">device</span><span class="p">):</span>
|
|
10138
|
+
<a id="__codelineno-25-34" name="__codelineno-25-34" href="#__codelineno-25-34"></a> <span class="k">if</span> <span class="n">power_port</span><span class="o">.</span><span class="n">connected_endpoint</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
10139
|
+
<a id="__codelineno-25-35" name="__codelineno-25-35" href="#__codelineno-25-35"></a> <span class="n">connected_ports</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
10140
|
+
<a id="__codelineno-25-36" name="__codelineno-25-36" href="#__codelineno-25-36"></a> <span class="k">if</span> <span class="n">connected_ports</span> <span class="o"><</span> <span class="mi">2</span><span class="p">:</span>
|
|
10141
|
+
<a id="__codelineno-25-37" name="__codelineno-25-37" href="#__codelineno-25-37"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
|
|
10142
|
+
<a id="__codelineno-25-38" name="__codelineno-25-38" href="#__codelineno-25-38"></a> <span class="s2">"</span><span class="si">%s</span><span class="s2"> connected power supplies found (2 needed)"</span><span class="p">,</span>
|
|
10143
|
+
<a id="__codelineno-25-39" name="__codelineno-25-39" href="#__codelineno-25-39"></a> <span class="n">connected_ports</span><span class="p">,</span>
|
|
10144
|
+
<a id="__codelineno-25-40" name="__codelineno-25-40" href="#__codelineno-25-40"></a> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">device</span><span class="p">},</span>
|
|
10145
|
+
<a id="__codelineno-25-41" name="__codelineno-25-41" href="#__codelineno-25-41"></a> <span class="p">)</span>
|
|
10146
|
+
<a id="__codelineno-25-42" name="__codelineno-25-42" href="#__codelineno-25-42"></a> <span class="k">else</span><span class="p">:</span>
|
|
10147
|
+
<a id="__codelineno-25-43" name="__codelineno-25-43" href="#__codelineno-25-43"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"At least two connected power supplies found"</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">device</span><span class="p">})</span>
|
|
10148
|
+
<a id="__codelineno-25-44" name="__codelineno-25-44" href="#__codelineno-25-44"></a>
|
|
10149
|
+
<a id="__codelineno-25-45" name="__codelineno-25-45" href="#__codelineno-25-45"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
10150
|
+
<a id="__codelineno-25-46" name="__codelineno-25-46" href="#__codelineno-25-46"></a> <span class="bp">self</span><span class="o">.</span><span class="n">test_console_connection</span><span class="p">()</span>
|
|
10151
|
+
<a id="__codelineno-25-47" name="__codelineno-25-47" href="#__codelineno-25-47"></a> <span class="bp">self</span><span class="o">.</span><span class="n">test_power_connections</span><span class="p">()</span>
|
|
10152
|
+
<a id="__codelineno-25-48" name="__codelineno-25-48" href="#__codelineno-25-48"></a>
|
|
10153
|
+
<a id="__codelineno-25-49" name="__codelineno-25-49" href="#__codelineno-25-49"></a>
|
|
10154
|
+
<a id="__codelineno-25-50" name="__codelineno-25-50" href="#__codelineno-25-50"></a><span class="n">register_jobs</span><span class="p">(</span><span class="n">DeviceConnectionsReport</span><span class="p">)</span>
|
|
9365
10155
|
</code></pre></div>
|
|
9366
10156
|
<h2 id="job-button-receivers">Job Button Receivers<a class="headerlink" href="#job-button-receivers" title="Permanent link">¶</a></h2>
|
|
9367
10157
|
<p>Job Buttons are only able to initiate a specific type of job called a <strong>Job Button Receiver</strong>. These are jobs that subclass the <code>nautobot.apps.jobs.JobButtonReceiver</code> class. Job Button Receivers are similar to normal jobs except they are hard coded to accept only <code>object_pk</code> and <code>object_model_name</code> <a href="#variables">variables</a>. Job Button Receivers are hidden from the jobs listing UI by default but otherwise function similarly to other jobs. The <code>JobButtonReceiver</code> class only implements one method called <code>receive_job_button</code>.</p>
|
|
@@ -9375,58 +10165,58 @@ However the import paths used in the examples requires 1.5.2 and newer.</p>
|
|
|
9375
10165
|
<li><code>obj</code> - An instance of the object where the button was pressed</li>
|
|
9376
10166
|
</ol>
|
|
9377
10167
|
<h3 id="example-job-button-receiver">Example Job Button Receiver<a class="headerlink" href="#example-job-button-receiver" title="Permanent link">¶</a></h3>
|
|
9378
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9379
|
-
<a id="__codelineno-
|
|
9380
|
-
<a id="__codelineno-
|
|
9381
|
-
<a id="__codelineno-
|
|
9382
|
-
<a id="__codelineno-
|
|
9383
|
-
<a id="__codelineno-
|
|
9384
|
-
<a id="__codelineno-
|
|
9385
|
-
<a id="__codelineno-
|
|
9386
|
-
<a id="__codelineno-
|
|
9387
|
-
<a id="__codelineno-
|
|
9388
|
-
<a id="__codelineno-
|
|
9389
|
-
<a id="__codelineno-
|
|
9390
|
-
<a id="__codelineno-
|
|
10168
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">JobButtonReceiver</span><span class="p">,</span> <span class="n">register_jobs</span>
|
|
10169
|
+
<a id="__codelineno-26-2" name="__codelineno-26-2" href="#__codelineno-26-2"></a>
|
|
10170
|
+
<a id="__codelineno-26-3" name="__codelineno-26-3" href="#__codelineno-26-3"></a>
|
|
10171
|
+
<a id="__codelineno-26-4" name="__codelineno-26-4" href="#__codelineno-26-4"></a><span class="k">class</span> <span class="nc">ExampleSimpleJobButtonReceiver</span><span class="p">(</span><span class="n">JobButtonReceiver</span><span class="p">):</span>
|
|
10172
|
+
<a id="__codelineno-26-5" name="__codelineno-26-5" href="#__codelineno-26-5"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
10173
|
+
<a id="__codelineno-26-6" name="__codelineno-26-6" href="#__codelineno-26-6"></a> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Example Simple Job Button Receiver"</span>
|
|
10174
|
+
<a id="__codelineno-26-7" name="__codelineno-26-7" href="#__codelineno-26-7"></a>
|
|
10175
|
+
<a id="__codelineno-26-8" name="__codelineno-26-8" href="#__codelineno-26-8"></a> <span class="k">def</span> <span class="nf">receive_job_button</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
10176
|
+
<a id="__codelineno-26-9" name="__codelineno-26-9" href="#__codelineno-26-9"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Running Job Button Receiver."</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">obj</span><span class="p">})</span>
|
|
10177
|
+
<a id="__codelineno-26-10" name="__codelineno-26-10" href="#__codelineno-26-10"></a> <span class="c1"># Add job logic here</span>
|
|
10178
|
+
<a id="__codelineno-26-11" name="__codelineno-26-11" href="#__codelineno-26-11"></a>
|
|
10179
|
+
<a id="__codelineno-26-12" name="__codelineno-26-12" href="#__codelineno-26-12"></a>
|
|
10180
|
+
<a id="__codelineno-26-13" name="__codelineno-26-13" href="#__codelineno-26-13"></a><span class="n">register_jobs</span><span class="p">(</span><span class="n">ExampleSimpleJobButtonReceiver</span><span class="p">)</span>
|
|
9391
10181
|
</code></pre></div>
|
|
9392
10182
|
<h3 id="job-buttons-for-multiple-types">Job Buttons for Multiple Types<a class="headerlink" href="#job-buttons-for-multiple-types" title="Permanent link">¶</a></h3>
|
|
9393
10183
|
<p>Since Job Buttons can be associated to multiple object types, it would be trivial to create a Job that can change what it runs based on the object type.</p>
|
|
9394
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9395
|
-
<a id="__codelineno-
|
|
9396
|
-
<a id="__codelineno-
|
|
9397
|
-
<a id="__codelineno-
|
|
9398
|
-
<a id="__codelineno-
|
|
9399
|
-
<a id="__codelineno-
|
|
9400
|
-
<a id="__codelineno-
|
|
9401
|
-
<a id="__codelineno-
|
|
9402
|
-
<a id="__codelineno-
|
|
9403
|
-
<a id="__codelineno-
|
|
9404
|
-
<a id="__codelineno-
|
|
9405
|
-
<a id="__codelineno-
|
|
9406
|
-
<a id="__codelineno-
|
|
9407
|
-
<a id="__codelineno-
|
|
9408
|
-
<a id="__codelineno-
|
|
9409
|
-
<a id="__codelineno-
|
|
9410
|
-
<a id="__codelineno-
|
|
9411
|
-
<a id="__codelineno-
|
|
9412
|
-
<a id="__codelineno-
|
|
9413
|
-
<a id="__codelineno-
|
|
9414
|
-
<a id="__codelineno-
|
|
9415
|
-
<a id="__codelineno-
|
|
9416
|
-
<a id="__codelineno-
|
|
9417
|
-
<a id="__codelineno-
|
|
9418
|
-
<a id="__codelineno-
|
|
9419
|
-
<a id="__codelineno-
|
|
9420
|
-
<a id="__codelineno-
|
|
9421
|
-
<a id="__codelineno-
|
|
9422
|
-
<a id="__codelineno-
|
|
9423
|
-
<a id="__codelineno-
|
|
9424
|
-
<a id="__codelineno-
|
|
9425
|
-
<a id="__codelineno-
|
|
9426
|
-
<a id="__codelineno-
|
|
9427
|
-
<a id="__codelineno-
|
|
9428
|
-
<a id="__codelineno-
|
|
9429
|
-
<a id="__codelineno-
|
|
10184
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-27-1" name="__codelineno-27-1" href="#__codelineno-27-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">JobButtonReceiver</span><span class="p">,</span> <span class="n">register_jobs</span>
|
|
10185
|
+
<a id="__codelineno-27-2" name="__codelineno-27-2" href="#__codelineno-27-2"></a><span class="kn">from</span> <span class="nn">nautobot.dcim.models</span> <span class="kn">import</span> <span class="n">Device</span><span class="p">,</span> <span class="n">Location</span>
|
|
10186
|
+
<a id="__codelineno-27-3" name="__codelineno-27-3" href="#__codelineno-27-3"></a>
|
|
10187
|
+
<a id="__codelineno-27-4" name="__codelineno-27-4" href="#__codelineno-27-4"></a>
|
|
10188
|
+
<a id="__codelineno-27-5" name="__codelineno-27-5" href="#__codelineno-27-5"></a><span class="k">class</span> <span class="nc">ExampleComplexJobButtonReceiver</span><span class="p">(</span><span class="n">JobButtonReceiver</span><span class="p">):</span>
|
|
10189
|
+
<a id="__codelineno-27-6" name="__codelineno-27-6" href="#__codelineno-27-6"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
10190
|
+
<a id="__codelineno-27-7" name="__codelineno-27-7" href="#__codelineno-27-7"></a> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Example Complex Job Button Receiver"</span>
|
|
10191
|
+
<a id="__codelineno-27-8" name="__codelineno-27-8" href="#__codelineno-27-8"></a>
|
|
10192
|
+
<a id="__codelineno-27-9" name="__codelineno-27-9" href="#__codelineno-27-9"></a> <span class="k">def</span> <span class="nf">_run_location_job</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
10193
|
+
<a id="__codelineno-27-10" name="__codelineno-27-10" href="#__codelineno-27-10"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Running Location Job Button Receiver."</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">obj</span><span class="p">})</span>
|
|
10194
|
+
<a id="__codelineno-27-11" name="__codelineno-27-11" href="#__codelineno-27-11"></a> <span class="c1"># Run Location Job function</span>
|
|
10195
|
+
<a id="__codelineno-27-12" name="__codelineno-27-12" href="#__codelineno-27-12"></a>
|
|
10196
|
+
<a id="__codelineno-27-13" name="__codelineno-27-13" href="#__codelineno-27-13"></a> <span class="k">def</span> <span class="nf">_run_device_job</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
10197
|
+
<a id="__codelineno-27-14" name="__codelineno-27-14" href="#__codelineno-27-14"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Running Device Job Button Receiver."</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">obj</span><span class="p">})</span>
|
|
10198
|
+
<a id="__codelineno-27-15" name="__codelineno-27-15" href="#__codelineno-27-15"></a> <span class="c1"># Run Device Job function</span>
|
|
10199
|
+
<a id="__codelineno-27-16" name="__codelineno-27-16" href="#__codelineno-27-16"></a>
|
|
10200
|
+
<a id="__codelineno-27-17" name="__codelineno-27-17" href="#__codelineno-27-17"></a> <span class="k">def</span> <span class="nf">receive_job_button</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
10201
|
+
<a id="__codelineno-27-18" name="__codelineno-27-18" href="#__codelineno-27-18"></a> <span class="n">user</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">user</span>
|
|
10202
|
+
<a id="__codelineno-27-19" name="__codelineno-27-19" href="#__codelineno-27-19"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">Location</span><span class="p">):</span>
|
|
10203
|
+
<a id="__codelineno-27-20" name="__codelineno-27-20" href="#__codelineno-27-20"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">user</span><span class="o">.</span><span class="n">has_perm</span><span class="p">(</span><span class="s2">"dcim.add_location"</span><span class="p">):</span>
|
|
10204
|
+
<a id="__codelineno-27-21" name="__codelineno-27-21" href="#__codelineno-27-21"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"User '</span><span class="si">%s</span><span class="s2">' does not have permission to add a Location."</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">obj</span><span class="p">})</span>
|
|
10205
|
+
<a id="__codelineno-27-22" name="__codelineno-27-22" href="#__codelineno-27-22"></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"User does not have permission to add a Location."</span><span class="p">)</span>
|
|
10206
|
+
<a id="__codelineno-27-23" name="__codelineno-27-23" href="#__codelineno-27-23"></a> <span class="k">else</span><span class="p">:</span>
|
|
10207
|
+
<a id="__codelineno-27-24" name="__codelineno-27-24" href="#__codelineno-27-24"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_run_location_job</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
10208
|
+
<a id="__codelineno-27-25" name="__codelineno-27-25" href="#__codelineno-27-25"></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">Device</span><span class="p">):</span>
|
|
10209
|
+
<a id="__codelineno-27-26" name="__codelineno-27-26" href="#__codelineno-27-26"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">user</span><span class="o">.</span><span class="n">has_perm</span><span class="p">(</span><span class="s2">"dcim.add_device"</span><span class="p">):</span>
|
|
10210
|
+
<a id="__codelineno-27-27" name="__codelineno-27-27" href="#__codelineno-27-27"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"User '</span><span class="si">%s</span><span class="s2">' does not have permission to add a Device."</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">obj</span><span class="p">})</span>
|
|
10211
|
+
<a id="__codelineno-27-28" name="__codelineno-27-28" href="#__codelineno-27-28"></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"User does not have permission to add a Device."</span><span class="p">)</span>
|
|
10212
|
+
<a id="__codelineno-27-29" name="__codelineno-27-29" href="#__codelineno-27-29"></a> <span class="k">else</span><span class="p">:</span>
|
|
10213
|
+
<a id="__codelineno-27-30" name="__codelineno-27-30" href="#__codelineno-27-30"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_run_device_job</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
10214
|
+
<a id="__codelineno-27-31" name="__codelineno-27-31" href="#__codelineno-27-31"></a> <span class="k">else</span><span class="p">:</span>
|
|
10215
|
+
<a id="__codelineno-27-32" name="__codelineno-27-32" href="#__codelineno-27-32"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"Unable to run Job Button for type </span><span class="si">%s</span><span class="s2">."</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">obj</span><span class="p">})</span>
|
|
10216
|
+
<a id="__codelineno-27-33" name="__codelineno-27-33" href="#__codelineno-27-33"></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Job button called on unsupported object type."</span><span class="p">)</span>
|
|
10217
|
+
<a id="__codelineno-27-34" name="__codelineno-27-34" href="#__codelineno-27-34"></a>
|
|
10218
|
+
<a id="__codelineno-27-35" name="__codelineno-27-35" href="#__codelineno-27-35"></a>
|
|
10219
|
+
<a id="__codelineno-27-36" name="__codelineno-27-36" href="#__codelineno-27-36"></a><span class="n">register_jobs</span><span class="p">(</span><span class="n">ExampleComplexJobButtonReceiver</span><span class="p">)</span>
|
|
9430
10220
|
</code></pre></div>
|
|
9431
10221
|
<h2 id="job-hook-receivers">Job Hook Receivers<a class="headerlink" href="#job-hook-receivers" title="Permanent link">¶</a></h2>
|
|
9432
10222
|
<p>Job Hooks are only able to initiate a specific type of job called a <strong>Job Hook Receiver</strong>. These are jobs that subclass the <code>nautobot.apps.jobs.JobHookReceiver</code> class. Job hook receivers are similar to normal jobs except they are hard coded to accept only an <code>object_change</code> <a href="#variables">variable</a>. Job Hook Receivers are hidden from the jobs listing UI by default but otherwise function similarly to other jobs. The <code>JobHookReceiver</code> class only implements one method called <code>receive_job_hook</code>.</p>
|
|
@@ -9439,40 +10229,40 @@ However the import paths used in the examples requires 1.5.2 and newer.</p>
|
|
|
9439
10229
|
<p>To prevent negatively impacting system performance through an infinite loop, a change that was made by a <code>JobHookReceiver</code> job will not trigger another <code>JobHookReceiver</code> job to run.</p>
|
|
9440
10230
|
</div>
|
|
9441
10231
|
<h3 id="example-job-hook-receiver">Example Job Hook Receiver<a class="headerlink" href="#example-job-hook-receiver" title="Permanent link">¶</a></h3>
|
|
9442
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
9443
|
-
<a id="__codelineno-
|
|
9444
|
-
<a id="__codelineno-
|
|
9445
|
-
<a id="__codelineno-
|
|
9446
|
-
<a id="__codelineno-
|
|
9447
|
-
<a id="__codelineno-
|
|
9448
|
-
<a id="__codelineno-
|
|
9449
|
-
<a id="__codelineno-
|
|
9450
|
-
<a id="__codelineno-
|
|
9451
|
-
<a id="__codelineno-
|
|
9452
|
-
<a id="__codelineno-
|
|
9453
|
-
<a id="__codelineno-
|
|
9454
|
-
<a id="__codelineno-
|
|
9455
|
-
<a id="__codelineno-
|
|
9456
|
-
<a id="__codelineno-
|
|
9457
|
-
<a id="__codelineno-
|
|
9458
|
-
<a id="__codelineno-
|
|
9459
|
-
<a id="__codelineno-
|
|
9460
|
-
<a id="__codelineno-
|
|
9461
|
-
<a id="__codelineno-
|
|
9462
|
-
<a id="__codelineno-
|
|
9463
|
-
<a id="__codelineno-
|
|
9464
|
-
<a id="__codelineno-
|
|
9465
|
-
<a id="__codelineno-
|
|
9466
|
-
<a id="__codelineno-
|
|
9467
|
-
<a id="__codelineno-
|
|
9468
|
-
<a id="__codelineno-
|
|
9469
|
-
<a id="__codelineno-
|
|
9470
|
-
<a id="__codelineno-
|
|
9471
|
-
<a id="__codelineno-
|
|
9472
|
-
<a id="__codelineno-
|
|
9473
|
-
<a id="__codelineno-
|
|
9474
|
-
<a id="__codelineno-
|
|
9475
|
-
<a id="__codelineno-
|
|
10232
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">JobHookReceiver</span><span class="p">,</span> <span class="n">register_jobs</span>
|
|
10233
|
+
<a id="__codelineno-28-2" name="__codelineno-28-2" href="#__codelineno-28-2"></a><span class="kn">from</span> <span class="nn">nautobot.extras.choices</span> <span class="kn">import</span> <span class="n">ObjectChangeActionChoices</span>
|
|
10234
|
+
<a id="__codelineno-28-3" name="__codelineno-28-3" href="#__codelineno-28-3"></a>
|
|
10235
|
+
<a id="__codelineno-28-4" name="__codelineno-28-4" href="#__codelineno-28-4"></a>
|
|
10236
|
+
<a id="__codelineno-28-5" name="__codelineno-28-5" href="#__codelineno-28-5"></a><span class="k">class</span> <span class="nc">ExampleJobHookReceiver</span><span class="p">(</span><span class="n">JobHookReceiver</span><span class="p">):</span>
|
|
10237
|
+
<a id="__codelineno-28-6" name="__codelineno-28-6" href="#__codelineno-28-6"></a> <span class="k">def</span> <span class="nf">receive_job_hook</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">change</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">changed_object</span><span class="p">):</span>
|
|
10238
|
+
<a id="__codelineno-28-7" name="__codelineno-28-7" href="#__codelineno-28-7"></a> <span class="c1"># return on delete action</span>
|
|
10239
|
+
<a id="__codelineno-28-8" name="__codelineno-28-8" href="#__codelineno-28-8"></a> <span class="k">if</span> <span class="n">action</span> <span class="o">==</span> <span class="n">ObjectChangeActionChoices</span><span class="o">.</span><span class="n">ACTION_DELETE</span><span class="p">:</span>
|
|
10240
|
+
<a id="__codelineno-28-9" name="__codelineno-28-9" href="#__codelineno-28-9"></a> <span class="k">return</span>
|
|
10241
|
+
<a id="__codelineno-28-10" name="__codelineno-28-10" href="#__codelineno-28-10"></a>
|
|
10242
|
+
<a id="__codelineno-28-11" name="__codelineno-28-11" href="#__codelineno-28-11"></a> <span class="c1"># log diff output</span>
|
|
10243
|
+
<a id="__codelineno-28-12" name="__codelineno-28-12" href="#__codelineno-28-12"></a> <span class="n">snapshots</span> <span class="o">=</span> <span class="n">change</span><span class="o">.</span><span class="n">get_snapshots</span><span class="p">()</span>
|
|
10244
|
+
<a id="__codelineno-28-13" name="__codelineno-28-13" href="#__codelineno-28-13"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"DIFF: </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">snapshots</span><span class="p">[</span><span class="s1">'differences'</span><span class="p">])</span>
|
|
10245
|
+
<a id="__codelineno-28-14" name="__codelineno-28-14" href="#__codelineno-28-14"></a>
|
|
10246
|
+
<a id="__codelineno-28-15" name="__codelineno-28-15" href="#__codelineno-28-15"></a> <span class="c1"># validate changes to serial field</span>
|
|
10247
|
+
<a id="__codelineno-28-16" name="__codelineno-28-16" href="#__codelineno-28-16"></a> <span class="k">if</span> <span class="s2">"serial"</span> <span class="ow">in</span> <span class="n">snapshots</span><span class="p">[</span><span class="s2">"differences"</span><span class="p">][</span><span class="s2">"added"</span><span class="p">]:</span>
|
|
10248
|
+
<a id="__codelineno-28-17" name="__codelineno-28-17" href="#__codelineno-28-17"></a> <span class="n">old_serial</span> <span class="o">=</span> <span class="n">snapshots</span><span class="p">[</span><span class="s2">"differences"</span><span class="p">][</span><span class="s2">"removed"</span><span class="p">][</span><span class="s2">"serial"</span><span class="p">]</span>
|
|
10249
|
+
<a id="__codelineno-28-18" name="__codelineno-28-18" href="#__codelineno-28-18"></a> <span class="n">new_serial</span> <span class="o">=</span> <span class="n">snapshots</span><span class="p">[</span><span class="s2">"differences"</span><span class="p">][</span><span class="s2">"added"</span><span class="p">][</span><span class="s2">"serial"</span><span class="p">]</span>
|
|
10250
|
+
<a id="__codelineno-28-19" name="__codelineno-28-19" href="#__codelineno-28-19"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> serial has been changed from </span><span class="si">%s</span><span class="s2"> to </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">changed_object</span><span class="p">,</span> <span class="n">old_serial</span><span class="p">,</span> <span class="n">new_serial</span><span class="p">)</span>
|
|
10251
|
+
<a id="__codelineno-28-20" name="__codelineno-28-20" href="#__codelineno-28-20"></a>
|
|
10252
|
+
<a id="__codelineno-28-21" name="__codelineno-28-21" href="#__codelineno-28-21"></a> <span class="c1"># Check the new serial is valid and revert if necessary</span>
|
|
10253
|
+
<a id="__codelineno-28-22" name="__codelineno-28-22" href="#__codelineno-28-22"></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">validate_serial</span><span class="p">(</span><span class="n">new_serial</span><span class="p">):</span>
|
|
10254
|
+
<a id="__codelineno-28-23" name="__codelineno-28-23" href="#__codelineno-28-23"></a> <span class="n">changed_object</span><span class="o">.</span><span class="n">serial</span> <span class="o">=</span> <span class="n">old_serial</span>
|
|
10255
|
+
<a id="__codelineno-28-24" name="__codelineno-28-24" href="#__codelineno-28-24"></a> <span class="n">changed_object</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
|
|
10256
|
+
<a id="__codelineno-28-25" name="__codelineno-28-25" href="#__codelineno-28-25"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> serial </span><span class="si">%s</span><span class="s2"> was not valid. Reverted to </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">changed_object</span><span class="p">,</span> <span class="n">new_serial</span><span class="p">,</span> <span class="n">old_serial</span><span class="p">)</span>
|
|
10257
|
+
<a id="__codelineno-28-26" name="__codelineno-28-26" href="#__codelineno-28-26"></a>
|
|
10258
|
+
<a id="__codelineno-28-27" name="__codelineno-28-27" href="#__codelineno-28-27"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Serial validation completed for </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">changed_object</span><span class="p">)</span>
|
|
10259
|
+
<a id="__codelineno-28-28" name="__codelineno-28-28" href="#__codelineno-28-28"></a>
|
|
10260
|
+
<a id="__codelineno-28-29" name="__codelineno-28-29" href="#__codelineno-28-29"></a> <span class="k">def</span> <span class="nf">validate_serial</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">serial</span><span class="p">):</span>
|
|
10261
|
+
<a id="__codelineno-28-30" name="__codelineno-28-30" href="#__codelineno-28-30"></a> <span class="c1"># add business logic to validate serial</span>
|
|
10262
|
+
<a id="__codelineno-28-31" name="__codelineno-28-31" href="#__codelineno-28-31"></a> <span class="k">return</span> <span class="kc">False</span>
|
|
10263
|
+
<a id="__codelineno-28-32" name="__codelineno-28-32" href="#__codelineno-28-32"></a>
|
|
10264
|
+
<a id="__codelineno-28-33" name="__codelineno-28-33" href="#__codelineno-28-33"></a>
|
|
10265
|
+
<a id="__codelineno-28-34" name="__codelineno-28-34" href="#__codelineno-28-34"></a><span class="n">register_jobs</span><span class="p">(</span><span class="n">ExampleJobHookReceiver</span><span class="p">)</span>
|
|
9476
10266
|
</code></pre></div>
|
|
9477
10267
|
<h3 id="the-receive_job_hook-method">The <code>receive_job_hook()</code> Method<a class="headerlink" href="#the-receive_job_hook-method" title="Permanent link">¶</a></h3>
|
|
9478
10268
|
<p>All <code>JobHookReceiver</code> subclasses must implement a <code>receive_job_hook()</code> method. This method accepts three arguments:</p>
|