dapp 0.11.0 → 0.12.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 (154) hide show
  1. checksums.yaml +4 -4
  2. data/config/en/net_status.yml +36 -4
  3. data/lib/dapp.rb +84 -36
  4. data/lib/dapp/cli.rb +3 -2
  5. data/lib/dapp/cli/command/base.rb +69 -0
  6. data/lib/dapp/config/config.rb +17 -0
  7. data/lib/dapp/config/directive/base.rb +90 -3
  8. data/lib/dapp/dapp.rb +6 -14
  9. data/lib/dapp/dapp/dappfile.rb +20 -27
  10. data/lib/dapp/dapp/deps/base.rb +2 -2
  11. data/lib/dapp/dapp/lock.rb +1 -1
  12. data/lib/dapp/dapp/logging/base.rb +11 -7
  13. data/lib/dapp/dapp/logging/process.rb +4 -2
  14. data/lib/dapp/dapp/shellout/base.rb +2 -2
  15. data/lib/dapp/dapp/ssh_agent.rb +2 -2
  16. data/lib/dapp/deployment.rb +1 -0
  17. data/lib/dapp/deployment/app.rb +120 -0
  18. data/lib/dapp/deployment/cli/cli.rb +1 -0
  19. data/lib/dapp/deployment/cli/command/base.rb +14 -0
  20. data/lib/dapp/deployment/cli/command/deployment.rb +21 -0
  21. data/lib/dapp/deployment/cli/command/deployment/apply.rb +26 -0
  22. data/lib/dapp/deployment/cli/command/deployment/minikube_setup.rb +13 -0
  23. data/lib/dapp/deployment/cli/command/deployment/mrproper.rb +13 -0
  24. data/lib/dapp/deployment/cli/command/deployment/secret_generate.rb +13 -0
  25. data/lib/dapp/deployment/cli/command/deployment/secret_key_generate.rb +13 -0
  26. data/lib/dapp/deployment/config/config.rb +46 -0
  27. data/lib/dapp/deployment/config/directive/app.rb +28 -0
  28. data/lib/dapp/deployment/config/directive/app/instance_methods.rb +51 -0
  29. data/lib/dapp/deployment/config/directive/base.rb +13 -0
  30. data/lib/dapp/deployment/config/directive/deployment.rb +11 -0
  31. data/lib/dapp/deployment/config/directive/expose.rb +68 -0
  32. data/lib/dapp/deployment/config/directive/group.rb +27 -0
  33. data/lib/dapp/deployment/config/directive/job.rb +28 -0
  34. data/lib/dapp/deployment/config/directive/mod/group.rb +22 -0
  35. data/lib/dapp/deployment/config/directive/mod/jobs.rb +26 -0
  36. data/lib/dapp/deployment/config/directive/namespace.rb +26 -0
  37. data/lib/dapp/deployment/config/directive/namespace/instance_methods.rb +37 -0
  38. data/lib/dapp/deployment/core_ext/hash.rb +19 -0
  39. data/lib/dapp/deployment/dapp/command/apply.rb +83 -0
  40. data/lib/dapp/deployment/dapp/command/common.rb +17 -0
  41. data/lib/dapp/deployment/dapp/command/minikube_setup.rb +393 -0
  42. data/lib/dapp/deployment/dapp/command/mrproper.rb +12 -0
  43. data/lib/dapp/deployment/dapp/command/secret_generate.rb +17 -0
  44. data/lib/dapp/deployment/dapp/command/secret_key_generate.rb +13 -0
  45. data/lib/dapp/deployment/dapp/dapp.rb +18 -0
  46. data/lib/dapp/deployment/dapp/dappfile.rb +23 -0
  47. data/lib/dapp/deployment/deployment.rb +46 -0
  48. data/lib/dapp/deployment/error/app.rb +7 -0
  49. data/lib/dapp/deployment/error/base.rb +7 -0
  50. data/lib/dapp/deployment/error/command.rb +7 -0
  51. data/lib/dapp/deployment/error/config.rb +7 -0
  52. data/lib/dapp/deployment/error/deployment.rb +7 -0
  53. data/lib/dapp/deployment/error/kubernetes.rb +7 -0
  54. data/lib/dapp/deployment/kube_app.rb +277 -0
  55. data/lib/dapp/deployment/kube_base.rb +97 -0
  56. data/lib/dapp/deployment/kube_deployment.rb +51 -0
  57. data/lib/dapp/deployment/kubernetes.rb +174 -0
  58. data/lib/dapp/deployment/kubernetes/error.rb +20 -0
  59. data/lib/dapp/deployment/mod/jobs.rb +37 -0
  60. data/lib/dapp/deployment/mod/namespace.rb +58 -0
  61. data/lib/dapp/deployment/mod/system_environments.rb +30 -0
  62. data/lib/dapp/deployment/secret.rb +93 -0
  63. data/lib/dapp/dimg/artifact.rb +1 -1
  64. data/lib/dapp/dimg/build/stage/artifact_default.rb +35 -23
  65. data/lib/dapp/dimg/build/stage/base.rb +1 -1
  66. data/lib/dapp/dimg/build/stage/before_setup.rb +0 -2
  67. data/lib/dapp/dimg/build/stage/build_artifact.rb +0 -2
  68. data/lib/dapp/dimg/build/stage/ga_latest_patch.rb +2 -2
  69. data/lib/dapp/dimg/build/stage/install/install.rb +0 -1
  70. data/lib/dapp/dimg/build/stage/setup/setup.rb +0 -1
  71. data/lib/dapp/dimg/cli/cli.rb +1 -1
  72. data/lib/dapp/dimg/cli/command/base.rb +14 -0
  73. data/lib/dapp/dimg/cli/{dimg.rb → command/dimg.rb} +5 -7
  74. data/lib/dapp/dimg/cli/{bp.rb → command/dimg/bp.rb} +3 -3
  75. data/lib/dapp/dimg/cli/{build.rb → command/dimg/build.rb} +3 -3
  76. data/lib/dapp/dimg/cli/{build_context.rb → command/dimg/build_context.rb} +3 -3
  77. data/lib/dapp/dimg/cli/{build_context → command/dimg/build_context}/export.rb +4 -4
  78. data/lib/dapp/dimg/cli/{build_context → command/dimg/build_context}/import.rb +4 -4
  79. data/lib/dapp/dimg/cli/{cleanup.rb → command/dimg/cleanup.rb} +3 -3
  80. data/lib/dapp/dimg/cli/{list.rb → command/dimg/list.rb} +3 -3
  81. data/lib/dapp/dimg/cli/{mrproper.rb → command/dimg/mrproper.rb} +4 -4
  82. data/lib/dapp/dimg/cli/{push.rb → command/dimg/push.rb} +5 -5
  83. data/lib/dapp/dimg/cli/{run.rb → command/dimg/run.rb} +8 -8
  84. data/lib/dapp/dimg/cli/{spush.rb → command/dimg/spush.rb} +4 -4
  85. data/lib/dapp/dimg/cli/{stage_image.rb → command/dimg/stage_image.rb} +3 -3
  86. data/lib/dapp/dimg/cli/{stages.rb → command/dimg/stages.rb} +3 -3
  87. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/cleanup_local.rb +6 -6
  88. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/cleanup_repo.rb +5 -5
  89. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/flush_local.rb +5 -5
  90. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/flush_repo.rb +6 -6
  91. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/pull.rb +6 -6
  92. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/push.rb +6 -6
  93. data/lib/dapp/dimg/cli/{tag.rb → command/dimg/tag.rb} +6 -6
  94. data/lib/dapp/dimg/config/config.rb +20 -0
  95. data/lib/dapp/dimg/config/directive/artifact_dimg.rb +19 -0
  96. data/lib/dapp/dimg/config/directive/artifact_group.rb +45 -0
  97. data/lib/dapp/dimg/config/directive/dimg.rb +36 -0
  98. data/lib/dapp/dimg/config/directive/dimg/instance_methods.rb +149 -0
  99. data/lib/dapp/dimg/config/directive/dimg/validation.rb +128 -0
  100. data/lib/dapp/dimg/config/directive/dimg_group.rb +64 -0
  101. data/lib/dapp/dimg/config/directive/dimg_group_base.rb +46 -0
  102. data/lib/dapp/dimg/config/directive/docker/dimg.rb +4 -4
  103. data/lib/dapp/dimg/config/directive/shell/dimg.rb +1 -1
  104. data/lib/dapp/dimg/dapp/command/bp.rb +4 -4
  105. data/lib/dapp/dimg/dapp/command/build.rb +2 -2
  106. data/lib/dapp/dimg/dapp/command/build_context/common.rb +2 -2
  107. data/lib/dapp/dimg/dapp/command/build_context/export.rb +1 -1
  108. data/lib/dapp/dimg/dapp/command/build_context/import.rb +1 -1
  109. data/lib/dapp/dimg/dapp/command/cleanup.rb +1 -1
  110. data/lib/dapp/dimg/dapp/command/common.rb +19 -4
  111. data/lib/dapp/dimg/dapp/command/list.rb +1 -1
  112. data/lib/dapp/dimg/dapp/command/mrproper.rb +3 -3
  113. data/lib/dapp/dimg/dapp/command/push.rb +6 -5
  114. data/lib/dapp/dimg/dapp/command/run.rb +1 -1
  115. data/lib/dapp/dimg/dapp/command/spush.rb +4 -3
  116. data/lib/dapp/dimg/dapp/command/stage_image.rb +2 -2
  117. data/lib/dapp/dimg/dapp/command/stages/cleanup_local.rb +1 -1
  118. data/lib/dapp/dimg/dapp/command/stages/cleanup_repo.rb +3 -3
  119. data/lib/dapp/dimg/dapp/command/stages/common.rb +4 -4
  120. data/lib/dapp/dimg/dapp/command/stages/flush_local.rb +1 -1
  121. data/lib/dapp/dimg/dapp/command/stages/flush_repo.rb +1 -1
  122. data/lib/dapp/dimg/dapp/command/stages/pull.rb +5 -4
  123. data/lib/dapp/dimg/dapp/command/stages/push.rb +4 -3
  124. data/lib/dapp/dimg/dapp/command/tag.rb +3 -2
  125. data/lib/dapp/dimg/dapp/dapp.rb +33 -0
  126. data/lib/dapp/dimg/dapp/dappfile.rb +25 -0
  127. data/lib/dapp/dimg/dimg.rb +3 -3
  128. data/lib/dapp/dimg/dimg/path.rb +1 -1
  129. data/lib/dapp/dimg/dimg/stages.rb +1 -1
  130. data/lib/dapp/dimg/dimg/tags.rb +5 -5
  131. data/lib/dapp/dimg/docker_registry.rb +3 -7
  132. data/lib/dapp/dimg/git_artifact.rb +30 -14
  133. data/lib/dapp/dimg/git_repo/base.rb +13 -1
  134. data/lib/dapp/dimg/git_repo/own.rb +9 -1
  135. data/lib/dapp/dimg/image/docker.rb +9 -3
  136. data/lib/dapp/helper/cli.rb +3 -1
  137. data/lib/dapp/helper/net_status.rb +5 -1
  138. data/lib/dapp/helper/trivia.rb +1 -1
  139. data/lib/dapp/version.rb +2 -2
  140. metadata +84 -38
  141. data/lib/dapp/cli/base.rb +0 -63
  142. data/lib/dapp/config/base.rb +0 -54
  143. data/lib/dapp/dimg/build/stage/mod/git_artifact_dependencies.rb +0 -23
  144. data/lib/dapp/dimg/cli/base.rb +0 -16
  145. data/lib/dapp/dimg/config/artifact_dimg.rb +0 -17
  146. data/lib/dapp/dimg/config/artifact_group.rb +0 -43
  147. data/lib/dapp/dimg/config/base.rb +0 -7
  148. data/lib/dapp/dimg/config/dimg.rb +0 -24
  149. data/lib/dapp/dimg/config/dimg/instance_methods.rb +0 -179
  150. data/lib/dapp/dimg/config/dimg/validation.rb +0 -126
  151. data/lib/dapp/dimg/config/dimg_group.rb +0 -61
  152. data/lib/dapp/dimg/config/dimg_group_base.rb +0 -54
  153. data/lib/dapp/dimg/config/dimg_group_main.rb +0 -22
  154. data/lib/dapp/dimg/dapp/command.rb +0 -21
@@ -0,0 +1,13 @@
1
+ module Dapp::Deployment::CLI::Command
2
+ class Deployment < ::Dapp::CLI
3
+ class SecretGenerate < Base
4
+ banner <<BANNER.freeze
5
+ Usage:
6
+
7
+ dapp deployment secret generate
8
+
9
+ Options:
10
+ BANNER
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Dapp::Deployment::CLI::Command
2
+ class Deployment < ::Dapp::CLI
3
+ class SecretKeyGenerate < Base
4
+ banner <<BANNER.freeze
5
+ Usage:
6
+
7
+ dapp deployment secret key generate
8
+
9
+ Options:
10
+ BANNER
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,46 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Config
4
+ module Config
5
+ include Directive::Mod::Group
6
+
7
+ def deployment(&blk)
8
+ directive_eval(_deployment, &blk)
9
+ end
10
+
11
+ def _deployment
12
+ @_deployment ||= Directive::Deployment.new(dapp: dapp).tap { |group| @_group << group }
13
+ end
14
+
15
+ protected
16
+
17
+ def deployment_config_validate!
18
+ raise Error::Config, code: :app_name_required if _app.any? { |app| app._name.nil? } && _app.size > 1
19
+ _app.each do |app|
20
+ raise Error::Config, code: :app_dimg_not_defined, data: { app: app._name } if app._dimg.nil? && !_dimg.map(&:_name).compact.empty?
21
+ unless _dimg.map(&:_name).include?(app._dimg)
22
+ raise Error::Config, code: :app_dimg_not_found, data: { app: app._name, dimg: app._dimg }
23
+ end
24
+ end
25
+
26
+ [:deployment, :app].each do |directive|
27
+ Array(public_send(:"_#{directive}")).each do |obj|
28
+ [:bootstrap, :before_apply_job].each do |job|
29
+ next if (job_config = obj.public_send("_#{job}")).empty?
30
+ job_dimg = job_config._dimg || obj._dimg
31
+ if job_dimg.nil? && !_dimg.map(&:_name).compact.empty?
32
+ raise Error::Config, code: :"#{directive}_#{job}_dimg_not_defined"
33
+ end
34
+ unless _dimg.map(&:_name).include?(job_dimg)
35
+ raise Error::Config, code: :"#{directive}_#{job}_dimg_not_found", data: { dimg: job_dimg }
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ ::Dapp::Config::Config.send(:include, ::Dapp::Deployment::Config::Config)
@@ -0,0 +1,28 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Config
4
+ module Directive
5
+ class App < Base
6
+ include InstanceMethods
7
+ include Mod::Jobs
8
+
9
+ attr_reader :_name
10
+
11
+ def initialize(name, dapp:)
12
+ self._name = name
13
+ super(dapp: dapp)
14
+ end
15
+
16
+ def _name=(name)
17
+ sub_directive_eval do
18
+ return self if name.nil?
19
+ name = name.to_s
20
+ validate_compliance!(hostname_pattern, name, :app_name_incorrect)
21
+ @_name = name
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,51 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Config
4
+ module Directive
5
+ class App < Base
6
+ module InstanceMethods
7
+ attr_reader :_dimg, :_namespace, :_expose, :_migrate
8
+
9
+ def self.included(base)
10
+ base.include(Namespace::InstanceMethods)
11
+ end
12
+
13
+ def dimg(name)
14
+ @_dimg = name
15
+ end
16
+
17
+ def namespace(name, &blk)
18
+ (_namespace[name] ||= begin
19
+ Namespace.new(name, dapp: dapp).tap do |namespace|
20
+ _namespace[name] = namespace
21
+ end
22
+ end).tap do |namespace|
23
+ directive_eval(namespace, &blk)
24
+ end
25
+ end
26
+
27
+ def expose(&blk)
28
+ directive_eval(_expose, &blk)
29
+ end
30
+
31
+ def migrate(cmd)
32
+ sub_directive_eval { @_migrate = cmd }
33
+ end
34
+
35
+ protected
36
+
37
+ def app_init_variables!
38
+ @_migrate = []
39
+ @_namespace = {}
40
+ @_expose = Expose.new(dapp: dapp)
41
+ end
42
+
43
+ def passed_directives
44
+ [:@_dimg, :@_namespace, :@_expose, :@_migrate, :@_environment, :@_secret_environment, :@_scale]
45
+ end
46
+ end # InstanceMethods
47
+ end # App
48
+ end # Directive
49
+ end # Config
50
+ end # Deployment
51
+ end # Dapp
@@ -0,0 +1,13 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Config
4
+ module Directive
5
+ class Base < ::Dapp::Config::Directive::Base
6
+ def hostname_pattern
7
+ '^[a-z0-9_-]*[a-z0-9]$'
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Config
4
+ module Directive
5
+ class Deployment < Group
6
+ include Mod::Jobs
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,68 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Config
4
+ module Directive
5
+ class Expose < Base
6
+ attr_reader :_port
7
+ attr_reader :_type
8
+
9
+ def initialize(dapp:)
10
+ @_port = []
11
+ @_type = 'ClusterIP'
12
+ super
13
+ end
14
+
15
+ def cluster_ip
16
+ sub_directive_eval { @_type = 'ClusterIP' }
17
+ end
18
+
19
+ def load_balancer
20
+ sub_directive_eval { @_type = 'LoadBalancer' }
21
+ end
22
+
23
+ def node_port
24
+ sub_directive_eval { @_type = 'NodePort' }
25
+ end
26
+
27
+ def port(number, &blk)
28
+ sub_directive_eval { @_port << Port.new(number, dapp: dapp, &blk) }
29
+ end
30
+
31
+ class Port < Base
32
+ attr_reader :_number, :_target, :_protocol
33
+
34
+ def initialize(number, dapp:, &blk)
35
+ self._number = number
36
+ @_protocol = 'TCP'
37
+ super(dapp: dapp, &blk)
38
+ end
39
+
40
+ def target(number)
41
+ @_target = define_number(number, :unsupported_target_number)
42
+ end
43
+
44
+ def tcp
45
+ @_protocol = 'TCP'
46
+ end
47
+
48
+ def udp
49
+ @_protocol = 'UDP'
50
+ end
51
+
52
+ def _number=(number)
53
+ @_number = define_number(number, :unsupported_port_number)
54
+ end
55
+
56
+ protected
57
+
58
+ def define_number(number, code)
59
+ number.to_i.tap do |n|
60
+ raise Error::Config, code: code, data: { number: number } unless (0..65536).cover?(n)
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,27 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Config
4
+ module Directive
5
+ class Group < Base
6
+ include Mod::Group
7
+ include App::InstanceMethods
8
+
9
+ def group(&blk)
10
+ Group.new(dapp: dapp).tap do |group|
11
+ group.instance_eval(&blk) if block_given?
12
+ @_group << group
13
+ end
14
+ end
15
+
16
+ def app(name = nil, &blk)
17
+ App.new(name, dapp: dapp).tap do |app|
18
+ pass_to(app)
19
+ app.instance_eval(&blk) if block_given?
20
+ @_app << app
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,28 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Config
4
+ module Directive
5
+ class Job < Base
6
+ attr_reader :_run, :_dimg
7
+
8
+ def initialize(*args)
9
+ super
10
+ @_run = []
11
+ end
12
+
13
+ def run(*args)
14
+ sub_directive_eval { @_run.concat(args.flatten) }
15
+ end
16
+
17
+ def dimg(name)
18
+ sub_directive_eval { @_dimg = name }
19
+ end
20
+
21
+ def empty?
22
+ _run.empty? && _dimg.nil?
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Config
4
+ module Directive
5
+ module Mod
6
+ module Group
7
+ def _app
8
+ (@_app + @_group.map(&:_app)).flatten
9
+ end
10
+
11
+ protected
12
+
13
+ def deploy_init_variables!
14
+ @_group = []
15
+ @_app = []
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Config
4
+ module Directive
5
+ module Mod
6
+ module Jobs
7
+ attr_reader :_bootstrap, :_before_apply_job
8
+
9
+ def bootstrap(&blk)
10
+ directive_eval(_bootstrap, &blk)
11
+ end
12
+
13
+ def before_apply_job(&blk)
14
+ directive_eval(_before_apply_job, &blk)
15
+ end
16
+
17
+ def jobs_init_variables!
18
+ @_bootstrap = Directive::Job.new(dapp: dapp)
19
+ @_before_apply_job = Directive::Job.new(dapp: dapp)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Config
4
+ module Directive
5
+ class Namespace < Base
6
+ include InstanceMethods
7
+
8
+ attr_reader :_name
9
+
10
+ def initialize(name, dapp:)
11
+ self._name = name
12
+ super(dapp: dapp)
13
+ end
14
+
15
+ def _name=(name)
16
+ sub_directive_eval do
17
+ name = name.to_s
18
+ validate_compliance!(hostname_pattern, name, :namespace_name_incorrect)
19
+ @_name = name
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Config
4
+ module Directive
5
+ class Namespace < Base
6
+ module InstanceMethods
7
+ attr_reader :_environment, :_secret_environment, :_scale
8
+
9
+ def environment(**kwargs)
10
+ sub_directive_eval { _environment.merge!(**kwargs) }
11
+ end
12
+
13
+ def secret_environment(**kwargs)
14
+ sub_directive_eval { _secret_environment.merge!(**kwargs) }
15
+ end
16
+
17
+ def scale(value)
18
+ sub_directive_eval do
19
+ value.to_i.tap do |v|
20
+ raise Error::Config, code: :unsupported_scale_value, data: { value: value } unless v > 0
21
+ @_scale = v
22
+ end
23
+ end
24
+ end
25
+
26
+ protected
27
+
28
+ def namespace_init_variables!
29
+ @_environment = {}
30
+ @_secret_environment = {}
31
+ end
32
+ end # InstanceMethods
33
+ end # Namespace
34
+ end # Directive
35
+ end # Config
36
+ end # Deployment
37
+ end # Dapp
@@ -0,0 +1,19 @@
1
+ module Dapp
2
+ module Deployment
3
+ module CoreExt
4
+ module Hash
5
+ def kube_in_depth_merge(hash)
6
+ merge(hash) do |_, v1, v2|
7
+ if v1.is_a?(::Hash) && v2.is_a?(::Hash)
8
+ v1.kube_in_depth_merge(v2)
9
+ else
10
+ v2
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ ::Hash.send(:include, ::Dapp::Deployment::CoreExt::Hash)