class Algo::Dsl::Service::Context

Attributes

context[R]

Public Class Methods

new(name, cluster) click to toggle source
# File lib/algo/dsl/service.rb, line 60
def initialize name, cluster
  @cluster = cluster
  @context = {
    'Name' => "#{cluster_prefix}#{name}",
    'TaskTemplate' => {
      'ContainerSpec' => {
        'Image' => nil
      }
    },
    'Mode' => {
      'Replicated' => {
        'Replicas' => 1
      }
    },
    'Labels' => @cluster['labels']
  }
  @context['TaskTemplate']['ContainerSpec']['Env'] = @cluster['env'] if @cluster['env'].present?
end

Public Instance Methods

args(*items) click to toggle source
# File lib/algo/dsl/service.rb, line 89
def args *items
  @context['TaskTemplate']['ContainerSpec']['Args'] = items
end
command(*item) click to toggle source
# File lib/algo/dsl/service.rb, line 85
def command *item
  @context['TaskTemplate']['ContainerSpec']['Command'] = item
end
constraint(condition) click to toggle source

Placement

# File lib/algo/dsl/service.rb, line 174
def constraint condition
  @context['TaskTemplate']['Placement'] ||= {}
  @context['TaskTemplate']['Placement']['Constraints'] ||= []
  @context['TaskTemplate']['Placement']['Constraints'] << condition
end
endpoint_mode(mode) click to toggle source

@param [String] mode vip or dnsrr

# File lib/algo/dsl/service.rb, line 201
def endpoint_mode mode
  @context['EndpointSpec'] = { 'Mode' => mode }
end
env(key, val) click to toggle source
# File lib/algo/dsl/service.rb, line 93
def env key, val
  @context['TaskTemplate']['ContainerSpec']['Env'] ||= []
  @context['TaskTemplate']['ContainerSpec']['Env'] << "#{key}=#{val}"
end
global() click to toggle source
# File lib/algo/dsl/service.rb, line 194
def global
  @context['Mode'] = { 'Global' => {} }
end
image(image_name) click to toggle source

ContainerSpec

# File lib/algo/dsl/service.rb, line 81
def image image_name
  @context['TaskTemplate']['ContainerSpec']['Image'] = image_name
end
label(key, val) click to toggle source

Label

# File lib/algo/dsl/service.rb, line 183
def label key, val
  @context['Labels'] ||= {}
  @context['Labels'][key] = val
end
limit_cpu(decimal) click to toggle source

Resources

# File lib/algo/dsl/service.rb, line 122
def limit_cpu decimal
  @context['TaskTemplate']['Resources'] ||= {}
  @context['TaskTemplate']['Resources']['Limits'] ||= {}
  @context['TaskTemplate']['Resources']['Limits']['NanoCPUs'] = decimal * 1e9
end
limit_memory(memory) click to toggle source

@param [String] memory num with unit like 1B 20KB 30MB 1GB

# File lib/algo/dsl/service.rb, line 129
def limit_memory memory
  @context['TaskTemplate']['Resources'] ||= {}
  @context['TaskTemplate']['Resources']['Limits'] ||= {}
  @context['TaskTemplate']['Resources']['Limits']['MemoryBytes'] = memory_from_string memory
end
network(name) click to toggle source

Networks

# File lib/algo/dsl/service.rb, line 232
def network name
  @context['Networks'] ||= []
  @context['Networks'] << { 'Target' => "#{cluster_prefix}#{name}" }
end
publish(port) click to toggle source

@param [String] port like 80 or 80:80 or 80/udp

# File lib/algo/dsl/service.rb, line 206
def publish port
  port, protocol = *port.split('/')  if '/'.in? port
  target, publish = *port.split(':')  if ':'.in? port
  @context['EndpointSpec'] ||= {}
  @context['EndpointSpec']['Ports'] ||= []
  @context['EndpointSpec']['Ports'] << {
    'Protocol' => protocol,
    'TargetPort' => target,
    'PublishedPort' => publish
  }.compact
end
replicas(replica_size) click to toggle source

Mode

# File lib/algo/dsl/service.rb, line 190
def replicas replica_size
  @context['Mode'] = { 'Replicated' => { 'Replicas' => replica_size } }
end
reserve_cpu(decimal) click to toggle source
# File lib/algo/dsl/service.rb, line 135
def reserve_cpu decimal
  @context['TaskTemplate']['Resources'] ||= {}
  @context['TaskTemplate']['Resources']['Reservation'] ||= {}
  @context['TaskTemplate']['Resources']['Reservation']['NanoCPUs'] = decimal * 1e9
end
reserve_memory(memory) click to toggle source

@param [String] memory num with unit like 1B 20KB 30MB 1GB

# File lib/algo/dsl/service.rb, line 142
def reserve_memory memory
  @context['TaskTemplate']['Resources'] ||= {}
  @context['TaskTemplate']['Resources']['Reservation'] ||= {}
  @context['TaskTemplate']['Resources']['Reservation']['MemoryBytes'] = memory_from_string memory
end
restart_condition(name) click to toggle source

@param [String] name none, on-failure or any

# File lib/algo/dsl/service.rb, line 151
def restart_condition name
  @context['TaskTemplate']['RestartPolicy'] ||= {}
  @context['TaskTemplate']['RestartPolicy']['Condition'] = name
end
restart_delay(period) click to toggle source
# File lib/algo/dsl/service.rb, line 156
def restart_delay period
  @context['TaskTemplate']['RestartPolicy'] ||= {}
  @context['TaskTemplate']['RestartPolicy']['Delay'] = second_from_string(period) * 10e9
end
restart_max_attempts(value) click to toggle source

@param [Integer] value

# File lib/algo/dsl/service.rb, line 162
def restart_max_attempts value
  @context['TaskTemplate']['RestartPolicy'] ||= {}
  @context['TaskTemplate']['RestartPolicy']['Attempts'] = value
end
restart_window(value) click to toggle source
# File lib/algo/dsl/service.rb, line 167
def restart_window value
  @context['TaskTemplate']['RestartPolicy'] ||= {}
  @context['TaskTemplate']['RestartPolicy']['Window'] = second_from_string(period) * 10e9
end
stop_grace_period(period) click to toggle source

@param [String] period period string like 30s, 1m, 4h

# File lib/algo/dsl/service.rb, line 107
def stop_grace_period period
  @context['TaskTemplate']['ContainerSpec']['StopGracePeriod'] = second_from_string(period) * 1e9
end
update_delay(n) click to toggle source
# File lib/algo/dsl/service.rb, line 225
def update_delay n
  @context['UpdateConfig'] ||= {}
  @context['UpdateConfig']['Delay']= n
end
update_parallelism(n) click to toggle source

UpdateConfig

# File lib/algo/dsl/service.rb, line 220
def update_parallelism n
  @context['UpdateConfig'] ||= {}
  @context['UpdateConfig']['Parallelism']= n
end
user(name) click to toggle source
# File lib/algo/dsl/service.rb, line 102
def user name
  @context['TaskTemplate']['ContainerSpec']['User'] = name
end
volume(&block) click to toggle source
# File lib/algo/dsl/service.rb, line 111
def volume &block
  raise 'should be called in cluster' unless @context
  ctx = Service::VolumeContext.new(@cluster, @context).tap do |ctx|
    ctx.instance_eval(&block)
  end
  @context['TaskTemplate']['ContainerSpec']['Mounts'] ||= []
  @context['TaskTemplate']['ContainerSpec']['Mounts'] << ctx.context
end
workdir(name) click to toggle source
# File lib/algo/dsl/service.rb, line 98
def workdir name
  @context['TaskTemplate']['ContainerSpec']['Dir'] = name
end

Private Instance Methods

cluster_prefix() click to toggle source
# File lib/algo/dsl/service.rb, line 239
def cluster_prefix
  "#{@cluster['prefix']}-" if @cluster['prefix']
end
memory_from_string(memory) click to toggle source
# File lib/algo/dsl/service.rb, line 255
def memory_from_string(memory)
  if memory.end_with?('B')
    memory.chomp('B').to_i
  elsif memory.end_with?('KB')
    memory.chomp('KB').to_i * 1e3
  elsif memory.end_with?('MB')
    memory.chomp('MB').to_i * 1e6
  elsif memory.end_with?('GB')
    memory.chomp('GB').to_i * 1e9
  elsif memory.end_with?('TB')
    memory.chomp('TB').to_i * 1e12
  else
    raise
  end
end
second_from_string(period) click to toggle source
# File lib/algo/dsl/service.rb, line 243
def second_from_string(period)
  if period.end_with?('s')
    period.chomp('s').to_i
  elsif period.end_with?('m')
    period.chomp('m').to_i * 60
  elsif period.end_with?('h')
    period.chomp('m').to_i * 60 * 60
  else
    raise
  end
end