From d349bd81b63330547f0e702892623fc5121b6579 Mon Sep 17 00:00:00 2001 From: MENDEZ Diego Date: Mon, 29 Jun 2026 06:49:21 +0000 Subject: [PATCH 1/4] Migration patch for version 2.10.0 --- .../migrations/0034_fix_migration.py | 39 ++++++++++ .../migrations/0034_volume_max_size.py | 24 +++++++ ...35_container_log_driver_logdriveroption.py | 71 +++++++++++++++++++ 3 files changed, 134 insertions(+) create mode 100644 netbox_docker_plugin/migrations/0034_fix_migration.py create mode 100644 netbox_docker_plugin/migrations/0034_volume_max_size.py create mode 100644 netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py diff --git a/netbox_docker_plugin/migrations/0034_fix_migration.py b/netbox_docker_plugin/migrations/0034_fix_migration.py new file mode 100644 index 0000000..b72f09f --- /dev/null +++ b/netbox_docker_plugin/migrations/0034_fix_migration.py @@ -0,0 +1,39 @@ +# pylint: disable=C0103 +"""Reverse migration for log_driver and LogDriverOption only""" + +from django.db import migrations + + +class Migration(migrations.Migration): + """Reverse migration (partial)""" + + dependencies = [ + ("netbox_docker_plugin", "0034_container_log_driver_alter_container_containerid_and_more"), + ] + + operations = [ + migrations.RunSQL( + sql=""" +DROP INDEX IF EXISTS public.netbox_docker_plugin_logdriveroption_unique_option_name_contain; +DROP INDEX IF EXISTS public.netbox_docker_plugin_logdriveroption_container_id_929d4dfe; +DROP TABLE IF EXISTS public.netbox_docker_plugin_logdriveroption; + """, + state_operations=[ + migrations.DeleteModel( + name="LogDriverOption", + ), + ], + ), + migrations.RunSQL( + sql=""" +ALTER TABLE netbox_docker_plugin_container +DROP COLUMN IF EXISTS log_driver; + """, + state_operations=[ + migrations.RemoveField( + model_name="container", + name="log_driver", + ), + ], + ), + ] diff --git a/netbox_docker_plugin/migrations/0034_volume_max_size.py b/netbox_docker_plugin/migrations/0034_volume_max_size.py new file mode 100644 index 0000000..e831949 --- /dev/null +++ b/netbox_docker_plugin/migrations/0034_volume_max_size.py @@ -0,0 +1,24 @@ +# pylint: disable=C0103 +"""Migration file""" + +from django.db import migrations, models + + +class Migration(migrations.Migration): + """Migration file""" + + dependencies = [ + ("netbox_docker_plugin", "0034_fix_migration"), + ] + + operations = [ + migrations.AddField( + model_name="volume", + name="max_size", + field=models.PositiveIntegerField( + null=True, + blank=True, + default=None, + ), + ), + ] diff --git a/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py b/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py new file mode 100644 index 0000000..03a84ff --- /dev/null +++ b/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py @@ -0,0 +1,71 @@ +# pylint: disable=C0103 +"""Migration file""" + +import django.core.validators +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + """Migration file""" + + dependencies = [ + ("netbox_docker_plugin", "0034_volume_max_size"), + ] + + operations = [ + migrations.AddField( + model_name="container", + name="log_driver", + field=models.CharField(default="json-log", max_length=32), + ), + migrations.CreateModel( + name="LogDriverOption", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, primary_key=True, serialize=False + ), + ), + ( + "option_name", + models.CharField( + max_length=255, + validators=[ + django.core.validators.MinLengthValidator(limit_value=1), + django.core.validators.MaxLengthValidator(limit_value=255), + ], + ), + ), + ( + "value", + models.CharField( + blank=True, + max_length=4096, + validators=[ + django.core.validators.MaxLengthValidator(limit_value=4096) + ], + ), + ), + ( + "container", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="log_driver_options", + to="netbox_docker_plugin.container", + ), + ), + ], + options={ + "ordering": ("container", "option_name"), + "constraints": [ + models.UniqueConstraint( + models.F("option_name"), + models.F("container"), + name="netbox_docker_plugin_logdriveroption_unique_option_name_container'", + ) + ], + }, + ), + ] From c92715635104a315d4ee549a43d6be4b73f23a9d Mon Sep 17 00:00:00 2001 From: MENDEZ Diego Date: Mon, 29 Jun 2026 10:13:27 +0000 Subject: [PATCH 2/4] Alternative migration fix --- .../migrations/0034_fix_migration.py | 39 -------------- .../migrations/0034_volume_max_size.py | 2 +- ...35_container_log_driver_logdriveroption.py | 54 ------------------- 3 files changed, 1 insertion(+), 94 deletions(-) delete mode 100644 netbox_docker_plugin/migrations/0034_fix_migration.py diff --git a/netbox_docker_plugin/migrations/0034_fix_migration.py b/netbox_docker_plugin/migrations/0034_fix_migration.py deleted file mode 100644 index b72f09f..0000000 --- a/netbox_docker_plugin/migrations/0034_fix_migration.py +++ /dev/null @@ -1,39 +0,0 @@ -# pylint: disable=C0103 -"""Reverse migration for log_driver and LogDriverOption only""" - -from django.db import migrations - - -class Migration(migrations.Migration): - """Reverse migration (partial)""" - - dependencies = [ - ("netbox_docker_plugin", "0034_container_log_driver_alter_container_containerid_and_more"), - ] - - operations = [ - migrations.RunSQL( - sql=""" -DROP INDEX IF EXISTS public.netbox_docker_plugin_logdriveroption_unique_option_name_contain; -DROP INDEX IF EXISTS public.netbox_docker_plugin_logdriveroption_container_id_929d4dfe; -DROP TABLE IF EXISTS public.netbox_docker_plugin_logdriveroption; - """, - state_operations=[ - migrations.DeleteModel( - name="LogDriverOption", - ), - ], - ), - migrations.RunSQL( - sql=""" -ALTER TABLE netbox_docker_plugin_container -DROP COLUMN IF EXISTS log_driver; - """, - state_operations=[ - migrations.RemoveField( - model_name="container", - name="log_driver", - ), - ], - ), - ] diff --git a/netbox_docker_plugin/migrations/0034_volume_max_size.py b/netbox_docker_plugin/migrations/0034_volume_max_size.py index e831949..709853a 100644 --- a/netbox_docker_plugin/migrations/0034_volume_max_size.py +++ b/netbox_docker_plugin/migrations/0034_volume_max_size.py @@ -8,7 +8,7 @@ class Migration(migrations.Migration): """Migration file""" dependencies = [ - ("netbox_docker_plugin", "0034_fix_migration"), + ("netbox_docker_plugin", "0034_container_log_driver_alter_container_containerid_and_more"), ] operations = [ diff --git a/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py b/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py index 03a84ff..da3dd60 100644 --- a/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py +++ b/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py @@ -14,58 +14,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.AddField( - model_name="container", - name="log_driver", - field=models.CharField(default="json-log", max_length=32), - ), - migrations.CreateModel( - name="LogDriverOption", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, primary_key=True, serialize=False - ), - ), - ( - "option_name", - models.CharField( - max_length=255, - validators=[ - django.core.validators.MinLengthValidator(limit_value=1), - django.core.validators.MaxLengthValidator(limit_value=255), - ], - ), - ), - ( - "value", - models.CharField( - blank=True, - max_length=4096, - validators=[ - django.core.validators.MaxLengthValidator(limit_value=4096) - ], - ), - ), - ( - "container", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="log_driver_options", - to="netbox_docker_plugin.container", - ), - ), - ], - options={ - "ordering": ("container", "option_name"), - "constraints": [ - models.UniqueConstraint( - models.F("option_name"), - models.F("container"), - name="netbox_docker_plugin_logdriveroption_unique_option_name_container'", - ) - ], - }, - ), ] From c8f59c91d00ada3eaec54701b5818831c6d47671 Mon Sep 17 00:00:00 2001 From: MENDEZ Diego Date: Fri, 3 Jul 2026 13:00:23 +0000 Subject: [PATCH 3/4] Implemented conditionals to solution --- ...35_container_log_driver_logdriveroption.py | 112 +++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-) diff --git a/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py b/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py index da3dd60..76f6f34 100644 --- a/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py +++ b/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py @@ -3,7 +3,56 @@ import django.core.validators import django.db.models.deletion -from django.db import migrations, models +from django.db import migrations, models, connection + + +def apply_database_changes(apps, schema_editor): + table_container = "netbox_docker_plugin_container" + table_logdriveroption = "netbox_docker_plugin_logdriveroption" + index_name = "netbox_docker_plugin_logdriveroption_container_id_option_name_uniq" + + with connection.cursor() as cursor: + existing_tables = connection.introspection.table_names(cursor) + + if table_container in existing_tables: + columns = { + col.name + for col in connection.introspection.get_table_description( + cursor, table_container + ) + } + if "log_driver" not in columns: + cursor.execute( + f"ALTER TABLE {table_container} " + "ADD COLUMN log_driver varchar(32) NOT NULL DEFAULT 'json-log'" + ) + + if table_logdriveroption not in existing_tables: + cursor.execute( + f""" + CREATE TABLE {table_logdriveroption} ( + id bigserial PRIMARY KEY, + option_name varchar(255) NOT NULL, + value varchar(4096) NOT NULL DEFAULT '', + container_id bigint NOT NULL + REFERENCES {table_container}(id) + ON DELETE CASCADE + ) + """ + ) + + constraints = ( + connection.introspection.get_constraints(cursor, table_logdriveroption) + if table_logdriveroption in connection.introspection.table_names(cursor) + else {} + ) + if index_name not in constraints: + cursor.execute( + f""" + CREATE UNIQUE INDEX {index_name} + ON {table_logdriveroption} (container_id, option_name) + """ + ) class Migration(migrations.Migration): @@ -14,4 +63,65 @@ class Migration(migrations.Migration): ] operations = [ + migrations.SeparateDatabaseAndState( + database_operations=[ + migrations.RunPython(apply_database_changes, migrations.RunPython.noop), + ], + state_operations=[ + migrations.AddField( + model_name="container", + name="log_driver", + field=models.CharField(default="json-log", max_length=32), + ), + migrations.CreateModel( + name="LogDriverOption", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, primary_key=True, serialize=False + ), + ), + ( + "option_name", + models.CharField( + max_length=255, + validators=[ + django.core.validators.MinLengthValidator(limit_value=1), + django.core.validators.MaxLengthValidator(limit_value=255), + ], + ), + ), + ( + "value", + models.CharField( + blank=True, + max_length=4096, + validators=[ + django.core.validators.MaxLengthValidator(limit_value=4096) + ], + ), + ), + ( + "container", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="log_driver_options", + to="netbox_docker_plugin.container", + ), + ), + ], + options={ + "ordering": ("container", "option_name"), + }, + ), + migrations.AddConstraint( + model_name="logdriveroption", + constraint=models.UniqueConstraint( + fields=("option_name", "container"), + name="netbox_docker_plugin_logdriveroption_unique_option_name_container", + ), + ), + ], + ), ] From a29766514271f512522fd17614d49d353417ee80 Mon Sep 17 00:00:00 2001 From: MENDEZ Diego Date: Mon, 6 Jul 2026 08:17:59 +0000 Subject: [PATCH 4/4] :bug: Edit Index name --- .../migrations/0035_container_log_driver_logdriveroption.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py b/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py index 76f6f34..16cf26e 100644 --- a/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py +++ b/netbox_docker_plugin/migrations/0035_container_log_driver_logdriveroption.py @@ -9,7 +9,7 @@ def apply_database_changes(apps, schema_editor): table_container = "netbox_docker_plugin_container" table_logdriveroption = "netbox_docker_plugin_logdriveroption" - index_name = "netbox_docker_plugin_logdriveroption_container_id_option_name_uniq" + index_name = "netbox_docker_plugin_logdriveroption_unique_option_name_contain" with connection.cursor() as cursor: existing_tables = connection.introspection.table_names(cursor)