diff --git a/stackit/internal/services/ske/cluster/resource.go b/stackit/internal/services/ske/cluster/resource.go index 05c8cb74..997302a0 100644 --- a/stackit/internal/services/ske/cluster/resource.go +++ b/stackit/internal/services/ske/cluster/resource.go @@ -1522,30 +1522,28 @@ func getMaintenanceTimes(ctx context.Context, cl *ske.Cluster, m *Model) (startT return "", "", fmt.Errorf("converting maintenance object %w", core.DiagsToError(diags.Errors())) } - if maintenance.Start.IsNull() || maintenance.Start.IsUnknown() { - startTime = startTimeAPI.Format("15:04:05Z07:00") - } else { + startTime = startTimeAPI.Format("15:04:05Z07:00") + if !(maintenance.Start.IsNull() || maintenance.Start.IsUnknown()) { startTimeTF, err := time.Parse("15:04:05Z07:00", maintenance.Start.ValueString()) if err != nil { return "", "", fmt.Errorf("parsing start time '%s' from TF config as RFC time: %w", maintenance.Start.ValueString(), err) } - if startTimeAPI.Format("15:04:05Z07:00") != startTimeTF.Format("15:04:05Z07:00") { - return "", "", fmt.Errorf("start time '%v' from API response doesn't match start time '%v' from TF config", *cl.Maintenance.TimeWindow.Start, maintenance.Start.ValueString()) + // If the start times from the API and the TF model just differ in format, we keep the current TF model value + if startTimeAPI.Format("15:04:05Z07:00") == startTimeTF.Format("15:04:05Z07:00") { + startTime = maintenance.Start.ValueString() } - startTime = maintenance.Start.ValueString() } - if maintenance.End.IsNull() || maintenance.End.IsUnknown() { - endTime = endTimeAPI.Format("15:04:05Z07:00") - } else { + endTime = endTimeAPI.Format("15:04:05Z07:00") + if !(maintenance.End.IsNull() || maintenance.End.IsUnknown()) { endTimeTF, err := time.Parse("15:04:05Z07:00", maintenance.End.ValueString()) if err != nil { return "", "", fmt.Errorf("parsing end time '%s' from TF config as RFC time: %w", maintenance.End.ValueString(), err) } - if endTimeAPI.Format("15:04:05Z07:00") != endTimeTF.Format("15:04:05Z07:00") { - return "", "", fmt.Errorf("end time '%v' from API response doesn't match end time '%v' from TF config", *cl.Maintenance.TimeWindow.End, maintenance.End.ValueString()) + // If the end times from the API and the TF model just differ in format, we keep the current TF model value + if endTimeAPI.Format("15:04:05Z07:00") == endTimeTF.Format("15:04:05Z07:00") { + endTime = maintenance.End.ValueString() } - endTime = maintenance.End.ValueString() } return startTime, endTime, nil diff --git a/stackit/internal/services/ske/cluster/resource_test.go b/stackit/internal/services/ske/cluster/resource_test.go index c9002dcb..62bba568 100644 --- a/stackit/internal/services/ske/cluster/resource_test.go +++ b/stackit/internal/services/ske/cluster/resource_test.go @@ -1461,36 +1461,44 @@ func TestGetMaintenanceTimes(t *testing.T) { endExpected: "14:15:16Z", }, { - description: "tf_state_doesnt_match_1", - startAPI: "0001-02-03T04:05:06+07:08", - startTF: utils.Ptr("00:00:00+07:08"), - endAPI: "0011-12-13T14:15:16+17:18", - endTF: utils.Ptr("14:15:16+17:18"), - isValid: false, + description: "api_takes_precedence_if_different_1", + startAPI: "0001-02-03T04:05:06+07:08", + startTF: utils.Ptr("00:00:00+07:08"), + endAPI: "0011-12-13T14:15:16+17:18", + endTF: utils.Ptr("14:15:16+17:18"), + isValid: true, + startExpected: "04:05:06+07:08", + endExpected: "14:15:16+17:18", }, { - description: "tf_state_doesnt_match_2", - startAPI: "0001-02-03T04:05:06+07:08", - startTF: utils.Ptr("04:05:06+07:08"), - endAPI: "0011-12-13T14:15:16+17:18", - endTF: utils.Ptr("00:00:00+17:18"), - isValid: false, + description: "api_takes_precedence_if_different_2", + startAPI: "0001-02-03T04:05:06+07:08", + startTF: utils.Ptr("04:05:06+07:08"), + endAPI: "0011-12-13T14:15:16+17:18", + endTF: utils.Ptr("00:00:00+17:18"), + isValid: true, + startExpected: "04:05:06+07:08", + endExpected: "14:15:16+17:18", }, { - description: "tf_state_doesnt_match_3", - startAPI: "0001-02-03T04:05:06+07:08", - startTF: utils.Ptr("04:05:06Z"), - endAPI: "0011-12-13T14:15:16+17:18", - endTF: utils.Ptr("14:15:16+17:18"), - isValid: false, + description: "api_takes_precedence_if_different_3", + startAPI: "0001-02-03T04:05:06+07:08", + startTF: utils.Ptr("04:05:06Z"), + endAPI: "0011-12-13T14:15:16+17:18", + endTF: utils.Ptr("14:15:16+17:18"), + isValid: true, + startExpected: "04:05:06+07:08", + endExpected: "14:15:16+17:18", }, { - description: "tf_state_doesnt_match_4", - startAPI: "0001-02-03T04:05:06+07:08", - startTF: utils.Ptr("04:05:06+07:08"), - endAPI: "0011-12-13T14:15:16+17:18", - endTF: utils.Ptr("14:15:16Z"), - isValid: false, + description: "api_takes_precedence_if_different_3", + startAPI: "0001-02-03T04:05:06+07:08", + startTF: utils.Ptr("04:05:06+07:08"), + endAPI: "0011-12-13T14:15:16+17:18", + endTF: utils.Ptr("14:15:16Z"), + isValid: true, + startExpected: "04:05:06+07:08", + endExpected: "14:15:16+17:18", }, } for _, tt := range tests { @@ -1530,10 +1538,10 @@ func TestGetMaintenanceTimes(t *testing.T) { t.Fatalf("getMaintenanceTimes didn't fail on invalid input") } if tt.startExpected != start { - t.Errorf("extected start '%s', got '%s'", tt.startExpected, start) + t.Errorf("expected start '%s', got '%s'", tt.startExpected, start) } if tt.endExpected != end { - t.Errorf("extected end '%s', got '%s'", tt.endExpected, end) + t.Errorf("expected end '%s', got '%s'", tt.endExpected, end) } }) }