| 
					
				 | 
			
			
				@@ -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. 
			 |