Skip to content

Commit ea2d4eb

Browse files
committed
feature: 支持启动时安装算子包
1 parent c4ba16c commit ea2d4eb

File tree

3 files changed

+50
-29
lines changed

3 files changed

+50
-29
lines changed

tools/install.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ OPERATOR_PVC=""
3939
DATASET_PVC=""
4040
PORT="30000"
4141
ADDRESS_TYPE="management"
42+
PACKAGE_PATH=""
4243

4344

4445
cd "$(dirname "$0")" || exit
@@ -223,6 +224,12 @@ function add_route_to_haproxy() {
223224
log_info "Finish config haproxy"
224225
}
225226

227+
function install_package() {
228+
if [[ -n $PACKAGE_PATH ]]; then
229+
bash "$UTILS_PATH/load_operators.sh" "$NAMESPACE" "$PACKAGE_PATH"
230+
fi
231+
}
232+
226233
function main() {
227234
while [[ "$#" -gt 0 ]]; do
228235
case $1 in
@@ -237,6 +244,7 @@ function main() {
237244
--skip-push) SKIP_PUSH=true; shift ;;
238245
--skip-load) SKIP_LOAD=true; shift ;;
239246
--skip-milvus) INSTALL_MILVUS=false; shift ;;
247+
--package) PACKAGE_PATH="$2"; shift 2 ;;
240248
-h|--help) print_help "${SCRIPT_PATH}"; exit 0 ;;
241249
*) log_info "错误: 未知参数: $1"; shift ;;
242250
esac
@@ -248,6 +256,9 @@ function main() {
248256
[ "$INSTALL_MILVUS" == "true" ] && load_images "milvus"
249257
install
250258
add_route_to_haproxy
259+
260+
kubectl wait --for=condition=Ready pod -l app.kubernetes.io/instance=datamate -n "$NAMESPACE" --timeout=300s >/dev/null
261+
bash "$UTILS_PATH/load_images.sh"
251262
}
252263

253264
main "$@"

tools/uninstall.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ function main() {
8282

8383
uninstall
8484
remove_route_from_haproxy
85+
86+
kubectl wait --for=delete pod -l app.kubernetes.io/instance=datamate -n "$NAMESPACE" --timeout=300s >/dev/null
8587
}
8688

8789
main "$@"

tools/utils/load_operators.sh

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,18 @@ fi
2929
WORK_DIR="$current_dir/operators"
3030

3131
# 退出时自动清理
32-
cleanup() {
33-
log_info "清理临时文件..."
34-
rm -rf "$WORK_DIR"
35-
}
36-
trap cleanup EXIT
32+
#cleanup() {
33+
# log_info "清理临时文件..."
34+
# rm -rf "$WORK_DIR"
35+
#}
36+
#trap cleanup EXIT
3737

3838
# 2. 处理输入源(解压或复制到工作区)
3939
SOURCE_DIR="$WORK_DIR/source"
4040
mkdir -p "$SOURCE_DIR"
4141

4242
if [ -d "$INPUT_PATH" ]; then
43-
log_info "输入为目录,复制文件..."
43+
log_info "输入为目录,跳过解压..."
4444
SOURCE_DIR=$INPUT_PATH
4545
elif [[ "$INPUT_PATH" == *.zip ]]; then
4646
log_info "输入为zip包,解压中..."
@@ -78,9 +78,11 @@ while read -r pkg; do
7878

7979
# 解压子包
8080
if [[ "$pkg" == *.zip ]]; then
81-
unzip -q "$pkg" -d "$PKG_EXTRACT_DIR"
82-
else
81+
unzip -oq "$pkg" -d "$PKG_EXTRACT_DIR"
82+
elif [[ "$pkg" == *.tar ]]; then
8383
tar -xf "$pkg" -C "$PKG_EXTRACT_DIR"
84+
else
85+
continue
8486
fi
8587

8688
# 检查关键文件是否存在
@@ -93,24 +95,24 @@ while read -r pkg; do
9395
# 假设每个包在目标目录下应该有一个独立的文件夹
9496
REMOTE_PATH="$EXTRACT_DIR/$PKG_BASE"
9597

96-
log_info " -> 部署文件到容器 $BACKEND_POD_NAME:$REMOTE_PATH"
98+
log_info "拷贝目录${PKG_BASE}到容器..."
9799

98-
# kubectl cp "$SOURCE_DIR/$PKG_NAME" "$BACKEND_POD_NAME:$UPLOAD_DIR/" -n "$NAMESPACE"
99-
kubectl cp "$PKG_EXTRACT_DIR" "$BACKEND_POD_NAME:$REMOTE_PATH/" -n "$NAMESPACE"
100+
# kubectl cp "$SOURCE_DIR/$PKG_NAME" "$BACKEND_POD_NAME:$UPLOAD_DIR/$PKG_BASE/" -n "$NAMESPACE"
101+
kubectl exec "$BACKEND_POD_NAME" -n "$NAMESPACE" -- sh -c "rm -rf $REMOTE_PATH/ && mkdir -p $REMOTE_PATH"
102+
kubectl cp "$PKG_EXTRACT_DIR/." "$BACKEND_POD_NAME:$REMOTE_PATH/" -n "$NAMESPACE"
100103

101-
if [ -f "$PKG_EXTRACT_DIR/wheels" ]; then
104+
if [ -d "$PKG_EXTRACT_DIR/wheels" ]; then
105+
log_info "安装算子依赖..."
102106
kubectl exec "$HEAD_POD_NAME" -n "$NAMESPACE" -- bash -c "uv pip install --target $PACKAGE_DIR /opt/runtime/datamate/ops/user/$PKG_BASE/wheels/*.whl"
103107
fi
104108
done < <(find "$SOURCE_DIR" -maxdepth 1 -type f \( -name "*.zip" -o -name "*.tar" \))
105109

106110

107-
FULL_SQL=$(kubectl exec -i "$HEAD_POD_NAME" -n "$NAMESPACE" -- python3 - << EOF
111+
FULL_SQL=$(kubectl exec -i "$HEAD_POD_NAME" -n "$NAMESPACE" -c ray-head -- python3 - << EOF
108112
from pathlib import Path
109-
import sys, yaml
113+
import json, sys, yaml
110114
111-
operator_sql='INSERT IGNORE INTO t_operator
112-
(id, name, description, version, inputs, outputs, runtime, settings, file_name, is_star)
113-
VALUES '
115+
operator_sql = 'INSERT IGNORE INTO t_operator (id, name, description, version, inputs, outputs, runtime, settings, file_name, is_star) VALUES '
114116
category_sql='INSERT IGNORE INTO t_operator_category_relation(category_id, operator_id) VALUES '
115117
modal_map = {
116118
'text': 'd8a5df7a-52a9-42c2-83c4-01062e60f597',
@@ -129,27 +131,33 @@ for metadata_file in base_path.rglob('metadata.yml'):
129131
try:
130132
with open(metadata_file, 'r') as f:
131133
data = yaml.safe_load(f)
132-
id = data.get('raw_id')
133-
name = data.get('name')
134-
desc = data.get('description')
135-
version = data.get('version')
136-
modal = data.get('modal').lower()
137-
language = data.get('language').lower()
138-
inputs = data.get('inputs')
139-
outputs = data.get('outputs')
134+
id = data.get('raw_id').strip("'\"")
135+
name = data.get('name').strip("'\"")
136+
desc = data.get('description').strip("'\"")
137+
version = data.get('version').strip("'\"")
138+
modal = data.get('modal').lower().strip("'\"")
139+
language = data.get('language').lower().strip("'\"")
140+
inputs = data.get('inputs').strip("'\"")
141+
outputs = data.get('outputs').strip("'\"")
142+
runtime = f"'{json.dumps(data.get('runtime'), ensure_ascii=False)}'" if 'runtime' in data else 'null'
143+
settings = f"'{json.dumps(data.get('settings'), ensure_ascii=False)}'" if 'settings' in data else 'null'
140144
file_name = Path(metadata_file).parent.name
141145
142-
operator_sql += "('{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', 'false'),".format(id, name, desc, version, inputs, outputs, runtime, settings, file_name)
143-
category_sql += "('{}', '{}'),".format(id, modal_map.get(modal, 'd8a5df7a-52a9-42c2-83c4-01062e60f597'))
144-
category_sql += "('{}', '{}'),".format(id, language_map.get(language, '9eda9d5d-072b-499b-916c-797a0a8750e1'))
146+
operator_sql += "('{}', '{}', '{}', '{}', '{}', '{}', {}, {}, '{}', 'false'),".format(id, name, desc, version, inputs, outputs, runtime, settings, file_name)
147+
category_sql += "('{}', '{}'),".format(modal_map.get(modal, 'd8a5df7a-52a9-42c2-83c4-01062e60f597'), id)
148+
category_sql += "('{}', '{}'),".format(language_map.get(language, '9eda9d5d-072b-499b-916c-797a0a8750e1'), id)
149+
category_sql += "('ec2cdd17-8b93-4a81-88c4-ac9e98d10757', '{}'),".format(id)
145150
except Exception as e:
146151
print(f'ERROR: {e}', file=sys.stderr)
147152
sys.exit(1)
148153
print(operator_sql[:-1] + ';\n' + category_sql[:-1] + ';')
149154
EOF
150155
)
151156

157+
log_info "插入数据库..."
152158
DATABASE_POD_NAME=$(kubectl get pod -n "$NAMESPACE" -l app.kubernetes.io/name=datamate-database -o jsonpath='{.items[*].metadata.name}')
153-
kubectl exec -i "$DATABASE_POD_NAME" -n "$NAMESPACE" -- mysql -uroot -p"\$MYSQL_ROOT_PASSWORD" "datamate" -e "$FULL_SQL" 2>/dev/null
159+
kubectl exec -i "$DATABASE_POD_NAME" -n "$NAMESPACE" -c database -- sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysql -uroot datamate' << EOF
160+
$FULL_SQL
161+
EOF
154162

155163
log_info "所有任务执行完毕。"

0 commit comments

Comments
 (0)