From b7ad58013a8eee3100093336ff36386d8d354406 Mon Sep 17 00:00:00 2001 From: Eric Junyuan Xie Date: Mon, 26 Oct 2020 20:21:22 +0800 Subject: [PATCH] Bulk Merge v1.5 WebConsole Changes. See https://github.com/bytedance/fedlearner/pull/362 (#386) * Add job/update functionality * fix * add migration * fix * fix * fix * fix * fix * fix * add heartbeat webconsole * fix * trigger * Add migration create table * Add client side job validation * Fix create/update job * fix * Feat/datasource (#328) * feat(web_console): form json * chore(web_console): make form fields immutable * mask sensitive data * fix: lock version * feat(web_console): support popover on nav tab * feat(WIP): datasource * feat(web_console): use form meta to implement form convert * chore(web_console): update doc * feat(web_console): raw data form: * form utils unit test * fix logic of `fillJSON` * fix: raw data submit: * fix federation value validator * fix: image should be written into context * fix: async response on submit * fix: ticket not clone job * chore: use `useMemo` with form fields * feat(web_console): rewrite `fiilJSON`: * support two array mode * feat(WIP): datasource job form * form item `name-value` support ignore keys * incremental update form value in group type change * TODO: form submit * feat(web_console): boolean select in form * feat(WIP): datasource ticket * fix header active tab * feat(web_console): datasource and trainning * fix(web_console): ticket * update form * create ticket * job link * add `filterArrayValue` * fix(web_console): clone job * feat(web_console): stop and start job * fix: update job status * feat: job federation id filter * fix: job status * fix: package-lock * fix: prerender error * fix: prerender error * fix: boolean select; * update router of charts * fix: bool-select * feat: header dropdown icon * feat: federation heartbeat * fix: clone job * fix: heartbeat * fix: server ticket select * fix: raw data in clone * fix: delete job rpc * fix: clear formMeta on cancel Co-authored-by: shenshihao * Feat/datasource (#330) * feat(web_console): form json * chore(web_console): make form fields immutable * mask sensitive data * fix: lock version * feat(web_console): support popover on nav tab * feat(WIP): datasource * feat(web_console): use form meta to implement form convert * chore(web_console): update doc * feat(web_console): raw data form: * form utils unit test * fix logic of `fillJSON` * fix: raw data submit: * fix federation value validator * fix: image should be written into context * fix: async response on submit * fix: ticket not clone job * chore: use `useMemo` with form fields * feat(web_console): rewrite `fiilJSON`: * support two array mode * feat(WIP): datasource job form * form item `name-value` support ignore keys * incremental update form value in group type change * TODO: form submit * feat(web_console): boolean select in form * feat(WIP): datasource ticket * fix header active tab * feat(web_console): datasource and trainning * fix(web_console): ticket * update form * create ticket * job link * add `filterArrayValue` * fix(web_console): clone job * feat(web_console): stop and start job * fix: update job status * feat: job federation id filter * fix: job status * fix: package-lock * fix: prerender error * fix: prerender error * fix: boolean select; * update router of charts * fix: bool-select * feat: header dropdown icon * feat: federation heartbeat * fix: clone job * fix: heartbeat * fix: server ticket select * fix: raw data in clone * fix: delete job rpc * fix: clear formMeta on cancel * chore: remove raw_data in job form * feat: show total info of server ticket: * fix create jon derect in the index * fix server ticket pull in cloning * fix: useEffect * fix: server ticket info Co-authored-by: shenshihao * ds bug fix (#331) * feat(web_console): form json * chore(web_console): make form fields immutable * mask sensitive data * fix: lock version * feat(web_console): support popover on nav tab * feat(WIP): datasource * feat(web_console): use form meta to implement form convert * chore(web_console): update doc * feat(web_console): raw data form: * form utils unit test * fix logic of `fillJSON` * fix: raw data submit: * fix federation value validator * fix: image should be written into context * fix: async response on submit * fix: ticket not clone job * chore: use `useMemo` with form fields * feat(web_console): rewrite `fiilJSON`: * support two array mode * feat(WIP): datasource job form * form item `name-value` support ignore keys * incremental update form value in group type change * TODO: form submit * feat(web_console): boolean select in form * feat(WIP): datasource ticket * fix header active tab * feat(web_console): datasource and trainning * fix(web_console): ticket * update form * create ticket * job link * add `filterArrayValue` * fix(web_console): clone job * feat(web_console): stop and start job * fix: update job status * feat: job federation id filter * fix: job status * fix: package-lock * fix: prerender error * fix: prerender error * fix: boolean select; * update router of charts * fix: bool-select * feat: header dropdown icon * feat: federation heartbeat * fix: clone job * fix: heartbeat * fix: server ticket select * fix: raw data in clone * fix: delete job rpc * fix: clear formMeta on cancel * chore: remove raw_data in job form * feat: show total info of server ticket: * fix create jon derect in the index * fix server ticket pull in cloning * fix: useEffect * fix: server ticket info * chore: remove mock data * chore: fix typo * feat: disable federation with filter * fix: raw data fill: * fix raw data appState * fix: num_partitions Co-authored-by: shenshihao * change delete job logic * feat: use full params to set default (#338) * feat(web_console): form json * chore(web_console): make form fields immutable * mask sensitive data * fix: lock version * feat(web_console): support popover on nav tab * feat(WIP): datasource * feat(web_console): use form meta to implement form convert * chore(web_console): update doc * feat(web_console): raw data form: * form utils unit test * fix logic of `fillJSON` * fix: raw data submit: * fix federation value validator * fix: image should be written into context * fix: async response on submit * fix: ticket not clone job * chore: use `useMemo` with form fields * feat(web_console): rewrite `fiilJSON`: * support two array mode * feat(WIP): datasource job form * form item `name-value` support ignore keys * incremental update form value in group type change * TODO: form submit * feat(web_console): boolean select in form * feat(WIP): datasource ticket * fix header active tab * feat(web_console): datasource and trainning * fix(web_console): ticket * update form * create ticket * job link * add `filterArrayValue` * fix(web_console): clone job * feat(web_console): stop and start job * fix: update job status * feat: job federation id filter * fix: job status * fix: package-lock * fix: prerender error * fix: prerender error * fix: boolean select; * update router of charts * fix: bool-select * feat: header dropdown icon * feat: federation heartbeat * fix: clone job * fix: heartbeat * fix: server ticket select * fix: raw data in clone * fix: delete job rpc * fix: clear formMeta on cancel * chore: remove raw_data in job form * feat: show total info of server ticket: * fix create jon derect in the index * fix server ticket pull in cloning * fix: useEffect * fix: server ticket info * chore: remove mock data * chore: fix typo * feat: disable federation with filter * fix: raw data fill: * fix raw data appState * fix: num_partitions * fix: raw_data fill: * TODO: figure out why not working in some conditions * feat: use full params to set default: * change default value when modify job type Co-authored-by: shenshihao * Fix form defaults * Fix client_params & server_param inversion * feat: config replica type (#339) * feat(web_console): form json * chore(web_console): make form fields immutable * mask sensitive data * fix: lock version * feat(web_console): support popover on nav tab * feat(WIP): datasource * feat(web_console): use form meta to implement form convert * chore(web_console): update doc * feat(web_console): raw data form: * form utils unit test * fix logic of `fillJSON` * fix: raw data submit: * fix federation value validator * fix: image should be written into context * fix: async response on submit * fix: ticket not clone job * chore: use `useMemo` with form fields * feat(web_console): rewrite `fiilJSON`: * support two array mode * feat(WIP): datasource job form * form item `name-value` support ignore keys * incremental update form value in group type change * TODO: form submit * feat(web_console): boolean select in form * feat(WIP): datasource ticket * fix header active tab * feat(web_console): datasource and trainning * fix(web_console): ticket * update form * create ticket * job link * add `filterArrayValue` * fix(web_console): clone job * feat(web_console): stop and start job * fix: update job status * feat: job federation id filter * fix: job status * fix: package-lock * fix: prerender error * fix: prerender error * fix: boolean select; * update router of charts * fix: bool-select * feat: header dropdown icon * feat: federation heartbeat * fix: clone job * fix: heartbeat * fix: server ticket select * fix: raw data in clone * fix: delete job rpc * fix: clear formMeta on cancel * chore: remove raw_data in job form * feat: show total info of server ticket: * fix create jon derect in the index * fix server ticket pull in cloning * fix: useEffect * fix: server ticket info * chore: remove mock data * chore: fix typo * feat: disable federation with filter * fix: raw data fill: * fix raw data appState * fix: num_partitions * fix: raw_data fill: * TODO: figure out why not working in some conditions * feat: use full params to set default: * change default value when modify job type * feat: select datasource in training job * feat: config replica type: * feat update form value when update * fix: hide env value in training * Update form-default.js Co-authored-by: shenshihao Co-authored-by: Eric Junyuan Xie * add replica workers (#340) * feat(web_console): form json * chore(web_console): make form fields immutable * mask sensitive data * fix: lock version * feat(web_console): support popover on nav tab * feat(WIP): datasource * feat(web_console): use form meta to implement form convert * chore(web_console): update doc * feat(web_console): raw data form: * form utils unit test * fix logic of `fillJSON` * fix: raw data submit: * fix federation value validator * fix: image should be written into context * fix: async response on submit * fix: ticket not clone job * chore: use `useMemo` with form fields * feat(web_console): rewrite `fiilJSON`: * support two array mode * feat(WIP): datasource job form * form item `name-value` support ignore keys * incremental update form value in group type change * TODO: form submit * feat(web_console): boolean select in form * feat(WIP): datasource ticket * fix header active tab * feat(web_console): datasource and trainning * fix(web_console): ticket * update form * create ticket * job link * add `filterArrayValue` * fix(web_console): clone job * feat(web_console): stop and start job * fix: update job status * feat: job federation id filter * fix: job status * fix: package-lock * fix: prerender error * fix: prerender error * fix: boolean select; * update router of charts * fix: bool-select * feat: header dropdown icon * feat: federation heartbeat * fix: clone job * fix: heartbeat * fix: server ticket select * fix: raw data in clone * fix: delete job rpc * fix: clear formMeta on cancel * chore: remove raw_data in job form * feat: show total info of server ticket: * fix create jon derect in the index * fix server ticket pull in cloning * fix: useEffect * fix: server ticket info * chore: remove mock data * chore: fix typo * feat: disable federation with filter * fix: raw data fill: * fix raw data appState * fix: num_partitions * fix: raw_data fill: * TODO: figure out why not working in some conditions * feat: use full params to set default: * change default value when modify job type * feat: select datasource in training job * feat: config replica type: * feat update form value when update * fix: hide env value in training * Update form-default.js * fix: replica num * feat: add replica workers Co-authored-by: shenshihao Co-authored-by: Eric Junyuan Xie * bug fix (#346) * feat(web_console): form json * chore(web_console): make form fields immutable * mask sensitive data * fix: lock version * feat(web_console): support popover on nav tab * feat(WIP): datasource * feat(web_console): use form meta to implement form convert * chore(web_console): update doc * feat(web_console): raw data form: * form utils unit test * fix logic of `fillJSON` * fix: raw data submit: * fix federation value validator * fix: image should be written into context * fix: async response on submit * fix: ticket not clone job * chore: use `useMemo` with form fields * feat(web_console): rewrite `fiilJSON`: * support two array mode * feat(WIP): datasource job form * form item `name-value` support ignore keys * incremental update form value in group type change * TODO: form submit * feat(web_console): boolean select in form * feat(WIP): datasource ticket * fix header active tab * feat(web_console): datasource and trainning * fix(web_console): ticket * update form * create ticket * job link * add `filterArrayValue` * fix(web_console): clone job * feat(web_console): stop and start job * fix: update job status * feat: job federation id filter * fix: job status * fix: package-lock * fix: prerender error * fix: prerender error * fix: boolean select; * update router of charts * fix: bool-select * feat: header dropdown icon * feat: federation heartbeat * fix: clone job * fix: heartbeat * fix: server ticket select * fix: raw data in clone * fix: delete job rpc * fix: clear formMeta on cancel * chore: remove raw_data in job form * feat: show total info of server ticket: * fix create jon derect in the index * fix server ticket pull in cloning * fix: useEffect * fix: server ticket info * chore: remove mock data * chore: fix typo * feat: disable federation with filter * fix: raw data fill: * fix raw data appState * fix: num_partitions * fix: raw_data fill: * TODO: figure out why not working in some conditions * feat: use full params to set default: * change default value when modify job type * feat: select datasource in training job * feat: config replica type: * feat update form value when update * fix: hide env value in training * Update form-default.js * fix: replica num * feat: add replica workers * fix: data source and worker nums fill * fix: replicas is null Co-authored-by: shenshihao Co-authored-by: Eric Junyuan Xie * fix pod-log pod-shell (#351) * feat(web_console): form json * chore(web_console): make form fields immutable * mask sensitive data * fix: lock version * feat(web_console): support popover on nav tab * feat(WIP): datasource * feat(web_console): use form meta to implement form convert * chore(web_console): update doc * feat(web_console): raw data form: * form utils unit test * fix logic of `fillJSON` * fix: raw data submit: * fix federation value validator * fix: image should be written into context * fix: async response on submit * fix: ticket not clone job * chore: use `useMemo` with form fields * feat(web_console): rewrite `fiilJSON`: * support two array mode * feat(WIP): datasource job form * form item `name-value` support ignore keys * incremental update form value in group type change * TODO: form submit * feat(web_console): boolean select in form * feat(WIP): datasource ticket * fix header active tab * feat(web_console): datasource and trainning * fix(web_console): ticket * update form * create ticket * job link * add `filterArrayValue` * fix(web_console): clone job * feat(web_console): stop and start job * fix: update job status * feat: job federation id filter * fix: job status * fix: package-lock * fix: prerender error * fix: prerender error * fix: boolean select; * update router of charts * fix: bool-select * feat: header dropdown icon * feat: federation heartbeat * fix: clone job * fix: heartbeat * fix: server ticket select * fix: raw data in clone * fix: delete job rpc * fix: clear formMeta on cancel * chore: remove raw_data in job form * feat: show total info of server ticket: * fix create jon derect in the index * fix server ticket pull in cloning * fix: useEffect * fix: server ticket info * chore: remove mock data * chore: fix typo * feat: disable federation with filter * fix: raw data fill: * fix raw data appState * fix: num_partitions * fix: raw_data fill: * TODO: figure out why not working in some conditions * feat: use full params to set default: * change default value when modify job type * feat: select datasource in training job * feat: config replica type: * feat update form value when update * fix: hide env value in training * Update form-default.js * fix: replica num * feat: add replica workers * fix: data source and worker nums fill * fix: replicas is null * fix: pod-log pod-shell Co-authored-by: shenshihao Co-authored-by: Eric Junyuan Xie * Update server.js * remove replicas from data join jobs default * move DataSource select to ticket (#354) * feat(web_console): form json * chore(web_console): make form fields immutable * mask sensitive data * fix: lock version * feat(web_console): support popover on nav tab * feat(WIP): datasource * feat(web_console): use form meta to implement form convert * chore(web_console): update doc * feat(web_console): raw data form: * form utils unit test * fix logic of `fillJSON` * fix: raw data submit: * fix federation value validator * fix: image should be written into context * fix: async response on submit * fix: ticket not clone job * chore: use `useMemo` with form fields * feat(web_console): rewrite `fiilJSON`: * support two array mode * feat(WIP): datasource job form * form item `name-value` support ignore keys * incremental update form value in group type change * TODO: form submit * feat(web_console): boolean select in form * feat(WIP): datasource ticket * fix header active tab * feat(web_console): datasource and trainning * fix(web_console): ticket * update form * create ticket * job link * add `filterArrayValue` * fix(web_console): clone job * feat(web_console): stop and start job * fix: update job status * feat: job federation id filter * fix: job status * fix: package-lock * fix: prerender error * fix: prerender error * fix: boolean select; * update router of charts * fix: bool-select * feat: header dropdown icon * feat: federation heartbeat * fix: clone job * fix: heartbeat * fix: server ticket select * fix: raw data in clone * fix: delete job rpc * fix: clear formMeta on cancel * chore: remove raw_data in job form * feat: show total info of server ticket: * fix create jon derect in the index * fix server ticket pull in cloning * fix: useEffect * fix: server ticket info * chore: remove mock data * chore: fix typo * feat: disable federation with filter * fix: raw data fill: * fix raw data appState * fix: num_partitions * fix: raw_data fill: * TODO: figure out why not working in some conditions * feat: use full params to set default: * change default value when modify job type * feat: select datasource in training job * feat: config replica type: * feat update form value when update * fix: hide env value in training * Update form-default.js * fix: replica num * feat: add replica workers * fix: data source and worker nums fill * fix: replicas is null * fix: pod-log pod-shell * fix: move datasource select from job to ticket Co-authored-by: shenshihao Co-authored-by: Eric Junyuan Xie * feat: federation config (#356) * feat(web_console): form json * chore(web_console): make form fields immutable * mask sensitive data * fix: lock version * feat(web_console): support popover on nav tab * feat(WIP): datasource * feat(web_console): use form meta to implement form convert * chore(web_console): update doc * feat(web_console): raw data form: * form utils unit test * fix logic of `fillJSON` * fix: raw data submit: * fix federation value validator * fix: image should be written into context * fix: async response on submit * fix: ticket not clone job * chore: use `useMemo` with form fields * feat(web_console): rewrite `fiilJSON`: * support two array mode * feat(WIP): datasource job form * form item `name-value` support ignore keys * incremental update form value in group type change * TODO: form submit * feat(web_console): boolean select in form * feat(WIP): datasource ticket * fix header active tab * feat(web_console): datasource and trainning * fix(web_console): ticket * update form * create ticket * job link * add `filterArrayValue` * fix(web_console): clone job * feat(web_console): stop and start job * fix: update job status * feat: job federation id filter * fix: job status * fix: package-lock * fix: prerender error * fix: prerender error * fix: boolean select; * update router of charts * fix: bool-select * feat: header dropdown icon * feat: federation heartbeat * fix: clone job * fix: heartbeat * fix: server ticket select * fix: raw data in clone * fix: delete job rpc * fix: clear formMeta on cancel * chore: remove raw_data in job form * feat: show total info of server ticket: * fix create jon derect in the index * fix server ticket pull in cloning * fix: useEffect * fix: server ticket info * chore: remove mock data * chore: fix typo * feat: disable federation with filter * fix: raw data fill: * fix raw data appState * fix: num_partitions * fix: raw_data fill: * TODO: figure out why not working in some conditions * feat: use full params to set default: * change default value when modify job type * feat: select datasource in training job * feat: config replica type: * feat update form value when update * fix: hide env value in training * Update form-default.js * fix: replica num * feat: add replica workers * fix: data source and worker nums fill * fix: replicas is null * fix: pod-log pod-shell * fix: move datasource select from job to ticket * feat: federation config: * fix init value of boolean Co-authored-by: shenshihao Co-authored-by: Eric Junyuan Xie * Add k8s settings default * Add datasource_meta migrations * chore: remove useless default * Pass DB env args to pod * Add new psi data join entry script * update psi data join default json * Fix bug in webconsole create job * fix: env not update (#364) Co-authored-by: shenshihao * Allow injecting form default from env var * Add +x for scripts * Turn off cmd display * fix: v1.5 bugs (#376) * fix: v1.5 bugs * ticket raw data name * form data not updated when editing ticket * federation form checker * chore: remove console.log Co-authored-by: shenshihao * Fix form-default * fix: job can not submit (#378) * fix: job can not submit * Update CommonJobList.jsx Co-authored-by: shenshihao Co-authored-by: Eric Junyuan Xie * Fix delete job error * change Role assignment for PSI data join * feat: code key (#381) Co-authored-by: shenshihao * fix: edit code key (#382) * feat: code key * fix: edit code key * feat: search param data * Update CommonTicket.jsx Co-authored-by: shenshihao Co-authored-by: Eric Junyuan Xie * fix: search exit condition (#383) Co-authored-by: shenshihao * feat: clone ticket and rawdata (#384) Co-authored-by: shenshihao * build DATA_PATH from DATA_SOURCE for tree worker * Full integrated test (#385) * add csv data * fix file_type for tree model * add field 'label' to tfrecord_raw_data * fix num_parallel * add num_parallel for compatibility. * Revert and add new fake feature in tfrecord raw data for tree model. This reverts commit 8ca6061404d4ee5a08edcf0a1a412632b0e18605. * modified tree trainer for debug purpose, will be reverted * Revert debug, add send metrics in tree trainer, shrink raw data, full integrated test supported This reverts commit 977cd45da7f3f4c9ddbc8527350d256769a71f8c. * add loss_type for run_tree_worker.sh * eliminated data path * add num_parallel for compatibility. * Revert and add new fake feature in tfrecord raw data for tree model. This reverts commit 8ca6061404d4ee5a08edcf0a1a412632b0e18605. * modified tree trainer for debug purpose, will be reverted * Revert debug, add send metrics in tree trainer, shrink raw data, full integrated test supported This reverts commit 977cd45da7f3f4c9ddbc8527350d256769a71f8c. * rebased and modified defaults * deleted csv data Co-authored-by: zhangzihui Co-authored-by: Allen Shen <932142511@qq.com> Co-authored-by: shenshihao Co-authored-by: ADeltanp <45765741+ZhZhang711@users.noreply.github.com> Co-authored-by: zhangzihui --- .gitignore | 1 + .../templates/deployment.yaml | 4 +- .../charts/fedlearner-web-console/values.yaml | 4 +- .../integrated_test/client_integrated_test.py | 76 +- ...in_ticket.json => template_nn_ticket.json} | 0 .../template_psi_join_ticket.json | 178 +++ .../template_json/template_raw_data.json | 2 +- ...on => template_streaming_join_ticket.json} | 22 +- .../template_json/template_tree_ticket.json | 85 ++ .../raw_data_partition_0000.rd | Bin 376832 -> 130048 bytes .../raw_data_partition_0001.rd | Bin 376832 -> 130048 bytes .../raw_data_partition_0002.rd | Bin 376832 -> 130048 bytes .../raw_data_partition_0003.rd | Bin 376832 -> 130048 bytes deploy/integrated_test/tools.py | 10 +- .../rsa_psi/run_psi_data_join_master.sh | 32 + .../rsa_psi/run_psi_data_join_worker.sh | 28 + .../scripts/rsa_psi/run_psi_preprocessor.sh | 6 +- deploy/scripts/rsa_psi/run_rsa_psi_signer.sh | 5 +- deploy/scripts/trainer/run_tree_worker.sh | 16 +- package-lock.json | 11 - web_console/Dockerfile | 2 +- web_console/api/federation.js | 14 + web_console/api/job.js | 290 ++++- web_console/components/BooleanSelect.jsx | 19 + web_console/components/ClientTicketSelect.jsx | 18 +- web_console/components/CommonJobList.jsx | 747 ++++++++++++ web_console/components/CommonTicket.jsx | 646 ++++++++++ web_console/components/DataSourceSelect.jsx | 30 + web_console/components/FederationSelect.jsx | 17 +- web_console/components/Form.jsx | 242 +++- web_console/components/Header.jsx | 148 ++- web_console/components/Job.jsx | 89 ++ web_console/components/JobCommonInfo.jsx | 14 +- web_console/components/JobTypeSelect.jsx | 7 +- web_console/components/NameValueGroup.jsx | 6 +- web_console/components/RawDataSelect.jsx | 33 + web_console/components/ServerTicketSelect.jsx | 45 +- web_console/constants/form-default.js | 1061 ++++++++++++++++- web_console/constants/index.js | 1 + web_console/constants/job.js | 26 +- web_console/constants/mock_data.js | 775 ++++++++++++ .../20200903051922-create_tables_v_1_0.js | 411 +++++++ .../20200904051922-modify_job_model_v_1_5.js | 74 ++ .../20201012072548-datasource_meta_v_1_5.js | 70 ++ web_console/models/job.js | 18 + web_console/next.config.js | 8 + web_console/package-lock.json | 748 ++++++++++-- web_console/package.json | 5 + web_console/pages/admin/federation.jsx | 85 +- web_console/pages/{job => }/charts/[id].jsx | 6 +- web_console/pages/datasource/job/[id].jsx | 9 + web_console/pages/datasource/job/index.jsx | 5 + .../pages/datasource/tickets/index.jsx | 5 + web_console/pages/index.jsx | 2 +- web_console/pages/job/[id].jsx | 3 +- web_console/pages/raw_data/[id].jsx | 3 +- web_console/pages/raw_data/index.jsx | 94 +- web_console/pages/training/job/[id].jsx | 9 + web_console/pages/training/job/index.jsx | 5 + web_console/pages/training/tickets/index.jsx | 5 + web_console/rpc/client.js | 8 + web_console/rpc/meta.proto | 27 + web_console/rpc/server.js | 117 +- web_console/services/index.js | 4 + web_console/services/job.js | 4 + web_console/startup.sh | 10 + web_console/tests/utils/form_utils.test.js | 51 + web_console/utils/form_utils.js | 102 +- web_console/utils/job.js | 19 + web_console/utils/job_builder.js | 51 +- web_console/utils/kibana.js | 156 ++- 71 files changed, 6453 insertions(+), 371 deletions(-) rename deploy/integrated_test/template_json/{template_train_ticket.json => template_nn_ticket.json} (100%) create mode 100644 deploy/integrated_test/template_json/template_psi_join_ticket.json rename deploy/integrated_test/template_json/{template_join_ticket.json => template_streaming_join_ticket.json} (97%) create mode 100644 deploy/integrated_test/template_json/template_tree_ticket.json create mode 100755 deploy/scripts/rsa_psi/run_psi_data_join_master.sh create mode 100755 deploy/scripts/rsa_psi/run_psi_data_join_worker.sh delete mode 100644 package-lock.json create mode 100644 web_console/components/BooleanSelect.jsx create mode 100644 web_console/components/CommonJobList.jsx create mode 100644 web_console/components/CommonTicket.jsx create mode 100644 web_console/components/DataSourceSelect.jsx create mode 100644 web_console/components/Job.jsx create mode 100644 web_console/components/RawDataSelect.jsx create mode 100644 web_console/constants/mock_data.js create mode 100644 web_console/migrations/20200903051922-create_tables_v_1_0.js create mode 100644 web_console/migrations/20200904051922-modify_job_model_v_1_5.js create mode 100644 web_console/migrations/20201012072548-datasource_meta_v_1_5.js rename web_console/pages/{job => }/charts/[id].jsx (88%) create mode 100644 web_console/pages/datasource/job/[id].jsx create mode 100644 web_console/pages/datasource/job/index.jsx create mode 100644 web_console/pages/datasource/tickets/index.jsx create mode 100644 web_console/pages/training/job/[id].jsx create mode 100644 web_console/pages/training/job/index.jsx create mode 100644 web_console/pages/training/tickets/index.jsx create mode 100755 web_console/startup.sh diff --git a/.gitignore b/.gitignore index 48143ca5a..e64f8bf44 100644 --- a/.gitignore +++ b/.gitignore @@ -93,3 +93,4 @@ config.mk server.config.js es.match_phrase.js es.match_phrase.json +web_console/config diff --git a/deploy/charts/fedlearner/charts/fedlearner-web-console/templates/deployment.yaml b/deploy/charts/fedlearner/charts/fedlearner-web-console/templates/deployment.yaml index acd9cb837..13c628f54 100644 --- a/deploy/charts/fedlearner/charts/fedlearner-web-console/templates/deployment.yaml +++ b/deploy/charts/fedlearner/charts/fedlearner-web-console/templates/deployment.yaml @@ -34,9 +34,9 @@ spec: image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} command: - - node + - sh args: - - bootstrap.js + - startup.sh env: - name: NODE_ENV value: production diff --git a/deploy/charts/fedlearner/charts/fedlearner-web-console/values.yaml b/deploy/charts/fedlearner/charts/fedlearner-web-console/values.yaml index a9512c4ec..6fa6ce554 100644 --- a/deploy/charts/fedlearner/charts/fedlearner-web-console/values.yaml +++ b/deploy/charts/fedlearner/charts/fedlearner-web-console/values.yaml @@ -80,9 +80,11 @@ cluster: DB_PASSWORD: fedlearner DB_HOST: fedlearner-stack-mariadb DB_PORT: 3306 - DB_SYNC: true + DB_SYNC: false GRPC_AUTHORITY: "" KIBANA_HOST: fedlearner-stack-kibana KIBANA_PORT: 443 ES_HOST: fedlearner-stack-elasticsearch-client ES_PORT: 9200 + ETCD_ADDR: "fedlearner-stack-etcd.default.svc.cluster.local:2379" + KVSTORE_TYPE: "mysql" diff --git a/deploy/integrated_test/client_integrated_test.py b/deploy/integrated_test/client_integrated_test.py index 7c4986388..ceb85dbe0 100644 --- a/deploy/integrated_test/client_integrated_test.py +++ b/deploy/integrated_test/client_integrated_test.py @@ -2,7 +2,8 @@ import argparse import json import requests -from tools import login, request_and_response, build_raw_data, build_data_join_ticket, build_train_ticket +from tools import login, request_and_response, build_raw_data, \ + build_data_join_ticket, build_nn_ticket, build_tree_ticket def build_federation_json(args): @@ -18,17 +19,61 @@ def build_federation_json(args): if __name__ == '__main__': parser = argparse.ArgumentParser() - parser.add_argument('--name', type=str) - parser.add_argument('--x-federation', type=str) - parser.add_argument('--image', type=str) - parser.add_argument('--url', type=str) - parser.add_argument('--username', type=str) - parser.add_argument('--password', type=str) - parser.add_argument('--api-version') + parser.add_argument('--name', + type=str, + help='Name for peer federation.') + parser.add_argument('--x-federation', + type=str, + help='Name for local federation.') + parser.add_argument('--image', + type=str, + help='Image address.') + parser.add_argument('--data-portal-type', + type=str, + help='Type of raw data, Streaming(default) or PSI.', + choices=['Streaming', 'PSI'], + default='Streaming') + parser.add_argument('--model-type', + type=str, + help='Type of train model, (nn model) or tree model.', + choices=['nn_model', 'tree_model'], + default='nn_model') + parser.add_argument('--rsa-key-path', + type=str, + help='Path to RSA public key.') + parser.add_argument('--rsa-key-pem', + type=str, + help='Either rsa key path or rsa key pem must be given.') + parser.add_argument('--url', + type=str, + help='URL to webconsole.', + default='127.0.0.1:1989') + parser.add_argument('--username', + type=str, + help='Username of webconsole.', + default='ada') + parser.add_argument('--password', + type=str, + help='Password of webconsole.', + default='ada') + parser.add_argument('--api-version', + help='API version of webconsole.', + default=1) args = parser.parse_args() + args.streaming = args.data_portal_type == 'Streaming' + if not args.streaming: + args.cmd_args = {'Master': ["/app/deploy/scripts/rsa_psi/run_psi_data_join_master.sh"], + 'Worker': ["/app/deploy/scripts/rsa_psi/run_psi_data_join_worker.sh"]} + if args.rsa_key_pem is not None: + args.psi_extras = [{"name": "RSA_KEY_PEM", "value": args.rsa_key_pem}] + elif args.rsa_key_path is not None: + args.psi_extras = [{"name": "RSA_KEY_PATH", "value": args.rsa_key_path}] + else: + raise Exception('Either RSA_KEY_PEN or RSA_KEY_PATH must be provided when using PSI.') + args.psi_extras.append({"name": "SIGN_RPC_TIMEOUT_MS", "value": "128000"}) + args.url = args.url.strip().rstrip('/') + '/api/v' + str(args.api_version) cookie = login(args) - federation_json, suffix = build_federation_json(args) federation_id, federation_name = request_and_response(args=args, url=args.url + '/federations', @@ -45,15 +90,22 @@ def build_federation_json(args): requests.post(url=args.url + '/raw_data/' + str(raw_data_id) + '/submit', cookies=cookie) join_ticket_json, suffix = build_data_join_ticket(args, federation_id, raw_data_name, - 'template_json/template_join_ticket.json', 'Leader') + 'template_json/template_streaming_join_ticket.json' + if args.streaming + else 'template_json/template_psi_join_ticket.json', + 'Leader' if args.streaming else 'Follower') join_ticket_id, join_ticket_name = request_and_response(args=args, url=args.url + '/tickets', json_data=join_ticket_json, cookies=cookie, name_suffix=suffix) - train_ticket_json, suffix = build_train_ticket(args, federation_id, - 'template_json/template_train_ticket.json', 'Follower') + if args.model_type == 'nn_model': + train_ticket_json, suffix = build_nn_ticket(args, federation_id, + 'template_json/template_nn_ticket.json', 'Follower') + else: + train_ticket_json, suffix = build_tree_ticket(args, federation_id, + 'template_json/template_tree_ticket.json', 'Follower') train_ticket_id, train_ticket_name = request_and_response(args=args, url=args.url + '/tickets', json_data=train_ticket_json, diff --git a/deploy/integrated_test/template_json/template_train_ticket.json b/deploy/integrated_test/template_json/template_nn_ticket.json similarity index 100% rename from deploy/integrated_test/template_json/template_train_ticket.json rename to deploy/integrated_test/template_json/template_nn_ticket.json diff --git a/deploy/integrated_test/template_json/template_psi_join_ticket.json b/deploy/integrated_test/template_json/template_psi_join_ticket.json new file mode 100644 index 000000000..503ca701e --- /dev/null +++ b/deploy/integrated_test/template_json/template_psi_join_ticket.json @@ -0,0 +1,178 @@ +{ + "public_params": { + "spec": { + "flReplicaSpecs": { + "Master": { + "pair": true, + "replicas": 1, + "template": { + "spec": { + "containers": [ + { + "env": [ + { + "name": "PARTITION_NUM", + "value": "4" + }, + { + "name": "START_TIME", + "value": "0" + }, + { + "name": "END_TIME", + "value": "999999999999" + }, + { + "name": "NEGATIVE_SAMPLING_RATE", + "value": "1.0" + }, + { + "name": "RAW_DATA_SUB_DIR", + "value": "portal_publish_dir/" + } + ], + "image": "!image", + "ports": [ + { + "containerPort": 50051, + "name": "flapp-port" + } + ], + "command": [ + "/app/deploy/scripts/wait4pair_wrapper.sh" + ], + "args": [] + } + ] + } + } + }, + "Worker": { + "pair": true, + "replicas": 4, + "template": { + "spec": { + "containers": [ + { + "env": [ + { + "name": "PARTITION_NUM", + "value": "4" + }, + { + "name": "RAW_DATA_SUB_DIR", + "value": "portal_publish_dir/" + }, + { + "name": "DATA_BLOCK_DUMP_INTERVAL", + "value": "600" + }, + { + "name": "DATA_BLOCK_DUMP_THRESHOLD", + "value": "65536" + }, + { + "name": "EXAMPLE_ID_DUMP_INTERVAL", + "value": "600" + }, + { + "name": "EXAMPLE_ID_DUMP_THRESHOLD", + "value": "65536" + }, + { + "name": "PSI_RAW_DATA_ITER", + "value": "TF_RECORD" + }, + { + "name": "PSI_OUTPUT_BUILDER", + "value": "TF_RECORD" + }, + { + "name": "DATA_BLOCK_BUILDER", + "value": "TF_RECORD" + }, + { + "name": "EXAMPLE_JOINER", + "value": "SORT_RUN_JOINER" + }, + { + "name": "SIGN_RPC_TIMEOUT_MS", + "value": "128000" + } + ], + "image": "!image", + "ports": [ + { + "containerPort": 50051, + "name": "flapp-port" + } + ], + "command": [ + "/app/deploy/scripts/wait4pair_wrapper.sh" + ], + "args": [] + } + ] + } + } + } + } + } + }, + "private_params": { + "spec": { + "flReplicaSpecs": { + "Master": { + "template": { + "spec": { + "containers": [ + { + "image": "!image", + "env": [ + { + "name": "RAW_DATA_SUB_DIR", + "value": "portal_publish_dir/" + }, + { + "name": "PARTITION_NUM", + "value": "4" + } + ] + } + ] + } + }, + "replicas": 1 + }, + "Worker": { + "template": { + "spec": { + "containers": [ + { + "image": "!image", + "env": [ + { + "name": "RAW_DATA_SUB_DIR", + "value": "portal_publish_dir/" + }, + { + "name": "PARTITION_NUM", + "value": "4" + } + ] + } + ] + } + }, + "replicas": 4 + } + } + } + }, + "name": "!name", + "federation_id": "!federation_id", + "job_type": "psi_data_join", + "role": "!role", + "expire_time": "!expire_time", + "remark": "Built by integrated test." +} diff --git a/deploy/integrated_test/template_json/template_raw_data.json b/deploy/integrated_test/template_json/template_raw_data.json index 5f261e7cc..f7b9eab92 100644 --- a/deploy/integrated_test/template_json/template_raw_data.json +++ b/deploy/integrated_test/template_json/template_raw_data.json @@ -2,7 +2,7 @@ "name": "!name", "federation_id": "!federation_id", "output_partition_num": 4, - "data_portal_type": "Streaming", + "data_portal_type": "!data_portal_type", "input": "/app/deploy/integrated_test/tfrecord_raw_data", "image": "!image", "context": { diff --git a/deploy/integrated_test/template_json/template_join_ticket.json b/deploy/integrated_test/template_json/template_streaming_join_ticket.json similarity index 97% rename from deploy/integrated_test/template_json/template_join_ticket.json rename to deploy/integrated_test/template_json/template_streaming_join_ticket.json index c08be5f92..fa52e48bd 100644 --- a/deploy/integrated_test/template_json/template_join_ticket.json +++ b/deploy/integrated_test/template_json/template_streaming_join_ticket.json @@ -61,13 +61,21 @@ "containers": [ { "env": [ + { + "name": "PARTITION_NUM", + "value": "4" + }, + { + "name": "RAW_DATA_SUB_DIR", + "value": "portal_publish_dir/" + }, { "name": "DATA_BLOCK_DUMP_INTERVAL", "value": "600" }, { "name": "DATA_BLOCK_DUMP_THRESHOLD", - "value": "262144" + "value": "65536" }, { "name": "EXAMPLE_ID_DUMP_INTERVAL", @@ -75,7 +83,7 @@ }, { "name": "EXAMPLE_ID_DUMP_THRESHOLD", - "value": "262144" + "value": "65536" }, { "name": "EXAMPLE_ID_BATCH_SIZE", @@ -96,14 +104,6 @@ { "name": "RAW_DATA_ITER", "value": "TF_RECORD" - }, - { - "name": "RAW_DATA_SUB_DIR", - "value": "portal_publish_dir/" - }, - { - "name": "PARTITION_NUM", - "value": "4" } ], "image": "!image", @@ -182,5 +182,5 @@ "job_type": "data_join", "role": "!role", "expire_time": "!expire_time", - "remark": "Build by integrated test." + "remark": "Built by integrated test." } diff --git a/deploy/integrated_test/template_json/template_tree_ticket.json b/deploy/integrated_test/template_json/template_tree_ticket.json new file mode 100644 index 000000000..07765938e --- /dev/null +++ b/deploy/integrated_test/template_json/template_tree_ticket.json @@ -0,0 +1,85 @@ +{ + "public_params": { + "spec": { + "flReplicaSpecs": { + "Worker": { + "pair": true, + "replicas": 1, + "template": { + "spec": { + "containers": [ + { + "env": [ + { + "name": "FILE_EXT", + "value": ".data" + }, + { + "name": "FILE_TYPE", + "value": "tfrecord" + }, + { + "name": "SEND_SCORES_TO_FOLLOWER", + "value": "" + }, + { + "name": "MODE", + "value": "train" + }, + { + "name": "DATA_SOURCE", + "value": "!DATA_SOURCE" + } + ], + "image": "!image", + "ports": [ + { + "containerPort": 50051, + "name": "flapp-port" + } + ], + "command": [ + "/app/deploy/scripts/wait4pair_wrapper.sh" + ], + "args": [ + "/app/deploy/scripts/trainer/run_tree_worker.sh" + ] + } + ] + } + } + } + } + } + }, + "private_params": { + "spec": { + "flReplicaSpecs": { + "Worker": { + "template": { + "spec": { + "containers": [ + { + "image": "!image", + "env": [ + { + "name": "DATA_SOURCE", + "value": "!DATA_SOURCE" + } + ] + } + ] + } + } + } + } + } + }, + "name": "!name", + "federation_id": -1, + "job_type": "tree_model", + "role": "!role", + "expire_time": "!expire_time", + "remark": "Built by integrated test.", + "undefined": "" +} diff --git a/deploy/integrated_test/tfrecord_raw_data/raw_data_partition_0000.rd b/deploy/integrated_test/tfrecord_raw_data/raw_data_partition_0000.rd index f10e6014326d54672a3790fd8853321e96d9f20d..662ee75611f9687a33d9014e590d82bbdd78eba6 100644 GIT binary patch literal 130048 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 bzn?OG^2pfL-C~{>2?fs+U2pqs(wzST_*WfT diff --git a/deploy/integrated_test/tfrecord_raw_data/raw_data_partition_0001.rd b/deploy/integrated_test/tfrecord_raw_data/raw_data_partition_0001.rd index c86af601521ab2dfd8d5c15bcbbbd3e36e8a44d6..5428c488e6fea21383de56ce52e2eee8f95dee88 100644 GIT binary patch literal 130048 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 literal 376832 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 literal 376832 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�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 d|MT5fxGg1Oqj*vZeTSmjzBfb+!Ni diff --git a/deploy/integrated_test/tfrecord_raw_data/raw_data_partition_0003.rd b/deploy/integrated_test/tfrecord_raw_data/raw_data_partition_0003.rd index 99d155524a63a920f2f1b0e282ddb22400caa2d3..35e28e1fbd54b6587717f7ce8e92aad2ad308fdb 100644 GIT binary patch literal 130048 zcmbV#cR*D~^ES-_>Am-EirjP0J@=d>ruWcH@5RJa6O+7&X|GWfv7%V8VizkShzf!V zDk_MA0#?M1iV7-rME&OG{cC5Rf&2UJpXcs5&raFhnc3Od&H?}Xb#ldS5BnkP@~{@2 zKJU=6)733*4h{ziAKg(Qz26d77SC#$mxk3L|9 z>risXsI^K%a2SA3>a#lH{nW~r{egGs@IeeCMC6m@LhxHo#7E^8XLt4o9xxh`R6k%= zl-v!A^*H$ZFIOcpc)+I<-DgMhH$@O{I8*?7tf@-Nn(LE(XYfe&Ubl?q);}ABn7uLO z6sIBRrK`gCF?dPSy&g=Jhw&vu?+%nxd7p7HiI+q?>@U2H;cXqRCF>D{Up+Y?%3ixP zo53UI+knHtqCBWIP@pkm;v#vsI`14lhQUkBw>g&s5y;`JJ~5C>^tz^cAyaP5*v;S} z^|nkZU_R_v*6u-3jQYT9p0AzF;Q53lal-)uX$c9ZmOvQik8g@R+2Px#89Zot;`EUS z{9#k%ieqw8b>@f7$$NQk^Y9zj9p-$Kr&z~}d+OEUTQ;nlozOh|=&FJknM^z&9lLqz zL;v~oiyjPKkhMD;PNu%cKwO8jOQLmZTd^JmzxjH%-V9zF9--*_8C4CD5<}eKZiW+x zB#=G?HB!E240po-5#aC#fQb~GLg zhTZk&)_WMdH1OQeSE*l97NL{X3Tg&@fl2mAw}{UfJeYPG#~>skzE&utK$Xc<`kY z89bVHOnq+GG*q7M>1`m<9eXE5=lyhbJcHN13u6Xu(_z#>tzW)wq->R#PTgJ3uMA#g z8Ju>~>bFGd>JF`Jw?{OF>95OYo%pm#cu3QQ9V_K&$K$|JM~^kW28AVL-qj>L9$=PC z68!}PJ@?dUV0s4hntJDU1}_af%R=AH+P8@>alty70gxePNzWjQO>MO<>P zo3Hnh=G(mQFk(}k)uX+R9|~2^_I}r|v>T&dgtrl==awu06JRjoNDzj%N8jf9rLkkii4yXJjOc z?yDJYAtCr4Yh2*!67ojQtT_xGFy9OZQ%)e$ZqcOly$xs@TD&G=)?Zh>=nuRYRy4!8 zTEG!7e&$|ek3aBtx6c^7Dtl4KOdK=tJqD!qC@2N+VbyJJ=ivp!eDaVrLAGYhhl}l) zgbL9vGF{%E%Ld)YsMl~>ikfb~pjyqisnGv5skzG9;PyFJFJbV2br;5-@^{)X4RLky z{iVVO%)jYs4}(X{H^3-@=Ea7i+anl;tUZQR^InwU2fXGSf*lhX20N$6(ty7rrm3k`2B$rbE+S zj<{Nz9s_ce9_v&hbtv7H5tTHv%L+z4V17z>`(?TG2a7i zy$SWbfN9x+a~U(r9>49?R(`@;nA!ALV>Vw7pqrePxIF6ge-5^0@PPTVm#m3l^g!p! zv;gD9s0X#~_n*om3|>`E*zt)~*?3VwzMs5edBZQJ-f1#;H0L7+EtK&?wsz=kz|sR5 zgJL{~&YflOnj~9^vzZr8uvO#I`K}+WP@yHb_a(gL=|fvcqrr zbzUfgS7nc)ac~sbV!XwqzW_}mC!UW^f92Y?3?9jzcE3dufU-l6ws*}IE|Y+uR}!Nc zJm_f7iF(mfGi_|=(_>AG_-qvL$A{Nl&)`+&%X7Ztf2lfUnG9a* zGmjt1Ba9qjBszKwdUP~#Ow78MuKt_BtJH%iSrhPZO9957Z`YxN906#i*Ej_NqA^AduUHr!~&6Ls207m zR>eG#cmofvpn<15hlrjL>*tGevxh#RDRt{f(^5w<>a|AVE~bY(Pr%i>+%a%@_BB@} z8}z|D^?d&xQV+rlP4tRuK4gA!&n;0^AGaC8s0Z{UpB~7kH_?FfxZ%X_d#v#__|skC?&D%#ky3}8InE&Cy+tULV z&fsP(SUmz>x$0bV;RQ|S;IcMzLlU0qXs27`r}My5w;y2CBR0v~&>s2=DC^Ar6Sz+t zs1Kgd{a^0pZiYr}3-tZ{se9$+g?6h|1;z%G$9d7Zk2~0amg0geXsdcGo|XuFGBMmp zZzmr5rw?O3fM1c+9os7?oWN&7d3CTn=l&i#lEJHN!`2*y5kN0b)(w*d0wWJ!)lFK> z;5FIH^NF^D4C8qo99~%5b8l3B+kvMTyh=R`t}I!Yj7J%55=)~D?LfEax#NXz8NB#D z%*pV09VCa`+G;TQ@tv%|=-+a3{Dh~iYE3S1f!%y=1?G*m*&XCrmN=QgqiILmy#~vd ztl{)FP}DI=vtmkva`?EHm``r9sup-qU~hU%@)?l161Mv2nYn&YPZ{OlK&jSjV`zp4H+een>6BjI)6FvEZ`}lc0^-USu09=Qz z?0``eUP5v+T&q5te+8png%>9c%YY%1m77O_*%c38!;{*1Wj%wJRL=lW6PTW9QA?m| zH91+_OAk)o{Bjh72X9VH?%rOqBP{IC`yQ)&L{@0*=cnFa@S5tuIX`ju0#1u)(pu!( zBiXy%rSHe{IbUKvY|$4~h6HyhKf#SHwFOoh3N?tm1W^b$ZO7%W zis=_Og6HW<-=&}dpguLF572aO)WJ;D{?|EQhA2Wjar{@6NXqBr?gBMU0`xYKNg`(C=g{Fua2{*dOx^ zbRgg}J5J~kG>yeD)NIkdyGW3IbN9FZVX_DC!+X*hYz>a5tU(XUq78Nl-ZDPQJXFl! z#l|qWVj(A&pT~m}S3%ysh;sqwlNdY_umv+0c9x{@6C+?|m5nXSp88!3k8B}$FW<=k zaUwB?(xSJ4MAr>TiH!ec4X0j{F?168lx&1{zU7r=O@FC_B+%&-zl||pZ2`lImRFvJ z=r2I(f(9}|w zs`kjns%?D}`-`6$>Xyx8g<$Z(`M$A?&d5RrIRRylE@RY7%y(eYokfp1wHp6mj`qal zgqY99FXTy6+RNBh&>{}9Nsf>I@7pmbs$)^=`;2-G9uF`IBLI~s+`CSUELvLRA;5E6 zhmRS&$b2q)=sNXJn*+nYmIK^`AopMY@Y4yZBte2a6owZk$Ilu+M$B!eSI!Md-^Hj` z;YEphDStqd6ZG*`4?YWxE&9R-OG5v{;DJO_GIE=sfeQuN=H76?{E#l=I_EbJKP|6; z?@fr4iPr_9pDob1r-TE_w7gWznneVDx;2d+H7e4FndtH-N%R|xca!XgmfbNo) z4#NW(jVtO4GRbA_aar4j&+W{pSK*;DZJ1Sum5D+Q67x_rqQ!S+^|MXFi*BpefNrbr zvBqR5rnT{DQ46#0YkE5Y4|1HgaJF;{uu59X46znA{P$f(z1DXzO~Fg2%2iQ8GM9}S z4p%&S{rTG`{n#8l{AS&*5^iJ*j1qS-y@qpB=zpJQ@Ia-{Z9EGMMHtxeQY3?OMAAmL zJ8gU^kL!tzVOFA-jsvK0aIEyq+Xe^-P5!&ZO^o{ggY0qIzt_L)h5c0vqrN(mu!_M0 z=C7*A(LG#=OO&<%EGsWP)(C4kXw9Y)1`pqbw#C6ra@tkS%hLp%4bb327Qc0PJc9?+ zH>_JFX5D!`&<6B9*5I_P&$OrJ@TjIrj(7~f>jBdnthwN831~`f+!(#~!xp^og(Oot zb%5l84kPew9%z=87H3A-sk34olZO~O$wc@-PuFp=9ZUUQQ-p~2q}Bg59%rNL46S>ffY9< zfQel^+~D>7l!)kx1JKW@_etTtPOO%`tC#queOlg2|5;n7)6f(^H0y6 z0GJ=x>4|4&FnI8C-;vs>Bzb8=RSYo$ZO`Hj-*7`)n)7W~@WxAzRenKhXZ?=e;N)1V z+Su?iM!hC`+0vzR7%DUjYJ2f-WCY9QAO~ORrw7+xbGzZHhzy>gloj^$Z?V z6~6)NXW97B0-&~G?s2~F8RE={^0VZNtsS%nVILTKKOTDuMw{r1o!7K3WXwlw(hf$z zC1>{81~Ai#GlcDOmA&~A-^T-dn}2c&Sju1w#|C*8k~m%Fx};kTMm>P9si7}ORwGz(7`!=P)7^rQ!(}oSIXYeZZFs5tcLI{PkCd!i|if*)+A6Up|Jx#@M4=8$} zc2r(ks3~B6!_MW=|GlBSicybr7RM)cW>GyCt+(<(qpzqv4(NFM#viuD^J}8^GnA*@?PYtFZzvca*px z5#)7!eC&C?iwWR|B~t-g@gv}*JB;tyR4YLhO7Q0?wcjz>vld9_)}|MLJtMKigpHkH zdR%y7&vXVaQAz0tYR~WhLs<*B8o{FO?N2Sar|E++@+3kP70?)^$C_3^&EGY&PxQ2- zT~9FT;Wxz{5u1`4fVSkX)%HC>j&|#pKAe-r;K9enomvF!d@=B0gVOzoD98NeiBdlB zB-xXn>W}QvK0S;$)J;u`czf{8A&h!Wa-vb?kmm|`b!gd6=+pU{s{{nx|3sTd8NAv8 z#=`Szrh|beCQ&-Hc@CIQj}PD6b!?OHa4K_L;nFPR`%B{=G=fSGosN9(`}@x`c)-q$ zyGDS8od*d;Rdnb8KBC^`x!=hCsCoF|`GbI=t;c)>t#!!Vgz(lS?LJFj@EYs5Jqag~ zQRP`;Xvx9H2I7nZa7+%Ip}I8RZoJu<-XT7v9@^cgI& zgBQ0G9DHKH_gEc1aGE}zIy@$9*#{3cM?FlIbUfnW6yIM!f`$272tK%F*AMyrJ$Q3a zMSp?Qq6zAtit+rwN`O_ORDGA+hr?L~ct8h!X{J=$dA+%gaIzP$73!3bqp_tTI zgAF=)zuwV&?vMi;-sVM5Aoa4KEuOap2TFA;;8Gf({7J>j9&lA8F zqvaeQJUW8O9;n{t4RqvG6+ZqTZL~|X6RJMY>aTAHJjLKO7KtG%hb|37qN2xuhM`kd z^C(cjq;AeL3?6;2PigiI{o?%h-fYu>b zo#sVN5%uIXtD+Y}y$*7)VGw%j_Jo*|SKRm*qh8V-I(7g!(5L%07_fD;Qwm@!spV^{ zuX~-rYr=#J#(=!>@>tY%w()xJxQe<}?Pc&Pmu0ng;MvS+v3r0SD8PG8-_fv%!E4lG zLyb1Yfh@*spUktl#oQOivA*e8!S`^%NB69#1XHH&d`W6UHT97~JNA@o+VE*dYe=`> zQuzY->Hqzu@e5A-4NQRAYfnjgzd$D|7x9=%Qw;h ze8U1d1EkRi;(ESs^0U6e6!CA<%n5ICYe$2D>-~l!tA&jd`YuH{kO=9qI;?{GuWIMl zVMyOM`OF9Xuf-|Tz}6yIAOHR0Kywp65XU-*hF4sD4=~mFJ}4YJ{oh|2Ut7+J{D2QU ztq~aa^f}7Imj(m<1r(@Y_IPbds91Gj0n>a9UhrIfU4U`DIVXk!yZC?2Rn`W)@WI>s zJRWPIYrGI<^nD-B!y|L32slzj!!tD7b2+0P@NH3)*^wLil^Tob`oh%sf zz0j8qy{a07Mdh}uMo;ERQ~X6BjFG1^zzPUlQDTlM>}37>SIt`=Wcx`yg%Q-AflWK# zH=!M{tM(A+aH}pozg)=RRSd8N0*$ZY?iGUZ*!n+AJG3*7#xve9 z&&kwof)466x8EE_y#^1BhY|5qI8|j7)-MXSNXqPS-FZ{v7Yv?%Q|k^$J0(uioe3fg zbW%>o9gAxH#P|se9%y>ab~+ZMb_?qrIxr!e%lGxz{au&dH!ygS2HlK-f`{{d{obR% z3OauV`Z^^nA;C+|&dl z&bzP=uuisuC}RO>rB=TpVDiUj`E9`PMR`!;(+I~VSMga1Oy4cP=pA)|F(1N%8w#NL z-}5M4%cF`Cx4y3H^XC}#nu1_MTPq_0y^b}b z&I$)*XpDNj?SAh61A~Xm_v;M6!hw`LDUDkSYiWdqwY%$5ekH5)J`7EvsbEvqT<%HZ z6~Z%-f_jYwz%HaKbc~|WyZqA5P zgo}z^AcZzuUj!ub6mi%Px=BN)4*=^3pKyhMI?2s2g05T6i=0Warzjfi8Ay(VxtUqV zxAJv3WP08W-J4@RbSYgph?dx^ml*2xy`oML!5?0{I-0>l5~1s|u6!SuWVwqWY{&SR z@2$OZNk;|`R8NwJJDiaN%|aJ71LOYS{@oEjyprWdTyMf4svE-i1{HyVY+CQdCCBA9 zdymx)K_lkV;SLoYj^u?s>9BLxwyPZF(^Sd(UBX})s2)HcpDB$3A%VkwGjT3>@ zJiGwm#pt<<4y*vd?%76l4>dXPZT-N<+MI}G)N?LtAAw04J&rDfI}9$mS3}ZV)AP;M zKfKN00UTrqR|gniJvmo8NJz3borfzY@%wUA>cOfC=d{xWQc54;pbJF*eO#XXE#E>$ zq*8GWiG%bPkp2AC6a!ZY0fFw;bIKNe&zP^igeMXzq5&}L(`rCEuNa(iS>d0Qe7lpu zYqEzUYREFmgh7m=Dx)d^qJQtQJefP)0nNelbYK`#Zb+pYeIxfgc1teS_BY>q9tF}hp(BW)5 z2H&jai`xhWmDB_{Jx|SmyZ_X@!}!TOTTz7vgBzUlCeBh`4S-(Wm(DE;1Cm~8_fMw| zO;Rs&9@o~a9hxAJ3Zft_FK_*s!{CuLQOE)sK`EoCinK_rW*l#woOmyTmtHo)k%j|? zHx41k7ZE{UP$e63`%1gnR8bNv9W??thi5GS(G7kLw;0`^uXY~2x7nj1K6vQgAKFVb zv>81j=jjvL^bmCC<=^p1S7JW)(lbWP;_+5s(8GA2;SO);^Uz=>d%)#|nZ0;e1}+2! z703{K4=T=u%sJkD8H3kY#E+TCW04A8fX?SFo(b1`!);X^uA9Q(rS5ChGQo@l*WqCY zM__m}yy4B`cQJT0WKdB|(RngJFaj`T$*_v39i?@=kjr{;()6lppUm?+<9=#Y^3G zL>2%gRcK=5(dK}=#(Ve+ ze~$qJa>vr)UA0?5b#uSxi8JWUltr=ush!#J+uX3t558T_H_!q6&~&MAqK{T!L1R_Z zj_L%ycKo{e%`qP?FWHGb+e34f>TpO}soy&?w?5^{=HSKc2m{9rrktC>PjX;xIPOg| z-%M!^9-gS`J~>aGa&TgUL623{3po_ly$^#|TgZkT&S0orT@E8$1~u1)bWp@&x3*#M zg5=!jVp6CUYtKEr9JH9*T0Ki!6w6dJN=~m2fuZ_c_7+8TCl>skVmND_O-* z84hUc4LdYHa_h6{!T!K&5jlMnL3@13(FD;7bVoBVLZJ9-S5 zKW|Q9_4adJ3z~HsM>s}7%;r11!VwlmS z9DX2Ddh88;>Ujna8$#JHs;mMTYJ61{w-L>7k6oF{bF=|z{f^AxAvs`Eh`yhR_xb5@ z$Eq8@X4DI+XObt47(_jFV%o6p zFHI|;_qnhrC+3sV+xS+JH1Nnv*S^bB&Y=k~e9r}F{+VWY?G3L^V$^FGylODC<4sDG z7ds9o#yJxvMfdEslqbp}9mQ8Q>|0318nxc~ZEl#R*IoMQ1V+6?1Era3P|(~zFqTq> zR0YQCy~pT#$H@wR;o-3$Q!Ang)AiK0bqYOXyVC%8<)j(OG5 z^Lh;!+Z;S!CZT$79Cttr;+Rxp6KRykSr)PEb_OrWp2|{cjDhJuCbb09Oy#`A+|3Aj z<@b5-`3nyXuJYs_(4#dePhaaTcd`OU6u!fEF;$(F7hF_K0k06aQbX>b9__Dq^DN&; z6PXVSU6@qX6L30q&M_W!0INsXgqAfI{bfF|cK8&7HJ<_-pognt)1#Aaj6cfYRpyJ) z4U@tZNS$%eW7(*Fz+z~1$g`ebPzO4?buHCzl!Su97BG%yYB7?K$|w63G3o*QxkZ!{ z1oRkDPkZ`ON9iw>wILf{?#L5oG#I#A#}7=Ery0t{hdtwaxB(g6o(N>rs~v=UMi&v9$ZmjfF}hH#+sD=FA@&(r`K%k7yV`zgO_>&)K5M+xCyTE4I;4M z!$64X*rWRQ<k6<0#4NzFOGG{Rb5f8R|!VGe!^<^Ybq zcwAidJSba%9}5b8cHnP3u%`AIYd)nSh)e?Fhq0XtCAAS9bGx@?%-2}N4Lay%Oxrr6 z2~I#a!(%uP_KRB2;1TmFKB4uBJ3nyRDc&(bG}An8b8AOsK3v#~mL>zwS`4~) z(4{3Vs_y5lzPy&Jo+MN%kjZ-nID&XbZ-U9B$H|k?t}m;2g*ok;{*QY)YY%WzCar-% zRgdWzd@90Xve)3@f%o)bV`ZV5Sk>sU%DSJvTc4{?gZ^x;&Gj4^6*#^yx~UTp#A zvc_J8Fiz>Aa|qhN5q)H8z3RhO0~x%;DlO?A9zi;oJOr3E(C_zn-M^I-Z)fm;Z|Amb z#}kKEVo=;t@K95YF)hO{8Tc%Nm#9Y@@_0GMyZyCE$$U317OV@1Ak9uMM2OSyps_H=j4>`6Os~#l|h|EJ72vrkq?84yDv}60>$BCPz9(o&4 zUtMq{`lX{2J7mha{CqIsira|v)%TxE`+-pp z;bGi(?i#A(&N(774@|nP_B8zA_5&VW^(j+Dt-&~7K1RPWJE5vWA%oW>Bp!^hw5v2= z2+7wBbZ6eMBQc&C#u5fEaS!JAqwh`~p8_{HEbTBsz{}?0nf}59;lUlUQ#JG9@@!G? zLDiI?)K|AOGI)*oe4`f5VaxX~!~;&gNW^m4-#)kVAqFopANmd!s*3=Z$+$5C_&5n3 zH(~um29E|FT|=TV1;*LS7f_W?mBXR|WEt)m0XZueJW$d#BdC(Jh7V)AmR7+~T!?*5 z9|@ew;3ei8(3`R7G3fBtqa!#MfNKym{L7VI2CuSCo?Ot4AyDWSs_J0;)pEOzKIG;O zwhAv==@u0-1Y{SiT`FLKJl){AFHhyWn3{}b;o+!-MUPb);M%ykU|WQ9>&t!`+7`Z& z^}xwO&3x9i6xK(gFFr8gke^$~7A0qBjNu1u;Ec3v809*m;cU7$RX;GCsh*_yboGY@ zkCzx~sWKlriiw-z+h2X?VcSo5I`V)>pvOQ1^HwDCfd_Vl0y>1EzaEZ?njJz0KaM1L@|hGp(G70 zat^iD@>B+uKF8oy4g-A^J!uOkX{^hhg)I@w8kIMq?EeZ6qns0JDSt~+8!G#N#;iAd zeeRaG89Zz#-nnCGcX5C^CD0@+>#;uS;_0Kk7(9^u>Y90Azh2Dyw{TjA@3AV`z>Ful z@SrMdf!QWrL}yWg1|VSPq}9Ox3YxL2cR8b85+Dv3o#~avv*Uoa!o!i4ZQR%HXTFi9 zjZSRS;ds&53G(KNrA4Cxvz`e&<0thFR$qDyn4K`WfinfzdV!~IckxVBKdGmL2vtkq zsyh1=m1U8{=@{|fn%vk@KMHa*urMfiBErB;$fC-TQIi6SxR0k%kM)L*fT$gXt7`EM zx~oI%mN)bBr#@k_S3io)r#(}kIqQ`#FZKPU5f<39eABlKUTdVgm|$Y`(rFZ+g1M*T z#O(xnrQ0p%-(&D9^>`3d#Mfs?6FyQUB4R`y!Z`ZYQmnxZkYisTQ8ju zQE3ZW^Tshg?g8@wSNj(qhO4MIoEt@=mqJbBo{93K!d%ke>D)CJeLpWnauBEKu|`;+ zRsIpLKA<&%1J6rQ3&4~q$Bv2v&G(AR{D2MKLY||o!SnQ1F<#)sxf{oq(5eI(;?#~< zo#3bH(fJOoXV8w=bRrIhmb~-@M*S;;_ukFmQ9p4EVZycpz^>=X4x(x3HEi?!?|4`d zNVL9t4p%)eA3!(OOHl}ED7#&$>BHV&)QgSb!m(pdci=zhi4};aZtKarJKW?ayq3KH zceuPbRbfE#Ss5sulT z=|WP(eA9c|pi_Jw52)V2%H6uR4nGL;xW$APujwSN*v6+F^jXbgm*-q+3J6$QeF%68 zf$<$%e94#(;dy?sJoDkp3=S6LfEp}eBR*Xl;txDu#$c#yQSnNk-ZJy)Y{r|0_lj#Kdcg@YBju~A0; zzSu4ML2vZSO!KA2bg}~Ur0~Q7pwjT5f>%GAvAW`}NBxDznomx3isYTurP&cek9z ziy4dG1uiBxs^O7OFRsG4vtUZ(k1zJTl~E7+K5=M{m@49>D^Y1FqUe_@3m zwG}tdONG{&jjo5_g(^hLgx>C!@b+OwJ@mda#Y66^u z?YZ341ey<-Zd1~WpiT7G^uT@p{|l~7IU-!_p!4OGDR42Q*Q4_GbL!O(!tlw+;-R7! zZ@b{+?0c-KUQk%^YjI5WS|c$f)uv<&K<)UX`Oxw4HCJg1x-#>D-V9!n6vZZxR^li} zzu|SE_S&om%!1AR}aXTNdb63R*?%&J93746$ z(NU40n_t+smN8$GJxoco@l6gZHxCgb*uGa(*$4hLu%au22h^8tBs)^#K4mc=oj|uV z^8NOZUp{+!BZJqd=T|qt!2PE3WnvD!jk6r+alw)tp1lC5&p1bCF|}^-sv~f1w&@}T ziEpN{`jUBmY^0^EYQ!U1E;nJ*U#g&imlM?azBhUG0VGHhhLy_Wi;&aKV8xiOZCard zBQ9gI2h2||yC|z3MO0KW@zO)hH1UO8@mt9Y3|?!*RSzx$gL~24xR7z8n_-*ww38q3 z(}bcr5I+H?arDJ+2x5>c&4gGy?C6^rivD@M^IDhcQ573KtQ{w`3o5H zf$aOFpW_Y+w5n~2Y)H&QL64A~!w>Lsz5sr9N+XAt_1W)|5VmE-TD$nk6pi@;q1?cg z7a?4G;li0Ak>)!EJhmfok5Uk{p5fJqS^^es**1n7jDdSzKT*eIuVIKmESoN;K&nTN z0epFub}lF2%+AvrnuCWPt?iX9So%wyh+q_O?82hxhxcB%m%)RM&)S)a=X^PIVQXb3 zKu$;Ng6o&@oGrEEcm}nB9>^9cwFWeeOSl+)>vKnfny0>d$_cJDU~Ut0xowJoARVzi z=CZ5P7`#e7oZx3=9u{3ro6;FH?S)Y%YWdo0!+Dyp3J=c#OiCyP8#rRb!^U?h(BmHa zcW@6^g$D}L1PopSD6s*^{(RrDFdL2z=@S5PD z`15+7*R>JomlH15V4=TW&!6vN@WQ0)P_YHT!nH@@dDIDxRp09xVJ#1QaaS#aha^B> za^(a%i>rN;pBfgIA}8FNn%bWy$^sJmtr!J^D-P9jP&E~pv*NB3y?v<5w;wR-0eo5p zxy+JK@R<#@S6Ch{D|b*wUgQihU-!)A-at7e_s;||@SxmxGp=ORLwFdKT`+>2cun?V zVyr{i1u9cQo(?>HlEF(%CP!X_f-7l8{(3$bpuyxAMnvVwN(QfCz#J`yPBs87={2j2 zTZOXf8J@C-Kk32X8Gq1P<=||FaT=TDA z8_ePTk-hBKJ1A=bE?Q-A@liqVfAKJ*USmGYNO5qcLSuRYXS}>*o8DJDR0J}3AkEdI zX!jj)UONT>tP{}$bWHpD&sQ8|@EY}8#pRJiwJ%X8=`o;b(yD$@f8LbMvzAoZL$U2z zPlwAS6~$h+LytAWLKi)M8$SrEHG*D_LzN`}Nyqvv=SENy%(5#(v_x5vD!yRAK$=5` zBLD%Qr>FAz#JuJGn&;$@vNsg@$&3OO@ZpgAFqwby78G52Cp)|3D$v4)lfL?-~$TS9@4a*z zgGZ`ImtLs70{*plRKvkHY!vm&j(C69H}^AmNq8tt0S`Rw6aq|~=`m<#yDOib?a!(AA>%4KY)P>O=YB%HmFmWNLAh7M>wE04hgC7r)j zyLlF@tYYlfp$rDZCC9wA^j&^B0X76XpnP9Q9(efHjSJhVqU!FP&&NHWe)paw*xb-g zNPrO`M!X!yd*Gkd&4v|a)x$L|9Gomsvt>6As0Zd;bC};4gLTRkjxrUHV*c9_u(0P~ zy5>UF>wp_4eQPk)6XE&R6dX={$Ik_x4hlU}H{Ev@KExizxiUT*^GLXKbXBP;O$B(;tHqMKp3?fdPHq`y}*yenXOy)0FFv2sDy`ho&J5y zXj|7QHIh+}*hD!3noOi6hG3u-I(YDEuKB_DyuE-2S2P@H&83@w;ZdOB-M4TRN7+oi z*B^RyG!HGQ{DI0e;OqjdOq3%a4IGp{5d6_Y?fK~hje1$9=;VRgS?HAXIJp3AaMGoT zuHRFB{hrAlC~1B#Is&EwA>V^O2wWLyE6CUSyM6O{8E+K^&Mg}^?nhxp`k=I7`|n>G zUxUB+^O>s|^;#pIgoVOX^m!>C_usz&ODCT_5R*~AD~`c~mN~0>fb9dGs4I^Ux~vin zXVdI*`UW0efDK_Z``F%npjS=wf?xO(Y&^V$SDMn8-^BOe{4z6T9glEed71V-?I-(Z z=~AgG6g&9$F%VbLQSCl95bO?3yteiVCVRwuiVaB93H=4&bBZagLmfll98=)2UJczC zyo5s=@Th0>7{HfzKLP@4d<=y|cT4KS;2{QFGUuF|D24f5;dDwtr5s-eC&gNQ2aatQVLMQk_5v8lw2PaTGLf#RPsP3s667 z><&E1qC%ED4ky|F#0~qK^T&B`Mdc5SZp5b70_#T#J-foGKmy{a*Ojw#(k>=@iFNph zL(z#{ciSpt&yw6hrj+4nrh!wZ1=jJ{f`D7JRQx|-Bo zAivO!S5M}ek7RF4#{uZGa6{!{rdA{dEjcl7N9<$Fhwxl#(5AdtaTa8(%RZWI8*TGf zF?hiI?Q^v=EqDc|dJvlG$nJ<^{1vf>Pr7{CLEI3}X1K!XFRcgASvat&AnM3l4{#S# z&|7j!(A4F7tikE!b^uHFWlV|MXYJvcD#$?Z0 zNTb*V3n~ycJV&v8R0&umTJO8GaVvudd^$UE3^yJ{--Q-3EF>`QTXdZ>{WAs+RE_3K z#Ln1MO5OIGSwJO2a^}|YNmu=zxLT8rV=7^$LHZ%OuUu2np!?@1{@@4o6t0jolK#>@ z3lGFCE2-v5{=tjt!*BNoo|{Rs=qb%Z>kgbFS61ak?-{w7rw>SE8mQim%SDe>abf#t zB&FJF-3m!MagrClK&pqMD5X=-ZJl~fwMdZbyN`Zq;|KFmT}^Q=cTsDVA#gik@ScXq zH-=onWv{*omdPe?(e?t#2YRC0dYz9RV?WN%-)jIFjmVb9IJp>1>2 zLvJc&N`aIS<8slV7*&H{WSE*A$WG)ZQPmgWD4v&IB6@Nzif(E0L)(kgOZ)d%x~4Pg zIlT5Qc^ROr6(k3G3?!PFw>9$pc6acdENPOU@D%vSuANI^$kIj4wT|=Mr=U4Iw{Uos zdaz*z<&l1Jniv9b!AneB^f+bYmc5MmpwEEnvsJKIxyz*;6_KX{kGt$$?`Q@Ou#WCP zr`)ByKF~2%yI*^?{kEp9*5kS6le2dOh~iAFyx(X3?#HBC)bAi>J{h zY`}@u(>pQh)fQqn+vUZJI6c;2p|!Jdd_`pcynTM0$vQe`HlA705fLeiz~!RWDs2G= zmM!Kd(pU?f7B~>kogXO=L<;I4`PlCFH^f}dm=9!MvAQ3KPhBYD4 z;{mXrda@ko<%XVxvW8Oe4NWHk7GzKQh*7UKg5hbGSkS`d`%7g2RK4w`1(5~&KjG#3 z`J2+b0#CaTHW+Xae$C>%n8QQ9PMlG zXo$y6$mIhbFD%1%p)w<)YUHgOn}lzICUh}1!TamsE+5|z(Z@Bzk3v^1 zh0q5XJQ$+YML7MzK&Msoh^j=8VU#W(VKI2IF?5wGPE~@{2wFFW7WD}E^!;n<{DlVt zT94x(Eu||=0ZX?oof_f#tDz->S7$x2?<~d(4D#s#&dFkItWfhmZtuUH!K41W!8!s@ z9+vK<>cN}f?5g8b2GRU77Vc-OLWas$k?wu?6f(w*qdiE4~?$S=D!2B=+ z-TKk$y+1y$Va!LWhtHN&))exC81e*9pU||ZMZ?Q2+B5iOnGX%^0}D1oH_#woUlNMP zbD(HD4=Y0Iftf096&v{KjG+m16SqoR;J*7Zc^z$yMcgkHT}}gMv1A@S3VkGMp0+EL zM>jNhURef)ma@B73mEcH1Gh4y+Ms0`xK4V8K@ z>5AJ423;GyXs%~vHSs-Bx%ON~ra-h(!*;67ea*~Q3b-+q)cU+ODuRjWONldIeB z9qol_Q=c^1QS?| zA#Lt_I)}+#gaJzyFKQ~t112=2u9zCR?vZSM7*f+G7@4VRIL+r5j7=9NNCX*XJ1gZH zMm<6(fFe(1860r$NxO~bvp(x zkx70YVhnQsxZ?|RwrY2ri5&UglYTnbZp!}$j5*Lh59ZMNnrr;w2oJzugHUC_0RG1+2%}y`!9c&dIucEYfETY5M>x_%!C2D*P%U#(ffH5D* zo_s{@UGbQnn_89&pjWefR{Fb*$q znGX4bDPm@I7M_G*^?)0vwwdk+^JRC|O@FB!1``rY9nH_!9C`P*%MUYnjj3=iV%VH5 zvhq_^0<}vpzVEi}hyDum*U}}=S^Xv+6v)Ab>sHQ=eKBvRJeJF-mt>8cY#3oIII%r0p6sYSTH7ikAViB$~~p$Qfguiy?*gin;7-rV;QyQfqxH!E+*~a zsw9fzk(xdqpS_O3Ykh<=HnH0}a%qwnzxTbO_AI#m?{Pd+6>*q$N&!>OAL$EHkHt(f zQ!54-a7E91_;vz>*U$EW?rc0>Dte+OI-{TG!66TKy#}< z@G?o10IjMsi1xx|bJ4mZk&(GGPx%2)dA~p<5_Z<>KEA|xR8POfg>8?9FnCS&Fe-Pk zkgiKYaw3mc>;W%w9GsQ)Lzm{@#T+n`5|RN^Hmn%TnSwRnZFgSTf~Sm0eWyD7s*u6% zGE8(Z=}pkf@mZM>gIad((;W3Yswr+8m?kuUV$Z>QGAWPQ6Sn;ABMcsNG;SW%*Auw{ z;|NGCC|OzMU*Ll;es_$)OE4Z7pfTw&=*+ z9DxUk$5U~AoSRXv4LoQljyW0Tj~1gIr6*mW?gT-Sf(s z+`k9#dy?qZ5J@Hdi6g)*8PoFS_Fcj^(lpMsMk8y>$;DWm$&psYCsXe=UU;RL8(Zqj z@)U=6MooGQ__wX!S}+f^X!ZJyB~11j^)P&8Qq?+19JrueMnCQ1iooDubzJi`cz$Rf zF2Lt@7eUX~luw1zUr&y|r`e4(2zTf--DM$>Pc`hh2+?ffgfD)!M+IZP_)TssfX!`a zl@@lN17o13<5^#Lyn(^1{f4B^nREge-q5D-kPj#jM1SS~Je^<1tHO)J#)FSKpPkeI zJRj)a(-&5(&H0g052WNl$+vKaDR)R;(K7ITMWrpcaOcVn3|?&^1_eDRLl(vn=Io(T z`-mu)Yk&7=`DO}i2!nM8w)N(bW^r}(pv~2Q5nBtMX4FG?aWl??E|!M_AiuafH-Lj< zCN7Bf2VNg^U}nwglMe=jm}%m1dH(w7T3%reQBOyW0o=4>R7XUcB)J(P%fkq-%iP0j zszP{RLNxJNXxE=ki05gXAys2LBr@hplLR`64AVsy_Mqcg>iB`{y~l9ZJhNpkgNM|M zj+=)H*=ziV<8Rj@DvhM}Dk%N^Px+Dqggkv`IWV@k_tS(l;1<8fus(aLZL|4$crM4O z$K!Jot&6MrT0EM?ID6X(xCQ^rH({8V57?(^yc!J~dV&j+5`XUu#YQV=^1MKx+!W90U>y&h!LYZBti8mimw z@=#a-h^;zqi0FyZD|^ho3C+RFrYddYtGt47y&VJl<6-M{@A>`a`3zoSA&zEv=&{Bx zo<#^(h((JoM6Yf+x~sqN@Iai0j(n>e06W-l#XGrgTx8duzUJ3(s~^Lvhr=fcjdHlp zL$7FDYL)ukJbnxqDA3Z>TE0O9c5K9L2M+~U(3rKYqN+Ch_&;n2>^!lIwuiRw0S#vk zujUSEVA+>bZ)URBS;T~kEnkY~0LjgaZQ;!x5UZWmcR1Qqz8ZtpMux01RaV8GF z^E`tG)LT@#Uu7HImn_bwb6HyN#jq@Wb=|+6!3wt{hX2}h-3_?BS-2qo?14i;a7CPr=qtfXI$gz>uW?Vz zhOp=yHsY0bJR92ijmyiU>j(cdg~6+`2iCbv4xNbx<1=CAe(2#^hLQSk0XH{}mRFh&*hlaGUl$ctM4QOT5j^>mE7l^PBl`KqO7No)2(! z-PxWzZ(ek;Ep)?Q;F`GkT=gX8BL^MY5m{-opmAmC(SXu1*K%X4S=EDjT%58SX0ll1 zSW5(%;T^7w=MFYvKCUn}<=7I^qaEy@KDnF<%f5#tjzYo}|cXV*+`9Eey@Ah9mz4#Xf zuc{tcTST|R!o|&ekHN6ra=a*dU+LSSO~T954)U1cK#ZTf6%Ry@_rXn*c$%;#d$>0- zv9g$Jy}0dT;rx7h{K&j%V;S|5?6r+~=z&<&3~)MjTr#jkT8)3TEQ7&o)N_vwDpFGZ z3DKgqsKP%Q&ZM@NT)T(CtEwkY8t70pENo*@OTduKVJl(|Zhf4`bX9m+^>7}(h5h{P zag=zZ@wL@+(MiV`^^)wp&{4DKvG!T0tP7TDH)aQx+?e$qgV#RR1OuSYZD~F?G)%?~ znGy5OSMdiJyvlrRYErc{AkAeZlu9Hq50zsJ9Mo>dEC!Es6c@`MP(Fsw;xeb`6B=KG z=C_#A=np(F)S5to9^tkj$N5ARa9~CPH?{y*m-nLkHzlrWiSsbtYN5pW;Qy|E`dvmn zm%RuJE9d;~6%1{R-WCVOeajb9@AAXkP@zSS*-QBp zp!2@RK%%`;`$UBl-px%-f!W@0Zg4>-JLgO+aI#@MhQ7Eg_tyd@d)R-Nk12Lk5A^}+ zdkm|NSnED|JA;=#>e3_RsHfBnV67fT2U)anA6ECs-`vH7-{jE^Xx5D1I2$ltoFBX{ z*H5uqp757?uu~4xIL}U?%?C&X*Pf7>7bi^j7aj&whAmpi1DcM5~$i6ty=<$N%0YmcrJcsMmN|b>uX?SE{NZm!~{?Qk|jeNA}Nmn#qy>wy$ zsCe!;ifU_IhRZg6VcW(ZHu%AOy4nvwoz0@Ci8M~pZGhbS32N+{!mS;EGjY~7U?#&@ zuNNGa5PRrssawl0D^e$T;4#C|Ho5wQXz6&V+B{NdcX;#;lV_{}>h~_&4BaFzjF_;+ zQ8d-*?f&){zMY`y4P30fbksv)s#ZWA&XLu7)<<8sb<0AgdMfk5#!wUFKwI2PF&)6t z$rn~dM-Q6GJzOXyXhWowCdhLP9UEzukXFCUsQ2Txpp=Gc7%TKro`{M8HB}Unv$JaO zV#a)_u?cp<@bpeC0kh+`$8t+I__Z$g^Zk2G^>_lFSXIbN0Wc&w92dK=a%;rj+g^!d z)NAnKet_46I#rvAL&(17s;Gj_{1G*@Ie6~hLmO}1@iBO6kRxDT(`kEq_5%zah%IwS z8TY1SbJqj%gWz#auP1z9+OPbAIwU>H`%u{iG#t(?i?;NT=VFf;aPT7ELI%_)XY`bp zHY#?Zb`9)6;1S}nI)Ark9b>-wEhy;1*~dkn&r3D_H0_0fQEK^N*J&#myfp49WQF9S z1-w8Y5}xje&+ZrXeP%a)DoKQgNmE|Boe_wu`l43s49FyGrfbbeMm=Y~#!0*a$`=WE z=`Ya36O(qt-1*^Nf4v+W$@1bzR#CEcoemf*p=p2o!f%d{n2!q@PHt@Ec0RT%QE|h- z?;q4oC27nSJ||Xx@=`Jjmmpw%M&h)HFUGCx&t#9(8%MHsE!oN^LwPwuk*(Hywr=AY z>JsyDrHOe-@xXP3(Pl4wLFGz7ZTpq28TEiqYY$M(PW4UT;^2v$ayle}obc2!?)wrazI=!p!D~t?HN3hJ>3VOX(UXJFC2D;^GRMC9kWBtm{@JOSXlAE9di zflzF!p5@8$(A=Qc-^tA8b+k2jxWd_55e+edgSp)_5Lo5*}{WZ&anb-a+$$gS{LbLT#vrH)bLnh4s03)(-Z-CI2SIPI+Ly%O!J9p&Zvt5n zcskOui)4*7ysZ+mw=;N=dN_Jd70=^dJDy`umQm=C^?h$)@Tzt|1hvrQo_$P$oY)++yom)kLTk$O0H?O08lG-{9W_(zAOT0VB6 z;c^C#x{iZG$?2Kg!;wcBeL~Z!7G0mI9L?Z4DPSH*-MvL-z6pem*KE`K)w^%=g0@;8 zMN`$LFb?S4x(gYcDOet!@ce`ZUh+kfJv!IJv!0=%E+29c#zbw8d3@rlT=M}vbM{iy zOydeKiXh9K!aqo(Jl4MY+aF`H7pVs$2c`xOTt|^+2*;z$fgdE7lrnfg{rRJG+DW4x z>l2+uk_gZbDm~Hv+9(FEYCiNEZCqCcbo}@vx;aYhj`5}O+leOO!FGa}FlSrP@Q&Tr z6FVuE_1MN!4uco_s>dvlfa$yx;KG)DtATOa;!0On9?=FbkEo#gm=G2ypsJ~e?4@{J zp%rJwFzQv=1E&p}6Lb-!#5ej2(3D-6+2?qLYZrVJ{vTh8fs zGx)%h8sp5R<>f2!lt#@}K7w#eNZE=nUSZTX`;xo{;PXHQvE$%QgKgXUr=~y0-~sbb zRg{8Bm!B<^-9ZX3A;opVzwFxjkLKZbE*vRO9uzZD8HRNLg_eS9>IZQDUi}t~(AhYk zv+8_3Fo2t2ik1G$Lr*d41=Vx3vpH}8`kDdpO-x({R*jZ-whgLf@ZjaM^*ex%Cr-YO zmf!^CLCubZKK?L+*QPDLkp`{yt;e>A`zsEWngOauk9XettRLs^op5pP@cpHAShMGm zJVsX!j=uEwkNKR>RZsgkG~67VEH$pNM%)9VR~}sy%jbL``|QyrO?(7;S`I33!=svk z-TEBlK~;@f&Pvgyb6n8D@jV7KtxH-PGxN`>-I(e%%Y0~LITSeo7{eBilKE!1-hHzZ zFKj7|dwk-lq5KRq1srr~B+uIkUR0LIcd$ixxH<1o@{-Cgn9G&A5Um=)*4C;w81n%O zH}41MaK&yyquxPTOu_#dp0}LAYpN%!8l?k)&K4Gqg$t}h%~eK)eUudl4%3ZVSS^Jh9nad?P&Gm;6Y7?mc-2fhYni-&W}kS z4^}6ts}U8YuzNOS)++HC^zG?gN*rrq_X%}aWBWA3M;T1 zVB?IB`;b)+-{Hqz&V)+rW;hfv5t##mDI7lF;hArK%cvK>2fe3~y(Q3rb1255iV@@}tn7=#s2#_3KiexRNJ28=bJjTe6l6y7}zxmKCzBh?=8J*J-&&@g>?}BcZ zKh!+@!M$7Mb&E1p5NRlZg|GL)JyKhoWANJWfXTP3v$gy)7>RHw5+P}mWsJ+1$QN87 z`=nl_O;FF%hJLDkgy^_+KGSXG`27aXI5;~SWCUaFWg9p@49k5!a zUaNcpMi}&!9Iw0GE3NsYtH~a2nmCk+q7p8TJDl^9GwMQAdYj0-jCu_orUl2QQChIy z_;4H1@p}H=^M@a$o_3z2ySP*=AY_;{?NG*wr1^IEn;AF$%BTmj-@Ioha1i;dhXqX6 zwTSRWw^cK)Wbi7L(A23KIZ{?dx?$5ZV%oVX$@RUH_p@Tf8545G#pNm6zjy5EbXCupV2~{J}cn=Rp9!cLE`J?N~ zkD8P{bmph-&PJxR5suPTq!rKCdf?pbGzPCzPYtDQ=zsrGl@%s4Ev~2n7HEr&#lzP! zcr0YX(KZ8sD*oF{V?Io9>Rs78>Z-AwyEAz0Wl7FPI29j3yrRb{L!bmJt2f1Tn7NW~ zC%_N#2_AYMCw=vGwcblxz|?y)a{Iuh&*ezzF!VAsJvZ;pfn9(^d1nv&X%l0{;iz^}zF6tZ1;2{RLXh4`B>Q|3~TxohX!VPQlmFqtA2i_KDJ^BXN zU*qlsTsY>9*&8vdZFV|?*K|kUHUN`)uf7}bOeEGrHNxGl$hZl7+-va2q^EbK&69us z0v#MTFGF({3jf%|E69U4Q`Vf}rVWZM5-?b7B_qt&y3;+CC!1qF)Z6{XOEp^H$RLMX z8cU`TYq#KGMX@oTdcX<_wSUfqX=uC02sh0O-&}0Ps0YkHday=cz0m-rvnOKjk(=>n z=8w(oW@xI2g7Zc=6+e-X=`TQ2Mvntg1LFoZov#O%&!QHQY^)0_TeB+$v znZG($8#BnPB@8eJNnt@>>$cPGlyWk$>?B(bWqI**PLIt;`Q7(BdUBv6ffrs;bEer zNEO_#-?42C&+ZDo=Hp3zc(}=CaT(dtJ44^^V^y_p-o*pIm0hU5jnL&LM5SGUJS zF4-+UdvuULvghh74=~DB07Ex7s|dL0p`Gv8pXdiX&Rpo1zX>o!HmtRThTvxg|HI?? zNcC`9Li}9qmIAN{%Ok|L&%e3&2S&XlDM~?5XE;30shKu&K!c^IWJqMe$33~50VEf< zvjK#Zxd|$-Eif`+ggdSq&p&tCU+THF18F+Bc{uQL@cQVO8wUM{hn7U}oEvY4ufp@*<-!3NMz!7z3$3|`h3pxR!9<8ShDXC%1SM^IA;4V580|trjv8H-3 zxRNq&U{tTtBA%bG!b1T!4jwHf(ipCAu!(~rj=q+u*Oh+LB=x{wh386VHjWd`KNkf? zAfxQZhdtT!QBaUBC=M_eF11>fn+|OyYM#>WEAHb7n(w0HC8}KDX!14FWDoh3)2|@1 ztV6M%rlt$unUgbzDwM0;0=_@)sS)0<>x$V;%3h2sxp1_@_t-z`^Qtl;gLh}oWbk0p z-B+_pI__e)w8I!cUCg+YI`#8S_Ut1k7|b? zxoBl#VZ^a!%4x6=wywFiKE+>nxRwE9`;BmJWA2&Y`?C61)boJ*y@G}#B;vVOZCKAy`1@<5;s(f?3fdvThe zuc$->r~jPK55_?1!7?VV22{Y7!Js)aE_q^P$He=1{cez@%~o46piWIcx_`r)3|^DHHd>L;C+CZ`_NYrJyWID9 zUEM6cl>}xzgA)8D-s9Z=vcw*Ic>}Ir=o#x2uQ(&&kb{kSMvv8@3PcZQqwEot5uKlS z%uhGN(2AM@9CUEO@VyBXYWt3*Q3r>Op3GzqNrZfn*yestf%X-RaKGokv^dj z7O=C+^=%luL<9CyleW>J6}1ak(8xh<(e}MHe7zUpQThR5%7kfoc#hO^9Ri+t>!%V% zJ>YUmE|n(NSjT+~neo^+H!SDShF|%5uff0!_5G9Sm?2UVEnQz8_g?q#oN*l(^{OE8 z03)X!FsXjlTzMfxae&aSGvDF48;~TZ`H6MqqC0CKrwE_id#Kspwrz9|oKyjgG1V@<5B zKmKcrmocBi=r4)fq|J1s7Wn$qJu3%9b@=tp7Z|(-2a~4u&!##{0Lx8&zaT!}Un*^Z z<_nj;-W)vKgmdE}2gA0F5v>s4D=K_&^wftq^+5I&YeoVGn@=KerE}AMzQ_&Zjm4Ae z81;~&VrbG$g$+Q5XAVKh zNH2!-9yO?fVL~+}xMDE?n%tzO0v`G1|lE?LslAyYZ&;eO@x<~S#~+md literal 376832 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

&EK>!Y@mbnZLlzlW>9R0 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 diff --git a/deploy/integrated_test/tools.py b/deploy/integrated_test/tools.py index ac6c30aee..471abd65b 100644 --- a/deploy/integrated_test/tools.py +++ b/deploy/integrated_test/tools.py @@ -45,6 +45,8 @@ def request_and_response(args, url, json_data, cookies, name_suffix=''): try: response = json.loads(response.text) except json.decoder.JSONDecodeError: + print('Json data to be sent:') + print(json_data) raise Exception('404 error encountered when building/modifying {}. ' 'Please check whether webconsole api changed.'.format(url.split('/')[-1])) if 'error' not in response.keys(): @@ -61,6 +63,7 @@ def build_raw_data(args, fed_id, filepath): name_suffix = '-raw-data' raw_json['name'] = args.name + name_suffix raw_json['federation_id'] = fed_id + raw_json['data_portal_type'] = args.data_portal_type raw_json['image'] = args.image fl_rep_spec = raw_json['context']['yaml_spec']['spec']['flReplicaSpecs'] fl_rep_spec['Master']['template']['spec']['containers'][0]['image'] = args.image @@ -79,9 +82,14 @@ def build_data_join_ticket(args, fed_id, raw_name, filepath, role): ticket_json['sdk_version'] = args.image.split(':')[-1] ticket_json['expire_time'] = str(datetime.datetime.now().year + 1) + '-12-31' for param in ['public_params', 'private_params']: - for pod in ticket_json[param]['spec']['flReplicaSpecs'].values(): + for pod_name, pod in ticket_json[param]['spec']['flReplicaSpecs'].items(): container = pod['template']['spec']['containers'][0] container['image'] = args.image + if not args.streaming: + if param == 'public_params': + container['args'] = args.cmd_args[pod_name] + if pod_name == 'Worker': + container['env'].extend(args.psi_extras) for d in container['env']: if d['name'] == 'RAW_DATA_SUB_DIR': d['value'] += raw_name diff --git a/deploy/scripts/rsa_psi/run_psi_data_join_master.sh b/deploy/scripts/rsa_psi/run_psi_data_join_master.sh new file mode 100755 index 000000000..1ddf7969a --- /dev/null +++ b/deploy/scripts/rsa_psi/run_psi_data_join_master.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Copyright 2020 The FedLearner Authors. All Rights Reserved. +# +# 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. + +set -ex + +data_join_master_cmd=/app/deploy/scripts/data_join/run_data_join_master.sh + +export RAW_DATA_SUB_DIR="portal_publish_dir/${APPLICATION_ID}_psi_preprocess" + +# Reverse the role assignment for data join so that leader for PSI preprocessor +# becomes follower for data join. Data join's workers get their role from +# master so we don't need to do this for worker. +if [ $ROLE == "leader" ]; then + export ROLE="follower" +else + export ROLE="leader" +fi + +${data_join_master_cmd} diff --git a/deploy/scripts/rsa_psi/run_psi_data_join_worker.sh b/deploy/scripts/rsa_psi/run_psi_data_join_worker.sh new file mode 100755 index 000000000..fd0bdb449 --- /dev/null +++ b/deploy/scripts/rsa_psi/run_psi_data_join_worker.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Copyright 2020 The FedLearner Authors. All Rights Reserved. +# +# 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. + +set -ex + +psi_data_join_leader_worker_cmd=/app/deploy/scripts/data_join/run_psi_data_join_leader_worker_v2.sh +psi_data_join_follower_worker_cmd=/app/deploy/scripts/data_join/run_psi_data_join_follower_worker_v2.sh + +export INPUT_FILE_SUBSCRIBE_DIR=$RAW_DATA_SUB_DIR +export RAW_DATA_PUBLISH_DIR="portal_publish_dir/${APPLICATION_ID}_psi_preprocess" +if [ $ROLE == "leader" ]; then + ${psi_data_join_leader_worker_cmd} +else + ${psi_data_join_follower_worker_cmd} +fi diff --git a/deploy/scripts/rsa_psi/run_psi_preprocessor.sh b/deploy/scripts/rsa_psi/run_psi_preprocessor.sh index 2a77b54d9..2ec30a0cc 100755 --- a/deploy/scripts/rsa_psi/run_psi_preprocessor.sh +++ b/deploy/scripts/rsa_psi/run_psi_preprocessor.sh @@ -60,9 +60,13 @@ builder_compressed_type=$(normalize_env_to_args "--builder_compressed_type" $PSI preprocessor_offload_processor_number=$(normalize_env_to_args "--preprocessor_offload_processor_number" $PREPROCESSOR_OFFLOAD_PROCESSOR_NUMBER) kvstore_type=$(normalize_env_to_args '--kvstore_type' $KVSTORE_TYPE) + +# Turn off display to avoid RSA_KEY_PEM showing in log +set +x + python -m fedlearner.data_join.cmd.rsa_psi_preprocessor_cli \ --psi_role=$ROLE \ - --rsa_key_path=$RSA_KEY_PATH \ + --rsa_key_path="$RSA_KEY_PATH" \ --rsa_key_pem="$RSA_KEY_PEM" \ --output_file_dir="$OUTPUT_BASE_DIR/psi_output" \ --raw_data_publish_dir=$RAW_DATA_PUBLISH_DIR \ diff --git a/deploy/scripts/rsa_psi/run_rsa_psi_signer.sh b/deploy/scripts/rsa_psi/run_rsa_psi_signer.sh index 2f88342b2..78cd484d2 100755 --- a/deploy/scripts/rsa_psi/run_rsa_psi_signer.sh +++ b/deploy/scripts/rsa_psi/run_rsa_psi_signer.sh @@ -24,8 +24,11 @@ slow_sign_threshold=$(normalize_env_to_args "--slow_sign_threshold" $SLOW_SIGN_T worker_num=$(normalize_env_to_args "--worker_num" $WORKER_NUM) signer_offload_processor_number=$(normalize_env_to_args "--signer_offload_processor_number" $SIGNER_OFFLOAD_PROCESSOR_NUMBER) +# Turn off display to avoid RSA_KEY_PEM showing in log +set +x + python -m fedlearner.data_join.cmd.rsa_psi_signer_service \ --listen_port=50051 \ - --rsa_private_key_path=$RSA_PRIVATE_KEY_PATH \ + --rsa_private_key_path="$RSA_PRIVATE_KEY_PATH" \ --rsa_privet_key_pem="$RSA_KEY_PEM" \ $slow_sign_threshold $worker_num $signer_offload_processor_number diff --git a/deploy/scripts/trainer/run_tree_worker.sh b/deploy/scripts/trainer/run_tree_worker.sh index 23e79cab3..6f1edd3a0 100755 --- a/deploy/scripts/trainer/run_tree_worker.sh +++ b/deploy/scripts/trainer/run_tree_worker.sh @@ -22,24 +22,31 @@ source /app/deploy/scripts/env_to_args.sh NUM_WORKERS=`python -c 'import json, os; print(len(json.loads(os.environ["CLUSTER_SPEC"])["clusterSpec"]["Worker"]))'` +if [[ -z "${DATA_PATH}" && -n "${DATA_SOURCE}" ]]; then + export DATA_PATH="${STORAGE_ROOT_PATH}/data_source/${DATA_SOURCE}/data_block" +fi + mode=$(normalize_env_to_args "--mode" "$MODE") data_path=$(normalize_env_to_args "--data-path" "$DATA_PATH") validation_data_path=$(normalize_env_to_args "--validation-data-path" "$VALIDATION_DATA_PATH") no_data=$(normalize_env_to_args "--no-data" "$NO_DATA") file_ext=$(normalize_env_to_args "--file-ext" "$FILE_EXT") +file_type=$(normalize_env_to_args "--file-type" "$FILE_TYPE") load_model_path=$(normalize_env_to_args "--load-model-path" "$LOAD_MODEL_PATH") verbosity=$(normalize_env_to_args "--verbosity" "$VERBOSITY") +loss_type=$(normalize_env_to_args "--loss-type" "$LOSS_TYPE") learning_rate=$(normalize_env_to_args "--learning-rate" "$LEARNING_RATE") max_iters=$(normalize_env_to_args "--max-iters" "$MAX_ITERS") max_depth=$(normalize_env_to_args "--max-depth" "$MAX_DEPTH") l2_regularization=$(normalize_env_to_args "--l2-regularization" "$L2_REGULARIZATION") max_bins=$(normalize_env_to_args "--max-bins" "$MAX_BINS") -num_parallel=$(normalize_env_to_args "--num-parallel" "$NUM_PARALELL") +num_parallel=$(normalize_env_to_args "--num-parallel" "$NUM_PARALLEL") verify_example_ids=$(normalize_env_to_args "--verify-example-ids" "$VERIFY_EXAMPLE_IDS") ignore_fields=$(normalize_env_to_args "--ignore-fields" "$IGNORE_FIELDS") cat_fields=$(normalize_env_to_args "--cat-fields" "$CAT_FIELDS") use_streaming=$(normalize_env_to_args "--use-streaming" "$USE_STREAMING") send_scores_to_follower=$(normalize_env_to_args "--send-scores-to-follower" "$SEND_SCORES_TO_FOLLOWER") +send_metrics_to_follower=$(normalize_env_to_args "--send-metrics-to-follower" "$SEND_METRICS_TO_FOLLOWER") python -m fedlearner.model.tree.trainer \ @@ -53,8 +60,9 @@ python -m fedlearner.model.tree.trainer \ --checkpoint-path="$OUTPUT_BASE_DIR/checkpoints" \ --output-path="$OUTPUT_BASE_DIR/outputs" \ $mode $data_path $validation_data_path \ - $no_data $file_ext $load_model_path \ - $verbosity $learning_rate $max_iters \ + $no_data $file_ext $file_type $load_model_path \ + $verbosity $loss_type $learning_rate $max_iters \ $max_depth $l2_regularization $max_bins \ $num_parallel $verify_example_ids $ignore_fields \ - $cat_fields $use_streaming $send_scores_to_follower + $cat_fields $use_streaming $send_scores_to_follower \ + $send_metrics_to_follower diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b8ceed905..000000000 --- a/package-lock.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" - } - } -} diff --git a/web_console/Dockerfile b/web_console/Dockerfile index b7ec22d01..8ace1ca81 100644 --- a/web_console/Dockerfile +++ b/web_console/Dockerfile @@ -13,4 +13,4 @@ RUN npm run build EXPOSE 1989 -CMD ["node", "bootstrap.js"] +CMD ["startup.sh"] diff --git a/web_console/api/federation.js b/web_console/api/federation.js index 4f7eac4ec..4fc1545a6 100644 --- a/web_console/api/federation.js +++ b/web_console/api/federation.js @@ -111,4 +111,18 @@ router.get('/api/v1/federations/:id/tickets', SessionMiddleware, async (ctx) => ctx.body = { data }; }); +router.get('/api/v1/federations/:id/heartbeat', SessionMiddleware, async (ctx) => { + const federation = await Federation.findByPk(ctx.params.id); + if (!federation) { + ctx.status = 404; + ctx.body = { + error: 'Federation not found', + }; + return; + } + const client = new FederationClient(federation); + const res = await client.heartBeat(); + ctx.body = res; +}); + module.exports = router; diff --git a/web_console/api/job.js b/web_console/api/job.js index 2a0a63069..34ac7f124 100644 --- a/web_console/api/job.js +++ b/web_console/api/job.js @@ -1,6 +1,7 @@ const router = require('@koa/router')(); const { Op } = require('sequelize'); const SessionMiddleware = require('../middlewares/session'); +const FindOptionsMiddleware = require('../middlewares/find_options'); const k8s = require('../libs/k8s'); const es = require('../libs/es'); const { Job, Ticket, Federation } = require('../models'); @@ -8,6 +9,7 @@ const FederationClient = require('../rpc/client'); const getConfig = require('../utils/get_confg'); const checkParseJson = require('../utils/check_parse_json'); const { clientValidateJob, clientGenerateYaml } = require('../utils/job_builder'); +const { client } = require('../libs/k8s'); const config = getConfig({ NAMESPACE: process.env.NAMESPACE, @@ -19,15 +21,35 @@ try { es_oparator_match_phrase = require('../es.match_phrase'); } catch (err) { /* */ } -router.get('/api/v1/jobs', SessionMiddleware, async (ctx) => { +router.get('/api/v1/jobs', SessionMiddleware, FindOptionsMiddleware, async (ctx) => { const jobs = await Job.findAll({ + ...ctx.findOptions, order: [['created_at', 'DESC']], }); const { flapps } = await k8s.getFLAppsByNamespace(namespace); - const data = jobs.map((job) => ({ - ...(flapps.items.find((item) => item.metadata.name === job.name)), - localdata: job, - })); + let data = []; + for (job of jobs) { + if (job.status == null) job.status = 'started'; + if (job.federation_id == null) { + const clientTicket = await Ticket.findOne({ + where: { + name: { [Op.eq]: job.client_ticket_name }, + }, + }); + job.federation_id = clientTicket.federation_id; + } + if (job.status === 'stopped') { + data.push({ + ...JSON.parse(job.k8s_meta_snapshot).flapp, + localdata: job, + }); + } else { + data.push({ + ...(flapps.items.find((item) => item.metadata.name === job.name)), + localdata: job, + }); + } + } ctx.body = { data }; }); @@ -41,7 +63,24 @@ router.get('/api/v1/job/:id', SessionMiddleware, async (ctx) => { }; return; } - const { flapp } = await k8s.getFLApp(namespace, job.name); + + if (job.status == null) job.status = 'started'; + if (job.federation_id == null) { + const clientTicket = await Ticket.findOne({ + where: { + name: { [Op.eq]: job.client_ticket_name }, + }, + }); + job.federation_id = clientTicket.federation_id; + } + + var flapp; + if (job.status === 'stopped') { + flapp = JSON.parse(job.k8s_meta_snapshot).flapp; + } else { + flapp = (await k8s.getFLApp(namespace, job.name)).flapp; + } + ctx.body = { data: { ...flapp, @@ -52,7 +91,28 @@ router.get('/api/v1/job/:id', SessionMiddleware, async (ctx) => { router.get('/api/v1/job/:k8s_name/pods', SessionMiddleware, async (ctx) => { const { k8s_name } = ctx.params; - const { pods } = await k8s.getFLAppPods(namespace, k8s_name); + + const job = await Job.findOne({ + where: { + name: { [Op.eq]: k8s_name }, + }, + }); + + if (!job) { + ctx.status = 404; + ctx.body = { + error: 'Job not found', + }; + return; + } + + var pods; + if (job.status === 'stopped') { + pods = JSON.parse(job.k8s_meta_snapshot).pods; + } else { + pods = (await k8s.getFLAppPods(namespace, k8s_name)).pods; + } + ctx.body = { data: pods.items }; }); @@ -126,11 +186,6 @@ router.post('/api/v1/job', SessionMiddleware, async (ctx) => { return; } - const job = { - name, job_type, client_ticket_name, server_ticket_name, - client_params, server_params, - }; - const exists = await Job.findOne({ where: { name: { [Op.eq]: name }, @@ -157,25 +212,47 @@ router.post('/api/v1/job', SessionMiddleware, async (ctx) => { return; } + const clientFed = await Federation.findByPk(clientTicket.federation_id); + if (!clientFed) { + ctx.status = 422; + ctx.body = { + error: 'Federation does not exist', + }; + return; + } + const rpcClient = new FederationClient(clientFed); + + let serverTicket; try { - clientValidateJob(job, clientTicket); - } catch (e) { - ctx.status = 400; + const { data } = await rpcClient.getTickets({ job_type: '', role: '' }); + serverTicket = data.find(x => x.name === server_ticket_name); + if (!serverTicket) { + throw new Error(`Cannot find server ticket ${server_ticket_name}`); + } + } catch (err) { + ctx.status = 500; ctx.body = { - error: `client_params validation failed: ${e.message}`, + error: `Cannot get server ticket: ${err.message}`, }; return; } - const clientFed = await Federation.findByPk(clientTicket.federation_id); - if (!clientFed) { - ctx.status = 422; + const job = { + name, job_type, client_ticket_name, server_ticket_name, + client_params, server_params, status: 'started', + federation_id: clientFed.id, + }; + + try { + clientValidateJob(job, clientTicket, serverTicket); + } catch (e) { + ctx.status = 400; ctx.body = { - error: 'Federation does not exist', + error: `client_params validation failed: ${e.message}`, }; return; } - const rpcClient = new FederationClient(clientFed); + try { await rpcClient.createJob({ ...job, @@ -184,7 +261,7 @@ router.post('/api/v1/job', SessionMiddleware, async (ctx) => { } catch (err) { ctx.status = 500; ctx.body = { - error: err.details, + error: `RPC Error: ${err.message}`, }; return; } @@ -215,6 +292,166 @@ router.post('/api/v1/job', SessionMiddleware, async (ctx) => { ctx.body = { data }; }); +router.post('/api/v1/job/:id/update', SessionMiddleware, async (ctx) => { + // get old job info + const { id } = ctx.params; + const old_job = await Job.findByPk(id); + if (!old_job) { + ctx.status = 404; + ctx.body = { + error: 'Job not found', + }; + return; + } + + if (old_job.status === 'error') { + ctx.status = 422; + ctx.body = { + error: 'Cannot update errored job', + }; + return; + } + + const { + name, job_type, client_ticket_name, server_ticket_name, + client_params, server_params, status, + } = ctx.request.body; + + if (old_job.status === 'started' && status != 'stopped') { + ctx.status = 422; + ctx.body = { + error: 'Cannot change running job', + }; + return; + } + + if (name != old_job.name) { + ctx.status = 422; + ctx.body = { + error: 'cannot change job name', + }; + return; + } + + if (job_type != old_job.job_type) { + ctx.status = 422; + ctx.body = { + error: 'cannot change job type', + }; + return; + } + + const clientTicket = await Ticket.findOne({ + where: { + name: { [Op.eq]: client_ticket_name }, + }, + }); + if (!clientTicket) { + ctx.status = 422; + ctx.body = { + error: `client_ticket ${client_ticket_name} does not exist`, + }; + return; + } + + const OldClientTicket = await Ticket.findOne({ + where: { + name: { [Op.eq]: old_job.client_ticket_name }, + }, + }); + if (!OldClientTicket) { + ctx.status = 422; + ctx.body = { + error: `client_ticket ${old_job.client_ticket_name} does not exist`, + }; + return; + } + + if (clientTicket.federation_id != OldClientTicket.federation_id) { + ctx.status = 422; + ctx.body = { + error: 'cannot change job federation', + }; + return; + } + + const clientFed = await Federation.findByPk(clientTicket.federation_id); + if (!clientFed) { + ctx.status = 422; + ctx.body = { + error: 'Federation does not exist', + }; + return; + } + const rpcClient = new FederationClient(clientFed); + + let serverTicket; + try { + const { data } = await rpcClient.getTickets({ job_type: '', role: '' }); + serverTicket = data.find(x => x.name === server_ticket_name); + if (!serverTicket) { + throw new Error(`Cannot find server ticket ${server_ticket_name}`); + } + } catch (err) { + ctx.status = 500; + ctx.body = { + error: `RPC Error: ${err.message}`, + }; + return; + } + + const new_job = { + name, job_type, client_ticket_name, server_ticket_name, + client_params, server_params, status, + federation_id: clientTicket.federation_id, + }; + + try { + clientValidateJob(new_job, clientTicket, serverTicket); + } catch (e) { + ctx.status = 400; + ctx.body = { + error: `client_params validation failed: ${e.message}`, + }; + return; + } + + // update job + try { + await rpcClient.updateJob({ + ...new_job, + server_params: JSON.stringify(server_params), + }); + } catch (err) { + ctx.status = 500; + ctx.body = { + error: `RPC Error: ${err.message}`, + }; + return; + } + + if (old_job.status === 'started' && new_job.status === 'stopped') { + flapp = (await k8s.getFLApp(namespace, new_job.name)).flapp; + pods = (await k8s.getFLAppPods(namespace, new_job.name)).pods; + old_job.k8s_meta_snapshot = JSON.stringify({flapp, pods}); + await k8s.deleteFLApp(namespace, new_job.name); + } else if (old_job.status === 'stopped' && new_job.status === 'started') { + const clientYaml = clientGenerateYaml(clientFed, new_job, clientTicket); + await k8s.createFLApp(namespace, clientYaml); + } + + old_job.client_ticket_name = new_job.client_ticket_name; + old_job.server_ticket_name = new_job.server_ticket_name; + old_job.client_params = new_job.client_params; + old_job.server_params = new_job.server_params; + old_job.status = new_job.status; + old_job.federation_id = new_job.federation_id; + + const data = await old_job.save(); + + ctx.body = { data }; +}); + router.delete('/api/v1/job/:id', SessionMiddleware, async (ctx) => { // TODO: just owner can delete const { id } = ctx.params; @@ -228,6 +465,11 @@ router.delete('/api/v1/job/:id', SessionMiddleware, async (ctx) => { return; } + if (!data.status || data.status == 'started') { + await k8s.deleteFLApp(namespace, data.name); + } + await data.destroy({ force: true }); + const ticket = await Ticket.findOne({ where: { name: { [Op.eq]: data.client_ticket_name }, @@ -240,12 +482,10 @@ router.delete('/api/v1/job/:id', SessionMiddleware, async (ctx) => { } catch (err) { ctx.status = 500; ctx.body = { - error: err.details, + error: `RPC Error: ${err.message}`, }; return; } - await k8s.deleteFLApp(namespace, data.name); - await data.destroy({ force: true }); ctx.body = { data }; }); diff --git a/web_console/components/BooleanSelect.jsx b/web_console/components/BooleanSelect.jsx new file mode 100644 index 000000000..2ecd86bd4 --- /dev/null +++ b/web_console/components/BooleanSelect.jsx @@ -0,0 +1,19 @@ +import React from 'react'; +import { Select } from '@zeit-ui/react'; + +const options = [ + { label: 'True', value: 'true' }, + { label: 'False', value: 'false' }, +] + +export default function ClientTicketSelect(props) { + const actualValue = props.value?.toString() || 'true' + const actualOnChange = (value) => { + props.onChange(value === 'true'); + }; + return ( + + ); +} diff --git a/web_console/components/ClientTicketSelect.jsx b/web_console/components/ClientTicketSelect.jsx index 13ec80a9d..3f2d92656 100644 --- a/web_console/components/ClientTicketSelect.jsx +++ b/web_console/components/ClientTicketSelect.jsx @@ -1,13 +1,23 @@ -import React from 'react'; +import React, { useCallback } from 'react'; import { Select } from '@zeit-ui/react'; import useSWR from 'swr'; import { fetcher } from '../libs/http'; +import { JOB_TYPE_CLASS } from '../constants/job' -export default function ClientTicketSelect(props) { +let filter = () => true +export default function ClientTicketSelect({type, ...props}) { const { data } = useSWR('tickets', fetcher); - const tickets = (data && data.data) || []; - const actualValue = tickets.find((x) => x.name === props.value)?.value; + if (type) { + filter = el => JOB_TYPE_CLASS[type].some(t => el.job_type === t) + } + + const tickets = data + ? data.data.filter(filter) + : []; + + // const actualValue = tickets.find((x) => x.name === props.value)?.value; + const actualValue = props.value || '' const actualOnChange = (value) => { const ticket = tickets.find((x) => x.name === value); props.onChange(ticket.name); diff --git a/web_console/components/CommonJobList.jsx b/web_console/components/CommonJobList.jsx new file mode 100644 index 000000000..a9b0672da --- /dev/null +++ b/web_console/components/CommonJobList.jsx @@ -0,0 +1,747 @@ +import React, { useMemo, useState, useCallback } from 'react'; +import css from 'styled-jsx/css'; +import { Link, Text, Input, Fieldset, Button, Card, Description, useTheme, useInput, Tooltip } from '@zeit-ui/react'; +import AlertCircle from '@geist-ui/react-icons/alertCircle' +import Search from '@zeit-ui/react-icons/search'; +import NextLink from 'next/link'; +import useSWR from 'swr'; +import produce from 'immer' + +import { fetcher } from '../libs/http'; +import { FLAppStatus, handleStatus, getStatusColor, JobStatus } from '../utils/job'; +import Layout from '../components/Layout'; +import PopConfirm from '../components/PopConfirm'; +import Dot from '../components/Dot'; +import Empty from '../components/Empty'; +import { deleteJob, createJob } from '../services/job'; +import Form from '../components/Form'; +import { + JOB_DATA_JOIN_PARAMS, + JOB_NN_PARAMS, + JOB_PSI_DATA_JOIN_PARAMS, + JOB_TREE_PARAMS, + JOB_DATA_JOIN_REPLICA_TYPE, + JOB_NN_REPLICA_TYPE, + JOB_PSI_DATA_JOIN_REPLICA_TYPE, + JOB_TREE_REPLICA_TYPE, +} from '../constants/form-default' +import { getParsedValueFromData, fillJSON, getValueFromJson, getValueFromEnv, filterArrayValue } from '../utils/form_utils'; +import { getJobStatus } from '../utils/job' +import { JOB_TYPE_CLASS, JOB_TYPE } from '../constants/job' + +// import {mockJobList} from '../constants/mock_data' + +function useStyles(theme) { + return css` + .counts-wrap { + padding: 0 5%; + display: flex; + align-items: center; + justify-content: space-between; + } + + .num { + text-align: center; + color: ${theme.palette.accents_5}; + margin-bottom: 1em; + } + .h { + font-weight: normal; + margin: 1em 0; + } + .b { + color: ${theme.palette.accents_6}; + font-size: 1.4em; + } + + .list-wrap { + position: relative; + } + .filter-bar { + position: absolute; + right: 0; + top: 0; + display: flex; + align-items: center; + justify-content: flex-end; + } + .filter-form { + display: flex; + align-items: center; + margin-right: 10px; + } + .filter-input { + width: 200px; + margin-right: 10px; + } + + .content-list-wrap { + list-style: none; + padding: 0; + margin: 0; + } + .content-list { + padding: 20px 10px; + border-bottom: 1px solid ${theme.palette.border}; + } + .content-list:last-of-type { + border-bottom: none; + } + .desc-wrap { + display: flex; + } + `; +} + +const RESOURCE_PATH_PREFIX = 'spec.flReplicaSpecs.[replicaType].template.spec.containers[].resources' +const ENV_PATH = 'spec.flReplicaSpecs.[replicaType].template.spec.containers[].env' +const PARAMS_GROUP = ['client_params', 'server_params'] + +function handleParamData(container, data, field) { + if (field.type === 'label') { return } + + let path = field.path || field.key + let value = data + + if (/[/s/S]* num$/.test(field.key)) { + value = parseInt(value) + } + + fillJSON(container, path, value) +} + +function fillField(data, field) { + if (data === undefined) return field + + let isSetValueWithEmpty = false + let disabled = false + + let v = getValueFromJson(data, field.path || field.key) || field.emptyDefault || '' + + if (field.key === 'federation_id') { + const federationID = parseInt(localStorage.getItem('federationID')) + if (federationID > 0) { + v = federationID + disabled = true + } + } + else if (/[/s/S]* num$/.test(field.key)) { + let replicaType = field.key.split(' ')[0] + let path = `spec.flReplicaSpecs.${replicaType}.replicas` + v = getValueFromJson(data['client_params'], path) + || getValueFromJson(data['server_params'], path) + } + + if (typeof v === 'object' && v !== null) { + v = JSON.stringify(v, null, 2) + } + + if (v !== undefined || (v === undefined && isSetValueWithEmpty)) { + field.value = v + } + field.editing = true + + if (!field.props) field.props = {} + field.props.disabled = disabled + + return field +} + +let federationId = null, jobType = null + +const passFieldInfo = fields => produce(fields, draft => { + draft.map(field => { + if (field.key === 'client_ticket_name') { + field.props.job_type = jobType + } + if (field.key === 'server_ticket_name') { + field.props.federation_id = federationId + } + }) +}) + +function mapValueToFields({data, fields, targetGroup, type = 'form', init = false}) { + return produce(fields, draft => { + draft.map((x) => { + + if (x.groupName) { + if (!data[x.groupName]) return + if (!init && x.groupName !== targetGroup) return + + if (x.formTypes) { + let types = init ? x.formTypes : [type] + types.forEach(el => { + x.fields[el].forEach(field => fillField(data[x.groupName], field)) + }) + } else { + x.fields.forEach(field => fillField(data[x.groupName], field)) + } + + } else { + fillField(data, x) + } + + }); + }) +} + +let formMeta = {} +const setFormMeta = value => { formMeta = value } + +export default function JobList({ + datasoure, + training, + filter, + ...props +}) { + const theme = useTheme(); + const styles = useStyles(theme); + + let JOB_REPLICA_TYPE, NAME_KEY, FILTER_TYPES, PAGE_NAME, INIT_PARAMS, DEFAULT_JOB_TYPE + if (datasoure) { + + PAGE_NAME = 'datasource' + + JOB_REPLICA_TYPE = JOB_DATA_JOIN_REPLICA_TYPE + + NAME_KEY = 'DATA_SOURCE_NAME' + + FILTER_TYPES = JOB_TYPE_CLASS.datasource + + INIT_PARAMS = JOB_DATA_JOIN_PARAMS + + DEFAULT_JOB_TYPE = JOB_TYPE.data_join + + } else { + + PAGE_NAME = 'training' + + JOB_REPLICA_TYPE = JOB_NN_REPLICA_TYPE + + NAME_KEY = 'TRAINING_NAME' + + FILTER_TYPES = JOB_TYPE_CLASS.training + + INIT_PARAMS = JOB_NN_PARAMS + + DEFAULT_JOB_TYPE = JOB_TYPE.nn_model + + } + + filter = filter + || useCallback(job => FILTER_TYPES.some(type => type === job.localdata.job_type), []) + + const getParamsFormFields = useCallback(() => JOB_REPLICA_TYPE.reduce((total, currType) => { + total.push(...[ + { key: currType, type: 'label' }, + { + key: currType + '.env', + label: 'env', + type: 'name-value', + path: `spec.flReplicaSpecs.${currType}.template.spec.containers[].env`, + span: 24, + emptyDefault: [], + props: { + ignoreKeys: filterArrayValue([ + datasoure && 'DATA_SOURCE_NAME', + training && 'TRAINING_NAME', + ]) + } + }, + { + key: 'resoure.' + currType + '.cup_request', + label: 'cpu request', + path: RESOURCE_PATH_PREFIX.replace('[replicaType]', currType) + '.requests.cpu', + span: 12, + }, + { + key: 'resoure.' + currType + '.cup_limit', + label: 'cpu limit', + path: RESOURCE_PATH_PREFIX.replace('[replicaType]', currType) + '.limits.cpu', + span: 12, + }, + { + key: 'resoure.' + currType + '.memory_request', + label: 'memory request', + path: RESOURCE_PATH_PREFIX.replace('[replicaType]', currType) + '.requests.memory', + span: 12, + }, + { + key: 'resoure.' + currType + '.memory_limit', + label: 'memory limit', + path: RESOURCE_PATH_PREFIX.replace('[replicaType]', currType) + '.limits.memory', + span: 12, + }, + ]) + return total + }, []), [RESOURCE_PATH_PREFIX, JOB_REPLICA_TYPE]) + + const { data, mutate } = useSWR('jobs', fetcher); + const jobs = data && data.data ? data.data.filter(el => el.metadata).filter(filter) : null + // const jobs = mockJobList.data + + // form meta convert functions + const rewriteFields = useCallback((draft, data) => { + // this function will be call inner immer + // env + const insert2Env = filterArrayValue([ + { name: NAME_KEY, getValue: data => data.name }, + ]) + + PARAMS_GROUP.forEach(paramType => { + JOB_REPLICA_TYPE.forEach(replicaType => { + if (!draft[paramType]) { + draft[paramType] = {} + } + let envs = getValueFromJson(draft[paramType], ENV_PATH.replace('[replicaType]', replicaType)) + if (!envs) return + + let envNames = envs.map(env => env.name) + + insert2Env.forEach(el => { + let idx = envNames.indexOf(el.name) + let value = el.getValue(data) || '' + if (idx >= 0) { + envs[idx].value = value.toString() + } else { + // here envs is not extensible, push will throw error + envs = envs.concat({name: el.name, value: value.toString()}) + } + }) + + // trigger immer‘s intercepter + fillJSON(draft[paramType], ENV_PATH.replace('[replicaType]', replicaType), envs) + + // replicas + let path = `spec.flReplicaSpecs.${replicaType}.replicas` + if (replicaType !== 'Master') { + let num = parseInt(data[`${replicaType} num`]) + !isNaN(num) && fillJSON(draft[paramType], path, parseInt(data[`${replicaType} num`])) + } + + }) + }) + + // delete useless fields + + JOB_REPLICA_TYPE + .forEach(replicaType => + draft[`${replicaType} num`] && delete draft[`${replicaType} num`] + ) + + }, [JOB_REPLICA_TYPE]) + const mapFormMeta2FullData = useCallback((fields = fields) => { + let data = {} + fields.map((x) => { + if (x.groupName) { + data[x.groupName] = { ...formMeta[x.groupName] } + data[x.groupName][x.groupName] = formMeta[x.groupName] + } else { + data[x.key] = formMeta[x.key] + } + }) + return data + }, []) + const writeJson2FormMeta = useCallback((groupName, data) => { + setFormMeta(produce(formMeta, draft => { + fields.map((x) => { + if (x.groupName) { + if (x.groupName !== groupName) return + draft[groupName] = JSON.parse(data[groupName][groupName]) + } else { + draft[x.key] = getParsedValueFromData(data, x) || draft[x.key] + } + }) + + rewriteFields(draft, data) + })) + }, []) + const writeForm2FormMeta = useCallback((groupName, data) => { + setFormMeta(produce(formMeta, draft => { + let value + + fields.map(x => { + if (x.groupName) { + if (x.groupName !== groupName) return + if (!draft[groupName]) { draft[groupName] = {} } + + for (let field of getParamsFormFields()) { + value = getParsedValueFromData(data[groupName], field) + handleParamData(draft[groupName], value, field) + } + + } else { + value = getParsedValueFromData(data, x) || draft[x.key] + handleParamData(draft, value, x) + } + }) + rewriteFields(draft, data) + })) + }, []) + // ---end--- + const onJobTypeChange = useCallback((value, totalData, groupFormType) => { + writeFormMeta(totalData, groupFormType) + + switch (value) { + case JOB_TYPE.data_join: + JOB_REPLICA_TYPE = JOB_DATA_JOIN_REPLICA_TYPE + setFormMeta({...formMeta, ...JOB_DATA_JOIN_PARAMS}); break + case JOB_TYPE.psi_data_join: + JOB_REPLICA_TYPE = JOB_PSI_DATA_JOIN_REPLICA_TYPE + setFormMeta({...formMeta, ...JOB_PSI_DATA_JOIN_PARAMS}); break + case JOB_TYPE.nn_model: + JOB_REPLICA_TYPE = JOB_NN_REPLICA_TYPE + setFormMeta({...formMeta, ...JOB_NN_PARAMS}); break + case JOB_TYPE.tree_model: + JOB_REPLICA_TYPE = JOB_TREE_REPLICA_TYPE + setFormMeta({...formMeta, ...JOB_TREE_PARAMS}); break + } + + jobType = value + + setFields( + passFieldInfo(mapValueToFields({ + data: mapFormMeta2FullData(fields), + fields: getDefaultFields(), + init: true, + })) + ) + }, []) + const getDefaultFields = useCallback(() => filterArrayValue([ + { + key: 'name', + required: true, + }, + { + key: 'job_type', + type: 'jobType', + props: {type: PAGE_NAME}, + required: true, + label: ( + <> + job_type + change job type will reset all params}> + + + + ), + default: DEFAULT_JOB_TYPE, + onChange: onJobTypeChange, + }, + { + key: 'federation_id', + type: 'federation', + label: 'federation', + required: true, + onChange: (value, formData) => { + federationId = value + setFields(fields => passFieldInfo(mapValueToFields({data: formData, fields}))) + }, + props: { + initTrigerChange: true + } + }, + { + key: 'client_ticket_name', + type: 'clientTicket', + label: 'client_ticket', + props: { + type: PAGE_NAME, + }, + required: true + }, + { + key: 'server_ticket_name', + type: 'serverTicket', + label: 'server_ticket', + required: true, + props: { + federation_id: null, + type: PAGE_NAME, + }, + }, + ...JOB_REPLICA_TYPE + .filter(el => training && el !== 'Master') + .map(replicaType => ({ + key: `${replicaType} num`, + })), + ...PARAMS_GROUP.map(paramsType => ({ + groupName: paramsType, + initialVisible: false, + formTypes: ['form', 'json'], + onFormTypeChange: (data, currType, targetType) => { + let newFields + try { + if (targetType === 'json') { + writeForm2FormMeta(paramsType, data) + newFields = mapValueToFields({ + data: mapFormMeta2FullData(fields), + fields: fields.filter(el => el.groupName === paramsType), + targetGroup: paramsType, + type: 'json' + }) + } + if (targetType === 'form') { + writeJson2FormMeta(paramsType, data) + newFields = mapValueToFields({ + data: mapFormMeta2FullData(fields), + fields: fields.filter(el => el.groupName === paramsType), + targetGroup: paramsType, + type: 'form' + }) + } + } catch (error) { + return { error } + } + return { newFields } + }, + fields: { + form: getParamsFormFields(), + json: [ + { + key: paramsType, + type: 'json', + span: 24, + hideLabel: true, + props: { + minHeight: '500px' + }, + }, + ] + } + })) + ]), [JOB_REPLICA_TYPE]) + + let [fields, setFields] = useState(getDefaultFields()) + + const labeledList = useMemo(() => { + const allList = { name: 'All', list: jobs || [] }; + return Object.entries(FLAppStatus).reduce((prev, [key, status]) => { + return prev.concat({ + name: key, + list: allList.list.filter((item) => item.status?.appState === status), + }); + }, [allList]); + }, [jobs]); + + const [label, setLabel] = useState('All'); + const switchLabel = useCallback((l) => setLabel(l), []); + + const searchIcon = useMemo(() => , []); + const [filterText, setFilterText] = useState(''); + const { state: inputText, reset, bindings } = useInput(''); + const search = useCallback((e) => { + e.preventDefault(); + setFilterText(inputText); + }, [inputText]); + const resetSearch = useCallback(() => { + reset(); + setFilterText(''); + }, [reset, setFilterText]); + + const showingList = useMemo(() => { + const target = labeledList.find(({ name }) => name === label); + return ((target && target.list) || []).filter((item) => { + return !filterText || item.localdata.name.indexOf(filterText) > -1; + }); + }, [label, labeledList, filterText]); + + const [formVisible, setFormVisible] = useState(false); + + const onClickCreate = () => { + setFormMeta({...INIT_PARAMS}) + setFields(mapValueToFields({data: mapFormMeta2FullData(fields), fields, init: true})) + toggleForm() + } + const toggleForm = useCallback(() => { + if (formVisible) { + setFields(getDefaultFields()) + setFormMeta({}) + } + setFormVisible(visible => !visible) + }, [formVisible]); + const onOk = () => { + mutate(); + toggleForm(); + }; + + const writeFormMeta = (data, groupFormType) => { + PARAMS_GROUP.forEach(paramType => { + switch (groupFormType[paramType]) { + case 'json': + writeJson2FormMeta(paramType, data) + break + case 'form': + writeForm2FormMeta(paramType, data) + } + }) + } + const onCreateJob = (data, groupFormType) => { + writeFormMeta(data, groupFormType) + return createJob(formMeta); + }; + + const handleClone = (item) => { + setFormMeta(item.localdata) + + setFields(fields => mapValueToFields({ + data: mapFormMeta2FullData(fields), + fields, + type: 'form', + init: true + })) + + toggleForm() + } + + const renderOperation = item => ( + <> + + View Detail + + + View Charts + + handleClone(item)} + type="success" + style={{marginRight: `${theme.layout.gap}`}} + > + Clone + + deleteJob(item.localdata.id)} + onOk={() => mutate({ data: jobs.filter((i) => i !== item) })} + > + Delete + + + ) + + return ( +

+ + {formVisible + ? ( +
+ ) + : ( + <> + +
+ { + labeledList.map(({ name, list }) => ( +
+

{name}

+ {data ? list.length : '-'} +
+ )) + } +
+
+ +
+
+ + + + +
+ + { + labeledList.map(({ name }) => ( +
+ { + label === name + ? showingList.length + ? ( +
    + { + showingList.map((item) => ( +
  • + + {item.localdata.name} + +
    + + + {getJobStatus(item)} + + )} + /> + + + +
    +
  • + )) + } +
+ ) + : + : null + } +
+ )) + } +
+
+
+ + ) + } + + +
+
+ ); +} diff --git a/web_console/components/CommonTicket.jsx b/web_console/components/CommonTicket.jsx new file mode 100644 index 000000000..e46aeb819 --- /dev/null +++ b/web_console/components/CommonTicket.jsx @@ -0,0 +1,646 @@ +import React, { useState, useCallback, useMemo, useEffect } from 'react'; +import { Table, Button, Card, Text, Link, Tooltip, useTheme } from '@zeit-ui/react'; +import AlertCircle from '@geist-ui/react-icons/alertCircle' +import useSWR from 'swr'; +import produce from 'immer' +import Layout from './Layout'; +import Form from './Form'; +import { fetcher } from '../libs/http'; +import { createTicket, updateTicket } from '../services/ticket'; +import { + TICKET_DATA_JOIN_PARAMS, + TICKET_NN_PARAMS, + TICKET_PSI_DATA_JOIN_PARAMS, + TICKET_TREE_PARAMS, + TICKET_DATA_JOIN_REPLICA_TYPE, + TICKET_NN_REPLICA_TYPE, + TICKET_PSI_DATA_JOIN_REPLICA_TYPE, + TICKET_TREE_REPLICA_TYPE +} from '../constants/form-default' +import { getParsedValueFromData, fillJSON, getValueFromJson, filterArrayValue, getValueFromEnv } from '../utils/form_utils'; +import { JOB_TYPE_CLASS, JOB_TYPE } from '../constants/job' + +const ENV_PATH = 'spec.flReplicaSpecs.[replicaType].template.spec.containers[].env' +const PARAMS_GROUP = ['public_params', 'private_params'] + +const All_REPLICAS = Array.from(new Set([ + ...TICKET_DATA_JOIN_REPLICA_TYPE, + ...TICKET_NN_REPLICA_TYPE, + ...TICKET_PSI_DATA_JOIN_REPLICA_TYPE, + ...TICKET_TREE_REPLICA_TYPE +])) + +/** + * search value from params + * @param {*} path template string with `[replicaType]` and `[paramType]` + */ +function searchValue(data, path) { + let value + + for (let paramType of PARAMS_GROUP) { + for (let replicaType of All_REPLICAS) { + let targetPath = path + .replace(/\[paramType\]/g, paramType) + .replace(/\[replicaType\]/g, replicaType) + + value = getValueFromJson(data[paramType], targetPath) + + if (value) { + return value + } + } + } + return value +} +function searchEnvValue(data, key) { + let value + + for (let paramType of PARAMS_GROUP) { + for (let replicaType of All_REPLICAS) { + let path = ENV_PATH.replace('[replicaType]', replicaType) + value = getValueFromEnv(data[paramType] || {}, path, key) + if (value) { + return value + } + } + } + return value +} + +function fillField(data, field, editing) { + if (data === undefined && !editing) return field + + let isSetValueWithEmpty = false + let disabled = false + + let v = getValueFromJson(data, field.path || field.key) + + if (field.key === 'raw_data') { + v = searchEnvValue(data, 'RAW_DATA_SUB_DIR') + v = v.replace('portal_publish_dir/', '') + } + else if (field.key === 'name' && editing) { + disabled = true + } + else if (field.key === 'federation_id') { + const federationID = parseInt(localStorage.getItem('federationID')) + if (federationID > 0) { + v = federationID + disabled = true + } + } + else if (field.key === 'num_partitions') { + v = searchEnvValue(data, 'PARTITION_NUM') + } + else if (field.key === 'image') { + v = searchValue(data, field.path) + } + else if (field.type === 'bool-select') { + v = typeof v === 'boolean' ? v : true + } + else if (field.key === 'datasource') { + v = searchEnvValue(data, 'DATA_SOURCE') + } + else if (field.key === 'code_key') { + v = searchEnvValue(data, 'CODE_KEY') + } + else { + v = v || field.emptyDefault || '' + } + + if (typeof v === 'object' && v !== null) { + v = JSON.stringify(v, null, 2) + } + + if (v !== undefined || (v === undefined && isSetValueWithEmpty)) { + field.value = v + } + field.editing = true + + if (!field.props) field.props = {} + field.props.disabled = disabled + + return field +} + +/** + * editing: always write value to field + * init: this call is for init form value and will not pass any group + */ +function mapValueToFields({data, fields, targetGroup, type = 'form', editing = false, init = false}) { + return produce(fields, draft => { + draft.map((x) => { + if (x.groupName) { + editing && (init = true) + if (!data[x.groupName]) return + if (!init && x.groupName !== targetGroup) return + if (x.formTypes) { + let types = init ? x.formTypes : [type] + types.forEach(el => { + x.fields[el].forEach(field => fillField(data[x.groupName], field, editing)) + }) + } else { + x.fields.forEach(field => { + fillField(data[x.groupName], field, editing) + }) + } + } else { + fillField(data, x, editing) + } + }); + }) +} + +function handleParamData(container, data, field) { + if (field.type === 'label') { return } + + let path = field.path || field.key + let value = data + + fillJSON(container, path, value) +} + +let formMeta = {} +const setFormMeta = data => formMeta = data + +let jobType = '' + +export default function TicketList({ + datasoure, + training, + filter, + ...props +}) { + + const theme = useTheme(); + + let TICKET_REPLICA_TYPE, INIT_PARAMS, FILTER_TYPE, PAGE_NAME, DEFAULT_JOB_TYPE + if (datasoure) { + + PAGE_NAME = 'datasource' + + TICKET_REPLICA_TYPE = TICKET_DATA_JOIN_REPLICA_TYPE + + INIT_PARAMS = TICKET_DATA_JOIN_PARAMS + + FILTER_TYPE = JOB_TYPE_CLASS.datasource + + DEFAULT_JOB_TYPE = JOB_TYPE.data_join + + } else { + + PAGE_NAME = 'training' + + TICKET_REPLICA_TYPE = TICKET_NN_REPLICA_TYPE + + INIT_PARAMS = TICKET_NN_PARAMS + + FILTER_TYPE = JOB_TYPE_CLASS.training + + DEFAULT_JOB_TYPE = JOB_TYPE.nn_model + + } + + filter = filter + || useCallback(job => FILTER_TYPE.some(type => type === job.job_type), []) + + const { data, mutate } = useSWR('tickets', fetcher); + const tickets = data ? data.data.filter(filter) : null; + const columns = tickets && tickets.length > 0 + ? [ + ...Object.keys(tickets[0]).filter((x) => !['public_params', 'private_params', 'expire_time', 'created_at', 'updated_at', 'deleted_at'].includes(x)), + 'operation', + ] + : []; + + // rewrite functions + const rewriteEnvs = useCallback((draft, data, rules) => { + PARAMS_GROUP.forEach(paramType => { + TICKET_REPLICA_TYPE.forEach(replicaType => { + let envPath = ENV_PATH.replace('[replicaType]', replicaType) + + if (!draft[paramType]) { + draft[paramType] = {} + } + + let envs = getValueFromJson(draft[paramType], envPath) + if (!envs) { envs = [] } + + let envNames = envs.map(env => env.name) + rules.forEach(el => { + if (el.writeTo && !el.writeTo.some(x => x === replicaType)) return + + let idx = envNames.indexOf(el.name) + let value = el.getValue(data) || '' + if (idx >= 0) { + envs[idx].value = value.toString() + } else { + // here envs is not extensible, push will throw error + envs = envs.concat({name: el.name, value: value.toString()}) + } + }) + // trigger immer‘s intercepter + fillJSON(draft[paramType], envPath, envs) + }) + }) + }, []) + const commonRewrite = useCallback((draft, data) => { + TICKET_REPLICA_TYPE.forEach(replicaType => { + let path = `spec.flReplicaSpecs.${replicaType}.template.spec.containers[].image` + + PARAMS_GROUP.forEach(paramType => { + if (!draft[paramType]) { + draft[paramType] = {} + } + fillJSON(draft[paramType], path, data.image) + }) + }) + + // image + draft.image && delete draft.image + }, []) + const dataSourceRewrite = useCallback((draft, data) => { + // envs + const insert2Env = [ + { name: 'RAW_DATA_SUB_DIR', getValue: data => 'portal_publish_dir/' + (data.raw_data.name || data.raw_data) }, + { name: 'PARTITION_NUM', getValue: data => data.num_partitions }, + ] + rewriteEnvs(draft, data, insert2Env) + + // replicas + TICKET_REPLICA_TYPE.forEach(replicaType => { + let num = replicaType === 'Master' ? 1 : draft.num_partitions + + PARAMS_GROUP.forEach(paramType => { + fillJSON(draft[paramType], `spec.flReplicaSpecs.${replicaType}.replicas`, parseInt(num)) + }) + }) + + // delete fields + draft.raw_data && delete draft.raw_data + draft.num_partitions && delete draft.num_partitions + + }, []) + const trainingRewrite = useCallback((draft, data) => { + // envs + const insert2Env = [ + { name: 'DATA_SOURCE', getValue: data => data.datasource }, + { name: 'CODE_KEY', getValue: data => data.code_key, writeTo: ['Worker'] }, + ] + rewriteEnvs(draft, data, insert2Env) + + // delete fields + draft.datasource && delete draft.datasource + draft.code_key && delete draft.code_key + + }, []) + const rewriteFields = useCallback((draft, data) => { + // this function will be call inner immer + commonRewrite(draft, data) + if (datasoure) { + dataSourceRewrite(draft, data) + } + if (training) { + trainingRewrite(draft, data) + } + }, []) + // ---end--- + // form meta convert functions + const mapFormMeta2FullData = useCallback((fields = fields) => { + let data = {} + fields.map((x) => { + if (x.groupName) { + data[x.groupName] = { ...formMeta[x.groupName] } + data[x.groupName][x.groupName] = formMeta[x.groupName] + } else { + data[x.key] = formMeta[x.key] + } + }) + return data + }, []) + const writeJson2FormMeta = useCallback((groupName, data) => { + setFormMeta(produce(formMeta, draft => { + fields.map((x) => { + if (x.groupName === groupName) { + draft[groupName] = JSON.parse(data[groupName][groupName] || x.emptyDefault || '{}') + } else { + draft[x.key] = getParsedValueFromData(data, x) || draft[x.key] + } + }) + + rewriteFields(draft, data) + })) + }, []) + const writeForm2FormMeta = useCallback((groupName, data) => { + setFormMeta(produce(formMeta, draft => { + fields.map(x => { + if (x.groupName === groupName) { + if (!draft[groupName]) { draft[groupName] = {} } + + for (let field of getPublicParamsFields()) { + let value = getParsedValueFromData(data[groupName], field) + handleParamData(draft[groupName], value, field) + } + + } else { + draft[x.key] = getParsedValueFromData(data, x) + } + }) + rewriteFields(draft, data) + })) + }, []) + const formTypeChangeHandler = paramsType => (data, currType, targetType) => { + let newFields + try { + if (targetType === 'json') { + writeForm2FormMeta(paramsType, data) + newFields = mapValueToFields({ + data: mapFormMeta2FullData(fields), + fields: fields.filter(el => el.groupName === paramsType), + targetGroup: paramsType, + type: 'json' + }) + } + if (targetType === 'form') { + writeJson2FormMeta(paramsType, data) + newFields = mapValueToFields({ + data: mapFormMeta2FullData(fields), + fields: fields.filter(el => el.groupName === paramsType), + targetGroup: paramsType, + type: 'form' + }) + } + } catch (error) { + return { error } + } + return { newFields } + } + // --end--- + + const onJobTypeChange = useCallback((value, totalData, groupFormType) => { + jobType = value + writeFormMeta(totalData,groupFormType) + + switch (value) { + case JOB_TYPE.data_join: + TICKET_REPLICA_TYPE = TICKET_DATA_JOIN_REPLICA_TYPE + setFormMeta({...formMeta, ...TICKET_DATA_JOIN_PARAMS}); break + case JOB_TYPE.psi_data_join: + TICKET_REPLICA_TYPE = TICKET_PSI_DATA_JOIN_REPLICA_TYPE + setFormMeta({...formMeta, ...TICKET_PSI_DATA_JOIN_PARAMS}); break + case JOB_TYPE.nn_model: + TICKET_REPLICA_TYPE = TICKET_NN_REPLICA_TYPE + setFormMeta({...formMeta, ...TICKET_NN_PARAMS}); break + case JOB_TYPE.tree_model: + TICKET_REPLICA_TYPE = TICKET_TREE_REPLICA_TYPE + setFormMeta({...formMeta, ...TICKET_TREE_PARAMS}); break + } + + setFields( + mapValueToFields({ + data: mapFormMeta2FullData(fields), + fields: getDefauktFields(), + init: true, + }) + ) + }, []) + + const getPublicParamsFields = useCallback(() => TICKET_REPLICA_TYPE.reduce( + (total, replicaType) => { + const replicaKey = key => `${replicaType}.${key}` + + total.push(...[ + { key: replicaType, type: 'label' }, + { + key: replicaKey('pair'), + label: 'pair', + type: 'bool-select', + path: `spec.flReplicaSpecs.${replicaType}.pair`, + }, + { + key: replicaKey('env'), + label: 'env', + type: 'name-value', + path: `spec.flReplicaSpecs.${replicaType}.template.spec.containers[].env`, + emptyDefault: [], + // props: { + // ignoreKeys: ['PARTITION_NUM', 'CODE_KEY'] + // }, + span: 24, + }, + { + key: replicaKey('command'), + label: 'command', + type: 'json', + path: `spec.flReplicaSpecs.${replicaType}.template.spec.containers[].command`, + emptyDefault: [], + span: 24, + }, + { + key: replicaKey('args'), + label: 'args', + type: 'json', + path: `spec.flReplicaSpecs.${replicaType}.template.spec.containers[].args`, + emptyDefault: [], + span: 24, + } + ]) + return total + }, + [] + ), [TICKET_REPLICA_TYPE]) + + const getDefauktFields = useCallback(() => filterArrayValue([ + { key: 'name', required: true }, + { key: 'federation_id', type: 'federation', label: 'federation', required: true }, + { + key: 'job_type', + type: 'jobType', + label: ( + <> + job_type + change job type will reset all params}> + + + + ), + props: {type: PAGE_NAME}, + required: true, + default: DEFAULT_JOB_TYPE, + onChange: onJobTypeChange, + }, + { key: 'role', type: 'jobRole', required: true }, + { key: 'expire_time' }, + { + key: 'image', + required: true, + path: 'spec.flReplicaSpecs.[replicaType].template.spec.containers[].image', + props: { width: '100%' } + }, + datasoure && { + key: 'raw_data', + type: 'rawData', + callback: updateForm => + value => updateForm('num_partitions', value?.output_partition_num), + }, + datasoure && { + key: 'num_partitions', + label: 'num partitions', + }, + training && { + key: 'datasource', + type: 'datasource', + required: true, + }, + (training && jobType === JOB_TYPE.nn_model) ? { + key: 'code_key', + props: { width: '100%' } + } : undefined, + { key: 'remark', type: 'text', span: 24 }, + { + groupName: 'public_params', + initialVisible: false, + onFormTypeChange: formTypeChangeHandler('public_params'), + formTypes: ['form', 'json'], + fields: { + form: getPublicParamsFields(), + json: [ + { + key: 'public_params', + type: 'json', + span: 24, + hideLabel: true, + props: { + minHeight: '500px' + }, + }, + ] + } + }, + { + groupName: 'private_params', + initialVisible: false, + fields: [ + { + key: 'private_params', + type: 'json', + span: 24, + hideLabel: true, + emptyDefault: {}, + props: { + minHeight: '500px' + }, + }, + ] + } + ]), [TICKET_REPLICA_TYPE, training, datasoure, jobType]) + const [formVisible, setFormVisible] = useState(false); + const [fields, setFields] = useState(getDefauktFields()); + const [currentTicket, setCurrentTicket] = useState(null); + const title = currentTicket ? `Edit Ticket: ${currentTicket.name}` : 'Create Ticket'; + const closeForm = () => { + setCurrentTicket(null) + setFormMeta({}) + setFormVisible(!formVisible) + }; + const onCreate = () => { + setFormMeta({ ...INIT_PARAMS }) + setFields(mapValueToFields({data: formMeta, fields: getDefauktFields(), init: true})) + setFormVisible(true); + } + const onOk = (ticket) => { + mutate({ + data: [...tickets, ticket], + }); + closeForm(); + }; + const handleEdit = (ticket) => { + setCurrentTicket(ticket); + setFormMeta(ticket) + + jobType = ticket.job_type + + setFields(mapValueToFields({data: ticket, fields: getDefauktFields(), editing: true})); + setFormVisible(true); + }; + + const handleClone = (ticket) => { + setFormMeta(ticket) + + jobType = ticket.job_type + + setFields(mapValueToFields({data: ticket, fields: getDefauktFields(), init: true})); + setFormVisible(true); + } + + const writeFormMeta = (data, formTypes) => { + const writer = formTypes['public_params'] === 'json' + ? writeJson2FormMeta : writeForm2FormMeta + writer('public_params', data) + + writeJson2FormMeta('private_params', data) + } + const handleSubmit = (data, formTypes) => { + writeFormMeta(data, formTypes) + + if (currentTicket) { + return updateTicket(currentTicket.id, formMeta); + } + + return createTicket(formMeta); + }; + const operation = (actions, rowData) => { + const onHandleEdit = (e) => { + e.preventDefault(); + handleEdit(rowData.rowValue); + }; + const onHandleClone = (e) => { + e.preventDefault(); + handleClone(rowData.rowValue); + }; + return <> + + Clone + + Edit + + }; + const dataSource = tickets + ? tickets.map((x) => ({ ...x, operation })) + : []; + + return ( + + {formVisible + ? ( +
+ ) + : ( + <> +
+ Tickets + +
+ {tickets && ( + + + {columns.map((x) => )} +
+
+ )} + + )} + + ); +} diff --git a/web_console/components/DataSourceSelect.jsx b/web_console/components/DataSourceSelect.jsx new file mode 100644 index 000000000..5a8bd8dde --- /dev/null +++ b/web_console/components/DataSourceSelect.jsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { Select, Popover } from '@zeit-ui/react'; +import useSWR from 'swr'; +import { fetcher } from '../libs/http'; +import { JOB_TYPE_CLASS } from '../constants/job' + +export default function DataSourceSelect({type, ...props}) { + + const filter = el => JOB_TYPE_CLASS.datasource.some(t => el.localdata?.job_type === t) + + const { data } = useSWR(`jobs`, fetcher); + const jobs = data?.data?.filter(filter) || [] + + const actualValue = jobs.find((x) => x.localdata?.name === props.value)?.localdata?.name; + const actualOnChange = (value) => { + props.onChange(value); + }; + + return ( + + ); +} diff --git a/web_console/components/FederationSelect.jsx b/web_console/components/FederationSelect.jsx index fd690bec9..184e9224c 100644 --- a/web_console/components/FederationSelect.jsx +++ b/web_console/components/FederationSelect.jsx @@ -1,8 +1,10 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { Select } from '@zeit-ui/react'; import useSWR from 'swr'; import { fetcher } from '../libs/http'; +let rendered = false + export default function FederationSelect(props) { const { data } = useSWR('federations', fetcher); const federations = data ? data.data : []; @@ -12,9 +14,20 @@ export default function FederationSelect(props) { const federation = federations.find((x) => x.name === value); props.onChange(federation.id); }; + + !rendered + && props.initTrigerChange + && props.value + && props.onChange(props.value) + + rendered = true + + // reset flag + useEffect(() => () => rendered = false, []) + return ( ); } diff --git a/web_console/components/Form.jsx b/web_console/components/Form.jsx index 5386e3bc0..fdc8a0159 100644 --- a/web_console/components/Form.jsx +++ b/web_console/components/Form.jsx @@ -1,4 +1,4 @@ -import React, { useState, useReducer, useMemo } from 'react'; +import React, { useState, useReducer, useMemo, useCallback, useEffect, useRef } from 'react'; import css from 'styled-jsx/css'; import { Button, ButtonGroup, Card, Grid, Text, Input, Toggle, Textarea, Note, useTheme, Collapse, useToasts, Select } from '@zeit-ui/react'; import FederationSelect from './FederationSelect'; @@ -8,6 +8,10 @@ import ServerTicketSelect from './ServerTicketSelect'; import ClientTicketSelect from './ClientTicketSelect'; import DataPortalTypeSelect from './DataPortalTypeSelect'; import NameValueInput from './NameValueGroup'; +import RawDataSelect from './RawDataSelect' +import BooleanSelect from './BooleanSelect' +import DataSourceSelect from './DataSourceSelect' +import produce from 'immer' function useStyles() { return css` @@ -20,6 +24,81 @@ function useStyles() { `; } +const formatGroupFieldKey = (groupName, key) => `[group:${groupName}].${key}` + +// mark group name to handle conflicts +// TODO: handle conflict between form types in one group +const handleFieldsToRender = fields => produce(fields, draft => { + draft.forEach(curr => { + if (!curr.groupName) return + + const handleGroupFields = fields => { + fields.forEach(field => { + if (field.type === 'label') return + field.label = field.label || field.key + field.key = formatGroupFieldKey(curr.groupName, field.key) + }) + } + if (Array.isArray(curr.fields)) { + handleGroupFields(curr.fields) + } else { + Object.values(curr.fields).forEach(el => handleGroupFields(el)) + } + }) +}) + +function deepEqual(x, y) { + if (x === y) { + return true; + } + if (!(typeof x == "object" && x != null) || !(typeof y == "object" && y != null)){ + return false; + } + if (Object.keys(x).length != Object.keys(y).length){ + return false; + } + for (var prop in x) { + if (y.hasOwnProperty(prop)) + { + if (!deepEqual(x[prop], y[prop])){ + return false; + } + } + else{ + return false; + } + } + return true; +} + +const mapFields2Form = (fields, groupType) => { + // flat all group fileds + fields = fields.reduce((total, curr) => { + if (curr.groupName) { + if (Array.isArray(curr.fields)) { + total.push(...curr.fields) + } else { + groupType + ? total.push(...curr.fields[groupType]) + : Object.values(curr.fields).forEach(el => total.push(...el)) + } + } else { + total.push(curr) + } + return total + }, []) + const formData = fields.reduce((total, current) => { + total[current.key] = current.hasOwnProperty('value') + ? current.value + : current.value || current.default || ''; + return total; + }, {}) + return [fields, formData] +} + +const groupFormType = {} +let fieldsCache + /** * interface IField { * key: string; @@ -29,9 +108,9 @@ function useStyles() { * required?: boolean; * span?: number; // Grid layout prop * props?: any; + * callback?: (updateForm: function) => (value: any) => any * } */ - export default function Form({ title, onOk, onSubmit, onCancel, gap = 2, fields = [], okText = 'Submit', cancelText = 'Cancel', @@ -39,44 +118,38 @@ export default function Form({ }) { // cache raw fields data const rawFields = fields - // TODO: handle name confilicts + const fieldsToRender = handleFieldsToRender(fields) + + useEffect(() => { + rawFields.forEach(field => { + if (field.groupName && field.formTypes) { + groupFormType[field.groupName] = field.formTypes[0] + } + }) + }, []) - const groupFormType = useMemo(() => ({}), []) const theme = useTheme(); const styles = useStyles(theme); - const mapFields2Form = fields => { - // flat all group fileds - let formFields = fields.reduce((total, curr) => { - if (curr.groupName) { - if (Array.isArray(curr.fields)) { - total.push(...curr.fields) - } else { - Object.values(curr.fields).forEach(el => total.push(...el)) - } - } else { - total.push(curr) - } - return total - }, []) - const formData = formFields.reduce((total, current) => { - total[current.key] = current.hasOwnProperty('value') - ? current.value - : current.value || current.default; - return total; - }, {}) - return [formFields, formData] - } - let [formFields, formData] = mapFields2Form(fields) + let formData + [fields, formData] = mapFields2Form(fieldsToRender) const [form, setForm] = useState(formData); + // update form value in rendering + useEffect(() => { + if (!deepEqual(fields, fieldsCache)) { + fieldsCache = fields + setForm(formData) + } + }) + const getFormatFormData = () => rawFields.reduce((total, curr) => { if (curr.groupName) { total[curr.groupName] = {} const fillGroupFields = fields => { for (let field of fields) { - total[curr.groupName][field.key] = form[field.key] + total[curr.groupName][field.key] = form[formatGroupFieldKey(curr.groupName, field.key)] } } // handle multi formType @@ -93,15 +166,15 @@ export default function Form({ return total }, {}) - const disabled = formFields.filter((x) => x.required).some((x) => !form[x.key]); + const disabled = fields.filter((x) => x.required).some((x) => !form[x.key]); const updateForm = (key, value) => { - const data = { + setForm(form => ({ ...form, [key]: value, - }; - setForm(data); + })); }; - const renderField = ({ key, label, props, type, onChange, hideLabel }) => { + + const renderField = ({ key, label, props, type, onChange, hideLabel, callback }) => { const valueProps = { ...props, style: { @@ -157,9 +230,11 @@ export default function Form({ { - updateForm(key, value); + updateForm(key, value) + let formData = getFormatFormData() + formData[key] = value if (onChange) { - onChange(value); + onChange(value, formData); } }} {...valueProps} @@ -176,7 +251,14 @@ export default function Form({
updateForm(key, value)} + onChange={(value) => { + updateForm(key, value) + let data = getFormatFormData() + data[key] = value + if (onChange) { + onChange(value, data, groupFormType); + } + }} {...valueProps} />
@@ -264,6 +346,7 @@ export default function Form({ updateForm(key, value)} + {...valueProps} /> + : + : + } + + : null + ); +} diff --git a/web_console/components/JobCommonInfo.jsx b/web_console/components/JobCommonInfo.jsx index dff2f937c..c793cfebe 100644 --- a/web_console/components/JobCommonInfo.jsx +++ b/web_console/components/JobCommonInfo.jsx @@ -1,10 +1,10 @@ import React, { useMemo } from 'react'; import css from 'styled-jsx/css'; -import { Table, Link, Text, Card, Description, Popover, useTheme } from '@zeit-ui/react'; +import { Table, Link, Text, Card, Description, Popover, useTheme, Button } from '@zeit-ui/react'; import useSWR from 'swr'; import { fetcher } from '../libs/http'; -import { getStatusColor, handleStatus, FLAppStatus } from '../utils/job'; +import { getStatusColor, handleStatus, FLAppStatus, getJobStatus } from '../utils/job'; import Layout from './Layout'; import Dot from './Dot'; import Empty from './Empty'; @@ -100,19 +100,21 @@ export default function JobCommonInfo(props) { ? (logsData && logsData.data) ? logsData.data : ['logs error ' + (logsData?.error || logsError?.message)] : null; + const status = props.jobStatus || getJobStatus(job) + const tableData = useMemo(() => { if (pods) { return pods.map((item) => ({ status: item.status, pod: item.name.replace( - `${job.localdata?.name}-${job.spec?.role.toLowerCase()}-${item.type.toLowerCase()}-`, + `${job?.localdata?.name}-${job?.spec?.role.toLowerCase()}-${item.type.toLowerCase()}-`, '', ), type: item.type, link: ( <> { - job.status?.appState === FLAppStatus.Running && item.status === podStatus.active + job?.status?.appState === FLAppStatus.Running && item.status === podStatus.active ? ( - - {handleStatus(job?.status?.appState) || '-'} + + {status || '-'} )} /> diff --git a/web_console/components/JobTypeSelect.jsx b/web_console/components/JobTypeSelect.jsx index 0a112258f..4166a4395 100644 --- a/web_console/components/JobTypeSelect.jsx +++ b/web_console/components/JobTypeSelect.jsx @@ -1,11 +1,12 @@ import React from 'react'; import { Select } from '@zeit-ui/react'; -import { JOB_TYPE } from '../constants/job'; +import { JOB_TYPE_CLASS } from '../constants/job'; export default function JobTypeSelect(props) { - const options = JOB_TYPE.map((x) => ({ label: x, value: x })); + const types = props.type ? JOB_TYPE_CLASS[props.type] : JOB_TYPE_CLASS.all + const options = types.map((x) => ({ label: x, value: x })); return ( - {options.map((x) => {x.label})} ); diff --git a/web_console/components/NameValueGroup.jsx b/web_console/components/NameValueGroup.jsx index 047368695..5518f2331 100644 --- a/web_console/components/NameValueGroup.jsx +++ b/web_console/components/NameValueGroup.jsx @@ -69,7 +69,7 @@ function NameValuePair({value, onChange, onDelete, ...props}) { ) } -export default function NameValueInput({value, onChange, ...props}) { +export default function NameValueInput({value, onChange, ignoreKeys = [], ...props}) { let value_ = JSON.parse(value || '[]') const onItemChange = (idx, name, value) => { const copy = value_ @@ -85,7 +85,9 @@ export default function NameValueInput({value, onChange, ...props}) {
{ value_.map((el, idx) => - el.name === key) + ? undefined + : onItemChange(idx, name, value)} diff --git a/web_console/components/RawDataSelect.jsx b/web_console/components/RawDataSelect.jsx new file mode 100644 index 000000000..fbb020ec3 --- /dev/null +++ b/web_console/components/RawDataSelect.jsx @@ -0,0 +1,33 @@ +import React, { useEffect } from 'react'; +import { Select } from '@zeit-ui/react'; +import useSWR from 'swr'; +import { fetcher } from '../libs/http'; + +let initialUpdated = false + +export default function RawDataSelect(props) { + const { data } = useSWR('raw_datas', fetcher); + const rawDatas = data ? data.data : []; + const actualValue = typeof props.value === 'string' + ? props.value : props.value?.name + const actualOnChange = (value) => { + const rawData = rawDatas.find((x) => x.name === value); + props.onChange(rawData); + }; + + if (!initialUpdated) { + typeof props.value === 'string' + && rawDatas.length > 0 + && actualOnChange(props.value) + + initialUpdated = true + } + + useEffect(() => () => initialUpdated = false, []) + + return ( + + ); +} diff --git a/web_console/components/ServerTicketSelect.jsx b/web_console/components/ServerTicketSelect.jsx index 9a3d69b7e..27ede5d63 100644 --- a/web_console/components/ServerTicketSelect.jsx +++ b/web_console/components/ServerTicketSelect.jsx @@ -2,23 +2,58 @@ import React from 'react'; import { Select, Popover, Code } from '@zeit-ui/react'; import useSWR from 'swr'; import { fetcher } from '../libs/http'; +import { JOB_TYPE_CLASS } from '../constants/job' + +// const mockRes = { +// "data": [ +// { +// "name": "ticket-360-k4", +// "job_type": "data_join", +// "role": "Follower", +// "sdk_version": "049ad50", +// "expire_time": "Fri Jun 18 2021 00:00:00 GMT+0000 (Coordinated Universal Time)", +// "remark": "", +// "public_params": "null" +// }, +// { +// "name": "test-training", +// "job_type": "nn_model", +// "role": "Follower", +// "sdk_version": "049ad50", +// "expire_time": "Fri Jun 18 2021 00:00:00 GMT+0000 (Coordinated Universal Time)", +// "remark": "", +// "public_params": "null" +// } +// ] +// } + +let filter = () => true +export default function ServerTicketSelect({type, ...props}) { + + if (type) { + filter = el => JOB_TYPE_CLASS[type].some(t => el.job_type === t) + } -export default function ServerTicketSelect(props) { const { data } = useSWR( props.federation_id ? `federations/${props.federation_id}/tickets` : null, fetcher, ); - const tickets = (data && data.data) || []; - const actualValue = tickets.find((x) => x.name === props.value)?.value; + const tickets = data?.data?.filter(filter) || [] + // const tickets = mockRes.data; + + const actualValue = tickets.find((x) => x.name === props.value)?.name; const actualOnChange = (value) => { const ticket = tickets.find((x) => x.name === value); props.onChange(ticket.name); }; const popoverContent = (content) => { + if (typeof content.public_params === 'string') { + content.public_params = JSON.parse(content.public_params || '{}') + } return (
-        {JSON.stringify(JSON.parse(content || '{}'), null, 2)}
+        {JSON.stringify(content, null, 2)}
         
@@ -74,11 +115,10 @@ function FederationItem({ data, onEdit }) {
 }
 
 const K8S_SETTINGS_FIELDS = [
-  { key: 'namespace', default: K8S_SETTINGS.namespace },
-  { key: 'storage_root_path', default: K8S_SETTINGS.storage_root_path },
+  { key: 'namespace' },
+  { key: 'storage_root_path' },
   {
     key: 'imagePullSecrets',
-    default: K8S_SETTINGS.imagePullSecrets,
     type: 'json',
     span: 24,
     path: 'global_replica_spec.template.spec.imagePullSecrets',
@@ -88,7 +128,6 @@ const K8S_SETTINGS_FIELDS = [
     key: 'env',
     type: 'name-value',
     span: 24,
-    default: K8S_SETTINGS.env,
     props: {
       minHeight: '150px',
     },
@@ -99,7 +138,6 @@ const K8S_SETTINGS_FIELDS = [
     key: 'grpc_spec',
     type: 'json',
     span: 24,
-    default: K8S_SETTINGS.grpc_spec,
     props: {
       minHeight: '150px',
     },
@@ -109,7 +147,6 @@ const K8S_SETTINGS_FIELDS = [
     key: 'leader_peer_spec',
     type: 'json',
     span: 24,
-    default: K8S_SETTINGS.leader_peer_spec,
     props: {
       minHeight: '150px',
     },
@@ -119,7 +156,6 @@ const K8S_SETTINGS_FIELDS = [
     key: 'follower_peer_spec',
     type: 'json',
     span: 24,
-    default: K8S_SETTINGS.follower_peer_spec,
     props: {
       minHeight: '150px',
     },
@@ -132,7 +168,7 @@ const K8S_SETTINGS_FIELDS = [
  */
 function fillField(data, field, edit=false) {
   let v = getValueFromJson(data, field.path || field.key)
-  if (typeof v === 'object') {
+  if (typeof v === 'object'  && v !== null) {
     v = JSON.stringify(v, null, 2)
   }
   field.value = v
@@ -228,7 +264,7 @@ export default function FederationList() {
           if (!draft.k8s_settings) { draft.k8s_settings = {} }
           for (let field of K8S_SETTINGS_FIELDS) {
             fillJSON(
-              draft.k8s_settings, field.path || [field.key],
+              draft.k8s_settings, field.path || field.key,
               getParsedValueFromData(data.k8s_settings, field)
             )
           }
@@ -259,10 +295,10 @@ export default function FederationList() {
     }
     return { newFields }
   }
-  const DEFAULT_FIELDS = [
+  const DEFAULT_FIELDS = useMemo(() => [
     { key: 'name', required: true },
-    { key: 'x-federation' },
     { key: 'trademark' },
+    { key: 'x-federation' },
     { key: 'email' },
     { key: 'tel', label: 'telephone' },
     { key: 'avatar' },
@@ -285,9 +321,14 @@ export default function FederationList() {
         ]
       },
     },
-  ];
+  ], []);
   const [fields, setFields] = useState(DEFAULT_FIELDS);
 
+  const onClickCreate = () => {
+    setFormMeta({ k8s_settings: K8S_SETTINGS })
+    setFields(mapValueToFields({federation: mapFormMeta2Form(), fields}))
+    setFormVisible(true)
+  }
   const toggleForm = () => {
     setFormVisible(!formVisible);
     if (formVisible) {
@@ -333,10 +374,12 @@ export default function FederationList() {
   }
 
   const handleSubmit = (value, groupFormType) => {
-    for (let field of K8S_SETTINGS_FIELDS) {
-      let error = checkK8sSetting(field, value.k8s_settings[field.key])
-      if (error) {
-        return {error}
+    if (groupFormType.k8s_settings === 'form') {
+      for (let field of K8S_SETTINGS_FIELDS) {
+        let error = checkK8sSetting(field, value.k8s_settings[field.key])
+        if (error) {
+          return {error}
+        }
       }
     }
 
@@ -367,7 +410,7 @@ export default function FederationList() {
           <>
             
Federations - +
{federations && federations.map((x) => ( diff --git a/web_console/pages/job/charts/[id].jsx b/web_console/pages/charts/[id].jsx similarity index 88% rename from web_console/pages/job/charts/[id].jsx rename to web_console/pages/charts/[id].jsx index 1813ea005..4ff807f77 100644 --- a/web_console/pages/job/charts/[id].jsx +++ b/web_console/pages/charts/[id].jsx @@ -3,9 +3,9 @@ import useSWR from 'swr'; import { useRouter } from 'next/router'; import css from 'styled-jsx/css'; import { Text, Card, Grid } from '@zeit-ui/react'; -import { fetcher } from '../../../libs/http'; -import Layout from '../../../components/Layout'; -import getJobDashboardUrls from '../../../utils/kibana'; +import { fetcher } from '../../libs/http'; +import Layout from '../../components/Layout'; +import getJobDashboardUrls from '../../utils/kibana'; function useStyle() { return css` diff --git a/web_console/pages/datasource/job/[id].jsx b/web_console/pages/datasource/job/[id].jsx new file mode 100644 index 000000000..c6c67993b --- /dev/null +++ b/web_console/pages/datasource/job/[id].jsx @@ -0,0 +1,9 @@ +import React from 'react'; +import { useRouter } from 'next/router'; + +import Job from '../../../components/Job'; + +export default function Jobs() { + const router = useRouter(); + return +} diff --git a/web_console/pages/datasource/job/index.jsx b/web_console/pages/datasource/job/index.jsx new file mode 100644 index 000000000..7a038ee26 --- /dev/null +++ b/web_console/pages/datasource/job/index.jsx @@ -0,0 +1,5 @@ +import CommonJobList from '../../../components/CommonJobList' + +export default function JobList() { + return +} \ No newline at end of file diff --git a/web_console/pages/datasource/tickets/index.jsx b/web_console/pages/datasource/tickets/index.jsx new file mode 100644 index 000000000..5e8be8d9c --- /dev/null +++ b/web_console/pages/datasource/tickets/index.jsx @@ -0,0 +1,5 @@ +import CommonTicket from '../../../components/CommonTicket' + +export default function Ticket() { + return +} \ No newline at end of file diff --git a/web_console/pages/index.jsx b/web_console/pages/index.jsx index fc495aab8..e6e2c0a07 100644 --- a/web_console/pages/index.jsx +++ b/web_console/pages/index.jsx @@ -69,7 +69,7 @@ export default function Overview() { const router = useRouter(); const { data } = useSWR('jobs', fetcher); const jobs = data ? data.data.filter((x) => x.metadata) : []; - const goToJob = () => router.push('/job'); + const goToJob = () => router.push('/datasource/job'); return (
diff --git a/web_console/pages/job/[id].jsx b/web_console/pages/job/[id].jsx index c77c0f79f..a3bbc1d8a 100644 --- a/web_console/pages/job/[id].jsx +++ b/web_console/pages/job/[id].jsx @@ -13,7 +13,7 @@ export default function Job() { const job = jobData ? jobData.data : null; return ( - + job ? + : null ); } diff --git a/web_console/pages/raw_data/[id].jsx b/web_console/pages/raw_data/[id].jsx index 11df26a74..c0203930e 100644 --- a/web_console/pages/raw_data/[id].jsx +++ b/web_console/pages/raw_data/[id].jsx @@ -43,7 +43,7 @@ export default function RawDataJob() { }, [rawData?.localdata?.id]); return ( - + rawData ? Delete Job + : null ); } diff --git a/web_console/pages/raw_data/index.jsx b/web_console/pages/raw_data/index.jsx index 0f701a78d..0124f35cf 100644 --- a/web_console/pages/raw_data/index.jsx +++ b/web_console/pages/raw_data/index.jsx @@ -1,5 +1,5 @@ -import React, { useState } from 'react'; -import { Table, Button, Card, Text, Link } from '@zeit-ui/react'; +import React, { useState, useMemo } from 'react'; +import { Table, Button, Card, Text, Link, useTheme } from '@zeit-ui/react'; import NextLink from 'next/link'; import useSWR from 'swr'; import produce from 'immer' @@ -16,18 +16,19 @@ const RESOURCE_PATH_PREFIX = 'yaml_spec.spec.flReplicaSpecs.[replicaType].templa const IMAGE_PATH = 'yaml_spec.spec.flReplicaSpecs.[replicaType].template.spec.containers[].image' const WORKER_REPLICAS_PATH = 'yaml_spec.spec.flReplicaSpecs.Worker.replicas' +const REPLICA_TYPES = ['Master', 'Worker'] + const DATA_FORMAT_OPTIONS = [ { label: 'TF_RECORD', value: 'TF_RECORD' }, { label: 'CSV_DICT', value: 'CSV_DICT' }, ] const CONTEXT_FIELDS = [ - { key: 'file_wildcard', default: '*', default: RAW_DATA_CONTEXT.file_wildcard }, + { key: 'file_wildcard' }, { key: 'input_data_format', type: 'select', required: true, - default: RAW_DATA_CONTEXT.input_data_format, props: { options: DATA_FORMAT_OPTIONS } @@ -36,7 +37,6 @@ const CONTEXT_FIELDS = [ key: 'output_data_format', type: 'select', required: true, - default: RAW_DATA_CONTEXT.output_data_format, props: { options: DATA_FORMAT_OPTIONS } @@ -45,7 +45,6 @@ const CONTEXT_FIELDS = [ key: 'compressed_type', type: 'select', required: true, - default: RAW_DATA_CONTEXT.compressed_type, props: { options: [ { label: 'GZIP', value: 'GZIP' }, @@ -54,36 +53,32 @@ const CONTEXT_FIELDS = [ ] } }, - { key: 'batch_size', default: RAW_DATA_CONTEXT.batch_size }, - { key: 'max_flying_item', default: RAW_DATA_CONTEXT.max_flying_item }, - { key: 'write_buffer_size', default: RAW_DATA_CONTEXT.write_buffer_size }, + { key: 'batch_size' }, + { key: 'max_flying_item' }, + { key: 'write_buffer_size' }, { key: 'Master Resources', type: 'label', span: 24}, { key: 'resource.Master.cpu_request', label: 'cpu request', path: RESOURCE_PATH_PREFIX + '.requests.cpu', - default: RAW_DATA_CONTEXT.resource_master_cpu_request, span: 12, }, { key: 'resource.Master.cpu_limit', label: 'cpu limit', path: RESOURCE_PATH_PREFIX + '.limits.cpu', - default: RAW_DATA_CONTEXT.resource_master_cpu_limit, span: 12 }, { key: 'resource.Master.memory_request', label: 'memory request', path: RESOURCE_PATH_PREFIX + '.requests.memory', - default: RAW_DATA_CONTEXT.resource_master_memory_request, span: 12, }, { key: 'resource.Master.memory_limit', label: 'memory limit', path: RESOURCE_PATH_PREFIX + '.limits.memory', - default: RAW_DATA_CONTEXT.resource_master_memory_limit, span: 12 }, { key: 'worker Resources', type: 'label', span: 24 }, @@ -91,39 +86,37 @@ const CONTEXT_FIELDS = [ key: 'resource.Worker.cpu_request', label: 'cpu request', path: RESOURCE_PATH_PREFIX + '.limits.cpu', - default: RAW_DATA_CONTEXT.resource_master_cpu_request, span: 12 }, { key: 'resource.Worker.cpu_limit', label: 'cpu limit', path: RESOURCE_PATH_PREFIX + '.limits.cpu', - default: RAW_DATA_CONTEXT.resource_master_cpu_limit, span: 12 }, { key: 'resource.Worker.memory_request', label: 'memory request', path: RESOURCE_PATH_PREFIX + '.requests.memory', - default: RAW_DATA_CONTEXT.resource_master_memory_request, span: 12, }, { key: 'resource.Worker.memory_limit', label: 'memory limit', path: RESOURCE_PATH_PREFIX + '.limits.memory', - default: RAW_DATA_CONTEXT.resource_master_memory_limit, span: 12 }, { key: 'num_workers', label: 'num workers', span: 12, - default: 4, path: WORKER_REPLICAS_PATH }, ] +/** + * write context data to form meta + */ function handleContextData(container, data, field) { if (field.type === 'label') { return } @@ -140,7 +133,7 @@ function handleContextData(container, data, field) { } else if (field.key === 'num_workers') { - value = parseInt(value || field.default) + value = parseInt(value) } fillJSON(container, path, value) @@ -156,16 +149,23 @@ function fillField(data, field) { const [, replicaType,] = field.key.split('.') v = getValueFromJson(data, field.path.replace('[replicaType]', replicaType)) } - else if (field.key === 'compressed_type') { v = v === '' ? 'None' : data.compressed_type } + else if (field.key === 'image') { + for (let replicaType of REPLICA_TYPES) { + v = getValueFromJson(data.context, IMAGE_PATH.replace('[replicaType]', replicaType)) + if (v) break + } + } - if (typeof v === 'object') { + if (typeof v === 'object' && v !== null) { v = JSON.stringify(v, null, 2) } - field.value = v + if (v) { + field.value = v + } field.editing = true return field @@ -187,6 +187,9 @@ let formMeta = {} const setFormMeta = value => { formMeta = value } export default function RawDataList() { + + const theme = useTheme() + const { data, mutate } = useSWR('raw_datas', fetcher); const rawDatas = data ? data.data : null; const columns = [ @@ -196,12 +199,12 @@ export default function RawDataList() { // form meta convert functions const rewriteFields = (draft, data) => { // image - ['Master', 'Worker'].forEach(replicaType => { + REPLICA_TYPES.forEach(replicaType => { fillJSON(draft.context, IMAGE_PATH.replace('[replicaType]', replicaType), data['image']) }) // output_partition_num - // data['output_partition_num'] && - // fillJSON(draft.context, WORKER_REPLICAS_PATH, data['output_partition_num']) + data['output_partition_num'] && + fillJSON(draft.context, WORKER_REPLICAS_PATH, parseInt(data['output_partition_num'])) } const mapFormMeta2Json = () => { let data = {} @@ -274,7 +277,7 @@ export default function RawDataList() { return { newFields } } - const DEFAULT_FIELDS = [ + const DEFAULT_FIELDS = useMemo(() => [ { key: 'name', required: true }, { key: 'federation_id', type: 'federation', label: 'federation', required: true }, { key: 'output_partition_num', required: true, default: 4 }, @@ -303,9 +306,23 @@ export default function RawDataList() { ] } }, - ]; + ], []); const [fields, setFields] = useState(DEFAULT_FIELDS) + const handleClone = data => { + data.context = JSON.parse(data.context) + + setFormMeta(data) + + setFields(fields => mapValueToFields({ + data: mapFormMeta2Form(fields), + fields, + type: 'form', + })) + + toggleForm() + } + // eslint-disable-next-line arrow-body-style const operation = (actions, rowData) => { // const onConfirm = () => revokeRawData(rowData.rowValue.id); @@ -314,10 +331,18 @@ export default function RawDataList() { // }; return ( <> + handleClone(rowData.rowValue)} + type="success" + style={{marginRight: `${theme.layout.gapHalf}`}} + > + Clone + - View Detail + Detail {/* { }} onOk={() => { }}> Revoke @@ -338,6 +363,17 @@ export default function RawDataList() { : []; const [formVisible, setFormVisible] = useState(false); + + const onCreate = () => { + setFormMeta({context: RAW_DATA_CONTEXT}) + setFields(mapValueToFields({ + data: mapFormMeta2Form(), + fields + })) + + toggleForm() + } + const toggleForm = () => setFormVisible(!formVisible); const onOk = (rawData) => { mutate({ @@ -369,7 +405,7 @@ export default function RawDataList() { <>
RawDatas - +
{rawDatas && ( diff --git a/web_console/pages/training/job/[id].jsx b/web_console/pages/training/job/[id].jsx new file mode 100644 index 000000000..c6c67993b --- /dev/null +++ b/web_console/pages/training/job/[id].jsx @@ -0,0 +1,9 @@ +import React from 'react'; +import { useRouter } from 'next/router'; + +import Job from '../../../components/Job'; + +export default function Jobs() { + const router = useRouter(); + return +} diff --git a/web_console/pages/training/job/index.jsx b/web_console/pages/training/job/index.jsx new file mode 100644 index 000000000..48498132f --- /dev/null +++ b/web_console/pages/training/job/index.jsx @@ -0,0 +1,5 @@ +import CommonJobList from '../../../components/CommonJobList' + +export default function JobList_() { + return +} \ No newline at end of file diff --git a/web_console/pages/training/tickets/index.jsx b/web_console/pages/training/tickets/index.jsx new file mode 100644 index 000000000..4ee8b4dd8 --- /dev/null +++ b/web_console/pages/training/tickets/index.jsx @@ -0,0 +1,5 @@ +import CommonTicket from '../../../components/CommonTicket' + +export default function Ticket() { + return +} \ No newline at end of file diff --git a/web_console/rpc/client.js b/web_console/rpc/client.js index 592e8661e..a637cfcaa 100644 --- a/web_console/rpc/client.js +++ b/web_console/rpc/client.js @@ -62,6 +62,14 @@ class FederationClient { deleteJob(params) { return this._request('deleteJob', params); } + + updateJob(params) { + return this._request('updateJob', params); + } + + heartBeat() { + return this._request('heartBeat', {}); + } } module.exports = FederationClient; diff --git a/web_console/rpc/meta.proto b/web_console/rpc/meta.proto index a906816fa..2e4e81966 100644 --- a/web_console/rpc/meta.proto +++ b/web_console/rpc/meta.proto @@ -53,6 +53,27 @@ message DeleteJobResponse { string message = 1; } +message UpdateJobRequest { + string name = 1; + string job_type = 2; + string client_ticket_name = 3; + string server_ticket_name = 4; + string server_params = 5; + string status = 6; +} + +message UpdateJobResponse { + Job data = 1; + string status = 2; +} + +message HeartBeatRequest { +} + +message HeartBeatResponse { + string status = 1; +} + service Federation { // Obtain available tickets rpc GetTickets(GetTicketsRequest) returns (GetTicketsResponse) {} @@ -62,4 +83,10 @@ service Federation { // Obtain token from preset cipher rpc DeleteJob(DeleteJobRequest) returns (DeleteJobResponse) {} + + // Obtain token from preset cipher + rpc UpdateJob(UpdateJobRequest) returns (UpdateJobResponse) {} + + // Obtain token from preset cipher + rpc HeartBeat(HeartBeatRequest) returns (HeartBeatResponse) {} } diff --git a/web_console/rpc/server.js b/web_console/rpc/server.js index 2e2b38107..b7321fd06 100644 --- a/web_console/rpc/server.js +++ b/web_console/rpc/server.js @@ -88,7 +88,7 @@ async function createJob(call, callback) { job_type, client_ticket_name: server_ticket_name, server_ticket_name: client_ticket_name, - server_params, + server_params: client_params, } = call.request; const ticketRecord = await Ticket.findOne({ where: { @@ -96,7 +96,9 @@ async function createJob(call, callback) { }, }); if (!ticketRecord) throw new Error('Ticket not found'); - const params = JSON.parse(server_params); + if (ticketRecord.federation_id != federation.id) throw new Error("Invalid ticket name"); + + const params = JSON.parse(client_params); validateTicket(ticketRecord, params); const [data, created] = await Job.findOrCreate({ @@ -109,7 +111,9 @@ async function createJob(call, callback) { job_type, client_ticket_name, server_ticket_name, - server_params: JSON.parse(server_params), + client_params: JSON.parse(client_params), + status: 'started', + federation_id: federation.id, }, }); if (!created) throw new Error('Job already exists'); @@ -123,7 +127,9 @@ async function createJob(call, callback) { job_type: data.job_type, client_ticket_name: data.server_ticket_name, server_ticket_name: data.client_ticket_name, - server_params: JSON.stringify(data.server_params), + server_params: client_params, + status: 'started', + federation_id: federation.id, }, }); } catch (err) { @@ -143,7 +149,9 @@ async function deleteJob(call, callback) { }, }); if (!job) throw new Error('Job not found'); - await k8s.deleteFLApp(NAMESPACE, job.name); + if (!job.status || job.status == 'started') { + await k8s.deleteFLApp(NAMESPACE, job.name); + } await job.destroy({ force: true }); callback(null, { message: 'Delete job successfully' }); } catch (err) { @@ -151,12 +159,111 @@ async function deleteJob(call, callback) { } } +async function updateJob(call, callback) { + try { + const federation = await authenticate(call.metadata); + + const { + name, + job_type, + client_ticket_name: server_ticket_name, + server_ticket_name: client_ticket_name, + server_params: client_params, + status, + } = call.request; + + const new_job = { + name, job_type, client_ticket_name, server_ticket_name, + client_params: JSON.parse(client_params), status, + } + + const old_job = await Job.findOne({ + where: { + name: { [Op.eq]: name }, + }, + }); + if (!old_job) throw new Error(`Job ${name} not found`); + + if (old_job.status === 'error') { + throw new Error("Cannot update errored job"); + } + if (old_job.status === 'started' && new_job.status != 'stopped') { + throw new Error("Cannot change running job"); + } + if (job_type != old_job.job_type) { + throw new Error("Cannot change job type"); + } + + const ticketRecord = await Ticket.findOne({ + where: { + name: { [Op.eq]: client_ticket_name }, + }, + }); + if (!ticketRecord) throw new Error('Ticket not found'); + if (ticketRecord.federation_id != federation.id) throw new Error("Invalid ticket name"); + + if (ticketRecord.federation_id != old_job.federation_id) { + throw new Error("Cannot change job federation"); + } + + // const params = JSON.parse(client_params); + // validateTicket(ticketRecord, params); + + if (old_job.status === 'started' && status === 'stopped') { + flapp = (await k8s.getFLApp(NAMESPACE, name)).flapp; + pods = (await k8s.getFLAppPods(NAMESPACE, name)).pods; + old_job.k8s_meta_snapshot = JSON.stringify({flapp, pods}); + await k8s.deleteFLApp(NAMESPACE, name); + } else if (old_job.status === 'stopped' && new_job.status === 'started') { + const args = serverGenerateYaml(federation, new_job, ticketRecord); + await k8s.createFLApp(NAMESPACE, args); + } + + old_job.client_ticket_name = new_job.client_ticket_name; + old_job.server_ticket_name = new_job.server_ticket_name; + if (new_job.client_params) { + old_job.client_params = new_job.client_params; + } + old_job.status = new_job.status; + old_job.federation_id = new_job.federation_id; + + const data = await old_job.save(); + + callback(null, { + data: { + name: data.name, + job_type: data.job_type, + client_ticket_name: data.server_ticket_name, + server_ticket_name: data.client_ticket_name, + server_params: client_params, + }, + status: data.status, + }); + } catch (err) { + callback(err); + } +} + +/** + * get available tickets of current federation + */ +async function heartBeat(call, callback) { + try { + const federation = await authenticate(call.metadata); + callback(null, { status: 'success' }); + } catch (err) { + callback(err); + } +} + const server = new grpc.Server(); server.addService(pkg.federation.Federation.service, { getTickets, createJob, deleteJob, + updateJob, + heartBeat, }); module.exports = server; diff --git a/web_console/services/index.js b/web_console/services/index.js index 37d163025..809892442 100644 --- a/web_console/services/index.js +++ b/web_console/services/index.js @@ -16,6 +16,10 @@ export async function updateFederation(id, json) { return client.put(`federations/${id}`, { json }).json(); } +export async function federationHeartbeat(id) { + return client.get(`federations/${id}/heartbeat`).json(); +} + export async function createUser(json) { return client.post('users', { json }).json(); } diff --git a/web_console/services/job.js b/web_console/services/job.js index 6b81675d3..913c22c90 100644 --- a/web_console/services/job.js +++ b/web_console/services/job.js @@ -7,3 +7,7 @@ export async function deleteJob(name) { export async function createJob(json) { return client.post('job', { json }).json(); } + +export async function updateJobStatus(id, json) { + return client.post(`job/${id}/update`, { json }).json(); +} \ No newline at end of file diff --git a/web_console/startup.sh b/web_console/startup.sh new file mode 100755 index 000000000..70f2279b6 --- /dev/null +++ b/web_console/startup.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +set -ex + +npx sequelize-cli db:migrate \ + --url="${DB_DIALECT:-mysql}://${DB_USERNAME:-fedlearner}:${DB_PASSWORD:-fedlearner}@${DB_HOST:-127.0.0.1}:${DB_PORT:-3306}/${DB_DATABASE:-fedlearner}" + +node bootstrap.js & + +while true; do sleep 1000; done diff --git a/web_console/tests/utils/form_utils.test.js b/web_console/tests/utils/form_utils.test.js index f4db54f05..7357a89fb 100644 --- a/web_console/tests/utils/form_utils.test.js +++ b/web_console/tests/utils/form_utils.test.js @@ -46,4 +46,55 @@ describe('form_utils', () => { } }) }) + + it('test push new object and insert to the first item', () => { + let paths = [ + 'foo.bar[].baz.qux', + 'foo.bar[-1].baz.quux', + ] + let value = 1 + let obj = {} + paths.forEach(path => fillJSON(obj, path, value)) + assert.deepStrictEqual(obj, { + foo: { + bar: [ + { baz: { qux: value} }, + { baz: { quux: value} }, + ] + } + }) + }) + + it('test multi push', () => { + let paths = [ + 'foo.bar[].baz[].qux', + 'foo.bar[].baz[-1].quux', + ] + let value = 1 + let obj = {} + paths.forEach(path => fillJSON(obj, path, value)) + assert.deepStrictEqual(obj, { + foo: { + bar: [ + { baz: [{ qux: value }, { quux: value } ] }, + ] + } + }) + }) +}) + +describe('filter value', () => { + it('should filter undefined', () => { + let arr = [1, 2, undefined, 3, undefined] + filterArrayValue(arr) + + assert.deepStrictEqual(arr, [1, 2, 3]) + }) + + it('should filter value', () => { + let arr = [1, 2, undefined, 3, undefined] + filterArrayValue(arr, 3) + + assert.deepStrictEqual(arr, [1, 2, undefined, undefined]) + }) }) \ No newline at end of file diff --git a/web_console/utils/form_utils.js b/web_console/utils/form_utils.js index d3fb66552..1be3a0219 100644 --- a/web_console/utils/form_utils.js +++ b/web_console/utils/form_utils.js @@ -2,38 +2,49 @@ * fill a json object with given path * path rules: * - `path.of.some.key` will make obj.path.of.some.key === value - * - `array[].key` will make obj.array[0].key === value + * - `array[].key` will always make obj.array[0].key === value + * - `array[-1].key` will push a new object to array + * TODO: `array[],[]key` */ -export const fillJSON = (container, path, value) => { - let containerIsArray = Array.isArray(container) - if (typeof path === 'string') { - path = path.split('.') - } - if (path.length === 1) { - if (containerIsArray) { - container[0] - ? container[0][path[0]]= value - : (container[0] = { [path[0]]: value }) - } else { - container[path[0]] = value +export function fillJSON(container, path, value) { + let paths = path.split('.') + let currLayer = container + + let cursor = 0 + while (cursor < paths.length) { + let arrayMarks = new RegExp(/\[([\s\S]*?)\]$/).exec(paths[cursor]) + let isArray = !!arrayMarks + let currKey = isArray ? paths[cursor].replace(arrayMarks[0], '') : paths[cursor] + + // insert value + if (cursor === paths.length - 1) { + currLayer[paths[cursor]] = value + break } - return - } - let currLayer = container - let currLayerIsArray = path[0].endsWith('[]') - let currPath = currLayerIsArray ? path[0].replace('[]', '') : path[0] + // handle layer + if (isArray) { + let posToInsert = parseInt(arrayMarks[1] || '0') - if (containerIsArray) { - !container[0] && (container[0] = {}) - currLayer = container[0] - } + if (!currLayer[currKey]) { currLayer[currKey] = [] } - if (currLayer[currPath] === undefined) { - currLayer[currPath] = currLayer[currPath] || (currLayerIsArray ? [] : {}) - } + switch (posToInsert) { + case 0: + currLayer[currKey][0] = currLayer[currKey][0] || {} + currLayer = currLayer[currKey][0] + break + case -1: + let newObj = {} + currLayer[currKey] = currLayer[currKey].concat(newObj) + currLayer = newObj + } + } else { + if (!currLayer[currKey]) { currLayer[currKey] = {} } - fillJSON(currLayer[currPath], path.slice(1), value) + currLayer = currLayer[currKey] + } + cursor++ + } } /** @@ -43,6 +54,7 @@ export const fillJSON = (container, path, value) => { * - `array[].key` will return obj.array[0].key */ export const getValueFromJson = (data, path) => { + if (!data) return if (typeof path === 'string') { path = path.split('.') } @@ -57,9 +69,43 @@ export const getValueFromJson = (data, path) => { } export function getParsedValueFromData (data, field) { - let value = (data && data[field.key]) || (field.emptyDefault || '') + let value = (data && data[field.key]) + if (['json', 'name-value'].some(el => el === field.type)) { - value = JSON.parse(value || '{}') + value = value ? JSON.parse(value) : field.emptyDefault || {} + } + else if (field.type === 'bool-select') { + value = typeof value === 'boolean' ? value : true } + else { + value = value || data[field.key] || '' + } + return value +} + +/** + * filter a value from an array. + * example: [1, 2, undefined] -> filterArrayValue(arr) -> [1, 2] + */ +export function filterArrayValue (arr, value = undefined) { + for (let i = arr.length - 1; i >= 0; i--) { + if (arr[i] === value) { + arr.splice(i, 1) + } + } + return arr +} + +/** + * get value of an item of env array + */ +export function getValueFromEnv(data, envPath, name) { + let envs = getValueFromJson(data, envPath) + if (!envs) { envs = [] } + let envNames = envs.map(env => env.name) + let v = envs[envNames.indexOf(name)] + v = v && v.value || '' + + return v } \ No newline at end of file diff --git a/web_console/utils/job.js b/web_console/utils/job.js index 6e2fc3b56..0ce7d384d 100644 --- a/web_console/utils/job.js +++ b/web_console/utils/job.js @@ -5,6 +5,14 @@ export const FLAppStatus = { ShutDown: 'FLStateShutDown', }; +export const JobStatus = { + Running: 'Running', + Failed: 'Failed', + Complete: 'Complete', + ShutDown: 'ShutDown', + Killed: 'Killed', +} + export function handleStatus(statusStr) { if (typeof statusStr !== 'string') return statusStr; return statusStr.replace('FLState', ''); @@ -13,14 +21,25 @@ export function handleStatus(statusStr) { export function getStatusColor(statusStr) { switch (statusStr) { case FLAppStatus.Running: + case JobStatus.Running: return 'lightblue'; case FLAppStatus.Failed: + case JobStatus.Failed: return 'red'; case FLAppStatus.Complete: + case JobStatus.Complete: return 'limegreen'; case FLAppStatus.ShutDown: + case JobStatus.ShutDown: return 'brown'; default: return undefined; } } + +export function getJobStatus(job) { + if (job.localdata?.status === 'stopped') { + return JobStatus.Killed + } + return handleStatus(job?.status?.appState) +} \ No newline at end of file diff --git a/web_console/utils/job_builder.js b/web_console/utils/job_builder.js index ab64a5347..ecd9c1fbd 100644 --- a/web_console/utils/job_builder.js +++ b/web_console/utils/job_builder.js @@ -12,10 +12,17 @@ const assert = require('assert'); const lodash = require('lodash'); const getConfig = require('./get_confg'); -const { NAMESPACE, ES_HOST, ES_PORT } = getConfig({ +const { NAMESPACE, ES_HOST, ES_PORT, DB_HOST, DB_PORT, + DB_DATABASE, DB_USERNAME, DB_PASSWORD, KVSTORE_TYPE } = getConfig({ NAMESPACE: process.env.NAMESPACE, ES_HOST: process.env.ES_HOST, ES_PORT: process.env.ES_PORT, + DB_HOST: process.env.DB_HOST, + DB_PORT: process.env.DB_PORT, + DB_DATABASE: process.env.DB_DATABASE, + DB_USERNAME: process.env.DB_USERNAME, + DB_PASSWORD: process.env.DB_PASSWORD, + KVSTORE_TYPE: process.env.KVSTORE_TYPE, }); function joinPath(base, ...rest) { @@ -68,13 +75,30 @@ function validateTicket(ticket, params) { } function clientValidateJob(job, client_ticket, server_ticket) { + if (job.job_type != client_ticket.job_type) { + throw new Error(`client_ticket.job_type ${client_ticket.job_type} does not match job.job_type ${job.job_type}`); + } + if (job.job_type != server_ticket.job_type) { + throw new Error(`server_ticket.job_type ${server_ticket.job_type} does not match job.job_type ${job.job_type}`); + } + if (client_ticket.role === server_ticket.role) { + throw new Error(`client_ticket.role ${client_ticket.role} must be different from server_ticket.role ${server_ticket.role}`); + } + + if (job.server_params) { + let client_replicas = job.client_params.spec.flReplicaSpecs["Worker"]["replicas"]; + let server_replicas = job.server_params.spec.flReplicaSpecs["Worker"]["replicas"]; + if (client_replicas != server_replicas) { + throw new Error(`replicas in client_params ${client_replicas} is different from replicas in server_params ${server_replicas}`); + } + } return true; } -// Only allow some fields to be used from job.server_params because +// Only allow some fields to be used from job params because // it is received from peers and cannot be totally trusted. function extractPermittedJobParams(job) { - const params = job.server_params; + const params = job.client_params; const permitted_envs = permittedJobEnvs[job.job_type]; const extracted = {}; @@ -168,6 +192,7 @@ function generateYaml(federation, job, job_params, ticket) { restartPolicy: 'Never', containers: [{ env: [ + { name: 'STORAGE_ROOT_PATH', value: k8s_settings.storage_root_path }, { name: 'POD_IP', valueFrom: { fieldRef: { fieldPath: 'status.podIP' } } }, { name: 'POD_NAME', valueFrom: { fieldRef: { fieldPath: 'metadata.name' } } }, { name: 'ROLE', value: ticket.role.toLowerCase() }, @@ -179,6 +204,12 @@ function generateYaml(federation, job, job_params, ticket) { { name: 'MEM_LIMIT', valueFrom: { resourceFieldRef: { resource: 'limits.memory' } } }, { name: 'ES_HOST', value: ES_HOST }, { name: 'ES_PORT', value: `${ES_PORT}` }, + { name: 'DB_HOST', value: `${DB_HOST}` }, + { name: 'DB_PORT', value: `${DB_PORT}` }, + { name: 'DB_DATABASE', value: `${DB_DATABASE}` }, + { name: 'DB_USERNAME', value: `${DB_USERNAME}` }, + { name: 'DB_PASSWORD', value: `${DB_PASSWORD}` }, + { name: 'KVSTORE_TYPE', value: `${KVSTORE_TYPE}` }, ], imagePullPolicy: 'IfNotPresent', name: 'tensorflow', @@ -252,10 +283,17 @@ function portalGenerateYaml(federation, raw_data) { restartPolicy: 'Never', containers: [{ env: [ + { name: 'STORAGE_ROOT_PATH', value: k8s_settings.storage_root_path }, { name: 'POD_IP', valueFrom: { fieldRef: { fieldPath: 'status.podIP' } } }, { name: 'POD_NAME', valueFrom: { fieldRef: { fieldPath: 'metadata.name' } } }, { name: 'ES_HOST', value: ES_HOST }, { name: 'ES_PORT', value: `${ES_PORT}` }, + { name: 'DB_HOST', value: `${DB_HOST}` }, + { name: 'DB_PORT', value: `${DB_PORT}` }, + { name: 'DB_DATABASE', value: `${DB_DATABASE}` }, + { name: 'DB_USERNAME', value: `${DB_USERNAME}` }, + { name: 'DB_PASSWORD', value: `${DB_PASSWORD}` }, + { name: 'KVSTORE_TYPE', value: `${KVSTORE_TYPE}` }, { name: 'APPLICATION_ID', value: raw_data.name }, { name: 'DATA_PORTAL_NAME', value: raw_data.name }, { name: 'OUTPUT_PARTITION_NUM', value: `${raw_data.output_partition_num}` }, @@ -281,6 +319,7 @@ function portalGenerateYaml(federation, raw_data) { restartPolicy: 'Never', containers: [{ env: [ + { name: 'STORAGE_ROOT_PATH', value: k8s_settings.storage_root_path }, { name: 'POD_IP', valueFrom: { fieldRef: { fieldPath: 'status.podIP' } } }, { name: 'POD_NAME', valueFrom: { fieldRef: { fieldPath: 'metadata.name' } } }, { name: 'CPU_REQUEST', valueFrom: { resourceFieldRef: { resource: 'requests.cpu' } } }, @@ -289,6 +328,12 @@ function portalGenerateYaml(federation, raw_data) { { name: 'MEM_LIMIT', valueFrom: { resourceFieldRef: { resource: 'limits.memory' } } }, { name: 'ES_HOST', value: ES_HOST }, { name: 'ES_PORT', value: `${ES_PORT}` }, + { name: 'DB_HOST', value: `${DB_HOST}` }, + { name: 'DB_PORT', value: `${DB_PORT}` }, + { name: 'DB_DATABASE', value: `${DB_DATABASE}` }, + { name: 'DB_USERNAME', value: `${DB_USERNAME}` }, + { name: 'DB_PASSWORD', value: `${DB_PASSWORD}` }, + { name: 'KVSTORE_TYPE', value: `${KVSTORE_TYPE}` }, { name: 'APPLICATION_ID', value: raw_data.name }, { name: 'BATCH_SIZE', value: raw_data.context.batch_size ? `${raw_data.context.batch_size}` : "" }, { name: 'INPUT_DATA_FORMAT', value: raw_data.context.input_data_format }, diff --git a/web_console/utils/kibana.js b/web_console/utils/kibana.js index d76e4f7ea..f3b0aa249 100644 --- a/web_console/utils/kibana.js +++ b/web_console/utils/kibana.js @@ -2,8 +2,160 @@ const dayjs = require('dayjs'); const getConfig = require('./get_confg'); const JOB_METRICS = { - data_join: [], - psi_data_join: [], + data_join: [ + { + query: "name%20:%22data_block_dump_duration%22", + mode: "avg", + title: "data_block_dump_duration" + }, + { + query: "name%20:%22data_block_index%22", + mode: "avg", + title: "data_block_index" + }, + { + query: "name%20:%22stats_cum_join_num%22", + mode: "avg", + title: "stats_cum_join_num" + }, + { + query: "name%20:%22actual_cum_join_num%22", + mode: "avg", + title: "actual_cum_join_num" + }, + { + query: "name%20:%22leader_stats_index%22", + mode: "avg", + title: "leader_stats_index" + }, + { + query: "name%20:%22follower_stats_index%22", + mode: "avg", + title: "follower_stats_index" + }, + { + query: "name%20:%22example_id_dump_duration%22", + mode: "avg", + title: "example_id_dump_duration" + }, + { + query: "name%20:%22example_dump_file_index%22", + mode: "avg", + title: "example_dump_file_index" + }, + { + query: "name%20:%22example_id_dumped_index%22", + mode: "avg", + title: "example_id_dumped_index" + }, + { + query: "name%20:%22stats_cum_join_num%22", + mode: "avg", + title: "stats_cum_join_num" + }, + { + query: "name%20:%22actual_cum_join_num%22", + mode: "avg", + title: "actual_cum_join_num" + }, + { + query: "name%20:%22leader_stats_index%22", + mode: "avg", + title: "leader_stats_index" + }, + { + query: "name%20:%22follower_stats_index%22", + mode: "avg", + title: "follower_stats_index" + }, + { + query: "name%20:%22leader_join_rate_percent%22", + mode: "avg", + title: "leader_join_rate_percent" + }, + { + query: "name%20:%22follower_join_rate_percent%22", + mode: "avg", + title: "follower_join_rate_percent" + } + ], + psi_data_join: [ + { + query: "name%20:%22data_block_dump_duration%22", + mode: "avg", + title: "data_block_dump_duration" + }, + { + query: "name%20:%22data_block_index%22", + mode: "avg", + title: "data_block_index" + }, + { + query: "name%20:%22stats_cum_join_num%22", + mode: "avg", + title: "stats_cum_join_num" + }, + { + query: "name%20:%22actual_cum_join_num%22", + mode: "avg", + title: "actual_cum_join_num" + }, + { + query: "name%20:%22leader_stats_index%22", + mode: "avg", + title: "leader_stats_index" + }, + { + query: "name%20:%22follower_stats_index%22", + mode: "avg", + title: "follower_stats_index" + }, + { + query: "name%20:%22example_id_dump_duration%22", + mode: "avg", + title: "example_id_dump_duration" + }, + { + query: "name%20:%22example_dump_file_index%22", + mode: "avg", + title: "example_dump_file_index" + }, + { + query: "name%20:%22example_id_dumped_index%22", + mode: "avg", + title: "example_id_dumped_index" + }, + { + query: "name%20:%22stats_cum_join_num%22", + mode: "avg", + title: "stats_cum_join_num" + }, + { + query: "name%20:%22actual_cum_join_num%22", + mode: "avg", + title: "actual_cum_join_num" + }, + { + query: "name%20:%22leader_stats_index%22", + mode: "avg", + title: "leader_stats_index" + }, + { + query: "name%20:%22follower_stats_index%22", + mode: "avg", + title: "follower_stats_index" + }, + { + query: "name%20:%22leader_join_rate_percent%22", + mode: "avg", + title: "leader_join_rate_percent" + }, + { + query: "name%20:%22follower_join_rate_percent%22", + mode: "avg", + title: "follower_join_rate_percent" + } + ], tree_model: [], nn_model: [ {