Skip to content

Commit 3e7a541

Browse files
committed
Combine tests into one function
Doing so becasue there can only be one VPC attachment at a time and the resource stays in deleting for several minutes.
1 parent 59a0942 commit 3e7a541

File tree

9 files changed

+66
-72
lines changed

9 files changed

+66
-72
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
ack_generate_info:
2-
build_date: "2025-03-27T03:27:32Z"
2+
build_date: "2025-03-28T15:21:59Z"
33
build_hash: 3722729cebe6d3c03c7e442655ef0846f91566a2
44
go_version: go1.24.0
55
version: v0.43.2-7-g3722729
66
api_directory_checksum: bb3f7a9b3924fdbe63a4082a9134b3f1f653979b
77
api_version: v1alpha1
88
aws_sdk_go_version: v1.32.6
99
generator_config_info:
10-
file_checksum: ac3998b266a4a9996bc1c755c573b9aad68a9807
10+
file_checksum: 34c308f1552184ca33451041fd787bfd9d32dc5e
1111
original_file_name: generator.yaml
1212
last_modification:
1313
reason: API generation

apis/v1alpha1/generator.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -845,8 +845,6 @@ resources:
845845
hooks:
846846
sdk_create_post_build_request:
847847
template_path: hooks/transit_gateway_vpc_attachment/sdk_create_post_build_request.go.tpl
848-
sdk_read_many_post_set_output:
849-
template_path: hooks/transit_gateway_vpc_attachment/sdk_read_many_post_set_output.go.tpl
850848
sdk_update_pre_build_request:
851849
template_path: hooks/transit_gateway_vpc_attachment/sdk_update_pre_build_request.go.tpl
852850
sdk_update_post_build_request:

generator.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -845,8 +845,6 @@ resources:
845845
hooks:
846846
sdk_create_post_build_request:
847847
template_path: hooks/transit_gateway_vpc_attachment/sdk_create_post_build_request.go.tpl
848-
sdk_read_many_post_set_output:
849-
template_path: hooks/transit_gateway_vpc_attachment/sdk_read_many_post_set_output.go.tpl
850848
sdk_update_pre_build_request:
851849
template_path: hooks/transit_gateway_vpc_attachment/sdk_update_pre_build_request.go.tpl
852850
sdk_update_post_build_request:

pkg/resource/transit_gateway_vpc_attachment/hooks.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,31 @@
1414
package transit_gateway_vpc_attachment
1515

1616
import (
17-
"github.com/aws-controllers-k8s/ec2-controller/pkg/tags"
17+
"fmt"
18+
19+
ackrequeue "github.com/aws-controllers-k8s/runtime/pkg/requeue"
1820
"github.com/aws/aws-sdk-go-v2/aws"
1921
svcsdk "github.com/aws/aws-sdk-go-v2/service/ec2"
2022
svcsdktypes "github.com/aws/aws-sdk-go-v2/service/ec2/types"
23+
24+
"github.com/aws-controllers-k8s/ec2-controller/pkg/tags"
2125
)
2226

27+
var StatusAvailable = svcsdktypes.TransitGatewayAttachmentStateAvailable
28+
29+
// requeueWaitUntilCanModify returns a `ackrequeue.RequeueNeededAfter` struct
30+
// explaining the cluster cannot be modified until it reaches an active status.
31+
func requeueWaitUntilCanModify(r *resource) *ackrequeue.RequeueNeeded {
32+
if r.ko.Status.State == nil {
33+
return nil
34+
}
35+
status := *r.ko.Status.State
36+
return ackrequeue.Needed(
37+
fmt.Errorf("transitGatewayAttachment is in '%s' and state, cannot be modified until '%s'",
38+
status, StatusAvailable),
39+
)
40+
}
41+
2342
// updateTagSpecificationsInCreateRequest adds
2443
// Tags defined in the Spec to CreateDhcpOptionsInput.TagSpecification
2544
// and ensures the ResourceType is always set to 'transit-gateway-vpc-attachment'
@@ -47,7 +66,6 @@ func updateTagSpecificationsInCreateRequest(r *resource,
4766
func compareSubnetIDs(desiredSubnetIDs, latestSubnetIDs []*string) ([]string, []string) {
4867

4968
toAdd, toRemove := []string{}, []string{}
50-
5169
desired, latest := aws.ToStringSlice(desiredSubnetIDs), aws.ToStringSlice(latestSubnetIDs)
5270

5371
for _, d := range desired {

pkg/resource/transit_gateway_vpc_attachment/sdk.go

Lines changed: 1 addition & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

templates/hooks/transit_gateway_vpc_attachment/sdk_read_many_post_set_output.go.tpl

Lines changed: 0 additions & 6 deletions
This file was deleted.

templates/hooks/transit_gateway_vpc_attachment/sdk_update_pre_build_request.go.tpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@
1414
}
1515

1616
if *latest.ko.Status.State != string(svcsdktypes.TransitGatewayAttachmentStateAvailable) {
17-
17+
return desired, requeueWaitUntilCanModify(desired)
1818
}

test/e2e/tests/helper.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"""
1616

1717
from typing import Union, Dict
18+
import time
1819

1920

2021
class EC2Validator:
@@ -214,11 +215,26 @@ def assert_transit_gateway(self, tgw_id: str, exists=True):
214215
pass
215216
assert res_found is exists
216217

218+
def wait_transit_gateway_state(self, tgw_id: str, state: str):
219+
is_state = False
220+
max_tries = 5
221+
try:
222+
for tries in range(max_tries):
223+
transit_gateway = self.ec2_client.describe_transit_gateways(TransitGatewayIds=[tgw_id])
224+
if transit_gateway['TransitGateways'][0]['State'] == state:
225+
is_state=True
226+
break
227+
else:
228+
time.sleep(30)
229+
except:
230+
pass
231+
return is_state
232+
217233
def get_transit_gateway_vpc_attachment(self, attachment_id: str) -> Union[None, Dict]:
218234
try:
219235
aws_res = self.ec2_client.describe_transit_gateway_vpc_attachments(TransitGatewayAttachmentIds=[attachment_id])
220-
if len(aws_res["TransitGateways"]) > 0:
221-
return aws_res["TransitGateways"][0]
236+
if len(aws_res["TransitGatewayVpcAttachments"]) > 0:
237+
return aws_res["TransitGatewayVpcAttachments"][0]
222238
return None
223239
except self.ec2_client.exceptions.ClientError:
224240
return None

test/e2e/tests/test_transitgateway_vpc_attachment.py

Lines changed: 24 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -27,39 +27,44 @@
2727
from e2e.bootstrap_resources import get_bootstrap_resources
2828
from e2e.tests.helper import EC2Validator
2929

30-
REGION = "us-west-2" if environ.get('AWS_DEFAULT_REGION') is None else environ.get('AWS_DEFAULT_REGION')
3130
RESOURCE_PLURAL = "transitgatewayvpcattachments"
3231

3332
CREATE_WAIT_AFTER_SECONDS = 30
34-
DELETE_WAIT_AFTER_SECONDS = 180
35-
MAX_WAIT_FOR_SYNCED_SECONDS = 180
3633
MODIFY_WAIT_AFTER_SECONDS = 30
34+
WAIT_PERIOD = 30
3735

38-
@pytest.fixture(scope="module")
39-
def simple_tgw_attachment(request):
40-
test_resource_values = REPLACEMENT_VALUES.copy()
36+
@pytest.fixture
37+
def simple_tgw_attachment(request, ec2_client):
4138
resource_name = random_suffix_name("tgw-attachment-test", 24)
4239

4340
test_vpc = get_bootstrap_resources().SharedTestVPC
4441
test_tgw = get_bootstrap_resources().TestTransitGateway
42+
43+
tgw_id = test_tgw.transit_gateway_id
44+
45+
ec2_validator = EC2Validator(ec2_client)
46+
is_available = ec2_validator.wait_transit_gateway_state(tgw_id=tgw_id, state='available')
47+
assert is_available
4548

46-
test_resource_values["TGWVA_NAME"] = resource_name
47-
test_resource_values["VPC_ID"] = test_vpc.vpc_id
48-
test_resource_values["TGW_ID"] = test_tgw.transit_gateway_id
49-
test_resource_values["SUBNET_ID"] = test_vpc.public_subnets.subnet_ids[0]
49+
replacements = REPLACEMENT_VALUES.copy()
50+
51+
replacements["TGWVA_NAME"] = resource_name
52+
replacements["VPC_ID"] = test_vpc.vpc_id
53+
replacements["TGW_ID"] = test_tgw.transit_gateway_id
54+
replacements["SUBNET_ID"] = test_vpc.public_subnets.subnet_ids[0]
5055

5156
marker = request.node.get_closest_marker("resource_data")
5257
if marker is not None:
5358
data = marker.args[0]
5459
if 'tag_key' in data:
55-
test_resource_values["TAG_KEY"] = data["tag_key"]
60+
replacements["TAG_KEY"] = data['tag_key']
5661
if 'tag_value' in data:
57-
test_resource_values["TAG_VALUE"] = data["tag_value"]
62+
replacements["TAG_VALUE"] = data['tag_value']
5863

5964
# Load TGW Attachment CR
6065
resource_data = load_ec2_resource(
6166
"transitgateway_vpc_attachment",
62-
additional_replacements=test_resource_values,
67+
additional_replacements=replacements,
6368
)
6469
logging.debug(resource_data)
6570

@@ -89,14 +94,14 @@ def simple_tgw_attachment(request):
8994
class TestTransitGatewayVPCAttachment:
9095

9196
@pytest.mark.resource_data({'tag_key': 'initialtagkey', 'tag_value': 'initialtagvalue'})
92-
def test_crud_tags(self, ec2_client, simple_tgw_attachment):
97+
def test_crud(self, ec2_client, simple_tgw_attachment):
9398
(ref, cr) = simple_tgw_attachment
9499

95100
assert k8s.wait_on_condition(
96101
ref,
97102
"ACK.ResourceSynced",
98103
"True",
99-
wait_periods=MAX_WAIT_FOR_SYNCED_SECONDS,
104+
wait_periods=WAIT_PERIOD,
100105
)
101106

102107
time.sleep(CREATE_WAIT_AFTER_SECONDS)
@@ -143,26 +148,12 @@ def test_crud_tags(self, ec2_client, simple_tgw_attachment):
143148
actual=attachment["Tags"],
144149
)
145150

146-
@pytest.mark.resource_data({'tag_key': 'initialtagkey', 'tag_value': 'initialtagvalue'})
147-
def test_update_options(self, ec2_client, simple_tgw_attachment):
148-
(ref, cr) = simple_tgw_attachment
149-
150-
151-
assert k8s.wait_on_condition(
152-
ref,
153-
"ACK.ResourceSynced",
154-
"True",
155-
wait_periods=MAX_WAIT_FOR_SYNCED_SECONDS,
156-
)
157-
158-
attachment_id = cr["status"]["id"]
159-
160151
# Update options
152+
# dns support is enabled by default
161153
updates = {
162154
"spec": {
163155
"options": {
164156
"dnsSupport": "disable",
165-
"ipv6Support": "enable"
166157
}
167158
}
168159
}
@@ -171,28 +162,13 @@ def test_update_options(self, ec2_client, simple_tgw_attachment):
171162
time.sleep(MODIFY_WAIT_AFTER_SECONDS)
172163

173164
# Check resource synced successfully
174-
assert k8s.wait_on_condition(ref, "ACK.ResourceSynced", "True", wait_periods=5)
165+
assert k8s.wait_on_condition(ref, "ACK.ResourceSynced", "True", wait_periods=WAIT_PERIOD)
175166

176167
# Verify the update in AWS
177168
ec2_validator = EC2Validator(ec2_client)
178169
attachment = ec2_validator.get_transit_gateway_vpc_attachment(attachment_id)
179170

180171
assert attachment["Options"]["DnsSupport"] == "disable"
181-
assert attachment["Options"]["Ipv6Support"] == "enable"
182-
183-
@pytest.mark.resource_data({'tag_key': 'initialtagkey', 'tag_value': 'initialtagvalue'})
184-
def test_update_subnet_ids(self, ec2_client, simple_tgw_attachment):
185-
(ref, cr) = simple_tgw_attachment
186-
187-
188-
assert k8s.wait_on_condition(
189-
ref,
190-
"ACK.ResourceSynced",
191-
"True",
192-
wait_periods=MAX_WAIT_FOR_SYNCED_SECONDS,
193-
)
194-
195-
attachment_id = cr["status"]["id"]
196172

197173
# Update subnet ids
198174
test_vpc = get_bootstrap_resources().SharedTestVPC
@@ -206,10 +182,10 @@ def test_update_subnet_ids(self, ec2_client, simple_tgw_attachment):
206182
time.sleep(MODIFY_WAIT_AFTER_SECONDS)
207183

208184
# Check resource synced successfully
209-
assert k8s.wait_on_condition(ref, "ACK.ResourceSynced", "True", wait_periods=5)
185+
assert k8s.wait_on_condition(ref, "ACK.ResourceSynced", "True", wait_periods=WAIT_PERIOD)
210186

211187
# Verify the update in AWS
212188
ec2_validator = EC2Validator(ec2_client)
213189
attachment = ec2_validator.get_transit_gateway_vpc_attachment(attachment_id)
214190

215-
assert attachment["SubnetIds"] == test_vpc.public_subnets.subnet_ids
191+
assert set(attachment["SubnetIds"]) == set(test_vpc.public_subnets.subnet_ids)

0 commit comments

Comments
 (0)