Class: Ecr::Cleaner

Inherits:
Object
  • Object
show all
Includes:
Ufo::AwsServices, Ufo::Utils::Execute, Ufo::Utils::Logging
Defined in:
lib/ufo/ecr/cleaner.rb

Instance Method Summary collapse

Methods included from Ufo::Utils::Logging

#logger

Methods included from Ufo::Utils::Execute

#execute, #user_params

Methods included from Ufo::AwsServices

#acm, #applicationautoscaling, #aws_options, #cfn, #cloudwatchlogs, #ec2, #ecr, #ecs, #elb, #s3, #ssm_client, #waf_client

Methods included from Ufo::AwsServices::Concerns

#find_stack, #find_stack_resources, #stack_resources, #status, #task_definition_arns

Constructor Details

#initialize(docker_image_name, options = {}) ⇒ Cleaner

Returns a new instance of Cleaner.



9
10
11
12
13
14
15
16
# File 'lib/ufo/ecr/cleaner.rb', line 9

def initialize(docker_image_name, options={})
  # docker_image_name does not containg the tag
  # Example: 123456789.dkr.ecr.us-east-1.amazonaws.com/image
  @docker_image_name = docker_image_name
  @options = options
  @keep = options[:ecr_keep] || Ufo.config.docker.ecr_keep
  @tag_prefix = options[:tag_prefix] || "ufo"
end

Instance Method Details

#cleanupObject



18
19
20
21
22
23
24
25
# File 'lib/ufo/ecr/cleaner.rb', line 18

def cleanup
  return false unless @keep
  return false unless ecr_image?
  update_auth_token
  image_tags = fetch_image_tags
  delete_tags = image_tags[@keep..-1] # ordered by most recent images first
  delete_images(delete_tags)
end

#delete_images(tags) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
# File 'lib/ufo/ecr/cleaner.rb', line 35

def delete_images(tags)
  return if tags.nil? || tags.empty?
  logger.info "Keeping #{@keep} most recent ECR images."
  logger.info "Deleting these ECR images:"
  tag_list = tags.map { |t| "  #{repo_name}:#{t}" }
  logger.info tag_list
  image_ids = tags.map { |tag| {image_tag: tag} }
  ecr.batch_delete_image(
    repository_name: repo_name,
    image_ids: image_ids)
end

#ecr_image?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/ufo/ecr/cleaner.rb', line 58

def ecr_image?
  @docker_image_name =~ /\.amazonaws\.com/
end

#fetch_image_tagsObject



27
28
29
30
31
32
33
# File 'lib/ufo/ecr/cleaner.rb', line 27

def fetch_image_tags
  ecr.list_images(repository_name: repo_name).
    image_ids.
    map { |image_id| image_id.image_tag }.
    select { |image_tag| image_tag =~ Regexp.new("^#{@tag_prefix}-") }.
    sort.reverse
end

#repo_nameObject



53
54
55
56
# File 'lib/ufo/ecr/cleaner.rb', line 53

def repo_name
  # @docker_image_name example: 123456789.dkr.ecr.us-east-1.amazonaws.com/image
  @docker_image_name.split('/').last
end

#update_auth_tokenObject



47
48
49
50
51
# File 'lib/ufo/ecr/cleaner.rb', line 47

def update_auth_token
  repo_domain = "#{@docker_image_name.split('/').first}"
  auth = Ecr::Auth.new(repo_domain)
  auth.update
end