diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-15 09:12:49 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-15 09:12:49 +0000 |
commit | 2cd5f04547dfda46005bae0969948174a2be72bd (patch) | |
tree | 29c9af10a404b4a81e25f12d8862617988e2219c | |
parent | 4b4d8af30ad4a992a5fe538448636fd8aa4d0b6b (diff) | |
download | gitlab-ce-2cd5f04547dfda46005bae0969948174a2be72bd.tar.gz |
Add latest changes from gitlab-org/gitlab@master
-rw-r--r-- | app/assets/javascripts/super_sidebar/components/super_sidebar.vue | 14 | ||||
-rw-r--r-- | app/assets/stylesheets/framework/super_sidebar.scss | 4 | ||||
-rw-r--r-- | app/models/clusters/applications/knative.rb | 10 | ||||
-rw-r--r-- | app/models/clusters/applications/prometheus.rb | 126 | ||||
-rw-r--r-- | app/models/clusters/cluster.rb | 2 | ||||
-rw-r--r-- | db/docs/clusters_applications_prometheus.yml | 2 | ||||
-rw-r--r-- | doc/ci/chatops/index.md | 7 | ||||
-rw-r--r-- | doc/ci/runners/register_runner.md | 33 | ||||
-rw-r--r-- | doc/install/installation.md | 16 | ||||
-rw-r--r-- | doc/update/upgrading_from_source.md | 9 | ||||
-rw-r--r-- | locale/gitlab.pot | 3 | ||||
-rw-r--r-- | spec/factories/clusters/applications/helm.rb | 4 | ||||
-rw-r--r-- | spec/factories/clusters/clusters.rb | 2 | ||||
-rw-r--r-- | spec/lib/gitlab/kubernetes/config_map_spec.rb | 16 | ||||
-rw-r--r-- | spec/lib/gitlab/kubernetes/helm/pod_spec.rb | 2 | ||||
-rw-r--r-- | spec/models/clusters/applications/knative_spec.rb | 13 | ||||
-rw-r--r-- | spec/models/clusters/applications/prometheus_spec.rb | 349 | ||||
-rw-r--r-- | spec/models/clusters/cluster_spec.rb | 20 |
18 files changed, 82 insertions, 550 deletions
diff --git a/app/assets/javascripts/super_sidebar/components/super_sidebar.vue b/app/assets/javascripts/super_sidebar/components/super_sidebar.vue index 39ae4df08a7..e8df534346b 100644 --- a/app/assets/javascripts/super_sidebar/components/super_sidebar.vue +++ b/app/assets/javascripts/super_sidebar/components/super_sidebar.vue @@ -1,5 +1,6 @@ <script> -import { GlCollapse } from '@gitlab/ui'; +import { GlButton, GlCollapse } from '@gitlab/ui'; +import { __ } from '~/locale'; import { isCollapsed, toggleSuperSidebarCollapsed } from '../super_sidebar_collapsed_state_manager'; import UserBar from './user_bar.vue'; import SidebarPortalTarget from './sidebar_portal_target.vue'; @@ -10,6 +11,7 @@ import SidebarMenu from './sidebar_menu.vue'; export default { components: { + GlButton, GlCollapse, UserBar, ContextSwitcherToggle, @@ -18,6 +20,9 @@ export default { SidebarMenu, SidebarPortalTarget, }, + i18n: { + skipToMainContent: __('Skip to main content'), + }, props: { sidebarData: { type: Object, @@ -55,6 +60,13 @@ export default { :inert="isCollapased" tabindex="-1" > + <gl-button + class="super-sidebar-skip-to gl-sr-only-focusable gl-absolute gl-left-3 gl-right-3 gl-top-3" + href="#content-body" + variant="confirm" + > + {{ $options.i18n.skipToMainContent }} + </gl-button> <user-bar :sidebar-data="sidebarData" /> <div class="gl-display-flex gl-flex-direction-column gl-flex-grow-1 gl-overflow-hidden"> <div class="gl-flex-grow-1 gl-overflow-auto"> diff --git a/app/assets/stylesheets/framework/super_sidebar.scss b/app/assets/stylesheets/framework/super_sidebar.scss index d90c2a5df00..328ec12aaaa 100644 --- a/app/assets/stylesheets/framework/super_sidebar.scss +++ b/app/assets/stylesheets/framework/super_sidebar.scss @@ -135,6 +135,10 @@ } } +.super-sidebar-skip-to { + z-index: $super-sidebar-z-index; +} + .super-sidebar-overlay { display: none; } diff --git a/app/models/clusters/applications/knative.rb b/app/models/clusters/applications/knative.rb index 41f6bf67ba8..c8c043f3312 100644 --- a/app/models/clusters/applications/knative.rb +++ b/app/models/clusters/applications/knative.rb @@ -136,16 +136,14 @@ module Clusters @api_groups ||= YAML.safe_load(File.read(Rails.root.join(API_GROUPS_PATH))) end + # Relied on application_prometheus which is now removed def install_knative_metrics - return [] unless cluster.application_prometheus&.available? - - [Gitlab::Kubernetes::KubectlCmd.apply_file(METRICS_CONFIG)] + [] end + # Relied on application_prometheus which is now removed def delete_knative_istio_metrics - return [] unless cluster.application_prometheus&.available? - - [Gitlab::Kubernetes::KubectlCmd.delete("--ignore-not-found", "-f", METRICS_CONFIG)] + [] end end end diff --git a/app/models/clusters/applications/prometheus.rb b/app/models/clusters/applications/prometheus.rb deleted file mode 100644 index a076c871824..00000000000 --- a/app/models/clusters/applications/prometheus.rb +++ /dev/null @@ -1,126 +0,0 @@ -# frozen_string_literal: true - -module Clusters - module Applications - class Prometheus < ApplicationRecord - include ::Clusters::Concerns::PrometheusClient - - VERSION = '10.4.1' - - self.table_name = 'clusters_applications_prometheus' - - include ::Clusters::Concerns::ApplicationCore - include ::Clusters::Concerns::ApplicationStatus - include ::Clusters::Concerns::ApplicationVersion - include ::Clusters::Concerns::ApplicationData - include AfterCommitQueue - - attribute :version, default: VERSION - - scope :preload_cluster_platform, -> { preload(cluster: [:platform_kubernetes]) } - - attr_encrypted :alert_manager_token, - mode: :per_attribute_iv, - key: Settings.attr_encrypted_db_key_base_32, - algorithm: 'aes-256-gcm' - - after_initialize :set_alert_manager_token, if: :new_record? - - after_destroy do - cluster.find_or_build_integration_prometheus.destroy - end - - state_machine :status do - after_transition any => [:installed, :externally_installed] do |application| - application.cluster.find_or_build_integration_prometheus.update(enabled: true, alert_manager_token: application.alert_manager_token) - end - - after_transition any => :updating do |application| - application.update(last_update_started_at: Time.current) - end - end - - def managed_prometheus? - !externally_installed? && !uninstalled? - end - - def updated_since?(timestamp) - last_update_started_at && - last_update_started_at > timestamp && - !update_errored? - end - - def chart - "#{name}/prometheus" - end - - def repository - 'https://gitlab-org.gitlab.io/cluster-integration/helm-stable-archive' - end - - def install_command - helm_command_module::InstallCommand.new( - name: name, - repository: repository, - version: VERSION, - rbac: cluster.platform_kubernetes_rbac?, - chart: chart, - files: files, - postinstall: install_knative_metrics - ) - end - - # Deprecated, to be removed in %14.0 as part of https://gitlab.com/groups/gitlab-org/-/epics/4280 - def patch_command(values) - helm_command_module::PatchCommand.new( - name: name, - repository: repository, - version: version, - rbac: cluster.platform_kubernetes_rbac?, - chart: chart, - files: files_with_replaced_values(values) - ) - end - - def uninstall_command - helm_command_module::DeleteCommand.new( - name: name, - rbac: cluster.platform_kubernetes_rbac?, - files: files, - predelete: delete_knative_istio_metrics - ) - end - - # Returns a copy of files where the values of 'values.yaml' - # are replaced by the argument. - # - # See #values for the data format required - def files_with_replaced_values(replaced_values) - files.merge('values.yaml': replaced_values) - end - - private - - def set_alert_manager_token - self.alert_manager_token = SecureRandom.hex - end - - def install_knative_metrics - return [] unless cluster.application_knative_available? - - [Gitlab::Kubernetes::KubectlCmd.apply_file(Clusters::Applications::Knative::METRICS_CONFIG)] - end - - def delete_knative_istio_metrics - return [] unless cluster.application_knative_available? - - [ - Gitlab::Kubernetes::KubectlCmd.delete( - "-f", Clusters::Applications::Knative::METRICS_CONFIG, - "--ignore-not-found" - ) - ] - end - end - end -end diff --git a/app/models/clusters/cluster.rb b/app/models/clusters/cluster.rb index 0c3146fba0b..5cd11265808 100644 --- a/app/models/clusters/cluster.rb +++ b/app/models/clusters/cluster.rb @@ -14,7 +14,6 @@ module Clusters APPLICATIONS = { Clusters::Applications::Helm.application_name => Clusters::Applications::Helm, Clusters::Applications::Ingress.application_name => Clusters::Applications::Ingress, - Clusters::Applications::Prometheus.application_name => Clusters::Applications::Prometheus, Clusters::Applications::Runner.application_name => Clusters::Applications::Runner, Clusters::Applications::Jupyter.application_name => Clusters::Applications::Jupyter, Clusters::Applications::Knative.application_name => Clusters::Applications::Knative @@ -55,7 +54,6 @@ module Clusters has_one_cluster_application :helm has_one_cluster_application :ingress - has_one_cluster_application :prometheus has_one_cluster_application :runner has_one_cluster_application :jupyter has_one_cluster_application :knative diff --git a/db/docs/clusters_applications_prometheus.yml b/db/docs/clusters_applications_prometheus.yml index 9b99ffba5db..3c36d953726 100644 --- a/db/docs/clusters_applications_prometheus.yml +++ b/db/docs/clusters_applications_prometheus.yml @@ -1,7 +1,5 @@ --- table_name: clusters_applications_prometheus -classes: -- Clusters::Applications::Prometheus feature_categories: - kubernetes_management description: Information about installed instance of Prometheus in the cluster diff --git a/doc/ci/chatops/index.md b/doc/ci/chatops/index.md index d827fda67a1..bb3c8d537f3 100644 --- a/doc/ci/chatops/index.md +++ b/doc/ci/chatops/index.md @@ -106,11 +106,8 @@ ls: - echo -e "section_start:$( date +%s ):chat_reply\r\033[0K\n$( ls -la )\nsection_end:$( date +%s ):chat_reply\r\033[0K" ``` -## Example scripts - -The GitLab team maintains a repository of [common ChatOps scripts](https://gitlab.com/gitlab-com/chatops) -they use to interact with GitLab.com. - ## Related topics - Download the [official GitLab ChatOps icon](img/gitlab-chatops-icon.png). +- The GitLab team maintains a [repository of common ChatOps scripts](https://gitlab.com/gitlab-com/chatops) + they use to interact with GitLab.com. diff --git a/doc/ci/runners/register_runner.md b/doc/ci/runners/register_runner.md new file mode 100644 index 00000000000..ec10a1299dc --- /dev/null +++ b/doc/ci/runners/register_runner.md @@ -0,0 +1,33 @@ +--- +stage: Verify +group: Runner +info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments +--- + +# Register a shared runner **(FREE)** + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383139) in GitLab 15.10. [Deployed behind the `create_runner_workflow_for_admin` flag](../../administration/feature_flags.md), disabled by default. + +FLAG: +On self-managed GitLab, this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `create_runner_workflow_for_admin`. +On GitLab.com, this feature is available but can be configured by GitLab.com administrators only. + +Prerequisites: + +- You must be an administrator to register a shared runner. + +To register a [shared runner](../runners/runners_scope.md#shared-runners): + +1. On the top bar, select **Main menu > Admin**. +1. On the left sidebar, select **CI/CD > Runners**. +1. Select **New instance runner**. +1. Select a platform. +1. Optional. Enter a description. +1. Optional. Enter a maintenance note. +1. Optional. Enter configurations for the runner. +1. Select **Submit**. +1. Follow the instructions to register the runner from the command line. + +NOTE: +The token only displays in the UI for a short period of time during registration, +and is then saved in `config.toml`. diff --git a/doc/install/installation.md b/doc/install/installation.md index f132bc2dd6f..cdea850cf58 100644 --- a/doc/install/installation.md +++ b/doc/install/installation.md @@ -45,12 +45,12 @@ If the highest number stable branch is unclear, check the [GitLab blog](https:// ## Software requirements -| Software | Minimum version | Notes | -| ------------------ | --------------- |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| [Ruby](#2-ruby) | `2.7` | From GitLab 13.6, Ruby 2.7 is required. Ruby 3.0 is not supported yet (see [the relevant epic](https://gitlab.com/groups/gitlab-org/-/epics/5149) for the current status). You must use the standard MRI implementation of Ruby. We love [JRuby](https://www.jruby.org/) and [Rubinius](https://github.com/rubinius/rubinius#the-rubinius-language-platform), but GitLab needs several Gems that have native extensions. | -| [Go](#3-go) | `1.18` | From GitLab 15.6, Go 1.18 or later is required. | -| [Git](#git) | `2.38.x` | From GitLab 15.8, Git 2.38.x and later is required. It's highly recommended that you use the [Git version provided by Gitaly](#git). | -| [Node.js](#4-node) | `16.15.0` | From GitLab 15.7, Node.js 16.15.0 or later is required. | +| Software | Minimum version | Notes | +|:-------------------|:----------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [Ruby](#2-ruby) | `3.0.x` | From GitLab 15.10, Ruby 3.0 is required. You must use the standard MRI implementation of Ruby. We love [JRuby](https://www.jruby.org/) and [Rubinius](https://github.com/rubinius/rubinius#the-rubinius-language-platform), but GitLab needs several Gems that have native extensions. | +| [Go](#3-go) | `1.18.x` | From GitLab 15.6, Go 1.18 or later is required. | +| [Git](#git) | `2.38.x` | From GitLab 15.8, Git 2.38.x and later is required. It's highly recommended that you use the [Git version provided by Gitaly](#git). | +| [Node.js](#4-node) | `16.15.0` | From GitLab 15.7, Node.js 16.15.0 or later is required. | ## GitLab directory structure @@ -223,8 +223,8 @@ Download Ruby and compile it: ```shell mkdir /tmp/ruby && cd /tmp/ruby -curl --remote-name --location --progress-bar "https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.6.tar.gz" -echo 'e7203b0cc09442ed2c08936d483f8ac140ec1c72e37bb5c401646b7866cb5d10 ruby-2.7.6.tar.gz' | sha256sum -c - && tar xzf ruby-2.7.6.tar.gz +curl --remote-name --location --progress-bar "https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.5.tar.gz" +echo '9afc6380a027a4fe1ae1a3e2eccb6b497b9c5ac0631c12ca56f9b7beb4848776 ruby-3.0.5.tar.gz' | sha256sum -c - && tar xzf ruby-3.0.5.tar.gz cd ruby-2.7.6 ./configure --disable-install-rdoc --enable-shared diff --git a/doc/update/upgrading_from_source.md b/doc/update/upgrading_from_source.md index b5ce0e74100..b6efaa7ec25 100644 --- a/doc/update/upgrading_from_source.md +++ b/doc/update/upgrading_from_source.md @@ -59,18 +59,15 @@ sudo service gitlab stop ### 3. Update Ruby -NOTE: -Beginning in GitLab 13.6, we only support Ruby 2.7 or higher, and dropped -support for Ruby 2.6. Be sure to upgrade if necessary. - +From GitLab 15.10, we only support Ruby 3.0 or higher and dropped support for Ruby 2.7. Be sure to upgrade if necessary. You can check which version you are running with `ruby -v`. Download Ruby and compile it: ```shell mkdir /tmp/ruby && cd /tmp/ruby -curl --remote-name --location --progress-bar "https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.6.tar.gz" -echo 'e7203b0cc09442ed2c08936d483f8ac140ec1c72e37bb5c401646b7866cb5d10 ruby-2.7.6.tar.gz' | sha256sum -c - && tar xzf ruby-2.7.6.tar.gz +curl --remote-name --location --progress-bar "https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.5.tar.gz" +echo '9afc6380a027a4fe1ae1a3e2eccb6b497b9c5ac0631c12ca56f9b7beb4848776 ruby-3.0.5.tar.gz' | sha256sum -c - && tar xzf ruby-3.0.5.tar.gz cd ruby-2.7.6 ./configure --disable-install-rdoc --enable-shared diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 26e06bb1803..a1d3f1fbf90 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -40706,6 +40706,9 @@ msgstr "" msgid "Size limit per repository (MB)" msgstr "" +msgid "Skip to main content" +msgstr "" + msgid "Skipped" msgstr "" diff --git a/spec/factories/clusters/applications/helm.rb b/spec/factories/clusters/applications/helm.rb index 200eebfa7ae..99110a9b841 100644 --- a/spec/factories/clusters/applications/helm.rb +++ b/spec/factories/clusters/applications/helm.rb @@ -98,10 +98,6 @@ FactoryBot.define do cluster factory: %i(cluster with_installed_helm provided_by_gcp) end - factory :clusters_applications_prometheus, class: 'Clusters::Applications::Prometheus' do - cluster factory: %i(cluster with_installed_helm provided_by_gcp) - end - factory :clusters_applications_runner, class: 'Clusters::Applications::Runner' do cluster factory: %i(cluster with_installed_helm provided_by_gcp) end diff --git a/spec/factories/clusters/clusters.rb b/spec/factories/clusters/clusters.rb index 8ae277af637..d92ee6dcbe7 100644 --- a/spec/factories/clusters/clusters.rb +++ b/spec/factories/clusters/clusters.rb @@ -87,14 +87,12 @@ FactoryBot.define do end trait :with_installed_prometheus do - application_prometheus factory: %i(clusters_applications_prometheus installed) integration_prometheus factory: %i(clusters_integrations_prometheus) end trait :with_all_applications do application_helm factory: %i(clusters_applications_helm installed) application_ingress factory: %i(clusters_applications_ingress installed) - application_prometheus factory: %i(clusters_applications_prometheus installed) application_runner factory: %i(clusters_applications_runner installed) application_jupyter factory: %i(clusters_applications_jupyter installed) application_knative factory: %i(clusters_applications_knative installed) diff --git a/spec/lib/gitlab/kubernetes/config_map_spec.rb b/spec/lib/gitlab/kubernetes/config_map_spec.rb index 2d0d205ffb1..ebc2202921b 100644 --- a/spec/lib/gitlab/kubernetes/config_map_spec.rb +++ b/spec/lib/gitlab/kubernetes/config_map_spec.rb @@ -4,20 +4,23 @@ require 'spec_helper' RSpec.describe Gitlab::Kubernetes::ConfigMap do let(:kubeclient) { double('kubernetes client') } - let(:application) { create(:clusters_applications_prometheus) } - let(:config_map) { described_class.new(application.name, application.files) } + let(:name) { 'my-name' } + let(:files) { [] } + let(:config_map) { described_class.new(name, files) } let(:namespace) { Gitlab::Kubernetes::Helm::NAMESPACE } let(:metadata) do { - name: "values-content-configuration-#{application.name}", + name: "values-content-configuration-#{name}", namespace: namespace, - labels: { name: "values-content-configuration-#{application.name}" } + labels: { name: "values-content-configuration-#{name}" } } end describe '#generate' do - let(:resource) { ::Kubeclient::Resource.new(metadata: metadata, data: application.files) } + let(:resource) do + ::Kubeclient::Resource.new(metadata: metadata, data: files) + end subject { config_map.generate } @@ -28,7 +31,8 @@ RSpec.describe Gitlab::Kubernetes::ConfigMap do describe '#config_map_name' do it 'returns the config_map name' do - expect(config_map.config_map_name).to eq("values-content-configuration-#{application.name}") + expect(config_map.config_map_name) + .to eq("values-content-configuration-#{name}") end end end diff --git a/spec/lib/gitlab/kubernetes/helm/pod_spec.rb b/spec/lib/gitlab/kubernetes/helm/pod_spec.rb index e3763977add..8aa755bffce 100644 --- a/spec/lib/gitlab/kubernetes/helm/pod_spec.rb +++ b/spec/lib/gitlab/kubernetes/helm/pod_spec.rb @@ -13,7 +13,7 @@ RSpec.describe Gitlab::Kubernetes::Helm::Pod do with_them do let(:cluster) { create(:cluster, helm_major_version: helm_major_version) } - let(:app) { create(:clusters_applications_prometheus, cluster: cluster) } + let(:app) { create(:clusters_applications_knative, cluster: cluster) } let(:command) { app.install_command } let(:namespace) { Gitlab::Kubernetes::Helm::NAMESPACE } let(:service_account_name) { nil } diff --git a/spec/models/clusters/applications/knative_spec.rb b/spec/models/clusters/applications/knative_spec.rb index a95cb672d9e..91e90de02c0 100644 --- a/spec/models/clusters/applications/knative_spec.rb +++ b/spec/models/clusters/applications/knative_spec.rb @@ -131,19 +131,6 @@ RSpec.describe Clusters::Applications::Knative do it 'does not install metrics for prometheus' do expect(subject.postinstall).to be_empty end - - context 'with prometheus installed' do - let(:prometheus) { create(:clusters_applications_prometheus, :installed) } - let(:knative) { create(:clusters_applications_knative, cluster: prometheus.cluster) } - - subject { knative.install_command } - - it 'installs metrics' do - expect(subject.postinstall).not_to be_empty - expect(subject.postinstall.length).to be(1) - expect(subject.postinstall[0]).to eql("kubectl apply -f #{Clusters::Applications::Knative::METRICS_CONFIG}") - end - end end describe '#install_command' do diff --git a/spec/models/clusters/applications/prometheus_spec.rb b/spec/models/clusters/applications/prometheus_spec.rb deleted file mode 100644 index 15c3162270e..00000000000 --- a/spec/models/clusters/applications/prometheus_spec.rb +++ /dev/null @@ -1,349 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Clusters::Applications::Prometheus do - include KubernetesHelpers - include StubRequests - - include_examples 'cluster application core specs', :clusters_applications_prometheus - include_examples 'cluster application status specs', :clusters_applications_prometheus - include_examples 'cluster application version specs', :clusters_applications_prometheus - include_examples 'cluster application helm specs', :clusters_applications_prometheus - include_examples 'cluster application initial status specs' - - describe 'default values' do - subject(:prometheus) { build(:clusters_applications_prometheus) } - - it { expect(prometheus.alert_manager_token).to be_an_instance_of(String) } - it { expect(prometheus.version).to eq(described_class::VERSION) } - end - - describe 'after_destroy' do - let(:cluster) { create(:cluster, :with_installed_helm) } - let(:application) { create(:clusters_applications_prometheus, :installed, cluster: cluster) } - - it 'disables the corresponding integration' do - application.destroy! - - expect(cluster.integration_prometheus).not_to be_enabled - end - end - - describe 'transition to installed' do - let(:project) { create(:project) } - let(:cluster) { create(:cluster, :with_installed_helm) } - let(:application) { create(:clusters_applications_prometheus, :installing, cluster: cluster) } - - it 'enables the corresponding integration' do - application.make_installed - - expect(cluster.integration_prometheus).to be_enabled - end - end - - describe 'transition to externally_installed' do - let(:project) { create(:project) } - let(:cluster) { create(:cluster, :with_installed_helm) } - let(:application) { create(:clusters_applications_prometheus, :installing, cluster: cluster) } - - it 'enables the corresponding integration' do - application.make_externally_installed! - - expect(cluster.integration_prometheus).to be_enabled - end - end - - describe 'transition to updating' do - let(:project) { create(:project) } - let(:cluster) { create(:cluster, projects: [project]) } - - subject { create(:clusters_applications_prometheus, :installed, cluster: cluster) } - - it 'sets last_update_started_at to now' do - freeze_time do - expect { subject.make_updating }.to change { subject.reload.last_update_started_at }.to be_within(1.second).of(Time.current) - end - end - end - - describe '#managed_prometheus?' do - subject { prometheus.managed_prometheus? } - - let(:prometheus) { build(:clusters_applications_prometheus) } - - it { is_expected.to be_truthy } - - context 'externally installed' do - let(:prometheus) { build(:clusters_applications_prometheus, :externally_installed) } - - it { is_expected.to be_falsey } - end - - context 'uninstalled' do - let(:prometheus) { build(:clusters_applications_prometheus, :uninstalled) } - - it { is_expected.to be_falsey } - end - end - - describe '#can_uninstall?' do - let(:prometheus) { create(:clusters_applications_prometheus) } - - subject { prometheus.can_uninstall? } - - it { is_expected.to be_truthy } - end - - describe '#prometheus_client' do - include_examples '#prometheus_client shared' do - let(:factory) { :clusters_applications_prometheus } - end - end - - describe '#install_command' do - let(:prometheus) { create(:clusters_applications_prometheus) } - - subject { prometheus.install_command } - - it { is_expected.to be_an_instance_of(Gitlab::Kubernetes::Helm::V3::InstallCommand) } - - it 'is initialized with 3 arguments' do - expect(subject.name).to eq('prometheus') - expect(subject.chart).to eq('prometheus/prometheus') - expect(subject.version).to eq('10.4.1') - expect(subject).to be_rbac - expect(subject.files).to eq(prometheus.files) - end - - context 'on a non rbac enabled cluster' do - before do - prometheus.cluster.platform_kubernetes.abac! - end - - it { is_expected.not_to be_rbac } - end - - context 'application failed to install previously' do - let(:prometheus) { create(:clusters_applications_prometheus, :errored, version: '2.0.0') } - - it 'is initialized with the locked version' do - expect(subject.version).to eq('10.4.1') - end - end - - it 'does not install knative metrics' do - expect(subject.postinstall).to be_empty - end - - context 'with knative installed' do - let(:knative) { create(:clusters_applications_knative, :updated) } - let(:prometheus) { create(:clusters_applications_prometheus, cluster: knative.cluster) } - - subject { prometheus.install_command } - - it 'installs knative metrics' do - expect(subject.postinstall).to include("kubectl apply -f #{Clusters::Applications::Knative::METRICS_CONFIG}") - end - end - end - - describe '#uninstall_command' do - let(:prometheus) { create(:clusters_applications_prometheus) } - - subject { prometheus.uninstall_command } - - it { is_expected.to be_an_instance_of(Gitlab::Kubernetes::Helm::V3::DeleteCommand) } - - it 'has the application name' do - expect(subject.name).to eq('prometheus') - end - - it 'has files' do - expect(subject.files).to eq(prometheus.files) - end - - it 'is rbac' do - expect(subject).to be_rbac - end - - describe '#predelete' do - let(:knative) { create(:clusters_applications_knative, :updated) } - let(:prometheus) { create(:clusters_applications_prometheus, cluster: knative.cluster) } - - subject { prometheus.uninstall_command.predelete } - - it 'deletes knative metrics' do - metrics_config = Clusters::Applications::Knative::METRICS_CONFIG - is_expected.to include("kubectl delete -f #{metrics_config} --ignore-not-found") - end - end - - context 'on a non rbac enabled cluster' do - before do - prometheus.cluster.platform_kubernetes.abac! - end - - it { is_expected.not_to be_rbac } - end - end - - describe '#patch_command' do - subject(:patch_command) { prometheus.patch_command(values) } - - let(:prometheus) { build(:clusters_applications_prometheus) } - let(:values) { prometheus.values } - - it { is_expected.to be_an_instance_of(::Gitlab::Kubernetes::Helm::V3::PatchCommand) } - - it 'is initialized with 3 arguments' do - expect(patch_command.name).to eq('prometheus') - expect(patch_command.chart).to eq('prometheus/prometheus') - expect(patch_command.version).to eq('10.4.1') - expect(patch_command.files).to eq(prometheus.files) - end - end - - describe '#update_in_progress?' do - context 'when app is updating' do - it 'returns true' do - cluster = create(:cluster) - prometheus_app = build(:clusters_applications_prometheus, :updating, cluster: cluster) - - expect(prometheus_app.update_in_progress?).to be true - end - end - end - - describe '#update_errored?' do - context 'when app errored' do - it 'returns true' do - cluster = create(:cluster) - prometheus_app = build(:clusters_applications_prometheus, :update_errored, cluster: cluster) - - expect(prometheus_app.update_errored?).to be true - end - end - end - - describe '#files' do - let(:application) { create(:clusters_applications_prometheus) } - let(:values) { subject[:'values.yaml'] } - - subject { application.files } - - it 'includes prometheus valid values' do - expect(values).to include('alertmanager') - expect(values).to include('kubeStateMetrics') - expect(values).to include('nodeExporter') - expect(values).to include('pushgateway') - expect(values).to include('serverFiles') - end - end - - describe '#files_with_replaced_values' do - let(:application) { build(:clusters_applications_prometheus) } - let(:files) { application.files } - - subject { application.files_with_replaced_values({ hello: :world }) } - - it 'does not modify #files' do - expect(subject[:'values.yaml']).not_to eq(files[:'values.yaml']) - - expect(files[:'values.yaml']).to eq(application.values) - end - - it 'returns values.yaml with replaced values' do - expect(subject[:'values.yaml']).to eq({ hello: :world }) - end - - it 'uses values from #files, except for values.yaml' do - allow(application).to receive(:files).and_return({ - 'values.yaml': 'some value specific to files', - 'file_a.txt': 'file_a', - 'file_b.txt': 'file_b' - }) - - expect(subject.except(:'values.yaml')).to eq({ - 'file_a.txt': 'file_a', - 'file_b.txt': 'file_b' - }) - end - end - - describe '#configured?' do - let(:prometheus) { create(:clusters_applications_prometheus, :installed, cluster: cluster) } - - subject { prometheus.configured? } - - context 'when a kubenetes client is present' do - let(:cluster) { create(:cluster, :project, :provided_by_gcp) } - - it { is_expected.to be_truthy } - - context 'when it is not availalble' do - let(:prometheus) { create(:clusters_applications_prometheus, cluster: cluster) } - - it { is_expected.to be_falsey } - end - - context 'when the kubernetes URL is blocked' do - before do - blocked_ip = '127.0.0.1' # localhost addresses are blocked by default - - stub_all_dns(cluster.platform.api_url, ip_address: blocked_ip) - end - - it { is_expected.to be_falsey } - end - end - - context 'when a kubenetes client is not present' do - let(:cluster) { create(:cluster) } - - it { is_expected.to be_falsy } - end - end - - describe '#updated_since?' do - let(:cluster) { create(:cluster) } - let(:prometheus_app) { build(:clusters_applications_prometheus, cluster: cluster) } - let(:timestamp) { Time.current - 5.minutes } - - around do |example| - freeze_time { example.run } - end - - before do - prometheus_app.last_update_started_at = Time.current - end - - context 'when app does not have status failed' do - it 'returns true when last update started after the timestamp' do - expect(prometheus_app.updated_since?(timestamp)).to be true - end - - it 'returns false when last update started before the timestamp' do - expect(prometheus_app.updated_since?(Time.current + 5.minutes)).to be false - end - end - - context 'when app has status failed' do - it 'returns false when last update started after the timestamp' do - prometheus_app.status = 6 - - expect(prometheus_app.updated_since?(timestamp)).to be false - end - end - end - - describe 'alert manager token' do - subject { create(:clusters_applications_prometheus) } - - it 'is autogenerated on creation' do - expect(subject.alert_manager_token).to match(/\A\h{32}\z/) - expect(subject.encrypted_alert_manager_token).not_to be_nil - expect(subject.encrypted_alert_manager_token_iv).not_to be_nil - end - end -end diff --git a/spec/models/clusters/cluster_spec.rb b/spec/models/clusters/cluster_spec.rb index 2a2e2899d24..2d46714eb22 100644 --- a/spec/models/clusters/cluster_spec.rb +++ b/spec/models/clusters/cluster_spec.rb @@ -25,7 +25,6 @@ feature_category: :kubernetes_management do it { is_expected.to have_one(:integration_prometheus) } it { is_expected.to have_one(:application_helm) } it { is_expected.to have_one(:application_ingress) } - it { is_expected.to have_one(:application_prometheus) } it { is_expected.to have_one(:application_runner) } it { is_expected.to have_many(:kubernetes_namespaces) } it { is_expected.to have_one(:cluster_project) } @@ -714,13 +713,12 @@ feature_category: :kubernetes_management do context 'when all applications are created' do let!(:helm) { create(:clusters_applications_helm, cluster: cluster) } let!(:ingress) { create(:clusters_applications_ingress, cluster: cluster) } - let!(:prometheus) { create(:clusters_applications_prometheus, cluster: cluster) } let!(:runner) { create(:clusters_applications_runner, cluster: cluster) } let!(:jupyter) { create(:clusters_applications_jupyter, cluster: cluster) } let!(:knative) { create(:clusters_applications_knative, cluster: cluster) } it 'returns a list of created applications' do - is_expected.to contain_exactly(helm, ingress, prometheus, runner, jupyter, knative) + is_expected.to contain_exactly(helm, ingress, runner, jupyter, knative) end end @@ -1342,22 +1340,6 @@ feature_category: :kubernetes_management do expect(cluster.prometheus_adapter).to eq(integration) end end - - context 'has application_prometheus' do - let_it_be(:application) { create(:clusters_applications_prometheus, :no_helm_installed, cluster: cluster) } - - it 'returns nil' do - expect(cluster.prometheus_adapter).to be_nil - end - - context 'also has a integration_prometheus' do - let_it_be(:integration) { create(:clusters_integrations_prometheus, cluster: cluster) } - - it 'returns the integration' do - expect(cluster.prometheus_adapter).to eq(integration) - end - end - end end describe '#delete_cached_resources!' do |