The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
4.0 KiB
98 lines
4.0 KiB
#!/usr/bin/env python |
|
# Copyright 2021 gRPC authors. |
|
# |
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
|
# you may not use this file except in compliance with the License. |
|
# You may obtain a copy of the License at |
|
# |
|
# http://www.apache.org/licenses/LICENSE-2.0 |
|
# |
|
# Unless required by applicable law or agreed to in writing, software |
|
# distributed under the License is distributed on an "AS IS" BASIS, |
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
# See the License for the specific language governing permissions and |
|
# limitations under the License. |
|
"""Manage PHP child processes for the main PHP xDS Interop client""" |
|
|
|
import argparse |
|
import fcntl |
|
import os |
|
import subprocess |
|
|
|
# This script is being launched from src/php/bin/run_xds_client.sh |
|
# to manage PHP child processes which will send 1 RPC each |
|
# asynchronously. This script keeps track of all those open |
|
# processes and reports back to the main PHP interop client each |
|
# of the child RPCs' status code. |
|
|
|
if __name__ == '__main__': |
|
parser = argparse.ArgumentParser() |
|
parser.add_argument('--tmp_file1', nargs='?', default='') |
|
parser.add_argument('--tmp_file2', nargs='?', default='') |
|
parser.add_argument('--bootstrap_path', nargs='?', default='') |
|
args = parser.parse_args() |
|
server_address = '' |
|
rpcs_started = [] |
|
open_processes = {} |
|
client_env = dict(os.environ) |
|
client_env['GRPC_XDS_BOOTSTRAP'] = args.bootstrap_path |
|
while True: |
|
# tmp_file1 contains a list of RPCs (and their spec) the parent process |
|
# wants executed |
|
f1 = open(args.tmp_file1, 'r+') |
|
fcntl.flock(f1, fcntl.LOCK_EX) |
|
while True: |
|
key = f1.readline() |
|
if not key: |
|
break |
|
key = key.strip() |
|
if key.startswith('server_address'): |
|
if not server_address: |
|
server_address = key[15:] |
|
elif not key in rpcs_started: |
|
# format here needs to be in sync with |
|
# src/php/tests/interop/xds_client.php |
|
items = key.split('|') |
|
num = items[0] |
|
metadata = items[2] |
|
timeout_sec = items[3] |
|
if items[1] == 'UnaryCall': |
|
p = subprocess.Popen([ |
|
'php', '-d', 'extension=grpc.so', '-d', |
|
'extension=pthreads.so', |
|
'src/php/tests/interop/xds_unary_call.php', |
|
'--server=' + server_address, '--num=' + str(num), |
|
'--metadata=' + metadata, '--timeout_sec=' + timeout_sec |
|
], |
|
env=client_env) |
|
elif items[1] == 'EmptyCall': |
|
p = subprocess.Popen([ |
|
'php', '-d', 'extension=grpc.so', '-d', |
|
'extension=pthreads.so', |
|
'src/php/tests/interop/xds_empty_call.php', |
|
'--server=' + server_address, '--num=' + str(num), |
|
'--metadata=' + metadata, '--timeout=' + timeout_sec |
|
], |
|
env=client_env) |
|
else: |
|
continue |
|
rpcs_started.append(key) |
|
open_processes[key] = p |
|
f1.truncate(0) |
|
fcntl.flock(f1, fcntl.LOCK_UN) |
|
f1.close() |
|
# tmp_file2 contains the RPC result of each key received from tmp_file1 |
|
f2 = open(args.tmp_file2, 'a') |
|
fcntl.flock(f2, fcntl.LOCK_EX) |
|
keys_to_delete = [] |
|
for key, process in open_processes.items(): |
|
result = process.poll() |
|
if result is not None: |
|
# format here needs to be in sync with |
|
# src/php/tests/interop/xds_client.php |
|
f2.write(key + ',' + str(process.returncode) + "\n") |
|
keys_to_delete.append(key) |
|
for key in keys_to_delete: |
|
del open_processes[key] |
|
fcntl.flock(f2, fcntl.LOCK_UN) |
|
f2.close()
|
|
|