|  | @@ -169,8 +169,8 @@ class Http2Client:
 | 
	
		
			
				|  |  |      self.client_cwd = None
 | 
	
		
			
				|  |  |      self.safename = str(self)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  def client_args(self):
 | 
	
		
			
				|  |  | -    return ['tools/http2_interop/http2_interop.test']
 | 
	
		
			
				|  |  | +  def client_cmd(self, args):
 | 
	
		
			
				|  |  | +    return ['tools/http2_interop/http2_interop.test', '-test.v'] + args
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    def cloud_to_prod_env(self):
 | 
	
		
			
				|  |  |      return {}
 | 
	
	
		
			
				|  | @@ -349,12 +349,12 @@ def bash_login_cmdline(cmdline):
 | 
	
		
			
				|  |  |    return ['bash', '-l', '-c', ' '.join(cmdline)]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -def add_auth_options(language, test_case, cmdline, env):
 | 
	
		
			
				|  |  | +def auth_options(language, test_case):
 | 
	
		
			
				|  |  |    """Returns (cmdline, env) tuple with cloud_to_prod_auth test options."""
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    language = str(language)
 | 
	
		
			
				|  |  | -  cmdline = list(cmdline)
 | 
	
		
			
				|  |  | -  env = env.copy()
 | 
	
		
			
				|  |  | +  cmdargs = []
 | 
	
		
			
				|  |  | +  env = {}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    # TODO(jtattermusch): this file path only works inside docker
 | 
	
		
			
				|  |  |    key_filepath = '/root/service_account/stubbyCloudTestingTest-ee3fce360ac5.json'
 | 
	
	
		
			
				|  | @@ -366,19 +366,19 @@ def add_auth_options(language, test_case, cmdline, env):
 | 
	
		
			
				|  |  |      if language in ['csharp', 'node', 'php', 'python', 'ruby']:
 | 
	
		
			
				|  |  |        env['GOOGLE_APPLICATION_CREDENTIALS'] = key_filepath
 | 
	
		
			
				|  |  |      else:
 | 
	
		
			
				|  |  | -      cmdline += [key_file_arg]
 | 
	
		
			
				|  |  | +      cmdargs += [key_file_arg]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if test_case in ['per_rpc_creds', 'oauth2_auth_token']:
 | 
	
		
			
				|  |  | -    cmdline += [oauth_scope_arg]
 | 
	
		
			
				|  |  | +    cmdargs += [oauth_scope_arg]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if test_case == 'oauth2_auth_token' and language == 'c++':
 | 
	
		
			
				|  |  |      # C++ oauth2 test uses GCE creds and thus needs to know the default account
 | 
	
		
			
				|  |  | -    cmdline += [default_account_arg]
 | 
	
		
			
				|  |  | +    cmdargs += [default_account_arg]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if test_case == 'compute_engine_creds':
 | 
	
		
			
				|  |  | -    cmdline += [oauth_scope_arg, default_account_arg]
 | 
	
		
			
				|  |  | +    cmdargs += [oauth_scope_arg, default_account_arg]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  return (cmdline, env)
 | 
	
		
			
				|  |  | +  return (cmdargs, env)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  def _job_kill_handler(job):
 | 
	
	
		
			
				|  | @@ -393,18 +393,20 @@ def _job_kill_handler(job):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  def cloud_to_prod_jobspec(language, test_case, docker_image=None, auth=False):
 | 
	
		
			
				|  |  |    """Creates jobspec for cloud-to-prod interop test"""
 | 
	
		
			
				|  |  | -  cmdline = language.client_cmd([
 | 
	
		
			
				|  |  | +  container_name = None
 | 
	
		
			
				|  |  | +  cmdargs = [
 | 
	
		
			
				|  |  |        '--server_host_override=grpc-test.sandbox.google.com',
 | 
	
		
			
				|  |  |        '--server_host=grpc-test.sandbox.google.com',
 | 
	
		
			
				|  |  |        '--server_port=443',
 | 
	
		
			
				|  |  |        '--use_tls=true',
 | 
	
		
			
				|  |  | -      '--test_case=%s' % test_case])
 | 
	
		
			
				|  |  | -  cwd = language.client_cwd
 | 
	
		
			
				|  |  | +      '--test_case=%s' % test_case]
 | 
	
		
			
				|  |  |    environ = dict(language.cloud_to_prod_env(), **language.global_env())
 | 
	
		
			
				|  |  | -  container_name = None
 | 
	
		
			
				|  |  |    if auth:
 | 
	
		
			
				|  |  | -    cmdline, environ = add_auth_options(language, test_case, cmdline, environ)
 | 
	
		
			
				|  |  | -  cmdline = bash_login_cmdline(cmdline)
 | 
	
		
			
				|  |  | +    auth_cmdargs, auth_env = auth_options(language, test_case)
 | 
	
		
			
				|  |  | +    cmdargs += auth_cmdargs
 | 
	
		
			
				|  |  | +    environ.update(auth_env)
 | 
	
		
			
				|  |  | +  cmdline = bash_login_cmdline(language.client_cmd(cmdargs))
 | 
	
		
			
				|  |  | +  cwd = language.client_cwd
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if docker_image:
 | 
	
		
			
				|  |  |      container_name = dockerjob.random_name('interop_client_%s' % language.safename)
 | 
	
	
		
			
				|  | @@ -562,7 +564,7 @@ argp.add_argument('--http2_interop',
 | 
	
		
			
				|  |  |                    action='store_const',
 | 
	
		
			
				|  |  |                    const=True,
 | 
	
		
			
				|  |  |                    help='Enable HTTP/2 interop tests')
 | 
	
		
			
				|  |  | -                  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  args = argp.parse_args()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  servers = set(s for s in itertools.chain.from_iterable(_SERVERS
 | 
	
	
		
			
				|  | @@ -586,7 +588,7 @@ languages = set(_LANGUAGES[l]
 | 
	
		
			
				|  |  |                  for l in itertools.chain.from_iterable(
 | 
	
		
			
				|  |  |                        _LANGUAGES.iterkeys() if x == 'all' else [x]
 | 
	
		
			
				|  |  |                        for x in args.language))
 | 
	
		
			
				|  |  | -                      
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  http2Interop = Http2Client() if args.http2_interop else None
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  docker_images={}
 | 
	
	
		
			
				|  | @@ -608,10 +610,10 @@ if args.use_docker:
 | 
	
		
			
				|  |  |      num_failures, _ = jobset.run(
 | 
	
		
			
				|  |  |          build_jobs, newline_on_success=True, maxjobs=args.jobs)
 | 
	
		
			
				|  |  |      if num_failures == 0:
 | 
	
		
			
				|  |  | -      jobset.message('SUCCESS', 'All docker images built successfully.', 
 | 
	
		
			
				|  |  | +      jobset.message('SUCCESS', 'All docker images built successfully.',
 | 
	
		
			
				|  |  |                       do_newline=True)
 | 
	
		
			
				|  |  |      else:
 | 
	
		
			
				|  |  | -      jobset.message('FAILED', 'Failed to build interop docker images.', 
 | 
	
		
			
				|  |  | +      jobset.message('FAILED', 'Failed to build interop docker images.',
 | 
	
		
			
				|  |  |                       do_newline=True)
 | 
	
		
			
				|  |  |        for image in docker_images.itervalues():
 | 
	
		
			
				|  |  |          dockerjob.remove_image(image, skip_nonexistent=True)
 | 
	
	
		
			
				|  | @@ -637,7 +639,7 @@ try:
 | 
	
		
			
				|  |  |            test_job = cloud_to_prod_jobspec(language, test_case,
 | 
	
		
			
				|  |  |                                             docker_image=docker_images.get(str(language)))
 | 
	
		
			
				|  |  |            jobs.append(test_job)
 | 
	
		
			
				|  |  | -          
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      # TODO(carl-mastrangelo): Currently prod TLS terminators aren't spec compliant. Reenable
 | 
	
		
			
				|  |  |      # this once a better solution is in place.
 | 
	
		
			
				|  |  |      if args.http2_interop and False:
 | 
	
	
		
			
				|  | @@ -645,7 +647,7 @@ try:
 | 
	
		
			
				|  |  |          test_job = cloud_to_prod_jobspec(http2Interop, test_case,
 | 
	
		
			
				|  |  |                                           docker_image=docker_images.get(str(http2Interop)))
 | 
	
		
			
				|  |  |          jobs.append(test_job)
 | 
	
		
			
				|  |  | -     
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if args.cloud_to_prod_auth:
 | 
	
		
			
				|  |  |      for language in languages:
 | 
	
	
		
			
				|  | @@ -673,12 +675,12 @@ try:
 | 
	
		
			
				|  |  |                                              server_port,
 | 
	
		
			
				|  |  |                                              docker_image=docker_images.get(str(language)))
 | 
	
		
			
				|  |  |            jobs.append(test_job)
 | 
	
		
			
				|  |  | -          
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      if args.http2_interop:
 | 
	
		
			
				|  |  |        for test_case in _HTTP2_TEST_CASES:
 | 
	
		
			
				|  |  |          if server_name == "go":
 | 
	
		
			
				|  |  |            # TODO(carl-mastrangelo): Reenable after https://github.com/grpc/grpc-go/issues/434
 | 
	
		
			
				|  |  | -          continue 
 | 
	
		
			
				|  |  | +          continue
 | 
	
		
			
				|  |  |          test_job = cloud_to_cloud_jobspec(http2Interop,
 | 
	
		
			
				|  |  |                                            test_case,
 | 
	
		
			
				|  |  |                                            server_name,
 | 
	
	
		
			
				|  | @@ -693,7 +695,7 @@ try:
 | 
	
		
			
				|  |  |        dockerjob.remove_image(image, skip_nonexistent=True)
 | 
	
		
			
				|  |  |      sys.exit(1)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  num_failures, resultset = jobset.run(jobs, newline_on_success=True, 
 | 
	
		
			
				|  |  | +  num_failures, resultset = jobset.run(jobs, newline_on_success=True,
 | 
	
		
			
				|  |  |                                         maxjobs=args.jobs)
 | 
	
		
			
				|  |  |    if num_failures:
 | 
	
		
			
				|  |  |      jobset.message('FAILED', 'Some tests failed', do_newline=True)
 | 
	
	
		
			
				|  | @@ -701,9 +703,9 @@ try:
 | 
	
		
			
				|  |  |      jobset.message('SUCCESS', 'All tests passed', do_newline=True)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    report_utils.render_xml_report(resultset, 'report.xml')
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    report_utils.render_html_report(
 | 
	
		
			
				|  |  | -      set([str(l) for l in languages]), servers, _TEST_CASES, _AUTH_TEST_CASES, 
 | 
	
		
			
				|  |  | +      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)
 | 
	
		
			
				|  |  |  
 |