uffizzi-cli 2.0.34 → 2.0.36
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 +34 -5
- data/lib/uffizzi/cli/common.rb +1 -1
- data/lib/uffizzi/cli/project/compose.rb +2 -0
- data/lib/uffizzi/helpers/config_helper.rb +17 -0
- data/lib/uffizzi/services/cluster/disconnect_service.rb +71 -0
- data/lib/uffizzi/services/kubeconfig_service.rb +33 -8
- data/lib/uffizzi/version.rb +1 -1
- data/man/uffizzi +53 -0
- data/man/uffizzi-account +29 -0
- data/man/uffizzi-account-list +26 -0
- data/man/uffizzi-account-list.html +103 -0
- data/man/uffizzi-account-list.ronn +19 -0
- data/man/uffizzi-account-set-default +29 -0
- data/man/uffizzi-account-set-default.html +105 -0
- data/man/uffizzi-account-set-default.ronn +22 -0
- data/man/uffizzi-account.html +106 -0
- data/man/uffizzi-account.ronn +23 -0
- data/man/uffizzi-cluster +37 -0
- data/man/uffizzi-cluster-create +49 -0
- data/man/uffizzi-cluster-create.ronn +41 -0
- data/man/uffizzi-cluster-delete +32 -0
- data/man/uffizzi-cluster-delete.ronn +24 -0
- data/man/uffizzi-cluster-describe +39 -0
- data/man/uffizzi-cluster-describe.ronn +30 -0
- data/man/uffizzi-cluster-disconnect +40 -0
- data/man/uffizzi-cluster-disconnect.ronn +32 -0
- data/man/uffizzi-cluster-list +34 -0
- data/man/uffizzi-cluster-list.ronn +26 -0
- data/man/uffizzi-cluster-update-kubeconfig +37 -0
- data/man/uffizzi-cluster-update-kubeconfig.ronn +29 -0
- data/man/uffizzi-cluster.ronn +32 -0
- data/man/uffizzi-compose +39 -0
- data/man/uffizzi-compose-create +67 -0
- data/man/uffizzi-compose-create.ronn +57 -0
- data/man/uffizzi-compose-delete +38 -0
- data/man/uffizzi-compose-delete.ronn +29 -0
- data/man/uffizzi-compose-describe +38 -0
- data/man/uffizzi-compose-describe.ronn +29 -0
- data/man/uffizzi-compose-events +38 -0
- data/man/uffizzi-compose-events.ronn +29 -0
- data/man/uffizzi-compose-list +58 -0
- data/man/uffizzi-compose-list.ronn +49 -0
- data/man/uffizzi-compose-service-list +42 -0
- data/man/uffizzi-compose-service-list.ronn +32 -0
- data/man/uffizzi-compose-service-logs +59 -0
- data/man/uffizzi-compose-service-logs.ronn +48 -0
- data/man/uffizzi-compose-update +61 -0
- data/man/uffizzi-compose-update.ronn +51 -0
- data/man/uffizzi-compose.ronn +33 -0
- data/man/uffizzi-compose_service_logs +59 -0
- data/man/uffizzi-compose_service_logs.ronn +50 -0
- data/man/uffizzi-config +65 -0
- data/man/uffizzi-config.ronn +55 -0
- data/man/uffizzi-connect +40 -0
- data/man/uffizzi-connect-acr +37 -0
- data/man/uffizzi-connect-acr.ronn +42 -0
- data/man/uffizzi-connect-docker-hub +34 -0
- data/man/uffizzi-connect-docker-hub.ronn +39 -0
- data/man/uffizzi-connect-docker-registry +37 -0
- data/man/uffizzi-connect-docker-registry.ronn +41 -0
- data/man/uffizzi-connect-ecr +37 -0
- data/man/uffizzi-connect-ecr.ronn +42 -0
- data/man/uffizzi-connect-gcr +31 -0
- data/man/uffizzi-connect-gcr.ronn +36 -0
- data/man/uffizzi-connect-ghcr +34 -0
- data/man/uffizzi-connect-ghcr.ronn +40 -0
- data/man/uffizzi-connect.ronn +45 -0
- data/man/uffizzi-disconnect +37 -0
- data/man/uffizzi-disconnect.ronn +31 -0
- data/man/uffizzi-login +51 -0
- data/man/uffizzi-login-by-identity-token +29 -0
- data/man/uffizzi-login-by-identity-token.html +106 -0
- data/man/uffizzi-login-by-identity-token.ronn +21 -0
- data/man/uffizzi-login.html +113 -0
- data/man/uffizzi-login.ronn +41 -0
- data/man/uffizzi-logout +21 -0
- data/man/uffizzi-logout.ronn +19 -0
- data/man/uffizzi-preview +39 -0
- data/man/uffizzi-preview-create +67 -0
- data/man/uffizzi-preview-create.ronn +57 -0
- data/man/uffizzi-preview-delete +38 -0
- data/man/uffizzi-preview-delete.ronn +29 -0
- data/man/uffizzi-preview-describe +38 -0
- data/man/uffizzi-preview-describe.ronn +29 -0
- data/man/uffizzi-preview-events +38 -0
- data/man/uffizzi-preview-events.ronn +29 -0
- data/man/uffizzi-preview-list +58 -0
- data/man/uffizzi-preview-list.ronn +49 -0
- data/man/uffizzi-preview-service-list +42 -0
- data/man/uffizzi-preview-service-list.ronn +32 -0
- data/man/uffizzi-preview-service-logs +59 -0
- data/man/uffizzi-preview-service-logs.ronn +48 -0
- data/man/uffizzi-preview-update +61 -0
- data/man/uffizzi-preview-update.ronn +51 -0
- data/man/uffizzi-preview.ronn +33 -0
- data/man/uffizzi-preview_service_logs +59 -0
- data/man/uffizzi-preview_service_logs.ronn +50 -0
- data/man/uffizzi-project +47 -0
- data/man/uffizzi-project-compose +40 -0
- data/man/uffizzi-project-compose-describe +37 -0
- data/man/uffizzi-project-compose-describe.ronn +29 -0
- data/man/uffizzi-project-compose-set +66 -0
- data/man/uffizzi-project-compose-set.ronn +57 -0
- data/man/uffizzi-project-compose-unset +35 -0
- data/man/uffizzi-project-compose-unset.ronn +27 -0
- data/man/uffizzi-project-compose.ronn +34 -0
- data/man/uffizzi-project-create +50 -0
- data/man/uffizzi-project-create.ronn +41 -0
- data/man/uffizzi-project-delete +32 -0
- data/man/uffizzi-project-delete.ronn +24 -0
- data/man/uffizzi-project-describe +43 -0
- data/man/uffizzi-project-describe.ronn +34 -0
- data/man/uffizzi-project-preview-describe +37 -0
- data/man/uffizzi-project-preview-describe.ronn +29 -0
- data/man/uffizzi-project-preview-set +66 -0
- data/man/uffizzi-project-preview-set.ronn +57 -0
- data/man/uffizzi-project-secret +37 -0
- data/man/uffizzi-project-secret-create +29 -0
- data/man/uffizzi-project-secret-create.ronn +21 -0
- data/man/uffizzi-project-secret-delete +29 -0
- data/man/uffizzi-project-secret-delete.ronn +21 -0
- data/man/uffizzi-project-secret-list +28 -0
- data/man/uffizzi-project-secret-list.ronn +20 -0
- data/man/uffizzi-project-secret.ronn +30 -0
- data/man/uffizzi-project-set-default +34 -0
- data/man/uffizzi-project-set-default.ronn +26 -0
- data/man/uffizzi-project.html +124 -0
- data/man/uffizzi-project.ronn +41 -0
- data/man/uffizzi.html +132 -0
- data/man/uffizzi.ronn +45 -0
- metadata +126 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 72e1e0754278f9e3fc7069a15d1f7963c9aa578a67fdb7495d52f9d633bf1f71
|
|
4
|
+
data.tar.gz: a1cd9e4a84cba3b3827dfe0bb547ed4f3e734dc8cb9640603f5818937d0abee3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f2c0a8c7a2c62cb5ae478f2a18c29a90ee4bdcc2c74b6177930510fc40f1032b2bb8d0e7f8e4947ee30760cc963776d32ac6dbb3e18710a784d2d3cbb4dff862
|
|
7
|
+
data.tar.gz: cbd873c5ef8ab6c8868ee518f34acbada4303f44ef0f30770c1d405ef13b443a9d5431f7593dee81522a6a9b2e1bc1722774f1cce6f20cd16797165391bb9534
|
data/lib/uffizzi/cli/cluster.rb
CHANGED
|
@@ -9,6 +9,7 @@ require 'uffizzi/services/preview_service'
|
|
|
9
9
|
require 'uffizzi/services/command_service'
|
|
10
10
|
require 'uffizzi/services/cluster_service'
|
|
11
11
|
require 'uffizzi/services/kubeconfig_service'
|
|
12
|
+
require 'uffizzi/services/cluster/disconnect_service'
|
|
12
13
|
|
|
13
14
|
MANUAL = 'manual'
|
|
14
15
|
|
|
@@ -42,7 +43,7 @@ module Uffizzi
|
|
|
42
43
|
end
|
|
43
44
|
|
|
44
45
|
desc 'delete [NAME]', 'Delete a cluster'
|
|
45
|
-
method_option :'delete-config', required: false, type: :boolean, aliases: '-
|
|
46
|
+
method_option :'delete-config', required: false, type: :boolean, aliases: '-c'
|
|
46
47
|
def delete(name)
|
|
47
48
|
run('delete', cluster_name: name)
|
|
48
49
|
end
|
|
@@ -55,6 +56,13 @@ module Uffizzi
|
|
|
55
56
|
run('update-kubeconfig', cluster_name: name)
|
|
56
57
|
end
|
|
57
58
|
|
|
59
|
+
method_option :kubeconfig, type: :string, aliases: '-k'
|
|
60
|
+
method_option :ask, type: :boolean
|
|
61
|
+
desc 'disconnect', 'Switch back to original kubeconfig current context'
|
|
62
|
+
def disconnect
|
|
63
|
+
run('disconnect')
|
|
64
|
+
end
|
|
65
|
+
|
|
58
66
|
private
|
|
59
67
|
|
|
60
68
|
def run(command, command_args = {})
|
|
@@ -75,6 +83,8 @@ module Uffizzi
|
|
|
75
83
|
handle_delete_command(project_slug, command_args)
|
|
76
84
|
when 'update-kubeconfig'
|
|
77
85
|
handle_update_kubeconfig_command(project_slug, command_args)
|
|
86
|
+
when 'disconnect'
|
|
87
|
+
ClusterDisconnectService.handle(options)
|
|
78
88
|
end
|
|
79
89
|
end
|
|
80
90
|
|
|
@@ -191,8 +201,14 @@ module Uffizzi
|
|
|
191
201
|
|
|
192
202
|
KubeconfigService.save_to_filepath(kubeconfig_path, parsed_kubeconfig) do |kubeconfig_by_path|
|
|
193
203
|
merged_kubeconfig = KubeconfigService.merge(kubeconfig_by_path, parsed_kubeconfig)
|
|
194
|
-
|
|
195
|
-
KubeconfigService.update_current_context(merged_kubeconfig,
|
|
204
|
+
new_current_context = KubeconfigService.get_current_context(parsed_kubeconfig)
|
|
205
|
+
new_kubeconfig = KubeconfigService.update_current_context(merged_kubeconfig, new_current_context)
|
|
206
|
+
|
|
207
|
+
next new_kubeconfig if kubeconfig_by_path.nil?
|
|
208
|
+
|
|
209
|
+
previous_current_context = KubeconfigService.get_current_context(kubeconfig_by_path)
|
|
210
|
+
save_previous_current_context(kubeconfig_path, previous_current_context)
|
|
211
|
+
new_kubeconfig
|
|
196
212
|
end
|
|
197
213
|
|
|
198
214
|
update_clusters_config(cluster_data[:id], kubeconfig_path: kubeconfig_path)
|
|
@@ -319,8 +335,14 @@ module Uffizzi
|
|
|
319
335
|
merged_kubeconfig = KubeconfigService.merge(kubeconfig_by_path, kubeconfig)
|
|
320
336
|
|
|
321
337
|
if is_update_current_context
|
|
322
|
-
|
|
323
|
-
KubeconfigService.update_current_context(merged_kubeconfig,
|
|
338
|
+
new_current_context = KubeconfigService.get_current_context(kubeconfig)
|
|
339
|
+
new_kubeconfig = KubeconfigService.update_current_context(merged_kubeconfig, new_current_context)
|
|
340
|
+
|
|
341
|
+
next new_kubeconfig if kubeconfig_by_path.nil?
|
|
342
|
+
|
|
343
|
+
previous_current_context = KubeconfigService.get_current_context(kubeconfig_by_path)
|
|
344
|
+
save_previous_current_context(kubeconfig_path, previous_current_context)
|
|
345
|
+
new_kubeconfig
|
|
324
346
|
else
|
|
325
347
|
merged_kubeconfig
|
|
326
348
|
end
|
|
@@ -359,5 +381,12 @@ module Uffizzi
|
|
|
359
381
|
ResponseHelper.handle_failed_response(response)
|
|
360
382
|
end
|
|
361
383
|
end
|
|
384
|
+
|
|
385
|
+
def save_previous_current_context(kubeconfig_path, current_context)
|
|
386
|
+
return if kubeconfig_path.nil? || ConfigHelper.previous_current_context_by_path(kubeconfig_path).present?
|
|
387
|
+
|
|
388
|
+
previous_current_contexts = Uffizzi::ConfigHelper.set_previous_current_context_by_path(kubeconfig_path, current_context)
|
|
389
|
+
ConfigFile.write_option(:previous_current_contexts, previous_current_contexts)
|
|
390
|
+
end
|
|
362
391
|
end
|
|
363
392
|
end
|
data/lib/uffizzi/cli/common.rb
CHANGED
|
@@ -4,7 +4,7 @@ module Uffizzi
|
|
|
4
4
|
class Cli::Common
|
|
5
5
|
class << self
|
|
6
6
|
def show_manual(command_name)
|
|
7
|
-
manual_doc_path = File.join(Uffizzi.root, "
|
|
7
|
+
manual_doc_path = File.join(Uffizzi.root, "man/#{command_name}.ronn")
|
|
8
8
|
|
|
9
9
|
Uffizzi.ui.say(File.read(manual_doc_path))
|
|
10
10
|
end
|
|
@@ -79,6 +79,8 @@ module Uffizzi
|
|
|
79
79
|
else
|
|
80
80
|
ResponseHelper.handle_invalid_compose_response(response)
|
|
81
81
|
end
|
|
82
|
+
elsif ResponseHelper.not_found?(response)
|
|
83
|
+
Uffizzi.ui.say('The project does not have a compose file set.')
|
|
82
84
|
else
|
|
83
85
|
ResponseHelper.handle_failed_response(response)
|
|
84
86
|
end
|
|
@@ -39,11 +39,28 @@ module Uffizzi
|
|
|
39
39
|
clusters.detect { |c| c[:id] == id }
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
+
def set_previous_current_context_by_path(path, current_context)
|
|
43
|
+
current_contexts = previous_current_contexts_without(path)
|
|
44
|
+
current_contexts << { current_context: current_context, kubeconfig_path: path }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def previous_current_contexts_without(path)
|
|
48
|
+
cluster_previous_current_contexts.reject { |c| c[:kubeconfig_path] == path }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def previous_current_context_by_path(path)
|
|
52
|
+
cluster_previous_current_contexts.detect { |c| c[:kubeconfig_path] == path }
|
|
53
|
+
end
|
|
54
|
+
|
|
42
55
|
private
|
|
43
56
|
|
|
44
57
|
def clusters
|
|
45
58
|
read_option_from_config(:clusters) || []
|
|
46
59
|
end
|
|
60
|
+
|
|
61
|
+
def cluster_previous_current_contexts
|
|
62
|
+
read_option_from_config(:previous_current_contexts) || []
|
|
63
|
+
end
|
|
47
64
|
end
|
|
48
65
|
end
|
|
49
66
|
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'uffizzi/helpers/config_helper'
|
|
4
|
+
require 'uffizzi/services/cluster_service'
|
|
5
|
+
require 'uffizzi/services/kubeconfig_service'
|
|
6
|
+
|
|
7
|
+
class ClusterDisconnectService
|
|
8
|
+
class << self
|
|
9
|
+
def handle(options)
|
|
10
|
+
kubeconfig_path = options[:kubeconfig] || KubeconfigService.default_path
|
|
11
|
+
is_ask_origin_current_context = options[:ask]
|
|
12
|
+
|
|
13
|
+
prev_current_context = Uffizzi::ConfigHelper.previous_current_context_by_path(kubeconfig_path)&.fetch(:current_context, nil)
|
|
14
|
+
kubeconfig = KubeconfigService.read_kubeconfig(kubeconfig_path)
|
|
15
|
+
|
|
16
|
+
if kubeconfig.nil?
|
|
17
|
+
return Uffizzi.ui.say("Kubeconfig does not exist by path #{kubeconfig_path}")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
contexts = KubeconfigService.get_cluster_contexts(kubeconfig)
|
|
21
|
+
current_context = KubeconfigService.get_current_context(kubeconfig)
|
|
22
|
+
|
|
23
|
+
if contexts.empty?
|
|
24
|
+
return Uffizzi.ui.say("No contexts by kubeconfig path #{kubeconfig_path}")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
if KubeconfigService.find_cluster_contexts_by_name(kubeconfig, prev_current_context).present? &&
|
|
28
|
+
prev_current_context != current_context &&
|
|
29
|
+
!is_ask_origin_current_context
|
|
30
|
+
update_current_context_by_filepath(kubeconfig_path, prev_current_context)
|
|
31
|
+
say_success(prev_current_context, kubeconfig_path)
|
|
32
|
+
return
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
new_current_context = ask_context(contexts, current_context)
|
|
36
|
+
update_current_context_by_filepath(kubeconfig_path, new_current_context)
|
|
37
|
+
set_previous_current_context_to_config(kubeconfig_path, new_current_context)
|
|
38
|
+
say_success(new_current_context, kubeconfig_path)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def say_success(current_context, kubeconfig_path)
|
|
44
|
+
Uffizzi.ui.say("Now your current context is '#{current_context}' for kubeconfig path '#{kubeconfig_path}'")
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def update_current_context_by_filepath(filepath, current_context)
|
|
48
|
+
KubeconfigService.save_to_filepath(filepath) do |kubeconfig|
|
|
49
|
+
KubeconfigService.update_current_context(kubeconfig, current_context)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def set_previous_current_context_to_config(kubeconfig_path, current_context)
|
|
54
|
+
previous_current_contexts = Uffizzi::ConfigHelper.set_previous_current_context_by_path(kubeconfig_path, current_context)
|
|
55
|
+
Uffizzi::ConfigFile.write_option(:previous_current_contexts, previous_current_contexts)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def ask_context(contexts, current_context)
|
|
59
|
+
context_names = contexts
|
|
60
|
+
.map { |c| { name: c['name'], value: c['name'] } }
|
|
61
|
+
.reject { |c| c[:value] == current_context }
|
|
62
|
+
|
|
63
|
+
if context_names.empty?
|
|
64
|
+
return Uffizzi.ui.say_error_and_exit('No other contexts')
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
question = 'Select origin context to switch on:'
|
|
68
|
+
Uffizzi.prompt.select(question, context_names)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -41,15 +41,25 @@ class KubeconfigService
|
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
def get_first_context(kubeconfig)
|
|
44
|
-
kubeconfig
|
|
44
|
+
get_cluster_contexts(kubeconfig)[0]
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
def get_current_cluster_name(kubeconfig)
|
|
48
|
-
kubeconfig
|
|
48
|
+
get_cluster_contexts(kubeconfig)
|
|
49
49
|
.detect { |c| c['name'] == get_current_context(kubeconfig) }
|
|
50
50
|
.dig('context', 'cluster')
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
+
def get_cluster_contexts(kubeconfig)
|
|
54
|
+
kubeconfig.fetch('contexts', [])
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def find_cluster_contexts_by_name(kubeconfig, context_name)
|
|
58
|
+
return if context_name.nil?
|
|
59
|
+
|
|
60
|
+
get_cluster_contexts(kubeconfig).detect { |c| c['name'] == context_name }
|
|
61
|
+
end
|
|
62
|
+
|
|
53
63
|
def update_current_context(kubeconfig, current_context)
|
|
54
64
|
new_kubeconfig = kubeconfig.deep_dup
|
|
55
65
|
new_kubeconfig['current-context'] = current_context
|
|
@@ -57,9 +67,8 @@ class KubeconfigService
|
|
|
57
67
|
new_kubeconfig
|
|
58
68
|
end
|
|
59
69
|
|
|
60
|
-
def save_to_filepath(filepath, kubeconfig)
|
|
61
|
-
|
|
62
|
-
target_kubeconfig = File.exist?(real_file_path) ? Psych.safe_load(File.read(real_file_path)) : nil
|
|
70
|
+
def save_to_filepath(filepath, kubeconfig = nil)
|
|
71
|
+
target_kubeconfig = read_kubeconfig(filepath)
|
|
63
72
|
|
|
64
73
|
if target_kubeconfig.present? && !valid_kubeconfig?(target_kubeconfig)
|
|
65
74
|
raise InvalidKubeconfigError.new(filepath)
|
|
@@ -68,15 +77,31 @@ class KubeconfigService
|
|
|
68
77
|
new_kubeconfig = block_given? ? yield(target_kubeconfig) : kubeconfig
|
|
69
78
|
return if new_kubeconfig.nil?
|
|
70
79
|
|
|
71
|
-
|
|
72
|
-
FileUtils.mkdir_p(dir_path) unless File.directory?(dir_path)
|
|
73
|
-
File.write(real_file_path, new_kubeconfig.to_yaml)
|
|
80
|
+
write_kubeconfig(filepath, new_kubeconfig)
|
|
74
81
|
end
|
|
75
82
|
|
|
76
83
|
def default_path
|
|
77
84
|
kubeconfig_env_path || Uffizzi.configuration.default_kubeconfig_path
|
|
78
85
|
end
|
|
79
86
|
|
|
87
|
+
def read_kubeconfig(filepath)
|
|
88
|
+
real_file_path = File.expand_path(filepath)
|
|
89
|
+
kubeconfig = File.exist?(real_file_path) ? Psych.safe_load(File.read(real_file_path)) : nil
|
|
90
|
+
|
|
91
|
+
if kubeconfig.present? && !valid_kubeconfig?(kubeconfig)
|
|
92
|
+
raise InvalidKubeconfigError.new(filepath)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
kubeconfig
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def write_kubeconfig(filepath, kubeconfig)
|
|
99
|
+
real_file_path = File.expand_path(filepath)
|
|
100
|
+
dir_path = File.dirname(real_file_path)
|
|
101
|
+
FileUtils.mkdir_p(dir_path) unless File.directory?(dir_path)
|
|
102
|
+
File.write(real_file_path, kubeconfig.to_yaml)
|
|
103
|
+
end
|
|
104
|
+
|
|
80
105
|
private
|
|
81
106
|
|
|
82
107
|
def cluster_exists_in_kubeconfig?(kubeconfig, cluster_name)
|
data/lib/uffizzi/version.rb
CHANGED
data/man/uffizzi
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
.\" generated with Ronn-NG/v0.9.1
|
|
2
|
+
.\" http://github.com/apjanke/ronn-ng/tree/0.9.1
|
|
3
|
+
.TH "UFFIZZI" "" "September 2023" ""
|
|
4
|
+
.SH "NAME"
|
|
5
|
+
\fBuffizzi\fR \- manage Uffizzi resources
|
|
6
|
+
.SH "SYNOPSIS"
|
|
7
|
+
.nf
|
|
8
|
+
uffizzi GROUP | COMMAND
|
|
9
|
+
.fi
|
|
10
|
+
.SH "DESCRIPTION"
|
|
11
|
+
.nf
|
|
12
|
+
The uffizzi CLI manages authentication, configuration, and
|
|
13
|
+
interaction with Uffizzi APIs\.
|
|
14
|
+
|
|
15
|
+
For more information on the uffizzi CLI, see:
|
|
16
|
+
https://docs\.uffizzi\.com/references/cli/
|
|
17
|
+
.fi
|
|
18
|
+
.SH "GROUP"
|
|
19
|
+
.nf
|
|
20
|
+
GROUP is one of the following:
|
|
21
|
+
cluster
|
|
22
|
+
Manage virtual clusters
|
|
23
|
+
|
|
24
|
+
config
|
|
25
|
+
Configure the uffizzi CLI
|
|
26
|
+
|
|
27
|
+
connect
|
|
28
|
+
Grant a Uffizzi user account access to external services
|
|
29
|
+
|
|
30
|
+
compose
|
|
31
|
+
Manage Uffizzi compose environments (previews) and view logs
|
|
32
|
+
|
|
33
|
+
project
|
|
34
|
+
Manage Uffizzi project resources including compose files for
|
|
35
|
+
specifying compose environment (preview) configurations and secrets
|
|
36
|
+
.fi
|
|
37
|
+
.SH "COMMAND"
|
|
38
|
+
.nf
|
|
39
|
+
COMMAND is one of the following:
|
|
40
|
+
|
|
41
|
+
help
|
|
42
|
+
Show uffizzi documentation
|
|
43
|
+
|
|
44
|
+
login
|
|
45
|
+
Log in to a Uffizzi user account
|
|
46
|
+
|
|
47
|
+
logout
|
|
48
|
+
Log out of a Uffizzi user account
|
|
49
|
+
|
|
50
|
+
version
|
|
51
|
+
Print version information for uffizzi CLI
|
|
52
|
+
.fi
|
|
53
|
+
|
data/man/uffizzi-account
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
.\" generated with Ronn-NG/v0.9.1
|
|
2
|
+
.\" http://github.com/apjanke/ronn-ng/tree/0.9.1
|
|
3
|
+
.TH "UFFIZZI\-ACCOUNT" "" "August 2023" ""
|
|
4
|
+
.SH "NAME"
|
|
5
|
+
\fBuffizzi\-account\fR \- manage Uffizzi accounts
|
|
6
|
+
.SH "SYNOPSIS"
|
|
7
|
+
.nf
|
|
8
|
+
uffizzi account COMMAND [UFFIZZI_WIDE_FLAG \|\.\|\.\|\.]
|
|
9
|
+
.fi
|
|
10
|
+
.SH "DESCRIPTION"
|
|
11
|
+
.nf
|
|
12
|
+
Manage Uffizzi accounts
|
|
13
|
+
|
|
14
|
+
For more information on Uffizzi accounts, see:
|
|
15
|
+
https://docs\.uffizzi\.com/references/cli/
|
|
16
|
+
.fi
|
|
17
|
+
.SH "COMMANDS"
|
|
18
|
+
.nf
|
|
19
|
+
COMMAND is one of the following:
|
|
20
|
+
|
|
21
|
+
list
|
|
22
|
+
List all accounts associated with the user\'s credentials
|
|
23
|
+
|
|
24
|
+
set\-default
|
|
25
|
+
Set the default account in the uffizzi configuration\. Also see
|
|
26
|
+
$ uffizzi config help for details\.
|
|
27
|
+
.fi
|
|
28
|
+
.P
|
|
29
|
+
Run $ uffizzi account COMMAND \-\-help for more information on a command\.
|
|
@@ -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\-ACCOUNT\-LIST" "" "August 2023" ""
|
|
4
|
+
.SH "NAME"
|
|
5
|
+
\fBuffizzi\-account\-list\fR \- list the accounts of the user
|
|
6
|
+
.SH "SYNOPSIS"
|
|
7
|
+
.nf
|
|
8
|
+
uffizzi account list
|
|
9
|
+
.fi
|
|
10
|
+
.SH "DESCRIPTION"
|
|
11
|
+
.nf
|
|
12
|
+
This command lists all accounts (not projects) for the associated user
|
|
13
|
+
|
|
14
|
+
This command can fail for the following reasons:
|
|
15
|
+
\- The user is not authenticated
|
|
16
|
+
|
|
17
|
+
For more information on preview services, see:
|
|
18
|
+
https://docs\.uffizzi\.com/references/cli/
|
|
19
|
+
.fi
|
|
20
|
+
.SH "EXAMPLES"
|
|
21
|
+
.nf
|
|
22
|
+
The following command lists the user\'s accounts:
|
|
23
|
+
|
|
24
|
+
$ uffizzi account list
|
|
25
|
+
.fi
|
|
26
|
+
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta http-equiv='content-type' content='text/html;charset=utf8'>
|
|
5
|
+
<meta name='generator' content='Ronn-NG/v0.9.1 (http://github.com/apjanke/ronn-ng/tree/0.9.1)'>
|
|
6
|
+
<title>list the accounts of the user</title>
|
|
7
|
+
<style type='text/css' media='all'>
|
|
8
|
+
/* style: man */
|
|
9
|
+
body#manpage {margin:0}
|
|
10
|
+
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
|
|
11
|
+
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
|
|
12
|
+
.mp h2 {margin:10px 0 0 0}
|
|
13
|
+
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
|
|
14
|
+
.mp h3 {margin:0 0 0 4ex}
|
|
15
|
+
.mp dt {margin:0;clear:left}
|
|
16
|
+
.mp dt.flush {float:left;width:8ex}
|
|
17
|
+
.mp dd {margin:0 0 0 9ex}
|
|
18
|
+
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
|
|
19
|
+
.mp pre {margin-bottom:20px}
|
|
20
|
+
.mp pre+h2,.mp pre+h3 {margin-top:22px}
|
|
21
|
+
.mp h2+pre,.mp h3+pre {margin-top:5px}
|
|
22
|
+
.mp img {display:block;margin:auto}
|
|
23
|
+
.mp h1.man-title {display:none}
|
|
24
|
+
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
|
|
25
|
+
.mp h2 {font-size:16px;line-height:1.25}
|
|
26
|
+
.mp h1 {font-size:20px;line-height:2}
|
|
27
|
+
.mp {text-align:justify;background:#fff}
|
|
28
|
+
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
|
|
29
|
+
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
|
|
30
|
+
.mp u {text-decoration:underline}
|
|
31
|
+
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
|
|
32
|
+
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
|
|
33
|
+
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
|
|
34
|
+
.mp b.man-ref {font-weight:normal;color:#434241}
|
|
35
|
+
.mp pre {padding:0 4ex}
|
|
36
|
+
.mp pre code {font-weight:normal;color:#434241}
|
|
37
|
+
.mp h2+pre,h3+pre {padding-left:0}
|
|
38
|
+
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
|
|
39
|
+
ol.man-decor {width:100%}
|
|
40
|
+
ol.man-decor li.tl {text-align:left}
|
|
41
|
+
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
|
|
42
|
+
ol.man-decor li.tr {text-align:right;float:right}
|
|
43
|
+
</style>
|
|
44
|
+
</head>
|
|
45
|
+
<!--
|
|
46
|
+
The following styles are deprecated and will be removed at some point:
|
|
47
|
+
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
|
|
48
|
+
|
|
49
|
+
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
|
|
50
|
+
.man-navigation should be used instead.
|
|
51
|
+
-->
|
|
52
|
+
<body id='manpage'>
|
|
53
|
+
<div class='mp' id='man'>
|
|
54
|
+
|
|
55
|
+
<div class='man-navigation' style='display:none'>
|
|
56
|
+
<a href="#NAME">NAME</a>
|
|
57
|
+
<a href="#SYNOPSIS">SYNOPSIS</a>
|
|
58
|
+
<a href="#DESCRIPTION">DESCRIPTION</a>
|
|
59
|
+
<a href="#EXAMPLES">EXAMPLES</a>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<ol class='man-decor man-head man head'>
|
|
63
|
+
<li class='tl'>uffizzi-account-list</li>
|
|
64
|
+
<li class='tc'></li>
|
|
65
|
+
<li class='tr'>uffizzi-account-list</li>
|
|
66
|
+
</ol>
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
<h2 id="NAME">NAME</h2>
|
|
71
|
+
<p class="man-name">
|
|
72
|
+
<code>uffizzi-account-list</code> - <span class="man-whatis">list the accounts of the user</span>
|
|
73
|
+
</p>
|
|
74
|
+
<h2 id="SYNOPSIS">SYNOPSIS</h2>
|
|
75
|
+
<pre><code>uffizzi account list
|
|
76
|
+
</code></pre>
|
|
77
|
+
|
|
78
|
+
<h2 id="DESCRIPTION">DESCRIPTION</h2>
|
|
79
|
+
<pre><code>Shows a list of the container services that make up a given preview
|
|
80
|
+
deployment.
|
|
81
|
+
|
|
82
|
+
This command can fail for the following reasons:
|
|
83
|
+
- The user is not authenticated
|
|
84
|
+
|
|
85
|
+
For more information on preview services, see:
|
|
86
|
+
https://github.com/UffizziCloud/uffizzi_cli
|
|
87
|
+
</code></pre>
|
|
88
|
+
|
|
89
|
+
<h2 id="EXAMPLES">EXAMPLES</h2>
|
|
90
|
+
<pre><code>The following command lists the user's accounts:
|
|
91
|
+
|
|
92
|
+
$ uffizzi account list
|
|
93
|
+
</code></pre>
|
|
94
|
+
|
|
95
|
+
<ol class='man-decor man-foot man foot'>
|
|
96
|
+
<li class='tl'></li>
|
|
97
|
+
<li class='tc'>July 2023</li>
|
|
98
|
+
<li class='tr'>uffizzi-account-list</li>
|
|
99
|
+
</ol>
|
|
100
|
+
|
|
101
|
+
</div>
|
|
102
|
+
</body>
|
|
103
|
+
</html>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
uffizzi-account-list - list the accounts of the user
|
|
2
|
+
================================================================
|
|
3
|
+
|
|
4
|
+
## SYNOPSIS
|
|
5
|
+
uffizzi account list
|
|
6
|
+
|
|
7
|
+
## DESCRIPTION
|
|
8
|
+
This command lists all accounts (not projects) for the associated user
|
|
9
|
+
|
|
10
|
+
This command can fail for the following reasons:
|
|
11
|
+
- The user is not authenticated
|
|
12
|
+
|
|
13
|
+
For more information on preview services, see:
|
|
14
|
+
https://docs.uffizzi.com/references/cli/
|
|
15
|
+
|
|
16
|
+
## EXAMPLES
|
|
17
|
+
The following command lists the user's accounts:
|
|
18
|
+
|
|
19
|
+
$ uffizzi account list
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
.\" generated with Ronn-NG/v0.9.1
|
|
2
|
+
.\" http://github.com/apjanke/ronn-ng/tree/0.9.1
|
|
3
|
+
.TH "UFFIZZI\-ACCOUNT\-SET\-DEFAULT" "" "August 2023" ""
|
|
4
|
+
.SH "NAME"
|
|
5
|
+
\fBuffizzi\-account\-set\-default\fR \- set the default account
|
|
6
|
+
.SH "SYNOPSIS"
|
|
7
|
+
.nf
|
|
8
|
+
uffizzi account set\-default ACCOUNT_NAME
|
|
9
|
+
.fi
|
|
10
|
+
.SH "DESCRIPTION"
|
|
11
|
+
.nf
|
|
12
|
+
This command sets the default account (project) for the uffizzi configuration\.
|
|
13
|
+
When set, all commands use this account as the default context unless
|
|
14
|
+
overridden by the \-\-project flag\.
|
|
15
|
+
|
|
16
|
+
This command can fail for the following reasons:
|
|
17
|
+
\- There is no account with the given account name
|
|
18
|
+
|
|
19
|
+
For more information on Uffizzi projects, see:
|
|
20
|
+
https://docs\.uffizzi\.com/references/cli/
|
|
21
|
+
.fi
|
|
22
|
+
.SH "EXAMPLES"
|
|
23
|
+
.nf
|
|
24
|
+
The following sets the default account with account name
|
|
25
|
+
example for the active account:
|
|
26
|
+
|
|
27
|
+
$ uffizzi account set\-default example
|
|
28
|
+
.fi
|
|
29
|
+
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta http-equiv='content-type' content='text/html;charset=utf8'>
|
|
5
|
+
<meta name='generator' content='Ronn-NG/v0.9.1 (http://github.com/apjanke/ronn-ng/tree/0.9.1)'>
|
|
6
|
+
<title>set the default account</title>
|
|
7
|
+
<style type='text/css' media='all'>
|
|
8
|
+
/* style: man */
|
|
9
|
+
body#manpage {margin:0}
|
|
10
|
+
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
|
|
11
|
+
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
|
|
12
|
+
.mp h2 {margin:10px 0 0 0}
|
|
13
|
+
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
|
|
14
|
+
.mp h3 {margin:0 0 0 4ex}
|
|
15
|
+
.mp dt {margin:0;clear:left}
|
|
16
|
+
.mp dt.flush {float:left;width:8ex}
|
|
17
|
+
.mp dd {margin:0 0 0 9ex}
|
|
18
|
+
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
|
|
19
|
+
.mp pre {margin-bottom:20px}
|
|
20
|
+
.mp pre+h2,.mp pre+h3 {margin-top:22px}
|
|
21
|
+
.mp h2+pre,.mp h3+pre {margin-top:5px}
|
|
22
|
+
.mp img {display:block;margin:auto}
|
|
23
|
+
.mp h1.man-title {display:none}
|
|
24
|
+
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
|
|
25
|
+
.mp h2 {font-size:16px;line-height:1.25}
|
|
26
|
+
.mp h1 {font-size:20px;line-height:2}
|
|
27
|
+
.mp {text-align:justify;background:#fff}
|
|
28
|
+
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
|
|
29
|
+
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
|
|
30
|
+
.mp u {text-decoration:underline}
|
|
31
|
+
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
|
|
32
|
+
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
|
|
33
|
+
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
|
|
34
|
+
.mp b.man-ref {font-weight:normal;color:#434241}
|
|
35
|
+
.mp pre {padding:0 4ex}
|
|
36
|
+
.mp pre code {font-weight:normal;color:#434241}
|
|
37
|
+
.mp h2+pre,h3+pre {padding-left:0}
|
|
38
|
+
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
|
|
39
|
+
ol.man-decor {width:100%}
|
|
40
|
+
ol.man-decor li.tl {text-align:left}
|
|
41
|
+
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
|
|
42
|
+
ol.man-decor li.tr {text-align:right;float:right}
|
|
43
|
+
</style>
|
|
44
|
+
</head>
|
|
45
|
+
<!--
|
|
46
|
+
The following styles are deprecated and will be removed at some point:
|
|
47
|
+
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
|
|
48
|
+
|
|
49
|
+
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
|
|
50
|
+
.man-navigation should be used instead.
|
|
51
|
+
-->
|
|
52
|
+
<body id='manpage'>
|
|
53
|
+
<div class='mp' id='man'>
|
|
54
|
+
|
|
55
|
+
<div class='man-navigation' style='display:none'>
|
|
56
|
+
<a href="#NAME">NAME</a>
|
|
57
|
+
<a href="#SYNOPSIS">SYNOPSIS</a>
|
|
58
|
+
<a href="#DESCRIPTION">DESCRIPTION</a>
|
|
59
|
+
<a href="#EXAMPLES">EXAMPLES</a>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<ol class='man-decor man-head man head'>
|
|
63
|
+
<li class='tl'>uffizzi-account-set-default</li>
|
|
64
|
+
<li class='tc'></li>
|
|
65
|
+
<li class='tr'>uffizzi-account-set-default</li>
|
|
66
|
+
</ol>
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
<h2 id="NAME">NAME</h2>
|
|
71
|
+
<p class="man-name">
|
|
72
|
+
<code>uffizzi-account-set-default</code> - <span class="man-whatis">set the default account</span>
|
|
73
|
+
</p>
|
|
74
|
+
<h2 id="SYNOPSIS">SYNOPSIS</h2>
|
|
75
|
+
<pre><code>uffizzi account set-default ACCOUNT_NAME
|
|
76
|
+
</code></pre>
|
|
77
|
+
|
|
78
|
+
<h2 id="DESCRIPTION">DESCRIPTION</h2>
|
|
79
|
+
<pre><code>Sets the default account given with the given account name. When set,
|
|
80
|
+
all commands use this account as the default context unless
|
|
81
|
+
overridden by the --project flag.
|
|
82
|
+
|
|
83
|
+
This command can fail for the following reasons:
|
|
84
|
+
- There is no account with the given account name
|
|
85
|
+
|
|
86
|
+
For more information on Uffizzi projects, see:
|
|
87
|
+
https://github.com/UffizziCloud/uffizzi_cli
|
|
88
|
+
</code></pre>
|
|
89
|
+
|
|
90
|
+
<h2 id="EXAMPLES">EXAMPLES</h2>
|
|
91
|
+
<pre><code>The following sets the default account with account name
|
|
92
|
+
example for the active account:
|
|
93
|
+
|
|
94
|
+
$ uffizzi account set-default example
|
|
95
|
+
</code></pre>
|
|
96
|
+
|
|
97
|
+
<ol class='man-decor man-foot man foot'>
|
|
98
|
+
<li class='tl'></li>
|
|
99
|
+
<li class='tc'>July 2023</li>
|
|
100
|
+
<li class='tr'>uffizzi-account-set-default</li>
|
|
101
|
+
</ol>
|
|
102
|
+
|
|
103
|
+
</div>
|
|
104
|
+
</body>
|
|
105
|
+
</html>
|