diff --git a/awx/main/models/inventory.py b/awx/main/models/inventory.py index 389b41e73c..a186e018a0 100644 --- a/awx/main/models/inventory.py +++ b/awx/main/models/inventory.py @@ -1441,6 +1441,19 @@ class InventorySource(UnifiedJobTemplate, InventorySourceOptions): def create_inventory_update(self, **kwargs): return self.create_unified_job(**kwargs) + def create_unified_job(self, **kwargs): + # Use special name, if name not already specified + if self.inventory: + if '_eager_fields' not in kwargs: + kwargs['_eager_fields'] = {} + if 'name' not in kwargs['_eager_fields']: + name = '{} - {}'.format(self.inventory.name, self.name) + name_field = self._meta.get_field('name') + if len(name) > name_field.max_length: + name = name[:name_field.max_length] + kwargs['_eager_fields']['name'] = name + return super(InventorySource, self).create_unified_job(**kwargs) + @property def cache_timeout_blocked(self): if not self.last_job_run: @@ -1568,15 +1581,6 @@ class InventoryUpdate(UnifiedJob, InventorySourceOptions, JobNotificationMixin, websocket_data.update(dict(group_id=self.inventory_source.deprecated_group.id)) return websocket_data - def save(self, *args, **kwargs): - update_fields = kwargs.get('update_fields', []) - inventory_source = self.inventory_source - if inventory_source.inventory and self.name == inventory_source.name: - self.name = inventory_source.inventory.name - if 'name' not in update_fields: - update_fields.append('name') - super(InventoryUpdate, self).save(*args, **kwargs) - def get_absolute_url(self, request=None): return reverse('api:inventory_update_detail', kwargs={'pk': self.pk}, request=request) diff --git a/awx/main/tests/functional/models/test_inventory.py b/awx/main/tests/functional/models/test_inventory.py index 7a537e6a2a..164cce4844 100644 --- a/awx/main/tests/functional/models/test_inventory.py +++ b/awx/main/tests/functional/models/test_inventory.py @@ -149,6 +149,22 @@ def setup_inventory_groups(inventory, group_factory): groupB.save() +@pytest.mark.django_db +def test_inventory_update_name(inventory, inventory_source): + iu = inventory_source.update() + assert inventory_source.name != inventory.name + assert iu.name == inventory.name + ' - ' + inventory_source.name + + +@pytest.mark.django_db +def test_inventory_update_excessively_long_name(inventory, inventory_source): + inventory.name = 'a' * 400 # field max length 512 + inventory_source.name = 'b' * 400 + iu = inventory_source.update() + assert inventory_source.name != inventory.name + assert iu.name.startswith(inventory.name) + + @pytest.mark.django_db class TestHostManager: def test_host_filter_not_smart(self, setup_ec2_gce, organization):