|  | @@ -422,12 +422,13 @@ def _job_kill_handler(job):
 | 
	
		
			
				|  |  |      time.sleep(2)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -def cloud_to_prod_jobspec(language, test_case, docker_image=None, auth=False):
 | 
	
		
			
				|  |  | +def cloud_to_prod_jobspec(language, test_case, server_host_name, 
 | 
	
		
			
				|  |  | +                          server_host_detail, docker_image=None, auth=False):
 | 
	
		
			
				|  |  |    """Creates jobspec for cloud-to-prod interop test"""
 | 
	
		
			
				|  |  |    container_name = None
 | 
	
		
			
				|  |  |    cmdargs = [
 | 
	
		
			
				|  |  | -      '--server_host_override=grpc-test.sandbox.googleapis.com',
 | 
	
		
			
				|  |  | -      '--server_host=grpc-test.sandbox.googleapis.com',
 | 
	
		
			
				|  |  | +      '--server_host=%s' % server_host_detail[0],
 | 
	
		
			
				|  |  | +      '--server_host_override=%s' % server_host_detail[1],
 | 
	
		
			
				|  |  |        '--server_port=443',
 | 
	
		
			
				|  |  |        '--use_tls=true',
 | 
	
		
			
				|  |  |        '--test_case=%s' % test_case]
 | 
	
	
		
			
				|  | @@ -440,7 +441,8 @@ def cloud_to_prod_jobspec(language, test_case, docker_image=None, auth=False):
 | 
	
		
			
				|  |  |    cwd = language.client_cwd
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if docker_image:
 | 
	
		
			
				|  |  | -    container_name = dockerjob.random_name('interop_client_%s' % language.safename)
 | 
	
		
			
				|  |  | +    container_name = dockerjob.random_name('interop_client_%s' % 
 | 
	
		
			
				|  |  | +                                           language.safename)
 | 
	
		
			
				|  |  |      cmdline = docker_run_cmdline(cmdline,
 | 
	
		
			
				|  |  |                                   image=docker_image,
 | 
	
		
			
				|  |  |                                   cwd=cwd,
 | 
	
	
		
			
				|  | @@ -455,7 +457,8 @@ def cloud_to_prod_jobspec(language, test_case, docker_image=None, auth=False):
 | 
	
		
			
				|  |  |            cmdline=cmdline,
 | 
	
		
			
				|  |  |            cwd=cwd,
 | 
	
		
			
				|  |  |            environ=environ,
 | 
	
		
			
				|  |  | -          shortname='%s:%s:%s' % (suite_name, language, test_case),
 | 
	
		
			
				|  |  | +          shortname='%s:%s:%s:%s' % (suite_name, server_host_name, language, 
 | 
	
		
			
				|  |  | +                                     test_case),
 | 
	
		
			
				|  |  |            timeout_seconds=90,
 | 
	
		
			
				|  |  |            flake_retries=5 if args.allow_flakes else 0,
 | 
	
		
			
				|  |  |            timeout_retries=2 if args.allow_flakes else 0,
 | 
	
	
		
			
				|  | @@ -491,7 +494,7 @@ def cloud_to_cloud_jobspec(language, test_case, server_name, server_host,
 | 
	
		
			
				|  |  |            cwd=cwd,
 | 
	
		
			
				|  |  |            environ=environ,
 | 
	
		
			
				|  |  |            shortname='cloud_to_cloud:%s:%s_server:%s' % (language, server_name,
 | 
	
		
			
				|  |  | -                                                 test_case),
 | 
	
		
			
				|  |  | +                                                        test_case),
 | 
	
		
			
				|  |  |            timeout_seconds=90,
 | 
	
		
			
				|  |  |            flake_retries=5 if args.allow_flakes else 0,
 | 
	
		
			
				|  |  |            timeout_retries=2 if args.allow_flakes else 0,
 | 
	
	
		
			
				|  | @@ -572,6 +575,21 @@ def aggregate_http2_results(stdout):
 | 
	
		
			
				|  |  |      'percent': 1.0 * passed / (passed + failed)
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +# A dictionary of prod servers to test. 
 | 
	
		
			
				|  |  | +# Format: server_name: (server_host, server_host_override, errors_allowed)
 | 
	
		
			
				|  |  | +# TODO(adelez): implement logic for errors_allowed where if the indicated tests
 | 
	
		
			
				|  |  | +# fail, they don't impact the overall test result.
 | 
	
		
			
				|  |  | +prod_servers = {
 | 
	
		
			
				|  |  | +    'default': ('grpc-test.sandbox.googleapis.com', 
 | 
	
		
			
				|  |  | +                'grpc-test.sandbox.googleapis.com', False),
 | 
	
		
			
				|  |  | +    'gateway_v2': ('grpc-test2.sandbox.googleapis.com', 
 | 
	
		
			
				|  |  | +                   'grpc-test2.sandbox.googleapis.com', True),
 | 
	
		
			
				|  |  | +    'cloud_gateway': ('216.239.32.255', 'grpc-test.sandbox.googleapis.com', 
 | 
	
		
			
				|  |  | +                      False),
 | 
	
		
			
				|  |  | +    'cloud_gateway_v2': ('216.239.32.255', 'grpc-test2.sandbox.googleapis.com', 
 | 
	
		
			
				|  |  | +                         True)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  argp = argparse.ArgumentParser(description='Run interop tests.')
 | 
	
		
			
				|  |  |  argp.add_argument('-l', '--language',
 | 
	
		
			
				|  |  |                    choices=['all'] + sorted(_LANGUAGES),
 | 
	
	
		
			
				|  | @@ -589,6 +607,12 @@ argp.add_argument('--cloud_to_prod_auth',
 | 
	
		
			
				|  |  |                    action='store_const',
 | 
	
		
			
				|  |  |                    const=True,
 | 
	
		
			
				|  |  |                    help='Run cloud_to_prod_auth tests.')
 | 
	
		
			
				|  |  | +argp.add_argument('--prod_servers',
 | 
	
		
			
				|  |  | +                  choices=prod_servers.keys(),
 | 
	
		
			
				|  |  | +                  default=['default'],
 | 
	
		
			
				|  |  | +                  nargs='+',
 | 
	
		
			
				|  |  | +                  help=('The servers to run cloud_to_prod and '
 | 
	
		
			
				|  |  | +                        'cloud_to_prod_auth tests against.'))
 | 
	
		
			
				|  |  |  argp.add_argument('-s', '--server',
 | 
	
		
			
				|  |  |                    choices=['all'] + sorted(_SERVERS),
 | 
	
		
			
				|  |  |                    action='append',
 | 
	
	
		
			
				|  | @@ -688,32 +712,37 @@ try:
 | 
	
		
			
				|  |  |      server_jobs[lang] = job
 | 
	
		
			
				|  |  |      server_addresses[lang] = ('localhost', job.mapped_port(_DEFAULT_SERVER_PORT))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    jobs = []
 | 
	
		
			
				|  |  |    if args.cloud_to_prod:
 | 
	
		
			
				|  |  | -    for language in languages:
 | 
	
		
			
				|  |  | -      for test_case in _TEST_CASES:
 | 
	
		
			
				|  |  | -        if not test_case in language.unimplemented_test_cases():
 | 
	
		
			
				|  |  | -          if not test_case in _SKIP_ADVANCED + _SKIP_COMPRESSION:
 | 
	
		
			
				|  |  | -            test_job = cloud_to_prod_jobspec(language, test_case,
 | 
	
		
			
				|  |  | -                                             docker_image=docker_images.get(str(language)))
 | 
	
		
			
				|  |  | -            jobs.append(test_job)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if args.http2_interop:
 | 
	
		
			
				|  |  | -      for test_case in _HTTP2_TEST_CASES:
 | 
	
		
			
				|  |  | -        test_job = cloud_to_prod_jobspec(http2Interop, test_case,
 | 
	
		
			
				|  |  | -                                         docker_image=docker_images.get(str(http2Interop)))
 | 
	
		
			
				|  |  | -        jobs.append(test_job)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +    for server_host_name in args.prod_servers:
 | 
	
		
			
				|  |  | +      for language in languages:
 | 
	
		
			
				|  |  | +        for test_case in _TEST_CASES:
 | 
	
		
			
				|  |  | +          if not test_case in language.unimplemented_test_cases():
 | 
	
		
			
				|  |  | +            if not test_case in _SKIP_ADVANCED + _SKIP_COMPRESSION:
 | 
	
		
			
				|  |  | +              test_job = cloud_to_prod_jobspec(
 | 
	
		
			
				|  |  | +                  language, test_case, server_host_name, 
 | 
	
		
			
				|  |  | +                  prod_servers[server_host_name],
 | 
	
		
			
				|  |  | +                  docker_image=docker_images.get(str(language)))
 | 
	
		
			
				|  |  | +              jobs.append(test_job)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      if args.http2_interop:
 | 
	
		
			
				|  |  | +        for test_case in _HTTP2_TEST_CASES:
 | 
	
		
			
				|  |  | +          test_job = cloud_to_prod_jobspec(
 | 
	
		
			
				|  |  | +              http2Interop, test_case, server_host_name, 
 | 
	
		
			
				|  |  | +              prod_servers[server_host_name],
 | 
	
		
			
				|  |  | +              docker_image=docker_images.get(str(http2Interop)))
 | 
	
		
			
				|  |  | +          jobs.append(test_job)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if args.cloud_to_prod_auth:
 | 
	
		
			
				|  |  | -    for language in languages:
 | 
	
		
			
				|  |  | -      for test_case in _AUTH_TEST_CASES:
 | 
	
		
			
				|  |  | -        if not test_case in language.unimplemented_test_cases():
 | 
	
		
			
				|  |  | -          test_job = cloud_to_prod_jobspec(language, test_case,
 | 
	
		
			
				|  |  | -                                           docker_image=docker_images.get(str(language)),
 | 
	
		
			
				|  |  | -                                           auth=True)
 | 
	
		
			
				|  |  | -          jobs.append(test_job)
 | 
	
		
			
				|  |  | +    for server_host_name in args.prod_servers:
 | 
	
		
			
				|  |  | +      for language in languages:
 | 
	
		
			
				|  |  | +        for test_case in _AUTH_TEST_CASES:
 | 
	
		
			
				|  |  | +          if not test_case in language.unimplemented_test_cases():
 | 
	
		
			
				|  |  | +            test_job = cloud_to_prod_jobspec(
 | 
	
		
			
				|  |  | +                language, test_case, server_host_name, 
 | 
	
		
			
				|  |  | +                prod_servers[server_host_name],
 | 
	
		
			
				|  |  | +                docker_image=docker_images.get(str(language)), auth=True)
 | 
	
		
			
				|  |  | +            jobs.append(test_job)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    for server in args.override_server:
 | 
	
		
			
				|  |  |      server_name = server[0]
 | 
	
	
		
			
				|  | @@ -773,7 +802,8 @@ try:
 | 
	
		
			
				|  |  |    report_utils.render_interop_html_report(
 | 
	
		
			
				|  |  |        set([str(l) for l in languages]), servers, _TEST_CASES, _AUTH_TEST_CASES,
 | 
	
		
			
				|  |  |        _HTTP2_TEST_CASES, resultset, num_failures,
 | 
	
		
			
				|  |  | -      args.cloud_to_prod_auth or args.cloud_to_prod, args.http2_interop)
 | 
	
		
			
				|  |  | +      args.cloud_to_prod_auth or args.cloud_to_prod, args.prod_servers, 
 | 
	
		
			
				|  |  | +      args.http2_interop)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  finally:
 | 
	
		
			
				|  |  |    # Check if servers are still running.
 |