uffizzi-cli 2.2.1 → 2.3.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.
- checksums.yaml +4 -4
- data/lib/uffizzi/cli/cluster.rb +20 -85
- data/lib/uffizzi/cli/dev/ingress.rb +42 -0
- data/lib/uffizzi/cli/dev.rb +8 -4
- data/lib/uffizzi/clients/api/api_client.rb +7 -0
- data/lib/uffizzi/clients/api/api_routes.rb +6 -0
- data/lib/uffizzi/services/cluster/common_service.rb +25 -0
- data/lib/uffizzi/services/cluster/create_service.rb +29 -0
- data/lib/uffizzi/services/cluster/delete_service.rb +28 -0
- data/lib/uffizzi/services/cluster/list_service.rb +20 -0
- data/lib/uffizzi/services/cluster/update_kubeconfig_service.rb +22 -0
- data/lib/uffizzi/services/dev_service.rb +42 -10
- data/lib/uffizzi/shell.rb +1 -1
- data/lib/uffizzi/version.rb +1 -1
- data/lib/uffizzi.rb +18 -1
- data/man/uffizzi-cluster-create +12 -3
- data/man/uffizzi-dev-ingress +27 -0
- data/man/uffizzi-dev-ingress-open +26 -0
- data/man/uffizzi-dev-ingress-open.ronn +18 -0
- data/man/uffizzi-dev-ingress.ronn +21 -0
- data/man/uffizzi-dev-start +5 -4
- metadata +12 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83386128e61e690def2d6afac8c8d09fe91c7f112b4834a387d74e06f04b43b4
|
4
|
+
data.tar.gz: 5f08710f3bb799a023fd82b8c9b1bf6e97761df925a700b45e1a8c9485e40829
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 596014564e49050fbac5f36d05c47a98caf5e1bcfab48b05e4eb5ae24514c505829015430f1b1dddcf3f74690a275723f4f341c3bdd36b3f4ded718ad3573baf
|
7
|
+
data.tar.gz: a29224185eb40b02af15e7359e3bbfa1be06d4d76d51d3cfbb60add345d0f29f7b978dd22fc1687ca714683719db90c688b06581b815a387fd61dd1b96a78de4
|
data/lib/uffizzi/cli/cluster.rb
CHANGED
@@ -7,6 +7,11 @@ require 'uffizzi/auth_helper'
|
|
7
7
|
require 'uffizzi/helpers/config_helper'
|
8
8
|
require 'uffizzi/services/preview_service'
|
9
9
|
require 'uffizzi/services/cluster_service'
|
10
|
+
require 'uffizzi/services/cluster/common_service'
|
11
|
+
require 'uffizzi/services/cluster/create_service'
|
12
|
+
require 'uffizzi/services/cluster/delete_service'
|
13
|
+
require 'uffizzi/services/cluster/list_service'
|
14
|
+
require 'uffizzi/services/cluster/update_kubeconfig_service'
|
10
15
|
require 'uffizzi/services/kubeconfig_service'
|
11
16
|
require 'uffizzi/services/cluster/disconnect_service'
|
12
17
|
|
@@ -164,31 +169,11 @@ module Uffizzi
|
|
164
169
|
|
165
170
|
return handle_delete_cluster(cluster_name) unless is_delete_kubeconfig
|
166
171
|
|
167
|
-
cluster_data = ClusterService.fetch_cluster_data(cluster_name, **cluster_api_connection_params)
|
168
|
-
kubeconfig = parse_kubeconfig(cluster_data[:kubeconfig])
|
172
|
+
cluster_data = ClusterService.fetch_cluster_data(command_args[:cluster_name], **cluster_api_connection_params)
|
173
|
+
kubeconfig = ClusterCommonService.parse_kubeconfig(cluster_data[:kubeconfig])
|
169
174
|
|
170
175
|
handle_delete_cluster(cluster_name)
|
171
|
-
exclude_kubeconfig(cluster_data[:id], kubeconfig) if kubeconfig.present?
|
172
|
-
end
|
173
|
-
|
174
|
-
def exclude_kubeconfig(cluster_id, kubeconfig)
|
175
|
-
cluster_config = Uffizzi::ConfigHelper.cluster_config_by_id(cluster_id)
|
176
|
-
return if cluster_config.nil?
|
177
|
-
|
178
|
-
kubeconfig_path = cluster_config[:kubeconfig_path]
|
179
|
-
ConfigFile.write_option(:clusters, Uffizzi::ConfigHelper.clusters_config_without(cluster_id))
|
180
|
-
|
181
|
-
KubeconfigService.save_to_filepath(kubeconfig_path, kubeconfig) do |kubeconfig_by_path|
|
182
|
-
if kubeconfig_by_path.nil?
|
183
|
-
msg = "Warning: kubeconfig at path #{kubeconfig_path} does not exist"
|
184
|
-
return Uffizzi.ui.say(msg)
|
185
|
-
end
|
186
|
-
|
187
|
-
new_kubeconfig = KubeconfigService.exclude(kubeconfig_by_path, kubeconfig)
|
188
|
-
first_context = KubeconfigService.get_first_context(new_kubeconfig)
|
189
|
-
new_current_context = first_context.present? ? first_context['name'] : nil
|
190
|
-
KubeconfigService.update_current_context(new_kubeconfig, new_current_context)
|
191
|
-
end
|
176
|
+
ClusterDeleteService.exclude_kubeconfig(cluster_data[:id], kubeconfig) if kubeconfig.present?
|
192
177
|
end
|
193
178
|
|
194
179
|
def handle_delete_cluster(cluster_name)
|
@@ -211,10 +196,10 @@ module Uffizzi
|
|
211
196
|
cluster_data = ClusterService.fetch_cluster_data(cluster_name, **cluster_api_connection_params)
|
212
197
|
|
213
198
|
unless cluster_data[:kubeconfig].present?
|
214
|
-
say_error_update_kubeconfig(cluster_data)
|
199
|
+
ClusterUpdateKubeconfigService.say_error_update_kubeconfig(cluster_data)
|
215
200
|
end
|
216
201
|
|
217
|
-
parsed_kubeconfig = parse_kubeconfig(cluster_data[:kubeconfig])
|
202
|
+
parsed_kubeconfig = ClusterCommonService.parse_kubeconfig(cluster_data[:kubeconfig])
|
218
203
|
|
219
204
|
return Uffizzi.ui.say(parsed_kubeconfig.to_yaml) if options[:print]
|
220
205
|
|
@@ -226,11 +211,11 @@ module Uffizzi
|
|
226
211
|
next new_kubeconfig if kubeconfig_by_path.nil?
|
227
212
|
|
228
213
|
previous_current_context = KubeconfigService.get_current_context(kubeconfig_by_path)
|
229
|
-
save_previous_current_context(kubeconfig_path, previous_current_context)
|
214
|
+
ClusterCommonService.save_previous_current_context(kubeconfig_path, previous_current_context)
|
230
215
|
new_kubeconfig
|
231
216
|
end
|
232
217
|
|
233
|
-
update_clusters_config(cluster_data[:id],
|
218
|
+
ClusterCommonService.update_clusters_config(cluster_data[:id], kubeconfig_path: kubeconfig_path)
|
234
219
|
|
235
220
|
return if options[:quiet]
|
236
221
|
|
@@ -287,10 +272,9 @@ module Uffizzi
|
|
287
272
|
end
|
288
273
|
|
289
274
|
def cluster_creation_params(cluster_name)
|
275
|
+
manifest_content = load_manifest_file(options[:manifest])
|
290
276
|
creation_source = options[:"creation-source"] || ClusterService::MANUAL_CREATION_SOURCE
|
291
|
-
manifest_file_path = options[:manifest]
|
292
277
|
k8s_version = options[:"k8s-version"]
|
293
|
-
manifest_content = load_manifest_file(manifest_file_path)
|
294
278
|
|
295
279
|
{
|
296
280
|
cluster: {
|
@@ -327,7 +311,7 @@ module Uffizzi
|
|
327
311
|
raise Uffizzi::Error.new('The project has no active clusters') if clusters.empty?
|
328
312
|
|
329
313
|
clusters_data = if Uffizzi.ui.output_format.nil?
|
330
|
-
|
314
|
+
ClusterListService.render_plain_clusters(clusters)
|
331
315
|
else
|
332
316
|
clusters.map { |c| c.slice(:name, :project) }
|
333
317
|
end
|
@@ -335,24 +319,11 @@ module Uffizzi
|
|
335
319
|
Uffizzi.ui.say(clusters_data)
|
336
320
|
end
|
337
321
|
|
338
|
-
def render_plain_cluster_list(clusters)
|
339
|
-
clusters.map do |cluster|
|
340
|
-
project_name = cluster.dig(:project, :name)
|
341
|
-
|
342
|
-
if project_name.present?
|
343
|
-
"- Cluster name: #{cluster[:name].strip} Project name: #{project_name.strip}"
|
344
|
-
else
|
345
|
-
"- #{cluster[:name]}"
|
346
|
-
end
|
347
|
-
end.join("\n")
|
348
|
-
end
|
349
|
-
|
350
322
|
def handle_succeed_create_response(cluster_data)
|
351
323
|
kubeconfig_path = options[:kubeconfig] || KubeconfigService.default_path
|
352
324
|
is_update_current_context = options[:'update-current-context']
|
353
|
-
parsed_kubeconfig = parse_kubeconfig(cluster_data[:kubeconfig])
|
354
|
-
rendered_cluster_data =
|
355
|
-
cluster_name = cluster_data[:name]
|
325
|
+
parsed_kubeconfig = ClusterCommonService.parse_kubeconfig(cluster_data[:kubeconfig])
|
326
|
+
rendered_cluster_data = build_render_cluster_data!(cluster_data)
|
356
327
|
|
357
328
|
Uffizzi.ui.enable_stdout
|
358
329
|
Uffizzi.ui.say("Cluster with name: #{rendered_cluster_data[:name]} was created.")
|
@@ -363,42 +334,13 @@ module Uffizzi
|
|
363
334
|
|
364
335
|
Uffizzi.ui.say(rendered_cluster_data) if Uffizzi.ui.output_format
|
365
336
|
|
366
|
-
save_kubeconfig(parsed_kubeconfig, kubeconfig_path)
|
367
|
-
update_clusters_config(cluster_data[:id], name:
|
337
|
+
ClusterCreateService.save_kubeconfig(parsed_kubeconfig, kubeconfig_path, is_update_current_context)
|
338
|
+
ClusterCommonService.update_clusters_config(cluster_data[:id], name: cluster_data[:name], kubeconfig_path: kubeconfig_path)
|
368
339
|
GithubService.write_to_github_env(rendered_cluster_data) if GithubService.github_actions_exists?
|
369
340
|
end
|
370
341
|
|
371
|
-
def
|
372
|
-
|
373
|
-
|
374
|
-
KubeconfigService.save_to_filepath(kubeconfig_path, kubeconfig) do |kubeconfig_by_path|
|
375
|
-
merged_kubeconfig = KubeconfigService.merge(kubeconfig_by_path, kubeconfig)
|
376
|
-
|
377
|
-
if is_update_current_context
|
378
|
-
new_current_context = KubeconfigService.get_current_context(kubeconfig)
|
379
|
-
new_kubeconfig = KubeconfigService.update_current_context(merged_kubeconfig, new_current_context)
|
380
|
-
|
381
|
-
next new_kubeconfig if kubeconfig_by_path.nil?
|
382
|
-
|
383
|
-
previous_current_context = KubeconfigService.get_current_context(kubeconfig_by_path)
|
384
|
-
save_previous_current_context(kubeconfig_path, previous_current_context)
|
385
|
-
new_kubeconfig
|
386
|
-
else
|
387
|
-
merged_kubeconfig
|
388
|
-
end
|
389
|
-
end
|
390
|
-
|
391
|
-
Uffizzi.ui.say("Kubeconfig was updated by the path: #{kubeconfig_path}") if is_update_current_context
|
392
|
-
end
|
393
|
-
|
394
|
-
def update_clusters_config(id, params)
|
395
|
-
clusters_config = Uffizzi::ConfigHelper.update_clusters_config_by_id(id, params)
|
396
|
-
ConfigFile.write_option(:clusters, clusters_config)
|
397
|
-
ConfigFile.write_option(:current_cluster, ConfigHelper.cluster_config_by_id(id))
|
398
|
-
end
|
399
|
-
|
400
|
-
def render_cluster_data(cluster_data)
|
401
|
-
kubeconfig = parse_kubeconfig(cluster_data[:kubeconfig])
|
342
|
+
def build_render_cluster_data!(cluster_data)
|
343
|
+
kubeconfig = ClusterCommonService.parse_kubeconfig(cluster_data[:kubeconfig])
|
402
344
|
raise Uffizzi::Error.new('The kubeconfig data is empty') unless kubeconfig
|
403
345
|
|
404
346
|
new_cluster_data = cluster_data.slice(:name)
|
@@ -413,13 +355,6 @@ module Uffizzi
|
|
413
355
|
Psych.safe_load(Base64.decode64(kubeconfig))
|
414
356
|
end
|
415
357
|
|
416
|
-
def save_previous_current_context(kubeconfig_path, current_context)
|
417
|
-
return if kubeconfig_path.nil? || ConfigHelper.previous_current_context_by_path(kubeconfig_path).present?
|
418
|
-
|
419
|
-
previous_current_contexts = Uffizzi::ConfigHelper.set_previous_current_context_by_path(kubeconfig_path, current_context)
|
420
|
-
ConfigFile.write_option(:previous_current_contexts, previous_current_contexts)
|
421
|
-
end
|
422
|
-
|
423
358
|
def handle_missing_cluster_name_error
|
424
359
|
Uffizzi.ui.say("No kubeconfig found at #{KubeconfigService.default_path}")
|
425
360
|
Uffizzi.ui.say('Please update the current context or provide a cluster name.')
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'uffizzi'
|
4
|
+
require 'uffizzi/auth_helper'
|
5
|
+
require 'uffizzi/response_helper'
|
6
|
+
|
7
|
+
module Uffizzi
|
8
|
+
class Cli::Dev::Ingress < Thor
|
9
|
+
include ApiClient
|
10
|
+
|
11
|
+
desc 'open', 'Open dev environment hosts'
|
12
|
+
def open
|
13
|
+
Uffizzi::AuthHelper.check_login
|
14
|
+
DevService.check_running_process!
|
15
|
+
|
16
|
+
if DevService.startup?
|
17
|
+
Uffizzi.ui.say_error_and_exit('Dev environment not started yet')
|
18
|
+
end
|
19
|
+
|
20
|
+
dev_environment = DevService.dev_environment
|
21
|
+
cluster_name = dev_environment[:cluster_name]
|
22
|
+
params = { cluster_name: cluster_name }
|
23
|
+
response = get_cluster_ingresses(server, project_slug, params)
|
24
|
+
|
25
|
+
return ResponseHelper.handle_failed_response(response) unless ResponseHelper.ok?(response)
|
26
|
+
|
27
|
+
ingress_hosts = response.dig(:body, :ingresses)
|
28
|
+
urls = ingress_hosts.map { |host| "https://#{host}" }
|
29
|
+
urls.each { |url| Uffizzi.launchy.open(url) { Uffizzi.ui.say(url) } }
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def server
|
35
|
+
@server ||= ConfigFile.read_option(:server)
|
36
|
+
end
|
37
|
+
|
38
|
+
def project_slug
|
39
|
+
@project_slug ||= ConfigFile.read_option(:project)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/uffizzi/cli/dev.rb
CHANGED
@@ -9,6 +9,10 @@ module Uffizzi
|
|
9
9
|
class Cli::Dev < Thor
|
10
10
|
include ApiClient
|
11
11
|
|
12
|
+
desc 'ingress', 'Show the compose dev environment ingress info'
|
13
|
+
require_relative 'dev/ingress'
|
14
|
+
subcommand 'ingress', Uffizzi::Cli::Dev::Ingress
|
15
|
+
|
12
16
|
desc 'start [CONFIG]', 'Start dev environment'
|
13
17
|
method_option :quiet, type: :boolean, aliases: :q
|
14
18
|
method_option :'default-repo', type: :string
|
@@ -222,8 +226,8 @@ module Uffizzi
|
|
222
226
|
def launch_demonise_skaffold(config_path)
|
223
227
|
Uffizzi.process.daemon(true)
|
224
228
|
|
225
|
-
at_exit do
|
226
|
-
DevService.
|
229
|
+
Uffizzi.at_exit do
|
230
|
+
DevService.stop_process
|
227
231
|
end
|
228
232
|
|
229
233
|
DevService.save_pid
|
@@ -235,8 +239,8 @@ module Uffizzi
|
|
235
239
|
end
|
236
240
|
|
237
241
|
def launch_basic_skaffold(config_path)
|
238
|
-
at_exit do
|
239
|
-
DevService.
|
242
|
+
Uffizzi.at_exit do
|
243
|
+
DevService.stop_process
|
240
244
|
end
|
241
245
|
|
242
246
|
DevService.save_pid
|
@@ -293,6 +293,13 @@ module ApiClient
|
|
293
293
|
build_response(response)
|
294
294
|
end
|
295
295
|
|
296
|
+
def get_cluster_ingresses(server, project_slug, params)
|
297
|
+
uri = project_cluster_ingresses_uri(server, project_slug, cluster_name: params[:cluster_name], oidc_token: params[:oidc_token])
|
298
|
+
response = http_client.make_get_request(uri)
|
299
|
+
|
300
|
+
build_response(response)
|
301
|
+
end
|
302
|
+
|
296
303
|
def get_access_token(server, code)
|
297
304
|
uri = access_token_url(server, code)
|
298
305
|
response = http_client.make_get_request(uri)
|
@@ -104,6 +104,12 @@ module ApiRoutes
|
|
104
104
|
"#{server}/api/cli/v1/projects/#{project_slug}/clusters?token=#{oidc_token}"
|
105
105
|
end
|
106
106
|
|
107
|
+
def project_cluster_ingresses_uri(server, project_slug, cluster_name:, oidc_token:)
|
108
|
+
url = "#{server}/api/cli/v1/projects/#{project_slug}/clusters/#{cluster_name}/ingresses"
|
109
|
+
|
110
|
+
oidc_token.nil? ? url : url + "?token=#{oidc_token}"
|
111
|
+
end
|
112
|
+
|
107
113
|
def cluster_uri(server, project_slug, cluster_name:, oidc_token:)
|
108
114
|
return "#{server}/api/cli/v1/projects/#{project_slug}/clusters/#{cluster_name}" if oidc_token.nil?
|
109
115
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'uffizzi/helpers/config_helper'
|
4
|
+
|
5
|
+
class ClusterCommonService
|
6
|
+
class << self
|
7
|
+
def save_previous_current_context(kubeconfig_path, current_context)
|
8
|
+
return if kubeconfig_path.nil? || Uffizzi::ConfigHelper.previous_current_context_by_path(kubeconfig_path).present?
|
9
|
+
|
10
|
+
previous_current_contexts = Uffizzi::ConfigHelper.set_previous_current_context_by_path(kubeconfig_path, current_context)
|
11
|
+
Uffizzi::ConfigFile.write_option(:previous_current_contexts, previous_current_contexts)
|
12
|
+
end
|
13
|
+
|
14
|
+
def update_clusters_config(id, params)
|
15
|
+
clusters_config = Uffizzi::ConfigHelper.update_clusters_config_by_id(id, params)
|
16
|
+
Uffizzi::ConfigFile.write_option(:clusters, clusters_config)
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse_kubeconfig(kubeconfig)
|
20
|
+
return if kubeconfig.nil?
|
21
|
+
|
22
|
+
Psych.safe_load(Base64.decode64(kubeconfig))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'uffizzi/helpers/config_helper'
|
4
|
+
require 'uffizzi/services/cluster/common_service'
|
5
|
+
require 'uffizzi/services/kubeconfig_service'
|
6
|
+
|
7
|
+
class ClusterCreateService
|
8
|
+
class << self
|
9
|
+
def save_kubeconfig(kubeconfig, kubeconfig_path, is_update_current_context)
|
10
|
+
kubeconfig_path = kubeconfig_path.nil? ? KubeconfigService.default_path : kubeconfig_path
|
11
|
+
KubeconfigService.save_to_filepath(kubeconfig_path, kubeconfig) do |kubeconfig_by_path|
|
12
|
+
merged_kubeconfig = KubeconfigService.merge(kubeconfig_by_path, kubeconfig)
|
13
|
+
|
14
|
+
if is_update_current_context
|
15
|
+
new_current_context = KubeconfigService.get_current_context(kubeconfig)
|
16
|
+
new_kubeconfig = KubeconfigService.update_current_context(merged_kubeconfig, new_current_context)
|
17
|
+
|
18
|
+
next new_kubeconfig if kubeconfig_by_path.nil?
|
19
|
+
|
20
|
+
previous_current_context = KubeconfigService.get_current_context(kubeconfig_by_path)
|
21
|
+
ClusterCommonService.save_previous_current_context(kubeconfig_path, previous_current_context)
|
22
|
+
new_kubeconfig
|
23
|
+
else
|
24
|
+
merged_kubeconfig
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'uffizzi/helpers/config_helper'
|
4
|
+
require 'uffizzi/services/kubeconfig_service'
|
5
|
+
|
6
|
+
class ClusterDeleteService
|
7
|
+
class << self
|
8
|
+
def exclude_kubeconfig(cluster_id, kubeconfig)
|
9
|
+
cluster_config = Uffizzi::ConfigHelper.cluster_config_by_id(cluster_id)
|
10
|
+
return if cluster_config.nil?
|
11
|
+
|
12
|
+
kubeconfig_path = cluster_config[:kubeconfig_path]
|
13
|
+
Uffizzi::ConfigFile.write_option(:clusters, Uffizzi::ConfigHelper.clusters_config_without(cluster_id))
|
14
|
+
|
15
|
+
KubeconfigService.save_to_filepath(kubeconfig_path, kubeconfig) do |kubeconfig_by_path|
|
16
|
+
if kubeconfig_by_path.nil?
|
17
|
+
msg = "Warning: kubeconfig at path #{kubeconfig_path} does not exist"
|
18
|
+
return Uffizzi.ui.say(msg)
|
19
|
+
end
|
20
|
+
|
21
|
+
new_kubeconfig = KubeconfigService.exclude(kubeconfig_by_path, kubeconfig)
|
22
|
+
first_context = KubeconfigService.get_first_context(new_kubeconfig)
|
23
|
+
new_current_context = first_context.present? ? first_context['name'] : nil
|
24
|
+
KubeconfigService.update_current_context(new_kubeconfig, new_current_context)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class ClusterListService
|
4
|
+
class << self
|
5
|
+
# REFACTOR_ME:
|
6
|
+
# Uffizzi.ui.output_format = Uffizzi::UI::Shell::PRETTY_LIST
|
7
|
+
# Uffizzi.ui.say(data)
|
8
|
+
def render_plain_clusters(clusters)
|
9
|
+
clusters.map do |cluster|
|
10
|
+
project_name = cluster.dig(:project, :name)
|
11
|
+
|
12
|
+
if project_name.present?
|
13
|
+
"- Cluster name: #{cluster[:name].strip} Project name: #{project_name.strip}"
|
14
|
+
else
|
15
|
+
"- #{cluster[:name]}"
|
16
|
+
end
|
17
|
+
end.join("\n")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'uffizzi/helpers/config_helper'
|
4
|
+
require 'uffizzi/services/kubeconfig_service'
|
5
|
+
|
6
|
+
class ClusterUpdateKubeconfigService
|
7
|
+
class << self
|
8
|
+
def say_error_update_kubeconfig(cluster_data)
|
9
|
+
if ClusterService.failed?(cluster_data[:state])
|
10
|
+
Uffizzi.ui.say_error_and_exit('Kubeconfig is empty because cluster failed to be created.')
|
11
|
+
end
|
12
|
+
|
13
|
+
if ClusterService.deploying?(cluster_data[:state])
|
14
|
+
Uffizzi.ui.say_error_and_exit('Kubeconfig is empty because cluster is deploying.')
|
15
|
+
end
|
16
|
+
|
17
|
+
if ClusterService.deployed?(cluster_data[:state])
|
18
|
+
raise Error.new("Cluster with data: #{cluster_data.to_json} is deployed but kubeconfig does not exist.")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -32,13 +32,27 @@ class DevService
|
|
32
32
|
dev_pid = running_pid
|
33
33
|
skaffold_pid = running_skaffold_pid
|
34
34
|
|
35
|
-
|
36
|
-
|
35
|
+
begin
|
36
|
+
Uffizzi.process.kill('INT', skaffold_pid)
|
37
|
+
rescue Errno::ESRCH
|
38
|
+
end
|
39
|
+
|
40
|
+
wait_process_stop(skaffold_pid)
|
37
41
|
delete_pid
|
42
|
+
|
43
|
+
Uffizzi.process.kill('INT', dev_pid)
|
38
44
|
rescue Errno::ESRCH
|
39
45
|
delete_pid
|
40
46
|
end
|
41
47
|
|
48
|
+
def wait_process_stop(pid)
|
49
|
+
loop do
|
50
|
+
Uffizzi.process.kill(0, pid)
|
51
|
+
sleep(1)
|
52
|
+
end
|
53
|
+
rescue Errno::ESRCH
|
54
|
+
end
|
55
|
+
|
42
56
|
def process_running?
|
43
57
|
pid = running_pid
|
44
58
|
return false unless pid.positive?
|
@@ -50,9 +64,9 @@ class DevService
|
|
50
64
|
end
|
51
65
|
|
52
66
|
def start_check_pid_file_existence
|
53
|
-
|
67
|
+
Uffizzi.thread.new do
|
54
68
|
loop do
|
55
|
-
|
69
|
+
stop_process unless File.exist?(pid_path)
|
56
70
|
sleep(1)
|
57
71
|
end
|
58
72
|
end
|
@@ -62,6 +76,8 @@ class DevService
|
|
62
76
|
Uffizzi.ui.say('Start skaffold')
|
63
77
|
cmd = build_skaffold_dev_command(config_path, options)
|
64
78
|
|
79
|
+
Uffizzi.signal.trap('INT') {}
|
80
|
+
|
65
81
|
Uffizzi.ui.popen2e(cmd) do |_stdin, stdout_and_stderr, wait_thr|
|
66
82
|
pid = wait_thr.pid
|
67
83
|
skaffold_pid = find_skaffold_pid(pid)
|
@@ -198,13 +214,29 @@ class DevService
|
|
198
214
|
Uffizzi::ConfigHelper.dev_environment
|
199
215
|
end
|
200
216
|
|
201
|
-
def find_skaffold_pid(
|
202
|
-
|
203
|
-
pid_regex = /\w*\s+(\d+)\s+#{ppid}.*\sskaffold dev/
|
204
|
-
|
217
|
+
def find_skaffold_pid(pid)
|
218
|
+
pid_regex = /\w*#{pid}.*skaffold dev/
|
205
219
|
io = Uffizzi.ui.popen('ps -ef')
|
206
|
-
|
207
|
-
|
220
|
+
processes = io.readlines.select { |l| l.match?(pid_regex) }
|
221
|
+
|
222
|
+
if processes.count.zero?
|
223
|
+
raise StandardError.new('Can\'t find skaffold process pid')
|
224
|
+
end
|
225
|
+
|
226
|
+
# HACK: For MacOS
|
227
|
+
if processes.count == 1
|
228
|
+
current_pid = processes[0].gsub(/\s+/, ' ').lstrip.split[1]
|
229
|
+
return pid if current_pid.to_s == pid.to_s
|
230
|
+
|
231
|
+
raise StandardError.new('Can\'t find skaffold process pid')
|
232
|
+
end
|
233
|
+
|
234
|
+
# HACK: For Linux
|
235
|
+
parent_process = processes
|
236
|
+
.map { |ps| ps.gsub(/\s+/, ' ').lstrip.split }
|
237
|
+
.detect { |ps| ps[2].to_s == pid.to_s }
|
238
|
+
|
239
|
+
parent_process[1]
|
208
240
|
end
|
209
241
|
end
|
210
242
|
end
|
data/lib/uffizzi/shell.rb
CHANGED
@@ -83,7 +83,7 @@ module Uffizzi
|
|
83
83
|
when Array
|
84
84
|
data.map { |v| format_to_pretty_list(v) }.join("\n\n")
|
85
85
|
when Hash
|
86
|
-
data.map { |k, v| "- #{k.to_s.
|
86
|
+
data.map { |k, v| "- #{k.to_s.capitalize.gsub('_', ' ')}: #{v}" }.join("\n").strip
|
87
87
|
else
|
88
88
|
data
|
89
89
|
end
|
data/lib/uffizzi/version.rb
CHANGED
data/lib/uffizzi.rb
CHANGED
@@ -6,6 +6,7 @@ require 'sentry-ruby'
|
|
6
6
|
require 'active_support'
|
7
7
|
require 'active_support/core_ext/hash/indifferent_access'
|
8
8
|
require 'active_support/core_ext/object/blank'
|
9
|
+
require 'launchy'
|
9
10
|
|
10
11
|
require 'thor'
|
11
12
|
require 'uffizzi/error'
|
@@ -38,7 +39,23 @@ module Uffizzi
|
|
38
39
|
end
|
39
40
|
|
40
41
|
def process
|
41
|
-
|
42
|
+
Process
|
43
|
+
end
|
44
|
+
|
45
|
+
def signal
|
46
|
+
Signal
|
47
|
+
end
|
48
|
+
|
49
|
+
def thread
|
50
|
+
Thread
|
51
|
+
end
|
52
|
+
|
53
|
+
def at_exit(&block)
|
54
|
+
Kernel.at_exit(&block)
|
55
|
+
end
|
56
|
+
|
57
|
+
def launchy
|
58
|
+
Launchy
|
42
59
|
end
|
43
60
|
end
|
44
61
|
end
|
data/man/uffizzi-cluster-create
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
.\" generated with Ronn-NG/v0.9.1
|
2
2
|
.\" http://github.com/apjanke/ronn-ng/tree/0.9.1
|
3
|
-
.TH "UFFIZZI\-CLUSTER\-CREATE" "" "
|
3
|
+
.TH "UFFIZZI\-CLUSTER\-CREATE" "" "October 2023" ""
|
4
4
|
.SH "NAME"
|
5
|
-
\fBuffizzi\-cluster\-create\fR
|
5
|
+
\fBuffizzi\-cluster\-create\fR
|
6
|
+
.P
|
7
|
+
uffizzi cluster create \-h uffizzi\-cluster\-create \- create a cluster ================================================================
|
6
8
|
.SH "SYNOPSIS"
|
7
9
|
.nf
|
8
10
|
uffizzi cluster create [CLUSTER_NAME]
|
@@ -19,7 +21,14 @@ https://docs\.uffizzi\.com/references/cli/
|
|
19
21
|
.nf
|
20
22
|
\-\-name
|
21
23
|
Option is deprecated and will be removed in the newer versions\.
|
22
|
-
Please use a positional argument instead: uffizzi cluster create
|
24
|
+
Please use a positional argument instead: uffizzi cluster create
|
25
|
+
my\-awesome\-name\.
|
26
|
+
|
27
|
+
\-\-k8s\-version=<api\-version>
|
28
|
+
Specify which version of the Kubernetes API to use when creating
|
29
|
+
the cluster, formatted as [MAJOR]\.[MINOR]\. Defaults to 1\.27\.
|
30
|
+
Minor versions point to the latest release of the corresponding k3s
|
31
|
+
minor version\. See https://github\.com/k3s\-io/k3s/releases
|
23
32
|
|
24
33
|
\-\-kubeconfig="/path/to/your/kubeconfig"
|
25
34
|
Path to kubeconfig file
|
@@ -0,0 +1,27 @@
|
|
1
|
+
.\" generated with Ronn-NG/v0.9.1
|
2
|
+
.\" http://github.com/apjanke/ronn-ng/tree/0.9.1
|
3
|
+
.TH "UFFIZZI\-DEV\-INGRESS" "" "October 2023" ""
|
4
|
+
.SH "NAME"
|
5
|
+
\fBuffizzi\-dev\-ingress\fR
|
6
|
+
.P
|
7
|
+
$ uffizzi dev ingress \-h uffizzi\-dev\-ingress \- show the dev environment ingress ================================================================
|
8
|
+
.SH "SYNOPSIS"
|
9
|
+
.nf
|
10
|
+
uffizzi dev ingress COMMAND
|
11
|
+
.fi
|
12
|
+
.SH "DESCRIPTION"
|
13
|
+
.nf
|
14
|
+
Show the dev environment ingress
|
15
|
+
|
16
|
+
For more information on Uffizzi clusters, see:
|
17
|
+
https://docs\.uffizzi\.com/references/cli/
|
18
|
+
.fi
|
19
|
+
.SH "COMMANDS"
|
20
|
+
.nf
|
21
|
+
COMMAND is one of the following:
|
22
|
+
|
23
|
+
open
|
24
|
+
Open the dev environment ingress hosts in browser
|
25
|
+
.fi
|
26
|
+
.SH "Run \'uffizzi dev ingress COMMAND \-\-help\' for more information on a command\."
|
27
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
.\" generated with Ronn-NG/v0.9.1
|
2
|
+
.\" http://github.com/apjanke/ronn-ng/tree/0.9.1
|
3
|
+
.TH "UFFIZZI\-DEV\-INGRESS\-OPEN" "" "October 2023" ""
|
4
|
+
.SH "NAME"
|
5
|
+
\fBuffizzi\-dev\-ingress\-open\fR
|
6
|
+
.P
|
7
|
+
$ uffizzi dev ingress \-h uffizzi\-dev\-ingress\-open \- open the dev environment ingress hosts in browser ================================================================
|
8
|
+
.SH "SYNOPSIS"
|
9
|
+
.nf
|
10
|
+
uffizzi dev ingress open
|
11
|
+
.fi
|
12
|
+
.SH "DESCRIPTION"
|
13
|
+
.nf
|
14
|
+
Open the dev environment ingress hosts in browser
|
15
|
+
|
16
|
+
For more information on Uffizzi clusters, see:
|
17
|
+
https://docs\.uffizzi\.com/references/cli/
|
18
|
+
.fi
|
19
|
+
.SH "EXAMPLES"
|
20
|
+
.nf
|
21
|
+
The following command open the dev environment
|
22
|
+
ingress hosts in browser:
|
23
|
+
|
24
|
+
$ uffizzi dev ingress open
|
25
|
+
.fi
|
26
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$ uffizzi dev ingress -h
|
2
|
+
uffizzi-dev-ingress-open - open the dev environment ingress hosts in browser
|
3
|
+
================================================================
|
4
|
+
|
5
|
+
## SYNOPSIS
|
6
|
+
uffizzi dev ingress open
|
7
|
+
|
8
|
+
## DESCRIPTION
|
9
|
+
Open the dev environment ingress hosts in browser
|
10
|
+
|
11
|
+
For more information on Uffizzi clusters, see:
|
12
|
+
https://docs.uffizzi.com/references/cli/
|
13
|
+
|
14
|
+
## EXAMPLES
|
15
|
+
The following command open the dev environment
|
16
|
+
ingress hosts in browser:
|
17
|
+
|
18
|
+
$ uffizzi dev ingress open
|
@@ -0,0 +1,21 @@
|
|
1
|
+
$ uffizzi dev ingress -h
|
2
|
+
uffizzi-dev-ingress - show the dev environment ingress
|
3
|
+
================================================================
|
4
|
+
|
5
|
+
## SYNOPSIS
|
6
|
+
uffizzi dev ingress COMMAND
|
7
|
+
|
8
|
+
## DESCRIPTION
|
9
|
+
Show the dev environment ingress
|
10
|
+
|
11
|
+
For more information on Uffizzi clusters, see:
|
12
|
+
https://docs.uffizzi.com/references/cli/
|
13
|
+
|
14
|
+
## COMMANDS
|
15
|
+
COMMAND is one of the following:
|
16
|
+
|
17
|
+
open
|
18
|
+
Open the dev environment ingress hosts in browser
|
19
|
+
|
20
|
+
##
|
21
|
+
Run 'uffizzi dev ingress COMMAND --help' for more information on a command.
|
data/man/uffizzi-dev-start
CHANGED
@@ -37,10 +37,11 @@ https://docs\.uffizzi\.com/references/cli/
|
|
37
37
|
.fi
|
38
38
|
.SH "FLAGS"
|
39
39
|
.nf
|
40
|
-
\-\-
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
\-\-k8s\-version=<api\-version>
|
41
|
+
Specify which version of the Kubernetes API to use when creating
|
42
|
+
the cluster, formatted as [MAJOR]\.[MINOR]\. Defaults to 1\.27\.
|
43
|
+
Minor versions point to the latest release of the corresponding k3s
|
44
|
+
minor version\. See https://github\.com/k3s\-io/k3s/releases
|
44
45
|
|
45
46
|
\-\-default\-repo="<container\-registry\-domain>"
|
46
47
|
A public or private repo used to push/pull build
|
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.
|
4
|
+
version: 2.3.0
|
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-10-
|
12
|
+
date: 2023-10-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -424,6 +424,7 @@ files:
|
|
424
424
|
- lib/uffizzi/cli/config.rb
|
425
425
|
- lib/uffizzi/cli/connect.rb
|
426
426
|
- lib/uffizzi/cli/dev.rb
|
427
|
+
- lib/uffizzi/cli/dev/ingress.rb
|
427
428
|
- lib/uffizzi/cli/disconnect.rb
|
428
429
|
- lib/uffizzi/cli/login.rb
|
429
430
|
- lib/uffizzi/cli/login_by_identity_token.rb
|
@@ -446,7 +447,12 @@ files:
|
|
446
447
|
- lib/uffizzi/helpers/project_helper.rb
|
447
448
|
- lib/uffizzi/promt.rb
|
448
449
|
- lib/uffizzi/response_helper.rb
|
450
|
+
- lib/uffizzi/services/cluster/common_service.rb
|
451
|
+
- lib/uffizzi/services/cluster/create_service.rb
|
452
|
+
- lib/uffizzi/services/cluster/delete_service.rb
|
449
453
|
- lib/uffizzi/services/cluster/disconnect_service.rb
|
454
|
+
- lib/uffizzi/services/cluster/list_service.rb
|
455
|
+
- lib/uffizzi/services/cluster/update_kubeconfig_service.rb
|
450
456
|
- lib/uffizzi/services/cluster_service.rb
|
451
457
|
- lib/uffizzi/services/compose_file_service.rb
|
452
458
|
- lib/uffizzi/services/dev_service.rb
|
@@ -524,6 +530,10 @@ files:
|
|
524
530
|
- man/uffizzi-dev
|
525
531
|
- man/uffizzi-dev-describe
|
526
532
|
- man/uffizzi-dev-describe.ronn
|
533
|
+
- man/uffizzi-dev-ingress
|
534
|
+
- man/uffizzi-dev-ingress-open
|
535
|
+
- man/uffizzi-dev-ingress-open.ronn
|
536
|
+
- man/uffizzi-dev-ingress.ronn
|
527
537
|
- man/uffizzi-dev-start
|
528
538
|
- man/uffizzi-dev-start.ronn
|
529
539
|
- man/uffizzi-dev-stop
|