mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 17:59:23 -04:00
Move kibana-keystore from data/ to config/ (#57856)
* Move kibana-keystore from data/ to config/ This is a breaking change to move the location of kibana-keystore. Keystores in other stack products live in the config directory, so this updates our current path to be consistent. Closes #25746 * add breaking changes * update comment * wip * fix docs * read from both keystore locations, write priority to non-deprecated * note data directory fallback * add tests for get_keystore Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
This commit is contained in:
parent
ac93ac67a2
commit
c9b6f8ae24
5 changed files with 119 additions and 8 deletions
|
@ -18,20 +18,16 @@
|
|||
*/
|
||||
|
||||
import _ from 'lodash';
|
||||
import { join } from 'path';
|
||||
|
||||
import { pkg } from '../core/server/utils';
|
||||
import Command from '../cli/command';
|
||||
import { getDataPath } from '../core/server/path';
|
||||
import { Keystore } from '../legacy/server/keystore';
|
||||
|
||||
const path = join(getDataPath(), 'kibana.keystore');
|
||||
const keystore = new Keystore(path);
|
||||
|
||||
import { createCli } from './create';
|
||||
import { listCli } from './list';
|
||||
import { addCli } from './add';
|
||||
import { removeCli } from './remove';
|
||||
import { getKeystore } from './get_keystore';
|
||||
|
||||
const argv = process.env.kbnWorkerArgv
|
||||
? JSON.parse(process.env.kbnWorkerArgv)
|
||||
|
@ -42,6 +38,8 @@ program
|
|||
.version(pkg.version)
|
||||
.description('A tool for managing settings stored in the Kibana keystore');
|
||||
|
||||
const keystore = new Keystore(getKeystore());
|
||||
|
||||
createCli(program, keystore);
|
||||
listCli(program, keystore);
|
||||
addCli(program, keystore);
|
||||
|
|
40
src/cli_keystore/get_keystore.js
Normal file
40
src/cli_keystore/get_keystore.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch B.V. under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch B.V. licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import { existsSync } from 'fs';
|
||||
import { join } from 'path';
|
||||
|
||||
import Logger from '../cli_plugin/lib/logger';
|
||||
import { getConfigDirectory, getDataPath } from '../core/server/path';
|
||||
|
||||
export function getKeystore() {
|
||||
const configKeystore = join(getConfigDirectory(), 'kibana.keystore');
|
||||
const dataKeystore = join(getDataPath(), 'kibana.keystore');
|
||||
let keystorePath = null;
|
||||
if (existsSync(dataKeystore)) {
|
||||
const logger = new Logger();
|
||||
logger.log(
|
||||
`kibana.keystore located in the data folder is deprecated. Future versions will use the config folder.`
|
||||
);
|
||||
keystorePath = dataKeystore;
|
||||
} else {
|
||||
keystorePath = configKeystore;
|
||||
}
|
||||
return keystorePath;
|
||||
}
|
57
src/cli_keystore/get_keystore.test.js
Normal file
57
src/cli_keystore/get_keystore.test.js
Normal file
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch B.V. under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch B.V. licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import { getKeystore } from './get_keystore';
|
||||
import Logger from '../cli_plugin/lib/logger';
|
||||
import fs from 'fs';
|
||||
import sinon from 'sinon';
|
||||
|
||||
describe('get_keystore', () => {
|
||||
const sandbox = sinon.createSandbox();
|
||||
|
||||
beforeEach(() => {
|
||||
sandbox.stub(Logger.prototype, 'log');
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
sandbox.restore();
|
||||
});
|
||||
|
||||
it('uses the config directory if there is no pre-existing keystore', () => {
|
||||
sandbox.stub(fs, 'existsSync').returns(false);
|
||||
expect(getKeystore()).toContain('config');
|
||||
expect(getKeystore()).not.toContain('data');
|
||||
});
|
||||
|
||||
it('uses the data directory if there is a pre-existing keystore in the data directory', () => {
|
||||
sandbox.stub(fs, 'existsSync').returns(true);
|
||||
expect(getKeystore()).toContain('data');
|
||||
expect(getKeystore()).not.toContain('config');
|
||||
});
|
||||
|
||||
it('logs a deprecation warning if the data directory is used', () => {
|
||||
sandbox.stub(fs, 'existsSync').returns(true);
|
||||
getKeystore();
|
||||
sandbox.assert.calledOnce(Logger.prototype.log);
|
||||
sandbox.assert.calledWith(
|
||||
Logger.prototype.log,
|
||||
'kibana.keystore located in the data folder is deprecated. Future versions will use the config folder.'
|
||||
);
|
||||
});
|
||||
});
|
|
@ -18,7 +18,7 @@
|
|||
*/
|
||||
|
||||
import { accessSync, constants } from 'fs';
|
||||
import { getConfigPath, getDataPath } from './';
|
||||
import { getConfigPath, getDataPath, getConfigDirectory } from './';
|
||||
|
||||
describe('Default path finder', () => {
|
||||
it('should find a kibana.yml', () => {
|
||||
|
@ -30,4 +30,9 @@ describe('Default path finder', () => {
|
|||
const dataPath = getDataPath();
|
||||
expect(() => accessSync(dataPath, constants.R_OK)).not.toThrow();
|
||||
});
|
||||
|
||||
it('should find a config directory', () => {
|
||||
const configDirectory = getConfigDirectory();
|
||||
expect(() => accessSync(configDirectory, constants.R_OK)).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
|
|
@ -30,6 +30,10 @@ const CONFIG_PATHS = [
|
|||
fromRoot('config/kibana.yml'),
|
||||
].filter(isString);
|
||||
|
||||
const CONFIG_DIRECTORIES = [process.env.KIBANA_PATH_CONF, fromRoot('config'), '/etc/kibana'].filter(
|
||||
isString
|
||||
);
|
||||
|
||||
const DATA_PATHS = [
|
||||
process.env.DATA_PATH, // deprecated
|
||||
fromRoot('data'),
|
||||
|
@ -49,12 +53,19 @@ function findFile(paths: string[]) {
|
|||
}
|
||||
|
||||
/**
|
||||
* Get the path where the config files are stored
|
||||
* Get the path of kibana.yml
|
||||
* @internal
|
||||
*/
|
||||
export const getConfigPath = () => findFile(CONFIG_PATHS);
|
||||
|
||||
/**
|
||||
* Get the path where the data can be stored
|
||||
* Get the directory containing configuration files
|
||||
* @internal
|
||||
*/
|
||||
export const getConfigDirectory = () => findFile(CONFIG_DIRECTORIES);
|
||||
|
||||
/**
|
||||
* Get the directory containing runtime data
|
||||
* @internal
|
||||
*/
|
||||
export const getDataPath = () => findFile(DATA_PATHS);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue