diff --git a/app/models.py b/app/models.py index bdbd11fcacc34233d7665f5d4d70169d24489bb6..0214a12f5e50c23787a9656c63456362edc3c7c8 100644 --- a/app/models.py +++ b/app/models.py @@ -1044,7 +1044,7 @@ class AnsibleGroup(CreatedMixin, db.Model): Host.query.join(Host.interfaces) .join(Interface.network) .join(Network.scope) - .filter(NetworkScope.name == self.name) + .filter(NetworkScope.name == self.name, Interface.name == Host.name) .order_by(Host.name) .all() ) @@ -1052,7 +1052,7 @@ class AnsibleGroup(CreatedMixin, db.Model): return ( Host.query.join(Host.interfaces) .join(Interface.network) - .filter(Network.vlan_name == self.name) + .filter(Network.vlan_name == self.name, Interface.name == Host.name) .order_by(Host.name) .all() ) diff --git a/tests/functional/test_models.py b/tests/functional/test_models.py index 84930807067c2d7dac6531ed2d086eb884aac9ae..4c25661f547091cd97fe29a17195bafd1fc7c3e1 100644 --- a/tests/functional/test_models.py +++ b/tests/functional/test_models.py @@ -271,24 +271,25 @@ def test_ansible_dynamic_network_group( ): network1 = network_factory(vlan_name="network1") network2 = network_factory(vlan_name="network2") - interface1_n1 = interface_factory(network=network1) - interface2_n1 = interface_factory(network=network1) - interface1_n2 = interface_factory(network=network2) - host1_n1 = host_factory(name="host1", interfaces=[interface1_n1]) - host2_n1 = host_factory(name="host2", interfaces=[interface2_n1]) - host1_n2 = host_factory(interfaces=[interface1_n2]) - group_n1 = ansible_group_factory( + host1 = host_factory(name="host1") + host2 = host_factory(name="host2") + host3 = host_factory(name="host3") + interface_factory(name="host1", host=host1, network=network1) + interface_factory(name="host2", host=host2, network=network1) + interface_factory(name="host2-2", host=host2, network=network2) + interface_factory(name="host3", host=host3, network=network2) + group1 = ansible_group_factory( name="network1", type=models.AnsibleGroupType.NETWORK ) - group_n2 = ansible_group_factory( + group2 = ansible_group_factory( name="network2", type=models.AnsibleGroupType.NETWORK ) - group_n3 = ansible_group_factory( - name="unknown", type=models.AnsibleGroupType.NETWORK - ) - assert group_n1.hosts == [host1_n1, host2_n1] - assert group_n2.hosts == [host1_n2] - assert group_n3.hosts == [] + group3 = ansible_group_factory(name="unknown", type=models.AnsibleGroupType.NETWORK) + # host2 has an interface on network1 and one on network2. + # It's only in group1, because its main interface (same name as host) is on network1. + assert group1.hosts == [host1, host2] + assert group2.hosts == [host3] + assert group3.hosts == [] def test_ansible_dynamic_network_scope_group( @@ -300,27 +301,30 @@ def test_ansible_dynamic_network_scope_group( ): scope1 = network_scope_factory(name="scope1") scope2 = network_scope_factory(name="scope2") - network1_s1 = network_factory(scope=scope1) - network2_s1 = network_factory(scope=scope1) - network1_s2 = network_factory(scope=scope2) - interface1_s1 = interface_factory(network=network1_s1) - interface2_s1 = interface_factory(network=network2_s1) - interface1_s2 = interface_factory(network=network1_s2) - host1_s1 = host_factory(name="host1", interfaces=[interface1_s1]) - host2_s1 = host_factory(name="host2", interfaces=[interface2_s1]) - host1_s2 = host_factory(interfaces=[interface1_s2]) - group_s1 = ansible_group_factory( + network1 = network_factory(scope=scope1) + network2 = network_factory(scope=scope1) + network3 = network_factory(scope=scope2) + host1 = host_factory(name="host1") + host2 = host_factory(name="host2") + host3 = host_factory(name="host3") + interface_factory(name="host1", host=host1, network=network1) + interface_factory(name="host2", host=host2, network=network2) + interface_factory(name="host2-2", host=host2, network=network3) + interface_factory(name="host3", host=host3, network=network3) + group1 = ansible_group_factory( name="scope1", type=models.AnsibleGroupType.NETWORK_SCOPE ) - group_s2 = ansible_group_factory( + group2 = ansible_group_factory( name="scope2", type=models.AnsibleGroupType.NETWORK_SCOPE ) - group_s3 = ansible_group_factory( + group3 = ansible_group_factory( name="unknown", type=models.AnsibleGroupType.NETWORK_SCOPE ) - assert group_s1.hosts == [host1_s1, host2_s1] - assert group_s2.hosts == [host1_s2] - assert group_s3.hosts == [] + # host2 has an interface on scope1 and one on scope2. + # It's only in group1, because its main interface (same name as host) is on scope1. + assert group1.hosts == [host1, host2] + assert group2.hosts == [host3] + assert group3.hosts == [] @pytest.mark.parametrize("status", [None, "FINISHED", "FAILED", "STARTED"])