uffizzi-cli 2.1.0 → 2.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8fc9021c07ec1fbbbd32baab4e37dcdf3eb9b7368843701e9c0a086da8eefefe
4
- data.tar.gz: ccf95b0bd9ae6fffa906a15012825a9c9d4b209263e0735ce200d5ba5ca953b8
3
+ metadata.gz: 0a2c29a4de6f7d90584e2e49dfdfce35d6a787d126617a90af2725153a4d97e1
4
+ data.tar.gz: e318f3abd73127d71c42eb96a74adf02bd200d81b3d8beeaae4e96028f01a1fe
5
5
  SHA512:
6
- metadata.gz: aeb135bb03097b24c39b408e10bc31fa995d3cd4da3284eacc07be126b04a5aaf18a02e5cf432e5e9f46a24bb842c79209d3100ec8d0b94efde7f8c9a5b43ae4
7
- data.tar.gz: 29d2160ec30fd61f9f5bf96ef24dea226b6388e9ab1bcf47b3c6a66a2b518df17bc9013d5d036dc5f3c6b517e30f2de0015a46d2ce933f8332113943e84a9b54
6
+ metadata.gz: bf7d7627bb4d280719662cf21187cd532bf7434e11bfd5a52e43b31b008203061bcc3b31e1964001f15af5e2a98ee351481318326d4c4c729f63797c70dd6802
7
+ data.tar.gz: e5c50211551e420d3e114fd9a70987a7c481f9cf82517d3b5cf5f5baeddaa8f43244c9afcf0d0c5d947ef1e1cbb0be771376c8394f9a4028e661821eead389ed
@@ -4,7 +4,7 @@ module Uffizzi
4
4
  module AuthHelper
5
5
  class << self
6
6
  def signed_in?
7
- config_data_exists? || Uffizzi::Token.exists?
7
+ config_data_exists? && authorized?
8
8
  end
9
9
 
10
10
  def sign_out
@@ -16,13 +16,25 @@ module Uffizzi
16
16
  Uffizzi::Token.delete if Uffizzi::Token.exists?
17
17
  end
18
18
 
19
+ def check_login(project_option)
20
+ raise Uffizzi::Error.new('You are not logged in. Run `uffizzi login`.') unless signed_in?
21
+ raise Uffizzi::Error.new('This command needs project to be set in config file') unless project_set?(project_option)
22
+ end
23
+
19
24
  private
20
25
 
21
26
  def config_data_exists?
22
27
  ConfigFile.exists? &&
23
- ConfigFile.option_has_value?(:account) &&
24
- ConfigFile.option_has_value?(:cookie) &&
25
- ConfigFile.option_has_value?(:server)
28
+ ConfigFile.option_has_value?(:server) &&
29
+ ConfigFile.option_has_value?(:account)
30
+ end
31
+
32
+ def authorized?
33
+ ConfigFile.option_has_value?(:cookie) || Uffizzi::Token.exists?
34
+ end
35
+
36
+ def project_set?(project_option)
37
+ !project_option.nil? || (Uffizzi::ConfigFile.exists? && Uffizzi::ConfigFile.option_has_value?(:project))
26
38
  end
27
39
  end
28
40
  end
@@ -25,7 +25,7 @@ module Uffizzi
25
25
  private
26
26
 
27
27
  def run(command, account_name = nil)
28
- return Uffizzi.ui.say('You are not logged in.') unless Uffizzi::AuthHelper.signed_in?
28
+ Uffizzi::AuthHelper.check_login(options[:project])
29
29
 
30
30
  case command
31
31
  when 'list'
@@ -6,13 +6,10 @@ require 'uffizzi'
6
6
  require 'uffizzi/auth_helper'
7
7
  require 'uffizzi/helpers/config_helper'
8
8
  require 'uffizzi/services/preview_service'
9
- require 'uffizzi/services/command_service'
10
9
  require 'uffizzi/services/cluster_service'
11
10
  require 'uffizzi/services/kubeconfig_service'
12
11
  require 'uffizzi/services/cluster/disconnect_service'
13
12
 
14
- MANUAL = 'manual'
15
-
16
13
  module Uffizzi
17
14
  class Cli::Cluster < Thor
18
15
  class Error < StandardError; end
@@ -32,6 +29,7 @@ module Uffizzi
32
29
  method_option :'update-current-context', type: :boolean, required: false, default: true
33
30
  method_option :output, required: false, type: :string, aliases: '-o', enum: ['json', 'pretty-json']
34
31
  method_option :'creation-source', required: false, type: :string
32
+ method_option :'k8s-version', required: false, type: :string
35
33
  def create(name = nil)
36
34
  run('create', { name: name })
37
35
  end
@@ -67,9 +65,7 @@ module Uffizzi
67
65
 
68
66
  def run(command, command_args = {})
69
67
  Uffizzi.ui.output_format = options[:output]
70
- raise Uffizzi::Error.new('You are not logged in.') unless Uffizzi::AuthHelper.signed_in?
71
- raise Uffizzi::Error.new('This command needs project to be set in config file') unless CommandService.project_set?(options)
72
-
68
+ Uffizzi::AuthHelper.check_login(options[:project])
73
69
  project_slug = options[:project].nil? ? ConfigFile.read_option(:project) : options[:project]
74
70
 
75
71
  case command
@@ -115,14 +111,16 @@ module Uffizzi
115
111
  end
116
112
 
117
113
  cluster_name = command_args[:name] || options[:name] || ClusterService.generate_name
118
- creation_source = options[:"creation-source"] || MANUAL
119
-
120
- unless ClusterService.valid_name?(cluster_name)
121
- Uffizzi.ui.say_error_and_exit("Cluster name: #{cluster_name} is not valid.")
122
- end
123
-
124
- manifest_file_path = options[:manifest]
125
- params = cluster_creation_params(cluster_name, creation_source, manifest_file_path)
114
+ creation_source = options[:"creation-source"] || ClusterService::MANUAL_CREATION_SOURCE
115
+ k8s_version = options[:"k8s-version"]
116
+ Uffizzi.ui.say_error_and_exit("Cluster name: #{cluster_name} is not valid.") unless ClusterService.valid_name?(cluster_name)
117
+
118
+ params = cluster_creation_params(
119
+ name: cluster_name,
120
+ creation_source: creation_source,
121
+ manifest_file_path: options[:manifest],
122
+ k8s_version: k8s_version,
123
+ )
126
124
  response = create_cluster(ConfigFile.read_option(:server), project_slug, params)
127
125
 
128
126
  return ResponseHelper.handle_failed_response(response) unless ResponseHelper.created?(response)
@@ -241,7 +239,7 @@ module Uffizzi
241
239
  end
242
240
  end
243
241
 
244
- def cluster_creation_params(name, creation_source, manifest_file_path)
242
+ def cluster_creation_params(name:, creation_source:, manifest_file_path:, k8s_version:)
245
243
  manifest_content = load_manifest_file(manifest_file_path)
246
244
  oidc_token = Uffizzi::ConfigFile.read_option(:oidc_token)
247
245
 
@@ -250,6 +248,7 @@ module Uffizzi
250
248
  name: name,
251
249
  manifest: manifest_content,
252
250
  creation_source: creation_source,
251
+ k8s_version: k8s_version,
253
252
  },
254
253
  token: oidc_token,
255
254
  }
@@ -305,6 +304,7 @@ module Uffizzi
305
304
  status: cluster_data[:state],
306
305
  created: Time.strptime(cluster_data[:created_at], '%Y-%m-%dT%H:%M:%S.%N').strftime('%a %b %d %H:%M:%S %Y'),
307
306
  url: cluster_data[:host],
307
+ k8s_version: cluster_data[:k8s_version],
308
308
  }
309
309
 
310
310
  rendered_cluster_data = if Uffizzi.ui.output_format.nil?
@@ -337,7 +337,6 @@ module Uffizzi
337
337
  end
338
338
 
339
339
  def save_kubeconfig(kubeconfig, kubeconfig_path)
340
- kubeconfig_path = kubeconfig_path.nil? ? KubeconfigService.default_path : kubeconfig_path
341
340
  is_update_current_context = options[:'update-current-context']
342
341
 
343
342
  KubeconfigService.save_to_filepath(kubeconfig_path, kubeconfig) do |kubeconfig_by_path|
@@ -356,6 +355,8 @@ module Uffizzi
356
355
  merged_kubeconfig
357
356
  end
358
357
  end
358
+
359
+ Uffizzi.ui.say("Kubeconfig was updated by the path: #{kubeconfig_path}") if is_update_current_context
359
360
  end
360
361
 
361
362
  def update_clusters_config(id, params)
@@ -1,20 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'uffizzi/services/command_service'
4
3
  require 'uffizzi/services/cluster_service'
4
+ require 'uffizzi/services/dev_service'
5
5
  require 'uffizzi/services/kubeconfig_service'
6
+ require 'uffizzi/auth_helper'
6
7
 
7
8
  module Uffizzi
8
9
  class Cli::Dev < Thor
9
10
  include ApiClient
10
11
 
11
12
  desc 'start [CONFIG]', 'Start dev environment'
13
+ method_option :quiet, type: :boolean, aliases: :q
14
+ method_option :'default-repo', type: :string
15
+ method_option :kubeconfig, type: :string
16
+ method_option :'k8s-version', required: false, type: :string
12
17
  def start(config_path = 'skaffold.yaml')
13
- check_skaffold_existence
14
- check_login
18
+ Uffizzi::AuthHelper.check_login(options[:project])
19
+ DevService.check_skaffold_existence
20
+ DevService.check_running_daemon if options[:quiet]
21
+ DevService.check_skaffold_config_existence(config_path)
15
22
  cluster_id, cluster_name = start_create_cluster
16
23
  kubeconfig = wait_cluster_creation(cluster_name)
17
- launch_scaffold(config_path)
24
+
25
+ if options[:quiet]
26
+ launch_demonise_skaffold(config_path)
27
+ else
28
+ DevService.start_basic_skaffold(config_path, options)
29
+ end
18
30
  ensure
19
31
  if defined?(cluster_name).present? && defined?(cluster_id).present?
20
32
  kubeconfig = defined?(kubeconfig).present? ? kubeconfig : nil
@@ -22,17 +34,28 @@ module Uffizzi
22
34
  end
23
35
  end
24
36
 
25
- private
37
+ desc 'stop', 'Stop dev environment'
38
+ def stop
39
+ return Uffizzi.ui.say('Uffizzi dev is not running') unless File.exist?(DevService.pid_path)
40
+
41
+ pid = File.read(DevService.pid_path).to_i
42
+ File.delete(DevService.pid_path)
26
43
 
27
- def check_login
28
- raise Uffizzi::Error.new('You are not logged in.') unless Uffizzi::AuthHelper.signed_in?
29
- raise Uffizzi::Error.new('This command needs project to be set in config file') unless CommandService.project_set?(options)
44
+ Uffizzi.process.kill('QUIT', pid)
45
+ Uffizzi.ui.say('Uffizzi dev was stopped')
46
+ rescue Errno::ESRCH
47
+ Uffizzi.ui.say('Uffizzi dev is not running')
48
+ File.delete(DevService.pid_path)
30
49
  end
31
50
 
51
+ private
52
+
32
53
  def start_create_cluster
33
- cluster_name = ClusterService.generate_name
34
- creation_source = MANUAL
35
- params = cluster_creation_params(cluster_name, creation_source)
54
+ params = cluster_creation_params(
55
+ name: ClusterService.generate_name,
56
+ creation_source: ClusterService::MANUAL_CREATION_SOURCE,
57
+ k8s_version: options[:"k8s-version"],
58
+ )
36
59
  Uffizzi.ui.say('Start creating a cluster')
37
60
  response = create_cluster(ConfigFile.read_option(:server), project_slug, params)
38
61
  return ResponseHelper.handle_failed_response(response) unless ResponseHelper.created?(response)
@@ -56,7 +79,7 @@ module Uffizzi
56
79
  end
57
80
 
58
81
  def handle_succeed_cluster_creation(cluster_data)
59
- kubeconfig_path = KubeconfigService.default_path
82
+ kubeconfig_path = options[:kubeconfig] || KubeconfigService.default_path
60
83
  parsed_kubeconfig = parse_kubeconfig(cluster_data[:kubeconfig])
61
84
 
62
85
  Uffizzi.ui.say("Cluster with name: #{cluster_data[:name]} was created.")
@@ -85,7 +108,7 @@ module Uffizzi
85
108
  ConfigFile.write_option(:clusters, clusters_config)
86
109
  end
87
110
 
88
- def cluster_creation_params(name, creation_source)
111
+ def cluster_creation_params(name:, creation_source:, k8s_version:)
89
112
  oidc_token = Uffizzi::ConfigFile.read_option(:oidc_token)
90
113
 
91
114
  {
@@ -93,12 +116,15 @@ module Uffizzi
93
116
  name: name,
94
117
  manifest: nil,
95
118
  creation_source: creation_source,
119
+ k8s_version: k8s_version,
96
120
  },
97
121
  token: oidc_token,
98
122
  }
99
123
  end
100
124
 
101
125
  def handle_delete_cluster(cluster_id, cluster_name, kubeconfig)
126
+ return if cluster_id.nil? || cluster_name.nil?
127
+
102
128
  exclude_kubeconfig(cluster_id, kubeconfig) if kubeconfig.present?
103
129
 
104
130
  params = {
@@ -149,25 +175,19 @@ module Uffizzi
149
175
  Psych.safe_load(Base64.decode64(kubeconfig))
150
176
  end
151
177
 
152
- def launch_scaffold(config_path)
153
- Uffizzi.ui.say('Start skaffold')
154
- cmd = "skaffold dev --filename='#{config_path}'"
178
+ def launch_demonise_skaffold(config_path)
179
+ Uffizzi.process.daemon(true)
155
180
 
156
- Uffizzi.ui.popen2e(cmd) do |_stdin, stdout_and_stderr, wait_thr|
157
- stdout_and_stderr.each { |l| puts l }
158
- wait_thr.value
181
+ at_exit do
182
+ File.delete(DevService.pid_path) if File.exist?(DevService.pid_path)
159
183
  end
160
- end
161
-
162
- def check_skaffold_existence
163
- cmd = 'skaffold version'
164
- stdout_str, stderr_str = Uffizzi.ui.capture3(cmd)
165
-
166
- return if stdout_str.present? && stderr_str.blank?
167
184
 
168
- Uffizzi.ui.say_error_and_exit(stderr_str)
185
+ File.delete(DevService.logs_path) if File.exist?(DevService.logs_path)
186
+ File.write(DevService.pid_path, Uffizzi.process.pid)
187
+ DevService.start_check_pid_file_existence
188
+ DevService.start_demonised_skaffold(config_path, options)
169
189
  rescue StandardError => e
170
- Uffizzi.ui.say_error_and_exit(e.message)
190
+ File.open(DevService.logs_path, 'a') { |f| f.puts(e.message) }
171
191
  end
172
192
 
173
193
  def project_slug
@@ -4,7 +4,6 @@ require 'uffizzi'
4
4
  require 'uffizzi/auth_helper'
5
5
  require 'uffizzi/response_helper'
6
6
  require 'uffizzi/services/preview_service'
7
- require 'uffizzi/services/command_service'
8
7
 
9
8
  module Uffizzi
10
9
  class Cli::Preview::Service < Thor
@@ -12,8 +11,7 @@ module Uffizzi
12
11
 
13
12
  desc 'logs [LOGS_TYPE] [DEPLOYMENT_ID] [CONTAINER_NAME]', 'Show the logs for a container service of a preview'
14
13
  def logs(logs_type, deployment_name, container_name = args)
15
- return Uffizzi.ui.say('You are not logged in.') unless Uffizzi::AuthHelper.signed_in?
16
- return Uffizzi.ui.say('This command needs project to be set in config file') unless CommandService.project_set?(options)
14
+ Uffizzi::AuthHelper.check_login(options[:project])
17
15
 
18
16
  deployment_id = PreviewService.read_deployment_id(deployment_name)
19
17
  response = service_logs_response(logs_type, deployment_id, container_name)
@@ -28,8 +26,7 @@ module Uffizzi
28
26
 
29
27
  desc 'list [DEPLOYMENT_ID]', 'List the container services of a given compose environment (preview)'
30
28
  def list(deployment_name)
31
- return Uffizzi.ui.say('You are not logged in.') unless Uffizzi::AuthHelper.signed_in?
32
- return Uffizzi.ui.say('This command needs project to be set in config file') unless CommandService.project_set?(options)
29
+ Uffizzi::AuthHelper.check_login(options[:project])
33
30
 
34
31
  project_slug = options[:project].nil? ? ConfigFile.read_option(:project) : options[:project]
35
32
  server = ConfigFile.read_option(:server)
@@ -3,7 +3,6 @@
3
3
  require 'uffizzi'
4
4
  require 'uffizzi/auth_helper'
5
5
  require 'uffizzi/services/preview_service'
6
- require 'uffizzi/services/command_service'
7
6
  require 'uffizzi/services/github_service'
8
7
 
9
8
  module Uffizzi
@@ -55,8 +54,7 @@ module Uffizzi
55
54
 
56
55
  def run(command, file_path: nil, deployment_name: nil)
57
56
  Uffizzi.ui.output_format = options[:output]
58
- raise Uffizzi::Error.new('You are not logged in.') unless Uffizzi::AuthHelper.signed_in?
59
- raise Uffizzi::Error.new('This command needs project to be set in config file') unless CommandService.project_set?(options)
57
+ Uffizzi::AuthHelper.check_login(options[:project])
60
58
 
61
59
  project_slug = options[:project].nil? ? ConfigFile.read_option(:project) : options[:project]
62
60
 
@@ -5,7 +5,6 @@ require 'uffizzi/auth_helper'
5
5
  require 'uffizzi/response_helper'
6
6
  require 'uffizzi/services/compose_file_service'
7
7
  require 'uffizzi/services/env_variables_service'
8
- require 'uffizzi/services/command_service'
9
8
 
10
9
  module Uffizzi
11
10
  class Cli::Project::Compose < Thor
@@ -29,8 +28,7 @@ module Uffizzi
29
28
  private
30
29
 
31
30
  def run(command)
32
- return Uffizzi.ui.say('You are not logged in.') unless Uffizzi::AuthHelper.signed_in?
33
- return Uffizzi.ui.say('This command needs project to be set in config file') unless CommandService.project_set?(options)
31
+ Uffizzi::AuthHelper.check_login(options[:project])
34
32
 
35
33
  project_slug = options[:project].nil? ? ConfigFile.read_option(:project) : options[:project]
36
34
  file_path = options[:file]
@@ -55,7 +55,7 @@ module Uffizzi
55
55
  private
56
56
 
57
57
  def run(command, project_slug: nil)
58
- return Uffizzi.ui.say('You are not logged in.') unless Uffizzi::AuthHelper.signed_in?
58
+ Uffizzi::AuthHelper.check_login(options[:project])
59
59
 
60
60
  case command
61
61
  when 'list'
@@ -5,6 +5,7 @@ require 'uffizzi/helpers/file_helper'
5
5
 
6
6
  module Uffizzi
7
7
  class ConfigFile
8
+ CONFIG_DIR = "#{Dir.home}/.config/uffizzi"
8
9
  CONFIG_PATH = "#{Dir.home}/.config/uffizzi/config_default.json"
9
10
 
10
11
  class << self
@@ -9,6 +9,7 @@ class ClusterService
9
9
  CLUSTER_STATE_FAILED_DEPLOY_NAMESPACE = 'failed_deploy_namespace'
10
10
  CLUSTER_STATE_FAILED = 'failed'
11
11
  CLUSTER_NAME_MAX_LENGTH = 15
12
+ MANUAL_CREATION_SOURCE = 'manual'
12
13
 
13
14
  class << self
14
15
  include ApiClient
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uffizzi/clients/api/api_client'
4
+
5
+ class DevService
6
+ class << self
7
+ include ApiClient
8
+
9
+ DEFAULT_REGISTRY_REPO = 'registry.uffizzi.com'
10
+
11
+ def check_running_daemon
12
+ return unless File.exist?(pid_path)
13
+
14
+ pid = File.read(pid_path)
15
+ File.delete(pid_path) if pid.blank?
16
+ Uffizzi.process.kill(0, pid.to_i)
17
+
18
+ Uffizzi.ui.say_error_and_exit("You have already started uffizzi dev as daemon. To stop the process do 'uffizzi dev stop'")
19
+ rescue Errno::ESRCH
20
+ File.delete(pid_path)
21
+ end
22
+
23
+ def start_check_pid_file_existence
24
+ Thread.new do
25
+ loop do
26
+ Uffizzi.process.kill('QUIT', Uffizzi.process.pid) unless File.exist?(pid_path)
27
+ sleep(1)
28
+ end
29
+ end
30
+ end
31
+
32
+ def start_basic_skaffold(config_path, options)
33
+ Uffizzi.ui.say('Start skaffold')
34
+ cmd = build_skaffold_dev_command(config_path, options)
35
+
36
+ Uffizzi.ui.popen2e(cmd) do |_stdin, stdout_and_stderr, wait_thr|
37
+ stdout_and_stderr.each { |l| Uffizzi.ui.say(l) }
38
+ wait_thr.value
39
+ end
40
+ end
41
+
42
+ def start_demonised_skaffold(config_path, options)
43
+ File.write(logs_path, "Start skaffold\n")
44
+ cmd = build_skaffold_dev_command(config_path, options)
45
+
46
+ Uffizzi.ui.popen2e(cmd) do |_stdin, stdout_and_stderr, wait_thr|
47
+ File.open(logs_path, 'a') do |f|
48
+ stdout_and_stderr.each do |line|
49
+ f.puts(line)
50
+ f.flush
51
+ end
52
+ end
53
+
54
+ wait_thr.value
55
+ end
56
+ end
57
+
58
+ def check_skaffold_existence
59
+ cmd = 'skaffold version'
60
+ stdout_str, stderr_str = Uffizzi.ui.capture3(cmd)
61
+
62
+ return if stdout_str.present? && stderr_str.blank?
63
+
64
+ Uffizzi.ui.say_error_and_exit(stderr_str)
65
+ rescue StandardError => e
66
+ Uffizzi.ui.say_error_and_exit(e.message)
67
+ end
68
+
69
+ def check_skaffold_config_existence(config_path)
70
+ msg = 'A valid dev environment configuration is required. Please provide a valid config,'\
71
+ "\r\n"\
72
+ 'or run `skaffold init` to generate a skaffold.yaml configuration.'\
73
+ "\r\n"\
74
+ 'See the `uffizzi dev start --help` page for supported configs and usage details.'
75
+
76
+ Uffizzi.ui.say_error_and_exit(msg) unless File.exist?(config_path)
77
+ end
78
+
79
+ def pid_path
80
+ File.join(Uffizzi::ConfigFile::CONFIG_DIR, 'uffizzi_dev.pid')
81
+ end
82
+
83
+ def logs_path
84
+ File.join(Uffizzi::ConfigFile::CONFIG_DIR, 'uffizzi_dev.log')
85
+ end
86
+
87
+ def build_skaffold_dev_command(config_path, options)
88
+ cmd = [
89
+ 'skaffold dev',
90
+ "--filename='#{config_path}'",
91
+ "--default-repo='#{default_registry_repo(options[:'default-repo'])}'",
92
+ "--kubeconfig='#{default_kubeconfig_path(options[:kubeconfig])}'",
93
+ ]
94
+
95
+ cmd.join(' ')
96
+ end
97
+
98
+ def default_registry_repo(repo)
99
+ repo || DEFAULT_REGISTRY_REPO
100
+ end
101
+
102
+ def default_kubeconfig_path(kubeconfig_path)
103
+ path = kubeconfig_path || KubeconfigService.default_path
104
+
105
+ File.expand_path(path)
106
+ end
107
+ end
108
+ end
@@ -81,7 +81,9 @@ class KubeconfigService
81
81
  end
82
82
 
83
83
  def default_path
84
- kubeconfig_env_path || Uffizzi.configuration.default_kubeconfig_path
84
+ path = kubeconfig_env_path || Uffizzi.configuration.default_kubeconfig_path
85
+
86
+ File.expand_path(path)
85
87
  end
86
88
 
87
89
  def read_kubeconfig(filepath)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Uffizzi
4
- VERSION = '2.1.0'
4
+ VERSION = '2.1.3'
5
5
  end
data/lib/uffizzi.rb CHANGED
@@ -36,5 +36,9 @@ module Uffizzi
36
36
  def root
37
37
  @root ||= Pathname.new(File.expand_path('..', __dir__))
38
38
  end
39
+
40
+ def process
41
+ @process ||= Process
42
+ end
39
43
  end
40
44
  end
@@ -1,3 +1,4 @@
1
+ uffizzi cluster create -h
1
2
  uffizzi-cluster-create - create a cluster
2
3
  ================================================================
3
4
 
@@ -12,9 +13,17 @@ uffizzi-cluster-create - create a cluster
12
13
  https://docs.uffizzi.com/references/cli/
13
14
 
14
15
  ## FLAGS
16
+
15
17
  --name
16
18
  Option is deprecated and will be removed in the newer versions.
17
- Please use a positional argument instead: uffizzi cluster create my-awesome-name.
19
+ Please use a positional argument instead: uffizzi cluster create
20
+ my-awesome-name.
21
+
22
+ --k8s-version=<api-version>
23
+ Specify which version of the Kubernetes API to use when creating
24
+ the cluster, formatted as [MAJOR].[MINOR]. Defaults to 1.27.
25
+ Minor versions point to the latest release of the corresponding k3s
26
+ minor version. See https://github.com/k3s-io/k3s/releases
18
27
 
19
28
  --kubeconfig="/path/to/your/kubeconfig"
20
29
  Path to kubeconfig file
@@ -1,29 +1,99 @@
1
1
  .\" generated with Ronn-NG/v0.9.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.9.1
3
- .TH "UFFIZZI\-DEV\-START" "" "September 2023" ""
3
+ .TH "UFFIZZI\-DEV\-START" "" "October 2023" ""
4
4
  .SH "NAME"
5
- \fBuffizzi\-dev\-start\fR \- start development environment
5
+ \fBuffizzi\-dev\-start\fR \- start a development environment
6
6
  .SH "SYNOPSIS"
7
7
  .nf
8
- uffizzi dev start [SKAFFOLD_CONFIG_FILE_PATH]
8
+ uffizzi dev start [CONFIG_FILE] [FLAGS]
9
9
  .fi
10
10
  .SH "DESCRIPTION"
11
11
  .nf
12
- Creates a new cluster and start skaffold\. If no SKAFFOLD_CONFIG_FILE_PATH is specified,
13
- the default path will be used\.
14
- Default SKAFFOLD_CONFIG_FILE_PATH is \'skaffold\.yaml\'
12
+ Creates a Uffizzi cluster preconfigured for development
13
+ workflows, including building, pushing, and deploying
14
+ your changes every time project files are saved\.
15
+ current\-context is updated in kubeconfig file\.
16
+
17
+ This command watches for file changes in a given local
18
+ project directory, as specified in your configuration file\.
19
+ It then serializes those changes and redeploys them onto
20
+ a Uffizzi cluster\.
21
+
22
+ The command looks for a configuration at the specified
23
+ path CONFIG_FILE\. Skaffold configurations are currently
24
+ supported\. For help creating a skaffold\.yaml file, see:
25
+ https://skaffold\.dev/docs/init/
26
+
27
+ If a kubeconfig exists
15
28
 
16
29
  For more information on Uffizzi clusters, see:
17
30
  https://docs\.uffizzi\.com/references/cli/
18
31
  .fi
32
+ .SH "POSITIONAL ARGUMENTS"
33
+ .nf
34
+ [CONFIG_FILE]
35
+ Path to the development environment configuration file\.
36
+ Currently supports skaffold\.yaml files\.
37
+ .fi
38
+ .SH "FLAGS"
39
+ .nf
40
+ \-\-build="<local\-or\-remote>"
41
+ This option specifies whether to build images on the
42
+ local environment or on the remote Uffizzi cluster\.
43
+ Possible values are "local" or "remote"\.
44
+
45
+ \-\-default\-repo="<container\-registry\-domain>"
46
+ A public or private repo used to push/pull build
47
+ artifacts\. Overrides the global default image registry:
48
+ "registry\.uffizzi\.com"\. See `uffizzi connect \-h` for
49
+ adding private registry credentials\.
50
+
51
+ \-\-quiet, \-q
52
+ Run the development process in detached mode (i\.e\., in
53
+ the background)\. Without this option, logs are streamed
54
+ to the terminal in the foreground\. Run \'uffizzi dev stop`
55
+ to stop the detached process\.
56
+
57
+ \-\-help, \-h
58
+ Show this message and exit\.
59
+
60
+ \-\-kubeconfig="/path/to/your/kubeconfig"
61
+ Path to kubeconfig file\. If this option is not specified,
62
+ this command looks for the file at ~/\.kube/config\.
63
+ .fi
19
64
  .SH "EXAMPLES"
20
65
  .nf
21
- To start development environment, run:
66
+ If your configuration file is in the current working
67
+ directory and you want to use an auto\-generated name,
68
+ run:
22
69
 
23
70
  $ uffizzi dev start
24
71
 
25
- To start development environment with custom skaffold\.yaml file, run:
72
+ To start a dev environment using a skaffold\.yaml config
73
+ file in directory \'~/foo\', run:
74
+
75
+ $ uffizzi dev start ~/foo/skaffold\.yaml
76
+
77
+ To start a dev environment in quiet mode,
78
+ run:
79
+
80
+ $ uffizzi dev start \-\-quiet
81
+
82
+ To push your build artifacts to a private Docker Hub repo
83
+ called \'acme/foo\', first add your Docker Hub credentials:
84
+
85
+ $ uffizzi connect docker\-hub
86
+ (See `uffizzi connect \-h` for other registry options)
87
+
88
+ \|\.\|\.\|\.then override the default repo:
89
+
90
+ $ uffizzi dev start \e
91
+ \-\-default\-repo="hub\.docker\.com/acme/foo"
92
+
93
+ To start a dev environment using an alternate kubeconfig file,
94
+ run:
26
95
 
27
- $ uffizzi cluster create /path/to/skaffold\.yaml
96
+ $ uffizzi dev start \e
97
+ \-\-kubeconfig="/path/to/alternate/kubeconfig"
28
98
  .fi
29
99
 
@@ -1,22 +1,91 @@
1
- uffizzi-dev-start - start development environment
1
+ uffizzi-dev-start - start a development environment
2
2
  ================================================================
3
3
 
4
4
  ## SYNOPSIS
5
- uffizzi dev start [SKAFFOLD_CONFIG_FILE_PATH]
5
+ uffizzi dev start [CONFIG_FILE] [FLAGS]
6
6
 
7
7
  ## DESCRIPTION
8
- Creates a new cluster and start skaffold. If no SKAFFOLD_CONFIG_FILE_PATH is specified,
9
- the default path will be used.
10
- Default SKAFFOLD_CONFIG_FILE_PATH is 'skaffold.yaml'
8
+ Creates a Uffizzi cluster preconfigured for development
9
+ workflows, including building, pushing, and deploying
10
+ your changes every time project files are saved.
11
+ current-context is updated in kubeconfig file.
12
+
13
+ This command watches for file changes in a given local
14
+ project directory, as specified in your configuration file.
15
+ It then serializes those changes and redeploys them onto
16
+ a Uffizzi cluster.
17
+
18
+ The command looks for a configuration at the specified
19
+ path CONFIG_FILE. Skaffold configurations are currently
20
+ supported. For help creating a skaffold.yaml file, see:
21
+ https://skaffold.dev/docs/init/
22
+
23
+ If a kubeconfig exists
11
24
 
12
25
  For more information on Uffizzi clusters, see:
13
26
  https://docs.uffizzi.com/references/cli/
14
27
 
28
+ ## POSITIONAL ARGUMENTS
29
+ [CONFIG_FILE]
30
+ Path to the development environment configuration file.
31
+ Currently supports skaffold.yaml files.
32
+
33
+ ## FLAGS
34
+ --k8s-version=<api-version>
35
+ Specify which version of the Kubernetes API to use when creating
36
+ the cluster, formatted as [MAJOR].[MINOR]. Defaults to 1.27.
37
+ Minor versions point to the latest release of the corresponding k3s
38
+ minor version. See https://github.com/k3s-io/k3s/releases
39
+
40
+ --default-repo="<container-registry-domain>"
41
+ A public or private repo used to push/pull build
42
+ artifacts. Overrides the global default image registry:
43
+ "registry.uffizzi.com". See `uffizzi connect -h` for
44
+ adding private registry credentials.
45
+
46
+ --quiet, -q
47
+ Run the development process in detached mode (i.e., in
48
+ the background). Without this option, logs are streamed
49
+ to the terminal in the foreground. Run 'uffizzi dev stop`
50
+ to stop the detached process.
51
+
52
+ --help, -h
53
+ Show this message and exit.
54
+
55
+ --kubeconfig="/path/to/your/kubeconfig"
56
+ Path to kubeconfig file. If this option is not specified,
57
+ this command looks for the file at ~/.kube/config.
58
+
15
59
  ## EXAMPLES
16
- To start development environment, run:
60
+ If your configuration file is in the current working
61
+ directory and you want to use an auto-generated name,
62
+ run:
17
63
 
18
64
  $ uffizzi dev start
19
65
 
20
- To start development environment with custom skaffold.yaml file, run:
66
+ To start a dev environment using a skaffold.yaml config
67
+ file in directory '~/foo', run:
68
+
69
+ $ uffizzi dev start ~/foo/skaffold.yaml
70
+
71
+ To start a dev environment in quiet mode,
72
+ run:
73
+
74
+ $ uffizzi dev start --quiet
75
+
76
+ To push your build artifacts to a private Docker Hub repo
77
+ called 'acme/foo', first add your Docker Hub credentials:
78
+
79
+ $ uffizzi connect docker-hub
80
+ (See `uffizzi connect -h` for other registry options)
81
+
82
+ ...then override the default repo:
83
+
84
+ $ uffizzi dev start \
85
+ --default-repo="hub.docker.com/acme/foo"
86
+
87
+ To start a dev environment using an alternate kubeconfig file,
88
+ run:
21
89
 
22
- $ uffizzi cluster create /path/to/skaffold.yaml
90
+ $ uffizzi dev start \
91
+ --kubeconfig="/path/to/alternate/kubeconfig"
@@ -0,0 +1,41 @@
1
+ .\" generated with Ronn-NG/v0.9.1
2
+ .\" http://github.com/apjanke/ronn-ng/tree/0.9.1
3
+ .TH "UFFIZZI\-DEV\-STOP" "" "October 2023" ""
4
+ .SH "NAME"
5
+ \fBuffizzi\-dev\-stop\fR \- stop a development environment
6
+ .SH "SYNOPSIS"
7
+ .nf
8
+ uffizzi dev stop
9
+ .fi
10
+ .SH "DESCRIPTION"
11
+ .nf
12
+ Stops a dev environment and deletes the backing
13
+ Uffizzi cluster resources, including any persistent
14
+ volumes, and the namespace itself\. The Uffizzi
15
+ cluster config is deleted from the kubeconfig file\.
16
+
17
+ This command watches for file changes in a given local
18
+ project directory, as specified in your configuration file\.
19
+ It then serializes those changes and redeploys them onto
20
+ a Uffizzi cluster\.
21
+
22
+ The command looks for a configuration at the specified
23
+ path CONFIG_FILE\. Skaffold configurations are currently
24
+ supported\. For help creating a skaffold\.yaml file, see:
25
+ https://skaffold\.dev/docs/init/
26
+
27
+ For more information on Uffizzi clusters, see:
28
+ https://docs\.uffizzi\.com/references/cli/
29
+ .fi
30
+ .SH "FLAGS"
31
+ .nf
32
+ \-\-help, \-h
33
+ Show this message and exit\.
34
+ .fi
35
+ .SH "EXAMPLES"
36
+ .nf
37
+ To stop a dev environment, run:
38
+
39
+ $ uffizzi dev stop
40
+ .fi
41
+
@@ -0,0 +1,33 @@
1
+ uffizzi-dev-stop - stop a development environment
2
+ ================================================================
3
+
4
+ ## SYNOPSIS
5
+ uffizzi dev stop
6
+
7
+ ## DESCRIPTION
8
+ Stops a dev environment and deletes the backing
9
+ Uffizzi cluster resources, including any persistent
10
+ volumes, and the namespace itself. The Uffizzi
11
+ cluster config is deleted from the kubeconfig file.
12
+
13
+ This command watches for file changes in a given local
14
+ project directory, as specified in your configuration file.
15
+ It then serializes those changes and redeploys them onto
16
+ a Uffizzi cluster.
17
+
18
+ The command looks for a configuration at the specified
19
+ path CONFIG_FILE. Skaffold configurations are currently
20
+ supported. For help creating a skaffold.yaml file, see:
21
+ https://skaffold.dev/docs/init/
22
+
23
+ For more information on Uffizzi clusters, see:
24
+ https://docs.uffizzi.com/references/cli/
25
+
26
+ ## FLAGS
27
+ --help, -h
28
+ Show this message and exit.
29
+
30
+ ## EXAMPLES
31
+ To stop a dev environment, run:
32
+
33
+ $ uffizzi dev stop
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uffizzi-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Thurman
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2023-09-29 00:00:00.000000000 Z
12
+ date: 2023-10-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -448,8 +448,8 @@ files:
448
448
  - lib/uffizzi/response_helper.rb
449
449
  - lib/uffizzi/services/cluster/disconnect_service.rb
450
450
  - lib/uffizzi/services/cluster_service.rb
451
- - lib/uffizzi/services/command_service.rb
452
451
  - lib/uffizzi/services/compose_file_service.rb
452
+ - lib/uffizzi/services/dev_service.rb
453
453
  - lib/uffizzi/services/env_variables_service.rb
454
454
  - lib/uffizzi/services/github_service.rb
455
455
  - lib/uffizzi/services/kubeconfig_service.rb
@@ -521,6 +521,8 @@ files:
521
521
  - man/uffizzi-connect.ronn
522
522
  - man/uffizzi-dev-start
523
523
  - man/uffizzi-dev-start.ronn
524
+ - man/uffizzi-dev-stop
525
+ - man/uffizzi-dev-stop.ronn
524
526
  - man/uffizzi-disconnect
525
527
  - man/uffizzi-disconnect.ronn
526
528
  - man/uffizzi-login
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CommandService
4
- class << self
5
- def project_set?(options)
6
- !options[:project].nil? || (Uffizzi::ConfigFile.exists? && Uffizzi::ConfigFile.option_has_value?(:project))
7
- end
8
- end
9
- end