1# frozen_string_literal: true 2 3module Gitlab 4 module Metrics 5 module Dashboard 6 module Stages 7 class BaseStage 8 include Gitlab::Metrics::Dashboard::Defaults 9 10 attr_reader :project, :dashboard, :params 11 12 def initialize(project, dashboard, params) 13 @project = project 14 @dashboard = dashboard 15 @params = params 16 end 17 18 # Entry-point to the stage 19 def transform! 20 raise NotImplementedError 21 end 22 23 protected 24 25 def missing_panel_groups! 26 raise Errors::LayoutError, 'Top-level key :panel_groups must be an array' 27 end 28 29 def missing_panels! 30 raise Errors::LayoutError, 'Each "panel_group" must define an array :panels' 31 end 32 33 def missing_metrics! 34 raise Errors::LayoutError, 'Each "panel" must define an array :metrics' 35 end 36 37 def for_metrics 38 missing_panel_groups! unless dashboard[:panel_groups].is_a?(Array) 39 40 for_panel_groups do |panel_group| 41 for_panels_in(panel_group) do |panel| 42 missing_metrics! unless panel[:metrics].is_a?(Array) 43 44 panel[:metrics].each do |metric| 45 yield metric 46 end 47 end 48 end 49 end 50 51 def for_variables 52 return unless dashboard.dig(:templating, :variables).is_a?(Hash) 53 54 dashboard.dig(:templating, :variables).each do |variable_name, variable| 55 yield variable_name, variable 56 end 57 end 58 59 def for_panel_groups 60 dashboard[:panel_groups].each do |panel_group| 61 yield panel_group 62 end 63 end 64 65 def for_panels_in(panel_group) 66 missing_panels! unless panel_group[:panels].is_a?(Array) 67 68 panel_group[:panels].each do |panel| 69 yield panel 70 end 71 end 72 end 73 end 74 end 75 end 76end 77