inspec/lib/resources/docker_image.rb

97 lines
2.1 KiB
Ruby
Raw Normal View History

# encoding: utf-8
#
# Copyright 2017, Christoph Hartmann
#
# author: Christoph Hartmann
# author: Patrick Muench
# author: Dominik Richter
module Inspec::Resources
class DockerImage < Inspec.resource(1)
name 'docker_image'
desc ''
example "
describe docker_image('alpine:latest') do
it { should exist }
its('id') { should_not eq '' }
its('image') { should eq 'alpine:latest' }
its('repo') { should eq 'alpine' }
its('tag') { should eq 'latest' }
end
describe docker_image('alpine:latest') do
it { should exist }
end
describe docker_image(id: '4a415e366388') do
it { should exist }
end
"
def initialize(opts = {})
# do sanitizion of input values
o = opts.dup
o = { image: opts } if opts.is_a?(String)
@opts = sanitize_options(o)
end
def exist?
image_info.exists?
end
def id
image_info.ids[0] if image_info.entries.size == 1
end
def image
"#{repo}:#{tag}" if image_info.entries.size == 1
end
def repo
image_info.repositories[0] if image_info.entries.size == 1
end
def tag
image_info.tags[0] if image_info.entries.size == 1
end
def to_s
img = @opts[:image] || @opts[:id]
"Docker Image #{img}"
end
private
def sanitize_options(opts)
if !opts[:image].nil?
if !opts[:image].index(':').nil?
repo, tag = opts[:image].split(':')
else
opts[:repo] = opts[:image]
opts[:image] = nil
end
opts[:repo] ||= repo
opts[:tag] ||= tag
end
if !opts[:id].nil?
if opts[:id].index(':').nil?
opts[:id] = 'sha256:' + opts[:id]
end
end
opts[:tag] ||= 'latest'
opts[:image] ||= "#{opts[:repo]}:#{opts[:tag]}" unless opts[:repo].nil?
opts
end
def image_info
return @info if defined?(@info)
opts = @opts
@info = inspec.docker.images.where {
(repository == opts[:repo] && tag == opts[:tag]) || (!id.nil? && !opts[:id].nil? && (id == opts[:id] || id.start_with?(opts[:id])))
}
end
end
end