Skip to content

Commit 87ea850

Browse files
committed
node and gateway support docker
1 parent d3984ea commit 87ea850

File tree

12 files changed

+283
-48
lines changed

12 files changed

+283
-48
lines changed

wedpr-builder/conf/config-example.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ wedpr_model_source_path = "/data/home/wedpr/WeDPR-Component/python/"
1414
docker_mode = true
1515

1616
#### define the docker images desc ###
17-
wedpr_cpp_component_image_desc = "wedpr-cpp-component:latest"
17+
wedpr_gateway_service_image_desc = "wedpr-gateway-service:latest"
18+
wedpr_node_service_image_desc = "wedpr-pro-node-service:latest"
19+
wedpr_mpc_service_image_desc = "wedpr-mpc-service:latest"
1820
wedpr_jupyter_worker_image_desc = "wedpr-jupyter-worker:latest"
1921
wedpr_model_image_desc = "wedpr-model-service:latest"
2022
wedpr_site_image_desc = "wedpr-site:latest"

wedpr-builder/wedpr_builder/common/constant.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@ class ServiceInfo:
1818
gateway_service_type = "wedpr-gateway"
1919
wedpr_site_service = "wedpr-site"
2020
wedpr_pir_service = "wedpr-pir"
21+
wedpr_mpc_service = "wedpr-mpc-service"
2122
wedpr_model_service = "wedpr-model"
2223
wedpr_jupyter_worker_service = "wedpr-jupyter-worker"
2324
supported_service_type = [node_service_type, gateway_service_type,
2425
wedpr_site_service, wedpr_pir_service,
25-
wedpr_jupyter_worker_service, wedpr_model_service]
26+
wedpr_jupyter_worker_service,
27+
wedpr_model_service,
28+
wedpr_mpc_service]
2629

2730

2831
def get_abs_path(file_path, tpl_abs_path="wedpr_builder/tpl/"):
@@ -68,6 +71,10 @@ class ConfigInfo:
6871
wedpr_worker_docker_dir = "wedpr-worker"
6972
wedpr_pir_docker_dir = "wedpr-pir"
7073
wedpr_site_docker_dir = "wedpr-site"
74+
75+
wedpr_gateway_service_dir = "wedpr-gateway-service"
76+
wedpr_node_service_dir = "wedpr-pro-node-service"
77+
wedpr_mpc_service_dir = "wedpr-mpc-service"
7178
docker_file_list = ["create_docker.sh",
7279
"start_docker.sh", "stop_docker.sh"]
7380

@@ -132,3 +139,4 @@ class ConfigProperities:
132139
WEDPR_DOCKER_EXPORSE_PORT_LIST = "WEDPR_DOCKER_EXPORSE_PORT_LIST"
133140
# the created docker name
134141
WEDPR_DOCKER_NAME = "WEDPR_DOCKER_NAME"
142+
EXTENDED_MOUNT_CONF = "EXTENDED_MOUNT_CONF"

wedpr-builder/wedpr_builder/config/wedpr_deploy_config.py

Lines changed: 79 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ def __init__(self, node_must_exists: bool = False,
1313
site_must_exists: bool = False,
1414
pir_must_exists: bool = False,
1515
jupyter_must_exists: bool = False,
16-
model_must_exists: bool = False):
16+
model_must_exists: bool = False,
17+
mpc_service_must_exists: bool = False):
1718
self.node_must_exists = node_must_exists
1819
self.gateway_must_exists = gateway_must_exists
1920
self.site_must_exists = site_must_exists
2021
self.pir_must_exists = pir_must_exists
2122
self.jupyter_must_exists = jupyter_must_exists
2223
self.model_must_exists = model_must_exists
24+
self.mpc_service_must_exists = mpc_service_must_exists
2325

2426

2527
class PeerInfo:
@@ -70,18 +72,31 @@ def __init__(self, config, section_name: str, component_switch: ComponentSwitch)
7072
self.config, self.section_name, "wedpr_jupyter_worker_image_desc",
7173
None, self.component_switch.jupyter_must_exists)
7274
# the cpp component image desc
73-
self.wedpr_cpp_component_image_desc = utilities.get_value(
74-
self.config, self.section_name, "wedpr_cpp_component_image_desc", None,
75-
(self.component_switch.gateway_must_exists or self.component_switch.node_must_exists))
75+
self.wedpr_gateway_service_image_desc = utilities.get_value(
76+
self.config, self.section_name, "wedpr_gateway_service_image_desc", None,
77+
self.component_switch.gateway_must_exists and self.docker_mode is True)
78+
# the node service image desc
79+
self.wedpr_node_service_image_desc = utilities.get_value(
80+
self.config, self.section_name,
81+
"wedpr_node_service_image_desc", None,
82+
self.component_switch.node_must_exists and self.docker_mode is True)
83+
# the mpc service image desc
84+
self.wedpr_mpc_service_image_desc = utilities.get_value(
85+
self.config, self.section_name,
86+
"wedpr_mpc_service_image_desc", None,
87+
self.docker_mode is True and self.component_switch.mpc_service_must_exists)
7688
# the model image desc
7789
self.wedpr_model_image_desc = utilities.get_value(
78-
self.config, self.section_name, "wedpr_model_image_desc", None, self.component_switch.model_must_exists)
90+
self.config, self.section_name, "wedpr_model_image_desc", None,
91+
self.component_switch.model_must_exists)
7992
# the pir image
8093
self.wedpr_pir_image_desc = utilities.get_value(
81-
self.config, self.section_name, "wedpr_pir_image_desc", None, self.component_switch.pir_must_exists)
94+
self.config, self.section_name, "wedpr_pir_image_desc", None,
95+
self.component_switch.pir_must_exists)
8296
# the site image
8397
self.wedpr_site_image_desc = utilities.get_value(
84-
self.config, self.section_name, "wedpr_site_image_desc", None, self.component_switch.site_must_exists)
98+
self.config, self.section_name, "wedpr_site_image_desc", None,
99+
self.component_switch.site_must_exists)
85100

86101
# Note: jupyter only use docker mode
87102
def get_dist_path_by_service_type(self, service_type: str) -> str:
@@ -102,9 +117,12 @@ def get_image_desc_by_service_name(self, service_type: str) -> str:
102117
return self.wedpr_pir_image_desc
103118
if service_type == constant.ServiceInfo.wedpr_jupyter_worker_service:
104119
return self.wedpr_jupyter_worker_image_desc
105-
if service_type == constant.ServiceInfo.gateway_service_type or \
106-
service_type == constant.ServiceInfo.node_service_type:
107-
return self.wedpr_cpp_component_image_desc
120+
if service_type == constant.ServiceInfo.gateway_service_type:
121+
return self.wedpr_gateway_service_image_desc
122+
if service_type == constant.ServiceInfo.node_service_type:
123+
return self.wedpr_node_service_image_desc
124+
if service_type == constant.ServiceInfo.wedpr_mpc_service:
125+
return self.wedpr_mpc_service_image_desc
108126
return None
109127

110128
def __repr__(self):
@@ -162,9 +180,13 @@ class GatewayConfig:
162180
the gateway config
163181
"""
164182

165-
def __init__(self, agency_name: str, holding_msg_minutes: int,
183+
def __init__(self, agency_name: str,
184+
env_config: EnvConfig,
185+
holding_msg_minutes: int,
166186
config, config_section: str, must_exist: bool):
167187
self.config = config
188+
self.service_type = constant.ServiceInfo.gateway_service_type
189+
self.env_config = env_config
168190
self.config_section = config_section
169191
self.holding_msg_minutes = holding_msg_minutes
170192
self.agency_name = agency_name
@@ -494,10 +516,14 @@ class NodeConfig:
494516
the ppc-node config
495517
"""
496518

497-
def __init__(self, agency_name: str, holding_msg_minutes: int, gateway_targets,
519+
def __init__(self, agency_name: str,
520+
env_config: EnvConfig,
521+
holding_msg_minutes: int, gateway_targets,
498522
hdfs_storage_config: HDFSStorageConfig, config, must_exist: bool):
499523
self.config = config
500524
self.section_name = "[[agency.node]]."
525+
self.service_type = constant.ServiceInfo.node_service_type
526+
self.env_config = env_config
501527
self.holding_msg_minutes = holding_msg_minutes
502528
# the hdfs config
503529
self.hdfs_storage_config = hdfs_storage_config
@@ -599,7 +625,8 @@ def __init__(self, config, env_config: EnvConfig,
599625
self.gateway_config = None
600626
if gateway_config_object is not None:
601627
self.gateway_config = GatewayConfig(
602-
self.agency_name, self.holding_msg_minutes, gateway_config_object,
628+
self.agency_name, self.env_config,
629+
self.holding_msg_minutes, gateway_config_object,
603630
gateway_config_section_name, self.component_switch.gateway_must_exists)
604631
utilities.log_debug("load the gateway config success")
605632

@@ -657,6 +684,7 @@ def __init__(self, config, env_config: EnvConfig,
657684
for node_object in node_config_list:
658685
node_config = NodeConfig(
659686
agency_name=self.agency_name,
687+
env_config=self.env_config,
660688
holding_msg_minutes=self.holding_msg_minutes,
661689
hdfs_storage_config=self.hdfs_storage_config,
662690
config=node_object,
@@ -711,6 +739,8 @@ def to_properties(self) -> {}:
711739
{constant.ConfigProperities.WEDPR_AGENCY: self.agency_name})
712740
props.update(
713741
{constant.ConfigProperities.PSI_API_TOKEN: self.psi_api_token})
742+
# EXTENDED_MOUNT_CONF default is empty string
743+
props.update({constant.ConfigProperities.EXTENDED_MOUNT_CONF: ""})
714744
return props
715745

716746
def get_wedpr_model_properties(self, deploy_ip: str, node_index: int) -> {}:
@@ -734,6 +764,42 @@ def get_wedpr_model_properties(self, deploy_ip: str, node_index: int) -> {}:
734764
constant.ConfigInfo.get_docker_path("model/logs")})
735765
return props
736766

767+
@staticmethod
768+
def generate_cpp_component_docker_properties(
769+
prefix_path, service_type: str, env_config,
770+
exposed_port_list: str, node_index: int):
771+
props = {}
772+
# the config mount info
773+
props.update(
774+
{constant.ConfigProperities.WEDPR_CONFIG_DIR: "config.ini"})
775+
path = constant.ConfigInfo.get_docker_path(f"{prefix_path}/config.ini")
776+
props.update(
777+
{constant.ConfigProperities.DOCKER_CONF_PATH: path})
778+
# set the extended mont config
779+
local_mount_dir = '${SHELL_FOLDER}/conf'
780+
remote_mount_dir = constant.ConfigInfo.get_docker_path(
781+
f"{prefix_path}/conf")
782+
extended_mount_conf = f"-v {local_mount_dir}:{remote_mount_dir} "
783+
props.update(
784+
{constant.ConfigProperities.EXTENDED_MOUNT_CONF: extended_mount_conf})
785+
# specify the conf path to mount
786+
props.update({constant.ConfigProperities.WEDPR_LOG_DIR: "logs"})
787+
props.update({constant.ConfigProperities.DOCKER_LOG_PATH:
788+
constant.ConfigInfo.get_docker_path(f"{prefix_path}/logs")})
789+
# set the image desc for docker mode
790+
image_desc = env_config.get_image_desc_by_service_name(service_type)
791+
if image_desc is not None:
792+
props.update(
793+
{constant.ConfigProperities.WEDPR_IMAGE_DESC: image_desc})
794+
# set the exposed port
795+
props.update(
796+
{constant.ConfigProperities.WEDPR_DOCKER_EXPORSE_PORT_LIST: exposed_port_list})
797+
# set the docker name
798+
docker_name = f"{service_type}-node{node_index}"
799+
props.update(
800+
{constant.ConfigProperities.WEDPR_DOCKER_NAME: docker_name})
801+
return props
802+
737803
def __generate_java_service_docker_properties__(self, prefix_path) -> {}:
738804
props = {}
739805
# the config mount info

wedpr-builder/wedpr_builder/generator/shell_script_generator.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ class ShellScriptGenerator:
99
"""
1010
generate the shell-scripts
1111
"""
12-
def generate_ip_shell_scripts(script_output_dir, start_shell_script_name, stop_shell_script_name):
12+
def generate_ip_shell_scripts(
13+
script_output_dir: str,
14+
start_shell_script_name,
15+
stop_shell_script_name):
1316
start_all_path = os.path.join(
1417
script_output_dir, start_shell_script_name)
1518
utilities.mkdir(script_output_dir)

wedpr-builder/wedpr_builder/generator/wedpr_gateway_config_generator.py

Lines changed: 71 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from wedpr_builder.generator.binary_generator import BinaryGenerator
99
from wedpr_builder.generator.cert_generator import CertGenerator
1010
from wedpr_builder.generator.shell_script_generator import ShellScriptGenerator
11+
from wedpr_builder.config.wedpr_deploy_config import AgencyConfig
12+
from wedpr_builder.config.wedpr_deploy_config import GatewayConfig
1113

1214

1315
class WeDPRGatewayConfigGenerator:
@@ -47,15 +49,70 @@ def generate_gateway_config(self):
4749
"* generate gateway config success, deploy_dir: %s" % self.config.env_config.deploy_dir)
4850
return True
4951

50-
def __generate_single_gateway_config__(self, gateway_config, connection_config, connection_config_path_list):
52+
def __copy_binary__(self, agency_name, ip):
53+
if self.config.env_config.docker_mode is True:
54+
utilities.log_info(
55+
"* No need to copy binary for enable docker mode")
56+
return True
57+
# generate the binary
58+
binary_path = os.path.join(
59+
self.config.env_config.binary_path, self.binary_name)
60+
dst_binary_path = os.path.join(
61+
self.__generate_ip_shell_scripts_output_path__(
62+
agency_name, ip),
63+
self.binary_name)
64+
return BinaryGenerator.generate_binary(
65+
binary_path, dst_binary_path)
66+
67+
def __generate_shell_scripts__(self, agency_name, ip, node_name):
68+
if self.config.env_config.docker_mode is True:
69+
utilities.log_info(
70+
"* No need to copy the shell scripts for enable docker mode")
71+
return True
72+
return ShellScriptGenerator.generate_node_shell_scripts(
73+
self.__generate_node_path__(
74+
agency_name, ip, node_name), self.binary_name)
75+
76+
def __generate_docker_config__(
77+
self, gateway_config: GatewayConfig,
78+
node_path, exposed_port_list, node_index):
79+
if self.config.env_config.docker_mode is False:
80+
return True
81+
# copy the docker files
82+
command = f"cp {constant.ConfigInfo.docker_tpl_path}/*.sh {node_path}"
83+
(ret, output) = utilities.execute_command_and_getoutput(command)
84+
if ret is False:
85+
raise Exception(f"Copy docker tpl file from "
86+
f"{constant.ConfigInfo.docker_tpl_path} to {node_path} "
87+
f"failed, reason: {output}")
88+
props = AgencyConfig.generate_cpp_component_docker_properties(
89+
constant.ConfigInfo.wedpr_gateway_service_dir,
90+
gateway_config.service_type, self.config.env_config,
91+
exposed_port_list, node_index)
92+
# substitute
93+
for file in constant.ConfigInfo.docker_file_list:
94+
utilities.substitute_configurations(
95+
props, os.path.join(node_path, file))
96+
return True
97+
98+
def __generate_ip_shell_scripts__(self, agency_name, ip):
99+
if self.config.env_config.docker_mode is True:
100+
return True
101+
return ShellScriptGenerator.generate_ip_shell_scripts(
102+
self.__generate_ip_shell_scripts_output_path__(
103+
agency_name, ip), "start_all.sh", "stop_all.sh")
104+
105+
def __generate_single_gateway_config__(
106+
self, gateway_config, connection_config,
107+
connection_config_path_list):
51108
# load the config from tpl_config_path
52109
utilities.log_info("* generate config for ppc-gateway")
53110
for ip_str in gateway_config.deploy_ip:
54111
ip_array = ip_str.split(":")
55112
ip = ip_array[0]
56113
# generate the shell scripts for the given ip
57-
ret = ShellScriptGenerator.generate_ip_shell_scripts(
58-
self.__generate_ip_shell_scripts_output_path__(gateway_config.agency_name, ip), "start_all.sh", "stop_all.sh")
114+
ret = self.__generate_ip_shell_scripts__(
115+
gateway_config.agency_name, ip)
59116
if ret is False:
60117
return False
61118
node_count = 1
@@ -78,19 +135,14 @@ def __generate_single_gateway_config__(self, gateway_config, connection_config,
78135
self.__generate_gateway_config_content__(
79136
gateway_config, config_content, listen_port, grpc_listen_port)
80137
# generate the binary
81-
binary_path = os.path.join(
82-
self.config.env_config.binary_path, self.binary_name)
83-
dst_binary_path = os.path.join(
84-
self.__generate_ip_shell_scripts_output_path__(
85-
gateway_config.agency_name, ip),
86-
self.binary_name)
87-
ret = BinaryGenerator.generate_binary(
88-
binary_path, dst_binary_path)
138+
ret = self.__copy_binary__(gateway_config.agency_name, ip)
89139
if ret is False:
90140
return False
91141
# generate the ini config
142+
node_path = self.__generate_node_path__(
143+
gateway_config.agency_name, ip, node_name)
92144
ini_config_output_path = os.path.join(
93-
self.__generate_node_path__(gateway_config.agency_name, ip, node_name), constant.ConfigInfo.config_ini_file)
145+
node_path, constant.ConfigInfo.config_ini_file)
94146
ret = utilities.store_config(
95147
config_content, "ini", ini_config_output_path, "config.ini")
96148
if ret is False:
@@ -104,10 +156,14 @@ def __generate_single_gateway_config__(self, gateway_config, connection_config,
104156
utilities.log_error(
105157
"* generate config for ppc-gateway failed for generate the node config failed")
106158
return False
107-
ret = ShellScriptGenerator.generate_node_shell_scripts(self.__generate_node_path__(
108-
gateway_config.agency_name, ip, node_name), self.binary_name)
159+
ret = self.__generate_shell_scripts__(
160+
gateway_config.agency_name, ip, node_name)
109161
if ret is False:
110162
return False
163+
# try to generate docker config in the docker mode
164+
exposed_port = f"-p {listen_port}:{listen_port} -p {grpc_listen_port}:{grpc_listen_port}"
165+
self.__generate_docker_config__(
166+
gateway_config, node_path, exposed_port, node_index)
111167
utilities.print_badge("* generate config for ppc-gateway%s success" %
112168
(node_name))
113169
utilities.log_info("* generate config for ppc-gateway success")
@@ -127,7 +183,7 @@ def __generate_connection_info__(self, connection_config_path_list, connection_c
127183
def __generate_ca_cert_path__(self):
128184
return os.path.join(self.output_dir, self.service_type, "ca")
129185

130-
def __generate_node_path__(self, agency_name, ip, node_name):
186+
def __generate_node_path__(self, agency_name: str, ip, node_name):
131187
return os.path.join(self.output_dir, agency_name, ip, self.service_type, node_name)
132188

133189
def __generate_conf_output_path__(self, agency_name, ip, node_name):

0 commit comments

Comments
 (0)