1237 Commits

Author SHA1 Message Date
Saša Živkov
e715863a10 migrate-to-note-db: add --skip-project option
Useful when only a few projects should be skipped but all others should
be rebuilt.

Change-Id: I46f836ac250e11fc8e64d1a8b2be08c1213580f8
2019-01-16 08:18:53 +09:00
David Ostrovsky
a7056ec1dd Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  Bazel: Fix more buildifier warnings
  Bazel: Automatically fix lint errors with buildifier 0.20.0
  Bazel: Automatically fix lint errors with buildifier

Change-Id: I02ba30185683a54dca09e6e200b90fe0e86e1f83
2019-01-09 23:10:35 +01:00
David Ostrovsky
930f29e2fd Bazel: Automatically fix lint errors with buildifier
In recent buildifier versions, lint errors can be fixed automatically:

  $ find . \( -name BUILD -o -name "*.bzl" \) -print \
      | xargs buildifier --lint=fix

This commit was created with Buildifier version 0.19.2:

  $ buildifier --version
buildifier version: 0.19.2
buildifier scm revision: d39e4d5c25111527369142f16cdb49aa67707313

Change-Id: I1f06cd4596e794981ccc2d9fc2d1da9b17f3973a
2019-01-08 23:11:59 +01:00
David Ostrovsky
020758e134 De-couple online reindex activation from index module
Gerrit plugins can contribute to submit rules evaluation, that are a
part of secondary index.  Therefore it is crucial that plugins are
loaded prior to triggering of online reindexing.

This change de-couples online reindex activation from index module and
thus postpones the triggering of online reindexing until after loading
of the plugins:

1. Load secondary index
2. Load all plugins
3. Trigger online reindex if needed

Bug: Issue 10082
Change-Id: I1706d42cb50eb342c2b9eca076e2def5bd1426c0
2018-12-30 21:51:52 +00:00
David Pursehouse
5e8ab6a691 Revert "Fix online reindexing for plugins-dependent rules"
Loading plugins before activating the index breaks any plugin that
relies on the index. This is more of a problem in 2.15 since the
caches refer to the index, and therefore breaks any plugin that
relies on caches.

This reverts commit 86a1dd735cbd14dab9eb05a0b2dbfd862ce8c8d9.

Bug: Issue 10082
Change-Id: I99f81cfdadf4e652e2cfe72c6dc6b3686de3a806
2018-12-30 21:50:22 +00:00
Antonio Barone
76394d2a89 Trigger audit for GIT over Http commands
Before this change only git over SSH commands were audited, this
change allows auditing of git-receive-pack and git-upload-pack
commands over http.

To allow testing AuditService is now an interface so that a fake
implementation can be injected in the tests.

Bug: Issue 9982
Change-Id: Iffcd0fbd7332ef0f6b4b4a8e57bb5d571ee4cb39
2018-11-12 11:11:18 -08:00
Paladox none
8af72e6657 Update mariadb-connector-j to 2.3.0
MariaDB connector now supports connection pool.

See release notes:

* https://github.com/MariaDB/mariadb-connector-j/releases/tag/2.2.0

* https://github.com/MariaDB/mariadb-connector-j/releases/tag/2.2.1

* https://github.com/MariaDB/mariadb-connector-j/releases/tag/2.2.2

* https://github.com/MariaDB/mariadb-connector-j/releases/tag/2.2.3

* https://github.com/MariaDB/mariadb-connector-j/releases/tag/2.2.4

* https://github.com/MariaDB/mariadb-connector-j/releases/tag/2.2.5

* https://github.com/MariaDB/mariadb-connector-j/releases/tag/2.2.6

* https://github.com/MariaDB/mariadb-connector-j/releases/tag/2.3.0

Change-Id: I1698ee9fb53e784548542c973c554bc70c45c872
2018-09-27 13:52:42 +01:00
David Pursehouse
a564df698a Make inner classes static where possible
Change-Id: Icb75d765bd4e9198ef294c3d099c762a395a623e
2018-09-12 14:46:10 +09:00
David Pursehouse
dfb8975e88 MigrateToNoteDb: Specify charset when constructing PrintWriter
Change-Id: I916eeed389f9849724c239d372edd0bab93598e9
2018-09-12 14:42:53 +09:00
David Ostrovsky
bb46f7570a Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  GitOverHttpModule: Bind REST auth filter in its own module
  Ensure user authentication in AllRequestFilter filters

Change-Id: I873737ead014c20f0590ab0f246e9ded0601e4ef
2018-08-31 21:43:59 +02:00
Dave Borowitz
8c9f93493a Merge changes Iba3a674f,I8ed3f12e,Id6617817 into stable-2.14
* changes:
  InitSshd: Use correct flag to set empty passphrase
  SshSession: Specify charset in constructor of Scanner
  Specify charset in constructors of InputStreamReader
2018-08-31 17:43:28 +00:00
David Ostrovsky
b8695a315d GitOverHttpModule: Bind REST auth filter in its own module
GitOverHttpModule is binding both filters for git over HTTP and for REST
requests. Extract filter definition for REST requests in its own module.

Change-Id: If03e76c906bc3e0cac827b49f5f087cc859be4cd
2018-08-31 08:43:09 +00:00
David Ostrovsky
b545f0cae5 Ensure user authentication in AllRequestFilter filters
The current order of filters declaration make request authentication
only work when HTTP request is issued from the Gerrit UI, but not
work when REST API is used.

In Daemon#createWebInjector() we have this:

  [...]
  modules.add(RequestContextFilter.module());
  modules.add(AllRequestFilter.module());
  modules.add(RequestMetricsFilter.module());
  modules.add(H2CacheBasedWebSession.module());
  modules.add(sysInjector.getInstance(GitOverHttpModule.class));
  [...]

The are two major use cases to consider:

1. Gerrit UI request: when authenticated user session is found and set
in RequestContextFilter, before AllRequestFilter, that's why in
AllRequestFilter we have a user:

  Account: 1000000 username: admin

2. REST API request, e.g.:

  curl --user user http://localhost:8080/a/config/server/version
  "2.14.7-9-g9ebfce95b7-dirty"

Here the AllRequestFilter is bound before GitOverHttpModule, that
provides ProjectBasicAuthFilter filter, and thus, there is no identified
user:

  anonymous

Adapt the AllRequestFilter registration order to fix authentication also
for REST API requests.

This is needed for Javamelody's monitoring filter to work properly for
Prometheus scraping request:

  curl -u user http://localhost:8080/a/monitoring?format=prometheus

There is more context and discussions in these CLs:

https://gerrit-review.googlesource.com/c/plugins/javamelody/+/192411
https://gerrit-review.googlesource.com/c/plugins/javamelody/+/192170
https://gerrit-review.googlesource.com/c/gerrit/+/164991

Change-Id: I925e952474440cb612080dafd917a01dba8f3330
2018-08-31 08:41:06 +02:00
David Pursehouse
727b108d2a Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  InitSshd: Use correct flag to set empty passphrase
  SshSession: Specify charset in constructor of Scanner
  Specify charset in constructors of InputStreamReader
  Update JGit dependencies to fix building from source

Change-Id: I994d9d26bb7a1b1333a6380fb81126c1e8dc026d
2018-08-31 12:37:23 +09:00
Gerrit Code Review
625965f800 InitSshd: Use correct flag to set empty passphrase
From https://www.ssh.com/ssh/keygen/:
  -N "New" Provides a new passphrase for the key.
  -P "Passphrase" Provides the (old) passphrase when reading a key.

PiperOrigin-RevId: 210948400
Change-Id: Iba3a674f81686987fef60f0fd5a5f42aa5b9dd86
2018-08-31 10:35:39 +09:00
David Pursehouse
60325b70b2 Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  Update revision of commit-message-length-plugin
  Improve warning when starting Gerrit JVM without OOM protection
  Warning when starting Gerrit JVM without OOM protection
  cmd-index.txt: Fix anchors
  Update revision of commit-message-length-validator plugin

Change-Id: I22e63acf594457e15dc1f922641998a72a6f577a
2018-08-30 10:20:15 +09:00
David Pursehouse
acf4e22463 Improve warning when starting Gerrit JVM without OOM protection
Change-Id: Ib4ab2d5ab6a58fa34de081d8051b21411f994e70
2018-08-30 08:19:53 +09:00
Luca Milanesio
727a856753 Warning when starting Gerrit JVM without OOM protection
When gerrit.sh gets started from a non-root user, the JVM PID is not
protected against the Kernel OOM killer attacks.
Instead of silently ignoring the setting, display a warning making aware
of the danger and telling the user what to do.

Bug: Issue 9514
Change-Id: I4c1c0e06b260e75d900f436d37f0b91d031cd24e
2018-08-29 07:19:50 +00:00
David Pursehouse
02efb34cc8 Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  ConfigInfoImpl: Factor out initialization of MaxObjectSizeLimitInfo to a method
  Rename instances of TransferConfig to transferConfig
  Clarify inherited_value in documentation of MaxObjectSizeLimitInfo
  Reword docmentation of project specific object size limit for clarity
  PutConfig: Reload project config before returning response
  SiteProgram: Extract local variable
  SiteProgram: Extract constant
  SiteProgram: Inline variable to avoid hiding field
  DataSourceProvider: Rename local variable to avoid hiding field
  DataSourceProvider: Remove unneeded finals
  DataSourceProvider: Replace inner class with lambda
  DataSourceProvider: Extract constant
  Migrate `tools/bazel.rc` to `.bazelrc`
  ProjectIT: Add tests for maxObjectSize configuration
  EventRecorder: Add assertNoRefUpdatedEvents helper method
  ProjectIT: Rename 'config' method to 'submitType'

Change-Id: If803aa7390a2644c3ccd9baa04e1b874c3de5d40
2018-08-07 22:13:18 +01:00
Hector Oswaldo Caballero
5d07e59c9f SiteProgram: Extract local variable
The issue here was that Sonar complains about 'ifs' that can be merged
but doing so was less readable than just extracting a local variable.

Change-Id: I5898fd2860fc7d54e6ff04376e3b4ea0120ca8fa
2018-08-06 09:04:11 -04:00
Hector Oswaldo Caballero
0d32a9b21b SiteProgram: Extract constant
Change-Id: I94381b029c843bccda12a6fc418a531f67d8668a
2018-08-06 09:04:11 -04:00
Hector Oswaldo Caballero
39d0d89dcd SiteProgram: Inline variable to avoid hiding field
Change-Id: I2ddd8c7cda96d77ed17fcf65b4702a61fe9832ea
2018-08-06 08:50:14 -04:00
David Pursehouse
39dcd91570 Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  Minor improvements in receive.maxObjectSizeLimit documentation
  Bazel: Consume rules_closure from HEAD
  Bump auto-value to 1.6.2

Change-Id: I401942a40c5001300f77f9437d342001cd42e619
2018-08-02 15:07:21 +02:00
David Ostrovsky
5531347e56 Bump auto-value to 1.6.2
This upgrade is needed to support JDK9, that was fixed in this
commit: [1].

[1] f04406c1f1

Change-Id: Ic7464964dc7e21946aac4b4a786107a0df51ae2a
2018-08-01 22:35:35 +02:00
David Pursehouse
28ab32a2b9 Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  ElasticTestUtils: Set index.maxLimit as integer rather than string
  ElasticConfigurationTest: Add tests for elasticsearch.maxRetryTimeout
  ElasticConfigurationTest: Add tests for elasticsearch.prefix
  ElasticConfigurationTest: Add tests for elasticsearch.{username,password}
  ElasticConfiguration: Extract constants to statics
  Elasticsearch: Simplify configuration of servers

Change-Id: Ic579d37734f285043f2d5ea9b764ec75cb485768
2018-07-05 08:55:56 +09:00
David Pursehouse
479c50ba28 Elasticsearch: Simplify configuration of servers
Instead of configuring each server in its own section with separate
values for protocol, host and port, i.e.:

  [elasticsearch "elastic1"]
    hostname = elastic1
    protocol = https
    port = 1234

  [elasticsearch "elastic2"]
    hostname = elastic2
    protocol = https
    port = 1234

Configure them all under the main "elasticsearch" section as multiple
values, i.e.

  [elasticsearch]
    server = https://elastic1:1234
    server = https://elastic2:1234

Allow the port to be omitted, and default it to 9200.

Require at least one server to be explicitly configured and throw a
provision exception if there are none.

During init prompt for the server, defaulting to http://localhost:9200.

Since the init framework doesn't support reading or setting string lists,
if there are multiple server values it will prompt the last one. Mention
in the documentation that configuration of multiple servers must be done
manually.

Since it is not expected that Elasticsearch is being used in production
anywhere, no backwards compatibility with the previous configuration is
provided. Users must adjust their configuration to the new format.

Add a new test, ElasticConfigurationTest, which in this initial version
only tests the configuration of the elasticsearch.server. More tests may
be added in follow-up commits.

Bug: Issue 9372
Bug: Issue 9383
Change-Id: Iad2c547ae82ba89b7ede777072e0869bc77d2025
2018-07-04 13:35:52 +09:00
David Pursehouse
54c04f59b9 Reformat all Java files with google-java-format 1.6
Reformat all files with the exception of:

- lib/asciidoctor/java/AsciiDoctor.java

to avoid requiring the Library-Compliance label.

Change-Id: Iedba3f24ac00e2186e3e0688fabea817ddf43739
2018-06-06 09:10:11 +09:00
David Pursehouse
edc6a492a8 Reformat all Java files with google-java-format 1.6
Reformat all files with the exception of:

- lib/asciidoctor/java/AsciiDoctor.java

to avoid requiring the Library-Compliance label.

Change-Id: Iedba3f24ac00e2186e3e0688fabea817ddf43739
2018-06-06 08:44:11 +09:00
David Pursehouse
094671b459 Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  Remove unused elasticsearch library from WORKSPACE
  Use Logger's built-in formatting

Change-Id: I2d3dca1036a1a1a1a6e00331cab31c244bd78bc6
2018-05-30 09:35:44 +09:00
David Pursehouse
fac55c753f Use Logger's built-in formatting
Change-Id: I79eb533d44df45ff1e57656084c7ef4cb080fd91
2018-05-29 16:18:17 +09:00
David Pursehouse
856ff18d5c Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  Use Logger's built-in string formatting where possible
  Doc: Fix code example in JS API

Change-Id: I1b953b6d9ab5cd066b8b6f43bb1843dcb1736d1b
2018-05-23 20:19:37 +09:00
David Pursehouse
46af8d137d Use Logger's built-in string formatting where possible
Change-Id: Ie1d03cbd17660a777a15961333dbd8c7fbd2e453
2018-05-23 16:05:40 +09:00
David Pursehouse
a17c4f558f Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  Update git submodules
  Update git submodules
  ldap.Helper: Use local logger and make logger in LdapRealm private
  Remove ValidationError#createLoggerSink to avoid passing around loggers
  LdapLoginServlet: Improve exception handling
  OperatingSystemMXBeanProvider: Log exception for ReflectiveOperationException
  WorkQueue: Don't fail when queue metric already exists
  WorkQueue: Sanitize metric name when queue is created
  DropWizardMetricMaker: Introduce method to sanitize metric name

Change-Id: I4729d537aeb5ef934fcae90b610e28966a6ada9a
2018-05-18 10:32:17 +09:00
Edwin Kempin
ba6fd0f3b1 Remove ValidationError#createLoggerSink to avoid passing around loggers
Passing loggers between classes is bad and we should avoid this if
possible.

ValidationError#createLoggerSink required to pass in a logger just to
return it back to the caller wrapped in a lambda. Remove this method and
instead create the lambda directly in the caller. This brings us minimal
code duplication for formatting the message, but it's better than
passing the logger around.

Change-Id: I6b475de50fb2a1745c16ac424e0a95d358aaaf7d
Signed-off-by: Edwin Kempin <ekempin@google.com>
2018-05-17 19:25:34 +09:00
David Pursehouse
b5e620a6a9 Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  HttpPluginServlet: Don't trim leading whitespace from about.md content
  ProjectConfig: Don't use JGit's StringUtils to convert to lower case
  Do not abort indexing if < 50% projects failed
  Revert "AllChangesIndexer: Don't abort when failing to open repository"
  VersionedAccountDestinations: Remove unused createSink(String) method
  ProjectBasicAuthFilter: Add comment why cause is not logged
  BazelBuild: Fix exception message when command was interrupted
  GitwebServlet: Write only one log entry for CGI errors
  GitwebServlet: Log unexpected errors on error level
  PostGpgKeys: Remove unneeded use of Joiner
  Remove some logs for errors that are rethrown
  DropWizardMetricMaker: Improve error messages for invalid arguments
  DropWizardMetricMaker: Improve error message when metric name is invalid
  AllChangesIndexer: Don't abort when failing to open repository

Change-Id: I6febb890b7717731fcb5f0653360982668469069
2018-05-17 15:39:34 +09:00
Edwin Kempin
7d16b055e9 Remove some logs for errors that are rethrown
"log and throw" is considered a poor practice. The logging is uneeded
since the thrown exception will be logged somewhere else.

Change-Id: I82c210fe1e053a4ffd7a58b7fc7de6056f9875a7
Signed-off-by: Edwin Kempin <ekempin@google.com>
2018-05-17 10:44:08 +09:00
David Pursehouse
6ae012e010 Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  Update Eclipse compiler settings with Oxygen.3a Release (4.7.3a)
  Introduce mechanism to overload Gerrit core modules
  Move default memory cache implementation out of H2 package
  Introduce CacheImpl annotation
  Untangle persistent/memory cache implementations from each other
  H2CacheFactory: update internal caches list synchronously

Change-Id: I6c0952771b4e630a6628355f8cb2972ab7d12419
2018-05-16 08:15:29 +09:00
Jacek Centkowski
b6e94a00a0 Introduce mechanism to overload Gerrit core modules
CacheImpl [1] introduced the possibility to overload core Gerrit
module with one that is provided by library. This change
generalizes it so that any Gerrit core module can be overloaded.

How to overload Gerrit core module:
* identify module that needs to be overloaded and mark it with
@ModuleImpl(name="moduleX") annotation; note that circular dependencies
from different module qualifies particular instance as non-candidate
* build lib module that provides alternative implementation
to the module in question and mark it with the same
annotation
* place implementation jar under GERRIT_SITE/lib dir and add
gerrit.installModule entry with your.package.Module path to
gerrit.config.

[1] https://gerrit-review.googlesource.com/c/gerrit/+/173162

Change-Id: Ic6dac8d1cc558abdcfd7a1cc257dbd7f8924ff9b
Signed-off-by: Jacek Centkowski <jcentkowski@collab.net>
2018-05-14 13:09:55 +09:00
Dave Borowitz
a3cc510fc1 Move default memory cache implementation out of H2 package
The memory cache doesn't depend on H2 at all, and this separation of
packages makes it harder to reintroduce the kind of source-level
dependency that was removed in I570fd54adf.

Change-Id: Ie23e39cd7ea9a0813a914e65614b889c248342ae
2018-05-14 13:09:55 +09:00
Jacek Centkowski
5517ec316f Introduce CacheImpl annotation
There is existing mechanism to provide different implementation for
instance to secure-store but one can replace only certain binding
with it (through provider class). In this case when H2CacheImpl is
installed it adds more bindings and replacing only this class would
keep leftovers being still initiated/running in Gerrit core.

CacheImpl annotation contains 2 types:
MEMORY
PERSISTENT
It is applied to modules that provide corresponding default caches
implementations.

When CacheImpl annotation is added to lib module then it will
override particular default implementation.

Change-Id: I7562b210fad4c5f6dc67887f627cf76815a378cb
Signed-off-by: Jacek Centkowski <jcentkowski@collab.net>
2018-05-14 13:09:55 +09:00
Jacek Centkowski
e602b8dacc Untangle persistent/memory cache implementations from each other
There is mutual dependency between these 2 implementations
(including Guice module that is responsible for installing them)
and it prevents from providing alternative implementations.

Change-Id: I570fd54adf58c466925f4a31a3bf3cd5ace8742c
Signed-off-by: Jacek Centkowski <jcentkowski@collab.net>
2018-05-14 13:09:55 +09:00
Gustaf Lundh
e45c333b70 GetUserFilter: Allow to include username in servlet response header
Add a new setting, http.addUserAsResponseHeader, which when enabled
causes the servlet response to include a 'User' header that contains
the name of the logged in user.

This will enable reverse proxies to log the name of the user that
issued the http request.

The new setting is disabled by default.

Change-Id: I5c3c783813f3aa71209320610bb8168a51305cba
2018-05-08 12:51:44 +09:00
David Pursehouse
e03ae6b6cb Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  CommandExecutorQueueProvider: Fix singleton binding

Change-Id: I8b6cca5fe71f0c942af4bc8e87475091164b96f4
2018-04-27 18:03:03 +09:00
Eryk Szymanski
ec304a1098 CommandExecutorQueueProvider: Fix singleton binding
Binding the class with in(SINGLETON) creates a singleton per injector,
and because it is done in two injectors (the SSH injector and the HTTP
injector), we end up with two instances and thus two work queues for
both SSH-Interactive-Worker and SSH-Batch-Worker.

Remove the in(SINGLETON) and instead explicitly make the class singleton
by annotating with @Singleton

Change-Id: Ifa782b7ea7f97d88d0afdfa9efc87ad7baa15b93
Signed-off-by: Eryk Szymanski <eryksz@gmail.com>
Signed-off-by: David Pursehouse <dpursehouse@collab.net>
2018-04-27 17:02:30 +09:00
David Pursehouse
c421174abf Upgrade to google-java-format 1.5
Change-Id: Ibad33f7aff0226fa954d44365e2b3ea2e3c6ff8e
2018-04-18 09:33:50 +02:00
David Pursehouse
4ec5ef6bd2 Upgrade to google-java-format 1.5
Change-Id: I8e0270efad021e69b1a127cf3175626d26381bdb
2018-04-18 09:06:49 +02:00
David Pursehouse
ff728f249f Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  SshCommandsIT: Include `logging ls` and `logging set` commands
  Add tests to make sure ssh commands can be executed
  Align ElasticIndexModule with LuceneIndexModule
  Revert "Remove unneeded nested MultiVersionModule class"
  Remove unneeded nested MultiVersionModule class
  Only bind index {start/activate} if needed
  InitIndex: Allow to configure index.maxLimit for Elasticsearch

Change-Id: Icf925e3724ca6974831676e505692807a771e70b
2018-04-11 13:44:22 +09:00
Hugo Arès
37d47e9c6e Only bind index {start/activate} if needed
These commands are only interacting with the AbstractVersionManager, if
it is not available then they have no reason to be available.

Because those commands were always binded, binding an implementation of
AbstractVersionManager was mandatory otherwise Guice would have
complained. For that reason, the implementation of
AbstractVersionManager was done even in the case when index is a single
version and an implementation of AbstractVersionManager is not required.
Only bind implementations of AbstractVersionManager when needed and bind
the commands only if AbstractVersionManager implementation is binded.

Change-Id: I3db48f6b5d030ecc6efa840c59eb4e177ae1b6b1
2018-04-10 20:50:49 -04:00
David Pursehouse
52c2b4afe0 InitIndex: Allow to configure index.maxLimit for Elasticsearch
When using the Elasticsearch secondary index, `index.maxLimit` should
not exceed the value of `index.max_result_window` configured on the
Elasticsearch server.

By default `index.maxLimit` is not set, which effectively means that the
value used is Integer.MAX_VALUE. When Elasticsearch is used out of the
box the default `index.max_result_window` is 10000, and this results in
query failures:

  "Result window is too large, from + size must be less than or equal
   to: [10000] but was [2147483647]."

When the index type is Elasticsearch, prompt for the max limit during
initialization, defaulting to Elasticsearch's default value of 10000.

Bug: Issue 8527
Change-Id: I983a83b5cdd0eaf5ba875c3310dfd484e53fe064
2018-04-10 23:44:49 +09:00
David Pursehouse
387c219a65 Merge branch 'stable-2.14' into stable-2.15
* stable-2.14:
  Fix index ssh commands with elasticsearch type

Change-Id: I52384174fbfc63d4b54df7ff9676c0fc2f0bbbe2
2018-04-05 20:42:57 +01:00