Commit e6ffb158 authored by Z.J. van de Weg's avatar Z.J. van de Weg

Don't autofill kubernetes namespace

parent fa65b65b
...@@ -22,22 +22,21 @@ class KubernetesService < DeploymentService ...@@ -22,22 +22,21 @@ class KubernetesService < DeploymentService
with_options presence: true, if: :activated? do with_options presence: true, if: :activated? do
validates :api_url, url: true validates :api_url, url: true
validates :token validates :token
validates :namespace,
format: {
with: Gitlab::Regex.kubernetes_namespace_regex,
message: Gitlab::Regex.kubernetes_namespace_regex_message,
},
length: 1..63
end end
validates :namespace,
allow_blank: true,
length: 1..63,
if: :activated?,
format: {
with: Gitlab::Regex.kubernetes_namespace_regex,
message: Gitlab::Regex.kubernetes_namespace_regex_message
}
after_save :clear_reactive_cache! after_save :clear_reactive_cache!
def initialize_properties def initialize_properties
if properties.nil? self.properties = {} if properties.nil?
self.properties = {}
self.namespace = "#{project.path}-#{project.id}" if project.present?
end
end end
def title def title
...@@ -62,7 +61,7 @@ class KubernetesService < DeploymentService ...@@ -62,7 +61,7 @@ class KubernetesService < DeploymentService
{ type: 'text', { type: 'text',
name: 'namespace', name: 'namespace',
title: 'Kubernetes namespace', title: 'Kubernetes namespace',
placeholder: 'Kubernetes namespace' }, placeholder: namespace_placeholder },
{ type: 'text', { type: 'text',
name: 'api_url', name: 'api_url',
title: 'API URL', title: 'API URL',
...@@ -92,7 +91,7 @@ class KubernetesService < DeploymentService ...@@ -92,7 +91,7 @@ class KubernetesService < DeploymentService
variables = [ variables = [
{ key: 'KUBE_URL', value: api_url, public: true }, { key: 'KUBE_URL', value: api_url, public: true },
{ key: 'KUBE_TOKEN', value: token, public: false }, { key: 'KUBE_TOKEN', value: token, public: false },
{ key: 'KUBE_NAMESPACE', value: namespace, public: true } { key: 'KUBE_NAMESPACE', value: namespace_variable, public: true }
] ]
if ca_pem.present? if ca_pem.present?
...@@ -135,8 +134,26 @@ class KubernetesService < DeploymentService ...@@ -135,8 +134,26 @@ class KubernetesService < DeploymentService
{ pods: pods } { pods: pods }
end end
TEMPLATE_PLACEHOLDER = 'Kubernetes namespace'.freeze
private private
def namespace_placeholder
default_namespace || TEMPLATE_PLACEHOLDER
end
def namespace_variable
if namespace.present?
namespace
else
default_namespace
end
end
def default_namespace
"#{project.path}-#{project.id}" if project.present?
end
def build_kubeclient!(api_path: 'api', api_version: 'v1') def build_kubeclient!(api_path: 'api', api_version: 'v1')
raise "Incomplete settings" unless api_url && namespace && token raise "Incomplete settings" unless api_url && namespace && token
......
...@@ -238,6 +238,8 @@ ...@@ -238,6 +238,8 @@
%ul %ul
%li Be careful. Renaming a project's repository can have unintended side effects. %li Be careful. Renaming a project's repository can have unintended side effects.
%li You will need to update your local repositories to point to the new location. %li You will need to update your local repositories to point to the new location.
- if @project.deployment_services.any?
%li Your deployment services will be broken, you will need to manually fix the services after renaming.
= f.submit 'Rename project', class: "btn btn-warning" = f.submit 'Rename project', class: "btn btn-warning"
- if can?(current_user, :change_namespace, @project) - if can?(current_user, :change_namespace, @project)
%hr %hr
......
---
title: Don't fill in the default kubernetes namespace
merge_request:
author:
...@@ -4,7 +4,7 @@ describe KubernetesService, models: true, caching: true do ...@@ -4,7 +4,7 @@ describe KubernetesService, models: true, caching: true do
include KubernetesHelpers include KubernetesHelpers
include ReactiveCachingHelpers include ReactiveCachingHelpers
let(:project) { create(:kubernetes_project) } let(:project) { build_stubbed(:kubernetes_project) }
let(:service) { project.kubernetes_service } let(:service) { project.kubernetes_service }
# We use Kubeclient to interactive with the Kubernetes API. It will # We use Kubeclient to interactive with the Kubernetes API. It will
...@@ -32,7 +32,8 @@ describe KubernetesService, models: true, caching: true do ...@@ -32,7 +32,8 @@ describe KubernetesService, models: true, caching: true do
describe 'Validations' do describe 'Validations' do
context 'when service is active' do context 'when service is active' do
before { subject.active = true } before { subject.active = true }
it { is_expected.to validate_presence_of(:namespace) }
it { is_expected.not_to validate_presence_of(:namespace) }
it { is_expected.to validate_presence_of(:api_url) } it { is_expected.to validate_presence_of(:api_url) }
it { is_expected.to validate_presence_of(:token) } it { is_expected.to validate_presence_of(:token) }
...@@ -55,7 +56,7 @@ describe KubernetesService, models: true, caching: true do ...@@ -55,7 +56,7 @@ describe KubernetesService, models: true, caching: true do
'a.b' => false, 'a.b' => false,
'a*b' => false, 'a*b' => false,
}.each do |namespace, validity| }.each do |namespace, validity|
it "should validate #{namespace} as #{validity ? 'valid' : 'invalid'}" do it "validates #{namespace} as #{validity ? 'valid' : 'invalid'}" do
subject.namespace = namespace subject.namespace = namespace
expect(subject.valid?).to eq(validity) expect(subject.valid?).to eq(validity)
...@@ -66,24 +67,40 @@ describe KubernetesService, models: true, caching: true do ...@@ -66,24 +67,40 @@ describe KubernetesService, models: true, caching: true do
context 'when service is inactive' do context 'when service is inactive' do
before { subject.active = false } before { subject.active = false }
it { is_expected.not_to validate_presence_of(:namespace) }
it { is_expected.not_to validate_presence_of(:api_url) } it { is_expected.not_to validate_presence_of(:api_url) }
it { is_expected.not_to validate_presence_of(:token) } it { is_expected.not_to validate_presence_of(:token) }
end end
end end
describe '#initialize_properties' do describe '#initialize_properties' do
context 'with a project' do context 'without a project' do
let(:namespace_name) { "#{project.path}-#{project.id}" } it 'leaves the namespace unset' do
expect(described_class.new.namespace).to be_nil
end
end
end
describe '#fields' do
let(:kube_namespace) do
subject.fields.find { |h| h[:name] == 'namespace' }
end
context 'as template' do
before { subject.template = true }
it 'defaults to the project name with ID' do it 'sets the namespace to the default' do
expect(described_class.new(project: project).namespace).to eq(namespace_name) expect(kube_namespace).not_to be_nil
expect(kube_namespace[:placeholder]).to eq(subject.class::TEMPLATE_PLACEHOLDER)
end end
end end
context 'without a project' do context 'with associated project' do
it 'leaves the namespace unset' do before { subject.project = project }
expect(described_class.new.namespace).to be_nil
it 'sets the namespace to the default' do
expect(kube_namespace).not_to be_nil
expect(kube_namespace[:placeholder]).to match(/\A#{Gitlab::Regex::PATH_REGEX_STR}-\d+\z/)
end end
end end
end end
...@@ -138,38 +155,40 @@ describe KubernetesService, models: true, caching: true do ...@@ -138,38 +155,40 @@ describe KubernetesService, models: true, caching: true do
before do before do
subject.api_url = 'https://kube.domain.com' subject.api_url = 'https://kube.domain.com'
subject.token = 'token' subject.token = 'token'
subject.namespace = 'my-project'
subject.ca_pem = 'CA PEM DATA' subject.ca_pem = 'CA PEM DATA'
subject.project = project
end end
it 'sets KUBE_URL' do context 'namespace is provided' do
expect(subject.predefined_variables).to include( before { subject.namespace = 'my-project' }
{ key: 'KUBE_URL', value: 'https://kube.domain.com', public: true }
)
end
it 'sets KUBE_TOKEN' do it 'sets the variables' do
expect(subject.predefined_variables).to include( expect(subject.predefined_variables).to include(
{ key: 'KUBE_TOKEN', value: 'token', public: false } { key: 'KUBE_URL', value: 'https://kube.domain.com', public: true },
) { key: 'KUBE_TOKEN', value: 'token', public: false },
{ key: 'KUBE_NAMESPACE', value: 'my-project', public: true },
{ key: 'KUBE_CA_PEM', value: 'CA PEM DATA', public: true },
{ key: 'KUBE_CA_PEM_FILE', value: 'CA PEM DATA', public: true, file: true },
)
end
end end
it 'sets KUBE_NAMESPACE' do context 'no namespace provided' do
expect(subject.predefined_variables).to include( it 'sets the variables' do
{ key: 'KUBE_NAMESPACE', value: 'my-project', public: true } expect(subject.predefined_variables).to include(
) { key: 'KUBE_URL', value: 'https://kube.domain.com', public: true },
end { key: 'KUBE_TOKEN', value: 'token', public: false },
{ key: 'KUBE_CA_PEM', value: 'CA PEM DATA', public: true },
{ key: 'KUBE_CA_PEM_FILE', value: 'CA PEM DATA', public: true, file: true },
)
end
it 'sets KUBE_CA_PEM' do it 'sets the KUBE_NAMESPACE' do
expect(subject.predefined_variables).to include( kube_namespace = subject.predefined_variables.find { |h| h[:key] == 'KUBE_NAMESPACE' }
{ key: 'KUBE_CA_PEM', value: 'CA PEM DATA', public: true }
)
end
it 'sets KUBE_CA_PEM_FILE' do expect(kube_namespace).not_to be_nil
expect(subject.predefined_variables).to include( expect(kube_namespace[:value]).to match(/\A#{Gitlab::Regex::PATH_REGEX_STR}-\d+\z/)
{ key: 'KUBE_CA_PEM_FILE', value: 'CA PEM DATA', public: true, file: true } end
)
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