Class: PicsolveDockerBuilder::Helpers::KubernetesManager

Inherits:
Object
  • Object
show all
Includes:
Base
Defined in:
lib/picsolve_docker_builder/helpers/kubernetes_manager.rb

Overview

Ruby representation of a kuberentes cluster

Instance Method Summary collapse

Methods included from Base

#base_dir, #config, #config_path, #create_logger, #default_config, #log, #read_config, #validate_config

Instance Method Details

#clientObject



36
37
38
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 36

def client
  @client ||= create_client
end

#config_service(s, i) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 62

def config_service(s, i)
  # workaround a bug on updating TODO: remove when fixed upstream
  s.name = i.name

  # configure the service
  s. = {} unless s.
  s..name = i.name
  s..namespace = i.composer.namespace
  s..labels = template_labels(i)
  s.spec = {} unless s.spec
  s.spec.ports = i.ports
  s.spec.selector = {
    'name' => i.name
  }
end

#create_clientObject



14
15
16
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 14

def create_client
  Kubeclient::Client.new kubernetes_url, 'v1beta3'
end

#deploy_service(i) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 78

def deploy_service(i)
  existing = false
  begin
    s = client.get_service i.name, i.composer.namespace
    existing = true
  rescue KubeException
    s = Kubeclient::Service.new
  end

  # config config
  config_service(s, i)

  if existing
    log.debug \
      "update service '#{i.composer.namespace}/#{i.name}' on kubernetes"
    client.update_service s
  else
    log.debug \
      "create service '#{i.composer.namespace}/#{i.name}' on kubernetes"
    client.create_service s
  end
end

#kubernetes_hostObject



31
32
33
34
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 31

def kubernetes_host
  # TODO: Need to be touched for multi cluster support
  config['compose']['clusters'].first
end

#kubernetes_urlObject



18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 18

def kubernetes_url
  @ssh_forward = SshForward.new(
    ssh_host: kubernetes_host,
    remote_host: '127.0.0.1',
    remote_port: 8080
  )
  port = @ssh_forward.start
  at_exit do
    @ssh_forward.stop unless @ssh_forward.nil?
  end
  "http://127.0.0.1:#{port}"
end

#rc(image) ⇒ Object



44
45
46
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 44

def rc(image)
  Kubernetes::Rc.new(image, self)
end

#service(image) ⇒ Object



40
41
42
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 40

def service(image)
  Kubernetes::Service.new(image, self)
end

#template_labels(i) ⇒ Object



54
55
56
57
58
59
60
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 54

def template_labels(i)
  {
    'name' => i.name,
    'app_name' => i.composer.app_name,
    'stage' => i.composer.stage
  }
end

#template_labels_pods(i) ⇒ Object



48
49
50
51
52
# File 'lib/picsolve_docker_builder/helpers/kubernetes_manager.rb', line 48

def template_labels_pods(i)
  c = template_labels(i)
  c['deployment'] = i.composer.hash
  c
end