internal/kibana/space.go (182 lines of code) (raw):

package kibana import ( "context" "regexp" "github.com/disaster37/go-kibana-rest/v8/kbapi" "github.com/elastic/terraform-provider-elasticstack/internal/clients" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) func ResourceSpace() *schema.Resource { apikeySchema := map[string]*schema.Schema{ "id": { Description: "Internal identifier of the resource.", Type: schema.TypeString, Computed: true, }, "space_id": { Description: "The space ID that is part of the Kibana URL when inside the space.", Type: schema.TypeString, Required: true, ForceNew: true, }, "name": { Description: "The display name for the space.", Type: schema.TypeString, Required: true, }, "description": { Description: "The description for the space.", Type: schema.TypeString, Optional: true, }, "disabled_features": { Description: "The list of disabled features for the space. To get a list of available feature IDs, use the Features API (https://www.elastic.co/guide/en/kibana/master/features-api-get.html).", Type: schema.TypeSet, Optional: true, Elem: &schema.Schema{ Type: schema.TypeString, }, }, "initials": { Description: "The initials shown in the space avatar. By default, the initials are automatically generated from the space name. Initials must be 1 or 2 characters.", Type: schema.TypeString, Computed: true, // If not provided, a value is autogenerated Optional: true, ValidateFunc: validation.StringLenBetween(1, 2), }, "color": { Description: "The hexadecimal color code used in the space avatar. By default, the color is automatically generated from the space name.", Type: schema.TypeString, Computed: true, // If not provided, a value is autogenerated Optional: true, }, "image_url": { Description: "The data-URL encoded image to display in the space avatar.", Type: schema.TypeString, Optional: true, ValidateFunc: validation.StringMatch(regexp.MustCompile("^data:image/"), "must be a valid data-URL encoded image"), }, } return &schema.Resource{ Description: "Creates a Kibana space. See, https://www.elastic.co/guide/en/kibana/master/spaces-api-post.html", CreateContext: resourceSpaceUpsert, UpdateContext: resourceSpaceUpsert, ReadContext: resourceSpaceRead, DeleteContext: resourceSpaceDelete, Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, }, Schema: apikeySchema, } } func resourceSpaceUpsert(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { client, diags := clients.NewApiClientFromSDKResource(d, meta) if diags.HasError() { return diags } kibana, err := client.GetKibanaClient() if err != nil { return diag.FromErr(err) } space := kbapi.KibanaSpace{ ID: d.Get("space_id").(string), Name: d.Get("name").(string), } if description, ok := d.GetOk("description"); ok { space.Description = description.(string) } features := make([]string, 0) if v, ok := d.GetOk("disabled_features"); ok { p := v.(*schema.Set) for _, e := range p.List() { features = append(features, e.(string)) } } space.DisabledFeatures = features if initials, ok := d.GetOk("initials"); ok { space.Initials = initials.(string) } if color, ok := d.GetOk("color"); ok { space.Color = color.(string) } if imageUrl, ok := d.GetOk("image_url"); ok { space.ImageURL = imageUrl.(string) } var spaceResponse *kbapi.KibanaSpace if d.IsNewResource() { spaceResponse, err = kibana.KibanaSpaces.Create(&space) if err != nil { return diag.FromErr(err) } } else { spaceResponse, err = kibana.KibanaSpaces.Update(&space) if err != nil { return diag.FromErr(err) } } d.SetId(spaceResponse.ID) return resourceSpaceRead(ctx, d, meta) } func resourceSpaceRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { client, diags := clients.NewApiClientFromSDKResource(d, meta) if diags.HasError() { return diags } id := d.Id() if compId, diags := clients.CompositeIdFromStr(id); diags == nil { id = compId.ResourceId } kibana, err := client.GetKibanaClient() if err != nil { return diag.FromErr(err) } space, err := kibana.KibanaSpaces.Get(id) if space == nil && err == nil { d.SetId("") return diags } if err != nil { return diag.FromErr(err) } // set the fields if err := d.Set("space_id", space.ID); err != nil { return diag.FromErr(err) } if err := d.Set("name", space.Name); err != nil { return diag.FromErr(err) } if err := d.Set("description", space.Description); err != nil { return diag.FromErr(err) } if err := d.Set("disabled_features", space.DisabledFeatures); err != nil { return diag.FromErr(err) } if err := d.Set("initials", space.Initials); err != nil { return diag.FromErr(err) } if err := d.Set("color", space.Color); err != nil { return diag.FromErr(err) } return diags } func resourceSpaceDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { client, diags := clients.NewApiClientFromSDKResource(d, meta) if diags.HasError() { return diags } id := d.Id() if compId, diags := clients.CompositeIdFromStr(id); diags == nil { id = compId.ResourceId } kibana, err := client.GetKibanaClient() if err != nil { return diag.FromErr(err) } err = kibana.KibanaSpaces.Delete(id) if err != nil { return diag.FromErr(err) } d.SetId("") return diags }