Class: ForemanDocker::Docker

Inherits:
ComputeResource
  • Object
show all
Defined in:
app/models/foreman_docker/docker.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.get_container(container) ⇒ Object



12
13
14
15
# File 'app/models/foreman_docker/docker.rb', line 12

def self.get_container(container)
  conn = container.compute_resource.docker_connection
  ::Docker::Container.get(container.uuid, {}, conn)
end

.model_nameObject



8
9
10
# File 'app/models/foreman_docker/docker.rb', line 8

def self.model_name
  ComputeResource.model_name
end

Instance Method Details

#api_versionObject



110
111
112
# File 'app/models/foreman_docker/docker.rb', line 110

def api_version
  ::Docker.version(docker_connection)
end

#authenticate!Object



114
115
116
# File 'app/models/foreman_docker/docker.rb', line 114

def authenticate!
  ::Docker.authenticate!(credentials, docker_connection)
end

#available_imagesObject



37
38
39
# File 'app/models/foreman_docker/docker.rb', line 37

def available_images
  ::Docker::Image.all({}, docker_connection)
end

#capabilitiesObject



17
18
19
# File 'app/models/foreman_docker/docker.rb', line 17

def capabilities
  []
end

#console(uuid) ⇒ Object



100
101
102
103
104
105
106
107
108
# File 'app/models/foreman_docker/docker.rb', line 100

def console(uuid)
  test_connection
  container = ::Docker::Container.get(uuid, {}, docker_connection)
  {
    :name       => container.info['Name'],
    'timestamp' => Time.now.utc,
    'output'    => container.logs(:stdout => true, :tail => 100)
  }
end

#create_container(args = {}) ⇒ Object



80
81
82
83
84
85
86
# File 'app/models/foreman_docker/docker.rb', line 80

def create_container(args = {})
  options = vm_instance_defaults.merge(args)
  logger.debug("Creating container with the following options: #{options.inspect}")
  docker_command do
    ::Docker::Container.create(options, docker_connection)
  end
end

#create_image(args = {}) ⇒ Object



88
89
90
91
92
93
# File 'app/models/foreman_docker/docker.rb', line 88

def create_image(args = {})
  logger.debug("Creating docker image with the following options: #{args.inspect}")
  docker_command do
    ::Docker::Image.create(args, credentials, docker_connection)
  end
end

#docker_connectionObject



128
129
130
# File 'app/models/foreman_docker/docker.rb', line 128

def docker_connection
  @docker_connection ||= ::Docker::Connection.new(url, credentials)
end

#exist?(name) ⇒ Boolean



52
53
54
# File 'app/models/foreman_docker/docker.rb', line 52

def exist?(name)
  ::Docker::Image.exist?(name, {}, docker_connection)
end

#image(id) ⇒ Object



56
57
58
# File 'app/models/foreman_docker/docker.rb', line 56

def image(id)
  ::Docker::Image.get(id, {}, docker_connection)
end

#local_images(filter = '') ⇒ Object



41
42
43
# File 'app/models/foreman_docker/docker.rb', line 41

def local_images(filter = '')
  ::Docker::Image.all({ 'filter' => filter }, docker_connection)
end

#max_cpu_countObject



33
34
35
# File 'app/models/foreman_docker/docker.rb', line 33

def max_cpu_count
  ::Docker.info['NCPU'] || 1
end

#max_memoryObject



29
30
31
# File 'app/models/foreman_docker/docker.rb', line 29

def max_memory
  16 * 1024 * 1024 * 1024
end

#provided_attributesObject



25
26
27
# File 'app/models/foreman_docker/docker.rb', line 25

def provided_attributes
  super.merge(:mac => :mac)
end

#provider_friendly_nameObject



76
77
78
# File 'app/models/foreman_docker/docker.rb', line 76

def provider_friendly_name
  'Docker'
end

#search(term = '') ⇒ Object



72
73
74
# File 'app/models/foreman_docker/docker.rb', line 72

def search(term = '')
  client.images.image_search(:term => term)
end

#supports_update?Boolean



21
22
23
# File 'app/models/foreman_docker/docker.rb', line 21

def supports_update?
  false
end

#tags(image_name) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
# File 'app/models/foreman_docker/docker.rb', line 60

def tags(image_name)
  if exist?(image_name)
    tags_for_local_image(image(image_name))
  else
    # If image is not found in the compute resource, get the tags from the Hub
    hub_api_url = "https://index.docker.io/v1/repositories/#{image_name}/tags"
    JSON.parse(URI.parse(hub_api_url).read).map do |tag|
      tag['name']
    end
  end
end

#tags_for_local_image(image) ⇒ Object



45
46
47
48
49
50
# File 'app/models/foreman_docker/docker.rb', line 45

def tags_for_local_image(image)
  image.info['RepoTags'].map do |image_tag|
    _, tag = image_tag.split(':')
    tag
  end
end

#test_connection(options = {}) ⇒ Object



118
119
120
121
122
123
124
125
126
# File 'app/models/foreman_docker/docker.rb', line 118

def test_connection(options = {})
  super
  api_version
  credentials.empty? ? true : authenticate!
# This should only rescue Fog::Errors, but Fog returns all kinds of errors...
rescue => e
  errors[:base] << e.message
  false
end

#vm_instance_defaultsObject



95
96
97
98
# File 'app/models/foreman_docker/docker.rb', line 95

def vm_instance_defaults
  ActiveSupport::HashWithIndifferentAccess.new('name' => "foreman_#{Time.now.to_i}",
                                               'Cmd' => ['/bin/bash'])
end