Compare commits

...

1029 Commits

Author SHA1 Message Date
Jeremy Stretch
16a95beb22 Release v2.10-beta1 2020-11-17 15:53:31 -05:00
Jeremy Stretch
ef426deb53 Tweak help modal icon 2020-11-17 15:07:05 -05:00
Jeremy Stretch
6773709c34 Merge branch 'develop' into develop-2.10 2020-11-17 14:35:06 -05:00
Jeremy Stretch
e72db65be2 Clean up v2.10 release notes 2020-11-17 14:11:47 -05:00
Jeremy Stretch
5b9e1b04dc Fix badge icon CSS 2020-11-17 13:38:19 -05:00
Jeremy Stretch
c1c4f28f29 Update installation docs to use CentOS 8 2020-11-17 13:23:07 -05:00
Jeremy Stretch
59df724844 Updated installation docs 2020-11-17 12:01:10 -05:00
Jeremy Stretch
fc126d79cd Bump Django to 3.1.3 2020-11-17 10:32:06 -05:00
Jeremy Stretch
bb15f78ca5 Fix Cable model validation tests 2020-11-17 10:26:03 -05:00
Jeremy Stretch
83daadd575 Highlight the current termination 2020-11-16 16:07:29 -05:00
Jeremy Stretch
c559775135 Add support for tracing split paths 2020-11-16 15:49:07 -05:00
Jeremy Stretch
ba2ff0acb8 Fix icon class 2020-11-16 13:17:43 -05:00
Jeremy Stretch
5106e879c6 Fix CSS for dropdown menu icons 2020-11-16 12:15:27 -05:00
Jeremy Stretch
8c4d4532a4 Fixes #5235: Fix exception when editing IP address with a NAT IP assigned to a non-racked device 2020-11-16 10:59:41 -05:00
Jeremy Stretch
9a736170fe Fixes #5350: Filter available racks by selected group when creating a rack reservation 2020-11-16 10:38:57 -05:00
Jeremy Stretch
9f8f9e8b97 Fixes #5345: Fix non-deterministic ordering of prefixes and IP addresses 2020-11-16 10:17:05 -05:00
Jeremy Stretch
0ee4bc22e5 Add note about changelog 2020-11-16 09:40:50 -05:00
Jeremy Stretch
b9da0129ff Changelog for #5337 2020-11-16 09:38:00 -05:00
Jeremy Stretch
42c29d0f45 Merge pull request #5342 from JonathonReinhart/5337-add-splice-rearport-type
Closes #5337: Add "splice" port type
2020-11-16 09:34:12 -05:00
Jeremy Stretch
d0e6e9c837 Correct return URLs for device component actions 2020-11-13 15:37:34 -05:00
Jeremy Stretch
5f8b0cc40a Ensure consistent display of device component buttons 2020-11-13 15:29:37 -05:00
Jeremy Stretch
9736d6ba48 Separate device component lists into discrete views 2020-11-13 15:00:12 -05:00
Jeremy Stretch
052346364a Don't wrap component names 2020-11-13 13:14:10 -05:00
Jeremy Stretch
424d72a7b3 Fix up related paths list 2020-11-13 12:12:25 -05:00
Jeremy Stretch
eb5f6167a5 Add segment_count property to CablePath 2020-11-13 12:11:53 -05:00
Jeremy Stretch
e84a6b99a8 Improved cable trace UI 2020-11-12 16:55:02 -05:00
Jeremy Stretch
f3f3993963 Enforce custom field validation on the model 2020-11-12 14:23:08 -05:00
Jeremy Stretch
4a8a1ce45c Check for extraneous custom field data on clean() 2020-11-12 12:18:31 -05:00
Jonathon Reinhart
7aa9ecd17a Closes #5337: Add "splice" port type 2020-11-12 10:41:29 -05:00
Jeremy Stretch
aed25fea3a #259: Add present_in_vrf filters for IPAddress 2020-11-12 10:27:44 -05:00
Jeremy Stretch
cbea309786 Call out removal of DTL (#4360) at top of release notes 2020-11-12 10:17:19 -05:00
Jeremy Stretch
a3675854be Clean up generic view templates 2020-11-11 16:58:29 -05:00
Jeremy Stretch
b3c770216e Relocate and group generic views 2020-11-11 16:07:38 -05:00
Jeremy Stretch
8714c33e8a Move constants out of views.py 2020-11-11 15:36:57 -05:00
Jeremy Stretch
a0772fd7ba Move context processors under NetBox core 2020-11-11 15:28:07 -05:00
Jeremy Stretch
3d6baeaab0 Move selection field validation from admin form to model 2020-11-11 15:24:39 -05:00
Jeremy Stretch
d17bf67131 Rewrote documentation for custom fields 2020-11-11 15:23:35 -05:00
Jeremy Stretch
64d1f57276 Add custom get_operation_id() method to avoid monkey-patching coreapi 2020-11-11 14:25:43 -05:00
Jeremy Stretch
963df7e398 Correct FrontPortTemplate update data 2020-11-11 13:02:58 -05:00
Jeremy Stretch
5ed5ffea0e Bulk update should return complete object representation 2020-11-11 13:02:28 -05:00
Jeremy Stretch
d560e2da93 Fix tracing from front/rear ports 2020-11-11 11:48:55 -05:00
Jeremy Stretch
2b359ce1c7 Move rest_api_server_error() to utilities.api 2020-11-10 17:19:14 -05:00
Jeremy Stretch
4971469590 Move APIRootView to netbox.api.views 2020-11-10 17:13:22 -05:00
Jeremy Stretch
db0c61dea4 Consolidate middleware under NetBox core 2020-11-10 16:59:37 -05:00
Jeremy Stretch
c496b05630 Update Python dependencies 2020-11-10 16:44:19 -05:00
Jeremy Stretch
8348c5a674 Fix side panel width 2020-11-10 16:00:21 -05:00
Jeremy Stretch
d03c14d49c Closes #5154: Utilize all horizontal space for web UI 2020-11-10 13:55:53 -05:00
Jeremy Stretch
7a61354d8c Fix rack elevation image toggles 2020-11-10 13:42:48 -05:00
Jeremy Stretch
b9af6ef841 Tweak icons 2020-11-10 13:36:40 -05:00
Jeremy Stretch
de0e69840e Fix RegionTestCase 2020-11-10 13:13:01 -05:00
Jeremy Stretch
52312195b6 Ensure consistent inclusion of custom fields for newly-supporting models 2020-11-10 12:33:20 -05:00
Jeremy Stretch
fbe1ec3e6d Extend some CSV import tests to check ChoiceField slugs 2020-11-10 12:14:54 -05:00
Jeremy Stretch
46b48ee55d Add missing tenant attribute 2020-11-10 11:58:59 -05:00
Jeremy Stretch
f631f8c45b Correct label for RIR 2020-11-10 11:58:34 -05:00
Jeremy Stretch
1552681e6b Don't use responsive tables for device components 2020-11-10 11:53:40 -05:00
Jeremy Stretch
2377e04911 Fix up device component tab navigation & return URLs 2020-11-10 11:46:04 -05:00
Jeremy Stretch
aac930237a Fix permissions for REST API status view 2020-11-10 11:16:35 -05:00
Jeremy Stretch
97c588a8ba Clean up service form 2020-11-10 11:05:29 -05:00
Jeremy Stretch
3d6bf1e0f8 Clean up CustomField regex validation 2020-11-10 10:21:18 -05:00
Jeremy Stretch
b8a7870750 Fix bulk editing of device components 2020-11-10 09:22:50 -05:00
Jeremy Stretch
cb79a5a56d Remove old tables.py 2020-11-10 09:05:42 -05:00
Jeremy Stretch
0567f0d190 Merge branch 'develop' into develop-2.10 2020-11-09 20:58:59 -05:00
Jeremy Stretch
340e665817 Post release version bump 2020-11-09 20:57:35 -05:00
Jeremy Stretch
a6f0154803 Release v2.9.9 2020-11-09 20:51:35 -05:00
Jeremy Stretch
652e128cfd Merge pull request #5317 from netbox-community/2755-material-design-icons
Closes #2755: Switch to Material Design icons
2020-11-09 20:46:23 -05:00
Jeremy Stretch
9b2dc89c6c Closes #5327: Be more strict when capturing anticipated ImportError exceptions 2020-11-09 16:49:05 -05:00
Jeremy Stretch
dc7da4f0f6 Fixes #5316: Dry running scripts should not trigger webhooks 2020-11-09 16:22:45 -05:00
Jeremy Stretch
ab33b3aa84 Fixes #5328: Fix CreatedUpdatedFilterTest when running in non-UTC timezone 2020-11-09 16:04:09 -05:00
Jeremy Stretch
bf836d4d46 Fixes #5331: Fix filtering of sites by null region 2020-11-09 15:58:59 -05:00
Jeremy Stretch
c3f2cc7648 Correct buttons() method in dummy plugin template content 2020-11-09 14:31:53 -05:00
Jeremy Stretch
d2c4c7fb10 Closes #5324: Add missing template extension tags for plugins for VM interface view 2020-11-09 14:19:22 -05:00
Jeremy Stretch
39f4dea051 Merge pull request #5326 from 991jo/patch-1
Fixed a UI Bug where there is no whitespace after grouped custom links.
2020-11-09 12:54:08 -05:00
991jo
7cf4095983 Fixed a UI Bug where there is no whitespace after grouped custom links.
See #5325 for details
2020-11-09 07:56:26 +01:00
John Anderson
0d27abc6fc fixes #5314 - Fix config context rendering when multiple tags are assgined to an object 2020-11-06 16:47:07 -05:00
Jeremy Stretch
62b0a68bef Don't use chevron-right icon for hierarchy 2020-11-06 16:26:16 -05:00
Jeremy Stretch
5db14f9410 Tweak CSS 2020-11-06 16:09:55 -05:00
Jeremy Stretch
6542a326c1 Clean up stray Font Awesome icons 2020-11-06 15:06:45 -05:00
Jeremy Stretch
72dace29b7 Replace Glyphicons with Material Design 2020-11-06 14:49:14 -05:00
Jeremy Stretch
867f308027 Replace Font Awesome icons with Material Design 2020-11-06 14:33:20 -05:00
Jeremy Stretch
d388472773 Add Material Design icons 2020-11-06 12:13:00 -05:00
Jeremy Stretch
39b322ae6b Closes #5313: Denote official support for Python 3.8 2020-11-05 16:08:33 -05:00
Jeremy Stretch
23cce55246 Merge branch 'develop' into develop-2.10 2020-11-05 15:33:07 -05:00
Jeremy Stretch
b39019cec9 Clarify cache invalidation instructions 2020-11-05 14:41:06 -05:00
Jeremy Stretch
f2cba78549 Closes #5310: Link to rack groups within rack list table 2020-11-05 14:24:22 -05:00
Jeremy Stretch
f845eeb117 Closes #5304: Return server error messages as JSON when handling REST API requests 2020-11-04 17:11:57 -05:00
Jeremy Stretch
c53990c739 Closes #5307: Add a region selector for every site form field 2020-11-04 15:27:41 -05:00
Jeremy Stretch
7d52b4d9a5 Changelog for #5271 2020-11-04 13:23:56 -05:00
Jeremy Stretch
a69d61c124 Merge pull request #5308 from netbox-community/5271-DynamicModelChoiceMixin-initial
Fixes #5271: Extend DynamicModelChoiceMixin to accept initial field values implied by child fields
2020-11-04 13:20:30 -05:00
Jeremy Stretch
798220cf9a Fix filter reference 2020-11-04 13:05:24 -05:00
Jeremy Stretch
7598b891c1 Add initial_params to all forms 2020-11-04 11:09:13 -05:00
Jeremy Stretch
1f0b1dd10e Add initial_params to DynamicModelChoiceMixin 2020-11-04 10:15:15 -05:00
Jeremy Stretch
f0bac741cc Move to lock-threads app 2020-11-04 08:58:20 -05:00
Jeremy Stretch
bd62611117 Skip signal processing when loading cables from fixtures 2020-11-03 13:32:05 -05:00
Jeremy Stretch
2bb79a2773 Add missing bulk update test data 2020-11-02 16:56:04 -05:00
Jeremy Stretch
9fae11a42f Add present_in_vrf filters 2020-11-02 15:39:46 -05:00
Jeremy Stretch
700aa1ad5c Add import/export RTs to VRFTable 2020-11-02 14:55:05 -05:00
Jeremy Stretch
9a9babfc35 Remove extraneous prefetch_related() calls from object list views 2020-10-30 16:54:41 -04:00
Jeremy Stretch
97c8306eeb Drop add_prefetch from BaseTable; improve dynamic prefetching for table querysets 2020-10-30 16:15:16 -04:00
Jeremy Stretch
8d02303515 Optimize cable termination tables 2020-10-30 13:57:17 -04:00
Jeremy Stretch
70e966923a Add CablePath.get_path() to prefetch path nodes 2020-10-30 13:32:10 -04:00
Jeremy Stretch
f82e2a8d20 Fixed up device & device type tab navigation 2020-10-30 11:41:51 -04:00
Jeremy Stretch
2424f684b9 Post-release version bump 2020-10-30 10:41:05 -04:00
Jeremy Stretch
fcb5e6ae1c Merge branch 'develop' into develop-2.10 2020-10-30 10:38:05 -04:00
Jeremy Stretch
cbd155406b Release v2.9.8 2020-10-30 10:11:13 -04:00
Jeremy Stretch
70cc368225 Changelog for #4559, #5282, #5285 2020-10-30 09:14:52 -04:00
Jeremy Stretch
6d28eae5dc Merge pull request #5290 from nniehoff/5282-ldap-logging
Fixing #5282 - moving logging configuration from to configuration.py
2020-10-30 09:11:12 -04:00
Jeremy Stretch
ca932ecadc Merge pull request #5286 from netbox-community/5285-plugins-api-app_name
Fixes #5285: Include plugin API endpoints in root view without needing app_name set
2020-10-30 09:10:12 -04:00
Jeremy Stretch
04d763d814 Merge pull request #5266 from netbox-community/4559-config-context-rendering
4559 config context rendering
2020-10-30 09:09:40 -04:00
Nick Niehoff
97ea15e978 Removing logfile variable 2020-10-30 06:32:12 -06:00
John Anderson
28c17f33ab move get_queryset() to common mixin 2020-10-30 02:56:43 -04:00
John Anderson
db87a69488 convert region fields to f-string 2020-10-30 02:56:26 -04:00
Nick Niehoff
2b154dcfdf Fixing #5282 - moving logging configuration from authentication.py to configuration.py 2020-10-29 15:14:52 -06:00
Jeremy Stretch
1000039c74 Merge pull request #5277 from systeembeheerder/develop
Update upgrading.md
2020-10-29 17:11:04 -04:00
Jeremy Stretch
2ccc543542 Document the available template blocks within base.html 2020-10-29 17:10:19 -04:00
systeembeheerder
8ac2ee7b49 Update upgrading.md
make destination path for cp media absolute
2020-10-29 22:05:19 +01:00
Jeremy Stretch
db3fd27da2 Merge pull request #5283 from markkuleinio/develop
Fix #5265: Change systemctl status outputs to venv era
2020-10-29 16:49:34 -04:00
Jeremy Stretch
6edd65c4ed Merge pull request #5288 from netbox-community/5252-table-config
Closes #5252: Introduce an API endpoint for writing user preferences
2020-10-29 16:26:45 -04:00
Jeremy Stretch
aad32c4866 Add tests for UserConfig API endpoint 2020-10-29 16:05:59 -04:00
Jeremy Stretch
00e102fb0c Fix resetting column preferences 2020-10-29 14:42:40 -04:00
Jeremy Stretch
a43361170c Fix overwriting of existing preferences 2020-10-29 14:15:38 -04:00
Jeremy Stretch
acd4054e79 Customize device component tables for user 2020-10-29 14:07:36 -04:00
Jeremy Stretch
ffdb727e1c Update BaseTable to accept user instance directly 2020-10-29 14:03:08 -04:00
Jeremy Stretch
cf328ca51e Fix interfaces table header 2020-10-29 13:38:07 -04:00
Jeremy Stretch
b871d2a8c4 Fixes #5285: Include plugin API endpoints in root view without needing app_name set 2020-10-29 12:30:10 -04:00
Markku Leinio
02f348b15f Fix typo in weekday 2020-10-28 21:06:20 +02:00
Markku Leinio
4672f16fda Fix #5265: Change systemctl status outputs to venv era 2020-10-28 21:03:35 +02:00
systeembeheerder
6404657f99 Update upgrading.md
confirm 5275; use absolute paths
2020-10-27 16:07:38 +01:00
Jeremy Stretch
2f3557c18f Fixes #5273: Fix exception when validating a new permission with no models selected 2020-10-27 10:01:49 -04:00
John Anderson
047f03a58c clean up imports 2020-10-25 19:00:56 -04:00
John Anderson
606b015314 Merge branch 'develop' into 4559-config-context-rendering 2020-10-25 18:47:40 -04:00
John Anderson
478d82196a rebase develop 2020-10-25 18:20:21 -04:00
John Anderson
034ff2fb3f #3672 changelog 2020-10-25 18:19:20 -04:00
John Anderson
9bfb89fffd fixes #3672 - update django-cacheops to 5.1.0 2020-10-25 18:19:20 -04:00
John Anderson
26ff33c41a pep8 2020-10-25 17:56:42 -04:00
John Anderson
9e84e3b83b added tests 2020-10-25 16:49:18 -04:00
Jeremy Stretch
ce2210b7bc Introduce table_config_form template tag to simplify form generation 2020-10-23 16:47:53 -04:00
John Anderson
82f5d0070e account for null value annotations 2020-10-23 10:56:02 -04:00
John Anderson
22d2289ed2 add support for regions and vms 2020-10-23 01:18:04 -04:00
Jeremy Stretch
ff3d0b72b9 Tweak the table config form for generic use 2020-10-21 16:06:37 -04:00
Jeremy Stretch
4de7fcd758 Convert table config updates to use REST API 2020-10-21 14:52:50 -04:00
Jeremy Stretch
2845dd488e Add a REST API endpoint for updating user preferences 2020-10-21 09:05:33 -04:00
Jeremy Stretch
2e558ba031 Closes #5139: Omit utilization statistics from RIR list 2020-10-20 13:16:35 -04:00
John Anderson
3ba18633de initial work on config context performance improvements 2020-10-20 01:07:22 -04:00
Jeremy Stretch
9cbfc0ce9a Merge pull request #5251 from netbox-community/4786-device-component-tables
#4786: Convert device component templates to tables
2020-10-19 15:01:40 -04:00
Jeremy Stretch
55a2e0299c Standardize device component table columns 2020-10-19 13:55:02 -04:00
Jeremy Stretch
e304f105c9 Cleanup stray output 2020-10-16 17:03:14 -04:00
Jeremy Stretch
502b66367c Convert VM interfaces list to table 2020-10-16 17:01:55 -04:00
Jeremy Stretch
00caa368c5 Remove interface IPs toggle 2020-10-16 16:40:21 -04:00
Jeremy Stretch
a969b81e63 Change color for edit button 2020-10-16 16:36:12 -04:00
Jeremy Stretch
0a67926012 Fix up missing table columns 2020-10-16 16:33:08 -04:00
Jeremy Stretch
51821818e0 Add cable trace buttons 2020-10-16 16:14:05 -04:00
Jeremy Stretch
82c6fb6e19 Convert device inventory items list to table 2020-10-16 16:00:25 -04:00
Jeremy Stretch
7c1316619b Convert device device bays list to table 2020-10-16 15:51:46 -04:00
Jeremy Stretch
2146c38748 Convert device interfaces list to table 2020-10-16 15:42:48 -04:00
Jeremy Stretch
e3f98a011c Convert device rear ports list to table 2020-10-16 15:33:39 -04:00
Jeremy Stretch
68060cf9e9 Convert device front ports list to table 2020-10-16 15:28:28 -04:00
Jeremy Stretch
eed2e4a15b Convert device power outlets list to table 2020-10-16 15:16:36 -04:00
Jeremy Stretch
3a47e0e2ed Convert device power ports list to table 2020-10-16 15:09:23 -04:00
Jeremy Stretch
60c30b92ba Convert device console server ports list to table 2020-10-16 15:01:16 -04:00
Jeremy Stretch
99352a5d30 Convert device console ports list to table 2020-10-16 14:39:15 -04:00
Jeremy Stretch
35273c7bfe Add connection column for path endpoints 2020-10-16 11:41:24 -04:00
Jeremy Stretch
769b240164 Extend device component tables to include cable peer 2020-10-16 11:11:41 -04:00
Jeremy Stretch
823aa6b712 Add compatible types for PowerFeed 2020-10-16 11:05:42 -04:00
Jeremy Stretch
73bf3b9498 Reorganize DCIM tables 2020-10-16 10:39:13 -04:00
Jeremy Stretch
23d56a5758 Note REST API change for #4967 2020-10-16 10:04:33 -04:00
Daniel Sheppard
086b1d85c7 Update Change Notes 2020-10-15 21:23:32 -05:00
Daniel Sheppard
32274dec86 Closes: #4967 - Adds Tenancy to Aggregate model 2020-10-15 20:40:19 -05:00
Jeremy Stretch
dde52309d2 Fixes #5243: Redirect user to appropriate tab after modifying device components 2020-10-15 16:55:20 -04:00
Jeremy Stretch
c9c8d337a0 Closes #5011: Standardized name field lengths across all models 2020-10-15 15:37:34 -04:00
Jeremy Stretch
8781cf1c57 Closes #609: Add min/max value and regex validation for custom fields 2020-10-15 15:06:01 -04:00
John Anderson
87c13a876b fixes #5113 - incorrect caching of permission object assignments to user groups in the admin panel 2020-10-14 20:10:21 -04:00
Jeremy Stretch
e7d26ca5dc Move Cable and CablePath to cables.py 2020-10-14 16:54:30 -04:00
Jeremy Stretch
143f3cc27c #4711: Rename CustomField.obj_type to content_types 2020-10-14 15:26:46 -04:00
Jeremy Stretch
0d01a3fce8 Add schema migrations to plugins installation doc 2020-10-14 10:42:31 -04:00
Jeremy Stretch
defade84e4 Fix plugin name resolution 2020-10-13 17:18:13 -04:00
Jeremy Stretch
80c142ab7c Closes #4918: Add a REST API endpoint which returns NetBox's current operational status 2020-10-13 16:57:45 -04:00
Jeremy Stretch
c0c5f52ed9 Reorganize REST API components under netbox app 2020-10-13 15:57:21 -04:00
Jeremy Stretch
97ac6851d0 Merge branch 'develop' into develop-2.10 2020-10-12 09:51:54 -04:00
Jeremy Stretch
d4b96a5a27 Post-release version bump 2020-10-12 09:51:11 -04:00
Jeremy Stretch
1aabb2ed5d Release v2.9.7 2020-10-12 09:39:39 -04:00
Jeremy Stretch
f53810ebb2 Fixes #5231: Fix KeyError exception when viewing object with custom link and debugging is disabled 2020-10-09 15:53:45 -04:00
Jeremy Stretch
d61d62088f Ditch hard-coded filtering of ContentTypes API endpoint 2020-10-09 15:11:56 -04:00
Jeremy Stretch
3df3706f27 Closes #5190: Add a REST API endpoint for content types 2020-10-09 15:08:29 -04:00
Jeremy Stretch
66c4597525 Add RouteTarget to __all__ 2020-10-09 14:38:21 -04:00
Jeremy Stretch
30778a9c40 Closes #5225: CircuitTermination port_speed is now optional 2020-10-09 14:06:24 -04:00
Jeremy Stretch
96650b0216 Merge branch 'develop' into develop-2.10 2020-10-09 13:52:16 -04:00
Jeremy Stretch
7545599493 Post-release version bump 2020-10-09 13:31:28 -04:00
Jeremy Stretch
3047208e6a Release v2.9.6 2020-10-09 13:17:16 -04:00
Jeremy Stretch
a796e29c98 Fixes #5229: Fix AttributeError exception when LDAP authentication is enabled 2020-10-09 13:16:07 -04:00
Jeremy Stretch
5f0e04aebe Post-release version bump 2020-10-09 13:01:01 -04:00
Jeremy Stretch
918ca4fdcb Release v2.9.5 2020-10-09 12:57:14 -04:00
Jeremy Stretch
24e5dd0c78 Add scope warning to plugins development doc 2020-10-09 12:56:32 -04:00
Jeremy Stretch
f35715683e Closes #5202: Extend the available context data when rendering custom links 2020-10-09 12:36:09 -04:00
Jeremy Stretch
b5a65bc66c Fixes #5211: Add missing has_primary_ip filter for virtual machines 2020-10-09 11:46:16 -04:00
Jeremy Stretch
3a21f7ab26 Fixes #5226: Custom choice fields should be blank initially if no default choice has been designated 2020-10-09 11:34:50 -04:00
Jeremy Stretch
a2c012d2c4 Fixes #5224: Don't allow a rear port to have fewer positions than the number of mapped front ports 2020-10-08 16:24:08 -04:00
Jeremy Stretch
752b099d22 Exempt InventoryItem from queryset caching (MPTT) 2020-10-08 15:30:59 -04:00
Jeremy Stretch
6470613221 Merge pull request #5212 from netbox-community/4900-cable-paths
#4900: New model for cable paths
2020-10-08 15:15:40 -04:00
Jeremy Stretch
44caa402d0 Delete obsolete LoopDetected exception 2020-10-08 15:01:55 -04:00
Jeremy Stretch
a716ca705c Rewrite cablepath tests to create components within each test 2020-10-08 14:55:13 -04:00
Jeremy Stretch
75ddc63466 Handle split paths 2020-10-08 14:01:47 -04:00
Jeremy Stretch
0e41bc48b7 Add /trace API endpoints for CircuitTermination and PowerFeed 2020-10-08 13:55:29 -04:00
Daniel Sheppard
4896059162 Fixes: #5220 - Fix API patch request against IP-Address endpoint with null assigned_object_type 2020-10-08 12:50:29 -05:00
Jeremy Stretch
0c5efa243d Handle traces which split at a RearPort 2020-10-08 13:45:47 -04:00
Daniel Sheppard
eadecf3eda Fixes: #5221 - Fix bulk component creation over multiple VMs 2020-10-08 12:39:20 -05:00
Jeremy Stretch
29eebf9fbe Update REST API changes 2020-10-08 11:26:02 -04:00
Jeremy Stretch
ae1ceb26b9 Standardize cable/connection field ordering 2020-10-08 11:23:24 -04:00
Jeremy Stretch
55268c90c8 Replace connection_status with connected_endpoint_reachable on InterfaceConnectionSerializer 2020-10-08 11:15:09 -04:00
Jeremy Stretch
aa0ee2720b Add cable paths API detail view for pass-through ports 2020-10-08 10:32:17 -04:00
Jeremy Stretch
35759fdb70 Redo the cable trace UI (WIP) 2020-10-07 16:39:15 -04:00
Jeremy Stretch
39e4ab164e Fixes #5218: Raise validation error if a power port's allocated_draw exceeds its maximum_draw 2020-10-07 13:23:19 -04:00
Jeremy Stretch
5089df3ffd Fix error in OBJECTCHANGE_OBJECT table column template 2020-10-07 13:13:03 -04:00
Jeremy Stretch
9738257aa2 Fixes #5217: Prevent erroneous removal of prefetched GenericForeignKey data from tables 2020-10-07 13:09:08 -04:00
Jeremy Stretch
85439fd952 Fix PowerFeed display in cable traces 2020-10-07 11:33:47 -04:00
Jeremy Stretch
eaf8d95ce5 Clean up power utilization logic 2020-10-07 11:14:16 -04:00
Jeremy Stretch
f560693748 Rewrite trace_paths management command and call in upgrade.sh 2020-10-07 10:30:11 -04:00
Jeremy Stretch
6db3c65bcc Swap order of cabling migrations 2020-10-07 09:50:12 -04:00
Jeremy Stretch
693b32077a Update the netbox-discuss mailing list URL 2020-10-07 08:53:04 -04:00
Jeremy Stretch
c7c66626b6 Standardize 'cabled' and 'connected' filters; complete tests 2020-10-06 17:28:25 -04:00
Jeremy Stretch
44b842592a Restore total length count on trace view 2020-10-06 16:58:11 -04:00
Jeremy Stretch
2c9ae60dec Optimize path node representations 2020-10-06 16:34:03 -04:00
Jeremy Stretch
a072d40594 Update v2.10 changelog 2020-10-06 16:16:08 -04:00
Jeremy Stretch
a6e0ef8cd8 Clean up console/power/interface connections views 2020-10-06 16:15:18 -04:00
Jeremy Stretch
6b3a1998c8 Add test_is_connected to CircuitTerminationTestCase 2020-10-06 15:59:21 -04:00
Jeremy Stretch
534364a30f Improve model docstrings 2020-10-06 15:48:52 -04:00
Jeremy Stretch
52ec35b94f Correct serializer field lists 2020-10-06 15:27:40 -04:00
Jeremy Stretch
3870f5d246 Remove unused CablePathManager 2020-10-06 15:26:59 -04:00
Jeremy Stretch
23cde6d1b8 Include cable_peer on CableTermination serializers 2020-10-06 14:30:46 -04:00
Jeremy Stretch
c813ae4f04 Clean up power connection tables 2020-10-06 13:30:28 -04:00
Jeremy Stretch
d984dbd83b Extend device view to show local cable termination for all components 2020-10-06 13:08:41 -04:00
Jeremy Stretch
d59f0891e4 Cache peer termination on CableTerminations 2020-10-06 12:10:12 -04:00
Jeremy Stretch
6275c8c67d Prefetch path & destination for API views 2020-10-06 10:41:52 -04:00
Jeremy Stretch
ffdf5514ae Tweak component templates 2020-10-06 10:37:59 -04:00
Jeremy Stretch
56ee425227 Introduce PathContains lookup to allow filtering against objects in path directly 2020-10-06 09:41:45 -04:00
Jeremy Stretch
19430ddeb5 Extend cable trace view to show related paths 2020-10-05 16:03:30 -04:00
Jeremy Stretch
d5d6b0e856 Optimize path prefetching 2020-10-05 14:47:21 -04:00
Jeremy Stretch
32b8148da1 Standardize path endpoint templates 2020-10-05 13:23:55 -04:00
Jeremy Stretch
50aecd02f4 Fix up connection lists (pending additional work) 2020-10-05 12:05:29 -04:00
Jeremy Stretch
b2066bc4b7 Merge schema migrations 2020-10-05 11:47:24 -04:00
Jeremy Stretch
32aa2daea6 PowerFeedSerializer should subclass ConnectedEndpointSerializer 2020-10-05 11:39:17 -04:00
Jeremy Stretch
b846f631a4 Rename connection_status to connected_endpoint_reachable 2020-10-05 11:32:39 -04:00
Jeremy Stretch
3d34f1cdcb Rename CablePath.is_connected to is_active 2020-10-05 11:13:33 -04:00
Jeremy Stretch
13db22d392 Initial changelog notes for #4900 2020-10-05 11:07:03 -04:00
Jeremy Stretch
df73737128 Remove legacy connection_status fields 2020-10-05 10:47:41 -04:00
Jeremy Stretch
079c42291c Remove legacy connected endpoint fields 2020-10-05 09:56:46 -04:00
Jeremy Stretch
f8800b8303 Optimize console/power/interface connection lists 2020-10-02 21:44:16 -04:00
Jeremy Stretch
5737f6fca0 Cache each CablePath on its originating endpoint 2020-10-02 17:16:43 -04:00
Jeremy Stretch
8cb636bed2 Update console/power/interface connection tables 2020-10-02 15:10:49 -04:00
Jeremy Stretch
7ff247c57f Add trace view for PowerFeed 2020-10-02 14:57:50 -04:00
Jeremy Stretch
e9da84f91a Replace legacy trace() method 2020-10-02 14:54:16 -04:00
Jeremy Stretch
47ea75348c Changelog for #5197 2020-10-02 14:17:55 -04:00
Jeremy Stretch
cd9c425d9a Merge pull request #5208 from glennmatthews/gfm-issue-5197
5197: Limit main IPAddress view to a max of 10 duplicate addresses; add new duplicates view
2020-10-02 14:16:32 -04:00
Glenn Matthews
6612e0107e Limit main IPAddress view to a max of 10 duplicate addresses. Fixes #5197 2020-10-02 14:01:51 -04:00
Jeremy Stretch
ae0a481c64 Fixes #5206: Apply user pagination preferences to all paginated object lists 2020-10-02 13:54:57 -04:00
Jeremy Stretch
aa0d4c4145 Replace connection_status filter with is_connected 2020-10-02 12:25:31 -04:00
Jeremy Stretch
66355da04c CablePath.origin should be unique 2020-10-02 11:51:23 -04:00
Jeremy Stretch
e0abd7ef3e Remove dcim.tests.test_api.ConnectionTest 2020-10-02 11:45:42 -04:00
Jeremy Stretch
4fd1219814 Add tests for all PathEndpoint classes 2020-10-02 11:35:17 -04:00
Daniel Sheppard
1a43ef82d9 Fixes: #5201 - Fix bulk "all" operations on VLAN Groups 2020-10-02 09:59:16 -05:00
Jeremy Stretch
9f242216e6 Rename test elements to be more readable 2020-10-02 10:14:52 -04:00
Jeremy Stretch
9d10c57dc9 Remove legacy CablePathTestCase 2020-10-02 09:55:28 -04:00
Jeremy Stretch
d50a0d94be Add tests for multiple pass-through breakouts 2020-10-02 09:54:12 -04:00
Jeremy Stretch
3b0a75edf8 Add test for updated paths on cable status change 2020-10-01 17:25:44 -04:00
Jeremy Stretch
0d07b0346b Add test for connecting cables out of order 2020-10-01 16:53:13 -04:00
Jeremy Stretch
c974c5687c Capture path end-to-end status in CablePath 2020-10-01 16:42:57 -04:00
Jeremy Stretch
610420c020 Drop support for split paths 2020-10-01 14:24:34 -04:00
Jeremy Stretch
cd398b15d8 retrace_paths should ignore case in model names 2020-10-01 13:10:08 -04:00
Jeremy Stretch
8abc05544c CircuitTermination and PowerFeed are path endpoints 2020-10-01 13:05:00 -04:00
Jeremy Stretch
105c0fd3d2 Introduce retrace_paths management command 2020-10-01 12:18:42 -04:00
Jeremy Stretch
19a3a4d4ef Add GenericRelation to originating cable paths on PathEndpoint 2020-10-01 11:30:03 -04:00
Daniel Sheppard
f2bc824a8e Fixes: #5199 - Change default logging for LDAP to INFO 2020-10-01 09:27:17 -05:00
Daniel Sheppard
23a9cb2fad Fixes: #5199 - Change default logging for LDAP to INFO 2020-10-01 09:25:56 -05:00
Jeremy Stretch
46df5a97b2 Remove extraneous test objects 2020-09-30 17:12:38 -04:00
Jeremy Stretch
e53ae1d584 Extend cable path tests 2020-09-30 17:10:22 -04:00
Jeremy Stretch
cd71799373 Ignore the position stack when traversing single-position rear ports 2020-09-30 17:09:39 -04:00
Jeremy Stretch
319329e2b2 Extend cable path tests 2020-09-30 16:17:22 -04:00
Jeremy Stretch
985197788b Add initial tests 2020-09-30 15:15:27 -04:00
Jeremy Stretch
587e6fcf72 Initial work on cable paths (WIP) 2020-09-30 15:13:06 -04:00
Daniel Sheppard
22a80c5558 Update pre-commit script to support virtual environment within IDE 2020-09-30 08:28:48 -05:00
Daniel Sheppard
14ef7fa869 Update version-2.9.md 2020-09-29 19:55:59 -05:00
Daniel Sheppard
068803dc86 Update 2.9 Release notes with 4523 2020-09-29 19:55:40 -05:00
Daniel Sheppard
ee7f43abe1 Fixes #4523 - Add site vlan to certain scenarios where sites are the same 2020-09-29 14:45:02 -05:00
Jeremy Stretch
015e25c618 Merge pull request #5185 from kobayashi/5184-power-util
Fixes #5184: Fix missing Power Utilization
2020-09-28 09:17:49 -04:00
kobayashi
5c8694ad65 Fixes #5184: Fix missing Power Utilization 2020-09-27 16:33:47 -04:00
Jeremy Stretch
12e2537222 General cleanup of tables 2020-09-25 14:18:29 -04:00
Jeremy Stretch
28f0da0bc1 Introduce LinkedCountColumn to standardize approach to counting related items in tables 2020-09-25 12:42:17 -04:00
Jeremy Stretch
18a8a91d57 Introduce ChoiceFieldColumn to replace template columns 2020-09-25 10:52:14 -04:00
Jeremy Stretch
1b55285167 Relocate CSS classes for ChoiceFields from model to ChoiceSet 2020-09-24 16:35:53 -04:00
Jeremy Stretch
bddd010310 Annotate REST API changes fro #259 2020-09-24 14:45:14 -04:00
Jeremy Stretch
ee63cbe7e9 Merge pull request #5178 from netbox-community/259-route-targets
#259: Route target support
2020-09-24 14:36:26 -04:00
Jeremy Stretch
cca2173886 Documentation for #259 2020-09-24 14:18:08 -04:00
Jeremy Stretch
47fd9cab1c Add tests for route targets; extend VRF tests 2020-09-24 13:51:17 -04:00
Jeremy Stretch
f684d07c61 Model import/export route targets on VRFs 2020-09-24 12:09:28 -04:00
Jeremy Stretch
dfb5a06d9d Introduce the RouteTarget model 2020-09-24 11:25:52 -04:00
Jeremy Stretch
ff42c89cc4 Closes #5177: Note permissions required for running reports and custom scripts 2020-09-24 10:32:15 -04:00
Jeremy Stretch
856500b014 Fixes #5174: Ensure consistent alignment of rack elevations 2020-09-24 10:11:34 -04:00
Jeremy Stretch
380f59ac0b Fixes #5175: Fix toggling of rack elevation order 2020-09-24 10:01:02 -04:00
Jeremy Stretch
9b16d6df2e Merge v2.9.4 release 2020-09-23 16:11:00 -04:00
Jeremy Stretch
d30874e0de Post-release version bump 2020-09-23 15:39:36 -04:00
Jeremy Stretch
31fcad4dbb Release v2.9.4 2020-09-23 15:24:59 -04:00
Jeremy Stretch
e2a840ff0b Closes #5053: Mention local_requirements.txt when an ImportError occurs 2020-09-23 15:19:42 -04:00
Jeremy Stretch
0a40418614 Fixes #5066: Update view_reportresult to view_report permission 2020-09-23 13:40:15 -04:00
Jeremy Stretch
90dbe9bf60 Closes #5171: Introduce the RQ_DEFAULT_TIMEOUT configuration parameter 2020-09-23 13:28:05 -04:00
Jeremy Stretch
09dc271eec Fix reference to update_data 2020-09-23 12:20:45 -04:00
Jeremy Stretch
1f0a4cc548 Closes #5075: Include a VLAN membership view for VM interfaces 2020-09-23 11:48:32 -04:00
Jeremy Stretch
c0b94e4e8e Fixes #5137: Correct permission for viewing report results is extras.view_reportresult 2020-09-23 10:16:22 -04:00
Jeremy Stretch
e404f4efd2 Closes #5164: Show total rack count per rack group under site view 2020-09-23 09:46:52 -04:00
Jeremy Stretch
116b20cb9f Fix ImageAttachmentTestCase 2020-09-22 16:26:08 -04:00
Jeremy Stretch
afa1449f89 Fixes #5167: Support filtering ObjectChanges by multiple users 2020-09-22 16:17:39 -04:00
Jeremy Stretch
0c3fafdfef Closes #4897: Allow filtering by content type identified as <app>.<model> string 2020-09-22 16:06:38 -04:00
Jeremy Stretch
5ba4252388 Changelog for #4882 2020-09-22 14:49:49 -04:00
Jeremy Stretch
6195a34db5 Merge pull request #5166 from netbox-community/4882-api-bulk-update
#4882: Support bulk updates via REST API
2020-09-22 14:13:05 -04:00
Jeremy Stretch
c3eb2eb601 Add documentation for API bulk updates 2020-09-22 14:02:31 -04:00
Jeremy Stretch
38ed612cb9 Add test for API bulk updates 2020-09-22 13:50:55 -04:00
Jeremy Stretch
5677fab2f9 Support bulk operations for both PUT and PATCH 2020-09-22 11:55:46 -04:00
Jeremy Stretch
a998c826a8 Introduce BulkUpdateModelMixin; rename BulkDeleteSerializer 2020-09-22 11:50:43 -04:00
Jeremy Stretch
935d239eab Changelog for #3436 2020-09-22 10:36:16 -04:00
Jeremy Stretch
961a491ea4 Merge pull request #5163 from netbox-community/3436-api-bulk-delete
#3436: Support for bulk deletion via REST API
2020-09-22 10:29:41 -04:00
Jeremy Stretch
54a4f84708 Add REST API documentation for bulk object deletion 2020-09-22 10:18:15 -04:00
Jeremy Stretch
c1b57af771 Monkey-patch DRF to treat bulk_destroy as a built-in operation 2020-09-22 10:06:13 -04:00
Jeremy Stretch
2b689239ae Merge pull request #5151 from netbox-community/1503-secret-assignment
#1503: Extend secrets assignment to virtual machines
2020-09-22 09:26:57 -04:00
Jeremy Stretch
d44c2ba8fe Merge branch 'develop-2.10' into 1503-secret-assignment 2020-09-22 09:24:03 -04:00
Jeremy Stretch
d540728f50 Closes #5149: Add rack group field to device edit form 2020-09-21 15:26:32 -04:00
Jeremy Stretch
12402f4c30 Fixes #5156: Add missing "add" button to rack reservations list 2020-09-21 15:14:44 -04:00
Jeremy Stretch
3e1961b435 Changelog for #2179 2020-09-21 14:49:39 -04:00
Jeremy Stretch
4c23b59090 Merge pull request #5161 from netbox-community/2179-service-port-arrays
#2179: Support multiple port numbers for services
2020-09-21 14:47:36 -04:00
Jeremy Stretch
3a90366538 Fix filtering services by port number 2020-09-21 14:36:58 -04:00
Jeremy Stretch
b85990daa6 Fix return URL when editing a service 2020-09-21 13:34:39 -04:00
Jeremy Stretch
e77f1bdd85 Introduce array_to_string() utility function; add port_list property to Service 2020-09-21 13:31:38 -04:00
Jeremy Stretch
f97d8963f2 Initial work on #2179: Allow a service to have multiple ports 2020-09-21 13:21:41 -04:00
Jeremy Stretch
975e7e60ff Changelog for #1503 2020-09-21 11:12:17 -04:00
Jeremy Stretch
c986321402 Fix "add secret" link for VMs 2020-09-21 10:54:04 -04:00
Jeremy Stretch
0b33c53f47 Update secrets API, views 2020-09-18 16:58:51 -04:00
Jeremy Stretch
b2a14d4654 Extend secret filters 2020-09-18 16:35:36 -04:00
Jeremy Stretch
64adbf8769 Fix migrations to ensure secret assigned_object is required 2020-09-18 16:00:21 -04:00
Jeremy Stretch
43f3e682c5 Support assignment of secrets to virtual machines 2020-09-18 15:39:41 -04:00
Jeremy Stretch
ec095e58b7 #1503: Initial work on generic secret assignments (WIP) 2020-09-18 14:51:09 -04:00
Jeremy Stretch
0cc2a6b2cf Closes #5003: CSV import now accepts slug values for choice fields 2020-09-18 13:03:38 -04:00
Jeremy Stretch
70ec5b9f37 Annotate REST API changes in release notes 2020-09-18 11:51:38 -04:00
Jeremy Stretch
584b076886 Closes #4956: Include inventory items on primary device view 2020-09-18 11:35:15 -04:00
Jeremy Stretch
52dc80209c Closes #1692: Allow assigment of inventory items to parent items in web UI 2020-09-18 11:05:31 -04:00
Jeremy Stretch
230e7bbe34 Closes #1846: Enable MPTT for InventoryItem hierarchy 2020-09-18 10:18:03 -04:00
Jeremy Stretch
0030fe1779 Fixes #5146: Add custom fields support for cables, power panels, rack reservations, and virtual chassis 2020-09-17 14:22:14 -04:00
Jeremy Stretch
91eca8cac9 Changelog for #4878 2020-09-17 13:25:18 -04:00
Jeremy Stretch
dbfb9b2cee Merge pull request #5145 from netbox-community/4878-custom-fields
4878 custom fields
2020-09-17 13:19:05 -04:00
Jeremy Stretch
61cf903028 Clean up CustomField admin form 2020-09-17 12:43:08 -04:00
Jeremy Stretch
3d2f6c0703 Simplify form field for boolean CustomFields 2020-09-17 12:26:02 -04:00
Jeremy Stretch
4ecd3d23f7 Disable bulk deletion of CustomFields in admin UI 2020-09-17 12:14:02 -04:00
Jeremy Stretch
2d56a658b3 Clean up stale data when a custom field is changed/deleted 2020-09-16 17:03:31 -04:00
Jeremy Stretch
2bc524a2ee Standardize usage of BooleanColumn 2020-09-16 14:25:07 -04:00
Jeremy Stretch
43f1fbf5b3 Fixes #5136: Fix exception when bulk editing interface 802.1Q mode 2020-09-16 13:07:55 -04:00
Jeremy Stretch
e983f44fd3 Closes #5128: Increase maximum rear port positions from 64 to 1024 2020-09-16 12:53:11 -04:00
Jeremy Stretch
4d9da4a1f8 Closes #5134: Display full hierarchy in breadcrumbs for sites/racks 2020-09-16 12:44:49 -04:00
Jeremy Stretch
9d30712fb2 Changelog for #5133 (fixed in #5105) 2020-09-16 11:20:00 -04:00
Jeremy Stretch
03b207d154 Fixes #5105: Validation should fail when reassigning a primary IP from device to VM 2020-09-16 11:10:30 -04:00
Jeremy Stretch
a743102567 Fix serialization of custom_fields for change logging 2020-09-15 15:53:59 -04:00
Jeremy Stretch
eba2ea06ff Add test for bulk API deletions 2020-09-15 14:36:38 -04:00
Jeremy Stretch
6694ec78bc Implement support for bulk deletion of objects via a single REST API request 2020-09-15 13:36:36 -04:00
Jeremy Stretch
df6ad680ce Closes #1755: Toggle order in which rack elevations are displayed 2020-09-14 14:22:21 -04:00
Jeremy Stretch
b1b63513e7 Changelog for #5108 2020-09-14 10:41:04 -04:00
Jeremy Stretch
22e30b93d5 Merge pull request #5126 from netbox-community/5108-report-management-command-fix
fixes #5108 - correct the runreport management command to work with JobResult model
2020-09-14 10:39:33 -04:00
John Anderson
c5e82a3895 fixes #5108 - correct the runreport management command to work with JobResults model 2020-09-10 17:43:41 -04:00
Jeremy Stretch
4466458076 Fixes #5118: Specifying an empty list of tags should clear assigned tags (REST API) 2020-09-09 13:43:10 -04:00
Jeremy Stretch
47a6fc19ca Fixes #5109: Fix representation of custom choice field values for webhook data 2020-09-09 11:47:21 -04:00
Jeremy Stretch
c891f43b14 Fixes #5050: Fix potential failure on 0016_replicate_interfaces schema migration from old release 2020-09-09 10:29:17 -04:00
Jeremy Stretch
1509650462 Closes #5107: Add note about dropping backward compatibility for old REDIS configuration format 2020-09-09 10:00:50 -04:00
Jeremy Stretch
695e9ec5d7 Fixes #5111: Allow use of tuples when specifying ObjectVar query_params 2020-09-09 09:52:57 -04:00
Jeremy Stretch
c5ab89d71e Merge branch 'develop-2.10' into 4878-custom-fields 2020-09-04 16:14:06 -04:00
Jeremy Stretch
08c492f1f4 Merge develop into develop-2.10 2020-09-04 16:09:05 -04:00
Jeremy Stretch
0c8d45f679 Post-release version bump 2020-09-04 15:57:28 -04:00
Jeremy Stretch
08b9eedcec Correct changelog for #5095 2020-09-04 15:46:39 -04:00
Jeremy Stretch
5f9e687c9c Release v2.9.3 2020-09-04 15:45:23 -04:00
Jeremy Stretch
f1877fcea9 Closes #5048: Show the device/VM name when editing a component 2020-09-04 15:10:34 -04:00
Jeremy Stretch
78d104e60c Fixes #5046: Disabled plugin menu items are no longer clickable 2020-09-04 14:13:35 -04:00
Jeremy Stretch
dd0185816c Changelog for #4977, #5095 2020-09-04 13:57:29 -04:00
Jeremy Stretch
83eede8bc5 Merge pull request #5071 from n0emis/redirect-when-logged-in
Redirect users away from /login, if they are already logged in
2020-09-04 13:53:51 -04:00
Jeremy Stretch
b22d4cb9ca Merge pull request #5097 from jeremystretch/5095-vlan-prefixes
Fixes #5095: Fix display of assigned prefixes in VLANs list
2020-09-03 11:47:03 -04:00
Jeremy Stretch
de081d0205 Fixes #5095: Fix display of assigned prefixes in VLANs list 2020-09-03 11:28:25 -04:00
Simeon Keske
f92569d468 move redirect code to own function 2020-09-02 22:33:39 +02:00
Jeremy Stretch
bbbfc27593 Fixes #5072: Add REST API filters for image attachments 2020-09-02 16:10:07 -04:00
Jeremy Stretch
d289b26034 Fixes #5089: Redirect to device view after editing component 2020-09-02 13:45:15 -04:00
Jeremy Stretch
babdc1db38 Link to console/power ports in connection views 2020-09-02 13:33:59 -04:00
Jeremy Stretch
b559c827d2 Fixes #5091: Avoid KeyError when handling invalid table preferences 2020-09-02 13:30:19 -04:00
Jeremy Stretch
268aa755c4 Closes #5080: Add 8P6C, 8P4C, 8P2C port types 2020-09-02 10:21:22 -04:00
Jeremy Stretch
5d7935c855 Fixes #5090: Fix status display for console/power/interface connections 2020-09-01 16:28:11 -04:00
Jeremy Stretch
6305a35a4f Fixes #5085: Fix ordering by assignment in IP addresses table 2020-09-01 15:18:47 -04:00
Jeremy Stretch
a0103036e4 Fixes #5087: Restore label field when editing console server ports, power ports, and power outlets 2020-09-01 13:59:50 -04:00
Jeremy Stretch
b3b7e08c50 Closes #5076: Specify pip3 2020-09-01 10:24:17 -04:00
Jeremy Stretch
7dbeaf7a01 Fixes #5078: Fix assignment of existing IP addresses to interfaces via web UI 2020-09-01 10:19:28 -04:00
Jeremy Stretch
967073eaaf Fixes #5081: Fix exception during webhook processing with custom select field 2020-09-01 09:54:45 -04:00
Jeremy Stretch
473d76c9d1 Fixes #5074: Fix inclusion of VC member interfaces when viewing VC master 2020-08-31 15:34:40 -04:00
Jeremy Stretch
5bff50cade Fixes #5063: Fix "add device" link in rack elevations for opposite side of half-depth devices 2020-08-31 15:26:00 -04:00
Simeon Keske
bfcbd9da6c Redirect users away from /login, if they are already logged in 2020-08-30 01:44:27 +02:00
Jeremy Stretch
2435c177f5 Post-release version bump 2020-08-27 14:15:09 -04:00
Jeremy Stretch
f3e4911c68 Release v2.9.2 2020-08-27 14:03:51 -04:00
Jeremy Stretch
e8e4ff4111 Closes #5056: Add interface and parent columns to IP address list 2020-08-27 13:46:31 -04:00
Jeremy Stretch
523c32b8af Fixes #5061: Allow adding/removing tags when bulk editing virtual machine interfaces 2020-08-27 13:26:41 -04:00
Jeremy Stretch
5cdccb47f4 Fixes #5060: Fix validation when bulk-importing child devices 2020-08-27 11:27:17 -04:00
Jeremy Stretch
fa73bf8e87 Closes #5505: Add tags column to device/VM component list tables 2020-08-27 09:43:20 -04:00
Jeremy Stretch
5fe4e6cc96 Fixes #5058: Correct URL for front rack elevation images when using external storage 2020-08-27 09:26:56 -04:00
Jeremy Stretch
f23900fc8c Fixes #5059: Fix inclusion of checkboxes for interfaces in virtual machine view 2020-08-27 09:22:53 -04:00
Jeremy Stretch
53e09a924c Restore and rename CustomChoiceFieldInspector 2020-08-26 15:04:22 -04:00
Jeremy Stretch
bde25e69f8 Add CustomFieldsDataFieldInspector for OpenAPI spec 2020-08-26 14:36:45 -04:00
Jeremy Stretch
d2b7eb161c Cache CustomField assignments for API queries 2020-08-25 16:44:59 -04:00
Jeremy Stretch
378c0ac259 Fix filtering by custom field value 2020-08-25 16:21:54 -04:00
Jeremy Stretch
a9086b0679 Fix import test 2020-08-25 15:31:01 -04:00
Jeremy Stretch
d0f1c733e7 Replace CustomFieldsSerializer with CustomFieldsDataField 2020-08-25 15:22:32 -04:00
Jeremy Stretch
0b7d019c02 Remove unused CustomChoiceFieldInspector 2020-08-25 15:16:20 -04:00
Jeremy Stretch
5b3de8defe Use DjangoJSONEncoder for encoding custom field data 2020-08-25 13:57:18 -04:00
Jeremy Stretch
fb8904af54 Remove unused attributes, methods 2020-08-25 13:49:23 -04:00
Jeremy Stretch
f7b8d6ede5 Add choices ArrayField to CustomField; drop CustomFieldChoice 2020-08-25 13:24:46 -04:00
Jeremy Stretch
d9e5adc032 Update serializer to access custom_field_data directly 2020-08-25 10:43:04 -04:00
Jeremy Stretch
a0790e9119 Changelog for #5002 2020-08-24 15:17:36 -04:00
Jeremy Stretch
236db7d42d Merge pull request #5039 from innovationnorway/5002-available-prefixes-swagger
Use correct serializer for available-prefixes POST response
2020-08-24 15:09:58 -04:00
Jeremy Stretch
c85a45e520 Further work on custom fields 2020-08-24 14:11:13 -04:00
Jeremy Stretch
5da7590eea Fixes #4988: Fix ordering of rack reservations with identical creation times 2020-08-24 12:04:48 -04:00
Jeremy Stretch
df97eb2f72 Fixes #5045: Allow assignment of interfaces to non-master VC peer LAG during import 2020-08-24 11:33:45 -04:00
Jeremy Stretch
32a0e519ad Fixes #5041: Fix form tabs when assigning an IP to a VM interface 2020-08-24 10:56:23 -04:00
Jeremy Stretch
78d6561e39 Fixes #5040: Limit SLAAC status to IPv6 addresses 2020-08-24 10:51:47 -04:00
Jeremy Stretch
9147823305 Fixes #5042: Fix display of SLAAC label for IP addresses status 2020-08-24 10:47:26 -04:00
Jeremy Stretch
e7cf87be97 Fixes #5035: Fix exception when modifying an IP address assigned to a VM 2020-08-24 10:39:41 -04:00
Jeremy Stretch
6e28490b84 Fixes #5038: Fix validation of primary IPs assigned to virtual machines 2020-08-24 09:41:04 -04:00
Joakim Bakke Hellum
fcc15d2e33 Use correct serializer for available-prefixes POST response
POST `/ipam/prefixes/{id}/available-prefixes/` returns single `Prefix` object, not list of `AvailablePrefix` objects.
2020-08-23 20:49:50 +02:00
Jeremy Stretch
3522eafd2c Post-release version bump 2020-08-22 21:06:06 -04:00
Jeremy Stretch
35a280eb31 Release v2.9.1 2020-08-22 21:03:51 -04:00
Jeremy Stretch
aedba0e8be Closes #5030: Call out required minimum versions for depdencies in upgrade documentation 2020-08-22 20:53:21 -04:00
Jeremy Stretch
728088f5fa Closes #5033: Support backward compatibility for REMOTE_AUTH_BACKEND 2020-08-22 20:39:46 -04:00
Jeremy Stretch
2116b928b6 Add link to v2.9 release notes 2020-08-21 16:44:13 -04:00
Jeremy Stretch
2276603ac3 Drop CustomFieldValue 2020-08-21 16:21:11 -04:00
Jeremy Stretch
879166d939 Initial work on reimplementing custom fields 2020-08-21 15:16:33 -04:00
Jeremy Stretch
f37997ac54 Closes #4814: Allow nested LAG interfaces 2020-08-21 13:35:03 -04:00
Jeremy Stretch
ed65603632 Closes #4540: Add IP address status type for SLAAC 2020-08-21 13:17:41 -04:00
Jeremy Stretch
802af06c0f Closes #4991: Add Python and NetBox versions to error page 2020-08-21 12:58:48 -04:00
Jeremy Stretch
ec66e1a5c0 Closes #4349: Drop support for embedded graphs 2020-08-21 11:57:46 -04:00
Jeremy Stretch
ee34e28986 Drop backward compatibility for REMOTE_AUTH_DEFAULT_PERMISSIONS defined as a list 2020-08-21 11:18:57 -04:00
Jeremy Stretch
d1071b79e3 Closes #4360: Drop support for the Django template language in export templates 2020-08-21 11:16:30 -04:00
Jeremy Stretch
2339fe22ae Closes #4941: commit argument is now required argument in a custom script's run() method 2020-08-21 11:06:36 -04:00
Jeremy Stretch
e02590ac96 Post-release version bump 2020-08-21 09:56:29 -04:00
Jeremy Stretch
b22995a6d7 Snip beta warning 2020-08-21 09:41:28 -04:00
Jeremy Stretch
6c1436174c Release v2.9.0 2020-08-21 09:39:31 -04:00
Jeremy Stretch
b2aa9b82c8 Merge pull request #5000 from netbox-community/develop-2.9
Stage v2.9 release
2020-08-21 09:32:00 -04:00
Jeremy Stretch
23aae52992 Merge branch 'develop' into develop-2.9 2020-08-21 09:21:18 -04:00
Jeremy Stretch
8b5e701ba4 Cleaned up release notes for v2.9.0 2020-08-21 09:18:28 -04:00
Jeremy Stretch
8f88d2afab Closes #5024: List available options for choice fields within CSV import forms 2020-08-20 15:44:30 -04:00
Jeremy Stretch
8d351178ac Fixes #5022: Fix exception when editing IP address with NAT inside IP assigned 2020-08-20 14:38:58 -04:00
Jeremy Stretch
bc0e6cc8dd Fixes #5012: Return details of exceptions resulting from report/script execution 2020-08-20 12:47:26 -04:00
Jeremy Stretch
bf4fee1592 Fixes #5020: Correct handling of dependent objects during bulk deletion 2020-08-20 09:44:45 -04:00
Jeremy Stretch
e1cf27a3ac Refactor DCIM models into separate submodules 2020-08-19 16:37:23 -04:00
Jeremy Stretch
db5bb8e5bb Fix changelog tests 2020-08-19 16:02:10 -04:00
Jeremy Stretch
3ebef04a11 Closes #5016: assertHttpStatus() should report form validation errors 2020-08-18 17:02:47 -04:00
Jeremy Stretch
0d9fc309d5 Update test script ObjectVars 2020-08-18 14:43:21 -04:00
Jeremy Stretch
c9c79dabef Fixes #5004: Permit assignment of an interface to a LAG on any peer virtual chassis member 2020-08-18 14:41:47 -04:00
Jeremy Stretch
5fad6a63ca Merge pull request #5009 from kobayashi/4989-vmcount
Fixes #4989: Fix no vm count for cluster in global search
2020-08-18 14:03:57 -04:00
Jeremy Stretch
82900fb65d Changelog for #4990 2020-08-18 14:01:59 -04:00
Jeremy Stretch
046272ff37 Merge pull request #5010 from netbox-community/4990-custom-script-changelog
Fixes #4990: Object change logging during custom script execution
2020-08-18 13:57:21 -04:00
Jeremy Stretch
bc5f800a8b Refactor tests (again) 2020-08-18 13:30:16 -04:00
Jeremy Stretch
36d86e6220 Avoid using post_data() for form data 2020-08-18 13:13:13 -04:00
Jeremy Stretch
986ef2b8e6 Move changelog signals setup to a context manager 2020-08-18 13:05:41 -04:00
Jeremy Stretch
5629124755 Tweak passing of tags 2020-08-18 12:37:07 -04:00
Jeremy Stretch
0bfb64dc09 Simplify tag creation 2020-08-18 11:33:23 -04:00
Jeremy Stretch
c482dcd8cb Dump full response content on unexpected status code 2020-08-18 10:41:28 -04:00
Jeremy Stretch
881cab051b Add changelog tests for UI views 2020-08-18 10:05:58 -04:00
Jeremy Stretch
afebf525d1 Move housekeeping to _handle_changed_object() 2020-08-18 09:13:07 -04:00
Jeremy Stretch
0e5d0a43f9 Fix serialization of tags for REST API updates 2020-08-17 16:18:47 -04:00
Jeremy Stretch
cf086cd7b2 Remove errant import 2020-08-17 14:15:02 -04:00
Jeremy Stretch
81c72739b5 Attach object modification signals before running a custom script 2020-08-17 13:43:48 -04:00
Jeremy Stretch
ff5a3c1055 Cache custom fields on instance during bulk edit 2020-08-17 12:29:40 -04:00
Jeremy Stretch
bc04543b33 Cache custom fields on instance prior to calling create()/update() 2020-08-17 12:22:37 -04:00
Jeremy Stretch
dd707c97af Cache custom fields on instance prior to save() 2020-08-17 11:08:14 -04:00
kobayashi
34708a8fa5 Fixes #4989: Fix no vm count for cluster in global search 2020-08-17 10:59:01 -04:00
Jeremy Stretch
4ee8e473eb Move ObjectChange creation into signal receivers 2020-08-14 17:03:45 -04:00
Jeremy Stretch
b4299241fe Cast all query param values to string 2020-08-14 11:38:15 -04:00
Jeremy Stretch
66c91484f5 Clean up display_name for various models 2020-08-14 10:20:34 -04:00
Jeremy Stretch
808d621eda VC member selection should use display_name 2020-08-14 10:09:54 -04:00
Jeremy Stretch
943c2230ba Bump version for upcoming v2.9 release 2020-08-13 13:12:09 -04:00
Jeremy Stretch
d4fd0df02c Release v2.9-beta2 2020-08-13 13:04:33 -04:00
Jeremy Stretch
fd139a77f5 Closes #4997: Introduce OrderedDefaultRouter; move root API views to views.py 2020-08-13 12:49:49 -04:00
Jeremy Stretch
a08418bff8 Closes #4996: Add "connect" buttons to individual device component views 2020-08-13 11:14:33 -04:00
Jeremy Stretch
bdc4189812 Fixes #4995: Fix missing buttons to add console/power ports under device view 2020-08-13 10:53:34 -04:00
Jeremy Stretch
e252de319e Add region field to device form 2020-08-13 10:45:01 -04:00
Jeremy Stretch
0e91d837a0 Allow selecting NAT IP address by assigned virtual machine 2020-08-13 10:42:19 -04:00
Jeremy Stretch
71c2e235a8 Use display_name in VRF selection widgets 2020-08-13 10:32:57 -04:00
Jeremy Stretch
ed0e212ce0 Closes #4994: Add cable attribute to PowerFeed API serializer 2020-08-13 10:30:28 -04:00
Jeremy Stretch
b405e8294b Merge branch 'develop' into develop-2.9 2020-08-13 10:20:39 -04:00
Jeremy Stretch
a7cd09d6d4 Fixes #4993: Add cable to nested CircuitTermination serializer 2020-08-13 10:19:50 -04:00
Jeremy Stretch
bc61393256 Merge branch 'develop' into develop-2.9 2020-08-13 10:06:03 -04:00
Jeremy Stretch
acd5f21866 Fixes #4992: Add display_name to nested VRF serializer 2020-08-13 09:56:03 -04:00
Jeremy Stretch
3bff9b647c Changelog for #4922, #4982 2020-08-13 09:36:06 -04:00
Jeremy Stretch
6d8cb6dac3 Merge pull request #4978 from netbox-community/4922-optimize-interface-replication
Closes #4922: Optimize schema migration for VM interface replication
2020-08-13 09:34:24 -04:00
Jeremy Stretch
76dc80a45d Merge pull request #4987 from netbox-community/4982-apiselect-improvements
Closes #4982: Overhaul the APISelect widget and support ObjectVar filtering
2020-08-13 09:32:32 -04:00
Jeremy Stretch
53f9f82317 Set display_field where needed 2020-08-13 09:27:21 -04:00
Jeremy Stretch
0b14b66727 Update ObjectVar documentation 2020-08-12 15:40:06 -04:00
Jeremy Stretch
fe1ffdcbb7 Extend ObjectVars to accept display_field, query_params, and null_option 2020-08-12 14:51:58 -04:00
Jeremy Stretch
b891b407d4 Add brief_mode to DynamicModelChoiceMixin 2020-08-12 14:15:34 -04:00
Jeremy Stretch
5372492785 Clean up Select2 widget Javascript 2020-08-12 14:03:58 -04:00
Jeremy Stretch
c40df97ffa Rename add_additional_query_param() 2020-08-12 13:59:11 -04:00
Jeremy Stretch
9e14e28d89 Remove unused arguments from APISelect widget 2020-08-12 13:57:34 -04:00
Jeremy Stretch
e9e77fc689 Add disabled_indicator to DynamicModelChoiceMixin 2020-08-12 13:30:49 -04:00
Jeremy Stretch
779686425a Use brief mode when fetching cable termination objects 2020-08-12 13:20:30 -04:00
Jeremy Stretch
09849391e3 Remove filter_for argument from Select2 widgets 2020-08-12 13:03:59 -04:00
Jeremy Stretch
c45a57ff43 Update cable termination forms to use DynamicModelChoiceField 2020-08-12 12:58:32 -04:00
Jeremy Stretch
100c8fef20 Add support for referencing peer field values in query_params 2020-08-12 12:37:17 -04:00
Jeremy Stretch
d752c36ea8 Fix virtual chassis member add form 2020-08-12 10:17:21 -04:00
Jeremy Stretch
d8d752b623 Fix form for adding devices to a cluster 2020-08-12 10:14:21 -04:00
Jeremy Stretch
b917403c93 Replace 'nullable' attribute with null_option 2020-08-12 10:05:12 -04:00
Jeremy Stretch
8a8b4e728a Move null_option to DynamicModelChoiceMixin 2020-08-12 09:47:13 -04:00
Jeremy Stretch
f3fb85933f Add query_params attribute to DynamicModelChoiceMixin 2020-08-12 09:28:24 -04:00
Jeremy Stretch
a831e525da Remove value_field from APISelect; reference to_field_name on field 2020-08-11 17:19:40 -04:00
Jeremy Stretch
fdc43f8279 Add display_field kwarg to DynamicModelChoiceMixin 2020-08-11 17:00:28 -04:00
Jeremy Stretch
2c64d45c69 Drop support for conditional_query_params on APISelect 2020-08-11 16:23:36 -04:00
Jeremy Stretch
5b438c3f30 Refactor utility form resources into separate modules 2020-08-11 15:14:06 -04:00
Jeremy Stretch
3c395e7c9f Closes #4885: Add MultiChoiceVar for custom scripts 2020-08-11 13:23:39 -04:00
Jeremy Stretch
eadd2d6854 Remove obsolete livesearch Javascript 2020-08-11 12:56:27 -04:00
Jeremy Stretch
c163ec1e8d Clean up custom script templates 2020-08-10 16:27:24 -04:00
Jeremy Stretch
93da6b6edf #2006: Clean up report views 2020-08-10 15:56:55 -04:00
Jeremy Stretch
d7e2acd0ad Optimize schema migration for VM interface replication 2020-08-10 13:53:28 -04:00
Jeremy Stretch
365b6f5e17 Changelog for #4969 2020-08-10 11:28:41 -04:00
Jeremy Stretch
70321ba4fb Merge pull request #4972 from netbox-community/4969-remove-secretrole-users-groups
#4969: Remove user and group assignment from SecretRoles
2020-08-10 11:27:15 -04:00
Jeremy Stretch
e6bc55af85 #4969: Remove user and group assignment from SecretRole 2020-08-07 16:19:18 -04:00
Jeremy Stretch
aca3ca9d65 Simplify the aggregation of constraint sets 2020-08-07 14:09:55 -04:00
Jeremy Stretch
1dfed14bc9 Fixes #4968: Fix exception when activating user keys in admin UI 2020-08-07 12:06:53 -04:00
Jeremy Stretch
09015c98c4 Fixes #4903: Fix member count when searching for virtual chassis 2020-08-07 08:54:02 -04:00
Jeremy Stretch
14724f3e1a Bump Django to 3.1 2020-08-06 16:22:18 -04:00
Jeremy Stretch
2b9dad934c Changelog for #4946 2020-08-06 16:17:31 -04:00
Jeremy Stretch
86c3eec3e4 Merge pull request #4963 from netbox-community/4946-objectpermission-or-constraints
Closes #4946: Extend ObjectPermission constraints to OR multiple JSON objects
2020-08-06 16:10:15 -04:00
Jeremy Stretch
4a516103a6 Extend ObjectPermission constraints to OR multiple JSON objects 2020-08-06 15:53:23 -04:00
Jeremy Stretch
b1ec332a56 Fixes #4951: Redirect to device inventory view after creting a new inventory item 2020-08-06 13:20:12 -04:00
Jeremy Stretch
6367105302 Changelog for #4639 2020-08-06 09:44:33 -04:00
Jeremy Stretch
c1e58291b2 Merge pull request #4959 from netbox-community/4639-prefix-annotate-depth
Closes #4639: Replace annotate_depth() on Prefix manager
2020-08-06 09:42:12 -04:00
Jeremy Stretch
0f397fa410 Replicate 'max length' field in PrefixFilterForm for consistency 2020-08-06 09:20:20 -04:00
Jeremy Stretch
c36d8b2256 Fix default display of child count in prefix tables 2020-08-06 09:14:20 -04:00
Jeremy Stretch
d384f25ec2 Replace expand/collpase with max mask length for prefixes list 2020-08-05 16:48:45 -04:00
Jeremy Stretch
e8df9be702 Add LTE and GTE filters for prefix mask length 2020-08-05 16:16:51 -04:00
Jeremy Stretch
0d68d0c059 Replace annotate_depth() with annotate_tree() 2020-08-05 15:55:47 -04:00
Jeremy Stretch
8709c50a9e Remove unused wiki images 2020-08-05 14:10:08 -04:00
Jeremy Stretch
bdb8263610 Standardize API requests 2020-08-05 14:04:59 -04:00
Jeremy Stretch
043c34c510 Merge pull request #4958 from netbox-community/docs-refresh
Documentation refresh for v2.9 release
2020-08-05 13:55:23 -04:00
Jeremy Stretch
e0f67c9ee9 Merge branch 'develop-2.9' into docs-refresh 2020-08-05 13:53:06 -04:00
Jeremy Stretch
73756f7483 Finished updating REST API documentation 2020-08-05 13:40:06 -04:00
Jeremy Stretch
42ebf0a546 Closes #4945: Add a user-friendly 403 error page 2020-08-05 10:40:45 -04:00
Jeremy Stretch
e6df6dc7f4 Fixes #4950: Include inventory item label in API serializer, UI view 2020-08-05 10:11:38 -04:00
Jeremy Stretch
bd24eebbf2 Fixes #4952: Default to VM tab when creating/editing an IP address for a VM 2020-08-05 09:29:29 -04:00
Jeremy Stretch
65b42c93b0 Merge branch 'develop' into develop-2.9 2020-08-05 09:15:10 -04:00
Jeremy Stretch
65af012d60 Started refreshing REST API documentation 2020-08-04 17:07:45 -04:00
Jeremy Stretch
9c3b67048a Post-release version bump 2020-08-04 12:41:29 -04:00
Jeremy Stretch
22c482bdc3 Release v2.8.9 2020-08-04 12:31:38 -04:00
systeembeheerder
c358097d52 Update upgrading.md (#4937)
include the local_requirements.txt file to keep ldap from breaking during upgrades.

Co-authored-by: Jeremy Stretch <jeremy.stretch@networktocode.com>
2020-08-04 12:26:21 -04:00
Jeremy Stretch
26e37c1da6 Fixes #4455: Fix ordering of prefixes beneath aggregate when available space is hidden 2020-08-04 12:09:10 -04:00
Jeremy Stretch
053c600b67 Closes #4943: Add a 'description' field to ObjectPermission 2020-08-03 16:37:37 -04:00
Jeremy Stretch
ce2dada9fd Closes #4942: Make ObjectPermission's 'name' field required 2020-08-03 16:10:51 -04:00
Jeremy Stretch
ccb2bf4344 Exclude permission, userconfig inlines when creating a new user 2020-08-03 14:16:21 -04:00
Jeremy Stretch
8517434733 Add notes to admin UI encouraging Jinja2 over legacy Django templating 2020-08-03 14:09:32 -04:00
Jeremy Stretch
b410674f9e Log a warning for scripts whose run() method does not accept a commit argument 2020-08-03 13:56:10 -04:00
Jeremy Stretch
31e65a09e8 Closes #4940: Added an occupied field to rack unit representations for rack elevation views 2020-08-03 13:37:32 -04:00
Jeremy Stretch
cdfec4d865 Fixes #4939: Fix linking to LAG interfaces on other VC members 2020-08-03 12:57:04 -04:00
Jeremy Stretch
af98e349e9 Fixes #4938: Show add, import buttons on virtual chassis list view 2020-08-03 12:52:00 -04:00
Jeremy Stretch
c3c27ac664 Refreshed admin docs 2020-08-03 11:42:24 -04:00
Jeremy Stretch
2644330452 Refreshed "additional features" docs 2020-08-03 11:03:19 -04:00
Jeremy Stretch
eacbec9c68 Update caching, change logging documentation 2020-07-30 14:57:34 -04:00
Jeremy Stretch
9e3bfdd57c Update virtualization documentation 2020-07-30 13:48:05 -04:00
Jeremy Stretch
f49998980f Update power documentation 2020-07-30 13:36:40 -04:00
Jeremy Stretch
190a2ff92b Update tenancy documentation 2020-07-30 13:02:53 -04:00
Jeremy Stretch
96d2a8b30a Update IPAM model documentation 2020-07-30 12:55:51 -04:00
Jeremy Stretch
d42a37f866 Update docs for tags, config contexts 2020-07-30 11:36:46 -04:00
Jeremy Stretch
7b45d06631 Fixes #4931: Fix DoesNotExist exception when deleting devices 2020-07-30 10:08:36 -04:00
Jeremy Stretch
cea6c98f54 Fixes #4930: Replicate label values when instantiating device type components 2020-07-30 10:05:29 -04:00
Jeremy Stretch
fd564f09d1 #4923: Separate user creation instructions for Ubuntu/CentOS 2020-07-30 09:15:20 -04:00
Jeremy Stretch
76c2fd3414 Fixes #4926: Fix ordering of VM interfaces in REST API endpoint 2020-07-30 09:10:06 -04:00
Jeremy Stretch
712e850951 Fixes #4927: Fix validation error when updating an existing secret 2020-07-30 08:57:45 -04:00
Jeremy Stretch
24cedab04b Fixes #4929: Correct log message when creating a new object 2020-07-30 08:51:01 -04:00
Jeremy Stretch
95348b1044 Update site and rack documentation 2020-07-29 16:27:38 -04:00
Jeremy Stretch
55ee3db5bc #4919: Allow adding/changing assigned permissions within group and user admin views 2020-07-29 12:12:00 -04:00
Jeremy Stretch
73f9d615bc Fixes #4921: Render non-viewable devices as unavailable space in rack elevations 2020-07-29 09:43:13 -04:00
Jeremy Stretch
4262e2ef09 Closes #4916: Clarify plugin config behavior when specifying a default value for a required setting 2020-07-28 17:12:46 -04:00
Jeremy Stretch
2dd494bc42 Closes #4913: Upgrade jQuery to v3.5.1 2020-07-28 14:25:05 -04:00
Jeremy Stretch
8faf586e14 Merge pull request #4915 from tyler-8/docs_exclude_api
Add note describing the exclude config context functionality
2020-07-28 13:21:27 -04:00
Tyler Bigler
08975b5ef9 Add note describing the exclude config context functionality 2020-07-28 13:01:26 -04:00
Jeremy Stretch
d1a505d07f Fixes #4914: Fix toggling cable status under device view 2020-07-28 12:54:21 -04:00
Jeremy Stretch
1e4615aa75 Update device documentation 2020-07-28 11:42:10 -04:00
Jeremy Stretch
0616127503 Update device type and component template documentation 2020-07-28 11:04:57 -04:00
Jeremy Stretch
b8783078eb Updated documentation for device components 2020-07-28 10:58:43 -04:00
Jeremy Stretch
31c156f792 Updated cable documentation 2020-07-28 09:48:55 -04:00
Jeremy Stretch
a770dd4836 Updated circuits documentation 2020-07-28 09:18:13 -04:00
Jeremy Stretch
bfdb01244d Refresh configuration docs 2020-07-27 20:35:00 -04:00
Jeremy Stretch
a206b422fb Fixes #4912: Fix image attachment API endpoint; add API view tests 2020-07-27 14:24:15 -04:00
Jeremy Stretch
9f363f493b Closes #4909: Check for contents in local_requirements.txt before calling pip 2020-07-27 12:01:21 -04:00
Jeremy Stretch
2972993a84 Fixes #4910: Unpin redis dependency to fix exception in RQ worker 2020-07-27 11:52:27 -04:00
Jeremy Stretch
b17e47101c Fixes #4905: Fix front port count on device type view 2020-07-27 10:19:24 -04:00
Jeremy Stretch
9e1edd55d6 Closes #4898: Add MAC address search field to interfaces list 2020-07-24 16:46:29 -04:00
Jeremy Stretch
61ce8d1cb0 Closes #4899: Add MAC address column to interfaces table 2020-07-24 16:43:30 -04:00
Jeremy Stretch
e2718973ce Update the CONTRIBUTING guide 2020-07-24 16:11:46 -04:00
Jeremy Stretch
b081864e66 Allow stalebot to tag issues marked as under review 2020-07-24 14:58:05 -04:00
Jeremy Stretch
a912d6ed1e Update feature request triage workflow 2020-07-24 14:04:41 -04:00
Jeremy Stretch
e45ebdffb1 Add issue triage images 2020-07-24 13:18:13 -04:00
Jeremy Stretch
5734c5e093 Update stalebot config 2020-07-24 11:51:08 -04:00
Jeremy Stretch
cb570790e6 Fixes #4895: Force UTF-8 encoding when embedding model documentation 2020-07-24 09:26:20 -04:00
Jeremy Stretch
bb4f21d5ee Fixes #4894: Fix display of device/VM counts on platforms list 2020-07-24 09:16:14 -04:00
Jeremy Stretch
fe20c30a81 Fix parameters for ObjectChangeTestCase 2020-07-23 14:57:35 -04:00
Jeremy Stretch
7eb688bdcd Release v2.9-beta1 2020-07-23 14:46:06 -04:00
Jeremy Stretch
22ee6703ad Merge branch 'develop' into develop-2.9 2020-07-23 14:35:34 -04:00
Jeremy Stretch
b734c72be7 Fix VirtualChassis search by name 2020-07-23 14:32:30 -04:00
Jeremy Stretch
9bcfefa31e Fix ordering for Tags 2020-07-23 14:28:22 -04:00
Jeremy Stretch
37706f1c87 Use RestrictedQuerySet for default Tag manager 2020-07-23 14:20:56 -04:00
Jeremy Stretch
78bb2e12fe Clean up migration output 2020-07-23 14:03:19 -04:00
Jeremy Stretch
84d4b2db77 Clean up resolution of HTTP verbs to permission actions 2020-07-23 13:53:36 -04:00
Jeremy Stretch
b47a9f251d Change ObjectChangeFilterForm user field to be API-driven 2020-07-23 13:47:19 -04:00
Jeremy Stretch
46ebeba28f Set default ordering for user and group API endpoints 2020-07-23 13:46:40 -04:00
Jeremy Stretch
a262a8320b Changelog for #4887 2020-07-23 13:13:49 -04:00
Jeremy Stretch
d39cda2e45 Merge pull request #4888 from jvanderaa/napalm_lookup_hostname
Removes IP Address Check for NAPALM Information Gathering
2020-07-23 13:11:07 -04:00
Jeremy Stretch
cb36f9fdb3 Remove restriction enforcement from RestrictedQuerySet 2020-07-23 12:48:03 -04:00
Josh VanDeraa
b69d2f1367 Merge remote-tracking branch 'upstream/develop' into napalm_lookup_hostname 2020-07-23 09:33:40 -05:00
Josh VanDeraa
3fd3c7a383 Removes IP address check for NAPALM in HTML 2020-07-23 09:24:02 -05:00
Jeremy Stretch
8c4add38f4 Update release instructions 2020-07-23 10:17:57 -04:00
Jeremy Stretch
d28cece264 Merge pull request #4883 from kobayashi/4880-tagged-vlans
#4880: Fix remove untagged-vlans if not assigned in bulk interfaces edit
2020-07-23 09:01:56 -04:00
kobayashi
a12d94a3bc Fixes #4880: Fix remove untagged-vlans if not assigned in bulk interfaces edit 2020-07-23 01:36:31 -04:00
Jeremy Stretch
d23f97abc8 Merge branch 'develop' into develop-2.9 2020-07-22 17:11:35 -04:00
Jeremy Stretch
9f4c1e64ce Refactor clone_button() to avoid undefined URL 2020-07-22 17:06:08 -04:00
Jeremy Stretch
86956c8fc3 Fixes #4875: Fix documentation for image attachments 2020-07-22 16:48:56 -04:00
Jeremy Stretch
0991a8edaa Fixes #4876: Fix labels for sites in staging or decommissioning status 2020-07-22 16:43:25 -04:00
Jeremy Stretch
380d30e612 Add filters for ObjectPermissions 2020-07-22 16:34:16 -04:00
Jeremy Stretch
4f54ffa9aa Admin UI cleanup 2020-07-22 16:00:28 -04:00
Jeremy Stretch
7cdb0cf560 Allow the assignment of ObjectPermissions to users, groups, and permissions 2020-07-22 15:25:06 -04:00
Jeremy Stretch
798810b3dd Changelog for #4877 2020-07-22 14:41:39 -04:00
Jeremy Stretch
1fcefc486c Merge pull request #4879 from netbox-community/4877-users-api-endpoint
4877 users api endpoint
2020-07-22 14:35:14 -04:00
Jeremy Stretch
79f1248119 Add filter tests for group, users 2020-07-22 13:58:12 -04:00
Jeremy Stretch
2cc4f032b0 Correct FilterSet naming 2020-07-22 13:48:04 -04:00
Jeremy Stretch
64a3bd37e7 Move EXEMPT_EXCLUDE_MODELS to settings; add Group and User models 2020-07-22 12:13:07 -04:00
Jeremy Stretch
b4cf85149b Add tests for users and groups API endpoints 2020-07-22 12:04:14 -04:00
Jeremy Stretch
788f8c9a1c Add view_namespace attrbiute to APITestCase to override model's app_label 2020-07-22 11:51:10 -04:00
Jeremy Stretch
e9199d6ca5 Look for auth model serializers in users app 2020-07-22 11:50:20 -04:00
Jeremy Stretch
1ac215bf87 Introduce API endpoints for Users and Groups 2020-07-22 11:21:51 -04:00
Jeremy Stretch
3e6b257fa0 Exclude ObjectPermissions API endpoint from EXEMPT_VIEW_PERMISSIONS 2020-07-21 17:39:56 -04:00
Jeremy Stretch
a3d1ee474c Clean up v2.9 release notes 2020-07-21 16:58:31 -04:00
Jeremy Stretch
1714902f88 Merge branch 'develop' into develop-2.9 2020-07-21 12:57:02 -04:00
Jeremy Stretch
357bf671ad Post-release version bump 2020-07-21 12:16:04 -04:00
Jeremy Stretch
c6fd6ab329 Remove cacheops monkey patch for RestrictedQuerySet 2020-07-20 16:54:24 -04:00
Jeremy Stretch
0ef016db07 Update installation docs 2020-07-20 16:53:04 -04:00
Jeremy Stretch
08a5e82afc Merge pull request #4852 from glennmatthews/gfm-2006-continued
Some additional fixes to scripts/reports background running (2.9)
2020-07-20 13:10:56 -04:00
Jeremy Stretch
8514a5427c Update related object counts to use dunders in accessor 2020-07-20 13:00:33 -04:00
Jeremy Stretch
de6202c160 Merge pull request #4861 from netbox-community/django-31
Upgrade to Django 3.1 (v2.9)
2020-07-20 12:47:49 -04:00
Jeremy Stretch
0f679e1f03 Closes #4871: Specify ordering for querysets using annotate() to count related objects 2020-07-20 12:07:19 -04:00
Jeremy Stretch
39dc1f882a Merge branch 'develop-2.9' into django-31 2020-07-20 11:15:01 -04:00
Jeremy Stretch
5b43fa0e12 Upgrade Django to 3.1RC1 2020-07-20 11:10:55 -04:00
Jeremy Stretch
ba50bfa939 Address some of the django_tables2 deprecation warnings 2020-07-16 16:52:45 -04:00
Jeremy Stretch
16f44305e4 Update static dependencies 2020-07-16 15:22:31 -04:00
Jeremy Stretch
1dbf776279 Fix handling of ProtectedError exceptions 2020-07-16 13:45:02 -04:00
Jeremy Stretch
bdf41451eb Pin Django version to 3.1-beta1 for v2.9 beta 2020-07-16 13:04:19 -04:00
Jeremy Stretch
82cd24a7de Remove deprecated ifequal template tags 2020-07-16 13:01:31 -04:00
Jeremy Stretch
21a750e8ec Change Postgres-specific JSONField to stock Django field 2020-07-16 12:02:49 -04:00
Jeremy Stretch
68ecddccdb Convert NullBooleanField to BooleanField(null=True) 2020-07-16 11:56:35 -04:00
Jeremy Stretch
8dd41b771e Update import locations for Django 3.1 2020-07-16 11:54:08 -04:00
Jeremy Stretch
a4829198ff Update dependencies for v2.9 2020-07-16 11:28:19 -04:00
Jeremy Stretch
5cfc4ec3a0 Merge pull request #4858 from netbox-community/4857-remove-legacy-choice-ids
Closes #4857: Drop support for legacy numeric choice field values
2020-07-15 17:07:42 -04:00
Jeremy Stretch
19d0d6ff10 Closes #4857: Drop support for legacy numeric choice field values 2020-07-15 16:54:33 -04:00
Jeremy Stretch
7461e76606 Fix regex for Python 3.7 2020-07-15 16:19:30 -04:00
Glenn Matthews
d8b0a11a49 Save JobResult even for a script run with commit=False 2020-07-15 12:58:01 -04:00
Jeremy Stretch
1291fc4187 Add missing changelog view tests 2020-07-14 16:31:55 -04:00
Jeremy Stretch
04d8ab3792 Clean up device component creation forms 2020-07-14 15:51:13 -04:00
Jeremy Stretch
cf0e31ac0f Introduce BulkRenameObjectsViewTestCase 2020-07-14 13:19:00 -04:00
Jeremy Stretch
4458ce69df Enforce constrained permissions when bulk renaming objects 2020-07-14 13:18:22 -04:00
Jeremy Stretch
81ed03575d Rename BulkCreateObjectsViewTestCase to CreateMultipleObjectsViewTestCase 2020-07-14 11:08:59 -04:00
Glenn Matthews
49c6bee6d7 Fix jobresult success label spelling 2020-07-14 09:45:36 -04:00
Jeremy Stretch
d47ea04ec4 Add "add interfaces" button to virtual machine view 2020-07-13 16:59:46 -04:00
Jeremy Stretch
d5a5a4a8d1 Skip report/script execution tests if RQ worker is not running 2020-07-13 16:48:44 -04:00
Jeremy Stretch
9f7ed25e74 Add assigned IP addresses and VLANs to interface tables 2020-07-13 16:18:17 -04:00
Jeremy Stretch
013a2a35e0 Add cluster and virtual machine filters to VM interfaces list 2020-07-13 15:43:54 -04:00
Jeremy Stretch
9cece39ee9 Remove incorrect bulk edit test data 2020-07-13 15:26:06 -04:00
Jeremy Stretch
05aa008ce1 #2006: Prevent script/report execution if no RQ worker is running 2020-07-13 15:11:58 -04:00
Jeremy Stretch
e53839ca2a Add progress counter to VM interface replication migration 2020-07-13 13:13:37 -04:00
Jeremy Stretch
f83ec7256f Add model documentation for VM interfaces 2020-07-10 13:01:02 -04:00
Jeremy Stretch
96b3de7916 Remove extraneous queryset filter 2020-07-10 10:27:07 -04:00
Jeremy Stretch
b1686c2db9 Fix bulk editing, deletion of VM interfaces 2020-07-10 10:26:43 -04:00
Jeremy Stretch
c8418fe550 Fix RestrictedQuerySet evaluation for VLAN CSV export 2020-07-10 10:09:51 -04:00
Jeremy Stretch
9f025747a7 Tweak queryset for Service views to prefetch related IPs with unrestricted() 2020-07-10 09:56:23 -04:00
Jeremy Stretch
59091efa86 Closes #4840: Enable change logging for config contexts 2020-07-09 17:09:03 -04:00
Jeremy Stretch
8d7001fe56 Move abstract ChangeLoggedModel under extras 2020-07-09 17:07:25 -04:00
Jeremy Stretch
c3a7939a77 Merge branch 'develop' into develop-2.9 2020-07-09 16:38:37 -04:00
Jeremy Stretch
4f00b5af4a Miscellaneous RestrictedQuerySet cleanup 2020-07-09 15:11:18 -04:00
Jeremy Stretch
26e81546eb Fix REST API version calculation 2020-07-09 13:08:13 -04:00
Jeremy Stretch
1692fbf5d8 #4837: Fix API tests 2020-07-09 12:06:13 -04:00
Jeremy Stretch
15525392a2 Closes #4837: Use dynamic form widget for relationships to MPTT objects 2020-07-09 09:50:01 -04:00
Jeremy Stretch
b535608519 Refactor imports 2020-07-09 09:13:58 -04:00
Jeremy Stretch
0a44ed1355 Fix permissions evaluation for session-authenticated API requests 2020-07-08 17:51:25 -04:00
Jeremy Stretch
ccdbf820ba Use monospaced font for ObjectPermission constraints 2020-07-08 16:07:07 -04:00
Jeremy Stretch
56c0b48302 Enable filtering ObjectPermissions by enabled, action, and object type 2020-07-08 14:38:19 -04:00
Jeremy Stretch
4c2fdf3b1c Admin UI should use unrestricted queryset for ObjectPermissions 2020-07-08 13:59:57 -04:00
Jeremy Stretch
4eddec4b1e #4806: Add url field to ObjectPermissionSerializer 2020-07-08 13:57:50 -04:00
Jeremy Stretch
39248f9e2f Enable bulk enabling/disabling of permissions 2020-07-08 13:54:09 -04:00
Jeremy Stretch
fac0da224a Add name, enabled fields to ObjectPermission 2020-07-08 13:44:19 -04:00
Jeremy Stretch
6e50ed084d Fix tags display 2020-07-08 13:10:40 -04:00
Jeremy Stretch
bf7bd68b6a Fix tag population for object cloning 2020-07-08 13:07:53 -04:00
Jeremy Stretch
5fd5dbab7b Merge branch 'develop' into develop-2.9 2020-07-08 13:04:57 -04:00
Jeremy Stretch
85b284be54 Fix permissions evaluation for available IPs endpoint 2020-07-08 09:31:10 -04:00
Jeremy Stretch
02a6e2190f Monkey-patch cacheops' _pre_save() receiver to tweak sender's QuerySet 2020-07-07 17:09:41 -04:00
Jeremy Stretch
847fbfd71a Fix unrestricted querysets 2020-07-07 16:46:57 -04:00
Jeremy Stretch
327a93136a TreeManager should provide an unrestricted QuerySet for MPTT use 2020-07-07 16:09:47 -04:00
Jeremy Stretch
353d88f0a6 Use unrestricted querysets for prefetching related objects 2020-07-07 15:45:46 -04:00
Jeremy Stretch
25e1319864 Update filter tests to use unrestricted querysets 2020-07-07 14:26:14 -04:00
Jeremy Stretch
88033c0801 Fix queryset for get_peer_termination() 2020-07-07 14:13:58 -04:00
Jeremy Stretch
f6d05f3906 Tweak ObjectChange queryset for cleanup 2020-07-07 13:54:49 -04:00
Jeremy Stretch
2fbe138c71 Refactor APITestCase to provide dynamic queryset specification 2020-07-07 13:13:19 -04:00
Jeremy Stretch
a2d957ba0d Use stock manager as default for Tag model 2020-07-07 12:18:14 -04:00
Jeremy Stretch
15f5719f44 Remove unused class IPAddressInterfaceSerializer 2020-07-06 16:51:23 -04:00
Jeremy Stretch
924f319343 Closes #4806: Add a url field to all API serializers 2020-07-06 16:41:08 -04:00
Jeremy Stretch
9a075130f1 Changelog for #2006 2020-07-06 14:02:06 -04:00
Jeremy Stretch
6d0281adc8 Merge pull request #4799 from netbox-community/2006-scripts-reports-background
2006 scripts reports background
2020-07-06 13:45:12 -04:00
Jeremy Stretch
592ad18317 Provide a default view for Report instances 2020-07-06 13:30:13 -04:00
Jeremy Stretch
1f905e72d9 Fix stray reference to LOG_LEVEL_CODES 2020-07-06 11:51:28 -04:00
Jeremy Stretch
e02936a44a Fix reports API test case 2020-07-06 11:15:20 -04:00
Jeremy Stretch
4ea4112490 Fix up schema migration; PEP8 cleanup 2020-07-06 10:44:36 -04:00
John Anderson
6547a2bc50 merge conflict 2020-07-06 02:10:52 -04:00
John Anderson
4a74927fa2 Merge branch 'develop-2.9' into 2006-scripts-reports-background 2020-07-06 02:06:53 -04:00
John Anderson
41f92ef8e6 review updates 2020-07-06 02:00:16 -04:00
John Anderson
f092c107b5 PR review updates 2020-07-06 02:00:16 -04:00
Jeremy Stretch
f4c14d4854 Replace get_component_template_actions() with ButtonsColumn 2020-07-02 16:47:28 -04:00
Jeremy Stretch
1ed152cd49 Fix unrestricted queries for Tags 2020-07-02 16:25:13 -04:00
Jeremy Stretch
e635dc1fb3 Arrange device components within tabs 2020-07-02 15:10:56 -04:00
Jeremy Stretch
7b33fac71d Display component templates under tabs 2020-07-02 14:35:36 -04:00
Jeremy Stretch
a1e5a8b86a Introduce badge template tag 2020-07-02 14:29:23 -04:00
Jeremy Stretch
92c889ef9e #4416: Provide bulk rename ability for device component templates 2020-07-02 13:58:53 -04:00
Jeremy Stretch
eb2da300b0 Fix form initialization for interface import 2020-07-02 13:27:54 -04:00
Jeremy Stretch
6abb7e8f4d #4721: Tweak migrations to ensure Interface.device cannot be null 2020-07-02 13:12:37 -04:00
Jeremy Stretch
1f9cdc71d4 Move device and device_type ForeignKeys to abstract component models 2020-07-02 13:07:32 -04:00
Jeremy Stretch
d03d302eef Closes #4817: Standardize device/VM component name field to 64 characters 2020-07-02 12:08:19 -04:00
Jeremy Stretch
c5362f5931 Fix permissions evaluation for nonstandard tests 2020-07-02 11:43:03 -04:00
Jeremy Stretch
f28bde179e Extend label field to all device components 2020-07-02 11:18:08 -04:00
Jeremy Stretch
f98fa364c0 Merge branch 'develop-2.9' into 2006-scripts-reports-background 2020-07-02 11:00:59 -04:00
Jeremy Stretch
8d7377ba04 Merge branch 'develop' into develop-2.9 2020-07-02 10:01:01 -04:00
Jeremy Stretch
fa0c7a76cb Fix permission evaluation for add console/power port buttons 2020-07-01 15:14:06 -04:00
Jeremy Stretch
06ae424b80 #4416: Add bulk rename view for InventoryItem 2020-07-01 15:12:05 -04:00
Jeremy Stretch
e4b5045ec7 #4416: Add bulk_add view for InventoryItems 2020-07-01 14:55:11 -04:00
Jeremy Stretch
7e3e18faea #4416: Add individual & changelog views for InventoryItem 2020-07-01 14:46:12 -04:00
Jeremy Stretch
225b6c6958 Fix collection of assigned IPs when editing a device 2020-07-01 14:23:21 -04:00
Jeremy Stretch
57b73c485f #4416: Remove individual view for extras.Tag 2020-07-01 14:21:51 -04:00
Jeremy Stretch
c484fa99e2 Introduce ButtonsColumn to reduce boilerplate and standardize organizational object links 2020-07-01 13:47:01 -04:00
Jeremy Stretch
8959d2e0a7 #4416: Add individual delete views for organizational objects 2020-07-01 12:08:26 -04:00
Jeremy Stretch
4613b69c28 Extend GetReturnURLMixin to automatically resolve default return URL for querysets 2020-07-01 11:50:31 -04:00
Jeremy Stretch
7fab929194 Fix evaluation of empty label_pattern 2020-06-30 16:30:54 -04:00
Jeremy Stretch
89ea34015d Enable bulk editing of device component labels 2020-06-30 16:15:17 -04:00
Jeremy Stretch
88e3ac30b6 Closes #4807: Add bulk edit ability for device bay templates 2020-06-30 15:22:30 -04:00
Jeremy Stretch
52a13b1960 Closes #4793: Add description field to device component templates 2020-06-30 15:12:53 -04:00
John Anderson
1d922a1848 fix previous job result deletion 2020-06-30 09:29:50 -04:00
Jeremy Stretch
af778f8fca TagFilter should call unrestricted() on its queryset 2020-06-29 16:07:14 -04:00
Jeremy Stretch
15f32bdd73 Wrap ComponentTraceMixin in a parent class 2020-06-29 15:14:12 -04:00
Jeremy Stretch
36498c9dd2 Base manager for Tag should use RestrictedQuerySet 2020-06-29 14:57:29 -04:00
Jeremy Stretch
66703d8963 Fix evaluation of RestrictedQuerySet 2020-06-29 14:42:37 -04:00
Jeremy Stretch
71812d1bd5 Fix evaluation of RestrictedQuerySet 2020-06-29 14:41:43 -04:00
Jeremy Stretch
5ed6136915 Introduce ComponentTraceMixin to minimize boilerplate 2020-06-29 14:40:36 -04:00
John Anderson
f48a079ae6 fix tests and cleanup 2020-06-29 14:34:42 -04:00
Jeremy Stretch
a47a100cb7 Fix unrestricted evaluations of RestrictedQuerySet 2020-06-29 13:31:26 -04:00
Jeremy Stretch
9ea4f82eaa Prefetch tagged VLANs for VMInterfaces 2020-06-29 12:18:59 -04:00
Jeremy Stretch
617e20af0b Standardize VMInterfaceTest 2020-06-29 12:06:36 -04:00
Jeremy Stretch
89ff59d048 Add graphs endpoint to VMInterfaceViewSet 2020-06-29 12:05:00 -04:00
Jeremy Stretch
6ecbf45974 Fix evaluation of RestrictedQuerySets 2020-06-29 11:48:36 -04:00
Jeremy Stretch
eb45ad600e Fix evaluation of RestrictedQuerySets 2020-06-29 11:35:13 -04:00
Jeremy Stretch
10e6b6ca66 Fix RestrictedQuerySet evaluation in tests 2020-06-29 11:27:23 -04:00
Jeremy Stretch
5732466e56 Signal receiver should call unrestricted() 2020-06-29 11:07:11 -04:00
Jeremy Stretch
ce55d0c791 Tweak querysets to work with restriction 2020-06-29 10:57:09 -04:00
Jeremy Stretch
6ab4640cdc Update API tests to work with RestrictedQuerySet 2020-06-29 10:39:06 -04:00
Jeremy Stretch
a6b03b8884 Update WritableNestedSerializer to call unrestricted() on RestrictedQuerySets 2020-06-29 10:38:32 -04:00
Jeremy Stretch
0dbe248df8 Call restrict() when retrieving related Graphs 2020-06-29 10:14:43 -04:00
John Anderson
1681dbfa39 refactor migration 2020-06-29 04:22:01 -04:00
John Anderson
3777fbccc3 Implements #2006 - run reports and scripts in the background 2020-06-29 03:50:05 -04:00
Jeremy Stretch
86d1370512 Apply restrict_form_fields() to import views 2020-06-26 16:26:22 -04:00
Jeremy Stretch
8c0adc9c61 Update test methods to call unrestricted() on RestrictedQuerySets 2020-06-26 16:15:21 -04:00
Jeremy Stretch
a452e78fa6 Use unrestricted() when compiling ObjectPermissions for user 2020-06-26 15:28:08 -04:00
Jeremy Stretch
04571ce920 Fix the initial permissions check on create/edit view tests 2020-06-26 15:21:59 -04:00
Jeremy Stretch
40c416618a Link to cable termination objects 2020-06-26 15:13:41 -04:00
Jeremy Stretch
9a1531442a Apply restrict_form_fields() to bulk edit views 2020-06-26 15:11:05 -04:00
Jeremy Stretch
6128ef4b37 Remove redundant ObjectPermissionViewTestCase 2020-06-26 15:00:47 -04:00
Jeremy Stretch
84db1adfaf Fix create, edit view test methods 2020-06-26 14:48:04 -04:00
Jeremy Stretch
2c354c7f86 Fix automatic creation of UserConfig for user created via admin UI 2020-06-26 14:29:24 -04:00
Jeremy Stretch
edc65a6a34 Introduce restrict_form_fields() to automatically restrict field querysets based on user 2020-06-26 13:59:53 -04:00
Jeremy Stretch
8412f9481c Force restriction of RestrictedQuerySet even for superusers 2020-06-26 13:18:12 -04:00
Jeremy Stretch
95965d65c9 Fix some instances where RestrictedQuerySet is evaluated prematurely 2020-06-26 12:22:02 -04:00
Jeremy Stretch
9777f25b9f Set the default action to 'view' for restrict() 2020-06-26 11:57:07 -04:00
Jeremy Stretch
6e3a32567c Move utility functions to utils.py 2020-06-26 11:56:30 -04:00
Jeremy Stretch
319799b5ce Closes #4795: Add bulk disconnect capability for console and power ports 2020-06-25 17:08:51 -04:00
Jeremy Stretch
128327b8a3 Split url_name template filter into viewname() and validated_viewname() 2020-06-25 16:50:35 -04:00
Jeremy Stretch
6f8f3f98b4 Tweak ObjectChangeLogView to work with both restricted and unrestricted querysets 2020-06-25 15:58:13 -04:00
Jeremy Stretch
2e272132b0 Add test method for changelog view 2020-06-25 15:43:47 -04:00
Jeremy Stretch
1dbae5b64c Closes #4792: Add bulk rename capability for console and power ports 2020-06-25 14:18:29 -04:00
Jeremy Stretch
6d23d9ebb7 Merge pull request #4790 from netbox-community/4788-component-views
#4788: Add individual views for device components
2020-06-25 13:38:09 -04:00
Jeremy Stretch
ec9b33ac97 Fix typo 2020-06-25 13:36:54 -04:00
Jeremy Stretch
5aa2a6eefe Add plugin buttons & content to device component views 2020-06-25 13:27:01 -04:00
Jeremy Stretch
103a44991a Changelog for #4788 2020-06-25 12:22:21 -04:00
Jeremy Stretch
0fcdd63941 Linkify components under device view 2020-06-25 12:21:25 -04:00
Jeremy Stretch
8695714c65 Fix device component changelog display 2020-06-25 12:09:56 -04:00
Jeremy Stretch
2001cfe864 Update and simplify device component tables 2020-06-25 12:03:44 -04:00
Jeremy Stretch
3badfd756c Extend DeviceComponentViewTestCase to include GetObjectViewTestCase 2020-06-25 11:04:42 -04:00
Jeremy Stretch
b08d9a5a8e Add individual views for device components 2020-06-25 11:01:18 -04:00
Jeremy Stretch
ecf40e1525 Add/update device component templates 2020-06-25 11:00:25 -04:00
Jeremy Stretch
909ddd653c Extend ObjectView to provide a default get() method 2020-06-25 10:53:00 -04:00
Jeremy Stretch
2f19350ff5 Tweak url_name template filter to work with URLs which need a PK 2020-06-25 10:49:30 -04:00
Jeremy Stretch
68ef5177f0 Introduce template filters for checking dynamic permissions 2020-06-25 10:48:21 -04:00
Jeremy Stretch
ba138de53b Fix display of tags 2020-06-24 16:27:44 -04:00
Jeremy Stretch
2303034c92 Changelog for #2018 2020-06-24 16:22:37 -04:00
Jeremy Stretch
2ceed475d5 Merge pull request #4787 from netbox-community/2018-virtual-chassis-name
#2018: Add name field to VirtualChassis model
2020-06-24 16:14:21 -04:00
Jeremy Stretch
e2398c8c0e Fix signal logic 2020-06-24 15:57:52 -04:00
Jeremy Stretch
36cf40f25c Enable CSV import for virtual chassis 2020-06-24 15:29:25 -04:00
Jeremy Stretch
59c1e34024 Initial work on #2018: Add name to VirtualChassis 2020-06-24 15:21:42 -04:00
Jeremy Stretch
2ac53afd96 Update changelog for #4721 2020-06-24 12:44:00 -04:00
Jeremy Stretch
d60a2d3723 Merge pull request #4781 from netbox-community/4721-virtualmachine-interface
#4721: Move VM interfaces to a separate model (WIP)
2020-06-24 12:10:20 -04:00
Jeremy Stretch
4d2c75a824 Restore ability to assign interface when editing an IPAddress 2020-06-24 11:30:28 -04:00
Jeremy Stretch
99c72c78c1 Update VMInterface view names 2020-06-24 10:09:22 -04:00
Jeremy Stretch
052555c3f7 Add bulk renaming function for VM interfaces 2020-06-24 10:02:40 -04:00
Jeremy Stretch
9a0bc16c86 Update device/VM interface templates 2020-06-24 09:52:22 -04:00
Jeremy Stretch
6663844a86 Rename 'vm_interface' to 'vminterface'; misc cleanup 2020-06-24 09:27:30 -04:00
Jeremy Stretch
d6386f739e Restore interface filtering for IPAddresses 2020-06-24 09:22:35 -04:00
Jeremy Stretch
afda46d587 Fix VMInterface bulk creation 2020-06-23 17:28:34 -04:00
Jeremy Stretch
603c804535 Add VMInterface CSV import view 2020-06-23 17:09:21 -04:00
Jeremy Stretch
fce19a363d Add VMInterface list view 2020-06-23 16:52:05 -04:00
Jeremy Stretch
e3820e93b7 Misc cleanup, renaming 2020-06-23 16:39:43 -04:00
Jeremy Stretch
459e485555 Restore interface assignment for IPAddress CSV import 2020-06-23 16:09:31 -04:00
Jeremy Stretch
548127cc88 Rename VMInterface serializers 2020-06-23 15:46:20 -04:00
Jeremy Stretch
a1b816b403 Remove 'parent' attribute from VMinterface 2020-06-23 15:31:53 -04:00
Jeremy Stretch
5ad5994b9d Update interface view templates 2020-06-23 15:09:32 -04:00
Jeremy Stretch
25d6bbf659 Update view and permission names for VMInterface 2020-06-23 14:48:37 -04:00
Jeremy Stretch
75354a8a78 Rename Interface to VMInterface 2020-06-23 13:21:44 -04:00
Jeremy Stretch
d1bd010e05 Fix Interface tag replication in schema migration 2020-06-23 12:50:22 -04:00
Jeremy Stretch
bb6be8e3d3 Disable editing assigned interface under IPAddress form 2020-06-22 16:36:06 -04:00
Jeremy Stretch
fc2d08c407 Set related_query_name for GenericRelations to IPAddress 2020-06-22 16:27:13 -04:00
Jeremy Stretch
40938f0c8a Retain ip_addresses name for related IPAddress objects 2020-06-22 16:13:18 -04:00
Jeremy Stretch
490dee1fa0 Merge branch 'develop-2.9' into 4721-virtualmachine-interface 2020-06-22 16:04:20 -04:00
Jeremy Stretch
27796bbd08 Add queryset to IPAddressBulkCreateView 2020-06-22 15:58:47 -04:00
Jeremy Stretch
b5d53fa850 Fix schema deconstruction for NaturalOrderingField 2020-06-22 15:49:09 -04:00
Jeremy Stretch
7b24984280 Update IPAddressSerializer 2020-06-22 15:39:57 -04:00
Jeremy Stretch
37564d630a Misc test fixes 2020-06-22 15:22:03 -04:00
Jeremy Stretch
380a5cf8a7 Fix IP choices for DeviceForm 2020-06-22 15:12:35 -04:00
Jeremy Stretch
f2b26282b8 Disable VM interface bulk creation testing 2020-06-22 15:09:16 -04:00
Jeremy Stretch
31bb70d9a2 Fixed IPAM tests 2020-06-22 14:46:25 -04:00
Jeremy Stretch
2608b3f9f3 Separate VM interface view and template 2020-06-22 14:33:53 -04:00
Jeremy Stretch
e76b1f1daa Fix assigned_object field 2020-06-22 13:50:14 -04:00
Jeremy Stretch
6cb31a274f Initial work on #4721 (WIP) 2020-06-22 13:10:56 -04:00
Jeremy Stretch
181bcd70ad Fix schema migrations for device components 2020-06-22 12:01:57 -04:00
Jeremy Stretch
eb8c0539c5 Update REST API changes for #4615 2020-06-18 14:24:50 -04:00
Jeremy Stretch
4f3fde8055 #4615: Add label field to component tables 2020-06-18 13:57:15 -04:00
Jeremy Stretch
c832e3c2c7 #4615: Add missing label field to device bay forms 2020-06-18 13:35:11 -04:00
Jeremy Stretch
88bf183af5 Merge branch 'develop' into develop-2.9 2020-06-18 13:20:32 -04:00
Jeremy Stretch
11a247edc2 Fix up tests 2020-06-18 10:32:22 -04:00
Jeremy Stretch
328d639886 Merge branch 'develop' into develop-2.9 2020-06-17 16:57:17 -04:00
Jeremy Stretch
fd18395f78 Fix queryset for TagBulkImportView 2020-06-17 13:31:26 -04:00
Jeremy Stretch
360c56ec34 Fix permission evaluation for BulkComponentCreateViews 2020-06-17 13:30:00 -04:00
Jeremy Stretch
3890d17c61 Clean up errant references to TagField 2020-06-17 13:29:27 -04:00
Jeremy Stretch
2d4694e72d Merge pull request #4770 from netbox-community/3703-limit-tag-creation
Closes #3703: Restrict tag creation
2020-06-17 12:28:04 -04:00
Jeremy Stretch
54ece346bc DummyQuerySet should be iterable to allow for serialization 2020-06-17 12:20:56 -04:00
Jeremy Stretch
5e71bad5cf Fix serialization of tags upon object deletion 2020-06-17 12:00:50 -04:00
Jeremy Stretch
d1adc5ea9b Update release notes for #3703 2020-06-17 11:29:59 -04:00
Jeremy Stretch
bb755daf8b Update tests 2020-06-17 11:14:41 -04:00
Jeremy Stretch
ef978b2ebf Update TaggedItemTest 2020-06-17 10:50:37 -04:00
Jeremy Stretch
d0f0aef2ef Remove django-taggit-serializer 2020-06-17 10:00:21 -04:00
Jeremy Stretch
448dc1442c Replace TaggitSerializer and TagListSerializerField with TaggedObjectSerializer 2020-06-17 09:57:17 -04:00
Jeremy Stretch
4ae05dddeb Tag should use a stock manager by default 2020-06-16 17:02:03 -04:00
Jeremy Stretch
b318bde76c Fix queryset reference under BulkDeleteView 2020-06-16 16:40:16 -04:00
Jeremy Stretch
c7aa0a2321 Fix prepare_cloned_fields() inefficiency 2020-06-16 15:08:14 -04:00
Jeremy Stretch
58f4e3756c Fix ObjectChangeLogView 2020-06-16 15:04:34 -04:00
Jeremy Stretch
067e89f6a0 Allow unrestricted access to assigned tags 2020-06-16 14:59:22 -04:00
Jeremy Stretch
efed2bc262 Fix restriction violations for rack model 2020-06-16 14:53:51 -04:00
Jeremy Stretch
adf0255bdf Allow unrestricted access to assigned tags 2020-06-16 14:17:40 -04:00
Jeremy Stretch
1e259f3043 Allow unrestricted retrieval of MPTT ancestors 2020-06-16 14:10:56 -04:00
Jeremy Stretch
ffa3a229b5 Fix restriction violations for provider, circuit models 2020-06-16 14:00:43 -04:00
Jeremy Stretch
0f8df8c985 Add unrestricted() to Rack methods 2020-06-16 13:31:51 -04:00
Jeremy Stretch
ed0b38c7a7 Bypass restriction for querysets used for filtering by related object 2020-06-16 13:15:58 -04:00
Jeremy Stretch
fa0ff8be39 Restrict ExportTemplates available via export button 2020-06-16 13:06:03 -04:00
Jeremy Stretch
5d724f6b84 Fix up permissions enforcement for home view, global search 2020-06-16 13:03:38 -04:00
Jeremy Stretch
ffb43a8534 Introduce unrestricted() method on RestrictedQuerySet 2020-06-16 12:20:21 -04:00
Jeremy Stretch
ce5fd7955f Catch and log evaluation of RestrictedQuerySet without calling restrict() 2020-06-16 10:39:15 -04:00
Jeremy Stretch
e917535380 Merge branch 'develop' into develop-2.9 2020-06-15 16:04:32 -04:00
Jeremy Stretch
e905a36fb2 Update tests for tag changes 2020-06-12 11:33:23 -04:00
Jeremy Stretch
7dc4f8d5cc Remove TagField 2020-06-12 10:01:39 -04:00
Jeremy Stretch
da906f48d9 Standardize add, import, and export functionality for tags 2020-06-12 09:48:23 -04:00
Jeremy Stretch
057a022205 Clean up and improve UI view tests 2020-06-11 16:12:50 -04:00
Jeremy Stretch
7a54bd9f2a Changelog and migrations fix for #4615 2020-06-11 13:42:20 -04:00
Jeremy Stretch
9b48a26aef Merge pull request #4723 from jsenecal/4615_interface_label
Closes: #4615 Physical labels
2020-06-11 13:03:46 -04:00
Jonathan Senecal
a37d06064a Add label to DeviceBay models and serializers 2020-06-11 10:19:53 -04:00
Jonathan Senecal
c1eea166c9 Fix tests for LabeledComponentForm
* Added docstring
* Removed redundant tests since refactoration
2020-06-10 22:58:52 -04:00
Jonathan Senecal
25cbab2ea4 Avoid checking field twice on all iterations
Yields a small performance improvement

Co-authored-by: Jeremy Stretch <jeremy.stretch@networktocode.com>
2020-06-10 22:16:46 -04:00
Jonathan Senecal
cf81a8979f Avoid component_type on subclasses 2020-06-10 22:10:45 -04:00
Jonathan Senecal
e3a8638471 Move __str__() to the abstract class 2020-06-10 22:04:45 -04:00
Jeremy Stretch
d26fcc9918 Annotated blocked TODO items 2020-06-10 16:56:24 -04:00
Jeremy Stretch
8e9dc9f20e Add EditObjectViewTestCase for VirtualChassis 2020-06-10 16:51:35 -04:00
Jonathan Senecal
81d08ac50b Stay consistent with codebase: i vs pos 2020-06-10 16:41:52 -04:00
Jeremy Stretch
e13320f58d Fix permissions enforcement for VirtualChassisEditView 2020-06-10 16:37:35 -04:00
Jeremy Stretch
1f727f565f Adopted fix from #4743 and updated API tests 2020-06-10 16:11:28 -04:00
Jeremy Stretch
4078d9b669 Remove extraneous test 2020-06-10 15:22:49 -04:00
Jonathan Senecal
3b54d6f8e5 No need to reference the model itself 2020-06-10 15:11:47 -04:00
Jeremy Stretch
58b4f6abca Update v2.9 release notes 2020-06-10 15:05:15 -04:00
Jonathan Senecal
f041c762ac Prevent the table cell from rendering empty for interface.label
Co-authored-by: Jeremy Stretch <jeremy.stretch@networktocode.com>
2020-06-10 14:59:23 -04:00
Jeremy Stretch
88ae522c9a Closes #4742: Add tagging for cables, power panels, and rack reservations 2020-06-10 14:55:46 -04:00
Jonathan Senecal
5cdaaed311 Use a single migration for labels 2020-06-10 14:04:55 -04:00
Jonathan Senecal
e0037c7f70 pycodestyle 2020-06-08 23:07:53 -04:00
Jonathan Senecal
4301c06d17 Refactorization into LabeledComponentForm 2020-06-08 23:07:12 -04:00
Jonathan Senecal
90bc1cd951 Test forms and views with labels 2020-06-08 20:04:31 -04:00
Jeremy Stretch
67784c0568 Merge pull request #4713 from netbox-community/4348-ldap-auth-backend
Closes #4348: Introduce LDAPBackend
2020-06-08 17:07:52 -04:00
Jonathan Senecal
892c0e3d8b Leftover fix 2020-06-08 17:00:07 -04:00
Jeremy Stretch
54dd20cdb4 Merge pull request #4733 from netbox-community/4730-api-test-permissions
Closes #4730: Update REST API tests to enforce ObjectPermissions
2020-06-08 16:53:22 -04:00
Jeremy Stretch
2f53411efc Extend assertInstanceEqual() to handle M2M relations to ContentType 2020-06-08 16:32:50 -04:00
Jeremy Stretch
7a858cea23 Extend test_bulk_create_objects() to inspect created objects 2020-06-08 15:58:54 -04:00
Jeremy Stretch
987414ed7b Introduce NestedObjectPermissionSerializer 2020-06-08 15:44:16 -04:00
Jeremy Stretch
047286f9c0 Add a third initial object to VirtualChassisTest 2020-06-08 15:27:55 -04:00
Jeremy Stretch
a2955196af Remove extraneous permission class from SecretRoleViewSet 2020-06-08 15:21:11 -04:00
Jeremy Stretch
62224857f0 Standardize ObjectPermissionTest 2020-06-08 14:01:15 -04:00
Jeremy Stretch
c1a37db871 Fix managers on Graph and ExportTemplate 2020-06-08 13:41:12 -04:00
Jeremy Stretch
a8145fe4c2 Add permission assignment to custom test methods 2020-06-08 13:40:46 -04:00
Jeremy Stretch
3b44e7c1c4 Update API test methods to evaluate permissions assignment 2020-06-08 11:52:29 -04:00
Jeremy Stretch
830fd5f83a Remove duplicate test method 2020-06-08 11:22:12 -04:00
Jeremy Stretch
f83e435a90 Move APIViewTestCases to api.py 2020-06-08 10:46:53 -04:00
Jeremy Stretch
0ebd87bcb9 Merge branch 'develop' into develop-2.9 2020-06-08 10:33:23 -04:00
Jonathan Senecal
286a3e6ca2 Add label to forms, views and templates 2020-06-05 13:59:59 -04:00
Jonathan Senecal
d65cead212 Return an empty list if value is None 2020-06-05 12:34:09 -04:00
Jonathan Senecal
e21cbf2a06 Add the label to the string representation 2020-06-05 11:01:39 -04:00
Jonathan Senecal
1fae9aff0c Add label to *port serializers 2020-06-05 10:42:13 -04:00
Jonathan Senecal
a06d74472d Add label to *ports models 2020-06-05 10:32:59 -04:00
Jonathan Senecal
f8851121ab Add the label to the string representation 2020-06-04 17:11:27 -04:00
Jonathan Senecal
e9f8640ee6 Add label to Interface serializers 2020-06-04 16:50:51 -04:00
Jonathan Senecal
cde1db4436 Add label to interface models 2020-06-04 16:44:25 -04:00
Jeremy Stretch
dc161d9f2f Update LDAP configuration documentation 2020-06-03 15:57:11 -04:00
Jeremy Stretch
040fadb0c3 Move LDAP authentication support to LDAPBackend 2020-06-03 15:42:24 -04:00
Jeremy Stretch
bb1484a444 Dropped backward compatibility for the /admin/webhook-backend-status URL 2020-06-03 14:15:29 -04:00
Jeremy Stretch
b31cc89478 Dropped backward compatibility for 'webhooks' Redis queue 2020-06-03 14:13:18 -04:00
Jeremy Stretch
05c851301e Merge pull request #4705 from netbox-community/554-object-permissions
Closes #554: Implement object-based permissions
2020-06-03 13:29:16 -04:00
Jeremy Stretch
dbf6c0a075 Split ObjectPermission model documentation 2020-06-03 13:20:35 -04:00
Jeremy Stretch
3084d58da1 Add REST API endpoint for ObjectPermissions 2020-06-03 13:08:04 -04:00
Jeremy Stretch
19b57aa1ea Update permissions documentation 2020-06-03 10:03:15 -04:00
Jeremy Stretch
d157818d7e Rename attrs to constraints 2020-06-03 09:43:46 -04:00
Jeremy Stretch
ddcd172af1 Rename content_types to object_types 2020-06-03 09:27:20 -04:00
Jeremy Stretch
19407ba3bc Uodate script and report views to use ObjectPermissionRequiredMixin 2020-06-02 15:40:39 -04:00
Jeremy Stretch
3502398d1d Remove delete_token permission from TokenDeleteView 2020-06-02 15:36:31 -04:00
Jeremy Stretch
205acd2c4d Update VirtualChassis views to support ObjectPermissions 2020-06-02 15:33:41 -04:00
Jeremy Stretch
e463430d51 Change CableCreateView to use ObjectEditView 2020-06-02 15:15:57 -04:00
Jeremy Stretch
cae412d280 Update ObjectImportView to support ObjectPermissions 2020-06-02 14:23:04 -04:00
Jeremy Stretch
a62b98ac50 Admin UI improvements 2020-06-02 13:21:58 -04:00
Jeremy Stretch
7a7634de2d Accomodate custom legacy permission in schema migration 2020-06-02 10:50:58 -04:00
Jeremy Stretch
c6e85970d4 Remove activate_userkey permission 2020-06-02 09:51:56 -04:00
Jeremy Stretch
110bad7041 Update custom napalm_read, napalm_write permissions 2020-06-02 09:46:32 -04:00
Jeremy Stretch
85e932bfc1 Clean up permissions utility functions 2020-06-02 09:31:59 -04:00
Jeremy Stretch
7b01ba9776 Fix external auth permissions test 2020-06-01 16:46:14 -04:00
Jeremy Stretch
32620dd556 Changelog for #554 2020-06-01 16:30:20 -04:00
Jeremy Stretch
76f74f479b Support permission attribute assignment via REMOTE_AUTH_DEFAULT_PERMISSIONS 2020-06-01 16:23:45 -04:00
Jeremy Stretch
e9831442cd Drafted documentation for object-based permissions 2020-06-01 15:28:36 -04:00
Jeremy Stretch
5d4cc5bf3d Fix ordering of group and user fields in ObjectPermission admin 2020-06-01 13:59:58 -04:00
Jeremy Stretch
26d7c21314 Move authentication backends 2020-06-01 13:47:34 -04:00
Jeremy Stretch
a4af270ea8 Restrict querysets for home, search views 2020-06-01 13:36:57 -04:00
Jeremy Stretch
b6c38ceb73 Call permission_is_exempt() to check for exempt permissions 2020-06-01 13:17:59 -04:00
Jeremy Stretch
3a9512f086 Refine queryset restriction logic 2020-06-01 13:09:34 -04:00
Jeremy Stretch
9679557747 Add permission_is_exempt() 2020-06-01 12:31:18 -04:00
Jeremy Stretch
3c334a0238 Update views to restrict all querysets 2020-06-01 11:43:49 -04:00
Jeremy Stretch
5574aaa8cb Tweak restrict() to accept only an action keyword 2020-06-01 10:45:49 -04:00
Jeremy Stretch
e23b2c4c4f Implement RestrictedQuerySet as a manager 2020-05-29 16:27:36 -04:00
Jeremy Stretch
5b6a6fb63e Move restrict_queryset() function to RestrictedQuerySet 2020-05-29 15:09:08 -04:00
Jeremy Stretch
58989b85c8 Introduce restrict_queryset() 2020-05-29 14:12:24 -04:00
Jeremy Stretch
8786bb25c5 Fix instance evaluation 2020-05-29 13:57:38 -04:00
Jeremy Stretch
670139492d Fix permission action evaluation 2020-05-29 13:47:19 -04:00
Jeremy Stretch
5d3cf8074b Add migration for replicating legact permissions to ObjectPermissions 2020-05-29 13:42:38 -04:00
Jeremy Stretch
85c54703ec Improve the admin form for ObjectPermissions 2020-05-29 12:08:51 -04:00
Jeremy Stretch
02687453f2 Add ArrayField on ObjectPermission to store actions 2020-05-29 11:25:13 -04:00
Jeremy Stretch
90828cedae Introduce proxy models for User and Group to organize admin UI 2020-05-29 10:43:12 -04:00
Jeremy Stretch
f65b2278f0 Enable many-to-many model assignment for ObjectPermissions 2020-05-28 15:04:46 -04:00
Jeremy Stretch
bdfc0364d5 Fix up ObjectPermission content type assignment 2020-05-28 14:20:18 -04:00
Jeremy Stretch
65bd3fbddb Remove built-in permission assignment from admin UI 2020-05-28 14:03:08 -04:00
Jeremy Stretch
f8e29ea66a Remove ObjectPermissionManager 2020-05-28 13:47:52 -04:00
Jeremy Stretch
a8ed04c4d2 Expose assigned ObjectPermissions on User instance 2020-05-28 13:25:37 -04:00
Jeremy Stretch
73b7eb0c7f Skip queryset filtering for superusers 2020-05-28 13:25:12 -04:00
Jeremy Stretch
486f1a74ab Standardize base classes for view test cases 2020-05-28 12:05:54 -04:00
Jeremy Stretch
5d36d81ae1 Restore model-level permission tests 2020-05-28 11:08:35 -04:00
Jeremy Stretch
dc56e49410 Introduce resolve_permission() utility function 2020-05-28 10:35:59 -04:00
Jeremy Stretch
ca199cdefe Reduce ObjectPermission creation boilerplate 2020-05-28 10:27:25 -04:00
Jeremy Stretch
b2ba9d68c9 Fix default permissions assignment under RemoteUserBackend 2020-05-28 10:04:19 -04:00
Jeremy Stretch
00ce3588d3 Fix secrets API tests 2020-05-28 09:51:02 -04:00
Jeremy Stretch
814aff78b5 Update ObjectPermission evaluation to support null attrs 2020-05-28 09:39:27 -04:00
Jeremy Stretch
a261d10bfd Fix permissions assignment for SecretTest 2020-05-27 17:10:45 -04:00
Jeremy Stretch
ce46512c74 Fix permission assignment in tests 2020-05-27 16:53:30 -04:00
Jeremy Stretch
fb7446487e Fix up permissions evaluation 2020-05-27 11:31:07 -04:00
Jeremy Stretch
a6a88a0d2e Delete extraneous test case 2020-05-27 11:30:36 -04:00
Jeremy Stretch
4cee506710 Rebase RemoteUserBackend on BaseBackend 2020-05-27 10:52:59 -04:00
Jeremy Stretch
5dddf6846b Disable built-in model permissions 2020-05-27 10:48:56 -04:00
Jeremy Stretch
03da9348e5 Merge branch 'develop-2.9' into 554-object-permissions 2020-05-26 16:42:39 -04:00
Jeremy Stretch
28a14cf5ae Merge branch 'develop' into develop-2.9 2020-05-26 16:39:23 -04:00
Jeremy Stretch
635fefcb5c Update exempted tests 2020-05-22 16:33:56 -04:00
Jeremy Stretch
77a49fa40e Extend bulk import/edit/delete view tests to support object-level permissions 2020-05-22 16:04:43 -04:00
Jeremy Stretch
5273b9d0ee Rename ImportObjectsViewTestCase 2020-05-22 14:57:35 -04:00
Jeremy Stretch
ae7445ee8e Test object permissions for individual/list model views 2020-05-22 14:53:52 -04:00
Jeremy Stretch
3ef4287d57 Add additional_permissions to ObjectPermissionRequiredMixin 2020-05-22 12:41:20 -04:00
Jeremy Stretch
581dc4e070 Enforce object-level permissions for CableTraceView 2020-05-22 12:05:34 -04:00
Jeremy Stretch
1bce148be2 Enforce object-level permissions for ObjectConfigContextView 2020-05-22 11:55:56 -04:00
Jeremy Stretch
eb9147a575 Enforce object-level permissions for DeviceBay population views 2020-05-22 11:52:19 -04:00
Jeremy Stretch
781334b615 Enforce object-level permissions for RackElevationListView 2020-05-22 11:51:04 -04:00
Jeremy Stretch
5282ae2250 Enforce object-level permissions for cluster add/remove devices views 2020-05-22 11:30:46 -04:00
Jeremy Stretch
bae050e689 Replace legacy add/edit secret views with SecretEditView 2020-05-22 11:24:49 -04:00
Jeremy Stretch
ab60a5d73d Enforce object-level permissions for IPAddressAssignView, VLANGroupVLANsView 2020-05-22 09:51:57 -04:00
Jeremy Stretch
71d4b5c5df Enforce object-level permissions for circuit termination swap view 2020-05-22 09:45:29 -04:00
Jeremy Stretch
7e64d3e653 Transition BulkComponentCreateView to use ObjectPermissionRequiredMixin 2020-05-22 09:23:00 -04:00
Jeremy Stretch
e7fde2795f Fix BulkDisconnectView 2020-05-21 16:34:15 -04:00
Jeremy Stretch
f36c797e98 Transition ComponentCreateView to use ObjectPermissionRequiredMixin 2020-05-21 16:28:11 -04:00
Jeremy Stretch
49b780358e Transition BulkRenameView, BulkDisconnectView to use ObjectPermissionRequiredMixin 2020-05-21 16:11:46 -04:00
Jeremy Stretch
af8e1a6472 Strip 'param' indicators from docstrings 2020-05-21 16:00:18 -04:00
Jeremy Stretch
91362b0f82 Transition BulkCreateView to use ObjectPermissionRequiredMixin 2020-05-21 15:53:50 -04:00
Jeremy Stretch
e61fc1f709 Introduce ObjectView to enforce object-level permissions for individual object views 2020-05-21 15:53:00 -04:00
Jeremy Stretch
8fd860a413 Transition BulkDeleteView to use ObjectPermissionRequiredMixin 2020-05-21 15:14:29 -04:00
Jeremy Stretch
82c247f3cf Transition BulkEditView to use ObjectPermissionRequiredMixin 2020-05-21 15:07:20 -04:00
Jeremy Stretch
5e5038d780 Transition BulkImportView to use ObjectPermissionRequiredMixin 2020-05-21 14:43:27 -04:00
Jeremy Stretch
2b32430a10 Transition ObjectDeleteView to use ObjectPermissionRequiredMixin 2020-05-21 14:34:40 -04:00
Jeremy Stretch
5381c4e0ae Tweak evaluation of required permission for ObjectEditView 2020-05-21 14:26:56 -04:00
Jeremy Stretch
406b076b95 Transition ObjectEditView to use ObjectPermissionRequiredMixin 2020-05-21 13:59:19 -04:00
Jeremy Stretch
993ee8c900 Transition ObjectListView to use ObjectPermissionRequiredMixin 2020-05-21 13:22:09 -04:00
Jeremy Stretch
cc6e74dfd5 Move ObjectPermissionRequiredMixin to utilities.views 2020-05-21 13:12:15 -04:00
Jeremy Stretch
40c590f445 Add queryset to all BulkImportViews 2020-05-21 12:01:42 -04:00
Jeremy Stretch
5486cff441 Add object permission support, tests for bulk import/edit/delete views 2020-05-21 11:49:50 -04:00
Jeremy Stretch
a928d337d9 Add object permission support for create/update/delete API views 2020-05-21 10:51:40 -04:00
Jeremy Stretch
fa8407371b Swap position of REMOTE_AUTH_BACKEND 2020-05-20 16:56:40 -04:00
Jeremy Stretch
8c40148ca7 Add object permission tests for get and list API views 2020-05-20 16:47:33 -04:00
Jeremy Stretch
8eb4d0a36b Remove ViewExemptBackend; use same for model- and object-level permissions 2020-05-20 16:27:56 -04:00
Jeremy Stretch
64f60228ec Add web UI view tests for object-level permissions 2020-05-20 13:35:54 -04:00
Jeremy Stretch
f3b22acc9a Merge branch 'develop' into develop-2.9 2020-05-15 11:29:07 -04:00
Jeremy Stretch
aeb32104a4 Enforce object-level permissions for API views 2020-05-14 17:44:46 -04:00
Jeremy Stretch
73895b1c88 Bypass permission caching for anonymous users 2020-05-14 17:44:15 -04:00
Jeremy Stretch
f54fb67efc Add object-level support to TokenPermissions 2020-05-14 13:49:52 -04:00
Jeremy Stretch
be5962fb3a ObjectPermissionRequiredMixin should exempt superusers 2020-05-12 17:00:03 -04:00
Jeremy Stretch
94d0ebbd7d Fix ObjectPermission attribute consolidation 2020-05-12 16:51:46 -04:00
Jeremy Stretch
a275a30dca Reimplement the ViewExemptModelBackend to explicitly cache all exempted view permissions on the User instance 2020-05-12 16:07:07 -04:00
Jeremy Stretch
c90f680284 Cache object-level permissions on the User instance for evaluation 2020-05-12 15:42:44 -04:00
Jeremy Stretch
daa2c6ff21 Always pass obj=None to ModelBackend 2020-05-11 17:19:11 -04:00
Jeremy Stretch
63f842c7db Implement ObjectPermissionManager 2020-05-11 16:02:42 -04:00
Jeremy Stretch
06aca2e1d5 Merge branch 'develop-2.9' into 554-object-permissions 2020-05-11 12:48:36 -04:00
Jeremy Stretch
3abb52a085 #4624: Refactor ObjectDeleteView to use a queryset 2020-05-11 12:47:01 -04:00
Jeremy Stretch
87fa6bc252 #4624: Refactor ObjectEditView to use a queryset 2020-05-11 12:37:22 -04:00
Jeremy Stretch
4b5d64939d Introduced ObjectPermissionRequiredMixin 2020-05-11 11:51:11 -04:00
Jeremy Stretch
6624fc6076 Initial work on #554 (WIP) 2020-05-08 17:30:25 -04:00
Jeremy Stretch
43ad9aa2b1 Fix version 2020-05-06 15:20:28 -04:00
1366 changed files with 62349 additions and 31100 deletions

View File

@@ -11,7 +11,7 @@ about: Report a reproducible bug in the current release of NetBox
NetBox installation, or if you have a general question, DO NOT open an
issue. Instead, post to our mailing list:
https://groups.google.com/forum/#!forum/netbox-discuss
https://groups.google.com/g/netbox-discuss
Please describe the environment in which you are running NetBox. Be sure
that you are running an unmodified instance of the latest stable release

View File

@@ -5,5 +5,5 @@ contact_links:
url: https://github.com/netbox-community/netbox/blob/develop/CONTRIBUTING.md
about: Please read through our contributing policy before opening an issue or pull request
- name: 💬 Discussion Group
url: https://groups.google.com/forum/#!forum/netbox-discuss
url: https://groups.google.com/g/netbox-discuss
about: Join our discussion group for assistance with installation issues and other problems

View File

@@ -11,7 +11,7 @@ about: Propose a new NetBox feature or enhancement
If you have a general idea or question, please post to our mailing list
instead of opening an issue:
https://groups.google.com/forum/#!forum/netbox-discuss
https://groups.google.com/g/netbox-discuss
NOTE: Due to an excessive backlog of feature requests, we are not currently
accepting any proposals which significantly extend NetBox's feature scope.
@@ -21,8 +21,8 @@ about: Propose a new NetBox feature or enhancement
before submitting a bug report.
-->
### Environment
* Python version: <!-- Example: 3.6.9 -->
* NetBox version: <!-- Example: 2.7.3 -->
* Python version:
* NetBox version:
<!--
Describe in detail the new functionality you are proposing. Include any

23
.github/lock.yml vendored
View File

@@ -1,23 +0,0 @@
# Configuration for Lock (https://github.com/apps/lock)
# Number of days of inactivity before a closed issue or pull request is locked
daysUntilLock: 90
# Skip issues and pull requests created before a given timestamp. Timestamp must
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
skipCreatedBefore: false
# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
exemptLabels: []
# Label to add before locking, such as `outdated`. Set to `false` to disable
lockLabel: false
# Comment to post before locking. Set to `false` to disable
lockComment: false
# Assign `resolved` as the reason for locking. Set to `false` to disable
setLockReason: true
# Limit to only `issues` or `pulls`
# only: issues

8
.github/stale.yml vendored
View File

@@ -4,19 +4,19 @@
only: issues
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 14
daysUntilStale: 45
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
daysUntilClose: 15
# Issues with these labels will never be considered stale
exemptLabels:
- "status: accepted"
- "status: gathering feedback"
- "status: blocked"
- "status: needs milestone"
# Label to use when marking an issue as stale
staleLabel: wontfix
staleLabel: "pending closure"
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >

21
.github/workflows/lock.yml vendored Normal file
View File

@@ -0,0 +1,21 @@
# lock-threads (https://github.com/marketplace/actions/lock-threads)
name: 'Lock threads'
on:
schedule:
- cron: '0 3 * * *'
jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v2
with:
github-token: ${{ github.token }}
issue-lock-inactive-days: '90'
issue-exclude-created-before: ''
issue-exclude-labels: ''
issue-lock-labels: ''
issue-lock-comment: ''
issue-lock-reason: 'resolved'
process-only: 'issues'

View File

@@ -8,6 +8,7 @@ language: python
python:
- "3.6"
- "3.7"
- "3.8"
install:
- pip install -r requirements.txt
- pip install pycodestyle

View File

@@ -8,7 +8,7 @@ except to report bugs or request features.
We have established a Google Groups Mailing List for issues and general
discussion. This is the best forum for obtaining assistance with NetBox
installation. You can find us [here](https://groups.google.com/forum/#!forum/netbox-discuss).
installation. You can find us [here](https://groups.google.com/g/netbox-discuss).
### Slack
@@ -99,14 +99,22 @@ help prevent wasting time on something that might we might not be able to
implement. When suggesting a new feature, also make sure it won't conflict with
any work that's already in progress.
* Any pull request which does _not_ relate to an accepted issue will be closed.
* Once you've opened or identified an issue you'd like to work on, ask that it
be assigned to you so that others are aware it's being worked on. A maintainer
will then mark the issue as "accepted."
* All major new functionality must include relevant tests where applicable.
* Any pull request which does _not_ relate to an **accepted** issue will be closed.
* All new functionality must include relevant tests where applicable.
* When submitting a pull request, please be sure to work off of the `develop`
branch, rather than `master`. The `develop` branch is used for ongoing
development, while `master` is used for tagging stable releases.
* In most cases, it is not necessary to add a changelog entry: A maintainer will
take care of this when the PR is merged. (This helps avoid merge conflicts
resulting from multiple PRs being submitted simultaneously.)
* All code submissions should meet the following criteria (CI will enforce
these checks):
@@ -132,18 +140,17 @@ accumulating a large backlog of work.
The core maintainers group has chosen to make use of GitHub's [Stale bot](https://github.com/apps/stale)
to aid in issue management.
* Issues will be marked as stale after 14 days of no activity.
* Then after 7 more days of inactivity, the issue will be closed.
* Issues will be marked as stale after 45 days of no activity.
* Then after 15 more days of inactivity, the issue will be closed.
* Any issue bearing one of the following labels will be exempt from all Stale
bot actions:
* `status: accepted`
* `status: gathering feedback`
* `status: blocked`
* `status: needs milestone`
It is natural that some new issues get more attention than others. Often this
is a metric of an issues's overall value to the project. In other cases in
which issues merely get lost in the shuffle, notifications from Stale bot can
bring renewed attention to potentially meaningful issues.
It is natural that some new issues get more attention than others. Stale bot
helps bring renewed attention to potentially valuable issues that may have been
overlooked.
## Maintainer Guidance
@@ -161,7 +168,7 @@ bring renewed attention to potentially meaningful issues.
* Official channels for communication include:
* GitHub issues/pull requests
* The [netbox-discuss](https://groups.google.com/forum/#!forum/netbox-discuss) mailing list
* The [netbox-discuss](https://groups.google.com/g/netbox-discuss) mailing list
* The **#netbox** channel on [NetworkToCode Slack](https://networktocode.slack.com/)
* Maintainers with no substantial recorded activity in a 60-day period will be

View File

@@ -12,7 +12,7 @@ complete list of requirements, see `requirements.txt`. The code is available [on
The complete documentation for NetBox can be found at [Read the Docs](http://netbox.readthedocs.io/en/stable/).
Questions? Comments? Please subscribe to [the netbox-discuss mailing list](https://groups.google.com/forum/#!forum/netbox-discuss),
Questions? Comments? Please subscribe to [the netbox-discuss mailing list](https://groups.google.com/g/netbox-discuss),
or join us in the #netbox Slack channel on [NetworkToCode](https://networktocode.slack.com/)!
### Build Status
@@ -44,7 +44,7 @@ and run `upgrade.sh`.
Feature requests and bug reports must be submitted as GiHub issues. (Please be
sure to use the [appropriate template](https://github.com/netbox-community/netbox/issues/new/choose).)
For general discussion, please consider joining our [mailing list](https://groups.google.com/forum/#!forum/netbox-discuss).
For general discussion, please consider joining our [mailing list](https://groups.google.com/g/netbox-discuss).
If you are interested in contributing to the development of NetBox, please read
our [contributing guide](CONTRIBUTING.md) prior to beginning any work.

View File

@@ -42,10 +42,6 @@ django-tables2
# https://github.com/alex/django-taggit
django-taggit
# A Django REST Framework serializer which represents tags
# https://github.com/glemmaPaul/django-taggit-serializer
django-taggit-serializer
# A Django field for representing time zones
# https://github.com/mfogel/django-timezone-field/
django-timezone-field

View File

@@ -1,21 +1,25 @@
# Caching
To improve performance, NetBox supports caching for most object and list views. Caching is implemented using Redis,
and [django-cacheops](https://github.com/Suor/django-cacheops)
NetBox supports database query caching using [django-cacheops](https://github.com/Suor/django-cacheops) and Redis. When a query is made, the results are cached in Redis for a short period of time, as defined by the [CACHE_TIMEOUT](../../configuration/optional-settings/#cache_timeout) parameter (15 minutes by default). Within that time, all recurrences of that specific query will return the pre-fetched results from the cache.
Several management commands are avaliable for administrators to manually invalidate cache entries in extenuating circumstances.
If a change is made to any of the objects returned by the query within that time, or if the timeout expires, the results are automatically invalidated and the next request for those results will be sent to the database.
To invalidate a specifc model instance (for example a Device with ID 34):
```
python netbox/manage.py invalidate dcim.Device.34
## Invalidating Cached Data
Although caching is performed automatically and rarely requires administrative intervention, NetBox provides the `invalidate` management command to force invalidation of cached results. This command can reference a specific object my its type and numeric ID:
```no-highlight
$ python netbox/manage.py invalidate dcim.Device.34
```
To invalidate all instance of a model:
```
python netbox/manage.py invalidate dcim.Device
Alternatively, it can also delete all cached results for an object type:
```no-highlight
$ python netbox/manage.py invalidate dcim.Device
```
To flush the entire cache database:
```
python netbox/manage.py invalidate all
Finally, calling it with the `all` argument will force invalidation of the entire cache database:
```no-highlight
$ python netbox/manage.py invalidate all
```

View File

@@ -1,9 +1,9 @@
# Change Logging
Every time an object in NetBox is created, updated, or deleted, a serialized copy of that object is saved to the database, along with meta data including the current time and the user associated with the change. These records form a running changelog both for each individual object as well as NetBox as a whole (Organization > Changelog).
Every time an object in NetBox is created, updated, or deleted, a serialized copy of that object is saved to the database, along with meta data including the current time and the user associated with the change. These records form a persistent record of changes both for each individual object as well as NetBox as a whole. The global change log can be viewed by navigating to Other > Change Log.
A serialized representation is included for each object in JSON format. This is similar to how objects are conveyed within the REST API, but does not include any nested representations. For instance, the `tenant` field of a site will record only the tenant's ID, not a representation of the tenant.
A serialized representation of the instance being modified is included in JSON format. This is similar to how objects are conveyed within the REST API, but does not include any nested representations. For instance, the `tenant` field of a site will record only the tenant's ID, not a representation of the tenant.
When a request is made, a random request ID is generated and attached to any change records resulting from the request. For example, editing multiple objects in bulk will create a change record for each object, and each of those objects will be assigned the same request ID. This makes it easy to identify all the change records associated with a particular request.
When a request is made, a UUID is generated and attached to any change records resulting from that request. For example, editing three objects in bulk will create a separate change record for each (three in total), and each of those objects will be associated with the same UUID. This makes it easy to identify all the change records resulting from a particular request.
Change records are exposed in the API via the read-only endpoint `/api/extras/object-changes/`. They may also be exported in CSV format.
Change records are exposed in the API via the read-only endpoint `/api/extras/object-changes/`. They may also be exported via the web UI in CSV format.

View File

@@ -1,3 +0,0 @@
# Context Data
{!docs/models/extras/configcontext.md!}

View File

@@ -1,26 +1,69 @@
# Custom Fields
Each object in NetBox is represented in the database as a discrete table, and each attribute of an object exists as a column within its table. For example, sites are stored in the `dcim_site` table, which has columns named `name`, `facility`, `physical_address`, and so on. As new attributes are added to objects throughout the development of NetBox, tables are expanded to include new rows.
Each model in NetBox is represented in the database as a discrete table, and each attribute of a model exists as a column within its table. For example, sites are stored in the `dcim_site` table, which has columns named `name`, `facility`, `physical_address`, and so on. As new attributes are added to objects throughout the development of NetBox, tables are expanded to include new rows.
However, some users might want to associate with objects attributes that are somewhat esoteric in nature, and that would not make sense to include in the core NetBox database schema. For instance, suppose your organization needs to associate each device with a ticket number pointing to the support ticket that was opened to have it installed. This is certainly a legitimate use for NetBox, but it's perhaps not a common enough need to warrant expanding the internal data schema. Instead, you can create a custom field to hold this data.
However, some users might want to store additional object attributes that are somewhat esoteric in nature, and that would not make sense to include in the core NetBox database schema. For instance, suppose your organization needs to associate each device with a ticket number correlating it with an internal support system record. This is certainly a legitimate use for NetBox, but it's not a common enough need to warrant including a field for _every_ NetBox installation. Instead, you can create a custom field to hold this data.
Custom fields must be created through the admin UI under Extras > Custom Fields. To create a new custom field, select the object(s) to which you want it to apply, and the type of field it will be. NetBox supports six field types:
Within the database, custom fields are stored as JSON data directly alongside each object. This alleviates the need for complex queries when retrieving objects.
* Free-form text (up to 255 characters)
* Integer
* Boolean (true/false)
* Date
* URL
* Selection
## Creating Custom Fields
Assign the field a name. This should be a simple database-friendly string, e.g. `tps_report`. You may optionally assign the field a human-friendly label (e.g. "TPS report") as well; the label will be displayed on forms. If a description is provided, it will appear beneath the field in a form.
Custom fields must be created through the admin UI under Extras > Custom Fields. NetBox supports six types of custom field:
Marking the field as required will require the user to provide a value for the field when creating a new object or when saving an existing object. A default value for the field may also be provided. Use "true" or "false" for boolean fields. (The default value has no effect for selection fields.)
* Text: Free-form text (up to 255 characters)
* Integer: A whole number (positive or negative)
* Boolean: True or false
* Date: A date in ISO 8601 format (YYYY-MM-DD)
* URL: This will be presented as a link in the web UI
* Selection: A selection of one of several pre-defined custom choices
When creating a selection field, you should create at least two choices. These choices will be arranged first by weight, with lower weights appearing higher in the list, and then alphabetically.
Each custom field must have a name; this should be a simple database-friendly string, e.g. `tps_report`. You may also assign a corresponding human-friendly label (e.g. "TPS report"); the label will be displayed on web forms. A weight is also required: Higher-weight fields will be ordered lower within a form. (The default weight is 100.) If a description is provided, it will appear beneath the field in a form.
## Using Custom Fields
Marking a field as required will force the user to provide a value for the field when creating a new object or when saving an existing object. A default value for the field may also be provided. Use "true" or "false" for boolean fields, or the exact value of a choice for selection fields.
When a single object is edited, the form will include any custom fields which have been defined for the object type. These fields are included in the "Custom Fields" panel. On the backend, each custom field value is saved separately from the core object as an independent database call, so it's best to avoid adding too many custom fields per object.
The filter logic controls how values are matched when filtering objects by the custom field. Loose filtering (the default) matches on a partial value, whereas exact matching requires a complete match of the given string to a field's value. For example, exact filtering with the string "red" will only match the exact value "red", whereas loose filtering will match on the values "red", "red-orange", or "bored". Setting the filter logic to "disabled" disables filtering by the field entirely.
When editing multiple objects, custom field values are saved in bulk. There is no significant difference in overhead when saving a custom field value for 100 objects versus one object. However, the bulk operation must be performed separately for each custom field.
A custom field must be assigned to one or object types, or models, in NetBox. Once created, custom fields will automatically appear as part of these models in the web UI and REST API. Note that not all models support custom fields.
### Custom Field Validation
NetBox supports limited custom validation for custom field values. Following are the types of validation enforced for each field type:
* Text: Regular expression (optional)
* Integer: Minimum and/or maximum value (optional)
* Selection: Must exactly match one of the prescribed choices
### Custom Selection Fields
Each custom selection field must have at least two choices. These are specified as a comma-separated list. Choices appear in forms in the order they are listed. Note that choice values are saved exactly as they appear, so it's best to avoid superfluous punctuation or symbols where possible.
If a default value is specified for a selection field, it must exactly match one of the provided choices.
## Custom Fields and the REST API
When retrieving an object via the REST API, all of its custom data will be included within the `custom_fields` attribute. For example, below is the partial output of a site with two custom fields defined:
```json
{
"id": 123,
"url": "http://localhost:8000/api/dcim/sites/123/",
"name": "Raleigh 42",
...
"custom_fields": {
"deployed": "2018-06-19",
"site_code": "US-NC-RAL42"
},
...
```
To set or change these values, simply include nested JSON data. For example:
```json
{
"name": "New Site",
"slug": "new-site",
"custom_fields": {
"deployed": "2019-03-24"
}
}
```

View File

@@ -1,6 +1,6 @@
# Custom Links
Custom links allow users to place arbitrary hyperlinks within NetBox views. These are helpful for cross-referencing related records in external systems. For example, you might create a custom link on the device view which links to the current device in a network monitoring system.
Custom links allow users to display arbitrary hyperlinks to external content within NetBox object views. These are helpful for cross-referencing related records in systems outside of NetBox. For example, you might create a custom link on the device view which links to the current device in a network monitoring system.
Custom links are created under the admin UI. Each link is associated with a particular NetBox object type (site, device, prefix, etc.) and will be displayed on relevant views. Each link is assigned text and a URL, both of which support Jinja2 templating. The text and URL are rendered with the context variable `obj` representing the current object.
@@ -11,33 +11,44 @@ For example, you might define a link like this:
When viewing a device named Router4, this link would render as:
```
```no-highlight
<a href="https://nms.example.com/nodes/?name=Router4">View NMS</a>
```
Custom links appear as buttons at the top right corner of the page. Numeric weighting can be used to influence the ordering of links.
## Context Data
The following context data is available within the template when rendering a custom link's text or URL.
| Variable | Description |
|----------|-------------|
| `obj` | The NetBox object being displayed |
| `debug` | A boolean indicating whether debugging is enabled |
| `request` | The current WSGI request |
| `user` | The current user (if authenticated) |
| `perms` | The [permissions](https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions) assigned to the user |
## Conditional Rendering
Only links which render with non-empty text are included on the page. You can employ conditional Jinja2 logic to control the conditions under which a link gets rendered.
For example, if you only want to display a link for active devices, you could set the link text to
```
```jinja2
{% if obj.status == 'active' %}View NMS{% endif %}
```
The link will not appear when viewing a device with any status other than "active."
Another example, if you want to only show an object of a certain manufacturer, you could set the link text to:
As another example, if you wanted to show only devices belonging to a certain manufacturer, you could do something like this:
```
{% if obj.device_type.manufacturer.name == 'Cisco' %}View NMS {% endif %}
```jinja2
{% if obj.device_type.manufacturer.name == 'Cisco' %}View NMS{% endif %}
```
The link will only appear when viewing a device with a manufacturer name of "Cisco."
## Link Groups
You can specify a group name to organize links into related sets. Grouped links will render as a dropdown menu beneath a
single button bearing the name of the group.
Group names can be specified to organize links into groups. Links with the same group name will render as a dropdown menu beneath a single button bearing the name of the group.

View File

@@ -6,22 +6,24 @@ Custom scripting was introduced to provide a way for users to execute custom log
* Create a range of new reserved prefixes or IP addresses
* Fetch data from an external source and import it to NetBox
Custom scripts are Python code and exist outside of the official NetBox code base, so they can be updated and changed without interfering with the core NetBox installation. And because they're written from scratch, a custom script can be used to accomplish just about anything.
Custom scripts are Python code and exist outside of the official NetBox code base, so they can be updated and changed without interfering with the core NetBox installation. And because they're completely custom, there is no inherent limitation on what a script can accomplish.
## Writing Custom Scripts
All custom scripts must inherit from the `extras.scripts.Script` base class. This class provides the functionality necessary to generate forms and log activity.
```
```python
from extras.scripts import Script
class MyScript(Script):
..
...
```
Scripts comprise two core components: variables and a `run()` method. Variables allow your script to accept user input via the NetBox UI. The `run()` method is where your script's execution logic lives. (Note that your script can have as many methods as needed: this is merely the point of invocation for NetBox.)
Scripts comprise two core components: a set of variables and a `run()` method. Variables allow your script to accept user input via the NetBox UI, but they are optional: If your script does not require any user input, there is no need to define any variables.
```
The `run()` method is where your script's execution logic lives. (Note that your script can have as many methods as needed: this is merely the point of invocation for NetBox.)
```python
class MyScript(Script):
var1 = StringVar(...)
var2 = IntegerVar(...)
@@ -37,17 +39,17 @@ The `run()` method should accept two arguments:
* `commit` - A boolean indicating whether database changes will be committed.
!!! note
The `commit` argument was introduced in NetBox v2.7.8. Backward compatibility is maintained for scripts which accept only the `data` argument, however moving forward scripts should accept both arguments.
The `commit` argument was introduced in NetBox v2.7.8. Backward compatibility is maintained for scripts which accept only the `data` argument, however beginning with v2.10 NetBox will require the `run()` method of every script to accept both arguments. (Either argument may still be ignored within the method.)
Defining variables is optional: You may create a script with only a `run()` method if no user input is needed.
Defining script variables is optional: You may create a script with only a `run()` method if no user input is needed.
Returning output from your script is optional. Any raw output generated by the script will be displayed under the "output" tab in the UI.
Any output generated by the script during its execution will be displayed under the "output" tab in the UI.
## Module Attributes
### `name`
You can define `name` within a script module (the Python file which contains one or more scripts) to set the module name. If `name` is not defined, the filename will be used.
You can define `name` within a script module (the Python file which contains one or more scripts) to set the module name. If `name` is not defined, the module's file name will be used.
## Script Attributes
@@ -61,19 +63,11 @@ This is the human-friendly names of your script. If omitted, the class name will
A human-friendly description of what your script does.
### `field_order`
A list of field names indicating the order in which the form fields should appear. This is optional, and should not be required on Python 3.6 and above. For example:
```
field_order = ['var1', 'var2', 'var3']
```
### `commit_default`
The checkbox to commit database changes when executing a script is checked by default. Set `commit_default` to False under the script's Meta class to leave this option unchecked by default.
```
```python
commit_default = False
```
@@ -83,8 +77,9 @@ Details of the current HTTP request (the one being made to execute the script) a
```python
username = self.request.user.username
ip_address = self.request.META.get('HTTP_X_FORWARDED_FOR') or self.request.META.get('REMOTE_ADDR')
self.log_info("Running as user {} (IP: {})...".format(username, ip_address))
ip_address = self.request.META.get('HTTP_X_FORWARDED_FOR') or \
self.request.META.get('REMOTE_ADDR')
self.log_info(f"Running as user {username} (IP: {ip_address})...")
```
For a complete list of available request parameters, please see the [Django documentation](https://docs.djangoproject.com/en/stable/ref/request-response/).
@@ -112,30 +107,40 @@ Log messages are returned to the user upon execution of the script. Markdown ren
## Variable Reference
### Default Options
All custom script variables support the following default options:
* `default` - The field's default value
* `description` - A brief user-friendly description of the field
* `label` - The field name to be displayed in the rendered form
* `required` - Indicates whether the field is mandatory (all fields are required by default)
* `widget` - The class of form widget to use (see the [Django documentation](https://docs.djangoproject.com/en/stable/ref/forms/widgets/))
### StringVar
Stores a string of characters (i.e. a line of text). Options include:
Stores a string of characters (i.e. text). Options include:
* `min_length` - Minimum number of characters
* `max_length` - Maximum number of characters
* `regex` - A regular expression against which the provided value must match
Note: `min_length` and `max_length` can be set to the same number to effect a fixed-length field.
Note that `min_length` and `max_length` can be set to the same number to effect a fixed-length field.
### TextVar
Arbitrary text of any length. Renders as multi-line text input field.
Arbitrary text of any length. Renders as a multi-line text input field.
### IntegerVar
Stored a numeric integer. Options include:
Stores a numeric integer. Options include:
* `min_value` - Minimum value
* `max_value` - Maximum value
### BooleanVar
A true/false flag. This field has no options beyond the defaults.
A true/false flag. This field has no options beyond the defaults listed above.
### ChoiceVar
@@ -154,11 +159,54 @@ CHOICES = (
direction = ChoiceVar(choices=CHOICES)
```
In the example above, selecting the choice labeled "North" will submit the value `n`.
### MultiChoiceVar
Similar to `ChoiceVar`, but allows for the selection of multiple choices.
### ObjectVar
A NetBox object of a particular type, identified by the associated queryset. Most models will utilize the REST API to retrieve available options: Note that any filtering on the queryset in this case has no effect.
A particular object within NetBox. Each ObjectVar must specify a particular model, and allows the user to select one of the available instances. ObjectVar accepts several arguments, listed below.
* `queryset` - The base [Django queryset](https://docs.djangoproject.com/en/stable/topics/db/queries/) for the model
* `model` - The model class
* `display_field` - The name of the REST API object field to display in the selection list (default: `'name'`)
* `query_params` - A dictionary of query parameters to use when retrieving available options (optional)
* `null_option` - A label representing a "null" or empty choice (optional)
The `display_field` argument is useful when referencing a model which does not have a `name` field. For example, when displaying a list of device types, you would likely use the `model` field:
```python
device_type = ObjectVar(
model=DeviceType,
display_field='model'
)
```
To limit the selections available within the list, additional query parameters can be passed as the `query_params` dictionary. For example, to show only devices with an "active" status:
```python
device = ObjectVar(
model=Device,
query_params={
'status': 'active'
}
)
```
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 (`$`) to the variable's name.
```python
region = ObjectVar(
model=Region
)
site = ObjectVar(
model=Site,
query_params={
'region_id': '$region'
}
)
```
### MultiObjectVar
@@ -166,7 +214,7 @@ Similar to `ObjectVar`, but allows for the selection of multiple objects.
### FileVar
An uploaded file. Note that uploaded files are present in memory only for the duration of the script's execution: They will not be save for future use.
An uploaded file. Note that uploaded files are present in memory only for the duration of the script's execution: They will not be automatically saved for future use. The script is responsible for writing file contents to disk where necessary.
### IPAddressVar
@@ -180,18 +228,32 @@ An IPv4 or IPv6 address with a mask. Returns a `netaddr.IPNetwork` object which
An IPv4 or IPv6 network with a mask. Returns a `netaddr.IPNetwork` object. Two attributes are available to validate the provided mask:
* `min_prefix_length` - Minimum length of the mask (default: none)
* `max_prefix_length` - Maximum length of the mask (default: none)
* `min_prefix_length` - Minimum length of the mask
* `max_prefix_length` - Maximum length of the mask
### Default Options
## Running Custom Scripts
All variables support the following default options:
!!! note
To run a custom script, a user must be assigned the `extras.run_script` permission. This is achieved by assigning the user (or group) a permission on the Script object and specifying the `run` action in the admin UI as shown below.
* `default` - The field's default value
* `description` - A brief description of the field
* `label` - The name of the form field
* `required` - Indicates whether the field is mandatory (default: true)
* `widget` - The class of form widget to use (see the [Django documentation](https://docs.djangoproject.com/en/stable/ref/forms/widgets/))
![Adding the run action to a permission](../../media/admin_ui_run_permission.png)
### Via the Web UI
Custom scripts can be run via the web UI by navigating to the script, completing any required form data, and clicking the "run script" button.
### Via the API
To run a script via the REST API, issue a POST request to the script's endpoint specifying the form data and commitment. For example, to run a script named `example.MyReport`, we would make a request such as the following:
```no-highlight
curl -X POST \
-H "Authorization: Token $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json; indent=4" \
http://netbox/api/extras/scripts/example.MyReport/ \
--data '{"data": {"foo": "somevalue", "bar": 123}, "commit": true}'
```
## Example
@@ -203,11 +265,11 @@ Below is an example script that creates new objects for a planned site. The user
These variables are presented as a web form to be completed by the user. Once submitted, the script's `run()` method is called to create the appropriate objects.
```
```python
from django.utils.text import slugify
from dcim.choices import DeviceStatusChoices, SiteStatusChoices
from dcim.models import Device, DeviceRole, DeviceType, Site
from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site
from extras.scripts import *
@@ -224,9 +286,17 @@ class NewBranchScript(Script):
switch_count = IntegerVar(
description="Number of access switches to create"
)
manufacturer = ObjectVar(
model=Manufacturer,
required=False
)
switch_model = ObjectVar(
description="Access switch model",
queryset = DeviceType.objects.all()
model=DeviceType,
display_field='model',
query_params={
'manufacturer_id': '$manufacturer'
}
)
def run(self, data, commit):
@@ -238,20 +308,20 @@ class NewBranchScript(Script):
status=SiteStatusChoices.STATUS_PLANNED
)
site.save()
self.log_success("Created new site: {}".format(site))
self.log_success(f"Created new site: {site}")
# Create access switches
switch_role = DeviceRole.objects.get(name='Access Switch')
for i in range(1, data['switch_count'] + 1):
switch = Device(
device_type=data['switch_model'],
name='{}-switch{}'.format(site.slug, i),
name=f'{site.slug}-switch{i}',
site=site,
status=DeviceStatusChoices.STATUS_PLANNED,
device_role=switch_role
)
switch.save()
self.log_success("Created new switch: {}".format(switch))
self.log_success(f"Created new switch: {switch}")
# Generate a CSV table of new devices
output = [

View File

@@ -4,9 +4,14 @@ NetBox allows users to define custom templates that can be used when exporting o
Each export template is associated with a certain type of object. For instance, if you create an export template for VLANs, your custom template will appear under the "Export" button on the VLANs list.
Export templates are written in [Django's template language](https://docs.djangoproject.com/en/stable/ref/templates/language/), which is very similar to Jinja2. The list of objects returned from the database is stored in the `queryset` variable, which you'll typically want to iterate through using a `for` loop. Object properties can be access by name. For example:
Export templates may be written in Jinja2 or [Django's template language](https://docs.djangoproject.com/en/stable/ref/templates/language/), which is very similar to Jinja2.
```
!!! warning
Support for Django's native templating logic will be removed in NetBox v2.10.
The list of objects returned from the database when rendering an export template is stored in the `queryset` variable, which you'll typically want to iterate through using a `for` loop. Object properties can be access by name. For example:
```jinja2
{% for rack in queryset %}
Rack: {{ rack.name }}
Site: {{ rack.site.name }}

View File

@@ -1,30 +0,0 @@
# Graphs
NetBox does not have the ability to generate graphs natively, but this feature allows you to embed contextual graphs from an external resources (such as a monitoring system) inside the site, provider, and interface views. Each embedded graph must be defined with the following parameters:
* **Type:** Site, device, provider, or interface. This determines in which view the graph will be displayed.
* **Weight:** Determines the order in which graphs are displayed (lower weights are displayed first). Graphs with equal weights will be ordered alphabetically by name.
* **Name:** The title to display above the graph.
* **Source URL:** The source of the image to be embedded. The associated object will be available as a template variable named `obj`.
* **Link URL (optional):** A URL to which the graph will be linked. The associated object will be available as a template variable named `obj`.
Graph names and links can be rendered using the Django or Jinja2 template languages.
!!! warning
Support for the Django templating language will be removed in NetBox v2.8. Jinja2 is recommended.
## Examples
You only need to define one graph object for each graph you want to include when viewing an object. For example, if you want to include a graph of traffic through an interface over the past five minutes, your graph source might looks like this:
```
https://my.nms.local/graphs/?node={{ obj.device.name }}&interface={{ obj.name }}&duration=5m
```
You can define several graphs to provide multiple contexts when viewing an object. For example:
```
https://my.nms.local/graphs/?type=throughput&node={{ obj.device.name }}&interface={{ obj.name }}&duration=60m
https://my.nms.local/graphs/?type=throughput&node={{ obj.device.name }}&interface={{ obj.name }}&duration=24h
https://my.nms.local/graphs/?type=errors&node={{ obj.device.name }}&interface={{ obj.name }}&duration=60m
```

View File

@@ -1,11 +1,13 @@
# NAPALM
NetBox supports integration with the [NAPALM automation](https://napalm-automation.net/) library. NAPALM allows NetBox to fetch live data from devices and return it to a requester via its REST API.
NetBox supports integration with the [NAPALM automation](https://napalm-automation.net/) library. NAPALM allows NetBox to serve a proxy for operational data, fetching live data from network devices and returning it to a requester via its REST API. Note that NetBox does not store any NAPALM data locally.
!!! info
To enable the integration, the NAPALM library must be installed. See [installation steps](../../installation/3-netbox/#napalm-automation-optional) for more information.
!!! note
To enable this integration, the NAPALM library must be installed. See [installation steps](../../installation/3-netbox/#napalm) for more information.
```
Below is an example REST API request and response:
```no-highlight
GET /api/dcim/devices/1/napalm/?method=get_environment
{
@@ -15,13 +17,16 @@ GET /api/dcim/devices/1/napalm/?method=get_environment
}
```
!!! note
To make NAPALM requests via the NetBox REST API, a NetBox user must have assigned a permission granting the `napalm_read` action for the device object type.
## Authentication
By default, the [`NAPALM_USERNAME`](../../configuration/optional-settings/#napalm_username) and [`NAPALM_PASSWORD`](../../configuration/optional-settings/#napalm_password) are used for NAPALM authentication. They can be overridden for an individual API call through the `X-NAPALM-Username` and `X-NAPALM-Password` headers.
By default, the [`NAPALM_USERNAME`](../../configuration/optional-settings/#napalm_username) and [`NAPALM_PASSWORD`](../../configuration/optional-settings/#napalm_password) configuration parameters are used for NAPALM authentication. They can be overridden for an individual API call by specifying the `X-NAPALM-Username` and `X-NAPALM-Password` headers.
```
$ curl "http://localhost/api/dcim/devices/1/napalm/?method=get_environment" \
-H "Authorization: Token f4b378553dacfcfd44c5a0b9ae49b57e29c552b5" \
-H "Authorization: Token $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json; indent=4" \
-H "X-NAPALM-Username: foo" \
@@ -30,13 +35,13 @@ $ curl "http://localhost/api/dcim/devices/1/napalm/?method=get_environment" \
## Method Support
The list of supported NAPALM methods depends on the [NAPALM driver](https://napalm.readthedocs.io/en/latest/support/index.html#general-support-matrix) configured for the platform of a device. NetBox only supports [get](https://napalm.readthedocs.io/en/latest/support/index.html#getters-support-matrix) methods.
The list of supported NAPALM methods depends on the [NAPALM driver](https://napalm.readthedocs.io/en/latest/support/index.html#general-support-matrix) configured for the platform of a device. Because there is no granular mechanism in place for limiting potentially disruptive requests, NetBox supports only read-only [get](https://napalm.readthedocs.io/en/latest/support/index.html#getters-support-matrix) methods.
## Multiple Methods
More than one method in an API call can be invoked by adding multiple `method` parameters. For example:
It is possible to request the output of multiple NAPALM methods in a single API request by passing multiple `method` parameters. For example:
```
```no-highlight
GET /api/dcim/devices/1/napalm/?method=get_ntp_servers&method=get_ntp_peers
{
@@ -51,14 +56,11 @@ GET /api/dcim/devices/1/napalm/?method=get_ntp_servers&method=get_ntp_peers
## Optional Arguments
The behavior of NAPALM drivers can be adjusted according to the [optional arguments](https://napalm.readthedocs.io/en/latest/support/index.html#optional-arguments). NetBox exposes those arguments using headers prefixed with `X-NAPALM-`.
For instance, the SSH port is changed to 2222 in this API call:
The behavior of NAPALM drivers can be adjusted according to the [optional arguments](https://napalm.readthedocs.io/en/latest/support/index.html#optional-arguments). NetBox exposes those arguments using headers prefixed with `X-NAPALM-`. For example, the SSH port is changed to 2222 in this API call:
```
$ curl "http://localhost/api/dcim/devices/1/napalm/?method=get_environment" \
-H "Authorization: Token f4b378553dacfcfd44c5a0b9ae49b57e29c552b5" \
-H "Authorization: Token $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json; indent=4" \
-H "X-NAPALM-port: 2222"

View File

@@ -23,16 +23,7 @@ For the exhaustive list of exposed metrics, visit the `/metrics` endpoint on you
## Multi Processing Notes
When deploying NetBox in a multiprocess mannor--such as using Gunicorn as recomented in the installation docs--the Prometheus client library requires the use of a shared directory
to collect metrics from all the worker processes. This can be any arbitrary directory to which the processes have read/write access. This directory is then made available by use of the
`prometheus_multiproc_dir` environment variable.
When deploying NetBox in a multiprocess manner (e.g. running multiple Gunicorn workers) the Prometheus client library requires the use of a shared directory to collect metrics from all worker processes. To configure this, first create or designate a local directory to which the worker processes have read and write access, and then configure your WSGI service (e.g. Gunicorn) to define this path as the `prometheus_multiproc_dir` environment variable.
This can be setup by first creating a shared directory and then adding this line (with the appropriate directory) to the `[program:netbox]` section of the supervisor config file.
```
environment=prometheus_multiproc_dir=/tmp/prometheus_metrics
```
#### Accuracy
If having accurate long-term metrics in a multiprocess environment is important to you then it's recommended you use the `uwsgi` library instead of `gunicorn`. The issue lies in the way `gunicorn` tracks worker processes (vs `uwsgi`) which helps manage the metrics files created by the above configurations. If you're using Netbox with gunicorn in a containerized enviroment following the one-process-per-container methodology, then you will likely not need to change to `uwsgi`. More details can be found in [issue #3779](https://github.com/netbox-community/netbox/issues/3779#issuecomment-590547562).
!!! warning
If having accurate long-term metrics in a multiprocess environment is crucial to your deployment, it's recommended you use the `uwsgi` library instead of `gunicorn`. The issue lies in the way `gunicorn` tracks worker processes (vs `uwsgi`) which helps manage the metrics files created by the above configurations. If you're using Netbox with gunicorn in a containerized enviroment following the one-process-per-container methodology, then you will likely not need to change to `uwsgi`. More details can be found in [issue #3779](https://github.com/netbox-community/netbox/issues/3779#issuecomment-590547562).

View File

@@ -101,11 +101,14 @@ Once you have created a report, it will appear in the reports list. Initially, r
## Running Reports
!!! note
To run a report, a user must be assigned the `extras.run_report` permission. This is achieved by assigning the user (or group) a permission on the Report object and specifying the `run` action in the admin UI as shown below.
![Adding the run action to a permission](../../media/admin_ui_run_permission.png)
### Via the Web UI
Reports can be run via the web UI by navigating to the report and clicking the "run report" button at top right. Note that a user must have permission to create ReportResults in order to run reports. (Permissions can be assigned through the admin UI.)
Once a report has been run, its associated results will be included in the report view.
Reports can be run via the web UI by navigating to the report and clicking the "run report" button at top right. Once a report has been run, its associated results will be included in the report view.
### Via the API

View File

@@ -1,3 +0,0 @@
# Tagging
{!docs/models/extras/tag.md!}

View File

@@ -1,6 +1,6 @@
# Webhooks
A webhook is a mechanism for conveying to some external system a change that took place in NetBox. For example, you may want to notify a monitoring system whenever a device status is changed in NetBox. This can be done by creating a webhook for the device model in NetBox. When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. Webhooks are configured in the admin UI under Extras > Webhooks.
A webhook is a mechanism for conveying to some external system a change that took place in NetBox. For example, you may want to notify a monitoring system whenever the status of a device is updated in NetBox. This can be done by creating a webhook for the device model in NetBox and identifying the webhook receiver. When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. Webhooks are configured in the admin UI under Extras > Webhooks.
## Configuration
@@ -8,7 +8,7 @@ A webhook is a mechanism for conveying to some external system a change that too
* **Object type(s)** - The type or types of NetBox object that will trigger the webhook.
* **Enabled** - If unchecked, the webhook will be inactive.
* **Events** - A webhook may trigger on any combination of create, update, and delete events. At least one event type must be selected.
* **HTTP method** - The type of HTTP request to send. Options include GET, POST, PUT, PATCH, and DELETE.
* **HTTP method** - The type of HTTP request to send. Options include `GET`, `POST`, `PUT`, `PATCH`, and `DELETE`.
* **URL** - The fuly-qualified URL of the request to be sent. This may specify a destination port number if needed.
* **HTTP content type** - The value of the request's `Content-Type` header. (Defaults to `application/json`)
* **Additional headers** - Any additional headers to include with the request (optional). Add one header per line in the format `Name: Value`. Jinja2 templating is supported for this field (see below).
@@ -19,13 +19,13 @@ A webhook is a mechanism for conveying to some external system a change that too
## Jinja2 Template Support
[Jinja2 templating](https://jinja.palletsprojects.com/) is supported for the `additional_headers` and `body_template` fields. This enables the user to convey change data in the request headers as well as to craft a customized request body. Request content can be crafted to enable the direct interaction with external systems by ensuring the outgoing message is in a format the receiver expects and understands.
[Jinja2 templating](https://jinja.palletsprojects.com/) is supported for the `additional_headers` and `body_template` fields. This enables the user to convey object data in the request headers as well as to craft a customized request body. Request content can be crafted to enable the direct interaction with external systems by ensuring the outgoing message is in a format the receiver expects and understands.
For example, you might create a NetBox webhook to [trigger a Slack message](https://api.slack.com/messaging/webhooks) any time an IP address is created. You can accomplish this using the following configuration:
* Object type: IPAM > IP address
* HTTP method: POST
* URL: <Slack incoming webhook URL>
* HTTP method: `POST`
* URL: Slack incoming webhook URL
* HTTP content type: `application/json`
* Body template: `{"text": "IP address {{ data['address'] }} was created by {{ username }}!"}`

View File

@@ -1,12 +1,12 @@
# The NetBox Python Shell
NetBox includes a Python shell within which objects can be directly queried, created, modified, and deleted. To enter the shell, run the following command:
NetBox includes a Python management shell within which objects can be directly queried, created, modified, and deleted. To enter the shell, run the following command:
```
./manage.py nbshell
```
This will launch a customized version of [the built-in Django shell](https://docs.djangoproject.com/en/stable/ref/django-admin/#shell) with all relevant NetBox models pre-loaded. (If desired, the stock Django shell is also available by executing `./manage.py shell`.)
This will launch a lightly customized version of [the built-in Django shell](https://docs.djangoproject.com/en/stable/ref/django-admin/#shell) with all relevant NetBox models pre-loaded. (If desired, the stock Django shell is also available by executing `./manage.py shell`.)
```
$ ./manage.py nbshell
@@ -28,13 +28,17 @@ DCIM:
...
```
!!! warning
The NetBox shell affords direct access to NetBox data and function with very little validation in place. As such, it is crucial to ensure that only authorized, knowledgeable users are ever granted access to it. Never perform any action in the management shell without having a full backup in place.
## Querying Objects
Objects are retrieved by forming a [Django queryset](https://docs.djangoproject.com/en/stable/topics/db/queries/#retrieving-objects). The base queryset for an object takes the form `<model>.objects.all()`, which will return a (truncated) list of all objects of that type.
Objects are retrieved from the database using a [Django queryset](https://docs.djangoproject.com/en/stable/topics/db/queries/#retrieving-objects). The base queryset for an object takes the form `<model>.objects.all()`, which will return a (truncated) list of all objects of that type.
```
>>> Device.objects.all()
<QuerySet [<Device: TestDevice1>, <Device: TestDevice2>, <Device: TestDevice3>, <Device: TestDevice4>, <Device: TestDevice5>, '...(remaining elements truncated)...']>
<QuerySet [<Device: TestDevice1>, <Device: TestDevice2>, <Device: TestDevice3>,
<Device: TestDevice4>, <Device: TestDevice5>, '...(remaining elements truncated)...']>
```
Use a `for` loop to cycle through all objects in the list:
@@ -43,11 +47,11 @@ Use a `for` loop to cycle through all objects in the list:
>>> for device in Device.objects.all():
... print(device.name, device.device_type)
...
(u'TestDevice1', <DeviceType: PacketThingy 9000>)
(u'TestDevice2', <DeviceType: PacketThingy 9000>)
(u'TestDevice3', <DeviceType: PacketThingy 9000>)
(u'TestDevice4', <DeviceType: PacketThingy 9000>)
(u'TestDevice5', <DeviceType: PacketThingy 9000>)
('TestDevice1', <DeviceType: PacketThingy 9000>)
('TestDevice2', <DeviceType: PacketThingy 9000>)
('TestDevice3', <DeviceType: PacketThingy 9000>)
('TestDevice4', <DeviceType: PacketThingy 9000>)
('TestDevice5', <DeviceType: PacketThingy 9000>)
...
```
@@ -67,52 +71,53 @@ To retrieve a particular object (typically by its primary key or other unique fi
### Filtering Querysets
In most cases, you want to retrieve only a specific subset of objects. To filter a queryset, replace `all()` with `filter()` and pass one or more keyword arguments. For example:
In most cases, you will want to retrieve only a specific subset of objects. To filter a queryset, replace `all()` with `filter()` and pass one or more keyword arguments. For example:
```
>>> Device.objects.filter(status=STATUS_ACTIVE)
<QuerySet [<Device: TestDevice1>, <Device: TestDevice2>, <Device: TestDevice3>, <Device: TestDevice8>, <Device: TestDevice9>, '...(remaining elements truncated)...']>
>>> Device.objects.filter(status="active")
<QuerySet [<Device: TestDevice1>, <Device: TestDevice2>, <Device: TestDevice3>,
<Device: TestDevice8>, <Device: TestDevice9>, '...(remaining elements truncated)...']>
```
Querysets support slicing to return a specific range of objects.
```
>>> Device.objects.filter(status=STATUS_ACTIVE)[:3]
>>> Device.objects.filter(status="active")[:3]
<QuerySet [<Device: TestDevice1>, <Device: TestDevice2>, <Device: TestDevice3>]>
```
The `count()` method can be appended to the queryset to return a count of objects rather than the full list.
```
>>> Device.objects.filter(status=STATUS_ACTIVE).count()
>>> Device.objects.filter(status="active").count()
982
```
Relationships with other models can be traversed by concatenating field names with a double-underscore. For example, the following will return all devices assigned to the tenant named "Pied Piper."
Relationships with other models can be traversed by concatenating attribute names with a double-underscore. For example, the following will return all devices assigned to the tenant named "Pied Piper."
```
>>> Device.objects.filter(tenant__name='Pied Piper')
>>> Device.objects.filter(tenant__name="Pied Piper")
```
This approach can span multiple levels of relations. For example, the following will return all IP addresses assigned to a device in North America:
```
>>> IPAddress.objects.filter(interface__device__site__region__slug='north-america')
>>> IPAddress.objects.filter(interface__device__site__region__slug="north-america")
```
!!! note
While the above query is functional, it is very inefficient. There are ways to optimize such requests, however they are out of the scope of this document. For more information, see the [Django queryset method reference](https://docs.djangoproject.com/en/stable/ref/models/querysets/) documentation.
While the above query is functional, it's not very efficient. There are ways to optimize such requests, however they are out of scope for this document. For more information, see the [Django queryset method reference](https://docs.djangoproject.com/en/stable/ref/models/querysets/) documentation.
Reverse relationships can be traversed as well. For example, the following will find all devices with an interface named "em0":
```
>>> Device.objects.filter(interfaces__name='em0')
>>> Device.objects.filter(interfaces__name="em0")
```
Character fields can be filtered against partial matches using the `contains` or `icontains` field lookup (the later of which is case-insensitive).
```
>>> Device.objects.filter(name__icontains='testdevice')
>>> Device.objects.filter(name__icontains="testdevice")
```
Similarly, numeric fields can be filtered by values less than, greater than, and/or equal to a given value.
@@ -124,7 +129,7 @@ Similarly, numeric fields can be filtered by values less than, greater than, and
Multiple filters can be combined to further refine a queryset.
```
>>> VLAN.objects.filter(vid__gt=2000, name__icontains='engineering')
>>> VLAN.objects.filter(vid__gt=2000, name__icontains="engineering")
```
To return the inverse of a filtered queryset, use `exclude()` instead of `filter()`.
@@ -132,18 +137,18 @@ To return the inverse of a filtered queryset, use `exclude()` instead of `filter
```
>>> Device.objects.count()
4479
>>> Device.objects.filter(status=STATUS_ACTIVE).count()
>>> Device.objects.filter(status="active").count()
4133
>>> Device.objects.exclude(status=STATUS_ACTIVE).count()
>>> Device.objects.exclude(status="active").count()
346
```
!!! info
The examples above are intended only to provide a cursory introduction to queryset filtering. For an exhaustive list of the available filters, please consult the [Django queryset API docs](https://docs.djangoproject.com/en/stable/ref/models/querysets/).
The examples above are intended only to provide a cursory introduction to queryset filtering. For an exhaustive list of the available filters, please consult the [Django queryset API documentation](https://docs.djangoproject.com/en/stable/ref/models/querysets/).
## Creating and Updating Objects
New objects can be created by instantiating the desired model, defining values for all required attributes, and calling `save()` on the instance.
New objects can be created by instantiating the desired model, defining values for all required attributes, and calling `save()` on the instance. For example, we can create a new VLAN by specifying its numeric ID, name, and assigned site:
```
>>> lab1 = Site.objects.get(pk=7)
@@ -151,22 +156,22 @@ New objects can be created by instantiating the desired model, defining values f
>>> myvlan.save()
```
Alternatively, the above can be performed as a single operation:
Alternatively, the above can be performed as a single operation. (Note, however, that `save()` does _not_ return the new instance for reuse.)
```
>>> VLAN(vid=123, name='MyNewVLAN', site=Site.objects.get(pk=7)).save()
```
To modify an object, retrieve it, update the desired field(s), and call `save()` again.
To modify an existing object, we retrieve it, update the desired field(s), and call `save()` again.
```
>>> vlan = VLAN.objects.get(pk=1280)
>>> vlan.name
u'MyNewVLAN'
'MyNewVLAN'
>>> vlan.name = 'BetterName'
>>> vlan.save()
>>> VLAN.objects.get(pk=1280).name
u'BetterName'
'BetterName'
```
!!! warning
@@ -180,7 +185,7 @@ To delete an object, simply call `delete()` on its instance. This will return a
>>> vlan
<VLAN: 123 (BetterName)>
>>> vlan.delete()
(1, {u'extras.CustomFieldValue': 0, u'ipam.VLAN': 1})
(1, {'ipam.VLAN': 1})
```
To delete multiple objects at once, call `delete()` on a filtered queryset. It's a good idea to always sanity-check the count of selected objects _before_ deleting them.
@@ -189,8 +194,10 @@ To delete multiple objects at once, call `delete()` on a filtered queryset. It's
>>> Device.objects.filter(name__icontains='test').count()
27
>>> Device.objects.filter(name__icontains='test').delete()
(35, {u'extras.CustomFieldValue': 0, u'dcim.DeviceBay': 0, u'secrets.Secret': 0, u'dcim.InterfaceConnection': 4, u'extras.ImageAttachment': 0, u'dcim.Device': 27, u'dcim.Interface': 4, u'dcim.ConsolePort': 0, u'dcim.PowerPort': 0})
(35, {'dcim.DeviceBay': 0, 'secrets.Secret': 0, 'dcim.InterfaceConnection': 4,
'extras.ImageAttachment': 0, 'dcim.Device': 27, 'dcim.Interface': 4,
'dcim.ConsolePort': 0, 'dcim.PowerPort': 0})
```
!!! warning
Deletions are immediate and irreversible. Always think very carefully before calling `delete()` on an instance or queryset.
Deletions are immediate and irreversible. Always consider the impact of deleting objects carefully before calling `delete()` on an instance or queryset.

View File

@@ -0,0 +1,45 @@
# Permissions
NetBox v2.9 introduced a new object-based permissions framework, which replace's Django's built-in permissions model. Object-based permissions enable an administrator to grant users or groups the ability to perform an action on arbitrary subsets of objects in NetBox, rather than all objects of a certain type. For example, it is possible to grant a user permission to view only sites within a particular region, or to modify only VLANs with a numeric ID within a certain range.
{!docs/models/users/objectpermission.md!}
### Example Constraint Definitions
| Constraints | Description |
| ----------- | ----------- |
| `{"status": "active"}` | Status is active |
| `{"status__in": ["planned", "reserved"]}` | Status is active **OR** reserved |
| `{"status": "active", "role": "testing"}` | Status is active **OR** role is testing |
| `{"name__startswith": "Foo"}` | Name starts with "Foo" (case-sensitive) |
| `{"name__iendswith": "bar"}` | Name ends with "bar" (case-insensitive) |
| `{"vid__gte": 100, "vid__lt": 200}` | VLAN ID is greater than or equal to 100 **AND** less than 200 |
| `[{"vid__lt": 200}, {"status": "reserved"}]` | VLAN ID is less than 200 **OR** status is reserved |
## Permissions Enforcement
### Viewing Objects
Object-based permissions work by filtering the database query generated by a user's request to restrict the set of objects returned. When a request is received, NetBox first determines whether the user is authenticated and has been granted to perform the requested action. For example, if the requested URL is `/dcim/devices/`, NetBox will check for the `dcim.view_device` permission. If the user has not been assigned this permission (either directly or via a group assignment), NetBox will return a 403 (forbidden) HTTP response.
If the permission _has_ been granted, NetBox will compile any specified constraints for the model and action. For example, suppose two permissions have been assigned to the user granting view access to the device model, with the following constraints:
```json
[
{"site__name__in": ["NYC1", "NYC2"]},
{"status": "offline", "tenant__isnull": true}
]
```
This grants the user access to view any device that is assigned to a site named NYC1 or NYC2, **or** which has a status of "offline" and has no tenant assigned. These constraints are equivalent to the following ORM query:
```no-highlight
Site.objects.filter(
Q(site__name__in=['NYC1', 'NYC2']),
Q(status='active', tenant__isnull=True)
)
```
### Creating and Modifying Objects
The same sort of logic is in play when a user attempts to create or modify an object in NetBox, with a twist. Once validation has completed, NetBox starts an atomic database transaction to facilitate the change, and the object is created or saved normally. Next, still within the transaction, NetBox issues a second query to retrieve the newly created/updated object, filtering the restricted queryset with the object's primary key. If this query fails to return the object, NetBox knows that the new revision does not match the constraints imposed by the permission. The transaction is then rolled back, leaving the database in its original state prior to the change, and the user is informed of the violation.

View File

@@ -2,7 +2,7 @@
## Replicating the Database
NetBox uses [PostgreSQL](https://www.postgresql.org/) for its database, so general PostgreSQL best practices will apply to NetBox. You can dump and restore the database using the `pg_dump` and `psql` utilities, respectively.
NetBox employs a [PostgreSQL](https://www.postgresql.org/) database, so general PostgreSQL best practices apply here. The database can be written to a file and restored using the `pg_dump` and `psql` utilities, respectively.
!!! note
The examples below assume that your database is named `netbox`.
@@ -23,8 +23,10 @@ pg_dump --exclude-table-data=extras_objectchange netbox > netbox.sql
### Load an Exported Database
When restoring a database from a file, it's recommended to delete any existing database first to avoid potential conflicts.
!!! warning
This will destroy and replace any existing instance of the database.
The following will destroy and replace any existing instance of the database.
```no-highlight
psql -c 'drop database netbox'
@@ -41,17 +43,15 @@ If you want to export only the database schema, and not the data itself (e.g. fo
```no-highlight
pg_dump -s netbox > netbox_schema.sql
```
If you are migrating your instance of NetBox to a different machine, please make sure you invalidate the cache by performing this command:
```no-highlight
python3 manage.py invalidate all
```
---
## Replicating Media
## Replicating Uploaded Media
NetBox stored uploaded files (such as image attachments) in its media directory. To fully replicate an instance of NetBox, you'll need to copy both the database and the media files.
By default, NetBox stores uploaded files (such as image attachments) in its media directory. To fully replicate an instance of NetBox, you'll need to copy both the database and the media files.
!!! note
These operations are not necessary if your installation is utilizing a [remote storage backend](../../configuration/optional-settings/#storage_backend).
### Archive the Media Directory
@@ -68,3 +68,14 @@ To extract the saved archive into a new installation, run the following from the
```no-highlight
tar -xf netbox_media.tar.gz
```
---
## Cache Invalidation
If you are migrating your instance of NetBox to a different machine, be sure to first invalidate the cache on the original instance by issuing the `invalidate all` management command (within the Python virtual environment):
```no-highlight
# source /opt/netbox/venv/bin/activate
(venv) # python3 manage.py invalidate all
```

View File

@@ -1,42 +0,0 @@
# REST API Authentication
The NetBox API employs token-based authentication. For convenience, cookie authentication can also be used when navigating the browsable API.
{!docs/models/users/token.md!}
## Authenticating to the API
By default, read operations will be available without authentication. In this case, a token may be included in the request, but is not necessary.
```
$ curl -H "Accept: application/json; indent=4" http://localhost/api/dcim/sites/
{
"count": 10,
"next": null,
"previous": null,
"results": [...]
}
```
However, if the [`LOGIN_REQUIRED`](../../configuration/optional-settings/#login_required) configuration setting has been set to `True`, all requests must be authenticated.
```
$ curl -H "Accept: application/json; indent=4" http://localhost/api/dcim/sites/
{
"detail": "Authentication credentials were not provided."
}
```
To authenticate to the API, set the HTTP `Authorization` header to the string `Token ` (note the trailing space) followed by the token key.
```
$ curl -H "Authorization: Token d2f763479f703d80de0ec15254237bc651f9cdc0" -H "Accept: application/json; indent=4" http://localhost/api/dcim/sites/
{
"count": 10,
"next": null,
"previous": null,
"results": [...]
}
```
Additionally, the browsable interface to the API (which can be seen by navigating to the API root `/api/` in a web browser) will attempt to authenticate requests using the same cookie that the normal NetBox front end uses. Thus, if you have logged into NetBox, you will be logged into the browsable API as well.

View File

@@ -1,162 +0,0 @@
# API Examples
Supported HTTP methods:
* `GET`: Retrieve an object or list of objects
* `POST`: Create a new object
* `PUT`: Update an existing object, all mandatory fields must be specified
* `PATCH`: Updates an existing object, only specifying the field to be changed
* `DELETE`: Delete an existing object
To authenticate a request, attach your token in an `Authorization` header:
```
curl -H "Authorization: Token d2f763479f703d80de0ec15254237bc651f9cdc0"
```
## Retrieving a list of sites
Send a `GET` request to the object list endpoint. The response contains a paginated list of JSON objects.
```
$ curl -H "Accept: application/json; indent=4" http://localhost/api/dcim/sites/
{
"count": 14,
"next": null,
"previous": null,
"results": [
{
"id": 6,
"name": "Corporate HQ",
"slug": "corporate-hq",
"region": null,
"tenant": null,
"facility": "",
"asn": null,
"physical_address": "742 Evergreen Terrace, Springfield, USA",
"shipping_address": "",
"contact_name": "",
"contact_phone": "",
"contact_email": "",
"comments": "",
"custom_fields": {},
"count_prefixes": 108,
"count_vlans": 46,
"count_racks": 8,
"count_devices": 254,
"count_circuits": 6
},
...
]
}
```
## Retrieving a single site by ID
Send a `GET` request to the object detail endpoint. The response contains a single JSON object.
```
$ curl -H "Accept: application/json; indent=4" http://localhost/api/dcim/sites/6/
{
"id": 6,
"name": "Corporate HQ",
"slug": "corporate-hq",
"region": null,
"tenant": null,
"facility": "",
"asn": null,
"physical_address": "742 Evergreen Terrace, Springfield, USA",
"shipping_address": "",
"contact_name": "",
"contact_phone": "",
"contact_email": "",
"comments": "",
"custom_fields": {},
"count_prefixes": 108,
"count_vlans": 46,
"count_racks": 8,
"count_devices": 254,
"count_circuits": 6
}
```
## Creating a new site
Send a `POST` request to the site list endpoint with token authentication and JSON-formatted data. Only mandatory fields are required. This example includes one non required field, "region."
```
$ curl -X POST -H "Authorization: Token d2f763479f703d80de0ec15254237bc651f9cdc0" -H "Content-Type: application/json" -H "Accept: application/json; indent=4" http://localhost:8000/api/dcim/sites/ --data '{"name": "My New Site", "slug": "my-new-site", "region": 5}'
{
"id": 16,
"name": "My New Site",
"slug": "my-new-site",
"region": 5,
"tenant": null,
"facility": "",
"asn": null,
"physical_address": "",
"shipping_address": "",
"contact_name": "",
"contact_phone": "",
"contact_email": "",
"comments": ""
}
```
Note that in this example we are creating a site bound to a region with the ID of 5. For write API actions (`POST`, `PUT`, and `PATCH`) the integer ID value is used for `ForeignKey` (related model) relationships, instead of the nested representation that is used in the `GET` (list) action.
## Modify an existing site
Make an authenticated `PUT` request to the site detail endpoint. As with a create (`POST`) request, all mandatory fields must be included.
```
$ curl -X PUT -H "Authorization: Token d2f763479f703d80de0ec15254237bc651f9cdc0" -H "Content-Type: application/json" -H "Accept: application/json; indent=4" http://localhost:8000/api/dcim/sites/16/ --data '{"name": "Renamed Site", "slug": "renamed-site"}'
```
## Modify an object by changing a field
Make an authenticated `PATCH` request to the device endpoint. With `PATCH`, unlike `POST` and `PUT`, we only specify the field that is being changed. In this example, we add a serial number to a device.
```
$ curl -X PATCH -H "Authorization: Token d2f763479f703d80de0ec15254237bc651f9cdc0" -H "Content-Type: application/json" -H "Accept: application/json; indent=4" http://localhost:8000/api/dcim/devices/2549/ --data '{"serial": "FTX1123A090"}'
```
## Delete an existing site
Send an authenticated `DELETE` request to the site detail endpoint.
```
$ curl -v -X DELETE -H "Authorization: Token d2f763479f703d80de0ec15254237bc651f9cdc0" -H "Content-Type: application/json" -H "Accept: application/json; indent=4" http://localhost:8000/api/dcim/sites/16/
* Connected to localhost (127.0.0.1) port 8000 (#0)
> DELETE /api/dcim/sites/16/ HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8000
> Authorization: Token d2f763479f703d80de0ec15254237bc651f9cdc0
> Content-Type: application/json
> Accept: application/json; indent=4
>
* HTTP 1.0, assume close after body
< HTTP/1.0 204 No Content
< Date: Mon, 20 Mar 2017 16:13:08 GMT
< Server: WSGIServer/0.1 Python/2.7.6
< Vary: Accept, Cookie
< X-Frame-Options: SAMEORIGIN
< Allow: GET, PUT, PATCH, DELETE, OPTIONS
<
* Closing connection 0
```
The response to a successful `DELETE` request will have code 204 (No Content); the body of the response will be empty.
## Bulk Object Creation
The REST API supports the creation of multiple objects of the same type using a single `POST` request. For example, to create multiple devices:
```
curl -X POST -H "Authorization: Token <TOKEN>" -H "Content-Type: application/json" -H "Accept: application/json; indent=4" http://localhost:8000/api/dcim/devices/ --data '[
{"name": "device1", "device_type": 24, "device_role": 17, "site": 6},
{"name": "device2", "device_type": 24, "device_role": 17, "site": 6},
{"name": "device3", "device_type": 24, "device_role": 17, "site": 6},
]'
```
Bulk creation is all-or-none: If any of the creations fails, the entire operation is rolled back. A successful response returns an HTTP code 201 and the body of the response will be a list/array of the objects created.

View File

@@ -1,71 +0,0 @@
# API Filtering
The NetBox API supports robust filtering of results based on the fields of each model.
Generally speaking you are able to filter based on the attributes (fields) present in
the response body. Please note however that certain read-only or metadata fields are not
filterable.
Filtering is achieved by passing HTTP query parameters and the parameter name is the
name of the field you wish to filter on and the value is the field value.
E.g. filtering based on a device's name:
```
/api/dcim/devices/?name=DC-SPINE-1
```
## Multi Value Logic
While you are able to filter based on an arbitrary number of fields, you are also able to
pass multiple values for the same field. In most cases filtering on multiple values is
implemented as a logical OR operation. A notable exception is the `tag` filter which
is a logical AND. Passing multiple values for one field, can be combined with other fields.
For example, filtering for devices with either the name of DC-SPINE-1 _or_ DC-LEAF-4:
```
/api/dcim/devices/?name=DC-SPINE-1&name=DC-LEAF-4
```
Filtering for devices with tag `router` and `customer-a` will return only devices with
_both_ of those tags applied:
```
/api/dcim/devices/?tag=router&tag=customer-a
```
## Lookup Expressions
Certain model fields also support filtering using additional lookup expressions. This allows
for negation and other context specific filtering.
These lookup expressions can be applied by adding a suffix to the desired field's name.
E.g. `mac_address__n`. In this case, the filter expression is for negation and it is separated
by two underscores. Below are the lookup expressions that are supported across different field
types.
### Numeric Fields
Numeric based fields (ASN, VLAN ID, etc) support these lookup expressions:
- `n` - not equal (negation)
- `lt` - less than
- `lte` - less than or equal
- `gt` - greater than
- `gte` - greater than or equal
### String Fields
String based (char) fields (Name, Address, etc) support these lookup expressions:
- `n` - not equal (negation)
- `ic` - case insensitive contains
- `nic` - negated case insensitive contains
- `isw` - case insensitive starts with
- `nisw` - negated case insensitive starts with
- `iew` - case insensitive ends with
- `niew` - negated case insensitive ends with
- `ie` - case sensitive exact match
- `nie` - negated case sensitive exact match
### Foreign Keys & Other Fields
Certain other fields, namely foreign key relationships support just the negation
expression: `n`.

View File

@@ -1,291 +0,0 @@
# The NetBox REST API
## What is a REST API?
REST stands for [representational state transfer](https://en.wikipedia.org/wiki/Representational_state_transfer). It's a particular type of API which employs HTTP to create, retrieve, update, and delete objects from a database. (This set of operations is commonly referred to as CRUD.) Each type of operation is associated with a particular HTTP verb:
* `GET`: Retrieve an object or list of objects
* `POST`: Create an object
* `PUT` / `PATCH`: Modify an existing object. `PUT` requires all mandatory fields to be specified, while `PATCH` only expects the field that is being modified to be specified.
* `DELETE`: Delete an existing object
The NetBox API represents all objects in [JavaScript Object Notation (JSON)](http://www.json.org/). This makes it very easy to interact with NetBox data on the command line with common tools. For example, we can request an IP address from NetBox and output the JSON using `curl` and `jq`. (Piping the output through `jq` isn't strictly required but makes it much easier to read.)
```
$ curl -s http://localhost:8000/api/ipam/ip-addresses/2954/ | jq '.'
{
"custom_fields": {},
"nat_outside": null,
"nat_inside": null,
"description": "An example IP address",
"id": 2954,
"family": 4,
"address": "5.101.108.132/26",
"vrf": null,
"tenant": null,
"status": {
"label": "Active",
"value": 1
},
"role": null,
"interface": null
}
```
Each attribute of the NetBox object is expressed as a field in the dictionary. Fields may include their own nested objects, as in the case of the `status` field above. Every object includes a primary key named `id` which uniquely identifies it in the database.
## Interactive Documentation
Comprehensive, interactive documentation of all API endpoints is available on a running NetBox instance at `/api/docs/`. This interface provides a convenient sandbox for researching and experimenting with NetBox's various API endpoints and different request types.
## URL Hierarchy
NetBox's entire API is housed under the API root at `https://<hostname>/api/`. The URL structure is divided at the root level by application: circuits, DCIM, extras, IPAM, secrets, and tenancy. Within each application, each model has its own path. For example, the provider and circuit objects are located under the "circuits" application:
* /api/circuits/providers/
* /api/circuits/circuits/
Likewise, the site, rack, and device objects are located under the "DCIM" application:
* /api/dcim/sites/
* /api/dcim/racks/
* /api/dcim/devices/
The full hierarchy of available endpoints can be viewed by navigating to the API root in a web browser.
Each model generally has two views associated with it: a list view and a detail view. The list view is used to request a list of multiple objects or to create a new object. The detail view is used to retrieve, update, or delete an existing object. All objects are referenced by their numeric primary key (`id`).
* /api/dcim/devices/ - List devices or create a new device
* /api/dcim/devices/123/ - Retrieve, update, or delete the device with ID 123
Lists of objects can be filtered using a set of query parameters. For example, to find all interfaces belonging to the device with ID 123:
```
GET /api/dcim/interfaces/?device_id=123
```
See [filtering](filtering.md) for more details.
## Serialization
The NetBox API employs three types of serializers to represent model data:
* Base serializer
* Nested serializer
* Writable serializer
The base serializer is used to represent the default view of a model. This includes all database table fields which comprise the model, and may include additional metadata. A base serializer includes relationships to parent objects, but **does not** include child objects. For example, the `VLANSerializer` includes a nested representation its parent VLANGroup (if any), but does not include any assigned Prefixes.
```
{
"id": 1048,
"site": {
"id": 7,
"url": "http://localhost:8000/api/dcim/sites/7/",
"name": "Corporate HQ",
"slug": "corporate-hq"
},
"group": {
"id": 4,
"url": "http://localhost:8000/api/ipam/vlan-groups/4/",
"name": "Production",
"slug": "production"
},
"vid": 101,
"name": "Users-Floor1",
"tenant": null,
"status": {
"value": 1,
"label": "Active"
},
"role": {
"id": 9,
"url": "http://localhost:8000/api/ipam/roles/9/",
"name": "User Access",
"slug": "user-access"
},
"description": "",
"display_name": "101 (Users-Floor1)",
"custom_fields": {}
}
```
### Related Objects
Related objects (e.g. `ForeignKey` fields) are represented using a nested serializer. A nested serializer provides a minimal representation of an object, including only its URL and enough information to display the object to a user. When performing write API actions (`POST`, `PUT`, and `PATCH`), related objects may be specified by either numeric ID (primary key), or by a set of attributes sufficiently unique to return the desired object.
For example, when creating a new device, its rack can be specified by NetBox ID (PK):
```
{
"name": "MyNewDevice",
"rack": 123,
...
}
```
Or by a set of nested attributes used to identify the rack:
```
{
"name": "MyNewDevice",
"rack": {
"site": {
"name": "Equinix DC6"
},
"name": "R204"
},
...
}
```
Note that if the provided parameters do not return exactly one object, a validation error is raised.
### Brief Format
Most API endpoints support an optional "brief" format, which returns only a minimal representation of each object in the response. This is useful when you need only a list of the objects themselves without any related data, such as when populating a drop-down list in a form.
For example, the default (complete) format of an IP address looks like this:
```
GET /api/ipam/prefixes/13980/
{
"id": 13980,
"family": 4,
"prefix": "192.0.2.0/24",
"site": null,
"vrf": null,
"tenant": null,
"vlan": null,
"status": {
"value": 1,
"label": "Active"
},
"role": null,
"is_pool": false,
"description": "",
"tags": [],
"custom_fields": {},
"created": "2018-12-11",
"last_updated": "2018-12-11T16:27:55.073174-05:00"
}
```
The brief format is much more terse, but includes a link to the object's full representation:
```
GET /api/ipam/prefixes/13980/?brief=1
{
"id": 13980,
"url": "https://netbox/api/ipam/prefixes/13980/",
"family": 4,
"prefix": "192.0.2.0/24"
}
```
The brief format is supported for both lists and individual objects.
## Pagination
API responses which contain a list of objects (for example, a request to `/api/dcim/devices/`) will be paginated to avoid unnecessary overhead. The root JSON object will contain the following attributes:
* `count`: The total count of all objects matching the query
* `next`: A hyperlink to the next page of results (if applicable)
* `previous`: A hyperlink to the previous page of results (if applicable)
* `results`: The list of returned objects
Here is an example of a paginated response:
```
HTTP 200 OK
Allow: GET, POST, OPTIONS
Content-Type: application/json
Vary: Accept
{
"count": 2861,
"next": "http://localhost:8000/api/dcim/devices/?limit=50&offset=50",
"previous": null,
"results": [
{
"id": 123,
"name": "DeviceName123",
...
},
...
]
}
```
The default page size derives from the [`PAGINATE_COUNT`](../../configuration/optional-settings/#paginate_count) configuration setting, which defaults to 50. However, this can be overridden per request by specifying the desired `offset` and `limit` query parameters. For example, if you wish to retrieve a hundred devices at a time, you would make a request for:
```
http://localhost:8000/api/dcim/devices/?limit=100
```
The response will return devices 1 through 100. The URL provided in the `next` attribute of the response will return devices 101 through 200:
```
{
"count": 2861,
"next": "http://localhost:8000/api/dcim/devices/?limit=100&offset=100",
"previous": null,
"results": [...]
}
```
The maximum number of objects that can be returned is limited by the [`MAX_PAGE_SIZE`](../../configuration/optional-settings/#max_page_size) setting, which is 1000 by default. Setting this to `0` or `None` will remove the maximum limit. An API consumer can then pass `?limit=0` to retrieve _all_ matching objects with a single request.
!!! warning
Disabling the page size limit introduces a potential for very resource-intensive requests, since one API request can effectively retrieve an entire table from the database.
## Filtering
A list of objects retrieved via the API can be filtered by passing one or more query parameters. The same parameters used by the web UI work for the API as well. For example, to return only prefixes with a status of "Active" (identified by the slug `active`):
```
GET /api/ipam/prefixes/?status=active
```
The choices available for fixed choice fields such as `status` can be retrieved by sending an `OPTIONS` API request for the desired endpoint:
```no-highlight
$ curl -s -X OPTIONS \
-H "Authorization: Token $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json; indent=4" \
http://localhost:8000/api/ipam/prefixes/ | jq ".actions.POST.status.choices"
[
{
"value": "container",
"display_name": "Container"
},
{
"value": "active",
"display_name": "Active"
},
{
"value": "reserved",
"display_name": "Reserved"
},
{
"value": "deprecated",
"display_name": "Deprecated"
}
]
```
For most fields, when a filter is passed multiple times, objects matching _any_ of the provided values will be returned. For example, `GET /api/dcim/sites/?name=Foo&name=Bar` will return all sites named "Foo" _or_ "Bar". The exception to this rule is ManyToManyFields which may have multiple values assigned. Tags are the most common example of a ManyToManyField. For example, `GET /api/dcim/sites/?tag=foo&tag=bar` will return only sites tagged with both "foo" _and_ "bar".
### Custom Fields
To filter on a custom field, prepend `cf_` to the field name. For example, the following query will return only sites where a custom field named `foo` is equal to 123:
```
GET /api/dcim/sites/?cf_foo=123
```
!!! note
Full versus partial matching when filtering is configurable per custom field. Filtering can be toggled (or disabled) for a custom field in the admin UI.

View File

@@ -1,6 +1,6 @@
# NetBox Configuration
NetBox's local configuration is stored in `netbox/netbox/configuration.py`. An example configuration is provided at `netbox/netbox/configuration.example.py`. You may copy or rename the example configuration and make changes as appropriate. NetBox will not run without a configuration file.
NetBox's local configuration is stored in `$INSTALL_ROOT/netbox/netbox/configuration.py`. An example configuration is provided as `configuration.example.py`. You may copy or rename the example configuration and make changes as appropriate. NetBox will not run without a configuration file.
While NetBox has many configuration settings, only a few of them must be defined at the time of installation.
@@ -11,8 +11,8 @@ While NetBox has many configuration settings, only a few of them must be defined
## Changing the Configuration
Configuration settings may be changed at any time. However, the NetBox service must be restarted before the changes will take effect:
Configuration settings may be changed at any time. However, the WSGI service (e.g. Gunicorn) must be restarted before the changes will take effect:
```no-highlight
# sudo supervisorctl restart netbox
$ sudo systemctl restart netbox
```

View File

@@ -4,7 +4,7 @@
NetBox will email details about critical errors to the administrators listed here. This should be a list of (name, email) tuples. For example:
```
```python
ADMINS = [
['Hank Hill', 'hhill@example.com'],
['Dale Gribble', 'dgribble@example.com'],
@@ -17,7 +17,7 @@ ADMINS = [
Default: `('file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc', 'xmpp')`
A list of permitted URL schemes referenced when rendering links within NetBox. Note that only the schemes specified in this list will be accepted: If adding your own, be sure to replicate the entire default list as well (excluding those schemes which are not desirable).
A list of permitted URL schemes referenced when rendering links within NetBox. Note that only the schemes specified in this list will be accepted: If adding your own, be sure to replicate all of the default values as well (excluding those schemes which are not desirable).
---
@@ -25,9 +25,9 @@ A list of permitted URL schemes referenced when rendering links within NetBox. N
## BANNER_BOTTOM
Setting these variables will display content in a banner at the top and/or bottom of the page, respectively. HTML is allowed. To replicate the content of the top banner in the bottom banner, set:
Setting these variables will display custom content in a banner at the top and/or bottom of the page, respectively. HTML is allowed. To replicate the content of the top banner in the bottom banner, set:
```
```python
BANNER_TOP = 'Your banner text'
BANNER_BOTTOM = BANNER_TOP
```
@@ -36,7 +36,7 @@ BANNER_BOTTOM = BANNER_TOP
## BANNER_LOGIN
The value of this variable will be displayed on the login page above the login form. HTML is allowed.
This defines custom content to be displayed on the login page above the login form. HTML is allowed.
---
@@ -46,7 +46,7 @@ Default: None
The base URL path to use when accessing NetBox. Do not include the scheme or domain name. For example, if installed at http://example.com/netbox/, set:
```
```python
BASE_PATH = 'netbox/'
```
@@ -56,7 +56,7 @@ BASE_PATH = 'netbox/'
Default: 900
The number of seconds to retain cache entries before automatically invalidating them.
The number of seconds to cache entries will be retained before expiring.
---
@@ -64,7 +64,11 @@ The number of seconds to retain cache entries before automatically invalidating
Default: 90
The number of days to retain logged changes (object creations, updates, and deletions). Set this to `0` to retain changes in the database indefinitely. (Warning: This will greatly increase database size over time.)
The number of days to retain logged changes (object creations, updates, and deletions). Set this to `0` to retain
changes in the database indefinitely.
!!! warning
If enabling indefinite changelog retention, it is recommended to periodically delete old entries. Otherwise, the database may eventually exceed capacity.
---
@@ -80,9 +84,11 @@ If True, cross-origin resource sharing (CORS) requests will be accepted from all
## CORS_ORIGIN_REGEX_WHITELIST
These settings specify a list of origins that are authorized to make cross-site API requests. Use `CORS_ORIGIN_WHITELIST` to define a list of exact hostnames, or `CORS_ORIGIN_REGEX_WHITELIST` to define a set of regular expressions. (These settings have no effect if `CORS_ORIGIN_ALLOW_ALL` is True.) For example:
These settings specify a list of origins that are authorized to make cross-site API requests. Use
`CORS_ORIGIN_WHITELIST` to define a list of exact hostnames, or `CORS_ORIGIN_REGEX_WHITELIST` to define a set of regular
expressions. (These settings have no effect if `CORS_ORIGIN_ALLOW_ALL` is True.) For example:
```
```python
CORS_ORIGIN_WHITELIST = [
'https://example.com',
]
@@ -94,12 +100,13 @@ CORS_ORIGIN_WHITELIST = [
Default: False
This setting enables debugging. This should be done only during development or troubleshooting. Note that only clients
which access NetBox from a recognized [internal IP address](#internal_ips) will see debugging tools in the user
This setting enables debugging. Debugging should be enabled only during development or troubleshooting. Note that only
clients which access NetBox from a recognized [internal IP address](#internal_ips) will see debugging tools in the user
interface.
!!! warning
Never enable debugging on a production system, as it can expose sensitive data to unauthenticated users.
Never enable debugging on a production system, as it can expose sensitive data to unauthenticated users and impose a
substantial performance penalty.
---
@@ -113,9 +120,9 @@ This parameter serves as a safeguard to prevent some potentially dangerous behav
## DOCS_ROOT
Default: `$INSTALL_DIR/docs/`
Default: `$INSTALL_ROOT/docs/`
The file path to NetBox's documentation. This is used when presenting context-sensitive documentation in the web UI. by default, this will be the `docs/` directory within the root NetBox installation path. (Set this to `None` to disable the embedded documentation.)
The filesystem path to NetBox's documentation. This is used when presenting context-sensitive documentation in the web UI. By default, this will be the `docs/` directory within the root NetBox installation path. (Set this to `None` to disable the embedded documentation.)
---
@@ -123,20 +130,23 @@ The file path to NetBox's documentation. This is used when presenting context-se
In order to send email, NetBox needs an email server configured. The following items can be defined within the `EMAIL` configuration parameter:
* `SERVER` - Host name or IP address of the email server (use `localhost` if running locally)
* `SERVER` - Hostname or IP address of the email server (use `localhost` if running locally)
* `PORT` - TCP port to use for the connection (default: `25`)
* `USERNAME` - Username with which to authenticate
* `PASSSWORD` - Password with which to authenticate
* `USE_SSL` - Use SSL when connecting to the server (default: `False`). Mutually exclusive with `USE_TLS`.
* `USE_TLS` - Use TLS when connecting to the server (default: `False`). Mutually exclusive with `USE_SSL`.
* `USE_SSL` - Use SSL when connecting to the server (default: `False`)
* `USE_TLS` - Use TLS when connecting to the server (default: `False`)
* `SSL_CERTFILE` - Path to the PEM-formatted SSL certificate file (optional)
* `SSL_KEYFILE` - Path to the PEM-formatted SSL private key file (optional)
* `TIMEOUT` - Amount of time to wait for a connection, in seconds (default: `10`)
* `FROM_EMAIL` - Sender address for emails sent by NetBox (default: `root@localhost`)
* `FROM_EMAIL` - Sender address for emails sent by NetBox
Email is sent from NetBox only for critical events or if configured for [logging](#logging). If you would like to test the email server configuration please use the django function [send_mail()](https://docs.djangoproject.com/en/stable/topics/email/#send-mail):
!!! note
The `USE_SSL` and `USE_TLS` parameters are mutually exclusive.
```
Email is sent from NetBox only for critical events or if configured for [logging](#logging). If you would like to test the email server configuration, Django provides a convenient [send_mail()](https://docs.djangoproject.com/en/stable/topics/email/#send-mail) fuction accessible within the NetBox shell:
```no-highlight
# python ./manage.py nbshell
>>> from django.core.mail import send_mail
>>> send_mail(
@@ -150,15 +160,23 @@ Email is sent from NetBox only for critical events or if configured for [logging
---
## ENFORCE_GLOBAL_UNIQUE
Default: False
By default, NetBox will permit users to create duplicate prefixes and IP addresses in the global table (that is, those which are not assigned to any VRF). This behavior can be disabled by setting `ENFORCE_GLOBAL_UNIQUE` to True.
---
## EXEMPT_VIEW_PERMISSIONS
Default: Empty list
A list of models to exempt from the enforcement of view permissions. Models listed here will be viewable by all users and by anonymous users.
A list of NetBox models to exempt from the enforcement of view permissions. Models listed here will be viewable by all users, both authenticated and anonymous.
List models in the form `<app>.<model>`. For example:
```
```python
EXEMPT_VIEW_PERMISSIONS = [
'dcim.site',
'dcim.region',
@@ -168,17 +186,12 @@ EXEMPT_VIEW_PERMISSIONS = [
To exempt _all_ models from view permission enforcement, set the following. (Note that `EXEMPT_VIEW_PERMISSIONS` must be an iterable.)
```
```python
EXEMPT_VIEW_PERMISSIONS = ['*']
```
---
## ENFORCE_GLOBAL_UNIQUE
Default: False
Enforcement of unique IP space can be toggled on a per-VRF basis. To enforce unique IP space within the global table (all prefixes and IP addresses not assigned to a VRF), set `ENFORCE_GLOBAL_UNIQUE` to True.
!!! note
Using a wildcard will not affect certain potentially sensitive models, such as user permissions. If there is a need to exempt these models, they must be specified individually.
---
@@ -186,7 +199,7 @@ Enforcement of unique IP space can be toggled on a per-VRF basis. To enforce uni
Default: None
A dictionary of HTTP proxies to use for outbound requests originating from NetBox (e.g. when sending webhooks). Proxies should be specified by schema as per the [Python requests library documentation](https://2.python-requests.org/en/master/user/advanced/). For example:
A dictionary of HTTP proxies to use for outbound requests originating from NetBox (e.g. when sending webhook requests). Proxies should be specified by schema (HTTP and HTTPS) as per the [Python requests library documentation](https://2.python-requests.org/en/master/user/advanced/). For example:
```python
HTTP_PROXIES = {
@@ -199,7 +212,7 @@ HTTP_PROXIES = {
## INTERNAL_IPS
Default: `('127.0.0.1', '::1',)`
Default: `('127.0.0.1', '::1')`
A list of IP addresses recognized as internal to the system, used to control the display of debugging output. For
example, the debugging toolbar will be viewable only when a client is accessing NetBox from one of the listed IP
@@ -209,11 +222,11 @@ addresses (and [`DEBUG`](#debug) is true).
## LOGGING
By default, all messages of INFO severity or higher will be logged to the console. Additionally, if `DEBUG` is False and email access has been configured, ERROR and CRITICAL messages will be emailed to the users defined in `ADMINS`.
By default, all messages of INFO severity or higher will be logged to the console. Additionally, if [`DEBUG`](#debug) is False and email access has been configured, ERROR and CRITICAL messages will be emailed to the users defined in [`ADMINS`](#admins).
The Django framework on which NetBox runs allows for the customization of logging, e.g. to write logs to file. Please consult the [Django logging documentation](https://docs.djangoproject.com/en/stable/topics/logging/) for more information on configuring this setting. Below is an example which will write all INFO and higher messages to a file:
The Django framework on which NetBox runs allows for the customization of logging format and destination. Please consult the [Django logging documentation](https://docs.djangoproject.com/en/stable/topics/logging/) for more information on configuring this setting. Below is an example which will write all INFO and higher messages to a local file:
```
```python
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
@@ -235,6 +248,7 @@ LOGGING = {
### Available Loggers
* `netbox.<app>.<model>` - Generic form for model-specific log messages
* `netbox.auth.*` - Authentication events
* `netbox.api.views.*` - Views which handle business logic for the REST API
* `netbox.reports.*` - Report execution (`module.name`)
@@ -255,7 +269,7 @@ Setting this to True will permit only authenticated users to access any part of
Default: 1209600 seconds (14 days)
The liftetime (in seconds) of the authentication cookie issued to a NetBox user upon login.
The lifetime (in seconds) of the authentication cookie issued to a NetBox user upon login.
---
@@ -271,13 +285,13 @@ Setting this to True will display a "maintenance mode" banner at the top of ever
Default: 1000
An API consumer can request an arbitrary number of objects by appending the "limit" parameter to the URL (e.g. `?limit=1000`). This setting defines the maximum limit. Setting it to `0` or `None` will allow an API consumer to request all objects by specifying `?limit=0`.
A web user or API consumer can request an arbitrary number of objects by appending the "limit" parameter to the URL (e.g. `?limit=1000`). This parameter defines the maximum acceptable limit. Setting this to `0` or `None` will allow a client to retrieve _all_ matching objects at once with no limit by specifying `?limit=0`.
---
## MEDIA_ROOT
Default: $BASE_DIR/netbox/media/
Default: $INSTALL_ROOT/netbox/media/
The file path to the location where media files (such as image attachments) are stored. By default, this is the `netbox/media/` directory within the base NetBox installation path.
@@ -287,7 +301,7 @@ The file path to the location where media files (such as image attachments) are
Default: False
Toggle exposing Prometheus metrics at `/metrics`. See the [Prometheus Metrics](../../additional-features/prometheus-metrics/) documentation for more details.
Toggle the availability Prometheus-compatible metrics at `/metrics`. See the [Prometheus Metrics](../../additional-features/prometheus-metrics/) documentation for more details.
---
@@ -297,7 +311,8 @@ Toggle exposing Prometheus metrics at `/metrics`. See the [Prometheus Metrics](.
NetBox will use these credentials when authenticating to remote devices via the [NAPALM library](https://napalm-automation.net/), if installed. Both parameters are optional.
Note: If SSH public key authentication has been set up for the system account under which NetBox runs, these parameters are not needed.
!!! note
If SSH public key authentication has been set up on the remote device(s) for the system account under which NetBox runs, these parameters are not needed.
---
@@ -305,16 +320,16 @@ Note: If SSH public key authentication has been set up for the system account un
A dictionary of optional arguments to pass to NAPALM when instantiating a network driver. See the NAPALM documentation for a [complete list of optional arguments](http://napalm.readthedocs.io/en/latest/support/#optional-arguments). An example:
```
```python
NAPALM_ARGS = {
'api_key': '472071a93b60a1bd1fafb401d9f8ef41',
'port': 2222,
}
```
Note: Some platforms (e.g. Cisco IOS) require an argument named `secret` to be passed in addition to the normal password. If desired, you can use the configured `NAPALM_PASSWORD` as the value for this argument:
Some platforms (e.g. Cisco IOS) require an argument named `secret` to be passed in addition to the normal password. If desired, you can use the configured `NAPALM_PASSWORD` as the value for this argument:
```
```python
NAPALM_USERNAME = 'username'
NAPALM_PASSWORD = 'MySecretPassword'
NAPALM_ARGS = {
@@ -337,7 +352,7 @@ The amount of time (in seconds) to wait for NAPALM to connect to a device.
Default: 50
Determine how many objects to display per page within each list of objects.
The default maximum number of objects to display per page within each list of objects.
---
@@ -398,30 +413,6 @@ Default width (in pixels) of a unit within a rack elevation.
---
## REMOTE_AUTH_ENABLED
Default: `False`
NetBox can be configured to support remote user authentication by inferring user authentication from an HTTP header set by the HTTP reverse proxy (e.g. nginx or Apache). Set this to `True` to enable this functionality. (Local authentication will still take effect as a fallback.)
---
## REMOTE_AUTH_BACKEND
Default: `'utilities.auth_backends.RemoteUserBackend'`
Python path to the custom [Django authentication backend](https://docs.djangoproject.com/en/stable/topics/auth/customizing/) to use for external user authentication, if not using NetBox's built-in backend. (Requires `REMOTE_AUTH_ENABLED`.)
---
## REMOTE_AUTH_HEADER
Default: `'HTTP_REMOTE_USER'`
When remote user authentication is in use, this is the name of the HTTP header which informs NetBox of the currently authenticated user. (Requires `REMOTE_AUTH_ENABLED`.)
---
## REMOTE_AUTH_AUTO_CREATE_USER
Default: `False`
@@ -430,6 +421,17 @@ If true, NetBox will automatically create local accounts for users authenticated
---
## REMOTE_AUTH_BACKEND
Default: `'netbox.authentication.RemoteUserBackend'`
This is the Python path to the custom [Django authentication backend](https://docs.djangoproject.com/en/stable/topics/auth/customizing/) to use for external user authentication. NetBox provides two built-in backends (listed below), though custom authentication backends may also be provided by other packages or plugins.
* `netbox.authentication.RemoteUserBackend`
* `netbox.authentication.LDAPBackend`
---
## REMOTE_AUTH_DEFAULT_GROUPS
Default: `[]` (Empty list)
@@ -440,9 +442,25 @@ The list of groups to assign a new user account when created using remote authen
## REMOTE_AUTH_DEFAULT_PERMISSIONS
Default: `[]` (Empty list)
Default: `{}` (Empty dictionary)
The list of permissions to assign a new user account when created using remote authentication. (Requires `REMOTE_AUTH_ENABLED`.)
A mapping of permissions to assign a new user account when created using remote authentication. Each key in the dictionary should be set to a dictionary of the attributes to be applied to the permission, or `None` to allow all objects. (Requires `REMOTE_AUTH_ENABLED`.)
---
## REMOTE_AUTH_ENABLED
Default: `False`
NetBox can be configured to support remote user authentication by inferring user authentication from an HTTP header set by the HTTP reverse proxy (e.g. nginx or Apache). Set this to `True` to enable this functionality. (Local authentication will still take effect as a fallback.)
---
## REMOTE_AUTH_HEADER
Default: `'HTTP_REMOTE_USER'`
When remote user authentication is in use, this is the name of the HTTP header which informs NetBox of the currently authenticated user. (Requires `REMOTE_AUTH_ENABLED`.)
---
@@ -456,25 +474,34 @@ The number of seconds to retain the latest version that is fetched from the GitH
## RELEASE_CHECK_URL
Default: None
Default: None (disabled)
The releases of this repository are checked to detect new releases, which are shown on the home page of the web interface. You can change this to your own fork of the NetBox repository, or set it to `None` to disable the check. The URL provided **must** be compatible with the GitHub API.
This parameter defines the URL of the repository that will be checked periodically for new NetBox releases. When a new release is detected, a message will be displayed to administrative users on the home page. This can be set to the official repository (`'https://api.github.com/repos/netbox-community/netbox/releases'`) or a custom fork. Set this to `None` to disable automatic update checks.
Use `'https://api.github.com/repos/netbox-community/netbox/releases'` to check for release in the official NetBox repository.
!!! note
The URL provided **must** be compatible with the [GitHub REST API](https://docs.github.com/en/rest).
---
## REPORTS_ROOT
Default: $BASE_DIR/netbox/reports/
Default: `$INSTALL_ROOT/netbox/reports/`
The file path to the location where custom reports will be kept. By default, this is the `netbox/reports/` directory within the base NetBox installation path.
---
## RQ_DEFAULT_TIMEOUT
Default: `300`
The maximum execution time of a background task (such as running a custom script), in seconds.
---
## SCRIPTS_ROOT
Default: $BASE_DIR/netbox/scripts/
Default: `$INSTALL_ROOT/netbox/scripts/`
The file path to the location where custom scripts will be kept. By default, this is the `netbox/scripts/` directory within the base NetBox installation path.
@@ -484,7 +511,7 @@ The file path to the location where custom scripts will be kept. By default, thi
Default: None
Session data is used to track authenticated users when they access NetBox. By default, NetBox stores session data in the PostgreSQL database. However, this inhibits authentication to a standby instance of NetBox without write access to the database. Alternatively, a local file path may be specified here and NetBox will store session data as files instead of using the database. Note that the user as which NetBox runs must have read and write permissions to this path.
HTTP session data is used to track authenticated users when they access NetBox. By default, NetBox stores session data in its PostgreSQL database. However, this inhibits authentication to a standby instance of NetBox without write access to the database. Alternatively, a local file path may be specified here and NetBox will store session data as files instead of using the database. Note that the NetBox system user must have read and write permissions to this path.
---
@@ -512,21 +539,19 @@ If `STORAGE_BACKEND` is not defined, this setting will be ignored.
Default: UTC
The time zone NetBox will use when dealing with dates and times. It is recommended to use UTC time unless you have a specific need to use a local time zone. [List of available time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).
The time zone NetBox will use when dealing with dates and times. It is recommended to use UTC time unless you have a specific need to use a local time zone. Please see the [list of available time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).
---
## Date and Time Formatting
You may define custom formatting for date and times. For detailed instructions on writing format strings, please see [the Django documentation](https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date).
You may define custom formatting for date and times. For detailed instructions on writing format strings, please see [the Django documentation](https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date). Default formats are listed below.
Defaults:
```
```python
DATE_FORMAT = 'N j, Y' # June 26, 2016
SHORT_DATE_FORMAT = 'Y-m-d' # 2016-06-27
SHORT_DATE_FORMAT = 'Y-m-d' # 2016-06-26
TIME_FORMAT = 'g:i a' # 1:23 p.m.
SHORT_TIME_FORMAT = 'H:i:s' # 13:23:00
DATETIME_FORMAT = 'N j, Y g:i a' # June 26, 2016 1:23 p.m.
SHORT_DATETIME_FORMAT = 'Y-m-d H:i' # 2016-06-27 13:23
SHORT_DATETIME_FORMAT = 'Y-m-d H:i' # 2016-06-26 13:23
```

View File

@@ -2,7 +2,12 @@
## ALLOWED_HOSTS
This is a list of valid fully-qualified domain names (FQDNs) that is used to reach the NetBox service. Usually this is the same as the hostname for the NetBox server, but can also be different (e.g. when using a reverse proxy serving the NetBox website under a different FQDN than the hostname of the NetBox server). NetBox will not permit access to the server via any other hostnames (or IPs). The value of this option is also used to set `CSRF_TRUSTED_ORIGINS`, which restricts `HTTP POST` to the same set of hosts (more about this [here](https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-CSRF_TRUSTED_ORIGINS)). Keep in mind that NetBox, by default, has `USE_X_FORWARDED_HOST = True` (in `netbox/netbox/settings.py`) which means that if you're using a reverse proxy, it's the FQDN used to reach that reverse proxy which needs to be in this list (more about this [here](https://docs.djangoproject.com/en/stable/ref/settings/#allowed-hosts)).
This is a list of valid fully-qualified domain names (FQDNs) and/or IP addresses that can be used to reach the NetBox service. Usually this is the same as the hostname for the NetBox server, but can also be different; for example, when using a reverse proxy serving the NetBox website under a different FQDN than the hostname of the NetBox server. To help guard against [HTTP Host header attackes](https://docs.djangoproject.com/en/3.0/topics/security/#host-headers-virtual-hosting), NetBox will not permit access to the server via any other hostnames (or IPs).
!!! note
This parameter must always be defined as a list or tuple, even if only value is provided.
The value of this option is also used to set `CSRF_TRUSTED_ORIGINS`, which restricts POST requests to the same set of hosts (more about this [here](https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-CSRF_TRUSTED_ORIGINS)). Keep in mind that NetBox, by default, sets `USE_X_FORWARDED_HOST` to true, which means that if you're using a reverse proxy, it's the FQDN used to reach that reverse proxy which needs to be in this list (more about this [here](https://docs.djangoproject.com/en/stable/ref/settings/#allowed-hosts)).
Example:
@@ -10,18 +15,24 @@ Example:
ALLOWED_HOSTS = ['netbox.example.com', '192.0.2.123']
```
If you are not yet sure what the domain name and/or IP address of the NetBox installation will be, and are comfortable accepting the risks in doing so, you can set this to a wildcard (asterisk) to allow all host values:
```
ALLOWED_HOSTS = ['*']
```
---
## DATABASE
NetBox requires access to a PostgreSQL database service to store data. This service can run locally or on a remote system. The following parameters must be defined within the `DATABASE` dictionary:
NetBox requires access to a PostgreSQL 9.6 or later database service to store data. This service can run locally on the NetBox server or on a remote system. The following parameters must be defined within the `DATABASE` dictionary:
* `NAME` - Database name
* `USER` - PostgreSQL username
* `PASSWORD` - PostgreSQL password
* `HOST` - Name or IP address of the database server (use `localhost` if running locally)
* `PORT` - TCP port of the PostgreSQL service; leave blank for default port (5432)
* `CONN_MAX_AGE` - Lifetime of a [persistent database connection](https://docs.djangoproject.com/en/stable/ref/databases/#persistent-connections), in seconds (150-300 is recommended)
* `PORT` - TCP port of the PostgreSQL service; leave blank for default port (TCP/5432)
* `CONN_MAX_AGE` - Lifetime of a [persistent database connection](https://docs.djangoproject.com/en/stable/ref/databases/#persistent-connections), in seconds (300 is the default)
Example:
@@ -54,10 +65,9 @@ Redis is configured using a configuration setting similar to `DATABASE` and thes
* `PORT` - TCP port of the Redis service; leave blank for default port (6379)
* `PASSWORD` - Redis password (if set)
* `DATABASE` - Numeric database ID
* `DEFAULT_TIMEOUT` - Connection timeout in seconds
* `SSL` - Use SSL connection to Redis
Example:
An example configuration is provided below:
```python
REDIS = {
@@ -66,7 +76,6 @@ REDIS = {
'PORT': 1234,
'PASSWORD': 'foobar',
'DATABASE': 0,
'DEFAULT_TIMEOUT': 300,
'SSL': False,
},
'caching': {
@@ -74,15 +83,15 @@ REDIS = {
'PORT': 6379,
'PASSWORD': '',
'DATABASE': 1,
'DEFAULT_TIMEOUT': 300,
'SSL': False,
}
}
```
!!! note
If you are upgrading from a version prior to v2.7, please note that the Redis connection configuration settings have
changed. Manual modification to bring the `REDIS` section inline with the above specification is necessary
If you are upgrading from a NetBox release older than v2.7.0, please note that the Redis connection configuration
settings have changed. Manual modification to bring the `REDIS` section inline with the above specification is
necessary
!!! warning
It is highly recommended to keep the task and cache databases separate. Using the same database number on the
@@ -97,6 +106,7 @@ above and the addition of two new keys.
* `SENTINELS`: List of tuples or tuple of tuples with each inner tuple containing the name or IP address
of the Redis server and port for each sentinel instance to connect to
* `SENTINEL_SERVICE`: Name of the master / service to connect to
* `SENTINEL_TIMEOUT`: Connection timeout, in seconds
Example:
@@ -105,9 +115,9 @@ REDIS = {
'tasks': {
'SENTINELS': [('mysentinel.redis.example.com', 6379)],
'SENTINEL_SERVICE': 'netbox',
'SENTINEL_TIMEOUT': 10,
'PASSWORD': '',
'DATABASE': 0,
'DEFAULT_TIMEOUT': 300,
'SSL': False,
},
'caching': {
@@ -118,24 +128,20 @@ REDIS = {
'SENTINEL_SERVICE': 'netbox',
'PASSWORD': '',
'DATABASE': 1,
'DEFAULT_TIMEOUT': 300,
'SSL': False,
}
}
```
!!! note
It is possible to have only one or the other Redis configurations to use Sentinel functionality. It is possible
for example to have the tasks database use sentinel via `HOST`/`PORT` and for caching to use Sentinel via
`SENTINELS`/`SENTINEL_SERVICE`.
It is permissible to use Sentinel for only one database and not the other.
---
## SECRET_KEY
This is a secret cryptographic key is used to improve the security of cookies and password resets. The key defined here should not be shared outside of the configuration file. `SECRET_KEY` can be changed at any time, however be aware that doing so will invalidate all existing sessions.
This is a secret, random string used to assist in the creation new cryptographic hashes for passwords and HTTP cookies. The key defined here should not be shared outside of the configuration file. `SECRET_KEY` can be changed at any time, however be aware that doing so will invalidate all existing sessions.
Please note that this key is **not** used for hashing user passwords or for the encrypted storage of secret data in NetBox.
Please note that this key is **not** used directly for hashing user passwords or for the encrypted storage of secret data in NetBox.
`SECRET_KEY` should be at least 50 characters in length and contain a random mix of letters, digits, and symbols. The script located at `netbox/generate_secret_key.py` may be used to generate a suitable key.
`SECRET_KEY` should be at least 50 characters in length and contain a random mix of letters, digits, and symbols. The script located at `$INSTALL_ROOT/netbox/generate_secret_key.py` may be used to generate a suitable key.

View File

@@ -6,6 +6,7 @@
---
{!docs/models/ipam/prefix.md!}
{!docs/models/ipam/role.md!}
---
@@ -14,3 +15,4 @@
---
{!docs/models/ipam/vrf.md!}
{!docs/models/ipam/routetarget.md!}

View File

@@ -5,34 +5,4 @@
# Example Power Topology
Below is a simple diagram demonstrating how power is modeled in NetBox.
!!! note
The power feeds are connected to the same power panel for illustrative purposes; usually, you would have such feeds diversely connected to panels to avoid the single point of failure.
```
+---------------+
| Power panel 1 |
+---------------+
| |
| |
+--------------+ +--------------+
| Power feed 1 | | Power feed 2 |
+--------------+ +--------------+
| |
| |
| | <-- Power ports
+---------+ +---------+
| PDU 1 | | PDU 2 |
+---------+ +---------+
| \ / | <-- Power outlets
| \ / |
| \ / |
| X |
| / \ |
| / \ |
| / \ | <-- Power ports
+--------+ +--------+
| Server | | Router |
+--------+ +--------+
```
![Power distribution model](../../media/power_distribution.png)

View File

@@ -1,4 +1,4 @@
# Virtual Machines and Clusters
# Virtualization
{!docs/models/virtualization/cluster.md!}
{!docs/models/virtualization/clustertype.md!}
@@ -7,3 +7,4 @@
---
{!docs/models/virtualization/virtualmachine.md!}
{!docs/models/virtualization/vminterface.md!}

View File

@@ -7,7 +7,7 @@ NetBox is maintained as a [GitHub project](https://github.com/netbox-community/n
Communication among developers should always occur via public channels:
* [GitHub issues](https://github.com/netbox-community/netbox/issues) - All feature requests, bug reports, and other substantial changes to the code base **must** be documented in an issue.
* [The mailing list](https://groups.google.com/forum/#!forum/netbox-discuss) - The preferred forum for general discussion and support issues. Ideal for shaping a feature request prior to submitting an issue.
* [The mailing list](https://groups.google.com/g/netbox-discuss) - The preferred forum for general discussion and support issues. Ideal for shaping a feature request prior to submitting an issue.
* [#netbox on NetworkToCode](http://slack.networktocode.com/) - Good for quick chats. Avoid any discussion that might need to be referenced later on, as the chat history is not retained long.
## Governance

View File

@@ -41,7 +41,14 @@ Create a file at `/docs/release-notes/X.Y.md` to establish the release notes for
### Manually Perform a New Install
Create a new installation of NetBox by following [the current documentation](http://netbox.readthedocs.io/en/latest/). This should be a manual process, so that issues with the documentation can be identified and corrected.
Install `mkdocs` in your local environment, then start the documentation server:
```no-highlight
$ pip install -r docs/requirements.txt
$ mkdocs serve
```
Follow these instructions to perform a new installation of NetBox. This process must _not_ be automated: The goal of this step is to catch any errors or omissions in the documentation, and ensure that it is kept up-to-date for each release. Make any necessary changes to the documentation before proceeding with the release.
### Close the Release Milestone
@@ -82,7 +89,3 @@ On the `develop` branch, update `VERSION` in `settings.py` to point to the next
```
VERSION = 'v2.3.5-dev'
```
### Announce the Release
Announce the release on the [mailing list](https://groups.google.com/forum/#!forum/netbox-discuss). Include a link to the release and the (HTML-formatted) release notes.

View File

@@ -4,6 +4,10 @@ Utility views are reusable views that handle common CRUD tasks, such as listing
## Individual Views
### ObjectView
Retrieve and display a single object.
### ObjectListView
Generates a paginated table of objects from a given queryset, which may optionally be filtered.

View File

@@ -55,7 +55,7 @@ NetBox is built on the [Django](https://djangoproject.com/) Python framework and
## Supported Python Versions
NetBox supports Python 3.6 and 3.7 environments currently. (Support for Python 3.5 was removed in NetBox v2.8.)
NetBox supports Python 3.6, 3.7, and 3.8 environments currently. (Support for Python 3.5 was removed in NetBox v2.8.)
## Getting Started

View File

@@ -3,32 +3,29 @@
This section entails the installation and configuration of a local PostgreSQL database. If you already have a PostgreSQL database service in place, skip to [the next section](2-redis.md).
!!! warning
NetBox requires PostgreSQL 9.6 or higher. Please note that MySQL and other relational databases are **not** supported.
The installation instructions provided here have been tested to work on Ubuntu 18.04 and CentOS 7.5. The particular commands needed to install dependencies on other distributions may vary significantly. Unfortunately, this is outside the control of the NetBox maintainers. Please consult your distribution's documentation for assistance with any errors.
NetBox requires PostgreSQL 9.6 or higher. Please note that MySQL and other relational databases are **not** currently supported.
## Installation
#### Ubuntu
If a recent enough version of PostgreSQL is not available through your distribution's package manager, you'll need to install it from an official [PostgreSQL repository](https://wiki.postgresql.org/wiki/Apt).
Install the PostgreSQL server and client development libraries using `apt`.
```no-highlight
# apt-get update
# apt-get install -y postgresql libpq-dev
sudo apt update
sudo apt install -y postgresql libpq-dev
```
#### CentOS
CentOS 7.5 does not ship with a recent enough version of PostgreSQL, so it will need to be installed from an external repository. The instructions below show the installation of PostgreSQL 9.6, however you may opt to install a more recent version.
PostgreSQL 9.6 and later are available natively on CentOS 8.2. If using an earlier CentOS release, you may need to [install it from an RPM](https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/).
```no-highlight
# yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# yum install -y postgresql96 postgresql96-server postgresql96-devel
# /usr/pgsql-9.6/bin/postgresql96-setup initdb
sudo yum install -y postgresql-server libpq-devel
sudo postgresql-setup --initdb
```
CentOS users should modify the PostgreSQL configuration to accept password-based authentication by replacing `ident` with `md5` for all host entries within `/var/lib/pgsql/9.6/data/pg_hba.conf`. For example:
CentOS configures ident host-based authentication for PostgreSQL by default. Because NetBox will need to authenticate using a username and password, modify `/var/lib/pgsql/data/pg_hba.conf` to support MD5 authentication by changing `ident` to `md5` for the lines below:
```no-highlight
host all all 127.0.0.1/32 md5
@@ -38,8 +35,8 @@ host all all ::1/128 md5
Then, start the service and enable it to run at boot:
```no-highlight
# systemctl start postgresql-9.6
# systemctl enable postgresql-9.6
sudo systemctl start postgresql
sudo systemctl enable postgresql
```
## Database Creation
@@ -47,11 +44,11 @@ Then, start the service and enable it to run at boot:
At a minimum, we need to create a database for NetBox and assign it a username and password for authentication. This is done with the following commands.
!!! danger
DO NOT USE THE PASSWORD FROM THE EXAMPLE.
**Do not use the password from the example.** Choose a strong, random password to ensure secure database authentication for your NetBox installation.
```no-highlight
# sudo -u postgres psql
psql (10.10)
$ sudo -u postgres psql
psql (12.5 (Ubuntu 12.5-0ubuntu0.20.04.1))
Type "help" for help.
postgres=# CREATE DATABASE netbox;
@@ -68,7 +65,16 @@ postgres=# \q
You can verify that authentication works issuing the following command and providing the configured password. (Replace `localhost` with your database server if using a remote database.)
```no-highlight
# psql -U netbox -W -h localhost netbox
$ psql --username netbox --password --host localhost netbox
Password for user netbox:
psql (12.5 (Ubuntu 12.5-0ubuntu0.20.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
netbox=> \conninfo
You are connected to database "netbox" as user "netbox" on host "localhost" (address "127.0.0.1") at port "5432".
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
netbox=> \q
```
If successful, you will enter a `netbox` prompt. Type `\q` to exit.
If successful, you will enter a `netbox` prompt. Type `\conninfo` to confirm your connection, or type `\q` to exit.

View File

@@ -4,19 +4,21 @@
[Redis](https://redis.io/) is an in-memory key-value store which NetBox employs for caching and queuing. This section entails the installation and configuration of a local Redis instance. If you already have a Redis service in place, skip to [the next section](3-netbox.md).
!!! note
NetBox v2.9.0 and later require Redis v4.0 or higher. If your distribution does not offer a recent enough release, you will need to build Redis from source. Please see [the Redis installation documentation](https://github.com/redis/redis) for further details.
### Ubuntu
```no-highlight
# apt-get install -y redis-server
sudo apt install -y redis-server
```
### CentOS
```no-highlight
# yum install -y epel-release
# yum install -y redis
# systemctl start redis
# systemctl enable redis
sudo yum install -y redis
sudo systemctl start redis
sudo systemctl enable redis
```
You may wish to modify the Redis configuration at `/etc/redis.conf` or `/etc/redis/redis.conf`, however in most cases the default configuration is sufficient.

View File

@@ -4,43 +4,55 @@ This section of the documentation discusses installing and configuring the NetBo
## Install System Packages
Begin by installing all system packages required by NetBox and its dependencies. Note that beginning with NetBox v2.8, Python 3.6 or later is required.
Begin by installing all system packages required by NetBox and its dependencies.
!!! note
NetBox v2.8.0 and later require Python 3.6, 3.7, or 3.8. This documentation assumes Python 3.6.
### Ubuntu
```no-highlight
# apt-get install -y python3.6 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev
sudo apt install -y python3.6 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev
```
### CentOS
```no-highlight
# yum install -y gcc python36 python36-devel python36-setuptools libxml2-devel libxslt-devel libffi-devel openssl-devel redhat-rpm-config
# easy_install-3.6 pip
sudo yum install -y gcc python36 python36-devel python3-pip libxml2-devel libxslt-devel libffi-devel openssl-devel redhat-rpm-config
```
Before continuing with either platform, update pip (Python's package management tool) to its latest release:
```no-highlight
sudo pip3 install --upgrade pip
```
## Download NetBox
You may opt to install NetBox either from a numbered release or by cloning the master branch of its repository on GitHub.
This documentation provides two options for installing NetBox: from a downloadable archive, or from the git repository. Installing from a package (option A below) requires manually fetching and extracting the archive for every future update, whereas installation via git (option B) allows for seamless upgrades by re-pulling the `master` branch.
### Option A: Download a Release
### Option A: Download a Release Archive
Download the [latest stable release](https://github.com/netbox-community/netbox/releases) from GitHub as a tarball or ZIP archive and extract it to your desired path. In this example, we'll use `/opt/netbox`.
Download the [latest stable release](https://github.com/netbox-community/netbox/releases) from GitHub as a tarball or ZIP archive and extract it to your desired path. In this example, we'll use `/opt/netbox` as the NetBox root.
```no-highlight
# wget https://github.com/netbox-community/netbox/archive/vX.Y.Z.tar.gz
# tar -xzf vX.Y.Z.tar.gz -C /opt
# cd /opt/
# ln -s netbox-X.Y.Z/ netbox
# cd /opt/netbox/
$ sudo wget https://github.com/netbox-community/netbox/archive/vX.Y.Z.tar.gz
$ sudo tar -xzf vX.Y.Z.tar.gz -C /opt
$ sudo ln -s /opt/netbox-X.Y.Z/ /opt/netbox
$ ls -l /opt | grep netbox
lrwxrwxrwx 1 root root 13 Jul 20 13:44 netbox -> netbox-2.9.0/
drwxr-xr-x 2 root root 4096 Jul 20 13:44 netbox-2.9.0
```
!!! note
It is recommended to install NetBox in a directory named for its version number. For example, NetBox v2.9.0 would be installed into `/opt/netbox-2.9.0`, and a symlink from `/opt/netbox/` would point to this location. This allows for future releases to be installed in parallel without interrupting the current installation. When changing to the new release, only the symlink needs to be updated.
### Option B: Clone the Git Repository
Create the base directory for the NetBox installation. For this guide, we'll use `/opt/netbox`.
```no-highlight
# mkdir -p /opt/netbox/ && cd /opt/netbox/
sudo mkdir -p /opt/netbox/ && cd /opt/netbox/
```
If `git` is not already installed, install it:
@@ -48,19 +60,19 @@ If `git` is not already installed, install it:
#### Ubuntu
```no-highlight
# apt-get install -y git
sudo apt install -y git
```
#### CentOS
```no-highlight
# yum install -y git
sudo yum install -y git
```
Next, clone the **master** branch of the NetBox GitHub repository into the current directory:
Next, clone the **master** branch of the NetBox GitHub repository into the current directory. (This branch always holds the current stable release.)
```no-highlight
# git clone -b master https://github.com/netbox-community/netbox.git .
$ sudo git clone -b master https://github.com/netbox-community/netbox.git .
Cloning into '.'...
remote: Counting objects: 1994, done.
remote: Compressing objects: 100% (150/150), done.
@@ -70,72 +82,38 @@ Resolving deltas: 100% (1495/1495), done.
Checking connectivity... done.
```
## Create the NetBox User
Create a system user account named `netbox`. We'll configure the WSGI and HTTP services to run under this account. We'll also assign this user ownership of the media directory. This ensures that NetBox will be able to save local files.
!!! note
CentOS users may need to create the `netbox` group first.
Installation via git also allows you to easily try out development versions of NetBox. The `develop` branch contains all work underway for the next minor release, and the `develop-x.y` branch (if present) tracks progress on the next major release.
## Create the NetBox System User
Create a system user account named `netbox`. We'll configure the WSGI and HTTP services to run under this account. We'll also assign this user ownership of the media directory. This ensures that NetBox will be able to save uploaded files.
#### Ubuntu
```
# groupadd --system netbox
# adduser --system --gid netbox netbox
# chown --recursive netbox /opt/netbox/netbox/media/
sudo adduser --system --group netbox
sudo chown --recursive netbox /opt/netbox/netbox/media/
```
## Set Up Python Environment
#### CentOS
We'll use a Python [virtual environment](https://docs.python.org/3.6/tutorial/venv.html) to ensure NetBox's required packages don't conflict with anything in the base system. This will create a directory named `venv` in our NetBox root.
```no-highlight
# python3 -m venv /opt/netbox/venv
```
Next, activate the virtual environment and install the required Python packages. You should see your console prompt change to indicate the active environment. (Activating the virtual environment updates your command shell to use the local copy of Python that we just installed for NetBox instead of the system's Python interpreter.)
```no-highlight
# source venv/bin/activate
(venv) # pip3 install -r requirements.txt
```
### NAPALM Automation (Optional)
NetBox supports integration with the [NAPALM automation](https://napalm-automation.net/) library. NAPALM allows NetBox to fetch live data from devices and return it to a requester via its REST API. Installation of NAPALM is optional. To enable it, install the `napalm` package:
```no-highlight
(venv) # pip3 install napalm
```
To ensure NAPALM is automatically re-installed during future upgrades, create a file named `local_requirements.txt` in the NetBox root directory (alongside `requirements.txt`) and list the `napalm` package:
```no-highlight
# echo napalm >> local_requirements.txt
```
### Remote File Storage (Optional)
By default, NetBox will use the local filesystem to storage uploaded files. To use a remote filesystem, install the [`django-storages`](https://django-storages.readthedocs.io/en/stable/) library and configure your [desired backend](../../configuration/optional-settings/#storage_backend) in `configuration.py`.
```no-highlight
(venv) # pip3 install django-storages
```
Don't forget to add the `django-storages` package to `local_requirements.txt` to ensure it gets re-installed during future upgrades:
```no-highlight
# echo django-storages >> local_requirements.txt
sudo groupadd --system netbox
sudo adduser --system -g netbox netbox
sudo chown --recursive netbox /opt/netbox/netbox/media/
```
## Configuration
Move into the NetBox configuration directory and make a copy of `configuration.example.py` named `configuration.py`.
Move into the NetBox configuration directory and make a copy of `configuration.example.py` named `configuration.py`. This file will hold all of your local configuration parameters.
```no-highlight
(venv) # cd netbox/netbox/
(venv) # cp configuration.example.py configuration.py
cd /opt/netbox/netbox/netbox/
sudo cp configuration.example.py configuration.py
```
Open `configuration.py` with your preferred editor and set the following variables:
Open `configuration.py` with your preferred editor to begin configuring NetBox. NetBox offers [many configuration parameters](/configuration/), but only the following four are required for new installations:
* `ALLOWED_HOSTS`
* `DATABASE`
@@ -144,19 +122,21 @@ Open `configuration.py` with your preferred editor and set the following variabl
### ALLOWED_HOSTS
This is a list of the valid hostnames by which this server can be reached. You must specify at least one name or IP address.
Example:
This is a list of the valid hostnames and IP addresses by which this server can be reached. You must specify at least one name or IP address. (Note that this does not restrict the locations from which NetBox may be accessed: It is merely for [HTTP host header validation](https://docs.djangoproject.com/en/3.0/topics/security/#host-headers-virtual-hosting).)
```python
ALLOWED_HOSTS = ['netbox.example.com', '192.0.2.123']
```
If you are not yet sure what the domain name and/or IP address of the NetBox installation will be, you can set this to a wildcard (asterisk) to allow all host values:
```python
ALLOWED_HOSTS = ['*']
```
### DATABASE
This parameter holds the database configuration details. You must define the username and password used when you configured PostgreSQL. If the service is running on a remote host, replace `localhost` with its address. See the [configuration documentation](../../configuration/required-settings/#database) for more detail on individual parameters.
Example:
This parameter holds the database configuration details. You must define the username and password used when you configured PostgreSQL. If the service is running on a remote host, update the `HOST` and `PORT` parameters accordingly. See the [configuration documentation](/configuration/required-settings/#database) for more detail on individual parameters.
```python
DATABASE = {
@@ -165,30 +145,30 @@ DATABASE = {
'PASSWORD': 'J5brHrAXFLQSif0K', # PostgreSQL password
'HOST': 'localhost', # Database server
'PORT': '', # Database port (leave blank for default)
'CONN_MAX_AGE': 300, # Max database connection age
'CONN_MAX_AGE': 300, # Max database connection age (seconds)
}
```
### REDIS
Redis is a in-memory key-value store required as part of the NetBox installation. It is used for features such as webhooks and caching. Redis typically requires minimal configuration; the values below should suffice for most installations. See the [configuration documentation](../../configuration/required-settings/#redis) for more detail on individual parameters.
Redis is a in-memory key-value store used by NetBox for caching and background task queuing. Redis typically requires minimal configuration; the values below should suffice for most installations. See the [configuration documentation](/configuration/required-settings/#redis) for more detail on individual parameters.
Note that NetBox requires the specification of two separate Redis databases: `tasks` and `caching`. These may both be provided by the same Redis service, however each should have a unique numeric database ID.
```python
REDIS = {
'tasks': {
'HOST': 'redis.example.com',
'PORT': 1234,
'PASSWORD': 'foobar',
'DATABASE': 0,
'DEFAULT_TIMEOUT': 300,
'SSL': False,
'HOST': 'localhost', # Redis server
'PORT': 6379, # Redis port
'PASSWORD': '', # Redis password (optional)
'DATABASE': 0, # Database ID
'SSL': False, # Use SSL (optional)
},
'caching': {
'HOST': 'localhost',
'PORT': 6379,
'PASSWORD': '',
'DATABASE': 1,
'DEFAULT_TIMEOUT': 300,
'DATABASE': 1, # Unique ID for second database
'SSL': False,
}
}
@@ -196,38 +176,70 @@ REDIS = {
### SECRET_KEY
Generate a random secret key of at least 50 alphanumeric characters. This key must be unique to this installation and must not be shared outside the local system.
This parameter must be assigned a randomly-generated key employed as a salt for hashing and related cryptographic functions. (Note, however, that it is _never_ directly used in the encryption of secret data.) This key must be unique to this installation and is recommended to be at least 50 characters long. It should not be shared outside the local system.
You may use the script located at `netbox/generate_secret_key.py` to generate a suitable key.
!!! note
In the case of a highly available installation with multiple web servers, `SECRET_KEY` must be identical among all servers in order to maintain a persistent user session state.
## Run Database Migrations
Before NetBox can run, we need to install the database schema. This is done by running `python3 manage.py migrate` from the `netbox` directory (`/opt/netbox/netbox/` in our example):
A simple Python script named `generate_secret_key.py` is provided in the parent directory to assist in generating a suitable key:
```no-highlight
(venv) # cd /opt/netbox/netbox/
(venv) # python3 manage.py migrate
Operations to perform:
Apply all migrations: dcim, sessions, admin, ipam, utilities, auth, circuits, contenttypes, extras, secrets, users
Running migrations:
Rendering model states... DONE
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
...
python3 ../generate_secret_key.py
```
If this step results in a PostgreSQL authentication error, ensure that the username and password created in the database match what has been specified in `configuration.py`
!!! warning
In the case of a highly available installation with multiple web servers, `SECRET_KEY` must be identical among all servers in order to maintain a persistent user session state.
When you have finished modifying the configuration, remember to save the file.
## Optional Requirements
All Python packages required by NetBox are listed in `requirements.txt` and will be installed automatically. NetBox also supports some optional packages. If desired, these packages must be listed in `local_requirements.txt` within the NetBox root directory.
### NAPALM
The [NAPALM automation](https://napalm-automation.net/) library allows NetBox to fetch live data from devices and return it to a requester via its REST API. The `NAPALM_USERNAME` and `NAPALM_PASSWORD` configuration parameters define the credentials to be used when connecting to a device.
```no-highlight
sudo echo napalm >> /opt/netbox/local_requirements.txt
```
### Remote File Storage
By default, NetBox will use the local filesystem to store uploaded files. To use a remote filesystem, install the [`django-storages`](https://django-storages.readthedocs.io/en/stable/) library and configure your [desired storage backend](/configuration/optional-settings/#storage_backend) in `configuration.py`.
```no-highlight
sudo echo django-storages >> /opt/netbox/local_requirements.txt
```
## Run the Upgrade Script
Once NetBox has been configured, we're ready to proceed with the actual installation. We'll run the packaged upgrade script (`upgrade.sh`) to perform the following actions:
* Create a Python virtual environment
* Install all required Python packages
* Run database schema migrations
* Aggregate static resource files on disk
```no-highlight
sudo /opt/netbox/upgrade.sh
```
!!! note
Upon completion, the upgrade script may warn that no existing virtual environment was detected. As this is a new installation, this warning can be safely ignored.
## Create a Super User
NetBox does not come with any predefined user accounts. You'll need to create a super user to be able to log into NetBox:
NetBox does not come with any predefined user accounts. You'll need to create a super user (administrative account) to be able to log into NetBox. First, enter the Python virtual environment created by the upgrade script:
```no-highlight
(venv) # python3 manage.py createsuperuser
source /opt/netbox/venv/bin/activate
```
Once the virtual environment has been activated, you should notice the string `(venv)` prepended to your console prompt.
Next, we'll create a superuser account using the `createsuperuser` Django management command (via `manage.py`). Specifying an email address for the user is not required, but be sure to use a very strong password.
```no-highlight
(venv) $ cd /opt/netbox/netbox
(venv) $ python3 manage.py createsuperuser
Username: admin
Email address: admin@example.com
Password:
@@ -235,38 +247,35 @@ Password (again):
Superuser created successfully.
```
## Collect Static Files
```no-highlight
(venv) # python3 manage.py collectstatic --no-input
959 static files copied to '/opt/netbox/netbox/static'.
```
## Test the Application
At this point, NetBox should be able to run. We can verify this by starting a development instance:
At this point, we should be able to run NetBox's development server for testing. We can check by starting a development instance:
```no-highlight
(venv) # python3 manage.py runserver 0.0.0.0:8000 --insecure
(venv) $ python3 manage.py runserver 0.0.0.0:8000 --insecure
Performing system checks...
System check identified no issues (0 silenced).
November 28, 2018 - 09:33:45
Django version 2.0.9, using settings 'netbox.settings'
November 17, 2020 - 16:08:13
Django version 3.1.3, using settings 'netbox.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
```
Next, connect to the name or IP of the server (as defined in `ALLOWED_HOSTS`) on port 8000; for example, <http://127.0.0.1:8000/>. You should be greeted with the NetBox home page. Note that this built-in web service is for development and testing purposes only. **It is not suited for production use.**
Next, connect to the name or IP of the server (as defined in `ALLOWED_HOSTS`) on port 8000; for example, <http://127.0.0.1:8000/>. You should be greeted with the NetBox home page.
!!! warning
The development server is for development and testing purposes only. It is neither performant nor secure enough for production use. **Do not use it in production.**
!!! warning
If the test service does not run, or you cannot reach the NetBox home page, something has gone wrong. Do not proceed with the rest of this guide until the installation has been corrected.
Note that the initial UI will be locked down for non-authenticated users.
Note that the initial user interface will be locked down for non-authenticated users.
![NetBox UI as seen by a non-authenticated user](../media/installation/netbox_ui_guest.png)
After logging in as the superuser you created earlier, all areas of the UI will be available.
Try logging in using the superuser account we just created. Once authenticated, you'll be able to access all areas of the UI:
![NetBox UI as seen by an administrator](../media/installation/netbox_ui_admin.png)
Type `Ctrl+c` to stop the development server.

View File

@@ -0,0 +1,52 @@
# Gunicorn
Like most Django applications, NetBox runs as a [WSGI application](https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface) behind an HTTP server. This documentation shows how to install and configure [gunicorn](http://gunicorn.org/) (which is automatically installed with NetBox) for this role, however other WSGI servers are available and should work similarly well. [uWSGI](https://uwsgi-docs.readthedocs.io/en/latest/) is a popular alternative.
## Configuration
NetBox ships with a default configuration file for gunicorn. To use it, copy `/opt/netbox/contrib/gunicorn.py` to `/opt/netbox/gunicorn.py`. (We make a copy of this file rather than pointing to it directly to ensure that any local changes to it do not get overwritten by a future upgrade.)
```no-highlight
sudo cp /opt/netbox/contrib/gunicorn.py /opt/netbox/gunicorn.py
```
While the provided configuration should suffice for most initial installations, you may wish to edit this file to change the bound IP address and/or port number, or to make performance-related adjustments. See [the Gunicorn documentation](https://docs.gunicorn.org/en/stable/configure.html) for the available configuration parameters.
## systemd Setup
We'll use systemd to control both gunicorn and NetBox's background worker process. First, copy `contrib/netbox.service` and `contrib/netbox-rq.service` to the `/etc/systemd/system/` directory and reload the systemd dameon:
```no-highlight
sudo cp -v /opt/netbox/contrib/*.service /etc/systemd/system/
sudo systemctl daemon-reload
```
Then, start the `netbox` and `netbox-rq` services and enable them to initiate at boot time:
```no-highlight
sudo systemctl start netbox netbox-rq
sudo systemctl enable netbox netbox-rq
```
You can use the command `systemctl status netbox` to verify that the WSGI service is running:
```no-highlight
# systemctl status netbox.service
● netbox.service - NetBox WSGI Service
Loaded: loaded (/etc/systemd/system/netbox.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-11-17 16:18:23 UTC; 3min 35s ago
Docs: https://netbox.readthedocs.io/en/stable/
Main PID: 22836 (gunicorn)
Tasks: 6 (limit: 2345)
Memory: 339.3M
CGroup: /system.slice/netbox.service
├─22836 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid>
├─22854 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid>
├─22855 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid>
...
```
!!! note
If the NetBox service fails to start, issue the command `journalctl -eu netbox` to check for log messages that may indicate the problem.
Once you've verified that the WSGI workers are up and running, move on to HTTP server setup.

View File

@@ -1,135 +0,0 @@
# HTTP Server Setup
We'll set up a simple WSGI front end using [gunicorn](http://gunicorn.org/) for the purposes of this guide. For web servers, we provide example configurations for both [nginx](https://www.nginx.com/resources/wiki/) and [Apache](http://httpd.apache.org/docs/2.4). (You are of course free to use whichever combination of HTTP and WSGI services you'd like.) We'll use systemd to enable service persistence.
!!! info
For the sake of brevity, only Ubuntu 18.04 instructions are provided here, but this sort of web server and WSGI configuration is not unique to NetBox. Please consult your distribution's documentation for assistance if needed.
## Obtain an SSL Certificate
To enable HTTPS access to NetBox, you'll need a valid SSL certificate. You can purchase one from a trusted commercial provider, obtain one for free from [Let's Encrypt](https://letsencrypt.org/getting-started/), or generate your own (although self-signed certificates are generally untrusted). Both the public certificate and private key files need to be installed on your NetBox server in a location that is readable by the `netbox` user.
The command below can be used to generate a self-signed certificate for testing purposes, however it is strongly recommended to use a certificate from a trusted authority in production. Two files will be created: the public certificate (`netbox.crt`) and the private key (`netbox.key`). The certificate is published to the world, whereas the private key must be kept secret at all times.
```no-highlight
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/netbox.key \
-out /etc/ssl/certs/netbox.crt
```
## HTTP Daemon Installation
### Option A: nginx
The following will serve as a minimal nginx configuration. Be sure to modify your server name and installation path appropriately.
```no-highlight
# apt-get install -y nginx
```
Once nginx is installed, copy the default nginx configuration file to `/etc/nginx/sites-available/netbox`. Be sure to replace `netbox.example.com` with the domain name or IP address of your installation. (This should match the value configured for `ALLOWED_HOSTS` in `configuration.py`.)
```no-highlight
# cp /opt/netbox/contrib/nginx.conf /etc/nginx/sites-available/netbox
```
Then, delete `/etc/nginx/sites-enabled/default` and create a symlink in the `sites-enabled` directory to the configuration file you just created.
```no-highlight
# cd /etc/nginx/sites-enabled/
# rm default
# ln -s /etc/nginx/sites-available/netbox
```
Finally, restart the `nginx` service to use the new configuration.
```no-highlight
# service nginx restart
```
### Option B: Apache
Begin by installing Apache:
```no-highlight
# apt-get install -y apache2
```
Next, copy the default configuration file to `/etc/apache2/sites-available/`. Be sure to modify the `ServerName` parameter appropriately.
```no-highlight
# cp /opt/netbox/contrib/apache.conf /etc/apache2/sites-available/netbox.conf
```
Finally, ensure that the required Apache modules are enabled, enable the `netbox` site, and reload Apache:
```no-highlight
# a2enmod ssl proxy proxy_http headers
# a2ensite netbox
# service apache2 restart
```
!!! note
Certain components of NetBox (such as the display of rack elevation diagrams) rely on the use of embedded objects. Ensure that your HTTP server configuration does not override the `X-Frame-Options` response header set by NetBox.
## Gunicorn Configuration
Copy `/opt/netbox/contrib/gunicorn.py` to `/opt/netbox/gunicorn.py`. (We make a copy of this file to ensure that any changes to it do not get overwritten by a future upgrade.)
```no-highlight
# cd /opt/netbox
# cp contrib/gunicorn.py /opt/netbox/gunicorn.py
```
You may wish to edit this file to change the bound IP address or port number, or to make performance-related adjustments. See [the Gunicorn documentation](https://docs.gunicorn.org/en/stable/configure.html) for the available configuration parameters.
## systemd Configuration
We'll use systemd to control the daemonization of NetBox services. First, copy `contrib/netbox.service` and `contrib/netbox-rq.service` to the `/etc/systemd/system/` directory:
```no-highlight
# cp contrib/*.service /etc/systemd/system/
```
Then, start the `netbox` and `netbox-rq` services and enable them to initiate at boot time:
```no-highlight
# systemctl daemon-reload
# systemctl start netbox netbox-rq
# systemctl enable netbox netbox-rq
```
You can use the command `systemctl status netbox` to verify that the WSGI service is running:
```no-highlight
# systemctl status netbox.service
● netbox.service - NetBox WSGI Service
Loaded: loaded (/etc/systemd/system/netbox.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2019-12-12 19:23:40 UTC; 25s ago
Docs: https://netbox.readthedocs.io/en/stable/
Main PID: 11993 (gunicorn)
Tasks: 6 (limit: 2362)
CGroup: /system.slice/netbox.service
├─11993 /usr/bin/python3 /usr/local/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/...
├─12015 /usr/bin/python3 /usr/local/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/...
├─12016 /usr/bin/python3 /usr/local/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/...
...
```
At this point, you should be able to connect to the HTTP service at the server name or IP address you provided.
!!! info
Please keep in mind that the configurations provided here are bare minimums required to get NetBox up and running. You may want to make adjustments to better suit your production environment.
## Troubleshooting
If you are unable to connect to the HTTP server, check that:
* Nginx/Apache is running and configured to listen on the correct port.
* Access is not being blocked by a firewall. (Try connecting locally from the server itself.)
If you are able to connect but receive a 502 (bad gateway) error, check the following:
* The NetBox system process (gunicorn) is running: `systemctl status netbox`
* nginx/Apache is configured to connect to the port on which gunicorn is listening (default is 8001).
* SELinux is not preventing the reverse proxy connection. You may need to allow HTTP network connections with the command `setsebool -P httpd_can_network_connect 1`

View File

@@ -0,0 +1,94 @@
# HTTP Server Setup
This documentation provides example configurations for both [nginx](https://www.nginx.com/resources/wiki/) and [Apache](http://httpd.apache.org/docs/current/), though any HTTP server which supports WSGI should be compatible.
!!! info
For the sake of brevity, only Ubuntu 20.04 instructions are provided here, these tasks not unique to NetBox and should carry over to other distributions with mininal changes. Please consult your distribution's documentation for assistance if needed.
## Obtain an SSL Certificate
To enable HTTPS access to NetBox, you'll need a valid SSL certificate. You can purchase one from a trusted commercial provider, obtain one for free from [Let's Encrypt](https://letsencrypt.org/getting-started/), or generate your own (although self-signed certificates are generally untrusted). Both the public certificate and private key files need to be installed on your NetBox server in a location that is readable by the `netbox` user.
The command below can be used to generate a self-signed certificate for testing purposes, however it is strongly recommended to use a certificate from a trusted authority in production. Two files will be created: the public certificate (`netbox.crt`) and the private key (`netbox.key`). The certificate is published to the world, whereas the private key must be kept secret at all times.
```no-highlight
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/netbox.key \
-out /etc/ssl/certs/netbox.crt
```
The above command will prompt you for additional details of the certificate; all of these are optional.
## HTTP Server Installation
### Option A: nginx
Begin by installing nginx:
```no-highlight
sudo apt install -y nginx
```
Once nginx is installed, copy the nginx configuration file provided by NetBox to `/etc/nginx/sites-available/netbox`. Be sure to replace `netbox.example.com` with the domain name or IP address of your installation. (This should match the value configured for `ALLOWED_HOSTS` in `configuration.py`.)
```no-highlight
sudo cp /opt/netbox/contrib/nginx.conf /etc/nginx/sites-available/netbox
```
Then, delete `/etc/nginx/sites-enabled/default` and create a symlink in the `sites-enabled` directory to the configuration file you just created.
```no-highlight
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/netbox /etc/nginx/sites-enabled/netbox
```
Finally, restart the `nginx` service to use the new configuration.
```no-highlight
sudo systemctl restart nginx
```
### Option B: Apache
Begin by installing Apache:
```no-highlight
sudo apt install -y apache2
```
Next, copy the default configuration file to `/etc/apache2/sites-available/`. Be sure to modify the `ServerName` parameter appropriately.
```no-highlight
sudo cp /opt/netbox/contrib/apache.conf /etc/apache2/sites-available/netbox.conf
```
Finally, ensure that the required Apache modules are enabled, enable the `netbox` site, and reload Apache:
```no-highlight
sudo a2enmod ssl proxy proxy_http headers
sudo a2ensite netbox
sudo systemctl restart apache2
```
## Confirm Connectivity
At this point, you should be able to connect to the HTTPS service at the server name or IP address you provided.
!!! info
Please keep in mind that the configurations provided here are bare minimums required to get NetBox up and running. You may want to make adjustments to better suit your production environment.
!!! warning
Certain components of NetBox (such as the display of rack elevation diagrams) rely on the use of embedded objects. Ensure that your HTTP server configuration does not override the `X-Frame-Options` response header set by NetBox.
## Troubleshooting
If you are unable to connect to the HTTP server, check that:
* Nginx/Apache is running and configured to listen on the correct port.
* Access is not being blocked by a firewall somewhere along the path. (Try connecting locally from the server itself.)
If you are able to connect but receive a 502 (bad gateway) error, check the following:
* The WSGI worker processes (gunicorn) are running (`systemctl status netbox` should show a status of "active (running)")
* Nginx/Apache is configured to connect to the port on which gunicorn is listening (default is 8001).
* SELinux is not preventing the reverse proxy connection. You may need to allow HTTP network connections with the command `setsebool -P httpd_can_network_connect 1`

View File

@@ -9,13 +9,13 @@ This guide explains how to implement LDAP authentication using an external serve
On Ubuntu:
```no-highlight
# apt-get install -y libldap2-dev libsasl2-dev libssl-dev
sudo apt install -y libldap2-dev libsasl2-dev libssl-dev
```
On CentOS:
```no-highlight
# yum install -y openldap-devel
sudo yum install -y openldap-devel
```
### Install django-auth-ldap
@@ -23,20 +23,25 @@ On CentOS:
Activate the Python virtual environment and install the `django-auth-ldap` package using pip:
```no-highlight
# cd /opt/netbox/
# source venv/bin/activate
(venv) # pip3 install django-auth-ldap
source /opt/netbox/venv/bin/activate
pip3 install django-auth-ldap
```
Once installed, add the package to `local_requirements.txt` to ensure it is re-installed during future rebuilds of the virtual environment:
```no-highlight
(venv) # echo django-auth-ldap >> local_requirements.txt
sudo echo django-auth-ldap >> /opt/netbox/local_requirements.txt
```
## Configuration
Create a file in the same directory as `configuration.py` (typically `netbox/netbox/`) named `ldap_config.py`. Define all of the parameters required below in `ldap_config.py`. Complete documentation of all `django-auth-ldap` configuration options is included in the project's [official documentation](http://django-auth-ldap.readthedocs.io/).
First, enable the LDAP authentication backend in `configuration.py`. (Be sure to overwrite this definition if it is already set to `RemoteUserBackend`.)
```python
REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'
```
Next, create a file in the same directory as `configuration.py` (typically `/opt/netbox/netbox/netbox/`) named `ldap_config.py`. Define all of the parameters required below in `ldap_config.py`. Complete documentation of all `django-auth-ldap` configuration options is included in the project's [official documentation](http://django-auth-ldap.readthedocs.io/).
### General Server Configuration
@@ -137,16 +142,28 @@ AUTH_LDAP_CACHE_TIMEOUT = 3600
`systemctl restart netbox` restarts the Netbox service, and initiates any changes made to `ldap_config.py`. If there are syntax errors present, the NetBox process will not spawn an instance, and errors should be logged to `/var/log/messages`.
For troubleshooting LDAP user/group queries, add the following lines to the start of `ldap_config.py` after `import ldap`.
For troubleshooting LDAP user/group queries, add or merge the following [logging](/configuration/optional-settings.md#logging) configuration to `configuration.py`:
```python
import logging, logging.handlers
logfile = "/opt/netbox/logs/django-ldap-debug.log"
my_logger = logging.getLogger('django_auth_ldap')
my_logger.setLevel(logging.DEBUG)
handler = logging.handlers.RotatingFileHandler(
logfile, maxBytes=1024 * 500, backupCount=5)
my_logger.addHandler(handler)
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'netbox_auth_log': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/opt/netbox/logs/django-ldap-debug.log',
'maxBytes': 1024 * 500,
'backupCount': 5,
},
},
'loggers': {
'django_auth_ldap': {
'handlers': ['netbox_auth_log'],
'level': 'DEBUG',
},
},
}
```
Ensure the file and path specified in logfile exist and are writable and executable by the application service account. Restart the netbox service and attempt to log into the site to trigger log entries to this file.

View File

@@ -1,12 +1,23 @@
# Installation
The installation instructions provided here have been tested to work on Ubuntu 20.04 and CentOS 8.2. The particular commands needed to install dependencies on other distributions may vary significantly. Unfortunately, this is outside the control of the NetBox maintainers. Please consult your distribution's documentation for assistance with any errors.
The following sections detail how to set up a new instance of NetBox:
1. [PostgreSQL database](1-postgresql.md)
1. [Redis](2-redis.md)
3. [NetBox components](3-netbox.md)
4. [HTTP daemon](4-http-daemon.md)
5. [LDAP authentication](5-ldap.md) (optional)
4. [Gunicorn](4-gunicorn.md)
5. [HTTP server](5-http-server.md)
6. [LDAP authentication](6-ldap.md) (optional)
## Requirements
| Dependency | Minimum Version |
|------------|-----------------|
| Python | 3.6 |
| PostgreSQL | 9.6 |
| Redis | 4.0 |
Below is a simplified overview of the NetBox application stack for reference:
@@ -16,4 +27,5 @@ Below is a simplified overview of the NetBox application stack for reference:
If you are upgrading from an existing installation, please consult the [upgrading guide](upgrading.md).
Netbox v2.5.9 and later moved to using systemd instead of supervisord. Please see the instructions for [migrating to systemd](migrating-to-systemd.md) if you are still using supervisord.
!!! note
Beginning with v2.5.9, the official documentation calls for systemd to be used for managing the WSGI workers in place of supervisord. Please see the instructions for [migrating to systemd](migrating-to-systemd.md) if you are still using supervisord.

View File

@@ -38,14 +38,14 @@ You can use the command `systemctl status netbox` to verify that the WSGI servic
# systemctl status netbox.service
● netbox.service - NetBox WSGI Service
Loaded: loaded (/etc/systemd/system/netbox.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2019-12-12 19:23:40 UTC; 25s ago
Active: active (running) since Sat 2020-10-24 19:23:40 UTC; 25s ago
Docs: https://netbox.readthedocs.io/en/stable/
Main PID: 11993 (gunicorn)
Tasks: 6 (limit: 2362)
CGroup: /system.slice/netbox.service
├─11993 /usr/bin/python3 /usr/local/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/...
├─12015 /usr/bin/python3 /usr/local/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/...
├─12016 /usr/bin/python3 /usr/local/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/...
├─11993 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/...
├─12015 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/...
├─12016 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/...
...
```

View File

@@ -2,12 +2,19 @@
## Review the Release Notes
Prior to upgrading your NetBox instance, be sure to carefully review all [release notes](../../release-notes/) that have been published since your current version was released. Although the upgrade process typically does not involve additional work, certain releases may introduce breaking or backward-incompatible changes. These are called out in the release notes under the version in which the change went into effect.
Prior to upgrading your NetBox instance, be sure to carefully review all [release notes](../../release-notes/) that have been published since your current version was released. Although the upgrade process typically does not involve additional work, certain releases may introduce breaking or backward-incompatible changes. These are called out in the release notes under the release in which the change went into effect.
!!! note
Beginning with version 2.8, NetBox requires Python 3.6 or later.
## Update Dependencies to Required Versions
## Install the Latest Code
NetBox v2.9.0 and later requires the following:
| Dependency | Minimum Version |
|------------|-----------------|
| Python | 3.6 |
| PostgreSQL | 9.6 |
| Redis | 4.0 |
## Install the Latest Release
As with the initial installation, you can upgrade NetBox by either downloading the latest release package or by cloning the `master` branch of the git repository.
@@ -18,41 +25,36 @@ Download the [latest stable release](https://github.com/netbox-community/netbox/
Download and extract the latest version:
```no-highlight
# wget https://github.com/netbox-community/netbox/archive/vX.Y.Z.tar.gz
# tar -xzf vX.Y.Z.tar.gz -C /opt
# cd /opt/
# ln -sfn netbox-X.Y.Z/ netbox
wget https://github.com/netbox-community/netbox/archive/vX.Y.Z.tar.gz
sudo tar -xzf vX.Y.Z.tar.gz -C /opt
sudo ln -sfn /opt/netbox-X.Y.Z/ /opt/netbox
```
Copy the 'configuration.py' you created when first installing to the new version:
Copy `local_requirements.txt`, `configuration.py`, and `ldap_config.py` (if present) from the current installation to the new version:
```no-highlight
# cp netbox-X.Y.Z/netbox/netbox/configuration.py netbox/netbox/netbox/configuration.py
```
Also copy the LDAP configuration if using LDAP:
```no-highlight
# cp netbox-X.Y.Z/netbox/netbox/ldap_config.py netbox/netbox/netbox/ldap_config.py
sudo cp /opt/netbox-X.Y.Z/local_requirements.txt /opt/netbox/
sudo cp /opt/netbox-X.Y.Z/netbox/netbox/configuration.py /opt/netbox/netbox/netbox/
sudo cp /opt/netbox-X.Y.Z/netbox/netbox/ldap_config.py /opt/netbox/netbox/netbox/
```
Be sure to replicate your uploaded media as well. (The exact action necessary will depend on where you choose to store your media, but in general moving or copying the media directory will suffice.)
```no-highlight
# cp -pr netbox-X.Y.Z/netbox/media/ netbox/netbox/
sudo cp -pr /opt/netbox-X.Y.Z/netbox/media/ /opt/netbox/netbox/
```
Also make sure to copy over any custom scripts and reports that you've made. Note that if these are stored outside the project root, you will not need to copy them. (Check the `SCRIPTS_ROOT` and `REPORTS_ROOT` parameters in the configuration file above if you're unsure.)
Also make sure to copy or link any custom scripts and reports that you've made. Note that if these are stored outside the project root, you will not need to copy them. (Check the `SCRIPTS_ROOT` and `REPORTS_ROOT` parameters in the configuration file above if you're unsure.)
```no-highlight
# cp -r /opt/netbox-X.Y.Z/netbox/scripts /opt/netbox/netbox/scripts/
# cp -r /opt/netbox-X.Y.Z/netbox/reports /opt/netbox/netbox/reports/
sudo cp -r /opt/netbox-X.Y.Z/netbox/scripts /opt/netbox/netbox/
sudo cp -r /opt/netbox-X.Y.Z/netbox/reports /opt/netbox/netbox/
```
If you followed the original installation guide to set up gunicorn, be sure to copy its configuration as well:
```no-highlight
# cp netbox-X.Y.Z/gunicorn.py netbox/gunicorn.py
sudo cp /opt/netbox-X.Y.Z/gunicorn.py /opt/netbox/
```
### Option B: Clone the Git Repository
@@ -60,10 +62,9 @@ If you followed the original installation guide to set up gunicorn, be sure to c
This guide assumes that NetBox is installed at `/opt/netbox`. Pull down the most recent iteration of the master branch:
```no-highlight
# cd /opt/netbox
# git checkout master
# git pull origin master
# git status
cd /opt/netbox
sudo git checkout master
sudo git pull origin master
```
## Run the Upgrade Script
@@ -71,10 +72,10 @@ This guide assumes that NetBox is installed at `/opt/netbox`. Pull down the most
Once the new code is in place, verify that any optional Python packages required by your deployment (e.g. `napalm` or `django-auth-ldap`) are listed in `local_requirements.txt`. Then, run the upgrade script:
```no-highlight
# ./upgrade.sh
sudo ./upgrade.sh
```
This script:
This script performs the following actions:
* Destroys and rebuilds the Python virtual environment
* Installs all required Python packages (listed in `requirements.txt`)
@@ -86,23 +87,20 @@ This script:
* Clears all cached data to prevent conflicts with the new release
!!! note
It's possible that the upgrade script will display a notice warning of unreflected database migrations:
Your models have changes that are not yet reflected in a migration, and so won't be applied.
Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
This may occur due to semantic differences in environment, and can be safely ignored. Never attempt to create new migrations unless you are intentionally modifying the database schema.
If the upgrade script prompts a warning about unreflected database migrations, this indicates that some change has
been made to your local codebase and should be investigated. Never attempt to create new migrations unless you are
intentionally modifying the database schema.
## Restart the NetBox Services
!!! warning
If you are upgrading from an installation that does not use a Python virtual environment, you'll need to update the systemd service files to reference the new Python and gunicorn executables before restarting the services. These are located in `/opt/netbox/venv/bin/`. See the example service files in `/opt/netbox/contrib/` for reference.
If you are upgrading from an installation that does not use a Python virtual environment (any release prior to v2.7.9), you'll need to update the systemd service files to reference the new Python and gunicorn executables before restarting the services. These are located in `/opt/netbox/venv/bin/`. See the example service files in `/opt/netbox/contrib/` for reference.
Finally, restart the gunicorn and RQ services:
```no-highlight
# sudo systemctl restart netbox netbox-rq
sudo systemctl restart netbox netbox-rq
```
!!! note
It's possible you are still using supervisord instead of systemd. If so, please see the instructions for [migrating to systemd](migrating-to-systemd.md).
If upgrading from an installation that uses supervisord, please see the instructions for [migrating to systemd](migrating-to-systemd.md). The use of supervisord is no longer supported.

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -1,3 +1,19 @@
# Circuits
A circuit represents a single _physical_ link connecting exactly two endpoints. (A circuit with more than two endpoints is a virtual circuit, which is not currently supported by NetBox.) Each circuit belongs to a provider and must be assigned a circuit ID which is unique to that provider.
A communications circuit represents a single _physical_ link connecting exactly two endpoints, commonly referred to as its A and Z terminations. A circuit in NetBox may have zero, one, or two terminations defined. It is common to have only one termination defined when you don't necessarily care about the details of the provider side of the circuit, e.g. for Internet access circuits. Both terminations would likely be modeled for circuits which connect one customer site to another.
Each circuit is associated with a provider and a user-defined type. For example, you might have Internet access circuits delivered to each site by one provider, and private MPLS circuits delivered by another. Each circuit must be assigned a circuit ID, each of which must be unique per provider.
Each circuit is also assigned one of the following operational statuses:
* Planned
* Provisioning
* Active
* Offline
* Deprovisioning
* Decommissioned
Circuits also have optional fields for annotating their installation date and commit rate, and may be assigned to NetBox tenants.
!!! note
NetBox currently models only physical circuits: those which have exactly two endpoints. It is common to layer virtualized constructs (_virtual circuits_) such as MPLS or EVPN tunnels on top of these, however NetBox does not yet support virtual circuit modeling.

View File

@@ -1,11 +1,10 @@
# Circuit Terminations
A circuit may have one or two terminations, annotated as the "A" and "Z" sides of the circuit. A single-termination circuit can be used when you don't know (or care) about the far end of a circuit (for example, an Internet access circuit which connects to a transit provider). A dual-termination circuit is useful for tracking circuits which connect two sites.
The association of a circuit with a particular site and/or device is modeled separately as a circuit termination. A circuit may have up to two terminations, labeled A and Z. A single-termination circuit can be used when you don't know (or care) about the far end of a circuit (for example, an Internet access circuit which connects to a transit provider). A dual-termination circuit is useful for tracking circuits which connect two sites.
Each circuit termination is tied to a site, and may optionally be connected via a cable to a specific device interface or pass-through port. Each termination can be assigned a separate downstream and upstream speed independent from one another. Fields are also available to track cross-connect and patch panel details.
Each circuit termination is tied to a site, and may optionally be connected via a cable to a specific device interface or port within that site. Each termination must be assigned a port speed, and can optionally be assigned an upstream speed if it differs from the downstream speed (a common scenario with e.g. DOCSIS cable modems). Fields are also available to track cross-connect and patch panel details.
In adherence with NetBox's philosophy of closely modeling the real world, a circuit may terminate only to a physical interface. For example, circuits may not terminate to LAG interfaces, which are virtual in nature. In such cases, a separate physical circuit is associated with each LAG member interface and each needs to be modeled discretely.
!!! note
A circuit represents a physical link, and cannot have more than two endpoints. When modeling a multi-point topology, each leg of the topology must be defined as a discrete circuit.
!!! note
A circuit may terminate only to a physical interface. Circuits may not terminate to LAG interfaces, which are virtual interfaces: You must define each physical circuit within a service bundle separately and terminate it to its actual physical interface.
A circuit in NetBox represents a physical link, and cannot have more than two endpoints. When modeling a multi-point topology, each leg of the topology must be defined as a discrete circuit, with one end terminating within the provider's infrastructure.

View File

@@ -1,10 +1,8 @@
# Circuit Types
Circuits are classified by type. For example, you might define circuit types for:
Circuits are classified by functional type. These types are completely customizable, and are typically used to convey the type of service being delivered over a circuit. For example, you might define circuit types for:
* Internet transit
* Out-of-band connectivity
* Peering
* Private backhaul
Circuit types are fully customizable.

View File

@@ -1,5 +1,5 @@
# Providers
A provider is any entity which provides some form of connectivity. While this obviously includes carriers which offer Internet and private transit service, it might also include Internet exchange (IX) points and even organizations with whom you peer directly.
A circuit provider is any entity which provides some form of connectivity of among sites or organizations within a site. While this obviously includes carriers which offer Internet and private transit service, it might also include Internet exchange (IX) points and even organizations with whom you peer directly. Each circuit within NetBox must be assigned a provider and a circuit ID which is unique to that provider.
Each provider may be assigned an autonomous system number (ASN), an account number, and relevant contact information.
Each provider may be assigned an autonomous system number (ASN), an account number, and contact information.

View File

@@ -1,19 +1,34 @@
# Cables
A cable represents a physical connection between two termination points, such as between a console port and a patch panel port, or between two network interfaces. Cables can be traced through pass-through ports to form a complete path between two endpoints. In the example below, three individual cables comprise a path between the two connected endpoints.
All connections between device components in NetBox are represented using cables. A cable represents a direct physical connection between two termination points, such as between a console port and a patch panel port, or between two network interfaces.
```
|<------------------------------------------ Cable Path ------------------------------------------->|
Each cable must have two endpoints defined. These endpoints are sometimes referenced as A and B for clarity, however cables are direction-agnostic and the order in which terminations are made has no meaning. Cables may be connected to the following objects:
Device A Patch Panel A Patch Panel B Device B
+-----------+ +-------------+ +-------------+ +-----------+
| Interface | --- Cable --- | Front Port | | Front Port | --- Cable --- | Interface |
+-----------+ +-------------+ +-------------+ +-----------+
+-------------+ +-------------+
| Rear Port | --- Cable --- | Rear Port |
+-------------+ +-------------+
```
* Circuit terminations
* Console ports
* Console server ports
* Interfaces
* Pass-through ports (front and rear)
* Power feeds
* Power outlets
* Power ports
All connections between device components in NetBox are represented using cables. However, defining the actual cable plant is optional: Components can be be directly connected using cables with no type or other attributes assigned.
Each cable may be assigned a type, label, length, and color. Each cable is also assigned one of three operational statuses:
Cables are also used to associated ports and interfaces with circuit terminations. To do this, first create the circuit termination, then navigate the desired component and connect a cable between the two.
* Active (default)
* Planned
* Decommissioning
## Tracing Cables
A cable may be traced from either of its endpoints by clicking the "trace" button. (A REST API endpoint also provides this functionality.) NetBox will follow the path of connected cables from this termination across the directly connected cable to the far-end termination. If the cable connects to a pass-through port, and the peer port has another cable connected, NetBox will continue following the cable path until it encounters a non-pass-through or unconnected termination point. The entire path will be displayed to the user.
In the example below, three individual cables comprise a path between devices A and D:
![Cable path](../../media/models/dcim_cable_trace.png)
Traced from Interface 1 on Device A, NetBox will show the following path:
* Cable 1: Interface 1 to Front Port 1
* Cable 2: Rear Port 1 to Rear Port 2
* Cable 3: Front Port 2 to Interface 2

View File

@@ -1,5 +1,5 @@
## Console Ports
A console port provides connectivity to the physical console of a device. Console ports are typically used for temporary access by someone who is physically near the device, or for remote out-of-band access via a console server.
A console port provides connectivity to the physical console of a device. These are typically used for temporary access by someone who is physically near the device, or for remote out-of-band access provided via a networked console server. Each console port may be assigned a physical type.
Console ports can be connected to console server ports.
Cables can connect console ports to console server ports or pass-through ports.

View File

@@ -1,3 +1,3 @@
## Console Port Templates
A template for a console port that will be created on all instantiations of the parent device type.
A template for a console port that will be created on all instantiations of the parent device type. Each console port can be assigned a physical type.

View File

@@ -1,5 +1,5 @@
## Console Server Ports
A console server is a device which provides remote access to the local consoles of connected devices. This is typically done to provide remote out-of-band access to network devices.
A console server is a device which provides remote access to the local consoles of connected devices. They are typically used to provide remote out-of-band access to network devices. Each console server port may be assigned a physical type.
Console server ports can be connected to console ports.
Cables can connect console server ports to console ports or pass-through ports.

View File

@@ -1,3 +1,3 @@
## Console Server Port Templates
A template for a console server port that will be created on all instantiations of the parent device type.
A template for a console server port that will be created on all instantiations of the parent device type. Each console server port can be assigned a physical type.

View File

@@ -1,7 +1,15 @@
# Devices
Every piece of hardware which is installed within a rack exists in NetBox as a device. Devices are measured in rack units (U) and can be half depth or full depth. A device may have a height of 0U: These devices do not consume vertical rack space and cannot be assigned to a particular rack unit. A common example of a 0U device is a vertically-mounted PDU.
Every piece of hardware which is installed within a site or rack exists in NetBox as a device. Devices are measured in rack units (U) and can be half depth or full depth. A device may have a height of 0U: These devices do not consume vertical rack space and cannot be assigned to a particular rack unit. A common example of a 0U device is a vertically-mounted PDU.
When assigning a multi-U device to a rack, it is considered to be mounted in the lowest-numbered rack unit which it occupies. For example, a 3U device which occupies U8 through U10 is said to be mounted in U8. This logic applies to racks with both ascending and descending unit numbering.
A device is said to be full depth if its installation on one rack face prevents the installation of any other device on the opposite face within the same rack unit(s). This could be either because the device is physically too deep to allow a device behind it, or because the installation of an opposing device would impede airflow.
A device is said to be full-depth if its installation on one rack face prevents the installation of any other device on the opposite face within the same rack unit(s). This could be either because the device is physically too deep to allow a device behind it, or because the installation of an opposing device would impede airflow.
Each device must be instantiated from a pre-created device type, and its default components (console ports, power ports, interfaces, etc.) will be created automatically. (The device type associated with a device may be changed after its creation, however its components will not be updated retroactively.)
Each device must be assigned a site, device role, and operational status, and may optionally be assigned to a specific rack within a site. A platform, serial number, and asset tag may optionally be assigned to each device.
Device names must be unique within a site, unless the device has been assigned to a tenant. Devices may also be unnamed.
When a device has one or more interfaces with IP addresses assigned, a primary IP for the device can be designated, for both IPv4 and IPv6.

View File

@@ -1,7 +1,8 @@
## Device Bays
Device bays represent the ability of a device to house child devices. For example, you might install four blade servers into a 2U chassis. The chassis would appear in the rack elevation as a 2U device with four device bays. Each server within it would be defined as a 0U device installed in one of the device bays. Child devices do not appear within rack elevations or the "Non-Racked Devices" list within the rack view.
Device bays represent a space or slot within a parent device in which a child device may be installed. For example, a 2U parent chassis might house four individual blade servers. The chassis would appear in the rack elevation as a 2U device with four device bays, and each server within it would be defined as a 0U device installed in one of the device bays. Child devices do not appear within rack elevations or count as consuming rack units.
Child devices are first-class Devices in their own right: that is, fully independent managed entities which don't share any control plane with the parent. Just like normal devices, child devices have their own platform (OS), role, tags, and interfaces. You cannot create a LAG between interfaces in different child devices.
Child devices are first-class Devices in their own right: That is, they are fully independent managed entities which don't share any control plane with the parent. Just like normal devices, child devices have their own platform (OS), role, tags, and components. LAG interfaces may not group interfaces belonging to different child devices.
Therefore, Device bays are **not** suitable for modeling chassis-based switches and routers. These should instead be modeled as a single Device, with the line cards as Inventory Items.
!!! note
Device bays are **not** suitable for modeling line cards (such as those commonly found in chassis-based routers and switches), as these components depend on the control plane of the parent device to operate. Instead, line cards and similarly non-autonomous hardware should be modeled as inventory items within a device, with any associated interfaces or other components assigned directly to the device.

View File

@@ -1,3 +1,3 @@
# Device Roles
Devices can be organized by functional roles. These roles are fully customizable. For example, you might create roles for core switches, distribution switches, and access switches.
Devices can be organized by functional roles, which are fully customizable by the user. For example, you might create roles for core switches, distribution switches, and access switches within your network.

View File

@@ -1,18 +1,14 @@
# Device Types
A device type represents a particular make and model of hardware that exists in the real world. Device types define the physical attributes of a device (rack height and depth) and its individual components (console, power, and network interfaces).
A device type represents a particular make and model of hardware that exists in the real world. Device types define the physical attributes of a device (rack height and depth) and its individual components (console, power, network interfaces, and so on).
Device types are instantiated as devices installed within racks. For example, you might define a device type to represent a Juniper EX4300-48T network switch with 48 Ethernet interfaces. You can then create multiple devices of this type named "switch1," "switch2," and so on. Each device will inherit the components (such as interfaces) of its device type at the time of creation. (However, changes made to a device type will **not** apply to instances of that device type retroactively.)
Device types are instantiated as devices installed within sites and/or equipment racks. For example, you might define a device type to represent a Juniper EX4300-48T network switch with 48 Ethernet interfaces. You can then create multiple _instances_ of this type named "switch1," "switch2," and so on. Each device will automatically inherit the components (such as interfaces) of its device type at the time of creation. However, changes made to a device type will **not** apply to instances of that device type retroactively.
Some devices house child devices which share physical resources, like space and power, but which functional independently from one another. A common example of this is blade server chassis. Each device type is designated as one of the following:
* A parent device (which has device bays)
* A child device (which must be installed in a device bay)
* A child device (which must be installed within a device bay)
* Neither
!!! note
This parent/child relationship is **not** suitable for modeling chassis-based devices, wherein child members share a common control plane.
For that application you should create a single Device for the chassis, and add Interfaces directly to it. Interfaces can be created in bulk using range patterns, e.g. "Gi1/[1-24]".
Add Inventory Items if you want to record the line cards themselves as separate entities. There is no explicit relationship between each interface and its line card, but it may be implied by the naming (e.g. interfaces "Gi1/x" are on line card 1)
This parent/child relationship is **not** suitable for modeling chassis-based devices, wherein child members share a common control plane. Instead, line cards and similarly non-autonomous hardware should be modeled as inventory items within a device, with any associated interfaces or other components assigned directly to the device.

View File

@@ -1,5 +1,3 @@
## Front Ports
Front ports are pass-through ports used to represent physical cable connections that comprise part of a longer path. For example, the ports on the front face of a UTP patch panel would be modeled in NetBox as front ports.
Each front port is mapped to a specific rear port on the same device. A single rear port may be mapped to multiple rear ports.
Front ports are pass-through ports used to represent physical cable connections that comprise part of a longer path. For example, the ports on the front face of a UTP patch panel would be modeled in NetBox as front ports. Each port is assigned a physical type, and must be mapped to a specific rear port on the same device. A single rear port may be mapped to multiple rear ports, using numeric positions to annotate the specific alignment of each.

View File

@@ -1,3 +1,3 @@
## Front Port Templates
A template for a front-facing pass-through port that will be created on all instantiations of the parent device type.
A template for a front-facing pass-through port that will be created on all instantiations of the parent device type. Front ports may have a physical type assigned, and must be associated with a corresponding rear port and position. This association will be automatically replicated when the device type is instantiated.

View File

@@ -1,9 +1,12 @@
## Interfaces
Interfaces connect to one another in a symmetric manner: If interface A connects to interface B, interface B therefore connects to interface A. Each type of connection can be classified as either *planned* or *connected*.
Interfaces in NetBox represent network interfaces used to exchange data with connected devices. On modern networks, these are most commonly Ethernet, but other types are supported as well. Each interface must be assigned a type, and may optionally be assigned a MAC address, MTU, and IEEE 802.1Q mode (tagged or access). Each interface can also be enabled or disabled, and optionally designated as management-only (for out-of-band management).
Each interface is a assigned a type denoting its physical properties. Two special types exist: the "virtual" type can be used to designate logical interfaces (such as SVIs), and the "LAG" type can be used to desinate link aggregation groups to which physical interfaces can be assigned.
Interfaces may be physical or virtual in nature, but only physical interfaces may be connected via cables. Cables can connect interfaces to pass-through ports, circuit terminations, or other interfaces.
Each interface can also be enabled or disabled, and optionally designated as management-only (for out-of-band management). Fields are also provided to store an interface's MTU and MAC address.
Physical interfaces may be arranged into a link aggregation group (LAG) and associated with a parent LAG (virtual) interface. LAG interfaces can be recursively nested to model bonding of trunk groups. Like all virtual interfaces, LAG interfaces cannot be connected physically.
VLANs can be assigned to each interface as either tagged or untagged. (An interface may have only one untagged VLAN.)
IP addresses can be assigned to interfaces. VLANs can also be assigned to each interface as either tagged or untagged. (An interface may have only one untagged VLAN.)
!!! note
Although devices and virtual machines both can have interfaces, a separate model is used for each. Thus, device interfaces have some properties that are not present on virtual machine interfaces and vice versa.

View File

@@ -1,3 +1,3 @@
## Interface Templates
A template for an interface that will be created on all instantiations of the parent device type.
A template for a network interface that will be created on all instantiations of the parent device type. Each interface may be assigned a physical or virtual type, and may be designated as "management-only."

View File

@@ -1,3 +1,7 @@
# Inventory Items
Inventory items represent hardware components installed within a device, such as a power supply or CPU or line card. Currently, these are used merely for inventory tracking, although future development might see their functionality expand. Like device types, each item can optionally be assigned a manufacturer.
Inventory items represent hardware components installed within a device, such as a power supply or CPU or line card. Inventory items are distinct from other device components in that they cannot be templatized on a device type, and cannot be connected by cables. They are intended to be used primarily for inventory purposes.
Each inventory item can be assigned a manufacturer, part ID, serial number, and asset tag (all optional). A boolean toggle is also provided to indicate whether each item was entered manually or discovered automatically (by some process outside of NetBox).
Inventory items are hierarchical in nature, such that any individual item may be designated as the parent for other items. For example, an inventory item might be created to represent a line card which houses several SFP optics, each of which exists as a child item within the device.

View File

@@ -1,3 +1,3 @@
# Manufacturers
Each device type must be assigned to a manufacturer. The model number of a device type must be unique to its manufacturer.
A manufacturer represents the "make" of a device; e.g. Cisco or Dell. Each device type must be assigned to a manufacturer. (Inventory items and platforms may also be associated with manufacturers.) Each manufacturer must have a unique name and may have a description assigned to it.

View File

@@ -1,7 +1,9 @@
# Platforms
A platform defines the type of software running on a device or virtual machine. This can be helpful when it is necessary to distinguish between, for instance, different feature sets. Note that two devices of the same type may be assigned different platforms: for example, one Juniper MX240 running Junos 14 and another running Junos 15.
A platform defines the type of software running on a device or virtual machine. This can be helpful to model when it is necessary to distinguish between different versions or feature sets. Note that two devices of the same type may be assigned different platforms: For example, one Juniper MX240 might run Junos 14 while another runs Junos 15.
The platform model is also used to indicate which [NAPALM](https://napalm-automation.net/) driver NetBox should use when connecting to a remote device. The name of the driver along with optional parameters are stored with the platform.
Platforms may optionally be limited by manufacturer: If a platform is assigned to a particular manufacturer, it can only be assigned to devices with a type belonging to that manufacturer.
The platform model is also used to indicate which [NAPALM](https://napalm-automation.net/) driver and any associated arguments NetBox should use when connecting to a remote device. The name of the driver along with optional parameters are stored with the platform.
The assignment of platforms to devices is an optional feature, and may be disregarded if not desired.

View File

@@ -1,8 +1,21 @@
# Power Feed
A power feed identifies the power outlet/drop that goes to a rack and is terminated to a power panel. Power feeds have a supply type (AC/DC), voltage, amperage, and phase type (single/three).
A power feed represents the distribution of power from a power panel to a particular device, typically a power distribution unit (PDU). The power pot (inlet) on a device can be connected via a cable to a power feed. A power feed may optionally be assigned to a rack to allow more easily tracking the distribution of power among racks.
Power feeds are optionally assigned to a rack. In addition, a power port and only one can connect to a power feed; in the context of a PDU, the power feed is analogous to the power outlet that a PDU's power port/inlet connects to.
Each power feed is assigned an operational type (primary or redundant) and one of the following statuses:
* Offline
* Active
* Planned
* Failed
Each power feed also defines the electrical characteristics of the circuit which it represents. These include the following:
* Supply type (AC or DC)
* Phase (single or three-phase)
* Voltage
* Amperage
* Maximum utilization (percentage)
!!! info
The power usage of a rack is calculated when a power feed (or multiple) is assigned to that rack and connected to a power port.
The power utilization of a rack is calculated when one or more power feeds are assigned to the rack and connected to devices that draw power.

View File

@@ -1,3 +1,7 @@
## Power Outlets
Power outlets represent the ports on a PDU that supply power to other devices. Power outlets are downstream-facing towards power ports. A power outlet can be associated with a power port on the same device and a feed leg (i.e. in a case of a three-phase supply). This indicates which power port supplies power to a power outlet.
Power outlets represent the outlets on a power distribution unit (PDU) or other device that supply power to dependent devices. Each power port may be assigned a physical type, and may be associated with a specific feed leg (where three-phase power is used) and/or a specific upstream power port. This association can be used to model the distribution of power within a device.
For example, imagine a PDU with one power port which draws from a three-phase feed and 48 power outlets arranged into three banks of 16 outlets each. Outlets 1-16 would be associated with leg A on the port, and outlets 17-32 and 33-48 would be associated with legs B and C, respectively.
Cables can connect power outlets only to downstream power ports. (Pass-through ports cannot be used to model power distribution.)

View File

@@ -1,3 +1,3 @@
## Power Outlet Templates
A template for a power outlet that will be created on all instantiations of the parent device type.
A template for a power outlet that will be created on all instantiations of the parent device type. Each power outlet can be assigned a physical type, and its power source may be mapped to a specific feed leg and power port template. This association will be automatically replicated when the device type is instantiated.

View File

@@ -1,3 +1,8 @@
# Power Panel
A power panel represents the distribution board where power circuits and their circuit breakers terminate on. If you have multiple power panels in your data center, you should model them as such in NetBox to assist you in determining the redundancy of your power allocation.
A power panel represents the origin point in NetBox for electrical power being disseminated by one or more power feeds. In a data center environment, one power panel often serves a group of racks, with an individual power feed extending to each rack, though this is not always the case. It is common to have two sets of panels and feeds arranged in parallel to provide redundant power to each rack.
Each power panel must be assigned to a site, and may optionally be assigned to a particular rack group.
!!! note
NetBox does not model the mechanism by which power is delivered to a power panel. Power panels define the root level of the power distribution hierarchy in NetBox.

View File

@@ -1,6 +1,8 @@
## Power Ports
A power port is the inlet of a device where it draws its power. Power ports are upstream-facing towards power outlets. Alternatively, a power port can connect to a power feed as mentioned in the power feed section to indicate the power source of a PDU's inlet.
A power port represents the inlet of a device where it draws its power, i.e. the connection port(s) on a device's power supply. Each power port may be assigned a physical type, as well as allocated and maximum draw values (in watts). These values can be used to calculate the overall utilization of an upstream power feed.
!!! info
If the draw of a power port is left empty, it will be dynamically calculated based on the power outlets associated with that power port. This is usually the case on the power ports of devices that supply power, like a PDU.
When creating a power port on a device which supplies power to downstream devices, the allocated and maximum draw numbers should be left blank. Utilization will be calculated by taking the sum of all power ports of devices connected downstream.
Cables can connect power ports only to power outlets or power feeds. (Pass-through ports cannot be used to model power distribution.)

View File

@@ -1,3 +1,3 @@
## Power Port Templates
A template for a power port that will be created on all instantiations of the parent device type.
A template for a power port that will be created on all instantiations of the parent device type. Each power port can be assigned a physical type, as well as a maximum and allocated draw in watts.

View File

@@ -1,8 +1,10 @@
# Racks
The rack model represents a physical two- or four-post equipment rack in which equipment is mounted. Each rack must be assigned to a site. Rack height is measured in *rack units* (U); racks are commonly between 42U and 48U tall, but NetBox allows you to define racks of arbitrary height. A toggle is provided to indicate whether rack units are in ascending or descending order.
The rack model represents a physical two- or four-post equipment rack in which devices can be installed. Each rack must be assigned to a site, and may optionally be assigned to a rack group and/or tenant. Racks can also be organized by user-defined functional roles.
Each rack is assigned a name and (optionally) a separate facility ID. This is helpful when leasing space in a data center your organization does not own: The facility will often assign a seemingly arbitrary ID to a rack (for example, "M204.313") whereas internally you refer to is simply as "R113." A unique serial number may also be associated with each rack.
Rack height is measured in *rack units* (U); racks are commonly between 42U and 48U tall, but NetBox allows you to define racks of arbitrary height. A toggle is provided to indicate whether rack units are in ascending (from the ground up) or descending order.
Each rack is assigned a name and (optionally) a separate facility ID. This is helpful when leasing space in a data center your organization does not own: The facility will often assign a seemingly arbitrary ID to a rack (for example, "M204.313") whereas internally you refer to is simply as "R113." A unique serial number and asset tag may also be associated with each rack.
A rack must be designated as one of the following types:
@@ -12,4 +14,12 @@ A rack must be designated as one of the following types:
* Wall-mounted frame
* Wall-mounted cabinet
Each rack has two faces (front and rear) on which devices can be mounted. Rail-to-rail width may be 19 or 23 inches.
Similarly, each rack must be assigned an operational status, which is one of the following:
* Reserved
* Available
* Planned
* Active
* Deprecated
Each rack has two faces (front and rear) on which devices can be mounted. Rail-to-rail width may be 10, 19, 21, or 23 inches. The outer width and depth of a rack or cabinet can also be annotated in millimeters or inches.

View File

@@ -1,7 +1,7 @@
# Rack Groups
Racks can be arranged into groups. As with sites, how you choose to designate rack groups will depend on the nature of your organization. For example, if each site represents a campus, each group might represent a building within a campus. If each site represents a building, each rack group might equate to a floor or room.
Racks can be organized into groups, which can be nested into themselves similar to regions. As with sites, how you choose to designate rack groups will depend on the nature of your organization. For example, if each site represents a campus, each group might represent a building within a campus. If each site represents a building, each rack group might equate to a floor or room.
Each rack group must be assigned to a parent site, and rack groups may optionally be nested to achieve a multi-level hierarchy.
Each rack group must be assigned to a parent site, and rack groups may optionally be nested within a site to model a multi-level hierarchy. For example, you might have a tier of rooms beneath a tier of floors, all belonging to the same parent building (site).
The name and facility ID of each rack within a group must be unique. (Racks not assigned to the same rack group may have identical names and/or facility IDs.)

View File

@@ -1,3 +1,3 @@
# Rack Reservations
Users can reserve units within a rack for future use. Multiple non-contiguous rack units can be associated with a single reservation (but reservations cannot span multiple racks). A rack reservation may optionally designate a specific tenant.
Users can reserve specific units within a rack for future use. An arbitrary set of units within a rack can be associated with a single reservation, but reservations cannot span multiple racks. A description is required for each reservation, reservations may optionally be associated with a specific tenant.

View File

@@ -1,3 +1,3 @@
# Rack Roles
Each rack can optionally be assigned a functional role. For example, you might designate a rack for compute or storage resources, or to house colocated customer devices. Rack roles are fully customizable.
Each rack can optionally be assigned a user-defined functional role. For example, you might designate a rack for compute or storage resources, or to house colocated customer devices. Rack roles are fully customizable and may be color-coded.

View File

@@ -1,5 +1,6 @@
## Rear Ports
Like front ports, rear ports are pass-through ports which represent the end of a particular cable segment in a path. Each rear port is defined with a number of positions: rear ports with more than one position can be mapped to multiple front ports. This can be useful for modeling instances where multiple paths share a common cable (for example, six different fiber connections sharing a 12-strand MPO cable).
Like front ports, rear ports are pass-through ports which represent the continuation of a path from one cable to the next. Each rear port is defined with its physical type and a number of positions: Rear ports with more than one position can be mapped to multiple front ports. This can be useful for modeling instances where multiple paths share a common cable (for example, six discrete two-strand fiber connections sharing a 12-strand MPO cable).
Note that front and rear ports need not necessarily reside on the actual front or rear device face. This terminology is used primarily to distinguish between the two components in a pass-through port pairing.
!!! note
Front and rear ports need not necessarily reside on the actual front or rear device face. This terminology is used primarily to distinguish between the two components in a pass-through port pairing.

View File

@@ -1,3 +1,3 @@
## Rear Port Templates
A template for a rear-facing pass-through port that will be created on all instantiations of the parent device type.
A template for a rear-facing pass-through port that will be created on all instantiations of the parent device type. Each rear port may have a physical type and one or more front port templates assigned to it. The number of positions associated with a rear port determines how many front ports can be assigned to it (the maximum is 1024).

View File

@@ -1,13 +1,15 @@
# Sites
How you choose to use sites will depend on the nature of your organization, but typically a site will equate to a building or campus. For example, a chain of banks might create a site to represent each of its branches, a site for its corporate headquarters, and two additional sites for its presence in two colocation facilities.
How you choose to employ sites when modeling your network may vary depending on the nature of your organization, but generally a site will equate to a building or campus. For example, a chain of banks might create a site to represent each of its branches, a site for its corporate headquarters, and two additional sites for its presence in two colocation facilities.
Each site must be assigned one of the following operational statuses:
Each site must be assigned a unique name and may optionally be assigned to a region and/or tenant. The following operational statuses are available:
* Active
* Planned
* Staging
* Active
* Decommissioning
* Retired
The site model provides a facility ID field which can be used to annotate a facility ID (such as a datacenter name) associated with the site. Each site may also have an autonomous system (AS) number and time zone associated with it. (Time zones are provided by the [pytz](https://pypi.org/project/pytz/) package.)
The site model also provides a facility ID field which can be used to annotate a facility ID (such as a datacenter name) associated with the site. Each site may also have an autonomous system (AS) number and time zone associated with it. (Time zones are provided by the [pytz](https://pypi.org/project/pytz/) package.)
The site model also includes several fields for storing contact and address information.
The site model also includes several fields for storing contact and address information as well as geolocation data (GPS coordinates).

View File

@@ -1,5 +1,8 @@
# Virtual Chassis
A virtual chassis represents a set of devices which share a single control plane: a stack of switches which are managed as a single device, for example. Each device in the virtual chassis is assigned a position and (optionally) a priority. Exactly one device is designated the virtual chassis master: This device will typically be assigned a name, secrets, services, and other attributes related to its management.
A virtual chassis represents a set of devices which share a common control plane. A common example of this is a stack of switches which are connected and configured to operate as a single device. A virtual chassis must be assigned a name and may be assigned a domain.
It's important to recognize the distinction between a virtual chassis and a chassis-based device. For instance, a virtual chassis is not used to model a chassis switch with removable line cards such as the Juniper EX9208, as its line cards are _not_ physically separate devices capable of operating independently.
Each device in the virtual chassis is referred to as a VC member, and assigned a position and (optionally) a priority. VC member devices commonly reside within the same rack, though this is not a requirement. One of the devices may be designated as the VC master: This device will typically be assigned a name, secrets, services, and other attributes related to managing the VC.
!!! note
It's important to recognize the distinction between a virtual chassis and a chassis-based device. A virtual chassis is **not** suitable for modeling a chassis-based switch with removable line cards (such as the Juniper EX9208), as its line cards are _not_ physically autonomous devices.

View File

@@ -1,5 +1,65 @@
# Configuration Contexts
Sometimes it is desirable to associate arbitrary data with a group of devices to aid in their configuration. For example, you might want to associate a set of syslog servers for all devices at a particular site. Context data enables the association of arbitrary data to devices and virtual machines grouped by region, site, role, platform, and/or tenant. Context data is arranged hierarchically, so that data with a higher weight can be entered to override more general lower-weight data. Multiple instances of data are automatically merged by NetBox to present a single dictionary for each object.
Sometimes it is desirable to associate additional data with a group of devices or virtual machines to aid in automated configuration. For example, you might want to associate a set of syslog servers for all devices within a particular region. Context data enables the association of extra user-defined data with devices and virtual machines grouped by one or more of the following assignments:
Devices and Virtual Machines may also have a local config context defined. This local context will always overwrite the rendered config context objects for the Device/VM. This is useful in situations were the device requires a one-off value different from the rest of the environment.
* Region
* Site
* Role
* Platform
* Cluster group
* Cluster
* Tenant group
* Tenant
* Tag
## Hierarchical Rendering
Context data is arranged hierarchically, so that data with a higher weight can be entered to override lower-weight data. Multiple instances of data are automatically merged by NetBox to present a single dictionary for each object.
For example, suppose we want to specify a set of syslog and NTP servers for all devices within a region. We could create a config context instance with a weight of 1000 assigned to the region, with the following JSON data:
```json
{
"ntp-servers": [
"172.16.10.22",
"172.16.10.33"
],
"syslog-servers": [
"172.16.9.100",
"172.16.9.101"
]
}
```
But suppose there's a problem at one particular site within this region preventing traffic from reaching the regional syslog server. Devices there need to use a local syslog server instead of the two defined above. We'll create a second config context assigned only to that site with a weight of 2000 and the following data:
```json
{
"syslog-servers": [
"192.168.43.107"
]
}
```
When the context data for a device at this site is rendered, the second, higher-weight data overwrite the first, resulting in the following:
```json
{
"ntp-servers": [
"172.16.10.22",
"172.16.10.33"
],
"syslog-servers": [
"192.168.43.107"
]
}
```
Data from the higher-weight context overwrites conflicting data from the lower-weight context, while the non-conflicting portion of the lower-weight context (the list of NTP servers) is preserved.
## Local Context Data
Devices and virtual machines may also have a local config context defined. This local context will _always_ take precedence over any separate config context objects which apply to the device/VM. This is useful in situations where we need to call out a specific deviation in the data for a particular object.
!!! warning
If you find that you're routinely defining local context data for many individual devices or virtual machines, custom fields may offer a more effective solution.

View File

@@ -0,0 +1,3 @@
# Image Attachments
Certain objects in NetBox support the attachment of uploaded images. These will be saved to the NetBox server and made available whenever the object is viewed.

View File

@@ -1,24 +1,20 @@
# Tags
Tags are free-form text labels which can be applied to a variety of objects within NetBox. Tags are created on-demand as they are assigned to objects. Use commas to separate tags when adding multiple tags to an object (for example: `Inventoried, Monitored`). Use double quotes around a multi-word tag when adding only one tag, e.g. `"Core Switch"`.
Tags are user-defined labels which can be applied to a variety of objects within NetBox. They can be used to establish dimensions of organization beyond the relationships built into NetBox. For example, you might create a tag to identify a particular ownership or condition across several types of objects.
Each tag has a label and a URL-friendly slug. For example, the slug for a tag named "Dunder Mifflin, Inc." would be `dunder-mifflin-inc`. The slug is generated automatically and makes tags easier to work with as URL parameters.
Each tag has a label, color, and a URL-friendly slug. For example, the slug for a tag named "Dunder Mifflin, Inc." would be `dunder-mifflin-inc`. The slug is generated automatically and makes tags easier to work with as URL parameters. Each tag can also be assigned a description indicating its purpose.
Objects can be filtered by the tags they have applied. For example, the following API request will retrieve all devices tagged as "monitored":
```
```no-highlight
GET /api/dcim/devices/?tag=monitored
```
Tags are included in the API representation of an object as a list of plain strings:
The `tag` filter can be specified multiple times to match only objects which have _all_ of the specified tags assigned:
```no-highlight
GET /api/dcim/devices/?tag=monitored&tag=deprecated
```
{
...
"tags": [
"Core Switch",
"Monitored"
],
...
}
```
!!! note
Tags have changed substantially in NetBox v2.9. They are no longer created on-demand when editing an object, and their representation in the REST API now includes a complete depiction of the tag rather than only its label.

View File

@@ -1,6 +1,18 @@
# Aggregates
The first step to documenting your IP space is to define its scope by creating aggregates. Aggregates establish the root of your IP address hierarchy by defining the top-level allocations that you're interested in managing. Most organizations will want to track some commonly-used private IP spaces, such as:
IP addressing is by nature hierarchical. The first few levels of the IPv4 hierarchy, for example, look like this:
* 0.0.0.0/0
* 0.0.0.0/1
* 0.0.0.0/2
* 64.0.0.0/2
* 128.0.0.0/1
* 128.0.0.0/2
* 192.0.0.0/2
This hierarchy comprises 33 tiers of addressing, from /0 all the way down to individual /32 address (and much, much further to /128 for IPv6). Of course, most organizations are concerned with only relatively small portions of the total IP space, so tracking the uppermost of these tiers isn't necessary.
NetBox allows us to specify the portions of IP space that are interesting to us by defining _aggregates_. Typically, an aggregate will correspond to either an allocation of public (globally routable) IP space granted by a regional authority, or a private (internally-routable) designation. Common private designations include:
* 10.0.0.0/8 (RFC 1918)
* 100.64.0.0/10 (RFC 6598)
@@ -8,8 +20,9 @@ The first step to documenting your IP space is to define its scope by creating a
* 192.168.0.0/16 (RFC 1918)
* One or more /48s within fd00::/8 (IPv6 unique local addressing)
In addition to one or more of these, you'll want to create an aggregate for each globally-routable space your organization has been allocated. These aggregates should match the allocations recorded in public WHOIS databases.
Each aggregate is assigned to a RIR. For "public" aggregates, this will be the real-world authority which has granted your organization permission to use the specified IP space on the public Internet. For "private" aggregates, this will be a statutory authority, such as RFC 1918. Each aggregate can also annotate that date on which it was allocated, where applicable.
Each IP prefix will be automatically arranged under its parent aggregate if one exists. Note that it's advised to create aggregates only for IP ranges actually allocated to your organization (or marked for private use): There is no need to define aggregates for provider-assigned space which is only used on Internet circuits, for example.
Prefixes are automatically arranged beneath their parent aggregates in NetBox. Typically you'll want to create aggregates only for the prefixes and IP addresses that your organization actually manages: There is no need to define aggregates for provider-assigned space which is only used on Internet circuits, for example.
Aggregates cannot overlap with one another: They can only exist side-by-side. For instance, you cannot define both 10.0.0.0/8 and 10.16.0.0/16 as aggregates, because they overlap. 10.16.0.0/16 in this example would be created as a prefix and automatically grouped under 10.0.0.0/8. Remember, the purpose of aggregates is to establish the root of your IP addressing hierarchy.
!!! note
Because aggregates represent swaths of the global IP space, they cannot overlap with one another: They can only exist side-by-side. For instance, you cannot define both 10.0.0.0/8 and 10.16.0.0/16 as aggregates, because they overlap. 10.16.0.0/16 in this example would be created as a container prefix and automatically grouped under the 10.0.0.0/8 aggregate. Remember, the purpose of aggregates is to establish the root of your IP addressing hierarchy.

View File

@@ -2,16 +2,17 @@
An IP address comprises a single host address (either IPv4 or IPv6) and its subnet mask. Its mask should match exactly how the IP address is configured on an interface in the real world.
Like prefixes, an IP address can optionally be assigned to a VRF (otherwise, it will appear in the "global" table). IP addresses are automatically organized under parent prefixes within their respective VRFs.
Like a prefix, an IP address can optionally be assigned to a VRF (otherwise, it will appear in the "global" table). IP addresses are automatically arranged under parent prefixes within their respective VRFs according to the IP hierarchy.
Also like prefixes, each IP address can be assigned a status and a role. Statuses are hard-coded in NetBox and include the following:
Each IP address can also be assigned an operational status and a functional role. Statuses are hard-coded in NetBox and include the following:
* Active
* Reserved
* Deprecated
* DHCP
* SLAAC (IPv6 Stateless Address Autoconfiguration)
Each IP address can optionally be assigned a special role. Roles are used to indicate some special attribute of an IP address: for example, it is used as a loopback, or is a virtual IP maintained using VRRP. (Note that this differs in purpose from a _functional_ role, and thus cannot be customized.) Available roles include:
Roles are used to indicate some special attribute of an IP address; for example, use as a loopback or as the the virtual IP for a VRRP group. (Note that functional roles are conceptual in nature, and thus cannot be customized by the user.) Available roles include:
* Loopback
* Secondary
@@ -21,7 +22,10 @@ Each IP address can optionally be assigned a special role. Roles are used to ind
* HSRP
* GLBP
An IP address can be assigned to a device or virtual machine interface, and an interface may have multiple IP addresses assigned to it. Further, each device and virtual machine may have one of its interface IPs designated as its primary IP address (one for IPv4 and one for IPv6).
An IP address can be assigned to any device or virtual machine interface, and an interface may have multiple IP addresses assigned to it. Further, each device and virtual machine may have one of its interface IPs designated as its primary IP per address family (one for IPv4 and one for IPv6).
!!! note
When primary IPs are set for both IPv4 and IPv6, NetBox will prefer IPv6. This can be changed by setting the `PREFER_IPV4` configuration parameter.
## Network Address Translation (NAT)

View File

@@ -2,7 +2,7 @@
A prefix is an IPv4 or IPv6 network and mask expressed in CIDR notation (e.g. 192.0.2.0/24). A prefix entails only the "network portion" of an IP address: All bits in the address not covered by the mask must be zero. (In other words, a prefix cannot be a specific IP address.)
Prefixes are automatically arranged by their parent aggregates. Additionally, each prefix can be assigned to a particular site and VRF (routing table). All prefixes not assigned to a VRF will appear in the "global" table.
Prefixes are automatically organized by their parent aggregates. Additionally, each prefix can be assigned to a particular site and virtual routing and forwarding instance (VRF). Each VRF represents a separate IP space or routing table. All prefixes not assigned to a VRF are considered to be in the "global" table.
Each prefix can be assigned a status and a role. These terms are often used interchangeably so it's important to recognize the difference between them. The **status** defines a prefix's operational state. Statuses are hard-coded in NetBox and can be one of the following:
@@ -13,6 +13,6 @@ Each prefix can be assigned a status and a role. These terms are often used inte
On the other hand, a prefix's **role** defines its function. Role assignment is optional and roles are fully customizable. For example, you might create roles to differentiate between production and development infrastructure.
A prefix may also be assigned to a VLAN. This association is helpful for identifying which prefixes are included when reviewing a list of VLANs.
A prefix may also be assigned to a VLAN. This association is helpful for associating address space with layer two domains. A VLAN may have multiple prefixes assigned to it.
The prefix model include a "pool" flag. If enabled, NetBox will treat this prefix as a range (such as a NAT pool) wherein every IP address is valid and assignable. This logic is used for identifying available IP addresses within a prefix. If this flag is disabled, NetBox will assume that the first and last (broadcast) address within the prefix are unusable.
The prefix model include an "is pool" flag. If enabled, NetBox will treat this prefix as a range (such as a NAT pool) wherein every IP address is valid and assignable. This logic is used when identifying available IP addresses within a prefix. If this flag is disabled, NetBox will assume that the first and last (broadcast) address within an IPv4 prefix are unusable.

View File

@@ -1,7 +1,7 @@
# Regional Internet Registries (RIRs)
[Regional Internet registries](https://en.wikipedia.org/wiki/Regional_Internet_registry) are responsible for the allocation of globally-routable address space. The five RIRs are ARIN, RIPE, APNIC, LACNIC, and AFRINIC. However, some address space has been set aside for internal use, such as defined in RFCs 1918 and 6598. NetBox considers these RFCs as a sort of RIR as well; that is, an authority which "owns" certain address space. There also exist lower-tier registries which serve a particular geographic area.
[Regional Internet registries](https://en.wikipedia.org/wiki/Regional_Internet_registry) are responsible for the allocation of globally-routable address space. The five RIRs are ARIN, RIPE, APNIC, LACNIC, and AFRINIC. However, some address space has been set aside for internal use, such as defined in RFCs 1918 and 6598. NetBox considers these RFCs as a sort of RIR as well; that is, an authority which "owns" certain address space. There also exist lower-tier registries which serve particular geographic areas.
Each aggregate must be assigned to one RIR. You are free to define whichever RIRs you choose (or create your own). The RIR model includes a boolean flag which indicates whether the RIR allocates only private IP space.
Users can create whatever RIRs they like, but each aggregate must be assigned to one RIR. The RIR model includes a boolean flag which indicates whether the RIR allocates only private IP space.
For example, suppose your organization has been allocated 104.131.0.0/16 by ARIN. It also makes use of RFC 1918 addressing internally. You would first create RIRs named ARIN and RFC 1918, then create an aggregate for each of these top-level prefixes, assigning it to its respective RIR.
For example, suppose your organization has been allocated 104.131.0.0/16 by ARIN. It also makes use of RFC 1918 addressing internally. You would first create RIRs named "ARIN" and "RFC 1918," then create an aggregate for each of these top-level prefixes, assigning it to its respective RIR.

View File

@@ -0,0 +1,5 @@
# Route Targets
A route target is a particular type of [extended BGP community](https://tools.ietf.org/html/rfc4360#section-4) used to control the redistribution of routes among VRF tables in a network. Route targets can be assigned to individual VRFs in NetBox as import or export targets (or both) to model this exchange in an L3VPN. Each route target must be given a unique name, which should be in a format prescribed by [RFC 4364](https://tools.ietf.org/html/rfc4364#section-4.2), similar to a VR route distinguisher.
Each route target can optionally be assigned to a tenant, and may have tags assigned to it.

View File

@@ -1,6 +1,6 @@
# VLANs
A VLAN represents an isolated layer two domain, identified by a name and a numeric ID (1-4094) as defined in [IEEE 802.1Q](https://en.wikipedia.org/wiki/IEEE_802.1Q). Each VLAN may be assigned to a site and/or VLAN group.
A VLAN represents an isolated layer two domain, identified by a name and a numeric ID (1-4094) as defined in [IEEE 802.1Q](https://en.wikipedia.org/wiki/IEEE_802.1Q). Each VLAN may be assigned to a site, tenant, and/or VLAN group.
Each VLAN must be assigned one of the following operational statuses:
@@ -8,4 +8,4 @@ Each VLAN must be assigned one of the following operational statuses:
* Reserved
* Deprecated
Each VLAN may also be assigned a functional role. Prefixes and VLANs share the same set of customizable roles.
As with prefixes, each VLAN may also be assigned a functional role. Prefixes and VLANs share the same set of customizable roles.

View File

@@ -1,3 +1,5 @@
# VLAN Groups
VLAN groups can be used to organize VLANs within NetBox. Groups can also be used to enforce uniqueness: Each VLAN within a group must have a unique ID and name. VLANs which are not assigned to a group may have overlapping names and IDs (including VLANs which belong to a common site). For example, you can create two VLANs with ID 123, but they cannot both be assigned to the same group.
VLAN groups can be used to organize VLANs within NetBox. Each group may optionally be assigned to a specific site, but a group cannot belong to multiple sites.
Groups can also be used to enforce uniqueness: Each VLAN within a group must have a unique ID and name. VLANs which are not assigned to a group may have overlapping names and IDs (including VLANs which belong to a common site). For example, you can create two VLANs with ID 123, but they cannot both be assigned to the same group.

View File

@@ -1,12 +1,14 @@
# Virtual Routing and Forwarding (VRF)
A VRF object in NetBox represents a virtual routing and forwarding (VRF) domain. Each VRF is essentially a separate routing table. VRFs are commonly used to isolate customers or organizations from one another within a network, or to route overlapping address space (e.g. multiple instances of the 10.0.0.0/8 space).
A VRF object in NetBox represents a virtual routing and forwarding (VRF) domain. Each VRF is essentially a separate routing table. VRFs are commonly used to isolate customers or organizations from one another within a network, or to route overlapping address space (e.g. multiple instances of the 10.0.0.0/8 space). Each VRF may be assigned to a specific tenant to aid in organizing the available IP space by customer or internal user.
Each VRF is assigned a unique name and an optional route distinguisher (RD). The RD is expected to take one of the forms prescribed in [RFC 4364](https://tools.ietf.org/html/rfc4364#section-4.2), however its formatting is not strictly enforced.
Each prefix and IP address may be assigned to one (and only one) VRF. If you have a prefix or IP address which exists in multiple VRFs, you will need to create a separate instance of it in NetBox for each VRF. Any IP prefix or address not assigned to a VRF is said to belong to the "global" table.
Each prefix and IP address may be assigned to one (and only one) VRF. If you have a prefix or IP address which exists in multiple VRFs, you will need to create a separate instance of it in NetBox for each VRF. Any prefix or IP address not assigned to a VRF is said to belong to the "global" table.
By default, NetBox will allow duplicate prefixes to be assigned to a VRF. This behavior can be disabled by setting the "enforce unique" flag on the VRF model.
By default, NetBox will allow duplicate prefixes to be assigned to a VRF. This behavior can be toggled by setting the "enforce unique" flag on the VRF model.
!!! note
Enforcement of unique IP space can be toggled for global table (non-VRF prefixes) using the `ENFORCE_GLOBAL_UNIQUE` configuration setting.
Each VRF may have one or more import and/or export route targets applied to it. Route targets are used to control the exchange of routes (prefixes) among VRFs in L3VPNs.

View File

@@ -7,5 +7,3 @@ Each secret is assigned a functional role which indicates what it is used for. S
* RADIUS/TACACS+ keys
* IKE key strings
* Routing protocol shared secrets
Roles are also used to control access to secrets. Each role is assigned an arbitrary number of groups and/or users. Only the users associated with a role have permission to decrypt the secrets assigned to that role. (A superuser has permission to decrypt all secrets, provided they have an active user key.)

View File

@@ -1,6 +1,6 @@
# Tenants
A tenant represents a discrete entity for administrative purposes. Typically, tenants are used to represent individual customers or internal departments within an organization. The following objects can be assigned to tenants:
A tenant represents a discrete grouping of resources used for administrative purposes. Typically, tenants are used to represent individual customers or internal departments within an organization. The following objects can be assigned to tenants:
* Sites
* Racks
@@ -11,6 +11,7 @@ A tenant represents a discrete entity for administrative purposes. Typically, te
* IP addresses
* VLANs
* Circuits
* Clusters
* Virtual machines
Tenant assignment is used to signify ownership of an object in NetBox. As such, each object may only be owned by a single tenant. For example, if you have a firewall dedicated to a particular customer, you would assign it to the tenant which represents that customer. However, if the firewall serves multiple customers, it doesn't *belong* to any particular customer, so tenant assignment would not be appropriate.
Tenant assignment is used to signify the ownership of an object in NetBox. As such, each object may only be owned by a single tenant. For example, if you have a firewall dedicated to a particular customer, you would assign it to the tenant which represents that customer. However, if the firewall serves multiple customers, it doesn't *belong* to any particular customer, so tenant assignment would not be appropriate.

Some files were not shown because too many files have changed in this diff Show More