test-kitchen 1.14.1 → 1.14.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 +4 -4
- data/Berksfile +1 -1
- data/CHANGELOG.md +7 -0
- data/Gemfile +1 -1
- data/Guardfile +5 -5
- data/Rakefile +5 -5
- data/bin/kitchen +1 -1
- data/features/step_definitions/gem_steps.rb +6 -6
- data/features/support/env.rb +6 -7
- data/lib/kitchen.rb +5 -7
- data/lib/kitchen/base64_stream.rb +2 -8
- data/lib/kitchen/cli.rb +76 -80
- data/lib/kitchen/collection.rb +0 -2
- data/lib/kitchen/color.rb +7 -9
- data/lib/kitchen/command.rb +0 -4
- data/lib/kitchen/command/action.rb +0 -3
- data/lib/kitchen/command/console.rb +4 -7
- data/lib/kitchen/command/diagnose.rb +7 -14
- data/lib/kitchen/command/driver_discover.rb +1 -4
- data/lib/kitchen/command/exec.rb +0 -3
- data/lib/kitchen/command/list.rb +9 -12
- data/lib/kitchen/command/login.rb +0 -3
- data/lib/kitchen/command/package.rb +0 -3
- data/lib/kitchen/command/sink.rb +6 -9
- data/lib/kitchen/command/test.rb +1 -4
- data/lib/kitchen/config.rb +25 -27
- data/lib/kitchen/configurable.rb +26 -31
- data/lib/kitchen/data_munger.rb +34 -36
- data/lib/kitchen/diagnostic.rb +5 -7
- data/lib/kitchen/driver.rb +3 -5
- data/lib/kitchen/driver/base.rb +0 -3
- data/lib/kitchen/driver/dummy.rb +0 -3
- data/lib/kitchen/driver/proxy.rb +0 -3
- data/lib/kitchen/driver/ssh_base.rb +13 -16
- data/lib/kitchen/errors.rb +11 -16
- data/lib/kitchen/generator/driver_create.rb +18 -21
- data/lib/kitchen/generator/init.rb +21 -26
- data/lib/kitchen/instance.rb +19 -23
- data/lib/kitchen/lazy_hash.rb +1 -2
- data/lib/kitchen/loader/yaml.rb +22 -25
- data/lib/kitchen/logger.rb +9 -14
- data/lib/kitchen/logging.rb +0 -3
- data/lib/kitchen/login_command.rb +0 -2
- data/lib/kitchen/metadata_chopper.rb +0 -2
- data/lib/kitchen/platform.rb +1 -3
- data/lib/kitchen/provisioner.rb +3 -5
- data/lib/kitchen/provisioner/base.rb +2 -5
- data/lib/kitchen/provisioner/chef/berkshelf.rb +1 -5
- data/lib/kitchen/provisioner/chef/common_sandbox.rb +24 -29
- data/lib/kitchen/provisioner/chef/librarian.rb +2 -6
- data/lib/kitchen/provisioner/chef/policyfile.rb +4 -8
- data/lib/kitchen/provisioner/chef_apply.rb +14 -17
- data/lib/kitchen/provisioner/chef_base.rb +43 -46
- data/lib/kitchen/provisioner/chef_solo.rb +10 -13
- data/lib/kitchen/provisioner/chef_zero.rb +22 -29
- data/lib/kitchen/provisioner/dummy.rb +0 -3
- data/lib/kitchen/provisioner/shell.rb +6 -9
- data/lib/kitchen/rake_tasks.rb +4 -6
- data/lib/kitchen/shell_out.rb +3 -5
- data/lib/kitchen/ssh.rb +16 -22
- data/lib/kitchen/state_file.rb +3 -5
- data/lib/kitchen/suite.rb +0 -2
- data/lib/kitchen/thor_tasks.rb +2 -4
- data/lib/kitchen/transport.rb +3 -5
- data/lib/kitchen/transport/base.rb +1 -7
- data/lib/kitchen/transport/dummy.rb +0 -4
- data/lib/kitchen/transport/ssh.rb +41 -47
- data/lib/kitchen/transport/winrm.rb +41 -40
- data/lib/kitchen/util.rb +1 -3
- data/lib/kitchen/verifier.rb +3 -5
- data/lib/kitchen/verifier/base.rb +2 -5
- data/lib/kitchen/verifier/busser.rb +24 -24
- data/lib/kitchen/verifier/dummy.rb +0 -3
- data/lib/kitchen/verifier/shell.rb +1 -3
- data/lib/kitchen/version.rb +1 -1
- data/lib/vendor/hash_recursive_merge.rb +0 -2
- data/spec/kitchen/base64_stream_spec.rb +3 -6
- data/spec/kitchen/cli_spec.rb +0 -2
- data/spec/kitchen/collection_spec.rb +4 -8
- data/spec/kitchen/color_spec.rb +0 -3
- data/spec/kitchen/config_spec.rb +91 -106
- data/spec/kitchen/configurable_spec.rb +44 -76
- data/spec/kitchen/data_munger_spec.rb +1178 -1247
- data/spec/kitchen/diagnostic_spec.rb +37 -38
- data/spec/kitchen/driver/base_spec.rb +7 -14
- data/spec/kitchen/driver/dummy_spec.rb +1 -7
- data/spec/kitchen/driver/proxy_spec.rb +2 -7
- data/spec/kitchen/driver/ssh_base_spec.rb +128 -149
- data/spec/kitchen/driver_spec.rb +7 -13
- data/spec/kitchen/errors_spec.rb +50 -60
- data/spec/kitchen/instance_spec.rb +217 -294
- data/spec/kitchen/lazy_hash_spec.rb +14 -18
- data/spec/kitchen/loader/yaml_spec.rb +201 -227
- data/spec/kitchen/logger_spec.rb +7 -15
- data/spec/kitchen/logging_spec.rb +1 -4
- data/spec/kitchen/login_command_spec.rb +3 -4
- data/spec/kitchen/metadata_chopper_spec.rb +0 -3
- data/spec/kitchen/platform_spec.rb +31 -32
- data/spec/kitchen/provisioner/base_spec.rb +22 -41
- data/spec/kitchen/provisioner/chef/policyfile_spec.rb +15 -15
- data/spec/kitchen/provisioner/chef_apply_spec.rb +8 -13
- data/spec/kitchen/provisioner/chef_base_spec.rb +150 -182
- data/spec/kitchen/provisioner/chef_solo_spec.rb +58 -72
- data/spec/kitchen/provisioner/chef_zero_spec.rb +99 -125
- data/spec/kitchen/provisioner/dummy_spec.rb +8 -11
- data/spec/kitchen/provisioner/shell_spec.rb +86 -103
- data/spec/kitchen/provisioner_spec.rb +5 -11
- data/spec/kitchen/shell_out_spec.rb +15 -19
- data/spec/kitchen/ssh_spec.rb +16 -35
- data/spec/kitchen/state_file_spec.rb +6 -11
- data/spec/kitchen/suite_spec.rb +5 -6
- data/spec/kitchen/transport/base_spec.rb +6 -14
- data/spec/kitchen/transport/ssh_spec.rb +39 -64
- data/spec/kitchen/transport/winrm_spec.rb +99 -127
- data/spec/kitchen/transport_spec.rb +7 -13
- data/spec/kitchen/util_spec.rb +17 -26
- data/spec/kitchen/verifier/base_spec.rb +24 -40
- data/spec/kitchen/verifier/busser_spec.rb +38 -68
- data/spec/kitchen/verifier/dummy_spec.rb +8 -11
- data/spec/kitchen/verifier/shell_spec.rb +14 -17
- data/spec/kitchen/verifier_spec.rb +7 -13
- data/spec/kitchen_spec.rb +4 -6
- data/spec/spec_helper.rb +1 -1
- data/spec/support/powershell_max_size_spec.rb +1 -2
- data/support/chef-client-zero.rb +3 -4
- data/test-kitchen.gemspec +4 -6
- metadata +9 -9
|
@@ -21,13 +21,12 @@ require_relative "../../spec_helper"
|
|
|
21
21
|
require "kitchen"
|
|
22
22
|
|
|
23
23
|
describe Kitchen::Transport::Base do
|
|
24
|
-
|
|
25
24
|
let(:logged_output) { StringIO.new }
|
|
26
25
|
let(:logger) { Logger.new(logged_output) }
|
|
27
26
|
let(:config) { Hash.new }
|
|
28
27
|
|
|
29
28
|
let(:instance) do
|
|
30
|
-
stub(:
|
|
29
|
+
stub(name: "coolbeans", logger: logger)
|
|
31
30
|
end
|
|
32
31
|
|
|
33
32
|
let(:transport) do
|
|
@@ -39,7 +38,6 @@ describe Kitchen::Transport::Base do
|
|
|
39
38
|
end
|
|
40
39
|
|
|
41
40
|
describe "#logger" do
|
|
42
|
-
|
|
43
41
|
before { @klog = Kitchen.logger }
|
|
44
42
|
after { Kitchen.logger = @klog }
|
|
45
43
|
|
|
@@ -56,32 +54,27 @@ describe Kitchen::Transport::Base do
|
|
|
56
54
|
end
|
|
57
55
|
|
|
58
56
|
describe Kitchen::Transport::TransportFailed do
|
|
59
|
-
|
|
60
57
|
let(:failure_with_no_exit_code) { Kitchen::Transport::TransportFailed.new("Boom") }
|
|
61
58
|
let(:failure_with_exit_code) { Kitchen::Transport::TransportFailed.new("Boom", 123) }
|
|
62
59
|
|
|
63
60
|
describe "when no exit code is provided" do
|
|
64
|
-
|
|
65
61
|
it "#exit_code is nil" do
|
|
66
62
|
failure_with_no_exit_code.exit_code.must_be_nil
|
|
67
63
|
end
|
|
68
64
|
end
|
|
69
65
|
|
|
70
66
|
describe "when an exit code is provided" do
|
|
71
|
-
|
|
72
67
|
it "#exit_code returns the supplied exit code" do
|
|
73
68
|
failure_with_exit_code.exit_code.must_equal 123
|
|
74
69
|
end
|
|
75
70
|
end
|
|
76
71
|
end
|
|
77
|
-
|
|
78
72
|
end
|
|
79
73
|
|
|
80
74
|
describe Kitchen::Transport::Base::Connection do
|
|
81
|
-
|
|
82
75
|
let(:logged_output) { StringIO.new }
|
|
83
76
|
let(:logger) { Logger.new(logged_output) }
|
|
84
|
-
let(:options) { { :
|
|
77
|
+
let(:options) { { logger: logger } }
|
|
85
78
|
|
|
86
79
|
let(:connection) do
|
|
87
80
|
Kitchen::Transport::Base::Connection.new(options)
|
|
@@ -100,8 +93,8 @@ describe Kitchen::Transport::Base::Connection do
|
|
|
100
93
|
end
|
|
101
94
|
|
|
102
95
|
it "has an #upload method which raises a ClientError" do
|
|
103
|
-
proc { connection.upload(["file"], "/path/to") }
|
|
104
|
-
must_raise Kitchen::ClientError
|
|
96
|
+
proc { connection.upload(["file"], "/path/to") }
|
|
97
|
+
.must_raise Kitchen::ClientError
|
|
105
98
|
end
|
|
106
99
|
|
|
107
100
|
it "has a #wait_until_ready method that does nothing" do
|
|
@@ -109,12 +102,11 @@ describe Kitchen::Transport::Base::Connection do
|
|
|
109
102
|
end
|
|
110
103
|
|
|
111
104
|
describe "#execute_with_retry" do
|
|
112
|
-
|
|
113
105
|
let(:failure_with_exit_code) { Kitchen::Transport::TransportFailed.new("Boom", 123) }
|
|
114
106
|
|
|
115
107
|
it "raises ClientError with no retries" do
|
|
116
|
-
proc { connection.execute_with_retry("hi", [], nil, nil) }
|
|
117
|
-
must_raise Kitchen::ClientError
|
|
108
|
+
proc { connection.execute_with_retry("hi", [], nil, nil) }
|
|
109
|
+
.must_raise Kitchen::ClientError
|
|
118
110
|
end
|
|
119
111
|
|
|
120
112
|
it "retries three times" do
|
|
@@ -86,13 +86,9 @@ end
|
|
|
86
86
|
# An upstream patch to Net::SSH will be required to retire this yak shave ;)
|
|
87
87
|
require "net/ssh/test/channel"
|
|
88
88
|
module Net
|
|
89
|
-
|
|
90
89
|
module SSH
|
|
91
|
-
|
|
92
90
|
module Test
|
|
93
|
-
|
|
94
91
|
class Channel
|
|
95
|
-
|
|
96
92
|
def sends_request_pty
|
|
97
93
|
pty_data = ["xterm", 80, 24, 640, 480, "\0"]
|
|
98
94
|
|
|
@@ -115,14 +111,13 @@ module Net
|
|
|
115
111
|
end
|
|
116
112
|
|
|
117
113
|
describe Kitchen::Transport::Ssh do
|
|
118
|
-
|
|
119
114
|
let(:logged_output) { StringIO.new }
|
|
120
115
|
let(:logger) { Logger.new(logged_output) }
|
|
121
116
|
let(:config) { Hash.new }
|
|
122
117
|
let(:state) { Hash.new }
|
|
123
118
|
|
|
124
119
|
let(:instance) do
|
|
125
|
-
stub(:
|
|
120
|
+
stub(name: "coolbeans", logger: logger, to_str: "instance")
|
|
126
121
|
end
|
|
127
122
|
|
|
128
123
|
let(:transport) do
|
|
@@ -138,7 +133,6 @@ describe Kitchen::Transport::Ssh do
|
|
|
138
133
|
end
|
|
139
134
|
|
|
140
135
|
describe "default_config" do
|
|
141
|
-
|
|
142
136
|
it "sets :port to 22 by default" do
|
|
143
137
|
transport[:port].must_equal 22
|
|
144
138
|
end
|
|
@@ -214,7 +208,6 @@ describe Kitchen::Transport::Ssh do
|
|
|
214
208
|
end
|
|
215
209
|
|
|
216
210
|
describe "#connection" do
|
|
217
|
-
|
|
218
211
|
let(:klass) { Kitchen::Transport::Ssh::Connection }
|
|
219
212
|
|
|
220
213
|
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
@@ -642,14 +635,14 @@ describe Kitchen::Transport::Ssh do
|
|
|
642
635
|
make_connection(state)
|
|
643
636
|
make_connection(state)
|
|
644
637
|
|
|
645
|
-
logged_output.string.lines.count
|
|
638
|
+
logged_output.string.lines.count do |l|
|
|
646
639
|
l =~ debug_line_with("[SSH] reusing existing connection ")
|
|
647
|
-
|
|
640
|
+
end.must_equal 1
|
|
648
641
|
end
|
|
649
642
|
|
|
650
643
|
it "returns a new connection when called again if state differs" do
|
|
651
644
|
first_connection = make_connection(state)
|
|
652
|
-
second_connection = make_connection(state.merge(:
|
|
645
|
+
second_connection = make_connection(state.merge(port: 9000))
|
|
653
646
|
|
|
654
647
|
first_connection.object_id.wont_equal second_connection.object_id
|
|
655
648
|
end
|
|
@@ -658,22 +651,21 @@ describe Kitchen::Transport::Ssh do
|
|
|
658
651
|
first_connection = make_connection(state)
|
|
659
652
|
first_connection.expects(:close)
|
|
660
653
|
|
|
661
|
-
make_connection(state.merge(:
|
|
654
|
+
make_connection(state.merge(port: 9000))
|
|
662
655
|
end
|
|
663
656
|
|
|
664
657
|
it "logs a debug message a second connection is created" do
|
|
665
658
|
make_connection(state)
|
|
666
|
-
make_connection(state.merge(:
|
|
659
|
+
make_connection(state.merge(port: 9000))
|
|
667
660
|
|
|
668
|
-
logged_output.string.lines.count
|
|
661
|
+
logged_output.string.lines.count do |l|
|
|
669
662
|
l =~ debug_line_with("[SSH] shutting previous connection ")
|
|
670
|
-
|
|
663
|
+
end.must_equal 1
|
|
671
664
|
end
|
|
672
665
|
end
|
|
673
666
|
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
|
674
667
|
|
|
675
668
|
describe "called without a block" do
|
|
676
|
-
|
|
677
669
|
def make_connection(s = state)
|
|
678
670
|
transport.connection(s)
|
|
679
671
|
end
|
|
@@ -682,7 +674,6 @@ describe Kitchen::Transport::Ssh do
|
|
|
682
674
|
end
|
|
683
675
|
|
|
684
676
|
describe "called with a block" do
|
|
685
|
-
|
|
686
677
|
def make_connection(s = state)
|
|
687
678
|
transport.connection(s) do |conn|
|
|
688
679
|
conn
|
|
@@ -694,12 +685,11 @@ describe Kitchen::Transport::Ssh do
|
|
|
694
685
|
end
|
|
695
686
|
|
|
696
687
|
def debug_line_with(msg)
|
|
697
|
-
|
|
688
|
+
/^D, .* : #{Regexp.escape(msg)}/
|
|
698
689
|
end
|
|
699
690
|
end
|
|
700
691
|
|
|
701
692
|
describe Kitchen::Transport::Ssh::Connection do
|
|
702
|
-
|
|
703
693
|
include Net::SSH::Test
|
|
704
694
|
# sadly, Net:SSH::Test includes a #connection method so we'll alias this one
|
|
705
695
|
# before redefining it
|
|
@@ -711,11 +701,11 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
711
701
|
|
|
712
702
|
let(:options) do
|
|
713
703
|
{
|
|
714
|
-
:
|
|
715
|
-
:
|
|
716
|
-
:
|
|
717
|
-
:
|
|
718
|
-
:
|
|
704
|
+
logger: logger,
|
|
705
|
+
username: "me",
|
|
706
|
+
hostname: "foo",
|
|
707
|
+
port: 22,
|
|
708
|
+
max_ssh_sessions: 9,
|
|
719
709
|
}
|
|
720
710
|
end
|
|
721
711
|
|
|
@@ -734,7 +724,6 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
734
724
|
end
|
|
735
725
|
|
|
736
726
|
describe "establishing a connection" do
|
|
737
|
-
|
|
738
727
|
[
|
|
739
728
|
Errno::EACCES, Errno::EADDRINUSE, Errno::ECONNREFUSED, Errno::ETIMEDOUT,
|
|
740
729
|
Errno::ECONNRESET, Errno::ENETUNREACH, Errno::EHOSTUNREACH,
|
|
@@ -742,7 +731,6 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
742
731
|
Timeout::Error
|
|
743
732
|
].each do |klass|
|
|
744
733
|
describe "raising #{klass}" do
|
|
745
|
-
|
|
746
734
|
before do
|
|
747
735
|
Net::SSH.stubs(:start).raises(klass)
|
|
748
736
|
options[:connection_retries] = 3
|
|
@@ -751,9 +739,9 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
751
739
|
end
|
|
752
740
|
|
|
753
741
|
it "raises an SshFailed exception" do
|
|
754
|
-
e = proc
|
|
742
|
+
e = proc do
|
|
755
743
|
connection.execute("nope")
|
|
756
|
-
|
|
744
|
+
end.must_raise Kitchen::Transport::SshFailed
|
|
757
745
|
e.message.must_match regexify("SSH session could not be established")
|
|
758
746
|
end
|
|
759
747
|
|
|
@@ -764,9 +752,9 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
764
752
|
# the raise is not what is being tested here, rather its side-effect
|
|
765
753
|
end
|
|
766
754
|
|
|
767
|
-
logged_output.string.lines.count
|
|
755
|
+
logged_output.string.lines.count do |l|
|
|
768
756
|
l =~ debug_line("[SSH] opening connection to me@foo<{:port=>22}>")
|
|
769
|
-
|
|
757
|
+
end.must_equal 3
|
|
770
758
|
end
|
|
771
759
|
|
|
772
760
|
it "sleeps for :connection_retry_sleep seconds between retries" do
|
|
@@ -787,10 +775,10 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
787
775
|
# the raise is not what is being tested here, rather its side-effect
|
|
788
776
|
end
|
|
789
777
|
|
|
790
|
-
logged_output.string.lines.count
|
|
778
|
+
logged_output.string.lines.count do |l|
|
|
791
779
|
l =~ info_line_with(
|
|
792
780
|
"[SSH] connection failed, retrying in 7 seconds")
|
|
793
|
-
|
|
781
|
+
end.must_equal 2
|
|
794
782
|
end
|
|
795
783
|
|
|
796
784
|
it "logs the last retry failures on warn" do
|
|
@@ -800,16 +788,15 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
800
788
|
# the raise is not what is being tested here, rather its side-effect
|
|
801
789
|
end
|
|
802
790
|
|
|
803
|
-
logged_output.string.lines.count
|
|
791
|
+
logged_output.string.lines.count do |l|
|
|
804
792
|
l =~ warn_line_with("[SSH] connection failed, terminating ")
|
|
805
|
-
|
|
793
|
+
end.must_equal 1
|
|
806
794
|
end
|
|
807
795
|
end
|
|
808
796
|
end
|
|
809
797
|
end
|
|
810
798
|
|
|
811
799
|
describe "#close" do
|
|
812
|
-
|
|
813
800
|
before do
|
|
814
801
|
story do |script|
|
|
815
802
|
channel = script.opens_channel
|
|
@@ -848,9 +835,7 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
848
835
|
end
|
|
849
836
|
|
|
850
837
|
describe "#execute" do
|
|
851
|
-
|
|
852
838
|
describe "for a successful command" do
|
|
853
|
-
|
|
854
839
|
before do
|
|
855
840
|
story do |script|
|
|
856
841
|
channel = script.opens_channel
|
|
@@ -894,7 +879,6 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
894
879
|
end
|
|
895
880
|
|
|
896
881
|
describe "for a failed command" do
|
|
897
|
-
|
|
898
882
|
before do
|
|
899
883
|
story do |script|
|
|
900
884
|
channel = script.opens_channel
|
|
@@ -953,9 +937,9 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
953
937
|
end
|
|
954
938
|
|
|
955
939
|
it "raises an SshFailed exception" do
|
|
956
|
-
err = proc
|
|
940
|
+
err = proc do
|
|
957
941
|
connection.execute("doit")
|
|
958
|
-
|
|
942
|
+
end.must_raise Kitchen::Transport::SshFailed
|
|
959
943
|
err.message.must_equal "SSH exited (42) for command: [doit]"
|
|
960
944
|
end
|
|
961
945
|
|
|
@@ -969,7 +953,6 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
969
953
|
end
|
|
970
954
|
|
|
971
955
|
describe "for an interrupted command" do
|
|
972
|
-
|
|
973
956
|
let(:conn) { mock("session") }
|
|
974
957
|
|
|
975
958
|
before do
|
|
@@ -979,15 +962,14 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
979
962
|
it "raises SshFailed when an SSH exception is raised" do
|
|
980
963
|
conn.stubs(:open_channel).raises(Net::SSH::Exception)
|
|
981
964
|
|
|
982
|
-
e = proc
|
|
965
|
+
e = proc do
|
|
983
966
|
connection.execute("nope")
|
|
984
|
-
|
|
967
|
+
end.must_raise Kitchen::Transport::SshFailed
|
|
985
968
|
e.message.must_match regexify("SSH command failed")
|
|
986
969
|
end
|
|
987
970
|
end
|
|
988
971
|
|
|
989
972
|
describe "for a nil command" do
|
|
990
|
-
|
|
991
973
|
it "does not log on debug" do
|
|
992
974
|
connection.execute(nil)
|
|
993
975
|
|
|
@@ -997,7 +979,6 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
997
979
|
end
|
|
998
980
|
|
|
999
981
|
describe "#login_command" do
|
|
1000
|
-
|
|
1001
982
|
let(:login_command) { connection.login_command }
|
|
1002
983
|
let(:args) { login_command.arguments.join(" ") }
|
|
1003
984
|
|
|
@@ -1063,7 +1044,7 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
1063
1044
|
end
|
|
1064
1045
|
|
|
1065
1046
|
it "sets SSH keys options if given" do
|
|
1066
|
-
options[:keys] = %w
|
|
1047
|
+
options[:keys] = %w{one two}
|
|
1067
1048
|
|
|
1068
1049
|
args.must_match regexify(" -i one ")
|
|
1069
1050
|
args.must_match regexify(" -i two ")
|
|
@@ -1081,9 +1062,7 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
1081
1062
|
end
|
|
1082
1063
|
|
|
1083
1064
|
describe "#upload" do
|
|
1084
|
-
|
|
1085
1065
|
describe "for a file" do
|
|
1086
|
-
|
|
1087
1066
|
let(:content) { "a" * 1234 }
|
|
1088
1067
|
|
|
1089
1068
|
let(:src) do
|
|
@@ -1176,7 +1155,6 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
1176
1155
|
end
|
|
1177
1156
|
|
|
1178
1157
|
describe "for a failed upload" do
|
|
1179
|
-
|
|
1180
1158
|
let(:conn) { mock("session") }
|
|
1181
1159
|
|
|
1182
1160
|
before do
|
|
@@ -1186,23 +1164,21 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
1186
1164
|
it "raises SshFailed when an SSH exception is raised" do
|
|
1187
1165
|
conn.stubs(:scp).raises(Net::SSH::Exception)
|
|
1188
1166
|
|
|
1189
|
-
e = proc
|
|
1167
|
+
e = proc do
|
|
1190
1168
|
connection.upload("nope", "fail")
|
|
1191
|
-
|
|
1169
|
+
end.must_raise Kitchen::Transport::SshFailed
|
|
1192
1170
|
e.message.must_match regexify("SCP upload failed")
|
|
1193
1171
|
end
|
|
1194
1172
|
end
|
|
1195
1173
|
end
|
|
1196
1174
|
|
|
1197
1175
|
describe "#wait_until_ready" do
|
|
1198
|
-
|
|
1199
1176
|
before do
|
|
1200
1177
|
options[:max_wait_until_ready] = 300
|
|
1201
1178
|
connection.stubs(:sleep)
|
|
1202
1179
|
end
|
|
1203
1180
|
|
|
1204
1181
|
describe "when failing to connect" do
|
|
1205
|
-
|
|
1206
1182
|
before do
|
|
1207
1183
|
Net::SSH.stubs(:start).raises(Errno::ECONNREFUSED)
|
|
1208
1184
|
end
|
|
@@ -1214,16 +1190,16 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
1214
1190
|
# the raise is not what is being tested here, rather its side-effect
|
|
1215
1191
|
end
|
|
1216
1192
|
|
|
1217
|
-
logged_output.string.lines.count
|
|
1193
|
+
logged_output.string.lines.count do |l|
|
|
1218
1194
|
l =~ info_line_with(
|
|
1219
1195
|
"Waiting for SSH service on foo:22, retrying in 3 seconds")
|
|
1220
|
-
|
|
1221
|
-
logged_output.string.lines.count
|
|
1196
|
+
end.must_equal((300 / 3) - 1)
|
|
1197
|
+
logged_output.string.lines.count do |l|
|
|
1222
1198
|
l =~ debug_line_with("[SSH] connection failed ")
|
|
1223
|
-
|
|
1224
|
-
logged_output.string.lines.count
|
|
1199
|
+
end.must_equal((300 / 3) - 1)
|
|
1200
|
+
logged_output.string.lines.count do |l|
|
|
1225
1201
|
l =~ warn_line_with("[SSH] connection failed, terminating ")
|
|
1226
|
-
|
|
1202
|
+
end.must_equal 1
|
|
1227
1203
|
end
|
|
1228
1204
|
|
|
1229
1205
|
it "sleeps for 3 seconds between retries" do
|
|
@@ -1239,7 +1215,6 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
1239
1215
|
end
|
|
1240
1216
|
|
|
1241
1217
|
describe "when connection is successful" do
|
|
1242
|
-
|
|
1243
1218
|
before do
|
|
1244
1219
|
story do |script|
|
|
1245
1220
|
channel = script.opens_channel
|
|
@@ -1278,15 +1253,15 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
1278
1253
|
end
|
|
1279
1254
|
|
|
1280
1255
|
def debug_line(msg)
|
|
1281
|
-
|
|
1256
|
+
/^D, .* : #{Regexp.escape(msg)}$/
|
|
1282
1257
|
end
|
|
1283
1258
|
|
|
1284
1259
|
def debug_line_with(msg)
|
|
1285
|
-
|
|
1260
|
+
/^D, .* : #{Regexp.escape(msg)}/
|
|
1286
1261
|
end
|
|
1287
1262
|
|
|
1288
1263
|
def info_line_with(msg)
|
|
1289
|
-
|
|
1264
|
+
/^I, .* : #{Regexp.escape(msg)}/
|
|
1290
1265
|
end
|
|
1291
1266
|
|
|
1292
1267
|
def regexify(string)
|
|
@@ -1294,6 +1269,6 @@ describe Kitchen::Transport::Ssh::Connection do
|
|
|
1294
1269
|
end
|
|
1295
1270
|
|
|
1296
1271
|
def warn_line_with(msg)
|
|
1297
|
-
|
|
1272
|
+
/^W, .* : #{Regexp.escape(msg)}/
|
|
1298
1273
|
end
|
|
1299
1274
|
end
|
|
@@ -24,11 +24,8 @@ require "winrm-fs"
|
|
|
24
24
|
require "winrm-elevated"
|
|
25
25
|
|
|
26
26
|
module Kitchen
|
|
27
|
-
|
|
28
27
|
module Transport
|
|
29
|
-
|
|
30
28
|
class WinRMConnectionDummy < Kitchen::Transport::Winrm::Connection
|
|
31
|
-
|
|
32
29
|
attr_reader :saved_command, :remote_path, :local_path
|
|
33
30
|
|
|
34
31
|
def upload(locals, remote)
|
|
@@ -41,7 +38,6 @@ module Kitchen
|
|
|
41
38
|
end
|
|
42
39
|
|
|
43
40
|
describe Kitchen::Transport::Winrm do
|
|
44
|
-
|
|
45
41
|
before do
|
|
46
42
|
RbConfig::CONFIG.stubs(:[]).with("host_os").returns("blah")
|
|
47
43
|
end
|
|
@@ -52,7 +48,7 @@ describe Kitchen::Transport::Winrm do
|
|
|
52
48
|
let(:state) { Hash.new }
|
|
53
49
|
|
|
54
50
|
let(:instance) do
|
|
55
|
-
stub(:
|
|
51
|
+
stub(name: "coolbeans", logger: logger, to_str: "instance")
|
|
56
52
|
end
|
|
57
53
|
|
|
58
54
|
let(:transport) do
|
|
@@ -72,7 +68,6 @@ describe Kitchen::Transport::Winrm do
|
|
|
72
68
|
end
|
|
73
69
|
|
|
74
70
|
describe "default_config" do
|
|
75
|
-
|
|
76
71
|
it "sets :port to 5985 by default" do
|
|
77
72
|
transport[:port].must_equal 5985
|
|
78
73
|
end
|
|
@@ -86,8 +81,8 @@ describe Kitchen::Transport::Winrm do
|
|
|
86
81
|
end
|
|
87
82
|
|
|
88
83
|
it "sets a default :endpoint_template value" do
|
|
89
|
-
transport[:endpoint_template]
|
|
90
|
-
must_equal "http://%{hostname}:%{port}/wsman"
|
|
84
|
+
transport[:endpoint_template]
|
|
85
|
+
.must_equal "http://%{hostname}:%{port}/wsman"
|
|
91
86
|
end
|
|
92
87
|
|
|
93
88
|
it "sets :rdp_port to 3389 by default" do
|
|
@@ -116,7 +111,6 @@ describe Kitchen::Transport::Winrm do
|
|
|
116
111
|
end
|
|
117
112
|
|
|
118
113
|
describe "#connection" do
|
|
119
|
-
|
|
120
114
|
let(:klass) { Kitchen::Transport::Winrm::Connection }
|
|
121
115
|
|
|
122
116
|
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
@@ -391,7 +385,6 @@ describe Kitchen::Transport::Winrm do
|
|
|
391
385
|
end
|
|
392
386
|
|
|
393
387
|
it "sets :winrm_transport to negotiate" do
|
|
394
|
-
|
|
395
388
|
klass.expects(:new).with do |hash|
|
|
396
389
|
hash[:transport] == :negotiate &&
|
|
397
390
|
hash[:disable_sspi] == false &&
|
|
@@ -413,14 +406,14 @@ describe Kitchen::Transport::Winrm do
|
|
|
413
406
|
make_connection(state)
|
|
414
407
|
make_connection(state)
|
|
415
408
|
|
|
416
|
-
logged_output.string.lines.count
|
|
409
|
+
logged_output.string.lines.count do |l|
|
|
417
410
|
l =~ debug_line_with("[WinRM] reusing existing connection ")
|
|
418
|
-
|
|
411
|
+
end.must_equal 1
|
|
419
412
|
end
|
|
420
413
|
|
|
421
414
|
it "returns a new connection when called again if state differs" do
|
|
422
415
|
first_connection = make_connection(state)
|
|
423
|
-
second_connection = make_connection(state.merge(:
|
|
416
|
+
second_connection = make_connection(state.merge(port: 9000))
|
|
424
417
|
|
|
425
418
|
first_connection.object_id.wont_equal second_connection.object_id
|
|
426
419
|
end
|
|
@@ -429,22 +422,21 @@ describe Kitchen::Transport::Winrm do
|
|
|
429
422
|
first_connection = make_connection(state)
|
|
430
423
|
first_connection.expects(:close)
|
|
431
424
|
|
|
432
|
-
make_connection(state.merge(:
|
|
425
|
+
make_connection(state.merge(port: 9000))
|
|
433
426
|
end
|
|
434
427
|
|
|
435
428
|
it "logs a debug message a second connection is created" do
|
|
436
429
|
make_connection(state)
|
|
437
|
-
make_connection(state.merge(:
|
|
430
|
+
make_connection(state.merge(port: 9000))
|
|
438
431
|
|
|
439
|
-
logged_output.string.lines.count
|
|
432
|
+
logged_output.string.lines.count do |l|
|
|
440
433
|
l =~ debug_line_with("[WinRM] shutting previous connection ")
|
|
441
|
-
|
|
434
|
+
end.must_equal 1
|
|
442
435
|
end
|
|
443
436
|
end
|
|
444
437
|
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
|
445
438
|
|
|
446
439
|
describe "called without a block" do
|
|
447
|
-
|
|
448
440
|
def make_connection(s = state)
|
|
449
441
|
transport.connection(s)
|
|
450
442
|
end
|
|
@@ -453,7 +445,6 @@ describe Kitchen::Transport::Winrm do
|
|
|
453
445
|
end
|
|
454
446
|
|
|
455
447
|
describe "called with a block" do
|
|
456
|
-
|
|
457
448
|
def make_connection(s = state)
|
|
458
449
|
transport.connection(s) do |conn|
|
|
459
450
|
conn
|
|
@@ -528,8 +519,8 @@ describe Kitchen::Transport::Winrm do
|
|
|
528
519
|
it "logs a message to fatal when libraries cannot be loaded" do
|
|
529
520
|
transport = Kitchen::Transport::Winrm.new(config)
|
|
530
521
|
transport.stubs(:require).with("winrm", anything)
|
|
531
|
-
transport.stubs(:require).with("winrm-fs")
|
|
532
|
-
raises(LoadError, "uh oh")
|
|
522
|
+
transport.stubs(:require).with("winrm-fs")
|
|
523
|
+
.raises(LoadError, "uh oh")
|
|
533
524
|
begin
|
|
534
525
|
transport.finalize_config!(instance)
|
|
535
526
|
rescue # rubocop:disable Lint/HandleExceptions
|
|
@@ -543,12 +534,12 @@ describe Kitchen::Transport::Winrm do
|
|
|
543
534
|
it "raises a UserError when libraries cannot be loaded" do
|
|
544
535
|
transport = Kitchen::Transport::Winrm.new(config)
|
|
545
536
|
transport.stubs(:require).with("winrm", anything)
|
|
546
|
-
transport.stubs(:require).with("winrm-fs")
|
|
547
|
-
raises(LoadError, "uh oh")
|
|
537
|
+
transport.stubs(:require).with("winrm-fs")
|
|
538
|
+
.raises(LoadError, "uh oh")
|
|
548
539
|
|
|
549
|
-
err = proc
|
|
540
|
+
err = proc do
|
|
550
541
|
transport.finalize_config!(instance)
|
|
551
|
-
|
|
542
|
+
end.must_raise Kitchen::UserError
|
|
552
543
|
err.message.must_match(/^Could not load or activate winrm-fs\. /)
|
|
553
544
|
end
|
|
554
545
|
end
|
|
@@ -607,41 +598,40 @@ describe Kitchen::Transport::Winrm do
|
|
|
607
598
|
transport.stubs(:require).with("winrm-fs", anything)
|
|
608
599
|
transport.stubs(:require).raises(LoadError, "uh oh")
|
|
609
600
|
|
|
610
|
-
err = proc
|
|
601
|
+
err = proc do
|
|
611
602
|
transport.finalize_config!(instance)
|
|
612
|
-
|
|
603
|
+
end.must_raise Kitchen::UserError
|
|
613
604
|
err.message.must_match(/^Could not load or activate winrm\. /)
|
|
614
605
|
end
|
|
615
606
|
end
|
|
616
607
|
end
|
|
617
608
|
|
|
618
609
|
def debug_line_with(msg)
|
|
619
|
-
|
|
610
|
+
/^D, .* : #{Regexp.escape(msg)}/
|
|
620
611
|
end
|
|
621
612
|
|
|
622
613
|
def fatal_line_with(msg)
|
|
623
|
-
|
|
614
|
+
/^F, .* : #{Regexp.escape(msg)}/
|
|
624
615
|
end
|
|
625
616
|
end
|
|
626
617
|
|
|
627
618
|
describe Kitchen::Transport::Winrm::Connection do
|
|
628
|
-
|
|
629
619
|
let(:logged_output) { StringIO.new }
|
|
630
620
|
let(:logger) { Logger.new(logged_output) }
|
|
631
621
|
|
|
632
622
|
let(:options) do
|
|
633
|
-
{ :
|
|
634
|
-
:
|
|
635
|
-
:
|
|
636
|
-
:
|
|
623
|
+
{ logger: logger, user: "me", password: "haha",
|
|
624
|
+
endpoint: "http://foo:5985/wsman", winrm_transport: :plaintext,
|
|
625
|
+
kitchen_root: "/i/am/root", instance_name: "coolbeans",
|
|
626
|
+
rdp_port: "rdpyeah" }
|
|
637
627
|
end
|
|
638
628
|
|
|
639
629
|
let(:info) do
|
|
640
630
|
copts = {
|
|
641
|
-
:
|
|
642
|
-
:
|
|
643
|
-
:
|
|
644
|
-
:
|
|
631
|
+
user: "me",
|
|
632
|
+
password: "haha",
|
|
633
|
+
endpoint: "http://foo:5985/wsman",
|
|
634
|
+
winrm_transport: :plaintext,
|
|
645
635
|
}
|
|
646
636
|
"<#{copts}>"
|
|
647
637
|
end
|
|
@@ -681,11 +671,10 @@ describe Kitchen::Transport::Winrm::Connection do
|
|
|
681
671
|
end
|
|
682
672
|
|
|
683
673
|
describe "#close" do
|
|
684
|
-
|
|
685
674
|
let(:response) do
|
|
686
675
|
o = WinRM::Output.new
|
|
687
676
|
o.exitcode = 0
|
|
688
|
-
o << { :
|
|
677
|
+
o << { stdout: "ok\r\n" }
|
|
689
678
|
o
|
|
690
679
|
end
|
|
691
680
|
|
|
@@ -695,10 +684,10 @@ describe Kitchen::Transport::Winrm::Connection do
|
|
|
695
684
|
winrm_session.stubs(:shell).with(:powershell).returns(executor)
|
|
696
685
|
executor.stubs(:close)
|
|
697
686
|
elevated_runner.stubs(:close)
|
|
698
|
-
executor.stubs(:run)
|
|
699
|
-
with("doit").yields("ok\n", nil).returns(response)
|
|
700
|
-
executor.stubs(:run)
|
|
701
|
-
with("$env:temp").yields("ok\n", nil).returns(response)
|
|
687
|
+
executor.stubs(:run)
|
|
688
|
+
.with("doit").yields("ok\n", nil).returns(response)
|
|
689
|
+
executor.stubs(:run)
|
|
690
|
+
.with("$env:temp").yields("ok\n", nil).returns(response)
|
|
702
691
|
end
|
|
703
692
|
|
|
704
693
|
it "only closes the shell once for multiple calls" do
|
|
@@ -732,24 +721,22 @@ describe Kitchen::Transport::Winrm::Connection do
|
|
|
732
721
|
end
|
|
733
722
|
|
|
734
723
|
describe "#execute" do
|
|
735
|
-
|
|
736
724
|
before do
|
|
737
725
|
winrm_session.stubs(:shell).with(:powershell).returns(executor)
|
|
738
726
|
end
|
|
739
727
|
|
|
740
728
|
describe "for a successful command" do
|
|
741
|
-
|
|
742
729
|
let(:response) do
|
|
743
730
|
o = WinRM::Output.new
|
|
744
731
|
o.exitcode = 0
|
|
745
|
-
o << { :
|
|
746
|
-
o << { :
|
|
732
|
+
o << { stdout: "ok\r\n" }
|
|
733
|
+
o << { stderr: "congrats\r\n" }
|
|
747
734
|
o
|
|
748
735
|
end
|
|
749
736
|
|
|
750
737
|
before do
|
|
751
|
-
executor.expects(:run)
|
|
752
|
-
with("doit").yields("ok\n", nil).returns(response)
|
|
738
|
+
executor.expects(:run)
|
|
739
|
+
.with("doit").yields("ok\n", nil).returns(response)
|
|
753
740
|
end
|
|
754
741
|
|
|
755
742
|
it "logger displays command on debug" do
|
|
@@ -784,14 +771,14 @@ describe Kitchen::Transport::Winrm::Connection do
|
|
|
784
771
|
let(:response) do
|
|
785
772
|
o = WinRM::Output.new
|
|
786
773
|
o.exitcode = 0
|
|
787
|
-
o << { :
|
|
788
|
-
o << { :
|
|
774
|
+
o << { stdout: "ok\r\n" }
|
|
775
|
+
o << { stderr: "congrats\r\n" }
|
|
789
776
|
o
|
|
790
777
|
end
|
|
791
778
|
let(:env_temp_response) do
|
|
792
779
|
o = WinRM::Output.new
|
|
793
780
|
o.exitcode = 0
|
|
794
|
-
o << { :
|
|
781
|
+
o << { stdout: "temp_dir" }
|
|
795
782
|
o
|
|
796
783
|
end
|
|
797
784
|
let(:elevated_runner) do
|
|
@@ -809,10 +796,10 @@ describe Kitchen::Transport::Winrm::Connection do
|
|
|
809
796
|
before do
|
|
810
797
|
options[:elevated_username] = "username"
|
|
811
798
|
options[:elevated_password] = "password"
|
|
812
|
-
executor.expects(:run)
|
|
813
|
-
with("$env:temp").returns(env_temp_response)
|
|
814
|
-
elevated_runner.expects(:run)
|
|
815
|
-
with(
|
|
799
|
+
executor.expects(:run)
|
|
800
|
+
.with("$env:temp").returns(env_temp_response)
|
|
801
|
+
elevated_runner.expects(:run)
|
|
802
|
+
.with(
|
|
816
803
|
"$env:temp='temp_dir';doit"
|
|
817
804
|
).yields("ok\n", nil).returns(response)
|
|
818
805
|
elevated_runner.expects(:username=).with("username")
|
|
@@ -830,10 +817,10 @@ describe Kitchen::Transport::Winrm::Connection do
|
|
|
830
817
|
before do
|
|
831
818
|
options[:elevated_username] = options[:user]
|
|
832
819
|
options[:elevated_password] = options[:password]
|
|
833
|
-
executor.expects(:run)
|
|
834
|
-
with("$env:temp").returns(env_temp_response)
|
|
835
|
-
elevated_runner.expects(:run)
|
|
836
|
-
with(
|
|
820
|
+
executor.expects(:run)
|
|
821
|
+
.with("$env:temp").returns(env_temp_response)
|
|
822
|
+
elevated_runner.expects(:run)
|
|
823
|
+
.with(
|
|
837
824
|
"$env:temp='temp_dir';doit"
|
|
838
825
|
).yields("ok\n", nil).returns(response)
|
|
839
826
|
elevated_runner.expects(:username=).with(options[:user])
|
|
@@ -849,35 +836,34 @@ describe Kitchen::Transport::Winrm::Connection do
|
|
|
849
836
|
end
|
|
850
837
|
|
|
851
838
|
describe "for a failed command" do
|
|
852
|
-
|
|
853
839
|
let(:response) do
|
|
854
840
|
o = WinRM::Output.new
|
|
855
841
|
o.exitcode = 1
|
|
856
|
-
o << { :
|
|
857
|
-
o << { :
|
|
858
|
-
o << { :
|
|
859
|
-
o << { :
|
|
860
|
-
o << { :
|
|
861
|
-
o << { :
|
|
862
|
-
o << { :
|
|
863
|
-
o << { :
|
|
864
|
-
o << { :
|
|
865
|
-
o << { :
|
|
866
|
-
o << { :
|
|
867
|
-
o << { :
|
|
868
|
-
o << { :
|
|
869
|
-
o << { :
|
|
870
|
-
o << { :
|
|
871
|
-
o << { :
|
|
872
|
-
o << { :
|
|
873
|
-
o << { :
|
|
874
|
-
o << { :
|
|
842
|
+
o << { stderr: "#< CLIXML\r\n" }
|
|
843
|
+
o << { stderr: '<Objs Version="1.1.0.1" xmlns="http://schemas.' }
|
|
844
|
+
o << { stderr: 'microsoft.com/powershell/2004/04"><S S="Error">' }
|
|
845
|
+
o << { stderr: "doit : The term 'doit' is not recognized as the " }
|
|
846
|
+
o << { stderr: "name of a cmdlet, function, _x000D__x000A_</S>" }
|
|
847
|
+
o << { stderr: '<S S="Error">script file, or operable program. ' }
|
|
848
|
+
o << { stderr: "Check the spelling of" }
|
|
849
|
+
o << { stderr: 'the name, or if a path _x000D__x000A_</S><S S="E' }
|
|
850
|
+
o << { stderr: 'rror">was included, verify that the path is corr' }
|
|
851
|
+
o << { stderr: 'ect and try again._x000D__x000A_</S><S S="Error' }
|
|
852
|
+
o << { stderr: '">At line:1 char:1_x000D__x000A_</S><S S="Error' }
|
|
853
|
+
o << { stderr: '">+ doit_x000D__x000A_</S><S S="Error">+ ~~~~_' }
|
|
854
|
+
o << { stderr: 'x000D__x000A_</S><S S="Error"> + CategoryInf' }
|
|
855
|
+
o << { stderr: "o : ObjectNotFound: (doit:String) [], Co" }
|
|
856
|
+
o << { stderr: 'mmandNotFoun _x000D__x000A_</S><S S="Error"> ' }
|
|
857
|
+
o << { stderr: 'dException_x000D__x000A_</S><S S="Error"> + ' }
|
|
858
|
+
o << { stderr: "FullyQualifiedErrorId : CommandNotFoundException_" }
|
|
859
|
+
o << { stderr: 'x000D__x000A_</S><S S="Error"> _x000D__x000A_</' }
|
|
860
|
+
o << { stderr: "S></Objs>" }
|
|
875
861
|
o
|
|
876
862
|
end
|
|
877
863
|
|
|
878
864
|
before do
|
|
879
|
-
executor.expects(:run)
|
|
880
|
-
with("doit").yields("nope\n", nil).returns(response)
|
|
865
|
+
executor.expects(:run)
|
|
866
|
+
.with("doit").yields("nope\n", nil).returns(response)
|
|
881
867
|
end
|
|
882
868
|
|
|
883
869
|
# rubocop:disable Metrics/MethodLength
|
|
@@ -931,13 +917,12 @@ MSG
|
|
|
931
917
|
# rubocop:enable Metrics/MethodLength
|
|
932
918
|
|
|
933
919
|
describe "when a non-zero exit code is returned" do
|
|
934
|
-
|
|
935
920
|
common_failed_command_specs
|
|
936
921
|
|
|
937
922
|
it "raises a WinrmFailed exception" do
|
|
938
|
-
err = proc
|
|
923
|
+
err = proc do
|
|
939
924
|
connection.execute("doit")
|
|
940
|
-
|
|
925
|
+
end.must_raise Kitchen::Transport::WinrmFailed
|
|
941
926
|
err.message.must_equal "WinRM exited (1) for command: [doit]"
|
|
942
927
|
end
|
|
943
928
|
|
|
@@ -952,7 +937,6 @@ MSG
|
|
|
952
937
|
end
|
|
953
938
|
|
|
954
939
|
describe "for a nil command" do
|
|
955
|
-
|
|
956
940
|
it "does not log on debug" do
|
|
957
941
|
executor.expects(:open).never
|
|
958
942
|
connection.execute(nil)
|
|
@@ -968,14 +952,13 @@ MSG
|
|
|
968
952
|
HTTPClient::KeepAliveDisconnected, HTTPClient::ConnectTimeoutError
|
|
969
953
|
].each do |klass|
|
|
970
954
|
describe "raising #{klass}" do
|
|
971
|
-
|
|
972
955
|
before do
|
|
973
956
|
k = if klass == ::WinRM::WinRMHTTPTransportError
|
|
974
957
|
# this exception takes 2 args in its constructor, which is not stock
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
958
|
+
klass.new("dang", 200)
|
|
959
|
+
else
|
|
960
|
+
klass
|
|
961
|
+
end
|
|
979
962
|
|
|
980
963
|
options[:connection_retries] = 3
|
|
981
964
|
options[:connection_retry_sleep] = 7
|
|
@@ -990,7 +973,6 @@ MSG
|
|
|
990
973
|
end
|
|
991
974
|
|
|
992
975
|
describe "#login_command" do
|
|
993
|
-
|
|
994
976
|
let(:login_command) { connection.login_command }
|
|
995
977
|
let(:args) { login_command.arguments.join(" ") }
|
|
996
978
|
let(:exec_args) { login_command.exec_args }
|
|
@@ -1000,7 +982,6 @@ MSG
|
|
|
1000
982
|
end
|
|
1001
983
|
|
|
1002
984
|
describe "for Mac-based workstations" do
|
|
1003
|
-
|
|
1004
985
|
before do
|
|
1005
986
|
RbConfig::CONFIG.stubs(:[]).with("host_os").returns("darwin14")
|
|
1006
987
|
end
|
|
@@ -1058,7 +1039,6 @@ MSG
|
|
|
1058
1039
|
end
|
|
1059
1040
|
|
|
1060
1041
|
describe "for Windows-based workstations" do
|
|
1061
|
-
|
|
1062
1042
|
before do
|
|
1063
1043
|
RbConfig::CONFIG.stubs(:[]).with("host_os").returns("mingw32")
|
|
1064
1044
|
end
|
|
@@ -1114,7 +1094,6 @@ MSG
|
|
|
1114
1094
|
end
|
|
1115
1095
|
|
|
1116
1096
|
describe "for Linux-based workstations" do
|
|
1117
|
-
|
|
1118
1097
|
before do
|
|
1119
1098
|
RbConfig::CONFIG.stubs(:[]).with("host_os").returns("linux-gnu")
|
|
1120
1099
|
end
|
|
@@ -1144,7 +1123,6 @@ MSG
|
|
|
1144
1123
|
end
|
|
1145
1124
|
|
|
1146
1125
|
describe "for unknown workstation platforms" do
|
|
1147
|
-
|
|
1148
1126
|
before do
|
|
1149
1127
|
RbConfig::CONFIG.stubs(:[]).with("host_os").returns("cray")
|
|
1150
1128
|
end
|
|
@@ -1158,12 +1136,11 @@ MSG
|
|
|
1158
1136
|
end
|
|
1159
1137
|
|
|
1160
1138
|
describe "#upload" do
|
|
1161
|
-
|
|
1162
1139
|
before do
|
|
1163
1140
|
winrm_session.stubs(:shell).with(:powershell).returns(executor)
|
|
1164
1141
|
|
|
1165
|
-
WinRM::FS::Core::FileTransporter.stubs(:new)
|
|
1166
|
-
with(executor).returns(transporter)
|
|
1142
|
+
WinRM::FS::Core::FileTransporter.stubs(:new)
|
|
1143
|
+
.with(executor).returns(transporter)
|
|
1167
1144
|
transporter.stubs(:upload)
|
|
1168
1145
|
end
|
|
1169
1146
|
|
|
@@ -1171,8 +1148,8 @@ MSG
|
|
|
1171
1148
|
it "builds a Winrm::FileTransporter" do
|
|
1172
1149
|
WinRM::FS::Core::FileTransporter.unstub(:new)
|
|
1173
1150
|
|
|
1174
|
-
WinRM::FS::Core::FileTransporter.expects(:new)
|
|
1175
|
-
with(executor).returns(transporter)
|
|
1151
|
+
WinRM::FS::Core::FileTransporter.expects(:new)
|
|
1152
|
+
.with(executor).returns(transporter)
|
|
1176
1153
|
|
|
1177
1154
|
upload
|
|
1178
1155
|
end
|
|
@@ -1180,8 +1157,8 @@ MSG
|
|
|
1180
1157
|
it "reuses the Winrm::FileTransporter" do
|
|
1181
1158
|
WinRM::FS::Core::FileTransporter.unstub(:new)
|
|
1182
1159
|
|
|
1183
|
-
WinRM::FS::Core::FileTransporter.expects(:new)
|
|
1184
|
-
with(executor).returns(transporter).once
|
|
1160
|
+
WinRM::FS::Core::FileTransporter.expects(:new)
|
|
1161
|
+
.with(executor).returns(transporter).once
|
|
1185
1162
|
|
|
1186
1163
|
upload
|
|
1187
1164
|
upload
|
|
@@ -1190,18 +1167,16 @@ MSG
|
|
|
1190
1167
|
end
|
|
1191
1168
|
|
|
1192
1169
|
describe "for a file" do
|
|
1193
|
-
|
|
1194
1170
|
def upload # execute every time, not lazily once
|
|
1195
|
-
connection.upload("/tmp/file.txt",
|
|
1171
|
+
connection.upload("/tmp/file.txt", 'C:\\dest')
|
|
1196
1172
|
end
|
|
1197
1173
|
|
|
1198
1174
|
common_specs_for_upload
|
|
1199
1175
|
end
|
|
1200
1176
|
|
|
1201
1177
|
describe "for a collection of files" do
|
|
1202
|
-
|
|
1203
1178
|
def upload # execute every time, not lazily once
|
|
1204
|
-
connection.upload(%
|
|
1179
|
+
connection.upload(%w{/tmp/file1.txt /tmp/file2.txt}, 'C:\\dest')
|
|
1205
1180
|
end
|
|
1206
1181
|
|
|
1207
1182
|
common_specs_for_upload
|
|
@@ -1209,24 +1184,22 @@ MSG
|
|
|
1209
1184
|
end
|
|
1210
1185
|
|
|
1211
1186
|
describe "#wait_until_ready" do
|
|
1212
|
-
|
|
1213
1187
|
before do
|
|
1214
1188
|
winrm_session.stubs(:shell).with(:powershell).returns(executor)
|
|
1215
1189
|
options[:max_wait_until_ready] = 300
|
|
1216
1190
|
end
|
|
1217
1191
|
|
|
1218
1192
|
describe "when connection is successful" do
|
|
1219
|
-
|
|
1220
1193
|
let(:response) do
|
|
1221
1194
|
o = WinRM::Output.new
|
|
1222
1195
|
o.exitcode = 0
|
|
1223
|
-
o << { :
|
|
1196
|
+
o << { stdout: "[WinRM] Established\r\n" }
|
|
1224
1197
|
o
|
|
1225
1198
|
end
|
|
1226
1199
|
|
|
1227
1200
|
before do
|
|
1228
|
-
executor.expects(:run)
|
|
1229
|
-
with("Write-Host '[WinRM] Established\n'").returns(response)
|
|
1201
|
+
executor.expects(:run)
|
|
1202
|
+
.with("Write-Host '[WinRM] Established\n'").returns(response)
|
|
1230
1203
|
end
|
|
1231
1204
|
|
|
1232
1205
|
it "executes an empty command string to ensure working" do
|
|
@@ -1235,23 +1208,22 @@ MSG
|
|
|
1235
1208
|
end
|
|
1236
1209
|
|
|
1237
1210
|
describe "when connection suceeds but command fails, sad panda" do
|
|
1238
|
-
|
|
1239
1211
|
let(:response) do
|
|
1240
1212
|
o = WinRM::Output.new
|
|
1241
1213
|
o.exitcode = 42
|
|
1242
|
-
o << { :
|
|
1214
|
+
o << { stderr: "Ah crap.\r\n" }
|
|
1243
1215
|
o
|
|
1244
1216
|
end
|
|
1245
1217
|
|
|
1246
1218
|
before do
|
|
1247
|
-
executor.expects(:run)
|
|
1248
|
-
with("Write-Host '[WinRM] Established\n'").returns(response)
|
|
1219
|
+
executor.expects(:run)
|
|
1220
|
+
.with("Write-Host '[WinRM] Established\n'").returns(response)
|
|
1249
1221
|
end
|
|
1250
1222
|
|
|
1251
1223
|
it "executes an empty command string to ensure working" do
|
|
1252
|
-
err = proc
|
|
1224
|
+
err = proc do
|
|
1253
1225
|
connection.wait_until_ready
|
|
1254
|
-
|
|
1226
|
+
end.must_raise Kitchen::Transport::WinrmFailed
|
|
1255
1227
|
err.message.must_equal "WinRM exited (42) for command: " \
|
|
1256
1228
|
"[Write-Host '[WinRM] Established\n']"
|
|
1257
1229
|
end
|
|
@@ -1269,24 +1241,24 @@ MSG
|
|
|
1269
1241
|
end
|
|
1270
1242
|
|
|
1271
1243
|
def debug_output(output)
|
|
1272
|
-
regexp =
|
|
1273
|
-
output.lines.grep(
|
|
1244
|
+
regexp = /^D, .* DEBUG -- : /
|
|
1245
|
+
output.lines.grep(/^D, .* DEBUG -- : /).map { |l| l.sub(regexp, "") }.join
|
|
1274
1246
|
end
|
|
1275
1247
|
|
|
1276
1248
|
def debug_line(msg)
|
|
1277
|
-
|
|
1249
|
+
/^D, .* : #{Regexp.escape(msg)}$/
|
|
1278
1250
|
end
|
|
1279
1251
|
|
|
1280
1252
|
def debug_line_with(msg)
|
|
1281
|
-
|
|
1253
|
+
/^D, .* : #{Regexp.escape(msg)}/
|
|
1282
1254
|
end
|
|
1283
1255
|
|
|
1284
1256
|
def info_line(msg)
|
|
1285
|
-
|
|
1257
|
+
/^I, .* : #{Regexp.escape(msg)}$/
|
|
1286
1258
|
end
|
|
1287
1259
|
|
|
1288
1260
|
def info_line_with(msg)
|
|
1289
|
-
|
|
1261
|
+
/^I, .* : #{Regexp.escape(msg)}/
|
|
1290
1262
|
end
|
|
1291
1263
|
|
|
1292
1264
|
def regexify(string)
|
|
@@ -1294,10 +1266,10 @@ MSG
|
|
|
1294
1266
|
end
|
|
1295
1267
|
|
|
1296
1268
|
def warn_line(msg)
|
|
1297
|
-
|
|
1269
|
+
/^W, .* : #{Regexp.escape(msg)}$/
|
|
1298
1270
|
end
|
|
1299
1271
|
|
|
1300
1272
|
def warn_line_with(msg)
|
|
1301
|
-
|
|
1273
|
+
/^W, .* : #{Regexp.escape(msg)}/
|
|
1302
1274
|
end
|
|
1303
1275
|
end
|