poolparty 1.6.8 → 1.6.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -12,12 +12,17 @@ module CloudProviders
12
12
  options =
13
13
  if group_name
14
14
  puts "Authorizing #{name} for group named: #{group_name} of owner id: #{owner_id}"
15
- {:authorize_security_group_ingress => group_name, :source_security_group_owner_id => owner_id}
15
+ {:group_name => name, :source_security_group_name=> group_name, :source_security_group_owner_id => owner_id}
16
16
  else
17
17
  puts "Authorizing: #{name} for #{protocol} to #{from_port}:#{to_port} #{network}"
18
18
  to_hash
19
19
  end
20
- ec2.authorize_security_group_ingress(options) rescue nil
20
+ begin
21
+ ec2.authorize_security_group_ingress(options)
22
+ rescue AWS::InvalidPermissionDuplicate => e
23
+ nil
24
+ end
25
+
21
26
  end
22
27
 
23
28
  def to_hash
@@ -35,4 +40,4 @@ module CloudProviders
35
40
  end
36
41
 
37
42
  end
38
- end
43
+ end
@@ -321,13 +321,14 @@ module CloudProviders
321
321
  :measure => :cpu,
322
322
  :period => 60,
323
323
  :statistic => :average,
324
- :unit => "Seconds",
324
+ :unit => "Percent",
325
325
  :lower_threshold => 20,
326
326
  :upper_threshold => 60,
327
327
  :trigger_name => "CpuTrigger",
328
328
  :lower_breach_scale_increment => -1,
329
329
  :upper_breach_scale_increment => 1,
330
- :breach_duration => 120
330
+ :breach_duration => 120,
331
+ :namespace => 'AWS/EC2'
331
332
  )
332
333
 
333
334
  def measure_names
@@ -392,7 +393,8 @@ module CloudProviders
392
393
  :breach_duration => trigger["BreachDuration"],
393
394
  :dimensions => trigger["Dimensions"],
394
395
  :unit => trigger["Unit"],
395
- :autoscaling_group_name => trigger["AutoScalingGroupName"]
396
+ :autoscaling_group_name => trigger["AutoScalingGroupName"],
397
+ :namespace => trigger['Namespace']
396
398
  }
397
399
  end
398
400
  rescue Exception => e
@@ -412,7 +414,8 @@ module CloudProviders
412
414
  :lower_threshold => "#{lower_threshold}",
413
415
  :lower_breach_scale_increment => "#{lower_breach_scale_increment}",
414
416
  :upper_threshold => "#{upper_threshold}",
415
- :upper_breach_scale_increment => "#{upper_breach_scale_increment}"
417
+ :upper_breach_scale_increment => "#{upper_breach_scale_increment}",
418
+ :namespace => namespace
416
419
  )
417
420
  end
418
421
 
@@ -7,8 +7,8 @@ module CloudProviders
7
7
  :to_port => "22",
8
8
  :cidr_ip => "0.0.0.0/0"})
9
9
  def run
10
- puts "Revoking: #{cloud.proper_name} for #{protocol} to #{from_port}:#{to_port} #{network}"
11
- options = { :group_name => cloud.proper_name,
10
+ puts "Revoking: #{name} for #{protocol} to #{from_port}:#{to_port} #{network}"
11
+ options = { :group_name => name,
12
12
  :ip_protocol => protocol,
13
13
  :from_port => from_port,
14
14
  :to_port => to_port,
@@ -16,9 +16,9 @@ module CloudProviders
16
16
 
17
17
  ec2.revoke_security_group_ingress(options) rescue nil
18
18
  end
19
-
19
+
20
20
  alias :network :cidr_ip
21
-
21
+
22
22
  end
23
23
 
24
- end
24
+ end
@@ -1,57 +1,54 @@
1
1
  module CloudProviders
2
2
  class SecurityGroup < Ec2Helper
3
-
3
+
4
4
  def run
5
5
  if should_create_security_group?
6
6
  create_security_group!
7
7
  end
8
- current_security_groups = security_groups.map {|a|
8
+ current_security_groups = security_groups.map {|a|
9
+ # Example:
10
+ # [{ :ip_permissions=>[
11
+ # {:ip_ranges=>[{:cidr_ip=>"0.0.0.0/0"}], :from_port=>"22", :protocol=>"tcp", :to_port=>"22"},
12
+ # {:ip_ranges=>[{:cidr_ip=>"0.0.0.0/0"}], :from_port=>"80", :protocol=>"tcp", :to_port=>"80"} ],
13
+ # :description=>"PoolParty generated security group: clyde-chefclient", :name=>"clyde-chefclient"}]
14
+ #
9
15
  a[:ip_permissions].map do |perm|
10
16
  if perm[:group_name]
11
17
  {
12
18
  :group_name => perm[:group_name]
13
19
  }
14
20
  else
15
- if perm[:ip_ranges].size > 1
16
- perm[:ip_ranges].map do |range|
17
- {
18
- :group_name => a[:name],
19
- :from_port => perm[:from_port],
20
- :to_port => perm[:to_port],
21
- :cidr_ip => range,
22
- :ip_protocol => perm[:protocol]
23
- }.flatten
24
- end.flatten
25
- else
21
+ (perm[:ip_ranges] || ["0.0.0.0/0"]).map do |range|
22
+ range = range[:cidr_ip] if range.is_a?(Hash)
26
23
  {
27
- :group_name => a[:name],
28
- :from_port => perm[:from_port],
29
- :to_port => perm[:to_port],
30
- :cidr_ip => perm[:ip_ranges].map {|c| c[:cidrIp] }.first, # first for simplicity for now...
24
+ :group_name => a[:name],
25
+ :from_port => perm[:from_port].to_i,
26
+ :to_port => perm[:to_port].to_i,
27
+ :cidr_ip => range,
31
28
  :ip_protocol => perm[:protocol]
32
29
  }
33
- end
30
+ end.flatten
34
31
  end
35
32
  end.flatten
36
33
  }.flatten
37
-
38
- authorizers = []
39
- authorizes.each do |a|
40
- unless current_security_groups.include?(a.to_hash)
41
- authorizers << a
42
- end
34
+
35
+ authorizes_requested = authorizes.select{|a| a.name == name }
36
+ authorizes_requested_hashes = authorizes_requested.map{|a| a.to_hash}
37
+ authorizes_needed = []
38
+
39
+ # take each requested authorization. If it doesn't exist in the current_security_groups, we need to add it.
40
+ authorizes_requested.each do |a|
41
+ authorizes_needed << a unless current_security_groups.include?(a.to_hash)
43
42
  end
44
-
45
- defined_security_group_hashes = authorizes.map {|a| a.to_hash}
46
-
43
+ # conversely, every current_security_groups authorization that isn't in the authorizes_requested list must be revoked
47
44
  current_security_groups.each do |hsh|
48
- unless defined_security_group_hashes.include?(hsh)
45
+ unless authorizes_requested_hashes.include?(hsh)
49
46
  revoke(hsh.merge(:protocol => hsh[:ip_protocol]))
50
47
  end
51
48
  end
52
-
49
+
53
50
  revokes.each {|r| r.run }
54
- authorizers.each {|a| a.run}
51
+ authorizes_needed.each {|a| a.run}
55
52
  end
56
53
  def authorize(o={}, &block)
57
54
  authorizes << Authorize.new("#{name}", o.merge(:parent => parent, :cloud => cloud), &block)
@@ -82,7 +79,7 @@ module CloudProviders
82
79
  :to_port => i["toPort"],
83
80
  :ip_ranges => ip_ranges["item"].map do |ip|
84
81
  {
85
- :cidrIp => ip["cidrIp"]
82
+ :cidr_ip => ip["cidrIp"]
86
83
  }
87
84
  end
88
85
  }
@@ -101,4 +98,4 @@ module CloudProviders
101
98
  end
102
99
  end
103
100
 
104
- end
101
+ end
@@ -0,0 +1,162 @@
1
+ =begin rdoc
2
+ Remote instances
3
+ =end
4
+ module CloudProviders
5
+ class RemoteInstance
6
+ include Dslify, Connections
7
+
8
+ attr_reader :name, :init_opts, :raw_response
9
+ attr_accessor :cloud_provider
10
+
11
+ default_options(
12
+ :instance_id => nil,
13
+ :image_id => nil,
14
+ :status => nil
15
+ )
16
+
17
+ def initialize(init_opts={}, &block)
18
+ @init_opts = init_opts
19
+ set_vars_from_options(init_opts)
20
+ instance_eval &block if block
21
+ after_initialized
22
+ end
23
+
24
+ def keypair(n=nil)
25
+ @keypair ||= n.nil? ? nil : Keypair.new(n)
26
+ end
27
+
28
+ def after_initialized
29
+ end
30
+
31
+ def accessible?
32
+ ping_port(public_ip, 22, 40)
33
+ end
34
+
35
+ def rsync_dir(dir)
36
+ rsync :source => dir/"*", :destination => "/"
37
+ end
38
+
39
+ def chef_bootstrapped?
40
+ # do_sudo is false cause we want to capture the return code of the call
41
+ @chef_bootstrapped ||= cloud.chef.node_bootsrapped?(self)
42
+ end
43
+
44
+ def bootstrap_chef!
45
+ <<<<<<< HEAD:lib/cloud_providers/remote_instance.rb
46
+ unless chef_bootstrapped?
47
+ ssh([
48
+ 'apt-get update',
49
+ 'apt-get autoremove -y',
50
+ 'apt-get install -y ruby ruby-dev rubygems git-core libopenssl-ruby',
51
+ 'gem sources -a http://gems.opscode.com',
52
+ 'gem install chef ohai --no-rdoc --no-ri' ])
53
+ end
54
+ if bootstrap_gems.size > 0
55
+ ssh(bootstrap_gems.collect { |gem| "gem install #{gem} --no-rdoc --no-ri" } )
56
+ end
57
+ end
58
+
59
+ def run_chef!
60
+ if ENV["CHEF_DEBUG"]
61
+ debug = "-l debug"
62
+ else
63
+ debug = ""
64
+ end
65
+ chef_solo_cmd = <<-CMD
66
+ $GEM_BIN/chef-solo -j /etc/chef/dna.json -c /etc/chef/solo.rb #{debug}
67
+ CMD
68
+ envhash = {
69
+ :GEM_BIN => %q%$(gem env | grep "EXECUTABLE DIRECTORY" | awk "{print \\$4}")%
70
+ }
71
+ ssh([chef_solo_cmd.strip.squeeze(' ')], :env => envhash )
72
+ =======
73
+ cloud.chef.node_bootstrap(self) unless chef_bootstrapped?
74
+ end
75
+
76
+ def run_chef!
77
+ cloud.chef.node_run!(self)
78
+ >>>>>>> 81a7e0df2d02545ff9b22572194a4f115f73906a:lib/cloud_providers/remote_instance.rb
79
+ end
80
+
81
+ def run
82
+ warn "#{self.class} does not implement run. Something is wrong"
83
+ end
84
+
85
+ def default_keypair_path
86
+ self.class.default_keypair_path
87
+ end
88
+
89
+ ## provide hash like methods to access and iterate over node attributes
90
+ def each
91
+ dsl_options.each{ |k,v| yield k,v }
92
+ end
93
+
94
+ def [](k)
95
+ if dsl_options.has_key? k
96
+ dsl_options[k]
97
+ else
98
+ nil
99
+ end
100
+ end
101
+
102
+ def []=(k,v)
103
+ dsl_options[k] = v
104
+ end
105
+
106
+ def has_key?(key)
107
+ dsl_options.has_key?(key)
108
+ end
109
+
110
+ def keys
111
+ dsl_options.keys
112
+ end
113
+
114
+ def values
115
+ dsl_options.values
116
+ end
117
+
118
+ def to_hash
119
+ dsl_options
120
+ end
121
+ ##end of hash like methods
122
+
123
+ # Is this instance running?
124
+ def running?
125
+ !(status =~ /running/).nil?
126
+ end
127
+ # Is this instance pending?
128
+ def pending?
129
+ !(status =~ /pending/).nil?
130
+ end
131
+ # Is this instance terminating?
132
+ def terminating?
133
+ !(status =~ /shutting/).nil?
134
+ end
135
+ # Has this instance been terminated?
136
+ def terminated?
137
+ !(status =~ /terminated/).nil?
138
+ end
139
+
140
+ # elapsed seconds since node launch time
141
+ def elapsed_runtime
142
+ Time.now - Time.parse(launch_time)
143
+ end
144
+
145
+ def ssh_available?
146
+ warn "Implemented in cloudprovider instance class. something is wrong"
147
+ end
148
+ # def to_s
149
+ # (cloud ? to_hash.merge(:cloud=>cloud.name) : to_hash)
150
+ # end
151
+
152
+ private
153
+ def cloud
154
+ init_opts.has_key?(:cloud) ? init_opts[:cloud] : nil
155
+ end
156
+
157
+ def cloud_provider
158
+ cloud.cloud_provider
159
+ end
160
+
161
+ end
162
+ end
@@ -13,6 +13,21 @@ class Object
13
13
  puts line
14
14
  end
15
15
  end
16
+
17
+ # === Description
18
+ #
19
+ # Change +attr+ to +val+ within the scope of block
20
+ # and then sets it back again
21
+ #
22
+ def change_attr attr, val, &block
23
+ old_val = instance_variable_get attr
24
+ begin
25
+ instance_variable_set attr, val
26
+ yield
27
+ ensure
28
+ instance_variable_set attr, old_val
29
+ end
30
+ end
16
31
 
17
32
  def progress_bar_until(msg=nil, &block)
18
33
  print "#{msg}" if msg
@@ -30,4 +45,4 @@ class Object
30
45
  end
31
46
 
32
47
 
33
- end
48
+ end
@@ -2,7 +2,7 @@
2
2
  ssh key used to login to remote instances\
3
3
  =end
4
4
  class Keypair
5
-
5
+
6
6
  include SearchablePaths
7
7
  has_searchable_paths(:prepend_paths => [Dir.pwd, '/etc/poolparty/keys', "#{ENV["HOME"]}/.ssh/", "#{ENV["HOME"]}/.ec2/", ENV['EC2_CONFIG_DIR']])
8
8
 
@@ -12,37 +12,37 @@ class Keypair
12
12
  attr_accessor :filepath
13
13
  attr_reader :extra_paths, :opts
14
14
  attr_reader :search_suffixes
15
-
16
- # Create a new key that defaults to id_rsa as the name.
15
+
16
+ # Create a new key that defaults to id_rsa as the name.
17
17
  def initialize(fpath, extra_paths=[], opts={})
18
18
  @filepath = fpath
19
19
  @opts = opts
20
20
  @extra_paths = extra_paths.map {|a| File.expand_path(a) }
21
21
  @search_suffixes = SEARCH_SUFFIXES
22
22
  end
23
-
23
+
24
24
  # If the full_filepath is nil or false, then the key doesn't exist
25
25
  def exists?
26
26
  !! full_filepath
27
27
  end
28
-
28
+
29
29
  # Read the content of the key
30
30
  def content
31
31
  @content ||= exists? ? open(full_filepath).read : nil
32
32
  end
33
-
33
+
34
34
  # Returns the full_filepath of the key. If a full filepath is passed, we just return the expanded filepath
35
35
  # for the keypair, otherwise query where it is against known locations
36
36
  def full_filepath
37
- @full_filepath ||=
38
- find_file_in_path_with_suffix(filepath, extra_paths,
37
+ @full_filepath ||=
38
+ find_file_in_path_with_suffix(filepath, extra_paths,
39
39
  search_suffixes) || false
40
40
  end
41
-
41
+
42
42
  def to_s
43
43
  basename
44
44
  end
45
-
45
+
46
46
  #TODO: gracefully handle the case when a passpharase is needed
47
47
  # Generate a public key from the private key
48
48
  # net/ssh already has this built-in from our extension.
@@ -54,21 +54,21 @@ class Keypair
54
54
  @public_key_string
55
55
  end
56
56
  end
57
-
57
+
58
58
  def public_key=(str)
59
59
  @public_key_string = str
60
60
  end
61
-
61
+
62
62
  # Basename of the keypair
63
63
  def basename
64
64
  @basename ||= ::File.basename(filepath, ::File.extname(filepath))
65
65
  end
66
-
66
+
67
67
  # Just the filename of the keypair
68
68
  def filename
69
69
  @filename ||= ::File.basename(full_filepath) rescue filepath
70
70
  end
71
-
71
+
72
72
  # Support to add the enumerable each to keys
73
73
  def each
74
74
  yield full_filepath
@@ -80,19 +80,19 @@ class Keypair
80
80
  def valid?
81
81
  validations.each {|validation| self.send(validation.to_sym) }
82
82
  end
83
-
83
+
84
84
  private
85
-
85
+
86
86
  # Validations
87
87
  def validations
88
88
  [:keypair_found?, :has_proper_permissions?]
89
89
  end
90
-
90
+
91
91
  # Check the proper permissions
92
92
  def has_proper_permissions?
93
93
  perm_truth = [:readable?, :writable?, :executable?].map {|meth| File.send(meth, full_filepath)} == [true, true, false]
94
94
  raise StandardError.new("Your keypair #{full_filepath} has improper file permissions. Keypairs must be 0600 permission. Please chmod your keypair file and try again") unless perm_truth
95
- end
95
+ end
96
96
  def keypair_found?
97
97
  if exists?
98
98
  true
@@ -103,10 +103,10 @@ class Keypair
103
103
 
104
104
  # try filename with suffix and without suffixes.
105
105
  # Checks all paths without suffix first, then try all paths for all suffixes.
106
- def find_file_in_path_with_suffix(file, extra_paths, suffixes=[],
106
+ def find_file_in_path_with_suffix(file, extra_paths, suffixes=[],
107
107
  try_wo_suffix=true)
108
108
  suffixes_to_try = suffixes.dup
109
- suffixes_to_try.unshift '' if try_wo_suffix
109
+ suffixes_to_try.push '' if try_wo_suffix
110
110
 
111
111
  suffixes_to_try.map {|s| file + s }.each do |suffixed|
112
112
  fullpath = if File.file?(File.expand_path(suffixed))
@@ -119,5 +119,5 @@ class Keypair
119
119
 
120
120
  nil
121
121
  end
122
-
122
+
123
123
  end