root: simplify task signal imports (#8454)
* *: deduplicate boilerplate for importing related models Signed-off-by: Jens Langhammer <jens@goauthentik.io> * also auto-import .checks Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix error during prometheus metrics from #8435 Signed-off-by: Jens Langhammer <jens@goauthentik.io> --------- Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
@ -15,7 +15,3 @@ class AuthentikAdminConfig(ManagedAppConfig):
|
||||
label = "authentik_admin"
|
||||
verbose_name = "authentik Admin"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_admin_signals(self):
|
||||
"""Load admin signals"""
|
||||
self.import_module("authentik.admin.signals")
|
||||
|
||||
@ -21,10 +21,27 @@ class ManagedAppConfig(AppConfig):
|
||||
self.logger = get_logger().bind(app_name=app_name)
|
||||
|
||||
def ready(self) -> None:
|
||||
self.import_related()
|
||||
self.reconcile_global()
|
||||
self.reconcile_tenant()
|
||||
return super().ready()
|
||||
|
||||
def import_related(self):
|
||||
"""Automatically import related modules which rely on just being imported
|
||||
to register themselves (mainly django signals and celery tasks)"""
|
||||
|
||||
def import_relative(rel_module: str):
|
||||
try:
|
||||
module_name = f"{self.name}.{rel_module}"
|
||||
import_module(module_name)
|
||||
self.logger.info("Imported related module", module=module_name)
|
||||
except ModuleNotFoundError:
|
||||
pass
|
||||
|
||||
import_relative("checks")
|
||||
import_relative("tasks")
|
||||
import_relative("signals")
|
||||
|
||||
def import_module(self, path: str):
|
||||
"""Load module"""
|
||||
import_module(path)
|
||||
|
||||
@ -14,10 +14,6 @@ class AuthentikCoreConfig(ManagedAppConfig):
|
||||
mountpoint = ""
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_core_signals(self):
|
||||
"""Load core signals"""
|
||||
self.import_module("authentik.core.signals")
|
||||
|
||||
def reconcile_global_debug_worker_hook(self):
|
||||
"""Dispatch startup tasks inline when debugging"""
|
||||
if settings.DEBUG:
|
||||
|
||||
@ -17,10 +17,6 @@ class AuthentikCryptoConfig(ManagedAppConfig):
|
||||
verbose_name = "authentik Crypto"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_crypto_tasks(self):
|
||||
"""Load crypto tasks"""
|
||||
self.import_module("authentik.crypto.tasks")
|
||||
|
||||
def _create_update_cert(self):
|
||||
from authentik.crypto.builder import CertificateBuilder
|
||||
from authentik.crypto.models import CertificateKeyPair
|
||||
|
||||
@ -17,10 +17,6 @@ class AuthentikEnterpriseConfig(EnterpriseConfig):
|
||||
verbose_name = "authentik Enterprise"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_enterprise_signals(self):
|
||||
"""Load enterprise signals"""
|
||||
self.import_module("authentik.enterprise.signals")
|
||||
|
||||
def enabled(self):
|
||||
"""Return true if enterprise is enabled and valid"""
|
||||
return self.check_enabled() or settings.TEST
|
||||
|
||||
@ -12,7 +12,3 @@ class AuthentikEnterpriseProviderRAC(EnterpriseConfig):
|
||||
default = True
|
||||
mountpoint = ""
|
||||
ws_mountpoint = "authentik.enterprise.providers.rac.urls"
|
||||
|
||||
def reconcile_global_load_rac_signals(self):
|
||||
"""Load rac signals"""
|
||||
self.import_module("authentik.enterprise.providers.rac.signals")
|
||||
|
||||
@ -5,9 +5,9 @@ from celery.schedules import crontab
|
||||
from authentik.lib.utils.time import fqdn_rand
|
||||
|
||||
CELERY_BEAT_SCHEDULE = {
|
||||
"enterprise_calculate_license": {
|
||||
"task": "authentik.enterprise.tasks.calculate_license",
|
||||
"schedule": crontab(minute=fqdn_rand("calculate_license"), hour="*/2"),
|
||||
"enterprise_update_usage": {
|
||||
"task": "authentik.enterprise.tasks.enterprise_update_usage",
|
||||
"schedule": crontab(minute=fqdn_rand("enterprise_update_usage"), hour="*/2"),
|
||||
"options": {"queue": "authentik_scheduled"},
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,11 +1,12 @@
|
||||
"""Enterprise tasks"""
|
||||
|
||||
from authentik.enterprise.models import LicenseKey
|
||||
from authentik.events.system_tasks import SystemTask
|
||||
from authentik.events.system_tasks import SystemTask, prefill_task
|
||||
from authentik.root.celery import CELERY_APP
|
||||
|
||||
|
||||
@CELERY_APP.task(base=SystemTask)
|
||||
def calculate_license():
|
||||
"""Calculate licensing status"""
|
||||
@CELERY_APP.task(bind=True, base=SystemTask)
|
||||
@prefill_task
|
||||
def enterprise_update_usage(self: SystemTask):
|
||||
"""Update enterprise license status"""
|
||||
LicenseKey.get_total().record_usage()
|
||||
|
||||
@ -35,10 +35,6 @@ class AuthentikEventsConfig(ManagedAppConfig):
|
||||
verbose_name = "authentik Events"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_events_signals(self):
|
||||
"""Load events signals"""
|
||||
self.import_module("authentik.events.signals")
|
||||
|
||||
def reconcile_global_check_deprecations(self):
|
||||
"""Check for config deprecations"""
|
||||
from authentik.events.models import Event, EventAction
|
||||
|
||||
@ -642,17 +642,16 @@ class SystemTask(SerializerModel, ExpiringModel):
|
||||
|
||||
def update_metrics(self):
|
||||
"""Update prometheus metrics"""
|
||||
duration = max(self.finish_timestamp - self.start_timestamp, 0)
|
||||
# TODO: Deprecated metric - remove in 2024.2 or later
|
||||
GAUGE_TASKS.labels(
|
||||
tenant=connection.schema_name,
|
||||
task_name=self.name,
|
||||
task_uid=self.uid or "",
|
||||
status=self.status.lower(),
|
||||
).set(duration)
|
||||
).set(self.duration)
|
||||
SYSTEM_TASK_TIME.labels(
|
||||
tenant=connection.schema_name,
|
||||
).observe(duration)
|
||||
).observe(self.duration)
|
||||
SYSTEM_TASK_STATUS.labels(
|
||||
tenant=connection.schema_name,
|
||||
task_name=self.name,
|
||||
|
||||
@ -31,10 +31,6 @@ class AuthentikFlowsConfig(ManagedAppConfig):
|
||||
verbose_name = "authentik Flows"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_flows_signals(self):
|
||||
"""Load flows signals"""
|
||||
self.import_module("authentik.flows.signals")
|
||||
|
||||
def reconcile_global_load_stages(self):
|
||||
"""Ensure all stages are loaded"""
|
||||
from authentik.flows.models import Stage
|
||||
|
||||
@ -30,10 +30,6 @@ class AuthentikOutpostConfig(ManagedAppConfig):
|
||||
verbose_name = "authentik Outpost"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_outposts_signals(self):
|
||||
"""Load outposts signals"""
|
||||
self.import_module("authentik.outposts.signals")
|
||||
|
||||
def reconcile_tenant_embedded_outpost(self):
|
||||
"""Ensure embedded outpost"""
|
||||
from authentik.outposts.models import (
|
||||
|
||||
@ -35,7 +35,3 @@ class AuthentikPoliciesConfig(ManagedAppConfig):
|
||||
label = "authentik_policies"
|
||||
verbose_name = "authentik Policies"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_policies_signals(self):
|
||||
"""Load policies signals"""
|
||||
self.import_module("authentik.policies.signals")
|
||||
|
||||
@ -12,11 +12,3 @@ class AuthentikPolicyReputationConfig(ManagedAppConfig):
|
||||
label = "authentik_policies_reputation"
|
||||
verbose_name = "authentik Policies.Reputation"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_policies_reputation_signals(self):
|
||||
"""Load policies.reputation signals"""
|
||||
self.import_module("authentik.policies.reputation.signals")
|
||||
|
||||
def reconcile_global_load_policies_reputation_tasks(self):
|
||||
"""Load policies.reputation tasks"""
|
||||
self.import_module("authentik.policies.reputation.tasks")
|
||||
|
||||
@ -10,7 +10,3 @@ class AuthentikProviderProxyConfig(ManagedAppConfig):
|
||||
label = "authentik_providers_proxy"
|
||||
verbose_name = "authentik Providers.Proxy"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_providers_proxy_signals(self):
|
||||
"""Load proxy signals"""
|
||||
self.import_module("authentik.providers.proxy.signals")
|
||||
|
||||
@ -10,7 +10,3 @@ class AuthentikProviderSCIMConfig(ManagedAppConfig):
|
||||
label = "authentik_providers_scim"
|
||||
verbose_name = "authentik Providers.SCIM"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_signals(self):
|
||||
"""Load signals"""
|
||||
self.import_module("authentik.providers.scim.signals")
|
||||
|
||||
@ -10,7 +10,3 @@ class AuthentikRBACConfig(ManagedAppConfig):
|
||||
label = "authentik_rbac"
|
||||
verbose_name = "authentik RBAC"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_rbac_signals(self):
|
||||
"""Load rbac signals"""
|
||||
self.import_module("authentik.rbac.signals")
|
||||
|
||||
@ -69,7 +69,6 @@ TENANT_APPS = [
|
||||
"authentik.admin",
|
||||
"authentik.api",
|
||||
"authentik.crypto",
|
||||
"authentik.events",
|
||||
"authentik.flows",
|
||||
"authentik.outposts",
|
||||
"authentik.policies.dummy",
|
||||
@ -509,5 +508,9 @@ try:
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
# Import events after other apps since it relies on tasks and other things from all apps
|
||||
# being imported for @prefill_task
|
||||
TENANT_APPS.append("authentik.events")
|
||||
|
||||
SHARED_APPS = list(OrderedDict.fromkeys(SHARED_APPS + TENANT_APPS))
|
||||
INSTALLED_APPS = list(OrderedDict.fromkeys(SHARED_APPS + TENANT_APPS))
|
||||
|
||||
@ -10,7 +10,3 @@ class AuthentikSourceLDAPConfig(ManagedAppConfig):
|
||||
label = "authentik_sources_ldap"
|
||||
verbose_name = "authentik Sources.LDAP"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_sources_ldap_signals(self):
|
||||
"""Load sources.ldap signals"""
|
||||
self.import_module("authentik.sources.ldap.signals")
|
||||
|
||||
@ -11,7 +11,3 @@ class AuthentikSourceSAMLConfig(ManagedAppConfig):
|
||||
verbose_name = "authentik Sources.SAML"
|
||||
mountpoint = "source/saml/"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_sources_saml_signals(self):
|
||||
"""Load sources.saml signals"""
|
||||
self.import_module("authentik.sources.saml.signals")
|
||||
|
||||
@ -10,7 +10,3 @@ class AuthentikStageAuthenticatorDuoConfig(ManagedAppConfig):
|
||||
label = "authentik_stages_authenticator_duo"
|
||||
verbose_name = "authentik Stages.Authenticator.Duo"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_tasks(self):
|
||||
"""Load tasks"""
|
||||
self.import_module("authentik.stages.authenticator_duo.tasks")
|
||||
|
||||
@ -10,7 +10,3 @@ class AuthentikStageAuthenticatorStaticConfig(ManagedAppConfig):
|
||||
label = "authentik_stages_authenticator_static"
|
||||
verbose_name = "authentik Stages.Authenticator.Static"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_stages_authenticator_static_signals(self):
|
||||
"""Load stages.authenticator_static signals"""
|
||||
self.import_module("authentik.stages.authenticator_static.signals")
|
||||
|
||||
@ -1,11 +1,7 @@
|
||||
"""authentik email stage config"""
|
||||
|
||||
from structlog.stdlib import get_logger
|
||||
|
||||
from authentik.blueprints.apps import ManagedAppConfig
|
||||
|
||||
LOGGER = get_logger()
|
||||
|
||||
|
||||
class AuthentikStageEmailConfig(ManagedAppConfig):
|
||||
"""authentik email stage config"""
|
||||
@ -14,7 +10,3 @@ class AuthentikStageEmailConfig(ManagedAppConfig):
|
||||
label = "authentik_stages_email"
|
||||
verbose_name = "authentik Stages.Email"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_stages_emails_tasks(self):
|
||||
"""Load stages.emails tasks"""
|
||||
self.import_module("authentik.stages.email.tasks")
|
||||
|
||||
@ -28,10 +28,6 @@ class AuthentikTenantsConfig(ManagedAppConfig):
|
||||
verbose_name = "authentik Tenants"
|
||||
default = True
|
||||
|
||||
def reconcile_global_load_checks(self):
|
||||
"""Load tenant checks"""
|
||||
self.import_module("authentik.tenants.checks")
|
||||
|
||||
def reconcile_global_default_tenant(self):
|
||||
"""Make sure default tenant exists, especially after a migration"""
|
||||
post_migrate.connect(ensure_default_tenant)
|
||||
|
||||
Reference in New Issue
Block a user