kubec 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e29547dc53808d55661f20349483c90c709d8ae4
4
- data.tar.gz: c2de23b6dbc3444b4ec3d5017ad1e31f227416e2
3
+ metadata.gz: 62c55e240f35b19478f090bcb66fd0b9a32d9180
4
+ data.tar.gz: c484d7863b58f11ef1c35067d3c51ef72732898c
5
5
  SHA512:
6
- metadata.gz: 27ac3b15f987988bc7ec555a98824c3e7377aa386eae3aab00b36b166fad84f8c6ec7ba8acaea572ca295e52acc4dc733dce214e53045fe961c58c94e37f1c6b
7
- data.tar.gz: 2ce1d12f2f50f085e1121ade09320841308545add1eaa5921e843740d553090e6316fe5754276543e421302edced92a21b96c1fec7b35f2d7ce3d76bd5556385
6
+ metadata.gz: 7e95a5579e35ed2dac74a919c2206a95f32832577db1fed071c0b7ef7697a2498b8ae63f85d4d662bd6412abae62a7bf76ede7416e0411be76a396879c295ca6
7
+ data.tar.gz: b16b95cbe52efc8408f534599b3fdfe62cf32b6ede61d442aa708cd4363bf2f4248c6aae90eb27aadc90338ce6ee5ea0e4e6c59352cfc19405fd9826bb0ca7f8
@@ -0,0 +1,6 @@
1
+ module Kubec
2
+ # :nodoc:
3
+ module Config
4
+ autoload :Downloader, 'kubec/config/downloader'
5
+ end
6
+ end
@@ -0,0 +1,51 @@
1
+ module Kubec
2
+ module Config
3
+ # :nodoc:
4
+ class Downloader
5
+ def initialize
6
+ @result = `kubectl -n #{fetch(:stage, :staging)} get configmap -o json`
7
+ @success = $CHILD_STATUS.success?
8
+ @items = {}
9
+
10
+ prepare
11
+ end
12
+
13
+ def save
14
+ Kubernetes.config.each do |config|
15
+ downloaded = @items[config.name]
16
+ config.files.each do |(key, path)|
17
+ write path, downloaded.dig('data', key)
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def prepare
25
+ return unless @success
26
+ items = JSON.parse(@result).dig('items') || []
27
+ items.each do |item|
28
+ name = item.dig('metadata', 'name').to_sym
29
+ @items[name] = item
30
+ end
31
+ end
32
+
33
+ def write(path, body)
34
+ puts "=> #{path} saved"
35
+ File.write(
36
+ path_with_stage(path),
37
+ body
38
+ )
39
+ end
40
+
41
+ # TODO: Refactor
42
+ def path_with_stage(path)
43
+ path.split('.').tap do |ary|
44
+ ext = ary.pop
45
+ ary.push(fetch(:stage, :staging))
46
+ ary.push(ext)
47
+ end.join('.')
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1 @@
1
+ load File.expand_path('../tasks/config.rake', __FILE__)
data/lib/kubec/deploy.rb CHANGED
@@ -1 +1,2 @@
1
1
  load File.expand_path('../tasks/deploy.rake', __FILE__)
2
+ load File.expand_path('../tasks/restart.rake', __FILE__)
@@ -6,7 +6,7 @@ module Kubec
6
6
  module Kubernetes
7
7
  extend Forwardable
8
8
 
9
- def_delegators :kubernetes, :service, :deployment
9
+ def_delegators :kubernetes, :service, :deployment, :config, :cronjob
10
10
 
11
11
  def kubernetes
12
12
  Kubec::Kubernetes.instance
@@ -0,0 +1,49 @@
1
+ module Kubec
2
+ class Kubernetes
3
+ # :nodoc:
4
+ class ConfigMap < Hash
5
+ attr_reader :name, :files
6
+
7
+ def initialize(name, &block)
8
+ @name = name.to_sym
9
+ @files = {}
10
+
11
+ prepare
12
+ instance_eval(&block)
13
+ end
14
+
15
+ def set(key, value)
16
+ self[:data][key] = value
17
+ end
18
+
19
+ # TODO: Refactor
20
+ def file(path)
21
+ key = path.split('/').last
22
+ @files[key] = path
23
+ path = path_with_stage(path) if stage_config_exist?(path)
24
+ set key, File.read(path)
25
+ end
26
+
27
+ private
28
+
29
+ def prepare
30
+ self[:apiVersion] = 'v1'
31
+ self[:metadata] = Metadata.new(@name)
32
+ self[:kind] = 'ConfigMap'
33
+ self[:data] = {}
34
+ end
35
+
36
+ def stage_config_exist?(path)
37
+ File.exist?(path_with_stage(path))
38
+ end
39
+
40
+ def path_with_stage(path)
41
+ path.split('.').tap do |ary|
42
+ ext = ary.pop
43
+ ary.push(fetch(:stage, :staging))
44
+ ary.push(ext)
45
+ end.join('.')
46
+ end
47
+ end
48
+ end
49
+ end
@@ -3,7 +3,6 @@ module Kubec
3
3
  # :nodoc:
4
4
  class Container < Hash
5
5
  include HasAttribute
6
-
7
6
  attribute :image
8
7
  attribute :name
9
8
  attribute :ports
@@ -13,6 +12,26 @@ module Kubec
13
12
  instance_eval(&block)
14
13
  end
15
14
 
15
+ def env(key, value)
16
+ self[:env] ||= []
17
+ self[:env].push name: key,
18
+ value: value.to_s
19
+ end
20
+
21
+ def mount(name, at:)
22
+ self[:volumeMounts] ||= []
23
+ self[:volumeMounts].push name: name,
24
+ mountPath: at
25
+ end
26
+
27
+ # TODO: Auto setup config map volume
28
+ def config_file(name, path:, from:)
29
+ self[:volumeMounts] ||= []
30
+ self[:volumeMounts].push name: from,
31
+ mountPath: [path, name].join('/'),
32
+ subPath: name
33
+ end
34
+
16
35
  # TODO: Add object to check fields
17
36
  def port(container_port, host_port = nil,
18
37
  ip: nil, name: nil, protocol: nil)
@@ -26,6 +45,16 @@ module Kubec
26
45
  }.compact
27
46
  self[:ports].push port
28
47
  end
48
+
49
+ def command(*args)
50
+ args = args.flatten
51
+ self[:command] = args.take(1)
52
+ self[:args] = args.drop(1)
53
+ end
54
+
55
+ def args(*args)
56
+ self[:args] = args.flatten
57
+ end
29
58
  end
30
59
  end
31
60
  end
@@ -0,0 +1,22 @@
1
+ module Kubec
2
+ class Kubernetes
3
+ # :nodoc:
4
+ class CronJob < Config
5
+ api_version 'batch/v1beta1'
6
+
7
+ def schedule(at)
8
+ spec[:schedule] = at
9
+ end
10
+
11
+ def template(&block)
12
+ inst = Template.new
13
+ spec[:jobTemplate] = {
14
+ spec: {
15
+ template: inst
16
+ }
17
+ }
18
+ inst.instance_eval(&block)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -4,7 +4,8 @@ module Kubec
4
4
  class Deployment < Config
5
5
  api_version 'extensions/v1beta1'
6
6
 
7
- def replicas(size)
7
+ def replicas(size = nil)
8
+ return spec[:replicas] || 1 if size.nil?
8
9
  spec[:replicas] = size.to_i
9
10
  end
10
11
 
@@ -12,6 +13,19 @@ module Kubec
12
13
  spec[:template] ||= Template.new
13
14
  spec[:template].instance_eval(&block)
14
15
  end
16
+
17
+ # TODO: Move into module
18
+ def select(key, value)
19
+ spec[:selector] ||= { matchLabels: {} }
20
+ spec[:selector][:matchLabels][key] = value
21
+ end
22
+
23
+ def selector=(labels)
24
+ # TODO: Check labels type
25
+ spec[:selector] = labels
26
+ end
27
+
28
+ alias selector selector=
15
29
  end
16
30
  end
17
31
  end
@@ -11,6 +11,11 @@ module Kubec
11
11
  self[:spec] = {}
12
12
  end
13
13
 
14
+ def volume(name, &block)
15
+ spec[:volumes] ||= []
16
+ spec[:volumes].push Volume.new(name, &block)
17
+ end
18
+
14
19
  def metadata(&block)
15
20
  return self[:metadata] unless block_given?
16
21
  self[:metadata].instance_eval(&block)
@@ -24,6 +29,10 @@ module Kubec
24
29
  spec[:containers] ||= []
25
30
  spec[:containers].push Container.new(name, &block)
26
31
  end
32
+
33
+ def restart(policy)
34
+ spec[:restartPolicy] = policy.to_s.capitalize
35
+ end
27
36
  end
28
37
  end
29
38
  end
@@ -0,0 +1,42 @@
1
+ module Kubec
2
+ class Kubernetes
3
+ # :nodoc:
4
+ class Volume < Hash
5
+ def initialize(name, &block)
6
+ self[:name] = name
7
+ instance_eval(&block)
8
+ end
9
+
10
+ def empty(memory = false)
11
+ self[:emptyDir] = if memory
12
+ { medium: true }
13
+ else
14
+ {}
15
+ end
16
+ end
17
+
18
+ def host_path(path, type = nil)
19
+ self[:hostPath] = { path: path }
20
+ self[:hostPath][:type] = type unless type.nil?
21
+ end
22
+
23
+ def gce(name, type: 'ext4', ro: false)
24
+ self[:gcePersistentDisk] = {
25
+ pdName: name,
26
+ fsType: type,
27
+ readOnly: ro
28
+ }
29
+ end
30
+
31
+ # TODO: Check for should create a new class to handle
32
+ def config(name, items)
33
+ self[:configMap] = {
34
+ name: name,
35
+ items: items.map do |key, path|
36
+ { key: key, path: path }
37
+ end
38
+ }
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,21 +1,22 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Kubec
4
2
  # Kubernetes
5
3
  class Kubernetes
6
- autoload :Config, 'kubec/kubernetes/config'
7
- autoload :Template, 'kubec/kubernetes/template'
8
- autoload :Service, 'kubec/kubernetes/service'
9
- autoload :Deployment, 'kubec/kubernetes/deployment'
10
- autoload :Metadata, 'kubec/kubernetes/metadata'
11
- autoload :Spec, 'kubec/kubernetes/spec'
12
- autoload :Container, 'kubec/kubernetes/container'
4
+ autoload :Config, 'kubec/kubernetes/config'
5
+ autoload :ConfigMap, 'kubec/kubernetes/config_map'
6
+ autoload :CronJob, 'kubec/kubernetes/cron_job'
7
+ autoload :Template, 'kubec/kubernetes/template'
8
+ autoload :Service, 'kubec/kubernetes/service'
9
+ autoload :Deployment, 'kubec/kubernetes/deployment'
10
+ autoload :Metadata, 'kubec/kubernetes/metadata'
11
+ autoload :Spec, 'kubec/kubernetes/spec'
12
+ autoload :Container, 'kubec/kubernetes/container'
13
+ autoload :Volume, 'kubec/kubernetes/volume'
13
14
 
14
15
  autoload :HasAttribute, 'kubec/kubernetes/has_attribute'
15
16
 
16
17
  include Singleton
17
18
 
18
- APPLYABLE_TYPES = %i[service deployment].freeze
19
+ APPLYABLE_TYPES = %i[service deployment config cronjob].freeze
19
20
 
20
21
  class << self
21
22
  def apply(type)
@@ -56,6 +57,8 @@ module Kubec
56
57
  def initialize
57
58
  @services = []
58
59
  @deployments = []
60
+ @configs = []
61
+ @cronjobs = []
59
62
  end
60
63
 
61
64
  def service(name = nil, &block)
@@ -67,5 +70,15 @@ module Kubec
67
70
  return @deployments if name.nil?
68
71
  @deployments << Kubernetes::Deployment.new(name, &block)
69
72
  end
73
+
74
+ def config(name = nil, &block)
75
+ return @configs if name.nil?
76
+ @configs << Kubernetes::ConfigMap.new(name, &block)
77
+ end
78
+
79
+ def cronjob(name = nil, &block)
80
+ return @cronjobs if name.nil?
81
+ @cronjobs << Kubernetes::CronJob.new(name, &block)
82
+ end
70
83
  end
71
84
  end
@@ -0,0 +1,13 @@
1
+ namespace :config do
2
+ desc 'Upload config files using ConfigMap'
3
+ task push: ['deploy:namespace'] do
4
+ Kubec::Utils::Helper.header 'Starting apply config maps'
5
+ Kubec::Kubernetes.apply(:config)
6
+ end
7
+
8
+ desc 'Download config files from ConfigMap'
9
+ task pull: ['deploy:namespace'] do
10
+ Kubec::Utils::Helper.header 'Starting save config maps'
11
+ Kubec::Config::Downloader.new.save
12
+ end
13
+ end
@@ -15,11 +15,18 @@ namespace :deploy do
15
15
  Kubec::Utils::Helper.header 'Starting apply services'
16
16
  Kubec::Kubernetes.apply(:service)
17
17
  end
18
+
19
+ desc 'Apply Service to Kubernetes'
20
+ task :cronjobs do
21
+ Kubec::Utils::Helper.header 'Starting apply cron jobs'
22
+ Kubec::Kubernetes.apply(:cronjob)
23
+ end
18
24
  end
19
25
 
20
26
  desc 'Deploy to Kubernetes'
21
27
  task deploy: [
22
28
  'deploy:namespace',
23
29
  'deploy:deployments',
24
- 'deploy:services'
30
+ 'deploy:services',
31
+ 'deploy:cronjobs'
25
32
  ]
@@ -0,0 +1,17 @@
1
+ desc 'Restart all services'
2
+ task :restart do
3
+ # TODO: Refactor this section
4
+ stage = fetch(:stage, :staging)
5
+ def scale(stage, name, size)
6
+ `kubectl -n #{stage} scale deployment/#{name} --replicas=#{size}`
7
+ end
8
+
9
+ Kubec::Utils::Helper.header 'Restarting deployments'
10
+ Kubec::Kubernetes.deployment.each do |deploy|
11
+ Thread.new do
12
+ puts "=> Restart #{deploy.name}"
13
+ scale(stage, deploy.name, 0)
14
+ scale(stage, deploy.name, deploy.replicas)
15
+ end.join
16
+ end
17
+ end
@@ -3,4 +3,5 @@ require 'kubec/setup'
3
3
 
4
4
  # Add deploy scripts
5
5
  require 'kubec/deploy'
6
+ require 'kubec/config'
6
7
  require 'kubec/status'
@@ -10,7 +10,7 @@ module Kubec
10
10
  ].freeze
11
11
 
12
12
  SHORT = {
13
- seocnds: 's',
13
+ seconds: 's',
14
14
  minutes: 'm',
15
15
  hours: 'h',
16
16
  days: 'd'
data/lib/kubec/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Kubec
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
data/lib/kubec.rb CHANGED
@@ -17,4 +17,5 @@ module Kubec
17
17
  autoload :DSL, 'kubec/dsl'
18
18
  autoload :Status, 'kubec/status/base'
19
19
  autoload :Utils, 'kubec/utils'
20
+ autoload :Config, 'kubec/config/base'
20
21
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kubec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - 5xRuby
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2018-01-12 00:00:00.000000000 Z
12
+ date: 2018-01-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: colorize
@@ -147,6 +147,9 @@ files:
147
147
  - lib/Kubeconfig
148
148
  - lib/kubec.rb
149
149
  - lib/kubec/application.rb
150
+ - lib/kubec/config.rb
151
+ - lib/kubec/config/base.rb
152
+ - lib/kubec/config/downloader.rb
150
153
  - lib/kubec/deploy.rb
151
154
  - lib/kubec/dsl.rb
152
155
  - lib/kubec/dsl/env.rb
@@ -157,20 +160,25 @@ files:
157
160
  - lib/kubec/install.rb
158
161
  - lib/kubec/kubernetes.rb
159
162
  - lib/kubec/kubernetes/config.rb
163
+ - lib/kubec/kubernetes/config_map.rb
160
164
  - lib/kubec/kubernetes/container.rb
165
+ - lib/kubec/kubernetes/cron_job.rb
161
166
  - lib/kubec/kubernetes/deployment.rb
162
167
  - lib/kubec/kubernetes/has_attribute.rb
163
168
  - lib/kubec/kubernetes/metadata.rb
164
169
  - lib/kubec/kubernetes/service.rb
165
170
  - lib/kubec/kubernetes/template.rb
171
+ - lib/kubec/kubernetes/volume.rb
166
172
  - lib/kubec/setup.rb
167
173
  - lib/kubec/status.rb
168
174
  - lib/kubec/status/base.rb
169
175
  - lib/kubec/status/deployment.rb
170
176
  - lib/kubec/status/pod.rb
171
177
  - lib/kubec/status/service.rb
178
+ - lib/kubec/tasks/config.rake
172
179
  - lib/kubec/tasks/deploy.rake
173
180
  - lib/kubec/tasks/install.rake
181
+ - lib/kubec/tasks/restart.rake
174
182
  - lib/kubec/tasks/status.rake
175
183
  - lib/kubec/templates/Kubeconfig
176
184
  - lib/kubec/templates/config/kubec.rb