|
|
|
@ -1077,8 +1077,7 @@ def test_header_matching(gcp, original_backend_service, instance_group, |
|
|
|
|
patch_backend_service(gcp, alternate_backend_service, []) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_circuit_breaking(gcp, original_backend_service, extra_backend_service, |
|
|
|
|
more_extra_backend_service, instance_group, |
|
|
|
|
def test_circuit_breaking(gcp, original_backend_service, instance_group, |
|
|
|
|
same_zone_instance_group): |
|
|
|
|
''' |
|
|
|
|
Since backend service circuit_breakers configuration cannot be unset, |
|
|
|
@ -1107,52 +1106,69 @@ def test_circuit_breaking(gcp, original_backend_service, extra_backend_service, |
|
|
|
|
url_map -> [original_backend_service] |
|
|
|
|
''' |
|
|
|
|
logger.info('Running test_circuit_breaking') |
|
|
|
|
# The config validation for proxyless doesn't allow setting |
|
|
|
|
# circuit_breakers. Disable validate validate_for_proxyless |
|
|
|
|
# for this test. This can be removed when validation |
|
|
|
|
# accepts circuit_breakers. |
|
|
|
|
logger.info('disabling validate_for_proxyless in target proxy') |
|
|
|
|
set_validate_for_proxyless(gcp, False) |
|
|
|
|
extra_backend_service_max_requests = 500 |
|
|
|
|
more_extra_backend_service_max_requests = 1000 |
|
|
|
|
patch_backend_service( |
|
|
|
|
gcp, |
|
|
|
|
extra_backend_service, [instance_group], |
|
|
|
|
circuit_breakers={'maxRequests': extra_backend_service_max_requests}) |
|
|
|
|
logger.info('Waiting for extra backends to become healthy') |
|
|
|
|
wait_for_healthy_backends(gcp, extra_backend_service, instance_group) |
|
|
|
|
patch_backend_service(gcp, |
|
|
|
|
more_extra_backend_service, |
|
|
|
|
[same_zone_instance_group], |
|
|
|
|
circuit_breakers={ |
|
|
|
|
'maxRequests': |
|
|
|
|
more_extra_backend_service_max_requests |
|
|
|
|
}) |
|
|
|
|
logger.info('Waiting for more extra backend to become healthy') |
|
|
|
|
wait_for_healthy_backends(gcp, more_extra_backend_service, |
|
|
|
|
same_zone_instance_group) |
|
|
|
|
extra_backend_instances = get_instance_names(gcp, instance_group) |
|
|
|
|
more_extra_backend_instances = get_instance_names(gcp, |
|
|
|
|
same_zone_instance_group) |
|
|
|
|
route_rules = [ |
|
|
|
|
{ |
|
|
|
|
'priority': 0, |
|
|
|
|
# UnaryCall -> extra_backend_service |
|
|
|
|
'matchRules': [{ |
|
|
|
|
'fullPathMatch': '/grpc.testing.TestService/UnaryCall' |
|
|
|
|
}], |
|
|
|
|
'service': extra_backend_service.url |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
'priority': 1, |
|
|
|
|
# EmptyCall -> more_extra_backend_service |
|
|
|
|
'matchRules': [{ |
|
|
|
|
'fullPathMatch': '/grpc.testing.TestService/EmptyCall' |
|
|
|
|
}], |
|
|
|
|
'service': more_extra_backend_service.url |
|
|
|
|
}, |
|
|
|
|
] |
|
|
|
|
additional_backend_services = [] |
|
|
|
|
try: |
|
|
|
|
# TODO(chengyuanzhang): Dedicated backend services created for circuit |
|
|
|
|
# breaking test. Once the issue for unsetting backend service circuit |
|
|
|
|
# breakers is resolved or configuring backend service circuit breakers is |
|
|
|
|
# enabled for config validation, these dedicated backend services can be |
|
|
|
|
# eliminated. |
|
|
|
|
extra_backend_service_name = _BASE_BACKEND_SERVICE_NAME + '-extra' + gcp_suffix |
|
|
|
|
more_extra_backend_service_name = _BASE_BACKEND_SERVICE_NAME + '-more-extra' + gcp_suffix |
|
|
|
|
extra_backend_service = add_backend_service(gcp, |
|
|
|
|
extra_backend_service_name) |
|
|
|
|
additional_backend_services.append(extra_backend_service) |
|
|
|
|
more_extra_backend_service = add_backend_service( |
|
|
|
|
gcp, more_extra_backend_service_name) |
|
|
|
|
additional_backend_services.append(more_extra_backend_service) |
|
|
|
|
# The config validation for proxyless doesn't allow setting |
|
|
|
|
# circuit_breakers. Disable validate validate_for_proxyless |
|
|
|
|
# for this test. This can be removed when validation |
|
|
|
|
# accepts circuit_breakers. |
|
|
|
|
logger.info('disabling validate_for_proxyless in target proxy') |
|
|
|
|
set_validate_for_proxyless(gcp, False) |
|
|
|
|
extra_backend_service_max_requests = 500 |
|
|
|
|
more_extra_backend_service_max_requests = 1000 |
|
|
|
|
patch_backend_service(gcp, |
|
|
|
|
extra_backend_service, [instance_group], |
|
|
|
|
circuit_breakers={ |
|
|
|
|
'maxRequests': |
|
|
|
|
extra_backend_service_max_requests |
|
|
|
|
}) |
|
|
|
|
logger.info('Waiting for extra backends to become healthy') |
|
|
|
|
wait_for_healthy_backends(gcp, extra_backend_service, instance_group) |
|
|
|
|
patch_backend_service(gcp, |
|
|
|
|
more_extra_backend_service, |
|
|
|
|
[same_zone_instance_group], |
|
|
|
|
circuit_breakers={ |
|
|
|
|
'maxRequests': |
|
|
|
|
more_extra_backend_service_max_requests |
|
|
|
|
}) |
|
|
|
|
logger.info('Waiting for more extra backend to become healthy') |
|
|
|
|
wait_for_healthy_backends(gcp, more_extra_backend_service, |
|
|
|
|
same_zone_instance_group) |
|
|
|
|
extra_backend_instances = get_instance_names(gcp, instance_group) |
|
|
|
|
more_extra_backend_instances = get_instance_names( |
|
|
|
|
gcp, same_zone_instance_group) |
|
|
|
|
route_rules = [ |
|
|
|
|
{ |
|
|
|
|
'priority': 0, |
|
|
|
|
# UnaryCall -> extra_backend_service |
|
|
|
|
'matchRules': [{ |
|
|
|
|
'fullPathMatch': '/grpc.testing.TestService/UnaryCall' |
|
|
|
|
}], |
|
|
|
|
'service': extra_backend_service.url |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
'priority': 1, |
|
|
|
|
# EmptyCall -> more_extra_backend_service |
|
|
|
|
'matchRules': [{ |
|
|
|
|
'fullPathMatch': '/grpc.testing.TestService/EmptyCall' |
|
|
|
|
}], |
|
|
|
|
'service': more_extra_backend_service.url |
|
|
|
|
}, |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
# Make client send UNARY_CALL and EMPTY_CALL. |
|
|
|
|
configure_client([ |
|
|
|
|
messages_pb2.ClientConfigureRequest.RpcType.UNARY_CALL, |
|
|
|
@ -1200,8 +1216,8 @@ def test_circuit_breaking(gcp, original_backend_service, extra_backend_service, |
|
|
|
|
finally: |
|
|
|
|
patch_url_map_backend_service(gcp, original_backend_service) |
|
|
|
|
patch_backend_service(gcp, original_backend_service, [instance_group]) |
|
|
|
|
patch_backend_service(gcp, extra_backend_service, []) |
|
|
|
|
patch_backend_service(gcp, extra_backend_service, []) |
|
|
|
|
for backend_service in additional_backend_services: |
|
|
|
|
delete_backend_service(gcp, backend_service) |
|
|
|
|
set_validate_for_proxyless(gcp, True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1601,16 +1617,19 @@ def delete_url_map(gcp): |
|
|
|
|
logger.info('Delete failed: %s', http_error) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def delete_backend_service(gcp, backend_service): |
|
|
|
|
try: |
|
|
|
|
result = gcp.compute.backendServices().delete( |
|
|
|
|
project=gcp.project, backendService=backend_service.name).execute( |
|
|
|
|
num_retries=_GCP_API_RETRIES) |
|
|
|
|
wait_for_global_operation(gcp, result['name']) |
|
|
|
|
except googleapiclient.errors.HttpError as http_error: |
|
|
|
|
logger.info('Delete failed: %s', http_error) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def delete_backend_services(gcp): |
|
|
|
|
for backend_service in gcp.backend_services: |
|
|
|
|
try: |
|
|
|
|
result = gcp.compute.backendServices().delete( |
|
|
|
|
project=gcp.project, |
|
|
|
|
backendService=backend_service.name).execute( |
|
|
|
|
num_retries=_GCP_API_RETRIES) |
|
|
|
|
wait_for_global_operation(gcp, result['name']) |
|
|
|
|
except googleapiclient.errors.HttpError as http_error: |
|
|
|
|
logger.info('Delete failed: %s', http_error) |
|
|
|
|
delete_backend_service(gcp, backend_service) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def delete_firewall(gcp): |
|
|
|
@ -1935,13 +1954,6 @@ try: |
|
|
|
|
firewall_name = _BASE_FIREWALL_RULE_NAME + gcp_suffix |
|
|
|
|
backend_service_name = _BASE_BACKEND_SERVICE_NAME + gcp_suffix |
|
|
|
|
alternate_backend_service_name = _BASE_BACKEND_SERVICE_NAME + '-alternate' + gcp_suffix |
|
|
|
|
# TODO(chengyuanzhang): Dedicated backend services created for circuit |
|
|
|
|
# breaking test. Other tests should avoid using them. Once the issue |
|
|
|
|
# for unsetting backend service circuit breakers is resolved or |
|
|
|
|
# configuring backend service circuit breakers is enabled for config |
|
|
|
|
# validation, these dedicated backend services can be eliminated. |
|
|
|
|
extra_backend_service_name = _BASE_BACKEND_SERVICE_NAME + '-extra' + gcp_suffix |
|
|
|
|
more_extra_backend_service_name = _BASE_BACKEND_SERVICE_NAME + '-more-extra' + gcp_suffix |
|
|
|
|
url_map_name = _BASE_URL_MAP_NAME + gcp_suffix |
|
|
|
|
service_host_name = _BASE_SERVICE_HOST + gcp_suffix |
|
|
|
|
target_proxy_name = _BASE_TARGET_PROXY_NAME + gcp_suffix |
|
|
|
@ -1963,10 +1975,6 @@ try: |
|
|
|
|
backend_service = get_backend_service(gcp, backend_service_name) |
|
|
|
|
alternate_backend_service = get_backend_service( |
|
|
|
|
gcp, alternate_backend_service_name) |
|
|
|
|
extra_backend_service = get_backend_service(gcp, |
|
|
|
|
extra_backend_service_name) |
|
|
|
|
more_extra_backend_service = get_backend_service( |
|
|
|
|
gcp, more_extra_backend_service_name) |
|
|
|
|
get_url_map(gcp, url_map_name) |
|
|
|
|
get_target_proxy(gcp, target_proxy_name) |
|
|
|
|
get_global_forwarding_rule(gcp, forwarding_rule_name) |
|
|
|
@ -1981,10 +1989,6 @@ try: |
|
|
|
|
backend_service = add_backend_service(gcp, backend_service_name) |
|
|
|
|
alternate_backend_service = add_backend_service( |
|
|
|
|
gcp, alternate_backend_service_name) |
|
|
|
|
extra_backend_service = add_backend_service(gcp, |
|
|
|
|
extra_backend_service_name) |
|
|
|
|
more_extra_backend_service = add_backend_service( |
|
|
|
|
gcp, more_extra_backend_service_name) |
|
|
|
|
create_url_map(gcp, url_map_name, backend_service, service_host_name) |
|
|
|
|
create_target_proxy(gcp, target_proxy_name) |
|
|
|
|
potential_service_ports = list(args.service_port_range) |
|
|
|
@ -2131,10 +2135,7 @@ try: |
|
|
|
|
alternate_backend_service, |
|
|
|
|
same_zone_instance_group) |
|
|
|
|
elif test_case == 'circuit_breaking': |
|
|
|
|
test_circuit_breaking(gcp, backend_service, |
|
|
|
|
extra_backend_service, |
|
|
|
|
more_extra_backend_service, |
|
|
|
|
instance_group, |
|
|
|
|
test_circuit_breaking(gcp, backend_service, instance_group, |
|
|
|
|
same_zone_instance_group) |
|
|
|
|
else: |
|
|
|
|
logger.error('Unknown test case: %s', test_case) |
|
|
|
|