kuby-core 0.7.2 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/kuby-core.gemspec +5 -3
  4. data/lib/kuby.rb +5 -3
  5. data/lib/kuby/definition.rb +0 -8
  6. data/lib/kuby/docker/layer.rb +4 -4
  7. data/lib/kuby/docker/metadata.rb +6 -6
  8. data/lib/kuby/docker/package_phase.rb +2 -2
  9. data/lib/kuby/docker/spec.rb +11 -11
  10. data/lib/kuby/environment.rb +6 -2
  11. data/lib/kuby/kubernetes.rb +0 -2
  12. data/lib/kuby/kubernetes/deploy_task.rb +0 -1
  13. data/lib/kuby/kubernetes/deployer.rb +7 -7
  14. data/lib/kuby/kubernetes/minikube_provider.rb +4 -0
  15. data/lib/kuby/kubernetes/provider.rb +5 -5
  16. data/lib/kuby/kubernetes/spec.rb +8 -8
  17. data/lib/kuby/plugin.rb +59 -0
  18. data/lib/kuby/plugins.rb +6 -0
  19. data/lib/kuby/plugins/nginx_ingress.rb +71 -0
  20. data/lib/kuby/plugins/rails_app.rb +18 -0
  21. data/lib/kuby/plugins/rails_app/asset_copy_task.rb +117 -0
  22. data/lib/kuby/plugins/rails_app/assets.rb +347 -0
  23. data/lib/kuby/plugins/rails_app/database.rb +75 -0
  24. data/lib/kuby/{kubernetes/plugins → plugins}/rails_app/generators/kuby.rb +0 -0
  25. data/lib/kuby/plugins/rails_app/mysql.rb +155 -0
  26. data/lib/kuby/plugins/rails_app/plugin.rb +398 -0
  27. data/lib/kuby/plugins/rails_app/postgres.rb +143 -0
  28. data/lib/kuby/plugins/rails_app/rewrite_db_config.rb +11 -0
  29. data/lib/kuby/plugins/rails_app/sqlite.rb +32 -0
  30. data/lib/kuby/{kubernetes/plugins → plugins}/rails_app/tasks.rake +10 -2
  31. data/lib/kuby/tasks.rb +9 -9
  32. data/lib/kuby/tasks/kuby.rake +1 -1
  33. data/lib/kuby/version.rb +1 -1
  34. metadata +34 -27
  35. data/lib/ext/krane/kubernetes_resource.rb +0 -16
  36. data/lib/kuby/kubernetes/plugin.rb +0 -55
  37. data/lib/kuby/kubernetes/plugins.rb +0 -8
  38. data/lib/kuby/kubernetes/plugins/nginx_ingress.rb +0 -73
  39. data/lib/kuby/kubernetes/plugins/rails_app.rb +0 -16
  40. data/lib/kuby/kubernetes/plugins/rails_app/database.rb +0 -79
  41. data/lib/kuby/kubernetes/plugins/rails_app/mysql.rb +0 -154
  42. data/lib/kuby/kubernetes/plugins/rails_app/plugin.rb +0 -379
  43. data/lib/kuby/kubernetes/plugins/rails_app/postgres.rb +0 -142
  44. data/lib/kuby/kubernetes/plugins/rails_app/rewrite_db_config.rb +0 -13
  45. data/lib/kuby/kubernetes/plugins/rails_app/sqlite.rb +0 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a163afc89c23d091afce04277e9308252ae8335f8137f2136b68355dccb74bc2
4
- data.tar.gz: 617007a29710ec9359dc4f3d5b31d850e22a0eacdc70175c444cf6d94a53462f
3
+ metadata.gz: ac73b245f1fb75244ed166e23a6441cc56dabaec66f532f67517b4dd8d412091
4
+ data.tar.gz: 6418a3fbca89fdc195e277aeb8309caa2b519e1d3df0fccd53f3ae8b2e9f166f
5
5
  SHA512:
6
- metadata.gz: 8fd6302f94ffa2a740928bd324ca5e2bbe251f49356ce582e581c4d91740b66425b6c1a3b392e40fe7c52e649781fe939fa377d6894e435e00386ddaed0f4ee3
7
- data.tar.gz: 4ae55a8fc6c4aeceac417b54e41f679a988c34788e5740e268ddeb728223f949915c17e8bc738ffcd744a257a1d5ba74cf431d1df90c8b5b496eaa51861229d6
6
+ metadata.gz: 6f7bc8616cfdf23805bf9177198f62888b17372ae67b4fb4a77c4d325adbbcf6d734385edb0614094be95bb443d84b28f6d79fe70a8acaecdfb44b547bcf86b0
7
+ data.tar.gz: 815fd1ae302c35fdd0fb31f43bb1d607073a9cfb1f24d3c849578b0b8a5271bca5cbe49f2747bdf7bb22d1a4b98d1fa455c3a917e7d27f059f5a4778da215f87
@@ -1,3 +1,12 @@
1
+ ## 0.8.0
2
+ * Upgrade to Krane >= 1.1.4, < 2.0.
3
+ * Remove Krane monkeypatch in ext/.
4
+ * Implement a Rails static asset server.
5
+ * Move plugins from `Kuby::Kubernetes` namespace to `Kuby` namespace.
6
+ - This is to eventually enable plugins to modify the Dockerfile and introduce additional Dockerfiles (i.e. to enable a development mode, etc).
7
+ * Pass `Environment` instead of `Definition` instances around.
8
+ - Providers, plugins, etc all take `Definition` instances. `Definition#kubernetes`, for example, returns the Kubernetes spec for the `Environment` specified by `KUBY_ENV` (or the first env defined if `KUBY_ENV` is not set). This is a problem for Kuby configs that specify multiple environments, and causes plugins to make changes to the default environment instead of the one they've been specifically added to. For example, if the `:production` env is defined first, the `:development` env still gets a cluster issuer from cert-manager even though `enable_tls` is set to `false`.
9
+
1
10
  ## 0.7.2
2
11
  * Fix issue causing `Kuby.environment(...)` to raise an `UndefinedEnvironmentError` for existing environments.
3
12
 
@@ -14,10 +14,12 @@ Gem::Specification.new do |s|
14
14
 
15
15
  s.add_dependency 'colorize', '~> 0.8'
16
16
  s.add_dependency 'docker-remote', '~> 0.1'
17
- s.add_dependency 'krane', '~> 1.0'
18
- s.add_dependency 'kuby-cert-manager', '~> 0.2'
17
+ # See: https://github.com/Shopify/krane/pull/720
18
+ # See: https://github.com/Shopify/krane/blob/master/CHANGELOG.md#114
19
+ s.add_dependency 'krane', '>= 1.1.4', '< 2.0'
20
+ s.add_dependency 'kuby-cert-manager', '>= 0.3'
19
21
  s.add_dependency 'kube-dsl', '~> 0.3'
20
- s.add_dependency 'kuby-kube-db', '~> 0.4'
22
+ s.add_dependency 'kuby-kube-db', '>= 0.5'
21
23
  s.add_dependency 'kubernetes-cli', '~> 0.2'
22
24
  s.add_dependency 'railties', '>= 5.1'
23
25
  s.add_dependency 'rouge', '~> 3.0'
@@ -1,7 +1,7 @@
1
1
  require 'kuby/railtie'
2
2
 
3
3
  begin
4
- require 'kuby/kubernetes/plugins/rails_app/generators/kuby'
4
+ require 'kuby/plugins/rails_app/generators/kuby'
5
5
  rescue NameError
6
6
  end
7
7
 
@@ -13,6 +13,8 @@ module Kuby
13
13
  autoload :Environment, 'kuby/environment'
14
14
  autoload :Kubernetes, 'kuby/kubernetes'
15
15
  autoload :Middleware, 'kuby/middleware'
16
+ autoload :Plugin, 'kuby/plugin'
17
+ autoload :Plugins, 'kuby/plugins'
16
18
  autoload :Tasks, 'kuby/tasks'
17
19
  autoload :TrailingHash, 'kuby/trailing_hash'
18
20
 
@@ -107,8 +109,8 @@ end
107
109
  Kuby.register_provider(:minikube, Kuby::Kubernetes::MinikubeProvider)
108
110
 
109
111
  # plugins
110
- Kuby.register_plugin(:rails_app, Kuby::Kubernetes::Plugins::RailsApp::Plugin)
111
- Kuby.register_plugin(:nginx_ingress, Kuby::Kubernetes::Plugins::NginxIngress)
112
+ Kuby.register_plugin(:rails_app, Kuby::Plugins::RailsApp::Plugin)
113
+ Kuby.register_plugin(:nginx_ingress, Kuby::Plugins::NginxIngress)
112
114
 
113
115
  # distros
114
116
  Kuby.register_distro(:debian, Kuby::Docker::Debian)
@@ -20,14 +20,6 @@ module Kuby
20
20
  environments[name]
21
21
  end
22
22
 
23
- def docker(&block)
24
- environment.docker(&block)
25
- end
26
-
27
- def kubernetes(&block)
28
- environment.kubernetes(&block)
29
- end
30
-
31
23
  def environments
32
24
  @environments ||= {}
33
25
  end
@@ -1,10 +1,10 @@
1
1
  module Kuby
2
2
  module Docker
3
3
  class Layer
4
- attr_reader :definition
4
+ attr_reader :environment
5
5
 
6
- def initialize(definition)
7
- @definition = definition
6
+ def initialize(environment)
7
+ @environment = environment
8
8
  end
9
9
 
10
10
  def apply_to(dockerfile)
@@ -15,7 +15,7 @@ module Kuby
15
15
  private
16
16
 
17
17
  def metadata
18
- definition.docker.metadata
18
+ environment.docker.metadata
19
19
  end
20
20
  end
21
21
  end
@@ -8,10 +8,10 @@ module Kuby
8
8
  LATEST_TAG = 'latest'
9
9
 
10
10
  attr_accessor :image_url
11
- attr_reader :definition
11
+ attr_reader :environment
12
12
 
13
- def initialize(definition)
14
- @definition = definition
13
+ def initialize(environment)
14
+ @environment = environment
15
15
  @tags = []
16
16
  end
17
17
 
@@ -46,7 +46,7 @@ module Kuby
46
46
 
47
47
  def tag
48
48
  t = ENV.fetch('KUBY_DOCKER_TAG') do
49
- definition.docker.tags.latest_timestamp_tag
49
+ environment.docker.tags.latest_timestamp_tag
50
50
  end
51
51
 
52
52
  unless t
@@ -57,7 +57,7 @@ module Kuby
57
57
  end
58
58
 
59
59
  def previous_tag(current_tag)
60
- t = definition.docker.tags.previous_timestamp_tag(current_tag)
60
+ t = environment.docker.tags.previous_timestamp_tag(current_tag)
61
61
 
62
62
  unless t
63
63
  raise MissingTagError, 'could not find previous timestamped tag'
@@ -78,7 +78,7 @@ module Kuby
78
78
 
79
79
  def default_image_url
80
80
  # assuming dockerhub by not specifying full url
81
- @default_image_url ||= definition.app_name.downcase
81
+ @default_image_url ||= environment.app_name.downcase
82
82
  end
83
83
 
84
84
  def default_tags
@@ -40,7 +40,7 @@ module Kuby
40
40
  private
41
41
 
42
42
  def distro_spec
43
- definition.docker.distro_spec
43
+ environment.docker.distro_spec
44
44
  end
45
45
 
46
46
  def get_package(package_name, version)
@@ -52,7 +52,7 @@ module Kuby
52
52
  end
53
53
 
54
54
  def metadata
55
- definition.docker.metadata
55
+ environment.docker.metadata
56
56
  end
57
57
  end
58
58
  end
@@ -3,10 +3,10 @@ require 'docker/remote'
3
3
  module Kuby
4
4
  module Docker
5
5
  class Spec
6
- attr_reader :definition
6
+ attr_reader :environment
7
7
 
8
- def initialize(definition)
9
- @definition = definition
8
+ def initialize(environment)
9
+ @environment = environment
10
10
  end
11
11
 
12
12
  def base_image(image_url)
@@ -75,35 +75,35 @@ module Kuby
75
75
  end
76
76
 
77
77
  def setup_phase
78
- @setup_phase ||= SetupPhase.new(definition)
78
+ @setup_phase ||= SetupPhase.new(environment)
79
79
  end
80
80
 
81
81
  def package_phase
82
- @package_phase ||= PackagePhase.new(definition)
82
+ @package_phase ||= PackagePhase.new(environment)
83
83
  end
84
84
 
85
85
  def bundler_phase
86
- @bundler_phase ||= BundlerPhase.new(definition)
86
+ @bundler_phase ||= BundlerPhase.new(environment)
87
87
  end
88
88
 
89
89
  def yarn_phase
90
- @yarn_phase ||= YarnPhase.new(definition)
90
+ @yarn_phase ||= YarnPhase.new(environment)
91
91
  end
92
92
 
93
93
  def copy_phase
94
- @copy_phase ||= CopyPhase.new(definition)
94
+ @copy_phase ||= CopyPhase.new(environment)
95
95
  end
96
96
 
97
97
  def assets_phase
98
- @assets_phase ||= AssetsPhase.new(definition)
98
+ @assets_phase ||= AssetsPhase.new(environment)
99
99
  end
100
100
 
101
101
  def webserver_phase
102
- @webserver_phase ||= WebserverPhase.new(definition)
102
+ @webserver_phase ||= WebserverPhase.new(environment)
103
103
  end
104
104
 
105
105
  def metadata
106
- @metadata ||= Metadata.new(definition)
106
+ @metadata ||= Metadata.new(environment)
107
107
  end
108
108
 
109
109
  def tags
@@ -8,15 +8,19 @@ module Kuby
8
8
  end
9
9
 
10
10
  def docker(&block)
11
- @docker ||= Docker::Spec.new(definition)
11
+ @docker ||= Docker::Spec.new(self)
12
12
  @docker.instance_eval(&block) if block
13
13
  @docker
14
14
  end
15
15
 
16
16
  def kubernetes(&block)
17
- @kubernetes ||= Kubernetes::Spec.new(definition)
17
+ @kubernetes ||= Kubernetes::Spec.new(self)
18
18
  @kubernetes.instance_eval(&block) if block
19
19
  @kubernetes
20
20
  end
21
+
22
+ def app_name
23
+ definition.app_name
24
+ end
21
25
  end
22
26
  end
@@ -7,8 +7,6 @@ module Kuby
7
7
  autoload :DeployTask, 'kuby/kubernetes/deploy_task'
8
8
  autoload :DockerConfig, 'kuby/kubernetes/docker_config'
9
9
  autoload :Manifest, 'kuby/kubernetes/manifest'
10
- autoload :Monitors, 'kuby/kubernetes/monitors'
11
- autoload :Plugin, 'kuby/kubernetes/plugin'
12
10
  autoload :Plugins, 'kuby/kubernetes/plugins'
13
11
  autoload :Provider, 'kuby/kubernetes/provider'
14
12
  autoload :RegistrySecret, 'kuby/kubernetes/registry_secret'
@@ -1,5 +1,4 @@
1
1
  require 'krane'
2
- require 'ext/krane/kubernetes_resource'
3
2
  require 'kubectl-rb'
4
3
 
5
4
  module Kuby
@@ -5,10 +5,10 @@ require 'yaml'
5
5
  module Kuby
6
6
  module Kubernetes
7
7
  class Deployer
8
- attr_reader :definition
8
+ attr_reader :environment
9
9
 
10
- def initialize(definition)
11
- @definition = definition
10
+ def initialize(environment)
11
+ @environment = environment
12
12
  end
13
13
 
14
14
  def deploy
@@ -42,7 +42,7 @@ module Kuby
42
42
 
43
43
  cli.apply(res)
44
44
  end
45
- rescue InvalidResourceError => e
45
+ rescue KubernetesCLI::InvalidResourceError => e
46
46
  Kuby.logger.fatal(e.message)
47
47
  Kuby.logger.fatal(e.resource.to_resource.to_yaml)
48
48
  end
@@ -74,15 +74,15 @@ module Kuby
74
74
  end
75
75
 
76
76
  def provider
77
- definition.kubernetes.provider
77
+ environment.kubernetes.provider
78
78
  end
79
79
 
80
80
  def namespace
81
- definition.kubernetes.namespace
81
+ environment.kubernetes.namespace
82
82
  end
83
83
 
84
84
  def all_resources
85
- definition.kubernetes.resources
85
+ environment.kubernetes.resources
86
86
  end
87
87
 
88
88
  def cli
@@ -26,6 +26,10 @@ module Kuby
26
26
  rails_app.resources.delete(rails_app.ingress)
27
27
  rails_app.service.spec { type 'LoadBalancer' }
28
28
  end
29
+
30
+ if assets = spec.plugin(:rails_assets)
31
+ assets.service.spec { type 'LoadBalancer' }
32
+ end
29
33
  end
30
34
 
31
35
  def kubeconfig_path
@@ -3,10 +3,10 @@ require 'kubernetes-cli'
3
3
  module Kuby
4
4
  module Kubernetes
5
5
  class Provider
6
- attr_reader :definition
6
+ attr_reader :environment
7
7
 
8
- def initialize(definition)
9
- @definition = definition
8
+ def initialize(environment)
9
+ @environment = environment
10
10
  after_initialize
11
11
  end
12
12
 
@@ -66,11 +66,11 @@ module Kuby
66
66
  end
67
67
 
68
68
  def deployer
69
- @deployer ||= Kuby::Kubernetes::Deployer.new(definition)
69
+ @deployer ||= Kuby::Kubernetes::Deployer.new(environment)
70
70
  end
71
71
 
72
72
  def spec
73
- definition.kubernetes
73
+ environment.kubernetes
74
74
  end
75
75
  end
76
76
  end
@@ -5,10 +5,10 @@ module Kuby
5
5
  class Spec
6
6
  extend ::KubeDSL::ValueFields
7
7
 
8
- attr_reader :definition, :plugins, :tag
8
+ attr_reader :environment, :plugins, :tag
9
9
 
10
- def initialize(definition)
11
- @definition = definition
10
+ def initialize(environment)
11
+ @environment = environment
12
12
  @plugins = TrailingHash.new
13
13
 
14
14
  # default plugins
@@ -18,7 +18,7 @@ module Kuby
18
18
  def provider(provider_name = nil, &block)
19
19
  if provider_name
20
20
  if @provider || provider_klass = Kuby.providers[provider_name]
21
- @provider ||= provider_klass.new(definition)
21
+ @provider ||= provider_klass.new(environment)
22
22
  @provider.configure(&block)
23
23
  else
24
24
  msg = if provider_name
@@ -37,7 +37,7 @@ module Kuby
37
37
 
38
38
  def configure_plugin(plugin_name, &block)
39
39
  if @plugins[plugin_name] || plugin_klass = Kuby.plugins[plugin_name]
40
- @plugins[plugin_name] ||= plugin_klass.new(definition)
40
+ @plugins[plugin_name] ||= plugin_klass.new(environment)
41
41
  @plugins[plugin_name].configure(&block) if block
42
42
  else
43
43
  raise MissingPluginError, "no plugin registered with name #{plugin_name}, "\
@@ -118,7 +118,7 @@ module Kuby
118
118
 
119
119
  @namespace ||= KubeDSL.namespace do
120
120
  metadata do
121
- name "#{spec.selector_app}-#{spec.definition.environment.name}"
121
+ name "#{spec.selector_app}-#{spec.environment.name}"
122
122
  end
123
123
  end
124
124
 
@@ -156,11 +156,11 @@ module Kuby
156
156
  end
157
157
 
158
158
  def selector_app
159
- @selector_app ||= definition.app_name.downcase
159
+ @selector_app ||= environment.app_name.downcase
160
160
  end
161
161
 
162
162
  def docker
163
- definition.docker
163
+ environment.docker
164
164
  end
165
165
  end
166
166
  end
@@ -0,0 +1,59 @@
1
+ module Kuby
2
+ class Plugin
3
+ attr_reader :environment
4
+
5
+ def initialize(environment)
6
+ @environment = environment
7
+ after_initialize
8
+ end
9
+
10
+ def configure(&block)
11
+ # do nothing by default
12
+ end
13
+
14
+ def setup
15
+ # do nothing by default
16
+ end
17
+
18
+ # additional kubernetes resources that should be deployed
19
+ def resources
20
+ []
21
+ end
22
+
23
+ # additional dockerfiles that should be built and pushed
24
+ def dockerfiles
25
+ []
26
+ end
27
+
28
+ # called after all plugins have been configured
29
+ def after_configuration
30
+ # do nothing by default
31
+ end
32
+
33
+ # called before any plugins have been setup
34
+ def before_setup
35
+ # do nothing by default
36
+ end
37
+
38
+ # called after all plugins have been setup
39
+ def after_setup
40
+ # do nothing by default
41
+ end
42
+
43
+ # called before deploying any resources
44
+ def before_deploy(manifest)
45
+ # do nothing by default
46
+ end
47
+
48
+ # called after deploying all resources
49
+ def after_deploy(manifest)
50
+ # do nothing by default
51
+ end
52
+
53
+ private
54
+
55
+ def after_initialize
56
+ # override this in derived classes
57
+ end
58
+ end
59
+ end