diff --git a/apis/v1alpha1/ack-generate-metadata.yaml b/apis/v1alpha1/ack-generate-metadata.yaml index 6b889f7..716dc96 100755 --- a/apis/v1alpha1/ack-generate-metadata.yaml +++ b/apis/v1alpha1/ack-generate-metadata.yaml @@ -1,13 +1,13 @@ ack_generate_info: - build_date: "2025-08-22T23:47:01Z" - build_hash: 1045a5e99038b11b0630ca2f2f69c3bae4bedba6 - go_version: go1.25.0 - version: v0.51.0-1-g1045a5e + build_date: "2025-09-03T20:10:59Z" + build_hash: 1d9076d0211773ff8ab8682b28b912c7ece10676 + go_version: go1.24.5 + version: v0.51.0-2-g1d9076d api_directory_checksum: 90b0d1adcc91f4a1b1f1b436e3ac0c30d9271678 api_version: v1alpha1 aws_sdk_go_version: v1.32.6 generator_config_info: - file_checksum: ecb60f0fe79237eb820e68d823e6da2bf0829140 + file_checksum: 746b45e4dfa86a7e3fc4979703205281a4b71e8f original_file_name: generator.yaml last_modification: reason: API generation diff --git a/apis/v1alpha1/generator.yaml b/apis/v1alpha1/generator.yaml index 39aa73c..46e938e 100644 --- a/apis/v1alpha1/generator.yaml +++ b/apis/v1alpha1/generator.yaml @@ -157,6 +157,8 @@ resources: template_path: hooks/db_cluster/sdk_delete_pre_build_request.go.tpl sdk_delete_post_build_request: template_path: hooks/db_cluster/sdk_delete_post_build_request.go.tpl + sdk_delete_post_request: + template_path: hooks/common/sdk_delete_post_request.go.tpl sdk_file_end: template_path: hooks/db_cluster/sdk_file_end.go.tpl exceptions: @@ -310,6 +312,8 @@ resources: template_path: hooks/db_instance/sdk_delete_pre_build_request.go.tpl sdk_delete_post_build_request: template_path: hooks/db_instance/sdk_delete_post_build_request.go.tpl + sdk_delete_post_request: + template_path: hooks/common/sdk_delete_post_request.go.tpl sdk_file_end: template_path: hooks/db_instance/sdk_file_end.go.tpl exceptions: diff --git a/generator.yaml b/generator.yaml index 39aa73c..46e938e 100644 --- a/generator.yaml +++ b/generator.yaml @@ -157,6 +157,8 @@ resources: template_path: hooks/db_cluster/sdk_delete_pre_build_request.go.tpl sdk_delete_post_build_request: template_path: hooks/db_cluster/sdk_delete_post_build_request.go.tpl + sdk_delete_post_request: + template_path: hooks/common/sdk_delete_post_request.go.tpl sdk_file_end: template_path: hooks/db_cluster/sdk_file_end.go.tpl exceptions: @@ -310,6 +312,8 @@ resources: template_path: hooks/db_instance/sdk_delete_pre_build_request.go.tpl sdk_delete_post_build_request: template_path: hooks/db_instance/sdk_delete_post_build_request.go.tpl + sdk_delete_post_request: + template_path: hooks/common/sdk_delete_post_request.go.tpl sdk_file_end: template_path: hooks/db_instance/sdk_file_end.go.tpl exceptions: diff --git a/pkg/resource/db_cluster/resource.go b/pkg/resource/db_cluster/resource.go index 4a606f5..dc5125c 100644 --- a/pkg/resource/db_cluster/resource.go +++ b/pkg/resource/db_cluster/resource.go @@ -97,11 +97,11 @@ func (r *resource) SetIdentifiers(identifier *ackv1alpha1.AWSIdentifiers) error // PopulateResourceFromAnnotation populates the fields passed from adoption annotation func (r *resource) PopulateResourceFromAnnotation(fields map[string]string) error { - tmp, ok := fields["dbClusterIdentifier"] + primaryKey, ok := fields["dbClusterIdentifier"] if !ok { return ackerrors.NewTerminalError(fmt.Errorf("required field missing: dbClusterIdentifier")) } - r.ko.Spec.DBClusterIdentifier = &tmp + r.ko.Spec.DBClusterIdentifier = &primaryKey return nil } diff --git a/pkg/resource/db_cluster/sdk.go b/pkg/resource/db_cluster/sdk.go index cdabfa1..0b404b8 100644 --- a/pkg/resource/db_cluster/sdk.go +++ b/pkg/resource/db_cluster/sdk.go @@ -1562,6 +1562,10 @@ func (rm *resourceManager) sdkDelete( _ = resp resp, err = rm.sdkapi.DeleteDBCluster(ctx, input) rm.metrics.RecordAPICall("DELETE", "DeleteDBCluster", err) + if err == nil { + _ = resp + err = ackrequeue.Needed(fmt.Errorf("wait for DBInstance deletion")) + } return nil, err } diff --git a/pkg/resource/db_cluster_endpoint/resource.go b/pkg/resource/db_cluster_endpoint/resource.go index 3c21d04..a0216ef 100644 --- a/pkg/resource/db_cluster_endpoint/resource.go +++ b/pkg/resource/db_cluster_endpoint/resource.go @@ -103,11 +103,11 @@ func (r *resource) SetIdentifiers(identifier *ackv1alpha1.AWSIdentifiers) error // PopulateResourceFromAnnotation populates the fields passed from adoption annotation func (r *resource) PopulateResourceFromAnnotation(fields map[string]string) error { - tmp, ok := fields["dbClusterEndpointIdentifier"] + primaryKey, ok := fields["dbClusterEndpointIdentifier"] if !ok { return ackerrors.NewTerminalError(fmt.Errorf("required field missing: dbClusterEndpointIdentifier")) } - r.ko.Spec.DBClusterEndpointIdentifier = &tmp + r.ko.Spec.DBClusterEndpointIdentifier = &primaryKey f1, f1ok := fields["dbClusterIdentifier"] if f1ok { diff --git a/pkg/resource/db_cluster_parameter_group/resource.go b/pkg/resource/db_cluster_parameter_group/resource.go index a86e1f3..7a276af 100644 --- a/pkg/resource/db_cluster_parameter_group/resource.go +++ b/pkg/resource/db_cluster_parameter_group/resource.go @@ -97,11 +97,11 @@ func (r *resource) SetIdentifiers(identifier *ackv1alpha1.AWSIdentifiers) error // PopulateResourceFromAnnotation populates the fields passed from adoption annotation func (r *resource) PopulateResourceFromAnnotation(fields map[string]string) error { - tmp, ok := fields["name"] + primaryKey, ok := fields["name"] if !ok { return ackerrors.NewTerminalError(fmt.Errorf("required field missing: name")) } - r.ko.Spec.Name = &tmp + r.ko.Spec.Name = &primaryKey return nil } diff --git a/pkg/resource/db_cluster_snapshot/resource.go b/pkg/resource/db_cluster_snapshot/resource.go index a8d5814..ada10cd 100644 --- a/pkg/resource/db_cluster_snapshot/resource.go +++ b/pkg/resource/db_cluster_snapshot/resource.go @@ -107,11 +107,11 @@ func (r *resource) SetIdentifiers(identifier *ackv1alpha1.AWSIdentifiers) error // PopulateResourceFromAnnotation populates the fields passed from adoption annotation func (r *resource) PopulateResourceFromAnnotation(fields map[string]string) error { - tmp, ok := fields["dbClusterSnapshotIdentifier"] + primaryKey, ok := fields["dbClusterSnapshotIdentifier"] if !ok { return ackerrors.NewTerminalError(fmt.Errorf("required field missing: dbClusterSnapshotIdentifier")) } - r.ko.Spec.DBClusterSnapshotIdentifier = &tmp + r.ko.Spec.DBClusterSnapshotIdentifier = &primaryKey f0, f0ok := fields["dbClusterIdentifier"] if f0ok { diff --git a/pkg/resource/db_instance/resource.go b/pkg/resource/db_instance/resource.go index 62633d0..a62a278 100644 --- a/pkg/resource/db_instance/resource.go +++ b/pkg/resource/db_instance/resource.go @@ -97,11 +97,11 @@ func (r *resource) SetIdentifiers(identifier *ackv1alpha1.AWSIdentifiers) error // PopulateResourceFromAnnotation populates the fields passed from adoption annotation func (r *resource) PopulateResourceFromAnnotation(fields map[string]string) error { - tmp, ok := fields["dbInstanceIdentifier"] + primaryKey, ok := fields["dbInstanceIdentifier"] if !ok { return ackerrors.NewTerminalError(fmt.Errorf("required field missing: dbInstanceIdentifier")) } - r.ko.Spec.DBInstanceIdentifier = &tmp + r.ko.Spec.DBInstanceIdentifier = &primaryKey return nil } diff --git a/pkg/resource/db_instance/sdk.go b/pkg/resource/db_instance/sdk.go index 3c3cee2..8a7f382 100644 --- a/pkg/resource/db_instance/sdk.go +++ b/pkg/resource/db_instance/sdk.go @@ -2927,6 +2927,10 @@ func (rm *resourceManager) sdkDelete( _ = resp resp, err = rm.sdkapi.DeleteDBInstance(ctx, input) rm.metrics.RecordAPICall("DELETE", "DeleteDBInstance", err) + if err == nil { + _ = resp + err = ackrequeue.Needed(fmt.Errorf("wait for DBInstance deletion")) + } return nil, err } diff --git a/pkg/resource/db_parameter_group/resource.go b/pkg/resource/db_parameter_group/resource.go index 8ddf636..20059c3 100644 --- a/pkg/resource/db_parameter_group/resource.go +++ b/pkg/resource/db_parameter_group/resource.go @@ -97,11 +97,11 @@ func (r *resource) SetIdentifiers(identifier *ackv1alpha1.AWSIdentifiers) error // PopulateResourceFromAnnotation populates the fields passed from adoption annotation func (r *resource) PopulateResourceFromAnnotation(fields map[string]string) error { - tmp, ok := fields["name"] + primaryKey, ok := fields["name"] if !ok { return ackerrors.NewTerminalError(fmt.Errorf("required field missing: name")) } - r.ko.Spec.Name = &tmp + r.ko.Spec.Name = &primaryKey return nil } diff --git a/pkg/resource/db_proxy/resource.go b/pkg/resource/db_proxy/resource.go index 80d4536..841ffbb 100644 --- a/pkg/resource/db_proxy/resource.go +++ b/pkg/resource/db_proxy/resource.go @@ -97,11 +97,11 @@ func (r *resource) SetIdentifiers(identifier *ackv1alpha1.AWSIdentifiers) error // PopulateResourceFromAnnotation populates the fields passed from adoption annotation func (r *resource) PopulateResourceFromAnnotation(fields map[string]string) error { - tmp, ok := fields["name"] + primaryKey, ok := fields["name"] if !ok { return ackerrors.NewTerminalError(fmt.Errorf("required field missing: name")) } - r.ko.Spec.Name = &tmp + r.ko.Spec.Name = &primaryKey return nil } diff --git a/pkg/resource/db_snapshot/resource.go b/pkg/resource/db_snapshot/resource.go index 06e411d..ca10029 100644 --- a/pkg/resource/db_snapshot/resource.go +++ b/pkg/resource/db_snapshot/resource.go @@ -111,11 +111,11 @@ func (r *resource) SetIdentifiers(identifier *ackv1alpha1.AWSIdentifiers) error // PopulateResourceFromAnnotation populates the fields passed from adoption annotation func (r *resource) PopulateResourceFromAnnotation(fields map[string]string) error { - tmp, ok := fields["dbSnapshotIdentifier"] + primaryKey, ok := fields["dbSnapshotIdentifier"] if !ok { return ackerrors.NewTerminalError(fmt.Errorf("required field missing: dbSnapshotIdentifier")) } - r.ko.Spec.DBSnapshotIdentifier = &tmp + r.ko.Spec.DBSnapshotIdentifier = &primaryKey f0, f0ok := fields["dbInstanceIdentifier"] if f0ok { diff --git a/pkg/resource/db_subnet_group/resource.go b/pkg/resource/db_subnet_group/resource.go index 26058f7..28cf6fa 100644 --- a/pkg/resource/db_subnet_group/resource.go +++ b/pkg/resource/db_subnet_group/resource.go @@ -97,11 +97,11 @@ func (r *resource) SetIdentifiers(identifier *ackv1alpha1.AWSIdentifiers) error // PopulateResourceFromAnnotation populates the fields passed from adoption annotation func (r *resource) PopulateResourceFromAnnotation(fields map[string]string) error { - tmp, ok := fields["name"] + primaryKey, ok := fields["name"] if !ok { return ackerrors.NewTerminalError(fmt.Errorf("required field missing: name")) } - r.ko.Spec.Name = &tmp + r.ko.Spec.Name = &primaryKey return nil } diff --git a/pkg/resource/global_cluster/resource.go b/pkg/resource/global_cluster/resource.go index f3635f2..4cac890 100644 --- a/pkg/resource/global_cluster/resource.go +++ b/pkg/resource/global_cluster/resource.go @@ -97,11 +97,11 @@ func (r *resource) SetIdentifiers(identifier *ackv1alpha1.AWSIdentifiers) error // PopulateResourceFromAnnotation populates the fields passed from adoption annotation func (r *resource) PopulateResourceFromAnnotation(fields map[string]string) error { - tmp, ok := fields["globalClusterIdentifier"] + primaryKey, ok := fields["globalClusterIdentifier"] if !ok { return ackerrors.NewTerminalError(fmt.Errorf("required field missing: globalClusterIdentifier")) } - r.ko.Spec.GlobalClusterIdentifier = &tmp + r.ko.Spec.GlobalClusterIdentifier = &primaryKey return nil } diff --git a/templates/hooks/common/sdk_delete_post_request.go.tpl b/templates/hooks/common/sdk_delete_post_request.go.tpl new file mode 100644 index 0000000..ab85c1c --- /dev/null +++ b/templates/hooks/common/sdk_delete_post_request.go.tpl @@ -0,0 +1,4 @@ + if err == nil { + _ = resp + err = ackrequeue.Needed(fmt.Errorf("wait for DBInstance deletion")) + } \ No newline at end of file diff --git a/test/e2e/tests/test_db_instance.py b/test/e2e/tests/test_db_instance.py index ec27478..1658346 100644 --- a/test/e2e/tests/test_db_instance.py +++ b/test/e2e/tests/test_db_instance.py @@ -94,12 +94,11 @@ def postgres14_t3_micro_instance(k8s_secret): yield (ref, cr, secret.name) - # Try to delete, if doesn't already exist - try: - _, deleted = k8s.delete_custom_resource(ref, 3, 10) - except: - pass + k8s.delete_custom_resource(ref) + assert k8s.get_resource_exists(ref) db_instance.wait_until_deleted(db_instance_id) + time.sleep(60) + assert not k8s.get_resource_exists(ref) @service_marker @pytest.mark.canary diff --git a/test/e2e/tests/test_references.py b/test/e2e/tests/test_references.py index 9378979..d00e71b 100644 --- a/test/e2e/tests/test_references.py +++ b/test/e2e/tests/test_references.py @@ -287,25 +287,24 @@ def test_references( # we try to delete the DB Parameter Group before the DB Instance, the # cascading delete protection of resource references will mean the DB # Parameter Group won't be deleted. - _, deleted = k8s.delete_custom_resource( - db_instance_ref, - period_length=DELETE_INSTANCE_TIMEOUT_SECONDS, - ) - assert deleted + k8s.delete_custom_resource(db_instance_ref) + # ensure db_instance does not disappear immidiately from k8s + assert k8s.get_resource_exists(db_instance_ref) # Wait a bit before trying to delete the cluster since the instance is # part of the cluster and sometimes the delete cluster complains if # it's too soon after deleting the last DB instance in it. + db_instance.wait_until_deleted(db_instance_id) time.sleep(60) + # ensure db_instance is removed from k8s once it is removed from AWS + assert not k8s.get_resource_exists(db_instance_ref) - db_instance.wait_until_deleted(db_instance_id) # Same for the DB cluster because it refers to the DB cluster # parameter group... - _, deleted = k8s.delete_custom_resource( - db_cluster_ref, - period_length=DELETE_CLUSTER_TIMEOUT_SECONDS, - ) - assert deleted + k8s.delete_custom_resource(db_cluster_ref) + assert k8s.get_resource_exists(db_cluster_ref) db_cluster.wait_until_deleted(db_cluster_id) + time.sleep(60) + assert not k8s.get_resource_exists(db_cluster_ref)