diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js index dc6ea148047479ec79b8ea567cfeffa6ff268c93..c85e5b68f5f1a98ac27a924b3b3d6a012d8e6b75 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 1098031d6b14c9ea2d12a7da861f6c52c58ed3d2..89a896b9dec401b74bb90750e36ec98f651f4343 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 34869396812bf9ed47a527d53eb7fa80f5951ae7..36747069ebb00723a5f3c4f7e248a62a3509cea4 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/assets/stylesheets/pages/builds.scss b/app/assets/stylesheets/pages/builds.scss index 0db90fc88fce8d0a6ca3d3d35ebb8a296a7b7993..59266af96b4f532efc95c8417d8f94dda01a2774 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/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 fd330d4efd980ce62a7cfa3619ca462ba51cd829..6bf920448a5ccfaf9d850703e9fe363e702e83bc 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 0e2962b893a7cd2fa001a8b419c97839133b1e46..3f9247b1544d293100c12c9880d2a88e3bc04bba 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? + !!deployment_platform&.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 15d60fe9cd880180c0eb99f9000b1c4c21c43c86..95b92d4c108d9ae1672144d35ba7c79684edee6d 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 74d6806e83f1da2f0fcc0ec459cedec7a563b09e..d9af7af8a8be00243cbaa919b6c084b1039deb52 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/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml index 5afe43d663632af27c02c1b3f901e014e497efcc..aef9532fd461044b5cb8cb195154717116c3e643 100644 --- a/app/views/layouts/nav/sidebar/_project.html.haml +++ b/app/views/layouts/nav/sidebar/_project.html.haml @@ -263,7 +263,11 @@ %span = _('Serverless') - = render_if_exists 'layouts/nav/sidebar/pod_logs_link' # EE-specific + - 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/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/changelogs/unreleased/ak-move-logs-to-core.yml b/changelogs/unreleased/ak-move-logs-to-core.yml new file mode 100644 index 0000000000000000000000000000000000000000..488059161ad9ff8e01163591da7ec0816515d30f --- /dev/null +++ b/changelogs/unreleased/ak-move-logs-to-core.yml @@ -0,0 +1,5 @@ +--- +title: Move pod logs to core +merge_request: 25455 +author: +type: changed diff --git a/config/routes/project.rb b/config/routes/project.rb index 809c1386f2c09e59d94c790fb9f7aadf43cc12b7..83575580321cca5428c78eae49178f657b2babae 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/doc/user/incident_management/index.md b/doc/user/incident_management/index.md index 249dc8c8ad853f580a74f318a3bbbf6e6ea2037b..21dd3bf4d9a6cd22feb942d7a29d28f37cc31469 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 9087653145bc1250503e643315575550088fc53e..c9d7d723eb54297f28faf1bccf04c01d9c3f3071 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 7fb3e797fc793737ff259a21bf0cb5731f22ddb5..f1899c7b8d92e42d3b8e3fda552db753d2b8bafb 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 47c3bb7a7b9bba311a84900f35062956f0cdfba3..91d18f4cbcf767d38ac95ac5089ec0190ed37c92 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/assets/stylesheets/pages/builds.scss b/ee/app/assets/stylesheets/pages/builds.scss deleted file mode 100644 index 188ac61b1f85b577a3b87f60f11fade922197c29..0000000000000000000000000000000000000000 --- 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; - } -} diff --git a/ee/app/helpers/ee/environments_helper.rb b/ee/app/helpers/ee/environments_helper.rb index 3d6919fc99510f283d77835fbb40012b6dae63c8..f7c8502930dcdd8817654c923cb1e6568a480726 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 f276231823233691ed12ee7a1834af204d2b681b..f431b54a446ca3b0225d5d10a4205dd6dc0374a1 100644 --- a/ee/app/models/ee/environment.rb +++ b/ee/app/models/ee/environment.rb @@ -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/models/license.rb b/ee/app/models/license.rb index 2f4446ea81e2c7d3c71c8b077d8815a6de72f4ad..7881ded6ec412bd15b2cff166d5fbd5ea1d9410b 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/ee/app/policies/ee/project_policy.rb b/ee/app/policies/ee/project_policy.rb index 17cc0b61195fd3ac87b907d85de630a101999809..74f0a8d7950bd30e28da4723966fe72061edcc2b 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 65290c459e1b1e245456e534a11ebabd538e6a25..e61a0750f8ed0ab8709152ab90712dacddbc75a1 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/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 465dfd44dfd5f97df7b2deb6aadcf1ff3c6032a4..0000000000000000000000000000000000000000 --- 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/config/routes/project.rb b/ee/config/routes/project.rb index ad45a6679f38dcabb986662ff63522ca8c613ca8..58a8bcae97313d6e79a9ab63c84f3327d17dfa0f 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/features/projects/environments_pod_logs_spec.rb b/ee/spec/features/projects/environments_pod_logs_spec.rb index 2ffe9953bdd933ff4761ec2355b17bd3da963707..b65c3bb8269d55efdcb917cdfec0120cf4a5d7c1 100644 --- a/ee/spec/features/projects/environments_pod_logs_spec.rb +++ b/ee/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) diff --git a/ee/spec/fixtures/api/schemas/clusters/environment.json b/ee/spec/fixtures/api/schemas/clusters/environment.json index a5017c294b30669bf40ef8c50c95fb8ecb3a29cf..f72fb4c396c5a968b7285edc3320b330730d1ddf 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 1d4e93eb6f443a6604a87c7c2278df69e1c83272..34f6408ea8eeb13fc8327b1038c284d7dd2c4dc1 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 2ff79e1a133cf0d58f929ad2d983e4cce24ce5d0..f6be6f744dd37581beeb6c6cd71986b8407495d5 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 990a44a53b74d7013b40d8bfb632526e72543c04..5d3bf62685c58d4c6f82288a5fe850066cb72310 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 4b44f4ad67ca9125c8b027a21455cf03e6b75d61..8afbd55745db777543392da2bdb5fce4128e5c8e 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 0e29d855fc32aff23b110e87a6faa7fbbceeef01..39a8936d21e3e15f4d8fef14eb1d977ad3906b27 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 75% rename from ee/spec/controllers/projects/logs_controller_spec.rb rename to spec/controllers/projects/logs_controller_spec.rb index e7816cc57f441b2125d6b894d06d4c3deae2192c..ea71dbe45aa619e5631ec2430191af76f5b31777 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 @@ -73,21 +55,11 @@ 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 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/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb index dabb2b2dbf20d83dd17166de922102c61823ed30..10958db299b8daba52416e90360f0e4b5a473212 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') ] }, diff --git a/spec/fixtures/api/schemas/environment.json b/spec/fixtures/api/schemas/environment.json index 7e7e5ce37e35a2161e330f317054944b5d6b23eb..84217a2a01c5354903f0294c7794a99bf7195457 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/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 34f3f275991fe5cbbca819766de200e443191bbb..26542c3d046c666030ec071e89e53829ad490780 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 c4e23a158f7ea05d4205d68f8a36de7c701d314e..f344e8189c3d8f0e14a23337729cf0b88e439121 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 4103edc83259c4732b10db2fd57f2e516ac524c6..6309126159e65ac9ba54626b3dacd792e8d0fd7b 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 1be598ac91d110302125ddd01752e170239af3b2..fdce575fa97f9d2dcd8bee0dde92a73961ac23e3 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 13de232491b63c79038e07b210946eacf3e41330..dcb358c7d5b281b7ff2f38446d55950e6f1862b2 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 a566e998faf691e13e328c051e65ed7d237fe4e9..986fe3203636bac5d29bfbd1c65a0de848fbcbd3 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', () => { 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 1a8e76366d7b0f65c0f1e4aad854de9b6d9de9ee..b2f23e30465730a6b75385121115d15e1e43a1ca 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 03aef7aea5c0e04c6dcb8119321eeb89b401ad74..6020db09ccf752b363aab0e9773cde8472d03c98 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 f392ecea9595b7bdcadc40044eae5cd5e88ea493..b4ea90d214129021250052013e4bfab84180d198 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