inspec/lib/resources/docker_container.rb
Matt Kulka 0fc870de30 Fix docker_container.tag to properly fetch from image name (#2052)
Fixes #2051

Images with repos containing port numbers will have multiple colons.

Signed-off-by: Matt Kulka <mkulka@parchment.com>
2017-08-10 14:57:45 +02:00

109 lines
2.6 KiB
Ruby

# encoding: utf-8
#
# Copyright 2017, Christoph Hartmann
#
# author: Christoph Hartmann
# author: Patrick Muench
# author: Dominik Richter
module Inspec::Resources
class DockerContainer < Inspec.resource(1)
name 'docker_container'
desc ''
example "
describe docker_container('an-echo-server') do
it { should exist }
it { should be_running }
its('id') { should_not eq '' }
its('image') { should eq 'busybox:latest' }
its('repo') { should eq 'busybox' }
its('tag') { should eq 'latest' }
its('ports') { should eq [] }
its('command') { should eq 'nc -ll -p 1234 -e /bin/cat' }
end
describe docker_container(id: 'e2c52a183358') do
it { should exist }
it { should be_running }
end
"
def initialize(opts = {})
# if a string is provided, we expect it is the name
if opts.is_a?(String)
@opts = { name: opts }
else
@opts = opts
end
end
def exist?
container_info.exists?
end
# is allways returning the full id
def id
container_info.ids[0] if container_info.entries.length == 1
end
def running?
status.downcase.start_with?('up') if container_info.entries.length == 1
end
def status
container_info.status[0] if container_info.entries.length == 1
end
def labels
container_info.labels[0] if container_info.entries.length == 1
end
def ports
container_info.ports[0] if container_info.entries.length == 1
end
def command
if container_info.entries.length == 1
cmd = container_info.commands[0]
cmd.slice(1, cmd.length - 2)
end
end
def image
container_info.images[0] if container_info.entries.length == 1
end
def repo
return if image_name_from_image.nil?
image_name_from_image.split(':')[0]
end
def tag
return if image_name_from_image.nil?
image_name_from_image.split(':')[1]
end
def to_s
name = @opts[:name] || @opts[:id]
"Docker Container #{name}"
end
private
def image_name_from_image
return if image.nil?
# possible image names include:
# alpine
# ubuntu:14.04
# repo.example.com:5000/ubuntu
# repo.example.com:5000/ubuntu:1404
image.include?('/') ? image.split('/')[1] : image
end
def container_info
return @info if defined?(@info)
opts = @opts
@info = inspec.docker.containers.where { names == opts[:name] || (!id.nil? && !opts[:id].nil? && (id == opts[:id] || id.start_with?(opts[:id]))) }
end
end
end