From ba2d34f852cd9efe85b2ad4ba93b38e6d78e0301 Mon Sep 17 00:00:00 2001 From: Zipofar Date: Mon, 10 Jul 2023 16:58:23 +0300 Subject: [PATCH 1/2] [243] Handle error when kubeconfig file is another file --- lib/uffizzi/services/kubeconfig_service.rb | 22 ++++++++++++++++++++++ test/uffizzi/cli/cluster_test.rb | 17 +++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/lib/uffizzi/services/kubeconfig_service.rb b/lib/uffizzi/services/kubeconfig_service.rb index 9c360454..4cd6486e 100644 --- a/lib/uffizzi/services/kubeconfig_service.rb +++ b/lib/uffizzi/services/kubeconfig_service.rb @@ -4,7 +4,16 @@ require 'psych' class KubeconfigService + class Invalid < StandardError + def initialize(file_path) + msg = "Kubeconfig is invalid by path '#{file_path}'" + + super(msg) + end + end + DEFAULT_KUBECONFIG_PATH = '~/.kube/config' + KUBECONFIG_GENERAL_KEYS = ['apiVersion', 'clusters', 'contexts', 'current-context', 'kind', 'users'].freeze class << self include ApiClient @@ -35,6 +44,11 @@ def update_current_context(kubeconfig, current_context) def save_to_filepath(filepath, kubeconfig) real_file_path = File.expand_path(filepath) target_kubeconfig = File.exist?(real_file_path) ? Psych.safe_load(File.read(real_file_path)) : nil + + if target_kubeconfig.present? && !valid_kubeconfig?(target_kubeconfig) + raise Invalid.new(filepath) + end + new_kubeconfig = block_given? ? yield(target_kubeconfig) : merge(target_kubeconfig, kubeconfig) dir_path = File.dirname(real_file_path) @@ -85,5 +99,13 @@ def kubeconfig_env_path file_paths.split(':').first end + + def valid_kubeconfig?(data) + return false unless data.is_a?(Hash) + + data_keys = data.keys.map(&:to_s) + + KUBECONFIG_GENERAL_KEYS.all? { |k| data_keys.include?(k) } + end end end diff --git a/test/uffizzi/cli/cluster_test.rb b/test/uffizzi/cli/cluster_test.rb index 51708a69..a10de86b 100644 --- a/test/uffizzi/cli/cluster_test.rb +++ b/test/uffizzi/cli/cluster_test.rb @@ -147,6 +147,23 @@ def test_update_kubeconfig_if_kubeconfig_is_empty_and_cluster_is_failed assert_match('is empty', error.message) end + def test_update_kubeconfig_if_kubeconfig_path_has_invalid_file + @cluster.options = command_options(name: 'uffizzi-test-cluster', kubeconfig: @kubeconfig_path) + + cluster_get_body = json_fixture('files/uffizzi/uffizzi_cluster_deployed.json') + stubbed_uffizzi_cluster_get_request = stub_get_cluster_request(cluster_get_body, @project_slug) + kubeconfig_from_filesystem = 'some data' + + File.write(@kubeconfig_path, kubeconfig_from_filesystem) + + error = assert_raises(KubeconfigService::Invalid) do + @cluster.update_kubeconfig + end + + assert_requested(stubbed_uffizzi_cluster_get_request) + assert_match('is invalid', error.message) + end + def test_describe_cluster clusters_get_body = json_fixture('files/uffizzi/uffizzi_cluster_describe.json') stubbed_uffizzi_cluster_get_request = stub_get_cluster_request(clusters_get_body, @project_slug) From fcaf94cb3dc15444dd137367c0ad850c5dd9775a Mon Sep 17 00:00:00 2001 From: Zipofar Date: Wed, 19 Jul 2023 15:46:15 +0300 Subject: [PATCH 2/2] [243] fix error name and msg --- lib/uffizzi/services/kubeconfig_service.rb | 6 +++--- test/uffizzi/cli/cluster_test.rb | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/uffizzi/services/kubeconfig_service.rb b/lib/uffizzi/services/kubeconfig_service.rb index 4cd6486e..e052599b 100644 --- a/lib/uffizzi/services/kubeconfig_service.rb +++ b/lib/uffizzi/services/kubeconfig_service.rb @@ -4,9 +4,9 @@ require 'psych' class KubeconfigService - class Invalid < StandardError + class InvalidKubeconfigError < StandardError def initialize(file_path) - msg = "Kubeconfig is invalid by path '#{file_path}'" + msg = "Invalid kubeconfig at path '#{file_path}'" super(msg) end @@ -46,7 +46,7 @@ def save_to_filepath(filepath, kubeconfig) target_kubeconfig = File.exist?(real_file_path) ? Psych.safe_load(File.read(real_file_path)) : nil if target_kubeconfig.present? && !valid_kubeconfig?(target_kubeconfig) - raise Invalid.new(filepath) + raise InvalidKubeconfigError.new(filepath) end new_kubeconfig = block_given? ? yield(target_kubeconfig) : merge(target_kubeconfig, kubeconfig) diff --git a/test/uffizzi/cli/cluster_test.rb b/test/uffizzi/cli/cluster_test.rb index a10de86b..bb0fb7cc 100644 --- a/test/uffizzi/cli/cluster_test.rb +++ b/test/uffizzi/cli/cluster_test.rb @@ -156,12 +156,12 @@ def test_update_kubeconfig_if_kubeconfig_path_has_invalid_file File.write(@kubeconfig_path, kubeconfig_from_filesystem) - error = assert_raises(KubeconfigService::Invalid) do + error = assert_raises(KubeconfigService::InvalidKubeconfigError) do @cluster.update_kubeconfig end assert_requested(stubbed_uffizzi_cluster_get_request) - assert_match('is invalid', error.message) + assert_match('Invalid kubeconfig', error.message) end def test_describe_cluster