Skip to content

[ResponseOps] Maintenance Window Resource #1037

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
Prev Previous commit
Next Next commit
Add serverless check for maintenance window resource.
  • Loading branch information
adcoelho committed May 20, 2025
commit 2a655691a55d8f51079b9440d54bc6a7111f9992
37 changes: 29 additions & 8 deletions internal/kibana/maintenance_window.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,16 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)

func validateMinMaintenanceWindowServerVersion(serverVersion *version.Version) diag.Diagnostics {
var maintenanceWindowPublicAPIMinSupportedVersion = version.Must(version.NewVersion("8.1.0"))
func validateMaintenanceWindowServer(serverVersion *version.Version, serverFlavor string) diag.Diagnostics {
var serverlessFlavor = "serverless"
var maintenanceWindowPublicAPIMinSupportedVersion = version.Must(version.NewVersion("9.1.0"))
var diags diag.Diagnostics

if serverVersion.LessThan(maintenanceWindowPublicAPIMinSupportedVersion) {
if serverVersion.LessThan(maintenanceWindowPublicAPIMinSupportedVersion) && serverFlavor != serverlessFlavor {
diags = append(diags, diag.Diagnostic{
Severity: diag.Error,
Summary: "Maintenance window API not supported",
Detail: fmt.Sprintf(`The maintenance Window public API feature requires a minimum Elasticsearch version of "%s"`, maintenanceWindowPublicAPIMinSupportedVersion),
Detail: fmt.Sprintf(`The maintenance Window public API feature requires a minimum Elasticsearch version of "%s" or a serverless Kibana instance.`, maintenanceWindowPublicAPIMinSupportedVersion),
})
return diags
}
Expand Down Expand Up @@ -261,7 +262,12 @@ func resourceMaintenanceWindowCreate(ctx context.Context, d *schema.ResourceData
return diags
}

diags = validateMinMaintenanceWindowServerVersion(serverVersion)
serverFlavor, diags := client.ServerFlavor(ctx)
if diags.HasError() {
return diags
}

diags = validateMaintenanceWindowServer(serverVersion, serverFlavor)
if diags.HasError() {
return diags
}
Expand Down Expand Up @@ -295,7 +301,12 @@ func resourceMaintenanceWindowUpdate(ctx context.Context, d *schema.ResourceData
return diags
}

diags = validateMinMaintenanceWindowServerVersion(serverVersion)
serverFlavor, diags := client.ServerFlavor(ctx)
if diags.HasError() {
return diags
}

diags = validateMaintenanceWindowServer(serverVersion, serverFlavor)
if diags.HasError() {
return diags
}
Expand Down Expand Up @@ -333,7 +344,12 @@ func resourceMaintenanceWindowRead(ctx context.Context, d *schema.ResourceData,
return diags
}

diags = validateMinMaintenanceWindowServerVersion(serverVersion)
serverFlavor, diags := client.ServerFlavor(ctx)
if diags.HasError() {
return diags
}

diags = validateMaintenanceWindowServer(serverVersion, serverFlavor)
if diags.HasError() {
return diags
}
Expand Down Expand Up @@ -421,7 +437,12 @@ func resourceMaintenanceWindowDelete(ctx context.Context, d *schema.ResourceData
return diags
}

diags = validateMinMaintenanceWindowServerVersion(serverVersion)
serverFlavor, diags := client.ServerFlavor(ctx)
if diags.HasError() {
return diags
}

diags = validateMaintenanceWindowServer(serverVersion, serverFlavor)
if diags.HasError() {
return diags
}
Expand Down
21 changes: 18 additions & 3 deletions internal/kibana/maintenance_window_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,22 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
)

func TestAccResourceMaintenanceWindow(t *testing.T) {
func CheckMinVersionAndServerless() (bool, error) {
minSupportedVersion := version.Must(version.NewSemver("9.1.0"))
versionIsUnsupported, err := versionutils.CheckIfVersionIsUnsupported(minSupportedVersion)()
if err != nil {
return false, err
}

isServerless, err := versionutils.CheckIfServerless()()
if err != nil {
return false, err
}

return versionIsUnsupported && !isServerless, err
}

func TestAccResourceMaintenanceWindow(t *testing.T) {
t.Setenv("KIBANA_API_KEY", "")

resource.Test(t, resource.TestCase{
Expand All @@ -25,7 +38,7 @@ func TestAccResourceMaintenanceWindow(t *testing.T) {
ProtoV6ProviderFactories: acctest.Providers,
Steps: []resource.TestStep{
{
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion),
SkipFunc: CheckMinVersionAndServerless,
Config: testAccResourceMaintenanceWindowCreate,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("elasticstack_kibana_maintenance_window.test_maintenance_window", "title", "Terraform Maintenance Window"),
Expand All @@ -41,7 +54,7 @@ func TestAccResourceMaintenanceWindow(t *testing.T) {
),
},
{
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion),
SkipFunc: CheckMinVersionAndServerless,
Config: testAccResourceMaintenanceWindowUpdate,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("elasticstack_kibana_maintenance_window.test_maintenance_window", "title", "Terraform Maintenance Window UPDATED"),
Expand All @@ -65,6 +78,7 @@ func TestAccResourceMaintenanceWindow(t *testing.T) {

const testAccResourceMaintenanceWindowCreate = `
provider "elasticstack" {
elasticsearch {}
kibana {}
}

Expand Down Expand Up @@ -93,6 +107,7 @@ resource "elasticstack_kibana_maintenance_window" "test_maintenance_window" {

const testAccResourceMaintenanceWindowUpdate = `
provider "elasticstack" {
elasticsearch {}
kibana {}
}

Expand Down
16 changes: 16 additions & 0 deletions internal/versionutils/testutils.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,22 @@ func CheckIfVersionIsUnsupported(minSupportedVersion *version.Version) func() (b
}
}

func CheckIfServerless() func() (bool, error) {
return func() (b bool, err error) {
serverlessFlavor := "serverless"
client, err := clients.NewAcceptanceTestingClient()
if err != nil {
return false, err
}
serverFlavor, diags := client.ServerFlavor(context.Background())
if diags.HasError() {
return false, fmt.Errorf("failed to parse the elasticsearch server flavor %v", diags)
}

return serverFlavor == serverlessFlavor, nil
}
}

func CheckIfVersionMeetsConstraints(constraints version.Constraints) func() (bool, error) {
return func() (b bool, err error) {
client, err := clients.NewAcceptanceTestingClient()
Expand Down
Loading