hazetug 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
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