246 lines
10 KiB
Go
246 lines
10 KiB
Go
// 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.
|
|
|
|
package cloudid
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/elastic/beats/libbeat/common"
|
|
)
|
|
|
|
func TestDecode(t *testing.T) {
|
|
tests := []struct {
|
|
cloudID string
|
|
expectedEsURL string
|
|
expectedKibanaURL string
|
|
}{
|
|
{
|
|
cloudID: "staging:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyRjZWM2ZjI2MWE3NGJmMjRjZTMzYmI4ODExYjg0Mjk0ZiRjNmMyY2E2ZDA0MjI0OWFmMGNjN2Q3YTllOTYyNTc0Mw==",
|
|
expectedEsURL: "https://cec6f261a74bf24ce33bb8811b84294f.us-east-1.aws.found.io:443",
|
|
expectedKibanaURL: "https://c6c2ca6d042249af0cc7d7a9e9625743.us-east-1.aws.found.io:443",
|
|
},
|
|
{
|
|
cloudID: "dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyRjZWM2ZjI2MWE3NGJmMjRjZTMzYmI4ODExYjg0Mjk0ZiRjNmMyY2E2ZDA0MjI0OWFmMGNjN2Q3YTllOTYyNTc0Mw==",
|
|
expectedEsURL: "https://cec6f261a74bf24ce33bb8811b84294f.us-east-1.aws.found.io:443",
|
|
expectedKibanaURL: "https://c6c2ca6d042249af0cc7d7a9e9625743.us-east-1.aws.found.io:443",
|
|
},
|
|
{
|
|
cloudID: ":dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyRjZWM2ZjI2MWE3NGJmMjRjZTMzYmI4ODExYjg0Mjk0ZiRjNmMyY2E2ZDA0MjI0OWFmMGNjN2Q3YTllOTYyNTc0Mw==",
|
|
expectedEsURL: "https://cec6f261a74bf24ce33bb8811b84294f.us-east-1.aws.found.io:443",
|
|
expectedKibanaURL: "https://c6c2ca6d042249af0cc7d7a9e9625743.us-east-1.aws.found.io:443",
|
|
},
|
|
{
|
|
cloudID: "gcp-cluster:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvJDhhMDI4M2FmMDQxZjE5NWY3NzI5YmMwNGM2NmEwZmNlJDBjZDVjZDU2OGVlYmU1M2M4OWViN2NhZTViYWM4YjM3",
|
|
expectedEsURL: "https://8a0283af041f195f7729bc04c66a0fce.us-central1.gcp.cloud.es.io:443",
|
|
expectedKibanaURL: "https://0cd5cd568eebe53c89eb7cae5bac8b37.us-central1.gcp.cloud.es.io:443",
|
|
},
|
|
{
|
|
cloudID: "custom-port:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvOjkyNDMkYWMzMWViYjkwMjQxNzczMTU3MDQzYzM0ZmQyNmZkNDYkYTRjMDYyMzBlNDhjOGZjZTdiZTg4YTA3NGEzYmIzZTA=",
|
|
expectedEsURL: "https://ac31ebb90241773157043c34fd26fd46.us-central1.gcp.cloud.es.io:9243",
|
|
expectedKibanaURL: "https://a4c06230e48c8fce7be88a074a3bb3e0.us-central1.gcp.cloud.es.io:9243",
|
|
},
|
|
{
|
|
cloudID: "different-es-kb-port:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvJGFjMzFlYmI5MDI0MTc3MzE1NzA0M2MzNGZkMjZmZDQ2OjkyNDMkYTRjMDYyMzBlNDhjOGZjZTdiZTg4YTA3NGEzYmIzZTA6OTI0NA==",
|
|
expectedEsURL: "https://ac31ebb90241773157043c34fd26fd46.us-central1.gcp.cloud.es.io:9243",
|
|
expectedKibanaURL: "https://a4c06230e48c8fce7be88a074a3bb3e0.us-central1.gcp.cloud.es.io:9244",
|
|
},
|
|
{
|
|
cloudID: "only-kb-set:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvJGFjMzFlYmI5MDI0MTc3MzE1NzA0M2MzNGZkMjZmZDQ2JGE0YzA2MjMwZTQ4YzhmY2U3YmU4OGEwNzRhM2JiM2UwOjkyNDQ=",
|
|
expectedEsURL: "https://ac31ebb90241773157043c34fd26fd46.us-central1.gcp.cloud.es.io:443",
|
|
expectedKibanaURL: "https://a4c06230e48c8fce7be88a074a3bb3e0.us-central1.gcp.cloud.es.io:9244",
|
|
},
|
|
{
|
|
cloudID: "host-and-kb-set:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvOjkyNDMkYWMzMWViYjkwMjQxNzczMTU3MDQzYzM0ZmQyNmZkNDYkYTRjMDYyMzBlNDhjOGZjZTdiZTg4YTA3NGEzYmIzZTA6OTI0NA==",
|
|
expectedEsURL: "https://ac31ebb90241773157043c34fd26fd46.us-central1.gcp.cloud.es.io:9243",
|
|
expectedKibanaURL: "https://a4c06230e48c8fce7be88a074a3bb3e0.us-central1.gcp.cloud.es.io:9244",
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
esURL, kbURL, err := decodeCloudID(test.cloudID)
|
|
assert.NoError(t, err, test.cloudID)
|
|
|
|
assert.Equal(t, esURL, test.expectedEsURL, test.cloudID)
|
|
assert.Equal(t, kbURL, test.expectedKibanaURL, test.cloudID)
|
|
}
|
|
}
|
|
|
|
func TestDecodeError(t *testing.T) {
|
|
tests := []struct {
|
|
cloudID string
|
|
errorMsg string
|
|
}{
|
|
{
|
|
cloudID: "staging:garbagedXMtZWFzdC0xLmF3cy5mb3VuZC5pbyRjZWM2ZjI2MWE3NGJmMjRjZTMzYmI4ODExYjg0Mjk0ZiRjNmMyY2E2ZDA0MjI0OWFmMGNjN2Q3YTllOTYyNTc0Mw==",
|
|
errorMsg: "base64 decoding failed",
|
|
},
|
|
{
|
|
cloudID: "dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvJDhhMDI4M2FmMDQxZjE5NWY3NzI5YmMwNGM2NmEwZg==",
|
|
errorMsg: "Expected at least 3 parts",
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
_, _, err := decodeCloudID(test.cloudID)
|
|
assert.Error(t, err, test.cloudID)
|
|
assert.Contains(t, err.Error(), test.errorMsg, test.cloudID)
|
|
}
|
|
}
|
|
|
|
func TestOverwriteSettings(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
inCfg map[string]interface{}
|
|
outCfg map[string]interface{}
|
|
}{
|
|
{
|
|
name: "No cloud-id specified, nothing should change",
|
|
inCfg: map[string]interface{}{
|
|
"output.elasticsearch.hosts": "localhost:9200",
|
|
},
|
|
outCfg: map[string]interface{}{
|
|
"output.elasticsearch.hosts": "localhost:9200",
|
|
},
|
|
},
|
|
{
|
|
name: "cloudid realistic example",
|
|
inCfg: map[string]interface{}{
|
|
"output.elasticsearch.hosts": "localhost:9200",
|
|
"cloud.id": "cloudidtest:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyQyNDlmM2FmMWY0ZWVlMjRhODRlM2I0MDFlNjhhMWIyYSRkNGFjNzU1OWQ0Njc0YjdjOTFhYmUxMDg1NmQ4NDMwNA==",
|
|
"cloud.auth": "elastic:changeme",
|
|
},
|
|
outCfg: map[string]interface{}{
|
|
"output.elasticsearch.hosts": []interface{}{"https://249f3af1f4eee24a84e3b401e68a1b2a.us-east-1.aws.found.io:443"},
|
|
"output.elasticsearch.username": "elastic",
|
|
"output.elasticsearch.password": "changeme",
|
|
"setup.kibana.host": "https://d4ac7559d4674b7c91abe10856d84304.us-east-1.aws.found.io:443",
|
|
"cloud.id": "cloudidtest:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyQyNDlmM2FmMWY0ZWVlMjRhODRlM2I0MDFlNjhhMWIyYSRkNGFjNzU1OWQ0Njc0YjdjOTFhYmUxMDg1NmQ4NDMwNA==",
|
|
"cloud.auth": "elastic:changeme",
|
|
},
|
|
},
|
|
{
|
|
name: "only cloudid specified",
|
|
inCfg: map[string]interface{}{
|
|
"output.elasticsearch.hosts": "localhost:9200",
|
|
"cloud.id": "cloudidtest:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyQyNDlmM2FmMWY0ZWVlMjRhODRlM2I0MDFlNjhhMWIyYSRkNGFjNzU1OWQ0Njc0YjdjOTFhYmUxMDg1NmQ4NDMwNA==",
|
|
},
|
|
outCfg: map[string]interface{}{
|
|
"output.elasticsearch.hosts": []interface{}{"https://249f3af1f4eee24a84e3b401e68a1b2a.us-east-1.aws.found.io:443"},
|
|
"setup.kibana.host": "https://d4ac7559d4674b7c91abe10856d84304.us-east-1.aws.found.io:443",
|
|
"cloud.id": "cloudidtest:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyQyNDlmM2FmMWY0ZWVlMjRhODRlM2I0MDFlNjhhMWIyYSRkNGFjNzU1OWQ0Njc0YjdjOTFhYmUxMDg1NmQ4NDMwNA==",
|
|
},
|
|
},
|
|
{
|
|
name: "no output defined",
|
|
inCfg: map[string]interface{}{
|
|
"cloud.id": "cloudidtest:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyQyNDlmM2FmMWY0ZWVlMjRhODRlM2I0MDFlNjhhMWIyYSRkNGFjNzU1OWQ0Njc0YjdjOTFhYmUxMDg1NmQ4NDMwNA==",
|
|
},
|
|
outCfg: map[string]interface{}{
|
|
"output.elasticsearch.hosts": []interface{}{"https://249f3af1f4eee24a84e3b401e68a1b2a.us-east-1.aws.found.io:443"},
|
|
"setup.kibana.host": "https://d4ac7559d4674b7c91abe10856d84304.us-east-1.aws.found.io:443",
|
|
"cloud.id": "cloudidtest:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyQyNDlmM2FmMWY0ZWVlMjRhODRlM2I0MDFlNjhhMWIyYSRkNGFjNzU1OWQ0Njc0YjdjOTFhYmUxMDg1NmQ4NDMwNA==",
|
|
},
|
|
},
|
|
{
|
|
name: "multiple hosts to overwrite",
|
|
inCfg: map[string]interface{}{
|
|
"output.elasticsearch.hosts": []string{"localhost:9200", "test", "test1"},
|
|
"cloud.id": "cloudidtest:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyQyNDlmM2FmMWY0ZWVlMjRhODRlM2I0MDFlNjhhMWIyYSRkNGFjNzU1OWQ0Njc0YjdjOTFhYmUxMDg1NmQ4NDMwNA==",
|
|
},
|
|
outCfg: map[string]interface{}{
|
|
"output.elasticsearch.hosts": []interface{}{"https://249f3af1f4eee24a84e3b401e68a1b2a.us-east-1.aws.found.io:443"},
|
|
"setup.kibana.host": "https://d4ac7559d4674b7c91abe10856d84304.us-east-1.aws.found.io:443",
|
|
"cloud.id": "cloudidtest:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyQyNDlmM2FmMWY0ZWVlMjRhODRlM2I0MDFlNjhhMWIyYSRkNGFjNzU1OWQ0Njc0YjdjOTFhYmUxMDg1NmQ4NDMwNA==",
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Logf("Executing test: %s", test.name)
|
|
|
|
cfg, err := common.NewConfigFrom(test.inCfg)
|
|
assert.NoError(t, err)
|
|
|
|
err = OverwriteSettings(cfg)
|
|
assert.NoError(t, err)
|
|
|
|
var res map[string]interface{}
|
|
err = cfg.Unpack(&res)
|
|
assert.NoError(t, err)
|
|
|
|
var expected map[string]interface{}
|
|
expectedCfg, err := common.NewConfigFrom(test.outCfg)
|
|
assert.NoError(t, err)
|
|
err = expectedCfg.Unpack(&expected)
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, res, expected)
|
|
}
|
|
}
|
|
|
|
func TestOverwriteErrors(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
inCfg map[string]interface{}
|
|
errMsg string
|
|
}{
|
|
{
|
|
name: "cloud.auth specified but cloud.id not",
|
|
inCfg: map[string]interface{}{
|
|
"cloud.auth": "elastic:changeme",
|
|
},
|
|
errMsg: "cloud.auth specified but cloud.id is empty",
|
|
},
|
|
{
|
|
name: "invalid cloud.id",
|
|
inCfg: map[string]interface{}{
|
|
"cloud.id": "blah",
|
|
},
|
|
errMsg: "Error decoding cloud.id",
|
|
},
|
|
{
|
|
name: "invalid cloud.auth",
|
|
inCfg: map[string]interface{}{
|
|
"cloud.id": "cloudidtest:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyQyNDlmM2FmMWY0ZWVlMjRhODRlM2I0MDFlNjhhMWIyYSRkNGFjNzU1OWQ0Njc0YjdjOTFhYmUxMDg1NmQ4NDMwNA==",
|
|
"cloud.auth": "blah",
|
|
},
|
|
errMsg: "cloud.auth setting doesn't contain `:`",
|
|
},
|
|
{
|
|
name: "logstash output enabled",
|
|
inCfg: map[string]interface{}{
|
|
"cloud.id": "cloudidtest:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyQyNDlmM2FmMWY0ZWVlMjRhODRlM2I0MDFlNjhhMWIyYSRkNGFjNzU1OWQ0Njc0YjdjOTFhYmUxMDg1NmQ4NDMwNA==",
|
|
"output.logstash.hosts": "localhost:544",
|
|
},
|
|
errMsg: "The cloud.id setting enables the Elasticsearch output, but you already have the logstash output enabled",
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Logf("Executing test: %s", test.name)
|
|
|
|
cfg, err := common.NewConfigFrom(test.inCfg)
|
|
assert.NoError(t, err)
|
|
|
|
err = OverwriteSettings(cfg)
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), test.errMsg)
|
|
}
|
|
}
|