Implement Remote class

This commit is contained in:
Thibault Jouan 2013-08-03 22:25:51 +00:00
parent 3e3547d3be
commit 6e1ba269eb
4 changed files with 53 additions and 0 deletions

View File

@ -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'

View File

@ -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

View File

@ -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'

View File

@ -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