knife-windows 1.1.0 → 1.1.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 +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: []