pvcglue 0.1.39 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/README.md +12 -3
  5. data/bin/pvc +4 -2
  6. data/lib/pvcglue.rb +106 -21
  7. data/lib/pvcglue/bootstrap.rb +1 -1
  8. data/lib/pvcglue/cli.rb +28 -17
  9. data/lib/pvcglue/cloud.rb +243 -56
  10. data/lib/pvcglue/configuration.rb +43 -5
  11. data/lib/pvcglue/connection.rb +236 -0
  12. data/lib/pvcglue/custom_hashie.rb +3 -0
  13. data/lib/pvcglue/db.rb +19 -13
  14. data/lib/pvcglue/digital_ocean.rb +21 -0
  15. data/lib/pvcglue/env.rb +52 -28
  16. data/lib/pvcglue/manager.rb +38 -25
  17. data/lib/pvcglue/minion.rb +182 -0
  18. data/lib/pvcglue/nodes.rb +1 -1
  19. data/lib/pvcglue/{packages → old_packages}/bootstrap.rb +15 -15
  20. data/lib/pvcglue/{packages → old_packages}/env.rb +8 -8
  21. data/lib/pvcglue/old_packages/firewall.rb +48 -0
  22. data/lib/pvcglue/old_packages/manager.rb +116 -0
  23. data/lib/pvcglue/{packages → old_packages}/monit-bootstrap.rb +0 -0
  24. data/lib/pvcglue/{packages → old_packages}/monit-web.rb +0 -0
  25. data/lib/pvcglue/{packages → old_packages}/nginx.rb +0 -0
  26. data/lib/pvcglue/{packages → old_packages}/nodejs.rb +0 -0
  27. data/lib/pvcglue/{packages → old_packages}/passenger.rb +0 -0
  28. data/lib/pvcglue/old_packages/postgresql.rb +10 -0
  29. data/lib/pvcglue/{packages → old_packages}/role_db.rb +9 -9
  30. data/lib/pvcglue/{packages → old_packages}/role_lb.rb +6 -6
  31. data/lib/pvcglue/{packages → old_packages}/role_memcached.rb +0 -0
  32. data/lib/pvcglue/{packages → old_packages}/role_redis.rb +0 -0
  33. data/lib/pvcglue/{packages → old_packages}/role_web.rb +9 -9
  34. data/lib/pvcglue/old_packages/rvm.rb +78 -0
  35. data/lib/pvcglue/{packages → old_packages}/timezone.rb +0 -0
  36. data/lib/pvcglue/{packages → old_packages}/ubuntu.rb +0 -0
  37. data/lib/pvcglue/packages.rb +192 -71
  38. data/lib/pvcglue/packages/apt.rb +74 -0
  39. data/lib/pvcglue/packages/apt_repos.rb +48 -0
  40. data/lib/pvcglue/packages/apt_update.rb +18 -0
  41. data/lib/pvcglue/packages/apt_upgrade.rb +20 -0
  42. data/lib/pvcglue/packages/authorized_keys.rb +33 -0
  43. data/lib/pvcglue/packages/bundler.rb +14 -0
  44. data/lib/pvcglue/packages/dir_base.rb +16 -0
  45. data/lib/pvcglue/packages/dir_shared.rb +16 -0
  46. data/lib/pvcglue/packages/firewall.rb +30 -46
  47. data/lib/pvcglue/packages/load_balancer.rb +71 -0
  48. data/lib/pvcglue/packages/maintenance_mode.rb +28 -0
  49. data/lib/pvcglue/packages/manager.rb +101 -99
  50. data/lib/pvcglue/packages/postgresql.rb +36 -8
  51. data/lib/pvcglue/packages/roles.rb +23 -0
  52. data/lib/pvcglue/packages/ruby.rb +13 -0
  53. data/lib/pvcglue/packages/rvm.rb +18 -71
  54. data/lib/pvcglue/packages/secrets.rb +36 -0
  55. data/lib/pvcglue/packages/ssh_key_check.rb +11 -0
  56. data/lib/pvcglue/packages/ssl.rb +45 -0
  57. data/lib/pvcglue/packages/ssl_acme.rb +29 -0
  58. data/lib/pvcglue/packages/swap.rb +14 -0
  59. data/lib/pvcglue/packages/unattended_upgrades.rb +20 -0
  60. data/lib/pvcglue/packages/users.rb +20 -0
  61. data/lib/pvcglue/packages/web.rb +50 -0
  62. data/lib/pvcglue/stack.rb +166 -0
  63. data/lib/pvcglue/templates/50unattended-upgrades.erb +63 -0
  64. data/lib/pvcglue/templates/capfile.erb +4 -1
  65. data/lib/pvcglue/templates/deploy.rb.erb +3 -2
  66. data/lib/pvcglue/templates/lb.sites-enabled.erb +15 -9
  67. data/lib/pvcglue/templates/letsencrypt-webroot.erb +3 -0
  68. data/lib/pvcglue/templates/pg_hba.conf.erb +1 -2
  69. data/lib/pvcglue/templates/postgresql.conf.erb +376 -291
  70. data/lib/pvcglue/templates/stage-deploy.rb.erb +2 -2
  71. data/lib/pvcglue/templates/web.bashrc.erb +16 -5
  72. data/lib/pvcglue/templates/web.nginx.conf.erb +1 -1
  73. data/lib/pvcglue/templates/web.sites-enabled.erb +1 -1
  74. data/lib/pvcglue/version.rb +1 -1
  75. data/pvcglue.gemspec +17 -12
  76. metadata +125 -22
@@ -0,0 +1,116 @@
1
+ require 'toml'
2
+ apt_package 'htop' # DONE
3
+ apt_package 'ufw' # DONE
4
+
5
+ package 'bootstrap-manager' do # DONE
6
+ # TODO: firewall and ssh port config
7
+ depends_on 'authenticate-host' # DONE
8
+ depends_on 'htop' # DONE
9
+ # depends_on 'ufw'
10
+ #depends_on 'deploy-user'
11
+ #depends_on 'sshd-config'
12
+ #depends_on 'firewall-config'
13
+ depends_on 'pvcglue-user' # DONE
14
+ depends_on 'manager-copy-id' # DONE
15
+ end
16
+
17
+ package 'authenticate-host' do # DONE
18
+ apply do
19
+ sudo "ls" # side-effect will add host to known_hosts
20
+ end
21
+ end
22
+
23
+ package 'pvcglue-user' do # DONE
24
+ apply do
25
+ # Local variables used to improve readability of bash commands :)
26
+ user_name = Pvcglue::Manager.user_name
27
+ home_dir = Pvcglue::Manager.home_dir
28
+ manager_dir = Pvcglue::Manager.manager_dir
29
+ ssh_dir = Pvcglue::Manager.ssh_dir
30
+
31
+ sudo "useradd -d #{home_dir} -m -U #{user_name}"
32
+ sudo "usermod -s /bin/bash #{user_name}"
33
+ sudo "mkdir -p #{manager_dir} && chown #{user_name}:#{user_name} #{manager_dir} && chmod 700 #{manager_dir}"
34
+ sudo "mkdir -p #{ssh_dir} && chown #{user_name}:#{user_name} #{ssh_dir} && chmod 700 #{ssh_dir}"
35
+ end
36
+
37
+ remove do
38
+ raise "removing user not supported, yet. It needs some 'Are you *really* sure?' stuff."
39
+ # user_name = Pvcglue::Manager.user_name
40
+ # home_dir = Pvcglue::Manager.home_dir
41
+ #sudo "userdel -f #{user_name}"
42
+ #sudo "rm -rf #{home_dir}"
43
+ end
44
+
45
+ validate do
46
+ user_name = Pvcglue::Manager.user_name
47
+ # home_dir = Pvcglue::Manager.home_dir
48
+ #sudo "userdel -f #{user_name}"; sudo "rm -rf #{home_dir}"; raise "User has been deleted"
49
+ sudo("getent passwd #{user_name}") =~ /^#{user_name}:/
50
+ end
51
+ end
52
+
53
+ package 'manager-copy-id' do # DONE
54
+ validate do
55
+ authorized_keys_file_name = Pvcglue::Manager.authorized_keys_file_name
56
+ user_key = `cat ~/.ssh/id_rsa.pub`.strip
57
+ auth = run("cat #{authorized_keys_file_name}")
58
+ auth.include?(user_key)
59
+ end
60
+
61
+ apply do
62
+ authorized_keys_file_name = Pvcglue::Manager.authorized_keys_file_name
63
+ user_name = Pvcglue::Manager.user_name
64
+ copy_id = %Q[cat ~/.ssh/id_rsa.pub | ssh -o BatchMode=yes -o StrictHostKeyChecking=no #{node.get(:user)}@#{node.host} "cat >> #{authorized_keys_file_name}"]
65
+ system "#{copy_id}"
66
+ run(%Q[cat "" >> #{authorized_keys_file_name}])
67
+ sudo "chown #{user_name}:#{user_name} #{authorized_keys_file_name} && chmod 600 #{authorized_keys_file_name}"
68
+ end
69
+ end
70
+
71
+ package 'manager-push' do # DONE
72
+ apply do
73
+ if File.exists?(::Pvcglue.cloud.local_file_name)
74
+ # scp foobar.txt your_username@remotehost.edu:/some/remote/directory
75
+ cmd = %{scp #{::Pvcglue.cloud.local_file_name} #{node.get(:user)}@#{node.host}:#{::Pvcglue::Manager.manager_file_name}}
76
+ puts "Running `#{cmd}`"
77
+
78
+ unless system cmd
79
+ raise("Error: #{$?}")
80
+ end
81
+
82
+ run(%Q[chmod 600 #{::Pvcglue::Manager.manager_file_name}])
83
+ else
84
+ puts "Local file not found: #{::Pvcglue.cloud.local_file_name}"
85
+ end
86
+ end
87
+ end
88
+
89
+ package 'manager-pull' do # DONE
90
+ apply do
91
+ # scp your_username@remotehost.edu:foobar.txt /some/local/directory
92
+ cmd = %{scp #{node.get(:user)}@#{node.host}:#{::Pvcglue::Manager.manager_file_name} #{::Pvcglue.cloud.local_file_name}}
93
+ puts "Running `#{cmd}`"
94
+
95
+ unless system cmd
96
+ raise("Error: #{$?}")
97
+ end
98
+
99
+ puts "Saved as: #{::Pvcglue.cloud.local_file_name}"
100
+ end
101
+ end
102
+
103
+ package 'manager-get-config' do # DONE
104
+ apply do
105
+ data = run("cat #{::Pvcglue::Manager.manager_file_name}")
106
+ #puts "*"*80
107
+ #puts data
108
+ #puts "*"*80
109
+ if data.empty?
110
+ raise "Remote manager file not found: #{::Pvcglue::Manager.manager_file_name}"
111
+ else
112
+ ::Pvcglue.cloud.data = TOML.parse(data)
113
+ end
114
+ end
115
+ end
116
+
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,10 @@
1
+ apt_package 'postgresql' do # DONE
2
+ action('start') { sudo 'service postgresql start' }
3
+ action('stop') { sudo 'service postgresql stop' }
4
+ action('restart') { sudo('service postgresql restart') }
5
+ end
6
+
7
+ package 'postgres' do # DONE
8
+ depends_on 'postgresql', 'libpq-dev'
9
+ end
10
+
@@ -1,12 +1,12 @@
1
1
  package 'db' do
2
- depends_on 'env-initialized'
3
- depends_on 'postgresql'
4
- depends_on 'postgresql-conf'
5
- depends_on 'postgresql-app-stage-conf'
6
- depends_on 'monit-bootstrap'
2
+ depends_on 'env-initialized' # DONE
3
+ depends_on 'postgresql' # DONE
4
+ depends_on 'postgresql-conf' # DONE
5
+ depends_on 'postgresql-app-stage-conf' # DONE
6
+ depends_on 'monit-bootstrap' # LATER
7
7
  end
8
8
 
9
- package 'postgresql-conf' do
9
+ package 'postgresql-conf' do # DONE
10
10
  file({
11
11
  :template => Pvcglue.template_file_name('postgresql.conf.erb'),
12
12
  :destination => '/etc/postgresql/9.1/main/postgresql.conf',
@@ -26,7 +26,7 @@ package 'postgresql-conf' do
26
26
  }) { trigger 'postgresql:restart' }
27
27
  end
28
28
 
29
- package 'postgresql-app-stage-conf' do
29
+ package 'postgresql-app-stage-conf' do # DONE
30
30
  # TODO: Add `verify` method so it will be faster, and won't display errors
31
31
  apply do
32
32
  username = Pvcglue.cloud.stage_env['DB_USER_POSTGRES_USERNAME']
@@ -39,7 +39,7 @@ package 'postgresql-app-stage-conf' do
39
39
  end
40
40
  end
41
41
 
42
- package 'postgresql-app-stage-db-drop' do
42
+ package 'postgresql-app-stage-db-drop' do # LATER
43
43
  apply do
44
44
  username = Pvcglue.cloud.stage_env['DB_USER_POSTGRES_USERNAME']
45
45
  db_name = username # just for clarity in later statements. This also must match database.yml.
@@ -78,7 +78,7 @@ package 'postgresql-app-stage-db-drop' do
78
78
  end
79
79
  end
80
80
 
81
- package 'postgresql-root-password' do
81
+ package 'postgresql-root-password' do # LATER
82
82
  apply do
83
83
  # TODO: Use this to implement setting of the root password
84
84
  # sudo(%q[sudo -u postgres psql -c "ALTER ROLE postgres WITH PASSWORD 'zzz';"])
@@ -1,9 +1,9 @@
1
1
  package 'lb' do
2
- depends_on 'nginx'
3
- depends_on 'ssl-cert'
4
- depends_on 'lb-config'
5
- depends_on 'lb-maintenance-files'
6
- depends_on 'monit-bootstrap'
2
+ depends_on 'nginx' # DONE
3
+ depends_on 'ssl-cert' # LATER
4
+ depends_on 'lb-config' # DONE
5
+ depends_on 'lb-maintenance-files' # DONE
6
+ depends_on 'monit-bootstrap' # LATER
7
7
 
8
8
  validate do
9
9
  trigger('nginx:running')
@@ -53,7 +53,7 @@ package 'maintenance_mode' do
53
53
  end
54
54
  end
55
55
 
56
- package 'bypass_mode' do
56
+ package 'bypass_mode' do # LATER
57
57
  apply do
58
58
  if Pvcglue.cloud.bypass_mode == 'off'
59
59
  run "touch #{Pvcglue.cloud.maintenance_bypass_mode_file_name}"
@@ -1,16 +1,16 @@
1
1
  package 'web' do
2
2
  # rvm/ruby install based on http://ryanbigg.com/2010/12/ubuntu-ruby-rvm-rails-and-you/
3
- depends_on 'swap' # needed for deployment/asset building on < 1GB machines
4
- depends_on 'build-essential'
5
- depends_on 'git'
6
- depends_on 'rvm'
7
- depends_on 'no-rdoc'
3
+ depends_on 'swap' # LATER # needed for deployment/asset building on < 1GB machines
4
+ depends_on 'build-essential' # DONE
5
+ depends_on 'git' # DONE
6
+ depends_on 'rvm' # DONE
7
+ depends_on 'no-rdoc' # DONE
8
8
 
9
9
 
10
- depends_on 'rvm-ruby'
11
- depends_on 'bundler'
12
- depends_on 'nginx'
13
- depends_on 'phusion-passenger'
10
+ depends_on 'rvm-ruby' # DONE
11
+ depends_on 'bundler' # DONE
12
+ depends_on 'nginx' # DONE
13
+ depends_on 'phusion-passenger' # DONE
14
14
  depends_on 'app-env'
15
15
  depends_on 'web-site-config'
16
16
 
@@ -0,0 +1,78 @@
1
+ package 'rvm' do # DONE
2
+ depends_on 'curl' # DONE
3
+ depends_on 'rvm-bashrc' # DONE
4
+
5
+ validate do
6
+ run('type rvm | head -n 1') =~ /rvm is a function/
7
+ end
8
+
9
+ apply do
10
+ run 'gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3'
11
+ run 'gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3' # Do it again, the first time only sets things up, and does not import the keys
12
+ # run 'curl -sSL https://rvm.io/mpapis.asc | gpg --import -'
13
+ run '\curl -sSL https://get.rvm.io | bash -s stable --with-default-gems="bundler"'
14
+ run "rvm requirements"
15
+ end
16
+
17
+ remove do
18
+ run 'yes "yes" | rvm implode'
19
+ end
20
+ end
21
+
22
+ package 'rvm-bashrc' do # DONE
23
+ file({
24
+ :template => Pvcglue.template_file_name('web.bashrc.erb'),
25
+ :destination => '/home/deploy/.bashrc',
26
+ :create_dirs => false,
27
+ :permissions => 0644,
28
+ :user => 'deploy',
29
+ :group => 'deploy'
30
+ })
31
+ end
32
+
33
+ package 'gem' do # ???
34
+ depends_on 'rvm-ruby'
35
+ action 'exists' do |gem_name|
36
+ run("gem list -i #{gem_name}") =~ /true/
37
+ end
38
+ action 'install' do |gem_name|
39
+ sudo "gem install #{gem_name} --no-ri --no-rdoc"
40
+ end
41
+ action 'uninstall' do |gem_name|
42
+ sudo "gem uninstall #{gem_name} -x -a"
43
+ end
44
+ end
45
+
46
+ package 'bundler' do # ???
47
+ depends_on 'gem'
48
+ apply { trigger 'gem:install', 'bundler' }
49
+ remove { trigger 'gem:remove', 'bundler' }
50
+ validate { trigger 'gem:exists', 'bundler' }
51
+ end
52
+
53
+ package 'rvm-ruby' do # DONE
54
+ depends_on 'rvm'
55
+
56
+ validate do
57
+ run('rvm list strings') =~ /#{Pvcglue.configuration.ruby_version.gsub('.', '\.')}/
58
+ end
59
+
60
+ apply do
61
+ run "rvm install #{Pvcglue.configuration.ruby_version}"
62
+ # run "rvm --default use 2.0.0"
63
+ end
64
+
65
+ remove do
66
+ run "rvm remove --archive --gems #{Pvcglue.configuration.ruby_version}"
67
+ end
68
+
69
+ end
70
+
71
+ package 'no-rdoc' do # DONE
72
+ file({
73
+ :template => Pvcglue.template_file_name('gemrc.erb'),
74
+ :destination => '/home/deploy/.gemrc',
75
+ :create_dirs => false
76
+ })
77
+ end
78
+
File without changes
File without changes
@@ -1,85 +1,206 @@
1
1
  module Pvcglue
2
2
  class Packages
3
- def self.apply(package, context, nodes, user = 'deploy', package_filter = nil)
4
- # puts nodes.inspect
5
- orca_suite = OrcaSuite.init(package_filter)
6
- nodes.each do |node, data|
7
- old_current_node = ::Pvcglue.cloud.current_node_without_nil_check # this is being called recursively, so keep the original data...kinda a hack for now
8
- orca_node = ::Orca::Node.new(node, data[:public_ip], {user: user, port: Pvcglue.cloud.port_in_context(context)})
9
- # puts "#"*800
10
- # puts orca_node.name
11
- # puts package.to_s
12
- # puts "^"*80
13
- ::Pvcglue.cloud.current_node = {node => data}
14
- tries = 3
15
- begin
16
- begin
17
- # puts "="*800
18
- # puts orca_node.name
19
- # puts package.to_s
20
- # puts "^"*80
21
- orca_suite.run(orca_node.name, package.to_s, :apply)
22
- ensure
23
- # puts "-"*800
24
- # puts orca_node.name
25
- # puts package.to_s
26
- # puts "^"*80
27
- ::Pvcglue.cloud.current_node = old_current_node
28
-
29
- # ::Pvcglue.cloud.current_node = nil
30
- ::Pvcglue.cloud.current_hostname = nil
31
- end
32
- rescue Exception => e
33
- tries -= 1
34
- if tries > 0
35
- puts "\n"*10
36
- puts "*"*80
37
- puts "ERROR, retrying..."
38
- puts e.message
39
- puts "*"*80
40
- retry
3
+
4
+ def self.apply(minion, options = {})
5
+ package = new(minion, options)
6
+ unless package.run
7
+ raise package.full_error_message if package.errors?
8
+ end
9
+ end
10
+
11
+ attr_accessor :errors
12
+ attr_accessor :options
13
+
14
+ def initialize(minion, options = {})
15
+ @minion = minion
16
+ @options = options
17
+ @errors = []
18
+ end
19
+
20
+ def errors?
21
+ errors.size > 0
22
+ end
23
+
24
+ def full_error_message
25
+ errors.join('. ')
26
+ end
27
+
28
+ def minion
29
+ @minion
30
+ end
31
+
32
+ def user_name
33
+ @minion.remote_user_name
34
+ end
35
+
36
+ def run
37
+ begin
38
+ Pvcglue.logger_package_description = self.class.name
39
+ unless installed?
40
+ install!
41
+ if post_install_check?
42
+ post_install!
41
43
  else
42
- puts "\n"*10
43
- puts "*"*80
44
- puts "ERROR, not retrying, fatal."
45
- puts e.message
46
- e.backtrace.each { |line| puts line }
47
- puts e.message
48
- puts node.inspect
49
- puts data.inspect
50
- puts "*"*80
44
+ # TODO: Better error message
45
+
46
+ errors << 'Install failed post install check.'
47
+ Pvcglue.logger.error { full_error_message }
48
+ return false
51
49
  end
52
50
  end
51
+ ensure
52
+ Pvcglue.logger_package_description = ''
53
53
  end
54
+ true
55
+ end
56
+
57
+ def installed?
58
+ false
59
+ end
60
+
61
+ def install!
62
+ false
63
+ end
64
+
65
+ def post_install_check?
66
+ # override to do a different (more time consuming/more detailed) check
67
+ installed?
68
+ end
69
+
70
+ def post_install!
71
+
72
+ end
73
+
74
+ def has_role?(roles)
75
+ minion.has_role?(roles)
76
+ end
77
+
78
+ def has_roles?(roles)
79
+ minion.has_role?(roles)
80
+ end
81
+
82
+ def connection
83
+ @minion.connection
84
+ end
85
+
86
+ def minion_state_file_name
87
+ ".minion_state_#{user_name}.toml"
54
88
  end
55
- end
56
89
 
57
- class OrcaSuite
58
-
59
- def self.init(package_filter)
60
- ::Orca.verbose(package_filter != 'manager') # show details for all packages except manager, for now
61
-
62
- # Load orca extensions
63
- orca_file = File.join(File.dirname(__FILE__), 'all_the_things.rb')
64
- ENV['ORCA_FILE'] = orca_file
65
- suite = ::Orca::Suite.new
66
- suite.load_file(orca_file)
67
- packages_loaded = []
68
-
69
- Dir[File.join(Pvcglue::gem_dir, 'lib', 'pvcglue', 'packages', '*.rb')].each do |file|
70
- # package filter is used to load the manager package by itself when stage is not specified
71
- next if package_filter && package_filter != File.basename(file, ".rb")
72
- begin
73
- suite.load_file(file)
74
- rescue Exception => e
75
- puts "Error loading #{file}: #{e.message}"
76
- raise
90
+ def load_state_data
91
+ if connection.file_exists?(:root, minion_state_file_name)
92
+ data = connection.read_from_file(:root, minion_state_file_name)
93
+ else
94
+ data = ''
95
+ end
96
+ # puts data
97
+ connection.minion_state_data = TOML.parse(data, symbolize_keys: true)
98
+ end
99
+
100
+
101
+ def get_minion_state_data
102
+ unless connection.minion_state_data
103
+ if Pvcglue.reset_minion_state?
104
+ Pvcglue.logger.warn('Minion state data reset.')
105
+ connection.minion_state_data = {}
106
+ else
107
+ load_state_data
77
108
  end
78
- packages_loaded << File.basename(file, ".rb")
79
109
  end
80
- puts "Packages loaded: #{packages_loaded.sort.join(' ')}."
81
- suite
82
110
  end
111
+
112
+ def get_minion_state(key)
113
+ get_minion_state_data
114
+ connection.minion_state_data[key]
115
+ end
116
+
117
+ def set_minion_state(key, value)
118
+ get_minion_state_data
119
+ connection.minion_state_data[key] = value
120
+ connection.write_to_file(:root, TOML.dump(connection.minion_state_data), minion_state_file_name)
121
+ end
122
+
123
+
124
+ # def self.apply(package, context, nodes, user = 'deploy', package_filter = nil)
125
+ # # puts nodes.inspect
126
+ # orca_suite = OrcaSuite.init(package_filter)
127
+ # nodes.each do |node, data|
128
+ # old_current_node = ::Pvcglue.cloud.current_node_without_nil_check # this is being called recursively, so keep the original data...kinda a hack for now
129
+ # orca_node = ::Orca::Node.new(node, data[:public_ip], {user: user, port: Pvcglue.cloud.port_in_context(context)})
130
+ # # puts "#"*800
131
+ # # puts orca_node.name
132
+ # # puts package.to_s
133
+ # # puts "^"*80
134
+ # ::Pvcglue.cloud.current_node = {node => data}
135
+ # tries = 3
136
+ # begin
137
+ # begin
138
+ # # puts "="*800
139
+ # # puts orca_node.name
140
+ # # puts package.to_s
141
+ # # puts "^"*80
142
+ # orca_suite.run(orca_node.name, package.to_s, :apply)
143
+ # ensure
144
+ # # puts "-"*800
145
+ # # puts orca_node.name
146
+ # # puts package.to_s
147
+ # # puts "^"*80
148
+ # ::Pvcglue.cloud.current_node = old_current_node
149
+ #
150
+ # # ::Pvcglue.cloud.current_node = nil
151
+ # ::Pvcglue.cloud.current_hostname = nil
152
+ # end
153
+ # rescue Exception => e
154
+ # tries -= 1
155
+ # if tries > 0
156
+ # puts "\n"*10
157
+ # puts "*"*80
158
+ # puts "ERROR, retrying..."
159
+ # puts e.message
160
+ # puts "*"*80
161
+ # retry
162
+ # else
163
+ # puts "\n"*10
164
+ # puts "*"*80
165
+ # puts "ERROR, not retrying, fatal."
166
+ # puts e.message
167
+ # e.backtrace.each { |line| puts line }
168
+ # puts e.message
169
+ # puts node.inspect
170
+ # puts data.inspect
171
+ # puts "*"*80
172
+ # end
173
+ # end
174
+ # end
175
+ # end
83
176
  end
84
177
 
178
+ # class OrcaSuite
179
+ #
180
+ # def self.init(package_filter)
181
+ # ::Orca.verbose(package_filter != 'manager') # show details for all packages except manager, for now
182
+ #
183
+ # # Load orca extensions
184
+ # orca_file = File.join(File.dirname(__FILE__), 'all_the_things.rb')
185
+ # ENV['ORCA_FILE'] = orca_file
186
+ # suite = ::Orca::Suite.new
187
+ # suite.load_file(orca_file)
188
+ # packages_loaded = []
189
+ #
190
+ # Dir[File.join(Pvcglue::gem_dir, 'lib', 'pvcglue', 'packages', '*.rb')].each do |file|
191
+ # # package filter is used to load the manager package by itself when stage is not specified
192
+ # next if package_filter && package_filter != File.basename(file, ".rb")
193
+ # begin
194
+ # suite.load_file(file)
195
+ # rescue Exception => e
196
+ # puts "Error loading #{file}: #{e.message}"
197
+ # raise
198
+ # end
199
+ # packages_loaded << File.basename(file, ".rb")
200
+ # end
201
+ # puts "Packages loaded: #{packages_loaded.sort.join(' ')}."
202
+ # suite
203
+ # end
204
+ # end
205
+
85
206
  end