in pkg/deploy/lattice/access_log_subscription_manager.go [115:173]
func (m *defaultAccessLogSubscriptionManager) Update(
ctx context.Context,
accessLogSubscription *lattice.AccessLogSubscription,
) (*lattice.AccessLogSubscriptionStatus, error) {
vpcLatticeSess := m.cloud.Lattice()
// If the source is modified, we need to replace the ALS
getALSInput := &vpclattice.GetAccessLogSubscriptionInput{
AccessLogSubscriptionIdentifier: aws.String(accessLogSubscription.Status.Arn),
}
getALSOutput, err := vpcLatticeSess.GetAccessLogSubscriptionWithContext(ctx, getALSInput)
if err != nil {
switch e := err.(type) {
case *vpclattice.AccessDeniedException:
return nil, services.NewInvalidError(e.Message())
case *vpclattice.ResourceNotFoundException:
return m.Create(ctx, accessLogSubscription)
default:
return nil, err
}
}
sourceArn, err := m.getSourceArn(ctx, accessLogSubscription.Spec.SourceType, accessLogSubscription.Spec.SourceName)
if err != nil {
return nil, err
}
if *getALSOutput.ResourceArn != *sourceArn {
return m.replaceAccessLogSubscription(ctx, accessLogSubscription)
}
// Source is not modified, try to update destinationArn in the existing ALS
updateALSInput := &vpclattice.UpdateAccessLogSubscriptionInput{
AccessLogSubscriptionIdentifier: aws.String(accessLogSubscription.Status.Arn),
DestinationArn: aws.String(accessLogSubscription.Spec.DestinationArn),
}
updateALSOutput, err := vpcLatticeSess.UpdateAccessLogSubscriptionWithContext(ctx, updateALSInput)
if err == nil {
return &lattice.AccessLogSubscriptionStatus{
Arn: *updateALSOutput.Arn,
}, nil
}
switch e := err.(type) {
case *vpclattice.AccessDeniedException:
return nil, services.NewInvalidError(e.Message())
case *vpclattice.ResourceNotFoundException:
if *e.ResourceType == "SERVICE_NETWORK" || *e.ResourceType == "SERVICE" {
return nil, services.NewNotFoundError(string(accessLogSubscription.Spec.SourceType), accessLogSubscription.Spec.SourceName)
}
return m.Create(ctx, accessLogSubscription)
case *vpclattice.ConflictException:
/*
* A conflict can happen when the destination type of the new ALS is different from the original.
* To gracefully handle this, we create a new ALS with the new destination, then delete the old one.
*/
return m.replaceAccessLogSubscription(ctx, accessLogSubscription)
default:
return nil, err
}
}