From 30757f82890a4698c66a9e506ba822fc333b1ccf Mon Sep 17 00:00:00 2001 From: Jake Jackson Date: Fri, 22 May 2020 09:26:38 -0400 Subject: [PATCH] moved logic to the validate function and fixed tests accordingly --- awx/api/serializers.py | 16 +++++--- .../tests/functional/api/test_inventory.py | 39 ++++++++++++++----- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 840db64458..0a3fde2936 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -1719,8 +1719,6 @@ class HostSerializer(BaseSerializerWithVariables): name = force_text(value or '') # Validate here only, update in main validate method. host, port = self._get_host_port_from_name(name) - if Group.objects.filter(name=value).exists(): - raise serializers.ValidationError(_('Invalid group name. Name already exists as a Group.')) return value def validate_inventory(self, value): @@ -1733,6 +1731,7 @@ class HostSerializer(BaseSerializerWithVariables): def validate(self, attrs): name = force_text(attrs.get('name', self.instance and self.instance.name or '')) + inventory = attrs.get('inventory', self.instance and self.instance.inventory or '') host, port = self._get_host_port_from_name(name) if port: @@ -1741,7 +1740,9 @@ class HostSerializer(BaseSerializerWithVariables): vars_dict = parse_yaml_or_json(variables) vars_dict['ansible_ssh_port'] = port attrs['variables'] = json.dumps(vars_dict) - + if Group.objects.filter(name=name, inventory=inventory).exists(): + raise serializers.ValidationError(_('A Group with that name already exists.')) + return super(HostSerializer, self).validate(attrs) def to_representation(self, obj): @@ -1807,11 +1808,16 @@ class GroupSerializer(BaseSerializerWithVariables): res['inventory'] = self.reverse('api:inventory_detail', kwargs={'pk': obj.inventory.pk}) return res + def validate(self, attrs): + name = force_text(attrs.get('name', self.instance and self.instance.name or '')) + inventory = attrs.get('inventory', self.instance and self.instance.inventory or '') + if Host.objects.filter(name=name, inventory=inventory).exists(): + raise serializers.ValidationError(_('A Host with that name already exists.')) + return super(GroupSerializer, self).validate(attrs) + def validate_name(self, value): if value in ('all', '_meta'): raise serializers.ValidationError(_('Invalid group name.')) - elif Host.objects.filter(name=value).exists(): - raise serializers.ValidationError(_('Invalid group name. Name already exists as a Host.')) return value def validate_inventory(self, value): diff --git a/awx/main/tests/functional/api/test_inventory.py b/awx/main/tests/functional/api/test_inventory.py index ea4435845a..2f89f0e14a 100644 --- a/awx/main/tests/functional/api/test_inventory.py +++ b/awx/main/tests/functional/api/test_inventory.py @@ -59,21 +59,42 @@ def test_inventory_source_unique_together_with_inv(inventory_factory): is2 = InventorySource(name='foo', source='file', inventory=inv2) is2.validate_unique() + @pytest.mark.django_db def test_inventory_host_name_unique(scm_inventory, post, admin_user): inv_src = scm_inventory.inventory_sources.first() - group = inv_src.groups.create(name='barfoo', inventory=scm_inventory) - group.save() - host1 = inv_src.hosts.create(name='barfoo', inventory=scm_inventory) - post(reverse('api:inventory_hosts_list', kwargs={'pk': host1.id}), admin_user, expect=400) - + inv_src.groups.create(name='barfoo', inventory=scm_inventory) + resp = post( + reverse('api:inventory_hosts_list', kwargs={'pk': scm_inventory.id}), + { + 'name': 'barfoo', + 'inventory_id': scm_inventory.id, + }, + admin_user, + expect=400 + ) + + assert resp.status_code == 400 + assert "A Group with that name already exists." in json.dumps(resp.data) + + @pytest.mark.django_db def test_inventory_group_name_unique(scm_inventory, post, admin_user): inv_src = scm_inventory.inventory_sources.first() - host = inv_src.hosts.create(name='barfoo', inventory=scm_inventory) - host.save() - group = inv_src.groups.create(name='barfoo', inventory=scm_inventory) - post(reverse('api:inventory_groups_list', kwargs={'pk': group.id}), admin_user, expect=400) + inv_src.hosts.create(name='barfoo', inventory=scm_inventory) + resp = post( + reverse('api:inventory_groups_list', kwargs={'pk': scm_inventory.id}), + { + 'name': 'barfoo', + 'inventory_id': scm_inventory.id, + }, + admin_user, + expect=400 + ) + + assert resp.status_code == 400 + assert "A Host with that name already exists." in json.dumps(resp.data) + @pytest.mark.parametrize("role_field,expected_status_code", [ (None, 403),