Class: Jarl::Application

Inherits:
Object
  • Object
show all
Defined in:
lib/jarl/application.rb

Defined Under Namespace

Classes: Instance

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(group, name, params, base_path) ⇒ Application

Create Application object from application definition:

app_name:

image: blabla
volumes:
  - /host/path:/container/path
ports:
  - 1234:5678
command: blabla


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/jarl/application.rb', line 17

def initialize(group, name, params, base_path)
  @group = group
  @name = name
  @base_path = base_path
  @image = params['image'] || fail("Application '#{self}' has no 'image' defined")
  unless @image.is_a?(String)
    fail "Application '#{self}' has invalid 'image' definition, String is expected"
  end
  @scale = params['scale'] || 1
  unless @scale.is_a?(Integer) && @scale > 0
    fail "Application '#{self}' has invalid 'scale' definition, Integer > 0 is expected"
  end
  @volumes = params['volumes'] || []
  unless @volumes.is_a?(Array)
    fail "Application '#{self}' has invalid 'volumes' definition, Array is expected"
  end
  @ports = params['ports'] || []
  unless @ports.is_a?(Array)
    fail "Application '#{self}' has invalid 'ports' definition, Array is expected"
  end
  @environment = params['environment'] || {}
  unless @environment.is_a?(Hash)
    fail "Application '#{self}' has invalid 'environment' definition, Hash is expected"
  end
  @entrypoint = params['entrypoint']
  if @entrypoint && !@entrypoint.is_a?(String)
    fail "Application '#{self}' has invalid 'entrypoint' definition, String is expected"
  end
  @command = params['command']
  if @command && !@command.is_a?(String)
    fail "Application '#{self}' has invalid 'command' definition, String is expected"
  end
  @serial = self.class.next_serial
  @hostname = @name
end

Instance Attribute Details

#base_pathObject (readonly)

Returns the value of attribute base_path.



3
4
5
# File 'lib/jarl/application.rb', line 3

def base_path
  @base_path
end

#commandObject (readonly)

Returns the value of attribute command.



4
5
6
# File 'lib/jarl/application.rb', line 4

def command
  @command
end

#entrypointObject (readonly)

Returns the value of attribute entrypoint.



4
5
6
# File 'lib/jarl/application.rb', line 4

def entrypoint
  @entrypoint
end

#environmentObject (readonly)

Returns the value of attribute environment.



4
5
6
# File 'lib/jarl/application.rb', line 4

def environment
  @environment
end

#groupObject (readonly)

Returns the value of attribute group.



3
4
5
# File 'lib/jarl/application.rb', line 3

def group
  @group
end

#hostnameObject (readonly)

Returns the value of attribute hostname.



3
4
5
# File 'lib/jarl/application.rb', line 3

def hostname
  @hostname
end

#imageObject (readonly)

Returns the value of attribute image.



4
5
6
# File 'lib/jarl/application.rb', line 4

def image
  @image
end

#nameObject (readonly)

Returns the value of attribute name.



3
4
5
# File 'lib/jarl/application.rb', line 3

def name
  @name
end

#portsObject (readonly)

Returns the value of attribute ports.



4
5
6
# File 'lib/jarl/application.rb', line 4

def ports
  @ports
end

#scaleObject (readonly)

Returns the value of attribute scale.



4
5
6
# File 'lib/jarl/application.rb', line 4

def scale
  @scale
end

#serialObject (readonly)

Returns the value of attribute serial.



5
6
7
# File 'lib/jarl/application.rb', line 5

def serial
  @serial
end

#volumesObject (readonly)

Returns the value of attribute volumes.



4
5
6
# File 'lib/jarl/application.rb', line 4

def volumes
  @volumes
end

Class Method Details

.next_serialObject



151
152
153
154
155
# File 'lib/jarl/application.rb', line 151

def self.next_serial
  @current_serial ||= 0
  @current_serial += 1
  @current_serial - 1
end

Instance Method Details

#buildObject



127
128
129
# File 'lib/jarl/application.rb', line 127

def build
  Docker::Image.new(image_name, image_full_path).build!
end

#execute(execute_command, args) ⇒ Object



110
111
112
113
114
115
116
117
118
119
120
# File 'lib/jarl/application.rb', line 110

def execute(execute_command, args)
  Docker.execute(
    name: full_name,
    hostname: hostname,
    image: image_name,
    volumes: volumes,
    ports: ports,
    environment: environment,
    command: (execute_command || command || '') + ' ' + args.join(' ')
  )
end

#full_nameObject



53
54
55
# File 'lib/jarl/application.rb', line 53

def full_name
  "#{group}.#{name}"
end

#image_full_pathObject



143
144
145
# File 'lib/jarl/application.rb', line 143

def image_full_path
  image_is_a_path? ? Pathname.new(base_path).join(image).expand_path : nil
end

#image_is_a_path?Boolean



57
58
59
# File 'lib/jarl/application.rb', line 57

def image_is_a_path?
  image =~ /^[~\.\/]/
end

#image_is_a_registry_path?Boolean



61
62
63
# File 'lib/jarl/application.rb', line 61

def image_is_a_registry_path?
  image =~ /^.+:\d+\//
end

#image_nameObject



135
136
137
# File 'lib/jarl/application.rb', line 135

def image_name
  image_is_a_path? ? File.basename(image) : image
end

#image_pathObject



139
140
141
# File 'lib/jarl/application.rb', line 139

def image_path
  image_is_a_path? ? image : nil
end

#instancesObject



69
70
71
# File 'lib/jarl/application.rb', line 69

def instances
  running_instances + stopped_instances
end

#pullObject



131
132
133
# File 'lib/jarl/application.rb', line 131

def pull
  Docker::Image.new(image_name, image_full_path).pull!
end

#running?Boolean



65
66
67
# File 'lib/jarl/application.rb', line 65

def running?
  instances.any?(&:running?)
end

#running_containersObject



73
74
75
76
77
# File 'lib/jarl/application.rb', line 73

def running_containers
  @running_containers ||= Docker.containers_running.select do |c|
    c.name =~ /^#{full_name}(\.\d+)?$/
  end
end

#running_instancesObject



79
80
81
82
83
84
85
# File 'lib/jarl/application.rb', line 79

def running_instances
  @running_instances ||= running_containers.map do |c|
    n = c.name.sub(/^#{full_name}\.?/, '')
    n = n.empty? ? nil : n.to_i
    Instance.new(self, n, c)
  end
end

#ssh(command = nil) ⇒ Object



122
123
124
125
# File 'lib/jarl/application.rb', line 122

def ssh(command = nil)
  fail 'Not a running application' unless running?
  instances.first.ssh(command)
end

#startObject

Start instances of the application



101
102
103
104
105
106
107
108
# File 'lib/jarl/application.rb', line 101

def start
  instances.map(&:stop!) if running?
  if scale > 1
    scale.times { |n| Instance.start(self, n + 1) }
  else
    Instance.start(self)
  end
end

#stopped_instancesObject



87
88
89
90
91
92
93
94
95
96
97
# File 'lib/jarl/application.rb', line 87

def stopped_instances
  return @stopped_instances if @stopped_instances
  n_range = scale == 1 ? [nil] : (1..scale).to_a
  @stopped_instances = n_range.reject do |n|
    running_instances.map(&:n).include?(n)
  end
  @stopped_instances = @stopped_instances.map do |n|
    Instance.new(self, n, nil)
  end
  @stopped_instances
end

#to_sObject



147
148
149
# File 'lib/jarl/application.rb', line 147

def to_s
  full_name
end