knife-windows 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -5
  3. data/.travis.yml +23 -23
  4. data/CHANGELOG.md +104 -101
  5. data/DOC_CHANGES.md +14 -14
  6. data/Gemfile +12 -12
  7. data/LICENSE +201 -201
  8. data/README.md +376 -376
  9. data/RELEASE_NOTES.md +34 -34
  10. data/Rakefile +21 -21
  11. data/appveyor.yml +42 -42
  12. data/ci.gemfile +15 -15
  13. data/features/knife_help.feature +20 -20
  14. data/features/support/env.rb +5 -5
  15. data/knife-windows.gemspec +25 -26
  16. data/lib/chef/knife/bootstrap/windows-chef-client-msi.erb +247 -247
  17. data/lib/chef/knife/bootstrap_windows_base.rb +415 -415
  18. data/lib/chef/knife/bootstrap_windows_ssh.rb +115 -115
  19. data/lib/chef/knife/bootstrap_windows_winrm.rb +95 -95
  20. data/lib/chef/knife/core/windows_bootstrap_context.rb +366 -362
  21. data/lib/chef/knife/knife_windows_base.rb +33 -33
  22. data/lib/chef/knife/windows_cert_generate.rb +155 -155
  23. data/lib/chef/knife/windows_cert_install.rb +68 -68
  24. data/lib/chef/knife/windows_helper.rb +36 -36
  25. data/lib/chef/knife/windows_listener_create.rb +107 -107
  26. data/lib/chef/knife/winrm.rb +122 -122
  27. data/lib/chef/knife/winrm_base.rb +113 -113
  28. data/lib/chef/knife/winrm_knife_base.rb +298 -298
  29. data/lib/chef/knife/winrm_session.rb +86 -86
  30. data/lib/chef/knife/winrm_shared_options.rb +47 -47
  31. data/lib/chef/knife/wsman_endpoint.rb +44 -44
  32. data/lib/chef/knife/wsman_test.rb +117 -95
  33. data/lib/knife-windows/path_helper.rb +234 -234
  34. data/lib/knife-windows/version.rb +6 -6
  35. data/spec/assets/win_template_rendered_with_bootstrap_install_command.txt +217 -217
  36. data/spec/assets/win_template_rendered_with_bootstrap_install_command_on_12_5_client.txt +217 -217
  37. data/spec/assets/win_template_rendered_without_bootstrap_install_command.txt +329 -329
  38. data/spec/assets/win_template_rendered_without_bootstrap_install_command_on_12_5_client.txt +329 -329
  39. data/spec/assets/win_template_unrendered.txt +246 -246
  40. data/spec/functional/bootstrap_download_spec.rb +234 -234
  41. data/spec/spec_helper.rb +93 -93
  42. data/spec/unit/knife/bootstrap_options_spec.rb +154 -150
  43. data/spec/unit/knife/bootstrap_template_spec.rb +92 -92
  44. data/spec/unit/knife/bootstrap_windows_winrm_spec.rb +295 -295
  45. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +177 -151
  46. data/spec/unit/knife/windows_cert_generate_spec.rb +90 -90
  47. data/spec/unit/knife/windows_cert_install_spec.rb +51 -51
  48. data/spec/unit/knife/windows_listener_create_spec.rb +76 -76
  49. data/spec/unit/knife/winrm_session_spec.rb +64 -64
  50. data/spec/unit/knife/winrm_spec.rb +516 -516
  51. data/spec/unit/knife/wsman_test_spec.rb +201 -178
  52. metadata +2 -16
@@ -1,179 +1,202 @@
1
- #
2
- # Author:: Steven Murawski (<smurawski@chef.io>)
3
- # Copyright:: Copyright (c) 2015 Chef Software, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- require 'spec_helper'
20
-
21
- describe Chef::Knife::WsmanTest do
22
- before(:all) do
23
- Chef::Config.reset
24
- end
25
-
26
- before(:each) do
27
- allow(subject.ui).to receive(:ask).and_return('prompted_password')
28
- end
29
-
30
- subject { Chef::Knife::WsmanTest.new(['-m', 'localhost']) }
31
-
32
- context 'when testing the WSMAN endpoint' do
33
- let(:http_client_mock) {HTTPClient.new}
34
-
35
- before(:each) do
36
- subject.config[:verbosity] = 0
37
- allow(HTTPClient).to receive(:new).and_return(http_client_mock)
38
- end
39
-
40
- context 'and the service does not respond' do
41
- error_message = 'A connection attempt failed because the connected party did not properly respond after a period of time.'
42
-
43
- before(:each) do
44
- allow(HTTPClient).to receive(:new).and_return(http_client_mock)
45
- allow(http_client_mock).to receive(:post).and_raise(Exception.new(error_message))
46
- end
47
-
48
- it 'exits with a status code of 1' do
49
- expect(subject).to receive(:exit).with(1)
50
- subject.run
51
- end
52
-
53
- it 'writes a warning message for each node it fails to connect to' do
54
- expect(subject.ui).to receive(:warn)
55
- expect(subject).to receive(:exit).with(1)
56
- subject.run
57
- end
58
-
59
- it 'writes an error message if it fails to connect to any nodes' do
60
- expect(subject.ui).to receive(:error)
61
- expect(subject).to receive(:exit).with(1)
62
- subject.run
63
- end
64
- end
65
-
66
- context 'and the service responds' do
67
- context 'successfully' do
68
- it 'writes a message about a successful connection' do
69
- response_body = '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header/><s:Body><wsmid:IdentifyResponse xmlns:wsmid="http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd"><wsmid:ProtocolVersion>http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd</wsmid:ProtocolVersion><wsmid:ProductVendor>Microsoft Corporation</wsmid:ProductVendor><wsmid:ProductVersion>OS: 0.0.0 SP: 0.0 Stack: 2.0</wsmid:ProductVersion></wsmid:IdentifyResponse></s:Body></s:Envelope>'
70
- http_response_mock = HTTP::Message.new_response(response_body)
71
- allow(http_client_mock).to receive(:post).and_return(http_response_mock)
72
- expect(subject.ui).to receive(:msg)
73
- subject.run
74
- end
75
- end
76
-
77
- context 'with an invalid body' do
78
- it 'warns for a failed connection and exit with a status of 1' do
79
- response_body = 'I am invalid'
80
- http_response_mock = HTTP::Message.new_response(response_body)
81
- allow(http_client_mock).to receive(:post).and_return(http_response_mock)
82
- expect(subject.ui).to receive(:warn)
83
- expect(subject.ui).to receive(:error)
84
- expect(subject).to receive(:exit).with(1)
85
- subject.run
86
- end
87
- end
88
-
89
- context 'with a non-200 code' do
90
- it 'warns for a failed connection and exits with a status of 1' do
91
- http_response_mock = HTTP::Message.new_response('')
92
- http_response_mock.status = 404
93
- allow(http_client_mock).to receive(:post).and_return(http_response_mock)
94
- expect(subject.ui).to receive(:warn)
95
- expect(subject.ui).to receive(:error)
96
- expect(subject).to receive(:exit).with(1)
97
- subject.run
98
- end
99
- end
100
- end
101
- end
102
-
103
- context 'when testing the WSMAN endpoint with verbose output' do
104
- let(:http_client_mock_verbose) {HTTPClient.new}
105
-
106
- before(:each) do
107
- allow(HTTPClient).to receive(:new).and_return(http_client_mock_verbose)
108
- subject.config[:verbosity] = 1
109
- end
110
-
111
- context 'and the service does not respond' do
112
- it 'returns an object with an error message' do
113
- error_message = 'A connection attempt failed because the connected party did not properly respond after a period of time.'
114
- allow(http_client_mock_verbose).to receive(:post).and_raise(Exception.new(error_message))
115
- expect(subject).to receive(:output).with(duck_type(:error_message))
116
- expect(subject).to receive(:exit).with(1)
117
- subject.run
118
- end
119
- end
120
-
121
- context 'and the target node is Windows Server 2008 R2' do
122
- before(:each) do
123
- ws2008r2_response_body = '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header/><s:Body><wsmid:IdentifyResponse xmlns:wsmid="http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd"><wsmid:ProtocolVersion>http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd</wsmid:ProtocolVersion><wsmid:ProductVendor>Microsoft Corporation</wsmid:ProductVendor><wsmid:ProductVersion>OS: 0.0.0 SP: 0.0 Stack: 2.0</wsmid:ProductVersion></wsmid:IdentifyResponse></s:Body></s:Envelope>'
124
- http_response_mock = HTTP::Message.new_response(ws2008r2_response_body)
125
- allow(http_client_mock_verbose).to receive(:post).and_return(http_response_mock)
126
- end
127
-
128
- it 'identifies the stack of the product version as 2.0 ' do
129
- expect(subject).to receive(:output) do |output|
130
- expect(output.product_version).to eq 'OS: 0.0.0 SP: 0.0 Stack: 2.0'
131
- end
132
- subject.run
133
- end
134
-
135
- it 'identifies the protocol version as the current DMTF standard' do
136
- expect(subject).to receive(:output) do |output|
137
- expect(output.protocol_version).to eq 'http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd'
138
- end
139
- subject.run
140
- end
141
-
142
- it 'identifies the vendor as the Microsoft Corporation' do
143
- expect(subject).to receive(:output) do |output|
144
- expect(output.product_vendor).to eq 'Microsoft Corporation'
145
- end
146
- subject.run
147
- end
148
- end
149
-
150
- context 'and the target node is Windows Server 2012 R2' do
151
- before(:each) do
152
- ws2012_response_body = '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header/><s:Body><wsmid:IdentifyResponse xmlns:wsmid="http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd"><wsmid:ProtocolVersion>http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd</wsmid:ProtocolVersion><wsmid:ProductVendor>Microsoft Corporation</wsmid:ProductVendor><wsmid:ProductVersion>OS: 0.0.0 SP: 0.0 Stack: 3.0</wsmid:ProductVersion></wsmid:IdentifyResponse></s:Body></s:Envelope>'
153
- http_response_mock = HTTP::Message.new_response(ws2012_response_body)
154
- allow(http_client_mock_verbose).to receive(:post).and_return(http_response_mock)
155
- end
156
-
157
- it 'identifies the stack of the product version as 3.0 ' do
158
- expect(subject).to receive(:output) do |output|
159
- expect(output.product_version).to eq 'OS: 0.0.0 SP: 0.0 Stack: 3.0'
160
- end
161
- subject.run
162
- end
163
-
164
- it 'identifies the protocol version as the current DMTF standard' do
165
- expect(subject).to receive(:output) do |output|
166
- expect(output.protocol_version).to eq 'http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd'
167
- end
168
- subject.run
169
- end
170
-
171
- it 'identifies the vendor as the Microsoft Corporation' do
172
- expect(subject).to receive(:output) do |output|
173
- expect(output.product_vendor).to eq 'Microsoft Corporation'
174
- end
175
- subject.run
176
- end
177
- end
178
- end
1
+ #
2
+ # Author:: Steven Murawski (<smurawski@chef.io>)
3
+ # Copyright:: Copyright (c) 2015 Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+
21
+ describe Chef::Knife::WsmanTest do
22
+ let(:http_client_mock) { HTTPClient.new }
23
+
24
+ before(:all) do
25
+ Chef::Config.reset
26
+ end
27
+
28
+ before(:each) do
29
+ allow(HTTPClient).to receive(:new).and_return(http_client_mock)
30
+ subject.config[:verbosity] = 0
31
+ allow(subject.ui).to receive(:ask).and_return('prompted_password')
32
+ end
33
+
34
+ subject { Chef::Knife::WsmanTest.new(['-m', 'localhost']) }
35
+
36
+ context 'when testing the WSMAN endpoint' do
37
+ context 'and the service does not respond' do
38
+ error_message = 'A connection attempt failed because the connected party did not properly respond after a period of time.'
39
+
40
+ before(:each) do
41
+ allow(http_client_mock).to receive(:post).and_raise(Exception.new(error_message))
42
+ end
43
+
44
+ it 'exits with a status code of 1' do
45
+ expect(subject).to receive(:exit).with(1)
46
+ subject.run
47
+ end
48
+
49
+ it 'writes a warning message for each node it fails to connect to' do
50
+ expect(subject.ui).to receive(:warn)
51
+ expect(subject).to receive(:exit).with(1)
52
+ subject.run
53
+ end
54
+
55
+ it 'writes an error message if it fails to connect to any nodes' do
56
+ expect(subject.ui).to receive(:error)
57
+ expect(subject).to receive(:exit).with(1)
58
+ subject.run
59
+ end
60
+ end
61
+
62
+ context 'and the service responds' do
63
+ context 'successfully' do
64
+ it 'writes a message about a successful connection' do
65
+ response_body = '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header/><s:Body><wsmid:IdentifyResponse xmlns:wsmid="http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd"><wsmid:ProtocolVersion>http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd</wsmid:ProtocolVersion><wsmid:ProductVendor>Microsoft Corporation</wsmid:ProductVendor><wsmid:ProductVersion>OS: 0.0.0 SP: 0.0 Stack: 2.0</wsmid:ProductVersion></wsmid:IdentifyResponse></s:Body></s:Envelope>'
66
+ http_response_mock = HTTP::Message.new_response(response_body)
67
+ allow(http_client_mock).to receive(:post).and_return(http_response_mock)
68
+ expect(subject.ui).to receive(:msg)
69
+ subject.run
70
+ end
71
+ end
72
+
73
+ context 'with an invalid body' do
74
+ it 'warns for a failed connection and exit with a status of 1' do
75
+ response_body = 'I am invalid'
76
+ http_response_mock = HTTP::Message.new_response(response_body)
77
+ allow(http_client_mock).to receive(:post).and_return(http_response_mock)
78
+ expect(subject.ui).to receive(:warn)
79
+ expect(subject.ui).to receive(:error)
80
+ expect(subject).to receive(:exit).with(1)
81
+ subject.run
82
+ end
83
+ end
84
+
85
+ context 'with a non-200 code' do
86
+ it 'warns for a failed connection and exits with a status of 1' do
87
+ http_response_mock = HTTP::Message.new_response('<resp></resp>')
88
+ http_response_mock.status = 404
89
+ allow(http_client_mock).to receive(:post).and_return(http_response_mock)
90
+ expect(subject.ui).to receive(:warn)
91
+ expect(subject.ui).to receive(:error)
92
+ expect(subject).to receive(:exit).with(1)
93
+ subject.run
94
+ end
95
+ end
96
+ end
97
+ end
98
+
99
+ context 'when not validating ssl cert' do
100
+ before(:each) do
101
+ response_body = '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header/><s:Body><wsmid:IdentifyResponse xmlns:wsmid="http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd"><wsmid:ProtocolVersion>http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd</wsmid:ProtocolVersion><wsmid:ProductVendor>Microsoft Corporation</wsmid:ProductVendor><wsmid:ProductVersion>OS: 0.0.0 SP: 0.0 Stack: 2.0</wsmid:ProductVersion></wsmid:IdentifyResponse></s:Body></s:Envelope>'
102
+ allow(http_client_mock).to receive(:post).and_return(HTTP::Message.new_response(response_body))
103
+ expect(subject.ui).to receive(:msg)
104
+ subject.config[:winrm_ssl_verify_mode] = :verify_none
105
+ subject.config[:winrm_transport] = :ssl
106
+ end
107
+
108
+ it 'sets verify_mode to verify_none' do
109
+ subject.run
110
+ expect(http_client_mock.ssl_config.verify_mode).to eq(OpenSSL::SSL::VERIFY_NONE)
111
+ end
112
+ end
113
+
114
+ context 'when testing the WSMAN endpoint with verbose output' do
115
+ before(:each) do
116
+ subject.config[:verbosity] = 1
117
+ end
118
+
119
+ context 'and the service does not respond' do
120
+ it 'returns an object with an error message' do
121
+ error_message = 'A connection attempt failed because the connected party did not properly respond after a period of time.'
122
+ allow(http_client_mock).to receive(:post).and_raise(Exception.new(error_message))
123
+ expect(subject).to receive(:exit).with(1)
124
+ expect(subject).to receive(:output) do |output|
125
+ expect(output.error_message).to match(/#{error_message}/)
126
+ end
127
+ subject.run
128
+ end
129
+ end
130
+
131
+ context 'with an invalid body' do
132
+ it 'includes invalid body in error message' do
133
+ response_body = 'I am invalid'
134
+ http_response_mock = HTTP::Message.new_response(response_body)
135
+ allow(http_client_mock).to receive(:post).and_return(http_response_mock)
136
+ expect(subject).to receive(:exit).with(1)
137
+ expect(subject).to receive(:output) do |output|
138
+ expect(output.error_message).to match(/#{response_body}/)
139
+ end
140
+ subject.run
141
+ end
142
+ end
143
+
144
+ context 'and the target node is Windows Server 2008 R2' do
145
+ before(:each) do
146
+ ws2008r2_response_body = '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header/><s:Body><wsmid:IdentifyResponse xmlns:wsmid="http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd"><wsmid:ProtocolVersion>http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd</wsmid:ProtocolVersion><wsmid:ProductVendor>Microsoft Corporation</wsmid:ProductVendor><wsmid:ProductVersion>OS: 0.0.0 SP: 0.0 Stack: 2.0</wsmid:ProductVersion></wsmid:IdentifyResponse></s:Body></s:Envelope>'
147
+ http_response_mock = HTTP::Message.new_response(ws2008r2_response_body)
148
+ allow(http_client_mock).to receive(:post).and_return(http_response_mock)
149
+ end
150
+
151
+ it 'identifies the stack of the product version as 2.0 ' do
152
+ expect(subject).to receive(:output) do |output|
153
+ expect(output.product_version).to eq 'OS: 0.0.0 SP: 0.0 Stack: 2.0'
154
+ end
155
+ subject.run
156
+ end
157
+
158
+ it 'identifies the protocol version as the current DMTF standard' do
159
+ expect(subject).to receive(:output) do |output|
160
+ expect(output.protocol_version).to eq 'http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd'
161
+ end
162
+ subject.run
163
+ end
164
+
165
+ it 'identifies the vendor as the Microsoft Corporation' do
166
+ expect(subject).to receive(:output) do |output|
167
+ expect(output.product_vendor).to eq 'Microsoft Corporation'
168
+ end
169
+ subject.run
170
+ end
171
+ end
172
+
173
+ context 'and the target node is Windows Server 2012 R2' do
174
+ before(:each) do
175
+ ws2012_response_body = '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header/><s:Body><wsmid:IdentifyResponse xmlns:wsmid="http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd"><wsmid:ProtocolVersion>http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd</wsmid:ProtocolVersion><wsmid:ProductVendor>Microsoft Corporation</wsmid:ProductVendor><wsmid:ProductVersion>OS: 0.0.0 SP: 0.0 Stack: 3.0</wsmid:ProductVersion></wsmid:IdentifyResponse></s:Body></s:Envelope>'
176
+ http_response_mock = HTTP::Message.new_response(ws2012_response_body)
177
+ allow(http_client_mock).to receive(:post).and_return(http_response_mock)
178
+ end
179
+
180
+ it 'identifies the stack of the product version as 3.0 ' do
181
+ expect(subject).to receive(:output) do |output|
182
+ expect(output.product_version).to eq 'OS: 0.0.0 SP: 0.0 Stack: 3.0'
183
+ end
184
+ subject.run
185
+ end
186
+
187
+ it 'identifies the protocol version as the current DMTF standard' do
188
+ expect(subject).to receive(:output) do |output|
189
+ expect(output.protocol_version).to eq 'http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd'
190
+ end
191
+ subject.run
192
+ end
193
+
194
+ it 'identifies the vendor as the Microsoft Corporation' do
195
+ expect(subject).to receive(:output) do |output|
196
+ expect(output.product_vendor).to eq 'Microsoft Corporation'
197
+ end
198
+ subject.run
199
+ end
200
+ end
201
+ end
179
202
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-windows
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Seth Chisamore
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-26 00:00:00.000000000 Z
11
+ date: 2016-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: winrm
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.6'
27
- - !ruby/object:Gem::Dependency
28
- name: nokogiri
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: pry
43
29
  requirement: !ruby/object:Gem::Requirement