Don't autofill kubernetes namespace
This commit is contained in:
parent
fa65b65b0f
commit
e6ffb1580b
|
@ -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
|
||||||
|
end
|
||||||
|
|
||||||
validates :namespace,
|
validates :namespace,
|
||||||
|
allow_blank: true,
|
||||||
|
length: 1..63,
|
||||||
|
if: :activated?,
|
||||||
format: {
|
format: {
|
||||||
with: Gitlab::Regex.kubernetes_namespace_regex,
|
with: Gitlab::Regex.kubernetes_namespace_regex,
|
||||||
message: Gitlab::Regex.kubernetes_namespace_regex_message,
|
message: Gitlab::Regex.kubernetes_namespace_regex_message
|
||||||
},
|
}
|
||||||
length: 1..63
|
|
||||||
end
|
|
||||||
|
|
||||||
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
|
||||||
{ 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
|
||||||
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
|
||||||
{ 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 @@
|
||||||
%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
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: Don't fill in the default kubernetes namespace
|
||||||
|
merge_request:
|
||||||
|
author:
|
|
@ -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
|
||||||
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
|
||||||
'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,21 +67,13 @@ 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
|
|
||||||
let(:namespace_name) { "#{project.path}-#{project.id}" }
|
|
||||||
|
|
||||||
it 'defaults to the project name with ID' do
|
|
||||||
expect(described_class.new(project: project).namespace).to eq(namespace_name)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'without a project' do
|
context 'without a project' do
|
||||||
it 'leaves the namespace unset' do
|
it 'leaves the namespace unset' do
|
||||||
expect(described_class.new.namespace).to be_nil
|
expect(described_class.new.namespace).to be_nil
|
||||||
|
@ -88,6 +81,30 @@ describe KubernetesService, models: true, caching: true do
|
||||||
end
|
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 'sets the namespace to the default' do
|
||||||
|
expect(kube_namespace).not_to be_nil
|
||||||
|
expect(kube_namespace[:placeholder]).to eq(subject.class::TEMPLATE_PLACEHOLDER)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with associated project' do
|
||||||
|
before { subject.project = project }
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
describe '#test' do
|
describe '#test' do
|
||||||
before do
|
before do
|
||||||
stub_kubeclient_discover
|
stub_kubeclient_discover
|
||||||
|
@ -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
|
||||||
|
before { subject.namespace = 'my-project' }
|
||||||
|
|
||||||
|
it 'sets the variables' do
|
||||||
expect(subject.predefined_variables).to include(
|
expect(subject.predefined_variables).to include(
|
||||||
{ key: 'KUBE_URL', value: 'https://kube.domain.com', public: true }
|
{ 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
|
||||||
|
|
||||||
|
context 'no namespace provided' do
|
||||||
|
it 'sets the variables' do
|
||||||
|
expect(subject.predefined_variables).to include(
|
||||||
|
{ key: 'KUBE_URL', value: 'https://kube.domain.com', public: true },
|
||||||
|
{ 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
|
end
|
||||||
|
|
||||||
it 'sets KUBE_TOKEN' 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_TOKEN', value: 'token', public: false }
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'sets KUBE_NAMESPACE' 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_NAMESPACE', value: 'my-project', public: true }
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'sets KUBE_CA_PEM' do
|
|
||||||
expect(subject.predefined_variables).to include(
|
|
||||||
{ key: 'KUBE_CA_PEM', value: 'CA PEM DATA', public: true }
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'sets KUBE_CA_PEM_FILE' do
|
|
||||||
expect(subject.predefined_variables).to include(
|
|
||||||
{ key: 'KUBE_CA_PEM_FILE', value: 'CA PEM DATA', public: true, file: true }
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue