in pkg/deploy/lattice/target_group_manager.go [155:248]
func (s *defaultTargetGroupManager) Delete(ctx context.Context, modelTg *model.TargetGroup) error {
if modelTg.Status == nil || modelTg.Status.Id == "" {
latticeTgSummary, err := s.findTargetGroup(ctx, modelTg)
if err != nil {
return err
}
if latticeTgSummary == nil {
// nothing to delete
s.log.Infof(ctx, "Target group with name prefix %s does not exist, nothing to delete", model.TgNamePrefix(modelTg.Spec))
return nil
}
modelTg.Status = &model.TargetGroupStatus{
Name: aws.StringValue(latticeTgSummary.Name),
Arn: aws.StringValue(latticeTgSummary.Arn),
Id: aws.StringValue(latticeTgSummary.Id),
}
}
s.log.Debugf(ctx, "Deleting target group %s", modelTg.Status.Id)
lattice := s.cloud.Lattice()
// de-register all targets first
listTargetsInput := vpclattice.ListTargetsInput{
TargetGroupIdentifier: &modelTg.Status.Id,
}
listResp, err := lattice.ListTargetsAsList(ctx, &listTargetsInput)
if err != nil {
if services.IsLatticeAPINotFoundErr(err) {
s.log.Debugf(ctx, "Target group %s was already deleted", modelTg.Status.Id)
return nil
}
return fmt.Errorf("failed ListTargets %s due to %s", modelTg.Status.Id, err)
}
var targetsToDeregister []*vpclattice.Target
drainCount := 0
for _, t := range listResp {
targetsToDeregister = append(targetsToDeregister, &vpclattice.Target{
Id: t.Id,
Port: t.Port,
})
if aws.StringValue(t.Status) == vpclattice.TargetStatusDraining {
drainCount++
}
}
if drainCount > 0 {
// no point in trying to deregister may as well wait
return fmt.Errorf("cannot deregister targets for %s as %d targets are DRAINING", modelTg.Status.Id, drainCount)
}
if len(targetsToDeregister) > 0 {
var deregisterTargetsError error
chunks := utils.Chunks(targetsToDeregister, maxTargetsPerLatticeTargetsApiCall)
for i, targets := range chunks {
deregisterInput := vpclattice.DeregisterTargetsInput{
TargetGroupIdentifier: &modelTg.Status.Id,
Targets: targets,
}
deregisterResponse, err := lattice.DeregisterTargetsWithContext(ctx, &deregisterInput)
if err != nil {
deregisterTargetsError = errors.Join(deregisterTargetsError, fmt.Errorf("failed to deregister targets from VPC Lattice Target Group %s due to %s", modelTg.Status.Id, err))
}
if len(deregisterResponse.Unsuccessful) > 0 {
deregisterTargetsError = errors.Join(deregisterTargetsError, fmt.Errorf("failed to deregister targets from VPC Lattice Target Group %s for chunk %d/%d, unsuccessful targets %v",
modelTg.Status.Id, i+1, len(chunks), deregisterResponse.Unsuccessful))
}
s.log.Debugf(ctx, "Successfully deregistered targets from VPC Lattice Target Group %s for chunk %d/%d", modelTg.Status.Id, i+1, len(chunks))
}
if deregisterTargetsError != nil {
return deregisterTargetsError
}
}
deleteTGInput := vpclattice.DeleteTargetGroupInput{
TargetGroupIdentifier: &modelTg.Status.Id,
}
_, err = lattice.DeleteTargetGroupWithContext(ctx, &deleteTGInput)
if err != nil {
if services.IsLatticeAPINotFoundErr(err) {
s.log.Infof(ctx, "Target group %s was already deleted", modelTg.Status.Id)
return nil
} else {
return fmt.Errorf("failed DeleteTargetGroup %s due to %s", modelTg.Status.Id, err)
}
}
s.log.Infof(ctx, "Success DeleteTargetGroup %s", modelTg.Status.Id)
return nil
}