diff --git a/awx/main/migrations/0061_v350_track_native_credentialtype_source.py b/awx/main/migrations/0061_v350_track_native_credentialtype_source.py index 4c624d77bf..fb76e79ade 100644 --- a/awx/main/migrations/0061_v350_track_native_credentialtype_source.py +++ b/awx/main/migrations/0061_v350_track_native_credentialtype_source.py @@ -10,7 +10,7 @@ from awx.main.utils.common import set_current_apps def migrate_to_static_inputs(apps, schema_editor): set_current_apps(apps) - CredentialType.setup_tower_managed_defaults() + CredentialType.setup_tower_managed_defaults(apps) class Migration(migrations.Migration): diff --git a/awx/main/migrations/0067_v350_credential_plugins.py b/awx/main/migrations/0067_v350_credential_plugins.py index 335baef2f7..7eacb18f78 100644 --- a/awx/main/migrations/0067_v350_credential_plugins.py +++ b/awx/main/migrations/0067_v350_credential_plugins.py @@ -14,7 +14,7 @@ from awx.main.utils.common import set_current_apps def setup_tower_managed_defaults(apps, schema_editor): set_current_apps(apps) - CredentialType.setup_tower_managed_defaults() + CredentialType.setup_tower_managed_defaults(apps) class Migration(migrations.Migration): diff --git a/awx/main/migrations/0093_v360_personal_access_tokens.py b/awx/main/migrations/0093_v360_personal_access_tokens.py index d5910f575a..3ba5b15e70 100644 --- a/awx/main/migrations/0093_v360_personal_access_tokens.py +++ b/awx/main/migrations/0093_v360_personal_access_tokens.py @@ -8,7 +8,7 @@ from awx.main.utils.common import set_current_apps def setup_tower_managed_defaults(apps, schema_editor): set_current_apps(apps) - CredentialType.setup_tower_managed_defaults() + CredentialType.setup_tower_managed_defaults(apps) class Migration(migrations.Migration): diff --git a/awx/main/migrations/0096_v360_container_groups.py b/awx/main/migrations/0096_v360_container_groups.py index 23f0f2279c..9fe4bad2d0 100644 --- a/awx/main/migrations/0096_v360_container_groups.py +++ b/awx/main/migrations/0096_v360_container_groups.py @@ -9,7 +9,7 @@ from awx.main.utils.common import set_current_apps def create_new_credential_types(apps, schema_editor): set_current_apps(apps) - CredentialType.setup_tower_managed_defaults() + CredentialType.setup_tower_managed_defaults(apps) class Migration(migrations.Migration): diff --git a/awx/main/migrations/0098_v360_rename_cyberark_aim_credential_type.py b/awx/main/migrations/0098_v360_rename_cyberark_aim_credential_type.py index de2b3dc000..02d46227a3 100644 --- a/awx/main/migrations/0098_v360_rename_cyberark_aim_credential_type.py +++ b/awx/main/migrations/0098_v360_rename_cyberark_aim_credential_type.py @@ -5,7 +5,7 @@ from awx.main.models import CredentialType def update_cyberark_aim_name(apps, schema_editor): - CredentialType.setup_tower_managed_defaults() + CredentialType.setup_tower_managed_defaults(apps) aim_types = apps.get_model('main', 'CredentialType').objects.filter(namespace='aim').order_by('id') if aim_types.count() == 2: diff --git a/awx/main/migrations/0133_centrify_vault_credtype.py b/awx/main/migrations/0133_centrify_vault_credtype.py index eee9507691..e4416e3680 100644 --- a/awx/main/migrations/0133_centrify_vault_credtype.py +++ b/awx/main/migrations/0133_centrify_vault_credtype.py @@ -6,7 +6,7 @@ from awx.main.utils.common import set_current_apps def setup_tower_managed_defaults(apps, schema_editor): set_current_apps(apps) - CredentialType.setup_tower_managed_defaults() + CredentialType.setup_tower_managed_defaults(apps) class Migration(migrations.Migration): diff --git a/awx/main/migrations/0150_rename_inv_sources_inv_updates.py b/awx/main/migrations/0150_rename_inv_sources_inv_updates.py index 463eb962a3..2f557350bf 100644 --- a/awx/main/migrations/0150_rename_inv_sources_inv_updates.py +++ b/awx/main/migrations/0150_rename_inv_sources_inv_updates.py @@ -32,7 +32,7 @@ def forwards(apps, schema_editor): tower_type.namespace = 'controller' # if not done, will error setup_tower_managed_defaults tower_type.save(update_fields=['name', 'namespace']) - ModernCredentialType.setup_tower_managed_defaults() + ModernCredentialType.setup_tower_managed_defaults(apps) def backwards(apps, schema_editor): diff --git a/awx/main/migrations/_galaxy.py b/awx/main/migrations/_galaxy.py index 1c0652e9a1..6601fb3472 100644 --- a/awx/main/migrations/_galaxy.py +++ b/awx/main/migrations/_galaxy.py @@ -19,7 +19,7 @@ def migrate_galaxy_settings(apps, schema_editor): # nothing to migrate return set_current_apps(apps) - ModernCredentialType.setup_tower_managed_defaults() + ModernCredentialType.setup_tower_managed_defaults(apps) CredentialType = apps.get_model('main', 'CredentialType') Credential = apps.get_model('main', 'Credential') Setting = apps.get_model('conf', 'Setting') @@ -37,10 +37,15 @@ def migrate_galaxy_settings(apps, schema_editor): try: # Needed for old migrations public_galaxy_credential = Credential( - created=now(), modified=now(), name='Ansible Galaxy', managed_by_tower=True, credential_type=galaxy_type, inputs={'url': 'https://galaxy.ansible.com/'} + created=now(), + modified=now(), + name='Ansible Galaxy', + managed_by_tower=True, + credential_type=galaxy_type, + inputs={'url': 'https://galaxy.ansible.com/'}, ) except: - # This will make functionaly tests pass + # Needed for new migrations, tests public_galaxy_credential = Credential( created=now(), modified=now(), name='Ansible Galaxy', managed=True, credential_type=galaxy_type, inputs={'url': 'https://galaxy.ansible.com/'} ) diff --git a/awx/main/models/credential/__init__.py b/awx/main/models/credential/__init__.py index e3a547a44a..ca58106942 100644 --- a/awx/main/models/credential/__init__.py +++ b/awx/main/models/credential/__init__.py @@ -19,6 +19,7 @@ from django.utils.translation import ugettext_lazy as _, ugettext_noop from django.core.exceptions import ValidationError from django.utils.encoding import force_text from django.utils.functional import cached_property +from django.utils.timezone import now # AWX from awx.api.versioning import reverse @@ -395,9 +396,13 @@ class CredentialType(CommonModelNameNotUnique): return dict((k, functools.partial(v.create)) for k, v in ManagedCredentialType.registry.items()) @classmethod - def setup_tower_managed_defaults(cls): + def setup_tower_managed_defaults(cls, apps=None): + if apps is not None: + ct_class = apps.get_model('main', 'CredentialType') + else: + ct_class = CredentialType for default in ManagedCredentialType.registry.values(): - existing = CredentialType.objects.filter(name=default.name, kind=default.kind).first() + existing = ct_class.objects.filter(name=default.name, kind=default.kind).first() if existing is not None: existing.namespace = default.namespace existing.inputs = {} @@ -405,7 +410,11 @@ class CredentialType(CommonModelNameNotUnique): existing.save() continue logger.debug(_("adding %s credential type" % default.name)) - created = default.create() + params = default.get_creation_params() + if 'managed' not in [f.name for f in ct_class._meta.get_fields()]: + params['managed_by_tower'] = params.pop('managed') + params['created'] = params['modified'] = now() # CreatedModifiedModel service + created = ct_class(**params) created.inputs = created.injectors = {} created.save() @@ -556,8 +565,8 @@ class ManagedCredentialType(SimpleNamespace): ) ManagedCredentialType.registry[namespace] = self - def create(self): - return CredentialType( + def get_creation_params(self): + return dict( namespace=self.namespace, kind=self.kind, name=self.name, @@ -566,6 +575,9 @@ class ManagedCredentialType(SimpleNamespace): injectors=self.injectors, ) + def create(self): + return CredentialType(**self.get_creation_params()) + ManagedCredentialType( namespace='ssh',