knife-windows 0.8.6 → 1.0.0.rc.0

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +17 -3
  4. data/CHANGELOG.md +25 -6
  5. data/DOC_CHANGES.md +323 -0
  6. data/Gemfile +2 -1
  7. data/README.md +160 -29
  8. data/RELEASE_NOTES.md +59 -6
  9. data/appveyor.yml +42 -0
  10. data/ci.gemfile +15 -0
  11. data/knife-windows.gemspec +4 -2
  12. data/lib/chef/knife/bootstrap/windows-chef-client-msi.erb +35 -21
  13. data/lib/chef/knife/bootstrap_windows_base.rb +155 -31
  14. data/lib/chef/knife/bootstrap_windows_ssh.rb +1 -1
  15. data/lib/chef/knife/bootstrap_windows_winrm.rb +17 -10
  16. data/lib/chef/knife/core/windows_bootstrap_context.rb +67 -16
  17. data/lib/chef/knife/windows_cert_generate.rb +155 -0
  18. data/lib/chef/knife/windows_cert_install.rb +62 -0
  19. data/lib/chef/knife/windows_helper.rb +3 -1
  20. data/lib/chef/knife/windows_listener_create.rb +100 -0
  21. data/lib/chef/knife/winrm.rb +84 -208
  22. data/lib/chef/knife/winrm_base.rb +36 -10
  23. data/lib/chef/knife/winrm_knife_base.rb +201 -0
  24. data/lib/chef/knife/winrm_session.rb +72 -0
  25. data/lib/chef/knife/winrm_shared_options.rb +47 -0
  26. data/lib/chef/knife/wsman_endpoint.rb +44 -0
  27. data/lib/chef/knife/wsman_test.rb +96 -0
  28. data/lib/knife-windows/path_helper.rb +77 -0
  29. data/lib/knife-windows/version.rb +1 -1
  30. data/spec/functional/bootstrap_download_spec.rb +41 -23
  31. data/spec/spec_helper.rb +11 -1
  32. data/spec/unit/knife/bootstrap_template_spec.rb +27 -27
  33. data/spec/unit/knife/bootstrap_windows_winrm_spec.rb +67 -23
  34. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +47 -0
  35. data/spec/unit/knife/windows_cert_generate_spec.rb +90 -0
  36. data/spec/unit/knife/windows_cert_install_spec.rb +35 -0
  37. data/spec/unit/knife/windows_listener_create_spec.rb +61 -0
  38. data/spec/unit/knife/winrm_session_spec.rb +47 -0
  39. data/spec/unit/knife/winrm_spec.rb +222 -56
  40. data/spec/unit/knife/wsman_test_spec.rb +176 -0
  41. metadata +51 -20
@@ -0,0 +1,176 @@
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
176
+ end
metadata CHANGED
@@ -1,55 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-windows
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.6
4
+ version: 1.0.0.rc.0
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-08-05 00:00:00.000000000 Z
11
+ date: 2015-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: winrm
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: winrm-s
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
- - - "~>"
31
+ - - ~>
18
32
  - !ruby/object:Gem::Version
19
- version: 0.3.1
33
+ version: 0.3.0.dev.0
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
- - - "~>"
38
+ - - ~>
25
39
  - !ruby/object:Gem::Version
26
- version: 0.3.1
40
+ version: 0.3.0.dev.0
27
41
  - !ruby/object:Gem::Dependency
28
- name: em-winrm
42
+ name: nokogiri
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - "~>"
45
+ - - '>='
32
46
  - !ruby/object:Gem::Version
33
- version: '0.7'
47
+ version: '0'
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - "~>"
52
+ - - '>='
39
53
  - !ruby/object:Gem::Version
40
- version: '0.7'
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: pry
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ">="
59
+ - - '>='
46
60
  - !ruby/object:Gem::Version
47
61
  version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - ">="
66
+ - - '>='
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  description: Plugin that adds functionality to Chef's Knife CLI for configuring/interacting
@@ -60,15 +74,18 @@ executables: []
60
74
  extensions: []
61
75
  extra_rdoc_files: []
62
76
  files:
63
- - ".gitignore"
64
- - ".rspec"
65
- - ".travis.yml"
77
+ - .gitignore
78
+ - .rspec
79
+ - .travis.yml
66
80
  - CHANGELOG.md
81
+ - DOC_CHANGES.md
67
82
  - Gemfile
68
83
  - LICENSE
69
84
  - README.md
70
85
  - RELEASE_NOTES.md
71
86
  - Rakefile
87
+ - appveyor.yml
88
+ - ci.gemfile
72
89
  - features/knife_help.feature
73
90
  - features/support/env.rb
74
91
  - knife-windows.gemspec
@@ -77,9 +94,17 @@ files:
77
94
  - lib/chef/knife/bootstrap_windows_ssh.rb
78
95
  - lib/chef/knife/bootstrap_windows_winrm.rb
79
96
  - lib/chef/knife/core/windows_bootstrap_context.rb
97
+ - lib/chef/knife/windows_cert_generate.rb
98
+ - lib/chef/knife/windows_cert_install.rb
80
99
  - lib/chef/knife/windows_helper.rb
100
+ - lib/chef/knife/windows_listener_create.rb
81
101
  - lib/chef/knife/winrm.rb
82
102
  - lib/chef/knife/winrm_base.rb
103
+ - lib/chef/knife/winrm_knife_base.rb
104
+ - lib/chef/knife/winrm_session.rb
105
+ - lib/chef/knife/winrm_shared_options.rb
106
+ - lib/chef/knife/wsman_endpoint.rb
107
+ - lib/chef/knife/wsman_test.rb
83
108
  - lib/knife-windows/path_helper.rb
84
109
  - lib/knife-windows/version.rb
85
110
  - spec/functional/bootstrap_download_spec.rb
@@ -87,7 +112,12 @@ files:
87
112
  - spec/unit/knife/bootstrap_template_spec.rb
88
113
  - spec/unit/knife/bootstrap_windows_winrm_spec.rb
89
114
  - spec/unit/knife/core/windows_bootstrap_context_spec.rb
115
+ - spec/unit/knife/windows_cert_generate_spec.rb
116
+ - spec/unit/knife/windows_cert_install_spec.rb
117
+ - spec/unit/knife/windows_listener_create_spec.rb
118
+ - spec/unit/knife/winrm_session_spec.rb
90
119
  - spec/unit/knife/winrm_spec.rb
120
+ - spec/unit/knife/wsman_test_spec.rb
91
121
  homepage: https://github.com/opscode/knife-windows
92
122
  licenses:
93
123
  - Apache-2.0
@@ -98,19 +128,20 @@ require_paths:
98
128
  - lib
99
129
  required_ruby_version: !ruby/object:Gem::Requirement
100
130
  requirements:
101
- - - ">="
131
+ - - '>='
102
132
  - !ruby/object:Gem::Version
103
133
  version: 1.9.1
104
134
  required_rubygems_version: !ruby/object:Gem::Requirement
105
135
  requirements:
106
- - - ">="
136
+ - - '>'
107
137
  - !ruby/object:Gem::Version
108
- version: '0'
138
+ version: 1.3.1
109
139
  requirements: []
110
140
  rubyforge_project:
111
- rubygems_version: 2.2.3
141
+ rubygems_version: 2.0.14
112
142
  signing_key:
113
143
  specification_version: 4
114
144
  summary: Plugin that adds functionality to Chef's Knife CLI for configuring/interacting
115
145
  with nodes running Microsoft Windows
116
146
  test_files: []
147
+ has_rdoc: