diff options
author | Kamil TrzciĆski <ayufan@ayufan.eu> | 2018-12-10 14:14:38 +0000 |
---|---|---|
committer | GitLab Release Tools Bot <robert+release-tools@gitlab.com> | 2018-12-11 19:49:41 +0000 |
commit | 8a4ae2639bb0536dae0c1d62c779bd7f9c4048fa (patch) | |
tree | 7a6a7ab78d6cfc55068fe8ae1ee5c2d6c63fd811 | |
parent | b1ac474dc753d61e48e38e68cd7f5613ae6dda8b (diff) | |
download | gitlab-ce-8a4ae2639bb0536dae0c1d62c779bd7f9c4048fa.tar.gz |
Merge branch '55090-fix-group-clusters-no-project-namespace' into 'master'
Resolve "Project Namespace field should be removed from Group Cluster, Add existing"
Closes #55090
See merge request gitlab-org/gitlab-ce!23679
(cherry picked from commit 2d85d362c626f7c4afdc3e8f7123672b3a6363c0)
6cbc982c Add failing feature spec
22289352 Set cluster_type for a new cluster
01dc3c96 Refactor to re-use similar block
ecda32ea Extract Clusters::BuildService
-rw-r--r-- | app/controllers/clusters/clusters_controller.rb | 12 | ||||
-rw-r--r-- | app/services/clusters/build_service.rb | 21 | ||||
-rw-r--r-- | spec/features/groups/clusters/user_spec.rb | 126 | ||||
-rw-r--r-- | spec/services/clusters/build_service_spec.rb | 25 |
4 files changed, 178 insertions, 6 deletions
diff --git a/app/controllers/clusters/clusters_controller.rb b/app/controllers/clusters/clusters_controller.rb index 2e9c77ae55c..9aa8b758539 100644 --- a/app/controllers/clusters/clusters_controller.rb +++ b/app/controllers/clusters/clusters_controller.rb @@ -181,15 +181,15 @@ class Clusters::ClustersController < Clusters::BaseController end def gcp_cluster - @gcp_cluster = ::Clusters::Cluster.new.tap do |cluster| - cluster.build_provider_gcp - end.present(current_user: current_user) + cluster = Clusters::BuildService.new(clusterable.subject).execute + cluster.build_provider_gcp + @gcp_cluster = cluster.present(current_user: current_user) end def user_cluster - @user_cluster = ::Clusters::Cluster.new.tap do |cluster| - cluster.build_platform_kubernetes - end.present(current_user: current_user) + cluster = Clusters::BuildService.new(clusterable.subject).execute + cluster.build_platform_kubernetes + @user_cluster = cluster.present(current_user: current_user) end def validate_gcp_token diff --git a/app/services/clusters/build_service.rb b/app/services/clusters/build_service.rb new file mode 100644 index 00000000000..8de73831164 --- /dev/null +++ b/app/services/clusters/build_service.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +module Clusters + class BuildService + def initialize(subject) + @subject = subject + end + + def execute + ::Clusters::Cluster.new.tap do |cluster| + case @subject + when ::Project + cluster.cluster_type = :project_type + when ::Group + cluster.cluster_type = :group_type + else + raise NotImplementedError + end + end + end + end +end diff --git a/spec/features/groups/clusters/user_spec.rb b/spec/features/groups/clusters/user_spec.rb new file mode 100644 index 00000000000..2410cd92e3f --- /dev/null +++ b/spec/features/groups/clusters/user_spec.rb @@ -0,0 +1,126 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'User Cluster', :js do + include GoogleApi::CloudPlatformHelpers + + let(:group) { create(:group) } + let(:user) { create(:user) } + + before do + group.add_maintainer(user) + gitlab_sign_in(user) + + allow(Groups::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 } + allow_any_instance_of(Clusters::Gcp::Kubernetes::CreateOrUpdateNamespaceService).to receive(:execute) + end + + context 'when user does not have a cluster and visits cluster index page' do + before do + visit group_clusters_path(group) + + click_link 'Add Kubernetes cluster' + click_link 'Add existing cluster' + end + + context 'when user filled form with valid parameters' do + shared_examples 'valid cluster user form' do + it 'user sees a cluster details page' do + subject + + expect(page).to have_content('Kubernetes cluster integration') + expect(page.find_field('cluster[name]').value).to eq('dev-cluster') + expect(page.find_field('cluster[platform_kubernetes_attributes][api_url]').value) + .to have_content('http://example.com') + expect(page.find_field('cluster[platform_kubernetes_attributes][token]').value) + .to have_content('my-token') + end + end + + before do + fill_in 'cluster_name', with: 'dev-cluster' + fill_in 'cluster_platform_kubernetes_attributes_api_url', with: 'http://example.com' + fill_in 'cluster_platform_kubernetes_attributes_token', with: 'my-token' + end + + subject { click_button 'Add Kubernetes cluster' } + + it_behaves_like 'valid cluster user form' + + context 'RBAC is enabled for the cluster' do + before do + check 'cluster_platform_kubernetes_attributes_authorization_type' + end + + it_behaves_like 'valid cluster user form' + + it 'user sees a cluster details page with RBAC enabled' do + subject + + expect(page.find_field('cluster[platform_kubernetes_attributes][authorization_type]', disabled: true)).to be_checked + end + end + end + + context 'when user filled form with invalid parameters' do + before do + click_button 'Add Kubernetes cluster' + end + + it 'user sees a validation error' do + expect(page).to have_css('#error_explanation') + end + end + end + + context 'when user does have a cluster and visits cluster page' do + let(:cluster) { create(:cluster, :provided_by_user, cluster_type: :group_type, groups: [group]) } + + before do + visit group_cluster_path(group, cluster) + end + + it 'user sees a cluster details page' do + expect(page).to have_button('Save changes') + end + + context 'when user disables the cluster' do + before do + page.find(:css, '.js-cluster-enable-toggle-area .js-project-feature-toggle').click + page.within('#cluster-integration') { click_button 'Save changes' } + end + + it 'user sees the successful message' do + expect(page).to have_content('Kubernetes cluster was successfully updated.') + end + end + + context 'when user changes cluster parameters' do + before do + fill_in 'cluster_name', with: 'my-dev-cluster' + fill_in 'cluster_platform_kubernetes_attributes_token', with: 'new-token' + page.within('#js-cluster-details') { click_button 'Save changes' } + end + + it 'user sees the successful message' do + expect(page).to have_content('Kubernetes cluster was successfully updated.') + expect(cluster.reload.name).to eq('my-dev-cluster') + expect(cluster.reload.platform_kubernetes.token).to eq('new-token') + end + end + + context 'when user destroy the cluster' do + before do + page.accept_confirm do + click_link 'Remove integration' + end + end + + it 'user sees creation form with the successful message' do + expect(page).to have_content('Kubernetes cluster integration was successfully removed.') + expect(page).to have_link('Add Kubernetes cluster') + end + end + end +end diff --git a/spec/services/clusters/build_service_spec.rb b/spec/services/clusters/build_service_spec.rb new file mode 100644 index 00000000000..da0cb42b3a1 --- /dev/null +++ b/spec/services/clusters/build_service_spec.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Clusters::BuildService do + describe '#execute' do + subject { described_class.new(cluster_subject).execute } + + describe 'when cluster subject is a project' do + let(:cluster_subject) { build(:project) } + + it 'sets the cluster_type to project_type' do + is_expected.to be_project_type + end + end + + describe 'when cluster subject is a group' do + let(:cluster_subject) { build(:group) } + + it 'sets the cluster_type to group_type' do + is_expected.to be_group_type + end + end + end +end |