netbox-docker-plugin 3.1.0__tar.gz → 3.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. {netbox_docker_plugin-3.1.0/netbox_docker_plugin.egg-info → netbox_docker_plugin-3.3.0}/PKG-INFO +13 -3
  2. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/README.md +10 -1
  3. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/__init__.py +1 -1
  4. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/api/serializers.py +31 -0
  5. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/filtersets.py +37 -2
  6. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/container.py +26 -2
  7. netbox_docker_plugin-3.3.0/netbox_docker_plugin/forms/log_driver_option.py +28 -0
  8. netbox_docker_plugin-3.3.0/netbox_docker_plugin/migrations/0031_container_cap_add.py +37 -0
  9. netbox_docker_plugin-3.3.0/netbox_docker_plugin/migrations/0032_device_and_more.py +99 -0
  10. netbox_docker_plugin-3.3.0/netbox_docker_plugin/migrations/0033_host_operation.py +26 -0
  11. netbox_docker_plugin-3.1.0/netbox_docker_plugin/migrations/0032_device_and_more.py → netbox_docker_plugin-3.3.0/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py +23 -18
  12. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/models/container.py +57 -0
  13. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tables.py +16 -0
  14. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/container.html +18 -0
  15. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/container/test_container_api.py +8 -1
  16. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/container/test_container_views.py +5 -3
  17. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/urls.py +22 -0
  18. netbox_docker_plugin-3.3.0/netbox_docker_plugin/views/log_driver_option.py +27 -0
  19. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0/netbox_docker_plugin.egg-info}/PKG-INFO +13 -3
  20. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin.egg-info/SOURCES.txt +3 -0
  21. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/pyproject.toml +1 -1
  22. netbox_docker_plugin-3.1.0/netbox_docker_plugin/migrations/0031_container_cap_add.py +0 -29
  23. netbox_docker_plugin-3.1.0/netbox_docker_plugin/migrations/0033_host_operation.py +0 -20
  24. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/LICENSE +0 -0
  25. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/MANIFEST.in +0 -0
  26. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/api/__init__.py +0 -0
  27. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/api/renderers.py +0 -0
  28. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/api/urls.py +0 -0
  29. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/api/views.py +0 -0
  30. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/__init__.py +0 -0
  31. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/bind.py +0 -0
  32. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/device.py +0 -0
  33. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/env.py +0 -0
  34. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/host.py +0 -0
  35. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/image.py +0 -0
  36. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/label.py +0 -0
  37. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/mount.py +0 -0
  38. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/network.py +0 -0
  39. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/network_setting.py +0 -0
  40. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/port.py +0 -0
  41. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/registry.py +0 -0
  42. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/forms/volume.py +0 -0
  43. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0001_initial.py +0 -0
  44. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0002_image.py +0 -0
  45. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0003_image_size.py +0 -0
  46. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0004_volume.py +0 -0
  47. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0005_network.py +0 -0
  48. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0006_container_port_mount_label_env_and_more.py +0 -0
  49. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0007_remove_container_netbox_docker_plugin_container_unique_name_host__and_more.py +0 -0
  50. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0008_alter_network_unique_together_network_networkid_and_more.py +0 -0
  51. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0009_remove_container_network_networksettings_and_more.py +0 -0
  52. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0010_container_containerid_and_more.py +0 -0
  53. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0011_host_token.py +0 -0
  54. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0012_host_state.py +0 -0
  55. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0013_host_netbox_url.py +0 -0
  56. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0014_container_operation.py +0 -0
  57. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0015_remove_mount_netbox_docker_plugin_mount_unique_volume_and_more.py +0 -0
  58. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0016_alter_env_value.py +0 -0
  59. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0017_network_state.py +0 -0
  60. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0018_alter_mount_volume_alter_networksetting_network.py +0 -0
  61. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0019_host_agent_version_host_docker_api_version.py +0 -0
  62. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0020_container_hostname.py +0 -0
  63. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0021_registry_and_more.py +0 -0
  64. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0022_bind_bind_netbox_docker_plugin_bind_unique_bind.py +0 -0
  65. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0023_delete_hosts.py +0 -0
  66. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0024_registry_host_alter_registry_name_and_more.py +0 -0
  67. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0025_alter_image_version.py +0 -0
  68. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0026_image_digest.py +0 -0
  69. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0027_container_restart_policy.py +0 -0
  70. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0028_mount_and_bind_read_only.py +0 -0
  71. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0029_alter_container_state.py +0 -0
  72. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0030_alter_container_containerid_alter_container_hostname_and_more.py +0 -0
  73. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/0034_volume_max_size.py +0 -0
  74. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/migrations/__init__.py +0 -0
  75. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/models/__init__.py +0 -0
  76. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/models/host.py +0 -0
  77. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/models/image.py +0 -0
  78. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/models/network.py +0 -0
  79. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/models/registry.py +0 -0
  80. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/models/volume.py +0 -0
  81. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/navigation.py +0 -0
  82. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/signals.py +0 -0
  83. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/container-exec.html +0 -0
  84. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/container-layout.html +0 -0
  85. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/container-logs.html +0 -0
  86. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/host-graph.html +0 -0
  87. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/host.html +0 -0
  88. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/image.html +0 -0
  89. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/network.html +0 -0
  90. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/registry.html +0 -0
  91. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/volume.html +0 -0
  92. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/templatetags/__init__.py +0 -0
  93. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/templatetags/host.py +0 -0
  94. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/__init__.py +0 -0
  95. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/base.py +0 -0
  96. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/container/__init__.py +0 -0
  97. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/container/test_container_actions.py +0 -0
  98. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/container/test_container_api_exec.py +0 -0
  99. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/container/test_container_operation_view.py +0 -0
  100. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/container/test_container_validation.py +0 -0
  101. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/host/__init__.py +0 -0
  102. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/host/test_host_api.py +0 -0
  103. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/host/test_host_views.py +0 -0
  104. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/host/test_replace_password.py +0 -0
  105. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/image/__init__.py +0 -0
  106. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/image/test_image_api.py +0 -0
  107. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/image/test_image_views.py +0 -0
  108. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/network/__init__.py +0 -0
  109. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/network/test_network_api.py +0 -0
  110. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/network/test_network_views.py +0 -0
  111. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/registry/__init__.py +0 -0
  112. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/registry/test_registry_api.py +0 -0
  113. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/registry/test_registry_views.py +0 -0
  114. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/test_init.py +0 -0
  115. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/volume/__init__.py +0 -0
  116. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/volume/test_volume_api.py +0 -0
  117. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/tests/volume/test_volume_views.py +0 -0
  118. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/utilities/__init__.py +0 -0
  119. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/__init__.py +0 -0
  120. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/bind.py +0 -0
  121. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/container.py +0 -0
  122. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/device.py +0 -0
  123. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/env.py +0 -0
  124. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/host.py +0 -0
  125. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/image.py +0 -0
  126. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/label.py +0 -0
  127. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/mount.py +0 -0
  128. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/network.py +0 -0
  129. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/network_setting.py +0 -0
  130. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/port.py +0 -0
  131. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/registry.py +0 -0
  132. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin/views/volume.py +0 -0
  133. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin.egg-info/dependency_links.txt +0 -0
  134. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/netbox_docker_plugin.egg-info/top_level.txt +0 -0
  135. {netbox_docker_plugin-3.1.0 → netbox_docker_plugin-3.3.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: netbox-docker-plugin
3
- Version: 3.1.0
3
+ Version: 3.3.0
4
4
  Summary: Manage Docker with Netbox & style.
5
5
  Author-email: Vincent Simonin <vincent@saashup.com>, David Delassus <david.jose.delassus@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/SaaShup/netbox-docker-plugin
@@ -10,6 +10,7 @@ Classifier: Programming Language :: Python :: 3
10
10
  Requires-Python: >=3.11
11
11
  Description-Content-Type: text/markdown
12
12
  License-File: LICENSE
13
+ Dynamic: license-file
13
14
 
14
15
  # Netbox Docker Plugin
15
16
 
@@ -19,6 +20,10 @@ Manage Docker with Netbox & style. Made to work with [netbox-docker-agent](https
19
20
 
20
21
  ![UI Container view with dependencies](/docs/assets/screenshot.png)
21
22
 
23
+ Thanks [dzove855](https://github.com/dzove855) for the presentation of the plugin the 15th April 2025 during the Netbox Community Call.
24
+
25
+ [![Netbox Docker Plugin presentation at Netbox Community call the 15th April 2025](https://img.youtube.com/vi/gRamXtFAspQ/sddefault.jpg)](https://youtu.be/gRamXtFAspQ?t=1870)
26
+
22
27
  ## How does it work?
23
28
 
24
29
  ```mermaid
@@ -32,12 +37,17 @@ sequenceDiagram
32
37
  Once the plugin and webhooks are installed, you can:
33
38
 
34
39
  1. Create hosts that point to
35
- [agents](https://github.com/SaaShup/netbox-docker-agent) you had installed
40
+ [agents](https://github.com/SaaShup/netbox-docker-agent) you had installed *
36
41
  2. Retrieve informations from Docker API with the help of the agent
37
42
  3. Create containers on host with an image, expose ports, add env variables and
38
43
  labels, mount volumes, set networks.
39
44
  4. Manage the container status, start, stop, restart.
40
45
 
46
+ * adding a host with curl needs a specific **Origin** header to make it working. Example :
47
+ ```
48
+ curl -X POST -H "Authorization: Token xxxxx" -H "Content-Type: application/json" -H "Origin: https://myhost" https://myhost/api/plugins/docker/hosts/ -d '{"name": "test-add", "endpoint": "[https://xxxx:xxxx@test.com:1990"}](https://xxxx:xxxx@test.com:1990%22%7D)'
49
+ ```
50
+
41
51
  ## Installation
42
52
 
43
53
  Below the compatibility list of the Netbox Docker PLugin and Netbox. Please chose the right version of the plugin depending of the Netbox version you use:
@@ -6,6 +6,10 @@ Manage Docker with Netbox & style. Made to work with [netbox-docker-agent](https
6
6
 
7
7
  ![UI Container view with dependencies](/docs/assets/screenshot.png)
8
8
 
9
+ Thanks [dzove855](https://github.com/dzove855) for the presentation of the plugin the 15th April 2025 during the Netbox Community Call.
10
+
11
+ [![Netbox Docker Plugin presentation at Netbox Community call the 15th April 2025](https://img.youtube.com/vi/gRamXtFAspQ/sddefault.jpg)](https://youtu.be/gRamXtFAspQ?t=1870)
12
+
9
13
  ## How does it work?
10
14
 
11
15
  ```mermaid
@@ -19,12 +23,17 @@ sequenceDiagram
19
23
  Once the plugin and webhooks are installed, you can:
20
24
 
21
25
  1. Create hosts that point to
22
- [agents](https://github.com/SaaShup/netbox-docker-agent) you had installed
26
+ [agents](https://github.com/SaaShup/netbox-docker-agent) you had installed *
23
27
  2. Retrieve informations from Docker API with the help of the agent
24
28
  3. Create containers on host with an image, expose ports, add env variables and
25
29
  labels, mount volumes, set networks.
26
30
  4. Manage the container status, start, stop, restart.
27
31
 
32
+ * adding a host with curl needs a specific **Origin** header to make it working. Example :
33
+ ```
34
+ curl -X POST -H "Authorization: Token xxxxx" -H "Content-Type: application/json" -H "Origin: https://myhost" https://myhost/api/plugins/docker/hosts/ -d '{"name": "test-add", "endpoint": "[https://xxxx:xxxx@test.com:1990"}](https://xxxx:xxxx@test.com:1990%22%7D)'
35
+ ```
36
+
28
37
  ## Installation
29
38
 
30
39
  Below the compatibility list of the Netbox Docker PLugin and Netbox. Please chose the right version of the plugin depending of the Netbox version you use:
@@ -11,7 +11,7 @@ class NetBoxDockerConfig(PluginConfig):
11
11
  name = "netbox_docker_plugin"
12
12
  verbose_name = " NetBox Docker Plugin"
13
13
  description = "Manage Docker"
14
- version = "3.1.0"
14
+ version = "3.3.0"
15
15
  base_url = "docker"
16
16
  min_version = "4.1.0"
17
17
  author = "Vincent Simonin <vincent@saashup.com>, David Delassus <david.jose.delassus@gmail.com>"
@@ -19,6 +19,7 @@ from ..models.container import (
19
19
  Bind,
20
20
  NetworkSetting,
21
21
  Device,
22
+ LogDriverOption,
22
23
  )
23
24
  from ..models.registry import Registry
24
25
 
@@ -28,6 +29,7 @@ class NestedTokenSerializer(WritableNestedSerializer):
28
29
 
29
30
  class Meta:
30
31
  """Nested Token Serializer Meta class"""
32
+
31
33
  model = Token
32
34
  fields = ["id", "url", "display_url", "display", "key", "write_enabled"]
33
35
 
@@ -163,6 +165,7 @@ class NestedContainerSerializer(WritableNestedSerializer):
163
165
  "operation",
164
166
  "hostname",
165
167
  "cap_add",
168
+ "log_driver",
166
169
  )
167
170
 
168
171
 
@@ -337,6 +340,19 @@ class EnvSerializer(serializers.ModelSerializer):
337
340
  )
338
341
 
339
342
 
343
+ class LogDriverOptionSerializer(serializers.ModelSerializer):
344
+ """Container Log Driver Option Serializer class"""
345
+
346
+ class Meta:
347
+ """Container Log Driver Option Serializer Meta class"""
348
+
349
+ model = LogDriverOption
350
+ fields = (
351
+ "option_name",
352
+ "value",
353
+ )
354
+
355
+
340
356
  class LabelSerializer(serializers.ModelSerializer):
341
357
  """Container Label Serializer class"""
342
358
 
@@ -420,6 +436,7 @@ class ContainerSerializer(NetBoxModelSerializer):
420
436
  binds = BindSerializer(many=True, required=False)
421
437
  network_settings = NetworkSettingSerializer(many=True, required=False)
422
438
  devices = DeviceSerializer(many=True, required=False)
439
+ log_driver_options = LogDriverOptionSerializer(many=True, required=False)
423
440
 
424
441
  class Meta:
425
442
  """Container Serializer Meta class"""
@@ -446,6 +463,8 @@ class ContainerSerializer(NetBoxModelSerializer):
446
463
  "binds",
447
464
  "network_settings",
448
465
  "devices",
466
+ "log_driver",
467
+ "log_driver_options",
449
468
  "custom_fields",
450
469
  "created",
451
470
  "last_updated",
@@ -457,6 +476,7 @@ class ContainerSerializer(NetBoxModelSerializer):
457
476
  attrs = data.copy()
458
477
  attrs.pop("ports", None)
459
478
  attrs.pop("env", None)
479
+ attrs.pop("log_driver_options", None)
460
480
  attrs.pop("labels", None)
461
481
  attrs.pop("mounts", None)
462
482
  attrs.pop("binds", None)
@@ -471,6 +491,7 @@ class ContainerSerializer(NetBoxModelSerializer):
471
491
  def create(self, validated_data):
472
492
  ports_data = validated_data.pop("ports", None)
473
493
  env_data = validated_data.pop("env", None)
494
+ log_driver_options_data = validated_data.pop("log_driver_options", None)
474
495
  labels_data = validated_data.pop("labels", None)
475
496
  mounts_data = validated_data.pop("mounts", None)
476
497
  binds_data = validated_data.pop("binds", None)
@@ -487,6 +508,10 @@ class ContainerSerializer(NetBoxModelSerializer):
487
508
  for env in env_data:
488
509
  Env.objects.create(container=container, **env)
489
510
 
511
+ if log_driver_options_data is not None:
512
+ for option in log_driver_options_data:
513
+ LogDriverOption.objects.create(container=container, **option)
514
+
490
515
  if labels_data is not None:
491
516
  for label in labels_data:
492
517
  Label.objects.create(container=container, **label)
@@ -521,6 +546,7 @@ class ContainerSerializer(NetBoxModelSerializer):
521
546
  def update(self, instance, validated_data):
522
547
  ports_data = validated_data.pop("ports", None)
523
548
  env_data = validated_data.pop("env", None)
549
+ log_driver_options_data = validated_data.pop("log_driver_options", None)
524
550
  labels_data = validated_data.pop("labels", None)
525
551
  mounts_data = validated_data.pop("mounts", None)
526
552
  binds_data = validated_data.pop("binds", None)
@@ -539,6 +565,11 @@ class ContainerSerializer(NetBoxModelSerializer):
539
565
  for env in env_data:
540
566
  Env.objects.create(container=container, **env)
541
567
 
568
+ if log_driver_options_data is not None:
569
+ LogDriverOption.objects.filter(container=container).delete()
570
+ for option in log_driver_options_data:
571
+ LogDriverOption.objects.create(container=container, **option)
572
+
542
573
  if labels_data is not None:
543
574
  Label.objects.filter(container=container).delete()
544
575
  for label in labels_data:
@@ -16,6 +16,7 @@ from .models.container import (
16
16
  Bind,
17
17
  NetworkSetting,
18
18
  Device,
19
+ LogDriverOption,
19
20
  )
20
21
  from .models.registry import Registry
21
22
 
@@ -89,7 +90,15 @@ class ImageFilterSet(NetBoxModelFilterSet):
89
90
  """Image filterset definition meta class"""
90
91
 
91
92
  model = Image
92
- fields = ("id", "name", "version", "size", "ImageID", "containers")
93
+ fields = (
94
+ "id",
95
+ "name",
96
+ "version",
97
+ "size",
98
+ "ImageID",
99
+ "Digest",
100
+ "containers",
101
+ )
93
102
 
94
103
  # pylint: disable=W0613
95
104
  def search(self, queryset, name, value):
@@ -166,7 +175,14 @@ class ContainerFilterSet(NetBoxModelFilterSet):
166
175
  """Container filterset definition meta class"""
167
176
 
168
177
  model = Container
169
- fields = ("id", "name", "state", "hostname", "restart_policy")
178
+ fields = (
179
+ "id",
180
+ "name",
181
+ "state",
182
+ "hostname",
183
+ "restart_policy",
184
+ "ContainerID",
185
+ )
170
186
 
171
187
  # pylint: disable=W0613
172
188
  def search(self, queryset, name, value):
@@ -195,6 +211,25 @@ class EnvFilterSet(BaseFilterSet):
195
211
  )
196
212
 
197
213
 
214
+ class LogDriverOptionFilterSet(BaseFilterSet):
215
+ """Log driver option filterset definition class"""
216
+
217
+ container_id = ModelMultipleChoiceFilter(
218
+ field_name="container_id",
219
+ queryset=Container.objects.all(),
220
+ label="Container (ID)",
221
+ )
222
+
223
+ class Meta:
224
+ """Log driver option filterset definition meta class"""
225
+
226
+ model = LogDriverOption
227
+ fields = (
228
+ "id",
229
+ "option_name",
230
+ )
231
+
232
+
198
233
  class LabelFilterSet(BaseFilterSet):
199
234
  """Label filterset definition class"""
200
235
 
@@ -15,7 +15,12 @@ from netbox.forms import (
15
15
  )
16
16
  from ..models.volume import Volume
17
17
  from ..models.host import Host
18
- from ..models.container import Container, ContainerRestartPolicyChoices, ContainerCapAddChoices
18
+ from ..models.container import (
19
+ Container,
20
+ ContainerRestartPolicyChoices,
21
+ ContainerCapAddChoices,
22
+ ContainerLogDriverChoices,
23
+ )
19
24
  from ..models.image import Image
20
25
 
21
26
 
@@ -44,6 +49,7 @@ class ContainerForm(NetBoxModelForm):
44
49
  "hostname",
45
50
  "restart_policy",
46
51
  "cap_add",
52
+ "log_driver",
47
53
  "tags",
48
54
  )
49
55
  labels = {
@@ -53,6 +59,7 @@ class ContainerForm(NetBoxModelForm):
53
59
  "hostname": "Hostname",
54
60
  "restart_policy": "Restart Policy",
55
61
  "cap_add": "Add Host capabilities",
62
+ "log_driver": "Logging driver",
56
63
  }
57
64
 
58
65
 
@@ -77,6 +84,7 @@ class ContainerEditForm(NetBoxModelForm):
77
84
  "hostname",
78
85
  "restart_policy",
79
86
  "cap_add",
87
+ "log_driver",
80
88
  "tags",
81
89
  )
82
90
  labels = {
@@ -85,6 +93,7 @@ class ContainerEditForm(NetBoxModelForm):
85
93
  "hostname": "Hostname",
86
94
  "restart_policy": "Restart Policy",
87
95
  "cap_add": "Add Host capabilities",
96
+ "log_driver": "Logging driver",
88
97
  }
89
98
 
90
99
 
@@ -112,6 +121,9 @@ class ContainerFilterForm(NetBoxModelFilterSetForm):
112
121
  restart_policy = forms.ChoiceField(
113
122
  label="Restart Policy", choices=ContainerRestartPolicyChoices, required=False
114
123
  )
124
+ log_driver = forms.ChoiceField(
125
+ label="Logging driver", choices=ContainerLogDriverChoices, required=False
126
+ )
115
127
  tag = TagFilterField(model)
116
128
 
117
129
 
@@ -126,6 +138,13 @@ class ContainerImportForm(NetBoxModelImportForm):
126
138
  + "`always`, `unless-stopped`.",
127
139
  )
128
140
 
141
+ log_driver = forms.ChoiceField(
142
+ label="Logging driver",
143
+ choices=ContainerLogDriverChoices,
144
+ required=False,
145
+ help_text="Logging driver. Can be `json-log`, `syslog`.",
146
+ )
147
+
129
148
  class Meta:
130
149
  """Container importation form definition Meta class"""
131
150
 
@@ -151,12 +170,17 @@ class ContainerBulkEditForm(NetBoxModelBulkEditForm):
151
170
  choices=ContainerRestartPolicyChoices,
152
171
  required=True,
153
172
  )
173
+ log_driver = forms.ChoiceField(
174
+ label="Logging driver",
175
+ choices=ContainerLogDriverChoices,
176
+ required=True,
177
+ )
154
178
  hostname = forms.CharField(
155
179
  label="Hostname", max_length=256, min_length=1, required=False
156
180
  )
157
181
 
158
182
  model = Container
159
- fieldsets = (FieldSet("restart_policy", "hostname", name="General"),)
183
+ fieldsets = (FieldSet("restart_policy", "log_driver", "hostname", name="General"),)
160
184
 
161
185
 
162
186
  class ContainerOperationForm(NetBoxModelForm):
@@ -0,0 +1,28 @@
1
+ """Log Driver option Form definition"""
2
+
3
+ from django import forms
4
+ from utilities.forms.fields import DynamicModelChoiceField
5
+ from ..models.container import LogDriverOption, Container
6
+
7
+
8
+ class LogDriverOptionForm(forms.ModelForm):
9
+ """Log Driver option form definition class"""
10
+
11
+ container = DynamicModelChoiceField(
12
+ label="Container", queryset=Container.objects.all(), required=True
13
+ )
14
+
15
+ class Meta:
16
+ """Log Driver option form definition Meta class"""
17
+
18
+ model = LogDriverOption
19
+ fields = (
20
+ "container",
21
+ "option_name",
22
+ "value",
23
+ )
24
+ labels = {
25
+ "container": "Container",
26
+ "option_name": "Option Name",
27
+ "value": "Value",
28
+ }
@@ -0,0 +1,37 @@
1
+ # pylint: disable=C0103
2
+ """Migration file"""
3
+
4
+ import django.contrib.postgres.fields
5
+ from django.db import migrations, models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+ """Migration file"""
10
+
11
+ dependencies = [
12
+ (
13
+ "netbox_docker_plugin",
14
+ "0030_alter_container_containerid_alter_container_hostname_and_more",
15
+ ),
16
+ ]
17
+
18
+ operations = [
19
+ migrations.RunSQL(
20
+ "ALTER TABLE netbox_docker_plugin_container "
21
+ + "ADD COLUMN IF NOT EXISTS cap_add character varying(32)[];",
22
+ state_operations=[
23
+ migrations.AddField(
24
+ model_name="container",
25
+ name="cap_add",
26
+ field=django.contrib.postgres.fields.ArrayField(
27
+ base_field=models.CharField(
28
+ blank=True, max_length=32, null=True
29
+ ),
30
+ blank=True,
31
+ null=True,
32
+ size=None,
33
+ ),
34
+ ),
35
+ ],
36
+ )
37
+ ]
@@ -0,0 +1,99 @@
1
+ # pylint: disable=C0103
2
+ """Migration file"""
3
+
4
+ import django.core.validators
5
+ import django.db.models.deletion
6
+ from django.db import migrations, models
7
+
8
+
9
+ class Migration(migrations.Migration):
10
+ """Migration file"""
11
+
12
+ dependencies = [
13
+ ("netbox_docker_plugin", "0031_container_cap_add"),
14
+ ]
15
+
16
+ operations = [
17
+ migrations.RunSQL(
18
+ """
19
+ CREATE TABLE IF NOT EXISTS public.netbox_docker_plugin_device
20
+ (
21
+ id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
22
+ host_path character varying(1024) NOT NULL,
23
+ container_path character varying(1024) NOT NULL,
24
+ container_id bigint NOT NULL,
25
+ CONSTRAINT netbox_docker_plugin_device_pkey PRIMARY KEY (id),
26
+ CONSTRAINT netbox_docker_plugin_device_unique_device UNIQUE
27
+ (container_id, container_path, host_path),
28
+ CONSTRAINT netbox_docker_plugin_container_id_a53ca874_fk_netbox_do FOREIGN KEY (container_id)
29
+ REFERENCES public.netbox_docker_plugin_container (id) MATCH SIMPLE
30
+ ON UPDATE NO ACTION
31
+ ON DELETE NO ACTION
32
+ DEFERRABLE INITIALLY DEFERRED
33
+ );
34
+ CREATE INDEX IF NOT EXISTS netbox_docker_plugin_device_container_id_a53ca874
35
+ ON public.netbox_docker_plugin_device USING btree
36
+ (container_id ASC NULLS LAST);
37
+ """,
38
+ state_operations=
39
+ [
40
+ migrations.CreateModel(
41
+ name="Device",
42
+ fields=[
43
+ (
44
+ "id",
45
+ models.BigAutoField(
46
+ auto_created=True, primary_key=True, serialize=False
47
+ ),
48
+ ),
49
+ (
50
+ "host_path",
51
+ models.CharField(
52
+ max_length=1024,
53
+ validators=[
54
+ django.core.validators.MinLengthValidator(
55
+ limit_value=1
56
+ ),
57
+ django.core.validators.MaxLengthValidator(
58
+ limit_value=1024
59
+ ),
60
+ ],
61
+ ),
62
+ ),
63
+ (
64
+ "container_path",
65
+ models.CharField(
66
+ max_length=1024,
67
+ validators=[
68
+ django.core.validators.MinLengthValidator(
69
+ limit_value=1
70
+ ),
71
+ django.core.validators.MaxLengthValidator(
72
+ limit_value=1024
73
+ ),
74
+ ],
75
+ ),
76
+ ),
77
+ (
78
+ "container",
79
+ models.ForeignKey(
80
+ on_delete=django.db.models.deletion.CASCADE,
81
+ related_name="devices",
82
+ to="netbox_docker_plugin.container",
83
+ ),
84
+ ),
85
+ ],
86
+ options={
87
+ "ordering": ("container", "container_path", "host_path"),
88
+ },
89
+ ),
90
+ migrations.AddConstraint(
91
+ model_name="device",
92
+ constraint=models.UniqueConstraint(
93
+ fields=("container", "container_path", "host_path"),
94
+ name="netbox_docker_plugin_device_unique_device",
95
+ ),
96
+ ),
97
+ ],
98
+ ),
99
+ ]
@@ -0,0 +1,26 @@
1
+ # pylint: disable=C0103
2
+ """Migration file"""
3
+
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ """Migration file"""
9
+
10
+ dependencies = [
11
+ ("netbox_docker_plugin", "0032_device_and_more"),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.RunSQL(
16
+ "ALTER TABLE netbox_docker_plugin_host "
17
+ + "ADD COLUMN IF NOT EXISTS operation character varying(32);",
18
+ state_operations=[
19
+ migrations.AddField(
20
+ model_name="host",
21
+ name="operation",
22
+ field=models.CharField(default="none", max_length=32),
23
+ ),
24
+ ],
25
+ )
26
+ ]
@@ -10,12 +10,17 @@ class Migration(migrations.Migration):
10
10
  """Migration file"""
11
11
 
12
12
  dependencies = [
13
- ("netbox_docker_plugin", "0031_container_cap_add"),
13
+ ("netbox_docker_plugin", "0034_volume_max_size"),
14
14
  ]
15
15
 
16
16
  operations = [
17
+ migrations.AddField(
18
+ model_name="container",
19
+ name="log_driver",
20
+ field=models.CharField(default="json-log", max_length=32),
21
+ ),
17
22
  migrations.CreateModel(
18
- name="Device",
23
+ name="LogDriverOption",
19
24
  fields=[
20
25
  (
21
26
  "id",
@@ -24,22 +29,22 @@ class Migration(migrations.Migration):
24
29
  ),
25
30
  ),
26
31
  (
27
- "host_path",
32
+ "option_name",
28
33
  models.CharField(
29
- max_length=1024,
34
+ max_length=255,
30
35
  validators=[
31
36
  django.core.validators.MinLengthValidator(limit_value=1),
32
- django.core.validators.MaxLengthValidator(limit_value=1024),
37
+ django.core.validators.MaxLengthValidator(limit_value=255),
33
38
  ],
34
39
  ),
35
40
  ),
36
41
  (
37
- "container_path",
42
+ "value",
38
43
  models.CharField(
39
- max_length=1024,
44
+ blank=True,
45
+ max_length=4096,
40
46
  validators=[
41
- django.core.validators.MinLengthValidator(limit_value=1),
42
- django.core.validators.MaxLengthValidator(limit_value=1024),
47
+ django.core.validators.MaxLengthValidator(limit_value=4096)
43
48
  ],
44
49
  ),
45
50
  ),
@@ -47,20 +52,20 @@ class Migration(migrations.Migration):
47
52
  "container",
48
53
  models.ForeignKey(
49
54
  on_delete=django.db.models.deletion.CASCADE,
50
- related_name="devices",
55
+ related_name="log_driver_options",
51
56
  to="netbox_docker_plugin.container",
52
57
  ),
53
58
  ),
54
59
  ],
55
60
  options={
56
- "ordering": ("container", "container_path", "host_path"),
61
+ "ordering": ("container", "option_name"),
62
+ "constraints": [
63
+ models.UniqueConstraint(
64
+ models.F("option_name"),
65
+ models.F("container"),
66
+ name="netbox_docker_plugin_logdriveroption_unique_option_name_container'",
67
+ )
68
+ ],
57
69
  },
58
70
  ),
59
- migrations.AddConstraint(
60
- model_name="device",
61
- constraint=models.UniqueConstraint(
62
- fields=("container", "container_path", "host_path"),
63
- name="netbox_docker_plugin_device_unique_device",
64
- ),
65
- ),
66
71
  ]