hashicorptools 0.3.0 → 1.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 75178f2878dffffbcca566e4ed6fa81c9cc612f55b601adf82a5a31da8492e74
4
- data.tar.gz: 47fef27c27f49f242188b474872ef4b57128e8998e9a277de2c19f6752a74759
3
+ metadata.gz: 6be604fe3116d183c2dde41307fbc77382ee5145279fc75a893360594fe63c99
4
+ data.tar.gz: 35227d95311d6653e9aad115973c65b19138957abee5930b09f5c3e279fdecdd
5
5
  SHA512:
6
- metadata.gz: 75d5ca009f079b41864ec1e5d66b1d6a2e88dcbab943ee2aff7f7cb869a41e667ef32483c0de2c865fe885f5c9d726c6c32122d79a3f7077fa7eec418de111de
7
- data.tar.gz: d346e24bc5ae25eb45e9406894701d96095d75eec0b40838cd85e647943b6c21a019913a21bb4ba51f9426d9bfa56fbee0cd0b80e90bf0b2bf73b75d62f24996
6
+ metadata.gz: '088072cf063c210b280e91c9345d3be10529d41fc4c70398c10a53fbf613877f3ec8dac13f606783124bcb19d102533bbad797663294e072080dd03924c2fcdb'
7
+ data.tar.gz: 47d602929569a5608fc557529381dea15a3e8e0fb079f1fa0dab4194e5415c8694a783d1a5ff936cc4a6566900af7794a3040009601b5f97b242a5aa95266452
data/Gemfile CHANGED
@@ -1,21 +1,20 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- # try to slowly migrate to v2 of the aws api
4
- gem 'aws-sdk', '~> 2'
3
+ gem 'aws-sdk-autoscaling', '~> 1'
4
+ gem 'aws-sdk-codedeploy', '~> 1'
5
+ gem 'aws-sdk-ec2', '~> 1'
6
+ gem 'aws-sdk-elasticloadbalancing', '~> 1'
5
7
 
6
- gem 'dynect_rest', '= 0.4.6'
7
-
8
- gem 'aws-sdk-v1', '~> 1.67'
9
8
  gem 'dotenv', '~> 2.2', '>= 2.2.1'
10
- gem 'thor', '= 0.20.0'
11
- gem 'activesupport', '~> 5.1', '>= 5.1.4'
12
- gem 'byebug', '~> 10.0', '>= 10.0.2'
13
- gem 'git', '~> 1.3'
9
+ gem 'thor', '>= 0.20.0'
10
+ gem 'activesupport', '>= 5.1.4'
11
+ gem 'byebug', '>= 10.0.2'
12
+ gem 'git', '> 1.3'
14
13
 
15
14
  group :development do
16
- gem 'rspec', '~> 3.7'
17
- gem 'rdoc', '~> 3.12'
18
- gem 'bundler', '~> 2.0'
19
- gem 'juwelier', '~> 2.4', '>= 2.4.7'
15
+ gem 'rspec', '> 3.7'
16
+ gem 'rdoc', '> 3.12'
17
+ gem 'bundler', '> 2.0'
18
+ gem 'juwelier', git: 'https://github.com/flajann2/juwelier.git'
20
19
  gem 'simplecov', '>= 0'
21
20
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 1.1.0
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: hashicorptools 0.3.0 ruby lib
5
+ # stub: hashicorptools 1.1.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "hashicorptools".freeze
9
- s.version = "0.3.0"
9
+ s.version = "1.1.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Nathan Woodhull".freeze]
14
- s.date = "2020-06-18"
14
+ s.date = "2020-07-30"
15
15
  s.description = "Wrappers for terraform and packer".freeze
16
16
  s.email = "systems@controlshiftlabs.com".freeze
17
17
  s.executables = ["ec2_host".freeze]
@@ -39,59 +39,47 @@ Gem::Specification.new do |s|
39
39
  "lib/hashicorptools/packer.rb",
40
40
  "lib/hashicorptools/update_launch_configuration.rb",
41
41
  "lib/hashicorptools/variables.rb",
42
- "spec/hashicorptools_spec.rb",
42
+ "spec/ec2_utilities_spec.rb",
43
43
  "spec/spec_helper.rb"
44
44
  ]
45
45
  s.homepage = "http://github.com/woodhull/hashicorptools".freeze
46
46
  s.licenses = ["MIT".freeze]
47
- s.rubygems_version = "3.0.3".freeze
47
+ s.rubygems_version = "3.1.2".freeze
48
48
  s.summary = "Wrappers for terraform and packer".freeze
49
49
 
50
50
  if s.respond_to? :specification_version then
51
51
  s.specification_version = 4
52
+ end
52
53
 
53
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
54
- s.add_runtime_dependency(%q<aws-sdk>.freeze, ["~> 2"])
55
- s.add_runtime_dependency(%q<dynect_rest>.freeze, ["= 0.4.6"])
56
- s.add_runtime_dependency(%q<aws-sdk-v1>.freeze, ["~> 1.67"])
57
- s.add_runtime_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
58
- s.add_runtime_dependency(%q<thor>.freeze, ["= 0.20.0"])
59
- s.add_runtime_dependency(%q<activesupport>.freeze, ["~> 5.1", ">= 5.1.4"])
60
- s.add_runtime_dependency(%q<byebug>.freeze, ["~> 10.0", ">= 10.0.2"])
61
- s.add_runtime_dependency(%q<git>.freeze, ["~> 1.3"])
62
- s.add_development_dependency(%q<rspec>.freeze, ["~> 3.7"])
63
- s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
64
- s.add_development_dependency(%q<bundler>.freeze, ["~> 2.0"])
65
- s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.7"])
66
- s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
67
- else
68
- s.add_dependency(%q<aws-sdk>.freeze, ["~> 2"])
69
- s.add_dependency(%q<dynect_rest>.freeze, ["= 0.4.6"])
70
- s.add_dependency(%q<aws-sdk-v1>.freeze, ["~> 1.67"])
71
- s.add_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
72
- s.add_dependency(%q<thor>.freeze, ["= 0.20.0"])
73
- s.add_dependency(%q<activesupport>.freeze, ["~> 5.1", ">= 5.1.4"])
74
- s.add_dependency(%q<byebug>.freeze, ["~> 10.0", ">= 10.0.2"])
75
- s.add_dependency(%q<git>.freeze, ["~> 1.3"])
76
- s.add_dependency(%q<rspec>.freeze, ["~> 3.7"])
77
- s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
78
- s.add_dependency(%q<bundler>.freeze, ["~> 2.0"])
79
- s.add_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.7"])
80
- s.add_dependency(%q<simplecov>.freeze, [">= 0"])
81
- end
54
+ if s.respond_to? :add_runtime_dependency then
55
+ s.add_runtime_dependency(%q<aws-sdk-autoscaling>.freeze, ["~> 1"])
56
+ s.add_runtime_dependency(%q<aws-sdk-codedeploy>.freeze, ["~> 1"])
57
+ s.add_runtime_dependency(%q<aws-sdk-ec2>.freeze, ["~> 1"])
58
+ s.add_runtime_dependency(%q<aws-sdk-elasticloadbalancing>.freeze, ["~> 1"])
59
+ s.add_runtime_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
60
+ s.add_runtime_dependency(%q<thor>.freeze, [">= 0.20.0"])
61
+ s.add_runtime_dependency(%q<activesupport>.freeze, [">= 5.1.4"])
62
+ s.add_runtime_dependency(%q<byebug>.freeze, [">= 10.0.2"])
63
+ s.add_runtime_dependency(%q<git>.freeze, ["> 1.3"])
64
+ s.add_development_dependency(%q<rspec>.freeze, ["> 3.7"])
65
+ s.add_development_dependency(%q<rdoc>.freeze, ["> 3.12"])
66
+ s.add_development_dependency(%q<bundler>.freeze, ["> 2.0"])
67
+ s.add_development_dependency(%q<juwelier>.freeze, [">= 0"])
68
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
82
69
  else
83
- s.add_dependency(%q<aws-sdk>.freeze, ["~> 2"])
84
- s.add_dependency(%q<dynect_rest>.freeze, ["= 0.4.6"])
85
- s.add_dependency(%q<aws-sdk-v1>.freeze, ["~> 1.67"])
70
+ s.add_dependency(%q<aws-sdk-autoscaling>.freeze, ["~> 1"])
71
+ s.add_dependency(%q<aws-sdk-codedeploy>.freeze, ["~> 1"])
72
+ s.add_dependency(%q<aws-sdk-ec2>.freeze, ["~> 1"])
73
+ s.add_dependency(%q<aws-sdk-elasticloadbalancing>.freeze, ["~> 1"])
86
74
  s.add_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
87
- s.add_dependency(%q<thor>.freeze, ["= 0.20.0"])
88
- s.add_dependency(%q<activesupport>.freeze, ["~> 5.1", ">= 5.1.4"])
89
- s.add_dependency(%q<byebug>.freeze, ["~> 10.0", ">= 10.0.2"])
90
- s.add_dependency(%q<git>.freeze, ["~> 1.3"])
91
- s.add_dependency(%q<rspec>.freeze, ["~> 3.7"])
92
- s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
93
- s.add_dependency(%q<bundler>.freeze, ["~> 2.0"])
94
- s.add_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.7"])
75
+ s.add_dependency(%q<thor>.freeze, [">= 0.20.0"])
76
+ s.add_dependency(%q<activesupport>.freeze, [">= 5.1.4"])
77
+ s.add_dependency(%q<byebug>.freeze, [">= 10.0.2"])
78
+ s.add_dependency(%q<git>.freeze, ["> 1.3"])
79
+ s.add_dependency(%q<rspec>.freeze, ["> 3.7"])
80
+ s.add_dependency(%q<rdoc>.freeze, ["> 3.12"])
81
+ s.add_dependency(%q<bundler>.freeze, ["> 2.0"])
82
+ s.add_dependency(%q<juwelier>.freeze, [">= 0"])
95
83
  s.add_dependency(%q<simplecov>.freeze, [">= 0"])
96
84
  end
97
85
  end
@@ -2,9 +2,6 @@ require 'bundler/setup'
2
2
  require 'dotenv'
3
3
  require 'thor'
4
4
  require 'active_support/all'
5
- require 'aws-sdk-v1'
6
- require 'aws-sdk'
7
- require 'dynect_rest'
8
5
 
9
6
  module Hashicorptools
10
7
  end
@@ -1,4 +1,7 @@
1
1
  require "timeout"
2
+ require 'aws-sdk-autoscaling'
3
+ require 'aws-sdk-ec2'
4
+ require 'aws-sdk-elasticloadbalancing'
2
5
 
3
6
  module Hashicorptools
4
7
  class AutoScalingGroup
@@ -1,68 +1,104 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'aws-sdk'
3
+ require 'aws-sdk-codedeploy'
4
4
  require 'dotenv'
5
5
  require 'git'
6
6
  require 'logger'
7
7
  require 'thor'
8
8
 
9
9
  module Hashicorptools
10
+ class RegionDeployment
11
+ attr_accessor :aws_region, :environment
12
+
13
+ def initialize(aws_region:, environment:)
14
+ @aws_region = aws_region
15
+ @environment = environment
16
+ end
17
+
18
+ def create_deployment(commit_id, commit_message)
19
+ client = Aws::CodeDeploy::Client.new(region: aws_region)
20
+ response = client.create_deployment({
21
+ application_name: application_name,
22
+ deployment_group_name: "#{application_name}-#{@environment}",
23
+ revision: {
24
+ revision_type: 'GitHub',
25
+ git_hub_location: {
26
+ repository: "controlshift/#{application_name}",
27
+ commit_id: commit_id
28
+ }
29
+ },
30
+ description: (commit_message || "commit #{commit_id}").slice(0,99)
31
+ })
32
+ output "created deployment #{response.deployment_id}"
33
+ output "https://console.aws.amazon.com/codedeploy/home?region=#{aws_region}#/deployments/#{response.deployment_id}"
34
+ end
35
+
36
+ private
37
+
38
+ def application_name
39
+ raise "implement me"
40
+ end
41
+
42
+ def output(text)
43
+ puts "[#{aws_region}] #{text}"
44
+ end
45
+ end
46
+
10
47
  class CodeDeploy < Thor
48
+ AWS_REGION_US_EAST_1 = 'us-east-1'
11
49
 
12
50
  desc 'deploy', 'deploy latest code to environment'
13
- option :environment, :required => true
51
+ option :environment, required: true
14
52
  option :branch
15
- option :aws_region, default: 'us-east-1'
53
+ option :aws_regions, type: :array
16
54
  option :commit
17
55
  def deploy
18
56
  g = Git.open('..')
19
57
 
20
- # TODO restore defaulting branch to the default branch (and remove below check)
21
- # once all the repos have the same default branch name of `main`
22
- # Currently, `agra` is using `master` while other apps are using `main`.
23
- # and we are unable to detect what the default branch is
24
- # via the git client here.
25
- if options[:commit].nil? && options[:branch].nil?
26
- raise 'You must supply either commit or branch to deploy'
27
- end
58
+ # We set defaults (depending on environment) for aws_regions if not passed in
59
+ aws_regions = options[:aws_regions] || default_regions
28
60
 
29
61
  commit = if options[:commit].present?
30
62
  g.gcommit(options[:commit])
31
63
  else
32
- g.checkout(options[:branch].to_sym)
64
+ branch = options[:branch].nil? ? :main : options[:branch].to_sym
65
+ g.checkout(branch)
33
66
  g.log.first
34
67
  end
35
68
 
69
+ puts "Deploying to environment #{options[:environment]} - regions: #{aws_regions.join(', ')}
70
+ commit: #{commit.sha}
71
+ message: #{commit.message}"
72
+
73
+ puts "Deploying for regions: #{aws_regions}"
36
74
 
37
- puts "deploying commit: #{commit.sha} #{commit.message}"
75
+ threads = []
76
+ aws_regions.each_slice(2) do |aws_regions_batch|
77
+ puts "Deploying for batch of regions: #{aws_regions_batch}"
78
+ aws_regions_batch.each do |aws_region|
79
+ thread = Thread.new{ region_deployment(aws_region).create_deployment(commit.sha, commit.message) }
80
+ threads.push(thread)
81
+ end
38
82
 
39
- create_deployment(commit.sha, commit.message)
83
+ threads.each_with_index do |thread, index|
84
+ begin
85
+ thread.join
86
+ rescue Exception => e
87
+ # Don't quit whole program on exception in thread, just print exception and exit thread
88
+ puts "[#{aws_regions[index]}] EXCEPTION: #{e}"
89
+ end
90
+ end
91
+ end
40
92
  end
41
93
 
42
94
  private
43
95
 
44
- def create_deployment(commit_id, commit_message = nil)
45
- Dotenv.load
46
-
47
- client = Aws::CodeDeploy::Client.new(region: options[:aws_region])
48
- response = client.create_deployment({
49
- application_name: application_name,
50
- deployment_group_name: "#{application_name}-#{options[:environment]}",
51
- revision: {
52
- revision_type: 'GitHub',
53
- git_hub_location: {
54
- repository: "controlshift/#{application_name}",
55
- commit_id: commit_id
56
- }
57
- },
58
- description: (commit_message || "commit #{commit_id}").slice(0,99)
59
- })
60
- puts "created deployment #{response.deployment_id}"
61
- puts "https://console.aws.amazon.com/codedeploy/home?region=#{options[:aws_region]}#/deployments/#{response.deployment_id}"
96
+ def region_deployment(aws_region)
97
+ RegionDeployment.new(aws_region: aws_region, environment: options[:environment])
62
98
  end
63
99
 
64
- def application_name
65
- raise "implement me"
100
+ def default_regions
101
+ [AWS_REGION_US_EAST_1]
66
102
  end
67
103
  end
68
104
  end
@@ -1,3 +1,5 @@
1
+ require 'aws-sdk-ec2'
2
+
1
3
  module Hashicorptools
2
4
  module Ec2Utilities
3
5
  def current_ami(tag = tag_name)
@@ -5,7 +7,8 @@ module Hashicorptools
5
7
  end
6
8
 
7
9
  def amis(tag = tag_name)
8
- sort_by_created_at( ec2.images.with_owner('self').with_tag('Name', tag).to_a )
10
+ images = ec2.describe_images({owners: ['self'], filters: [{name: 'tag:Name', values: [tag]}]}).images
11
+ sort_by_created_at(images)
9
12
  end
10
13
 
11
14
  def ec2
@@ -17,17 +20,15 @@ module Hashicorptools
17
20
  'us-east-1'
18
21
  end
19
22
 
20
- @_ec2 = AWS::EC2.new(region: reg)
23
+ @_ec2 = Aws::EC2::Client.new(region: reg)
21
24
  end
22
25
 
23
26
  def vpc_with_name(name)
24
- vpcs = ec2.client.describe_vpcs({filters: [{name: 'tag:Name', values: [name]}]}).vpc_set
25
- vpcs.first
27
+ ec2.describe_vpcs({filters: [{name: 'tag:Name', values: [name]}]}).vpcs.first
26
28
  end
27
29
 
28
30
  def internet_gateway_for_vpc(vpc_id)
29
- igs = ec2.client.describe_internet_gateways({filters: [{name: 'attachment.vpc-id', values: [vpc_id]}]}).internet_gateway_set
30
- igs.first
31
+ ec2.describe_internet_gateways({filters: [{name: 'attachment.vpc-id', values: [vpc_id]}]}).internet_gateways.first
31
32
  end
32
33
 
33
34
  def sort_by_created_at(collection)
@@ -1,3 +1,5 @@
1
+ require 'aws-sdk-ec2'
2
+
1
3
  module Hashicorptools
2
4
  class Host < Thor
3
5
 
@@ -1,3 +1,6 @@
1
+ require 'aws-sdk-autoscaling'
2
+ require 'aws-sdk-ec2'
3
+
1
4
  module Hashicorptools
2
5
  NUMBER_OF_AMIS_TO_KEEP = 2
3
6
 
@@ -33,7 +36,7 @@ module Hashicorptools
33
36
 
34
37
  desc "list", "list all available amis"
35
38
  def list
36
- amis.each do |ami|
39
+ amis_in_region(region).each do |ami|
37
40
  puts ami.image_id
38
41
  end
39
42
  end
@@ -45,7 +48,7 @@ module Hashicorptools
45
48
 
46
49
  desc "clean_snapshots", "clean obsolete EBS snapshots not associated with any AMI"
47
50
  def clean_snapshots
48
- snapshots = ec2.snapshots.with_owner('self')
51
+ snapshots = ec2.describe_snapshots({owner_ids: ['self']}).snapshots
49
52
  snapshots.each do |snapshot|
50
53
  match = snapshot.description.match(/Created by CreateImage\(.+\) for (ami-[0-9a-f]+) from vol-.+/)
51
54
  if match.nil?
@@ -54,25 +57,28 @@ module Hashicorptools
54
57
  end
55
58
 
56
59
  ami_id = match[1]
57
- unless ec2.images[ami_id].exists?
58
- puts "Removing obsolete snapshot #{snapshot.id} - #{snapshot.description}"
59
- snapshot = AWS::EC2::Snapshot.new(snapshot.id)
60
- snapshot.delete
60
+ unless Aws::EC2::Image.new(ami_id, region: region).exists?
61
+ puts "Removing obsolete snapshot #{snapshot.snapshot_id} - #{snapshot.description}"
62
+ ec2.delete_snapshot({snapshot_id: snapshot.snapshot_id})
61
63
  end
62
64
  end
63
65
  end
64
66
 
65
67
  desc "boot", "start up an instance of the latest version of AMI"
66
68
  def boot
67
- run_instances_resp = ec2.run_instances(image_id: current_ami('base-image').image_id,
69
+ run_instances_resp = ec2.run_instances({
70
+ image_id: current_ami('base-image').image_id,
68
71
  min_count: 1,
69
72
  max_count: 1,
70
- instance_type: "t2.micro")
73
+ instance_type: "t2.micro"
74
+ })
71
75
 
72
- ec2.create_tags( resources: run_instances_resp.instances.collect(&:instance_id),
73
- tags: [ {key: 'Name', value: "packer test boot #{tag_name}"},
74
- {key: 'environment', value: 'packer-development'},
75
- {key: 'temporary', value: 'kill me'}])
76
+ ec2.create_tags({
77
+ resources: run_instances_resp.instances.collect(&:instance_id),
78
+ tags: [ {key: 'Name', value: "packer test boot #{tag_name}"},
79
+ {key: 'environment', value: 'packer-development'},
80
+ {key: 'temporary', value: 'kill me'}]
81
+ })
76
82
 
77
83
  require 'byebug'
78
84
  byebug
@@ -106,7 +112,7 @@ module Hashicorptools
106
112
  end
107
113
 
108
114
  def ami_building_subnet_id
109
- ec2.client.describe_subnets({filters: [{name: "vpc-id", values: [ami_building_vpc_id]}]}).subnet_set.first.subnet_id
115
+ ec2.describe_subnets({filters: [{name: "vpc-id", values: [ami_building_vpc_id]}]}).subnets.first.subnet_id
110
116
  end
111
117
 
112
118
  def format_variable(key, value)
@@ -129,39 +135,52 @@ module Hashicorptools
129
135
  'us-east-1'
130
136
  end
131
137
 
132
- def auto_scaling
133
- @auto_scaling ||= Aws::AutoScaling::Client.new(region: region)
138
+ def auto_scaling(client_region=region)
139
+ @auto_scaling ||= Aws::AutoScaling::Client.new(region: client_region)
134
140
  end
135
141
 
136
- def ec2_v2
137
- @ec2 ||= Aws::EC2::Client.new(region: region)
142
+ def regional_ec2_client(client_region=region)
143
+ @_regional_ec2_clients = {} if @_regional_ec2_clients.nil?
144
+ @_regional_ec2_clients[client_region] ||= Aws::EC2::Client.new(region: client_region)
138
145
  end
139
146
 
140
- def amis_in_use
141
- launch_configs = auto_scaling.describe_launch_configurations
147
+ def amis_in_use(client_region)
148
+ launch_configs = auto_scaling(client_region).describe_launch_configurations
142
149
  image_ids = launch_configs.data['launch_configurations'].collect{|lc| lc.image_id}.flatten
143
150
 
144
- ec2_reservations = ec2_v2.describe_instances
151
+ ec2_reservations = regional_ec2_client(client_region).describe_instances
145
152
  image_ids << ec2_reservations.reservations.collect{|res| res.instances.collect{|r| r.image_id}}.flatten
146
153
  image_ids.flatten
147
154
  end
148
155
 
156
+ def ami_regions
157
+ ['us-east-1', 'eu-central-1']
158
+ end
159
+
149
160
  def clean_amis
150
- ami_ids = amis.collect{|a| a.image_id}
151
- ami_ids_to_remove = ami_ids - amis_in_use
152
- potential_amis_to_remove = amis
161
+ ami_regions.each do |ami_region|
162
+ clean_amis_for_region(ami_region)
163
+ end
164
+ end
165
+
166
+ def clean_amis_for_region(region_to_clean)
167
+ ami_ids = amis_in_region(region_to_clean).collect{|a| a.image_id}
168
+ ami_ids_to_remove = ami_ids - amis_in_use(region_to_clean)
169
+ potential_amis_to_remove = amis_in_region(region_to_clean)
153
170
  potential_amis_to_remove.keep_if {|a| ami_ids_to_remove.include?(a.image_id) }
154
171
 
155
172
  if potential_amis_to_remove.size > NUMBER_OF_AMIS_TO_KEEP
156
173
  amis_to_remove = potential_amis_to_remove[NUMBER_OF_AMIS_TO_KEEP..-1]
157
174
  amis_to_keep = potential_amis_to_remove[0..(NUMBER_OF_AMIS_TO_KEEP-1)]
158
175
 
159
- puts "Deregistering old AMIs..."
176
+ puts "Deregistering old AMIs in #{region_to_clean}..."
160
177
  amis_to_remove.each do |ami|
161
178
  ebs_mappings = ami.block_device_mappings
162
179
  puts "Deregistering #{ami.image_id}"
163
- ami.deregister
164
- delete_ami_snapshots(ebs_mappings)
180
+ regional_ec2_client(region_to_clean).deregister_image({
181
+ image_id: ami.image_id
182
+ })
183
+ delete_ami_snapshots(ebs_mappings, snapshot_region: region_to_clean)
165
184
  end
166
185
 
167
186
  puts "Currently active AMIs..."
@@ -169,15 +188,26 @@ module Hashicorptools
169
188
  puts ami.image_id
170
189
  end
171
190
  else
172
- puts "no AMIs to clean."
191
+ puts "no AMIs to clean in #{region_to_clean}."
173
192
  end
174
193
  end
175
194
 
176
- def delete_ami_snapshots(ebs_mappings)
177
- ebs_mappings.each do |volume, attributes|
178
- puts "Deleting snapshot #{attributes[:snapshot_id]}"
179
- snapshot = AWS::EC2::Snapshot.new(attributes[:snapshot_id])
180
- snapshot.delete
195
+ def amis_in_region(ami_region)
196
+ images = regional_ec2_client(ami_region).describe_images({
197
+ owners: ['self'],
198
+ filters: [{name: 'tag:Name', values: [tag_name]}]
199
+ }).images
200
+ sort_by_created_at(images)
201
+ end
202
+
203
+ def delete_ami_snapshots(ebs_mappings, snapshot_region:)
204
+ ec2_client = regional_ec2_client(snapshot_region)
205
+
206
+ ebs_mappings.each do |ebs_mapping|
207
+ unless ebs_mapping.ebs.nil?
208
+ puts "Deleting snapshot #{ebs_mapping.ebs.snapshot_id}"
209
+ ec2_client.delete_snapshot({snapshot_id: ebs_mapping.ebs.snapshot_id})
210
+ end
181
211
  end
182
212
  end
183
213
  end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Hashicorptools::Ec2Utilities, type: :helper do
4
+ let(:including_class) { Class.new { include Hashicorptools::Ec2Utilities } }
5
+
6
+ subject { including_class.new }
7
+
8
+ describe '#ec2' do
9
+ it 'should return a client' do
10
+ client = subject.ec2
11
+ expect(client).to be_a Aws::EC2::Client
12
+ end
13
+ end
14
+ end
metadata CHANGED
@@ -1,57 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashicorptools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Woodhull
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-18 00:00:00.000000000 Z
11
+ date: 2020-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: aws-sdk
14
+ name: aws-sdk-autoscaling
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2'
19
+ version: '1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2'
26
+ version: '1'
27
27
  - !ruby/object:Gem::Dependency
28
- name: dynect_rest
28
+ name: aws-sdk-codedeploy
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.4.6
33
+ version: '1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.4.6
40
+ version: '1'
41
41
  - !ruby/object:Gem::Dependency
42
- name: aws-sdk-v1
42
+ name: aws-sdk-ec2
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.67'
47
+ version: '1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.67'
54
+ version: '1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: aws-sdk-elasticloadbalancing
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: dotenv
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -76,23 +90,20 @@ dependencies:
76
90
  name: thor
77
91
  requirement: !ruby/object:Gem::Requirement
78
92
  requirements:
79
- - - '='
93
+ - - ">="
80
94
  - !ruby/object:Gem::Version
81
95
  version: 0.20.0
82
96
  type: :runtime
83
97
  prerelease: false
84
98
  version_requirements: !ruby/object:Gem::Requirement
85
99
  requirements:
86
- - - '='
100
+ - - ">="
87
101
  - !ruby/object:Gem::Version
88
102
  version: 0.20.0
89
103
  - !ruby/object:Gem::Dependency
90
104
  name: activesupport
91
105
  requirement: !ruby/object:Gem::Requirement
92
106
  requirements:
93
- - - "~>"
94
- - !ruby/object:Gem::Version
95
- version: '5.1'
96
107
  - - ">="
97
108
  - !ruby/object:Gem::Version
98
109
  version: 5.1.4
@@ -100,9 +111,6 @@ dependencies:
100
111
  prerelease: false
101
112
  version_requirements: !ruby/object:Gem::Requirement
102
113
  requirements:
103
- - - "~>"
104
- - !ruby/object:Gem::Version
105
- version: '5.1'
106
114
  - - ">="
107
115
  - !ruby/object:Gem::Version
108
116
  version: 5.1.4
@@ -110,9 +118,6 @@ dependencies:
110
118
  name: byebug
111
119
  requirement: !ruby/object:Gem::Requirement
112
120
  requirements:
113
- - - "~>"
114
- - !ruby/object:Gem::Version
115
- version: '10.0'
116
121
  - - ">="
117
122
  - !ruby/object:Gem::Version
118
123
  version: 10.0.2
@@ -120,9 +125,6 @@ dependencies:
120
125
  prerelease: false
121
126
  version_requirements: !ruby/object:Gem::Requirement
122
127
  requirements:
123
- - - "~>"
124
- - !ruby/object:Gem::Version
125
- version: '10.0'
126
128
  - - ">="
127
129
  - !ruby/object:Gem::Version
128
130
  version: 10.0.2
@@ -130,78 +132,72 @@ dependencies:
130
132
  name: git
131
133
  requirement: !ruby/object:Gem::Requirement
132
134
  requirements:
133
- - - "~>"
135
+ - - ">"
134
136
  - !ruby/object:Gem::Version
135
137
  version: '1.3'
136
138
  type: :runtime
137
139
  prerelease: false
138
140
  version_requirements: !ruby/object:Gem::Requirement
139
141
  requirements:
140
- - - "~>"
142
+ - - ">"
141
143
  - !ruby/object:Gem::Version
142
144
  version: '1.3'
143
145
  - !ruby/object:Gem::Dependency
144
146
  name: rspec
145
147
  requirement: !ruby/object:Gem::Requirement
146
148
  requirements:
147
- - - "~>"
149
+ - - ">"
148
150
  - !ruby/object:Gem::Version
149
151
  version: '3.7'
150
152
  type: :development
151
153
  prerelease: false
152
154
  version_requirements: !ruby/object:Gem::Requirement
153
155
  requirements:
154
- - - "~>"
156
+ - - ">"
155
157
  - !ruby/object:Gem::Version
156
158
  version: '3.7'
157
159
  - !ruby/object:Gem::Dependency
158
160
  name: rdoc
159
161
  requirement: !ruby/object:Gem::Requirement
160
162
  requirements:
161
- - - "~>"
163
+ - - ">"
162
164
  - !ruby/object:Gem::Version
163
165
  version: '3.12'
164
166
  type: :development
165
167
  prerelease: false
166
168
  version_requirements: !ruby/object:Gem::Requirement
167
169
  requirements:
168
- - - "~>"
170
+ - - ">"
169
171
  - !ruby/object:Gem::Version
170
172
  version: '3.12'
171
173
  - !ruby/object:Gem::Dependency
172
174
  name: bundler
173
175
  requirement: !ruby/object:Gem::Requirement
174
176
  requirements:
175
- - - "~>"
177
+ - - ">"
176
178
  - !ruby/object:Gem::Version
177
179
  version: '2.0'
178
180
  type: :development
179
181
  prerelease: false
180
182
  version_requirements: !ruby/object:Gem::Requirement
181
183
  requirements:
182
- - - "~>"
184
+ - - ">"
183
185
  - !ruby/object:Gem::Version
184
186
  version: '2.0'
185
187
  - !ruby/object:Gem::Dependency
186
188
  name: juwelier
187
189
  requirement: !ruby/object:Gem::Requirement
188
190
  requirements:
189
- - - "~>"
190
- - !ruby/object:Gem::Version
191
- version: '2.4'
192
191
  - - ">="
193
192
  - !ruby/object:Gem::Version
194
- version: 2.4.7
193
+ version: '0'
195
194
  type: :development
196
195
  prerelease: false
197
196
  version_requirements: !ruby/object:Gem::Requirement
198
197
  requirements:
199
- - - "~>"
200
- - !ruby/object:Gem::Version
201
- version: '2.4'
202
198
  - - ">="
203
199
  - !ruby/object:Gem::Version
204
- version: 2.4.7
200
+ version: '0'
205
201
  - !ruby/object:Gem::Dependency
206
202
  name: simplecov
207
203
  requirement: !ruby/object:Gem::Requirement
@@ -244,7 +240,7 @@ files:
244
240
  - lib/hashicorptools/packer.rb
245
241
  - lib/hashicorptools/update_launch_configuration.rb
246
242
  - lib/hashicorptools/variables.rb
247
- - spec/hashicorptools_spec.rb
243
+ - spec/ec2_utilities_spec.rb
248
244
  - spec/spec_helper.rb
249
245
  homepage: http://github.com/woodhull/hashicorptools
250
246
  licenses:
@@ -265,7 +261,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
265
261
  - !ruby/object:Gem::Version
266
262
  version: '0'
267
263
  requirements: []
268
- rubygems_version: 3.0.3
264
+ rubygems_version: 3.1.2
269
265
  signing_key:
270
266
  specification_version: 4
271
267
  summary: Wrappers for terraform and packer
@@ -1,8 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe "Hashicorptools" do
4
- it "fails" do
5
- pending
6
- fail "hey buddy, you should probably rename this file and start specing for real"
7
- end
8
- end