aws-asg-fleet 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ff793ee569c79401db2eaae824a888e0383a7d3705f02d423e6288945fd817a7
4
+ data.tar.gz: f68bd89d722264acf81f10f8025e2ee843b22c0b5c42629e0eb73251f0bc7fc2
5
+ SHA512:
6
+ metadata.gz: 179dee8303a123490a611a48272f01c67397453db5fe8472d79fc2c9ccd429158cacf5c02104f9dd26617117f325a75aebbeefad77a5e752c622edd62f4e08cc
7
+ data.tar.gz: fd2d5749a01ff46d55013b79b8d850bf68d830a60d3be97033eb84f0e978fca219f1508e4b5c257e45ee5141c6cde5fef2adb450ad631d07acb83d1bfb39e0b2
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "aws-asg-fleet"
8
- spec.version = "0.0.5"
8
+ spec.version = "0.0.7"
9
9
  spec.authors = ["Zach Wily"]
10
10
  spec.email = ["zach@zwily.com"]
11
11
  spec.description = %q{AWS Auto Scaling Fleets}
@@ -18,8 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "aws-sdk", "~> 1.12"
21
+ spec.add_dependency "aws-sdk-autoscaling", "~> 1.3"
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "bundler", "~> 2.0"
24
24
  spec.add_development_dependency "rake"
25
25
  end
@@ -0,0 +1,144 @@
1
+ module Aws::AutoScaling
2
+ class Fleet
3
+
4
+ def initialize name, options
5
+ @name = name
6
+ @client = options.delete(:client)
7
+ end
8
+
9
+ # @return [String]
10
+ attr_reader :name
11
+
12
+ def tags(filters=[])
13
+ # mostly copied from Resource#tags
14
+ options = {:filters => [{:name => "key", :values => [tag_name]}] + filters}
15
+ batches = Enumerator.new do |y|
16
+ resp = @client.describe_tags(options)
17
+ resp.each_page do |page|
18
+ batch = []
19
+ page.data.tags.each do |t|
20
+ batch << Tag.new(
21
+ key: t.key,
22
+ resource_id: t.resource_id,
23
+ resource_type: t.resource_type,
24
+ data: t,
25
+ client: @client
26
+ )
27
+ end
28
+ y.yield(batch)
29
+ end
30
+ end
31
+ Tag::Collection.new(batches)
32
+ end
33
+
34
+ def group_for_tag(tag)
35
+ return nil unless tag
36
+ case tag.resource_type
37
+ when 'auto-scaling-group'
38
+ AutoScalingGroup.new(name: tag.resource_id, client: @client)
39
+ else
40
+ msg = "unhandled resource type: #{tag.resource_type}" # shamelessly copied from old aws-sdk
41
+ raise ArgumentError, msg
42
+ end
43
+ end
44
+
45
+ def tag_name
46
+ "asgfleet:#{name}"
47
+ end
48
+
49
+ # @return [Group]
50
+ def template_group
51
+ tag = tags([{:name => 'value', :values => ["template"]}]).first
52
+ group_for_tag(tag)
53
+ end
54
+
55
+ # @return [Group]
56
+ def any_group
57
+ group_for_tag(tags.first)
58
+ end
59
+
60
+ def template_or_any_group
61
+ template_group || any_group
62
+ end
63
+
64
+ def exists?
65
+ !any_group.nil?
66
+ end
67
+
68
+ def groups
69
+ FleetGroupCollection.new(self)
70
+ end
71
+
72
+ # Suspends all scaling processes in all Auto Scaling groups in the
73
+ # fleet.
74
+ def suspend_all_processes
75
+ groups.each do |group|
76
+ group.suspend_processes
77
+ end
78
+ end
79
+
80
+ # Resumes all scaling processes in all Auto Scaling groups in the
81
+ # fleet.
82
+ def resume_all_processes
83
+ groups.each do |group|
84
+ group.resume_processes
85
+ end
86
+ end
87
+
88
+ # Creates a new launch configuration and applies it to all the
89
+ # Auto Scaling groups in the fleet. Any options not specified will
90
+ # be pulled from the Launch Configuration currently attached to
91
+ # the template Auto Scaling group.
92
+ #
93
+ # @param [String] name The name of the new launch configuration
94
+ #
95
+ # @param [Hash] options Options for the new launch configuration.
96
+ # Any options not specified in this hash will be pulled from the
97
+ # existing launch configuration on the template scaling group.
98
+ #
99
+ def update_launch_configuration name, options = {}
100
+ old_lc = template_or_any_group.launch_configuration
101
+ options = Fleet.options_from(old_lc,
102
+ :image_id, :instance_type,
103
+ :block_device_mappings, :instance_monitoring, :kernel_id,
104
+ :key_name, :ramdisk_id, :security_groups, :user_data,
105
+ :iam_instance_profile, :spot_price).merge(options)
106
+
107
+ options[:launch_configuration_name] = name
108
+ @client.create_launch_configuration(options)
109
+
110
+ groups.each do |group|
111
+ next unless group.launch_template.nil?
112
+ next unless group.mixed_instances_policy.nil?
113
+
114
+ group.update(:launch_configuration_name => name)
115
+ end
116
+
117
+ LaunchConfiguration.new(name: name, client: @client)
118
+ end
119
+
120
+ # @private
121
+ # Collects non-nil, non-empty-array attributes from the supplied object
122
+ # into a Hash. Also converts any Array-like objects into real
123
+ # Arrays.
124
+ def self.options_from(obj, *attributes)
125
+ opts = {}
126
+ attributes.each do |key|
127
+ value = obj.send(key)
128
+ next if value.blank?
129
+ if value.is_a? Array
130
+ value = value.to_a
131
+ next if value.empty?
132
+ end
133
+ opts[key] ||= value
134
+ end
135
+ opts
136
+ end
137
+
138
+ protected
139
+
140
+ def resource_identifiers
141
+ [[:name, name]]
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,50 @@
1
+ module Aws::AutoScaling
2
+ class FleetCollection
3
+
4
+ include Enumerable
5
+
6
+ def initialize(opts)
7
+ @resource = opts.delete(:resource)
8
+ end
9
+
10
+ # Create an ASG Fleet.
11
+ #
12
+ # To create a Fleet, you must supply an already-constructed
13
+ # Auto Scaling group to be used as the template for new groups
14
+ # added to the fleet.
15
+ #
16
+ # fleet = auto_scaling.fleets.create('fleet-name',
17
+ # auto_scaling.groups['my-asg-group'])
18
+ #
19
+ # @param [String] name The name of the new fleet to create.
20
+ # Must be unique in your account.
21
+ #
22
+ # @param [Group] group The group to be used as a template
23
+ # for future groups and fleet changes.
24
+ #
25
+ # @return [Fleet]
26
+ #
27
+ def create name, template_group
28
+ raise ArgumentError, "Fleet #{name} already exists" if @resource.fleet(name).exists?
29
+ raise ArgumentError, "Group is already in a fleet" if template_group.fleet
30
+
31
+ template_group.set_fleet(name, "template")
32
+ @resource.fleet(name)
33
+ end
34
+
35
+ def each
36
+ yielded_fleets = []
37
+
38
+ @resource.tags.each do |tag|
39
+ if tag.key =~ /^asgfleet:/
40
+ name = tag.key.split(':', 2)[1]
41
+
42
+ next if yielded_fleets.include? name
43
+ yielded_fleets << name
44
+
45
+ yield @resource.fleet(name)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,25 @@
1
+ module Aws::AutoScaling
2
+ class FleetGroupCollection
3
+ include Enumerable
4
+
5
+ def initialize fleet
6
+ @fleet = fleet
7
+ end
8
+
9
+ # @return [Fleet]
10
+ attr_reader :fleet
11
+
12
+ # Add an existing group to a Fleet.
13
+ #
14
+ # @param [Group] The group to add.
15
+ def << group
16
+ group.set_fleet @fleet.name
17
+ end
18
+
19
+ def each
20
+ @fleet.tags.each do |t|
21
+ yield @fleet.group_for_tag(t)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,48 @@
1
+ require 'aws-sdk-autoscaling'
2
+
3
+ module Aws::AutoScaling
4
+ autoload :Fleet, 'aws-sdk-autoscaling/fleet'
5
+ autoload :FleetCollection, 'aws-sdk-autoscaling/fleet_collection'
6
+ autoload :FleetGroupCollection, 'aws-sdk-autoscaling/fleet_group_collection'
7
+
8
+ module ResourceFleetsExtension
9
+ # @return [FleetCollection]
10
+ def fleet(name)
11
+ Fleet.new(name, client: @client)
12
+ end
13
+
14
+ def fleets
15
+ FleetCollection.new(resource: self)
16
+ end
17
+ end
18
+ Resource.include(ResourceFleetsExtension)
19
+
20
+ module AutoScalingGroupFletsExtension
21
+ def fleet
22
+ fleet_tag = tags.find {|t| t.key =~ /^asgfleet:/ }
23
+ return nil unless fleet_tag
24
+
25
+ fleet_name = fleet_tag.key.split(':', 2)[1]
26
+ Fleet.new(fleet_name, client: @client)
27
+ end
28
+
29
+ def set_fleet fleet, role = "member"
30
+ if fleet && self.fleet
31
+ raise ArgumentError, "Group already belongs to a fleet"
32
+ end
33
+
34
+ if fleet.nil?
35
+ tags.find {|t| t.key =~ /^asgfleet:/ }.delete
36
+ else
37
+ @client.create_or_update_tags(:tags => [{
38
+ :resource_type => "auto-scaling-group",
39
+ :resource_id => name,
40
+ :key => "asgfleet:#{fleet.is_a?(Fleet) ? fleet.name : fleet}",
41
+ :value => role,
42
+ :propagate_at_launch => false
43
+ }])
44
+ end
45
+ end
46
+ end
47
+ AutoScalingGroup.include(AutoScalingGroupFletsExtension)
48
+ end
metadata CHANGED
@@ -1,62 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-asg-fleet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
5
- prerelease:
4
+ version: 0.0.7
6
5
  platform: ruby
7
6
  authors:
8
7
  - Zach Wily
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-05-28 00:00:00.000000000 Z
11
+ date: 2019-08-30 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: aws-sdk
14
+ name: aws-sdk-autoscaling
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: '1.12'
19
+ version: '1.3'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '1.12'
26
+ version: '1.3'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: bundler
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
- version: '1.3'
33
+ version: '2.0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
- version: '1.3'
40
+ version: '2.0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  description: AWS Auto Scaling Fleets
@@ -66,41 +59,38 @@ executables: []
66
59
  extensions: []
67
60
  extra_rdoc_files: []
68
61
  files:
69
- - .gitignore
62
+ - ".gitignore"
70
63
  - Gemfile
71
64
  - LICENSE.txt
72
65
  - README.md
73
66
  - Rakefile
74
67
  - asg-fleet.gemspec
75
- - lib/aws/auto_scaling/fleet.rb
76
- - lib/aws/auto_scaling/fleet_collection.rb
77
- - lib/aws/auto_scaling/fleet_group_collection.rb
78
- - lib/aws/auto_scaling/fleets.rb
68
+ - lib/aws-sdk-autoscaling/fleet.rb
69
+ - lib/aws-sdk-autoscaling/fleet_collection.rb
70
+ - lib/aws-sdk-autoscaling/fleet_group_collection.rb
71
+ - lib/aws-sdk-autoscaling/fleets.rb
79
72
  homepage: ''
80
73
  licenses:
81
74
  - MIT
75
+ metadata: {}
82
76
  post_install_message:
83
77
  rdoc_options: []
84
78
  require_paths:
85
79
  - lib
86
80
  required_ruby_version: !ruby/object:Gem::Requirement
87
- none: false
88
81
  requirements:
89
- - - ! '>='
82
+ - - ">="
90
83
  - !ruby/object:Gem::Version
91
84
  version: '0'
92
85
  required_rubygems_version: !ruby/object:Gem::Requirement
93
- none: false
94
86
  requirements:
95
- - - ! '>='
87
+ - - ">="
96
88
  - !ruby/object:Gem::Version
97
89
  version: '0'
98
90
  requirements: []
99
- rubyforge_project:
100
- rubygems_version: 1.8.23
91
+ rubygems_version: 3.0.3
101
92
  signing_key:
102
- specification_version: 3
93
+ specification_version: 4
103
94
  summary: Provides a mechanism to group together Auto Scaling groups and perform actions
104
95
  on them in bulk.
105
96
  test_files: []
106
- has_rdoc:
@@ -1,122 +0,0 @@
1
- module AWS
2
- class AutoScaling
3
- class Fleet < Core::Resource
4
-
5
- def initialize name, options = {}
6
- @name = name
7
- super
8
- end
9
-
10
- # @return [String]
11
- attr_reader :name
12
-
13
- def tag_name
14
- "asgfleet:#{name}"
15
- end
16
-
17
- # @return [Group]
18
- def template_group
19
- tag = TagCollection.new(:config => config)
20
- .filter(:key, tag_name)
21
- .filter(:value, "template")
22
- .first
23
-
24
- return nil unless tag
25
- tag.resource
26
- end
27
-
28
- # @return [Group]
29
- def any_group
30
- tag = TagCollection.new(:config => config)
31
- .filter(:key, tag_name)
32
- .first
33
-
34
- return nil unless tag
35
- tag.resource
36
- end
37
-
38
- def template_or_any_group
39
- template_group || any_group
40
- end
41
-
42
- def exists?
43
- !any_group.nil?
44
- end
45
-
46
- def groups
47
- FleetGroupCollection.new(self)
48
- end
49
-
50
- # Suspends all scaling processes in all Auto Scaling groups in the
51
- # fleet.
52
- def suspend_all_processes
53
- groups.each do |group|
54
- group.suspend_all_processes
55
- end
56
- end
57
-
58
- # Resumes all scaling processes in all Auto Scaling groups in the
59
- # fleet.
60
- def resume_all_processes
61
- groups.each do |group|
62
- group.resume_all_processes
63
- end
64
- end
65
-
66
- # Creates a new launch configuration and applies it to all the
67
- # Auto Scaling groups in the fleet. Any options not specified will
68
- # be pulled from the Launch Configuration currently attached to
69
- # the template Auto Scaling group.
70
- #
71
- # @param [String] name The name of the new launch configuration
72
- #
73
- # @param [Hash] options Options for the new launch configuration.
74
- # Any options not specified in this hash will be pulled from the
75
- # existing launch configuration on the template scaling group.
76
- #
77
- def update_launch_configuration name, options = {}
78
- old_lc = template_or_any_group.launch_configuration
79
- image_id = options[:image_id] || old_lc.image_id
80
- instance_type = options[:instance_type] || old_lc.instance_type
81
-
82
- options = Fleet.options_from(old_lc,
83
- :block_device_mappings, :detailed_instance_monitoring, :kernel_id,
84
- :key_pair, :ramdisk_id, :security_groups, :user_data,
85
- :iam_instance_profile, :spot_price).merge(options)
86
-
87
- launch_configurations = LaunchConfigurationCollection.new(:config => config)
88
- new_lc = launch_configurations.create(name, image_id, instance_type, options)
89
-
90
- groups.each do |group|
91
- group.update(:launch_configuration => new_lc)
92
- end
93
-
94
- new_lc
95
- end
96
-
97
- # @private
98
- # Collects non-nil, non-empty-array attributes from the supplied object
99
- # into a Hash. Also converts any Array-like objects into real
100
- # Arrays.
101
- def self.options_from(obj, *attributes)
102
- opts = {}
103
- attributes.each do |key|
104
- value = obj.send(key)
105
- next if value.nil?
106
- if value.is_a? Array
107
- value = value.to_a
108
- next if value.empty?
109
- end
110
- opts[key] ||= value
111
- end
112
- opts
113
- end
114
-
115
- protected
116
-
117
- def resource_identifiers
118
- [[:name, name]]
119
- end
120
- end
121
- end
122
- end
@@ -1,56 +0,0 @@
1
- module AWS
2
- class AutoScaling
3
- class FleetCollection
4
-
5
- include Core::Collection::Simple
6
-
7
- # Create an ASG Fleet.
8
- #
9
- # To create a Fleet, you must supply an already-constructed
10
- # Auto Scaling group to be used as the template for new groups
11
- # added to the fleet.
12
- #
13
- # fleet = auto_scaling.fleets.create('fleet-name',
14
- # auto_scaling.groups['my-asg-group'])
15
- #
16
- # @param [String] name The name of the new fleet to create.
17
- # Must be unique in your account.
18
- #
19
- # @param [Group] group The group to be used as a template
20
- # for future groups and fleet changes.
21
- #
22
- # @return [Fleet]
23
- #
24
- def create name, template_group
25
- raise ArgumentError, "Fleet #{name} already exists" if self[name].exists?
26
- raise ArgumentError, "Group is already in a fleet" if template_group.fleet
27
-
28
- template_group.set_fleet(name, "template")
29
- self[name]
30
- end
31
-
32
- # @param [String] name The name of the ASG fleet.
33
- # @return [Fleet]
34
- def [] name
35
- Fleet.new(name, :config => config)
36
- end
37
-
38
- protected
39
-
40
- def _each_item options
41
- yielded_fleets = []
42
-
43
- TagCollection.new(:config => config).each do |tag|
44
- if tag[:key] =~ /^asgfleet:/
45
- name = tag[:key].split(':', 2)[1]
46
-
47
- next if yielded_fleets.include? name
48
- yielded_fleets << name
49
-
50
- yield Fleet.new(name, :config => config)
51
- end
52
- end
53
- end
54
- end
55
- end
56
- end
@@ -1,31 +0,0 @@
1
- module AWS
2
- class AutoScaling
3
- class FleetGroupCollection
4
-
5
- include Core::Collection::Simple
6
-
7
- def initialize fleet, options = {}
8
- @fleet = fleet
9
- super
10
- end
11
-
12
- # @return [Fleet]
13
- attr_reader :fleet
14
-
15
- # Add an existing group to a Fleet.
16
- #
17
- # @param [Group] The group to add.
18
- def << group
19
- group.set_fleet @fleet.name
20
- end
21
-
22
- protected
23
-
24
- def _each_item options
25
- TagCollection.new(:config => config).filter(:key, "asgfleet:#{@fleet.name}").each do |tag|
26
- yield tag.resource
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,42 +0,0 @@
1
- require 'aws/auto_scaling'
2
- require 'aws/version'
3
-
4
- module AWS
5
- class AutoScaling
6
-
7
- autoload :Fleet, 'aws/auto_scaling/fleet'
8
- autoload :FleetCollection, 'aws/auto_scaling/fleet_collection'
9
- autoload :FleetGroupCollection, 'aws/auto_scaling/fleet_group_collection'
10
-
11
- # @return [FleetCollection]
12
- def fleets
13
- FleetCollection.new(:config => config)
14
- end
15
-
16
- class Group
17
- def fleet
18
- fleet_tag = tags.find {|t| t[:key] =~ /^asgfleet:/ }
19
- return nil unless fleet_tag
20
-
21
- fleet_name = fleet_tag[:key].split(':', 2)[1]
22
- Fleet.new(fleet_name, :config => config)
23
- end
24
-
25
- def set_fleet fleet, role = "member"
26
- if fleet && self.fleet
27
- raise ArgumentError, "Group already belongs to a fleet"
28
- end
29
-
30
- if fleet.nil?
31
- tags.find {|t| t[:key] =~ /^asgfleet:/ }.delete
32
- else
33
- self.update(:tags => [{
34
- :key => "asgfleet:#{fleet.is_a?(Fleet) ? fleet.name : fleet}",
35
- :value => role,
36
- :propagate_at_launch => false
37
- }])
38
- end
39
- end
40
- end
41
- end
42
- end