Skip to content

Commit

Permalink
if the user provides a uuid and it exists, allow that to tie to the i…
Browse files Browse the repository at this point in the history
…nstance, which allows the user to update the instance based on the UUID (includeding updating the hostname) should they choose to do so.
  • Loading branch information
rebeccahhh committed Sep 13, 2021
1 parent 1f34d4c commit b9ec355
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 5 deletions.
18 changes: 15 additions & 3 deletions awx/main/managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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():
Expand All @@ -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.
Expand All @@ -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')
Expand Down
4 changes: 2 additions & 2 deletions awx/main/models/ha.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit b9ec355

Please sign in to comment.