knife-cloud 1.2.3 → 2.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3e9f12b223e859ae2666a230a73195fb48221bdf29edc0a3b345c0ddc40b6d3b
4
- data.tar.gz: 80e5ff22aa5769a1e671526a6fe9a06436db5b3da5192f24dd02a63d5a961089
3
+ metadata.gz: 3c8e63c32be098a1c7237ffdc07292bf4abb084e3c56fa7e336788a650307976
4
+ data.tar.gz: 68f6841384ee72b01b5b990ceeac3cf1582a8ebae9f5d63c58f67ffeb5259aa5
5
5
  SHA512:
6
- metadata.gz: 5c200c5564f6273a92472f0591bd04173b0e266488bddc3320ccccc5be2c00bdea7ac979f661083f559dd7ee4b92e82d8ca8c83335bebbcda033b81fd610106e
7
- data.tar.gz: c79491de45e5a99dc43fdcb9204e425c75f1768d90e9518069a8b8cda69b675584fa9f76ccf64aede16e4fd00f8efa2ab27f438d8b965b5bd56f3123e5b90835
6
+ metadata.gz: 92aa2998725dc7641bf1961aae50c27416188f5b0970c297398aa3e16b9648bd7a6de8a4e111934594e779f4b6ec54cf777bda4e189665f6948e0bdc9a5eedc9
7
+ data.tar.gz: 5469dc5b52b492416c8c722ece09379df2b7634db7aac0a4b0c43a1a8a5c107e1b72813c5f624b50c28d46d5f0756ee6926f1d13e596172ef31b18bf19ea1d0b
@@ -15,7 +15,7 @@
15
15
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
16
  # See the License for the specific language governing permissions and
17
17
  # limitations under the License.
18
- require "chef/knife/winrm_base"
18
+
19
19
  require "chef/knife/core/bootstrap_context"
20
20
  require "net/ssh/multi"
21
21
 
@@ -36,191 +36,6 @@ class Chef
36
36
  Chef::Knife::Ssh.load_deps
37
37
  end
38
38
 
39
- include Chef::Knife::WinrmBase
40
-
41
- option :ssh_user,
42
- short: "-x USERNAME",
43
- long: "--ssh-user USERNAME",
44
- description: "The ssh username",
45
- default: "root"
46
-
47
- option :ssh_password,
48
- short: "-P PASSWORD",
49
- long: "--ssh-password PASSWORD",
50
- description: "The ssh password"
51
-
52
- option :ssh_port,
53
- short: "-p PORT",
54
- long: "--ssh-port PORT",
55
- description: "The ssh port",
56
- proc: Proc.new { |key| Chef::Config[:knife][:ssh_port] = key },
57
- default: "22"
58
-
59
- option :ssh_gateway,
60
- long: "--ssh-gateway GATEWAY",
61
- description: "The ssh gateway server. Any proxies configured in your ssh config are automatically used by default.",
62
- proc: Proc.new { |key| Chef::Config[:knife][:ssh_gateway] = key }
63
-
64
- option :ssh_gateway_identity,
65
- long: "--ssh-gateway-identity IDENTITY_FILE",
66
- description: "The private key for ssh gateway server",
67
- proc: Proc.new { |key| Chef::Config[:knife][:ssh_gateway_identity] = key }
68
-
69
- option :forward_agent,
70
- long: "--forward-agent",
71
- description: "Enable SSH agent forwarding",
72
- boolean: true
73
-
74
- option :identity_file,
75
- short: "-i IDENTITY_FILE",
76
- long: "--identity-file IDENTITY_FILE",
77
- description: "The SSH identity file used for authentication"
78
-
79
- option :chef_node_name,
80
- short: "-N NAME",
81
- long: "--node-name NAME",
82
- description: "The Chef node name for your new node"
83
-
84
- option :prerelease,
85
- long: "--prerelease",
86
- description: "Install the pre-release chef gems"
87
-
88
- option :bootstrap_version,
89
- long: "--bootstrap-version VERSION",
90
- description: "The version of Chef to install",
91
- proc: lambda { |v| Chef::Config[:knife][:bootstrap_version] = v }
92
-
93
- option :bootstrap_proxy,
94
- long: "--bootstrap-proxy PROXY_URL",
95
- description: "The proxy server for the node being bootstrapped",
96
- proc: Proc.new { |p| Chef::Config[:knife][:bootstrap_proxy] = p }
97
-
98
- option :bootstrap_no_proxy,
99
- long: "--bootstrap-no-proxy [NO_PROXY_URL|NO_PROXY_IP]",
100
- description: "Do not proxy locations for the node being bootstrapped; this option is used internally by Chef",
101
- proc: Proc.new { |np| Chef::Config[:knife][:bootstrap_no_proxy] = np }
102
-
103
- option :bootstrap_template,
104
- short: "-t TEMPLATE",
105
- long: "--bootstrap-template TEMPLATE",
106
- description: "Bootstrap Chef using a built-in or custom template. Set to the full path of an erb template or use one of the built-in templates."
107
-
108
- option :use_sudo,
109
- long: "--sudo",
110
- description: "Execute the bootstrap via sudo",
111
- boolean: true
112
-
113
- option :use_sudo_password,
114
- long: "--use-sudo-password",
115
- description: "Execute the bootstrap via sudo with password",
116
- boolean: false
117
-
118
- option :run_list,
119
- short: "-r RUN_LIST",
120
- long: "--run-list RUN_LIST",
121
- description: "Comma separated list of roles/recipes to apply",
122
- proc: lambda { |o| o.split(/[\s,]+/) },
123
- default: []
124
-
125
- option :first_boot_attributes,
126
- short: "-j JSON_ATTRIBS",
127
- long: "--json-attributes",
128
- description: "A JSON string to be added to the first run of chef-client",
129
- proc: lambda { |o| JSON.parse(o) },
130
- default: {}
131
-
132
- option :host_key_verify,
133
- long: "--[no-]host-key-verify",
134
- description: "Verify host key, enabled by default.",
135
- boolean: true,
136
- default: true
137
-
138
- option :hint,
139
- long: "--hint HINT_NAME[=HINT_FILE]",
140
- description: "Specify Ohai Hint to be set on the bootstrap target. Use multiple --hint options to specify multiple hints.",
141
- proc: Proc.new { |h|
142
- Chef::Config[:knife][:hints] ||= Hash.new
143
- name, path = h.split("=")
144
- Chef::Config[:knife][:hints][name] = path ? JSON.parse(::File.read(path)) : Hash.new }
145
-
146
- option :secret,
147
- short: "-s SECRET",
148
- long: "--secret ",
149
- description: "The secret key to use to encrypt data bag item values"
150
-
151
- option :secret_file,
152
- long: "--secret-file SECRET_FILE",
153
- description: "A file containing the secret key to use to encrypt data bag item values"
154
-
155
- option :bootstrap_url,
156
- long: "--bootstrap-url URL",
157
- description: "URL to a custom installation script",
158
- proc: Proc.new { |u| Chef::Config[:knife][:bootstrap_url] = u }
159
-
160
- option :bootstrap_curl_options,
161
- long: "--bootstrap-curl-options OPTIONS",
162
- description: "Add options to curl when install chef-client",
163
- proc: Proc.new { |co| Chef::Config[:knife][:bootstrap_curl_options] = co }
164
-
165
- option :auth_timeout,
166
- long: "--auth-timeout MINUTES",
167
- description: "The maximum time in minutes to wait to for authentication over the transport to the node to succeed. The default value is 25 minutes.",
168
- default: 25
169
-
170
- option :node_ssl_verify_mode,
171
- long: "--node-ssl-verify-mode [peer|none]",
172
- description: "Whether or not to verify the SSL cert for all HTTPS requests.",
173
- proc: Proc.new { |v|
174
- valid_values = %w{none peer}
175
- unless valid_values.include?(v)
176
- raise "Invalid value '#{v}' for --node-ssl-verify-mode. Valid values are: #{valid_values.join(", ")}"
177
- end
178
- }
179
-
180
- option :node_verify_api_cert,
181
- long: "--[no-]node-verify-api-cert",
182
- description: "Verify the SSL cert for HTTPS requests to the Chef server API.",
183
- boolean: true
184
-
185
- option :bootstrap_install_command,
186
- long: "--bootstrap-install-command COMMANDS",
187
- description: "Custom command to install chef-client",
188
- proc: Proc.new { |ic| Chef::Config[:knife][:bootstrap_install_command] = ic }
189
-
190
- option :bootstrap_wget_options,
191
- long: "--bootstrap-wget-options OPTIONS",
192
- description: "Add options to wget when installing chef-client",
193
- proc: Proc.new { |wo| Chef::Config[:knife][:bootstrap_wget_options] = wo }
194
-
195
- option :bootstrap_vault_file,
196
- long: "--bootstrap-vault-file VAULT_FILE",
197
- description: "A JSON file with a list of vault(s) and item(s) to be updated"
198
-
199
- option :bootstrap_vault_json,
200
- long: "--bootstrap-vault-json VAULT_JSON",
201
- description: "A JSON string with the vault(s) and item(s) to be updated"
202
-
203
- option :bootstrap_vault_item,
204
- long: "--bootstrap-vault-item VAULT_ITEM",
205
- description: 'A single vault and item to update as "vault:item"',
206
- proc: Proc.new { |i|
207
- (vault, item) = i.split(/:/)
208
- Chef::Config[:knife][:bootstrap_vault_item] ||= {}
209
- Chef::Config[:knife][:bootstrap_vault_item][vault] ||= []
210
- Chef::Config[:knife][:bootstrap_vault_item][vault].push(item)
211
- Chef::Config[:knife][:bootstrap_vault_item]
212
- }
213
- option :msi_url,
214
- short: "-u URL",
215
- long: "--msi-url URL",
216
- description: "Location of the Chef Client MSI. The default templates will prefer to download from this location. The MSI will be downloaded from chef.io if not provided.",
217
- default: ""
218
-
219
- option :install_as_service,
220
- long: "--install-as-service",
221
- description: "Install chef-client as service in windows machine",
222
- default: false
223
-
224
39
  end
225
40
  end
226
41
  end # module ends
@@ -51,7 +51,6 @@ class Chef
51
51
  bootstrap.config[:run_list] = locate_config_value(:run_list)
52
52
  bootstrap.config[:prerelease] = locate_config_value(:prerelease)
53
53
  bootstrap.config[:bootstrap_version] = locate_config_value(:bootstrap_version)
54
- bootstrap.config[:distro] = locate_config_value(:distro)
55
54
  bootstrap.config[:bootstrap_proxy] = locate_config_value(:bootstrap_proxy)
56
55
  bootstrap.config[:environment] = locate_config_value(:environment)
57
56
  # see chef/knife/bootstrap.rb #warn_chef_config_secret_key.
@@ -60,7 +59,6 @@ class Chef
60
59
  bootstrap.config[:first_boot_attributes] = locate_config_value(:first_boot_attributes)
61
60
  bootstrap.config[:secret] = locate_config_value(:secret)
62
61
  bootstrap.config[:secret_file] = locate_config_value(:secret_file)
63
- bootstrap.config[:template_file] = locate_config_value(:template_file)
64
62
  bootstrap.config[:bootstrap_template] = locate_config_value(:bootstrap_template)
65
63
  bootstrap.config[:node_ssl_verify_mode] = locate_config_value(:node_ssl_verify_mode)
66
64
  bootstrap.config[:node_verify_api_cert] = locate_config_value(:node_verify_api_cert)
@@ -76,6 +74,7 @@ class Chef
76
74
  bootstrap.config[:msi_url] = locate_config_value(:msi_url)
77
75
  bootstrap.config[:install_as_service] = locate_config_value(:install_as_service)
78
76
  bootstrap.config[:session_timeout] = locate_config_value(:session_timeout)
77
+ bootstrap.config[:channel] = locate_config_value(:channel)
79
78
  end
80
79
 
81
80
  end
@@ -20,8 +20,7 @@
20
20
  require "chef/knife/core/ui"
21
21
  require "chef/knife/cloud/chefbootstrap/ssh_bootstrap_protocol"
22
22
  require "chef/knife/cloud/chefbootstrap/winrm_bootstrap_protocol"
23
- require "chef/knife/cloud/chefbootstrap/windows_distribution"
24
- require "chef/knife/cloud/chefbootstrap/unix_distribution"
23
+ require "chef/knife/cloud/chefbootstrap/bootstrap_distribution"
25
24
  require "chef/knife/cloud/exceptions"
26
25
 
27
26
  class Chef
@@ -47,9 +46,9 @@ class Chef
47
46
  end
48
47
 
49
48
  def create_bootstrap_protocol
50
- if @config[:bootstrap_protocol].nil? || @config[:bootstrap_protocol] == "ssh"
49
+ if @config[:connection_protocol].nil? || @config[:connection_protocol] == "ssh"
51
50
  SshBootstrapProtocol.new(@config)
52
- elsif @config[:bootstrap_protocol] == "winrm"
51
+ elsif @config[:connection_protocol] == "winrm"
53
52
  WinrmBootstrapProtocol.new(@config)
54
53
  else
55
54
  # raise an exception, invalid bootstrap protocol.
@@ -60,10 +59,8 @@ class Chef
60
59
  end
61
60
 
62
61
  def create_bootstrap_distribution
63
- if @config[:image_os_type] == "windows"
64
- Chef::Knife::Cloud::WindowsDistribution.new(@config)
65
- elsif @config[:image_os_type] == "linux"
66
- Chef::Knife::Cloud::UnixDistribution.new(@config)
62
+ if @config[:image_os_type] == "windows" || @config[:image_os_type] == "linux"
63
+ Chef::Knife::Cloud::BootstrapDistribution.new(@config)
67
64
  else
68
65
  # raise an exception, invalid bootstrap distribution.
69
66
  error_message = "Invalid bootstrap distribution. image_os_type should be either windows or linux."
@@ -27,18 +27,17 @@ class Chef
27
27
  class SshBootstrapProtocol < BootstrapProtocol
28
28
 
29
29
  def initialize(config)
30
- @bootstrap = (config[:image_os_type] == "linux") ? Chef::Knife::Bootstrap.new : Chef::Knife::BootstrapWindowsSsh.new
30
+ @bootstrap = Chef::Knife::Bootstrap.new
31
31
  super
32
32
  end
33
33
 
34
34
  def init_bootstrap_options
35
- bootstrap.config[:ssh_user] = @config[:ssh_user]
36
- bootstrap.config[:ssh_password] = @config[:ssh_password]
37
- bootstrap.config[:ssh_port] = locate_config_value(:ssh_port)
38
- bootstrap.config[:identity_file] = @config[:identity_file]
39
- bootstrap.config[:host_key_verify] = @config[:host_key_verify]
40
- bootstrap.config[:use_sudo] = true unless @config[:ssh_user] == "root"
41
- bootstrap.config[:template_file] = @config[:template_file]
35
+ bootstrap.config[:connection_user] = @config[:connection_user]
36
+ bootstrap.config[:connection_password] = @config[:connection_password]
37
+ bootstrap.config[:connection_port] = locate_config_value(:connection_port)
38
+ bootstrap.config[:ssh_identity_file] = @config[:ssh_identity_file]
39
+ bootstrap.config[:ssh_verify_host_key] = @config[:ssh_verify_host_key]
40
+ bootstrap.config[:use_sudo] = true unless @config[:connection_user] == "root"
42
41
  bootstrap.config[:ssh_gateway] = locate_config_value(:ssh_gateway)
43
42
  bootstrap.config[:forward_agent] = locate_config_value(:forward_agent)
44
43
  bootstrap.config[:use_sudo_password] = locate_config_value(:use_sudo_password)
@@ -58,7 +57,7 @@ class Chef
58
57
  puts("done")
59
58
  end
60
59
  else
61
- print(".") until tcp_test_ssh(@config[:bootstrap_ip_address], locate_config_value(:ssh_port)) do
60
+ print(".") until tcp_test_ssh(@config[:bootstrap_ip_address], locate_config_value(:connection_port) || Chef::Config[:knife][:ssh_port] ) do
62
61
  @initial_sleep_delay = !!locate_config_value(:subnet_id) ? 40 : 10
63
62
  sleep @initial_sleep_delay
64
63
  puts("done")
@@ -26,30 +26,29 @@ class Chef
26
26
 
27
27
  def initialize(config)
28
28
  load_winrm_deps
29
- @bootstrap = Chef::Knife::BootstrapWindowsWinrm.new
29
+ @bootstrap = Chef::Knife::Bootstrap.new
30
30
  super
31
31
  end
32
32
 
33
33
  def load_winrm_deps
34
34
  require "winrm"
35
- require "chef/knife/bootstrap_windows_winrm"
36
35
  require "chef/knife/core/windows_bootstrap_context"
37
- require "chef/knife/winrm"
38
36
  end
39
37
 
40
38
  def init_bootstrap_options
41
- bootstrap.config[:winrm_user] = @config[:winrm_user] || "Administrator"
42
- bootstrap.config[:winrm_password] = @config[:winrm_password]
43
- bootstrap.config[:winrm_transport] = @config[:winrm_transport]
44
- bootstrap.config[:winrm_port] = @config[:winrm_port]
39
+ bootstrap.config[:connection_user] = @config[:connection_user] || "Administrator"
40
+ bootstrap.config[:connection_password] = @config[:connection_password]
41
+ bootstrap.config[:winrm_ssl] = @config[:winrm_ssl]
42
+ bootstrap.config[:connection_port] = @config[:connection_port]
45
43
  bootstrap.config[:auth_timeout] = @config[:auth_timeout]
46
44
  bootstrap.config[:winrm_ssl_verify_mode] = @config[:winrm_ssl_verify_mode]
45
+ bootstrap.config[:connection_protocol] = @config[:connection_protocol]
47
46
  super
48
47
  end
49
48
 
50
49
  def wait_for_server_ready
51
50
  print "\n#{ui.color("Waiting for winrm to host (#{@config[:bootstrap_ip_address]})", :magenta)}"
52
- print(".") until tcp_test_winrm(@config[:bootstrap_ip_address], @config[:winrm_port]) do
51
+ print(".") until tcp_test_winrm(@config[:bootstrap_ip_address], @config[:connection_port]) do
53
52
  sleep @initial_sleep_delay ||= 10
54
53
  puts("done")
55
54
  end
@@ -55,43 +55,6 @@ class Chef
55
55
  Chef::Log.debug(e.message)
56
56
  exit 1
57
57
  end
58
-
59
- def create_service_instance
60
- raise Chef::Exceptions::Override, "You must override create_service_instance in #{self} to create cloud specific service"
61
- end
62
-
63
- def execute_command
64
- raise Chef::Exceptions::Override, "You must override execute_command in #{self}"
65
- end
66
-
67
- # Derived classes can override before_exec_command and after_exec_command
68
- def before_exec_command
69
- end
70
-
71
- def after_exec_command
72
- end
73
-
74
- def set_default_config
75
- end
76
-
77
- def validate!(*keys)
78
- # validates necessary options/params to carry out the command.
79
- # subclasses to implement this.
80
- errors = []
81
- keys.each do |k|
82
- errors << "You did not provide a valid '#{pretty_key(k)}' value." if locate_config_value(k).nil?
83
- end
84
- error_message = ""
85
- raise CloudExceptions::ValidationError, error_message if errors.each { |e| ui.error(e); error_message = "#{error_message} #{e}." }.any?
86
- end
87
-
88
- def validate_params!
89
- end
90
-
91
- def pretty_key(key)
92
- key.to_s.tr("_", " ").gsub(/\w+/) { |w| (w =~ /(ssh)|(aws)/i) ? w.upcase : w.capitalize }
93
- end
94
-
95
58
  end # class Command
96
59
  end
97
60
  end
@@ -0,0 +1,62 @@
1
+ #
2
+ # Author:: Ashwini Nehate (<ashwini.nehate@msystechnologies.com>)
3
+ # Copyright:: Copyright (c) 2013-2016 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 "chef/knife/bootstrap"
20
+ require "chef/knife/cloud/helpers"
21
+ require "chef/knife/cloud/exceptions"
22
+
23
+ class Chef
24
+ class Knife
25
+
26
+ class Cloud
27
+ class BootstrapCommand < Chef::Knife::Bootstrap
28
+ include Cloud::Helpers
29
+ attr_accessor :service, :custom_arguments
30
+
31
+ def run
32
+ # Set dafult config
33
+ set_default_config
34
+
35
+ # validate compulsory params
36
+ validate!
37
+
38
+ # validate command pre-requisites (cli options)
39
+ validate_params!
40
+
41
+ # setup the service
42
+ @service = create_service_instance
43
+
44
+ service.ui = ui # for interactive user prompts/messages
45
+
46
+ # Perform any steps before handling the command
47
+ before_exec_command
48
+
49
+ # exec the actual cmd
50
+ execute_command
51
+
52
+ # Perform any steps after handling the command
53
+ after_exec_command
54
+ rescue CloudExceptions::KnifeCloudError => e
55
+ Chef::Log.debug(e.message)
56
+ exit 1
57
+ end
58
+
59
+ end # class Command
60
+ end
61
+ end
62
+ end
@@ -45,18 +45,18 @@ class Chef
45
45
  def network
46
46
  @network ||= begin
47
47
  Fog::Network.new(@auth_params)
48
- rescue Excon::Error::Unauthorized => e
49
- error_message = "Connection failure, please check your username and password."
50
- ui.fatal(error_message)
51
- raise CloudExceptions::ServiceConnectionError, "#{e.message}. #{error_message}"
52
- rescue Excon::Error::Socket => e
53
- error_message = "Connection failure, please check your authentication URL."
54
- ui.fatal(error_message)
55
- raise CloudExceptions::ServiceConnectionError, "#{e.message}. #{error_message}"
56
- rescue Fog::Errors::NotFound => e
57
- error_message = "No Network service found. This command is unavailable with current cloud."
58
- ui.fatal(error_message)
59
- raise CloudExceptions::NetworkNotFoundError, "#{e.message}. #{error_message}"
48
+ rescue Excon::Error::Unauthorized => e
49
+ error_message = "Connection failure, please check your username and password."
50
+ ui.fatal(error_message)
51
+ raise CloudExceptions::ServiceConnectionError, "#{e.message}. #{error_message}"
52
+ rescue Excon::Error::Socket => e
53
+ error_message = "Connection failure, please check your authentication URL."
54
+ ui.fatal(error_message)
55
+ raise CloudExceptions::ServiceConnectionError, "#{e.message}. #{error_message}"
56
+ rescue Fog::Errors::NotFound => e
57
+ error_message = "No Network service found. This command is unavailable with current cloud."
58
+ ui.fatal(error_message)
59
+ raise CloudExceptions::NetworkNotFoundError, "#{e.message}. #{error_message}"
60
60
  end
61
61
  end
62
62
 
@@ -68,10 +68,10 @@ class Chef
68
68
  rescue Excon::Error::BadRequest => e
69
69
  response = Chef::JSONCompat.from_json(e.response.body)
70
70
  if response["badRequest"]["code"] == 400
71
- message = "Bad request (400): #{response['badRequest']['message']}"
71
+ message = "Bad request (400): #{response["badRequest"]["message"]}"
72
72
  ui.fatal(message)
73
73
  else
74
- message = "Unknown server error (#{response['badRequest']['code']}): #{response['badRequest']['message']}"
74
+ message = "Unknown server error (#{response["badRequest"]["code"]}): #{response["badRequest"]["message"]}"
75
75
  ui.fatal(message)
76
76
  end
77
77
  raise CloudExceptions::ServerCreateError, message
@@ -124,7 +124,7 @@ class Chef
124
124
  def handle_excon_exception(exception_class, e)
125
125
  error_message = if e.response
126
126
  response = Chef::JSONCompat.from_json(e.response.body)
127
- "Unknown server error (#{response[response.keys[0]]['code']}): #{response[response.keys[0]]['message']}"
127
+ "Unknown server error (#{response[response.keys[0]]["code"]}): #{response[response.keys[0]]["message"]}"
128
128
  else
129
129
  "Unknown server error : #{e.message}"
130
130
  end
@@ -233,7 +233,7 @@ class Chef
233
233
  else
234
234
  col_info[:value]
235
235
  end
236
- if !(value.nil? || value.empty?)
236
+ unless value.nil? || value.empty?
237
237
  list << ui.color(col_info[:label], :bold)
238
238
  list << value
239
239
  end
@@ -32,6 +32,38 @@ class Chef
32
32
  config[key] || Chef::Config[:knife][key]
33
33
  end
34
34
 
35
+ def create_service_instance
36
+ raise Chef::Exceptions::Override, "You must override create_service_instance in #{self} to create cloud specific service"
37
+ end
38
+
39
+ def execute_command
40
+ raise Chef::Exceptions::Override, "You must override execute_command in #{self}"
41
+ end
42
+
43
+ # Derived classes can override before_exec_command and after_exec_command
44
+ def before_exec_command; end
45
+
46
+ def after_exec_command; end
47
+
48
+ def set_default_config; end
49
+
50
+ def validate!(*keys)
51
+ # validates necessary options/params to carry out the command.
52
+ # subclasses to implement this.
53
+ errors = []
54
+ keys.each do |k|
55
+ errors << "You did not provide a valid '#{pretty_key(k)}' value." if locate_config_value(k).nil?
56
+ end
57
+ error_message = ""
58
+ raise CloudExceptions::ValidationError, error_message if errors.each { |e| ui.error(e); error_message = "#{error_message} #{e}." }.any?
59
+ end
60
+
61
+ def validate_params!; end
62
+
63
+ def pretty_key(key)
64
+ key.to_s.tr("_", " ").gsub(/\w+/) { |w| (w =~ /(ssh)|(aws)/i) ? w.upcase : w.capitalize }
65
+ end
66
+
35
67
  end
36
68
  end
37
69
  end
@@ -46,6 +46,7 @@ class Chef
46
46
  def is_resource_filtered?(attribute, value)
47
47
  # resource_filters is array of filters in form {:attribute => attribute-name, :regex => 'filter regex value'}
48
48
  return false if @resource_filters.nil?
49
+
49
50
  @resource_filters.each do |filter|
50
51
  if attribute == filter[:attribute] && value =~ filter[:regex]
51
52
  return true
@@ -60,7 +61,7 @@ class Chef
60
61
  list = []
61
62
  @columns_with_info.each do |col_info|
62
63
  value = (col_info[:value_callback].nil? ? resource.send(col_info[:key]).to_s : col_info[:value_callback].call(resource.send(col_info[:key])))
63
- if !config[:disable_filter]
64
+ unless config[:disable_filter]
64
65
  resource_filtered = true if is_resource_filtered?(col_info[:key], value)
65
66
  end
66
67
  list << value
@@ -8,10 +8,10 @@ class Chef
8
8
  includer.class_eval do
9
9
 
10
10
  option :disable_filter,
11
- long: "--disable-filter",
12
- description: "Disable filtering of the current resource listing.",
13
- boolean: true,
14
- default: false
11
+ long: "--disable-filter",
12
+ description: "Disable filtering of the current resource listing.",
13
+ boolean: true,
14
+ default: false
15
15
  end
16
16
  end
17
17
 
@@ -14,15 +14,16 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
  #
17
- require "chef/knife/cloud/command"
17
+ require "chef/knife/cloud/command_bootstrap"
18
18
  require "chef/knife/cloud/exceptions"
19
19
  require "chef/knife/cloud/chefbootstrap/bootstrapper"
20
20
 
21
21
  class Chef
22
22
  class Knife
23
23
  class Cloud
24
- class ServerCreateCommand < Command
24
+ class ServerCreateCommand < BootstrapCommand
25
25
  attr_accessor :server, :create_options
26
+ Chef::Knife::Bootstrap.load_deps
26
27
 
27
28
  def initialize(argv = [])
28
29
  super argv
@@ -34,19 +35,18 @@ class Chef
34
35
  # set param vm_name to a random value if the name is not set by the user (plugin)
35
36
  config[:chef_node_name] = get_node_name(locate_config_value(:chef_node_name), locate_config_value(:chef_node_name_prefix))
36
37
 
37
- # validate ssh_user, ssh_password, identity_file for ssh bootstrap protocol and winrm_password for winrm bootstrap protocol
38
+ # validate ssh_identity_file for connection protocol and connection_user, connection_password for both ssh bootstrap protocol and winrm bootstrap protocol
38
39
  errors = []
39
-
40
- if locate_config_value(:bootstrap_protocol) == "ssh"
41
- if locate_config_value(:identity_file).nil? && locate_config_value(:ssh_password).nil?
42
- errors << "You must provide either Identity file or SSH Password."
40
+ if locate_config_value(:connection_protocol) == "ssh"
41
+ if locate_config_value(:ssh_identity_file).nil? && locate_config_value(:connection_password).nil?
42
+ errors << "You must provide either SSH Identity file or Connection Password."
43
43
  end
44
- elsif locate_config_value(:bootstrap_protocol) == "winrm"
45
- if locate_config_value(:winrm_password).nil?
46
- errors << "You must provide Winrm Password."
44
+ elsif locate_config_value(:connection_protocol) == "winrm"
45
+ if locate_config_value(:connection_password).nil?
46
+ errors << "You must provide Connection Password."
47
47
  end
48
48
  else
49
- errors << "You must provide a valid bootstrap protocol. options [ssh/winrm]. For linux type images, options [ssh]"
49
+ errors << "You must provide a valid connection protocol. options [ssh/winrm]. For linux type images, options [ssh]"
50
50
  end
51
51
  error_message = ""
52
52
  raise CloudExceptions::ValidationError, error_message if errors.each { |e| ui.error(e); error_message = "#{error_message} #{e}." }.any?
@@ -82,7 +82,7 @@ class Chef
82
82
  cleanup_on_failure
83
83
  raise e
84
84
  rescue => e
85
- error_message = "Check if --bootstrap-protocol and --image-os-type is correct. #{e.message}"
85
+ error_message = "Check if --connection-protocol and --image-os-type is correct. #{e.message}"
86
86
  ui.fatal(error_message)
87
87
  cleanup_on_failure
88
88
  raise e, error_message
@@ -100,15 +100,13 @@ class Chef
100
100
  before_bootstrap
101
101
  @bootstrapper = Bootstrapper.new(config)
102
102
  Chef::Log.debug("Bootstrapping the server...")
103
- ui.info("Bootstrapping the server by using #{ui.color("bootstrap_protocol", :cyan)}: #{config[:bootstrap_protocol]} and #{ui.color("image_os_type", :cyan)}: #{config[:image_os_type]}")
103
+ ui.info("Bootstrapping the server by using #{ui.color("connection_protocol", :cyan)}: #{config[:connection_protocol]} and #{ui.color("image_os_type", :cyan)}: #{config[:image_os_type]}")
104
104
  @bootstrapper.bootstrap
105
105
  after_bootstrap
106
106
  end
107
107
 
108
108
  # any cloud specific initializations/cleanup we want to do around bootstrap.
109
- def before_bootstrap
110
- ssh_override_winrm if locate_config_value(:bootstrap_protocol) == "ssh"
111
- end
109
+ def before_bootstrap; end
112
110
 
113
111
  def after_bootstrap
114
112
  service.server_summary(@server, @columns_with_info)
@@ -116,44 +114,18 @@ class Chef
116
114
 
117
115
  # knife-plugin can override set_default_config to set default config by using their own mechanism.
118
116
  def set_default_config
119
- config[:image_os_type] = "windows" if config[:bootstrap_protocol] == "winrm"
117
+ config[:image_os_type] = "windows" if config[:connection_protocol] == "winrm"
120
118
  end
121
119
 
122
120
  # generate a random name if chef_node_name is empty
123
121
  def get_node_name(chef_node_name, prefix)
124
122
  return chef_node_name unless chef_node_name.nil?
123
+
125
124
  # lazy uuids, 15 chars cause windows has limits
126
125
  ("#{prefix}-" + rand.to_s.split(".")[1]).slice(0, 14)
127
126
  end
128
127
 
129
- def post_connection_validations
130
- end
131
-
132
- private
133
-
134
- # Here, ssh config override winrm config
135
- def ssh_override_winrm
136
- # unchanged ssh_user and changed winrm_user, override ssh_user
137
- if locate_config_value(:ssh_user).eql?(options[:ssh_user][:default]) &&
138
- !locate_config_value(:winrm_user).eql?(options[:winrm_user][:default])
139
- config[:ssh_user] = locate_config_value(:winrm_user)
140
- end
141
- # unchanged ssh_port and changed winrm_port, override ssh_port
142
- if locate_config_value(:ssh_port).eql?(options[:ssh_port][:default]) &&
143
- !locate_config_value(:winrm_port).eql?(options[:winrm_port][:default])
144
- config[:ssh_port] = locate_config_value(:winrm_port)
145
- end
146
- # unset ssh_password and set winrm_password, override ssh_password
147
- if locate_config_value(:ssh_password).nil? &&
148
- !locate_config_value(:winrm_password).nil?
149
- config[:ssh_password] = locate_config_value(:winrm_password)
150
- end
151
- # unset identity_file and set kerberos_keytab_file, override identity_file
152
- if locate_config_value(:identity_file).nil? &&
153
- !locate_config_value(:kerberos_keytab_file).nil?
154
- config[:identity_file] = locate_config_value(:kerberos_keytab_file)
155
- end
156
- end
128
+ def post_connection_validations; end
157
129
  end # class ServerCreateCommand
158
130
  end
159
131
  end
@@ -37,7 +37,6 @@ class Chef
37
37
  short: "-T IMAGE_OS_TYPE",
38
38
  long: "--image-os-type IMAGE_OS_TYPE",
39
39
  description: "The image os type. options [windows/linux]. Only required when cloud does not provide a way to identify image os",
40
- default: "linux",
41
40
  proc: Proc.new { |i| Chef::Config[:knife][:image_os_type] = i }
42
41
 
43
42
  option :flavor,
@@ -46,11 +45,9 @@ class Chef
46
45
  description: "The flavor name or ID of server",
47
46
  proc: Proc.new { |f| Chef::Config[:knife][:flavor] = f }
48
47
 
49
- option :bootstrap_protocol,
50
- long: "--bootstrap-protocol protocol",
51
- description: "Protocol to bootstrap servers. options: winrm/ssh. For linux servers always use ssh.",
52
- default: "ssh",
53
- proc: Proc.new { |b| Chef::Config[:knife][:bootstrap_protocol] = b }
48
+ deprecated_option :bootstrap_protocol,
49
+ replacement: :connection_protocol,
50
+ long: "--bootstrap-protocol PROTOCOL"
54
51
 
55
52
  option :server_create_timeout,
56
53
  long: "--server-create-timeout timeout",
@@ -69,7 +66,6 @@ class Chef
69
66
  description: "The prefix for chef node name",
70
67
  default: includer.snake_case_name.split("_").first,
71
68
  proc: Proc.new { |key| Chef::Config[:knife][:chef_node_name_prefix] = key }
72
-
73
69
  end
74
70
  end
75
71
 
@@ -30,7 +30,7 @@ class Chef
30
30
  option :custom_attributes,
31
31
  long: "--custom-attributes CUSTOM_ATTRIBUTES",
32
32
  description: "Custom attributes to be passed to Fog.",
33
- proc: Proc.new { |args| Chef::Config[:knife][:custom_attributes] = args.split(";").map { |keys| keys.split("=") }.map { |j| Hash[*j.map { |k| k.strip }] } }
33
+ proc: Proc.new { |args| Chef::Config[:knife][:custom_attributes] = args.split(";").map { |keys| keys.split("=") }.map { |j| Hash[*j.map(&:strip)] } }
34
34
  end
35
35
  end
36
36
  end
@@ -36,16 +36,13 @@ class Chef
36
36
  end
37
37
 
38
38
  # override in cloud specific derived classes
39
- def list_resource_allocations
40
- end
39
+ def list_resource_allocations; end
41
40
 
42
41
  # Do nothing or override in cloud specific derived classes for pre-vm-creation setup steps
43
- def create_server_dependencies
44
- end
42
+ def create_server_dependencies; end
45
43
 
46
44
  # Do nothing or override in cloud specific derived classes for pre-vm-creation setup steps
47
- def delete_server_dependencies
48
- end
45
+ def delete_server_dependencies; end
49
46
 
50
47
  def delete_server_on_failure(server = nil)
51
48
  raise Chef::Exceptions::Override, "You must override delete_server_on_failure in #{self} to delete server"
@@ -1,6 +1,6 @@
1
1
  module Knife
2
2
  module Cloud
3
- VERSION = "1.2.3".freeze
3
+ VERSION = "2.0.2".freeze
4
4
  MAJOR, MINOR, TINY = VERSION.split(".")
5
5
  end
6
6
  end
@@ -5,5 +5,5 @@ validation_client_name "validation"
5
5
  validation_key "#{current_dir}/validation.pem"
6
6
  chef_server_url "http://localhost:8889"
7
7
  cache_type "BasicFile"
8
- cache_options( path: "#{ENV['HOME']}/.chef/checksums" )
8
+ cache_options( path: "#{ENV["HOME"]}/.chef/checksums" )
9
9
  cookbook_path ["#{current_dir}/chef-repo/cookbooks"]
@@ -30,7 +30,7 @@ module RSpec
30
30
  # Convenience function for grabbing a hash of several important
31
31
  # Mixlib::Shellout command configuration parameters.
32
32
  def self.command_setting(shellout_command)
33
- keys = [:cwd, :user, :group, :umask, :timeout, :valid_exit_codes, :environment]
33
+ keys = %i{cwd user group umask timeout valid_exit_codes environment}
34
34
  keys.inject({}) do |hash, attr|
35
35
  hash[attr] = shellout_command.send(attr)
36
36
  hash
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + "/knife_test_utils")
3
3
 
4
4
  RSpec::Matchers.define :have_outcome do |outcome_spec|
5
5
  match do |executed_shellout_command|
6
- valid_keys = [:status, :stdout, :stderr]
6
+ valid_keys = %i{status stdout stderr}
7
7
  if outcome_spec.keys & valid_keys == []
8
8
  throw "You did not specify values for any of #{valid_keys}!"
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-cloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kaustubh Deorukhkar
@@ -9,22 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-11-28 00:00:00.000000000 Z
12
+ date: 2019-08-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: knife-windows
15
+ name: chef
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '1.0'
20
+ version: '15.0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: '1.0'
27
+ version: '15.0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: mixlib-shellout
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -66,10 +66,9 @@ files:
66
66
  - lib/chef/knife/cloud/chefbootstrap/bootstrap_protocol.rb
67
67
  - lib/chef/knife/cloud/chefbootstrap/bootstrapper.rb
68
68
  - lib/chef/knife/cloud/chefbootstrap/ssh_bootstrap_protocol.rb
69
- - lib/chef/knife/cloud/chefbootstrap/unix_distribution.rb
70
- - lib/chef/knife/cloud/chefbootstrap/windows_distribution.rb
71
69
  - lib/chef/knife/cloud/chefbootstrap/winrm_bootstrap_protocol.rb
72
70
  - lib/chef/knife/cloud/command.rb
71
+ - lib/chef/knife/cloud/command_bootstrap.rb
73
72
  - lib/chef/knife/cloud/exceptions.rb
74
73
  - lib/chef/knife/cloud/fog/options.rb
75
74
  - lib/chef/knife/cloud/fog/service.rb
@@ -103,19 +102,19 @@ post_install_message:
103
102
  rdoc_options: []
104
103
  require_paths:
105
104
  - lib
105
+ - spec
106
106
  required_ruby_version: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: 2.2.2
110
+ version: 2.2.5
111
111
  required_rubygems_version: !ruby/object:Gem::Requirement
112
112
  requirements:
113
113
  - - ">="
114
114
  - !ruby/object:Gem::Version
115
115
  version: '0'
116
116
  requirements: []
117
- rubyforge_project:
118
- rubygems_version: 2.7.6
117
+ rubygems_version: 3.0.3
119
118
  signing_key:
120
119
  specification_version: 4
121
120
  summary: knife-cloud plugin
@@ -1,31 +0,0 @@
1
- #
2
- # Author:: Prabhu Das (<prabhu.das@clogeny.com>)
3
- # Copyright:: Copyright (c) 2013-2016 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
- require "chef/knife/cloud/chefbootstrap/bootstrap_distribution"
18
-
19
- class Chef
20
- class Knife
21
- class Cloud
22
- class UnixDistribution < BootstrapDistribution
23
-
24
- def initialize(config)
25
- super
26
- config[:distro] = config[:distro] || "chef-full"
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,32 +0,0 @@
1
- #
2
- # Author:: Prabhu Das (<prabhu.das@clogeny.com>)
3
- # Copyright:: Copyright (c) 2013-2016 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
- require "chef/knife/cloud/chefbootstrap/bootstrap_distribution"
19
- require "chef/knife/bootstrap_windows_base"
20
-
21
- class Chef
22
- class Knife
23
- class Cloud
24
- class WindowsDistribution < BootstrapDistribution
25
- def initialize(config)
26
- super
27
- config[:distro] ||= "windows-chef-client-msi"
28
- end
29
- end
30
- end
31
- end
32
- end