internal/clients/config/kibana_oapi.go (96 lines of code) (raw):
package config
import (
"context"
"os"
"strconv"
"strings"
"github.com/elastic/terraform-provider-elasticstack/internal/clients/kibana_oapi"
fwdiags "github.com/hashicorp/terraform-plugin-framework/diag"
sdkdiags "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
type kibanaOapiConfig kibana_oapi.Config
func newKibanaOapiConfigFromSDK(d *schema.ResourceData, base baseConfig) (kibanaOapiConfig, sdkdiags.Diagnostics) {
var diags sdkdiags.Diagnostics
// Use ES details by default
config := base.toKibanaOapiConfig()
kibConn, ok := d.GetOk("kibana")
if !ok {
return config, diags
}
// if defined, then we only have a single entry
if kib := kibConn.([]interface{})[0]; kib != nil {
kibConfig := kib.(map[string]interface{})
if username, ok := kibConfig["username"]; ok && username != "" {
config.Username = username.(string)
}
if password, ok := kibConfig["password"]; ok && password != "" {
config.Password = password.(string)
}
if apiKey, ok := kibConfig["api_key"]; ok && apiKey != "" {
config.APIKey = apiKey.(string)
}
if endpoints, ok := kibConfig["endpoints"]; ok && len(endpoints.([]interface{})) > 0 {
// We're curently limited by the API to a single endpoint
if endpoint := endpoints.([]interface{})[0]; endpoint != nil {
config.URL = endpoint.(string)
}
}
if caCerts, ok := kibConfig["ca_certs"].([]interface{}); ok && len(caCerts) > 0 {
for _, elem := range caCerts {
if vStr, elemOk := elem.(string); elemOk {
config.CACerts = append(config.CACerts, vStr)
}
}
}
if insecure, ok := kibConfig["insecure"]; ok && insecure.(bool) {
config.Insecure = true
}
}
return config.withEnvironmentOverrides(), nil
}
func newKibanaOapiConfigFromFramework(ctx context.Context, cfg ProviderConfiguration, base baseConfig) (kibanaOapiConfig, fwdiags.Diagnostics) {
config := base.toKibanaOapiConfig()
if len(cfg.Kibana) > 0 {
kibConfig := cfg.Kibana[0]
if kibConfig.Username.ValueString() != "" {
config.Username = kibConfig.Username.ValueString()
}
if kibConfig.Password.ValueString() != "" {
config.Password = kibConfig.Password.ValueString()
}
if kibConfig.ApiKey.ValueString() != "" {
config.APIKey = kibConfig.ApiKey.ValueString()
}
var endpoints []string
diags := kibConfig.Endpoints.ElementsAs(ctx, &endpoints, true)
var cas []string
diags.Append(kibConfig.CACerts.ElementsAs(ctx, &cas, true)...)
if diags.HasError() {
return kibanaOapiConfig{}, diags
}
if len(endpoints) > 0 {
config.URL = endpoints[0]
}
if len(cas) > 0 {
config.CACerts = cas
}
config.Insecure = kibConfig.Insecure.ValueBool()
}
return config.withEnvironmentOverrides(), nil
}
func (k kibanaOapiConfig) withEnvironmentOverrides() kibanaOapiConfig {
k.Username = withEnvironmentOverride(k.Username, "KIBANA_USERNAME")
k.Password = withEnvironmentOverride(k.Password, "KIBANA_PASSWORD")
k.APIKey = withEnvironmentOverride(k.APIKey, "KIBANA_API_KEY")
k.URL = withEnvironmentOverride(k.URL, "KIBANA_ENDPOINT")
if caCerts, ok := os.LookupEnv("KIBANA_CA_CERTS"); ok {
k.CACerts = strings.Split(caCerts, ",")
}
if insecure, ok := os.LookupEnv("KIBANA_INSECURE"); ok {
if insecureValue, err := strconv.ParseBool(insecure); err == nil {
k.Insecure = insecureValue
}
}
return k
}
func (k kibanaOapiConfig) toFleetConfig() fleetConfig {
return fleetConfig(k)
}