Skip to content

Commit 0464d2b

Browse files
authored
Discard changes to test/e2e/tests/test_vpc_peering_connection.py
1 parent 1fe9231 commit 0464d2b

File tree

1 file changed

+225
-27
lines changed

1 file changed

+225
-27
lines changed

test/e2e/tests/test_vpc_peering_connection.py

Lines changed: 225 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import pytest
21
import time
32
import logging
3+
import pytest
4+
import boto3
45

56
from acktest import tags
67
from acktest.resources import random_suffix_name
@@ -17,9 +18,13 @@
1718
DELETE_WAIT_AFTER_SECONDS = 10
1819
MODIFY_WAIT_AFTER_SECONDS = 5
1920
DEFAULT_WAIT_AFTER_SECONDS = 5
21+
PATCH_WAIT_AFTER_SECONDS = 30
2022

2123
@pytest.fixture
2224
def simple_vpc_peering_connection(request):
25+
'''
26+
Fixture for creating a Peering Connection using 'VPCID' and 'PeerVPCID'
27+
'''
2328
resource_name = random_suffix_name("simple-vpc-peering-connection-test", 40)
2429
resources = get_bootstrap_resources()
2530

@@ -29,11 +34,11 @@ def simple_vpc_peering_connection(request):
2934
replacements = REPLACEMENT_VALUES.copy()
3035
replacements["VPC_NAME"] = resource_name
3136
replacements["CIDR_BLOCK"] = "10.1.0.0/16"
32-
replacements["ENABLE_DNS_SUPPORT"] = "False"
33-
replacements["ENABLE_DNS_HOSTNAMES"] = "False"
37+
replacements["ENABLE_DNS_SUPPORT"] = "True"
38+
replacements["ENABLE_DNS_HOSTNAMES"] = "True"
3439
replacements["TAG_KEY"] = "initialtagkey"
3540
replacements["TAG_VALUE"] = "initialtagvalue"
36-
41+
3742
marker = request.node.get_closest_marker("resource_data")
3843
if marker is not None:
3944
data = marker.args[0]
@@ -62,7 +67,6 @@ def simple_vpc_peering_connection(request):
6267
assert k8s.get_resource_exists(vpc_ref)
6368

6469
# Create the VPC Peering Connection
65-
6670
# Replacements for VPC Peering Connection
6771
replacements["VPC_PEERING_CONNECTION_NAME"] = resource_name
6872
replacements["VPC_ID"] = resources.SharedTestVPC.vpc_id
@@ -89,11 +93,11 @@ def simple_vpc_peering_connection(request):
8993
wait_for_vpc_peering_connection_status(ref)
9094
# Get the CR again after waiting for the Status to be updated
9195
cr = k8s.wait_resource_consumed_by_controller(ref)
92-
assert cr["status"]["status"]["code"] == "active"
96+
assert cr["status"]["status"]["code"] == "active"
9397

9498
yield (ref, cr)
9599

96-
# Delete VPC Peering Connection k8s resource
100+
# Delete VPC Peering Connection k8s resource
97101
try:
98102
_, deleted = k8s.delete_custom_resource(ref, 3, 10)
99103
assert deleted
@@ -102,12 +106,15 @@ def simple_vpc_peering_connection(request):
102106

103107
time.sleep(DELETE_WAIT_AFTER_SECONDS)
104108

105-
# Delete VPC resource
109+
# Delete VPC resource
106110
_, vpc_deleted = k8s.delete_custom_resource(vpc_ref, 3, 10)
107111
assert vpc_deleted is True
108112

109113
@pytest.fixture
110114
def ref_vpc_peering_connection(request):
115+
'''
116+
Fixture for creating a Peering Connection using 'VPCRef' and 'PeerVPCRef'
117+
'''
111118
resource_name = random_suffix_name("ref-vpc-peering-connection-test", 40)
112119

113120
# Create 2 VPCs with ACK to test Peering with and refer to them by their k8s resource name
@@ -116,11 +123,9 @@ def ref_vpc_peering_connection(request):
116123
replacements = REPLACEMENT_VALUES.copy()
117124
replacements["VPC_NAME"] = resource_name + "-1"
118125
replacements["CIDR_BLOCK"] = "10.0.0.0/16"
119-
replacements["ENABLE_DNS_SUPPORT"] = "False"
120-
replacements["ENABLE_DNS_HOSTNAMES"] = "False"
121-
replacements["TAG_KEY"] = "initialtagkey"
122-
replacements["TAG_VALUE"] = "initialtagvalue"
123-
126+
replacements["ENABLE_DNS_SUPPORT"] = "True"
127+
replacements["ENABLE_DNS_HOSTNAMES"] = "True"
128+
124129
# Load VPC CR
125130
vpc_1_resource_data = load_ec2_resource(
126131
"vpc",
@@ -143,7 +148,7 @@ def ref_vpc_peering_connection(request):
143148
# Replacements for Test VPC 2 (squashes previous values used by VPC 1)
144149
replacements["VPC_NAME"] = resource_name + "-2"
145150
replacements["CIDR_BLOCK"] = "10.1.0.0/16"
146-
151+
147152
# Load VPC CR
148153
vpc_2_resource_data = load_ec2_resource(
149154
"vpc",
@@ -189,13 +194,115 @@ def ref_vpc_peering_connection(request):
189194
assert cr is not None
190195
assert k8s.get_resource_exists(ref)
191196
wait_for_vpc_peering_connection_status(ref)
192-
# Get the CR again after waiting for the Status to be updated
197+
198+
yield (ref, cr)
199+
200+
# Delete VPC Peering Connection k8s resource
201+
try:
202+
_, deleted = k8s.delete_custom_resource(ref, 3, 10)
203+
assert deleted
204+
except:
205+
pass
206+
207+
time.sleep(DELETE_WAIT_AFTER_SECONDS)
208+
209+
# Delete 2 x VPC resources
210+
try:
211+
_, vpc_1_deleted = k8s.delete_custom_resource(vpc_1_ref, 3, 10)
212+
_, vpc_2_deleted = k8s.delete_custom_resource(vpc_2_ref, 3, 10)
213+
assert vpc_1_deleted is True
214+
assert vpc_2_deleted is True
215+
except:
216+
pass
217+
218+
@pytest.fixture
219+
def peering_options_vpc_peering_connection(request):
220+
'''
221+
Fixture for creating a Peering Connection with Peering Options set to True
222+
'''
223+
resource_name = random_suffix_name("peering-options-vpc-p-c-test", 40)
224+
225+
# Create 2 VPCs with ACK to test Peering with and refer to them by their k8s resource name
226+
227+
# Replacements for Test VPC 1
228+
replacements = REPLACEMENT_VALUES.copy()
229+
replacements["VPC_NAME"] = resource_name + "-1"
230+
replacements["CIDR_BLOCK"] = "10.0.0.0/16"
231+
replacements["ENABLE_DNS_SUPPORT"] = "True"
232+
replacements["ENABLE_DNS_HOSTNAMES"] = "True"
233+
234+
# Load VPC CR
235+
vpc_1_resource_data = load_ec2_resource(
236+
"vpc",
237+
additional_replacements=replacements,
238+
)
239+
logging.debug(vpc_1_resource_data)
240+
241+
# Create k8s resource
242+
vpc_1_ref = k8s.CustomResourceReference(
243+
CRD_GROUP, CRD_VERSION, VPC_RESOURCE_PLURAL,
244+
replacements["VPC_NAME"], namespace="default",
245+
)
246+
k8s.create_custom_resource(vpc_1_ref, vpc_1_resource_data)
247+
time.sleep(CREATE_WAIT_AFTER_SECONDS)
248+
249+
vpc_1_cr = k8s.wait_resource_consumed_by_controller(vpc_1_ref)
250+
assert vpc_1_cr is not None
251+
assert k8s.get_resource_exists(vpc_1_ref)
252+
253+
# Replacements for Test VPC 2 (squashes previous values used by VPC 1)
254+
replacements["VPC_NAME"] = resource_name + "-2"
255+
replacements["CIDR_BLOCK"] = "10.1.0.0/16"
256+
257+
# Load VPC CR
258+
vpc_2_resource_data = load_ec2_resource(
259+
"vpc",
260+
additional_replacements=replacements,
261+
)
262+
logging.debug(vpc_2_resource_data)
263+
264+
# Create k8s resource
265+
vpc_2_ref = k8s.CustomResourceReference(
266+
CRD_GROUP, CRD_VERSION, VPC_RESOURCE_PLURAL,
267+
replacements["VPC_NAME"], namespace="default",
268+
)
269+
k8s.create_custom_resource(vpc_2_ref, vpc_2_resource_data)
270+
time.sleep(CREATE_WAIT_AFTER_SECONDS)
271+
272+
vpc_2_cr = k8s.wait_resource_consumed_by_controller(vpc_2_ref)
273+
assert vpc_2_cr is not None
274+
assert k8s.get_resource_exists(vpc_2_ref)
275+
276+
# Create the VPC Peering Connection
277+
278+
# Replacements for VPC Peering Connection
279+
replacements["VPC_PEERING_CONNECTION_NAME"] = resource_name
280+
replacements["VPC_ID"] = vpc_1_cr["status"]["vpcID"]
281+
replacements["PEER_VPC_ID"] = vpc_2_cr["status"]["vpcID"]
282+
283+
# Load VPCPeeringConnection CR
284+
resource_data = load_ec2_resource(
285+
"vpc_peering_connection_peering_options",
286+
additional_replacements=replacements,
287+
)
288+
logging.debug(resource_data)
289+
290+
# Create k8s resource
291+
ref = k8s.CustomResourceReference(
292+
CRD_GROUP, CRD_VERSION, RESOURCE_PLURAL,
293+
resource_name, namespace="default",
294+
)
295+
k8s.create_custom_resource(ref, resource_data)
296+
time.sleep(CREATE_WAIT_AFTER_SECONDS)
297+
193298
cr = k8s.wait_resource_consumed_by_controller(ref)
194-
assert cr["status"]["status"]["code"] == "active"
299+
assert cr is not None
300+
assert k8s.get_resource_exists(ref)
301+
wait_for_vpc_peering_connection_status(ref)
195302

196303
yield (ref, cr)
197304

198-
# Delete VPC Peering Connection k8s resource
305+
# Delete VPC Peering Connection k8s resource
199306
try:
200307
_, deleted = k8s.delete_custom_resource(ref, 3, 10)
201308
assert deleted
@@ -205,30 +312,61 @@ def ref_vpc_peering_connection(request):
205312
time.sleep(DELETE_WAIT_AFTER_SECONDS)
206313

207314
# Delete 2 x VPC resources
208-
try:
315+
try:
209316
_, vpc_1_deleted = k8s.delete_custom_resource(vpc_1_ref, 3, 10)
210317
_, vpc_2_deleted = k8s.delete_custom_resource(vpc_2_ref, 3, 10)
211318
assert vpc_1_deleted is True
212319
assert vpc_2_deleted is True
213320
except:
214321
pass
215322

216-
def wait_for_vpc_peering_connection_status(ref, timeout_seconds=120):
323+
def wait_for_vpc_peering_connection_status(ref, timeout_seconds=300):
324+
'''
325+
Loops until the VPC Peering Connection's Status Code is 'active'
326+
'''
217327
start_time = time.time()
218328
while time.time() - start_time < timeout_seconds:
219-
resource = k8s.wait_resource_consumed_by_controller(ref)
220-
print("CR contents", resource)
221-
if resource["status"]["status"]["code"] == "active":
222-
logging.debug("VPC Peering Connection Status Code is 'active'", resource)
223-
return resource
329+
k8s_resource = k8s.wait_resource_consumed_by_controller(ref)
330+
if k8s_resource["status"]["status"]["code"] == "active":
331+
logging.debug("VPC Peering Connection Status Code is 'active'", k8s_resource)
332+
return k8s_resource
224333
time.sleep(5)
225-
print("CR contents", resource)
226-
raise TimeoutError(f"Timed out waiting for VPC Peering Connection status to become 'active'", "Current status code", resource["status"]["status"]["code"])
334+
335+
# Fallback to AWS API if K8s resource status is not being updated (To be removed once k8s resource's status updates normally)
336+
c = boto3.client('ec2')
337+
aws_resource = c.describe_vpc_peering_connections(VpcPeeringConnectionIds=[k8s_resource["status"]["vpcPeeringConnectionID"]])
338+
if aws_resource["VpcPeeringConnections"][0]["Status"]["Code"] == "active":
339+
logging.debug("VPC Peering Connection Status Code is 'active' (fallback to AWS API)", k8s_resource, "AWS resource", aws_resource)
340+
return k8s_resource
341+
342+
# Both options timed out
343+
raise TimeoutError("Timed out waiting for VPC Peering Connection status to become 'active'",
344+
"Current status code", k8s_resource["status"]["status"]["code"])
345+
346+
def wait_for_vpc_peering_connection_peering_options(ec2_client, boolean, vpc_peering_connection_id, timeout_seconds=300):
347+
'''
348+
Loops until the VPC Peering Connection's Peering Options are set to the provided boolean value
349+
'''
350+
start_time = time.time()
351+
ec2_validator = EC2Validator(ec2_client)
352+
while time.time() - start_time < timeout_seconds:
353+
aws_resource = ec2_validator.get_vpc_peering_connection(vpc_peering_connection_id)
354+
if (aws_resource['AccepterVpcInfo']['PeeringOptions']['AllowDnsResolutionFromRemoteVpc'] == boolean and
355+
aws_resource['RequesterVpcInfo']['PeeringOptions']['AllowDnsResolutionFromRemoteVpc'] == boolean):
356+
logging.debug("VPC Peering Connection Peering Options are " + str(boolean), aws_resource)
357+
return aws_resource
358+
time.sleep(5)
359+
raise TimeoutError("Timed out waiting for VPC Peering Connection Peering Options to become " + str(boolean),
360+
"Current values are", aws_resource['AccepterVpcInfo']['PeeringOptions']['AllowDnsResolutionFromRemoteVpc'],
361+
"and", aws_resource['RequesterVpcInfo']['PeeringOptions']['AllowDnsResolutionFromRemoteVpc'])
227362

228363
@service_marker
229364
@pytest.mark.canary
230365
class TestVPCPeeringConnections:
231366
def test_create_delete_ref(self, ec2_client, ref_vpc_peering_connection):
367+
'''
368+
Creates a Peering Connection using 'VPCRef' and 'PeerVPCRef'
369+
'''
232370
(ref, cr) = ref_vpc_peering_connection
233371
vpc_peering_connection_id = cr["status"]["vpcPeeringConnectionID"]
234372

@@ -246,6 +384,9 @@ def test_create_delete_ref(self, ec2_client, ref_vpc_peering_connection):
246384
ec2_validator.assert_vpc_peering_connection(vpc_peering_connection_id, exists=False)
247385

248386
def test_create_delete(self, ec2_client, simple_vpc_peering_connection):
387+
'''
388+
Creates a Peering Connection using 'VPCID' and 'PeerVPCID' and 'Tags'
389+
'''
249390
(ref, cr) = simple_vpc_peering_connection
250391
vpc_peering_connection_id = cr["status"]["vpcPeeringConnectionID"]
251392

@@ -263,6 +404,9 @@ def test_create_delete(self, ec2_client, simple_vpc_peering_connection):
263404
ec2_validator.assert_vpc_peering_connection(vpc_peering_connection_id, exists=False)
264405

265406
def test_crud_tags(self, ec2_client, simple_vpc_peering_connection):
407+
'''
408+
Creates a Peering Connection with a set of 'Tags', then updates them
409+
'''
266410
(ref, cr) = simple_vpc_peering_connection
267411

268412
resource = k8s.get_resource(ref)
@@ -286,7 +430,7 @@ def test_crud_tags(self, ec2_client, simple_vpc_peering_connection):
286430
expected=user_tags,
287431
actual=vpc_peering_connection["Tags"],
288432
)
289-
433+
290434
# Update tags
291435
update_tags = [
292436
{
@@ -355,3 +499,57 @@ def test_crud_tags(self, ec2_client, simple_vpc_peering_connection):
355499
# Check VPC Peering Connection no longer exists in AWS
356500
ec2_validator.assert_vpc_peering_connection(resource_id, exists=False)
357501

502+
def test_update_peering_options(self, ec2_client, peering_options_vpc_peering_connection):
503+
'''
504+
Creates a Peering Connection with Peering Options set to True, it then updates them to False
505+
'''
506+
(ref, cr) = peering_options_vpc_peering_connection
507+
vpc_peering_connection_id = cr["status"]["vpcPeeringConnectionID"]
508+
509+
# Check VPC Peering Connection exists
510+
ec2_validator = EC2Validator(ec2_client)
511+
ec2_validator.assert_vpc_peering_connection(vpc_peering_connection_id)
512+
513+
# Check resource synced successfully, after waiting for requeue after Patch Peering Options to True
514+
time.sleep(PATCH_WAIT_AFTER_SECONDS)
515+
assert k8s.wait_on_condition(ref, "ACK.ResourceSynced", "True", wait_periods=5)
516+
517+
# Check Peering Options in AWS
518+
aws_res = wait_for_vpc_peering_connection_peering_options(ec2_client, True, vpc_peering_connection_id)
519+
assert aws_res['AccepterVpcInfo']['PeeringOptions']['AllowDnsResolutionFromRemoteVpc'] is True
520+
assert aws_res['RequesterVpcInfo']['PeeringOptions']['AllowDnsResolutionFromRemoteVpc'] is True
521+
522+
# Payload used to update the VPC Peering Connection
523+
update_peering_options_payload = {
524+
"spec": {
525+
"requesterPeeringConnectionOptions": {
526+
"allowDNSResolutionFromRemoteVPC": False,
527+
},
528+
"accepterPeeringConnectionOptions": {
529+
"allowDNSResolutionFromRemoteVPC": False,
530+
},
531+
},
532+
}
533+
534+
# Patch the VPCPeeringConnection with the payload
535+
k8s.patch_custom_resource(ref, update_peering_options_payload)
536+
time.sleep(MODIFY_WAIT_AFTER_SECONDS)
537+
538+
# Check resource synced successfully
539+
assert k8s.wait_on_condition(ref, "ACK.ResourceSynced", "True", wait_periods=5)
540+
541+
# Check for updated peering options
542+
latest_aws_res = wait_for_vpc_peering_connection_peering_options(ec2_client, False, vpc_peering_connection_id)
543+
assert latest_aws_res['AccepterVpcInfo']['PeeringOptions']['AllowDnsResolutionFromRemoteVpc'] is False
544+
assert latest_aws_res['RequesterVpcInfo']['PeeringOptions']['AllowDnsResolutionFromRemoteVpc'] is False
545+
546+
# Delete k8s resource
547+
try:
548+
_, deleted = k8s.delete_custom_resource(ref, 3, 10)
549+
assert deleted
550+
except:
551+
pass
552+
time.sleep(DELETE_WAIT_AFTER_SECONDS)
553+
554+
# Check VPC Peering Connection no longer exists in AWS
555+
ec2_validator.assert_vpc_peering_connection(vpc_peering_connection_id, exists=False)

0 commit comments

Comments
 (0)