Commit e7f2be49 authored by Dylan Griffith's avatar Dylan Griffith

Make KUBECONFIG nil if KUBE_TOKEN is nil

Having an invalid KUBECONFIG without a token in it is not helpful. This
only became possible recently now that we are creating a separate
namespace and service account (and hence token) to send to the runners.
This led to somewhat surprising results when troubleshooting
https://gitlab.com/gitlab-org/gitlab-ce/issues/53879 as I found that the
KUBECONFIG was still being passed but KUBE_TOKEN was not. These things
really should have been linked.

Furthermore now that we are also using the [presence of KUBECONFIG to
decide whether or not to run build steps in Auto
DevOps](https://gitlab.com/gitlab-org/gitlab-ce/blob/294d15be3e9497e7b67e1f9131ce9d5c0d68406c/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml#L164)
I think it makes even more sense to ensure that KUBECONFIG is a complete
config if passed to a job.
parent 817bb190
...@@ -33,14 +33,12 @@ module Clusters ...@@ -33,14 +33,12 @@ module Clusters
end end
def predefined_variables def predefined_variables
config = YAML.dump(kubeconfig)
Gitlab::Ci::Variables::Collection.new.tap do |variables| Gitlab::Ci::Variables::Collection.new.tap do |variables|
variables variables
.append(key: 'KUBE_SERVICE_ACCOUNT', value: service_account_name.to_s) .append(key: 'KUBE_SERVICE_ACCOUNT', value: service_account_name.to_s)
.append(key: 'KUBE_NAMESPACE', value: namespace.to_s) .append(key: 'KUBE_NAMESPACE', value: namespace.to_s)
.append(key: 'KUBE_TOKEN', value: service_account_token.to_s, public: false) .append(key: 'KUBE_TOKEN', value: service_account_token.to_s, public: false)
.append(key: 'KUBECONFIG', value: config, public: false, file: true) .append(key: 'KUBECONFIG', value: kubeconfig, public: false, file: true)
end end
end end
......
...@@ -90,13 +90,11 @@ module Clusters ...@@ -90,13 +90,11 @@ module Clusters
# Clusters::KubernetesNamespace, so once migration has been completed, # Clusters::KubernetesNamespace, so once migration has been completed,
# this 'else' branch will be removed. For more information, please see # this 'else' branch will be removed. For more information, please see
# https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/22433 # https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/22433
config = YAML.dump(kubeconfig)
variables variables
.append(key: 'KUBE_URL', value: api_url) .append(key: 'KUBE_URL', value: api_url)
.append(key: 'KUBE_TOKEN', value: token, public: false) .append(key: 'KUBE_TOKEN', value: token, public: false)
.append(key: 'KUBE_NAMESPACE', value: actual_namespace) .append(key: 'KUBE_NAMESPACE', value: actual_namespace)
.append(key: 'KUBECONFIG', value: config, public: false, file: true) .append(key: 'KUBECONFIG', value: kubeconfig, public: false, file: true)
end end
end end
end end
......
...@@ -110,14 +110,12 @@ class KubernetesService < DeploymentService ...@@ -110,14 +110,12 @@ class KubernetesService < DeploymentService
# Clusters::Platforms::Kubernetes, it won't be used on this method # Clusters::Platforms::Kubernetes, it won't be used on this method
# as it's only needed for Clusters::Cluster. # as it's only needed for Clusters::Cluster.
def predefined_variables(project:) def predefined_variables(project:)
config = YAML.dump(kubeconfig)
Gitlab::Ci::Variables::Collection.new.tap do |variables| Gitlab::Ci::Variables::Collection.new.tap do |variables|
variables variables
.append(key: 'KUBE_URL', value: api_url) .append(key: 'KUBE_URL', value: api_url)
.append(key: 'KUBE_TOKEN', value: token, public: false) .append(key: 'KUBE_TOKEN', value: token, public: false)
.append(key: 'KUBE_NAMESPACE', value: actual_namespace) .append(key: 'KUBE_NAMESPACE', value: actual_namespace)
.append(key: 'KUBECONFIG', value: config, public: false, file: true) .append(key: 'KUBECONFIG', value: kubeconfig, public: false, file: true)
if ca_pem.present? if ca_pem.present?
variables variables
......
---
title: Make KUBECONFIG nil if KUBE_TOKEN is nil
merge_request: 23414
author:
type: fixed
...@@ -85,6 +85,8 @@ module Gitlab ...@@ -85,6 +85,8 @@ module Gitlab
end end
def to_kubeconfig(url:, namespace:, token:, ca_pem: nil) def to_kubeconfig(url:, namespace:, token:, ca_pem: nil)
return unless token.present?
config = { config = {
apiVersion: 'v1', apiVersion: 'v1',
clusters: [ clusters: [
...@@ -113,7 +115,7 @@ module Gitlab ...@@ -113,7 +115,7 @@ module Gitlab
kubeconfig_embed_ca_pem(config, ca_pem) if ca_pem kubeconfig_embed_ca_pem(config, ca_pem) if ca_pem
config.deep_stringify_keys YAML.dump(config.deep_stringify_keys)
end end
private private
......
...@@ -48,26 +48,30 @@ describe Gitlab::Kubernetes do ...@@ -48,26 +48,30 @@ describe Gitlab::Kubernetes do
end end
describe '#to_kubeconfig' do describe '#to_kubeconfig' do
let(:token) { 'TOKEN' }
let(:ca_pem) { 'PEM' }
subject do subject do
to_kubeconfig( to_kubeconfig(
url: 'https://kube.domain.com', url: 'https://kube.domain.com',
namespace: 'NAMESPACE', namespace: 'NAMESPACE',
token: 'TOKEN', token: token,
ca_pem: ca_pem) ca_pem: ca_pem
)
end end
context 'when CA PEM is provided' do it { expect(YAML.safe_load(subject)).to eq(YAML.load_file(expand_fixture_path('config/kubeconfig.yml'))) }
let(:ca_pem) { 'PEM' }
let(:path) { expand_fixture_path('config/kubeconfig.yml') }
it { is_expected.to eq(YAML.load_file(path)) }
end
context 'when CA PEM is not provided' do context 'when CA PEM is not provided' do
let(:ca_pem) { nil } let(:ca_pem) { nil }
let(:path) { expand_fixture_path('config/kubeconfig-without-ca.yml') }
it { is_expected.to eq(YAML.load_file(path)) } it { expect(YAML.safe_load(subject)).to eq(YAML.load_file(expand_fixture_path('config/kubeconfig-without-ca.yml'))) }
end
context 'when token is not provided' do
let(:token) { nil }
it { is_expected.to be_nil }
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment