From cc9d7f881e2df15219df95ed7e3220f7d57eb695 Mon Sep 17 00:00:00 2001 From: Adrien Kohlbecker Date: Tue, 3 Mar 2020 14:38:01 +0100 Subject: [PATCH 01/11] Move logs to core (backend) backend side --- .../controllers/projects/logs_controller.rb | 0 app/helpers/environments_helper.rb | 9 ++++ app/models/environment.rb | 4 ++ app/policies/project_policy.rb | 1 + app/serializers/environment_entity.rb | 20 ++++++++ .../services/pod_logs/base_service.rb | 0 .../pod_logs/elasticsearch_service.rb | 0 .../services/pod_logs/kubernetes_service.rb | 0 config/routes/project.rb | 7 +++ ee/app/helpers/ee/environments_helper.rb | 9 ---- ee/app/models/ee/environment.rb | 6 +-- ee/app/policies/ee/project_policy.rb | 6 --- ee/app/serializers/ee/environment_entity.rb | 20 -------- ee/config/routes/project.rb | 7 --- .../api/schemas/clusters/environment.json | 1 + ee/spec/fixtures/api/schemas/environment.json | 9 ++++ ee/spec/models/environment_spec.rb | 35 -------------- .../groups/clusters_controller_spec.rb | 8 +++- .../clusters/environment_entity_spec.rb | 17 +------ .../serializers/environment_entity_spec.rb | 35 -------------- {ee/lib => lib}/gitlab/elasticsearch/logs.rb | 0 .../gitlab/usage_counters/common.rb | 0 .../gitlab/usage_counters/pod_logs.rb | 0 .../projects/logs_controller_spec.rb | 46 ++++--------------- spec/fixtures/api/schemas/environment.json | 3 ++ .../lib/elasticsearch/logs_response.json | 0 .../fixtures/lib/elasticsearch/query.json | 0 .../elasticsearch/query_with_container.json | 0 .../elasticsearch/query_with_end_time.json | 0 .../lib/elasticsearch/query_with_search.json | 0 .../elasticsearch/query_with_start_time.json | 0 .../lib/elasticsearch/query_with_times.json | 0 .../lib/gitlab/elasticsearch/logs_spec.rb | 14 +++--- spec/models/environment_spec.rb | 35 ++++++++++++++ spec/serializers/environment_entity_spec.rb | 20 ++++++++ .../services/pod_logs/base_service_spec.rb | 0 .../pod_logs/elasticsearch_service_spec.rb | 0 .../pod_logs/kubernetes_service_spec.rb | 0 38 files changed, 135 insertions(+), 177 deletions(-) rename {ee/app => app}/controllers/projects/logs_controller.rb (100%) rename {ee/app => app}/services/pod_logs/base_service.rb (100%) rename {ee/app => app}/services/pod_logs/elasticsearch_service.rb (100%) rename {ee/app => app}/services/pod_logs/kubernetes_service.rb (100%) rename {ee/lib => lib}/gitlab/elasticsearch/logs.rb (100%) rename {ee/lib => lib}/gitlab/usage_counters/common.rb (100%) rename {ee/lib => lib}/gitlab/usage_counters/pod_logs.rb (100%) rename {ee/spec => spec}/controllers/projects/logs_controller_spec.rb (76%) rename {ee/spec => spec}/fixtures/lib/elasticsearch/logs_response.json (100%) rename {ee/spec => spec}/fixtures/lib/elasticsearch/query.json (100%) rename {ee/spec => spec}/fixtures/lib/elasticsearch/query_with_container.json (100%) rename {ee/spec => spec}/fixtures/lib/elasticsearch/query_with_end_time.json (100%) rename {ee/spec => spec}/fixtures/lib/elasticsearch/query_with_search.json (100%) rename {ee/spec => spec}/fixtures/lib/elasticsearch/query_with_start_time.json (100%) rename {ee/spec => spec}/fixtures/lib/elasticsearch/query_with_times.json (100%) rename {ee/spec => spec}/lib/gitlab/elasticsearch/logs_spec.rb (92%) rename {ee/spec => spec}/services/pod_logs/base_service_spec.rb (100%) rename {ee/spec => spec}/services/pod_logs/elasticsearch_service_spec.rb (100%) rename {ee/spec => spec}/services/pod_logs/kubernetes_service_spec.rb (100%) diff --git a/ee/app/controllers/projects/logs_controller.rb b/app/controllers/projects/logs_controller.rb similarity index 100% rename from ee/app/controllers/projects/logs_controller.rb rename to app/controllers/projects/logs_controller.rb diff --git a/app/helpers/environments_helper.rb b/app/helpers/environments_helper.rb index fd330d4efd980c..6bf920448a5ccf 100644 --- a/app/helpers/environments_helper.rb +++ b/app/helpers/environments_helper.rb @@ -41,4 +41,13 @@ def metrics_data(project, environment) "external-dashboard-url" => project.metrics_setting_external_dashboard_url } end + + def environment_logs_data(project, environment) + { + "environment-name": environment.name, + "environments-path": project_environments_path(project, format: :json), + "environment-id": environment.id, + "cluster-applications-documentation-path" => help_page_path('user/clusters/applications.md', anchor: 'elastic-stack') + } + end end diff --git a/app/models/environment.rb b/app/models/environment.rb index 0e2962b893a7cd..f797ef6074feec 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -330,6 +330,10 @@ def auto_stop_in=(value) self.auto_stop_at = parsed_result.seconds.from_now end + def elastic_stack_available? + !!last_deployment&.cluster&.application_elastic_stack&.available? + end + private def has_metrics_and_can_query? diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb index 15d60fe9cd8801..95b92d4c108d9a 100644 --- a/app/policies/project_policy.rb +++ b/app/policies/project_policy.rb @@ -314,6 +314,7 @@ class ProjectPolicy < BasePolicy enable :admin_operations enable :read_deploy_token enable :create_deploy_token + enable :read_pod_logs end rule { (mirror_available & can?(:admin_project)) | admin }.enable :admin_remote_mirror diff --git a/app/serializers/environment_entity.rb b/app/serializers/environment_entity.rb index 74d6806e83f1da..d9af7af8a8be00 100644 --- a/app/serializers/environment_entity.rb +++ b/app/serializers/environment_entity.rb @@ -47,6 +47,22 @@ class EnvironmentEntity < Grape::Entity environment.available? && can?(current_user, :stop_environment, environment) end + expose :logs_path, if: -> (*) { can_read_pod_logs? } do |environment| + project_logs_path(environment.project, environment_name: environment.name) + end + + expose :logs_api_path, if: -> (*) { can_read_pod_logs? } do |environment| + if environment.elastic_stack_available? + elasticsearch_project_logs_path(environment.project, environment_name: environment.name, format: :json) + else + k8s_project_logs_path(environment.project, environment_name: environment.name, format: :json) + end + end + + expose :enable_advanced_logs_querying, if: -> (*) { can_read_pod_logs? } do |environment| + environment.elastic_stack_available? + end + private alias_method :environment, :object @@ -63,6 +79,10 @@ def can_update_environment? can?(current_user, :update_environment, environment) end + def can_read_pod_logs? + can?(current_user, :read_pod_logs, environment.project) + end + def cluster_platform_kubernetes? deployment_platform && deployment_platform.is_a?(Clusters::Platforms::Kubernetes) end diff --git a/ee/app/services/pod_logs/base_service.rb b/app/services/pod_logs/base_service.rb similarity index 100% rename from ee/app/services/pod_logs/base_service.rb rename to app/services/pod_logs/base_service.rb diff --git a/ee/app/services/pod_logs/elasticsearch_service.rb b/app/services/pod_logs/elasticsearch_service.rb similarity index 100% rename from ee/app/services/pod_logs/elasticsearch_service.rb rename to app/services/pod_logs/elasticsearch_service.rb diff --git a/ee/app/services/pod_logs/kubernetes_service.rb b/app/services/pod_logs/kubernetes_service.rb similarity index 100% rename from ee/app/services/pod_logs/kubernetes_service.rb rename to app/services/pod_logs/kubernetes_service.rb diff --git a/config/routes/project.rb b/config/routes/project.rb index 809c1386f2c09e..83575580321cca 100644 --- a/config/routes/project.rb +++ b/config/routes/project.rb @@ -175,6 +175,13 @@ end end + resources :logs, only: [:index] do + collection do + get :k8s + get :elasticsearch + end + end + resources :starrers, only: [:index] resources :forks, only: [:index, :new, :create] resources :group_links, only: [:index, :create, :update, :destroy], constraints: { id: /\d+/ } diff --git a/ee/app/helpers/ee/environments_helper.rb b/ee/app/helpers/ee/environments_helper.rb index 3d6919fc99510f..f7c8502930dcdd 100644 --- a/ee/app/helpers/ee/environments_helper.rb +++ b/ee/app/helpers/ee/environments_helper.rb @@ -30,15 +30,6 @@ def custom_metrics_available?(project) project.feature_available?(:custom_prometheus_metrics) && can?(current_user, :admin_project, project) end - def environment_logs_data(project, environment) - { - "environment-name": environment.name, - "environments-path": project_environments_path(project, format: :json), - "environment-id": environment.id, - "cluster-applications-documentation-path" => help_page_path('user/clusters/applications.md', anchor: 'elastic-stack') - } - end - def metrics_data(project, environment) ee_metrics_data = { "custom-metrics-path" => project_prometheus_metrics_path(project), diff --git a/ee/app/models/ee/environment.rb b/ee/app/models/ee/environment.rb index f2762318232336..483b7585deb7cb 100644 --- a/ee/app/models/ee/environment.rb +++ b/ee/app/models/ee/environment.rb @@ -32,7 +32,7 @@ module Environment scope :preload_for_cluster_environment_entity, -> do preload( - last_deployment: [:deployable], + last_deployment: [:deployable, { cluster: :application_elastic_stack }], project: [:route, { namespace: :route }] ) end @@ -77,10 +77,6 @@ def rollout_status result || ::Gitlab::Kubernetes::RolloutStatus.loading end - def elastic_stack_available? - !!deployment_platform&.cluster&.application_elastic_stack&.available? - end - private def rollout_status_available? diff --git a/ee/app/policies/ee/project_policy.rb b/ee/app/policies/ee/project_policy.rb index 17cc0b61195fd3..74f0a8d7950bd3 100644 --- a/ee/app/policies/ee/project_policy.rb +++ b/ee/app/policies/ee/project_policy.rb @@ -77,11 +77,6 @@ module ProjectPolicy @subject.feature_available?(:reject_unsigned_commits) end - with_scope :subject - condition(:pod_logs_enabled) do - @subject.feature_available?(:pod_logs, @user) - end - with_scope :subject condition(:security_dashboard_enabled) do @subject.feature_available?(:security_dashboard) @@ -230,7 +225,6 @@ module ProjectPolicy rule { license_scanning_enabled & can?(:maintainer_access) }.enable :admin_software_license_policy - rule { pod_logs_enabled & can?(:maintainer_access) }.enable :read_pod_logs rule { prometheus_alerts_enabled & can?(:maintainer_access) }.enable :read_prometheus_alerts rule { auditor }.policy do diff --git a/ee/app/serializers/ee/environment_entity.rb b/ee/app/serializers/ee/environment_entity.rb index 65290c459e1b1e..e61a0750f8ed0a 100644 --- a/ee/app/serializers/ee/environment_entity.rb +++ b/ee/app/serializers/ee/environment_entity.rb @@ -7,30 +7,10 @@ module EnvironmentEntity prepended do expose :rollout_status, if: -> (*) { can_read_deploy_board? }, using: ::RolloutStatusEntity - - expose :logs_path, if: -> (*) { can_read_pod_logs? } do |environment| - project_logs_path(environment.project, environment_name: environment.name) - end - - expose :logs_api_path, if: -> (*) { can_read_pod_logs? } do |environment| - if environment.elastic_stack_available? - elasticsearch_project_logs_path(environment.project, environment_name: environment.name, format: :json) - else - k8s_project_logs_path(environment.project, environment_name: environment.name, format: :json) - end - end - - expose :enable_advanced_logs_querying, if: -> (*) { can_read_pod_logs? } do |environment| - environment.elastic_stack_available? - end end private - def can_read_pod_logs? - can?(current_user, :read_pod_logs, environment.project) - end - def can_read_deploy_board? can?(current_user, :read_deploy_board, environment.project) end diff --git a/ee/config/routes/project.rb b/ee/config/routes/project.rb index ad45a6679f38dc..58a8bcae97313d 100644 --- a/ee/config/routes/project.rb +++ b/ee/config/routes/project.rb @@ -73,13 +73,6 @@ resource :threat_monitoring, only: [:show], controller: :threat_monitoring - resources :logs, only: [:index] do - collection do - get :k8s - get :elasticsearch - end - end - resources :protected_environments, only: [:create, :update, :destroy], constraints: { id: /\d+/ } do collection do get 'search' diff --git a/ee/spec/fixtures/api/schemas/clusters/environment.json b/ee/spec/fixtures/api/schemas/clusters/environment.json index a5017c294b3066..f72fb4c396c5a9 100644 --- a/ee/spec/fixtures/api/schemas/clusters/environment.json +++ b/ee/spec/fixtures/api/schemas/clusters/environment.json @@ -24,6 +24,7 @@ { "$ref": "../rollout_status.json" } ] }, + "logs_path": { "type": "string" }, "updated_at": { "type": "date" } }, "additionalProperties": false diff --git a/ee/spec/fixtures/api/schemas/environment.json b/ee/spec/fixtures/api/schemas/environment.json index 1d4e93eb6f443a..34f6408ea8eeb1 100644 --- a/ee/spec/fixtures/api/schemas/environment.json +++ b/ee/spec/fixtures/api/schemas/environment.json @@ -57,6 +57,15 @@ "folder_path": { "type": "string" }, + "logs_path": { + "type": "string" + }, + "logs_api_path": { + "type": "string" + }, + "enable_advanced_logs_querying": { + "type": "boolean" + }, "created_at": { "type": "date" }, diff --git a/ee/spec/models/environment_spec.rb b/ee/spec/models/environment_spec.rb index 2ff79e1a133cf0..f6be6f744dd375 100644 --- a/ee/spec/models/environment_spec.rb +++ b/ee/spec/models/environment_spec.rb @@ -229,39 +229,4 @@ end end end - - describe '#elastic_stack_available?' do - let!(:cluster) { create(:cluster, :project, :provided_by_user, projects: [project]) } - let!(:deployment) { create(:deployment, :success, environment: environment, project: project) } - - context 'when app does not exist' do - it 'returns false' do - expect(environment.elastic_stack_available?).to be(false) - end - end - - context 'when app exists' do - let!(:application) { create(:clusters_applications_elastic_stack, cluster: cluster) } - - it 'returns false' do - expect(environment.elastic_stack_available?).to be(false) - end - end - - context 'when app is installed' do - let!(:application) { create(:clusters_applications_elastic_stack, :installed, cluster: cluster) } - - it 'returns true' do - expect(environment.elastic_stack_available?).to be(true) - end - end - - context 'when app is updated' do - let!(:application) { create(:clusters_applications_elastic_stack, :updated, cluster: cluster) } - - it 'returns true' do - expect(environment.elastic_stack_available?).to be(true) - end - end - end end diff --git a/ee/spec/requests/groups/clusters_controller_spec.rb b/ee/spec/requests/groups/clusters_controller_spec.rb index 990a44a53b74d7..5d3bf62685c58d 100644 --- a/ee/spec/requests/groups/clusters_controller_spec.rb +++ b/ee/spec/requests/groups/clusters_controller_spec.rb @@ -26,12 +26,16 @@ def go it 'avoids N+1 database queries' do control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) { go }.count + deployment_count = 2 - create_list(:deployment, 2, :success, cluster: cluster) + create_list(:deployment, deployment_count, :success, cluster: cluster) # TODO remove this leeway when we refactor away from deployment_platform # (https://gitlab.com/gitlab-org/gitlab/issues/13635) - leeway = 5 + leeway = deployment_count * 2 + # it also appears that `can_read_pod_logs?` in ee/app/serializers/clusters/environment_entity.rb + # generates 3 additional queries per deployment + leeway += deployment_count * 3 expect { go }.not_to exceed_all_query_limit(control_count + leeway) end end diff --git a/ee/spec/serializers/clusters/environment_entity_spec.rb b/ee/spec/serializers/clusters/environment_entity_spec.rb index 4b44f4ad67ca91..8afbd55745db77 100644 --- a/ee/spec/serializers/clusters/environment_entity_spec.rb +++ b/ee/spec/serializers/clusters/environment_entity_spec.rb @@ -51,21 +51,8 @@ end end - context 'when pod_logs are available' do - before do - stub_licensed_features(pod_logs: true) - project.add_maintainer(user) - end - - it 'exposes logs_path' do - expect(subject).to include(:logs_path) - end - end - - context 'when pod_logs are not available' do - it 'does not expose logs_path' do - expect(subject).not_to include(:logs_path) - end + it 'exposes logs_path' do + expect(subject).to include(:logs_path) end end end diff --git a/ee/spec/serializers/environment_entity_spec.rb b/ee/spec/serializers/environment_entity_spec.rb index 0e29d855fc32af..39a8936d21e3e1 100644 --- a/ee/spec/serializers/environment_entity_spec.rb +++ b/ee/spec/serializers/environment_entity_spec.rb @@ -4,7 +4,6 @@ describe EnvironmentEntity do include KubernetesHelpers - include Gitlab::Routing.url_helpers let(:user) { create(:user) } let(:environment) { create(:environment) } @@ -46,39 +45,5 @@ expect(subject).not_to include(:rollout_status) end end - - context 'when pod_logs are available' do - before do - stub_licensed_features(pod_logs: true) - end - - it 'exposes logs keys' do - expect(subject).to include(:logs_path) - expect(subject).to include(:logs_api_path) - expect(subject).to include(:enable_advanced_logs_querying) - end - - it 'uses k8s api when ES is not available' do - expect(subject[:logs_api_path]).to eq(k8s_project_logs_path(environment.project, environment_name: environment.name, format: :json)) - end - - it 'uses ES api when ES is available' do - allow(environment).to receive(:elastic_stack_available?).and_return(true) - - expect(subject[:logs_api_path]).to eq(elasticsearch_project_logs_path(environment.project, environment_name: environment.name, format: :json)) - end - end - - context 'when pod_logs are not available' do - before do - stub_licensed_features(pod_logs: false) - end - - it 'does not expose logs keys' do - expect(subject).not_to include(:logs_path) - expect(subject).not_to include(:logs_api_path) - expect(subject).not_to include(:enable_advanced_logs_querying) - end - end end end diff --git a/ee/lib/gitlab/elasticsearch/logs.rb b/lib/gitlab/elasticsearch/logs.rb similarity index 100% rename from ee/lib/gitlab/elasticsearch/logs.rb rename to lib/gitlab/elasticsearch/logs.rb diff --git a/ee/lib/gitlab/usage_counters/common.rb b/lib/gitlab/usage_counters/common.rb similarity index 100% rename from ee/lib/gitlab/usage_counters/common.rb rename to lib/gitlab/usage_counters/common.rb diff --git a/ee/lib/gitlab/usage_counters/pod_logs.rb b/lib/gitlab/usage_counters/pod_logs.rb similarity index 100% rename from ee/lib/gitlab/usage_counters/pod_logs.rb rename to lib/gitlab/usage_counters/pod_logs.rb diff --git a/ee/spec/controllers/projects/logs_controller_spec.rb b/spec/controllers/projects/logs_controller_spec.rb similarity index 76% rename from ee/spec/controllers/projects/logs_controller_spec.rb rename to spec/controllers/projects/logs_controller_spec.rb index e7816cc57f441b..aeea27db255504 100644 --- a/ee/spec/controllers/projects/logs_controller_spec.rb +++ b/spec/controllers/projects/logs_controller_spec.rb @@ -22,39 +22,21 @@ end describe 'GET #index' do - context 'when unlicensed' do - before do - stub_licensed_features(pod_logs: false) - end + let(:empty_project) { create(:project) } - it 'renders forbidden' do - get :index, params: environment_params + it 'renders empty logs page if no environment exists' do + empty_project.add_maintainer(user) + get :index, params: { namespace_id: empty_project.namespace, project_id: empty_project } - expect(response).to have_gitlab_http_status(:not_found) - end + expect(response).to be_ok + expect(response).to render_template 'empty_logs' end - context 'when licensed' do - before do - stub_licensed_features(pod_logs: true) - end - - let(:empty_project) { create(:project) } - - it 'renders empty logs page if no environment exists' do - empty_project.add_maintainer(user) - get :index, params: { namespace_id: empty_project.namespace, project_id: empty_project } - - expect(response).to be_ok - expect(response).to render_template 'empty_logs' - end - - it 'renders index template' do - get :index, params: environment_params + it 'renders index template' do + get :index, params: environment_params - expect(response).to be_ok - expect(response).to render_template 'index' - end + expect(response).to be_ok + expect(response).to render_template 'index' end end @@ -80,14 +62,6 @@ end end - it 'returns 404 when unlicensed' do - stub_licensed_features(pod_logs: false) - - get endpoint, params: environment_params(pod_name: pod_name, format: :json) - - expect(response).to have_gitlab_http_status(:not_found) - end - it 'returns the service result' do get endpoint, params: environment_params(pod_name: pod_name, format: :json) diff --git a/spec/fixtures/api/schemas/environment.json b/spec/fixtures/api/schemas/environment.json index 7e7e5ce37e35a2..84217a2a01c535 100644 --- a/spec/fixtures/api/schemas/environment.json +++ b/spec/fixtures/api/schemas/environment.json @@ -26,6 +26,9 @@ "stop_path": { "type": "string" }, "cancel_auto_stop_path": { "type": "string" }, "folder_path": { "type": "string" }, + "logs_path": { "type": "string" }, + "logs_api_path": { "type": "string" }, + "enable_advanced_logs_querying": { "type": "boolean" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "auto_stop_at": { "type": "string", "format": "date-time" }, diff --git a/ee/spec/fixtures/lib/elasticsearch/logs_response.json b/spec/fixtures/lib/elasticsearch/logs_response.json similarity index 100% rename from ee/spec/fixtures/lib/elasticsearch/logs_response.json rename to spec/fixtures/lib/elasticsearch/logs_response.json diff --git a/ee/spec/fixtures/lib/elasticsearch/query.json b/spec/fixtures/lib/elasticsearch/query.json similarity index 100% rename from ee/spec/fixtures/lib/elasticsearch/query.json rename to spec/fixtures/lib/elasticsearch/query.json diff --git a/ee/spec/fixtures/lib/elasticsearch/query_with_container.json b/spec/fixtures/lib/elasticsearch/query_with_container.json similarity index 100% rename from ee/spec/fixtures/lib/elasticsearch/query_with_container.json rename to spec/fixtures/lib/elasticsearch/query_with_container.json diff --git a/ee/spec/fixtures/lib/elasticsearch/query_with_end_time.json b/spec/fixtures/lib/elasticsearch/query_with_end_time.json similarity index 100% rename from ee/spec/fixtures/lib/elasticsearch/query_with_end_time.json rename to spec/fixtures/lib/elasticsearch/query_with_end_time.json diff --git a/ee/spec/fixtures/lib/elasticsearch/query_with_search.json b/spec/fixtures/lib/elasticsearch/query_with_search.json similarity index 100% rename from ee/spec/fixtures/lib/elasticsearch/query_with_search.json rename to spec/fixtures/lib/elasticsearch/query_with_search.json diff --git a/ee/spec/fixtures/lib/elasticsearch/query_with_start_time.json b/spec/fixtures/lib/elasticsearch/query_with_start_time.json similarity index 100% rename from ee/spec/fixtures/lib/elasticsearch/query_with_start_time.json rename to spec/fixtures/lib/elasticsearch/query_with_start_time.json diff --git a/ee/spec/fixtures/lib/elasticsearch/query_with_times.json b/spec/fixtures/lib/elasticsearch/query_with_times.json similarity index 100% rename from ee/spec/fixtures/lib/elasticsearch/query_with_times.json rename to spec/fixtures/lib/elasticsearch/query_with_times.json diff --git a/ee/spec/lib/gitlab/elasticsearch/logs_spec.rb b/spec/lib/gitlab/elasticsearch/logs_spec.rb similarity index 92% rename from ee/spec/lib/gitlab/elasticsearch/logs_spec.rb rename to spec/lib/gitlab/elasticsearch/logs_spec.rb index 1a8e76366d7b0f..b2f23e30465730 100644 --- a/ee/spec/lib/gitlab/elasticsearch/logs_spec.rb +++ b/spec/lib/gitlab/elasticsearch/logs_spec.rb @@ -10,7 +10,7 @@ let(:es_message_3) { { timestamp: "2019-12-13T14:35:36.034Z", message: "10.8.2.1 - - [04/Nov/2019:23:09:24 UTC] \"GET / HTTP/1.1\" 200 13" } } let(:es_message_4) { { timestamp: "2019-12-13T14:35:37.034Z", message: "- -\u003e /" } } - let(:es_response) { JSON.parse(fixture_file('lib/elasticsearch/logs_response.json', dir: 'ee')) } + let(:es_response) { JSON.parse(fixture_file('lib/elasticsearch/logs_response.json')) } subject { described_class.new(client) } @@ -21,12 +21,12 @@ let(:start_time) { "2019-12-13T14:35:34.034Z" } let(:end_time) { "2019-12-13T14:35:34.034Z" } - let(:body) { JSON.parse(fixture_file('lib/elasticsearch/query.json', dir: 'ee')) } - let(:body_with_container) { JSON.parse(fixture_file('lib/elasticsearch/query_with_container.json', dir: 'ee')) } - let(:body_with_search) { JSON.parse(fixture_file('lib/elasticsearch/query_with_search.json', dir: 'ee')) } - let(:body_with_times) { JSON.parse(fixture_file('lib/elasticsearch/query_with_times.json', dir: 'ee')) } - let(:body_with_start_time) { JSON.parse(fixture_file('lib/elasticsearch/query_with_start_time.json', dir: 'ee')) } - let(:body_with_end_time) { JSON.parse(fixture_file('lib/elasticsearch/query_with_end_time.json', dir: 'ee')) } + let(:body) { JSON.parse(fixture_file('lib/elasticsearch/query.json')) } + let(:body_with_container) { JSON.parse(fixture_file('lib/elasticsearch/query_with_container.json')) } + let(:body_with_search) { JSON.parse(fixture_file('lib/elasticsearch/query_with_search.json')) } + let(:body_with_times) { JSON.parse(fixture_file('lib/elasticsearch/query_with_times.json')) } + let(:body_with_start_time) { JSON.parse(fixture_file('lib/elasticsearch/query_with_start_time.json')) } + let(:body_with_end_time) { JSON.parse(fixture_file('lib/elasticsearch/query_with_end_time.json')) } RSpec::Matchers.define :a_hash_equal_to_json do |expected| match do |actual| diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index 03aef7aea5c0e0..6020db09ccf752 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -1266,4 +1266,39 @@ expect(env).to be_persisted end end + + describe '#elastic_stack_available?' do + let!(:cluster) { create(:cluster, :project, :provided_by_user, projects: [project]) } + let!(:deployment) { create(:deployment, :success, environment: environment, project: project, cluster: cluster) } + + context 'when app does not exist' do + it 'returns false' do + expect(environment.elastic_stack_available?).to be(false) + end + end + + context 'when app exists' do + let!(:application) { create(:clusters_applications_elastic_stack, cluster: cluster) } + + it 'returns false' do + expect(environment.elastic_stack_available?).to be(false) + end + end + + context 'when app is installed' do + let!(:application) { create(:clusters_applications_elastic_stack, :installed, cluster: cluster) } + + it 'returns true' do + expect(environment.elastic_stack_available?).to be(true) + end + end + + context 'when app is updated' do + let!(:application) { create(:clusters_applications_elastic_stack, :updated, cluster: cluster) } + + it 'returns true' do + expect(environment.elastic_stack_available?).to be(true) + end + end + end end diff --git a/spec/serializers/environment_entity_spec.rb b/spec/serializers/environment_entity_spec.rb index f392ecea9595b7..b4ea90d2141290 100644 --- a/spec/serializers/environment_entity_spec.rb +++ b/spec/serializers/environment_entity_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' describe EnvironmentEntity do + include Gitlab::Routing.url_helpers + let(:request) { double('request') } let(:entity) do described_class.new(environment, request: spy('request')) @@ -71,4 +73,22 @@ expect(subject).to include(:cancel_auto_stop_path, :auto_stop_at) end end + + context 'pod_logs' do + it 'exposes logs keys' do + expect(subject).to include(:logs_path) + expect(subject).to include(:logs_api_path) + expect(subject).to include(:enable_advanced_logs_querying) + end + + it 'uses k8s api when ES is not available' do + expect(subject[:logs_api_path]).to eq(k8s_project_logs_path(environment.project, environment_name: environment.name, format: :json)) + end + + it 'uses ES api when ES is available' do + allow(environment).to receive(:elastic_stack_available?).and_return(true) + + expect(subject[:logs_api_path]).to eq(elasticsearch_project_logs_path(environment.project, environment_name: environment.name, format: :json)) + end + end end diff --git a/ee/spec/services/pod_logs/base_service_spec.rb b/spec/services/pod_logs/base_service_spec.rb similarity index 100% rename from ee/spec/services/pod_logs/base_service_spec.rb rename to spec/services/pod_logs/base_service_spec.rb diff --git a/ee/spec/services/pod_logs/elasticsearch_service_spec.rb b/spec/services/pod_logs/elasticsearch_service_spec.rb similarity index 100% rename from ee/spec/services/pod_logs/elasticsearch_service_spec.rb rename to spec/services/pod_logs/elasticsearch_service_spec.rb diff --git a/ee/spec/services/pod_logs/kubernetes_service_spec.rb b/spec/services/pod_logs/kubernetes_service_spec.rb similarity index 100% rename from ee/spec/services/pod_logs/kubernetes_service_spec.rb rename to spec/services/pod_logs/kubernetes_service_spec.rb -- GitLab From 602b27d861893081c1556886b3d6aff9f5af2886 Mon Sep 17 00:00:00 2001 From: Adrien Kohlbecker Date: Thu, 5 Mar 2020 10:46:05 +0100 Subject: [PATCH 02/11] squash! --- {ee/app => app}/views/projects/logs/empty_logs.html.haml | 0 {ee/app => app}/views/projects/logs/index.html.haml | 0 spec/features/projects/navbar_spec.rb | 1 + 3 files changed, 1 insertion(+) rename {ee/app => app}/views/projects/logs/empty_logs.html.haml (100%) rename {ee/app => app}/views/projects/logs/index.html.haml (100%) diff --git a/ee/app/views/projects/logs/empty_logs.html.haml b/app/views/projects/logs/empty_logs.html.haml similarity index 100% rename from ee/app/views/projects/logs/empty_logs.html.haml rename to app/views/projects/logs/empty_logs.html.haml diff --git a/ee/app/views/projects/logs/index.html.haml b/app/views/projects/logs/index.html.haml similarity index 100% rename from ee/app/views/projects/logs/index.html.haml rename to app/views/projects/logs/index.html.haml diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb index dabb2b2dbf20d8..10958db299b8da 100644 --- a/spec/features/projects/navbar_spec.rb +++ b/spec/features/projects/navbar_spec.rb @@ -70,6 +70,7 @@ _('Environments'), _('Error Tracking'), _('Serverless'), + _('Logs'), _('Kubernetes') ] }, -- GitLab From b63e1d8eb14760371790462bde555057ffe6f348 Mon Sep 17 00:00:00 2001 From: Adrien Kohlbecker Date: Thu, 5 Mar 2020 14:22:02 +0100 Subject: [PATCH 03/11] squash! --- spec/features/projects/navbar_spec.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb index 10958db299b8da..dabb2b2dbf20d8 100644 --- a/spec/features/projects/navbar_spec.rb +++ b/spec/features/projects/navbar_spec.rb @@ -70,7 +70,6 @@ _('Environments'), _('Error Tracking'), _('Serverless'), - _('Logs'), _('Kubernetes') ] }, -- GitLab From 156fd0d49040e197dbe35902ade9d767d350471c Mon Sep 17 00:00:00 2001 From: Adrien Kohlbecker Date: Thu, 5 Mar 2020 14:50:22 +0100 Subject: [PATCH 04/11] squash! --- spec/features/projects/navbar_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb index dabb2b2dbf20d8..2ce6886dd75446 100644 --- a/spec/features/projects/navbar_spec.rb +++ b/spec/features/projects/navbar_spec.rb @@ -70,6 +70,7 @@ _('Environments'), _('Error Tracking'), _('Serverless'), + (_('Logs') if Gitlab.ee?), _('Kubernetes') ] }, -- GitLab From 92d8e9435197ea580b61450f27b2a55b50799b07 Mon Sep 17 00:00:00 2001 From: Adrien Kohlbecker Date: Mon, 9 Mar 2020 12:21:58 +0100 Subject: [PATCH 05/11] squash! --- ee/app/models/license.rb | 1 - spec/controllers/projects/logs_controller_spec.rb | 2 -- .../features/projects/environments_pod_logs_spec.rb | 2 -- 3 files changed, 5 deletions(-) rename {ee/spec => spec}/features/projects/environments_pod_logs_spec.rb (98%) diff --git a/ee/app/models/license.rb b/ee/app/models/license.rb index 2f4446ea81e2c7..7881ded6ec412b 100644 --- a/ee/app/models/license.rb +++ b/ee/app/models/license.rb @@ -121,7 +121,6 @@ class License < ApplicationRecord license_management license_scanning personal_access_token_expiration_policy - pod_logs prometheus_alerts pseudonymizer report_approver_rules diff --git a/spec/controllers/projects/logs_controller_spec.rb b/spec/controllers/projects/logs_controller_spec.rb index aeea27db255504..ea71dbe45aa619 100644 --- a/spec/controllers/projects/logs_controller_spec.rb +++ b/spec/controllers/projects/logs_controller_spec.rb @@ -55,8 +55,6 @@ let_it_be(:cluster) { create(:cluster, :provided_by_gcp, environment_scope: '*', projects: [project]) } before do - stub_licensed_features(pod_logs: true) - allow_next_instance_of(service) do |instance| allow(instance).to receive(:execute).and_return(service_result) end diff --git a/ee/spec/features/projects/environments_pod_logs_spec.rb b/spec/features/projects/environments_pod_logs_spec.rb similarity index 98% rename from ee/spec/features/projects/environments_pod_logs_spec.rb rename to spec/features/projects/environments_pod_logs_spec.rb index 2ffe9953bdd933..b65c3bb8269d55 100644 --- a/ee/spec/features/projects/environments_pod_logs_spec.rb +++ b/spec/features/projects/environments_pod_logs_spec.rb @@ -14,8 +14,6 @@ let(:service) { create(:cluster_platform_kubernetes, :configured) } before do - stub_licensed_features(pod_logs: true) - create(:cluster, :provided_by_gcp, environment_scope: '*', projects: [project]) create(:deployment, :success, environment: environment) -- GitLab From af09745add326edcfe191039b7af21f3c9e24b06 Mon Sep 17 00:00:00 2001 From: Adrien Kohlbecker Date: Mon, 9 Mar 2020 12:26:35 +0100 Subject: [PATCH 06/11] squash! --- app/models/environment.rb | 2 +- ee/app/models/ee/environment.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/environment.rb b/app/models/environment.rb index f797ef6074feec..3f9247b1544d29 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -331,7 +331,7 @@ def auto_stop_in=(value) end def elastic_stack_available? - !!last_deployment&.cluster&.application_elastic_stack&.available? + !!deployment_platform&.cluster&.application_elastic_stack&.available? end private diff --git a/ee/app/models/ee/environment.rb b/ee/app/models/ee/environment.rb index 483b7585deb7cb..f431b54a446ca3 100644 --- a/ee/app/models/ee/environment.rb +++ b/ee/app/models/ee/environment.rb @@ -32,7 +32,7 @@ module Environment scope :preload_for_cluster_environment_entity, -> do preload( - last_deployment: [:deployable, { cluster: :application_elastic_stack }], + last_deployment: [:deployable], project: [:route, { namespace: :route }] ) end -- GitLab From 5bba59a1ff09b106a228406b07a35d50c5f88224 Mon Sep 17 00:00:00 2001 From: Adrien Kohlbecker Date: Mon, 9 Mar 2020 13:35:07 +0100 Subject: [PATCH 07/11] squash! --- {spec => ee/spec}/features/projects/environments_pod_logs_spec.rb | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {spec => ee/spec}/features/projects/environments_pod_logs_spec.rb (100%) diff --git a/spec/features/projects/environments_pod_logs_spec.rb b/ee/spec/features/projects/environments_pod_logs_spec.rb similarity index 100% rename from spec/features/projects/environments_pod_logs_spec.rb rename to ee/spec/features/projects/environments_pod_logs_spec.rb -- GitLab From 2571c33d32cce3a7eb9efd8066db5f9cab5703b0 Mon Sep 17 00:00:00 2001 From: Adrien Kohlbecker Date: Tue, 18 Feb 2020 18:05:28 +0100 Subject: [PATCH 08/11] Move logs to core (frontend) frontend side --- app/assets/javascripts/api.js | 35 +++++++++++++++++++ .../logs/components/environment_logs.vue | 0 .../logs/components/log_control_buttons.vue | 0 .../assets/javascripts/logs/index.js | 0 .../assets/javascripts/logs/stores/actions.js | 2 +- .../assets/javascripts/logs/stores/getters.js | 0 .../assets/javascripts/logs/stores/index.js | 0 .../javascripts/logs/stores/mutation_types.js | 0 .../javascripts/logs/stores/mutations.js | 0 .../assets/javascripts/logs/stores/state.js | 0 .../assets/javascripts/logs/utils.js | 0 .../javascripts/pages/projects/logs/index.js | 2 +- .../layouts/nav/sidebar/_project.html.haml | 7 +++- .../unreleased/ak-move-logs-to-core.yml | 5 +++ doc/user/incident_management/index.md | 5 +-- doc/user/project/clusters/index.md | 4 +-- .../project/clusters/kubernetes_pod_logs.md | 3 +- ee/app/assets/javascripts/api.js | 35 ------------------- .../nav/sidebar/_pod_logs_link.html.haml | 7 ---- .../logs/components/environment_logs_spec.js | 4 +-- .../components/log_control_buttons_spec.js | 2 +- {ee/spec => spec}/frontend/logs/mock_data.js | 0 .../frontend/logs/stores/actions_spec.js | 8 ++--- .../frontend/logs/stores/getters_spec.js | 4 +-- .../frontend/logs/stores/mutations_spec.js | 6 ++-- {ee/spec => spec}/frontend/logs/utils_spec.js | 2 +- 26 files changed, 68 insertions(+), 63 deletions(-) rename {ee/app => app}/assets/javascripts/logs/components/environment_logs.vue (100%) rename {ee/app => app}/assets/javascripts/logs/components/log_control_buttons.vue (100%) rename {ee/app => app}/assets/javascripts/logs/index.js (100%) rename {ee/app => app}/assets/javascripts/logs/stores/actions.js (99%) rename {ee/app => app}/assets/javascripts/logs/stores/getters.js (100%) rename {ee/app => app}/assets/javascripts/logs/stores/index.js (100%) rename {ee/app => app}/assets/javascripts/logs/stores/mutation_types.js (100%) rename {ee/app => app}/assets/javascripts/logs/stores/mutations.js (100%) rename {ee/app => app}/assets/javascripts/logs/stores/state.js (100%) rename {ee/app => app}/assets/javascripts/logs/utils.js (100%) rename {ee/app => app}/assets/javascripts/pages/projects/logs/index.js (63%) create mode 100644 changelogs/unreleased/ak-move-logs-to-core.yml delete mode 100644 ee/app/views/layouts/nav/sidebar/_pod_logs_link.html.haml rename {ee/spec => spec}/frontend/logs/components/environment_logs_spec.js (98%) rename {ee/spec => spec}/frontend/logs/components/log_control_buttons_spec.js (97%) rename {ee/spec => spec}/frontend/logs/mock_data.js (100%) rename {ee/spec => spec}/frontend/logs/stores/actions_spec.js (98%) rename {ee/spec => spec}/frontend/logs/stores/getters_spec.js (89%) rename {ee/spec => spec}/frontend/logs/stores/mutations_spec.js (96%) rename {ee/spec => spec}/frontend/logs/utils_spec.js (95%) diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js index dc6ea148047479..c85e5b68f5f1a9 100644 --- a/app/assets/javascripts/api.js +++ b/app/assets/javascripts/api.js @@ -492,6 +492,41 @@ const Api = { buildUrl(url) { return joinPaths(gon.relative_url_root || '', url.replace(':version', gon.api_version)); }, + + /** + * Returns pods logs for an environment with an optional pod and container + * + * @param {Object} params + * @param {Object} param.environment - Environment object + * @param {string=} params.podName - Pod name, if not set the backend assumes a default one + * @param {string=} params.containerName - Container name, if not set the backend assumes a default one + * @param {string=} params.start - Starting date to query the logs in ISO format + * @param {string=} params.end - Ending date to query the logs in ISO format + * @returns {Promise} Axios promise for the result of a GET request of logs + */ + getPodLogs({ environment, podName, containerName, search, start, end }) { + const url = this.buildUrl(environment.logs_api_path); + + const params = {}; + + if (podName) { + params.pod_name = podName; + } + if (containerName) { + params.container_name = containerName; + } + if (search) { + params.search = search; + } + if (start) { + params.start = start; + } + if (end) { + params.end = end; + } + + return axios.get(url, { params }); + }, }; export default Api; diff --git a/ee/app/assets/javascripts/logs/components/environment_logs.vue b/app/assets/javascripts/logs/components/environment_logs.vue similarity index 100% rename from ee/app/assets/javascripts/logs/components/environment_logs.vue rename to app/assets/javascripts/logs/components/environment_logs.vue diff --git a/ee/app/assets/javascripts/logs/components/log_control_buttons.vue b/app/assets/javascripts/logs/components/log_control_buttons.vue similarity index 100% rename from ee/app/assets/javascripts/logs/components/log_control_buttons.vue rename to app/assets/javascripts/logs/components/log_control_buttons.vue diff --git a/ee/app/assets/javascripts/logs/index.js b/app/assets/javascripts/logs/index.js similarity index 100% rename from ee/app/assets/javascripts/logs/index.js rename to app/assets/javascripts/logs/index.js diff --git a/ee/app/assets/javascripts/logs/stores/actions.js b/app/assets/javascripts/logs/stores/actions.js similarity index 99% rename from ee/app/assets/javascripts/logs/stores/actions.js rename to app/assets/javascripts/logs/stores/actions.js index 1098031d6b14c9..89a896b9dec401 100644 --- a/ee/app/assets/javascripts/logs/stores/actions.js +++ b/app/assets/javascripts/logs/stores/actions.js @@ -1,4 +1,4 @@ -import Api from 'ee/api'; +import Api from '~/api'; import { backOff } from '~/lib/utils/common_utils'; import httpStatusCodes from '~/lib/utils/http_status'; import axios from '~/lib/utils/axios_utils'; diff --git a/ee/app/assets/javascripts/logs/stores/getters.js b/app/assets/javascripts/logs/stores/getters.js similarity index 100% rename from ee/app/assets/javascripts/logs/stores/getters.js rename to app/assets/javascripts/logs/stores/getters.js diff --git a/ee/app/assets/javascripts/logs/stores/index.js b/app/assets/javascripts/logs/stores/index.js similarity index 100% rename from ee/app/assets/javascripts/logs/stores/index.js rename to app/assets/javascripts/logs/stores/index.js diff --git a/ee/app/assets/javascripts/logs/stores/mutation_types.js b/app/assets/javascripts/logs/stores/mutation_types.js similarity index 100% rename from ee/app/assets/javascripts/logs/stores/mutation_types.js rename to app/assets/javascripts/logs/stores/mutation_types.js diff --git a/ee/app/assets/javascripts/logs/stores/mutations.js b/app/assets/javascripts/logs/stores/mutations.js similarity index 100% rename from ee/app/assets/javascripts/logs/stores/mutations.js rename to app/assets/javascripts/logs/stores/mutations.js diff --git a/ee/app/assets/javascripts/logs/stores/state.js b/app/assets/javascripts/logs/stores/state.js similarity index 100% rename from ee/app/assets/javascripts/logs/stores/state.js rename to app/assets/javascripts/logs/stores/state.js diff --git a/ee/app/assets/javascripts/logs/utils.js b/app/assets/javascripts/logs/utils.js similarity index 100% rename from ee/app/assets/javascripts/logs/utils.js rename to app/assets/javascripts/logs/utils.js diff --git a/ee/app/assets/javascripts/pages/projects/logs/index.js b/app/assets/javascripts/pages/projects/logs/index.js similarity index 63% rename from ee/app/assets/javascripts/pages/projects/logs/index.js rename to app/assets/javascripts/pages/projects/logs/index.js index 34869396812bf9..36747069ebb007 100644 --- a/ee/app/assets/javascripts/pages/projects/logs/index.js +++ b/app/assets/javascripts/pages/projects/logs/index.js @@ -1,3 +1,3 @@ -import logsBundle from 'ee/logs'; +import logsBundle from '~/logs'; document.addEventListener('DOMContentLoaded', logsBundle); diff --git a/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml index 5afe43d663632a..22a6b433cd1db1 100644 --- a/app/views/layouts/nav/sidebar/_project.html.haml +++ b/app/views/layouts/nav/sidebar/_project.html.haml @@ -263,7 +263,12 @@ %span = _('Serverless') - = render_if_exists 'layouts/nav/sidebar/pod_logs_link' # EE-specific + - if project_nav_tab?(:environments) + - if can?(current_user, :read_pod_logs, @project) + = nav_link(controller: :logs, action: [:index]) do + = link_to project_logs_path(@project), title: _('Logs') do + %span + = _('Logs') - if project_nav_tab? :clusters - show_cluster_hint = show_gke_cluster_integration_callout?(@project) diff --git a/changelogs/unreleased/ak-move-logs-to-core.yml b/changelogs/unreleased/ak-move-logs-to-core.yml new file mode 100644 index 00000000000000..ca0df24f466729 --- /dev/null +++ b/changelogs/unreleased/ak-move-logs-to-core.yml @@ -0,0 +1,5 @@ +--- +title: Move logs to core +merge_request: 25455 +author: +type: changed diff --git a/doc/user/incident_management/index.md b/doc/user/incident_management/index.md index 249dc8c8ad853f..21dd3bf4d9a6cd 100644 --- a/doc/user/incident_management/index.md +++ b/doc/user/incident_management/index.md @@ -88,12 +88,13 @@ dropdown box above the upper right corner of the panel: The options are: -- [View logs](#view-logs-ultimate) **(ULTIMATE)** +- [View logs](#view-logs) - [Download CSV](#download-csv) -##### View logs **(ULTIMATE)** +##### View logs > [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/201846) in GitLab Ultimate 12.8. +> [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25455) to [GitLab Core](https://about.gitlab.com/pricing/) 12.9. This can be useful if you are triaging an application incident and need to [explore logs](../project/integrations/prometheus.md#view-logs-ultimate) diff --git a/doc/user/project/clusters/index.md b/doc/user/project/clusters/index.md index 9087653145bc12..c9d7d723eb5429 100644 --- a/doc/user/project/clusters/index.md +++ b/doc/user/project/clusters/index.md @@ -27,7 +27,7 @@ Using the GitLab project Kubernetes integration, you can: - Use [Web terminals](#web-terminals). - Use [Deploy Boards](#deploy-boards-premium). **(PREMIUM)** - Use [Canary Deployments](#canary-deployments-premium). **(PREMIUM)** -- View [Logs](#logs-ultimate). **(ULTIMATE)** +- View [Logs](#logs). - Run serverless workloads on [Kubernetes with Knative](serverless/index.md). ### Deploy Boards **(PREMIUM)** @@ -48,7 +48,7 @@ the need to leave GitLab. [Read more about Canary Deployments](../canary_deployments.md) -### Logs **(ULTIMATE)** +### Logs GitLab makes it easy to view the logs of running pods in connected Kubernetes clusters. By displaying the logs directly in GitLab, developers can avoid having to manage console tools or jump to a different interface. diff --git a/doc/user/project/clusters/kubernetes_pod_logs.md b/doc/user/project/clusters/kubernetes_pod_logs.md index 7fb3e797fc7937..f1899c7b8d92e4 100644 --- a/doc/user/project/clusters/kubernetes_pod_logs.md +++ b/doc/user/project/clusters/kubernetes_pod_logs.md @@ -1,6 +1,7 @@ -# Kubernetes Logs **(ULTIMATE)** +# Kubernetes Logs > [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/4752) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.0. +> [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25455) to [GitLab Core](https://about.gitlab.com/pricing/) 12.9. GitLab makes it easy to view the logs of running pods in [connected Kubernetes clusters](index.md). By displaying the logs directly in GitLab, developers can avoid having to manage console tools or jump to a different interface. diff --git a/ee/app/assets/javascripts/api.js b/ee/app/assets/javascripts/api.js index 47c3bb7a7b9bba..91d18f4cbcf767 100644 --- a/ee/app/assets/javascripts/api.js +++ b/ee/app/assets/javascripts/api.js @@ -90,41 +90,6 @@ export default { return axios.delete(url); }, - /** - * Returns pods logs for an environment with an optional pod and container - * - * @param {Object} params - * @param {Object} param.environment - Environment object - * @param {string=} params.podName - Pod name, if not set the backend assumes a default one - * @param {string=} params.containerName - Container name, if not set the backend assumes a default one - * @param {string=} params.start - Starting date to query the logs in ISO format - * @param {string=} params.end - Ending date to query the logs in ISO format - * @returns {Promise} Axios promise for the result of a GET request of logs - */ - getPodLogs({ environment, podName, containerName, search, start, end }) { - const url = this.buildUrl(environment.logs_api_path); - - const params = {}; - - if (podName) { - params.pod_name = podName; - } - if (containerName) { - params.container_name = containerName; - } - if (search) { - params.search = search; - } - if (start) { - params.start = start; - } - if (end) { - params.end = end; - } - - return axios.get(url, { params }); - }, - groupPackages(id, options = {}) { const url = Api.buildUrl(this.groupPackagesPath).replace(':id', id); return axios.get(url, options); diff --git a/ee/app/views/layouts/nav/sidebar/_pod_logs_link.html.haml b/ee/app/views/layouts/nav/sidebar/_pod_logs_link.html.haml deleted file mode 100644 index 465dfd44dfd5f9..00000000000000 --- a/ee/app/views/layouts/nav/sidebar/_pod_logs_link.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -- return unless can?(current_user, :read_pod_logs, @project) -- return unless project_nav_tab?(:environments) - -= nav_link(controller: :logs, action: [:index]) do - = link_to project_logs_path(@project), title: _('Logs') do - %span - = _('Logs') diff --git a/ee/spec/frontend/logs/components/environment_logs_spec.js b/spec/frontend/logs/components/environment_logs_spec.js similarity index 98% rename from ee/spec/frontend/logs/components/environment_logs_spec.js rename to spec/frontend/logs/components/environment_logs_spec.js index 34f3f275991fe5..26542c3d046c66 100644 --- a/ee/spec/frontend/logs/components/environment_logs_spec.js +++ b/spec/frontend/logs/components/environment_logs_spec.js @@ -2,9 +2,9 @@ import Vue from 'vue'; import { GlDropdown, GlDropdownItem, GlSearchBoxByClick } from '@gitlab/ui'; import { shallowMount } from '@vue/test-utils'; import DateTimePicker from '~/vue_shared/components/date_time_picker/date_time_picker.vue'; -import EnvironmentLogs from 'ee/logs/components/environment_logs.vue'; +import EnvironmentLogs from '~/logs/components/environment_logs.vue'; -import { createStore } from 'ee/logs/stores'; +import { createStore } from '~/logs/stores'; import { scrollDown } from '~/lib/utils/scroll_utils'; import { mockEnvName, diff --git a/ee/spec/frontend/logs/components/log_control_buttons_spec.js b/spec/frontend/logs/components/log_control_buttons_spec.js similarity index 97% rename from ee/spec/frontend/logs/components/log_control_buttons_spec.js rename to spec/frontend/logs/components/log_control_buttons_spec.js index c4e23a158f7ea0..f344e8189c3d8f 100644 --- a/ee/spec/frontend/logs/components/log_control_buttons_spec.js +++ b/spec/frontend/logs/components/log_control_buttons_spec.js @@ -1,6 +1,6 @@ import { shallowMount } from '@vue/test-utils'; import { GlButton } from '@gitlab/ui'; -import LogControlButtons from 'ee/logs/components/log_control_buttons.vue'; +import LogControlButtons from '~/logs/components/log_control_buttons.vue'; import { canScroll, isScrolledToTop, diff --git a/ee/spec/frontend/logs/mock_data.js b/spec/frontend/logs/mock_data.js similarity index 100% rename from ee/spec/frontend/logs/mock_data.js rename to spec/frontend/logs/mock_data.js diff --git a/ee/spec/frontend/logs/stores/actions_spec.js b/spec/frontend/logs/stores/actions_spec.js similarity index 98% rename from ee/spec/frontend/logs/stores/actions_spec.js rename to spec/frontend/logs/stores/actions_spec.js index 4103edc83259c4..6309126159e65a 100644 --- a/ee/spec/frontend/logs/stores/actions_spec.js +++ b/spec/frontend/logs/stores/actions_spec.js @@ -1,16 +1,16 @@ import MockAdapter from 'axios-mock-adapter'; import testAction from 'helpers/vuex_action_helper'; -import * as types from 'ee/logs/stores/mutation_types'; +import * as types from '~/logs/stores/mutation_types'; import { convertToFixedRange } from '~/lib/utils/datetime_range'; -import logsPageState from 'ee/logs/stores/state'; +import logsPageState from '~/logs/stores/state'; import { setInitData, setSearch, showPodLogs, fetchEnvironments, fetchLogs, -} from 'ee/logs/stores/actions'; +} from '~/logs/stores/actions'; import { defaultTimeRange } from '~/monitoring/constants'; @@ -30,7 +30,7 @@ import { jest.mock('~/flash'); jest.mock('~/lib/utils/datetime_range'); -jest.mock('ee/logs/utils'); +jest.mock('~/logs/utils'); const mockDefaultRange = { start: '2020-01-10T18:00:00.000Z', diff --git a/ee/spec/frontend/logs/stores/getters_spec.js b/spec/frontend/logs/stores/getters_spec.js similarity index 89% rename from ee/spec/frontend/logs/stores/getters_spec.js rename to spec/frontend/logs/stores/getters_spec.js index 1be598ac91d110..fdce575fa97f9d 100644 --- a/ee/spec/frontend/logs/stores/getters_spec.js +++ b/spec/frontend/logs/stores/getters_spec.js @@ -1,5 +1,5 @@ -import * as getters from 'ee/logs/stores/getters'; -import logsPageState from 'ee/logs/stores/state'; +import * as getters from '~/logs/stores/getters'; +import logsPageState from '~/logs/stores/state'; import { mockLogsResult, mockTrace } from '../mock_data'; diff --git a/ee/spec/frontend/logs/stores/mutations_spec.js b/spec/frontend/logs/stores/mutations_spec.js similarity index 96% rename from ee/spec/frontend/logs/stores/mutations_spec.js rename to spec/frontend/logs/stores/mutations_spec.js index 13de232491b63c..dcb358c7d5b281 100644 --- a/ee/spec/frontend/logs/stores/mutations_spec.js +++ b/spec/frontend/logs/stores/mutations_spec.js @@ -1,7 +1,7 @@ -import mutations from 'ee/logs/stores/mutations'; -import * as types from 'ee/logs/stores/mutation_types'; +import mutations from '~/logs/stores/mutations'; +import * as types from '~/logs/stores/mutation_types'; -import logsPageState from 'ee/logs/stores/state'; +import logsPageState from '~/logs/stores/state'; import { mockEnvName, mockEnvironments, diff --git a/ee/spec/frontend/logs/utils_spec.js b/spec/frontend/logs/utils_spec.js similarity index 95% rename from ee/spec/frontend/logs/utils_spec.js rename to spec/frontend/logs/utils_spec.js index a566e998faf691..986fe3203636ba 100644 --- a/ee/spec/frontend/logs/utils_spec.js +++ b/spec/frontend/logs/utils_spec.js @@ -1,4 +1,4 @@ -import { getTimeRange } from 'ee/logs/utils'; +import { getTimeRange } from '~/logs/utils'; describe('logs/utils', () => { describe('getTimeRange', () => { -- GitLab From 3ac2a4f8f60b6d6cddd2b66df35b3878a33da1e6 Mon Sep 17 00:00:00 2001 From: Adrien Kohlbecker Date: Wed, 4 Mar 2020 15:44:11 +0100 Subject: [PATCH 09/11] squash! --- app/assets/stylesheets/pages/builds.scss | 39 +++++++++++++++++++++ ee/app/assets/stylesheets/pages/builds.scss | 38 -------------------- 2 files changed, 39 insertions(+), 38 deletions(-) delete mode 100644 ee/app/assets/stylesheets/pages/builds.scss diff --git a/app/assets/stylesheets/pages/builds.scss b/app/assets/stylesheets/pages/builds.scss index 0db90fc88fce8d..59266af96b4f53 100644 --- a/app/assets/stylesheets/pages/builds.scss +++ b/app/assets/stylesheets/pages/builds.scss @@ -357,3 +357,42 @@ } } } + +.build-page-pod-logs { + .build-trace-container { + position: relative; + } + + .build-trace { + @include build-trace(); + } + + .top-bar { + @include build-trace-top-bar($gl-line-height * 5); + + .dropdown-menu-toggle { + width: 200px; + + @include media-breakpoint-up(sm) { + width: 300px; + } + } + + .controllers { + @include build-controllers(16px, flex-end, true, 2); + } + + .refresh-control { + @include build-controllers(16px, flex-end, true, 0); + margin-left: 2px; + } + } + + .btn-refresh svg { + top: 0; + } + + .build-loader-animation { + @include build-loader-animation; + } +} diff --git a/ee/app/assets/stylesheets/pages/builds.scss b/ee/app/assets/stylesheets/pages/builds.scss deleted file mode 100644 index 188ac61b1f85b5..00000000000000 --- a/ee/app/assets/stylesheets/pages/builds.scss +++ /dev/null @@ -1,38 +0,0 @@ -.build-page-pod-logs { - .build-trace-container { - position: relative; - } - - .build-trace { - @include build-trace(); - } - - .top-bar { - @include build-trace-top-bar($gl-line-height * 5); - - .dropdown-menu-toggle { - width: 200px; - - @include media-breakpoint-up(sm) { - width: 300px; - } - } - - .controllers { - @include build-controllers(16px, flex-end, true, 2); - } - - .refresh-control { - @include build-controllers(16px, flex-end, true, 0); - margin-left: 2px; - } - } - - .btn-refresh svg { - top: 0; - } - - .build-loader-animation { - @include build-loader-animation; - } -} -- GitLab From 65abf21a82a44d9d9bbff5694a6441bd3de4831c Mon Sep 17 00:00:00 2001 From: Adrien Kohlbecker Date: Mon, 9 Mar 2020 12:44:32 +0100 Subject: [PATCH 10/11] squash! --- spec/features/projects/navbar_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb index 2ce6886dd75446..10958db299b8da 100644 --- a/spec/features/projects/navbar_spec.rb +++ b/spec/features/projects/navbar_spec.rb @@ -70,7 +70,7 @@ _('Environments'), _('Error Tracking'), _('Serverless'), - (_('Logs') if Gitlab.ee?), + _('Logs'), _('Kubernetes') ] }, -- GitLab From e7501428be2887891bad5212fe79170828baeadb Mon Sep 17 00:00:00 2001 From: Adrien Kohlbecker Date: Tue, 10 Mar 2020 11:59:23 +0100 Subject: [PATCH 11/11] squash! --- app/views/layouts/nav/sidebar/_project.html.haml | 11 +++++------ changelogs/unreleased/ak-move-logs-to-core.yml | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml index 22a6b433cd1db1..aef9532fd46104 100644 --- a/app/views/layouts/nav/sidebar/_project.html.haml +++ b/app/views/layouts/nav/sidebar/_project.html.haml @@ -263,12 +263,11 @@ %span = _('Serverless') - - if project_nav_tab?(:environments) - - if can?(current_user, :read_pod_logs, @project) - = nav_link(controller: :logs, action: [:index]) do - = link_to project_logs_path(@project), title: _('Logs') do - %span - = _('Logs') + - if project_nav_tab?(:environments) && can?(current_user, :read_pod_logs, @project) + = nav_link(controller: :logs, action: [:index]) do + = link_to project_logs_path(@project), title: _('Logs') do + %span + = _('Logs') - if project_nav_tab? :clusters - show_cluster_hint = show_gke_cluster_integration_callout?(@project) diff --git a/changelogs/unreleased/ak-move-logs-to-core.yml b/changelogs/unreleased/ak-move-logs-to-core.yml index ca0df24f466729..488059161ad9ff 100644 --- a/changelogs/unreleased/ak-move-logs-to-core.yml +++ b/changelogs/unreleased/ak-move-logs-to-core.yml @@ -1,5 +1,5 @@ --- -title: Move logs to core +title: Move pod logs to core merge_request: 25455 author: type: changed -- GitLab