internal/kibana/synthetics/resource.go (70 lines of code) (raw):
package synthetics
import (
"context"
"github.com/disaster37/go-kibana-rest/v8"
"github.com/elastic/terraform-provider-elasticstack/internal/clients"
"github.com/hashicorp/terraform-plugin-framework-validators/resourcevalidator"
"github.com/hashicorp/terraform-plugin-framework/diag"
"github.com/hashicorp/terraform-plugin-framework/path"
"github.com/hashicorp/terraform-plugin-framework/resource"
)
const resourceName = MetadataPrefix + "monitor"
// Ensure provider defined types fully satisfy framework interfaces
var _ resource.Resource = &Resource{}
var _ resource.ResourceWithConfigure = &Resource{}
var _ resource.ResourceWithImportState = &Resource{}
var _ resource.ResourceWithConfigValidators = &Resource{}
var _ ESApiClient = &Resource{}
type ESApiClient interface {
GetClient() *clients.ApiClient
}
func GetKibanaClient(c ESApiClient, dg diag.Diagnostics) *kibana.Client {
client := c.GetClient()
if client == nil {
dg.AddError(
"Unconfigured Client",
"Expected configured client. Please report this issue to the provider developers.",
)
return nil
}
kibanaClient, err := client.GetKibanaClient()
if err != nil {
dg.AddError("unable to get kibana client", err.Error())
return nil
}
return kibanaClient
}
type Resource struct {
client *clients.ApiClient
ESApiClient
}
func (r *Resource) GetClient() *clients.ApiClient {
return r.client
}
func (r *Resource) ConfigValidators(ctx context.Context) []resource.ConfigValidator {
return []resource.ConfigValidator{
resourcevalidator.ExactlyOneOf(
path.MatchRoot("http"),
path.MatchRoot("tcp"),
path.MatchRoot("icmp"),
path.MatchRoot("browser"),
),
resourcevalidator.AtLeastOneOf(
path.MatchRoot("locations"),
path.MatchRoot("private_locations"),
),
}
}
func (r *Resource) ImportState(ctx context.Context, request resource.ImportStateRequest, response *resource.ImportStateResponse) {
resource.ImportStatePassthroughID(ctx, path.Root("id"), request, response)
}
func (r *Resource) Configure(ctx context.Context, request resource.ConfigureRequest, response *resource.ConfigureResponse) {
client, diags := clients.ConvertProviderData(request.ProviderData)
response.Diagnostics.Append(diags...)
r.client = client
}
func (r *Resource) Metadata(ctx context.Context, request resource.MetadataRequest, response *resource.MetadataResponse) {
response.TypeName = request.ProviderTypeName + resourceName
}
func (r *Resource) Schema(ctx context.Context, request resource.SchemaRequest, response *resource.SchemaResponse) {
response.Schema = monitorConfigSchema()
}