beaker 1.8.1 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/bin/beaker +1 -1
- data/lib/beaker.rb +1 -1
- data/lib/beaker/cli.rb +15 -35
- data/lib/beaker/host_prebuilt_steps.rb +335 -0
- data/lib/beaker/hypervisor.rb +53 -4
- data/lib/beaker/hypervisor/aixer.rb +2 -2
- data/lib/beaker/hypervisor/blimper.rb +5 -5
- data/lib/beaker/hypervisor/fusion.rb +3 -3
- data/lib/beaker/hypervisor/solaris.rb +2 -2
- data/lib/beaker/hypervisor/vagrant.rb +6 -16
- data/lib/beaker/hypervisor/vcloud.rb +6 -6
- data/lib/beaker/hypervisor/vcloud_pooled.rb +4 -4
- data/lib/beaker/hypervisor/vsphere.rb +3 -3
- data/lib/beaker/network_manager.rb +51 -37
- data/lib/beaker/options/presets.rb +1 -0
- data/lib/beaker/shared.rb +2 -2
- data/lib/beaker/shared/host_role_parser.rb +36 -0
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/host_prebuilt_steps_spec.rb +421 -0
- data/spec/beaker/hypervisor/google_compute.rb +23 -0
- data/spec/beaker/hypervisor/vagrant_spec.rb +5 -4
- data/spec/beaker/hypervisor/vcloud_pooled_spec.rb +2 -2
- data/spec/beaker/hypervisor/vcloud_spec.rb +2 -2
- data/spec/beaker/hypervisor/vsphere_spec.rb +2 -2
- data/spec/beaker/options/parser_spec.rb +1 -1
- data/spec/beaker/shared/host_role_parser_spec.rb +58 -0
- metadata +10 -18
- data/lib/beaker/shared/host_handler.rb +0 -51
- data/lib/beaker/utils.rb +0 -7
- data/lib/beaker/utils/ntp_control.rb +0 -57
- data/lib/beaker/utils/repo_control.rb +0 -90
- data/lib/beaker/utils/setup_helper.rb +0 -66
- data/lib/beaker/utils/validator.rb +0 -36
- data/spec/beaker/shared/host_handler_spec.rb +0 -104
- data/spec/beaker/utils/ntp_control_spec.rb +0 -70
- data/spec/beaker/utils/repo_control_spec.rb +0 -168
- data/spec/beaker/utils/setup_helper_spec.rb +0 -82
- data/spec/beaker/utils/validator_spec.rb +0 -91
@@ -1,66 +0,0 @@
|
|
1
|
-
module Beaker
|
2
|
-
module Utils
|
3
|
-
class SetupHelper
|
4
|
-
ETC_HOSTS_PATH = "/etc/hosts"
|
5
|
-
ETC_HOSTS_PATH_SOLARIS = "/etc/inet/hosts"
|
6
|
-
ROOT_KEYS_SCRIPT = "https://raw.github.com/puppetlabs/puppetlabs-sshkeys/master/templates/scripts/manage_root_authorized_keys"
|
7
|
-
ROOT_KEYS_SYNC_CMD = "curl -k -o - #{ROOT_KEYS_SCRIPT} | %s"
|
8
|
-
|
9
|
-
def initialize(options, hosts)
|
10
|
-
@options = options.dup
|
11
|
-
@hosts = hosts
|
12
|
-
@logger = options[:logger]
|
13
|
-
end
|
14
|
-
|
15
|
-
def add_master_entry
|
16
|
-
@logger.notify "Add Master entry to /etc/hosts"
|
17
|
-
master = only_host_with_role(@hosts, :master)
|
18
|
-
if master["hypervisor"] and master["hypervisor"] =~ /vagrant/
|
19
|
-
@logger.debug "Don't update master entry on vagrant masters"
|
20
|
-
return
|
21
|
-
end
|
22
|
-
@logger.debug "Get ip address of Master #{master}"
|
23
|
-
if master['platform'].include? 'solaris'
|
24
|
-
stdout = master.exec(Command.new("ifconfig -a inet| awk '/broadcast/ {print $2}' | cut -d/ -f1 | head -1")).stdout
|
25
|
-
else
|
26
|
-
stdout = master.exec(Command.new("ip a|awk '/global/{print$2}' | cut -d/ -f1 | head -1")).stdout
|
27
|
-
end
|
28
|
-
ip=stdout.chomp
|
29
|
-
|
30
|
-
path = ETC_HOSTS_PATH
|
31
|
-
if master['platform'].include? 'solaris'
|
32
|
-
path = ETC_HOSTS_PATH_SOLARIS
|
33
|
-
end
|
34
|
-
|
35
|
-
@logger.debug "Update %s on #{master}" % path
|
36
|
-
# Preserve the mode the easy way...
|
37
|
-
master.exec(Command.new("cp %s %s.old" % [path, path]))
|
38
|
-
master.exec(Command.new("cp %s %s.new" % [path, path]))
|
39
|
-
master.exec(Command.new("grep -v '#{ip} #{master}' %s > %s.new" % [path, path]))
|
40
|
-
master.exec(Command.new("echo '#{ip} #{master}' >> %s.new" % path))
|
41
|
-
master.exec(Command.new("mv %s.new %s" % [path, path]))
|
42
|
-
rescue => e
|
43
|
-
report_and_raise(@logger, e, "add_master_entry")
|
44
|
-
end
|
45
|
-
|
46
|
-
def sync_root_keys
|
47
|
-
# JJM This step runs on every system under test right now. We're anticipating
|
48
|
-
# issues on Windows and maybe Solaris. We will likely need to filter this step
|
49
|
-
# but we're deliberately taking the approach of "assume it will work, fix it
|
50
|
-
# when reality dictates otherwise"
|
51
|
-
@logger.notify "Sync root authorized_keys from github"
|
52
|
-
@hosts.each do |host|
|
53
|
-
# Allow all exit code, as this operation is unlikely to cause problems if it fails.
|
54
|
-
if host['platform'].include? 'solaris'
|
55
|
-
host.exec(Command.new(ROOT_KEYS_SYNC_CMD % "bash"), :acceptable_exit_codes => (0..255))
|
56
|
-
else
|
57
|
-
host.exec(Command.new(ROOT_KEYS_SYNC_CMD % "env PATH=/usr/gnu/bin:$PATH bash"), :acceptable_exit_codes => (0..255))
|
58
|
-
end
|
59
|
-
end
|
60
|
-
rescue => e
|
61
|
-
report_and_raise(@logger, e, "sync_root_keys")
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
module Beaker
|
2
|
-
module Utils
|
3
|
-
module Validator
|
4
|
-
PACKAGES = ['curl']
|
5
|
-
UNIX_PACKAGES = ['ntpdate']
|
6
|
-
SLES_PACKAGES = ['ntp']
|
7
|
-
|
8
|
-
def self.validate(hosts, logger)
|
9
|
-
hosts.each do |host|
|
10
|
-
PACKAGES.each do |pkg|
|
11
|
-
if not host.check_for_package pkg
|
12
|
-
host.install_package pkg
|
13
|
-
end
|
14
|
-
end
|
15
|
-
case
|
16
|
-
when host['platform'] =~ /sles-/
|
17
|
-
SLES_PACKAGES.each do |pkg|
|
18
|
-
if not host.check_for_package pkg
|
19
|
-
host.install_package pkg
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
when host['platform'] !~ /(windows)|(aix)|(solaris)/
|
24
|
-
UNIX_PACKAGES.each do |pkg|
|
25
|
-
if not host.check_for_package pkg
|
26
|
-
host.install_package pkg
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
rescue => e
|
32
|
-
report_and_raise(logger, e, "validate")
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,104 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Beaker
|
4
|
-
module Shared
|
5
|
-
describe HostHandler do
|
6
|
-
let( :host_handler ) { Beaker::Shared::HostHandler }
|
7
|
-
let( :platform ) { @platform || 'unix' }
|
8
|
-
let( :hosts ) { hosts = make_hosts( { :platform => platform } )
|
9
|
-
hosts[0][:roles] = ['agent']
|
10
|
-
hosts[1][:roles] = ['master', 'dashboard', 'agent', 'database']
|
11
|
-
hosts[2][:roles] = ['agent']
|
12
|
-
hosts }
|
13
|
-
|
14
|
-
context 'get_domain_name' do
|
15
|
-
|
16
|
-
it "can find the domain for a host" do
|
17
|
-
host = make_host('name', { :stdout => "domain labs.lan d.labs.net dc1.labs.net labs.com\nnameserver 10.16.22.10\nnameserver 10.16.22.11" } )
|
18
|
-
|
19
|
-
Command.should_receive( :new ).with( "cat /etc/resolv.conf" ).once
|
20
|
-
|
21
|
-
expect( host_handler.get_domain_name( host ) ).to be === "labs.lan"
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
it "can find the search for a host" do
|
26
|
-
host = make_host('name', { :stdout => "search labs.lan d.labs.net dc1.labs.net labs.com\nnameserver 10.16.22.10\nnameserver 10.16.22.11" } )
|
27
|
-
|
28
|
-
Command.should_receive( :new ).with( "cat /etc/resolv.conf" ).once
|
29
|
-
|
30
|
-
expect( host_handler.get_domain_name( host ) ).to be === "labs.lan"
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context "get_ip" do
|
36
|
-
it "can exec the get_ip command" do
|
37
|
-
host = make_host('name', { :stdout => "192.168.2.130\n" } )
|
38
|
-
|
39
|
-
Command.should_receive( :new ).with( "ip a|awk '/global/{print$2}' | cut -d/ -f1 | head -1" ).once
|
40
|
-
|
41
|
-
expect( host_handler.get_ip( host ) ).to be === "192.168.2.130"
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
context "set_etc_hosts" do
|
48
|
-
it "can set the /etc/hosts string on a host" do
|
49
|
-
host = make_host('name', {})
|
50
|
-
etc_hosts = "127.0.0.1 localhost\n192.168.2.130 pe-ubuntu-lucid\n192.168.2.128 pe-centos6\n192.168.2.131 pe-debian6"
|
51
|
-
|
52
|
-
Command.should_receive( :new ).with( "echo '#{etc_hosts}' > /etc/hosts" ).once
|
53
|
-
host.should_receive( :exec ).once
|
54
|
-
|
55
|
-
host_handler.set_etc_hosts(host, etc_hosts)
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
context "hosts_with_role" do
|
61
|
-
it "can find the master in a set of hosts" do
|
62
|
-
|
63
|
-
expect( host_handler.hosts_with_role( hosts, 'master' ) ).to be === [hosts[1]]
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
it "can find all agents in a set of hosts" do
|
68
|
-
|
69
|
-
expect( host_handler.hosts_with_role( hosts, 'agent' ) ).to be === hosts
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
it "returns [] when no match is found in a set of hosts" do
|
74
|
-
|
75
|
-
expect( host_handler.hosts_with_role( hosts, 'surprise' ) ).to be === []
|
76
|
-
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
context "only_host_with_role" do
|
82
|
-
it "can find the single master in a set of hosts" do
|
83
|
-
|
84
|
-
expect( host_handler.only_host_with_role( hosts, 'master' ) ).to be === hosts[1]
|
85
|
-
|
86
|
-
end
|
87
|
-
|
88
|
-
it "throws an error when more than one host with matching role is found" do
|
89
|
-
|
90
|
-
expect{ host_handler.only_host_with_role( hosts, 'agent' ) }.to raise_error(ArgumentError)
|
91
|
-
|
92
|
-
end
|
93
|
-
|
94
|
-
it "throws an error when no host is found matching the role" do
|
95
|
-
|
96
|
-
expect{ host_handler.only_host_with_role( hosts, 'surprise' ) }.to raise_error(ArgumentError)
|
97
|
-
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
104
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Beaker
|
4
|
-
module Utils
|
5
|
-
describe NTPControl do
|
6
|
-
let( :ntpserver ) { Beaker::Utils::NTPControl::NTPSERVER }
|
7
|
-
let( :ntp_control ) { Beaker::Utils::NTPControl.new( make_opts, @hosts) }
|
8
|
-
|
9
|
-
it "can sync time on unix hosts" do
|
10
|
-
@hosts = make_hosts( { :platform => 'unix' } )
|
11
|
-
|
12
|
-
Command.should_receive( :new ).with("ntpdate -t 20 #{ntpserver}").exactly( 3 ).times
|
13
|
-
|
14
|
-
ntp_control.timesync
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
it "can retry on failure on unix hosts" do
|
19
|
-
@hosts = make_hosts( { :platform => 'unix', :exit_code => [1, 0] } )
|
20
|
-
ntp_control.stub( :sleep ).and_return(true)
|
21
|
-
|
22
|
-
Command.should_receive( :new ).with("ntpdate -t 20 #{ntpserver}").exactly( 6 ).times
|
23
|
-
|
24
|
-
ntp_control.timesync
|
25
|
-
end
|
26
|
-
|
27
|
-
it "eventually gives up and raises an error when unix hosts can't be synched" do
|
28
|
-
@hosts = make_hosts( { :platform => 'unix', :exit_code => 1 } )
|
29
|
-
ntp_control.stub( :sleep ).and_return(true)
|
30
|
-
|
31
|
-
Command.should_receive( :new ).with("ntpdate -t 20 #{ntpserver}").exactly( 5 ).times
|
32
|
-
|
33
|
-
expect{ ntp_control.timesync }.to raise_error
|
34
|
-
end
|
35
|
-
|
36
|
-
it "can sync time on solaris-10 hosts" do
|
37
|
-
@hosts = make_hosts( { :platform => 'solaris-10' } )
|
38
|
-
|
39
|
-
Command.should_receive( :new ).with("sleep 10 && ntpdate -w #{ntpserver}").exactly( 3 ).times
|
40
|
-
|
41
|
-
ntp_control.timesync
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
it "can sync time on windows hosts" do
|
46
|
-
@hosts = make_hosts( { :platform => 'windows' } )
|
47
|
-
|
48
|
-
Command.should_receive( :new ).with("w32tm /register").exactly( 3 ).times
|
49
|
-
Command.should_receive( :new ).with("net start w32time").exactly( 3 ).times
|
50
|
-
Command.should_receive( :new ).with("w32tm /config /manualpeerlist:#{ntpserver} /syncfromflags:manual /update").exactly( 3 ).times
|
51
|
-
Command.should_receive( :new ).with("w32tm /resync").exactly( 3 ).times
|
52
|
-
|
53
|
-
ntp_control.timesync
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
it "can sync time on Sles hosts" do
|
58
|
-
@hosts = make_hosts( { :platform => 'sles-13.1-x64' } )
|
59
|
-
|
60
|
-
Command.should_receive( :new ).with("sntp #{ntpserver}").exactly( 3 ).times
|
61
|
-
|
62
|
-
ntp_control.timesync
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
end
|
@@ -1,168 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Beaker
|
4
|
-
module Utils
|
5
|
-
describe RepoControl do
|
6
|
-
let( :apt_cfg ) { Beaker::Utils::RepoControl::APT_CFG }
|
7
|
-
let( :ips_pkg_repo ) { Beaker::Utils::RepoControl::IPS_PKG_REPO }
|
8
|
-
let( :repo_control ) { Beaker::Utils::RepoControl.new( make_opts, @hosts) }
|
9
|
-
|
10
|
-
context "epel_info_for!" do
|
11
|
-
|
12
|
-
it "can return the correct url for an el-6 host" do
|
13
|
-
host = make_host( 'testhost', { :platform => 'el-6-platform' } )
|
14
|
-
|
15
|
-
expect( repo_control.epel_info_for!( host )).to be === "http://mirror.itc.virginia.edu/fedora-epel/6/i386/epel-release-6-8.noarch.rpm"
|
16
|
-
end
|
17
|
-
|
18
|
-
it "can return the correct url for an el-5 host" do
|
19
|
-
host = make_host( 'testhost', { :platform => 'el-5-platform' } )
|
20
|
-
|
21
|
-
expect( repo_control.epel_info_for!( host )).to be === "http://archive.linux.duke.edu/pub/epel/5/i386/epel-release-5-4.noarch.rpm"
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
it "raises an error on non el-5/6 host" do
|
26
|
-
host = make_host( 'testhost', { :platform => 'el-4-platform' } )
|
27
|
-
|
28
|
-
expect{ repo_control.epel_info_for!( host )}.to raise_error
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
context "apt_get_update" do
|
35
|
-
|
36
|
-
it "can perform apt-get on ubuntu hosts" do
|
37
|
-
host = make_host( 'testhost', { :platform => 'ubuntu' } )
|
38
|
-
|
39
|
-
Command.should_receive( :new ).with("apt-get -y -f -m update").once
|
40
|
-
|
41
|
-
repo_control.apt_get_update( host )
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
it "can perform apt-get on debian hosts" do
|
46
|
-
host = make_host( 'testhost', { :platform => 'debian' } )
|
47
|
-
|
48
|
-
Command.should_receive( :new ).with("apt-get -y -f -m update").once
|
49
|
-
|
50
|
-
repo_control.apt_get_update( host )
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
it "does nothing on non debian/ubuntu hosts" do
|
55
|
-
host = make_host( 'testhost', { :platform => 'windows' } )
|
56
|
-
|
57
|
-
Command.should_receive( :new ).never
|
58
|
-
|
59
|
-
repo_control.apt_get_update( host )
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
context "copy_file_to_remote" do
|
66
|
-
|
67
|
-
it "can copy a file to a remote host" do
|
68
|
-
content = "this is the content"
|
69
|
-
tempfilepath = "/path/to/tempfile"
|
70
|
-
filepath = "/path/to/file"
|
71
|
-
host = make_host( 'testhost', { :platform => 'windows' })
|
72
|
-
tempfile = double( 'tempfile' )
|
73
|
-
tempfile.stub( :path ).and_return( tempfilepath )
|
74
|
-
Tempfile.stub( :open ).and_yield( tempfile )
|
75
|
-
file = double( 'file' )
|
76
|
-
File.stub( :open ).and_yield( file )
|
77
|
-
|
78
|
-
file.should_receive( :puts ).with( content ).once
|
79
|
-
host.should_receive( :do_scp_to ).with( tempfilepath, filepath, repo_control.instance_variable_get( :@options ) ).once
|
80
|
-
|
81
|
-
repo_control.copy_file_to_remote(host, filepath, content)
|
82
|
-
|
83
|
-
end
|
84
|
-
|
85
|
-
|
86
|
-
end
|
87
|
-
|
88
|
-
context "proxy_config" do
|
89
|
-
|
90
|
-
it "correctly configures ubuntu hosts" do
|
91
|
-
@hosts = make_hosts( { :platform => 'ubuntu', :exit_code => 1 } )
|
92
|
-
|
93
|
-
Command.should_receive( :new ).with( "if test -f /etc/apt/apt.conf; then mv /etc/apt/apt.conf /etc/apt/apt.conf.bk; fi" ).exactly( 3 )
|
94
|
-
@hosts.each do |host|
|
95
|
-
repo_control.should_receive( :copy_file_to_remote ).with( host, '/etc/apt/apt.conf', apt_cfg ).once
|
96
|
-
repo_control.should_receive( :apt_get_update ).with( host ).once
|
97
|
-
end
|
98
|
-
|
99
|
-
repo_control.proxy_config
|
100
|
-
|
101
|
-
end
|
102
|
-
|
103
|
-
it "correctly configures debian hosts" do
|
104
|
-
@hosts = make_hosts( { :platform => 'debian' } )
|
105
|
-
|
106
|
-
Command.should_receive( :new ).with( "if test -f /etc/apt/apt.conf; then mv /etc/apt/apt.conf /etc/apt/apt.conf.bk; fi" ).exactly( 3 ).times
|
107
|
-
@hosts.each do |host|
|
108
|
-
repo_control.should_receive( :copy_file_to_remote ).with( host, '/etc/apt/apt.conf', apt_cfg ).once
|
109
|
-
repo_control.should_receive( :apt_get_update ).with( host ).once
|
110
|
-
end
|
111
|
-
|
112
|
-
repo_control.proxy_config
|
113
|
-
|
114
|
-
end
|
115
|
-
|
116
|
-
it "correctly configures solaris-11 hosts" do
|
117
|
-
@hosts = make_hosts( { :platform => 'solaris-11' } )
|
118
|
-
|
119
|
-
Command.should_receive( :new ).with( "/usr/bin/pkg unset-publisher solaris || :" ).exactly( 3 ).times
|
120
|
-
@hosts.each do |host|
|
121
|
-
Command.should_receive( :new ).with( "/usr/bin/pkg set-publisher -g %s solaris" % ips_pkg_repo ).once
|
122
|
-
end
|
123
|
-
|
124
|
-
repo_control.proxy_config
|
125
|
-
|
126
|
-
end
|
127
|
-
|
128
|
-
it "does nothing for non ubuntu/debian/solaris-11 hosts" do
|
129
|
-
@hosts = make_hosts( { :platform => 'windows' } )
|
130
|
-
|
131
|
-
Command.should_receive( :new ).never
|
132
|
-
|
133
|
-
repo_control.proxy_config
|
134
|
-
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
context "add_el_extras" do
|
139
|
-
|
140
|
-
it "add extras for el-5/6 hosts" do
|
141
|
-
@hosts = make_hosts( { :platform => 'el-5', :exit_code => 1 } )
|
142
|
-
@hosts[0][:platform] = 'el-6'
|
143
|
-
url = "http://el_extras_url"
|
144
|
-
|
145
|
-
repo_control.stub( :epel_info_for! ).and_return( url )
|
146
|
-
|
147
|
-
Command.should_receive( :new ).with("rpm -qa | grep epel-release").exactly( 3 ).times
|
148
|
-
Command.should_receive( :new ).with("rpm -i #{url}").exactly( 3 ).times
|
149
|
-
Command.should_receive( :new ).with("yum clean all && yum makecache").exactly( 3 ).times
|
150
|
-
|
151
|
-
repo_control.add_el_extras
|
152
|
-
|
153
|
-
end
|
154
|
-
|
155
|
-
it "should do nothing for non el-5/6 hosts" do
|
156
|
-
@hosts = make_hosts( { :platform => 'windows' } )
|
157
|
-
|
158
|
-
Command.should_receive( :new ).never
|
159
|
-
|
160
|
-
repo_control.add_el_extras
|
161
|
-
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
end
|
166
|
-
|
167
|
-
end
|
168
|
-
end
|