diff options
Diffstat (limited to 'spec/models/clusters')
-rw-r--r-- | spec/models/clusters/agent_spec.rb | 35 | ||||
-rw-r--r-- | spec/models/clusters/agent_token_spec.rb | 18 | ||||
-rw-r--r-- | spec/models/clusters/applications/ingress_spec.rb | 4 | ||||
-rw-r--r-- | spec/models/clusters/cluster_spec.rb | 83 | ||||
-rw-r--r-- | spec/models/clusters/platforms/kubernetes_spec.rb | 1 |
5 files changed, 128 insertions, 13 deletions
diff --git a/spec/models/clusters/agent_spec.rb b/spec/models/clusters/agent_spec.rb new file mode 100644 index 00000000000..bb1fc021e66 --- /dev/null +++ b/spec/models/clusters/agent_spec.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Clusters::Agent do + subject { create(:cluster_agent) } + + it { is_expected.to belong_to(:project).class_name('::Project') } + it { is_expected.to have_many(:agent_tokens).class_name('Clusters::AgentToken') } + + it { is_expected.to validate_presence_of(:name) } + it { is_expected.to validate_length_of(:name).is_at_most(63) } + it { is_expected.to validate_uniqueness_of(:name).scoped_to(:project_id) } + + describe 'validation' do + describe 'name validation' do + it 'rejects names that do not conform to RFC 1123', :aggregate_failures do + %w[Agent agentA agentAagain gent- -agent agent.a agent/a agent>a].each do |name| + agent = build(:cluster_agent, name: name) + + expect(agent).not_to be_valid + expect(agent.errors[:name]).to eq(["can contain only lowercase letters, digits, and '-', but cannot start or end with '-'"]) + end + end + + it 'accepts valid names', :aggregate_failures do + %w[agent agent123 agent-123].each do |name| + agent = build(:cluster_agent, name: name) + + expect(agent).to be_valid + end + end + end + end +end diff --git a/spec/models/clusters/agent_token_spec.rb b/spec/models/clusters/agent_token_spec.rb new file mode 100644 index 00000000000..ad9dd11b24e --- /dev/null +++ b/spec/models/clusters/agent_token_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Clusters::AgentToken do + it { is_expected.to belong_to(:agent).class_name('Clusters::Agent') } + + describe '#token' do + it 'is generated on save' do + agent_token = build(:cluster_agent_token, token_encrypted: nil) + expect(agent_token.token).to be_nil + + agent_token.save! + + expect(agent_token.token).to be_present + end + end +end diff --git a/spec/models/clusters/applications/ingress_spec.rb b/spec/models/clusters/applications/ingress_spec.rb index d1138f5fa2d..e029283326f 100644 --- a/spec/models/clusters/applications/ingress_spec.rb +++ b/spec/models/clusters/applications/ingress_spec.rb @@ -136,7 +136,7 @@ RSpec.describe Clusters::Applications::Ingress do it 'is initialized with ingress arguments' do expect(subject.name).to eq('ingress') expect(subject.chart).to eq('stable/nginx-ingress') - expect(subject.version).to eq('1.29.7') + expect(subject.version).to eq('1.40.2') expect(subject).to be_rbac expect(subject.files).to eq(ingress.files) end @@ -153,7 +153,7 @@ RSpec.describe Clusters::Applications::Ingress do let(:ingress) { create(:clusters_applications_ingress, :errored, version: 'nginx') } it 'is initialized with the locked version' do - expect(subject.version).to eq('1.29.7') + expect(subject.version).to eq('1.40.2') end end end 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) diff --git a/spec/models/clusters/platforms/kubernetes_spec.rb b/spec/models/clusters/platforms/kubernetes_spec.rb index adccc72d13d..c6a2b67a008 100644 --- a/spec/models/clusters/platforms/kubernetes_spec.rb +++ b/spec/models/clusters/platforms/kubernetes_spec.rb @@ -410,6 +410,7 @@ RSpec.describe Clusters::Platforms::Kubernetes do let(:expected_pod_cached_data) do kube_pod.tap { |kp| kp['metadata'].delete('namespace') } end + let(:namespace) { "project-namespace" } let(:environment) { instance_double(Environment, deployment_namespace: namespace) } |