diff options
author | Chris Baumbauer <cab@cabnetworks.net> | 2018-12-13 07:39:44 -0800 |
---|---|---|
committer | Chris Baumbauer <cab@cabnetworks.net> | 2019-01-04 14:53:39 -0800 |
commit | 47cb5a2641e840bca4f7fc15d93d78b2a6fca306 (patch) | |
tree | 06c84ec084ff71d952cb44582ad8a15bf1723c30 | |
parent | b97b85c37e77e5d37705cb2d3a60161896585420 (diff) | |
download | gitlab-ce-47cb5a2641e840bca4f7fc15d93d78b2a6fca306.tar.gz |
Require Knative to be installed only on an RBAC kubernetes cluster
-rw-r--r-- | app/assets/javascripts/clusters/clusters_bundle.js | 3 | ||||
-rw-r--r-- | app/assets/javascripts/clusters/components/applications.vue | 19 | ||||
-rw-r--r-- | app/assets/javascripts/clusters/stores/clusters_store.js | 6 | ||||
-rw-r--r-- | app/models/clusters/applications/knative.rb | 11 | ||||
-rw-r--r-- | app/views/clusters/clusters/show.html.haml | 1 | ||||
-rw-r--r-- | changelogs/unreleased/knative-rbac-check.yml | 5 | ||||
-rw-r--r-- | locale/gitlab.pot | 3 | ||||
-rw-r--r-- | spec/factories/clusters/clusters.rb | 4 | ||||
-rw-r--r-- | spec/factories/clusters/platforms/kubernetes.rb | 4 | ||||
-rw-r--r-- | spec/features/projects/clusters/applications_spec.rb | 28 | ||||
-rw-r--r-- | spec/javascripts/clusters/stores/clusters_store_spec.js | 1 | ||||
-rw-r--r-- | spec/models/clusters/applications/knative_spec.rb | 7 |
12 files changed, 89 insertions, 3 deletions
diff --git a/app/assets/javascripts/clusters/clusters_bundle.js b/app/assets/javascripts/clusters/clusters_bundle.js index aff32d95db1..b1f992c03ff 100644 --- a/app/assets/javascripts/clusters/clusters_bundle.js +++ b/app/assets/javascripts/clusters/clusters_bundle.js @@ -32,6 +32,7 @@ export default class Clusters { installKnativePath, installPrometheusPath, managePrometheusPath, + hasRbac, clusterType, clusterStatus, clusterStatusReason, @@ -45,6 +46,7 @@ export default class Clusters { this.store.setManagePrometheusPath(managePrometheusPath); this.store.updateStatus(clusterStatus); this.store.updateStatusReason(clusterStatusReason); + this.store.updateRbac(hasRbac); this.service = new ClustersService({ endpoint: statusPath, installHelmEndpoint: installHelmPath, @@ -102,6 +104,7 @@ export default class Clusters { ingressHelpPath: this.state.ingressHelpPath, managePrometheusPath: this.state.managePrometheusPath, ingressDnsHelpPath: this.state.ingressDnsHelpPath, + rbac: this.state.rbac, }, }); }, diff --git a/app/assets/javascripts/clusters/components/applications.vue b/app/assets/javascripts/clusters/components/applications.vue index 489615f1f78..5d19c79570a 100644 --- a/app/assets/javascripts/clusters/components/applications.vue +++ b/app/assets/javascripts/clusters/components/applications.vue @@ -52,6 +52,11 @@ export default { required: false, default: '', }, + rbac: { + type: Boolean, + required: false, + default: false, + }, }, data: () => ({ elasticsearchLogo, @@ -442,6 +447,18 @@ export default { title-link="https://github.com/knative/docs" > <div slot="description"> + <span v-if="!rbac"> + <p v-if="!rbac" class="bs-callout bs-callout-info append-bottom-0"> + {{ + s__(`ClusterIntegration|You must have an RBAC-enabled cluster + to install Knative.`) + }} + <a :href="helpPath" target="_blank" rel="noopener noreferrer"> + {{ __('More information') }} + </a> + </p> + <br /> + </span> <p> {{ s__(`ClusterIntegration|Knative extends Kubernetes to provide @@ -465,7 +482,7 @@ export default { /> </div> </template> - <template v-else-if="helmInstalled"> + <template v-else-if="helmInstalled && rbac"> <div class="form-group"> <label for="knative-domainname"> {{ s__('ClusterIntegration|Knative Domain Name:') }} diff --git a/app/assets/javascripts/clusters/stores/clusters_store.js b/app/assets/javascripts/clusters/stores/clusters_store.js index c750daab112..8f74be4e0e6 100644 --- a/app/assets/javascripts/clusters/stores/clusters_store.js +++ b/app/assets/javascripts/clusters/stores/clusters_store.js @@ -1,4 +1,5 @@ import { s__ } from '../../locale'; +import { parseBoolean } from '../../lib/utils/common_utils'; import { INGRESS, JUPYTER, KNATIVE, CERT_MANAGER } from '../constants'; export default class ClusterStore { @@ -7,6 +8,7 @@ export default class ClusterStore { helpPath: null, ingressHelpPath: null, status: null, + rbac: false, statusReason: null, applications: { helm: { @@ -81,6 +83,10 @@ export default class ClusterStore { this.state.status = status; } + updateRbac(rbac) { + this.state.rbac = parseBoolean(rbac); + } + updateStatusReason(reason) { this.state.statusReason = reason; } diff --git a/app/models/clusters/applications/knative.rb b/app/models/clusters/applications/knative.rb index 0a3168afe68..c572c8bff44 100644 --- a/app/models/clusters/applications/knative.rb +++ b/app/models/clusters/applications/knative.rb @@ -19,6 +19,13 @@ module Clusters self.reactive_cache_key = ->(knative) { [knative.class.model_name.singular, knative.id] } + def set_initial_status + return unless not_installable? + return unless verify_cluster? + + self.status = 'installable' + end + state_machine :status do after_transition any => [:installed] do |application| application.run_after_commit do @@ -99,6 +106,10 @@ module Clusters def install_knative_metrics ["kubectl apply -f #{METRICS_CONFIG}"] if cluster.application_prometheus_available? end + + def verify_cluster? + cluster&.application_helm_available? && cluster&.platform_kubernetes_rbac? + end end end end diff --git a/app/views/clusters/clusters/show.html.haml b/app/views/clusters/clusters/show.html.haml index b1aa8e5d477..89a2dfdd69f 100644 --- a/app/views/clusters/clusters/show.html.haml +++ b/app/views/clusters/clusters/show.html.haml @@ -16,6 +16,7 @@ install_jupyter_path: clusterable.install_applications_cluster_path(@cluster, :jupyter), install_knative_path: clusterable.install_applications_cluster_path(@cluster, :knative), toggle_status: @cluster.enabled? ? 'true': 'false', + has_rbac: @cluster.platform_kubernetes_rbac? ? 'true': 'false', cluster_type: @cluster.cluster_type, cluster_status: @cluster.status_name, cluster_status_reason: @cluster.status_reason, diff --git a/changelogs/unreleased/knative-rbac-check.yml b/changelogs/unreleased/knative-rbac-check.yml new file mode 100644 index 00000000000..0c40bb46e7f --- /dev/null +++ b/changelogs/unreleased/knative-rbac-check.yml @@ -0,0 +1,5 @@ +--- +title: Require Knative to be installed only on an RBAC kubernetes cluster +merge_request: 23807 +author: Chris Baumbauer +type: changed diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 7a43add9005..ed8d4e81e90 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -1842,6 +1842,9 @@ msgstr "" msgid "ClusterIntegration|You must first install Helm Tiller before installing the applications below" msgstr "" +msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative." +msgstr "" + msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}" msgstr "" diff --git a/spec/factories/clusters/clusters.rb b/spec/factories/clusters/clusters.rb index c9f5d0a813e..3e2c0df8afb 100644 --- a/spec/factories/clusters/clusters.rb +++ b/spec/factories/clusters/clusters.rb @@ -44,6 +44,10 @@ FactoryBot.define do provider_gcp factory: [:cluster_provider_gcp, :creating] end + trait :rbac_disabled do + platform_kubernetes factory: [:cluster_platform_kubernetes, :configured, :rbac_disabled] + end + trait :disabled do enabled false end diff --git a/spec/factories/clusters/platforms/kubernetes.rb b/spec/factories/clusters/platforms/kubernetes.rb index 8169c457ab7..bf30a9c3a61 100644 --- a/spec/factories/clusters/platforms/kubernetes.rb +++ b/spec/factories/clusters/platforms/kubernetes.rb @@ -16,8 +16,8 @@ FactoryBot.define do end end - trait :rbac_enabled do - authorization_type :rbac + trait :rbac_disabled do + authorization_type :abac end end end diff --git a/spec/features/projects/clusters/applications_spec.rb b/spec/features/projects/clusters/applications_spec.rb index 8918a7b7b9c..fab9e035d53 100644 --- a/spec/features/projects/clusters/applications_spec.rb +++ b/spec/features/projects/clusters/applications_spec.rb @@ -70,6 +70,34 @@ describe 'Clusters Applications', :js do end end + context 'when user installs Knative' do + before do + create(:clusters_applications_helm, :installed, cluster: cluster) + end + + context 'on an abac cluster' do + let(:cluster) { create(:cluster, :provided_by_gcp, :rbac_disabled, projects: [project])} + + it 'should show info block and not be installable' do + page.within('.js-cluster-application-row-knative') do + expect(page).to have_css('.bs-callout-info') + expect(page.find(:css, '.js-cluster-application-install-button')['disabled']).to eq('true') + end + end + end + + context 'on an rbac cluster' do + let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project])} + + it 'should not show callout block and be installable' do + page.within('.js-cluster-application-row-knative') do + expect(page).not_to have_css('.bs-callout-info') + expect(page).to have_css('.js-cluster-application-install-button:not([disabled])') + end + end + end + end + context 'when user installs Cert Manager' do before do allow(ClusterInstallAppWorker).to receive(:perform_async) diff --git a/spec/javascripts/clusters/stores/clusters_store_spec.js b/spec/javascripts/clusters/stores/clusters_store_spec.js index 1ca55549094..dfce2656e4c 100644 --- a/spec/javascripts/clusters/stores/clusters_store_spec.js +++ b/spec/javascripts/clusters/stores/clusters_store_spec.js @@ -62,6 +62,7 @@ describe('Clusters Store', () => { ingressHelpPath: null, status: mockResponseData.status, statusReason: mockResponseData.status_reason, + rbac: false, applications: { helm: { title: 'Helm Tiller', diff --git a/spec/models/clusters/applications/knative_spec.rb b/spec/models/clusters/applications/knative_spec.rb index 8fc755d2a26..0cf9e10ce04 100644 --- a/spec/models/clusters/applications/knative_spec.rb +++ b/spec/models/clusters/applications/knative_spec.rb @@ -15,6 +15,13 @@ describe Clusters::Applications::Knative do allow(ClusterWaitForIngressIpAddressWorker).to receive(:perform_async) end + describe 'when rbac is not enabled' do + let(:cluster) { create(:cluster, :provided_by_gcp, :rbac_disabled) } + let(:knative_no_rbac) { create(:clusters_applications_knative, cluster: cluster) } + + it { expect(knative_no_rbac).to be_not_installable } + end + describe '.installed' do subject { described_class.installed } |