knife-cloud 1.2.1 → 1.2.3

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 (68) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE +1 -1
  3. data/lib/chef/knife/cloud/chefbootstrap/bootstrap_distribution.rb +2 -2
  4. data/lib/chef/knife/cloud/chefbootstrap/bootstrap_options.rb +115 -133
  5. data/lib/chef/knife/cloud/chefbootstrap/bootstrap_protocol.rb +6 -6
  6. data/lib/chef/knife/cloud/chefbootstrap/bootstrapper.rb +11 -12
  7. data/lib/chef/knife/cloud/chefbootstrap/ssh_bootstrap_protocol.rb +49 -54
  8. data/lib/chef/knife/cloud/chefbootstrap/unix_distribution.rb +3 -3
  9. data/lib/chef/knife/cloud/chefbootstrap/windows_distribution.rb +3 -3
  10. data/lib/chef/knife/cloud/chefbootstrap/winrm_bootstrap_protocol.rb +11 -12
  11. data/lib/chef/knife/cloud/command.rb +24 -27
  12. data/lib/chef/knife/cloud/exceptions.rb +1 -2
  13. data/lib/chef/knife/cloud/fog/options.rb +8 -8
  14. data/lib/chef/knife/cloud/fog/service.rb +54 -60
  15. data/lib/chef/knife/cloud/helpers.rb +2 -3
  16. data/lib/chef/knife/cloud/list_resource_command.rb +6 -7
  17. data/lib/chef/knife/cloud/list_resource_options.rb +5 -5
  18. data/lib/chef/knife/cloud/server/create_command.rb +30 -35
  19. data/lib/chef/knife/cloud/server/create_options.rb +33 -34
  20. data/lib/chef/knife/cloud/server/delete_command.rb +12 -15
  21. data/lib/chef/knife/cloud/server/delete_options.rb +7 -8
  22. data/lib/chef/knife/cloud/server/list_command.rb +22 -22
  23. data/lib/chef/knife/cloud/server/list_options.rb +9 -10
  24. data/lib/chef/knife/cloud/server/options.rb +7 -7
  25. data/lib/chef/knife/cloud/server/show_command.rb +5 -5
  26. data/lib/chef/knife/cloud/server/show_options.rb +5 -6
  27. data/lib/chef/knife/cloud/service.rb +12 -13
  28. data/lib/knife-cloud/version.rb +2 -2
  29. data/lib/test/fixtures/knife.rb +3 -3
  30. data/lib/test/fixtures/validation.pem +27 -0
  31. data/lib/test/knife-utils/helper.rb +11 -11
  32. data/lib/test/knife-utils/knife_test_utils.rb +4 -4
  33. data/lib/test/knife-utils/matchers.rb +3 -3
  34. data/lib/test/knife-utils/test_bed.rb +38 -38
  35. data/lib/test/templates/windows-chef-client-msi.erb +3 -4
  36. data/lib/test/templates/windows-shell.erb +2 -2
  37. metadata +12 -152
  38. data/.gitignore +0 -33
  39. data/.travis.yml +0 -6
  40. data/CHANGELOG.md +0 -133
  41. data/CONTRIBUTING.md +0 -5
  42. data/Gemfile +0 -9
  43. data/README.md +0 -421
  44. data/Rakefile +0 -35
  45. data/ci.gemfile +0 -18
  46. data/knife-cloud.gemspec +0 -26
  47. data/spec/resource_spec_helper.rb +0 -49
  48. data/spec/server_command_common_spec_helper.rb +0 -48
  49. data/spec/spec_helper.rb +0 -25
  50. data/spec/support/shared_examples_for_command.rb +0 -35
  51. data/spec/support/shared_examples_for_servercreatecommand.rb +0 -144
  52. data/spec/support/shared_examples_for_serverdeletecommand.rb +0 -77
  53. data/spec/support/shared_examples_for_service.rb +0 -85
  54. data/spec/unit/bootstrap_protocol_spec.rb +0 -98
  55. data/spec/unit/bootstrapper_spec.rb +0 -171
  56. data/spec/unit/cloud_command_spec.rb +0 -35
  57. data/spec/unit/command_spec.rb +0 -49
  58. data/spec/unit/fog_service_spec.rb +0 -163
  59. data/spec/unit/list_resource_command_spec.rb +0 -140
  60. data/spec/unit/server_create_command_spec.rb +0 -198
  61. data/spec/unit/server_delete_command_spec.rb +0 -25
  62. data/spec/unit/server_list_command_spec.rb +0 -119
  63. data/spec/unit/server_show_command_spec.rb +0 -64
  64. data/spec/unit/service_spec.rb +0 -46
  65. data/spec/unit/ssh_bootstrap_protocol_spec.rb +0 -116
  66. data/spec/unit/unix_distribution_spec.rb +0 -37
  67. data/spec/unit/windows_distribution_spec.rb +0 -37
  68. data/spec/unit/winrm_bootstrap_protocol_spec.rb +0 -108
@@ -1,7 +1,7 @@
1
1
  # Author:: Kaustubh Deorukhkar (<kaustubh@clogeny.com>)
2
2
  # Author:: Prabhu Das (<prabhu.das@clogeny.com>)
3
3
  #
4
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # Copyright:: Copyright (c) 2013-2016 Chef Software, Inc.
5
5
  # License:: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,10 +17,9 @@
17
17
  # limitations under the License.
18
18
  #
19
19
 
20
- require 'chef/knife/cloud/chefbootstrap/bootstrap_protocol'
21
- require 'chef/knife/core/windows_bootstrap_context'
22
- require 'chef/knife/bootstrap'
23
-
20
+ require "chef/knife/cloud/chefbootstrap/bootstrap_protocol"
21
+ require "chef/knife/core/windows_bootstrap_context"
22
+ require "chef/knife/bootstrap"
24
23
 
25
24
  class Chef
26
25
  class Knife
@@ -28,7 +27,7 @@ class Chef
28
27
  class SshBootstrapProtocol < BootstrapProtocol
29
28
 
30
29
  def initialize(config)
31
- @bootstrap = (config[:image_os_type] == 'linux') ? Chef::Knife::Bootstrap.new : Chef::Knife::BootstrapWindowsSsh.new
30
+ @bootstrap = (config[:image_os_type] == "linux") ? Chef::Knife::Bootstrap.new : Chef::Knife::BootstrapWindowsSsh.new
32
31
  super
33
32
  end
34
33
 
@@ -38,8 +37,8 @@ class Chef
38
37
  bootstrap.config[:ssh_port] = locate_config_value(:ssh_port)
39
38
  bootstrap.config[:identity_file] = @config[:identity_file]
40
39
  bootstrap.config[:host_key_verify] = @config[:host_key_verify]
41
- bootstrap.config[:use_sudo] = true unless @config[:ssh_user] == 'root'
42
- bootstrap.config[:template_file] = @config[:template_file]
40
+ bootstrap.config[:use_sudo] = true unless @config[:ssh_user] == "root"
41
+ bootstrap.config[:template_file] = @config[:template_file]
43
42
  bootstrap.config[:ssh_gateway] = locate_config_value(:ssh_gateway)
44
43
  bootstrap.config[:forward_agent] = locate_config_value(:forward_agent)
45
44
  bootstrap.config[:use_sudo_password] = locate_config_value(:use_sudo_password)
@@ -53,17 +52,17 @@ class Chef
53
52
 
54
53
  # The ssh_gateway & subnet_id are currently supported only in EC2.
55
54
  if ssh_gateway
56
- print(".") until tunnel_test_ssh(ssh_gateway, @config[:bootstrap_ip_address]) {
55
+ print(".") until tunnel_test_ssh(ssh_gateway, @config[:bootstrap_ip_address]) do
57
56
  @initial_sleep_delay = !!locate_config_value(:subnet_id) ? 40 : 10
58
57
  sleep @initial_sleep_delay
59
58
  puts("done")
60
- }
59
+ end
61
60
  else
62
- print(".") until tcp_test_ssh(@config[:bootstrap_ip_address], locate_config_value(:ssh_port)) {
61
+ print(".") until tcp_test_ssh(@config[:bootstrap_ip_address], locate_config_value(:ssh_port)) do
63
62
  @initial_sleep_delay = !!locate_config_value(:subnet_id) ? 40 : 10
64
63
  sleep @initial_sleep_delay
65
64
  puts("done")
66
- }
65
+ end
67
66
  end
68
67
  end
69
68
 
@@ -99,58 +98,54 @@ class Chef
99
98
  end
100
99
 
101
100
  def tcp_test_ssh(hostname, ssh_port)
102
- begin
103
- tcp_socket = TCPSocket.new(hostname, ssh_port)
104
- readable = IO.select([tcp_socket], nil, nil, 5)
105
- if readable
106
- ssh_banner = tcp_socket.gets
107
- if ssh_banner.nil? or ssh_banner.empty?
108
- false
109
- else
110
- Chef::Log.debug("ssh accepting connections on #{hostname}, banner is #{tcp_socket.gets}")
111
- yield
112
- true
113
- end
114
- else
101
+ tcp_socket = TCPSocket.new(hostname, ssh_port)
102
+ readable = IO.select([tcp_socket], nil, nil, 5)
103
+ if readable
104
+ ssh_banner = tcp_socket.gets
105
+ if ssh_banner.nil? || ssh_banner.empty?
115
106
  false
107
+ else
108
+ Chef::Log.debug("ssh accepting connections on #{hostname}, banner is #{tcp_socket.gets}")
109
+ yield
110
+ true
116
111
  end
117
- rescue Errno::EPERM, Errno::ETIMEDOUT
118
- Chef::Log.debug("ssh timed out: #{hostname}")
119
- false
120
- rescue SocketError, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ENETUNREACH, IOError
121
- Chef::Log.debug("ssh failed to connect: #{hostname}")
122
- sleep 2
123
- false
124
- # This happens on some mobile phone networks
125
- rescue Errno::ECONNRESET
126
- Chef::Log.debug("ssh reset its connection: #{hostname}")
127
- sleep 2
112
+ else
128
113
  false
129
- ensure
130
- tcp_socket && tcp_socket.close
131
114
  end
115
+ rescue Errno::EPERM, Errno::ETIMEDOUT
116
+ Chef::Log.debug("ssh timed out: #{hostname}")
117
+ false
118
+ rescue SocketError, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ENETUNREACH, IOError
119
+ Chef::Log.debug("ssh failed to connect: #{hostname}")
120
+ sleep 2
121
+ false
122
+ # This happens on some mobile phone networks
123
+ rescue Errno::ECONNRESET
124
+ Chef::Log.debug("ssh reset its connection: #{hostname}")
125
+ sleep 2
126
+ false
127
+ ensure
128
+ tcp_socket && tcp_socket.close
132
129
  end
133
130
 
134
131
  def tunnel_test_ssh(ssh_gateway, hostname, &block)
135
- begin
136
- status = false
137
- gateway = configure_ssh_gateway(ssh_gateway)
138
- gateway.open(hostname, locate_config_value(:ssh_port)) do |local_tunnel_port|
139
- status = tcp_test_ssh('localhost', local_tunnel_port, &block)
140
- end
141
- status
142
- rescue SocketError, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ENETUNREACH, IOError
143
- sleep 2
144
- false
145
- rescue Errno::EPERM, Errno::ETIMEDOUT
146
- false
132
+ status = false
133
+ gateway = configure_ssh_gateway(ssh_gateway)
134
+ gateway.open(hostname, locate_config_value(:ssh_port)) do |local_tunnel_port|
135
+ status = tcp_test_ssh("localhost", local_tunnel_port, &block)
147
136
  end
137
+ status
138
+ rescue SocketError, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ENETUNREACH, IOError
139
+ sleep 2
140
+ false
141
+ rescue Errno::EPERM, Errno::ETIMEDOUT
142
+ false
148
143
  end
149
144
 
150
145
  def configure_ssh_gateway(ssh_gateway)
151
- gw_host, gw_user = ssh_gateway.split('@').reverse
152
- gw_host, gw_port = gw_host.split(':')
153
- gateway_options = { :port => gw_port || 22 }
146
+ gw_host, gw_user = ssh_gateway.split("@").reverse
147
+ gw_host, gw_port = gw_host.split(":")
148
+ gateway_options = { port: gw_port || 22 }
154
149
 
155
150
  # Load the SSH config for the SSH gateway host.
156
151
  # Set the gateway user if it was not part of the
@@ -160,7 +155,7 @@ class Chef
160
155
  gw_user ||= ssh_gateway_config[:user]
161
156
 
162
157
  # Always use the gateway keys from the SSH Config
163
- gateway_keys = ssh_gateway_config[:keys]
158
+ gateway_keys = ssh_gateway_config[:keys]
164
159
 
165
160
  # Use the keys specificed on the command line if available (overrides SSH Config)
166
161
  if locate_config_value(:ssh_gateway_identity)
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Prabhu Das (<prabhu.das@clogeny.com>)
3
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
3
+ # Copyright:: Copyright (c) 2013-2016 Chef Software, Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,7 +14,7 @@
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
- require 'chef/knife/cloud/chefbootstrap/bootstrap_distribution'
17
+ require "chef/knife/cloud/chefbootstrap/bootstrap_distribution"
18
18
 
19
19
  class Chef
20
20
  class Knife
@@ -23,7 +23,7 @@ class Chef
23
23
 
24
24
  def initialize(config)
25
25
  super
26
- config[:distro] = config[:distro] || "chef-full"
26
+ config[:distro] = config[:distro] || "chef-full"
27
27
  end
28
28
  end
29
29
  end
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Prabhu Das (<prabhu.das@clogeny.com>)
3
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
3
+ # Copyright:: Copyright (c) 2013-2016 Chef Software, Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,8 +15,8 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
  #
18
- require 'chef/knife/cloud/chefbootstrap/bootstrap_distribution'
19
- require 'chef/knife/bootstrap_windows_base'
18
+ require "chef/knife/cloud/chefbootstrap/bootstrap_distribution"
19
+ require "chef/knife/bootstrap_windows_base"
20
20
 
21
21
  class Chef
22
22
  class Knife
@@ -1,7 +1,7 @@
1
1
  # Author:: Kaustubh Deorukhkar (<kaustubh@clogeny.com>)
2
2
  # Author:: Prabhu Das (<prabhu.das@clogeny.com>)
3
3
  #
4
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # Copyright:: Copyright (c) 2013-2016 Chef Software, Inc.
5
5
  # License:: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,7 +17,7 @@
17
17
  # limitations under the License.
18
18
  #
19
19
 
20
- require 'chef/knife/cloud/chefbootstrap/bootstrap_protocol'
20
+ require "chef/knife/cloud/chefbootstrap/bootstrap_protocol"
21
21
 
22
22
  class Chef
23
23
  class Knife
@@ -31,33 +31,33 @@ class Chef
31
31
  end
32
32
 
33
33
  def load_winrm_deps
34
- require 'winrm'
35
- require 'chef/knife/bootstrap_windows_winrm'
36
- require 'chef/knife/core/windows_bootstrap_context'
37
- require 'chef/knife/winrm'
34
+ require "winrm"
35
+ require "chef/knife/bootstrap_windows_winrm"
36
+ require "chef/knife/core/windows_bootstrap_context"
37
+ require "chef/knife/winrm"
38
38
  end
39
39
 
40
40
  def init_bootstrap_options
41
- bootstrap.config[:winrm_user] = @config[:winrm_user] || 'Administrator'
41
+ bootstrap.config[:winrm_user] = @config[:winrm_user] || "Administrator"
42
42
  bootstrap.config[:winrm_password] = @config[:winrm_password]
43
43
  bootstrap.config[:winrm_transport] = @config[:winrm_transport]
44
44
  bootstrap.config[:winrm_port] = @config[:winrm_port]
45
- bootstrap.config[:auth_timeout] = @config[:auth_timeout]
45
+ bootstrap.config[:auth_timeout] = @config[:auth_timeout]
46
46
  bootstrap.config[:winrm_ssl_verify_mode] = @config[:winrm_ssl_verify_mode]
47
47
  super
48
48
  end
49
49
 
50
50
  def wait_for_server_ready
51
51
  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]){
52
+ print(".") until tcp_test_winrm(@config[:bootstrap_ip_address], @config[:winrm_port]) do
53
53
  sleep @initial_sleep_delay ||= 10
54
54
  puts("done")
55
- }
55
+ end
56
56
  end
57
57
 
58
58
  def tcp_test_winrm(hostname, port)
59
59
  tcp_socket = TCPSocket.new(hostname, port)
60
- return true
60
+ true
61
61
  rescue SocketError
62
62
  sleep 2
63
63
  false
@@ -82,4 +82,3 @@ class Chef
82
82
  end
83
83
  end
84
84
  end
85
-
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Kaustubh Deorukhkar (<kaustubh@clogeny.com>)
3
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
3
+ # Copyright:: Copyright (c) 2013-2016 Chef Software, Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,9 +16,9 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require 'chef/knife'
19
+ require "chef/knife"
20
20
  require "chef/knife/cloud/helpers"
21
- require 'chef/knife/cloud/exceptions'
21
+ require "chef/knife/cloud/exceptions"
22
22
 
23
23
  class Chef
24
24
  class Knife
@@ -29,41 +29,39 @@ class Chef
29
29
  attr_accessor :service, :custom_arguments
30
30
 
31
31
  def run
32
- begin
33
32
  # Set dafult config
34
- set_default_config
33
+ set_default_config
35
34
 
36
- # validate compulsory params
37
- validate!
35
+ # validate compulsory params
36
+ validate!
38
37
 
39
- # validate command pre-requisites (cli options)
40
- validate_params!
38
+ # validate command pre-requisites (cli options)
39
+ validate_params!
41
40
 
42
- # setup the service
43
- @service = create_service_instance
41
+ # setup the service
42
+ @service = create_service_instance
44
43
 
45
- service.ui = ui # for interactive user prompts/messages
44
+ service.ui = ui # for interactive user prompts/messages
46
45
 
47
- # Perform any steps before handling the command
48
- before_exec_command
46
+ # Perform any steps before handling the command
47
+ before_exec_command
49
48
 
50
- # exec the actual cmd
51
- execute_command
49
+ # exec the actual cmd
50
+ execute_command
52
51
 
53
- # Perform any steps after handling the command
54
- after_exec_command
55
- rescue CloudExceptions::KnifeCloudError => e
56
- Chef::Log.debug(e.message)
57
- exit 1
58
- end
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
59
57
  end
60
58
 
61
59
  def create_service_instance
62
- raise Chef::Exceptions::Override, "You must override create_service_instance in #{self.to_s} to create cloud specific service"
60
+ raise Chef::Exceptions::Override, "You must override create_service_instance in #{self} to create cloud specific service"
63
61
  end
64
62
 
65
63
  def execute_command
66
- raise Chef::Exceptions::Override, "You must override execute_command in #{self.to_s}"
64
+ raise Chef::Exceptions::Override, "You must override execute_command in #{self}"
67
65
  end
68
66
 
69
67
  # Derived classes can override before_exec_command and after_exec_command
@@ -84,18 +82,17 @@ class Chef
84
82
  errors << "You did not provide a valid '#{pretty_key(k)}' value." if locate_config_value(k).nil?
85
83
  end
86
84
  error_message = ""
87
- raise CloudExceptions::ValidationError, error_message if errors.each{|e| ui.error(e); error_message = "#{error_message} #{e}."}.any?
85
+ raise CloudExceptions::ValidationError, error_message if errors.each { |e| ui.error(e); error_message = "#{error_message} #{e}." }.any?
88
86
  end
89
87
 
90
88
  def validate_params!
91
89
  end
92
90
 
93
91
  def pretty_key(key)
94
- key.to_s.gsub(/_/, ' ').gsub(/\w+/){ |w| (w =~ /(ssh)|(aws)/i) ? w.upcase : w.capitalize }
92
+ key.to_s.tr("_", " ").gsub(/\w+/) { |w| (w =~ /(ssh)|(aws)/i) ? w.upcase : w.capitalize }
95
93
  end
96
94
 
97
95
  end # class Command
98
96
  end
99
97
  end
100
98
  end
101
-
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
2
+ # Copyright:: Copyright (c) 2013-2016 Chef Software, Inc.
3
3
  # License:: Apache License, Version 2.0
4
4
  #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -36,4 +36,3 @@ class Chef
36
36
  end
37
37
  end
38
38
  end
39
-
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Kaustubh Deorukhkar (<kaustubh@clogeny.com>)
3
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
3
+ # Copyright:: Copyright (c) 2013-2016 Chef Software, Inc.
4
4
  #
5
5
 
6
6
  class Chef
@@ -11,15 +11,15 @@ class Chef
11
11
  def self.included(includer)
12
12
  includer.instance_eval do
13
13
  option :fog_version,
14
- :long => "--fog-version version",
15
- :description => "Fog gem version to use. Use the ruby gem version strings",
16
- :default => "",
17
- :proc => Proc.new { |v| Chef::Config[:knife][:cloud_fog_version] = v}
14
+ long: "--fog-version version",
15
+ description: "Fog gem version to use. Use the ruby gem version strings",
16
+ default: "",
17
+ proc: Proc.new { |v| Chef::Config[:knife][:cloud_fog_version] = v }
18
18
 
19
19
  option :api_endpoint,
20
- :long => "--api-endpoint ENDPOINT",
21
- :description => "Your API endpoint. Eg, for Eucalyptus it can be 'http://ecc.eucalyptus.com:8773/services/Eucalyptus'",
22
- :proc => Proc.new { |endpoint| Chef::Config[:knife][:api_endpoint] = endpoint }
20
+ long: "--api-endpoint ENDPOINT",
21
+ description: "Your API endpoint. Eg, for Eucalyptus it can be 'http://ecc.eucalyptus.com:8773/services/Eucalyptus'",
22
+ proc: Proc.new { |endpoint| Chef::Config[:knife][:api_endpoint] = endpoint }
23
23
 
24
24
  end
25
25
  end
@@ -1,11 +1,11 @@
1
1
  #
2
2
  # Author:: Kaustubh Deorukhkar (<kaustubh@clogeny.com>)
3
3
  # Author:: Prabhu Das (<prabhu.das@clogeny.com>)
4
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # Copyright:: Copyright (c) 2013-2016 Chef Software, Inc.
5
5
  #
6
6
 
7
- require 'chef/knife/cloud/service'
8
- require 'chef/knife/cloud/exceptions'
7
+ require "chef/knife/cloud/service"
8
+ require "chef/knife/cloud/exceptions"
9
9
 
10
10
  class Chef
11
11
  class Knife
@@ -18,26 +18,24 @@ class Chef
18
18
  end
19
19
 
20
20
  def load_fog_gem
21
- begin
22
21
  # Load specific version of fog. Any other classes/modules using fog are loaded after this.
23
- gem "fog", Chef::Config[:knife][:cloud_fog_version]
24
- require 'fog'
25
- Chef::Log.debug("Using fog version: #{Gem.loaded_specs["fog"].version}")
26
- rescue Exception => e
27
- Chef::Log.error "Error loading fog gem."
28
- exit 1
29
- end
22
+ gem "fog", Chef::Config[:knife][:cloud_fog_version]
23
+ require "fog"
24
+ Chef::Log.debug("Using fog version: #{Gem.loaded_specs["fog"].version}")
25
+ rescue Exception
26
+ Chef::Log.error "Error loading fog gem."
27
+ exit 1
30
28
  end
31
29
 
32
30
  def connection
33
31
  add_api_endpoint
34
32
  @connection ||= begin
35
- connection = Fog::Compute.new(@auth_params)
36
- rescue Excon::Errors::Unauthorized => e
33
+ Fog::Compute.new(@auth_params)
34
+ rescue Excon::Error::Unauthorized => e
37
35
  error_message = "Connection failure, please check your username and password."
38
36
  ui.fatal(error_message)
39
37
  raise CloudExceptions::ServiceConnectionError, "#{e.message}. #{error_message}"
40
- rescue Excon::Errors::SocketError => e
38
+ rescue Excon::Error::Socket => e
41
39
  error_message = "Connection failure, please check your authentication URL."
42
40
  ui.fatal(error_message)
43
41
  raise CloudExceptions::ServiceConnectionError, "#{e.message}. #{error_message}"
@@ -46,12 +44,12 @@ class Chef
46
44
 
47
45
  def network
48
46
  @network ||= begin
49
- network = Fog::Network.new(@auth_params)
50
- rescue Excon::Errors::Unauthorized => e
47
+ Fog::Network.new(@auth_params)
48
+ rescue Excon::Error::Unauthorized => e
51
49
  error_message = "Connection failure, please check your username and password."
52
50
  ui.fatal(error_message)
53
51
  raise CloudExceptions::ServiceConnectionError, "#{e.message}. #{error_message}"
54
- rescue Excon::Errors::SocketError => e
52
+ rescue Excon::Error::Socket => e
55
53
  error_message = "Connection failure, please check your authentication URL."
56
54
  ui.fatal(error_message)
57
55
  raise CloudExceptions::ServiceConnectionError, "#{e.message}. #{error_message}"
@@ -67,9 +65,9 @@ class Chef
67
65
  begin
68
66
  add_custom_attributes(options[:server_def])
69
67
  server = connection.servers.create(options[:server_def])
70
- rescue Excon::Errors::BadRequest => e
68
+ rescue Excon::Error::BadRequest => e
71
69
  response = Chef::JSONCompat.from_json(e.response.body)
72
- if response['badRequest']['code'] == 400
70
+ if response["badRequest"]["code"] == 400
73
71
  message = "Bad request (400): #{response['badRequest']['message']}"
74
72
  ui.fatal(message)
75
73
  else
@@ -91,26 +89,24 @@ class Chef
91
89
  end
92
90
 
93
91
  def delete_server(server_name)
94
- begin
95
- server = get_server(server_name)
96
- msg_pair("Instance Name", get_server_name(server))
97
- msg_pair("Instance ID", server.id)
92
+ server = get_server(server_name)
93
+ msg_pair("Instance Name", get_server_name(server))
94
+ msg_pair("Instance ID", server.id)
98
95
 
99
- puts "\n"
100
- ui.confirm("Do you really want to delete this server")
96
+ puts "\n"
97
+ ui.confirm("Do you really want to delete this server")
101
98
 
102
- # delete the server
103
- server.destroy
104
- rescue NoMethodError
105
- error_message = "Could not locate server '#{server_name}'."
106
- ui.error(error_message)
107
- raise CloudExceptions::ServerDeleteError, error_message
108
- rescue Excon::Errors::BadRequest => e
109
- handle_excon_exception(CloudExceptions::ServerDeleteError, e)
110
- end
99
+ # delete the server
100
+ server.destroy
101
+ rescue NoMethodError
102
+ error_message = "Could not locate server '#{server_name}'."
103
+ ui.error(error_message)
104
+ raise CloudExceptions::ServerDeleteError, error_message
105
+ rescue Excon::Error::BadRequest => e
106
+ handle_excon_exception(CloudExceptions::ServerDeleteError, e)
111
107
  end
112
108
 
113
- ["servers", "images", "networks"].each do |resource_type|
109
+ %w{servers images networks}.each do |resource_type|
114
110
  define_method("list_#{resource_type}") do
115
111
  begin
116
112
  case resource_type
@@ -119,7 +115,7 @@ class Chef
119
115
  else
120
116
  connection.method(resource_type).call.all
121
117
  end
122
- rescue Excon::Errors::BadRequest => e
118
+ rescue Excon::Error::BadRequest => e
123
119
  handle_excon_exception(CloudExceptions::CloudAPIException, e)
124
120
  end
125
121
  end
@@ -137,40 +133,38 @@ class Chef
137
133
  end
138
134
 
139
135
  def list_resource_configurations
140
- begin
141
- connection.flavors.all
142
- rescue Excon::Errors::BadRequest => e
143
- handle_excon_exception(CloudExceptions::CloudAPIException, e)
144
- end
136
+ connection.flavors.all
137
+ rescue Excon::Error::BadRequest => e
138
+ handle_excon_exception(CloudExceptions::CloudAPIException, e)
145
139
  end
146
140
 
147
141
  def list_addresses
148
142
  connection.addresses.all
149
- rescue Excon::Errors::BadRequest => e
143
+ rescue Excon::Error::BadRequest => e
150
144
  handle_excon_exception(CloudExceptions::CloudAPIException, e)
151
145
  end
152
146
 
153
147
  def release_address(address_id)
154
148
  response = get_address(address_id)
155
- msg_pair('IP address', get_address_ip(response))
149
+ msg_pair("IP address", get_address_ip(response))
156
150
  puts
157
- ui.confirm('Do you really want to delete this ip')
151
+ ui.confirm("Do you really want to delete this ip")
158
152
  connection.release_address(address_id)
159
153
  rescue Fog::Compute::OpenStack::NotFound => e
160
- error_message = 'Floating ip not found.'
154
+ error_message = "Floating ip not found."
161
155
  ui.error(error_message)
162
156
  raise CloudExceptions::NotFoundError, "#{e.message}"
163
- rescue Excon::Errors::BadRequest => e
157
+ rescue Excon::Error::BadRequest => e
164
158
  handle_excon_exception(CloudExceptions::KnifeCloudError, e)
165
159
  end
166
160
 
167
161
  def get_address_ip(response)
168
- response.body['floating_ip']['ip'] if response.body['floating_ip']
162
+ response.body["floating_ip"]["ip"] if response.body["floating_ip"]
169
163
  end
170
164
 
171
165
  def get_address(address_id)
172
166
  connection.get_address(address_id)
173
- rescue Excon::Errors::BadRequest => e
167
+ rescue Excon::Error::BadRequest => e
174
168
  handle_excon_exception(CloudExceptions::KnifeCloudError, e)
175
169
  end
176
170
 
@@ -178,29 +172,29 @@ class Chef
178
172
  response = connection.allocate_address(pool)
179
173
  response.body
180
174
  rescue Fog::Compute::OpenStack::NotFound => e
181
- error_message = 'Floating ip pool not found.'
175
+ error_message = "Floating ip pool not found."
182
176
  ui.error(error_message)
183
177
  raise CloudExceptions::NotFoundError, "#{e.message}"
184
- rescue Excon::Errors::Forbidden => e
178
+ rescue Excon::Error::Forbidden => e
185
179
  handle_excon_exception(CloudExceptions::KnifeCloudError, e)
186
- rescue Excon::Errors::BadRequest => e
180
+ rescue Excon::Error::BadRequest => e
187
181
  handle_excon_exception(CloudExceptions::KnifeCloudError, e)
188
182
  end
189
183
 
190
184
  def associate_address(*args)
191
185
  connection.associate_address(*args)
192
- rescue Excon::Errors::BadRequest => e
186
+ rescue Excon::Error::BadRequest => e
193
187
  handle_excon_exception(CloudExceptions::KnifeCloudError, e)
194
188
  end
195
189
 
196
190
  def disassociate_address(*args)
197
191
  connection.disassociate_address(*args)
198
192
  rescue Fog::Compute::OpenStack::NotFound
199
- error_message = 'Floating ip not found.'
193
+ error_message = "Floating ip not found."
200
194
  ui.error(error_message)
201
- rescue Excon::Errors::UnprocessableEntity => e
195
+ rescue Excon::Error::UnprocessableEntity => e
202
196
  handle_excon_exception(CloudExceptions::KnifeCloudError, e)
203
- rescue Excon::Errors::BadRequest => e
197
+ rescue Excon::Error::BadRequest => e
204
198
  handle_excon_exception(CloudExceptions::KnifeCloudError, e)
205
199
  end
206
200
 
@@ -209,7 +203,7 @@ class Chef
209
203
  end
210
204
 
211
205
  def add_api_endpoint
212
- raise Chef::Exceptions::Override, "You must override add_api_endpoint in #{self.to_s} to add endpoint in auth_params for connection"
206
+ raise Chef::Exceptions::Override, "You must override add_api_endpoint in #{self} to add endpoint in auth_params for connection"
213
207
  end
214
208
 
215
209
  def get_server_name(server)
@@ -218,16 +212,16 @@ class Chef
218
212
 
219
213
  def get_server(instance_id)
220
214
  connection.servers.get(instance_id)
221
- rescue Excon::Errors::BadRequest => e
215
+ rescue Excon::Error::BadRequest => e
222
216
  handle_excon_exception(CloudExceptions::KnifeCloudError, e)
223
217
  end
224
218
 
225
219
  def get_image(name_or_id)
226
- connection.images.find{|img| img.name =~ /#{name_or_id}/ || img.id == name_or_id }
220
+ connection.images.find { |img| img.name =~ /#{name_or_id}/ || img.id == name_or_id }
227
221
  end
228
222
 
229
223
  def get_flavor(name_or_id)
230
- connection.flavors.find{|f| f.name == name_or_id || f.id == name_or_id }
224
+ connection.flavors.find { |f| f.name == name_or_id || f.id == name_or_id }
231
225
  end
232
226
 
233
227
  def server_summary(server, columns_with_info = [])
@@ -249,7 +243,7 @@ class Chef
249
243
 
250
244
  def is_image_windows?(image)
251
245
  image_info = connection.images.get(image)
252
- !image_info.nil? ? image_info.platform == 'windows' : false
246
+ !image_info.nil? ? image_info.platform == "windows" : false
253
247
  end
254
248
  end
255
249
  end