hazetug 0.1.4 → 0.1.5

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
  SHA1:
3
- metadata.gz: ebdf9a9772962644f814c2215eb1a788e935a317
4
- data.tar.gz: 5886036f41c10cc8a7efb87dbce4a3bc21c20d31
3
+ metadata.gz: a6c00796640e6ece747e594b00ba9920a6eb274c
4
+ data.tar.gz: b4547334fbbf7886ec879ec28973741eda037ae0
5
5
  SHA512:
6
- metadata.gz: fbf02d130984ad264c559f943be0b146e84a92ab5999d0390eafab9ff03de631cadf5cf367856c4d1fbb484bb0c547700ece2b5d8c2eeb81706002207acbd5fe
7
- data.tar.gz: 5ba4e8ff097d31ec9d3e5685ce3a0bf9c6a8165e65bdb45ecef0f6dc1deb92dd46430e0af17e89bcf1e5bc8ed9e3dddb459570279d2e533f4eeab3fda1e825af
6
+ metadata.gz: c2fb703a1956871aae50be4bc4e4d4c8482b1dca282a01b6693f157f01c8eae04194d95d3a0b829aaa3c590d9ca24cd7ac905325ce2e17880389b136393da865
7
+ data.tar.gz: 6cde17df0db9ceafc66365aaaec3872a8d03f90f9c17323b1a1198b64433c23559659f1af2c3500e8b126f1807e7a03893ae4f48b9dde163bbd39ef4950f378f
data/README.md CHANGED
@@ -97,7 +97,7 @@ Hazetug uses [fog cloud library](http://fog.io) to be able to easily append othe
97
97
  <td><b>Default value</b></td>
98
98
  </tr>
99
99
  <tr>
100
- <td><b><i>attributes_json</i></b></td>
100
+ <td><b><i>attributes</i></b></td>
101
101
  <td>Hash of attributes prepared for chef-solo run. (It's merged with the run_list).</td>
102
102
  <td><i>{}</i><td>
103
103
  </tr>
@@ -217,7 +217,6 @@ bootstrap:
217
217
  }
218
218
  }
219
219
  ```
220
- ```
221
220
 
222
221
  Merged *attributes* with the *run_list* form the input data for running **chef-solo** they are available inside bootstrap.erb as `hazetug[:attributes_json]`. Berksfile can be set specifically in the bootstrap task list or if it's not set local *Berksfile* is tried by default.
223
222
 
@@ -19,11 +19,11 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.5"
22
- spec.add_development_dependency "rake", "~> 0"
23
- spec.add_dependency "psych", "~> 0"
24
- spec.add_dependency "fog", "~> 0"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_dependency "psych", "~> 2.0"
24
+ spec.add_dependency "fog", "~> 1.0"
25
25
  spec.add_dependency "chef", "~> 11.0"
26
26
  spec.add_dependency "gli", "~> 2.0"
27
- spec.add_dependency "agent", "~> 0"
27
+ spec.add_dependency "agent", "~> 0.0"
28
28
  spec.add_dependency "berkshelf", "~> 3.0"
29
29
  end
@@ -25,8 +25,9 @@ class Hazetug
25
25
 
26
26
  def provision_and_bootstrap(haze, tug, channel, waitgroup)
27
27
  haze.provision
28
+
28
29
  if haze.ready?
29
- tug.load_haze_config(haze.config_for_tug)
30
+ haze.update_access_settings tug.config
30
31
 
31
32
  tug.bootstrap({
32
33
  args: data[:args],
@@ -36,7 +37,7 @@ class Hazetug
36
37
  end
37
38
  rescue
38
39
  # Exeception will be lost, since we run inside goproc,
39
- # ie. as soon as waitgroup is empty all process exit.
40
+ # ie. as soon as waitgroup is empty and all processes died.
40
41
  puts $!.inspect
41
42
  puts $@
42
43
  ensure
@@ -2,14 +2,17 @@ require 'hazetug/config'
2
2
  require 'hazetug/compute'
3
3
  require 'hazetug/ui'
4
4
  require 'hazetug/tug'
5
+ require 'hazetug/net_ssh'
5
6
  require 'chef/mash'
6
7
 
7
8
  class Hazetug
8
9
  class Haze
9
10
  include Hazetug::UI::Mixin
11
+ include Hazetug::NetSSH::Mixin
12
+
13
+ attr_reader :config, :compute_name
10
14
 
11
15
  RE_BITS = /-?x(32)$|-?x(64)$|(32)bit|(64)bit/i
12
- attr_reader :config, :compute, :compute_name, :server
13
16
 
14
17
  def initialize(config={})
15
18
  @compute_name = Hazetug.leaf_klass_name(self.class)
@@ -23,8 +26,12 @@ class Hazetug
23
26
  provision_server
24
27
  wait_for_ssh
25
28
  rescue Fog::Errors::Error
29
+ # Catch fog errors, don't abort further execution
30
+ ui.error "[#{compute_name}] #{$!.inspect}"
31
+ rescue
32
+ # For unknown exceptions, notify and exit
26
33
  ui.error "[#{compute_name}] #{$!.inspect}"
27
- ui.msg $@
34
+ ui.msg $@
28
35
  exit(1)
29
36
  end
30
37
 
@@ -32,31 +39,32 @@ class Hazetug
32
39
  @ready
33
40
  end
34
41
 
35
- def configure(config)
36
- input = config.keys.map(&:to_sym)
37
- requires = self.class.requires
38
- unless (norequired = requires.select {|r| not input.include?(r)}).empty?
39
- ui.error "Required options missing: #{norequired.join(', ')}"
40
- raise ArgumentError, "Haze options missing"
42
+ def public_ip_address
43
+ end
44
+
45
+ def private_ip_address
46
+ end
47
+
48
+ # Update hash with haze access settings only if any available
49
+ def update_access_settings(hash)
50
+ {
51
+ compute_name: compute_name.downcase,
52
+ public_ip_address: (public_ip_address ||
53
+ (server and server.ssh_ip_address)),
54
+ private_ip_address: private_ip_address
55
+ }.inject(hash) do |hsh, (k, v)|
56
+ hsh[k] = v if v
57
+ hsh
41
58
  end
42
- Mash.new(self.class.defaults.merge(config))
43
59
  end
44
60
 
45
61
  class << self
46
62
  def requires(*args)
47
- if args.empty?
48
- @requires
49
- else
50
- @requires = args.flatten.dup
51
- end
63
+ args.empty? ? @requires : @requires = args.flatten.dup
52
64
  end
53
65
 
54
66
  def defaults(hash=nil)
55
- if hash.nil?
56
- @defaults
57
- else
58
- @defaults = hash
59
- end
67
+ hash.nil? ? @defaults : @defaults = hash
60
68
  end
61
69
 
62
70
  def [](haze_name)
@@ -65,21 +73,9 @@ class Hazetug
65
73
  end
66
74
  end
67
75
 
68
- def public_ip_address
69
- end
70
-
71
- def private_ip_address
72
- end
73
-
74
- def config_for_tug
75
- {
76
- compute_name: compute_name.downcase,
77
- public_ip_address: (public_ip_address || server.ssh_ip_address rescue nil),
78
- private_ip_address: private_ip_address
79
- }
80
- end
81
-
82
76
  protected
77
+ attr_accessor :server
78
+ attr_reader :compute
83
79
 
84
80
  def provision_server
85
81
  ui.error "#{compute_name} Provisioning is not impemented"
@@ -89,5 +85,19 @@ class Hazetug
89
85
  ui.error "#{compute_name} Waiting for shh is not impemented"
90
86
  end
91
87
 
88
+ private
89
+
90
+ def configure(config)
91
+ input = config.keys.map(&:to_sym)
92
+ requires = self.class.requires
93
+
94
+ unless (norequired = requires.select {|r| not input.include?(r)}).empty?
95
+ ui.error "Required options missing: #{norequired.join(', ')}"
96
+ raise ArgumentError, "Haze options missing"
97
+ end
98
+
99
+ Mash.new(self.class.defaults.merge(config))
100
+ end
101
+
92
102
  end
93
103
  end
@@ -4,20 +4,16 @@ class Hazetug
4
4
 
5
5
  def provision_server
6
6
  ui.info "[#{compute_name}] creating server #{config[:name]}"
7
- @server = compute.servers.create(server_args)
7
+ self.server = compute.servers.create(server_args)
8
8
  server.wait_for { ready? }
9
9
  ui.info "[#{compute_name}] server #{config[:name]} created, ip: #{server.ssh_ip_address}"
10
10
  end
11
11
 
12
12
  def wait_for_ssh
13
- ssh_options = {}
14
- ssh_opts = Hazetug::Tug.ssh_options_from(config)
15
- ssh_options[:password] = ssh_opts[:ssh_password]
16
- ssh_options[:paranoid] = ssh_opts[:host_key_verify] || false
17
- ssh_options[:keys] = ssh_opts[:ssh_keys] || Hazetug.ssh_keys(compute_name)
18
- server.username = ssh_opts[:ssh_user] || 'root'
19
- server.ssh_port = ssh_opts[:ssh_port]
20
- server.ssh_options = ssh_options
13
+ server.username = config[:ssh_user] || 'root'
14
+ server.ssh_port = config[:ssh_port]
15
+ server.ssh_options = net_ssh_options
16
+
21
17
  ui.info "[#{compute_name}] waiting for active ssh on #{server.ssh_ip_address}"
22
18
  server.wait_for(30) { sshable? }
23
19
  @ready = true
@@ -20,12 +20,5 @@ class Hazetug
20
20
  klass.name.split('::').last
21
21
  end
22
22
  end
23
-
24
- def ssh_keys(compute_name=nil)
25
- ssh_attr = []
26
- ssh_attr << "#{compute_name.downcase}_ssh_keys" if compute_name
27
- ssh_attr << "ssh_keys"
28
- Hazetug::Config[ssh_attr.find {|a| Hazetug::Config[a]}]
29
- end
30
23
  end
31
24
  end
@@ -0,0 +1,40 @@
1
+ class Hazetug
2
+ module NetSSH
3
+
4
+ module Mixin
5
+ NET_SSH_OPTIONS = [
6
+ :ssh_password, :ssh_port, :ssh_host_key_verify, :ssh_keys ]
7
+
8
+ private
9
+
10
+ def net_ssh_options
11
+ @net_ssh_options ||= begin
12
+ hash = {}
13
+ ssh_opts = pick_ssh_options
14
+ hash[:password] = ssh_opts[:ssh_password]
15
+ hash[:paranoid] = ssh_opts[:host_key_verify] || false
16
+ hash[:keys] = ssh_opts[:ssh_keys] || NetSSH.ssh_keys(config[:compute_name])
17
+ hash[:port] = ssh_opts[:ssh_port]
18
+ hash
19
+ end
20
+ end
21
+
22
+ def pick_ssh_options
23
+ NET_SSH_OPTIONS.inject({}) do |hash, k|
24
+ if value = (config[k])
25
+ hash[k] = value
26
+ end
27
+ hash
28
+ end
29
+ end
30
+ end
31
+
32
+ def self.ssh_keys(compute_name=nil)
33
+ ssh_attr = []
34
+ ssh_attr << "#{compute_name.downcase}_ssh_keys" if compute_name
35
+ ssh_attr << "ssh_keys"
36
+ Hazetug::Config[ssh_attr.find {|a| Hazetug::Config[a]}]
37
+ end
38
+
39
+ end
40
+ end
@@ -1,20 +1,18 @@
1
1
  require 'hazetug/tug/knife'
2
2
  require 'hazetug/tug/solo'
3
3
  require 'hazetug/ui'
4
+ require 'hazetug/net_ssh'
4
5
  require 'chef/mash'
5
6
 
6
7
  class Hazetug
7
8
  class Tug
8
9
  include Hazetug::UI::Mixin
9
-
10
- SSH_OPTIONS = [
11
- :ssh_user, :ssh_password, :ssh_port,
12
- :ssh_host_key_verify, :ssh_keys
13
- ]
14
- LOGDIR = "#{Dir.pwd}/logs"
10
+ include Hazetug::NetSSH::Mixin
15
11
 
16
12
  attr_reader :config, :options
17
13
 
14
+ LOGDIR = "#{Dir.pwd}/logs"
15
+
18
16
  def initialize(config={})
19
17
  @config = config
20
18
  end
@@ -28,35 +26,25 @@ class Hazetug
28
26
  ip = config[:public_ip_address]
29
27
 
30
28
  ui.msg "[#{tug_name}] bootstraping server #{config[:name]}, ip: #{ip}"
29
+
31
30
  exit_status = bootstrap_server
32
31
 
33
32
  if exit_status.is_a?(Fixnum) && exit_status != 0
34
33
  ui.error "[#{tug_name}] bootstraping server #{config[:name]} failed."
35
34
  else
35
+
36
36
  ui.msg "[#{tug_name}] bootstraping server #{config[:name]} done."
37
37
  end
38
+
38
39
  rescue Hazetug::Exception => e
39
40
  ui.error "[#{config[:compute_name]}] #{e.message}"
40
41
  end
41
42
 
42
- def load_haze_config(hash)
43
- @config.merge!(hash)
44
- end
45
-
46
43
  class << self
47
44
  def [](symbol_or_string)
48
45
  klass = Hazetug.camel_case_name(symbol_or_string)
49
46
  const_get(klass)
50
47
  end
51
-
52
- def ssh_options_from(config)
53
- SSH_OPTIONS.inject({}) do |hash, k|
54
- if value = (config[k])
55
- hash[k] = value
56
- end
57
- hash
58
- end
59
- end
60
48
  end
61
49
 
62
50
  protected
@@ -8,18 +8,13 @@ class Hazetug
8
8
 
9
9
  def initialize(config={}, haze=nil)
10
10
  super
11
- @chef_option_list = [
12
- :environment,
13
- :chef_server_url,
11
+ [ :chef_server_url,
14
12
  :validation_key
15
- ]
13
+ ].inject(@chef_option_list, :<<)
16
14
  end
17
15
 
18
16
  def bootstrap_config
19
17
  super
20
- @chef_option_list.each do |opt|
21
- Chef::Config[opt] = bootstrap_options[opt]
22
- end
23
18
  check_bootstrap_files! :validation_key, :template_file
24
19
  end
25
20
 
@@ -55,6 +55,7 @@ class Hazetug
55
55
  :ssh_password,
56
56
  :host_key_verify
57
57
  ]
58
+ @chef_option_list = [ :environment ]
58
59
  end
59
60
 
60
61
  # Bootstraps the remote server using knife bootstrap.
@@ -78,6 +79,10 @@ class Hazetug
78
79
  knife.config[opt] = bootstrap_options[opt]
79
80
  end
80
81
 
82
+ @chef_option_list.each do |opt|
83
+ Chef::Config[opt] = bootstrap_options[opt]
84
+ end
85
+
81
86
  # Check ssh identity
82
87
  cred = [
83
88
  hazetug_identity, bootstrap_options[:identity_file],
@@ -27,7 +27,7 @@ class Hazetug
27
27
  end
28
28
 
29
29
  def bootstrap_cleanup
30
- ssh = Fog::SSH.new(config[:public_ip_address], ssh_username, ssh_options)
30
+ ssh = Fog::SSH.new(config[:public_ip_address], ssh_username, net_ssh_options)
31
31
  ssh.run("test -f #{@upload_dest} && rm #{@upload_dest}")
32
32
  end
33
33
 
@@ -46,7 +46,7 @@ class Hazetug
46
46
 
47
47
  def upload_berks_package
48
48
  berks_package do |path|
49
- scp = Fog::SCP.new(config[:public_ip_address], ssh_username, ssh_options)
49
+ scp = Fog::SCP.new(config[:public_ip_address], ssh_username, net_ssh_options)
50
50
  scp.upload(path, @upload_dest)
51
51
  end
52
52
  end
@@ -67,20 +67,6 @@ class Hazetug
67
67
  end
68
68
  end
69
69
 
70
- private
71
-
72
- def ssh_options
73
- @ssh_options ||= begin
74
- ssh_options = {}
75
- ssh_opts = Hazetug::Tug.ssh_options_from(config)
76
- ssh_options[:password] = ssh_opts[:ssh_password]
77
- ssh_options[:paranoid] = ssh_opts[:host_key_verify] || false
78
- ssh_options[:keys] = ssh_opts[:ssh_keys] || Hazetug.ssh_keys(config[:compute_name])
79
- ssh_options[:port] = ssh_opts[:ssh_port]
80
- ssh_options
81
- end
82
- end
83
-
84
70
  def ssh_username
85
71
  config[:ssh_user] || 'root'
86
72
  end
@@ -1,3 +1,3 @@
1
1
  class Hazetug
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hazetug
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Barishev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-04 00:00:00.000000000 Z
11
+ date: 2014-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,42 +30,42 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '10.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '10.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: psych
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '2.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '2.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: fog
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '1.0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '1.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: chef
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0'
103
+ version: '0.0'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0'
110
+ version: '0.0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: berkshelf
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +150,7 @@ files:
150
150
  - lib/hazetug/haze/digital_ocean.rb
151
151
  - lib/hazetug/haze/linode.rb
152
152
  - lib/hazetug/hazetug.rb
153
+ - lib/hazetug/net_ssh.rb
153
154
  - lib/hazetug/task.rb
154
155
  - lib/hazetug/tug.rb
155
156
  - lib/hazetug/tug/knife.rb