From dfd4cb55e57e5420f9e24fed77597c0da61221a2 Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Fri, 5 Apr 2019 16:29:27 -0400 Subject: [PATCH] add a unique UUID for identifying an AWX installation --- awx/conf/registry.py | 2 +- awx/conf/settings.py | 3 ++- awx/main/analytics/collectors.py | 3 ++- awx/main/conf.py | 9 +++++++ .../0069_v350_generate_unique_install_uuid.py | 26 +++++++++++++++++++ awx/main/utils/formatters.py | 7 +++++ 6 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 awx/main/migrations/0069_v350_generate_unique_install_uuid.py diff --git a/awx/conf/registry.py b/awx/conf/registry.py index 23c45b078c..6ce5cff828 100644 --- a/awx/conf/registry.py +++ b/awx/conf/registry.py @@ -100,7 +100,7 @@ class SettingsRegistry(object): if kwargs.get('category_slug', None) in slugs_to_ignore: continue if (read_only in {True, False} and kwargs.get('read_only', False) != read_only and - setting not in ('AWX_ISOLATED_PRIVATE_KEY', 'AWX_ISOLATED_PUBLIC_KEY')): + setting not in ('INSTALL_UUID', 'AWX_ISOLATED_PRIVATE_KEY', 'AWX_ISOLATED_PUBLIC_KEY')): # Note: Doesn't catch fields that set read_only via __init__; # read-only field kwargs should always include read_only=True. continue diff --git a/awx/conf/settings.py b/awx/conf/settings.py index 0e05b97bee..b301681613 100644 --- a/awx/conf/settings.py +++ b/awx/conf/settings.py @@ -381,8 +381,9 @@ class SettingsWrapper(UserSettingsHolder): setting = None setting_id = None if not field.read_only or name in ( - # these two values are read-only - however - we *do* want + # these values are read-only - however - we *do* want # to fetch their value from the database + 'INSTALL_UUID', 'AWX_ISOLATED_PRIVATE_KEY', 'AWX_ISOLATED_PUBLIC_KEY', ): diff --git a/awx/main/analytics/collectors.py b/awx/main/analytics/collectors.py index ed6aeb819e..576ab3addb 100644 --- a/awx/main/analytics/collectors.py +++ b/awx/main/analytics/collectors.py @@ -46,7 +46,8 @@ def config(since): 'release': platform.release(), 'type': install_type, }, - 'system_uuid': settings.SYSTEM_UUID, + 'install_uuid': settings.INSTALL_UUID, + 'instance_uuid': settings.SYSTEM_UUID, 'tower_url_base': settings.TOWER_URL_BASE, 'tower_version': get_awx_version(), 'ansible_version': get_ansible_version(), diff --git a/awx/main/conf.py b/awx/main/conf.py index 2ca631627d..941926f75a 100644 --- a/awx/main/conf.py +++ b/awx/main/conf.py @@ -126,6 +126,15 @@ register( category_slug='system', ) +register( + 'INSTALL_UUID', + field_class=fields.CharField, + label=_('Unique identifier for an AWX/Tower installation'), + category=_('System'), + category_slug='system', + read_only=True, +) + register( 'CUSTOM_VENV_PATHS', field_class=fields.StringListPathField, diff --git a/awx/main/migrations/0069_v350_generate_unique_install_uuid.py b/awx/main/migrations/0069_v350_generate_unique_install_uuid.py new file mode 100644 index 0000000000..179e4a764d --- /dev/null +++ b/awx/main/migrations/0069_v350_generate_unique_install_uuid.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2019-04-05 20:19 +from __future__ import unicode_literals +from uuid import uuid4 + +from django.db import migrations, models +from django.utils.timezone import now + + +def _gen_install_uuid(apps, schema_editor): + Setting = apps.get_model('conf', 'Setting') + Setting( + key='INSTALL_UUID', + value=str(uuid4()), + created=now(), + modified=now(), + ).save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0068_v350_index_event_created'), + ] + + operations = [migrations.RunPython(_gen_install_uuid)] diff --git a/awx/main/utils/formatters.py b/awx/main/utils/formatters.py index 6009c03157..2dedf44311 100644 --- a/awx/main/utils/formatters.py +++ b/awx/main/utils/formatters.py @@ -237,6 +237,13 @@ class LogstashFormatter(LogstashFormatterBase): fields[log_name] = getattr(settings, setting_name, None) elif log_name == 'type': fields[log_name] = 'other' + + uuid = ( + getattr(settings, 'LOG_AGGREGATOR_TOWER_UUID', None) or + getattr(settings, 'INSTALL_UUID', None) + ) + if uuid: + fields['tower_uuid'] = uuid return fields def format(self, record):