summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/clusters/components/applications.vue40
-rw-r--r--app/assets/javascripts/clusters/stores/clusters_store.js8
-rw-r--r--app/assets/javascripts/deploy_keys/components/key.vue7
-rw-r--r--app/controllers/clusters/applications_controller.rb2
-rw-r--r--app/models/clusters/applications/elastic_stack.rb33
-rw-r--r--app/models/clusters/applications/ingress.rb6
-rw-r--r--app/serializers/cluster_application_entity.rb1
-rw-r--r--app/serializers/deploy_key_entity.rb1
-rw-r--r--app/services/clusters/applications/base_service.rb4
-rw-r--r--changelogs/unreleased/feat-ssh-sha256-other-key.yml5
-rw-r--r--changelogs/unreleased/nfriend-add-environments-dashboard-message.yml5
-rw-r--r--doc/api/keys.md62
-rw-r--r--doc/development/feature_flags/process.md4
-rw-r--r--doc/user/clusters/applications.md34
-rw-r--r--doc/user/project/clusters/kubernetes_pod_logs.md38
-rw-r--r--lib/api/entities.rb4
-rw-r--r--lib/api/keys.rb11
-rw-r--r--locale/gitlab.pot12
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb5
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb6
-rw-r--r--spec/features/clusters/installing_applications_shared_examples.rb3
-rw-r--r--spec/finders/keys_finder_spec.rb34
-rw-r--r--spec/fixtures/api/schemas/cluster_status.json1
-rw-r--r--spec/frontend/clusters/components/applications_spec.js66
-rw-r--r--spec/frontend/clusters/services/mock_data.js2
-rw-r--r--spec/frontend/clusters/stores/clusters_store_spec.js12
-rw-r--r--spec/helpers/users_helper_spec.rb14
-rw-r--r--spec/models/clusters/applications/elastic_stack_spec.rb55
-rw-r--r--spec/requests/api/keys_spec.rb30
-rw-r--r--spec/serializers/deploy_key_entity_spec.rb1
-rw-r--r--spec/services/clusters/applications/create_service_spec.rb7
-rw-r--r--vendor/elastic_stack/values.yaml9
33 files changed, 263 insertions, 265 deletions
diff --git a/app/assets/javascripts/clusters/components/applications.vue b/app/assets/javascripts/clusters/components/applications.vue
index af50ca7361d..b37e644b503 100644
--- a/app/assets/javascripts/clusters/components/applications.vue
+++ b/app/assets/javascripts/clusters/components/applications.vue
@@ -222,9 +222,6 @@ Crossplane runs inside your Kubernetes cluster and supports secure connectivity
elasticStackInstalled() {
return this.applications.elastic_stack.status === APPLICATION_STATUS.INSTALLED;
},
- elasticStackKibanaHostname() {
- return this.applications.elastic_stack.kibana_hostname;
- },
knative() {
return this.applications.knative;
},
@@ -681,9 +678,6 @@ Crossplane runs inside your Kubernetes cluster and supports secure connectivity
:uninstall-successful="applications.elastic_stack.uninstallSuccessful"
:uninstall-failed="applications.elastic_stack.uninstallFailed"
:disabled="!helmInstalled"
- :install-application-request-params="{
- kibana_hostname: applications.elastic_stack.kibana_hostname,
- }"
title-link="https://github.com/helm/charts/tree/master/stable/elastic-stack"
>
<div slot="description">
@@ -694,40 +688,6 @@ Crossplane runs inside your Kubernetes cluster and supports secure connectivity
)
}}
</p>
-
- <template v-if="ingressExternalEndpoint">
- <div class="form-group">
- <label for="elastic-stack-kibana-hostname">{{
- s__('ClusterIntegration|Kibana Hostname')
- }}</label>
-
- <div class="input-group">
- <input
- v-model="applications.elastic_stack.kibana_hostname"
- :readonly="elasticStackInstalled"
- type="text"
- class="form-control js-hostname"
- />
- <span class="input-group-btn">
- <clipboard-button
- :text="elasticStackKibanaHostname"
- :title="s__('ClusterIntegration|Copy Kibana Hostname')"
- class="js-clipboard-btn"
- />
- </span>
- </div>
-
- <p v-if="ingressInstalled" class="form-text text-muted">
- {{
- s__(`ClusterIntegration|Replace this with your own hostname if you want.
- If you do so, point hostname to Ingress IP Address from above.`)
- }}
- <a :href="ingressDnsHelpPath" target="_blank" rel="noopener noreferrer">
- {{ __('More information') }}
- </a>
- </p>
- </div>
- </template>
</div>
</application-row>
</div>
diff --git a/app/assets/javascripts/clusters/stores/clusters_store.js b/app/assets/javascripts/clusters/stores/clusters_store.js
index 9c8563e8f77..26456fb28db 100644
--- a/app/assets/javascripts/clusters/stores/clusters_store.js
+++ b/app/assets/javascripts/clusters/stores/clusters_store.js
@@ -5,7 +5,6 @@ import {
JUPYTER,
KNATIVE,
CERT_MANAGER,
- ELASTIC_STACK,
CROSSPLANE,
RUNNER,
APPLICATION_INSTALLED_STATUSES,
@@ -97,7 +96,6 @@ export default class ClusterStore {
elastic_stack: {
...applicationInitialState,
title: s__('ClusterIntegration|Elastic Stack'),
- kibana_hostname: null,
},
},
environments: [],
@@ -236,12 +234,6 @@ export default class ClusterStore {
} else if (appId === RUNNER) {
this.state.applications.runner.version = version;
this.state.applications.runner.updateAvailable = updateAvailable;
- } else if (appId === ELASTIC_STACK) {
- this.state.applications.elastic_stack.kibana_hostname = this.updateHostnameIfUnset(
- this.state.applications.elastic_stack.kibana_hostname,
- serverAppEntry.kibana_hostname,
- 'kibana',
- );
}
});
}
diff --git a/app/assets/javascripts/deploy_keys/components/key.vue b/app/assets/javascripts/deploy_keys/components/key.vue
index 4d36a492c1c..74f1373f144 100644
--- a/app/assets/javascripts/deploy_keys/components/key.vue
+++ b/app/assets/javascripts/deploy_keys/components/key.vue
@@ -115,7 +115,12 @@ export default {
<div role="rowheader" class="table-mobile-header">{{ s__('DeployKeys|Deploy key') }}</div>
<div class="table-mobile-content qa-key">
<strong class="title qa-key-title"> {{ deployKey.title }} </strong>
- <div class="fingerprint qa-key-fingerprint">{{ deployKey.fingerprint }}</div>
+ <div class="fingerprint qa-key-fingerprint">
+ {{ __('MD5') }}:{{ deployKey.fingerprint }}
+ </div>
+ <div class="fingerprint qa-key-fingerprint">
+ {{ __('SHA256') }}:{{ deployKey.fingerprint_sha256 }}
+ </div>
</div>
</div>
<div class="table-section section-30 section-wrap">
diff --git a/app/controllers/clusters/applications_controller.rb b/app/controllers/clusters/applications_controller.rb
index 788ebb14fec..51ddbe2beb4 100644
--- a/app/controllers/clusters/applications_controller.rb
+++ b/app/controllers/clusters/applications_controller.rb
@@ -47,7 +47,7 @@ class Clusters::ApplicationsController < Clusters::BaseController
end
def cluster_application_params
- params.permit(:application, :hostname, :kibana_hostname, :email, :stack, :modsecurity_enabled)
+ params.permit(:application, :hostname, :email, :stack, :modsecurity_enabled)
end
def cluster_application_destroy_params
diff --git a/app/models/clusters/applications/elastic_stack.rb b/app/models/clusters/applications/elastic_stack.rb
index 9854ad2ea3e..e86a4597ed8 100644
--- a/app/models/clusters/applications/elastic_stack.rb
+++ b/app/models/clusters/applications/elastic_stack.rb
@@ -15,24 +15,15 @@ module Clusters
include ::Clusters::Concerns::ApplicationData
include ::Gitlab::Utils::StrongMemoize
- default_value_for :version, VERSION
-
- def set_initial_status
- return unless not_installable?
- return unless cluster&.application_ingress_available?
+ include IgnorableColumns
+ ignore_column :kibana_hostname, remove_with: '12.8', remove_after: '2020-01-22'
- ingress = cluster.application_ingress
- self.status = status_states[:installable] if ingress.external_ip_or_hostname?
- end
+ default_value_for :version, VERSION
def chart
'stable/elastic-stack'
end
- def values
- content_values.to_yaml
- end
-
def install_command
Gitlab::Kubernetes::Helm::InstallCommand.new(
name: 'elastic-stack',
@@ -78,24 +69,6 @@ module Clusters
private
- def specification
- {
- "kibana" => {
- "ingress" => {
- "hosts" => [kibana_hostname],
- "tls" => [{
- "hosts" => [kibana_hostname],
- "secretName" => "kibana-cert"
- }]
- }
- }
- }
- end
-
- def content_values
- YAML.load_file(chart_values_file).deep_merge!(specification)
- end
-
def post_delete_script
[
Gitlab::Kubernetes::KubectlCmd.delete("pvc", "--selector", "release=elastic-stack")
diff --git a/app/models/clusters/applications/ingress.rb b/app/models/clusters/applications/ingress.rb
index d41fc72ae68..63f216c7af5 100644
--- a/app/models/clusters/applications/ingress.rb
+++ b/app/models/clusters/applications/ingress.rb
@@ -42,7 +42,7 @@ module Clusters
end
def allowed_to_uninstall?
- external_ip_or_hostname? && application_jupyter_nil_or_installable? && application_elastic_stack_nil_or_installable?
+ external_ip_or_hostname? && application_jupyter_nil_or_installable?
end
def install_command
@@ -155,10 +155,6 @@ module Clusters
def application_jupyter_nil_or_installable?
cluster.application_jupyter.nil? || cluster.application_jupyter&.installable?
end
-
- def application_elastic_stack_nil_or_installable?
- cluster.application_elastic_stack.nil? || cluster.application_elastic_stack&.installable?
- end
end
end
end
diff --git a/app/serializers/cluster_application_entity.rb b/app/serializers/cluster_application_entity.rb
index e7e4f5767e9..632718df780 100644
--- a/app/serializers/cluster_application_entity.rb
+++ b/app/serializers/cluster_application_entity.rb
@@ -8,7 +8,6 @@ class ClusterApplicationEntity < Grape::Entity
expose :external_ip, if: -> (e, _) { e.respond_to?(:external_ip) }
expose :external_hostname, if: -> (e, _) { e.respond_to?(:external_hostname) }
expose :hostname, if: -> (e, _) { e.respond_to?(:hostname) }
- expose :kibana_hostname, if: -> (e, _) { e.respond_to?(:kibana_hostname) }
expose :email, if: -> (e, _) { e.respond_to?(:email) }
expose :stack, if: -> (e, _) { e.respond_to?(:stack) }
expose :modsecurity_enabled, if: -> (e, _) { e.respond_to?(:modsecurity_enabled) }
diff --git a/app/serializers/deploy_key_entity.rb b/app/serializers/deploy_key_entity.rb
index 2682a47fbaa..653316ce4d2 100644
--- a/app/serializers/deploy_key_entity.rb
+++ b/app/serializers/deploy_key_entity.rb
@@ -5,6 +5,7 @@ class DeployKeyEntity < Grape::Entity
expose :user_id
expose :title
expose :fingerprint
+ expose :fingerprint_sha256
expose :destroyed_when_orphaned?, as: :destroyed_when_orphaned
expose :almost_orphaned?, as: :almost_orphaned
expose :created_at
diff --git a/app/services/clusters/applications/base_service.rb b/app/services/clusters/applications/base_service.rb
index 4b6c937fd5d..89b8163f798 100644
--- a/app/services/clusters/applications/base_service.rb
+++ b/app/services/clusters/applications/base_service.rb
@@ -19,10 +19,6 @@ module Clusters
application.hostname = params[:hostname]
end
- if application.has_attribute?(:kibana_hostname)
- application.kibana_hostname = params[:kibana_hostname]
- end
-
if application.has_attribute?(:email)
application.email = params[:email]
end
diff --git a/changelogs/unreleased/feat-ssh-sha256-other-key.yml b/changelogs/unreleased/feat-ssh-sha256-other-key.yml
new file mode 100644
index 00000000000..3fd5a2930d8
--- /dev/null
+++ b/changelogs/unreleased/feat-ssh-sha256-other-key.yml
@@ -0,0 +1,5 @@
+---
+title: Display SHA fingerprint for Deploy Keys and extend api to query those
+merge_request: 22665
+author: Roger Meier <r.meier@siemens.com>
+type: added
diff --git a/changelogs/unreleased/nfriend-add-environments-dashboard-message.yml b/changelogs/unreleased/nfriend-add-environments-dashboard-message.yml
new file mode 100644
index 00000000000..87757bc3758
--- /dev/null
+++ b/changelogs/unreleased/nfriend-add-environments-dashboard-message.yml
@@ -0,0 +1,5 @@
+---
+title: Add informational message about page limits to environments dashboard
+merge_request: 22489
+author:
+type: added
diff --git a/doc/api/keys.md b/doc/api/keys.md
index 5dedb630a27..30b0cda6c8b 100644
--- a/doc/api/keys.md
+++ b/doc/api/keys.md
@@ -128,3 +128,65 @@ Example response:
}
}
```
+
+Deploy Keys are bound to the creating user, so if you query with a deploy key
+fingerprint you get additional information about the projects using that key:
+
+```sh
+curl --header "PRIVATE-TOKEN: <your_access_token>" 'https://gitlab.example.com/api/v4/keys?fingerprint=SHA256%3AnUhzNyftwADy8AH3wFY31tAKs7HufskYTte2aXo%2FlCg
+```
+
+Example response:
+
+```json
+{
+ "id": 1,
+ "title": "Sample key 1",
+ "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt1016k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
+ "created_at": "2019-11-14T15:11:13.222Z",
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
+ "web_url": "http://0.0.0.0:3000/root",
+ "created_at": "2019-11-14T15:09:34.831Z",
+ "bio": null,
+ "location": null,
+ "public_email": "",
+ "skype": "",
+ "linkedin": "",
+ "twitter": "",
+ "website_url": "",
+ "organization": null,
+ "last_sign_in_at": "2019-11-16T22:41:26.663Z",
+ "confirmed_at": "2019-11-14T15:09:34.575Z",
+ "last_activity_on": "2019-11-20",
+ "email": "admin@example.com",
+ "theme_id": 1,
+ "color_scheme_id": 1,
+ "projects_limit": 100000,
+ "current_sign_in_at": "2019-11-19T14:42:18.078Z",
+ "identities": [
+ ],
+ "can_create_group": true,
+ "can_create_project": true,
+ "two_factor_enabled": false,
+ "external": false,
+ "private_profile": false,
+ "shared_runners_minutes_limit": null,
+ "extra_shared_runners_minutes_limit": null
+ },
+ "deploy_keys_projects": [
+ {
+ "id": 1,
+ "deploy_key_id": 1,
+ "project_id": 1,
+ "created_at": "2020-01-09T07:32:52.453Z",
+ "updated_at": "2020-01-09T07:32:52.453Z",
+ "can_push": false
+ }
+ ]
+}
+```
diff --git a/doc/development/feature_flags/process.md b/doc/development/feature_flags/process.md
index c64b14a05a4..4b44c8dadca 100644
--- a/doc/development/feature_flags/process.md
+++ b/doc/development/feature_flags/process.md
@@ -15,7 +15,9 @@ should be leveraged:
- Feature flags should remain in the codebase for as short period as possible
to reduce the need for feature flag accounting.
- The person operating with feature flags is responsible for clearly communicating
- the status of a feature behind the feature flag with responsible stakeholders.
+ the status of a feature behind the feature flag with responsible stakeholders. The
+ issue description should be updated with the feature flag name and whether it is
+ defaulted on or off as soon it is evident that a feature flag is needed.
- Merge requests that make changes hidden behind a feature flag, or remove an
existing feature flag because a feature is deemed stable must have the
~"feature flag" label assigned.
diff --git a/doc/user/clusters/applications.md b/doc/user/clusters/applications.md
index 1bb608c38ab..f2be9b2f3ac 100644
--- a/doc/user/clusters/applications.md
+++ b/doc/user/clusters/applications.md
@@ -41,6 +41,7 @@ The following applications can be installed:
- [JupyterHub](#jupyterhub)
- [Knative](#knative)
- [Crossplane](#crossplane)
+- [Elastic Stack](#elastic-stack)
With the exception of Knative, the applications will be installed in a dedicated
namespace called `gitlab-managed-apps`.
@@ -431,6 +432,38 @@ administrator to run following command within a Rails console:
Feature.enable(:enable_cluster_application_crossplane)
```
+### Elastic Stack
+
+> Introduced in GitLab 12.7 for project- and group-level clusters.
+
+[Elastic Stack](https://www.elastic.co/products/elastic-stack) is a complete end-to-end
+log analysis solution which helps in deep searching, analyzing and visualizing the logs
+generated from different machines.
+
+GitLab is able to gather logs from pods in your cluster automatically.
+Filebeat will run as a DaemonSet on each node in your cluster, and it will ship container logs to Elasticsearch for querying.
+GitLab will then connect to Elasticsearch for logs instead of the Kubernetes API,
+and you will have access to more advanced querying capabilities.
+
+This is a preliminary release of Elastic Stack as a GitLab-managed application. By default,
+the ability to install it is disabled.
+
+To allow installation of Elastic Stack as a GitLab-managed application, ask a GitLab
+administrator to run following command within a Rails console:
+
+```ruby
+Feature.enable(:enable_cluster_application_elastic_stack)
+```
+
+Once the feature flag is set, to enable log shipping, install Elastic Stack into the cluster with the
+**Install** button.
+
+NOTE: **Note:**
+The [`stable/elastic-stack`](https://github.com/helm/charts/tree/master/stable/elastic-stack)
+chart is used to install this application with a
+[`values.yaml`](https://gitlab.com/gitlab-org/gitlab/blob/master/vendor/elastic_stack/values.yaml)
+file.
+
## Install using GitLab CI (alpha)
> [Introduced](https://gitlab.com/gitlab-org/gitlab/merge_requests/20822) in GitLab 12.6.
@@ -639,6 +672,7 @@ The applications below can be uninstalled.
| Knative | 12.1+ | The associated IP will be deleted and cannot be restored. |
| Prometheus | 11.11+ | All data will be deleted and cannot be restored. |
| Crossplane | 12.5+ | All data will be deleted and cannot be restored. |
+| Elastic Stack | 12.7+ | All data will be deleted and cannot be restored. |
| Sentry | 12.6+ | The PostgreSQL persistent volume will remain and should be manually removed for complete uninstall. |
To uninstall an application:
diff --git a/doc/user/project/clusters/kubernetes_pod_logs.md b/doc/user/project/clusters/kubernetes_pod_logs.md
index 797ddf784cc..7cd5d99ef67 100644
--- a/doc/user/project/clusters/kubernetes_pod_logs.md
+++ b/doc/user/project/clusters/kubernetes_pod_logs.md
@@ -41,9 +41,37 @@ Logs can be displayed by clicking on a specific pod from [Deploy Boards](../depl
1. On the **Environments** page, you should see the status of the environment's pods with [Deploy Boards](../deploy_boards.md).
1. When mousing over the list of pods, a tooltip will appear with the exact pod name and status.
![Deploy Boards pod list](img/pod_logs_deploy_board.png)
-1. Click on the desired pod to bring up the logs view, which will contain the last 500 lines for that pod.
- You may switch between the following in this view:
- - Pods.
- - [From GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/issues/5769), environments.
+1. Click on the desired pod to bring up the logs view.
- Support for pods with multiple containers is coming [in a future release](https://gitlab.com/gitlab-org/gitlab/issues/6502).
+### Logs view
+
+The logs view will contain the last 500 lines for a pod, and has control to filter via:
+
+- Pods.
+- [From GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/issues/5769), environments.
+- [From GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/merge_requests/21656), [full text search](#full-text-search).
+
+Support for pods with multiple containers is coming [in a future release](https://gitlab.com/gitlab-org/gitlab/issues/13404).
+
+Support for historical data is coming [in a future release](https://gitlab.com/gitlab-org/gitlab/issues/196191).
+
+### Full text search
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/merge_requests/21656) in GitLab 12.7.
+
+When you enable [Elastic Stack](../../clusters/applications.md#elastic-stack) on your cluster,
+you can search the content of your logs via a search bar.
+
+The search is passed on to Elasticsearch using the [simple_query_string](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html)
+Elasticsearch function, which supports the following operators:
+
+```
++ signifies AND operation
+| signifies OR operation
+- negates a single token
+" wraps a number of tokens to signify a phrase for searching
+* at the end of a term signifies a prefix query
+( and ) signify precedence
+~N after a word signifies edit distance (fuzziness)
+~N after a phrase signifies slop amount
+```
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 3cb438baa80..e8ea4a9fac5 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -924,6 +924,10 @@ module API
expose :user, using: Entities::UserPublic
end
+ class DeployKeyWithUser < SSHKeyWithUser
+ expose :deploy_keys_projects
+ end
+
class DeployKeysProject < Grape::Entity
expose :deploy_key, merge: true, using: Entities::SSHKey
expose :can_push
diff --git a/lib/api/keys.rb b/lib/api/keys.rb
index 8f837107192..bec3dc9bd97 100644
--- a/lib/api/keys.rb
+++ b/lib/api/keys.rb
@@ -26,12 +26,15 @@ module API
get do
authenticated_with_can_read_all_resources!
- finder_params = params.merge(key_type: 'ssh')
-
- key = KeysFinder.new(current_user, finder_params).execute
+ key = KeysFinder.new(current_user, params).execute
not_found!('Key') unless key
- present key, with: Entities::SSHKeyWithUser, current_user: current_user
+
+ if key.type == "DeployKey"
+ present key, with: Entities::DeployKeyWithUser, current_user: current_user
+ else
+ present key, with: Entities::SSHKeyWithUser, current_user: current_user
+ end
rescue KeysFinder::InvalidFingerprint
render_api_error!('Failed to return the key', 400)
end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 5b4db60d020..68077245975 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -3824,9 +3824,6 @@ msgstr ""
msgid "ClusterIntegration|Copy Jupyter Hostname"
msgstr ""
-msgid "ClusterIntegration|Copy Kibana Hostname"
-msgstr ""
-
msgid "ClusterIntegration|Copy Knative Endpoint"
msgstr ""
@@ -4043,9 +4040,6 @@ msgstr ""
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Kibana Hostname"
-msgstr ""
-
msgid "ClusterIntegration|Knative"
msgstr ""
@@ -6927,12 +6921,18 @@ msgstr ""
msgid "EnvironmentsDashboard|More actions"
msgstr ""
+msgid "EnvironmentsDashboard|Read more."
+msgstr ""
+
msgid "EnvironmentsDashboard|Remove"
msgstr ""
msgid "EnvironmentsDashboard|The environments dashboard provides a summary of each project's environments' status, including pipeline and alert statuses."
msgstr ""
+msgid "EnvironmentsDashboard|This dashboard displays a maximum of 7 projects and 3 environments per project. %{readMoreLink}"
+msgstr ""
+
msgid "Environments|An error occurred while canceling the auto stop, please try again"
msgstr ""
diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb
index 8e41417049b..314a951ba89 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb
@@ -8,11 +8,9 @@ module QA
before do
Flow::Login.sign_in
- issue = Resource::Issue.fabricate_via_api! do |issue|
+ Resource::Issue.fabricate_via_api! do |issue|
issue.title = 'issue title'
- end
-
- issue.visit!
+ end.visit!
Page::Project::Issue::Show.perform do |show|
show.select_all_activities_filter
diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb
index 77489c0ecf5..9234227eff7 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb
@@ -6,10 +6,9 @@ module QA
before do
Flow::Login.sign_in
- issue = Resource::Issue.fabricate_via_api! do |issue|
+ Resource::Issue.fabricate_via_api! do |issue|
issue.title = 'issue title'
- end
- issue.visit!
+ end.visit!
end
it 'user comments on an issue and edits the comment' do
diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb
index 341e6fd0096..b323ee26e47 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb
@@ -12,12 +12,8 @@ module QA
resource.name = 'project-to-test-mention'
resource.visibility = 'private'
end
- project.visit!
- Page::Project::Show.perform(&:go_to_members_settings)
- Page::Project::Settings::Members.perform do |members|
- members.add_member(@user.username)
- end
+ project.add_member(@user)
Resource::Issue.fabricate_via_api! do |issue|
issue.title = 'issue to test mention'
diff --git a/spec/features/clusters/installing_applications_shared_examples.rb b/spec/features/clusters/installing_applications_shared_examples.rb
index 988cd228c1c..20648ed3d46 100644
--- a/spec/features/clusters/installing_applications_shared_examples.rb
+++ b/spec/features/clusters/installing_applications_shared_examples.rb
@@ -181,11 +181,8 @@ shared_examples "installing applications on a cluster" do
context 'when user installs Elastic Stack' do
before do
allow(ClusterInstallAppWorker).to receive(:perform_async)
- allow(ClusterWaitForIngressIpAddressWorker).to receive(:perform_in)
- allow(ClusterWaitForIngressIpAddressWorker).to receive(:perform_async)
create(:clusters_applications_helm, :installed, cluster: cluster)
- create(:clusters_applications_ingress, :installed, external_ip: '127.0.0.1', cluster: cluster)
page.within('.js-cluster-application-row-elastic_stack') do
click_button 'Install'
diff --git a/spec/finders/keys_finder_spec.rb b/spec/finders/keys_finder_spec.rb
index f80abdcdb38..7605d066ddf 100644
--- a/spec/finders/keys_finder_spec.rb
+++ b/spec/finders/keys_finder_spec.rb
@@ -73,7 +73,15 @@ describe KeysFinder do
end
context 'with valid fingerprints' do
- context 'with valid MD5 params' do
+ let!(:deploy_key) do
+ create(:deploy_key,
+ user: user,
+ key: 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt1017k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=',
+ fingerprint: '8a:4a:12:92:0b:50:47:02:d4:5a:8e:a9:44:4e:08:b4',
+ fingerprint_sha256: '4DPHOVNh53i9dHb5PpY2vjfyf5qniTx1/pBFPoZLDdk')
+ end
+
+ context 'personal key with valid MD5 params' do
context 'with an existent fingerprint' do
before do
params[:fingerprint] = 'ba:81:59:68:d7:6c:cd:02:02:bf:6a:9b:55:4e:af:d1'
@@ -85,6 +93,17 @@ describe KeysFinder do
end
end
+ context 'deploy key with an existent fingerprint' do
+ before do
+ params[:fingerprint] = '8a:4a:12:92:0b:50:47:02:d4:5a:8e:a9:44:4e:08:b4'
+ end
+
+ it 'returns the key' do
+ expect(subject).to eq(deploy_key)
+ expect(subject.user).to eq(user)
+ end
+ end
+
context 'with a non-existent fingerprint' do
before do
params[:fingerprint] = 'bb:81:59:68:d7:6c:cd:02:02:bf:6a:9b:55:4e:af:d2'
@@ -96,7 +115,7 @@ describe KeysFinder do
end
end
- context 'with valid SHA256 params' do
+ context 'personal key with valid SHA256 params' do
context 'with an existent fingerprint' do
before do
params[:fingerprint] = 'SHA256:nUhzNyftwADy8AH3wFY31tAKs7HufskYTte2aXo/lCg'
@@ -108,6 +127,17 @@ describe KeysFinder do
end
end
+ context 'deploy key with an existent fingerprint' do
+ before do
+ params[:fingerprint] = 'SHA256:4DPHOVNh53i9dHb5PpY2vjfyf5qniTx1/pBFPoZLDdk'
+ end
+
+ it 'returns key' do
+ expect(subject).to eq(deploy_key)
+ expect(subject.user).to eq(user)
+ end
+ end
+
context 'with a non-existent fingerprint' do
before do
params[:fingerprint] = 'SHA256:xTjuFqftwADy8AH3wFY31tAKs7HufskYTte2aXi/mNp'
diff --git a/spec/fixtures/api/schemas/cluster_status.json b/spec/fixtures/api/schemas/cluster_status.json
index fcb4f2b94cd..29c56b5c820 100644
--- a/spec/fixtures/api/schemas/cluster_status.json
+++ b/spec/fixtures/api/schemas/cluster_status.json
@@ -35,7 +35,6 @@
"external_ip": { "type": ["string", "null"] },
"external_hostname": { "type": ["string", "null"] },
"hostname": { "type": ["string", "null"] },
- "kibana_hostname": { "type": ["string", "null"] },
"email": { "type": ["string", "null"] },
"stack": { "type": ["string", "null"] },
"modsecurity_enabled": { "type": ["boolean", "null"] },
diff --git a/spec/frontend/clusters/components/applications_spec.js b/spec/frontend/clusters/components/applications_spec.js
index e8c5a2bd242..a646ea8c700 100644
--- a/spec/frontend/clusters/components/applications_spec.js
+++ b/spec/frontend/clusters/components/applications_spec.js
@@ -199,7 +199,7 @@ describe('Applications', () => {
prometheus: { title: 'Prometheus' },
jupyter: { title: 'JupyterHub', hostname: '' },
knative: { title: 'Knative', hostname: '' },
- elastic_stack: { title: 'Elastic Stack', kibana_hostname: '' },
+ elastic_stack: { title: 'Elastic Stack' },
},
});
@@ -433,81 +433,35 @@ describe('Applications', () => {
});
describe('Elastic Stack application', () => {
- describe('with ingress installed with ip & elastic stack installable', () => {
+ describe('with elastic stack installable', () => {
it('renders hostname active input', () => {
vm = mountComponent(Applications, {
applications: {
...APPLICATIONS_MOCK_STATE,
- ingress: {
- title: 'Ingress',
- status: 'installed',
- externalIp: '1.1.1.1',
- },
},
});
expect(
vm.$el
- .querySelector('.js-cluster-application-row-elastic_stack .js-hostname')
- .getAttribute('readonly'),
- ).toEqual(null);
- });
- });
-
- describe('with ingress installed without external ip', () => {
- it('does not render hostname input', () => {
- vm = mountComponent(Applications, {
- applications: {
- ...APPLICATIONS_MOCK_STATE,
- ingress: { title: 'Ingress', status: 'installed' },
- },
- });
-
- expect(vm.$el.querySelector('.js-cluster-application-row-elastic_stack .js-hostname')).toBe(
- null,
- );
+ .querySelector(
+ '.js-cluster-application-row-elastic_stack .js-cluster-application-install-button',
+ )
+ .getAttribute('disabled'),
+ ).toEqual('disabled');
});
});
- describe('with ingress & elastic stack installed', () => {
- it('renders readonly input', () => {
+ describe('elastic stack installed', () => {
+ it('renders uninstall button', () => {
vm = mountComponent(Applications, {
applications: {
...APPLICATIONS_MOCK_STATE,
- ingress: {
- title: 'Ingress',
- status: 'installed',
- externalIp: '1.1.1.1',
- modsecurity_enabled: false,
- },
- elastic_stack: { title: 'Elastic Stack', status: 'installed', kibana_hostname: '' },
+ elastic_stack: { title: 'Elastic Stack', status: 'installed' },
},
});
expect(
vm.$el
- .querySelector('.js-cluster-application-row-elastic_stack .js-hostname')
- .getAttribute('readonly'),
- ).toEqual('readonly');
- });
- });
-
- describe('without ingress installed', () => {
- beforeEach(() => {
- vm = mountComponent(Applications, {
- applications: APPLICATIONS_MOCK_STATE,
- });
- });
-
- it('does not render input', () => {
- expect(vm.$el.querySelector('.js-cluster-application-row-elastic_stack .js-hostname')).toBe(
- null,
- );
- });
-
- it('renders disabled install button', () => {
- expect(
- vm.$el
.querySelector(
'.js-cluster-application-row-elastic_stack .js-cluster-application-install-button',
)
diff --git a/spec/frontend/clusters/services/mock_data.js b/spec/frontend/clusters/services/mock_data.js
index 98fa0ec3b07..f0bcf5d980f 100644
--- a/spec/frontend/clusters/services/mock_data.js
+++ b/spec/frontend/clusters/services/mock_data.js
@@ -157,7 +157,7 @@ const APPLICATIONS_MOCK_STATE = {
prometheus: { title: 'Prometheus' },
jupyter: { title: 'JupyterHub', status: 'installable', hostname: '' },
knative: { title: 'Knative ', status: 'installable', hostname: '' },
- elastic_stack: { title: 'Elastic Stack', status: 'installable', kibana_hostname: '' },
+ elastic_stack: { title: 'Elastic Stack', status: 'installable' },
};
export { CLUSTERS_MOCK_DATA, DEFAULT_APPLICATION_STATE, APPLICATIONS_MOCK_STATE };
diff --git a/spec/frontend/clusters/stores/clusters_store_spec.js b/spec/frontend/clusters/stores/clusters_store_spec.js
index c7ec4ddc464..f2dbdd0638b 100644
--- a/spec/frontend/clusters/stores/clusters_store_spec.js
+++ b/spec/frontend/clusters/stores/clusters_store_spec.js
@@ -167,7 +167,6 @@ describe('Clusters Store', () => {
installFailed: true,
statusReason: mockResponseData.applications[7].status_reason,
requestReason: null,
- kibana_hostname: '',
installed: false,
uninstallable: false,
uninstallSuccessful: false,
@@ -216,16 +215,5 @@ describe('Clusters Store', () => {
`jupyter.${store.state.applications.ingress.externalIp}.nip.io`,
);
});
-
- it('sets default hostname for elastic stack when ingress has a ip address', () => {
- const mockResponseData =
- CLUSTERS_MOCK_DATA.GET['/gitlab-org/gitlab-shell/clusters/2/status.json'].data;
-
- store.updateStateFromServer(mockResponseData);
-
- expect(store.state.applications.elastic_stack.kibana_hostname).toEqual(
- `kibana.${store.state.applications.ingress.externalIp}.nip.io`,
- );
- });
});
});
diff --git a/spec/helpers/users_helper_spec.rb b/spec/helpers/users_helper_spec.rb
index 172ead158fb..8479f8509f5 100644
--- a/spec/helpers/users_helper_spec.rb
+++ b/spec/helpers/users_helper_spec.rb
@@ -7,6 +7,10 @@ describe UsersHelper do
let(:user) { create(:user) }
+ def filter_ee_badges(badges)
+ badges.reject { |badge| badge[:text] == 'Is using seat' }
+ end
+
describe '#user_link' do
subject { helper.user_link(user) }
@@ -118,7 +122,7 @@ describe UsersHelper do
badges = helper.user_badges_in_admin_section(blocked_user)
- expect(badges).to eq([text: "Blocked", variant: "danger"])
+ expect(filter_ee_badges(badges)).to eq([text: "Blocked", variant: "danger"])
end
end
@@ -128,7 +132,7 @@ describe UsersHelper do
badges = helper.user_badges_in_admin_section(admin_user)
- expect(badges).to eq([text: "Admin", variant: "success"])
+ expect(filter_ee_badges(badges)).to eq([text: "Admin", variant: "success"])
end
end
@@ -138,7 +142,7 @@ describe UsersHelper do
badges = helper.user_badges_in_admin_section(external_user)
- expect(badges).to eq([text: "External", variant: "secondary"])
+ expect(filter_ee_badges(badges)).to eq([text: "External", variant: "secondary"])
end
end
@@ -146,7 +150,7 @@ describe UsersHelper do
it 'returns the "It\'s You" badge' do
badges = helper.user_badges_in_admin_section(user)
- expect(badges).to eq([text: "It's you!", variant: nil])
+ expect(filter_ee_badges(badges)).to eq([text: "It's you!", variant: nil])
end
end
@@ -170,7 +174,7 @@ describe UsersHelper do
badges = helper.user_badges_in_admin_section(user)
- expect(badges).to be_empty
+ expect(filter_ee_badges(badges)).to be_empty
end
end
end
diff --git a/spec/models/clusters/applications/elastic_stack_spec.rb b/spec/models/clusters/applications/elastic_stack_spec.rb
index 2179e930691..d336dc752c8 100644
--- a/spec/models/clusters/applications/elastic_stack_spec.rb
+++ b/spec/models/clusters/applications/elastic_stack_spec.rb
@@ -10,45 +10,8 @@ describe Clusters::Applications::ElasticStack do
include_examples 'cluster application version specs', :clusters_applications_elastic_stack
include_examples 'cluster application helm specs', :clusters_applications_elastic_stack
- describe '#can_uninstall?' do
- let(:ingress) { create(:clusters_applications_ingress, :installed, external_hostname: 'localhost.localdomain') }
- let(:elastic_stack) { create(:clusters_applications_elastic_stack, cluster: ingress.cluster) }
-
- subject { elastic_stack.can_uninstall? }
-
- it { is_expected.to be_truthy }
- end
-
- describe '#set_initial_status' do
- before do
- elastic_stack.set_initial_status
- end
-
- context 'when ingress is not installed' do
- let(:cluster) { create(:cluster, :provided_by_gcp) }
- let(:elastic_stack) { create(:clusters_applications_elastic_stack, cluster: cluster) }
-
- it { expect(elastic_stack).to be_not_installable }
- end
-
- context 'when ingress is installed and external_ip is assigned' do
- let(:ingress) { create(:clusters_applications_ingress, :installed, external_ip: '127.0.0.1') }
- let(:elastic_stack) { create(:clusters_applications_elastic_stack, cluster: ingress.cluster) }
-
- it { expect(elastic_stack).to be_installable }
- end
-
- context 'when ingress is installed and external_hostname is assigned' do
- let(:ingress) { create(:clusters_applications_ingress, :installed, external_hostname: 'localhost.localdomain') }
- let(:elastic_stack) { create(:clusters_applications_elastic_stack, cluster: ingress.cluster) }
-
- it { expect(elastic_stack).to be_installable }
- end
- end
-
describe '#install_command' do
- let!(:ingress) { create(:clusters_applications_ingress, :installed, external_ip: '127.0.0.1') }
- let!(:elastic_stack) { create(:clusters_applications_elastic_stack, cluster: ingress.cluster) }
+ let!(:elastic_stack) { create(:clusters_applications_elastic_stack) }
subject { elastic_stack.install_command }
@@ -80,8 +43,7 @@ describe Clusters::Applications::ElasticStack do
end
describe '#uninstall_command' do
- let!(:ingress) { create(:clusters_applications_ingress, :installed, external_ip: '127.0.0.1') }
- let!(:elastic_stack) { create(:clusters_applications_elastic_stack, cluster: ingress.cluster) }
+ let!(:elastic_stack) { create(:clusters_applications_elastic_stack) }
subject { elastic_stack.uninstall_command }
@@ -100,19 +62,6 @@ describe Clusters::Applications::ElasticStack do
end
end
- describe '#files' do
- let!(:ingress) { create(:clusters_applications_ingress, :installed, external_ip: '127.0.0.1') }
- let!(:elastic_stack) { create(:clusters_applications_elastic_stack, cluster: ingress.cluster) }
-
- let(:values) { subject[:'values.yaml'] }
-
- subject { elastic_stack.files }
-
- it 'includes elastic stack specific keys in the values.yaml file' do
- expect(values).to include('ELASTICSEARCH_HOSTS')
- end
- end
-
describe '#elasticsearch_client' do
context 'cluster is nil' do
it 'returns nil' do
diff --git a/spec/requests/api/keys_spec.rb b/spec/requests/api/keys_spec.rb
index f7da1abcfdf..c743cb3f633 100644
--- a/spec/requests/api/keys_spec.rb
+++ b/spec/requests/api/keys_spec.rb
@@ -106,6 +106,36 @@ describe API::Keys do
expect(json_response['user']['is_admin']).to be_nil
end
+
+ context 'when searching a DeployKey' do
+ let(:project) { create(:project, :repository) }
+ let(:project_push) { create(:project, :repository) }
+ let(:deploy_key) { create(:deploy_key) }
+
+ let!(:deploy_keys_project) do
+ create(:deploy_keys_project, project: project, deploy_key: deploy_key)
+ end
+
+ let!(:deploy_keys_project_push) do
+ create(:deploy_keys_project, project: project_push, deploy_key: deploy_key, can_push: true)
+ end
+
+ it 'returns user and projects if SSH sha256 fingerprint for DeployKey found' do
+ user.keys << deploy_key
+
+ get api("/keys?fingerprint=#{URI.encode_www_form_component("SHA256:" + deploy_key.fingerprint_sha256)}", admin)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['title']).to eq(deploy_key.title)
+ expect(json_response['user']['id']).to eq(user.id)
+
+ expect(json_response['deploy_keys_projects'].count).to eq(2)
+ expect(json_response['deploy_keys_projects'][0]['project_id']).to eq(deploy_keys_project.project.id)
+ expect(json_response['deploy_keys_projects'][0]['can_push']).to eq(deploy_keys_project.can_push)
+ expect(json_response['deploy_keys_projects'][1]['project_id']).to eq(deploy_keys_project_push.project.id)
+ expect(json_response['deploy_keys_projects'][1]['can_push']).to eq(deploy_keys_project_push.can_push)
+ end
+ end
end
end
end
diff --git a/spec/serializers/deploy_key_entity_spec.rb b/spec/serializers/deploy_key_entity_spec.rb
index 607adfc2488..0dbbf0de59b 100644
--- a/spec/serializers/deploy_key_entity_spec.rb
+++ b/spec/serializers/deploy_key_entity_spec.rb
@@ -24,6 +24,7 @@ describe DeployKeyEntity do
user_id: deploy_key.user_id,
title: deploy_key.title,
fingerprint: deploy_key.fingerprint,
+ fingerprint_sha256: deploy_key.fingerprint_sha256,
destroyed_when_orphaned: true,
almost_orphaned: false,
created_at: deploy_key.created_at,
diff --git a/spec/services/clusters/applications/create_service_spec.rb b/spec/services/clusters/applications/create_service_spec.rb
index d5ad03a94ac..f62af86f1bf 100644
--- a/spec/services/clusters/applications/create_service_spec.rb
+++ b/spec/services/clusters/applications/create_service_spec.rb
@@ -163,8 +163,7 @@ describe Clusters::Applications::CreateService do
context 'elastic stack application' do
let(:params) do
{
- application: 'elastic_stack',
- kibana_hostname: 'example.com'
+ application: 'elastic_stack'
}
end
@@ -182,10 +181,6 @@ describe Clusters::Applications::CreateService do
cluster.reload
end.to change(cluster, :application_elastic_stack)
end
-
- it 'sets the kibana_hostname' do
- expect(subject.kibana_hostname).to eq('example.com')
- end
end
end
diff --git a/vendor/elastic_stack/values.yaml b/vendor/elastic_stack/values.yaml
index 9346c0e25e6..2aa254eaa4a 100644
--- a/vendor/elastic_stack/values.yaml
+++ b/vendor/elastic_stack/values.yaml
@@ -11,14 +11,7 @@ elasticsearch:
replicas: 1
kibana:
- enabled: true
- env:
- ELASTICSEARCH_HOSTS: http://elastic-stack-elasticsearch-client:9200
- ingress:
- enabled: true
- annotations:
- kubernetes.io/ingress.class: "nginx"
- kubernetes.io/tls-acme: "true"
+ enabled: false
logstash:
enabled: false