Co-authored-by: Siddhu545 <Siddharthkhengare@gmail.com>
Co-authored-by: Josh Mock <joshua.mock@elastic.co>
Co-authored-by: Siddharth Khengare <67581382+Siddhu545@users.noreply.github.com>
This commit is contained in:
Josh Mock
2025-04-15 13:26:17 -05:00
committed by GitHub
parent 2241ae667e
commit 770fac4b9d
2 changed files with 39 additions and 1 deletions

View File

@ -201,10 +201,32 @@ export default class Client extends API {
// @ts-expect-error kChild symbol is for internal use only
if ((opts.cloud != null) && opts[kChild] === undefined) {
const { id } = opts.cloud
if (typeof id !== 'string') {
throw new errors.ConfigurationError('Cloud ID must be a string.')
}
const parts = id.split(':')
if (parts.length !== 2 || parts[1] === '') {
throw new errors.ConfigurationError(
'Cloud ID must be in the format "name:base64string".'
)
}
// the cloud id is `cluster-name:base64encodedurl`
// the url is a string divided by two '$', the first is the cloud url
// the second the elasticsearch instance, the third the kibana instance
const cloudUrls = Buffer.from(id.split(':')[1], 'base64').toString().split('$')
let cloudUrls
try {
cloudUrls = Buffer.from(parts[1], 'base64').toString().split('$')
} catch (err) {
throw new errors.ConfigurationError('Cloud ID base64 decoding failed.')
}
if (cloudUrls.length < 2 || cloudUrls[0] === '' || cloudUrls[1] === '') {
throw new errors.ConfigurationError(
'Cloud ID base64 must contain at least two "$" separated parts: "<cloudUrl>$<esId>[$<kibanaId>]".'
)
}
opts.node = `https://${cloudUrls[1]}.${cloudUrls[0]}`

View File

@ -300,9 +300,25 @@ test('Elastic Cloud config', t => {
t.equal(connection?.url.hostname, 'abcd.localhost')
t.equal(connection?.url.protocol, 'https:')
t.test('Invalid Cloud ID will throw ConfigurationError', t => {
t.throws(() => new Client({
cloud : {
id : 'invalidCloudIdThatIsNotBase64'
},
auth : {
username: 'elastic',
password: 'changeme'
}
}), errors.ConfigurationError)
t.end()
})
t.end()
})
test('Override default Elastic Cloud options', t => {
const client = new Client({
cloud: {