diff --git a/lib/puppet/resource_api/base_context.rb b/lib/puppet/resource_api/base_context.rb index 910a7d81..1c44d1f0 100644 --- a/lib/puppet/resource_api/base_context.rb +++ b/lib/puppet/resource_api/base_context.rb @@ -25,6 +25,10 @@ def device raise 'Received device() on an unprepared BaseContext. Use a PuppetContext instead.' end + def transport + raise 'No transport available.' + end + def failed? @failed end diff --git a/lib/puppet/resource_api/io_context.rb b/lib/puppet/resource_api/io_context.rb index d31143c4..3efdde63 100644 --- a/lib/puppet/resource_api/io_context.rb +++ b/lib/puppet/resource_api/io_context.rb @@ -1,11 +1,14 @@ require 'puppet/resource_api/base_context' # Implement Resource API Conext to log through an IO object, defaulting to `$stderr`. -# There is no access to a device here. +# There is no access to a device here. You can supply a transport if necessary. class Puppet::ResourceApi::IOContext < Puppet::ResourceApi::BaseContext - def initialize(definition, target = $stderr) + attr_reader :transport + + def initialize(definition, target = $stderr, transport = nil) super(definition) @target = target + @transport = transport end protected diff --git a/lib/puppet/resource_api/puppet_context.rb b/lib/puppet/resource_api/puppet_context.rb index 6dd23a51..be057bcc 100644 --- a/lib/puppet/resource_api/puppet_context.rb +++ b/lib/puppet/resource_api/puppet_context.rb @@ -2,7 +2,7 @@ require 'puppet/util/logging' # Implement Resource API Context to log through Puppet facilities -# and access/expose the puppet process' current device +# and access/expose the puppet process' current device/transport class Puppet::ResourceApi::PuppetContext < Puppet::ResourceApi::BaseContext def device # TODO: evaluate facter_url setting for loading config if there is no `current` NetworkDevice @@ -10,6 +10,10 @@ def device Puppet::Util::NetworkDevice.current end + def transport + device.transport + end + def log_exception(exception, message: 'Error encountered', trace: false) super(exception, message: message, trace: trace || Puppet[:trace]) end diff --git a/lib/puppet/resource_api/transport/wrapper.rb b/lib/puppet/resource_api/transport/wrapper.rb index 81febbcb..a8b102d2 100644 --- a/lib/puppet/resource_api/transport/wrapper.rb +++ b/lib/puppet/resource_api/transport/wrapper.rb @@ -4,7 +4,7 @@ # Puppet::ResourceApi::Transport::Wrapper` to interface between the Util::NetworkDevice class Puppet::ResourceApi::Transport::Wrapper - attr_reader :transport + attr_reader :transport, :schema def initialize(name, url_or_config) if url_or_config.is_a? String diff --git a/spec/fixtures/test_module/lib/puppet/util/network_device/test_device/device.rb b/spec/fixtures/test_module/lib/puppet/util/network_device/test_device/device.rb index 7fb6ebd6..505209a5 100644 --- a/spec/fixtures/test_module/lib/puppet/util/network_device/test_device/device.rb +++ b/spec/fixtures/test_module/lib/puppet/util/network_device/test_device/device.rb @@ -1,10 +1,10 @@ -require 'puppet/util/network_device/simple/device' +require 'puppet/resource_api/transport/wrapper' module Puppet::Util::NetworkDevice::Test_device # rubocop:disable Style/ClassAndModuleCamelCase - # A simple test device returning hardcoded facts - class Device < Puppet::Util::NetworkDevice::Simple::Device - def facts - { 'foo' => 'bar' } + class Device < Puppet::ResourceApi::Transport::Wrapper + def initialize(url_or_config, _options = {}) + puts url_or_config.inspect + super('test_device', url_or_config) end end end diff --git a/spec/puppet/resource_api/base_context_spec.rb b/spec/puppet/resource_api/base_context_spec.rb index 1c85129d..9569faf3 100644 --- a/spec/puppet/resource_api/base_context_spec.rb +++ b/spec/puppet/resource_api/base_context_spec.rb @@ -341,6 +341,10 @@ def send_log(log, msg) it { expect { described_class.new(definition).device }.to raise_error RuntimeError, %r{Received device\(\) on an unprepared BaseContext\. Use a PuppetContext instead} } end + describe '#transport' do + it { expect { described_class.new(definition).transport }.to raise_error RuntimeError, %r{No transport available\.} } + end + describe '#send_log' do it { expect { described_class.new(definition).send_log(nil, nil) }.to raise_error RuntimeError, %r{Received send_log\(\) on an unprepared BaseContext\. Use IOContext, or PuppetContext instead} } end diff --git a/spec/puppet/resource_api/io_context_spec.rb b/spec/puppet/resource_api/io_context_spec.rb index 266095d0..a4cb8aa5 100644 --- a/spec/puppet/resource_api/io_context_spec.rb +++ b/spec/puppet/resource_api/io_context_spec.rb @@ -2,9 +2,10 @@ require 'puppet/resource_api/io_context' RSpec.describe Puppet::ResourceApi::IOContext do - subject(:context) { described_class.new(definition, io) } + subject(:context) { described_class.new(definition, io, transport) } let(:definition) { { name: 'some_resource', attributes: {} } } + let(:transport) { nil } let(:io) { StringIO.new('', 'w') } @@ -18,4 +19,13 @@ expect(io.string).to match %r{warning}i end end + + describe '#transport' do + it { expect(context.transport).to be_nil } + context 'when passing in a transport' do + let(:transport) { instance_double(Object, 'transport') } + + it { expect(context.transport).to eq transport } + end + end end diff --git a/spec/puppet/resource_api/puppet_context_spec.rb b/spec/puppet/resource_api/puppet_context_spec.rb index 96a3683e..dbc70c8b 100644 --- a/spec/puppet/resource_api/puppet_context_spec.rb +++ b/spec/puppet/resource_api/puppet_context_spec.rb @@ -18,7 +18,21 @@ end end - context 'with no NetworkDevice configured' do + context 'when a Transport::Wrapper device is configured' do + let(:device) { instance_double('Puppet::Util::NetworkDevice::Test_device::Device', 'device') } + let(:transport) { instance_double('Puppet::Transport::TestDevice', 'transport') } + + before(:each) do + allow(Puppet::Util::NetworkDevice).to receive(:current).and_return(device) + allow(device).to receive(:transport).and_return(transport) + end + + it 'returns the transport' do + expect(context.transport).to eq(transport) + end + end + + context 'with nothing configured' do before(:each) do allow(Puppet::Util::NetworkDevice).to receive(:current).and_return(nil) end