auser-poolparty 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. data/VERSION.yml +1 -1
  2. data/bin/cloud-configure +2 -0
  3. data/bin/cloud-start +2 -2
  4. data/bin/server-cloud-elections +26 -18
  5. data/bin/server-ensure-provisioning +24 -29
  6. data/bin/server-list-active +1 -0
  7. data/lib/poolparty/base_packages/haproxy.rb +6 -2
  8. data/lib/poolparty/base_packages/poolparty.rb +1 -1
  9. data/lib/poolparty/core/string.rb +14 -0
  10. data/lib/poolparty/dependency_resolver/chef_resolver.rb +38 -7
  11. data/lib/poolparty/lite.rb +4 -2
  12. data/lib/poolparty/modules/cloud_resourcer.rb +12 -3
  13. data/lib/poolparty/modules/definable_resource.rb +1 -4
  14. data/lib/poolparty/net/remoter/cloud_control.rb +0 -30
  15. data/lib/poolparty/net/remoter/connections.rb +7 -6
  16. data/lib/poolparty/net/remoter_base.rb +45 -1
  17. data/lib/poolparty/plugins/chef.rb +55 -66
  18. data/lib/poolparty/plugins/{deploydirectory.rb → deploy_directory.rb} +8 -1
  19. data/lib/poolparty/plugins/gem_package.rb +31 -0
  20. data/lib/poolparty/poolparty/key.rb +11 -8
  21. data/lib/poolparty/poolparty/plugin.rb +1 -1
  22. data/lib/poolparty/poolparty/plugin_model.rb +5 -5
  23. data/lib/poolparty/poolparty/service.rb +1 -1
  24. data/lib/poolparty/provision/boot_strapper.rb +16 -2
  25. data/lib/poolparty/provision/configurations/chef.rb +7 -4
  26. data/lib/poolparty/provision/dr_configure.rb +20 -6
  27. data/lib/poolparty/schema.rb +17 -0
  28. data/lib/poolparty/templates/haproxy.conf +1 -1
  29. data/vendor/gems/suitcase/VERSION.yml +1 -1
  30. data/vendor/gems/suitcase/lib/suitcase/zipper.rb +4 -4
  31. data/vendor/gems/suitcase/suitcase.gemspec +2 -2
  32. metadata +4 -4
  33. data/lib/poolparty/services/gem_package.rb +0 -52
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 4
2
+ :patch: 5
3
3
  :major: 1
4
4
  :minor: 1
data/bin/cloud-configure CHANGED
@@ -9,6 +9,8 @@ end
9
9
 
10
10
  o.loaded_clouds.each do |cld|
11
11
  # If an IP or DNS name is given, bootstrap that node, otherwise, bootstrap all running nodes.
12
+ # ::FileUtils.rm_rf "#{Default.tmp_path}/" unless o.testing?
13
+
12
14
  nodes = !o.unflagged_args.empty? ? o.unflagged_args : cld.remote_instances_list.collect {|inst| inst.ip if inst.running? }.compact
13
15
  if nodes.empty?
14
16
  puts "No nodes to configure"
data/bin/cloud-start CHANGED
@@ -12,8 +12,8 @@ o.loaded_clouds.each do |cld|
12
12
  puts "#{cld.list_of_running_instances.size} running instances (#{cld.minimum_instances} - #{cld.maximum_instances})"
13
13
 
14
14
  cld.launch_instance! do |node|
15
- ::PoolParty::Provision::BootStrapper.new(node.ip, :full_keypair_path => cld.keypair.full_filepath, :cloud => cld)
16
- ::PoolParty::Provision::DrConfigure.new(node.ip, :full_keypair_path => cld.keypair.full_filepath, :cloud => cld)
15
+ ::PoolParty::Provision::BootStrapper.new(node.ip, :cloud => cld)
16
+ ::PoolParty::Provision::DrConfigure.new(node.ip, :cloud => cld)
17
17
 
18
18
  puts <<-EOM
19
19
  Your cloud has started. Your ip is #{node.ip}
@@ -1,26 +1,34 @@
1
1
  #!/usr/bin/env ruby
2
- require "rubygems"
3
- require 'net/http'
4
- require 'json'
2
+ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+ require "poolparty"
5
4
  require "poolparty/lite"
6
5
 
7
- vote_for = ARGV.shift || "none" # or pending or terminated
8
- schema = ::PoolParty.load_cloud_from_json(ARGV.shift) #TODO: smarter option parser
6
+ o = PoolParty::Optioner.new(ARGV) do |opts, optioner|
7
+ opts.on('-n cloudname', '--name name', 'Start cloud by this name') { |c| optioner.cloudname c }
8
+ opts.on('-i num', '--num i', 'Instance number') { |i| optioner.inst_num i.to_i }
9
+ end
10
+
11
+ vote_for = o.unflagged_args.shift || "none"
12
+
13
+ schema = ::PoolParty.load_cloud_from_json(o.unflagged_args.shift) #TODO: smarter option parser
9
14
  remote_base_name = schema.options.remote_base.split('::')[-1].camelcase
10
15
  remoter_base = PoolParty::Remote.module_eval(remote_base_name)
11
- require 'rubygems'; require 'ruby-debug'; debugger
12
16
 
13
- case vote_for
14
- when "expand"
15
- # PoolParty.log << "Launching new instance"
16
- remoter_base.send :launch_new_instance!, schema.options do |node|
17
- ::PoolParty::Provision::BootStrapper.new( node[:ip], :full_keypair_path => cld.keypair.full_filepath, :cloud => schema.options )
18
- ::PoolParty::Provision::DrConfigure.new( node[:ip], :full_keypair_path => cld.keypair.full_filepath, :cloud => schema.options )
17
+ o.loaded_clouds.each do |cld|
18
+ cld.update_from_schema(schema)
19
+
20
+ case vote_for
21
+ when "expand"
22
+ # PoolParty.log << "Launching new instance"
23
+ cld.send :launch_instance!, schema.options do |node|
24
+ ::PoolParty::Provision::BootStrapper.new( node[:ip], :cloud => cld )
25
+ ::PoolParty::Provision::DrConfigure.new( node[:ip], :cloud => cld )
26
+ end
27
+ when "contract"
28
+ last_instance_id = %x[/usr/bin/server-list-active instance_id].split("\t").last
29
+ remoter_base.terminate_instance! schema.options.merge(:instance_id => last_instance_id)
30
+ else
31
+ puts "Unknown action: #{vote_for}"
19
32
  end
20
- when "contract"
21
- last_instance_id = %x[/usr/bin/server-list-active instance_id].split("\t").last
22
- remoter_base.terminate_instance! schema.options.merge(:instance_id => last_instance_id)
23
- else
24
- puts "Unknown action: #{vote_for}"
33
+
25
34
  end
26
-
@@ -1,38 +1,33 @@
1
1
  #!/usr/bin/env ruby
2
2
  $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
3
  require "poolparty"
4
- require "poolpartycl"
4
+ require "poolparty/lite"
5
5
 
6
- available_monitors = PoolParty::Monitors.available_monitors
7
6
  o = PoolParty::Optioner.new(ARGV) do |opts, optioner|
8
- opts.on('-n name', '--name name', 'Host name') { |h| optioner.hostname h }
9
- opts.on('-l', '--no-shell', 'No shell') {optioner.noshell true}
7
+ opts.on('-n cloudname', '--name name', 'Start cloud by this name') { |c| optioner.cloudname c }
8
+ opts.on('-i num', '--num i', 'Instance number') { |i| optioner.inst_num i.to_i }
10
9
  end
11
10
 
12
- o.loaded_clouds.each do |cloud|
13
-
14
- with_cloud(cloud) do
11
+ schema = ::PoolParty.load_cloud_from_json
12
+
13
+ o.loaded_clouds.each do |cld|
14
+ cld.update_from_schema(schema)
15
15
 
16
- @nonprovisioned_nodes = list_of_running_instances.map {|a| a.name } - cloud.get_current_nodes
17
- # @tp = ThreadPool.new(10)
18
- @nonprovisioned_nodes.each do |node|
19
- vputs "Provisioning #{node}"
20
- next if node == "master"
21
- # @tp.process do
22
- str = returning Array.new do |s|
23
- s << cloud.dependency_resolver_command
24
- end.join(";")
25
-
26
- node_id = node.gsub(/node/, '')
27
-
28
- cmd = ". /etc/profile && #{str};server-provision -n #{cloud.name} -i #{node_id};#{str}"
29
- running_cmd = "ps aux | grep -v grep | grep \"server-provision -n #{cloud.name} -i #{node_id};\""
30
-
31
- vputs "Executing #{cmd}"
32
- running = %x[#{running_cmd}]
33
- `#{cmd}` if running.chomp.empty?
16
+ # If an IP or DNS name is given, bootstrap that node, otherwise, bootstrap all running nodes.
17
+ nodes = !o.unflagged_args.empty? ? o.unflagged_args : cld.remote_instances_list.collect {|inst| inst.ip if inst.running? }.compact
18
+ if nodes.empty?
19
+ puts "No nodes to bootstrap"
20
+ else
21
+ if o.inst_num?
22
+ ::PoolParty::Provision::BootStrapper.new( nodes[o.inst_num], :cloud => cld )
23
+ ::PoolParty::Provision::DrConfigure.new( nodes[o.inst_num], :cloud => cld )
24
+ else
25
+ nodes.each do |address|
26
+ puts "bootstrapping: #{address}"
27
+ ::PoolParty::Provision::BootStrapper.new( address, :cloud => cld )
28
+ ::PoolParty::Provision::DrConfigure.new( address, :cloud => cld )
29
+ end
34
30
  end
35
- # @tp.join
36
- end
37
-
38
- end
31
+ end
32
+ end
33
+
@@ -10,6 +10,7 @@ schema = PoolParty::Schema.new( ::File.read(json_file) )
10
10
 
11
11
  remoter_base = schema.options.remote_base
12
12
 
13
+ # TODO: WTF? Change this
13
14
  instances = PoolParty::Remote::Ec2.describe_instances(schema.options)
14
15
  inst_array = instances.map {|inst| inst.send list_type.to_sym }
15
16
 
@@ -2,9 +2,13 @@ module PoolParty
2
2
  class Base
3
3
  plugin :poolparty_base_haproxy do
4
4
 
5
- def enable
5
+ def before_configure
6
6
  # We need the haproxy package
7
- ::Suitcase::Zipper.add("#{::File.dirname(__FILE__)}/../../../vendor/chef/apache2", "chef/recipes")
7
+ ::Suitcase::Zipper.add("#{::File.dirname(__FILE__)}/../../../vendor/chef/apache2", "chef/cookbooks")
8
+ end
9
+
10
+ def enable
11
+ has_chef_recipe 'apache2'
8
12
  has_service "apache2"
9
13
 
10
14
  has_package({:name => "haproxy"}) do
@@ -3,7 +3,7 @@ module PoolParty
3
3
  plugin :poolparty_base_packages do
4
4
 
5
5
  def enable
6
- has_package "git"
6
+ has_package "git-core"
7
7
 
8
8
  has_cron "/usr/bin/server-manage-election" do
9
9
  minute "0,5,10,15,20,25,30,35,40,45,50,55"
@@ -67,6 +67,20 @@ class String
67
67
  klass
68
68
  end
69
69
 
70
+ def new_resource_class(superclass=nil, opts={}, &block)
71
+ symc = "::PoolParty::Resources::#{self.camelcase}"
72
+ kla=<<-EOE
73
+ class #{symc} < ::PoolParty::Resources::Resource
74
+ end
75
+ EOE
76
+
77
+ Kernel.module_eval kla
78
+ klass = symc.constantize
79
+ klass.module_eval &block if block
80
+
81
+ klass
82
+ end
83
+
70
84
  def camelcase
71
85
  gsub(/(^|_|-)(.)/) { $2.upcase }
72
86
  end
@@ -1,8 +1,33 @@
1
+ =begin rdoc
2
+ ChefResolver
3
+
4
+ This takes the internal structure
5
+ {
6
+ :options => {},
7
+ :services => [{}],
8
+ :resources => {}
9
+ }
10
+
11
+ and creates a chef recipe to reflect.
12
+
13
+ /cookbooks/
14
+ namespace/
15
+ recipes/
16
+ templates/
17
+ attributes/
18
+ =end
1
19
  module PoolParty
2
20
 
3
21
  class ChefResolver< DependencyResolver
4
22
 
5
- def compile(props=@properties_hash, tabs=0, default_namespace="poolparty")
23
+ # Compile and add to the zipper
24
+ def compile(props=@properties_hash, tabs=0, default_namespace="poolparty")
25
+ o = _compile(props, tabs, default_namespace)
26
+ ::Suitcase::Zipper.add(build_base_recipe_directory( default_namespace ), "chef/cookbooks")
27
+ o
28
+ end
29
+
30
+ def _compile(props=@properties_hash, tabs=0, default_namespace="poolparty")
6
31
  cld_name = default_namespace
7
32
  comp(cld_name, props, tabs)
8
33
  end
@@ -16,8 +41,8 @@ module PoolParty
16
41
  resources_to_string(props[:resources],tabs),
17
42
  services_to_string(props[:services],tabs)
18
43
  ].join("\n")
19
- ::File.open("#{basedir}/recipes/default.rb", "w+") {|f| f << default_recipe }
20
- ::Suitcase::Zipper.add(basedir, "chef/recipes/cookbooks")
44
+ ::File.open("#{basedir}/recipes/default.rb", "w+") {|f| f << default_recipe }
45
+
21
46
  default_recipe
22
47
  end
23
48
 
@@ -29,7 +54,7 @@ module PoolParty
29
54
  end
30
55
 
31
56
  def base_dir(nm=nil)
32
- @base_dir ||= "#{Default.tmp_path}/dr_configure/chef/recipes/#{nm}"
57
+ @base_dir ||= "#{Default.tmp_path}/trash/chef/cookbooks/#{nm}"
33
58
  end
34
59
 
35
60
  def options_to_string(opts,tabs=0)
@@ -45,6 +70,12 @@ module PoolParty
45
70
  handle_print_variables(vars)
46
71
  end
47
72
 
73
+ if opts[:chef_recipe]
74
+ opts.delete(:chef_recipe).each do |rcp|
75
+ out << "include_recipe #{to_option_string(rcp.name)}"
76
+ end
77
+ end
78
+
48
79
  if opts.has_key?(:line_in_file)
49
80
  lines = opts.delete(:line_in_file).inject([]) do |sum, l|
50
81
  sum << PoolParty::Resources::Exec.new(:name => l[:name], :command => PoolParty::Resources::LineInFile.command(l[:line], l[:file]) ).to_properties_hash
@@ -129,7 +160,7 @@ module PoolParty
129
160
  str = "\n#{tf(tabs)}# #{kname}\n"
130
161
  str << "#{tf(tabs+1)}"
131
162
  klassarray.each do |hsh|
132
- str << compile(hsh,tabs+1, klassname)
163
+ str << _compile(hsh,tabs+1, klassname)
133
164
  end
134
165
  str << "#{tf(tabs)}"
135
166
  end
@@ -183,9 +214,9 @@ module PoolParty
183
214
  nil
184
215
  when :if_not
185
216
  "not_if"
186
- when :notif
217
+ when :not_if
187
218
  "not_if"
188
- when :onlyif
219
+ when :only_if
189
220
  "only_if"
190
221
  else
191
222
  "#{key}"
@@ -1,16 +1,18 @@
1
1
  require "rubygems"
2
2
  require "json"
3
- require("#{::File.dirname(__FILE__)}/../../vendor/gems/dslify/lib/dslify")
3
+ require("#{::File.dirname(__FILE__)}/../../vendor/gems/dslify/lib/dslify") rescue( require 'dslify')
4
4
  require "#{::File.dirname(__FILE__)}/poolparty/default"
5
5
  require "#{::File.dirname(__FILE__)}/schema"
6
6
  require "#{::File.dirname(__FILE__)}/net/init"
7
7
  require "#{::File.dirname(__FILE__)}/exceptions/RemoteException.rb"
8
8
 
9
9
  module PoolParty
10
+ extend ::PoolParty::Remote
11
+
10
12
  def self.load_cloud_from_json(json_file_path=nil)
11
13
  json_file = json_file_path || PoolParty::Default.properties_hash_file
12
14
  PoolParty::Schema.new( ::File.read(json_file) ) rescue exit 1
13
- end
15
+ end
14
16
  end
15
17
 
16
18
  class String
@@ -85,9 +85,9 @@ module PoolParty
85
85
  # Use the keypair path
86
86
  def keypair(*args)
87
87
  if args && !args.empty?
88
- args.each {|arg| _keypairs.unshift Key.new(arg) }
88
+ args.each {|arg| _keypairs.unshift Key.new(arg) unless arg.nil? || arg.empty? }
89
89
  else
90
- _keypairs.select {|key| key.exists? }.first
90
+ @keypair ||= _keypairs.select {|key| key.exists? }.first
91
91
  end
92
92
  end
93
93
 
@@ -97,10 +97,19 @@ module PoolParty
97
97
  dsl_options[:keypairs] ||= [Key.new]
98
98
  end
99
99
 
100
- def full_keypair_path
100
+ def full_keypair_path
101
101
  @full_keypair_path ||= keypair.full_filepath
102
102
  end
103
103
 
104
+ def update_from_schema(schema)
105
+ keypairs = schema.options.delete(:keypairs).map {|a| PoolParty::Key.new(a.basename) }
106
+ options.merge! schema.options
107
+ dsl_options[:keypairs] = keypairs
108
+
109
+ dsl_options[:dependency_resolver] = schema.options.dependency_resolver.split("::")[-1].gsub(/Resolver/, '').preserved_class_constant("Resolver") rescue PoolParty::Chef
110
+
111
+ end
112
+
104
113
  # TODO: deprecate
105
114
  def number_of_resources
106
115
  arr = resources.map do |n, r|
@@ -16,10 +16,7 @@ module PoolParty
16
16
  #
17
17
  # For example usage, see lib/poolparty/plugins/line.rb
18
18
  def define_resource(name, &block)
19
- symc = "#{name}".camelcase
20
- klass = symc.class_constant(PoolParty::Resources::CustomResource, {:preserve => true}, &block)
21
- PoolParty::Resources.module_eval &block
22
- klass
19
+ name.to_s.new_resource_class(PoolParty::Resources::Resource, &block)
23
20
  end
24
21
 
25
22
  # Allow us to create virtual resources
@@ -3,36 +3,6 @@ require "ping"
3
3
  module PoolParty
4
4
  module Remote
5
5
 
6
- # TODO: Rename and modularize the @inst.status =~ /pending/ so that it works on all
7
- # remoter_bases
8
- def launch_instance!(o={}, &block)
9
- @inst = launch_new_instance!( o )
10
- wait "2.seconds"
11
- 500.times do |i|
12
- if @inst.status =~ /pending/
13
- sleep(2)
14
- @inst = describe_instance(@inst)
15
- end
16
- end
17
- when_instance_is_responding @inst do
18
- block.call(@inst) if block
19
- after_launch_instance(@inst)
20
- end
21
- @inst
22
- end
23
-
24
- # Called after an instance is launched
25
- def after_launch_instance(instance=nil)
26
- end
27
-
28
- def when_instance_is_responding(inst, &block)
29
- if ping_port(inst.ip, 22)
30
- block.call if block
31
- else
32
- raise "Instance not responding at #{inst.ip}"
33
- end
34
- end
35
-
36
6
  # A convenience method for waiting until there are no more
37
7
  # pending instances and then running the block
38
8
  def when_no_pending_instances(&block)
@@ -27,7 +27,7 @@ module PoolParty
27
27
  end
28
28
 
29
29
  def ssh_options(opts={})
30
- o = {"-i" => full_keypair_path,
30
+ o = {"-i" => keypair.full_filepath,
31
31
  "-l" => user,
32
32
  "-o" =>"StrictHostKeyChecking=no"
33
33
  }.merge(opts)
@@ -55,23 +55,24 @@ module PoolParty
55
55
  :host=>target_host, :user=>'root')
56
56
  # commands.each {|c| run_remote(c, target_host) }
57
57
  end
58
-
59
- def ping_port(host, port=22, retry_times=400)
58
+
59
+ def self.ping_port(host, port=22, retry_times=400)
60
60
  connected = false
61
61
  retry_times.times do |i|
62
62
  begin
63
- break if connected = TCPSocket.new(host, port).is_a?(TCPSocket)
63
+ break if connected = TCPSocket.new(host, port).is_a?(TCPSocket)
64
64
  rescue Exception => e
65
65
  sleep(2)
66
66
  end
67
67
  end
68
68
  connected
69
69
  end
70
+ def ping_port(ip, port, retry_times=500);self.class.ping_port(ip, port, retry_times);end
70
71
 
71
72
  def netssh(cmds=[], opts={})
72
73
  user = opts.delete(:user) || user #rescue 'root'
73
74
  host = opts.delete(:host) || target_host
74
- ssh_options_hash = {:keys => [full_keypair_path],
75
+ ssh_options_hash = {:keys => [keypair.full_filepath],
75
76
  :auth_methods => 'publickey',
76
77
  :paranoid => false
77
78
  }.merge(opts)
@@ -79,7 +80,7 @@ module PoolParty
79
80
  # Start the connection
80
81
  Net::SSH.start(host, user, ssh_options_hash) do |ssh|
81
82
  cmds.each do |command|
82
- ssh.exec!(command) do |ch, stream, data|
83
+ ssh.exec!(command) do |ch, stream, data|
83
84
  if stream == :stdout
84
85
  print data
85
86
  else
@@ -23,7 +23,7 @@ module PoolParty
23
23
  # This class is the base class for all remote types, such as ec2
24
24
  # Everything remoting-wise is derived from this class
25
25
  class RemoterBase
26
- include Remote
26
+ include ::PoolParty::Remote
27
27
 
28
28
  def initialize(prnt = nil)
29
29
  @parent = prnt
@@ -77,6 +77,50 @@ module PoolParty
77
77
  self.class.describe_instances(o ? options.merge(o) : options)
78
78
  end
79
79
 
80
+ # TODO: Rename and modularize the @inst.status =~ /pending/ so that it works on all
81
+ # remoter_bases
82
+ def self.launch_instance!(o={}, &block)
83
+ @inst = launch_new_instance!( o )
84
+ sleep(2)
85
+ 500.times do |i|
86
+ if @inst.status =~ /pending/
87
+ sleep(2)
88
+ @inst = describe_instance(@inst)
89
+ end
90
+ end
91
+ when_instance_is_responding @inst do
92
+ block.call(@inst) if block
93
+ after_launch_instance(@inst)
94
+ end
95
+ @inst
96
+ end
97
+ def launch_instance!(o={}, &block); self.class.launch_instance!(self.options.merge(o), &block);end
98
+
99
+ # Called after an instance is launched
100
+ def self.after_launch_instance(instance=nil);end
101
+
102
+ def self.when_instance_is_responding(inst, &block)
103
+ if ping_port(inst.ip, 22)
104
+ block.call if block
105
+ else
106
+ raise "Instance not responding at #{inst.ip}"
107
+ end
108
+ end
109
+ def when_instance_is_responding(inst, &block);self.class.when_instance_is_responding;end
110
+
111
+ # TODO: BAD FORM, already defined in connections.rb. Fix this, ASAP
112
+ def self.ping_port(host, port=22, retry_times=400)
113
+ connected = false
114
+ retry_times.times do |i|
115
+ begin
116
+ break if connected = TCPSocket.new(host, port).is_a?(TCPSocket)
117
+ rescue Exception => e
118
+ sleep(2)
119
+ end
120
+ end
121
+ connected
122
+ end
123
+
80
124
  # After launch callback
81
125
  # This is called after a new instance is launched
82
126
  def after_launched(force=false)
@@ -1,16 +1,15 @@
1
1
  require "tempfile"
2
+ # BIG TODO: Slim the place where the content is gathered from
2
3
  module PoolParty
3
4
  class ChefRecipe
4
5
  include Dslify
5
6
  end
6
7
  class Chef
8
+ define_resource :chef_recipe do
9
+ end
7
10
 
8
11
  plugin :chef do
9
- def before_load(o, &block)
10
- bootstrap_gems "chef", "ohai"
11
- bootstrap_commands [
12
- "mkdir -p /etc/chef/cookbooks /etc/chef/cache"
13
- ]
12
+ def before_load(o, &block)
14
13
  end
15
14
 
16
15
  def loaded o={}, &block
@@ -21,25 +20,29 @@ module PoolParty
21
20
  end
22
21
 
23
22
  def basedir
24
- @basedir ||= "#{Default.tmp_path}/dr_configure/chef/recipes/main"
23
+ @basedir ||= "#{Default.tmp_path}/dr_configure/chef/cookbooks/main"
25
24
  end
26
25
 
27
26
  def recipe file=nil, o={}, &block
28
27
  if file
28
+ file = ::File.expand_path(file)
29
29
  ::FileUtils.mkdir_p "#{basedir}/recipes" unless ::File.directory? basedir
30
-
30
+
31
31
  unless ::File.file?(file)
32
32
  tfile = Tempfile.new("main-poolparty-recipe")
33
33
  tfile << file # copy the string into the temp file
34
34
  file = tfile.path
35
35
  end
36
-
36
+
37
+ ::FileUtils.rm "#{basedir}/recipes/default.rb" if ::File.file?("#{basedir}/recipes/default.rb")
37
38
  ::File.cp file, "#{basedir}/recipes/default.rb"
38
39
 
39
40
  templates o[:templates] if o[:templates]
40
41
 
41
- recipe_files << basedir
42
+ # recipe_files << basedir
43
+ # ::Suitcase::Zipper.add(basedir, "chef/cookbooks")
42
44
  # TODO: Enable neat syntax from within poolparty
45
+
43
46
  else
44
47
  raise <<-EOR
45
48
  PoolParty currently only supports passing recipes as files. Please specify a file in your chef block and try again"
@@ -51,10 +54,11 @@ module PoolParty
51
54
  if templates
52
55
  ::FileUtils.mkdir_p "#{basedir}/templates/default/"
53
56
  templates.each do |f|
57
+ f = ::File.expand_path(f)
54
58
  if ::File.file?(f)
55
59
  ::File.cp f, "#{basedir}/templates/default/#{::File.basename(f)}"
56
60
  elsif ::File.directory?(f)
57
- Dir["#{f}/*"].each {|f| ::File.cp f, "#{basedir}/templates/default/#{::File.basename(f)}" }
61
+ Dir["#{f}/**"].each {|f| ::File.cp f, "#{basedir}/templates/default/#{::File.basename(f)}" }
58
62
  else
59
63
  tfile = Tempfile.new("main-poolparty-recipe")
60
64
  tfile << f # copy the string into the temp file
@@ -65,28 +69,25 @@ module PoolParty
65
69
  end
66
70
 
67
71
  def json file=nil, &block
68
- if @json_file
69
- @json_file
70
- else
71
- if file
72
- if ::File.file? file
73
- ::File.cp file, "#{Default.tmp_path}/dr_configure/dna.json"
74
- elsif file.is_a?(String)
75
- ::File.open("#{Default.tmp_path}/dr_configure/dna.json", "w+"){|tf| tf << file } # is really a string
76
- else
77
- raise <<-EOM
78
- Your json must either point to a file that exists or a string. Please check your configuration and try again
79
- EOM
80
- end
81
- @json_file = "#{Default.tmp_path}/dr_configure/dna.json"
72
+ if file
73
+ if ::File.file? file
74
+ ::Suitcase::Zipper.add_content_as(open(file).read, "dna.json", "chef")
75
+ elsif file.is_a?(String)
76
+ ::Suitcase::Zipper.add_content_as(file, "dna.json", "chef")
82
77
  else
83
- unless @recipe
84
- @recipe = ChefRecipe.new
85
- @recipe.instance_eval &block if block
86
- @recipe.recipes(recipe_files.empty? ? ["poolparty"] : ["poolparty", "main"])
87
- ::File.open("#{Default.tmp_path}/dr_configure/dna.json", "w+") {|f| f << @recipe.options.to_json }
88
- @json_file = "#{Default.tmp_path}/dr_configure/dna.json"
89
- end
78
+ raise <<-EOM
79
+ Your json must either point to a file that exists or a string. Please check your configuration and try again
80
+ EOM
81
+ end
82
+ else
83
+ unless @recipe
84
+ @recipe = ChefRecipe.new
85
+ @recipe.instance_eval &block if block
86
+ @recipe.recipes(recipe_files.empty? ? ["poolparty"] : ["poolparty", "main"])
87
+ # ::File.open("#{Default.tmp_path}/dr_configure/dna.json", "w+") {|f| f << @recipe.options.to_json }
88
+ ::Suitcase::Zipper.add_content_as(@recipe.options.to_json, "dna.json", "chef")
89
+
90
+ configure_commands ["cp -f /var/poolparty/dr_configure/chef/dna.json /etc/chef/dna.json"]
90
91
  end
91
92
  end
92
93
  end
@@ -94,37 +95,35 @@ module PoolParty
94
95
  def include_recipes *recps
95
96
  unless recps.empty?
96
97
  recps.each do |rcp|
97
- Dir[::File.expand_path(rcp)].each do |f|
98
- added_recipes << f
98
+ Dir[::File.expand_path(rcp)].each do |f|
99
+ ::Suitcase::Zipper.add(f, "chef/cookbooks")
99
100
  end
100
101
  end
101
102
  end
102
103
  end
103
104
 
104
105
  def config file=""
105
- if @config_file
106
- @config_file
106
+ if ::File.file? file
107
+ ::Suitcase::Zipper.add_content_as(open(file).read, "solo.rb", "chef")
107
108
  else
108
- if ::File.file? file
109
- @config_file = file
110
- else
111
- conf_string = if file.empty?
109
+ conf_string = if file.empty?
112
110
  # default config
113
- <<-EOE
111
+ <<-EOE
114
112
  cookbook_path "/etc/chef/cookbooks"
115
113
  node_path "/etc/chef/nodes"
116
114
  log_level :info
117
115
  file_store_path "/etc/chef"
118
116
  file_cache_path "/etc/chef"
119
- EOE
120
- else
121
- open(file).read
122
- end
123
- ::File.open("#{Default.tmp_path}/dr_configure/chef_config.rb", "w+") do |tf|
124
- tf << conf_string
125
- end
126
- @config_file = "#{Default.tmp_path}/dr_configure/chef_config.rb"
117
+ EOE
118
+ else
119
+ open(file).read
127
120
  end
121
+ # ::FileUtils.mkdir_p "#{Default.tmp_path}/trash" unless ::File.directory? "#{Default.tmp_path}/trash"
122
+ # ::File.open("#{Default.tmp_path}/trash/solo.rb", "w+") do |tf|
123
+ # tf << conf_string
124
+ # end
125
+ ::Suitcase::Zipper.add_content_as(conf_string, "solo.rb", "chef")
126
+ # ::Suitcase::Zipper.add("#{Default.tmp_path}/trash/solo.rb", "chef")
128
127
  end
129
128
  end
130
129
 
@@ -132,34 +131,24 @@ file_cache_path "/etc/chef"
132
131
  @added_recipes ||= []
133
132
  end
134
133
 
135
- def after_create
136
- before_configure
134
+ def before_bootstrap
135
+ puts "Called before_bootstrap in chef"
136
+ bootstrap_gems "chef", "ohai"
137
+ bootstrap_commands [
138
+ "mkdir -p /etc/chef/cookbooks /etc/chef/cache"
139
+ ]
137
140
  end
138
-
139
141
  def before_configure
142
+ puts "Calling before_configure in Chef (dir: #{::File.directory?("/etc/chef")})"
140
143
  config
141
144
  json
142
145
 
143
146
  if ::File.directory?("/etc/chef")
144
- ::Suitcase::Zipper.add("/etc/chef/cookbooks/*", "chef/recipes")
147
+ ::Suitcase::Zipper.add("/etc/chef/cookbooks/*", "chef/cookbooks")
145
148
  ::Suitcase::Zipper.add("/etc/chef/dna.json", "chef/json")
146
149
  ::Suitcase::Zipper.add("/etc/chef/solo.rb", "chef/")
147
150
  end
148
151
 
149
- ::Suitcase::Zipper.add(@config_file, "chef")
150
- added_recipes.each do |rcp|
151
- # ::FileUtils.cp_r rcp, "/tmp/poolparty/dr_configure/recipes/"
152
- ::Suitcase::Zipper.add(rcp, "chef/recipes")
153
- end
154
-
155
- ::Suitcase::Zipper.add(@json_file, "chef/json")
156
- configure_commands ["cp -f /var/poolparty/dr_configure/chef/json/dna.json /etc/chef/dna.json"]
157
-
158
- recipe_files.each do |rf|
159
- ::FileUtils.mkdir_p "/tmp/poolparty/dr_configure/recipes/#{::File.basename(rf)}"
160
- ::FileUtils.cp_r rf, "/tmp/poolparty/dr_configure/recipes/#{::File.basename(rf)}"
161
- # ::Suitcase::Zipper.add(rf, "chef/recipes")
162
- end
163
152
  end
164
153
 
165
154
  end
@@ -14,7 +14,7 @@ module PoolParty
14
14
 
15
15
  virtual_resource(:deploy_directory) do
16
16
 
17
- def loaded(opts={}, &block)
17
+ def loaded(opts={}, &block)
18
18
  package_deploy_directory
19
19
  add_unpack_directory
20
20
  end
@@ -30,6 +30,13 @@ module PoolParty
30
30
  not_if "test -f #{to}"
31
31
  command "cp -R /var/poolparty/dr_configure/user_directory/#{name}/* #{to}"
32
32
  end
33
+
34
+ if owner?
35
+ has_exec(:name => "chown-#{name}") do
36
+ command "chown #{owner} -R #{to}"
37
+ end
38
+ end
39
+
33
40
  end
34
41
 
35
42
  end
@@ -0,0 +1,31 @@
1
+ module PoolParty
2
+ class GempackageResource
3
+
4
+ virtual_resource(:gem_package) do
5
+
6
+ def loaded(opts={}, &block)
7
+ if download_url?
8
+ has_exec(
9
+ :name => "download-#{name}",
10
+ :cwd => Default.remote_storage_path,
11
+ :command => "wget #{download_url} -O #{name}.gem",
12
+ :if_not => "test -f #{Default.remote_storage_path}/#{name}.gem"
13
+ )
14
+ has_exec(
15
+ :name => "install-#{name}-gem",
16
+ :command => "gem install --no-ri --no-rdoc #{Default.remote_storage_path}/#{name}.gem",
17
+ :if_not => "gem list --local #{name} | grep #{name} #{"| grep #{version}" if version?}",
18
+ :requires => "download-#{name}"
19
+ )
20
+ else
21
+ has_exec(
22
+ :name => "#{name}",
23
+ :command => "gem install --no-ri --no-rdoc #{"--version #{version}" if version?} #{"--source #{source}" if source?} #{name}",
24
+ :if_not => "gem list --local #{name} | grep #{name} #{"| grep #{version}" if version?}"
25
+ )
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -6,8 +6,8 @@ module PoolParty
6
6
  attr_accessor :filepath
7
7
 
8
8
  # Create a new key that defaults to id_rsa as the name.
9
- def initialize(filepath=nil)
10
- @filepath = (filepath.nil? || filepath.empty?) ? "id_rsa" : filepath
9
+ def initialize(fpath=nil)
10
+ @filepath = (fpath.nil? || fpath.empty?) ? "id_rsa" : fpath
11
11
  end
12
12
 
13
13
  # If the full_filepath is nil, then the key doesn't exist
@@ -42,20 +42,23 @@ module PoolParty
42
42
  # then it returns nil and assumes we it doesn't exist
43
43
  def search_in_known_locations
44
44
  self.class.keypair_paths.each do |path|
45
- full_path = ::File.join( ::File.expand_path(path), filepath)
45
+ full_path = ::File.join( ::File.expand_path(path), ::File.basename(filepath))
46
46
  return full_path if ::File.exists?(full_path)
47
47
  end
48
+ # raise Exception.new("We cannot continue without a keypair. Please define a keypair in your clouds.rb")
49
+ # TODO: Add raise for keypair
48
50
  nil
49
51
  end
50
52
 
51
53
  # Default locations to search for the key
52
54
  def self.keypair_paths
53
- [ "#{ENV["HOME"]}/.ssh",
55
+ [
56
+ "#{ENV["HOME"]}/.ssh",
54
57
  "#{Default.poolparty_home_path}/keys",
55
- Default.base_keypair_path,
56
- Default.base_config_directory,
57
- Default.base_ssh_path,
58
- Default.remote_storage_path,
58
+ PoolParty::Default.base_keypair_path,
59
+ PoolParty::Default.base_config_directory,
60
+ PoolParty::Default.base_ssh_path,
61
+ PoolParty::Default.remote_storage_path,
59
62
  Dir.pwd
60
63
  ]
61
64
  end
@@ -59,7 +59,7 @@ module PoolParty
59
59
  end
60
60
 
61
61
  def self.inherited(subclass)
62
- method_name = subclass.to_s.top_level_class.gsub(/pool_party_/, '').gsub(/_class/, '').downcase.to_sym
62
+ method_name = subclass.to_s.top_level_class.gsub(/pool_party_/, '').gsub(/_class/, '').downcase.to_sym
63
63
  add_has_and_does_not_have_methods_for(method_name)
64
64
  end
65
65
 
@@ -4,7 +4,7 @@ module PoolParty
4
4
  module PluginModel
5
5
 
6
6
  def plugin(name=:plugin, cloud=nil, &block)
7
- plugins.has_key?(name) ? plugins[name] : (plugins[name] = PluginModel.new(name, &block))
7
+ plugins[name] ||= PluginModel.new(name, &block)
8
8
  end
9
9
  alias_method :register_plugin, :plugin
10
10
 
@@ -15,8 +15,8 @@ module PoolParty
15
15
  class PluginModel
16
16
  attr_accessor :klass
17
17
 
18
- def initialize(name,&block)
19
- symc = "#{name}".top_level_class.camelcase
18
+ def initialize(name,&block)
19
+ symc = "#{name}".top_level_class.camelcase
20
20
  klass = symc.class_constant(PoolParty::Plugin::Plugin, {:preserve => true}, &block)
21
21
 
22
22
  lowercase_class_name = symc.downcase
@@ -28,9 +28,9 @@ module PoolParty
28
28
  i = plugin_store.select {|i| i if i.class == #{lowercase_class_name.camelcase}Class }.first if plugin_store
29
29
  if i
30
30
  i
31
- else
31
+ else
32
32
  inst = #{lowercase_class_name.camelcase}Class.new(opts, parent, &block)
33
- this_context.plugin_store << inst if this_context
33
+ plugin_store << inst if plugin_store
34
34
  inst
35
35
  end
36
36
  end
@@ -18,7 +18,7 @@ module PoolParty
18
18
 
19
19
  meth = <<-EOM
20
20
  def __#{lowercase_class_name}(opts={}, &block)
21
- PoolParty::#{lowercase_class_name.camelcase}Class.new(opts, &block)
21
+ plugin_store << PoolParty::#{lowercase_class_name.camelcase}Class.new(opts, &block)
22
22
  end
23
23
  alias :#{lowercase_class_name} :__#{lowercase_class_name}
24
24
  EOM
@@ -29,6 +29,7 @@ module PoolParty
29
29
  activesupport
30
30
  grempe-amazon-ec2
31
31
  RubyInline
32
+ ohai
32
33
  chef
33
34
  auser-dslify
34
35
  auser-butterfly
@@ -45,7 +46,19 @@ module PoolParty
45
46
  })
46
47
  class <<self; attr_reader :defaults; end
47
48
 
48
- def initialize(host, opts={}, &block)
49
+ # In case the method is being called on ourself, let's check the
50
+ # defaults hash to see if it's available there
51
+ def method_missing(m,*a,&block)
52
+ if self.class.defaults.has_key?(m)
53
+ self.class.defaults[m]
54
+ elsif @cloud
55
+ @cloud.send m, *a, &block
56
+ else
57
+ super
58
+ end
59
+ end
60
+
61
+ def initialize(host, opts={}, &block)
49
62
  self.class.defaults.merge(opts).to_instance_variables(self)
50
63
  @target_host = host
51
64
  @cloud = opts[:cloud]
@@ -66,7 +79,7 @@ module PoolParty
66
79
 
67
80
  def pack_the_dependencies
68
81
  # Add the keypair to the instance... shudder
69
- ::Suitcase::Zipper.add(@cloud.keypair, "keys")
82
+ ::Suitcase::Zipper.add(keypair, "keys")
70
83
 
71
84
  # Use the locally built poolparty gem if it is availabl
72
85
  if edge_pp_gem = Dir["#{Default.vendor_path}/../pkg/*poolparty*gem"].pop
@@ -90,6 +103,7 @@ module PoolParty
90
103
 
91
104
  ::Suitcase::Zipper.add("#{::File.join(File.dirname(__FILE__), '..', 'templates', 'gemrc' )}", "etc/poolparty")
92
105
  ::Suitcase::Zipper.build_dir!("#{Default.tmp_path}/dependencies")
106
+ ::Suitcase::Zipper.flush!
93
107
 
94
108
  # ::FileUtils.rm_rf "#{Default.tmp_path}/trash"
95
109
  end
@@ -5,15 +5,18 @@ module PoolParty
5
5
  def self.commands
6
6
  [
7
7
  "mkdir -p /etc/chef/cookbooks /etc/chef/cache",
8
- "cp -R /var/poolparty/dr_configure/chef/recipes/* /etc/chef/cookbooks",
9
- "cp /var/poolparty/dr_configure/chef_config.rb /etc/chef/solo.rb",
8
+ "cp -R /var/poolparty/dr_configure/chef/cookbooks/* /etc/chef/cookbooks",
9
+ "cp /var/poolparty/dr_configure/chef/solo.rb /etc/chef/solo.rb",
10
+ "cp /var/poolparty/dr_configure/chef/dna.json /etc/chef/dna.json",
10
11
  "/usr/bin/chef-solo -c /etc/chef/solo.rb -j /etc/chef/dna.json"
11
12
  ]
12
13
  end
13
14
  def self.files_to_upload
14
15
  [
15
- "#{Default.tmp_path}/chef_config.rb",
16
- "#{Default.tmp_path}/dna.json"
16
+ "#{Default.tmp_path}/dr_configure/chef/solo.rb",
17
+ "#{Default.tmp_path}/dr_configure/chef/dna.json",
18
+ "#{Default.base_config_directory}/chef/solo.rb",
19
+ "#{Default.base_config_directory}/chef/dna.json"
17
20
  ]
18
21
  end
19
22
  end
@@ -17,13 +17,27 @@ module PoolParty
17
17
  :dependency_resolver => 'chef'
18
18
  })
19
19
  end
20
-
21
- attr_accessor :full_keypair_path
20
+
21
+ # In case the method is being called on ourself, let's check the
22
+ # defaults hash to see if it's available there
23
+ def method_missing(m,*a,&block)
24
+ if self.class.defaults.has_key?(m)
25
+ self.class.defaults[m]
26
+ elsif @cloud
27
+ @cloud.send m, *a, &block
28
+ else
29
+ super
30
+ end
31
+ end
32
+
33
+ attr_reader :cloud, :keypair
34
+
22
35
  def initialize(host, opts={}, &block)
23
36
  self.class.defaults.merge(opts).to_instance_variables(self)
24
37
  @target_host = host
25
38
  @configurator = "::PoolParty::Provision::#{dependency_resolver.capitalize}".constantize
26
39
  @cloud = opts[:cloud]
40
+ @keypair = @cloud.keypair
27
41
 
28
42
  @cloud.call_before_configure_callbacks if @cloud
29
43
  prescribe_configuration
@@ -31,11 +45,12 @@ module PoolParty
31
45
  end
32
46
 
33
47
  def prescribe_configuration
48
+ ::FileUtils.mkdir_p "#{Default.tmp_path}/dr_configure" unless ::File.directory?("#{Default.tmp_path}/dr_configure")
34
49
  ::File.cp $pool_specfile, "#{Default.tmp_path}/dr_configure/clouds.rb"
35
50
  ::File.open "#{Default.tmp_path}/dr_configure/clouds.json", "w" do |f|
36
51
  f << cloud.to_properties_hash.to_json
37
52
  end
38
-
53
+
39
54
  setup_configurator
40
55
  write_erlang_cookie
41
56
  @configurator.files_to_upload.each {|f| ::FileUtils.cp f, "#{Default.tmp_path}/dr_configure/#{::File.basename(f)}" if ::File.file?(f) }
@@ -47,13 +62,13 @@ module PoolParty
47
62
  'chmod 600 /var/poolparty/dr_configure/clouds.rb',
48
63
  'cp -f /var/poolparty/dr_configure/clouds.json /etc/poolparty',
49
64
  'cp /var/poolparty/dr_configure/clouds.rb /etc/poolparty',
50
- 'cp /var/poolparty/dr_configure/erlang.cookie /root/.erlang.cookie',
65
+ 'cp /var/poolparty/dr_configure/erlang.cookie /root/.erlang.cookie',
51
66
  'ruby /var/poolparty/dr_configure/erlang_cookie_maker',
52
67
  "touch /var/poolparty/POOLPARTY.PROGRESS",
53
68
  'echo "configure" >> /var/poolparty/POOLPARTY.PROGRESS'
54
69
  ]
55
70
  commands << self.class.class_commands unless self.class.class_commands.empty?
56
- commands << @configurator.commands
71
+ commands << @configurator.commands
57
72
  end
58
73
 
59
74
  def pack_up_and_ship_off_suitcase
@@ -65,7 +80,6 @@ module PoolParty
65
80
  def setup_configurator
66
81
  # @cloud.write_properties_hash("#{Default.tmp_path}/properties_hash.rb")
67
82
  #TODO: move to puppet class
68
- puts "writting new config file"
69
83
  @cloud.build_and_store_new_config_file("#{Default.tmp_path}/dr_configure/poolparty.pp")
70
84
  # Neighborhoods.clump(@cloud.remote_instances_list, "#{Default.tmp_path}/neighborhood.json")
71
85
  end
@@ -40,6 +40,23 @@ module PoolParty
40
40
  @hsh.send(sym, *args, &block)
41
41
  end
42
42
  end
43
+
44
+ def to_cloud(node={})
45
+ require "ostruct"
46
+
47
+ $pool_specfile = "/etc/poolparty/clouds.rb"
48
+
49
+ remoter_base = PoolParty::Remote.module_eval(options.remote_base.split('::')[-1].camelcase)
50
+ # TODO: Seriously, make this sexier
51
+
52
+ cld = OpenStruct.new(options)
53
+ cld.keypair = ::PoolParty::Key.new("/etc/poolparty/#{node[:keypair]}")
54
+ cld.remoter_base = remoter_base
55
+ cld.build_and_store_new_config_file = "/etc/poolparty/clouds.json"
56
+ cld.dependency_resolver = PoolParty.module_eval(options.dependency_resolver.split("::")[-1].camelcase).send(:new)
57
+
58
+ cld
59
+ end
43
60
  end
44
61
  end
45
62
  # class Hash
@@ -31,6 +31,6 @@ listen <%= @node[:poolparty][:haproxy_name] %>
31
31
  mode <%= @node[:poolparty][:proxy_mode] %>
32
32
  bind 0.0.0.0:<%= @node[:poolparty][:ports_haproxy].join(",0.0.0.0:") %>
33
33
  cookie POOLPARTYPARTY
34
- <% %x[/usr/bin/server-list-active ip].split("\t").each_with_index do |ip, index| %>
34
+ <% %x[/usr/bin/server-list-active internal_ip].split("\t").each_with_index do |ip, index| %>
35
35
  server <%= index == 0 ? "master" : "node#{index}" %> <%= ip %>:<%= @node[:poolparty][:forwarding_port] %> weight 1 check cookie
36
36
  <% end %>
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 0
4
- :patch: 4
4
+ :patch: 5
@@ -30,15 +30,15 @@ module Suitcase
30
30
  def self.build_dir!(dirpath)
31
31
  ::FileUtils.mkdir_p dirpath unless ::File.directory? dirpath
32
32
  items.each do |name, path|
33
- if name == :string
33
+ if name.to_s =~ /string/
34
34
  fpath = "#{dirpath}/#{path[:namespace]}/#{path[:name]}"
35
35
  ensure_location_exists(::File.dirname(fpath))
36
36
  ::File.open(fpath, "w+") do |tf|
37
37
  tf << path[:content]
38
38
  end
39
- else
39
+ else
40
40
  end_path = "#{dirpath}/#{name}"
41
- ::FileUtils.mkdir_p ::File.dirname(end_path) unless ::File.directory? ::File.dirname(end_path) unless name == ::File.basename(name)
41
+ ::FileUtils.mkdir_p ::File.dirname(end_path) unless ::File.directory? ::File.dirname(end_path) unless name == ::File.basename(name)
42
42
  ::FileUtils.cp path, end_path
43
43
  end
44
44
  end
@@ -112,7 +112,7 @@ module Suitcase
112
112
  end
113
113
 
114
114
  def self.add_content_as(content="", filename="", namespace="files")
115
- items.merge!({:string => {:name => ::File.basename(filename), :content => content, :namespace => namespace}})
115
+ items.merge!({"string_#{filename}_#{namespace}".to_sym => {:name => ::File.basename(filename), :content => content, :namespace => namespace}})
116
116
  end
117
117
 
118
118
  end
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{suitcase}
5
- s.version = "0.0.4"
5
+ s.version = "0.0.5"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Ari Lerner"]
9
- s.date = %q{2009-04-14}
9
+ s.date = %q{2009-04-16}
10
10
  s.email = %q{arilerner@mac.com}
11
11
  s.extra_rdoc_files = ["README.rdoc", "LICENSE"]
12
12
  s.files = ["README.rdoc", "VERSION.yml", "lib/suitcase", "lib/suitcase/unzipper.rb", "lib/suitcase/zipper.rb", "lib/suitcase.rb", "test/suitcase_test.rb", "test/test_dir", "test/test_dir/box.rb", "test/test_dir/test.txt", "test/test_helper.rb", "LICENSE"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: auser-poolparty
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
4
+ version: 1.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ari Lerner
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-15 00:00:00 -07:00
12
+ date: 2009-04-16 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -369,7 +369,8 @@ files:
369
369
  - lib/poolparty/net/remoter_bases/ec2/ec2_response_object.rb
370
370
  - lib/poolparty/plugins
371
371
  - lib/poolparty/plugins/chef.rb
372
- - lib/poolparty/plugins/deploydirectory.rb
372
+ - lib/poolparty/plugins/deploy_directory.rb
373
+ - lib/poolparty/plugins/gem_package.rb
373
374
  - lib/poolparty/plugins/git.rb
374
375
  - lib/poolparty/plugins/line_in_file.rb
375
376
  - lib/poolparty/plugins/rsyncmirror.rb
@@ -414,7 +415,6 @@ files:
414
415
  - lib/poolparty/schema.rb
415
416
  - lib/poolparty/services
416
417
  - lib/poolparty/services/conditional.rb
417
- - lib/poolparty/services/gem_package.rb
418
418
  - lib/poolparty/spec
419
419
  - lib/poolparty/spec/core
420
420
  - lib/poolparty/spec/core/string.rb
@@ -1,52 +0,0 @@
1
- module PoolParty
2
- # module Resources
3
-
4
- class Gempackage < Service
5
-
6
- # When we call gempackage, we want the exec to run on the directory we suggest
7
- # we also only want it to run if there is NOT a local gem already installed with
8
- # the package details (version and name)
9
- #
10
- # TODO: Add it so that it tries to pull the gem off the master fileserver first...
11
- def loaded(opts={})
12
- if download_url
13
-
14
- case_of "hostname"
15
- when_is "master" do
16
- has_exec(:name => "download-#{name}", :cwd => Default.remote_storage_path, :command => "wget #{download_url} -O #{name}.gem", :ifnot => "test -f #{Default.remote_storage_path}/#{name}.gem")
17
- end
18
- end_of
19
-
20
- has_file({
21
- :name => "#{Default.remote_storage_path}/#{name}.gem",
22
- :source => "#{Base.fileserver_base}/#{name}.gem",
23
- :requires => get_host("master")
24
- })
25
-
26
- has_exec(opts.merge({:name => "#{name}", :cwd =>"#{Default.remote_storage_path}"})) do
27
- command "gem install --no-ri --no-rdoc #{Default.remote_storage_path}/#{name}.gem"
28
- ifnot "gem list --local #{name} | grep #{name} #{"| grep #{version}" if version}"
29
- requires get_file("#{Default.remote_storage_path}/#{name}.gem")
30
- end
31
-
32
- else
33
- has_exec(opts.merge({:name => "#{name}", :cwd => "/tmp", :path => "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/var/lib/gems/1.8/bin"})) do
34
- command "gem install --no-ri --no-rdoc #{"--version #{version}" if version} #{"--source #{source}" if source} #{name}"
35
- ifnot "gem list --local #{name} | grep #{name} #{"| grep #{version}" if version}"
36
- end
37
- end
38
- end
39
- def virtual_resource?
40
- true
41
- end
42
- def printable?
43
- true
44
- end
45
- def class_type_name
46
- "Exec"
47
- end
48
-
49
- end
50
-
51
- # end
52
- end