diff --git a/netbox_docker_plugin/__init__.py b/netbox_docker_plugin/__init__.py index 41010aa..cb68219 100644 --- a/netbox_docker_plugin/__init__.py +++ b/netbox_docker_plugin/__init__.py @@ -11,7 +11,7 @@ class NetBoxDockerConfig(PluginConfig): name = "netbox_docker_plugin" verbose_name = " NetBox Docker Plugin" description = "Manage Docker" - version = "4.9.0" + version = "4.10.0" base_url = "docker" min_version = "4.3.7" author = "Vincent Simonin , David Delassus " diff --git a/netbox_docker_plugin/forms/bind.py b/netbox_docker_plugin/forms/bind.py index ae65254..379de34 100644 --- a/netbox_docker_plugin/forms/bind.py +++ b/netbox_docker_plugin/forms/bind.py @@ -3,7 +3,6 @@ from django import forms from utilities.forms.fields import ( DynamicModelMultipleChoiceField, - DynamicModelChoiceField, ) from netbox.forms import ( NetBoxModelFilterSetForm, @@ -14,8 +13,11 @@ class BindForm(forms.ModelForm): """Bind form definition class""" - container = DynamicModelChoiceField( - label="Container", queryset=Container.objects.all(), required=True + container = forms.ModelChoiceField( + label="Container", + queryset=Container.objects.all(), + required=True, + widget=forms.HiddenInput, ) class Meta: @@ -29,12 +31,23 @@ class Meta: "read_only", ) labels = { - "container": "Container", "host_path": "Path to mount on host", "container_path": "Mountpoint in container", "read_only": "Mount as read-only within the container", } + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if "data" in kwargs: + container = Container.objects.filter(id=kwargs["data"]["container"]) + elif "initial" in kwargs and "container" in kwargs["initial"]: + container = Container.objects.filter(id=kwargs["initial"]["container"]) + else: + container = Container.objects.filter(id=self.instance.container.id) + + self.instance._meta.verbose_name = f"Bind — {container.first()}" + class BindFilterForm(NetBoxModelFilterSetForm): """Bind filter form definition class""" diff --git a/netbox_docker_plugin/forms/container.py b/netbox_docker_plugin/forms/container.py index dd1ce31..3ff3909 100644 --- a/netbox_docker_plugin/forms/container.py +++ b/netbox_docker_plugin/forms/container.py @@ -67,11 +67,10 @@ class Meta: class ContainerEditForm(NetBoxModelForm): """Container form definition class""" - image = DynamicModelChoiceField( + image = forms.ModelChoiceField( label="Image", queryset=Image.objects.all(), required=True, - query_params={"host_id": "$host"}, ) cap_add = forms.MultipleChoiceField(choices=ContainerCapAddChoices, required=False) @@ -99,6 +98,11 @@ class Meta: "cmd": "Command", } + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.fields["image"].queryset = Image.objects.filter(host=self.instance.host) + class ContainerFilterForm(NetBoxModelFilterSetForm): """Container filter form definition class""" @@ -124,9 +128,7 @@ class ContainerFilterForm(NetBoxModelFilterSetForm): restart_policy = forms.ChoiceField( label="Restart Policy", choices=ContainerRestartPolicyChoices, required=False ) - log_driver = forms.ChoiceField( - label="Logging driver", required=False - ) + log_driver = forms.ChoiceField(label="Logging driver", required=False) tag = TagFilterField(model) diff --git a/netbox_docker_plugin/forms/device.py b/netbox_docker_plugin/forms/device.py index 0d0c542..4ed1f00 100644 --- a/netbox_docker_plugin/forms/device.py +++ b/netbox_docker_plugin/forms/device.py @@ -3,7 +3,6 @@ from django import forms from utilities.forms.fields import ( DynamicModelMultipleChoiceField, - DynamicModelChoiceField, ) from netbox.forms import ( NetBoxModelFilterSetForm, @@ -14,8 +13,11 @@ class DeviceForm(forms.ModelForm): """Device form definition class""" - container = DynamicModelChoiceField( - label="Container", queryset=Container.objects.all(), required=True + container = forms.ModelChoiceField( + label="Container", + queryset=Container.objects.all(), + required=True, + widget=forms.HiddenInput, ) class Meta: @@ -28,11 +30,22 @@ class Meta: "container_path", ) labels = { - "container": "Container", "host_path": "Path to the device on host", "container_path": "Path to the device in container", } + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if "data" in kwargs: + container = Container.objects.filter(id=kwargs["data"]["container"]) + elif "initial" in kwargs and "container" in kwargs["initial"]: + container = Container.objects.filter(id=kwargs["initial"]["container"]) + else: + container = Container.objects.filter(id=self.instance.container.id) + + self.instance._meta.verbose_name = f"Device — {container.first()}" + class DeviceFilterForm(NetBoxModelFilterSetForm): """Device filter form definition class""" diff --git a/netbox_docker_plugin/forms/env.py b/netbox_docker_plugin/forms/env.py index 626c653..768f7b6 100644 --- a/netbox_docker_plugin/forms/env.py +++ b/netbox_docker_plugin/forms/env.py @@ -1,15 +1,17 @@ """Env Form definition""" from django import forms -from utilities.forms.fields import DynamicModelChoiceField from ..models.container import Env, Container class EnvForm(forms.ModelForm): """Env form definition class""" - container = DynamicModelChoiceField( - label="Container", queryset=Container.objects.all(), required=True + container = forms.ModelChoiceField( + label="Container", + queryset=Container.objects.all(), + required=True, + widget=forms.HiddenInput, ) class Meta: @@ -22,7 +24,18 @@ class Meta: "value", ) labels = { - "container": "Container", "var_name": "Variable Name", "value": "Value", } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if "data" in kwargs: + container = Container.objects.filter(id=kwargs["data"]["container"]) + elif "initial" in kwargs and "container" in kwargs["initial"]: + container = Container.objects.filter(id=kwargs["initial"]["container"]) + else: + container = Container.objects.filter(id=self.instance.container.id) + + self.instance._meta.verbose_name = f"Environment variable — {container.first()}" diff --git a/netbox_docker_plugin/forms/label.py b/netbox_docker_plugin/forms/label.py index cd1f307..bb938e6 100644 --- a/netbox_docker_plugin/forms/label.py +++ b/netbox_docker_plugin/forms/label.py @@ -1,15 +1,17 @@ """Label Form definition""" from django import forms -from utilities.forms.fields import DynamicModelChoiceField from ..models.container import Label, Container class LabelForm(forms.ModelForm): """Label form definition class""" - container = DynamicModelChoiceField( - label="Container", queryset=Container.objects.all(), required=True + container = forms.ModelChoiceField( + label="Container", + queryset=Container.objects.all(), + required=True, + widget=forms.HiddenInput, ) class Meta: @@ -22,7 +24,18 @@ class Meta: "value", ) labels = { - "container": "Container", "key": "Key", "value": "Value", } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if "data" in kwargs: + container = Container.objects.filter(id=kwargs["data"]["container"]) + elif "initial" in kwargs and "container" in kwargs["initial"]: + container = Container.objects.filter(id=kwargs["initial"]["container"]) + else: + container = Container.objects.filter(id=self.instance.container.id) + + self.instance._meta.verbose_name = f"Label — {container.first()}" diff --git a/netbox_docker_plugin/forms/log_driver_option.py b/netbox_docker_plugin/forms/log_driver_option.py index a575be4..ad35e3b 100644 --- a/netbox_docker_plugin/forms/log_driver_option.py +++ b/netbox_docker_plugin/forms/log_driver_option.py @@ -1,15 +1,17 @@ """Log Driver option Form definition""" from django import forms -from utilities.forms.fields import DynamicModelChoiceField from ..models.container import LogDriverOption, Container class LogDriverOptionForm(forms.ModelForm): """Log Driver option form definition class""" - container = DynamicModelChoiceField( - label="Container", queryset=Container.objects.all(), required=True + container = forms.ModelChoiceField( + label="Container", + queryset=Container.objects.all(), + required=True, + widget=forms.HiddenInput, ) class Meta: @@ -22,7 +24,18 @@ class Meta: "value", ) labels = { - "container": "Container", "option_name": "Option Name", "value": "Value", } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if "data" in kwargs: + container = Container.objects.filter(id=kwargs["data"]["container"]) + elif "initial" in kwargs and "container" in kwargs["initial"]: + container = Container.objects.filter(id=kwargs["initial"]["container"]) + else: + container = Container.objects.filter(id=self.instance.container.id) + + self.instance._meta.verbose_name = f"Log driver option — {container.first()}" diff --git a/netbox_docker_plugin/forms/mount.py b/netbox_docker_plugin/forms/mount.py index f28c380..15809c9 100644 --- a/netbox_docker_plugin/forms/mount.py +++ b/netbox_docker_plugin/forms/mount.py @@ -3,7 +3,6 @@ from django import forms from utilities.forms.fields import ( DynamicModelMultipleChoiceField, - DynamicModelChoiceField, ) from netbox.forms import ( NetBoxModelFilterSetForm, @@ -15,10 +14,13 @@ class MountForm(forms.ModelForm): """Mount form definition class""" - container = DynamicModelChoiceField( - label="Container", queryset=Container.objects.all(), required=True + container = forms.ModelChoiceField( + label="Container", + queryset=Container.objects.all(), + required=True, + widget=forms.HiddenInput, ) - volume = DynamicModelChoiceField( + volume = forms.ModelChoiceField( label="Volume", queryset=Volume.objects.all(), required=True ) @@ -33,12 +35,27 @@ class Meta: "read_only", ) labels = { - "container": "Container", "source": "Source directory", "volume": "Volume", "read_only": "Mount as read-only within the container", } + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if "data" in kwargs: + container = Container.objects.filter(id=kwargs["data"]["container"]) + elif "initial" in kwargs and "container" in kwargs["initial"]: + container = Container.objects.filter(id=kwargs["initial"]["container"]) + else: + container = Container.objects.filter(id=self.instance.container.id) + + self.fields["volume"].queryset = Volume.objects.filter( + host=container.first().host + ) + + self.instance._meta.verbose_name = f"Mount — {container.first()}" + class MountFilterForm(NetBoxModelFilterSetForm): """Mount filter form definition class""" diff --git a/netbox_docker_plugin/forms/network_setting.py b/netbox_docker_plugin/forms/network_setting.py index 56a820c..ae7f32e 100644 --- a/netbox_docker_plugin/forms/network_setting.py +++ b/netbox_docker_plugin/forms/network_setting.py @@ -3,7 +3,6 @@ from django import forms from utilities.forms.fields import ( DynamicModelMultipleChoiceField, - DynamicModelChoiceField, ) from netbox.forms import ( NetBoxModelFilterSetForm, @@ -15,10 +14,13 @@ class NetworkSettingForm(forms.ModelForm): """NetworkSetting form definition class""" - container = DynamicModelChoiceField( - label="Container", queryset=Container.objects.all(), required=True + container = forms.ModelChoiceField( + label="Container", + queryset=Container.objects.all(), + required=True, + widget=forms.HiddenInput, ) - network = DynamicModelChoiceField( + network = forms.ModelChoiceField( label="Network", queryset=Network.objects.all(), required=True ) @@ -26,15 +28,28 @@ class Meta: """NetworkSetting form definition Meta class""" model = NetworkSetting - fields = ( - "container", - "network" - ) + fields = ("container", "network") labels = { - "container": "Container", "network": "Network", } + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if "data" in kwargs: + container = Container.objects.filter(id=kwargs["data"]["container"]) + elif "initial" in kwargs and "container" in kwargs["initial"]: + container = Container.objects.filter(id=kwargs["initial"]["container"]) + else: + container = Container.objects.filter(id=self.instance.container.id) + + self.fields["network"].queryset = Network.objects.filter( + host=container.first().host + ) + + self.instance._meta.verbose_name = f"Network setting — {container.first()}" + + class NetworkSettingFilterForm(NetBoxModelFilterSetForm): """Mount filter form definition class""" diff --git a/netbox_docker_plugin/forms/port.py b/netbox_docker_plugin/forms/port.py index aefcbf2..0e36a49 100644 --- a/netbox_docker_plugin/forms/port.py +++ b/netbox_docker_plugin/forms/port.py @@ -1,15 +1,17 @@ """Port Form definition""" from django import forms -from utilities.forms.fields import DynamicModelChoiceField from ..models.container import Port, Container class PortForm(forms.ModelForm): """Port form definition class""" - container = DynamicModelChoiceField( - label="Container", queryset=Container.objects.all(), required=True + container = forms.ModelChoiceField( + label="Container", + queryset=Container.objects.all(), + required=True, + widget=forms.HiddenInput, ) class Meta: @@ -23,8 +25,19 @@ class Meta: "type", ) labels = { - "container": "Container", "public_port": "Public Port", "private_port": "Private Port", "type": "Type", } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if "data" in kwargs: + container = Container.objects.filter(id=kwargs["data"]["container"]) + elif "initial" in kwargs and "container" in kwargs["initial"]: + container = Container.objects.filter(id=kwargs["initial"]["container"]) + else: + container = Container.objects.filter(id=self.instance.container.id) + + self.instance._meta.verbose_name = f"Port mapping — {container.first()}" diff --git a/netbox_docker_plugin/forms/sysctl.py b/netbox_docker_plugin/forms/sysctl.py index 2c3edbb..819472c 100644 --- a/netbox_docker_plugin/forms/sysctl.py +++ b/netbox_docker_plugin/forms/sysctl.py @@ -1,15 +1,17 @@ """Sysctl Form definition""" from django import forms -from utilities.forms.fields import DynamicModelChoiceField from ..models.container import Sysctl, Container class SysctlForm(forms.ModelForm): """Sysctl form definition class""" - container = DynamicModelChoiceField( - label="Container", queryset=Container.objects.all(), required=True + container = forms.ModelChoiceField( + label="Container", + queryset=Container.objects.all(), + required=True, + widget=forms.HiddenInput, ) class Meta: @@ -22,7 +24,18 @@ class Meta: "value", ) labels = { - "container": "Container", - "key": "Key", + "key": " Sysctl Key", "value": "Value", } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if "data" in kwargs: + container = Container.objects.filter(id=kwargs["data"]["container"]) + elif "initial" in kwargs and "container" in kwargs["initial"]: + container = Container.objects.filter(id=kwargs["initial"]["container"]) + else: + container = Container.objects.filter(id=self.instance.container.id) + + self.instance._meta.verbose_name = f"Sysctl — {container.first()}" diff --git a/netbox_docker_plugin/tables.py b/netbox_docker_plugin/tables.py index b421da6..509a99f 100644 --- a/netbox_docker_plugin/tables.py +++ b/netbox_docker_plugin/tables.py @@ -84,6 +84,7 @@ class Meta(NetBoxTable.Meta): class RegistryTable(NetBoxTable): """Registry Table definition class""" + host = tables.Column(linkify=True) name = tables.Column(linkify=True) image_count = columns.LinkedCountColumn( viewname="plugins:netbox_docker_plugin:image_list", @@ -99,6 +100,7 @@ class Meta(NetBoxTable.Meta): fields = ( "pk", "id", + "host", "name", "serveraddress", "username", @@ -107,12 +109,33 @@ class Meta(NetBoxTable.Meta): "tags", ) default_columns = ( + "host", "name", "serveraddress", "image_count", ) +class MinRegistryTable(NetBoxTable): + """Registry Table definition class""" + + name = tables.Column(linkify=True) + image_count = columns.LinkedCountColumn( + viewname="plugins:netbox_docker_plugin:image_list", + url_params={"registry_id": "pk"}, + verbose_name="Images count", + ) + + class Meta(NetBoxTable.Meta): + """Registry Table definition Meta class""" + + model = Registry + fields = ( + "name", + "image_count", + ) + + class ImageTable(NetBoxTable): """Image Table definition class""" @@ -147,11 +170,40 @@ class Meta(NetBoxTable.Meta): "tags", ) default_columns = ( + "host", "name", "version", "registry", "size", - "host", + "container_count", + ) + + +class MinImageTable(NetBoxTable): + """Image Table definition class""" + + registry = tables.Column(linkify=True) + name = tables.Column(linkify=True) + container_count = columns.LinkedCountColumn( + viewname="plugins:netbox_docker_plugin:container_list", + url_params={"image_id": "pk"}, + verbose_name="Used by (containers)", + ) + + def render_size(self, value): + """Render the image size with unity""" + return f"{value} MB" + + class Meta(NetBoxTable.Meta): + """Image Table definition Meta class""" + + model = Image + fields = ( + "name", + "version", + "registry", + "size", + "ImageID", "container_count", ) @@ -187,10 +239,36 @@ class Meta(NetBoxTable.Meta): "tags", ) default_columns = ( + "host", + "name", + "max_size", + "driver", + "mount_count", + ) + + +class MinVolumeTable(NetBoxTable): + """Volume Table definition class""" + + name = tables.Column(linkify=True) + mount_count = columns.LinkedCountColumn( + viewname="plugins:netbox_docker_plugin:mount_list", + url_params={"volume_id": "pk"}, + verbose_name="Used by (mounts)", + ) + + def render_max_size(self, value): + """Render the volume max size with unity""" + return f"{value} MB" + + class Meta(NetBoxTable.Meta): + """Volume Table definition Meta class""" + + model = Volume + fields = ( "name", "max_size", "driver", - "host", "mount_count", ) @@ -222,12 +300,35 @@ class Meta(NetBoxTable.Meta): "networksetting_count", "tags", ) - default_columns = ("name", "driver", "state", "host", "networksetting_count") + default_columns = ("host", "name", "driver", "state", "networksetting_count") -class ContainerTable(NetBoxTable): +class MinNetworkTable(NetBoxTable): """Network Table definition class""" + name = tables.Column(linkify=True) + networksetting_count = columns.LinkedCountColumn( + viewname="plugins:netbox_docker_plugin:networksetting_list", + url_params={"network_id": "pk"}, + verbose_name="Used by (network settings)", + ) + + class Meta(NetBoxTable.Meta): + """Network Table definition Meta class""" + + model = Network + fields = ( + "name", + "driver", + "NetworkID", + "state", + "networksetting_count", + ) + + +class ContainerTable(NetBoxTable): + """Container Table definition class""" + host = tables.Column(linkify=True) image = tables.Column(linkify=True) name = tables.Column(linkify=True) @@ -295,8 +396,66 @@ class Meta(NetBoxTable.Meta): "tags", ) default_columns = ( - "name", "host", + "name", + "image", + "state", + "port_count", + "mount_count", + "bind_count", + "networksetting_count", + "env_count", + "label_count", + ) + + +class MinContainerTable(NetBoxTable): + """Container Table definition class""" + + image = tables.Column(linkify=True) + name = tables.Column(linkify=True) + port_count = columns.LinkedCountColumn( + viewname="plugins:netbox_docker_plugin:port_list", + url_params={"container_id": "pk"}, + verbose_name="Ports count", + ) + mount_count = columns.LinkedCountColumn( + viewname="plugins:netbox_docker_plugin:mount_list", + url_params={"container_id": "pk"}, + verbose_name="Mounts count", + ) + bind_count = columns.LinkedCountColumn( + viewname="plugins:netbox_docker_plugin:bind_list", + url_params={"container_id": "pk"}, + verbose_name="Binds count", + ) + networksetting_count = columns.LinkedCountColumn( + viewname="plugins:netbox_docker_plugin:networksetting_list", + url_params={"container_id": "pk"}, + verbose_name="Network Settings count", + ) + env_count = columns.LinkedCountColumn( + viewname="plugins:netbox_docker_plugin:env_list", + url_params={"container_id": "pk"}, + verbose_name="Env variables count", + ) + label_count = columns.LinkedCountColumn( + viewname="plugins:netbox_docker_plugin:label_list", + url_params={"container_id": "pk"}, + verbose_name="Labels count", + ) + device_count = columns.LinkedCountColumn( + viewname="plugins:netbox_docker_plugin:device_list", + url_params={"container_id": "pk"}, + verbose_name="Devices count", + ) + + class Meta(NetBoxTable.Meta): + """Container Table definition Meta class""" + + model = Container + fields = ( + "name", "image", "state", "port_count", @@ -320,7 +479,7 @@ class Meta(NetBoxTable.Meta): model = Env fields = ("container", "var_name", "value") - default_columns = ("container", "var_name", "value") + default_columns = ("var_name", "value") class LogDriverOptionTable(NetBoxTable): @@ -335,7 +494,7 @@ class Meta(NetBoxTable.Meta): model = LogDriverOption fields = ("container", "option_name", "value") - default_columns = ("container", "option_name", "value") + default_columns = ("option_name", "value") class LabelTable(NetBoxTable): @@ -350,7 +509,7 @@ class Meta(NetBoxTable.Meta): model = Label fields = ("container", "key", "value") - default_columns = ("container", "key", "value") + default_columns = ("key", "value") class PortTable(NetBoxTable): @@ -365,7 +524,7 @@ class Meta(NetBoxTable.Meta): model = Port fields = ("container", "public_port", "private_port", "type") - default_columns = ("container", "public_port", "private_port", "type") + default_columns = ("public_port", "private_port", "type") class MountTable(NetBoxTable): @@ -387,7 +546,6 @@ class Meta(NetBoxTable.Meta): "read_only", ) default_columns = ( - "container", "source", "volume", "read_only", @@ -412,7 +570,6 @@ class Meta(NetBoxTable.Meta): "read_only", ) default_columns = ( - "container", "host_path", "container_path", "read_only", @@ -435,10 +592,7 @@ class Meta(NetBoxTable.Meta): "container", "network", ) - default_columns = ( - "container", - "network", - ) + default_columns = ("network",) class DeviceTable(NetBoxTable): @@ -458,7 +612,6 @@ class Meta(NetBoxTable.Meta): "container_path", ) default_columns = ( - "container", "host_path", "container_path", ) @@ -476,4 +629,4 @@ class Meta(NetBoxTable.Meta): model = Sysctl fields = ("container", "key", "value") - default_columns = ("container", "key", "value") + default_columns = ("key", "value") diff --git a/netbox_docker_plugin/templates/netbox_docker_plugin/host.html b/netbox_docker_plugin/templates/netbox_docker_plugin/host.html index 5097851..244ae0d 100644 --- a/netbox_docker_plugin/templates/netbox_docker_plugin/host.html +++ b/netbox_docker_plugin/templates/netbox_docker_plugin/host.html @@ -52,40 +52,38 @@

Host

{% include 'inc/panels/related_objects.html' with filter_name='host_id' %} {% plugin_right_page object %} -
- -
-

- Registry + Registries {% if perms.netbox_docker_plugin.add_container %} - + {% endif %}

- {% htmx_table 'plugins:netbox_docker_plugin:registry_list' host_id=object.pk %} + {% htmx_table 'plugins:netbox_docker_plugin:min_registry_list' host_id=object.pk %}
{% plugin_full_width_page object %}
+
+

- Container + Containers {% if perms.netbox_docker_plugin.add_container %} - + {% endif %}

- {% htmx_table 'plugins:netbox_docker_plugin:container_list' host_id=object.pk %} + {% htmx_table 'plugins:netbox_docker_plugin:min_container_list' host_id=object.pk %}
{% plugin_full_width_page object %}
@@ -94,15 +92,15 @@

Images {% if perms.netbox_docker_plugin.add_image %} - + {% endif %}

- {% htmx_table 'plugins:netbox_docker_plugin:image_list' host_id=object.pk %} + {% htmx_table 'plugins:netbox_docker_plugin:min_image_list' host_id=object.pk %}
{% plugin_full_width_page object %} @@ -111,15 +109,15 @@

Volumes {% if perms.netbox_docker_plugin.add_volume %} - + {% endif %}

- {% htmx_table 'plugins:netbox_docker_plugin:volume_list' host_id=object.pk %} + {% htmx_table 'plugins:netbox_docker_plugin:min_volume_list' host_id=object.pk %} {% plugin_full_width_page object %} @@ -128,15 +126,15 @@

Networks {% if perms.netbox_docker_plugin.add_network %} - + {% endif %}

- {% htmx_table 'plugins:netbox_docker_plugin:network_list' host_id=object.pk %} + {% htmx_table 'plugins:netbox_docker_plugin:min_network_list' host_id=object.pk %} {% plugin_full_width_page object %} diff --git a/netbox_docker_plugin/urls.py b/netbox_docker_plugin/urls.py index 4eaf0cc..3475560 100644 --- a/netbox_docker_plugin/urls.py +++ b/netbox_docker_plugin/urls.py @@ -72,6 +72,11 @@ ), # Image path("images/", image_views.ImageListView.as_view(), name="image_list"), + path( + "min-images/", + image_views.MinImageListView.as_view(), + name="min_image_list", + ), path("images/add/", image_views.ImageEditView.as_view(), name="image_add"), path( "images/import/", @@ -109,6 +114,11 @@ ), # Volume path("volumes/", volume_views.VolumeListView.as_view(), name="volume_list"), + path( + "min-volumes/", + volume_views.MinVolumeListView.as_view(), + name="min_volume_list", + ), path("volumes/add/", volume_views.VolumeEditView.as_view(), name="volume_add"), path( "volumes/import/", @@ -145,6 +155,11 @@ ), # Network path("networks/", network_views.NetworkListView.as_view(), name="network_list"), + path( + "min-networks/", + network_views.MinNetworkListView.as_view(), + name="min_network_list", + ), path("networks/add/", network_views.NetworkEditView.as_view(), name="network_add"), path( "networks/import/", @@ -190,6 +205,11 @@ container_views.ContainerListView.as_view(), name="container_list", ), + path( + "min-containers/", + container_views.MinContainerListView.as_view(), + name="min_container_list", + ), path( "containers/add/", container_views.ContainerNewView.as_view(), @@ -405,6 +425,11 @@ registry_views.RegistryListView.as_view(), name="registry_list", ), + path( + "min-registries/", + registry_views.MinRegistryListView.as_view(), + name="min_registry_list", + ), path( "registries/add/", registry_views.RegistryEditView.as_view(), diff --git a/netbox_docker_plugin/views/container.py b/netbox_docker_plugin/views/container.py index 0bb6ced..3c48406 100644 --- a/netbox_docker_plugin/views/container.py +++ b/netbox_docker_plugin/views/container.py @@ -84,6 +84,23 @@ class ContainerListView(generic.ObjectListView): filterset_form = container.ContainerFilterForm +class MinContainerListView(generic.ObjectListView): + """Container list view definition""" + + queryset = Container.objects.annotate( + port_count=count_related(Port, "container"), + mount_count=count_related(Mount, "container"), + bind_count=count_related(Bind, "container"), + networksetting_count=count_related(NetworkSetting, "container"), + env_count=count_related(Env, "container"), + label_count=count_related(Label, "container"), + device_count=count_related(Device, "container"), + ) + + table = tables.MinContainerTable + filterset = filtersets.ContainerFilterSet + + class ContainerBulkImportView(generic.BulkImportView): """Container bulk import view definition""" diff --git a/netbox_docker_plugin/views/image.py b/netbox_docker_plugin/views/image.py index 44a3587..58dac52 100644 --- a/netbox_docker_plugin/views/image.py +++ b/netbox_docker_plugin/views/image.py @@ -25,6 +25,16 @@ class ImageListView(generic.ObjectListView): filterset_form = image.ImageFilterForm +class MinImageListView(generic.ObjectListView): + """Image list view definition""" + + queryset = Image.objects.annotate( + container_count=count_related(Container, "image"), + ) + table = tables.MinImageTable + filterset = filtersets.ImageFilterSet + + class ImageEditView(generic.ObjectEditView): """Image edition view definition""" diff --git a/netbox_docker_plugin/views/network.py b/netbox_docker_plugin/views/network.py index 427d9eb..63cedeb 100644 --- a/netbox_docker_plugin/views/network.py +++ b/netbox_docker_plugin/views/network.py @@ -7,6 +7,7 @@ from ..models.network import Network from ..models.container import NetworkSetting + class NetworkView(generic.ObjectView): """Network view definition""" @@ -24,6 +25,16 @@ class NetworkListView(generic.ObjectListView): filterset_form = network.NetworkFilterForm +class MinNetworkListView(generic.ObjectListView): + """Network list view definition""" + + queryset = Network.objects.annotate( + networksetting_count=count_related(NetworkSetting, "network"), + ) + table = tables.MinNetworkTable + filterset = filtersets.NetworkFilterSet + + class NetworkEditView(generic.ObjectEditView): """Network edition view definition""" diff --git a/netbox_docker_plugin/views/registry.py b/netbox_docker_plugin/views/registry.py index e32cf4f..d6c6c1b 100644 --- a/netbox_docker_plugin/views/registry.py +++ b/netbox_docker_plugin/views/registry.py @@ -36,6 +36,16 @@ class RegistryListView(generic.ObjectListView): filterset_form = registry.RegistryFilterForm +class MinRegistryListView(generic.ObjectListView): + """Registry list view definition""" + + queryset = Registry.objects.annotate( + image_count=count_related(Image, "registry"), + ) + table = tables.MinRegistryTable + filterset = filtersets.RegistryFilterSet + + class RegistryEditView(generic.ObjectEditView): """Registry edition view definition""" diff --git a/netbox_docker_plugin/views/volume.py b/netbox_docker_plugin/views/volume.py index 22fee80..f2afbfd 100644 --- a/netbox_docker_plugin/views/volume.py +++ b/netbox_docker_plugin/views/volume.py @@ -32,6 +32,16 @@ class VolumeListView(generic.ObjectListView): filterset_form = volume.VolumeFilterForm +class MinVolumeListView(generic.ObjectListView): + """Volume list view definition""" + + queryset = Volume.objects.annotate( + mount_count=count_related(Mount, "volume"), + ) + table = tables.MinVolumeTable + filterset = filtersets.VolumeFilterSet + + class VolumeBulkImportView(generic.BulkImportView): """Volume bulk import view definition""" diff --git a/pyproject.toml b/pyproject.toml index 051ab93..1772dfd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "netbox-docker-plugin" -version = "4.9.0" +version = "4.10.0" authors = [ { name="Vincent Simonin", email="vincent@saashup.com" }, { name="David Delassus", email="david.jose.delassus@gmail.com" }