install_command_spec.rb 8.0 KB
Newer Older
1
require 'spec_helper'
2 3

describe Gitlab::Kubernetes::Helm::InstallCommand do
4 5
  let(:files) { { 'ca.pem': 'some file content' } }
  let(:repository) { 'https://repository.example.com' }
6
  let(:rbac) { false }
7
  let(:version) { '1.2.3' }
8 9
  let(:preinstall) { nil }
  let(:postinstall) { nil }
10 11 12 13 14

  let(:install_command) do
    described_class.new(
      name: 'app-name',
      chart: 'chart-name',
15
      rbac: rbac,
16
      files: files,
17
      version: version,
18 19 20
      repository: repository,
      preinstall: preinstall,
      postinstall: postinstall
21 22
    )
  end
23

24 25 26 27 28 29 30 31 32
  let(:tls_flags) do
    <<~EOS.squish
    --tls
    --tls-ca-cert /data/helm/app-name/config/ca.pem
    --tls-cert /data/helm/app-name/config/cert.pem
    --tls-key /data/helm/app-name/config/key.pem
    EOS
  end

33
  subject { install_command }
34

35 36 37
  it_behaves_like 'helm commands' do
    let(:commands) do
      <<~EOS
38
      helm init --upgrade
39
      for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
40
      helm repo add app-name https://repository.example.com
41
      helm repo update
42 43 44 45 46 47
      #{helm_install_comand}
      EOS
    end

    let(:helm_install_comand) do
      <<~EOS.squish
48 49 50 51
      helm upgrade app-name chart-name
        --install
        --reset-values
        #{tls_flags}
52
        --version 1.2.3
A
Amit Rathi 已提交
53
        --set rbac.create\\=false,rbac.enabled\\=false
54
        --namespace gitlab-managed-apps
55
        -f /data/helm/app-name/config/values.yaml
56
      EOS
57 58 59
    end
  end

60 61 62 63 64 65
  context 'when rbac is true' do
    let(:rbac) { true }

    it_behaves_like 'helm commands' do
      let(:commands) do
        <<~EOS
66
        helm init --upgrade
67
        for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
68
        helm repo add app-name https://repository.example.com
69
        helm repo update
70 71 72 73 74 75
        #{helm_install_command}
        EOS
      end

      let(:helm_install_command) do
        <<~EOS.squish
76 77 78 79
        helm upgrade app-name chart-name
          --install
          --reset-values
          #{tls_flags}
80 81 82
          --version 1.2.3
          --set rbac.create\\=true,rbac.enabled\\=true
          --namespace gitlab-managed-apps
83
          -f /data/helm/app-name/config/values.yaml
84 85 86 87 88
        EOS
      end
    end
  end

89 90
  context 'when there is no repository' do
    let(:repository) { nil }
91 92 93 94

    it_behaves_like 'helm commands' do
      let(:commands) do
        <<~EOS
95
        helm init --upgrade
96
        for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
97 98 99 100 101 102
        #{helm_install_command}
        EOS
      end

      let(:helm_install_command) do
        <<~EOS.squish
103 104 105 106
        helm upgrade app-name chart-name
          --install
          --reset-values
          #{tls_flags}
107
          --version 1.2.3
A
Amit Rathi 已提交
108
          --set rbac.create\\=false,rbac.enabled\\=false
109
          --namespace gitlab-managed-apps
110
          -f /data/helm/app-name/config/values.yaml
111 112
        EOS
      end
113
    end
114
  end
115

116 117 118 119 120 121
  context 'when there is a pre-install script' do
    let(:preinstall) { ['/bin/date', '/bin/true'] }

    it_behaves_like 'helm commands' do
      let(:commands) do
        <<~EOS
122
        helm init --upgrade
123
        for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
124
        helm repo add app-name https://repository.example.com
125
        helm repo update
126 127
        /bin/date
        /bin/true
128 129 130 131 132
        #{helm_install_command}
        EOS
      end

      let(:helm_install_command) do
133 134 135 136 137 138 139 140 141
        <<~EOS.squish
        helm upgrade app-name chart-name
          --install
          --reset-values
          #{tls_flags}
          --version 1.2.3
          --set rbac.create\\=false,rbac.enabled\\=false
          --namespace gitlab-managed-apps
          -f /data/helm/app-name/config/values.yaml
142 143 144 145 146 147 148 149 150 151 152
        EOS
      end
    end
  end

  context 'when there is a post-install script' do
    let(:postinstall) { ['/bin/date', "/bin/false\n"] }

    it_behaves_like 'helm commands' do
      let(:commands) do
        <<~EOS
153
        helm init --upgrade
154
        for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
155
        helm repo add app-name https://repository.example.com
156
        helm repo update
157
        #{helm_install_command}
158 159
        /bin/date
        /bin/false
160 161 162 163
        EOS
      end

      let(:helm_install_command) do
164 165 166 167 168 169 170 171 172
        <<~EOS.squish
        helm upgrade app-name chart-name
          --install
          --reset-values
          #{tls_flags}
          --version 1.2.3
          --set rbac.create\\=false,rbac.enabled\\=false
          --namespace gitlab-managed-apps
          -f /data/helm/app-name/config/values.yaml
173 174 175 176 177
        EOS
      end
    end
  end

178 179
  context 'when there is no ca.pem file' do
    let(:files) { { 'file.txt': 'some content' } }
180 181 182 183

    it_behaves_like 'helm commands' do
      let(:commands) do
        <<~EOS
184
        helm init --upgrade
185
        for i in $(seq 1 30); do helm version && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
186
        helm repo add app-name https://repository.example.com
187
        helm repo update
188 189 190 191 192 193
        #{helm_install_command}
        EOS
      end

      let(:helm_install_command) do
        <<~EOS.squish
194 195 196
        helm upgrade app-name chart-name
           --install
           --reset-values
197
           --version 1.2.3
A
Amit Rathi 已提交
198
           --set rbac.create\\=false,rbac.enabled\\=false
199
           --namespace gitlab-managed-apps
200
           -f /data/helm/app-name/config/values.yaml
201 202
        EOS
      end
203
    end
204 205
  end

206 207
  context 'when there is no version' do
    let(:version) { nil }
208

209 210 211
    it_behaves_like 'helm commands' do
      let(:commands) do
        <<~EOS
212
        helm init --upgrade
213
        for i in $(seq 1 30); do helm version #{tls_flags} && s=0 && break || s=$?; sleep 1s; echo \"Retrying ($i)...\"; done; (exit $s)
214
        helm repo add app-name https://repository.example.com
215
        helm repo update
216 217 218 219 220 221
        #{helm_install_command}
        EOS
      end

      let(:helm_install_command) do
        <<~EOS.squish
222 223 224 225
        helm upgrade app-name chart-name
          --install
          --reset-values
          #{tls_flags}
226
          --set rbac.create\\=false,rbac.enabled\\=false
227
          --namespace gitlab-managed-apps
228
          -f /data/helm/app-name/config/values.yaml
229
        EOS
230 231
      end
    end
232
  end
233

234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
  describe '#rbac?' do
    subject { install_command.rbac? }

    context 'rbac is enabled' do
      let(:rbac) { true }

      it { is_expected.to be_truthy }
    end

    context 'rbac is not enabled' do
      let(:rbac) { false }

      it { is_expected.to be_falsey }
    end
  end

  describe '#pod_resource' do
    subject { install_command.pod_resource }

    context 'rbac is enabled' do
      let(:rbac) { true }

      it 'generates a pod that uses the tiller serviceAccountName' do
        expect(subject.spec.serviceAccountName).to eq('tiller')
      end
    end

    context 'rbac is not enabled' do
      let(:rbac) { false }

      it 'generates a pod that uses the default serviceAccountName' do
        expect(subject.spec.serviceAcccountName).to be_nil
      end
    end
  end

270 271 272
  describe '#config_map_resource' do
    let(:metadata) do
      {
273 274 275
        name: "values-content-configuration-app-name",
        namespace: 'gitlab-managed-apps',
        labels: { name: "values-content-configuration-app-name" }
276
      }
277
    end
278

279
    let(:resource) { ::Kubeclient::Resource.new(metadata: metadata, data: files) }
280

281
    subject { install_command.config_map_resource }
282

283 284
    it 'returns a KubeClient resource with config map content for the application' do
      is_expected.to eq(resource)
285
    end
286
  end
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302

  describe '#service_account_resource' do
    subject { install_command.service_account_resource }

    it 'returns nothing' do
      is_expected.to be_nil
    end
  end

  describe '#cluster_role_binding_resource' do
    subject { install_command.cluster_role_binding_resource }

    it 'returns nothing' do
      is_expected.to be_nil
    end
  end
303
end