Skip to content
Snippets Groups Projects
Commit 33813f99 authored by GitLab Bot's avatar GitLab Bot
Browse files

Add latest changes from gitlab-org/gitlab@master

parent dc0622db
No related branches found
No related tags found
No related merge requests found
Showing with 238 additions and 38 deletions
# frozen_string_literal: true
require 'spec_helper'
require Rails.root.join('db', 'post_migrate', '20191017045817_schedule_fix_gitlab_com_pages_access_level.rb')
 
Loading
Loading
# frozen_string_literal: true
require 'spec_helper'
 
describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
Loading
Loading
@@ -63,7 +65,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
let(:data_store) { :redis }
 
before do
build_trace_chunk.send(:unsafe_set_data!, 'Sample data in redis')
build_trace_chunk.send(:unsafe_set_data!, +'Sample data in redis')
end
 
it { is_expected.to eq('Sample data in redis') }
Loading
Loading
@@ -71,7 +73,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
 
context 'when data_store is database' do
let(:data_store) { :database }
let(:raw_data) { 'Sample data in database' }
let(:raw_data) { +'Sample data in database' }
 
it { is_expected.to eq('Sample data in database') }
end
Loading
Loading
@@ -80,7 +82,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
let(:data_store) { :fog }
 
before do
build_trace_chunk.send(:unsafe_set_data!, 'Sample data in fog')
build_trace_chunk.send(:unsafe_set_data!, +'Sample data in fog')
end
 
it { is_expected.to eq('Sample data in fog') }
Loading
Loading
@@ -90,7 +92,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
describe '#append' do
subject { build_trace_chunk.append(new_data, offset) }
 
let(:new_data) { 'Sample new data' }
let(:new_data) { +'Sample new data' }
let(:offset) { 0 }
let(:merged_data) { data + new_data.to_s }
 
Loading
Loading
@@ -143,7 +145,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
end
 
context 'when new_data is empty' do
let(:new_data) { '' }
let(:new_data) { +'' }
 
it 'does not append' do
subject
Loading
Loading
@@ -172,7 +174,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
 
shared_examples_for 'Scheduling sidekiq worker to flush data to persist store' do
context 'when new data fulfilled chunk size' do
let(:new_data) { 'a' * described_class::CHUNK_SIZE }
let(:new_data) { +'a' * described_class::CHUNK_SIZE }
 
it 'schedules trace chunk flush worker' do
expect(Ci::BuildTraceChunkFlushWorker).to receive(:perform_async).once
Loading
Loading
@@ -194,7 +196,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
 
shared_examples_for 'Scheduling no sidekiq worker' do
context 'when new data fulfilled chunk size' do
let(:new_data) { 'a' * described_class::CHUNK_SIZE }
let(:new_data) { +'a' * described_class::CHUNK_SIZE }
 
it 'does not schedule trace chunk flush worker' do
expect(Ci::BuildTraceChunkFlushWorker).not_to receive(:perform_async)
Loading
Loading
@@ -219,7 +221,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
let(:data_store) { :redis }
 
context 'when there are no data' do
let(:data) { '' }
let(:data) { +'' }
 
it 'has no data' do
expect(build_trace_chunk.data).to be_empty
Loading
Loading
@@ -230,7 +232,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
end
 
context 'when there are some data' do
let(:data) { 'Sample data in redis' }
let(:data) { +'Sample data in redis' }
 
before do
build_trace_chunk.send(:unsafe_set_data!, data)
Loading
Loading
@@ -249,7 +251,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
let(:data_store) { :database }
 
context 'when there are no data' do
let(:data) { '' }
let(:data) { +'' }
 
it 'has no data' do
expect(build_trace_chunk.data).to be_empty
Loading
Loading
@@ -260,7 +262,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
end
 
context 'when there are some data' do
let(:raw_data) { 'Sample data in database' }
let(:raw_data) { +'Sample data in database' }
let(:data) { raw_data }
 
it 'has data' do
Loading
Loading
@@ -276,7 +278,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
let(:data_store) { :fog }
 
context 'when there are no data' do
let(:data) { '' }
let(:data) { +'' }
 
it 'has no data' do
expect(build_trace_chunk.data).to be_empty
Loading
Loading
@@ -287,7 +289,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
end
 
context 'when there are some data' do
let(:data) { 'Sample data in fog' }
let(:data) { +'Sample data in fog' }
 
before do
build_trace_chunk.send(:unsafe_set_data!, data)
Loading
Loading
@@ -332,7 +334,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
 
context 'when data_store is redis' do
let(:data_store) { :redis }
let(:data) { 'Sample data in redis' }
let(:data) { +'Sample data in redis' }
 
before do
build_trace_chunk.send(:unsafe_set_data!, data)
Loading
Loading
@@ -343,7 +345,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
 
context 'when data_store is database' do
let(:data_store) { :database }
let(:raw_data) { 'Sample data in database' }
let(:raw_data) { +'Sample data in database' }
let(:data) { raw_data }
 
it_behaves_like 'truncates'
Loading
Loading
@@ -351,7 +353,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
 
context 'when data_store is fog' do
let(:data_store) { :fog }
let(:data) { 'Sample data in fog' }
let(:data) { +'Sample data in fog' }
 
before do
build_trace_chunk.send(:unsafe_set_data!, data)
Loading
Loading
@@ -368,7 +370,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
let(:data_store) { :redis }
 
context 'when data exists' do
let(:data) { 'Sample data in redis' }
let(:data) { +'Sample data in redis' }
 
before do
build_trace_chunk.send(:unsafe_set_data!, data)
Loading
Loading
@@ -386,7 +388,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
let(:data_store) { :database }
 
context 'when data exists' do
let(:raw_data) { 'Sample data in database' }
let(:raw_data) { +'Sample data in database' }
let(:data) { raw_data }
 
it { is_expected.to eq(data.bytesize) }
Loading
Loading
@@ -401,7 +403,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
let(:data_store) { :fog }
 
context 'when data exists' do
let(:data) { 'Sample data in fog' }
let(:data) { +'Sample data in fog' }
let(:key) { "tmp/builds/#{build.id}/chunks/#{chunk_index}.log" }
 
before do
Loading
Loading
@@ -443,7 +445,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
end
 
context 'when data size reached CHUNK_SIZE' do
let(:data) { 'a' * described_class::CHUNK_SIZE }
let(:data) { +'a' * described_class::CHUNK_SIZE }
 
it 'persists the data' do
expect(build_trace_chunk.redis?).to be_truthy
Loading
Loading
@@ -463,7 +465,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
end
 
context 'when data size has not reached CHUNK_SIZE' do
let(:data) { 'Sample data in redis' }
let(:data) { +'Sample data in redis' }
 
it 'does not persist the data and the orignal data is intact' do
expect { subject }.to raise_error(described_class::FailedToPersistDataError)
Loading
Loading
@@ -492,7 +494,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
end
 
context 'when data size reached CHUNK_SIZE' do
let(:data) { 'a' * described_class::CHUNK_SIZE }
let(:data) { +'a' * described_class::CHUNK_SIZE }
 
it 'persists the data' do
expect(build_trace_chunk.database?).to be_truthy
Loading
Loading
@@ -512,7 +514,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
end
 
context 'when data size has not reached CHUNK_SIZE' do
let(:data) { 'Sample data in database' }
let(:data) { +'Sample data in database' }
 
it 'does not persist the data and the orignal data is intact' do
expect { subject }.to raise_error(described_class::FailedToPersistDataError)
Loading
Loading
@@ -561,7 +563,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
end
 
context 'when data size has not reached CHUNK_SIZE' do
let(:data) { 'Sample data in fog' }
let(:data) { +'Sample data in fog' }
 
it 'does not raise error' do
expect { subject }.not_to raise_error
Loading
Loading
Loading
Loading
@@ -152,6 +152,16 @@ describe Clusters::Cluster, :use_clean_rails_memory_store_caching do
end
end
 
describe '.for_project_namespace' do
subject { described_class.for_project_namespace(namespace_id) }
let!(:cluster) { create(:cluster, :project) }
let!(:another_cluster) { create(:cluster, :project) }
let(:namespace_id) { cluster.first_project.namespace_id }
it { is_expected.to contain_exactly(cluster) }
end
describe 'validations' do
subject { cluster.valid? }
 
Loading
Loading
Loading
Loading
@@ -42,6 +42,28 @@ describe Clusters::ClustersHierarchy do
it 'returns clusters for project' do
expect(base_and_ancestors(cluster.project)).to eq([cluster])
end
context 'cluster has management project' do
let(:management_project) { create(:project, namespace: cluster.first_project.namespace) }
before do
cluster.update!(management_project: management_project)
end
context 'management_project is in same namespace as cluster' do
it 'returns cluster for management_project' do
expect(base_and_ancestors(management_project)).to eq([cluster])
end
end
context 'management_project is in a different namespace from cluster' do
let(:management_project) { create(:project) }
it 'returns nothing' do
expect(base_and_ancestors(management_project)).to be_empty
end
end
end
end
 
context 'cluster has management project' do
Loading
Loading
@@ -50,16 +72,12 @@ describe Clusters::ClustersHierarchy do
 
let(:group) { create(:group) }
let(:project) { create(:project, group: group) }
let(:management_project) { create(:project) }
let(:management_project) { create(:project, group: group) }
 
it 'returns clusters for management_project' do
expect(base_and_ancestors(management_project)).to eq([group_cluster])
end
 
it 'returns nothing if include_management_project is false' do
expect(base_and_ancestors(management_project, include_management_project: false)).to be_empty
end
it 'returns clusters for project' do
expect(base_and_ancestors(project)).to eq([project_cluster, group_cluster])
end
Loading
Loading
@@ -70,17 +88,21 @@ describe Clusters::ClustersHierarchy do
end
 
context 'project in nested group with clusters at some levels' do
let!(:child) { create(:cluster, :group, groups: [child_group], management_project: management_project) }
let!(:ancestor) { create(:cluster, :group, groups: [ancestor_group]) }
let!(:child) { create(:cluster, :group, groups: [child_group]) }
let!(:ancestor) { create(:cluster, :group, groups: [ancestor_group], management_project: management_project) }
 
let(:ancestor_group) { create(:group) }
let(:parent_group) { create(:group, parent: ancestor_group) }
let(:child_group) { create(:group, parent: parent_group) }
let(:project) { create(:project, group: child_group) }
let(:management_project) { create(:project) }
let(:management_project) { create(:project, group: child_group) }
it 'returns clusters for management_project' do
expect(base_and_ancestors(management_project)).to eq([ancestor, child])
end
 
it 'returns clusters for management_project' do
expect(base_and_ancestors(management_project)).to eq([child])
expect(base_and_ancestors(management_project, include_management_project: false)).to eq([child, ancestor])
end
 
it 'returns clusters for project' do
Loading
Loading
Loading
Loading
@@ -13,7 +13,11 @@ describe DeploymentPlatform do
end
 
context 'when project is the cluster\'s management project ' do
let!(:cluster_with_management_project) { create(:cluster, :provided_by_user, management_project: project) }
let(:another_project) { create(:project, namespace: project.namespace) }
let!(:cluster_with_management_project) do
create(:cluster, :provided_by_user, projects: [another_project], management_project: project)
end
 
context 'cluster_management_project feature is enabled' do
it 'returns the cluster with management project' do
Loading
Loading
@@ -66,7 +70,11 @@ describe DeploymentPlatform do
end
 
context 'when project is the cluster\'s management project ' do
let!(:cluster_with_management_project) { create(:cluster, :provided_by_user, management_project: project) }
let(:another_project) { create(:project, namespace: project.namespace) }
let!(:cluster_with_management_project) do
create(:cluster, :provided_by_user, projects: [another_project], management_project: project)
end
 
context 'cluster_management_project feature is enabled' do
it 'returns the cluster with management project' do
Loading
Loading
# frozen_string_literals: true
# frozen_string_literal: true
require 'spec_helper'
 
describe Shard do
Loading
Loading
Loading
Loading
@@ -286,12 +286,15 @@ describe API::GroupClusters do
let(:update_params) do
{
domain: domain,
platform_kubernetes_attributes: platform_kubernetes_attributes
platform_kubernetes_attributes: platform_kubernetes_attributes,
management_project_id: management_project_id
}
end
 
let(:domain) { 'new-domain.com' }
let(:platform_kubernetes_attributes) { {} }
let(:management_project) { create(:project, group: group) }
let(:management_project_id) { management_project.id }
 
let(:cluster) do
create(:cluster, :group, :provided_by_gcp,
Loading
Loading
@@ -308,6 +311,8 @@ describe API::GroupClusters do
 
context 'authorized user' do
before do
management_project.add_maintainer(current_user)
put api("/groups/#{group.id}/clusters/#{cluster.id}", current_user), params: update_params
 
cluster.reload
Loading
Loading
@@ -320,6 +325,7 @@ describe API::GroupClusters do
 
it 'updates cluster attributes' do
expect(cluster.domain).to eq('new-domain.com')
expect(cluster.management_project).to eq(management_project)
end
end
 
Loading
Loading
@@ -332,6 +338,7 @@ describe API::GroupClusters do
 
it 'does not update cluster attributes' do
expect(cluster.domain).to eq('old-domain.com')
expect(cluster.management_project).to be_nil
end
 
it 'returns validation errors' do
Loading
Loading
@@ -339,6 +346,18 @@ describe API::GroupClusters do
end
end
 
context 'current user does not have access to management_project_id' do
let(:management_project_id) { create(:project).id }
it 'responds with 400' do
expect(response).to have_gitlab_http_status(400)
end
it 'returns validation errors' do
expect(json_response['message']['management_project_id'].first).to match('don\'t have permission')
end
end
context 'with a GCP cluster' do
context 'when user tries to change GCP specific fields' do
let(:platform_kubernetes_attributes) do
Loading
Loading
Loading
Loading
@@ -316,6 +316,7 @@ describe API::Internal::Base do
expect(json_response["gitaly"]["repository"]["relative_path"]).to eq(project.repository.gitaly_repository.relative_path)
expect(json_response["gitaly"]["address"]).to eq(Gitlab::GitalyClient.address(project.repository_storage))
expect(json_response["gitaly"]["token"]).to eq(Gitlab::GitalyClient.token(project.repository_storage))
expect(json_response["gitaly"]["features"]).to eq('gitaly-feature-get-all-lfs-pointers-go' => 'true', 'gitaly-feature-inforef-uploadpack-cache' => 'true')
expect(user.reload.last_activity_on).to eql(Date.today)
end
end
Loading
Loading
@@ -335,6 +336,7 @@ describe API::Internal::Base do
expect(json_response["gitaly"]["repository"]["relative_path"]).to eq(project.repository.gitaly_repository.relative_path)
expect(json_response["gitaly"]["address"]).to eq(Gitlab::GitalyClient.address(project.repository_storage))
expect(json_response["gitaly"]["token"]).to eq(Gitlab::GitalyClient.token(project.repository_storage))
expect(json_response["gitaly"]["features"]).to eq('gitaly-feature-get-all-lfs-pointers-go' => 'true', 'gitaly-feature-inforef-uploadpack-cache' => 'true')
expect(user.reload.last_activity_on).to be_nil
end
end
Loading
Loading
@@ -576,6 +578,7 @@ describe API::Internal::Base do
expect(json_response["gitaly"]["repository"]["relative_path"]).to eq(project.repository.gitaly_repository.relative_path)
expect(json_response["gitaly"]["address"]).to eq(Gitlab::GitalyClient.address(project.repository_storage))
expect(json_response["gitaly"]["token"]).to eq(Gitlab::GitalyClient.token(project.repository_storage))
expect(json_response["gitaly"]["features"]).to eq('gitaly-feature-get-all-lfs-pointers-go' => 'true', 'gitaly-feature-inforef-uploadpack-cache' => 'true')
end
end
 
Loading
Loading
Loading
Loading
@@ -281,11 +281,14 @@ describe API::ProjectClusters do
let(:api_url) { 'https://kubernetes.example.com' }
let(:namespace) { 'new-namespace' }
let(:platform_kubernetes_attributes) { { namespace: namespace } }
let(:management_project) { create(:project, namespace: project.namespace) }
let(:management_project_id) { management_project.id }
 
let(:update_params) do
{
domain: 'new-domain.com',
platform_kubernetes_attributes: platform_kubernetes_attributes
platform_kubernetes_attributes: platform_kubernetes_attributes,
management_project_id: management_project_id
}
end
 
Loading
Loading
@@ -310,6 +313,8 @@ describe API::ProjectClusters do
 
context 'authorized user' do
before do
management_project.add_maintainer(current_user)
put api("/projects/#{project.id}/clusters/#{cluster.id}", current_user), params: update_params
 
cluster.reload
Loading
Loading
@@ -323,6 +328,7 @@ describe API::ProjectClusters do
it 'updates cluster attributes' do
expect(cluster.domain).to eq('new-domain.com')
expect(cluster.platform_kubernetes.namespace).to eq('new-namespace')
expect(cluster.management_project).to eq(management_project)
end
end
 
Loading
Loading
@@ -336,6 +342,7 @@ describe API::ProjectClusters do
it 'does not update cluster attributes' do
expect(cluster.domain).not_to eq('new_domain.com')
expect(cluster.platform_kubernetes.namespace).not_to eq('invalid_namespace')
expect(cluster.management_project).not_to eq(management_project)
end
 
it 'returns validation errors' do
Loading
Loading
@@ -343,6 +350,18 @@ describe API::ProjectClusters do
end
end
 
context 'current user does not have access to management_project_id' do
let(:management_project_id) { create(:project).id }
it 'responds with 400' do
expect(response).to have_gitlab_http_status(400)
end
it 'returns validation errors' do
expect(json_response['message']['management_project_id'].first).to match('don\'t have permission')
end
end
context 'with a GCP cluster' do
context 'when user tries to change GCP specific fields' do
let(:platform_kubernetes_attributes) do
Loading
Loading
Loading
Loading
@@ -90,5 +90,115 @@ describe Clusters::UpdateService do
end
end
end
context 'when params includes :management_project_id' do
context 'management_project is non-existent' do
let(:params) do
{ management_project_id: 0 }
end
it 'does not update management_project_id' do
is_expected.to eq(false)
expect(cluster.errors[:management_project_id]).to include('Project does not exist or you don\'t have permission to perform this action')
cluster.reload
expect(cluster.management_project_id).to be_nil
end
end
shared_examples 'setting a management project' do
context 'user is authorized to adminster manangement_project' do
before do
management_project.add_maintainer(cluster.user)
end
let(:params) do
{ management_project_id: management_project.id }
end
it 'updates management_project_id' do
is_expected.to eq(true)
expect(cluster.management_project).to eq(management_project)
end
end
context 'user is not authorized to adminster manangement_project' do
let(:params) do
{ management_project_id: management_project.id }
end
it 'does not update management_project_id' do
is_expected.to eq(false)
expect(cluster.errors[:management_project_id]).to include('Project does not exist or you don\'t have permission to perform this action')
cluster.reload
expect(cluster.management_project_id).to be_nil
end
end
end
context 'project cluster' do
include_examples 'setting a management project' do
let(:management_project) { create(:project, namespace: cluster.first_project.namespace) }
end
context 'manangement_project is outside of the namespace scope' do
before do
management_project.update(group: create(:group))
end
let(:params) do
{ management_project_id: management_project.id }
end
it 'does not update management_project_id' do
is_expected.to eq(false)
expect(cluster.errors[:management_project_id]).to include('Project does not exist or you don\'t have permission to perform this action')
cluster.reload
expect(cluster.management_project_id).to be_nil
end
end
end
context 'group cluster' do
let(:cluster) { create(:cluster, :group) }
include_examples 'setting a management project' do
let(:management_project) { create(:project, group: cluster.first_group) }
end
context 'manangement_project is outside of the namespace scope' do
before do
management_project.update(group: create(:group))
end
let(:params) do
{ management_project_id: management_project.id }
end
it 'does not update management_project_id' do
is_expected.to eq(false)
expect(cluster.errors[:management_project_id]).to include('Project does not exist or you don\'t have permission to perform this action')
cluster.reload
expect(cluster.management_project_id).to be_nil
end
end
end
context 'instance cluster' do
let(:cluster) { create(:cluster, :instance) }
include_examples 'setting a management project' do
let(:management_project) { create(:project) }
end
end
end
end
end
# frozen_string_literal: true
require 'spec_helper'
 
describe Sidekiq::Cron::Job do
Loading
Loading
# frozen_string_literal: true
module SmimeHelper
include OpenSSL
 
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment