mirror of
https://github.com/elastic/kibana.git
synced 2025-04-25 02:09:32 -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 _ from 'lodash';
|
||||||
import { join } from 'path';
|
|
||||||
|
|
||||||
import { pkg } from '../core/server/utils';
|
import { pkg } from '../core/server/utils';
|
||||||
import Command from '../cli/command';
|
import Command from '../cli/command';
|
||||||
import { getDataPath } from '../core/server/path';
|
|
||||||
import { Keystore } from '../legacy/server/keystore';
|
import { Keystore } from '../legacy/server/keystore';
|
||||||
|
|
||||||
const path = join(getDataPath(), 'kibana.keystore');
|
|
||||||
const keystore = new Keystore(path);
|
|
||||||
|
|
||||||
import { createCli } from './create';
|
import { createCli } from './create';
|
||||||
import { listCli } from './list';
|
import { listCli } from './list';
|
||||||
import { addCli } from './add';
|
import { addCli } from './add';
|
||||||
import { removeCli } from './remove';
|
import { removeCli } from './remove';
|
||||||
|
import { getKeystore } from './get_keystore';
|
||||||
|
|
||||||
const argv = process.env.kbnWorkerArgv
|
const argv = process.env.kbnWorkerArgv
|
||||||
? JSON.parse(process.env.kbnWorkerArgv)
|
? JSON.parse(process.env.kbnWorkerArgv)
|
||||||
|
@ -42,6 +38,8 @@ program
|
||||||
.version(pkg.version)
|
.version(pkg.version)
|
||||||
.description('A tool for managing settings stored in the Kibana keystore');
|
.description('A tool for managing settings stored in the Kibana keystore');
|
||||||
|
|
||||||
|
const keystore = new Keystore(getKeystore());
|
||||||
|
|
||||||
createCli(program, keystore);
|
createCli(program, keystore);
|
||||||
listCli(program, keystore);
|
listCli(program, keystore);
|
||||||
addCli(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 { accessSync, constants } from 'fs';
|
||||||
import { getConfigPath, getDataPath } from './';
|
import { getConfigPath, getDataPath, getConfigDirectory } from './';
|
||||||
|
|
||||||
describe('Default path finder', () => {
|
describe('Default path finder', () => {
|
||||||
it('should find a kibana.yml', () => {
|
it('should find a kibana.yml', () => {
|
||||||
|
@ -30,4 +30,9 @@ describe('Default path finder', () => {
|
||||||
const dataPath = getDataPath();
|
const dataPath = getDataPath();
|
||||||
expect(() => accessSync(dataPath, constants.R_OK)).not.toThrow();
|
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'),
|
fromRoot('config/kibana.yml'),
|
||||||
].filter(isString);
|
].filter(isString);
|
||||||
|
|
||||||
|
const CONFIG_DIRECTORIES = [process.env.KIBANA_PATH_CONF, fromRoot('config'), '/etc/kibana'].filter(
|
||||||
|
isString
|
||||||
|
);
|
||||||
|
|
||||||
const DATA_PATHS = [
|
const DATA_PATHS = [
|
||||||
process.env.DATA_PATH, // deprecated
|
process.env.DATA_PATH, // deprecated
|
||||||
fromRoot('data'),
|
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
|
* @internal
|
||||||
*/
|
*/
|
||||||
export const getConfigPath = () => findFile(CONFIG_PATHS);
|
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
|
* @internal
|
||||||
*/
|
*/
|
||||||
export const getDataPath = () => findFile(DATA_PATHS);
|
export const getDataPath = () => findFile(DATA_PATHS);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue