kuber_kit 0.1.8 → 0.2.3

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +4 -2
  3. data/README.md +16 -3
  4. data/TODO.md +5 -3
  5. data/bin/kit +0 -1
  6. data/example/configurations/review.rb +2 -1
  7. data/example/images/app_sources/Dockerfile +1 -1
  8. data/example/images/ruby_app/image.rb +4 -4
  9. data/example/infrastructure/build_servers.rb +8 -0
  10. data/example/services/env_file.rb +1 -0
  11. data/example/services/ruby_app.rb +2 -1
  12. data/kuber_kit.gemspec +1 -0
  13. data/lib/kuber_kit.rb +37 -19
  14. data/lib/kuber_kit/actions/configuration_loader.rb +9 -2
  15. data/lib/kuber_kit/actions/env_file_reader.rb +3 -0
  16. data/lib/kuber_kit/actions/image_compiler.rb +14 -10
  17. data/lib/kuber_kit/actions/kubectl_applier.rb +7 -3
  18. data/lib/kuber_kit/actions/kubectl_attacher.rb +26 -0
  19. data/lib/kuber_kit/actions/service_deployer.rb +31 -0
  20. data/lib/kuber_kit/actions/service_reader.rb +4 -0
  21. data/lib/kuber_kit/actions/template_reader.rb +3 -0
  22. data/lib/kuber_kit/cli.rb +54 -20
  23. data/lib/kuber_kit/configs.rb +24 -22
  24. data/lib/kuber_kit/container.rb +21 -13
  25. data/lib/kuber_kit/core/artifacts/artifact_store.rb +9 -28
  26. data/lib/kuber_kit/core/build_servers/abstract_build_server.rb +21 -0
  27. data/lib/kuber_kit/core/build_servers/build_server.rb +24 -0
  28. data/lib/kuber_kit/core/build_servers/build_server_store.rb +18 -0
  29. data/lib/kuber_kit/core/configuration.rb +10 -4
  30. data/lib/kuber_kit/core/configuration_definition.rb +18 -1
  31. data/lib/kuber_kit/core/configuration_factory.rb +11 -1
  32. data/lib/kuber_kit/core/configuration_store.rb +14 -24
  33. data/lib/kuber_kit/core/env_files/env_file_store.rb +8 -23
  34. data/lib/kuber_kit/core/image_store.rb +8 -18
  35. data/lib/kuber_kit/core/registries/registry_store.rb +8 -23
  36. data/lib/kuber_kit/core/service_store.rb +13 -23
  37. data/lib/kuber_kit/core/store.rb +48 -0
  38. data/lib/kuber_kit/core/templates/template_store.rb +9 -28
  39. data/lib/kuber_kit/image_compiler/build_server_pool.rb +31 -0
  40. data/lib/kuber_kit/image_compiler/build_server_pool_factory.rb +13 -0
  41. data/lib/kuber_kit/image_compiler/image_build_dir_creator.rb +13 -7
  42. data/lib/kuber_kit/image_compiler/image_dependency_resolver.rb +25 -5
  43. data/lib/kuber_kit/preprocessing/file_preprocessor.rb +5 -4
  44. data/lib/kuber_kit/service_deployer/strategies/kubernetes.rb +5 -3
  45. data/lib/kuber_kit/shell/abstract_shell.rb +4 -0
  46. data/lib/kuber_kit/shell/{bash_commands.rb → commands/bash_commands.rb} +1 -1
  47. data/lib/kuber_kit/shell/{docker_commands.rb → commands/docker_commands.rb} +1 -1
  48. data/lib/kuber_kit/shell/{git_commands.rb → commands/git_commands.rb} +1 -1
  49. data/lib/kuber_kit/shell/commands/kubectl_commands.rb +65 -0
  50. data/lib/kuber_kit/shell/commands/rsync_commands.rb +32 -0
  51. data/lib/kuber_kit/shell/local_shell.rb +24 -5
  52. data/lib/kuber_kit/shell/ssh_session.rb +62 -0
  53. data/lib/kuber_kit/shell/ssh_shell.rb +77 -0
  54. data/lib/kuber_kit/tools/file_presence_checker.rb +6 -2
  55. data/lib/kuber_kit/ui/interactive.rb +8 -0
  56. data/lib/kuber_kit/ui/simple.rb +6 -0
  57. data/lib/kuber_kit/version.rb +2 -2
  58. metadata +34 -12
  59. data/lib/kuber_kit/preprocessing/dir_preprocessor.rb +0 -19
  60. data/lib/kuber_kit/shell/kubectl_commands.rb +0 -42
  61. data/lib/kuber_kit/shell/rsync_commands.rb +0 -20
  62. data/lib/kuber_kit/tools/files_sync.rb +0 -10
@@ -10,7 +10,11 @@ class KuberKit::Actions::ServiceReader
10
10
  result = service_reader.call(local_shell, service_name)
11
11
 
12
12
  ui.print_info(service_name.to_s, result)
13
+
14
+ true
13
15
  rescue KuberKit::Error => e
14
16
  ui.print_error("Error", e.message)
17
+
18
+ false
15
19
  end
16
20
  end
@@ -13,7 +13,10 @@ class KuberKit::Actions::TemplateReader
13
13
  result = reader.read(local_shell, template)
14
14
 
15
15
  ui.print_info(template_name.to_s, result)
16
+
17
+ true
16
18
  rescue KuberKit::Error => e
17
19
  ui.print_error("Error", e.message)
20
+ false
18
21
  end
19
22
  end
@@ -14,56 +14,90 @@ class KuberKit::CLI < Thor
14
14
 
15
15
  image_names = image_names_str.split(",").map(&:strip).map(&:to_sym)
16
16
 
17
- KuberKit::Container['actions.configuration_loader'].call(options)
18
- KuberKit::Container['actions.image_compiler'].call(image_names, options)
17
+ if KuberKit::Container['actions.configuration_loader'].call(options)
18
+ result = KuberKit::Container['actions.image_compiler'].call(image_names, options)
19
+ end
19
20
 
20
21
  logger = KuberKit::Container['tools.logger']
21
- logger.info("---------------------------")
22
- logger.info("Image compilation finished!")
23
- logger.info("---------------------------")
22
+ if result
23
+ logger.info("---------------------------")
24
+ logger.info("Image compilation finished!")
25
+ logger.info("---------------------------")
26
+ else
27
+ logger.info("-------------------------".red)
28
+ logger.info("Image compilation failed!".red)
29
+ logger.info("-------------------------".red)
30
+ end
31
+ end
32
+
33
+ desc "deploy CONTEXT_NAME", "Deploy CONTEXT_NAME with kubectl"
34
+ method_option :services, :type => :array, aliases: ["-s"]
35
+ method_option :tags, :type => :array, aliases: ["-t"]
36
+ def deploy
37
+ KuberKit.set_debug_mode(options[:debug])
38
+
39
+ if KuberKit::Container['actions.configuration_loader'].call(options)
40
+ result = KuberKit::Container['actions.service_deployer'].call(
41
+ services: options[:services] || [],
42
+ tags: options[:tags] || []
43
+ )
44
+ end
45
+
46
+ logger = KuberKit::Container['tools.logger']
47
+ if result
48
+ logger.info("---------------------------")
49
+ logger.info("Service deployment finished!")
50
+ logger.info("---------------------------")
51
+ else
52
+ logger.info("-------------------------".red)
53
+ logger.info("Service deployment failed!".red)
54
+ logger.info("-------------------------".red)
55
+ end
24
56
  end
25
57
 
26
58
  desc "env ENV_FILE_NAME", "Return content of Env File ENV_FILE_NAME"
27
59
  def env(env_file_name)
28
60
  KuberKit.set_debug_mode(options[:debug])
29
61
 
30
- KuberKit::Container['actions.configuration_loader'].call(options)
31
- KuberKit::Container['actions.env_file_reader'].call(env_file_name.to_sym, options)
62
+ if KuberKit::Container['actions.configuration_loader'].call(options)
63
+ KuberKit::Container['actions.env_file_reader'].call(env_file_name.to_sym, options)
64
+ end
32
65
  end
33
66
 
34
67
  desc "template TEMPLATE_NAME", "Return content of Template TEMPLATE_NAME"
35
68
  def template(template_name)
36
69
  KuberKit.set_debug_mode(options[:debug])
37
70
 
38
- KuberKit::Container['actions.configuration_loader'].call(options)
39
- KuberKit::Container['actions.template_reader'].call(template_name.to_sym, options)
71
+ if KuberKit::Container['actions.configuration_loader'].call(options)
72
+ KuberKit::Container['actions.template_reader'].call(template_name.to_sym, options)
73
+ end
40
74
  end
41
75
 
42
76
  desc "service SERVICE_NAME", "Return content of Service SERVICE_NAME"
43
77
  def service(service_name)
44
78
  KuberKit.set_debug_mode(options[:debug])
45
79
 
46
- KuberKit::Container['actions.configuration_loader'].call(options)
47
- KuberKit::Container['actions.service_reader'].call(service_name.to_sym, options)
80
+ if KuberKit::Container['actions.configuration_loader'].call(options)
81
+ KuberKit::Container['actions.service_reader'].call(service_name.to_sym, options)
82
+ end
48
83
  end
49
84
 
50
85
  desc "apply FILE_PATH", "Apply FILE_PATH with kubectl"
51
86
  def apply(file_path)
52
87
  KuberKit.set_debug_mode(options[:debug])
53
88
 
54
- KuberKit::Container['actions.configuration_loader'].call(options)
55
- KuberKit::Container['actions.kubectl_applier'].call(File.expand_path(file_path), options)
89
+ if KuberKit::Container['actions.configuration_loader'].call(options)
90
+ KuberKit::Container['actions.kubectl_applier'].call(File.expand_path(file_path), options)
91
+ end
56
92
  end
57
93
 
58
- desc "deploy CONTEXT_NAME", "Deploy CONTEXT_NAME with kubectl"
59
- method_option :services, :type => :array, aliases: ["-s"]
60
- method_option :tags, :type => :array, aliases: ["-t"]
61
- def deploy
94
+ desc "attach POD_NAME", "Attach to POD_NAME with kubectl"
95
+ def attach(pod_name)
62
96
  KuberKit.set_debug_mode(options[:debug])
63
97
 
64
- KuberKit::Container['actions.configuration_loader'].call(options)
65
-
66
- KuberKit::Container['actions.service_deployer'].call(services: options[:services], tags: options[:tags])
98
+ if KuberKit::Container['actions.configuration_loader'].call(options)
99
+ KuberKit::Container['actions.kubectl_attacher'].call(pod_name, options)
100
+ end
67
101
  end
68
102
 
69
103
  def self.exit_on_failure?
@@ -14,33 +14,35 @@ class KuberKit::Configs
14
14
  'tmp',
15
15
  'logs'
16
16
  ]
17
- KUBER_KIT_DIRNAME = "kuber_kit".freeze
18
- IMAGES_DIRNAME = "images".freeze
19
- SERVICES_DIRNAME = "services".freeze
20
- INFRA_DIRNAME = "infrastructure".freeze
21
- CONFIGURATIONS_DIRNAME = "configurations".freeze
22
- ARTIFACT_CLONE_DIR = "/tmp/kuber_kit/artifacts"
23
- SERVICE_CONFIG_DIR = "/tmp/kuber_kit/services"
24
- DEPLOY_STRATEGY = :kubernetes
17
+ KUBER_KIT_DIRNAME = "kuber_kit".freeze
18
+ IMAGES_DIRNAME = "images".freeze
19
+ SERVICES_DIRNAME = "services".freeze
20
+ INFRA_DIRNAME = "infrastructure".freeze
21
+ CONFIGURATIONS_DIRNAME = "configurations".freeze
22
+ ARTIFACT_CLONE_DIR = "/tmp/kuber_kit/artifacts"
23
+ SERVICE_CONFIG_DIR = "/tmp/kuber_kit/services"
24
+ DEPLOY_STRATEGY = :kubernetes
25
+ COMPILE_SIMULTANEOUS_LIMIT = 5
25
26
 
26
27
  attr_accessor :image_dockerfile_name, :image_build_context_dir, :image_tag,
27
28
  :docker_ignore_list, :image_compile_dir,
28
29
  :kuber_kit_dirname, :images_dirname, :services_dirname, :infra_dirname, :configurations_dirname,
29
- :artifact_clone_dir, :service_config_dir, :deploy_strategy
30
+ :artifact_clone_dir, :service_config_dir, :deploy_strategy, :compile_simultaneous_limit
30
31
 
31
32
  def initialize
32
- @image_dockerfile_name = IMAGE_DOCKERFILE_NAME
33
- @image_build_context_dir = IMAGE_BUILD_CONTEXT_DIR
34
- @image_tag = IMAGE_TAG
35
- @image_compile_dir = IMAGE_COMPILE_DIR
36
- @docker_ignore_list = DOCKER_IGNORE_LIST
37
- @kuber_kit_dirname = KUBER_KIT_DIRNAME
38
- @images_dirname = IMAGES_DIRNAME
39
- @services_dirname = SERVICES_DIRNAME
40
- @infra_dirname = INFRA_DIRNAME
41
- @configurations_dirname = CONFIGURATIONS_DIRNAME
42
- @artifact_clone_dir = ARTIFACT_CLONE_DIR
43
- @service_config_dir = SERVICE_CONFIG_DIR
44
- @deploy_strategy = DEPLOY_STRATEGY
33
+ @image_dockerfile_name = IMAGE_DOCKERFILE_NAME
34
+ @image_build_context_dir = IMAGE_BUILD_CONTEXT_DIR
35
+ @image_tag = IMAGE_TAG
36
+ @image_compile_dir = IMAGE_COMPILE_DIR
37
+ @docker_ignore_list = DOCKER_IGNORE_LIST
38
+ @kuber_kit_dirname = KUBER_KIT_DIRNAME
39
+ @images_dirname = IMAGES_DIRNAME
40
+ @services_dirname = SERVICES_DIRNAME
41
+ @infra_dirname = INFRA_DIRNAME
42
+ @configurations_dirname = CONFIGURATIONS_DIRNAME
43
+ @artifact_clone_dir = ARTIFACT_CLONE_DIR
44
+ @service_config_dir = SERVICE_CONFIG_DIR
45
+ @deploy_strategy = DEPLOY_STRATEGY
46
+ @compile_simultaneous_limit = COMPILE_SIMULTANEOUS_LIMIT
45
47
  end
46
48
  end
@@ -29,6 +29,10 @@ class KuberKit::Container
29
29
  KuberKit::Actions::KubectlApplier.new
30
30
  end
31
31
 
32
+ register "actions.kubectl_attacher" do
33
+ KuberKit::Actions::KubectlAttacher.new
34
+ end
35
+
32
36
  register "configs" do
33
37
  KuberKit::Configs.new
34
38
  end
@@ -69,18 +73,22 @@ class KuberKit::Container
69
73
  KuberKit::Core::ConfigurationStore.new
70
74
  end
71
75
 
72
- register "core.registry_store" do
73
- KuberKit::Core::Registries::RegistryStore.new
74
- end
75
-
76
76
  register "core.artifact_store" do
77
77
  KuberKit::Core::Artifacts::ArtifactStore.new
78
78
  end
79
79
 
80
+ register "core.build_server_store" do
81
+ KuberKit::Core::BuildServers::BuildServerStore.new
82
+ end
83
+
80
84
  register "core.env_file_store" do
81
85
  KuberKit::Core::EnvFiles::EnvFileStore.new
82
86
  end
83
87
 
88
+ register "core.registry_store" do
89
+ KuberKit::Core::Registries::RegistryStore.new
90
+ end
91
+
84
92
  register "core.template_store" do
85
93
  KuberKit::Core::Templates::TemplateStore.new
86
94
  end
@@ -102,23 +110,23 @@ class KuberKit::Container
102
110
  end
103
111
 
104
112
  register "shell.bash_commands" do
105
- KuberKit::Shell::BashCommands.new
113
+ KuberKit::Shell::Commands::BashCommands.new
106
114
  end
107
115
 
108
116
  register "shell.docker_commands" do
109
- KuberKit::Shell::DockerCommands.new
117
+ KuberKit::Shell::Commands::DockerCommands.new
110
118
  end
111
119
 
112
120
  register "shell.git_commands" do
113
- KuberKit::Shell::GitCommands.new
121
+ KuberKit::Shell::Commands::GitCommands.new
114
122
  end
115
123
 
116
124
  register "shell.rsync_commands" do
117
- KuberKit::Shell::RsyncCommands.new
125
+ KuberKit::Shell::Commands::RsyncCommands.new
118
126
  end
119
127
 
120
128
  register "shell.kubectl_commands" do
121
- KuberKit::Shell::KubectlCommands.new
129
+ KuberKit::Shell::Commands::KubectlCommands.new
122
130
  end
123
131
 
124
132
  register "shell.local_shell" do
@@ -137,14 +145,14 @@ class KuberKit::Container
137
145
  KuberKit::Preprocessing::FilePreprocessor.new
138
146
  end
139
147
 
140
- register "preprocessing.dir_preprocessor" do
141
- KuberKit::Preprocessing::DirPreprocessor.new
142
- end
143
-
144
148
  register "image_compiler.action_handler" do
145
149
  KuberKit::ImageCompiler::ActionHandler.new
146
150
  end
147
151
 
152
+ register "image_compiler.build_server_pool_factory" do
153
+ KuberKit::ImageCompiler::BuildServerPoolFactory.new
154
+ end
155
+
148
156
  register "image_compiler.compiler" do
149
157
  KuberKit::ImageCompiler::Compiler.new
150
158
  end
@@ -1,19 +1,6 @@
1
1
  class KuberKit::Core::Artifacts::ArtifactStore
2
- NotFoundError = Class.new(KuberKit::NotFoundError)
3
- AlreadyAddedError = Class.new(KuberKit::Error)
4
-
5
2
  def add(artifact)
6
- @@artifacts ||= {}
7
-
8
- if !artifact.is_a?(KuberKit::Core::Artifacts::AbstractArtifact)
9
- raise ArgumentError.new("should be an instance of KuberKit::Core::Artifacts::AbstractArtifact, got: #{artifact.inspect}")
10
- end
11
-
12
- unless @@artifacts[artifact.name].nil?
13
- raise AlreadyAddedError, "artifact #{artifact.name} was already added"
14
- end
15
-
16
- @@artifacts[artifact.name] = artifact
3
+ store.add(artifact.name, artifact)
17
4
  end
18
5
 
19
6
  def get(artifact_name)
@@ -24,14 +11,7 @@ class KuberKit::Core::Artifacts::ArtifactStore
24
11
  end
25
12
 
26
13
  def get_global(artifact_name)
27
- @@artifacts ||= {}
28
- artifact = @@artifacts[artifact_name]
29
-
30
- if artifact.nil?
31
- raise NotFoundError, "artifact '#{artifact_name}' not found"
32
- end
33
-
34
- artifact
14
+ store.get(artifact_name)
35
15
  end
36
16
 
37
17
  def get_from_configuration(artifact_name)
@@ -40,14 +20,15 @@ class KuberKit::Core::Artifacts::ArtifactStore
40
20
  end
41
21
 
42
22
  def reset!
43
- @@artifacts = {}
44
- end
45
-
46
- def all_definitions
47
- @@artifacts ||= {}
23
+ store.reset!
48
24
  end
49
25
 
50
26
  def exists?(artifact_name)
51
- !all_definitions[artifact_name].nil?
27
+ store.exists?(artifact_name)
52
28
  end
29
+
30
+ private
31
+ def store
32
+ @@store ||= KuberKit::Core::Store.new(KuberKit::Core::Artifacts::AbstractArtifact)
33
+ end
53
34
  end
@@ -0,0 +1,21 @@
1
+ class KuberKit::Core::BuildServers::AbstractBuildServer
2
+ include KuberKit::Extensions::Inspectable
3
+
4
+ attr_reader :name
5
+
6
+ def initialize(build_server_name)
7
+ @name = build_server_name
8
+ end
9
+
10
+ def host
11
+ raise KuberKit::NotImplementedError, "must be implemented"
12
+ end
13
+
14
+ def user
15
+ raise KuberKit::NotImplementedError, "must be implemented"
16
+ end
17
+
18
+ def port
19
+ raise KuberKit::NotImplementedError, "must be implemented"
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ class KuberKit::Core::BuildServers::BuildServer < KuberKit::Core::BuildServers::AbstractBuildServer
2
+ def setup(host:, user:, port:)
3
+ @host = host
4
+ @user = user
5
+ @port = port
6
+
7
+ self
8
+ end
9
+
10
+ def host
11
+ raise ArgumentError, "host is not set, please use #setup method" if @host.nil?
12
+ @host
13
+ end
14
+
15
+ def user
16
+ raise ArgumentError, "user is not set, please use #setup method" if @user.nil?
17
+ @user
18
+ end
19
+
20
+ def port
21
+ raise ArgumentError, "port is not set, please use #setup method" if @port.nil?
22
+ @port
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ class KuberKit::Core::BuildServers::BuildServerStore
2
+ def add(build_server)
3
+ store.add(build_server.name, build_server)
4
+ end
5
+
6
+ def get(build_server_name)
7
+ store.get(build_server_name)
8
+ end
9
+
10
+ def reset!
11
+ store.reset!
12
+ end
13
+
14
+ private
15
+ def store
16
+ @@store ||= KuberKit::Core::Store.new(KuberKit::Core::BuildServers::AbstractBuildServer)
17
+ end
18
+ end
@@ -1,5 +1,6 @@
1
1
  class KuberKit::Core::Configuration
2
- attr_reader :name, :artifacts, :registries, :env_files, :templates, :kubeconfig_path, :deploy_strategy, :services_attributes
2
+ attr_reader :name, :artifacts, :registries, :env_files, :templates, :kubeconfig_path,
3
+ :deploy_strategy, :deploy_namespace, :services_attributes, :build_servers
3
4
 
4
5
  Contract KeywordArgs[
5
6
  name: Symbol,
@@ -8,10 +9,13 @@ class KuberKit::Core::Configuration
8
9
  env_files: Hash,
9
10
  templates: Hash,
10
11
  kubeconfig_path: Maybe[String],
11
- deploy_strategy: Symbol,
12
- services_attributes: HashOf[Symbol => Hash]
12
+ deploy_strategy: Symbol,
13
+ deploy_namespace: Maybe[Symbol],
14
+ services_attributes: HashOf[Symbol => Hash],
15
+ build_servers: ArrayOf[KuberKit::Core::BuildServers::AbstractBuildServer]
13
16
  ] => Any
14
- def initialize(name:, artifacts:, registries:, env_files:, templates:, kubeconfig_path:, deploy_strategy:, services_attributes:)
17
+ def initialize(name:, artifacts:, registries:, env_files:, templates:, kubeconfig_path:,
18
+ deploy_strategy:, deploy_namespace:, services_attributes:, build_servers:)
15
19
  @name = name
16
20
  @artifacts = artifacts
17
21
  @registries = registries
@@ -19,7 +23,9 @@ class KuberKit::Core::Configuration
19
23
  @templates = templates
20
24
  @kubeconfig_path = kubeconfig_path
21
25
  @deploy_strategy = deploy_strategy
26
+ @deploy_namespace = deploy_namespace
22
27
  @services_attributes = services_attributes
28
+ @build_servers = build_servers
23
29
  end
24
30
 
25
31
  def service_attributes(service_name)
@@ -10,6 +10,7 @@ class KuberKit::Core::ConfigurationDefinition
10
10
  @registries = {}
11
11
  @env_files = {}
12
12
  @templates = {}
13
+ @build_servers = []
13
14
  @enabled_services = []
14
15
  @services_attributes = {}
15
16
  end
@@ -23,8 +24,10 @@ class KuberKit::Core::ConfigurationDefinition
23
24
  templates: @templates,
24
25
  kubeconfig_path: @kubeconfig_path,
25
26
  deploy_strategy: @deploy_strategy,
27
+ deploy_namespace: @deploy_namespace,
26
28
  enabled_services: @enabled_services,
27
- services_attributes: @services_attributes
29
+ build_servers: @build_servers,
30
+ services_attributes: @services_attributes,
28
31
  )
29
32
  end
30
33
 
@@ -64,12 +67,26 @@ class KuberKit::Core::ConfigurationDefinition
64
67
  self
65
68
  end
66
69
 
70
+ def use_build_server(build_server_name)
71
+ unless @build_servers.include?(build_server_name)
72
+ @build_servers.push(build_server_name)
73
+ end
74
+
75
+ self
76
+ end
77
+
67
78
  def kubeconfig_path(path)
68
79
  @kubeconfig_path = path
69
80
 
70
81
  self
71
82
  end
72
83
 
84
+ def deploy_namespace(namespace)
85
+ @deploy_namespace = namespace
86
+
87
+ self
88
+ end
89
+
73
90
  def deploy_strategy(path)
74
91
  @deploy_strategy = path
75
92