diff options
Diffstat (limited to 'spec/models')
-rw-r--r-- | spec/models/clusters/cluster_spec.rb | 4 | ||||
-rw-r--r-- | spec/models/clusters/kubernetes_namespace_spec.rb | 84 | ||||
-rw-r--r-- | spec/models/clusters/platforms/kubernetes_spec.rb | 75 | ||||
-rw-r--r-- | spec/models/clusters/project_spec.rb | 2 |
4 files changed, 142 insertions, 23 deletions
diff --git a/spec/models/clusters/cluster_spec.rb b/spec/models/clusters/cluster_spec.rb index 34d321ec604..f5c4b0b66ae 100644 --- a/spec/models/clusters/cluster_spec.rb +++ b/spec/models/clusters/cluster_spec.rb @@ -11,6 +11,9 @@ describe Clusters::Cluster do it { is_expected.to have_one(:application_ingress) } it { is_expected.to have_one(:application_prometheus) } it { is_expected.to have_one(:application_runner) } + it { is_expected.to have_many(:kubernetes_namespaces) } + it { is_expected.to have_one(:kubernetes_namespace) } + it { is_expected.to delegate_method(:status).to(:provider) } it { is_expected.to delegate_method(:status_reason).to(:provider) } it { is_expected.to delegate_method(:status_name).to(:provider) } @@ -20,6 +23,7 @@ describe Clusters::Cluster do it { is_expected.to delegate_method(:available?).to(:application_helm).with_prefix } it { is_expected.to delegate_method(:available?).to(:application_ingress).with_prefix } it { is_expected.to delegate_method(:available?).to(:application_prometheus).with_prefix } + it { is_expected.to respond_to :project } describe '.enabled' do diff --git a/spec/models/clusters/kubernetes_namespace_spec.rb b/spec/models/clusters/kubernetes_namespace_spec.rb new file mode 100644 index 00000000000..dea58fa26c7 --- /dev/null +++ b/spec/models/clusters/kubernetes_namespace_spec.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Clusters::KubernetesNamespace, type: :model do + it { is_expected.to belong_to(:cluster_project) } + it { is_expected.to belong_to(:project) } + it { is_expected.to belong_to(:cluster) } + it { is_expected.to have_one(:platform_kubernetes) } + + describe 'namespace uniqueness validation' do + let(:cluster_project) { create(:cluster_project) } + + let(:kubernetes_namespace) do + build(:cluster_kubernetes_namespace, + cluster: cluster_project.cluster, + project: cluster_project.project, + cluster_project: cluster_project) + end + + subject { kubernetes_namespace } + + context 'when cluster is using the namespace' do + before do + create(:cluster_kubernetes_namespace, + cluster: cluster_project.cluster, + project: cluster_project.project, + cluster_project: cluster_project, + namespace: kubernetes_namespace.namespace) + end + + it { is_expected.not_to be_valid } + end + + context 'when cluster is not using the namespace' do + it { is_expected.to be_valid } + end + end + + describe '#set_namespace_and_service_account_to_default' do + let(:cluster) { platform.cluster } + let(:cluster_project) { create(:cluster_project, cluster: cluster) } + let(:kubernetes_namespace) do + create(:cluster_kubernetes_namespace, + cluster: cluster_project.cluster, + project: cluster_project.project, + cluster_project: cluster_project) + end + + describe 'namespace' do + let(:platform) { create(:cluster_platform_kubernetes, namespace: namespace) } + + subject { kubernetes_namespace.namespace } + + context 'when platform has a namespace assigned' do + let(:namespace) { 'platform-namespace' } + + it 'should copy the namespace' do + is_expected.to eq('platform-namespace') + end + end + + context 'when platform does not have namespace assigned' do + let(:namespace) { nil } + + it 'should set default namespace' do + project_slug = "#{cluster_project.project.path}-#{cluster_project.project_id}" + + is_expected.to eq(project_slug) + end + end + end + + describe 'service_account_name' do + let(:platform) { create(:cluster_platform_kubernetes) } + + subject { kubernetes_namespace.service_account_name } + + it 'should set a service account name based on namespace' do + is_expected.to eq("#{kubernetes_namespace.namespace}-service-account") + end + end + end +end diff --git a/spec/models/clusters/platforms/kubernetes_spec.rb b/spec/models/clusters/platforms/kubernetes_spec.rb index 66198d5ee2b..e13eb554add 100644 --- a/spec/models/clusters/platforms/kubernetes_spec.rb +++ b/spec/models/clusters/platforms/kubernetes_spec.rb @@ -9,6 +9,15 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching it { is_expected.to be_kind_of(ReactiveCaching) } it { is_expected.to respond_to :ca_pem } + it { is_expected.to validate_exclusion_of(:namespace).in_array(%w(gitlab-managed-apps)) } + it { is_expected.to validate_presence_of(:api_url) } + it { is_expected.to validate_presence_of(:token) } + + it { is_expected.to delegate_method(:project).to(:cluster) } + it { is_expected.to delegate_method(:enabled?).to(:cluster) } + it { is_expected.to delegate_method(:managed?).to(:cluster) } + it { is_expected.to delegate_method(:kubernetes_namespace).to(:cluster) } + describe 'before_validation' do context 'when namespace includes upper case' do let(:kubernetes) { create(:cluster_platform_kubernetes, :configured, namespace: namespace) } @@ -90,6 +99,28 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching it { expect(kubernetes.save).to be_falsey } end end + + describe 'when using reserved namespaces' do + subject { build(:cluster_platform_kubernetes, namespace: namespace) } + + context 'when no namespace is manually assigned' do + let(:namespace) { nil } + + it { is_expected.to be_valid } + end + + context 'when no reserved namespace is assigned' do + let(:namespace) { 'my-namespace' } + + it { is_expected.to be_valid } + end + + context 'when reserved namespace is assigned' do + let(:namespace) { 'gitlab-managed-apps' } + + it { is_expected.not_to be_valid } + end + end end describe '#kubeclient' do @@ -117,41 +148,39 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching end describe '#actual_namespace' do - subject { kubernetes.actual_namespace } - - let!(:cluster) { create(:cluster, :project, platform_kubernetes: kubernetes) } + let(:cluster) { create(:cluster, :project) } let(:project) { cluster.project } - let(:kubernetes) { create(:cluster_platform_kubernetes, :configured, namespace: namespace) } - context 'when namespace is present' do + let(:platform) do + create(:cluster_platform_kubernetes, + cluster: cluster, + namespace: namespace) + end + + subject { platform.actual_namespace } + + context 'with a namespace assigned' do let(:namespace) { 'namespace-123' } it { is_expected.to eq(namespace) } end - context 'when namespace is not present' do + context 'with no namespace assigned' do let(:namespace) { nil } - it { is_expected.to eq("#{project.path}-#{project.id}") } - end - end - - describe '#default_namespace' do - subject { kubernetes.send(:default_namespace) } + context 'when kubernetes namespace is present' do + let(:kubernetes_namespace) { create(:cluster_kubernetes_namespace, cluster: cluster) } - let(:kubernetes) { create(:cluster_platform_kubernetes, :configured) } + before do + kubernetes_namespace + end - context 'when cluster belongs to a project' do - let!(:cluster) { create(:cluster, :project, platform_kubernetes: kubernetes) } - let(:project) { cluster.project } - - it { is_expected.to eq("#{project.path}-#{project.id}") } - end - - context 'when cluster belongs to nothing' do - let!(:cluster) { create(:cluster, platform_kubernetes: kubernetes) } + it { is_expected.to eq(kubernetes_namespace.namespace) } + end - it { is_expected.to be_nil } + context 'when kubernetes namespace is not present' do + it { is_expected.to eq("#{project.path}-#{project.id}") } + end end end diff --git a/spec/models/clusters/project_spec.rb b/spec/models/clusters/project_spec.rb index 7d75d6ab345..82ef5a23c18 100644 --- a/spec/models/clusters/project_spec.rb +++ b/spec/models/clusters/project_spec.rb @@ -3,4 +3,6 @@ require 'spec_helper' describe Clusters::Project do it { is_expected.to belong_to(:cluster) } it { is_expected.to belong_to(:project) } + it { is_expected.to have_many(:kubernetes_namespaces) } + it { is_expected.to have_one(:kubernetes_namespace) } end |