authentik.outposts.migrations.0001_squashed_0017_outpost_managed

  1# Generated by Django 3.2.8 on 2021-10-10 16:18
  2
  3import uuid
  4
  5import django.db.models.deletion
  6from django.apps.registry import Apps
  7from django.core.exceptions import FieldError
  8from django.db import migrations, models
  9from django.db.backends.base.schema import BaseDatabaseSchemaEditor
 10
 11import authentik.lib.models
 12import authentik.outposts.models
 13
 14
 15def fix_missing_token_identifier(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
 16    db_alias = schema_editor.connection.alias
 17    User = apps.get_model("authentik_core", "User")
 18    Token = apps.get_model("authentik_core", "Token")
 19    from authentik.outposts.models import Outpost
 20
 21    for outpost in Outpost.objects.using(db_alias).all().only("pk"):
 22        user_identifier = outpost.user_identifier
 23        users = User.objects.using(db_alias).filter(username=user_identifier)
 24        if not users.exists():
 25            continue
 26        tokens = Token.objects.using(db_alias).filter(user=users.first())
 27        for token in tokens:
 28            if token.identifier != outpost.token_identifier:
 29                token.identifier = outpost.token_identifier
 30                token.save()
 31
 32
 33def migrate_to_service_connection(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
 34    db_alias = schema_editor.connection.alias
 35    Outpost = apps.get_model("authentik_outposts", "Outpost")
 36    DockerServiceConnection = apps.get_model("authentik_outposts", "DockerServiceConnection")
 37    KubernetesServiceConnection = apps.get_model(
 38        "authentik_outposts", "KubernetesServiceConnection"
 39    )
 40
 41    docker = DockerServiceConnection.objects.using(db_alias).filter(local=True).first()
 42    k8s = KubernetesServiceConnection.objects.using(db_alias).filter(local=True).first()
 43
 44    try:
 45        for outpost in Outpost.objects.using(db_alias).all().exclude(deployment_type="custom"):
 46            if outpost.deployment_type == "kubernetes":
 47                outpost.service_connection = k8s
 48            elif outpost.deployment_type == "docker":
 49                outpost.service_connection = docker
 50            outpost.save()
 51    except FieldError:
 52        # This is triggered during e2e tests when this function is called on an already-upgraded
 53        # schema
 54        pass
 55
 56
 57def remove_pb_prefix_users(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
 58    db_alias = schema_editor.connection.alias
 59    User = apps.get_model("authentik_core", "User")
 60    Outpost = apps.get_model("authentik_outposts", "Outpost")
 61
 62    for outpost in Outpost.objects.using(db_alias).all():
 63        matching = User.objects.using(db_alias).filter(username=f"pb-outpost-{outpost.uuid.hex}")
 64        if matching.exists():
 65            matching.delete()
 66
 67
 68def update_config_prefix(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
 69    db_alias = schema_editor.connection.alias
 70    Outpost = apps.get_model("authentik_outposts", "Outpost")
 71
 72    for outpost in Outpost.objects.using(db_alias).all():
 73        config = outpost._config
 74        for key in list(config):
 75            if "passbook" in key:
 76                new_key = key.replace("passbook", "authentik")
 77                config[new_key] = config[key]
 78                del config[key]
 79        outpost._config = config
 80        outpost.save()
 81
 82
 83class Migration(migrations.Migration):
 84    replaces = [
 85        ("authentik_outposts", "0001_initial"),
 86        ("authentik_outposts", "0002_auto_20200826_1306"),
 87        ("authentik_outposts", "0003_auto_20200827_2108"),
 88        ("authentik_outposts", "0004_auto_20200830_1056"),
 89        ("authentik_outposts", "0005_auto_20200909_1733"),
 90        ("authentik_outposts", "0006_auto_20201003_2239"),
 91        ("authentik_outposts", "0007_remove_outpost_channels"),
 92        ("authentik_outposts", "0008_auto_20201014_1547"),
 93        ("authentik_outposts", "0009_fix_missing_token_identifier"),
 94        ("authentik_outposts", "0010_service_connection"),
 95        ("authentik_outposts", "0011_docker_tls_auth"),
 96        ("authentik_outposts", "0012_service_connection_non_unique"),
 97        ("authentik_outposts", "0013_auto_20201203_2009"),
 98        ("authentik_outposts", "0014_auto_20201213_1407"),
 99        ("authentik_outposts", "0015_auto_20201224_1206"),
100        ("authentik_outposts", "0016_alter_outpost_type"),
101        ("authentik_outposts", "0017_outpost_managed"),
102    ]
103
104    initial = True
105
106    dependencies = [
107        ("authentik_core", "0014_auto_20201018_1158"),
108        ("authentik_core", "0016_auto_20201202_2234"),
109        ("authentik_crypto", "0002_create_self_signed_kp"),
110        ("authentik_core", "0008_auto_20200824_1532"),
111    ]
112
113    operations = [
114        migrations.CreateModel(
115            name="Outpost",
116            fields=[
117                (
118                    "uuid",
119                    models.UUIDField(
120                        default=uuid.uuid4, editable=False, primary_key=True, serialize=False
121                    ),
122                ),
123                ("name", models.TextField()),
124                ("providers", models.ManyToManyField(to="authentik_core.Provider")),
125                (
126                    "_config",
127                    models.JSONField(default=authentik.outposts.models.default_outpost_config),
128                ),
129                ("type", models.TextField(choices=[("proxy", "Proxy")], default="proxy")),
130                (
131                    "deployment_type",
132                    models.TextField(
133                        choices=[
134                            ("kubernetes", "Kubernetes"),
135                            ("docker", "Docker"),
136                            ("custom", "Custom"),
137                        ],
138                        default="custom",
139                        help_text=(
140                            "Select between authentik-managed deployment types or a custom"
141                            " deployment."
142                        ),
143                    ),
144                ),
145            ],
146        ),
147        migrations.RunPython(
148            code=fix_missing_token_identifier,
149        ),
150        migrations.CreateModel(
151            name="OutpostServiceConnection",
152            fields=[
153                (
154                    "uuid",
155                    models.UUIDField(
156                        default=uuid.uuid4, editable=False, primary_key=True, serialize=False
157                    ),
158                ),
159                ("name", models.TextField()),
160                (
161                    "local",
162                    models.BooleanField(
163                        default=False,
164                        help_text=(
165                            "If enabled, use the local connection. Required Docker"
166                            " socket/Kubernetes Integration"
167                        ),
168                        unique=True,
169                    ),
170                ),
171            ],
172        ),
173        migrations.CreateModel(
174            name="DockerServiceConnection",
175            fields=[
176                (
177                    "outpostserviceconnection_ptr",
178                    models.OneToOneField(
179                        auto_created=True,
180                        on_delete=django.db.models.deletion.CASCADE,
181                        parent_link=True,
182                        primary_key=True,
183                        serialize=False,
184                        to="authentik_outposts.outpostserviceconnection",
185                    ),
186                ),
187                ("url", models.TextField()),
188                ("tls", models.BooleanField()),
189            ],
190            bases=("authentik_outposts.outpostserviceconnection",),
191        ),
192        migrations.CreateModel(
193            name="KubernetesServiceConnection",
194            fields=[
195                (
196                    "outpostserviceconnection_ptr",
197                    models.OneToOneField(
198                        auto_created=True,
199                        on_delete=django.db.models.deletion.CASCADE,
200                        parent_link=True,
201                        primary_key=True,
202                        serialize=False,
203                        to="authentik_outposts.outpostserviceconnection",
204                    ),
205                ),
206                ("kubeconfig", models.JSONField()),
207            ],
208            bases=("authentik_outposts.outpostserviceconnection",),
209        ),
210        migrations.AddField(
211            model_name="outpost",
212            name="service_connection",
213            field=models.ForeignKey(
214                blank=True,
215                default=None,
216                help_text=(
217                    "Select Service-Connection authentik should use to manage this outpost. Leave"
218                    " empty if authentik should not handle the deployment."
219                ),
220                null=True,
221                on_delete=django.db.models.deletion.SET_DEFAULT,
222                to="authentik_outposts.outpostserviceconnection",
223            ),
224        ),
225        migrations.RunPython(
226            code=migrate_to_service_connection,
227        ),
228        migrations.RemoveField(
229            model_name="outpost",
230            name="deployment_type",
231        ),
232        migrations.AlterModelOptions(
233            name="dockerserviceconnection",
234            options={
235                "verbose_name": "Docker Service-Connection",
236                "verbose_name_plural": "Docker Service-Connections",
237            },
238        ),
239        migrations.AlterModelOptions(
240            name="kubernetesserviceconnection",
241            options={
242                "verbose_name": "Kubernetes Service-Connection",
243                "verbose_name_plural": "Kubernetes Service-Connections",
244            },
245        ),
246        migrations.AlterField(
247            model_name="outpost",
248            name="service_connection",
249            field=authentik.lib.models.InheritanceForeignKey(
250                blank=True,
251                default=None,
252                help_text=(
253                    "Select Service-Connection authentik should use to manage this outpost. Leave"
254                    " empty if authentik should not handle the deployment."
255                ),
256                null=True,
257                on_delete=django.db.models.deletion.SET_DEFAULT,
258                to="authentik_outposts.outpostserviceconnection",
259            ),
260        ),
261        migrations.AlterModelOptions(
262            name="outpostserviceconnection",
263            options={
264                "verbose_name": "Outpost Service-Connection",
265                "verbose_name_plural": "Outpost Service-Connections",
266            },
267        ),
268        migrations.AlterField(
269            model_name="kubernetesserviceconnection",
270            name="kubeconfig",
271            field=models.JSONField(
272                default=None,
273                help_text=(
274                    "Paste your kubeconfig here. authentik will automatically use the currently"
275                    " selected context."
276                ),
277            ),
278            preserve_default=False,
279        ),
280        migrations.RemoveField(
281            model_name="dockerserviceconnection",
282            name="tls",
283        ),
284        migrations.AddField(
285            model_name="dockerserviceconnection",
286            name="tls_authentication",
287            field=models.ForeignKey(
288                blank=True,
289                default=None,
290                help_text=(
291                    "Certificate/Key used for authentication. Can be left empty for no"
292                    " authentication."
293                ),
294                null=True,
295                on_delete=django.db.models.deletion.SET_DEFAULT,
296                related_name="+",
297                to="authentik_crypto.certificatekeypair",
298            ),
299        ),
300        migrations.AddField(
301            model_name="dockerserviceconnection",
302            name="tls_verification",
303            field=models.ForeignKey(
304                blank=True,
305                default=None,
306                help_text=(
307                    "CA which the endpoint's Certificate is verified against. Can be left empty for"
308                    " no validation."
309                ),
310                null=True,
311                on_delete=django.db.models.deletion.SET_DEFAULT,
312                related_name="+",
313                to="authentik_crypto.certificatekeypair",
314            ),
315        ),
316        migrations.AlterField(
317            model_name="outpostserviceconnection",
318            name="local",
319            field=models.BooleanField(
320                default=False,
321                help_text=(
322                    "If enabled, use the local connection. Required Docker socket/Kubernetes"
323                    " Integration"
324                ),
325            ),
326        ),
327        migrations.RunPython(
328            code=remove_pb_prefix_users,
329        ),
330        migrations.RunPython(
331            code=update_config_prefix,
332        ),
333        migrations.AlterField(
334            model_name="dockerserviceconnection",
335            name="url",
336            field=models.TextField(
337                help_text=(
338                    "Can be in the format of 'unix://<path>' when connecting to a local docker"
339                    " daemon, or 'https://<hostname>:2376' when connecting to a remote system."
340                )
341            ),
342        ),
343        migrations.AlterField(
344            model_name="kubernetesserviceconnection",
345            name="kubeconfig",
346            field=models.JSONField(
347                blank=True,
348                help_text=(
349                    "Paste your kubeconfig here. authentik will automatically use the currently"
350                    " selected context."
351                ),
352            ),
353        ),
354        migrations.AlterField(
355            model_name="outpost",
356            name="type",
357            field=models.TextField(choices=[("proxy", "Proxy"), ("ldap", "Ldap")], default="proxy"),
358        ),
359        migrations.AddField(
360            model_name="outpost",
361            name="managed",
362            field=models.TextField(
363                default=None,
364                help_text=(
365                    "Objects which are managed by authentik. These objects are created and updated"
366                    " automatically. This is flag only indicates that an object can be overwritten"
367                    " by migrations. You can still modify the objects via the API, but expect"
368                    " changes to be overwritten in a later update."
369                ),
370                null=True,
371                unique=True,
372                verbose_name="Managed by authentik",
373            ),
374        ),
375    ]
def fix_missing_token_identifier( apps: django.apps.registry.Apps, schema_editor: django.db.backends.base.schema.BaseDatabaseSchemaEditor):
16def fix_missing_token_identifier(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
17    db_alias = schema_editor.connection.alias
18    User = apps.get_model("authentik_core", "User")
19    Token = apps.get_model("authentik_core", "Token")
20    from authentik.outposts.models import Outpost
21
22    for outpost in Outpost.objects.using(db_alias).all().only("pk"):
23        user_identifier = outpost.user_identifier
24        users = User.objects.using(db_alias).filter(username=user_identifier)
25        if not users.exists():
26            continue
27        tokens = Token.objects.using(db_alias).filter(user=users.first())
28        for token in tokens:
29            if token.identifier != outpost.token_identifier:
30                token.identifier = outpost.token_identifier
31                token.save()
def migrate_to_service_connection( apps: django.apps.registry.Apps, schema_editor: django.db.backends.base.schema.BaseDatabaseSchemaEditor):
34def migrate_to_service_connection(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
35    db_alias = schema_editor.connection.alias
36    Outpost = apps.get_model("authentik_outposts", "Outpost")
37    DockerServiceConnection = apps.get_model("authentik_outposts", "DockerServiceConnection")
38    KubernetesServiceConnection = apps.get_model(
39        "authentik_outposts", "KubernetesServiceConnection"
40    )
41
42    docker = DockerServiceConnection.objects.using(db_alias).filter(local=True).first()
43    k8s = KubernetesServiceConnection.objects.using(db_alias).filter(local=True).first()
44
45    try:
46        for outpost in Outpost.objects.using(db_alias).all().exclude(deployment_type="custom"):
47            if outpost.deployment_type == "kubernetes":
48                outpost.service_connection = k8s
49            elif outpost.deployment_type == "docker":
50                outpost.service_connection = docker
51            outpost.save()
52    except FieldError:
53        # This is triggered during e2e tests when this function is called on an already-upgraded
54        # schema
55        pass
def remove_pb_prefix_users( apps: django.apps.registry.Apps, schema_editor: django.db.backends.base.schema.BaseDatabaseSchemaEditor):
58def remove_pb_prefix_users(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
59    db_alias = schema_editor.connection.alias
60    User = apps.get_model("authentik_core", "User")
61    Outpost = apps.get_model("authentik_outposts", "Outpost")
62
63    for outpost in Outpost.objects.using(db_alias).all():
64        matching = User.objects.using(db_alias).filter(username=f"pb-outpost-{outpost.uuid.hex}")
65        if matching.exists():
66            matching.delete()
def update_config_prefix( apps: django.apps.registry.Apps, schema_editor: django.db.backends.base.schema.BaseDatabaseSchemaEditor):
69def update_config_prefix(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
70    db_alias = schema_editor.connection.alias
71    Outpost = apps.get_model("authentik_outposts", "Outpost")
72
73    for outpost in Outpost.objects.using(db_alias).all():
74        config = outpost._config
75        for key in list(config):
76            if "passbook" in key:
77                new_key = key.replace("passbook", "authentik")
78                config[new_key] = config[key]
79                del config[key]
80        outpost._config = config
81        outpost.save()
class Migration(django.db.migrations.migration.Migration):
 84class Migration(migrations.Migration):
 85    replaces = [
 86        ("authentik_outposts", "0001_initial"),
 87        ("authentik_outposts", "0002_auto_20200826_1306"),
 88        ("authentik_outposts", "0003_auto_20200827_2108"),
 89        ("authentik_outposts", "0004_auto_20200830_1056"),
 90        ("authentik_outposts", "0005_auto_20200909_1733"),
 91        ("authentik_outposts", "0006_auto_20201003_2239"),
 92        ("authentik_outposts", "0007_remove_outpost_channels"),
 93        ("authentik_outposts", "0008_auto_20201014_1547"),
 94        ("authentik_outposts", "0009_fix_missing_token_identifier"),
 95        ("authentik_outposts", "0010_service_connection"),
 96        ("authentik_outposts", "0011_docker_tls_auth"),
 97        ("authentik_outposts", "0012_service_connection_non_unique"),
 98        ("authentik_outposts", "0013_auto_20201203_2009"),
 99        ("authentik_outposts", "0014_auto_20201213_1407"),
100        ("authentik_outposts", "0015_auto_20201224_1206"),
101        ("authentik_outposts", "0016_alter_outpost_type"),
102        ("authentik_outposts", "0017_outpost_managed"),
103    ]
104
105    initial = True
106
107    dependencies = [
108        ("authentik_core", "0014_auto_20201018_1158"),
109        ("authentik_core", "0016_auto_20201202_2234"),
110        ("authentik_crypto", "0002_create_self_signed_kp"),
111        ("authentik_core", "0008_auto_20200824_1532"),
112    ]
113
114    operations = [
115        migrations.CreateModel(
116            name="Outpost",
117            fields=[
118                (
119                    "uuid",
120                    models.UUIDField(
121                        default=uuid.uuid4, editable=False, primary_key=True, serialize=False
122                    ),
123                ),
124                ("name", models.TextField()),
125                ("providers", models.ManyToManyField(to="authentik_core.Provider")),
126                (
127                    "_config",
128                    models.JSONField(default=authentik.outposts.models.default_outpost_config),
129                ),
130                ("type", models.TextField(choices=[("proxy", "Proxy")], default="proxy")),
131                (
132                    "deployment_type",
133                    models.TextField(
134                        choices=[
135                            ("kubernetes", "Kubernetes"),
136                            ("docker", "Docker"),
137                            ("custom", "Custom"),
138                        ],
139                        default="custom",
140                        help_text=(
141                            "Select between authentik-managed deployment types or a custom"
142                            " deployment."
143                        ),
144                    ),
145                ),
146            ],
147        ),
148        migrations.RunPython(
149            code=fix_missing_token_identifier,
150        ),
151        migrations.CreateModel(
152            name="OutpostServiceConnection",
153            fields=[
154                (
155                    "uuid",
156                    models.UUIDField(
157                        default=uuid.uuid4, editable=False, primary_key=True, serialize=False
158                    ),
159                ),
160                ("name", models.TextField()),
161                (
162                    "local",
163                    models.BooleanField(
164                        default=False,
165                        help_text=(
166                            "If enabled, use the local connection. Required Docker"
167                            " socket/Kubernetes Integration"
168                        ),
169                        unique=True,
170                    ),
171                ),
172            ],
173        ),
174        migrations.CreateModel(
175            name="DockerServiceConnection",
176            fields=[
177                (
178                    "outpostserviceconnection_ptr",
179                    models.OneToOneField(
180                        auto_created=True,
181                        on_delete=django.db.models.deletion.CASCADE,
182                        parent_link=True,
183                        primary_key=True,
184                        serialize=False,
185                        to="authentik_outposts.outpostserviceconnection",
186                    ),
187                ),
188                ("url", models.TextField()),
189                ("tls", models.BooleanField()),
190            ],
191            bases=("authentik_outposts.outpostserviceconnection",),
192        ),
193        migrations.CreateModel(
194            name="KubernetesServiceConnection",
195            fields=[
196                (
197                    "outpostserviceconnection_ptr",
198                    models.OneToOneField(
199                        auto_created=True,
200                        on_delete=django.db.models.deletion.CASCADE,
201                        parent_link=True,
202                        primary_key=True,
203                        serialize=False,
204                        to="authentik_outposts.outpostserviceconnection",
205                    ),
206                ),
207                ("kubeconfig", models.JSONField()),
208            ],
209            bases=("authentik_outposts.outpostserviceconnection",),
210        ),
211        migrations.AddField(
212            model_name="outpost",
213            name="service_connection",
214            field=models.ForeignKey(
215                blank=True,
216                default=None,
217                help_text=(
218                    "Select Service-Connection authentik should use to manage this outpost. Leave"
219                    " empty if authentik should not handle the deployment."
220                ),
221                null=True,
222                on_delete=django.db.models.deletion.SET_DEFAULT,
223                to="authentik_outposts.outpostserviceconnection",
224            ),
225        ),
226        migrations.RunPython(
227            code=migrate_to_service_connection,
228        ),
229        migrations.RemoveField(
230            model_name="outpost",
231            name="deployment_type",
232        ),
233        migrations.AlterModelOptions(
234            name="dockerserviceconnection",
235            options={
236                "verbose_name": "Docker Service-Connection",
237                "verbose_name_plural": "Docker Service-Connections",
238            },
239        ),
240        migrations.AlterModelOptions(
241            name="kubernetesserviceconnection",
242            options={
243                "verbose_name": "Kubernetes Service-Connection",
244                "verbose_name_plural": "Kubernetes Service-Connections",
245            },
246        ),
247        migrations.AlterField(
248            model_name="outpost",
249            name="service_connection",
250            field=authentik.lib.models.InheritanceForeignKey(
251                blank=True,
252                default=None,
253                help_text=(
254                    "Select Service-Connection authentik should use to manage this outpost. Leave"
255                    " empty if authentik should not handle the deployment."
256                ),
257                null=True,
258                on_delete=django.db.models.deletion.SET_DEFAULT,
259                to="authentik_outposts.outpostserviceconnection",
260            ),
261        ),
262        migrations.AlterModelOptions(
263            name="outpostserviceconnection",
264            options={
265                "verbose_name": "Outpost Service-Connection",
266                "verbose_name_plural": "Outpost Service-Connections",
267            },
268        ),
269        migrations.AlterField(
270            model_name="kubernetesserviceconnection",
271            name="kubeconfig",
272            field=models.JSONField(
273                default=None,
274                help_text=(
275                    "Paste your kubeconfig here. authentik will automatically use the currently"
276                    " selected context."
277                ),
278            ),
279            preserve_default=False,
280        ),
281        migrations.RemoveField(
282            model_name="dockerserviceconnection",
283            name="tls",
284        ),
285        migrations.AddField(
286            model_name="dockerserviceconnection",
287            name="tls_authentication",
288            field=models.ForeignKey(
289                blank=True,
290                default=None,
291                help_text=(
292                    "Certificate/Key used for authentication. Can be left empty for no"
293                    " authentication."
294                ),
295                null=True,
296                on_delete=django.db.models.deletion.SET_DEFAULT,
297                related_name="+",
298                to="authentik_crypto.certificatekeypair",
299            ),
300        ),
301        migrations.AddField(
302            model_name="dockerserviceconnection",
303            name="tls_verification",
304            field=models.ForeignKey(
305                blank=True,
306                default=None,
307                help_text=(
308                    "CA which the endpoint's Certificate is verified against. Can be left empty for"
309                    " no validation."
310                ),
311                null=True,
312                on_delete=django.db.models.deletion.SET_DEFAULT,
313                related_name="+",
314                to="authentik_crypto.certificatekeypair",
315            ),
316        ),
317        migrations.AlterField(
318            model_name="outpostserviceconnection",
319            name="local",
320            field=models.BooleanField(
321                default=False,
322                help_text=(
323                    "If enabled, use the local connection. Required Docker socket/Kubernetes"
324                    " Integration"
325                ),
326            ),
327        ),
328        migrations.RunPython(
329            code=remove_pb_prefix_users,
330        ),
331        migrations.RunPython(
332            code=update_config_prefix,
333        ),
334        migrations.AlterField(
335            model_name="dockerserviceconnection",
336            name="url",
337            field=models.TextField(
338                help_text=(
339                    "Can be in the format of 'unix://<path>' when connecting to a local docker"
340                    " daemon, or 'https://<hostname>:2376' when connecting to a remote system."
341                )
342            ),
343        ),
344        migrations.AlterField(
345            model_name="kubernetesserviceconnection",
346            name="kubeconfig",
347            field=models.JSONField(
348                blank=True,
349                help_text=(
350                    "Paste your kubeconfig here. authentik will automatically use the currently"
351                    " selected context."
352                ),
353            ),
354        ),
355        migrations.AlterField(
356            model_name="outpost",
357            name="type",
358            field=models.TextField(choices=[("proxy", "Proxy"), ("ldap", "Ldap")], default="proxy"),
359        ),
360        migrations.AddField(
361            model_name="outpost",
362            name="managed",
363            field=models.TextField(
364                default=None,
365                help_text=(
366                    "Objects which are managed by authentik. These objects are created and updated"
367                    " automatically. This is flag only indicates that an object can be overwritten"
368                    " by migrations. You can still modify the objects via the API, but expect"
369                    " changes to be overwritten in a later update."
370                ),
371                null=True,
372                unique=True,
373                verbose_name="Managed by authentik",
374            ),
375        ),
376    ]

The base class for all migrations.

Migration files will import this from django.db.migrations.Migration and subclass it as a class called Migration. It will have one or more of the following attributes:

  • operations: A list of Operation instances, probably from django.db.migrations.operations
  • dependencies: A list of tuples of (app_path, migration_name)
  • run_before: A list of tuples of (app_path, migration_name)
  • replaces: A list of migration_names

Note that all migrations come out of migrations and into the Loader or Graph as instances, having been initialized with their app label and name.

replaces = [('authentik_outposts', '0001_initial'), ('authentik_outposts', '0002_auto_20200826_1306'), ('authentik_outposts', '0003_auto_20200827_2108'), ('authentik_outposts', '0004_auto_20200830_1056'), ('authentik_outposts', '0005_auto_20200909_1733'), ('authentik_outposts', '0006_auto_20201003_2239'), ('authentik_outposts', '0007_remove_outpost_channels'), ('authentik_outposts', '0008_auto_20201014_1547'), ('authentik_outposts', '0009_fix_missing_token_identifier'), ('authentik_outposts', '0010_service_connection'), ('authentik_outposts', '0011_docker_tls_auth'), ('authentik_outposts', '0012_service_connection_non_unique'), ('authentik_outposts', '0013_auto_20201203_2009'), ('authentik_outposts', '0014_auto_20201213_1407'), ('authentik_outposts', '0015_auto_20201224_1206'), ('authentik_outposts', '0016_alter_outpost_type'), ('authentik_outposts', '0017_outpost_managed')]
initial = True
dependencies = [('authentik_core', '0014_auto_20201018_1158'), ('authentik_core', '0016_auto_20201202_2234'), ('authentik_crypto', '0002_create_self_signed_kp'), ('authentik_core', '0008_auto_20200824_1532')]
operations = [<CreateModel name='Outpost', fields=[('uuid', <django.db.models.fields.UUIDField>), ('name', <django.db.models.fields.TextField>), ('providers', <django.db.models.fields.related.ManyToManyField>), ('_config', <django.db.models.fields.json.JSONField>), ('type', <django.db.models.fields.TextField>), ('deployment_type', <django.db.models.fields.TextField>)]>, <RunPython code=<function fix_missing_token_identifier>>, <CreateModel name='OutpostServiceConnection', fields=[('uuid', <django.db.models.fields.UUIDField>), ('name', <django.db.models.fields.TextField>), ('local', <django.db.models.fields.BooleanField>)]>, <CreateModel name='DockerServiceConnection', fields=[('outpostserviceconnection_ptr', <django.db.models.fields.related.OneToOneField>), ('url', <django.db.models.fields.TextField>), ('tls', <django.db.models.fields.BooleanField>)], bases=('authentik_outposts.outpostserviceconnection',)>, <CreateModel name='KubernetesServiceConnection', fields=[('outpostserviceconnection_ptr', <django.db.models.fields.related.OneToOneField>), ('kubeconfig', <django.db.models.fields.json.JSONField>)], bases=('authentik_outposts.outpostserviceconnection',)>, <AddField model_name='outpost', name='service_connection', field=<django.db.models.fields.related.ForeignKey>>, <RunPython code=<function migrate_to_service_connection>>, <RemoveField model_name='outpost', name='deployment_type'>, <AlterModelOptions name='dockerserviceconnection', options={'verbose_name': 'Docker Service-Connection', 'verbose_name_plural': 'Docker Service-Connections'}>, <AlterModelOptions name='kubernetesserviceconnection', options={'verbose_name': 'Kubernetes Service-Connection', 'verbose_name_plural': 'Kubernetes Service-Connections'}>, <AlterField model_name='outpost', name='service_connection', field=<authentik.lib.models.InheritanceForeignKey>>, <AlterModelOptions name='outpostserviceconnection', options={'verbose_name': 'Outpost Service-Connection', 'verbose_name_plural': 'Outpost Service-Connections'}>, <AlterField model_name='kubernetesserviceconnection', name='kubeconfig', field=<django.db.models.fields.json.JSONField>, preserve_default=False>, <RemoveField model_name='dockerserviceconnection', name='tls'>, <AddField model_name='dockerserviceconnection', name='tls_authentication', field=<django.db.models.fields.related.ForeignKey>>, <AddField model_name='dockerserviceconnection', name='tls_verification', field=<django.db.models.fields.related.ForeignKey>>, <AlterField model_name='outpostserviceconnection', name='local', field=<django.db.models.fields.BooleanField>>, <RunPython code=<function remove_pb_prefix_users>>, <RunPython code=<function update_config_prefix>>, <AlterField model_name='dockerserviceconnection', name='url', field=<django.db.models.fields.TextField>>, <AlterField model_name='kubernetesserviceconnection', name='kubeconfig', field=<django.db.models.fields.json.JSONField>>, <AlterField model_name='outpost', name='type', field=<django.db.models.fields.TextField>>, <AddField model_name='outpost', name='managed', field=<django.db.models.fields.TextField>>]