awsome 0.0.17 → 0.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/bin/awsome CHANGED
@@ -20,8 +20,9 @@ OptionParser.new do |opts|
20
20
  end
21
21
  end.parse!
22
22
 
23
- instances = Awsome::Ec2.describe_instances('instance-state-name' => 'running')
24
23
  requirements = Awsome::Requirements.from_yaml_file(requirements_file)
24
+ filters = {'instance-state-name' => 'running'}.merge(requirements.filters)
25
+ instances = Awsome::Ec2.describe_instances(filters)
25
26
  matchmaker = Awsome::Matchmaker.new(instances, requirements)
26
27
  executor = Awsome::Executor.new(matchmaker.matches)
27
28
 
@@ -47,6 +47,12 @@ module Awsome
47
47
  Awsome::Ec2::Instance.new(Awsome.execute(cmd, columns: @@run_instance_fields, filter: /^INSTANCE/).first)
48
48
  end
49
49
 
50
+ def self.create_tags(resource_id, tags)
51
+ tags = tags.collect { |k, v| v ? "--tag #{k}=#{v}" : "--tag #{k}" }
52
+ cmd = command('ec2-create-tags', resource_id, *tags)
53
+ Awsome.execute(cmd)
54
+ end
55
+
50
56
  @@describe_instance_fields = %w(
51
57
  reservation_identifier
52
58
  reservation_id
@@ -76,6 +76,10 @@ module Awsome
76
76
  Awsome::Ec2.terminate_instances(@properties['instance_id'])
77
77
  end
78
78
 
79
+ def create_tags(tags)
80
+ Awsome::Ec2.create_tags(@properties['instance_id'], tags)
81
+ end
82
+
79
83
  private
80
84
  def reload!
81
85
  instance = Awsome::Ec2.describe_instances('instance-id' => @properties['instance_id']).first
@@ -16,6 +16,7 @@ module Awsome
16
16
 
17
17
  run
18
18
  wait_for_ssh
19
+ tag_instances
19
20
  reattach_volumes
20
21
  deploy
21
22
  terminate
@@ -46,6 +47,12 @@ module Awsome
46
47
  end
47
48
  end
48
49
 
50
+ def tag_instances
51
+ instances_to_use do |instance, requirement|
52
+ instance.create_tags(requirement.tags)
53
+ end
54
+ end
55
+
49
56
  def reattach_volumes
50
57
  instances_to_use do |instance, requirement|
51
58
  instance.reattach_volumes(*requirement.volumes_to_attach(instance))
@@ -20,6 +20,10 @@ module Awsome
20
20
  @properties['cnames'] || []
21
21
  end
22
22
 
23
+ def tags
24
+ @properties['tags'] || {}
25
+ end
26
+
23
27
  def volumes_to_attach(instance)
24
28
  (volumes - volumes_attached_to(instance)).collect { |v| @options.find_volume(v) }
25
29
  end
@@ -3,18 +3,58 @@ require 'yaml'
3
3
  module Awsome
4
4
  class Requirements
5
5
  attr_reader :options
6
+
6
7
  def initialize(requirements_hash)
7
8
  @requirements = requirements_hash.clone
8
9
  @options = Awsome::RequirementsOptions.new(@requirements)
9
10
  end
11
+
10
12
  def self.from_yaml_file(filename)
11
13
  new(YAML::load(File.open(filename, 'r').read))
12
14
  end
15
+
13
16
  def instances
14
- @requirements['instances'].collect do |instance_req|
15
- Awsome::InstanceRequirement.new(instance_req, @options)
17
+ @requirements['instances'].collect do |req|
18
+ instance = req.clone
19
+ inflate!(instance, instance.delete('traits'))
20
+ Awsome::InstanceRequirement.new(instance, @options)
16
21
  end
17
22
  end
23
+
24
+ def filters
25
+ @requirements['filters'] || {}
26
+ end
27
+
28
+ def traits
29
+ @requirements['traits'] || {}
30
+ end
31
+
32
+ private
33
+
34
+ def find_trait(name)
35
+ traits[name] || raise "no trait called #{name}"
36
+ end
37
+
38
+ # implements trait inheritance
39
+ def inflate!(instance, names)
40
+ inflated = req.clone
41
+
42
+ # prevents loops
43
+ merged = Set[]
44
+ while names && names.any?
45
+ name = names.shift
46
+ if merged.add?(name)
47
+ trait = find_trait(name).clone
48
+
49
+ # extract trait supertraits for merging
50
+ names += trait.delete('traits') || []
51
+
52
+ inflated = trait.merge(inflated)
53
+ end
54
+ end
55
+
56
+ inflated
57
+ end
18
58
  end
19
59
  end
20
60
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: awsome
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.17
4
+ version: 0.0.18
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: