summaryrefslogtreecommitdiff
path: root/spec/services/clusters/gcp/finalize_creation_service_spec.rb
blob: 0f484222228ca4a27464caf979689c8e040444c4 (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
require 'spec_helper'

describe Clusters::Gcp::FinalizeCreationService do
  include GoogleApi::CloudPlatformHelpers
  include KubernetesHelpers

  describe '#execute' do
    let(:cluster) { create(:cluster, :project, :providing_by_gcp) }
    let(:provider) { cluster.provider }
    let(:platform) { cluster.platform }
    let(:gcp_project_id) { provider.gcp_project_id }
    let(:zone) { provider.zone }
    let(:cluster_name) { cluster.name }

    subject { described_class.new.execute(provider) }

    shared_examples 'success' do
      it 'configures provider and kubernetes' do
        subject

        expect(provider).to be_created
      end
    end

    shared_examples 'error' do
      it 'sets an error to provider object' do
        subject

        expect(provider.reload).to be_errored
      end
    end

    context 'when suceeded to fetch gke cluster info' do
      let(:endpoint) { '111.111.111.111' }
      let(:api_url) { 'https://' + endpoint }
      let(:username) { 'sample-username' }
      let(:password) { 'sample-password' }
      let(:secret_name) { 'gitlab-token' }

      before do
        stub_cloud_platform_get_zone_cluster(
          gcp_project_id, zone, cluster_name,
          {
            endpoint: endpoint,
            username: username,
            password: password
          }
        )
      end

      context 'service account and token created' do
        before do
          stub_kubeclient_discover(api_url)
          stub_kubeclient_create_service_account(api_url)
          stub_kubeclient_create_secret(api_url)
        end

        shared_context 'kubernetes token successfully fetched' do
          let(:token) { 'sample-token' }

          before do
            stub_kubeclient_get_secret(
              api_url,
              {
                metadata_name: secret_name,
                token: Base64.encode64(token)
              } )
          end
        end

        context 'provider legacy_abac is enabled' do
          include_context 'kubernetes token successfully fetched'

          it_behaves_like 'success'

          it 'properly configures database models' do
            subject

            cluster.reload

            expect(provider.endpoint).to eq(endpoint)
            expect(platform.api_url).to eq(api_url)
            expect(platform.ca_cert).to eq(Base64.decode64(load_sample_cert))
            expect(platform.username).to eq(username)
            expect(platform.password).to eq(password)
            expect(platform).to be_abac
            expect(platform.authorization_type).to eq('abac')
            expect(platform.token).to eq(token)
          end
        end

        context 'provider legacy_abac is disabled' do
          before do
            provider.legacy_abac = false
          end

          include_context 'kubernetes token successfully fetched'

          context 'cluster role binding created' do
            before do
              stub_kubeclient_create_cluster_role_binding(api_url)
            end

            it_behaves_like 'success'

            it 'properly configures database models' do
              subject

              cluster.reload

              expect(provider.endpoint).to eq(endpoint)
              expect(platform.api_url).to eq(api_url)
              expect(platform.ca_cert).to eq(Base64.decode64(load_sample_cert))
              expect(platform.username).to eq(username)
              expect(platform.password).to eq(password)
              expect(platform).to be_rbac
              expect(platform.token).to eq(token)
            end
          end
        end

        context 'when token is empty' do
          before do
            stub_kubeclient_get_secret(api_url, token: '', metadata_name: secret_name)
          end

          it_behaves_like 'error'
        end

        context 'when failed to fetch kubernetes token' do
          before do
            stub_kubeclient_get_secret_error(api_url, secret_name)
          end

          it_behaves_like 'error'
        end

        context 'when service account fails to create' do
          before do
            stub_kubeclient_create_service_account_error(api_url)
          end

          it_behaves_like 'error'
        end
      end
    end

    context 'when failed to fetch gke cluster info' do
      before do
        stub_cloud_platform_get_zone_cluster_error(gcp_project_id, zone, cluster_name)
      end

      it_behaves_like 'error'
    end
  end
end