diff options
Diffstat (limited to 'spec/models/clusters/cluster_spec.rb')
-rw-r--r-- | spec/models/clusters/cluster_spec.rb | 83 |
1 files changed, 72 insertions, 11 deletions
diff --git a/spec/models/clusters/cluster_spec.rb b/spec/models/clusters/cluster_spec.rb index 4807957152c..2d0b5af0e77 100644 --- a/spec/models/clusters/cluster_spec.rb +++ b/spec/models/clusters/cluster_spec.rb @@ -1153,6 +1153,57 @@ RSpec.describe Clusters::Cluster, :use_clean_rails_memory_store_caching do end end + describe '#connection_error' do + let(:cluster) { create(:cluster) } + let(:error) { :unknown_error } + + subject { cluster.connection_error } + + it { is_expected.to be_nil } + + context 'with a cached status' do + before do + stub_reactive_cache(cluster, connection_error: error) + end + + it { is_expected.to eq(error) } + end + end + + describe '#node_connection_error' do + let(:cluster) { create(:cluster) } + let(:error) { :unknown_error } + + subject { cluster.node_connection_error } + + it { is_expected.to be_nil } + + context 'with a cached status' do + before do + stub_reactive_cache(cluster, node_connection_error: error) + end + + it { is_expected.to eq(error) } + end + end + + describe '#metrics_connection_error' do + let(:cluster) { create(:cluster) } + let(:error) { :unknown_error } + + subject { cluster.metrics_connection_error } + + it { is_expected.to be_nil } + + context 'with a cached status' do + before do + stub_reactive_cache(cluster, metrics_connection_error: error) + end + + it { is_expected.to eq(error) } + end + end + describe '#nodes' do let(:cluster) { create(:cluster) } @@ -1186,43 +1237,49 @@ RSpec.describe Clusters::Cluster, :use_clean_rails_memory_store_caching do context 'cluster is enabled' do let(:cluster) { create(:cluster, :provided_by_user, :group) } let(:gl_k8s_node_double) { double(Gitlab::Kubernetes::Node) } - let(:expected_nodes) { nil } + let(:expected_nodes) { {} } before do stub_kubeclient_discover(cluster.platform.api_url) allow(Gitlab::Kubernetes::Node).to receive(:new).with(cluster).and_return(gl_k8s_node_double) - allow(gl_k8s_node_double).to receive(:all).and_return([]) + allow(gl_k8s_node_double).to receive(:all).and_return(expected_nodes) end context 'connection to the cluster is successful' do + let(:expected_nodes) { { nodes: [kube_node.merge(kube_node_metrics)] } } + let(:connection_status) { { connection_status: :connected } } + before do allow(gl_k8s_node_double).to receive(:all).and_return(expected_nodes) end - let(:expected_nodes) { [kube_node.merge(kube_node_metrics)] } - - it { is_expected.to eq(connection_status: :connected, nodes: expected_nodes) } + it { is_expected.to eq(**connection_status, **expected_nodes) } end context 'cluster cannot be reached' do + let(:connection_status) { { connection_status: :unreachable, connection_error: :connection_error } } + before do allow(cluster.kubeclient.core_client).to receive(:discover) .and_raise(SocketError) end - it { is_expected.to eq(connection_status: :unreachable, nodes: expected_nodes) } + it { is_expected.to eq(**connection_status, **expected_nodes) } end context 'cluster cannot be authenticated to' do + let(:connection_status) { { connection_status: :authentication_failure, connection_error: :authentication_error } } + before do allow(cluster.kubeclient.core_client).to receive(:discover) .and_raise(OpenSSL::X509::CertificateError.new("Certificate error")) end - it { is_expected.to eq(connection_status: :authentication_failure, nodes: expected_nodes) } + it { is_expected.to eq(**connection_status, **expected_nodes) } end describe 'Kubeclient::HttpError' do + let(:connection_status) { { connection_status: :authentication_failure, connection_error: :http_error } } let(:error_code) { 403 } let(:error_message) { "Forbidden" } @@ -1231,28 +1288,32 @@ RSpec.describe Clusters::Cluster, :use_clean_rails_memory_store_caching do .and_raise(Kubeclient::HttpError.new(error_code, error_message, nil)) end - it { is_expected.to eq(connection_status: :authentication_failure, nodes: expected_nodes) } + it { is_expected.to eq(**connection_status, **expected_nodes) } context 'generic timeout' do + let(:connection_status) { { connection_status: :unreachable, connection_error: :http_error } } let(:error_message) { 'Timed out connecting to server'} - it { is_expected.to eq(connection_status: :unreachable, nodes: expected_nodes) } + it { is_expected.to eq(**connection_status, **expected_nodes) } end context 'gateway timeout' do + let(:connection_status) { { connection_status: :unreachable, connection_error: :http_error } } let(:error_message) { '504 Gateway Timeout for GET https://kubernetes.example.com/api/v1'} - it { is_expected.to eq(connection_status: :unreachable, nodes: expected_nodes) } + it { is_expected.to eq(**connection_status, **expected_nodes) } end end context 'an uncategorised error is raised' do + let(:connection_status) { { connection_status: :unknown_failure, connection_error: :unknown_error } } + before do allow(cluster.kubeclient.core_client).to receive(:discover) .and_raise(StandardError) end - it { is_expected.to eq(connection_status: :unknown_failure, nodes: expected_nodes) } + it { is_expected.to eq(**connection_status, **expected_nodes) } it 'notifies Sentry' do expect(Gitlab::ErrorTracking).to receive(:track_exception) |