summaryrefslogtreecommitdiff
path: root/spec/models/clusters
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/clusters')
-rw-r--r--spec/models/clusters/agent_spec.rb35
-rw-r--r--spec/models/clusters/agent_token_spec.rb18
-rw-r--r--spec/models/clusters/applications/ingress_spec.rb4
-rw-r--r--spec/models/clusters/cluster_spec.rb83
-rw-r--r--spec/models/clusters/platforms/kubernetes_spec.rb1
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) }