Skip to content

Commit b9149e5

Browse files
authored
fix: unhandled manual changes (outside terraform) in node membership rules (#95)
1 parent f4bec8e commit b9149e5

1 file changed

Lines changed: 39 additions & 43 deletions

File tree

internal/provider/node_room_member.go

Lines changed: 39 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,6 @@ There are two options to add nodes to the room:
9898
"id": schema.StringAttribute{
9999
Description: "The ID of the rule.",
100100
Computed: true,
101-
PlanModifiers: []planmodifier.String{
102-
stringplanmodifier.UseStateForUnknown(),
103-
},
104101
},
105102
"action": schema.StringAttribute{
106103
Description: "Determines whether matching nodes will be included or excluded from the room. Valid values: INCLUDE or EXCLUDE. EXCLUDE action always takes precedence against INCLUDE.",
@@ -295,36 +292,53 @@ func (s *nodeRoomMemberResource) Read(ctx context.Context, req resource.ReadRequ
295292

296293
state.NodeNames, _ = types.ListValueFrom(ctx, types.StringType, refreshedRoomNodes)
297294

298-
nodeMembershipRule, err := s.client.ListNodeMembershipRules(state.SpaceID.ValueString(), state.RoomID.ValueString())
295+
nodeMembershipRules, err := s.client.ListNodeMembershipRules(state.SpaceID.ValueString(), state.RoomID.ValueString())
299296
if err != nil {
300297
resp.Diagnostics.AddError(
301298
"Error Getting Node Room Membership Rules",
302299
fmt.Sprintf("Could not read node room membership rules for space_id/room_id: %s/%s err: %v", state.SpaceID.ValueString(), state.RoomID.ValueString(), err.Error()),
303300
)
304-
return
305301
}
306302

307-
for _, rule := range nodeMembershipRule {
308-
ruleExist, rIdx := checkNodeMembershipRule(rule.ID.String(), state.Rules)
303+
var refreshedNodeMembershipRules []nodeRoomMembershipRule
304+
305+
for _, rule := range state.Rules {
306+
var ruleExist bool
307+
for _, currentRule := range nodeMembershipRules {
308+
if rule.ID.ValueString() == currentRule.ID.String() {
309+
ruleExist = true
310+
break
311+
}
312+
}
309313
if ruleExist {
310-
clauseDiff := checkNodeMembershipClausesDiff(rule.Clauses, state.Rules[rIdx].Clauses)
311-
if clauseDiff {
312-
state.Rules[rIdx].Clauses = make([]nodeRoomMembershipClause, 0, len(rule.Clauses))
313-
for _, clause := range rule.Clauses {
314-
state.Rules[rIdx].Clauses = append(state.Rules[rIdx].Clauses, nodeRoomMembershipClause{
315-
Label: types.StringValue(clause.Label),
316-
Operator: types.StringValue(clause.Operator),
317-
Value: types.StringValue(clause.Value),
318-
Negate: types.BoolValue(clause.Negate),
319-
})
320-
}
314+
nodeMembershipRule, err := s.client.GetNodeMembershipRule(state.SpaceID.ValueString(), state.RoomID.ValueString(), rule.ID.String())
315+
if err != nil {
316+
resp.Diagnostics.AddError(
317+
"Error Getting Node Room Membership Rule",
318+
fmt.Sprintf("Could not read node room membership rule for space_id/room_id/rule_id: %s/%s/%s err: %v", state.SpaceID.ValueString(), state.RoomID.ValueString(), rule.ID.String(), err.Error()),
319+
)
320+
return
321321
}
322-
state.Rules[rIdx].ID = types.StringValue(rule.ID.String())
323-
state.Rules[rIdx].Action = types.StringValue(rule.Action)
324-
state.Rules[rIdx].Description = types.StringValue(rule.Description)
322+
var refreshedNodeMembershipRulesClauses []nodeRoomMembershipClause
323+
for _, clause := range nodeMembershipRule.Clauses {
324+
refreshedNodeMembershipRulesClauses = append(refreshedNodeMembershipRulesClauses, nodeRoomMembershipClause{
325+
Label: types.StringValue(clause.Label),
326+
Operator: types.StringValue(clause.Operator),
327+
Value: types.StringValue(clause.Value),
328+
Negate: types.BoolValue(clause.Negate),
329+
})
330+
}
331+
refreshedNodeMembershipRules = append(refreshedNodeMembershipRules, nodeRoomMembershipRule{
332+
ID: types.StringValue(nodeMembershipRule.ID.String()),
333+
Action: types.StringValue(nodeMembershipRule.Action),
334+
Description: types.StringValue(nodeMembershipRule.Description),
335+
Clauses: refreshedNodeMembershipRulesClauses,
336+
})
325337
}
326338
}
327339

340+
state.Rules = refreshedNodeMembershipRules
341+
328342
diags = resp.State.Set(ctx, &state)
329343
resp.Diagnostics.Append(diags...)
330344
if resp.Diagnostics.HasError() {
@@ -418,7 +432,7 @@ func (s *nodeRoomMemberResource) Update(ctx context.Context, req resource.Update
418432
}
419433

420434
for _, stateRule := range state.Rules {
421-
exist, _ := checkNodeMembershipRule(stateRule.ID.ValueString(), plan.Rules)
435+
exist := checkNodeMembershipRule(stateRule.ID.ValueString(), plan.Rules)
422436
if !exist {
423437
err = s.client.DeleteNodeMembershipRule(state.SpaceID.ValueString(), state.RoomID.ValueString(), stateRule.ID.ValueString())
424438
if err != nil {
@@ -435,7 +449,7 @@ func (s *nodeRoomMemberResource) Update(ctx context.Context, req resource.Update
435449
var nodeMembershipRule *client.NodeMembershipRule
436450
var nodeMembershipClauses []client.NodeMembershipClause
437451

438-
exist, _ := checkNodeMembershipRule(planRule.ID.ValueString(), state.Rules)
452+
exist := checkNodeMembershipRule(planRule.ID.ValueString(), state.Rules)
439453
for _, clause := range planRule.Clauses {
440454
nodeMembershipClauses = append(nodeMembershipClauses, client.NodeMembershipClause{
441455
Label: clause.Label.ValueString(),
@@ -567,29 +581,11 @@ func checkNodeExists(searchingForNodeName string, nodes *client.RoomNodes, reach
567581
return false, ""
568582
}
569583

570-
func checkNodeMembershipRule(ruleID string, rules []nodeRoomMembershipRule) (bool, int) {
571-
for idx, rule := range rules {
584+
func checkNodeMembershipRule(ruleID string, rules []nodeRoomMembershipRule) bool {
585+
for _, rule := range rules {
572586
if ruleID == rule.ID.ValueString() {
573-
return true, idx
574-
}
575-
}
576-
return false, -1
577-
}
578-
579-
func checkNodeMembershipClausesDiff(resp []client.NodeMembershipClause, stateClauses []nodeRoomMembershipClause) bool {
580-
if len(resp) != len(stateClauses) {
581-
return true
582-
}
583-
584-
for i, r := range resp {
585-
s := stateClauses[i]
586-
if r.Label != s.Label.ValueString() ||
587-
r.Operator != s.Operator.ValueString() ||
588-
r.Value != s.Value.ValueString() ||
589-
r.Negate != s.Negate.ValueBool() {
590587
return true
591588
}
592589
}
593-
594590
return false
595591
}

0 commit comments

Comments
 (0)