netbox-docker-plugin 5.2.0__tar.gz → 5.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.
- {netbox_docker_plugin-5.2.0/netbox_docker_plugin.egg-info → netbox_docker_plugin-5.3.0}/PKG-INFO +1 -1
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/__init__.py +1 -1
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/api/serializers.py +5 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/filtersets.py +11 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/image.py +39 -1
- netbox_docker_plugin-5.3.0/netbox_docker_plugin/migrations/1045_image_tenant_image_tenant_group.py +38 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/image.py +15 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tables.py +6 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/image.html +25 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/image/test_image_api.py +13 -1
- netbox_docker_plugin-5.3.0/netbox_docker_plugin/tests/image/test_image_filtersets.py +89 -0
- netbox_docker_plugin-5.3.0/netbox_docker_plugin/tests/image/test_image_tenancy.py +121 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/image/test_image_views.py +13 -2
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0/netbox_docker_plugin.egg-info}/PKG-INFO +1 -1
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin.egg-info/SOURCES.txt +3 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/pyproject.toml +1 -1
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/LICENSE +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/MANIFEST.in +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/README.md +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/api/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/api/renderers.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/api/urls.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/api/views.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/bind.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/container.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/device.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/env.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/host.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/label.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/log_driver_option.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/mount.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/network.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/network_setting.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/port.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/registry.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/sysctl.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/volume.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0001_initial.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0002_image.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0003_image_size.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0004_volume.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0005_network.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0006_container_port_mount_label_env_and_more.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0007_remove_container_netbox_docker_plugin_container_unique_name_host__and_more.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0008_alter_network_unique_together_network_networkid_and_more.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0009_remove_container_network_networksettings_and_more.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0010_container_containerid_and_more.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0011_host_token.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0012_host_state.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0013_host_netbox_url.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0014_container_operation.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0015_remove_mount_netbox_docker_plugin_mount_unique_volume_and_more.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0016_alter_env_value.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0017_network_state.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0018_alter_mount_volume_alter_networksetting_network.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0019_host_agent_version_host_docker_api_version.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0020_container_hostname.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0021_registry_and_more.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0022_bind_bind_netbox_docker_plugin_bind_unique_bind.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0023_delete_hosts.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0024_registry_host_alter_registry_name_and_more.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0025_alter_image_version.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0026_image_digest.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0027_container_restart_policy.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0028_mount_and_bind_read_only.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0029_alter_container_state.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0030_alter_container_containerid_alter_container_hostname_and_more.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0031_container_cap_add.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0032_device_and_more.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0033_host_operation.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0034_volume_max_size.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0036_alter_container_log_driver.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0037_alter_env_value.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/0038_container_cmd.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/1039_alter_port_public_port.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/1040_alter_container_log_driver.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/1041_sysctl.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/1042_registry_username_max_length.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/1043_container_cap_drop_container_extra_hosts_and_more.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/1044_host_virtual_machine.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/migrations/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/container.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/host.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/network.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/registry.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/volume.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/navigation.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/signals.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/template_content.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/container-exec.html +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/container-layout.html +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/container-logs.html +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/container.html +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/host-graph.html +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/host.html +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/network.html +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/registry.html +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/virtual_machine_host_table.html +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templates/netbox_docker_plugin/volume.html +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templatetags/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templatetags/host.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/base.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/container/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/container/test_container_actions.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/container/test_container_api.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/container/test_container_api_exec.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/container/test_container_delete.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/container/test_container_operation_view.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/container/test_container_validation.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/container/test_container_views.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/host/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/host/test_host_api.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/host/test_host_views.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/host/test_host_virtual_machine.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/host/test_replace_password.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/image/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/image/test_force_pull_image_with_special_cf.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/network/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/network/test_network_api.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/network/test_network_views.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/registry/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/registry/test_registry_api.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/registry/test_registry_views.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/test_init.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/volume/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/volume/test_volume_api.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/volume/test_volume_views.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/urls.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/utilities/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/__init__.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/bind.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/container.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/device.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/env.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/host.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/image.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/label.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/log_driver_option.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/mount.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/network.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/network_setting.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/port.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/registry.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/sysctl.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/volume.py +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin.egg-info/dependency_links.txt +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin.egg-info/requires.txt +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin.egg-info/top_level.txt +0 -0
- {netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/setup.cfg +0 -0
{netbox_docker_plugin-5.2.0/netbox_docker_plugin.egg-info → netbox_docker_plugin-5.3.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: netbox-docker-plugin
|
|
3
|
-
Version: 5.
|
|
3
|
+
Version: 5.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
|
|
@@ -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 = "5.
|
|
14
|
+
version = "5.3.0"
|
|
15
15
|
base_url = "docker"
|
|
16
16
|
min_version = "4.5.0"
|
|
17
17
|
author = "Vincent Simonin <vincent@saashup.com>, David Delassus <david.jose.delassus@gmail.com>"
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/api/serializers.py
RENAMED
|
@@ -6,6 +6,7 @@ from rest_framework import serializers
|
|
|
6
6
|
from utilities.query import dict_to_filter_params
|
|
7
7
|
from users.models import Token
|
|
8
8
|
from virtualization.api.serializers import VirtualMachineSerializer
|
|
9
|
+
from tenancy.api.serializers_.tenants import TenantSerializer, TenantGroupSerializer
|
|
9
10
|
from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializer
|
|
10
11
|
from ..models.host import Host
|
|
11
12
|
from ..models.image import Image
|
|
@@ -240,6 +241,8 @@ class ImageSerializer(NetBoxModelSerializer):
|
|
|
240
241
|
url = serializers.HyperlinkedIdentityField(
|
|
241
242
|
view_name="plugins-api:netbox_docker_plugin-api:image-detail"
|
|
242
243
|
)
|
|
244
|
+
tenant_group = TenantGroupSerializer(nested=True, required=False, allow_null=True)
|
|
245
|
+
tenant = TenantSerializer(nested=True, required=False, allow_null=True)
|
|
243
246
|
host = NestedHostSerializer()
|
|
244
247
|
containers = NestedContainerSerializer(many=True, read_only=True)
|
|
245
248
|
registry = NestedRegistrySerializer()
|
|
@@ -252,6 +255,8 @@ class ImageSerializer(NetBoxModelSerializer):
|
|
|
252
255
|
"id",
|
|
253
256
|
"url",
|
|
254
257
|
"display",
|
|
258
|
+
"tenant_group",
|
|
259
|
+
"tenant",
|
|
255
260
|
"host",
|
|
256
261
|
"name",
|
|
257
262
|
"version",
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/filtersets.py
RENAMED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from django_filters import filters, ModelMultipleChoiceFilter
|
|
4
4
|
from django.db.models import Q
|
|
5
|
+
from tenancy.models import Tenant, TenantGroup
|
|
5
6
|
from netbox.filtersets import NetBoxModelFilterSet, BaseFilterSet
|
|
6
7
|
from .models.host import Host
|
|
7
8
|
from .models.image import Image
|
|
@@ -77,6 +78,16 @@ class ImageFilterSet(NetBoxModelFilterSet):
|
|
|
77
78
|
"""Image filterset definition class"""
|
|
78
79
|
|
|
79
80
|
name = filters.CharFilter(lookup_expr="icontains")
|
|
81
|
+
tenant_group_id = ModelMultipleChoiceFilter(
|
|
82
|
+
field_name="tenant_group_id",
|
|
83
|
+
queryset=TenantGroup.objects.all(),
|
|
84
|
+
label="Tenant Group (ID)",
|
|
85
|
+
)
|
|
86
|
+
tenant_id = ModelMultipleChoiceFilter(
|
|
87
|
+
field_name="tenant_id",
|
|
88
|
+
queryset=Tenant.objects.all(),
|
|
89
|
+
label="Tenant (ID)",
|
|
90
|
+
)
|
|
80
91
|
host_id = ModelMultipleChoiceFilter(
|
|
81
92
|
field_name="host_id",
|
|
82
93
|
queryset=Host.objects.all(),
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/image.py
RENAMED
|
@@ -7,6 +7,7 @@ from utilities.forms.fields import (
|
|
|
7
7
|
DynamicModelMultipleChoiceField,
|
|
8
8
|
DynamicModelChoiceField,
|
|
9
9
|
)
|
|
10
|
+
from tenancy.models import Tenant, TenantGroup
|
|
10
11
|
from netbox.forms import (
|
|
11
12
|
NetBoxModelForm,
|
|
12
13
|
NetBoxModelImportForm,
|
|
@@ -21,6 +22,13 @@ from ..models.registry import Registry
|
|
|
21
22
|
class ImageForm(NetBoxModelForm):
|
|
22
23
|
"""Image form definition class"""
|
|
23
24
|
|
|
25
|
+
tenant_group = DynamicModelChoiceField(
|
|
26
|
+
label="Tenant Group", queryset=TenantGroup.objects.all(), required=False
|
|
27
|
+
)
|
|
28
|
+
tenant = DynamicModelChoiceField(
|
|
29
|
+
label="Tenant", queryset=Tenant.objects.all(), required=False,
|
|
30
|
+
query_params={"group_id": "$tenant_group"},
|
|
31
|
+
)
|
|
24
32
|
host = DynamicModelChoiceField(
|
|
25
33
|
label="Host", queryset=Host.objects.all(), required=True
|
|
26
34
|
)
|
|
@@ -31,11 +39,18 @@ class ImageForm(NetBoxModelForm):
|
|
|
31
39
|
query_params={"host_id": "$host"},
|
|
32
40
|
)
|
|
33
41
|
|
|
42
|
+
fieldsets = (
|
|
43
|
+
FieldSet("host", "registry", "name", "version", "tags", name="General"),
|
|
44
|
+
FieldSet("tenant_group", "tenant", name="Tenancy"),
|
|
45
|
+
)
|
|
46
|
+
|
|
34
47
|
class Meta:
|
|
35
48
|
"""Image form definition Meta class"""
|
|
36
49
|
|
|
37
50
|
model = Image
|
|
38
51
|
fields = (
|
|
52
|
+
"tenant_group",
|
|
53
|
+
"tenant",
|
|
39
54
|
"host",
|
|
40
55
|
"registry",
|
|
41
56
|
"name",
|
|
@@ -44,6 +59,8 @@ class ImageForm(NetBoxModelForm):
|
|
|
44
59
|
)
|
|
45
60
|
labels = {
|
|
46
61
|
"name": "Name",
|
|
62
|
+
"tenant_group": "Tenant Group",
|
|
63
|
+
"tenant": "Tenant",
|
|
47
64
|
"host": "Host",
|
|
48
65
|
"registry": "Registry",
|
|
49
66
|
"version": "Version",
|
|
@@ -54,6 +71,16 @@ class ImageFilterForm(NetBoxModelFilterSetForm):
|
|
|
54
71
|
"""Image filter form definition class"""
|
|
55
72
|
|
|
56
73
|
model = Image
|
|
74
|
+
tenant_group_id = DynamicModelMultipleChoiceField(
|
|
75
|
+
queryset=TenantGroup.objects.all(),
|
|
76
|
+
required=False,
|
|
77
|
+
label="Tenant Group",
|
|
78
|
+
)
|
|
79
|
+
tenant_id = DynamicModelMultipleChoiceField(
|
|
80
|
+
queryset=Tenant.objects.all(),
|
|
81
|
+
required=False,
|
|
82
|
+
label="Tenant",
|
|
83
|
+
)
|
|
57
84
|
name = forms.CharField(label="Name", max_length=256, min_length=1, required=False)
|
|
58
85
|
version = forms.CharField(
|
|
59
86
|
label="Version", max_length=256, min_length=1, required=False
|
|
@@ -97,9 +124,20 @@ class ImageImportForm(NetBoxModelImportForm):
|
|
|
97
124
|
class ImageBulkEditForm(NetBoxModelBulkEditForm):
|
|
98
125
|
"""Image bulk edit form definition class"""
|
|
99
126
|
|
|
127
|
+
tenant_group = DynamicModelChoiceField(
|
|
128
|
+
queryset=TenantGroup.objects.all(),
|
|
129
|
+
required=False,
|
|
130
|
+
)
|
|
131
|
+
tenant = DynamicModelChoiceField(
|
|
132
|
+
queryset=Tenant.objects.all(),
|
|
133
|
+
required=False,
|
|
134
|
+
)
|
|
100
135
|
version = forms.CharField(
|
|
101
136
|
required=False,
|
|
102
137
|
)
|
|
103
138
|
|
|
104
139
|
model = Image
|
|
105
|
-
fieldsets = (
|
|
140
|
+
fieldsets = (
|
|
141
|
+
FieldSet("version", name="General"),
|
|
142
|
+
FieldSet("tenant_group", "tenant", name="Tenancy"),
|
|
143
|
+
)
|
netbox_docker_plugin-5.3.0/netbox_docker_plugin/migrations/1045_image_tenant_image_tenant_group.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# pylint: disable=C0103
|
|
2
|
+
"""Migration file"""
|
|
3
|
+
|
|
4
|
+
import django.db.models.deletion
|
|
5
|
+
from django.db import migrations, models
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Migration(migrations.Migration):
|
|
9
|
+
"""Migration file"""
|
|
10
|
+
|
|
11
|
+
dependencies = [
|
|
12
|
+
("netbox_docker_plugin", "1044_host_virtual_machine"),
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
operations = [
|
|
16
|
+
migrations.AddField(
|
|
17
|
+
model_name="image",
|
|
18
|
+
name="tenant",
|
|
19
|
+
field=models.ForeignKey(
|
|
20
|
+
blank=True,
|
|
21
|
+
null=True,
|
|
22
|
+
on_delete=django.db.models.deletion.SET_NULL,
|
|
23
|
+
related_name="images",
|
|
24
|
+
to="tenancy.tenant",
|
|
25
|
+
),
|
|
26
|
+
),
|
|
27
|
+
migrations.AddField(
|
|
28
|
+
model_name="image",
|
|
29
|
+
name="tenant_group",
|
|
30
|
+
field=models.ForeignKey(
|
|
31
|
+
blank=True,
|
|
32
|
+
null=True,
|
|
33
|
+
on_delete=django.db.models.deletion.SET_NULL,
|
|
34
|
+
related_name="images",
|
|
35
|
+
to="tenancy.tenantgroup",
|
|
36
|
+
),
|
|
37
|
+
),
|
|
38
|
+
]
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/image.py
RENAMED
|
@@ -8,6 +8,7 @@ from django.core.validators import (
|
|
|
8
8
|
MinValueValidator,
|
|
9
9
|
MaxValueValidator,
|
|
10
10
|
)
|
|
11
|
+
from tenancy.models import Tenant, TenantGroup
|
|
11
12
|
from netbox.models import NetBoxModel
|
|
12
13
|
from .host import Host
|
|
13
14
|
from .registry import Registry
|
|
@@ -16,6 +17,20 @@ from .registry import Registry
|
|
|
16
17
|
class Image(NetBoxModel):
|
|
17
18
|
"""Image definition class"""
|
|
18
19
|
|
|
20
|
+
tenant_group = models.ForeignKey(
|
|
21
|
+
TenantGroup,
|
|
22
|
+
on_delete=models.SET_NULL,
|
|
23
|
+
related_name="images",
|
|
24
|
+
blank=True,
|
|
25
|
+
null=True,
|
|
26
|
+
)
|
|
27
|
+
tenant = models.ForeignKey(
|
|
28
|
+
Tenant,
|
|
29
|
+
on_delete=models.SET_NULL,
|
|
30
|
+
related_name="images",
|
|
31
|
+
blank=True,
|
|
32
|
+
null=True,
|
|
33
|
+
)
|
|
19
34
|
host = models.ForeignKey(Host, on_delete=models.CASCADE, related_name="images")
|
|
20
35
|
registry = models.ForeignKey(
|
|
21
36
|
Registry,
|
|
@@ -141,6 +141,8 @@ class MinRegistryTable(NetBoxTable):
|
|
|
141
141
|
class ImageTable(NetBoxTable):
|
|
142
142
|
"""Image Table definition class"""
|
|
143
143
|
|
|
144
|
+
tenant_group = tables.Column(linkify=True)
|
|
145
|
+
tenant = tables.Column(linkify=True)
|
|
144
146
|
host = tables.Column(linkify=True)
|
|
145
147
|
registry = tables.Column(linkify=True)
|
|
146
148
|
name = tables.Column(linkify=True)
|
|
@@ -162,6 +164,8 @@ class ImageTable(NetBoxTable):
|
|
|
162
164
|
fields = (
|
|
163
165
|
"pk",
|
|
164
166
|
"id",
|
|
167
|
+
"tenant_group",
|
|
168
|
+
"tenant",
|
|
165
169
|
"host",
|
|
166
170
|
"name",
|
|
167
171
|
"version",
|
|
@@ -172,6 +176,8 @@ class ImageTable(NetBoxTable):
|
|
|
172
176
|
"tags",
|
|
173
177
|
)
|
|
174
178
|
default_columns = (
|
|
179
|
+
"tenant_group",
|
|
180
|
+
"tenant",
|
|
175
181
|
"host",
|
|
176
182
|
"name",
|
|
177
183
|
"version",
|
|
@@ -103,6 +103,31 @@
|
|
|
103
103
|
</tr>
|
|
104
104
|
</table>
|
|
105
105
|
</div>
|
|
106
|
+
<div class="card">
|
|
107
|
+
<h2 class="card-header">Tenancy</h2>
|
|
108
|
+
<table class="table table-hover attr-table">
|
|
109
|
+
<tr>
|
|
110
|
+
<th scope="row">Tenant Group</th>
|
|
111
|
+
<td>
|
|
112
|
+
{% if object.tenant_group %}
|
|
113
|
+
<a href="{{ object.tenant_group.get_absolute_url }}">{{ object.tenant_group }}</a>
|
|
114
|
+
{% else %}
|
|
115
|
+
{{ None|placeholder }}
|
|
116
|
+
{% endif %}
|
|
117
|
+
</td>
|
|
118
|
+
</tr>
|
|
119
|
+
<tr>
|
|
120
|
+
<th scope="row">Tenant</th>
|
|
121
|
+
<td>
|
|
122
|
+
{% if object.tenant %}
|
|
123
|
+
<a href="{{ object.tenant.get_absolute_url }}">{{ object.tenant }}</a>
|
|
124
|
+
{% else %}
|
|
125
|
+
{{ None|placeholder }}
|
|
126
|
+
{% endif %}
|
|
127
|
+
</td>
|
|
128
|
+
</tr>
|
|
129
|
+
</table>
|
|
130
|
+
</div>
|
|
106
131
|
{% include 'inc/panels/custom_fields.html' %}
|
|
107
132
|
{% include 'inc/panels/tags.html' %}
|
|
108
133
|
{% plugin_left_page object %}
|
|
@@ -4,6 +4,7 @@ import requests_mock
|
|
|
4
4
|
from django.urls import reverse
|
|
5
5
|
from core.models import ObjectType
|
|
6
6
|
from rest_framework import status
|
|
7
|
+
from tenancy.models import Tenant, TenantGroup
|
|
7
8
|
from users.models import ObjectPermission
|
|
8
9
|
from utilities.testing import APIViewTestCases
|
|
9
10
|
from netbox_docker_plugin.models.host import Host
|
|
@@ -41,8 +42,17 @@ class ImageApiTestCase(
|
|
|
41
42
|
|
|
42
43
|
registry = Registry.objects.filter(name="dockerhub")[0]
|
|
43
44
|
|
|
45
|
+
tenant_group = TenantGroup(name="Group 1", slug="group-1")
|
|
46
|
+
tenant_group.save()
|
|
47
|
+
tenant = Tenant.objects.create(
|
|
48
|
+
name="Tenant 1", slug="tenant-1", group=tenant_group
|
|
49
|
+
)
|
|
50
|
+
|
|
44
51
|
Image.objects.create(host=host1, name="image1", registry=registry)
|
|
45
|
-
Image.objects.create(
|
|
52
|
+
Image.objects.create(
|
|
53
|
+
host=host1, name="image2", registry=registry,
|
|
54
|
+
tenant=tenant, tenant_group=tenant_group,
|
|
55
|
+
)
|
|
46
56
|
Image.objects.create(
|
|
47
57
|
host=host2,
|
|
48
58
|
name="image3",
|
|
@@ -60,6 +70,8 @@ class ImageApiTestCase(
|
|
|
60
70
|
"host": host1.pk,
|
|
61
71
|
"name": "image5",
|
|
62
72
|
"registry": registry.pk,
|
|
73
|
+
"tenant": tenant.pk,
|
|
74
|
+
"tenant_group": tenant_group.pk,
|
|
63
75
|
},
|
|
64
76
|
{
|
|
65
77
|
"host": host2.pk,
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""Image filterset tests for tenant and tenant_group filters."""
|
|
2
|
+
|
|
3
|
+
from django.test import TestCase
|
|
4
|
+
|
|
5
|
+
from tenancy.models import Tenant, TenantGroup
|
|
6
|
+
|
|
7
|
+
from netbox_docker_plugin.filtersets import ImageFilterSet
|
|
8
|
+
from netbox_docker_plugin.models.host import Host
|
|
9
|
+
from netbox_docker_plugin.models.image import Image
|
|
10
|
+
from netbox_docker_plugin.models.registry import Registry
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ImageFilterSetTenancyTestCase(TestCase):
|
|
14
|
+
"""Test ImageFilterSet filtering by tenant and tenant_group."""
|
|
15
|
+
|
|
16
|
+
queryset = Image.objects.all()
|
|
17
|
+
filterset = ImageFilterSet
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def setUpTestData(cls):
|
|
21
|
+
host = Host.objects.create(endpoint="http://localhost:8080", name="host1")
|
|
22
|
+
registry = Registry.objects.filter(name="dockerhub")[0]
|
|
23
|
+
|
|
24
|
+
tenant_groups = (
|
|
25
|
+
TenantGroup(name="Tenant Group 1", slug="tenant-group-1"),
|
|
26
|
+
TenantGroup(name="Tenant Group 2", slug="tenant-group-2"),
|
|
27
|
+
TenantGroup(name="Tenant Group 3", slug="tenant-group-3"),
|
|
28
|
+
)
|
|
29
|
+
for tg in tenant_groups:
|
|
30
|
+
tg.save()
|
|
31
|
+
|
|
32
|
+
tenants = (
|
|
33
|
+
Tenant(name="Tenant 1", slug="tenant-1", group=tenant_groups[0]),
|
|
34
|
+
Tenant(name="Tenant 2", slug="tenant-2", group=tenant_groups[1]),
|
|
35
|
+
Tenant(name="Tenant 3", slug="tenant-3", group=tenant_groups[2]),
|
|
36
|
+
)
|
|
37
|
+
Tenant.objects.bulk_create(tenants)
|
|
38
|
+
|
|
39
|
+
unassigned_group = TenantGroup(name="Unassigned Group", slug="unassigned-group")
|
|
40
|
+
unassigned_group.save()
|
|
41
|
+
cls.unassigned_tenant = Tenant.objects.create(
|
|
42
|
+
name="Unassigned Tenant", slug="unassigned-tenant"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
Image.objects.create(
|
|
46
|
+
name="image1", host=host, registry=registry,
|
|
47
|
+
tenant=tenants[0], tenant_group=tenant_groups[0],
|
|
48
|
+
)
|
|
49
|
+
Image.objects.create(
|
|
50
|
+
name="image2", host=host, registry=registry,
|
|
51
|
+
tenant=tenants[1], tenant_group=tenant_groups[1],
|
|
52
|
+
)
|
|
53
|
+
Image.objects.create(
|
|
54
|
+
name="image3", host=host, registry=registry,
|
|
55
|
+
tenant=tenants[2], tenant_group=tenant_groups[2],
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
def test_filter_by_tenant_id(self):
|
|
59
|
+
"""Filter images by one or more tenant IDs."""
|
|
60
|
+
tenants = Tenant.objects.all()[:2]
|
|
61
|
+
params = {"tenant_id": [tenants[0].pk, tenants[1].pk]}
|
|
62
|
+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
63
|
+
|
|
64
|
+
def test_filter_by_single_tenant_id(self):
|
|
65
|
+
"""Filter images by a single tenant ID returns exactly one result."""
|
|
66
|
+
tenant = Tenant.objects.get(slug="tenant-1")
|
|
67
|
+
params = {"tenant_id": [tenant.pk]}
|
|
68
|
+
qs = self.filterset(params, self.queryset).qs
|
|
69
|
+
self.assertEqual(qs.count(), 1)
|
|
70
|
+
self.assertEqual(qs.first().name, "image1")
|
|
71
|
+
|
|
72
|
+
def test_filter_by_tenant_group_id(self):
|
|
73
|
+
"""Filter images by one or more tenant group IDs."""
|
|
74
|
+
groups = TenantGroup.objects.all()[:2]
|
|
75
|
+
params = {"tenant_group_id": [groups[0].pk, groups[1].pk]}
|
|
76
|
+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
77
|
+
|
|
78
|
+
def test_filter_by_single_tenant_group_id(self):
|
|
79
|
+
"""Filter images by a single tenant group ID returns exactly one result."""
|
|
80
|
+
group = TenantGroup.objects.get(slug="tenant-group-2")
|
|
81
|
+
params = {"tenant_group_id": [group.pk]}
|
|
82
|
+
qs = self.filterset(params, self.queryset).qs
|
|
83
|
+
self.assertEqual(qs.count(), 1)
|
|
84
|
+
self.assertEqual(qs.first().name, "image2")
|
|
85
|
+
|
|
86
|
+
def test_filter_no_match(self):
|
|
87
|
+
"""Filtering by a tenant with no images assigned returns an empty queryset."""
|
|
88
|
+
params = {"tenant_id": [self.unassigned_tenant.pk]}
|
|
89
|
+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"""Image ↔ Tenant / TenantGroup relationship tests."""
|
|
2
|
+
|
|
3
|
+
from django.test import TestCase
|
|
4
|
+
|
|
5
|
+
from tenancy.models import Tenant, TenantGroup
|
|
6
|
+
|
|
7
|
+
from netbox_docker_plugin.models.host import Host
|
|
8
|
+
from netbox_docker_plugin.models.image import Image
|
|
9
|
+
from netbox_docker_plugin.models.registry import Registry
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ImageTenancyTestCase(TestCase):
|
|
13
|
+
"""Test the optional FK links between Image, Tenant and TenantGroup."""
|
|
14
|
+
|
|
15
|
+
@classmethod
|
|
16
|
+
def setUpTestData(cls):
|
|
17
|
+
cls.host = Host.objects.create(endpoint="http://localhost:8080", name="host1")
|
|
18
|
+
cls.registry = Registry.objects.filter(name="dockerhub")[0]
|
|
19
|
+
cls.tenant_group = TenantGroup(name="Group 1", slug="group-1")
|
|
20
|
+
cls.tenant_group.save()
|
|
21
|
+
cls.tenant = Tenant.objects.create(
|
|
22
|
+
name="Tenant 1", slug="tenant-1", group=cls.tenant_group
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def test_image_without_tenancy(self):
|
|
26
|
+
"""An Image with no tenant or group is valid."""
|
|
27
|
+
image = Image.objects.create(
|
|
28
|
+
name="img-no-tenant", host=self.host, registry=self.registry
|
|
29
|
+
)
|
|
30
|
+
self.assertIsNone(image.tenant)
|
|
31
|
+
self.assertIsNone(image.tenant_group)
|
|
32
|
+
|
|
33
|
+
def test_image_with_tenant(self):
|
|
34
|
+
"""An Image can be linked to a Tenant."""
|
|
35
|
+
image = Image.objects.create(
|
|
36
|
+
name="img-tenant",
|
|
37
|
+
host=self.host,
|
|
38
|
+
registry=self.registry,
|
|
39
|
+
tenant=self.tenant,
|
|
40
|
+
)
|
|
41
|
+
image.refresh_from_db()
|
|
42
|
+
self.assertEqual(image.tenant, self.tenant)
|
|
43
|
+
|
|
44
|
+
def test_image_with_tenant_group(self):
|
|
45
|
+
"""An Image can be linked to a TenantGroup."""
|
|
46
|
+
image = Image.objects.create(
|
|
47
|
+
name="img-group",
|
|
48
|
+
host=self.host,
|
|
49
|
+
registry=self.registry,
|
|
50
|
+
tenant_group=self.tenant_group,
|
|
51
|
+
)
|
|
52
|
+
image.refresh_from_db()
|
|
53
|
+
self.assertEqual(image.tenant_group, self.tenant_group)
|
|
54
|
+
|
|
55
|
+
def test_image_with_tenant_and_tenant_group(self):
|
|
56
|
+
"""An Image can be linked to both a Tenant and a TenantGroup simultaneously."""
|
|
57
|
+
image = Image.objects.create(
|
|
58
|
+
name="img-both",
|
|
59
|
+
host=self.host,
|
|
60
|
+
registry=self.registry,
|
|
61
|
+
tenant=self.tenant,
|
|
62
|
+
tenant_group=self.tenant_group,
|
|
63
|
+
)
|
|
64
|
+
image.refresh_from_db()
|
|
65
|
+
self.assertEqual(image.tenant, self.tenant)
|
|
66
|
+
self.assertEqual(image.tenant_group, self.tenant_group)
|
|
67
|
+
|
|
68
|
+
def test_set_null_on_tenant_delete(self):
|
|
69
|
+
"""Deleting a Tenant sets the Image.tenant FK to NULL."""
|
|
70
|
+
tenant = Tenant.objects.create(name="Tenant del", slug="tenant-del")
|
|
71
|
+
image = Image.objects.create(
|
|
72
|
+
name="img-tenant-del",
|
|
73
|
+
host=self.host,
|
|
74
|
+
registry=self.registry,
|
|
75
|
+
tenant=tenant,
|
|
76
|
+
)
|
|
77
|
+
tenant.delete()
|
|
78
|
+
image.refresh_from_db()
|
|
79
|
+
self.assertIsNone(image.tenant)
|
|
80
|
+
|
|
81
|
+
def test_set_null_on_tenant_group_delete(self):
|
|
82
|
+
"""Deleting a TenantGroup sets the Image.tenant_group FK to NULL."""
|
|
83
|
+
group = TenantGroup(name="Group del", slug="group-del")
|
|
84
|
+
group.save()
|
|
85
|
+
image = Image.objects.create(
|
|
86
|
+
name="img-group-del",
|
|
87
|
+
host=self.host,
|
|
88
|
+
registry=self.registry,
|
|
89
|
+
tenant_group=group,
|
|
90
|
+
)
|
|
91
|
+
group.delete()
|
|
92
|
+
image.refresh_from_db()
|
|
93
|
+
self.assertIsNone(image.tenant_group)
|
|
94
|
+
|
|
95
|
+
def test_unlink_tenant(self):
|
|
96
|
+
"""Setting tenant to None removes the link without deleting the Tenant."""
|
|
97
|
+
image = Image.objects.create(
|
|
98
|
+
name="img-unlink-tenant",
|
|
99
|
+
host=self.host,
|
|
100
|
+
registry=self.registry,
|
|
101
|
+
tenant=self.tenant,
|
|
102
|
+
)
|
|
103
|
+
image.tenant = None
|
|
104
|
+
image.save()
|
|
105
|
+
image.refresh_from_db()
|
|
106
|
+
self.assertIsNone(image.tenant)
|
|
107
|
+
self.assertTrue(Tenant.objects.filter(pk=self.tenant.pk).exists())
|
|
108
|
+
|
|
109
|
+
def test_unlink_tenant_group(self):
|
|
110
|
+
"""Setting tenant_group to None removes the link without deleting the TenantGroup."""
|
|
111
|
+
image = Image.objects.create(
|
|
112
|
+
name="img-unlink-group",
|
|
113
|
+
host=self.host,
|
|
114
|
+
registry=self.registry,
|
|
115
|
+
tenant_group=self.tenant_group,
|
|
116
|
+
)
|
|
117
|
+
image.tenant_group = None
|
|
118
|
+
image.save()
|
|
119
|
+
image.refresh_from_db()
|
|
120
|
+
self.assertIsNone(image.tenant_group)
|
|
121
|
+
self.assertTrue(TenantGroup.objects.filter(pk=self.tenant_group.pk).exists())
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Image Views Test Case"""
|
|
2
2
|
|
|
3
|
+
from tenancy.models import Tenant, TenantGroup
|
|
3
4
|
from utilities.testing import ViewTestCases
|
|
4
5
|
from netbox_docker_plugin.tests.base import BaseModelViewTestCase
|
|
5
6
|
from netbox_docker_plugin.models.host import Host
|
|
@@ -22,6 +23,12 @@ class ImageViewsTestCase(
|
|
|
22
23
|
|
|
23
24
|
registry = Registry.objects.filter(name="dockerhub")[0]
|
|
24
25
|
|
|
26
|
+
tenant_group = TenantGroup(name="Group 1", slug="group-1")
|
|
27
|
+
tenant_group.save()
|
|
28
|
+
tenant = Tenant.objects.create(
|
|
29
|
+
name="Tenant 1", slug="tenant-1", group=tenant_group
|
|
30
|
+
)
|
|
31
|
+
|
|
25
32
|
image1 = Image.objects.create(name="image1", host=host1, registry=registry)
|
|
26
33
|
image2 = Image.objects.create(name="image2", host=host2, registry=registry)
|
|
27
34
|
image3 = Image.objects.create(name="image3", host=host3, registry=registry)
|
|
@@ -29,9 +36,10 @@ class ImageViewsTestCase(
|
|
|
29
36
|
cls.form_data = {
|
|
30
37
|
"name": "image1",
|
|
31
38
|
"version": "v1.2.3",
|
|
32
|
-
"provider": "github",
|
|
33
39
|
"host": host1.pk,
|
|
34
40
|
"registry": registry.pk,
|
|
41
|
+
"tenant_group": tenant_group.pk,
|
|
42
|
+
"tenant": tenant.pk,
|
|
35
43
|
}
|
|
36
44
|
|
|
37
45
|
cls.csv_data = (
|
|
@@ -41,7 +49,10 @@ class ImageViewsTestCase(
|
|
|
41
49
|
f"image6,v1.2.3,{registry.pk},{host3.pk}",
|
|
42
50
|
)
|
|
43
51
|
|
|
44
|
-
cls.bulk_edit_data = {
|
|
52
|
+
cls.bulk_edit_data = {
|
|
53
|
+
"version": "v1.0.0",
|
|
54
|
+
"tenant": tenant.pk,
|
|
55
|
+
}
|
|
45
56
|
|
|
46
57
|
cls.csv_update_data = (
|
|
47
58
|
"id,version,registry",
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0/netbox_docker_plugin.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: netbox-docker-plugin
|
|
3
|
-
Version: 5.
|
|
3
|
+
Version: 5.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
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin.egg-info/SOURCES.txt
RENAMED
|
@@ -79,6 +79,7 @@ netbox_docker_plugin/migrations/1041_sysctl.py
|
|
|
79
79
|
netbox_docker_plugin/migrations/1042_registry_username_max_length.py
|
|
80
80
|
netbox_docker_plugin/migrations/1043_container_cap_drop_container_extra_hosts_and_more.py
|
|
81
81
|
netbox_docker_plugin/migrations/1044_host_virtual_machine.py
|
|
82
|
+
netbox_docker_plugin/migrations/1045_image_tenant_image_tenant_group.py
|
|
82
83
|
netbox_docker_plugin/migrations/__init__.py
|
|
83
84
|
netbox_docker_plugin/models/__init__.py
|
|
84
85
|
netbox_docker_plugin/models/container.py
|
|
@@ -119,6 +120,8 @@ netbox_docker_plugin/tests/host/test_replace_password.py
|
|
|
119
120
|
netbox_docker_plugin/tests/image/__init__.py
|
|
120
121
|
netbox_docker_plugin/tests/image/test_force_pull_image_with_special_cf.py
|
|
121
122
|
netbox_docker_plugin/tests/image/test_image_api.py
|
|
123
|
+
netbox_docker_plugin/tests/image/test_image_filtersets.py
|
|
124
|
+
netbox_docker_plugin/tests/image/test_image_tenancy.py
|
|
122
125
|
netbox_docker_plugin/tests/image/test_image_views.py
|
|
123
126
|
netbox_docker_plugin/tests/network/__init__.py
|
|
124
127
|
netbox_docker_plugin/tests/network/test_network_api.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/api/__init__.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/api/renderers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/__init__.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/bind.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/container.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/device.py
RENAMED
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/host.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/label.py
RENAMED
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/mount.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/network.py
RENAMED
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/port.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/registry.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/sysctl.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/forms/volume.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/__init__.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/container.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/host.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/network.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/registry.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/models/volume.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/navigation.py
RENAMED
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/template_content.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/templatetags/host.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/__init__.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/tests/test_init.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/utilities/__init__.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/__init__.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/bind.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/container.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/device.py
RENAMED
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/host.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/image.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/label.py
RENAMED
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/mount.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/network.py
RENAMED
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/port.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/registry.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/sysctl.py
RENAMED
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin/views/volume.py
RENAMED
|
File without changes
|
|
File without changes
|
{netbox_docker_plugin-5.2.0 → netbox_docker_plugin-5.3.0}/netbox_docker_plugin.egg-info/requires.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|