From e3fa969d864e6d6a70d687a2ba406bea84bde526 Mon Sep 17 00:00:00 2001 From: Dave Armstrong Date: Mon, 26 Mar 2018 14:58:56 +0100 Subject: [PATCH] (PDK-884) Handle missing namevars returned by providers --- lib/puppet/resource_api.rb | 3 +++ .../provider/title_provider/title_provider.rb | 4 +-- spec/puppet/resource_api_spec.rb | 25 +++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/puppet/resource_api.rb b/lib/puppet/resource_api.rb index 3de3e70f..d49f3098 100644 --- a/lib/puppet/resource_api.rb +++ b/lib/puppet/resource_api.rb @@ -200,6 +200,9 @@ def feature_support?(feature) property = definition[:attributes][key.first] attr_def[key.first] = property end + if resource_hash[namevar_name].nil? + raise Puppet::ResourceError, "`#{name}.get` did not return a value for the `#{namevar_name}` namevar attribute" + end Puppet::ResourceApi::TypeShim.new(resource_hash[namevar_name], resource_hash, name, namevar_name, attr_def) end end diff --git a/spec/fixtures/test_module/lib/puppet/provider/title_provider/title_provider.rb b/spec/fixtures/test_module/lib/puppet/provider/title_provider/title_provider.rb index fedb70d7..107fe981 100644 --- a/spec/fixtures/test_module/lib/puppet/provider/title_provider/title_provider.rb +++ b/spec/fixtures/test_module/lib/puppet/provider/title_provider/title_provider.rb @@ -6,11 +6,11 @@ class Puppet::Provider::TitleProvider::TitleProvider < Puppet::ResourceApi::Simp def get(_context) [ { - name: 'foo', + namevar: 'foo', ensure: :present, }, { - name: 'bar', + namevar: 'bar', ensure: :present, }, ] diff --git a/spec/puppet/resource_api_spec.rb b/spec/puppet/resource_api_spec.rb index bee3413d..0fc0fbb2 100644 --- a/spec/puppet/resource_api_spec.rb +++ b/spec/puppet/resource_api_spec.rb @@ -471,6 +471,31 @@ def extract_values(function) it('the namevar is set to the name') { expect(instance[:not_name]).to eq 'test' } end end + + describe 'a provider that does not return the namevar', agent_test: true do + subject(:instance) { Puppet::Type.type(:not_name_namevar) } + + let(:provider_class) do + Class.new do + def get(_context) + [{ name: 'some title' }] + end + + def set(_context, changes) end + end + end + + before(:each) do + stub_const('Puppet::Provider::NotNameNamevar', Module.new) + stub_const('Puppet::Provider::NotNameNamevar::NotNameNamevar', provider_class) + end + + it('throws an error') { + expect { + instance.instances + }.to raise_error Puppet::ResourceError, %r{^`not_name_namevar.get` did not return a value for the `not_name` namevar attribute$} + } + end end describe '#load_provider', agent_test: true do