diff options
Diffstat (limited to 'spec/models/clusters/cluster_spec.rb')
-rw-r--r-- | spec/models/clusters/cluster_spec.rb | 98 |
1 files changed, 85 insertions, 13 deletions
diff --git a/spec/models/clusters/cluster_spec.rb b/spec/models/clusters/cluster_spec.rb index db1d8672d1e..521ed98f637 100644 --- a/spec/models/clusters/cluster_spec.rb +++ b/spec/models/clusters/cluster_spec.rb @@ -590,6 +590,60 @@ describe Clusters::Cluster, :use_clean_rails_memory_store_caching do end end + describe '#find_or_build_application' do + let_it_be(:cluster, reload: true) { create(:cluster) } + + it 'rejects classes that are not applications' do + expect do + cluster.find_or_build_application(Project) + end.to raise_error(ArgumentError) + end + + context 'when none of applications are created' do + it 'returns the new application', :aggregate_failures do + described_class::APPLICATIONS.values.each do |application_class| + application = cluster.find_or_build_application(application_class) + + expect(application).to be_a(application_class) + expect(application).not_to be_persisted + end + end + end + + context 'when application is persisted' do + let!(:helm) { create(:clusters_applications_helm, cluster: cluster) } + let!(:ingress) { create(:clusters_applications_ingress, cluster: cluster) } + let!(:cert_manager) { create(:clusters_applications_cert_manager, cluster: cluster) } + let!(:crossplane) { create(:clusters_applications_crossplane, cluster: cluster) } + let!(:prometheus) { create(:clusters_applications_prometheus, cluster: cluster) } + let!(:runner) { create(:clusters_applications_runner, cluster: cluster) } + let!(:jupyter) { create(:clusters_applications_jupyter, cluster: cluster) } + let!(:knative) { create(:clusters_applications_knative, cluster: cluster) } + let!(:elastic_stack) { create(:clusters_applications_elastic_stack, cluster: cluster) } + let!(:fluentd) { create(:clusters_applications_fluentd, cluster: cluster) } + + it 'returns the persisted application', :aggregate_failures do + { + Clusters::Applications::Helm => helm, + Clusters::Applications::Ingress => ingress, + Clusters::Applications::CertManager => cert_manager, + Clusters::Applications::Crossplane => crossplane, + Clusters::Applications::Prometheus => prometheus, + Clusters::Applications::Runner => runner, + Clusters::Applications::Jupyter => jupyter, + Clusters::Applications::Knative => knative, + Clusters::Applications::ElasticStack => elastic_stack, + Clusters::Applications::Fluentd => fluentd + }.each do |application_class, expected_object| + application = cluster.find_or_build_application(application_class) + + expect(application).to eq(expected_object) + expect(application).to be_persisted + end + end + end + end + describe '#allow_user_defined_namespace?' do subject { cluster.allow_user_defined_namespace? } @@ -889,9 +943,9 @@ describe Clusters::Cluster, :use_clean_rails_memory_store_caching do end describe '#make_cleanup_errored!' do - NON_ERRORED_STATES = Clusters::Cluster.state_machines[:cleanup_status].states.keys - [:cleanup_errored] + non_errored_states = Clusters::Cluster.state_machines[:cleanup_status].states.keys - [:cleanup_errored] - NON_ERRORED_STATES.each do |state| + non_errored_states.each do |state| it "transitions cleanup_status from #{state} to cleanup_errored" do cluster = create(:cluster, state) @@ -948,6 +1002,22 @@ describe Clusters::Cluster, :use_clean_rails_memory_store_caching do end end + describe '#nodes' do + let(:cluster) { create(:cluster) } + + subject { cluster.nodes } + + it { is_expected.to be_nil } + + context 'with a cached status' do + before do + stub_reactive_cache(cluster, nodes: [kube_node]) + end + + it { is_expected.to eq([kube_node]) } + end + end + describe '#calculate_reactive_cache' do subject { cluster.calculate_reactive_cache } @@ -956,6 +1026,7 @@ describe Clusters::Cluster, :use_clean_rails_memory_store_caching do it 'does not populate the cache' do expect(cluster).not_to receive(:retrieve_connection_status) + expect(cluster).not_to receive(:retrieve_nodes) is_expected.to be_nil end @@ -964,12 +1035,12 @@ describe Clusters::Cluster, :use_clean_rails_memory_store_caching do context 'cluster is enabled' do let(:cluster) { create(:cluster, :provided_by_user, :group) } - context 'connection to the cluster is successful' do - before do - stub_kubeclient_discover(cluster.platform.api_url) - end + before do + stub_kubeclient_nodes_and_nodes_metrics(cluster.platform.api_url) + end - it { is_expected.to eq(connection_status: :connected) } + context 'connection to the cluster is successful' do + it { is_expected.to eq(connection_status: :connected, nodes: [kube_node.merge(kube_node_metrics)]) } end context 'cluster cannot be reached' do @@ -978,7 +1049,7 @@ describe Clusters::Cluster, :use_clean_rails_memory_store_caching do .and_raise(SocketError) end - it { is_expected.to eq(connection_status: :unreachable) } + it { is_expected.to eq(connection_status: :unreachable, nodes: []) } end context 'cluster cannot be authenticated to' do @@ -987,7 +1058,7 @@ describe Clusters::Cluster, :use_clean_rails_memory_store_caching do .and_raise(OpenSSL::X509::CertificateError.new("Certificate error")) end - it { is_expected.to eq(connection_status: :authentication_failure) } + it { is_expected.to eq(connection_status: :authentication_failure, nodes: []) } end describe 'Kubeclient::HttpError' do @@ -999,18 +1070,18 @@ 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) } + it { is_expected.to eq(connection_status: :authentication_failure, nodes: []) } context 'generic timeout' do let(:error_message) { 'Timed out connecting to server'} - it { is_expected.to eq(connection_status: :unreachable) } + it { is_expected.to eq(connection_status: :unreachable, nodes: []) } end context 'gateway timeout' do let(:error_message) { '504 Gateway Timeout for GET https://kubernetes.example.com/api/v1'} - it { is_expected.to eq(connection_status: :unreachable) } + it { is_expected.to eq(connection_status: :unreachable, nodes: []) } end end @@ -1020,11 +1091,12 @@ describe Clusters::Cluster, :use_clean_rails_memory_store_caching do .and_raise(StandardError) end - it { is_expected.to eq(connection_status: :unknown_failure) } + it { is_expected.to eq(connection_status: :unknown_failure, nodes: []) } it 'notifies Sentry' do expect(Gitlab::ErrorTracking).to receive(:track_exception) .with(instance_of(StandardError), hash_including(cluster_id: cluster.id)) + .twice subject end |