knife-windows 1.1.0 → 1.1.1

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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -5
  3. data/.travis.yml +20 -20
  4. data/CHANGELOG.md +87 -83
  5. data/DOC_CHANGES.md +20 -20
  6. data/Gemfile +12 -12
  7. data/LICENSE +201 -201
  8. data/README.md +396 -396
  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 +28 -28
  16. data/lib/chef/knife/bootstrap/windows-chef-client-msi.erb +247 -247
  17. data/lib/chef/knife/bootstrap_windows_base.rb +407 -401
  18. data/lib/chef/knife/bootstrap_windows_ssh.rb +110 -110
  19. data/lib/chef/knife/bootstrap_windows_winrm.rb +95 -102
  20. data/lib/chef/knife/core/windows_bootstrap_context.rb +362 -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 -212
  27. data/lib/chef/knife/winrm_base.rb +118 -118
  28. data/lib/chef/knife/winrm_knife_base.rb +309 -218
  29. data/lib/chef/knife/winrm_session.rb +82 -82
  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 +95 -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 -233
  41. data/spec/spec_helper.rb +88 -88
  42. data/spec/unit/knife/bootstrap_options_spec.rb +148 -146
  43. data/spec/unit/knife/bootstrap_template_spec.rb +92 -92
  44. data/spec/unit/knife/bootstrap_windows_winrm_spec.rb +259 -243
  45. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +151 -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 +73 -73
  50. data/spec/unit/knife/winrm_spec.rb +551 -504
  51. data/spec/unit/knife/wsman_test_spec.rb +178 -175
  52. metadata +3 -23
@@ -1,176 +1,179 @@
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
-
27
- context 'when testing the WSMAN endpoint' do
28
- let(:wsman_tester) { Chef::Knife::WsmanTest.new(['-m', 'localhost']) }
29
- let(:http_client_mock) {HTTPClient.new}
30
-
31
- before(:each) do
32
- wsman_tester.config[:verbosity] = 0
33
- allow(HTTPClient).to receive(:new).and_return(http_client_mock)
34
- end
35
-
36
- context 'and the service does not respond' do
37
- error_message = 'A connection attempt failed because the connected party did not properly respond after a period of time.'
38
-
39
- before(:each) do
40
- allow(HTTPClient).to receive(:new).and_return(http_client_mock)
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(wsman_tester).to receive(:exit).with(1)
46
- wsman_tester.run
47
- end
48
-
49
- it 'writes a warning message for each node it fails to connect to' do
50
- expect(wsman_tester.ui).to receive(:warn)
51
- expect(wsman_tester).to receive(:exit).with(1)
52
- wsman_tester.run
53
- end
54
-
55
- it 'writes an error message if it fails to connect to any nodes' do
56
- expect(wsman_tester.ui).to receive(:error)
57
- expect(wsman_tester).to receive(:exit).with(1)
58
- wsman_tester.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(wsman_tester.ui).to receive(:msg)
69
- wsman_tester.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(wsman_tester.ui).to receive(:warn)
79
- expect(wsman_tester.ui).to receive(:error)
80
- expect(wsman_tester).to receive(:exit).with(1)
81
- wsman_tester.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('')
88
- http_response_mock.status = 404
89
- allow(http_client_mock).to receive(:post).and_return(http_response_mock)
90
- expect(wsman_tester.ui).to receive(:warn)
91
- expect(wsman_tester.ui).to receive(:error)
92
- expect(wsman_tester).to receive(:exit).with(1)
93
- wsman_tester.run
94
- end
95
- end
96
- end
97
- end
98
-
99
- context 'when testing the WSMAN endpoint with verbose output' do
100
- let(:wsman_tester_verbose) { Chef::Knife::WsmanTest.new(['-m', 'localhost']) }
101
- let(:http_client_mock_verbose) {HTTPClient.new}
102
-
103
- before(:each) do
104
- allow(HTTPClient).to receive(:new).and_return(http_client_mock_verbose)
105
- wsman_tester_verbose.config[:verbosity] = 1
106
- end
107
-
108
- context 'and the service does not respond' do
109
- it 'returns an object with an error message' do
110
- error_message = 'A connection attempt failed because the connected party did not properly respond after a period of time.'
111
- allow(http_client_mock_verbose).to receive(:post).and_raise(Exception.new(error_message))
112
- expect(wsman_tester_verbose).to receive(:output).with(duck_type(:error_message))
113
- expect(wsman_tester_verbose).to receive(:exit).with(1)
114
- wsman_tester_verbose.run
115
- end
116
- end
117
-
118
- context 'and the target node is Windows Server 2008 R2' do
119
- before(:each) do
120
- 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>'
121
- http_response_mock = HTTP::Message.new_response(ws2008r2_response_body)
122
- allow(http_client_mock_verbose).to receive(:post).and_return(http_response_mock)
123
- end
124
-
125
- it 'identifies the stack of the product version as 2.0 ' do
126
- expect(wsman_tester_verbose).to receive(:output) do |output|
127
- expect(output.product_version).to eq 'OS: 0.0.0 SP: 0.0 Stack: 2.0'
128
- end
129
- wsman_tester_verbose.run
130
- end
131
-
132
- it 'identifies the protocol version as the current DMTF standard' do
133
- expect(wsman_tester_verbose).to receive(:output) do |output|
134
- expect(output.protocol_version).to eq 'http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd'
135
- end
136
- wsman_tester_verbose.run
137
- end
138
-
139
- it 'identifies the vendor as the Microsoft Corporation' do
140
- expect(wsman_tester_verbose).to receive(:output) do |output|
141
- expect(output.product_vendor).to eq 'Microsoft Corporation'
142
- end
143
- wsman_tester_verbose.run
144
- end
145
- end
146
-
147
- context 'and the target node is Windows Server 2012 R2' do
148
- before(:each) do
149
- 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>'
150
- http_response_mock = HTTP::Message.new_response(ws2012_response_body)
151
- allow(http_client_mock_verbose).to receive(:post).and_return(http_response_mock)
152
- end
153
-
154
- it 'identifies the stack of the product version as 3.0 ' do
155
- expect(wsman_tester_verbose).to receive(:output) do |output|
156
- expect(output.product_version).to eq 'OS: 0.0.0 SP: 0.0 Stack: 3.0'
157
- end
158
- wsman_tester_verbose.run
159
- end
160
-
161
- it 'identifies the protocol version as the current DMTF standard' do
162
- expect(wsman_tester_verbose).to receive(:output) do |output|
163
- expect(output.protocol_version).to eq 'http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd'
164
- end
165
- wsman_tester_verbose.run
166
- end
167
-
168
- it 'identifies the vendor as the Microsoft Corporation' do
169
- expect(wsman_tester_verbose).to receive(:output) do |output|
170
- expect(output.product_vendor).to eq 'Microsoft Corporation'
171
- end
172
- wsman_tester_verbose.run
173
- end
174
- end
175
- 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
+ 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
176
179
  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.1.0
4
+ version: 1.1.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: 2015-10-13 00:00:00.000000000 Z
11
+ date: 2015-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: winrm
@@ -150,24 +150,4 @@ signing_key:
150
150
  specification_version: 4
151
151
  summary: Plugin that adds functionality to Chef's Knife CLI for configuring/interacting
152
152
  with nodes running Microsoft Windows
153
- test_files:
154
- - features/knife_help.feature
155
- - features/support/env.rb
156
- - spec/assets/win_template_rendered_with_bootstrap_install_command.txt
157
- - spec/assets/win_template_rendered_with_bootstrap_install_command_on_12_5_client.txt
158
- - spec/assets/win_template_rendered_without_bootstrap_install_command.txt
159
- - spec/assets/win_template_rendered_without_bootstrap_install_command_on_12_5_client.txt
160
- - spec/assets/win_template_unrendered.txt
161
- - spec/functional/bootstrap_download_spec.rb
162
- - spec/spec_helper.rb
163
- - spec/unit/knife/bootstrap_options_spec.rb
164
- - spec/unit/knife/bootstrap_template_spec.rb
165
- - spec/unit/knife/bootstrap_windows_winrm_spec.rb
166
- - spec/unit/knife/core/windows_bootstrap_context_spec.rb
167
- - spec/unit/knife/windows_cert_generate_spec.rb
168
- - spec/unit/knife/windows_cert_install_spec.rb
169
- - spec/unit/knife/windows_listener_create_spec.rb
170
- - spec/unit/knife/winrm_session_spec.rb
171
- - spec/unit/knife/winrm_spec.rb
172
- - spec/unit/knife/wsman_test_spec.rb
173
- has_rdoc:
153
+ test_files: []