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')]
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>>]