in pkg/deploy/lattice/rule_manager.go [201:245]
func (r *defaultRuleManager) updateIfNeeded(
ctx context.Context,
ruleToUpdate *vpclattice.GetRuleOutput,
matchingRule *vpclattice.GetRuleOutput,
latticeSvcId string,
latticeListenerId string,
) (model.RuleStatus, error) {
updatedRuleStatus := model.RuleStatus{
Name: aws.StringValue(matchingRule.Name),
Arn: aws.StringValue(matchingRule.Arn),
Id: aws.StringValue(matchingRule.Id),
ListenerId: latticeListenerId,
ServiceId: latticeSvcId,
Priority: aws.Int64Value(matchingRule.Priority),
}
// we already validated Match, if Action is also the same then no updates required
updateNeeded := !reflect.DeepEqual(ruleToUpdate.Action, matchingRule.Action)
if !updateNeeded {
r.log.Debugf(ctx, "rule unchanged, no updates required")
return updatedRuleStatus, nil
}
// when we update a rule, we use the priority of the existing rule to avoid conflicts
ruleToUpdate.Priority = matchingRule.Priority
ruleToUpdate.Id = matchingRule.Id
uri := vpclattice.UpdateRuleInput{
Action: ruleToUpdate.Action,
ServiceIdentifier: aws.String(latticeSvcId),
ListenerIdentifier: aws.String(latticeListenerId),
RuleIdentifier: ruleToUpdate.Id,
Match: ruleToUpdate.Match,
Priority: ruleToUpdate.Priority,
}
_, err := r.cloud.Lattice().UpdateRuleWithContext(ctx, &uri)
if err != nil {
return model.RuleStatus{}, fmt.Errorf("failed UpdateRule %d for %s, %s due to %s",
ruleToUpdate.Priority, latticeListenerId, latticeSvcId, err)
}
r.log.Infof(ctx, "Success UpdateRule %d for %s, %s", ruleToUpdate.Priority, latticeListenerId, latticeSvcId)
return updatedRuleStatus, nil
}