summaryrefslogtreecommitdiff
path: root/spec/models/concerns/deployment_platform_spec.rb
blob: e2fc8a5d127a116ea63592be94ee9d9ea2b2cdec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# frozen_string_literal: true

require 'rails_helper'

describe DeploymentPlatform do
  let(:project) { create(:project) }

  shared_examples '#deployment_platform' do
    subject { project.deployment_platform }

    context 'with no Kubernetes configuration on CI/CD, no Kubernetes Service' do
      it { is_expected.to be_nil }
    end

    context 'when project has configured kubernetes from CI/CD > Clusters' do
      let!(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }
      let(:platform_kubernetes) { cluster.platform_kubernetes }

      it 'returns the Kubernetes platform' do
        expect(subject).to eq(platform_kubernetes)
      end

      context 'with a group level kubernetes cluster' do
        let(:group_cluster) { create(:cluster, :provided_by_gcp, :group) }

        before do
          project.update!(group: group_cluster.group)
        end

        it 'returns the Kubernetes platform from the project cluster' do
          expect(subject).to eq(platform_kubernetes)
        end
      end
    end

    context 'when group has configured kubernetes cluster' do
      let!(:group_cluster) { create(:cluster, :provided_by_gcp, :group) }
      let(:group) { group_cluster.group }

      before do
        project.update!(group: group)
      end

      it 'returns the Kubernetes platform' do
        is_expected.to eq(group_cluster.platform_kubernetes)
      end

      context 'when child group has configured kubernetes cluster', :nested_groups do
        let!(:child_group1_cluster) { create(:cluster, :provided_by_gcp, :group) }
        let(:child_group1) { child_group1_cluster.group }

        before do
          project.update!(group: child_group1)
          child_group1.update!(parent: group)
        end

        it 'returns the Kubernetes platform for the child group' do
          is_expected.to eq(child_group1_cluster.platform_kubernetes)
        end

        context 'deeply nested group' do
          let!(:child_group2_cluster) { create(:cluster, :provided_by_gcp, :group) }
          let(:child_group2) { child_group2_cluster.group }

          before do
            child_group2.update!(parent: child_group1)
            project.update!(group: child_group2)
          end

          it 'returns most nested group cluster Kubernetes platform' do
            is_expected.to eq(child_group2_cluster.platform_kubernetes)
          end

          context 'cluster in the middle of hierarchy is disabled' do
            before do
              child_group2_cluster.update!(enabled: false)
            end

            it 'returns closest enabled Kubenetes platform' do
              is_expected.to eq(child_group1_cluster.platform_kubernetes)
            end
          end
        end
      end
    end
  end

  context 'legacy implementation' do
    before do
      stub_feature_flags(clusters_cte: false)
    end

    include_examples '#deployment_platform'
  end

  context 'CTE implementation' do
    before do
      stub_feature_flags(clusters_cte: true)
    end

    include_examples '#deployment_platform'
  end
end