test-kitchen 1.14.1 → 1.14.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|