diff --git a/app/assets/javascripts/environments/components/environment.js b/app/assets/javascripts/environments/components/environment.js index c07f90add73eff03294281cb21ba1f0c324133d1..b2f4c91fd05acd2fd85fb28a86acc36aaad87cfa 100644 --- a/app/assets/javascripts/environments/components/environment.js +++ b/app/assets/javascripts/environments/components/environment.js @@ -34,6 +34,7 @@ export default Vue.component('environment-component', { projectStoppedEnvironmentsPath: environmentsData.projectStoppedEnvironmentsPath, newEnvironmentPath: environmentsData.newEnvironmentPath, helpPagePath: environmentsData.helpPagePath, + canUseDeployBoard: environmentsData.canUseDeployBoards, // Pagination Properties, paginationInformation: {}, @@ -58,6 +59,10 @@ export default Vue.component('environment-component', { return gl.utils.convertPermissionToBoolean(this.canCreateEnvironment); }, + canRenderDeployBoard() { + return gl.utils.convertPermissionToBoolean(this.canUseDeployBoard); + }, + /** * Pagination should only be rendered when we have information about it and when the * number of total pages is bigger than 1. @@ -199,7 +204,9 @@ export default Vue.component('environment-component', { :can-read-environment="canReadEnvironmentParsed" :toggleDeployBoard="toggleDeployBoard" :store="store" - :service="service"/> + :service="service" + :can-render-deploy-board="canRenderDeployBoard" + /> ({}), }, + + canRenderDeployBoard: { + type: Boolean, + required: true, + }, + }, + + computed: { + shouldRenderDeployBoard() { + return this.canRenderDeployBoard && + this.model.hasDeployBoard && + this.model.isDeployBoardVisible; + }, }, template: ` @@ -74,15 +87,14 @@ export default { :toggleDeployBoard="toggleDeployBoard" :service="service"> - + - + :endpoint="model.rollout_status_path" /> diff --git a/app/models/enabled_features.rb b/app/models/enabled_features.rb new file mode 100644 index 0000000000000000000000000000000000000000..862f7e358f23ebd35c56027a720c8066950ee54e --- /dev/null +++ b/app/models/enabled_features.rb @@ -0,0 +1,39 @@ +class EnabledFeatures + FILE_LOCK = 'GitLab_FileLocks' + GEO = 'GitLab_Geo' + ADD_ONS = [FILE_LOCK, GEO] + + DEPLOY_BOARDS = 'deploy_boards' + PREMIUM_FEATURES = [DEPLOY_BOARDS] + + def self.allow?(name) + new.allow?(name) + end + + def allow?(name) + case name + when *ADD_ONS + check_add_on(name) + when *PREMIUM_FEATURES + premium_plan? + end + end + + private + + def premium_plan? + current_license&.plan?('premium') + end + + def current_license + @license ||= License.current + end + + def check_add_on(name) + if premium_plan? + current_license&.excluded_add_ons.exclude?(name) + else + current_license.add_on?(name) + end + end +end diff --git a/app/models/license.rb b/app/models/license.rb index 91506780adb4834d2373305a7fe0ac48cffe4acf..0bc87dacdd91b14b9becb9dd1b37e2b4d3a602f0 100644 --- a/app/models/license.rb +++ b/app/models/license.rb @@ -91,6 +91,14 @@ def add_on?(code) add_ons[code].to_i > 0 end + def excluded_add_ons + restricted_attr(:excluded_add_ons, {}) + end + + def plan?(name) + restricted_attr(:plan) == name + end + def restricted_user_count restricted_attr(:active_user_count) end diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index 80d2b6f5d9505b03d95d8f837fb5635e962832ef..45801edf141e8c259078a081a1951439d902e3ba 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -14,4 +14,5 @@ "project-stopped-environments-path" => project_environments_path(@project, scope: :stopped), "new-environment-path" => new_namespace_project_environment_path(@project.namespace, @project), "help-page-path" => help_page_path("ci/environments"), - "css-class" => container_class } } + "css-class" => container_class, + "can-use-deploy-boards" => EnabledFeatures.allow?(EnabledFeatures::DEPLOY_BOARDS).to_s } }