From 3cdc332497b8ee32bd57b0f7dd8a71aad8caab3a Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Fri, 12 May 2017 10:47:49 -0400 Subject: [PATCH] rename insight tracking field; handle duplicate * rename from insights_machine_id to insights_system_id * gracefully handle duplicate insights machine id's --- .../commands/run_fact_cache_receiver.py | 16 +++++++++----- awx/main/migrations/0038_v320_release.py | 4 ++-- awx/main/models/inventory.py | 4 ++-- awx/plugins/library/scan_insights.py | 22 +++++++++---------- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/awx/main/management/commands/run_fact_cache_receiver.py b/awx/main/management/commands/run_fact_cache_receiver.py index 4bc97eea05..72f2fce881 100644 --- a/awx/main/management/commands/run_fact_cache_receiver.py +++ b/awx/main/management/commands/run_fact_cache_receiver.py @@ -12,6 +12,7 @@ from kombu.mixins import ConsumerMixin from django.core.management.base import NoArgsCommand from django.conf import settings from django.utils import timezone +from django.db import IntegrityError # AWX from awx.main.models.jobs import Job @@ -121,11 +122,16 @@ class FactBrokerWorker(ConsumerMixin): if job.store_facts is True: if module_name == 'insights': - try: - host_obj.insights_machine_id = facts['machine_id'] - host_obj.save() - except StandardError: - logger.warn('Failed to find insights machine id in insights fact scan.') + system_id = facts.get('system_id', None) + if system_id: + host_obj.insights_system_id = system_id + try: + host_obj.save() + except IntegrityError: + host_obj.insights_system_id = None + logger.warn('Inisghts system_id %s not assigned to host %s because it already exists.' % (system_id, host_obj.pk)) + else: + logger.warn('Failed to find insights system id in insights fact scan.') self._do_gather_facts_update(host_obj, module_name, facts, self.timestamp) message.ack() diff --git a/awx/main/migrations/0038_v320_release.py b/awx/main/migrations/0038_v320_release.py index cd8aa60024..d28a8cce0b 100644 --- a/awx/main/migrations/0038_v320_release.py +++ b/awx/main/migrations/0038_v320_release.py @@ -240,11 +240,11 @@ class Migration(migrations.Migration): # Insights migrations.AddField( model_name='host', - name='insights_machine_id', + name='insights_system_id', field=models.TextField(default=None, help_text='Red Hat Insights host unique identifier.', null=True, db_index=True, blank=True), ), migrations.AlterUniqueTogether( name='host', - unique_together=set([('insights_machine_id', 'inventory'), ('name', 'inventory')]), + unique_together=set([('insights_system_id', 'inventory'), ('name', 'inventory')]), ), ] diff --git a/awx/main/models/inventory.py b/awx/main/models/inventory.py index a63fa3859e..db4c13f313 100644 --- a/awx/main/models/inventory.py +++ b/awx/main/models/inventory.py @@ -350,7 +350,7 @@ class Host(CommonModelNameNotUnique): class Meta: app_label = 'main' - unique_together = (("name", "inventory"), ("insights_machine_id", "inventory"),) # FIXME: Add ('instance_id', 'inventory') after migration. + unique_together = (("name", "inventory"), ("insights_system_id", "inventory"),) # FIXME: Add ('instance_id', 'inventory') after migration. ordering = ('name',) inventory = models.ForeignKey( @@ -411,7 +411,7 @@ class Host(CommonModelNameNotUnique): default={}, help_text=_('Arbitrary JSON structure of most recent ansible_facts, per-host.'), ) - insights_machine_id = models.TextField( + insights_system_id = models.TextField( blank=True, default=None, null=True, diff --git a/awx/plugins/library/scan_insights.py b/awx/plugins/library/scan_insights.py index 5b6829dcb2..a697cd7d89 100755 --- a/awx/plugins/library/scan_insights.py +++ b/awx/plugins/library/scan_insights.py @@ -20,29 +20,29 @@ EXAMPLES = ''' # host | success >> { # "ansible_facts": { # "insights": { -# "machine_id": "4da7d1f8-14f3-4cdc-acd5-a3465a41f25d" +# "system_id": "4da7d1f8-14f3-4cdc-acd5-a3465a41f25d" # }, ... } ''' -INSIGHTS_MACHINE_ID_FILE='/etc/redhat-access-insights/machine-id' +INSIGHTS_SYSTEM_ID_FILE='/etc/redhat-access-insights/machine-id' -def get_machine_uuid(filname): - machine_uuid = None +def get_system_uuid(filname): + system_uuid = None try: - f = open(INSIGHTS_MACHINE_ID_FILE, "r") + f = open(INSIGHTS_SYSTEM_ID_FILE, "r") except IOError: return None else: try: data = f.readline() - machine_uuid = str(uuid.UUID(data)) + system_uuid = str(uuid.UUID(data)) except (IOError, ValueError): pass finally: f.close() - return machine_uuid + return system_uuid def main(): @@ -50,18 +50,18 @@ def main(): argument_spec = dict() ) - machine_uuid = get_machine_uuid(INSIGHTS_MACHINE_ID_FILE) + system_uuid = get_system_uuid(INSIGHTS_SYSTEM_ID_FILE) - if machine_uuid is not None: + if system_uuid is not None: results = { 'ansible_facts': { 'insights': { - 'machine_id': machine_uuid + 'system_id': system_uuid } } } else: - results = dict(skipped=True, msg="Insights machine id not found") + results = dict(skipped=True, msg="Insights system id not found") module.exit_json(**results)