kuby-core 0.11.16 → 0.15.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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +35 -0
  3. data/Gemfile +1 -2
  4. data/README.md +2 -1
  5. data/kuby-core.gemspec +1 -1
  6. data/lib/kuby/commands.rb +25 -73
  7. data/lib/kuby/docker/alpine.rb +2 -1
  8. data/lib/kuby/docker/app_image.rb +34 -0
  9. data/lib/kuby/docker/bundler_phase.rb +10 -0
  10. data/lib/kuby/docker/cli.rb +7 -13
  11. data/lib/kuby/docker/docker_uri.rb +50 -9
  12. data/lib/kuby/docker/errors.rb +1 -19
  13. data/lib/kuby/docker/image.rb +142 -0
  14. data/lib/kuby/docker/layer.rb +0 -7
  15. data/lib/kuby/docker/local_tags.rb +9 -10
  16. data/lib/kuby/docker/package_phase.rb +0 -5
  17. data/lib/kuby/docker/packages.rb +1 -0
  18. data/lib/kuby/docker/remote_tags.rb +10 -5
  19. data/lib/kuby/docker/setup_phase.rb +17 -9
  20. data/lib/kuby/docker/spec.rb +38 -62
  21. data/lib/kuby/docker/timestamp_tag.rb +8 -1
  22. data/lib/kuby/docker/timestamped_image.rb +114 -0
  23. data/lib/kuby/docker.rb +27 -25
  24. data/lib/kuby/environment.rb +1 -10
  25. data/lib/kuby/kubernetes/bare_metal_provider.rb +16 -4
  26. data/lib/kuby/kubernetes/deployer.rb +1 -1
  27. data/lib/kuby/kubernetes/docker_desktop_provider.rb +0 -15
  28. data/lib/kuby/kubernetes/spec.rb +21 -17
  29. data/lib/kuby/plugin.rb +2 -2
  30. data/lib/kuby/plugins/rails_app/assets.rb +62 -70
  31. data/lib/kuby/plugins/rails_app/assets_image.rb +57 -0
  32. data/lib/kuby/plugins/rails_app/generators/kuby.rb +31 -9
  33. data/lib/kuby/plugins/rails_app/plugin.rb +53 -236
  34. data/lib/kuby/plugins/rails_app.rb +1 -0
  35. data/lib/kuby/tasks.rb +98 -69
  36. data/lib/kuby/version.rb +1 -1
  37. data/lib/kuby.rb +2 -20
  38. data/spec/docker/spec_spec.rb +21 -118
  39. data/spec/docker/timestamped_image_spec.rb +123 -0
  40. data/spec/spec_helper.rb +10 -11
  41. metadata +10 -14
  42. data/lib/kuby/dev_setup.rb +0 -346
  43. data/lib/kuby/docker/dev_spec.rb +0 -202
  44. data/lib/kuby/docker/metadata.rb +0 -90
  45. data/lib/kuby/docker/tags.rb +0 -92
  46. data/lib/kuby/rails_commands.rb +0 -84
  47. data/spec/docker/metadata_spec.rb +0 -73
  48. data/spec/dummy/Gemfile.lock +0 -223
  49. data/spec/dummy/config/master.key +0 -1
  50. data/spec/dummy/tmp/cache/bootsnap-load-path-cache +0 -0
@@ -8,37 +8,36 @@ module Kuby
8
8
  sig { returns CLI }
9
9
  attr_reader :cli
10
10
 
11
- sig { returns(Metadata) }
12
- attr_reader :metadata
11
+ sig { returns(String) }
12
+ attr_reader :image_url
13
13
 
14
14
  sig {
15
15
  params(
16
16
  cli: CLI,
17
- metadata: Metadata
17
+ image_url: String
18
18
  )
19
19
  .void
20
20
  }
21
- def initialize(cli, metadata)
21
+ def initialize(cli, image_url)
22
22
  @cli = cli
23
- @metadata = metadata
24
-
23
+ @image_url = image_url
25
24
  @latest_timestamp_tag = T.let(@latest_timestamp_tag, T.nilable(TimestampTag))
26
25
  end
27
26
 
28
27
  sig { returns(T::Array[String]) }
29
28
  def tags
30
- images = cli.images(metadata.image_url)
29
+ images = cli.images(image_url)
31
30
  images.map { |image| T.must(image[:tag]) }
32
31
  end
33
32
 
34
33
  sig { returns(T::Array[String]) }
35
34
  def latest_tags
36
35
  # find "latest" tag
37
- images = cli.images(metadata.image_url)
38
- latest = images.find { |image| image[:tag] == Tags::LATEST }
36
+ images = cli.images(image_url)
37
+ latest = images.find { |image| image[:tag] == Kuby::Docker::LATEST_TAG }
39
38
 
40
39
  unless latest
41
- raise MissingTagError.new(Tags::LATEST)
40
+ raise MissingTagError, "could not find tag #{Kuby::Docker::LATEST_TAG}"
42
41
  end
43
42
 
44
43
  # find all tags that point to the same image as 'latest'
@@ -69,11 +69,6 @@ module Kuby
69
69
  raise MissingPackageError, "package '#{package_name}' hasn't been registered"
70
70
  end
71
71
  end
72
-
73
- sig { returns(Metadata) }
74
- def metadata
75
- environment.docker.metadata
76
- end
77
72
  end
78
73
  end
79
74
  end
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Kuby
3
4
  module Docker
4
5
  module Packages
@@ -1,5 +1,7 @@
1
1
  # typed: strict
2
2
 
3
+ require 'docker/remote'
4
+
3
5
  module Kuby
4
6
  module Docker
5
7
  class RemoteTags
@@ -8,24 +10,27 @@ module Kuby
8
10
  sig { returns(::Docker::Remote::Client) }
9
11
  attr_reader :remote_client
10
12
 
11
- sig { returns(Metadata) }
12
- attr_reader :metadata
13
+ sig { returns(String) }
14
+ attr_reader :image_url
13
15
 
14
16
  sig {
15
17
  params(
16
18
  remote_client: ::Docker::Remote::Client,
17
- metadata: Metadata
19
+ image_url: String
18
20
  )
19
21
  .void
20
22
  }
21
- def initialize(remote_client, metadata)
23
+ def initialize(remote_client, image_url)
22
24
  @remote_client = remote_client
23
- @metadata = metadata
25
+ @image_url = image_url
24
26
  end
25
27
 
26
28
  sig { returns(T::Array[String]) }
27
29
  def tags
28
30
  remote_client.tags
31
+ rescue ::Docker::Remote::UnknownRepoError
32
+ # this can happen if we've never pushed to the repo before
33
+ []
29
34
  end
30
35
 
31
36
  sig { returns(T::Array[String]) }
@@ -7,9 +7,6 @@ module Kuby
7
7
 
8
8
  DEFAULT_WORKING_DIR = T.let('/usr/src/app'.freeze, String)
9
9
 
10
- sig { returns(T.nilable(String)) }
11
- attr_reader :base_image
12
-
13
10
  sig { params(base_image: String).void }
14
11
  attr_writer :base_image
15
12
 
@@ -25,35 +22,46 @@ module Kuby
25
22
  sig { params(rails_env: String).void }
26
23
  attr_writer :rails_env
27
24
 
28
- sig { params(environment: Environment).void }
29
- def initialize(environment)
30
- super
25
+ sig { returns(T.nilable(Docker::Spec)) }
26
+ attr_reader :docker_spec
27
+
28
+ sig { params(environment: Environment, docker_spec: Docker::Spec).void }
29
+ def initialize(environment, docker_spec)
30
+ super(environment)
31
31
 
32
32
  @base_image = T.let(@base_image, T.nilable(String))
33
33
  @working_dir = T.let(@working_dir, T.nilable(String))
34
34
  @rails_env = T.let(@rails_env, T.nilable(String))
35
+ @docker_spec = T.let(docker_spec, T.nilable(Docker::Spec))
35
36
  end
36
37
 
37
38
  sig { override.params(dockerfile: Dockerfile).void }
38
39
  def apply_to(dockerfile)
39
- dockerfile.from(base_image || default_base_image)
40
+ dockerfile.from(base_image)
40
41
  dockerfile.workdir(working_dir || DEFAULT_WORKING_DIR)
41
42
  dockerfile.env("RAILS_ENV=#{rails_env || Kuby.env}")
42
43
  dockerfile.env("KUBY_ENV=#{Kuby.env}")
43
44
  dockerfile.arg('RAILS_MASTER_KEY')
44
45
  end
45
46
 
47
+ sig { returns(String) }
48
+ def base_image
49
+ @base_image || default_base_image
50
+ end
51
+
46
52
  private
47
53
 
48
54
  sig { returns(String) }
49
55
  def default_base_image
50
- case metadata.distro
56
+ spec = T.must(docker_spec)
57
+
58
+ case spec.distro_name
51
59
  when :debian
52
60
  "ruby:#{RUBY_VERSION}"
53
61
  when :alpine
54
62
  "ruby:#{RUBY_VERSION}-alpine"
55
63
  else
56
- raise MissingDistroError, "distro '#{metadata.distro}' hasn't been registered"
64
+ raise MissingDistroError, "distro '#{spec.distro_name}' hasn't been registered"
57
65
  end
58
66
  end
59
67
  end
@@ -1,15 +1,21 @@
1
1
  # typed: strict
2
2
 
3
- require 'docker/remote'
4
-
5
3
  module Kuby
6
4
  module Docker
7
5
  class Spec
8
6
  extend T::Sig
9
7
 
8
+ DEFAULT_DISTRO = :debian
9
+
10
10
  sig { returns(Environment) }
11
11
  attr_reader :environment
12
12
 
13
+ sig { returns(T.nilable(String)) }
14
+ attr_reader :image_url_str
15
+
16
+ sig { returns(T.nilable(String)) }
17
+ attr_reader :registry_index_url_str
18
+
13
19
  sig { params(environment: Environment).void }
14
20
  def initialize(environment)
15
21
  @environment = environment
@@ -22,13 +28,19 @@ module Kuby
22
28
  @copy_phase = T.let(@copy_phase, T.nilable(CopyPhase))
23
29
  @assets_phase = T.let(@assets_phase, T.nilable(AssetsPhase))
24
30
  @webserver_phase = T.let(@webserver_phase, T.nilable(WebserverPhase))
25
- @metadata = T.let(@metadata, T.nilable(Metadata))
26
31
 
32
+ @distro_name = T.let(@distro_name, T.nilable(Symbol))
27
33
  @distro_spec = T.let(@distro_spec, T.nilable(Distro))
28
- @cli = T.let(@cli, T.nilable(CLI))
29
- @remote_client = T.let(@remote_client, T.nilable(::Docker::Remote::Client))
30
- @tags = T.let(@tags, T.nilable(Tags))
31
34
  @layer_stack = T.let(@layer_stack, T.nilable(Kuby::Docker::LayerStack))
35
+
36
+ @image_url_str = T.let(@image_url_str, T.nilable(String))
37
+ @registry_index_url_str = T.let(@registry_index_url_str, T.nilable(String))
38
+ @image = T.let(@image, T.nilable(Docker::AppImage))
39
+ end
40
+
41
+ sig { returns(Symbol) }
42
+ def distro_name
43
+ @distro_name || DEFAULT_DISTRO
32
44
  end
33
45
 
34
46
  sig { params(image_url: String).void }
@@ -69,7 +81,7 @@ module Kuby
69
81
 
70
82
  sig { params(distro_name: Symbol).void }
71
83
  def distro(distro_name)
72
- metadata.distro = distro_name
84
+ @distro_name = distro_name
73
85
  @distro_spec = nil
74
86
  end
75
87
 
@@ -85,7 +97,12 @@ module Kuby
85
97
 
86
98
  sig { params(url: String).void }
87
99
  def image_url(url)
88
- metadata.image_url = url
100
+ @image_url_str = url
101
+ end
102
+
103
+ sig { params(url: String).void }
104
+ def registry_index_url(url)
105
+ @registry_index_url_str = url
89
106
  end
90
107
 
91
108
  sig {
@@ -132,16 +149,22 @@ module Kuby
132
149
  @credentials
133
150
  end
134
151
 
135
- sig { returns(Dockerfile) }
136
- def to_dockerfile
137
- Dockerfile.new.tap do |df|
138
- layer_stack.each { |layer| layer.apply_to(df) }
152
+ sig { returns(Docker::AppImage) }
153
+ def image
154
+ @image ||= begin
155
+ dockerfile = Dockerfile.new.tap do |df|
156
+ layer_stack.each { |layer| layer.apply_to(df) }
157
+ end
158
+
159
+ Docker::AppImage.new(
160
+ dockerfile, T.must(image_url_str), credentials, registry_index_url_str
161
+ )
139
162
  end
140
163
  end
141
164
 
142
165
  sig { returns(SetupPhase) }
143
166
  def setup_phase
144
- @setup_phase ||= SetupPhase.new(environment)
167
+ @setup_phase ||= SetupPhase.new(environment, self)
145
168
  end
146
169
 
147
170
  sig { returns(PackagePhase) }
@@ -174,62 +197,15 @@ module Kuby
174
197
  @webserver_phase ||= WebserverPhase.new(environment)
175
198
  end
176
199
 
177
- sig { returns(Metadata) }
178
- def metadata
179
- @metadata ||= Metadata.new(environment)
180
- end
181
-
182
- sig { returns(String) }
183
- def tag
184
- t = ENV.fetch('KUBY_DOCKER_TAG') do
185
- tags.latest_timestamp_tag
186
- end
187
-
188
- unless t
189
- raise MissingTagError, 'could not find latest timestamped tag'
190
- end
191
-
192
- t.to_s
193
- end
194
-
195
- sig { params(current_tag: String).returns(String) }
196
- def previous_tag(current_tag)
197
- t = tags.previous_timestamp_tag(current_tag)
198
-
199
- unless t
200
- raise MissingTagError, 'could not find previous timestamped tag'
201
- end
202
-
203
- t.to_s
204
- end
205
-
206
- sig { returns(CLI) }
207
- def cli
208
- @cli ||= Docker::CLI.new
209
- end
210
-
211
- sig { returns(::Docker::Remote::Client) }
212
- def remote_client
213
- @remote_client ||= ::Docker::Remote::Client.new(
214
- metadata.image_host, metadata.image_repo,
215
- credentials.username, credentials.password,
216
- )
217
- end
218
-
219
200
  sig { returns(Distro) }
220
201
  def distro_spec
221
- @distro_spec ||= if distro_klass = Kuby.distros[metadata.distro]
202
+ @distro_spec ||= if distro_klass = Kuby.distros[distro_name]
222
203
  distro_klass.new(self)
223
204
  else
224
- raise MissingDistroError, "distro '#{metadata.distro}' hasn't been registered"
205
+ raise MissingDistroError, "distro '#{distro_name}' hasn't been registered"
225
206
  end
226
207
  end
227
208
 
228
- sig { returns(Tags) }
229
- def tags
230
- @tags ||= Tags.new(cli, remote_client, metadata)
231
- end
232
-
233
209
  private
234
210
 
235
211
  sig { returns(Kuby::Docker::LayerStack) }
@@ -9,8 +9,15 @@ module Kuby
9
9
 
10
10
  FORMAT = T.let('%Y%m%d%H%M%S'.freeze, String)
11
11
 
12
- sig { params(str: String).returns(T.nilable(TimestampTag)) }
12
+ sig { params(str: T.nilable(String)).returns(T.nilable(TimestampTag)) }
13
13
  def self.try_parse(str)
14
+ return nil unless str
15
+
16
+ # The strptime function stops scanning after the pattern has been matched, so
17
+ # we check for all numbers here to prevent things like 20210424165405-assets
18
+ # from being treated as a timestamp tag.
19
+ return nil unless str =~ /\A\d+\z/
20
+
14
21
  time = begin
15
22
  Time.strptime(str, FORMAT)
16
23
  rescue ArgumentError
@@ -0,0 +1,114 @@
1
+ # typed: strict
2
+
3
+ require 'docker/remote'
4
+
5
+ module Kuby
6
+ module Docker
7
+ class TimestampedImage < Image
8
+ extend T::Sig
9
+
10
+ sig {
11
+ params(
12
+ dockerfile: T.any(Dockerfile, T.proc.returns(Dockerfile)),
13
+ image_url: String,
14
+ credentials: Credentials,
15
+ registry_index_url_str: T.nilable(String),
16
+ main_tag: T.nilable(String),
17
+ alias_tags: T::Array[String]
18
+ ).void
19
+ }
20
+ def initialize(dockerfile, image_url, credentials, registry_index_url_str = nil, main_tag = nil, alias_tags = [])
21
+ @new_version = T.let(@new_version, T.nilable(Image))
22
+ @current_version = T.let(@current_version, T.nilable(Image))
23
+ @previous_version = T.let(@previous_version, T.nilable(Image))
24
+
25
+ @remote_client = T.let(@remote_client, T.nilable(::Docker::Remote::Client))
26
+ @local = T.let(@local, T.nilable(LocalTags))
27
+ @remote = T.let(@remote, T.nilable(RemoteTags))
28
+
29
+ super
30
+ end
31
+
32
+ sig { returns(Image) }
33
+ def new_version
34
+ @new_version ||= duplicate_with_tags(
35
+ TimestampTag.new(Time.now).to_s, [Kuby::Docker::LATEST_TAG]
36
+ )
37
+ end
38
+
39
+ sig { returns(Image) }
40
+ def current_version
41
+ @current_version ||= duplicate_with_tags(
42
+ latest_timestamp_tag.to_s, [Kuby::Docker::LATEST_TAG]
43
+ )
44
+ end
45
+
46
+ sig { params(current_tag: T.nilable(String)).returns(Image) }
47
+ def previous_version(current_tag = nil)
48
+ @previous_version ||= duplicate_with_tags(
49
+ previous_timestamp_tag(current_tag).to_s, []
50
+ )
51
+ end
52
+
53
+ sig { params(current_tag: T.nilable(String)).returns(TimestampTag) }
54
+ def previous_timestamp_tag(current_tag = nil)
55
+ current_tag = TimestampTag.try_parse(current_tag || latest_timestamp_tag.to_s)
56
+ raise MissingTagError, 'could not find current timestamp tag' unless current_tag
57
+
58
+ all_tags = timestamp_tags.sort
59
+
60
+ idx = all_tags.index do |tag|
61
+ tag.time == current_tag.time
62
+ end
63
+
64
+ idx ||= 0
65
+ raise MissingTagError, 'could not find previous timestamp tag' unless idx > 0
66
+
67
+ T.must(all_tags[idx - 1])
68
+ end
69
+
70
+ sig { returns(TimestampTag) }
71
+ def latest_timestamp_tag
72
+ tag = timestamp_tags.sort.last
73
+ raise MissingTagError, 'could not find latest timestamp tag' unless tag
74
+ tag
75
+ end
76
+
77
+ sig { params(build_args: T::Hash[String, String], docker_args: T::Array[String]).void }
78
+ def build(build_args = {}, docker_args = [])
79
+ docker_cli.build(new_version, build_args: build_args, docker_args: docker_args)
80
+ @current_version = new_version
81
+ @new_version = nil
82
+ end
83
+
84
+ sig { params(tag: String).void }
85
+ def push(tag)
86
+ docker_cli.push(image_url, tag)
87
+ end
88
+
89
+ private
90
+
91
+ sig { returns(::Docker::Remote::Client) }
92
+ def remote_client
93
+ @remote_client ||= ::Docker::Remote::Client.new(
94
+ registry_index_host, image_repo, credentials.username, credentials.password,
95
+ )
96
+ end
97
+
98
+ sig { returns(T::Array[TimestampTag]) }
99
+ def timestamp_tags
100
+ (local.timestamp_tags + remote.timestamp_tags).uniq
101
+ end
102
+
103
+ sig { returns(LocalTags) }
104
+ def local
105
+ @local ||= LocalTags.new(docker_cli, image_url)
106
+ end
107
+
108
+ sig { returns(RemoteTags) }
109
+ def remote
110
+ @remote ||= RemoteTags.new(remote_client, registry_index_host)
111
+ end
112
+ end
113
+ end
114
+ end
data/lib/kuby/docker.rb CHANGED
@@ -4,30 +4,32 @@ require 'kuby/docker/errors'
4
4
 
5
5
  module Kuby
6
6
  module Docker
7
- autoload :Alpine, 'kuby/docker/alpine'
8
- autoload :AssetsPhase, 'kuby/docker/assets_phase'
9
- autoload :BundlerPhase, 'kuby/docker/bundler_phase'
10
- autoload :CLI, 'kuby/docker/cli'
11
- autoload :CopyPhase, 'kuby/docker/copy_phase'
12
- autoload :Credentials, 'kuby/docker/credentials'
13
- autoload :Debian, 'kuby/docker/debian'
14
- autoload :DevSpec, 'kuby/docker/dev_spec'
15
- autoload :Distro, 'kuby/docker/distro'
16
- autoload :Dockerfile, 'kuby/docker/dockerfile'
17
- autoload :DockerURI, 'kuby/docker/docker_uri'
18
- autoload :InlineLayer, 'kuby/docker/inline_layer'
19
- autoload :Layer, 'kuby/docker/layer'
20
- autoload :LayerStack, 'kuby/docker/layer_stack'
21
- autoload :LocalTags, 'kuby/docker/local_tags'
22
- autoload :Metadata, 'kuby/docker/metadata'
23
- autoload :Packages, 'kuby/docker/packages'
24
- autoload :PackagePhase, 'kuby/docker/package_phase'
25
- autoload :RemoteTags, 'kuby/docker/remote_tags'
26
- autoload :SetupPhase, 'kuby/docker/setup_phase'
27
- autoload :Spec, 'kuby/docker/spec'
28
- autoload :Tags, 'kuby/docker/tags'
29
- autoload :TimestampTag, 'kuby/docker/timestamp_tag'
30
- autoload :WebserverPhase, 'kuby/docker/webserver_phase'
31
- autoload :YarnPhase, 'kuby/docker/yarn_phase'
7
+ LATEST_TAG = T.let('latest'.freeze, String)
8
+
9
+ autoload :Alpine, 'kuby/docker/alpine'
10
+ autoload :AppImage, 'kuby/docker/app_image'
11
+ autoload :AssetsPhase, 'kuby/docker/assets_phase'
12
+ autoload :BundlerPhase, 'kuby/docker/bundler_phase'
13
+ autoload :CLI, 'kuby/docker/cli'
14
+ autoload :CopyPhase, 'kuby/docker/copy_phase'
15
+ autoload :Credentials, 'kuby/docker/credentials'
16
+ autoload :Debian, 'kuby/docker/debian'
17
+ autoload :Distro, 'kuby/docker/distro'
18
+ autoload :Dockerfile, 'kuby/docker/dockerfile'
19
+ autoload :DockerURI, 'kuby/docker/docker_uri'
20
+ autoload :Image, 'kuby/docker/image'
21
+ autoload :InlineLayer, 'kuby/docker/inline_layer'
22
+ autoload :Layer, 'kuby/docker/layer'
23
+ autoload :LayerStack, 'kuby/docker/layer_stack'
24
+ autoload :LocalTags, 'kuby/docker/local_tags'
25
+ autoload :Packages, 'kuby/docker/packages'
26
+ autoload :PackagePhase, 'kuby/docker/package_phase'
27
+ autoload :RemoteTags, 'kuby/docker/remote_tags'
28
+ autoload :SetupPhase, 'kuby/docker/setup_phase'
29
+ autoload :Spec, 'kuby/docker/spec'
30
+ autoload :TimestampedImage, 'kuby/docker/timestamped_image'
31
+ autoload :TimestampTag, 'kuby/docker/timestamp_tag'
32
+ autoload :WebserverPhase, 'kuby/docker/webserver_phase'
33
+ autoload :YarnPhase, 'kuby/docker/yarn_phase'
32
34
  end
33
35
  end
@@ -12,12 +12,7 @@ module Kuby
12
12
  end
13
13
 
14
14
  def docker(&block)
15
- @docker ||= if development?
16
- Docker::DevSpec.new(self)
17
- else
18
- Docker::Spec.new(self)
19
- end
20
-
15
+ @docker ||= Docker::Spec.new(self)
21
16
  @docker.instance_eval(&block) if block
22
17
  @docker
23
18
  end
@@ -31,9 +26,5 @@ module Kuby
31
26
  def app_name
32
27
  definition.app_name
33
28
  end
34
-
35
- def development?
36
- name == 'development'
37
- end
38
29
  end
39
30
  end
@@ -1,10 +1,13 @@
1
- # typed: false
1
+ # typed: strict
2
+
2
3
  require 'kube-dsl'
3
4
 
4
5
  module Kuby
5
6
  module Kubernetes
6
7
  class BareMetalProvider < Provider
7
- STORAGE_CLASS_NAME = 'hostpath'.freeze
8
+ extend T::Sig
9
+
10
+ STORAGE_CLASS_NAME = T.let('hostpath'.freeze, String)
8
11
 
9
12
  class Config
10
13
  extend ::KubeDSL::ValueFields
@@ -12,25 +15,34 @@ module Kuby
12
15
  value_fields :kubeconfig
13
16
  end
14
17
 
18
+ sig { returns(Config) }
15
19
  attr_reader :config
16
20
 
21
+ sig { params(environment: Environment).void }
22
+ def initialize(environment)
23
+ @config = T.let(Config.new, Config)
24
+ super
25
+ end
26
+
27
+ sig { params(block: T.proc.void).void }
17
28
  def configure(&block)
18
29
  config.instance_eval(&block) if block
19
30
  end
20
31
 
32
+ sig { returns(String) }
21
33
  def kubeconfig_path
22
34
  config.kubeconfig
23
35
  end
24
36
 
37
+ sig { returns(String) }
25
38
  def storage_class_name
26
39
  STORAGE_CLASS_NAME
27
40
  end
28
41
 
29
42
  private
30
43
 
44
+ sig { void }
31
45
  def after_initialize
32
- @config = Config.new
33
-
34
46
  configure do
35
47
  # default kubeconfig path
36
48
  kubeconfig File.join(ENV['HOME'], '.kube', 'config')
@@ -102,7 +102,7 @@ module Kuby
102
102
 
103
103
  def restart_rails_deployment_if_necessary
104
104
  deployed_image = nil
105
- current_image = "#{docker.metadata.image_url}:#{docker.tag}"
105
+ current_image = "#{docker.image.image_url}:#{kubernetes.tag}"
106
106
 
107
107
  if rails_app = kubernetes.plugin(:rails_app)
108
108
  deployment_name = rails_app.deployment.metadata.name
@@ -18,21 +18,6 @@ module Kuby
18
18
  config.instance_eval(&block) if block
19
19
  end
20
20
 
21
- def after_configuration
22
- if rails_app = spec.plugin(:rails_app)
23
- # Remove ingress and change service type from ClusterIP to
24
- # LoadBalancer. No need to set up ingress for Docker Desktop
25
- # since it handles all the localhost mapping, etc if you set
26
- # up a service LB.
27
- rails_app.resources.delete(rails_app.ingress)
28
- rails_app.service.spec { type 'LoadBalancer' }
29
- end
30
-
31
- if assets = spec.plugin(:rails_assets)
32
- assets.service.spec { type 'LoadBalancer' }
33
- end
34
- end
35
-
36
21
  def kubeconfig_path
37
22
  config.kubeconfig
38
23
  end