Class: PicsolveDockerBuilder::Composer::Composer

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

Overview

The composer parses a docker-compose.yml and tries to spin up the containers in a kubernetes cluster

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Base

#config, #config_file, #config_path, #config_paths, #create_logger, #log, #read_config, #validate_config

Constructor Details

#initializeComposer

Returns a new instance of Composer.



17
18
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 17

def initialize
end

Instance Attribute Details

#stageObject

Returns the value of attribute stage.



15
16
17
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 15

def stage
  @stage
end

Instance Method Details

#app_nameObject



28
29
30
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 28

def app_name
  config['compose']['app_name'].downcase.gsub(/[^a-z0-9\-]/, '-')
end

#base_dirObject



108
109
110
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 108

def base_dir
  Dir.pwd
end

#cleanupObject



58
59
60
61
62
63
64
65
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 58

def cleanup
  kubernetes_clusters.each do |cluster|
    begin
      log.info "Cleanup kubernetes cluster #{cluster.host}"
      cluster.cleanup
    end
  end
end

#default_configObject



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

def default_config
  { 'compose' => {} }
end

#deployObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 67

def deploy
  errors = 0
  kubernetes_clusters.each do |cluster|
    begin
      log.info "Deploy to kubernetes cluster #{cluster.host}"
      cluster.deploy
      cluster.stop
    rescue StandardError => e
      errors += 1
      log.error "Failed deployment to kubernetes cluster: #{e}"
      e.backtrace.each do |line|
        log.error line
      end
    end
  end
  fail 'deployment to at least one cluster failed' if errors > 0
end

#docker_composeObject



104
105
106
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 104

def docker_compose
  @docker_compose ||= read_docker_compose
end

#docker_compose_pathObject



112
113
114
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 112

def docker_compose_path
  File.join(base_dir, 'docker-compose.yml')
end

#hashObject



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

def hash
  @hash ||= SecureRandom.hex[0..7]
end

#imagesObject



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

def images
  @images ||= read_images
end

#kubernetes_clustersObject



48
49
50
51
52
53
54
55
56
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 48

def kubernetes_clusters
  config['compose']['clusters'].map do |cluster|
    PicsolveDockerBuilder::Helpers::KubernetesManager.new(
      self,
      cluster,
      :ssh_forward, # TODO: support other types here
    )
  end
end

#namespaceObject



32
33
34
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 32

def namespace
  "#{app_name}-#{stage}".downcase
end

#prepareObject



20
21
22
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 20

def prepare
  images
end

#query_registryObject



124
125
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 124

def query_registry
end

#read_docker_composeObject



116
117
118
119
120
121
122
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 116

def read_docker_compose
  path = docker_compose_path
  Psych.load_file path
rescue Errno::ENOENT
  log.debug "can not find docker-compose.yml at '#{path}'"
  nil
end

#read_imagesObject



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/picsolve_docker_builder/composer/composer.rb', line 85

def read_images
  # classic config
  containers = docker_compose
  unless containers.nil?
    i = []
    containers.each do |name, config|
      i << Container.new(name, config, self)
    end
    return i
  end

  # new approach to handle config
  c = PicsolveDockerBuilder::Helpers::ConfigManager.new(
    config_paths,
    stage
  )
  c.containers(self)
end