diff --git a/nailgun/entities.py b/nailgun/entities.py index 3f903fbe..1ab46562 100644 --- a/nailgun/entities.py +++ b/nailgun/entities.py @@ -4417,7 +4417,14 @@ def read(self, entity=None, attrs=None, ignore=None, params=None): # host id is required for interface initialization ignore.add('interface') ignore.add('build_status_label') - if 'Puppet' not in _feature_list(self._server_config): + # Ignore puppetclass attribute if we are running against Puppet disabled + # instance. Ignore it also if the API does not return puppetclasses for + # the given host, but only if it does not have Puppet proxy assigned. + if ( + 'Puppet' not in _feature_list(self._server_config) + or 'puppetclasses' not in attrs + and not attrs['puppet_proxy'] + ): ignore.add('puppetclass') result = super().read(entity, attrs, ignore, params) if attrs.get('image_id'): diff --git a/tests/test_entities.py b/tests/test_entities.py index 97afd1c8..aa53d1c6 100644 --- a/tests/test_entities.py +++ b/tests/test_entities.py @@ -1251,8 +1251,8 @@ def test_entity_ids(self): ), ( entities.Host(self.cfg), - {'parameters': None}, - {'host_parameters_attributes': None}, + {'parameters': None, 'puppet_proxy': None}, + {'host_parameters_attributes': None, 'puppet_proxy': None}, ), ( entities.Filter(self.cfg), @@ -1460,6 +1460,7 @@ def test_host_with_interface(self): return_value={ 'interfaces': [{'id': 2}, {'id': 3}], 'parameters': None, + 'puppet_proxy': None, }, ): with mock.patch.object( @@ -1747,6 +1748,7 @@ def test_host_with_image(self): 'image_id': 1, 'compute_resource_id': 1, 'parameters': {}, + 'puppet_proxy': None, } read.return_value = host host = host.read() @@ -1755,6 +1757,7 @@ def test_host_with_image(self): # Image wasn't set read_json.return_value = { 'parameters': {}, + 'puppet_proxy': None, } read.return_value = host host = host.read() @@ -3043,6 +3046,7 @@ def test_no_facet_attributes(self): attrs={ 'parameters': None, 'puppetclasses': None, + 'puppet_proxy': None, } ) self.assertNotIn('content_facet_attributes', read.call_args[0][1])