126 lines
3.8 KiB
Ruby
126 lines
3.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Clusters::Management::CreateProjectService do
|
|
let(:cluster) { create(:cluster, :project) }
|
|
let(:current_user) { create(:user) }
|
|
|
|
subject { described_class.new(cluster, current_user: current_user).execute }
|
|
|
|
shared_examples 'management project is not required' do
|
|
it 'does not create a project' do
|
|
expect { subject }.not_to change(cluster, :management_project)
|
|
end
|
|
end
|
|
|
|
context ':auto_create_cluster_management_project feature flag is disabled' do
|
|
before do
|
|
stub_feature_flags(auto_create_cluster_management_project: false)
|
|
end
|
|
|
|
include_examples 'management project is not required'
|
|
end
|
|
|
|
context 'cluster already has a management project' do
|
|
let(:cluster) { create(:cluster, :management_project) }
|
|
|
|
include_examples 'management project is not required'
|
|
end
|
|
|
|
shared_examples 'creates a management project' do
|
|
let(:project_params) do
|
|
{
|
|
name: "#{cluster.name} Cluster Management",
|
|
description: 'This project is automatically generated and will be used to manage your Kubernetes cluster. [More information](/help/user/clusters/management_project)',
|
|
namespace_id: namespace&.id,
|
|
visibility_level: Gitlab::VisibilityLevel::PRIVATE
|
|
}
|
|
end
|
|
|
|
it 'creates a management project' do
|
|
expect(Projects::CreateService).to receive(:new)
|
|
.with(current_user, project_params)
|
|
.and_call_original
|
|
|
|
subject
|
|
|
|
management_project = cluster.management_project
|
|
|
|
expect(management_project).to be_present
|
|
expect(management_project).to be_private
|
|
expect(management_project.name).to eq "#{cluster.name} Cluster Management"
|
|
expect(management_project.namespace).to eq namespace
|
|
end
|
|
end
|
|
|
|
context 'project cluster' do
|
|
let(:cluster) { create(:cluster, projects: [project]) }
|
|
let(:project) { create(:project, namespace: current_user.namespace) }
|
|
let(:namespace) { project.namespace }
|
|
|
|
include_examples 'creates a management project'
|
|
end
|
|
|
|
context 'group cluster' do
|
|
let(:cluster) { create(:cluster, :group, user: current_user) }
|
|
let(:namespace) { cluster.group }
|
|
|
|
before do
|
|
namespace.add_user(current_user, Gitlab::Access::MAINTAINER)
|
|
end
|
|
|
|
include_examples 'creates a management project'
|
|
end
|
|
|
|
context 'instance cluster' do
|
|
let(:cluster) { create(:cluster, :instance, user: current_user) }
|
|
let(:namespace) { create(:group) }
|
|
|
|
before do
|
|
stub_application_setting(instance_administrators_group: namespace)
|
|
|
|
namespace.add_user(current_user, Gitlab::Access::MAINTAINER)
|
|
end
|
|
|
|
include_examples 'creates a management project'
|
|
end
|
|
|
|
describe 'error handling' do
|
|
let(:project) { cluster.project }
|
|
|
|
before do
|
|
allow(Projects::CreateService).to receive(:new)
|
|
.and_return(double(execute: project))
|
|
end
|
|
|
|
context 'project is invalid' do
|
|
let(:errors) { double(full_messages: ["Error message"]) }
|
|
let(:project) { instance_double(Project, errors: errors) }
|
|
|
|
it { expect { subject }.to raise_error(described_class::CreateError, /Failed to create project/) }
|
|
end
|
|
|
|
context 'instance administrators group is missing' do
|
|
let(:cluster) { create(:cluster, :instance) }
|
|
|
|
it { expect { subject }.to raise_error(described_class::CreateError, /Instance administrators group not found/) }
|
|
end
|
|
|
|
context 'cluster is invalid' do
|
|
before do
|
|
allow(cluster).to receive(:update).and_return(false)
|
|
end
|
|
|
|
it { expect { subject }.to raise_error(described_class::CreateError, /Failed to update cluster/) }
|
|
end
|
|
|
|
context 'unknown cluster type' do
|
|
before do
|
|
allow(cluster).to receive(:cluster_type).and_return("unknown_type")
|
|
end
|
|
|
|
it { expect { subject }.to raise_error(NotImplementedError) }
|
|
end
|
|
end
|
|
end
|