diff --git a/awx/main/managers.py b/awx/main/managers.py index 2408d07d0152..cfcfe4344c22 100644 --- a/awx/main/managers.py +++ b/awx/main/managers.py @@ -12,9 +12,10 @@ from awx.main.utils.common import get_capacity_type from awx.main.constants import RECEPTOR_PENDING -___all__ = ['HostManager', 'InstanceManager', 'InstanceGroupManager', 'DeferJobCreatedManager'] +___all__ = ['HostManager', 'InstanceManager', 'InstanceGroupManager', 'DeferJobCreatedManager', 'UUID_DEFAULT'] logger = logging.getLogger('awx.main.managers') +UUID_DEFAULT = '00000000-0000-0000-0000-000000000000' class DeferJobCreatedManager(models.Manager): @@ -105,7 +106,7 @@ def me(self): """Return the currently active instance.""" # If we are running unit tests, return a stub record. if settings.IS_TESTING(sys.argv) or hasattr(sys, '_called_from_test'): - return self.model(id=1, hostname=settings.CLUSTER_HOST_ID, uuid='00000000-0000-0000-0000-000000000000') + return self.model(id=1, hostname=settings.CLUSTER_HOST_ID, uuid=UUID_DEFAULT) node = self.filter(hostname=settings.CLUSTER_HOST_ID) if node.exists(): @@ -115,6 +116,7 @@ def me(self): def register(self, uuid=None, hostname=None, ip_address=None, node_type='hybrid', defaults=None): if not hostname: hostname = settings.CLUSTER_HOST_ID + with advisory_lock('instance_registration_%s' % hostname): if settings.AWX_AUTO_DEPROVISION_INSTANCES: # detect any instances with the same IP address. @@ -127,11 +129,21 @@ def register(self, uuid=None, hostname=None, ip_address=None, node_type='hybrid' other_inst.save(update_fields=['ip_address']) logger.warning("IP address {0} conflict detected, ip address unset for host {1}.".format(ip_address, other_hostname)) - # Return existing instance that matches hostname + # get the instance based on the hostname instance = self.filter(hostname=hostname) + + # Check or update the existing uuid + if uuid is not None and uuid != UUID_DEFAULT: + if self.filter(uuid=uuid).exists(): + instance = self.filter(uuid=uuid) + + # Return existing instance if instance.exists(): instance = instance.get() update_fields = [] + if instance.hostname != hostname: + instance.hostname = hostname + update_fields.append('hostname') if instance.ip_address != ip_address: instance.ip_address = ip_address update_fields.append('ip_address') diff --git a/awx/main/models/ha.py b/awx/main/models/ha.py index 0b75e4a964d8..d2686708e5ce 100644 --- a/awx/main/models/ha.py +++ b/awx/main/models/ha.py @@ -18,7 +18,7 @@ from awx import __version__ as awx_application_version from awx.api.versioning import reverse -from awx.main.managers import InstanceManager, InstanceGroupManager +from awx.main.managers import InstanceManager, InstanceGroupManager, UUID_DEFAULT from awx.main.fields import JSONField from awx.main.models.base import BaseModel, HasEditsMixin, prevent_search from awx.main.models.unified_jobs import UnifiedJob @@ -59,7 +59,7 @@ class Instance(HasPolicyEditsMixin, BaseModel): objects = InstanceManager() # Fields set in instance registration - uuid = models.CharField(max_length=40, default='00000000-0000-0000-0000-000000000000') + uuid = models.CharField(max_length=40, default=UUID_DEFAULT) hostname = models.CharField(max_length=250, unique=True) ip_address = models.CharField( blank=True,