diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb index f28df83d5a5..56df9991fda 100644 --- a/app/controllers/projects/branches_controller.rb +++ b/app/controllers/projects/branches_controller.rb @@ -41,7 +41,7 @@ class Projects::BranchesController < Projects::ApplicationController branch_name = sanitize(strip_tags(params[:branch_name])) branch_name = Addressable::URI.unescape(branch_name) - redirect_to_autodeploy = project.empty_repo? && project.deployment_services.present? + redirect_to_autodeploy = project.empty_repo? && project.deployment_platform.present? result = CreateBranchService.new(project, current_user) .execute(branch_name, ref) diff --git a/app/helpers/auto_devops_helper.rb b/app/helpers/auto_devops_helper.rb index 483b957decb..f4310ca2f06 100644 --- a/app/helpers/auto_devops_helper.rb +++ b/app/helpers/auto_devops_helper.rb @@ -10,7 +10,7 @@ module AutoDevopsHelper def auto_devops_warning_message(project) missing_domain = !project.auto_devops&.has_domain? - missing_service = !project.kubernetes_service&.active? + missing_service = !project.deployment_platform&.active? if missing_service params = { diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index ebbefc51a4f..fd64670f6b0 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -365,7 +365,7 @@ module Ci end def has_kubernetes_active? - project.kubernetes_service&.active? + project.deployment_platform&.active? end def has_stage_seeds? diff --git a/app/models/environment.rb b/app/models/environment.rb index 21a028e351c..bf69b4c50f0 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -138,11 +138,11 @@ class Environment < ActiveRecord::Base end def has_terminals? - project.deployment_service.present? && available? && last_deployment.present? + project.deployment_platform.present? && available? && last_deployment.present? end def terminals - project.deployment_service.terminals(self) if has_terminals? + project.deployment_platform.terminals(self) if has_terminals? end def has_metrics? diff --git a/app/models/project.rb b/app/models/project.rb index a7f90bc7fc3..49c56e76dfc 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -123,7 +123,7 @@ class Project < ActiveRecord::Base has_one :bugzilla_service has_one :gitlab_issue_tracker_service, inverse_of: :project has_one :external_wiki_service - # has_one :kubernetes_service, inverse_of: :project + has_one :kubernetes_service, inverse_of: :project has_one :prometheus_service, inverse_of: :project has_one :mock_ci_service has_one :mock_deployment_service @@ -902,16 +902,11 @@ class Project < ActiveRecord::Base @ci_service ||= ci_services.reorder(nil).find_by(active: true) end - def deployment_services - services.where(category: :deployment) - end - - def deployment_service - deployment_platform - end - - def kubernetes_service - deployment_platform + # TODO: This will be extended for multiple enviroment clusters + # TODO: Add super nice tests to check this interchangeability + def deployment_platform + @deployment_platform ||= clusters.where(enabled: true).first&.platform_kubernetes + @deployment_platform ||= services.where(category: :deployment).reorder(nil).find_by(active: true) end def monitoring_services @@ -1556,9 +1551,9 @@ class Project < ActiveRecord::Base end def deployment_variables - return [] unless deployment_service + return [] unless deployment_platform - deployment_service.predefined_variables + deployment_platform.predefined_variables end def auto_devops_variables @@ -1851,11 +1846,4 @@ class Project < ActiveRecord::Base raise ex end - - # TODO: This will be extended for multiple enviroment clusters - # TODO: Add super nice tests to check this interchangeability - def deployment_platform - @deployment_platform ||= clusters.where(enabled: true).first&.platform_kubernetes - @deployment_platform ||= deployment_services.reorder(nil).find_by(active: true) - end end diff --git a/app/views/projects/clusters/new.html.haml b/app/views/projects/clusters/new.html.haml index 6b321f60212..665120c7e49 100644 --- a/app/views/projects/clusters/new.html.haml +++ b/app/views/projects/clusters/new.html.haml @@ -5,7 +5,7 @@ .col-sm-4 = render 'sidebar' .col-sm-8 - - if @project.kubernetes_service&.active? + - if @project.deployment_platform&.active? %h4.prepend-top-0= s_('ClusterIntegration|Cluster management') %p= s_('ClusterIntegration|A cluster has been set up on this project through the Kubernetes integration page') diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 5ebeae5c35f..52be8330813 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -147,7 +147,7 @@ %ul %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. - - if @project.deployment_services.any? + - if @project.deployment_platform.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" - if can?(current_user, :change_namespace, @project) diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 705a4607ad2..7a68aa16aa4 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -67,7 +67,7 @@ - if koding_enabled? && @repository.koding_yml.blank? %li.missing = link_to _('Set up Koding'), add_koding_stack_path(@project) - - if @repository.gitlab_ci_yml.blank? && @project.deployment_service.present? + - if @repository.gitlab_ci_yml.blank? && @project.deployment_platform.present? %li.missing = link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml', commit_message: 'Set up auto deploy', branch_name: 'auto-deploy', context: 'autodeploy') do #{ _('Set up auto deploy') } diff --git a/lib/gitlab/prometheus/queries/query_additional_metrics.rb b/lib/gitlab/prometheus/queries/query_additional_metrics.rb index 7ac6162b54d..5cddc96a643 100644 --- a/lib/gitlab/prometheus/queries/query_additional_metrics.rb +++ b/lib/gitlab/prometheus/queries/query_additional_metrics.rb @@ -76,7 +76,7 @@ module Gitlab timeframe_start: timeframe_start, timeframe_end: timeframe_end, ci_environment_slug: environment.slug, - kube_namespace: environment.project.kubernetes_service&.actual_namespace || '', + kube_namespace: environment.project.deployment_platform&.actual_namespace || '', environment_filter: %{container_name!="POD",environment="#{environment.slug}"} } end diff --git a/spec/controllers/projects/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb index 83974b2c876..91f8210964e 100644 --- a/spec/controllers/projects/branches_controller_spec.rb +++ b/spec/controllers/projects/branches_controller_spec.rb @@ -113,12 +113,10 @@ describe Projects::BranchesController do expect(response).to redirect_to project_tree_path(project, branch) end - context 'when user configured kubernetes from Integration > Kubernetes' do + shared_examples 'correct behavior on KubernetesService and Platform::Kubernetes' do it 'redirects to autodeploy setup page' do result = { status: :success, branch: double(name: branch) } - project.services << build(:kubernetes_service) - expect_any_instance_of(CreateBranchService).to receive(:execute).and_return(result) expect(SystemNoteService).to receive(:new_issue_branch).and_return(true) @@ -133,24 +131,20 @@ describe Projects::BranchesController do end end - context 'when user configured kubernetes from CI/CD > Clusters' do - it 'redirects to autodeploy setup page' do - result = { status: :success, branch: double(name: branch) } - - create(:cluster, :provided_by_gcp, projects: [project]) - - expect_any_instance_of(CreateBranchService).to receive(:execute).and_return(result) - expect(SystemNoteService).to receive(:new_issue_branch).and_return(true) - - post :create, - namespace_id: project.namespace.to_param, - project_id: project.to_param, - branch_name: branch, - issue_iid: issue.iid - - expect(response.location).to include(project_new_blob_path(project, branch)) - expect(response).to have_gitlab_http_status(302) + context 'when user configured kubernetes from Integration > Kubernetes' do + before do + project.services << build(:kubernetes_service) end + + it_behaves_like 'correct behavior on KubernetesService and Platform::Kubernetes' + end + + context 'when user configured kubernetes from CI/CD > Clusters' do + before do + create(:cluster, :provided_by_gcp, projects: [project]) + end + + it_behaves_like 'correct behavior on KubernetesService and Platform::Kubernetes' end end diff --git a/spec/features/auto_deploy_spec.rb b/spec/features/auto_deploy_spec.rb index 327059b86e4..240c5711a7b 100644 --- a/spec/features/auto_deploy_spec.rb +++ b/spec/features/auto_deploy_spec.rb @@ -4,13 +4,7 @@ describe 'Auto deploy' do let(:user) { create(:user) } let(:project) { create(:project, :repository) } - context 'when user configured kubernetes from Integration > Kubernetes' do - before do - create :kubernetes_service, project: project - project.team << [user, :master] - sign_in user - end - + shared_examples 'correct behavior on KubernetesService and Platform::Kubernetes' do context 'when no deployment service is active' do before do project.kubernetes_service.update!(active: false) @@ -55,6 +49,16 @@ describe 'Auto deploy' do end end + context 'when user configured kubernetes from Integration > Kubernetes' do + before do + create :kubernetes_service, project: project + project.team << [user, :master] + sign_in user + end + + it_behaves_like 'correct behavior on KubernetesService and Platform::Kubernetes' + end + context 'when user configured kubernetes from CI/CD > Clusters' do before do create(:cluster, :provided_by_gcp, projects: [project]) @@ -62,47 +66,6 @@ describe 'Auto deploy' do sign_in user end - context 'when no deployment service is active' do - before do - project.kubernetes_service.update!(active: false) - end - - it 'does not show a button to set up auto deploy' do - visit project_path(project) - expect(page).to have_no_content('Set up auto deploy') - end - end - - context 'when a deployment service is active' do - before do - project.kubernetes_service.update!(active: true) - visit project_path(project) - end - - it 'shows a button to set up auto deploy' do - expect(page).to have_link('Set up auto deploy') - end - - it 'includes OpenShift as an available template', :js do - click_link 'Set up auto deploy' - click_button 'Apply a GitLab CI Yaml template' - - within '.gitlab-ci-yml-selector' do - expect(page).to have_content('OpenShift') - end - end - - it 'creates a merge request using "auto-deploy" branch', :js do - click_link 'Set up auto deploy' - click_button 'Apply a GitLab CI Yaml template' - within '.gitlab-ci-yml-selector' do - click_on 'OpenShift' - end - wait_for_requests - click_button 'Commit changes' - - expect(page).to have_content('New Merge Request From auto-deploy into master') - end - end + it_behaves_like 'correct behavior on KubernetesService and Platform::Kubernetes' end end diff --git a/spec/features/projects/clusters/interchangeability_spec.rb b/spec/features/projects/clusters/interchangeability_spec.rb index b454839e8e2..cf5c0ca347f 100644 --- a/spec/features/projects/clusters/interchangeability_spec.rb +++ b/spec/features/projects/clusters/interchangeability_spec.rb @@ -1,8 +1,6 @@ require 'spec_helper' feature 'Interchangeability between KubernetesService and Platform::Kubernetes' do - let!(:project) { create(:project, :repository) } - EXCEPT_METHODS = %i[test title description help fields initialize_properties namespace namespace= api_url api_url=] EXCEPT_METHODS_GREP_V = %w[_touched? _changed? _was] @@ -15,31 +13,4 @@ feature 'Interchangeability between KubernetesService and Platform::Kubernetes' expect(expected_interfaces - Clusters::Platforms::Kubernetes.instance_methods).to be_empty end - - shared_examples 'selects kubernetes instance' do - context 'when user configured kubernetes from Integration > Kubernetes' do - let!(:kubernetes_service) { create(:kubernetes_service, project: project) } - - it { is_expected.to eq(kubernetes_service) } - end - - context 'when user configured kubernetes from CI/CD > Clusters' do - let!(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) } - let(:platform_kubernetes) { cluster.platform_kubernetes } - - it { is_expected.to eq(platform_kubernetes) } - end - end - - describe 'Project#deployment_service' do - subject { project.deployment_service } - - it_behaves_like 'selects kubernetes instance' - end - - describe 'Project#kubernetes_service' do - subject { project.kubernetes_service } - - it_behaves_like 'selects kubernetes instance' - end end diff --git a/spec/models/clusters/platforms/kubernetes_spec.rb b/spec/models/clusters/platforms/kubernetes_spec.rb index 07bb2d637f9..7c5a17a4e95 100644 --- a/spec/models/clusters/platforms/kubernetes_spec.rb +++ b/spec/models/clusters/platforms/kubernetes_spec.rb @@ -93,52 +93,52 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching end describe 'after_save from Clusters::Cluster' do - context 'when platform_kubernetes is being cerated' do - let(:enabled) { true } - let(:project) { create(:project) } - let(:cluster) { build(:cluster, provider_type: :gcp, platform_type: :kubernetes, platform_kubernetes: platform, provider_gcp: provider, enabled: enabled, projects: [project]) } - let(:platform) { build(:cluster_platform_kubernetes, :configured) } - let(:provider) { build(:cluster_provider_gcp) } - let(:kubernetes_service) { project.kubernetes_service } + # context 'when platform_kubernetes is being cerated' do + # let(:enabled) { true } + # let(:project) { create(:project) } + # let(:cluster) { build(:cluster, provider_type: :gcp, platform_type: :kubernetes, platform_kubernetes: platform, provider_gcp: provider, enabled: enabled, projects: [project]) } + # let(:platform) { build(:cluster_platform_kubernetes, :configured) } + # let(:provider) { build(:cluster_provider_gcp) } + # let(:kubernetes_service) { project.kubernetes_service } - it 'updates KubernetesService' do - cluster.save! + # it 'updates KubernetesService' do + # cluster.save! - expect(kubernetes_service.active).to eq(enabled) - expect(kubernetes_service.api_url).to eq(platform.api_url) - expect(kubernetes_service.namespace).to eq(platform.namespace) - expect(kubernetes_service.ca_pem).to eq(platform.ca_cert) - end - end + # expect(kubernetes_service.active).to eq(enabled) + # expect(kubernetes_service.api_url).to eq(platform.api_url) + # expect(kubernetes_service.namespace).to eq(platform.namespace) + # expect(kubernetes_service.ca_pem).to eq(platform.ca_cert) + # end + # end - context 'when platform_kubernetes has been created' do - let(:enabled) { false } - let!(:project) { create(:project) } - let!(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) } - let(:platform) { cluster.platform } - let(:kubernetes_service) { project.kubernetes_service } + # context 'when platform_kubernetes has been created' do + # let(:enabled) { false } + # let!(:project) { create(:project) } + # let!(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) } + # let(:platform) { cluster.platform } + # let(:kubernetes_service) { project.kubernetes_service } - it 'updates KubernetesService' do - cluster.update(enabled: enabled) + # it 'updates KubernetesService' do + # cluster.update(enabled: enabled) - expect(kubernetes_service.active).to eq(enabled) - end - end + # expect(kubernetes_service.active).to eq(enabled) + # end + # end - context 'when kubernetes_service has been configured without cluster integration' do - let!(:project) { create(:project) } - let(:cluster) { build(:cluster, provider_type: :gcp, platform_type: :kubernetes, platform_kubernetes: platform, provider_gcp: provider, projects: [project]) } - let(:platform) { build(:cluster_platform_kubernetes, :configured, api_url: 'https://111.111.111.111') } - let(:provider) { build(:cluster_provider_gcp) } + # context 'when kubernetes_service has been configured without cluster integration' do + # let!(:project) { create(:project) } + # let(:cluster) { build(:cluster, provider_type: :gcp, platform_type: :kubernetes, platform_kubernetes: platform, provider_gcp: provider, projects: [project]) } + # let(:platform) { build(:cluster_platform_kubernetes, :configured, api_url: 'https://111.111.111.111') } + # let(:provider) { build(:cluster_provider_gcp) } - before do - create(:kubernetes_service, project: project) - end + # before do + # create(:kubernetes_service, project: project) + # end - it 'raises an error' do - expect { cluster.save! }.to raise_error('Kubernetes service already configured') - end - end + # it 'raises an error' do + # expect { cluster.save! }.to raise_error('Kubernetes service already configured') + # end + # end end describe '#actual_namespace' do diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index de030844a28..dc71cf16f54 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -369,7 +369,6 @@ describe Environment do end describe '#terminals' do - let(:project) { create(:kubernetes_project) } subject { environment.terminals } context 'when the environment has terminals' do @@ -377,12 +376,27 @@ describe Environment do allow(environment).to receive(:has_terminals?).and_return(true) end - it 'returns the terminals from the deployment service' do - expect(project.deployment_service) - .to receive(:terminals).with(environment) - .and_return(:fake_terminals) + shared_examples 'correct behavior on KubernetesService and Platform::Kubernetes' do + it 'returns the terminals from the deployment service' do + expect(project.deployment_platform) + .to receive(:terminals).with(environment) + .and_return(:fake_terminals) - is_expected.to eq(:fake_terminals) + is_expected.to eq(:fake_terminals) + end + end + + context 'when user configured kubernetes from Integration > Kubernetes' do + let(:project) { create(:kubernetes_project) } + + it_behaves_like 'correct behavior on KubernetesService and Platform::Kubernetes' + end + + context 'when user configured kubernetes from CI/CD > Clusters' do + let!(:cluster) { create(:cluster, :project, :provided_by_gcp) } + let(:project) { cluster.project } + + it_behaves_like 'correct behavior on KubernetesService and Platform::Kubernetes' end end diff --git a/spec/models/project_services/kubernetes_service_spec.rb b/spec/models/project_services/kubernetes_service_spec.rb index 1c629155e1e..d33352c918b 100644 --- a/spec/models/project_services/kubernetes_service_spec.rb +++ b/spec/models/project_services/kubernetes_service_spec.rb @@ -5,7 +5,7 @@ describe KubernetesService, :use_clean_rails_memory_store_caching do include ReactiveCachingHelpers let(:project) { build_stubbed(:kubernetes_project) } - let(:service) { project.kubernetes_service } + let(:service) { project.deployment_platform } describe 'Associations' do it { is_expected.to belong_to :project } diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 78f2a4df36f..a28b15c9d7b 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -2002,10 +2002,10 @@ describe Project do end context 'when project has a deployment service' do - shared_examples 'correct behavior with variables' do + shared_examples 'correct behavior on KubernetesService and Platform::Kubernetes' do it 'returns variables from this service' do expect(project.deployment_variables).to include( - { key: 'KUBE_TOKEN', value: project.kubernetes_service.token, public: false } + { key: 'KUBE_TOKEN', value: project.deployment_platform.token, public: false } ) end end @@ -2013,14 +2013,14 @@ describe Project do context 'when user configured kubernetes from Integration > Kubernetes' do let(:project) { create(:kubernetes_project) } - it_behaves_like 'correct behavior with variables' + it_behaves_like 'correct behavior on KubernetesService and Platform::Kubernetes' end context 'when user configured kubernetes from CI/CD > Clusters' do let!(:cluster) { create(:cluster, :project, :provided_by_gcp) } let(:project) { cluster.project } - it_behaves_like 'correct behavior with variables' + it_behaves_like 'correct behavior on KubernetesService and Platform::Kubernetes' end end end @@ -3096,4 +3096,21 @@ describe Project do expect(project.wiki_repository_exists?).to eq(false) end end + + describe '#deployment_platform' do + subject { project.deployment_platform } + + context 'when user configured kubernetes from Integration > Kubernetes' do + let!(:kubernetes_service) { create(:kubernetes_service, project: project) } + + it { is_expected.to eq(kubernetes_service) } + end + + context 'when user configured kubernetes from CI/CD > Clusters' do + let!(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) } + let(:platform_kubernetes) { cluster.platform_kubernetes } + + it { is_expected.to eq(platform_kubernetes) } + end + end end diff --git a/spec/support/prometheus/additional_metrics_shared_examples.rb b/spec/support/prometheus/additional_metrics_shared_examples.rb index 7e20b4e0232..f3338259a77 100644 --- a/spec/support/prometheus/additional_metrics_shared_examples.rb +++ b/spec/support/prometheus/additional_metrics_shared_examples.rb @@ -43,7 +43,7 @@ RSpec.shared_examples 'additional metrics query' do describe 'project has Kubernetes service' do shared_examples 'correct behavior with metrics' do let(:environment) { create(:environment, slug: 'environment-slug', project: project) } - let(:kube_namespace) { project.kubernetes_service.actual_namespace } + let(:kube_namespace) { project.deployment_platform.actual_namespace } it_behaves_like 'query context containing environment slug and filter' diff --git a/spec/workers/reactive_caching_worker_spec.rb b/spec/workers/reactive_caching_worker_spec.rb index 98282af2d18..dd654c941bc 100644 --- a/spec/workers/reactive_caching_worker_spec.rb +++ b/spec/workers/reactive_caching_worker_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe ReactiveCachingWorker do - let(:service) { project.deployment_service } + let(:service) { project.deployment_platform } subject { described_class.new.perform("KubernetesService", service.id) } describe '#perform' do