diff --git a/lib/producer/core.rb b/lib/producer/core.rb index 3e8ceb0..4ebe692 100644 --- a/lib/producer/core.rb +++ b/lib/producer/core.rb @@ -4,6 +4,7 @@ require 'producer/core/env' require 'producer/core/errors' require 'producer/core/recipe' require 'producer/core/recipe/dsl' +require 'producer/core/remote' require 'producer/core/task' require 'producer/core/task/dsl' require 'producer/core/version' diff --git a/lib/producer/core/remote.rb b/lib/producer/core/remote.rb new file mode 100644 index 0000000..579c2b2 --- /dev/null +++ b/lib/producer/core/remote.rb @@ -0,0 +1,18 @@ +module Producer + module Core + class Remote + require 'etc' + require 'net/ssh' + + attr_accessor :hostname + + def initialize(hostname) + @hostname = hostname + end + + def session + @session ||= Net::SSH.start(@hostname, Etc.getlogin) + end + end + end +end diff --git a/producer-core.gemspec b/producer-core.gemspec index 4f41a8d..b28adfb 100644 --- a/producer-core.gemspec +++ b/producer-core.gemspec @@ -19,6 +19,8 @@ Gem::Specification.new do |s| s.executables = s.files.grep(/\Abin\//) { |f| File.basename(f) } + s.add_dependency 'net-ssh' + s.add_development_dependency 'rspec' s.add_development_dependency 'cucumber' s.add_development_dependency 'aruba' diff --git a/spec/producer/core/remote_spec.rb b/spec/producer/core/remote_spec.rb new file mode 100644 index 0000000..0856d96 --- /dev/null +++ b/spec/producer/core/remote_spec.rb @@ -0,0 +1,32 @@ +require 'spec_helper' + +module Producer::Core + describe Remote do + let(:hostname) { 'some_host.example' } + subject(:remote) { Remote.new(hostname) } + + describe '#hostname' do + it 'returns the assignated hostname' do + expect(remote.hostname).to be hostname + end + end + + describe '#session' do + it 'builds a new SSH session to the remote host' do + expect(Net::SSH).to receive(:start).with(hostname, Etc.getlogin) + remote.session + end + + it 'returns the session' do + session = double('SSH session') + allow(Net::SSH).to receive(:start) { session } + expect(remote.session).to eq session + end + + it 'memoizes the session' do + allow(Net::SSH).to receive(:start) { Object.new } + expect(remote.session).to be remote.session + end + end + end +end