From bedd645579ca465b8ed3c37087573a5efcae169d Mon Sep 17 00:00:00 2001 From: Binyang Li Date: Tue, 11 May 2021 18:32:57 +0800 Subject: [PATCH 1/3] remove deprecated project --- contrib/notebook-extension/README.md | 155 - .../docs_img/job-button.png | Bin 2752 -> 0 bytes .../docs_img/recent-jobs.gif | Bin 395939 -> 0 bytes .../docs_img/restart-kernel.png | Bin 46299 -> 0 bytes .../docs_img/submit-button.png | Bin 3632 -> 0 bytes .../docs_img/submit-form.png | Bin 41683 -> 0 bytes .../docs_img/submitter-1.gif | Bin 336112 -> 0 bytes .../docs_img/submitter-2.gif | Bin 335090 -> 0 bytes .../examples/hello-openpai.ipynb | 71 - contrib/notebook-extension/lint.cmd | 1 - .../openpai_submitter/README.md | 3 - .../openpai_submitter/data.py | 117 - .../openpai_submitter/description.yaml | 6 - .../openpai_submitter/main.js | 81 - .../openpai_submitter/main.py | 251 - .../openpai_submitter/misc/loading.gif | Bin 51235 -> 0 bytes .../openpai_submitter/misc/pailogo.jpg | Bin 26674 -> 0 bytes .../openpai_submitter/misc/style.css | 161 - .../openpai_submitter/scripts/config.js | 23 - .../openpai_submitter/scripts/interface.js | 175 - .../openpai_submitter/scripts/panel.js | 539 --- .../openpai_submitter/scripts/panel_recent.js | 367 -- .../openpai_submitter/scripts/utils.js | 75 - .../openpai_submitter/templates/panel.html | 63 - .../templates/panel_recent.html | 41 - contrib/notebook-extension/setup.py | 50 - contrib/python-sdk/README.md | 457 -- contrib/python-sdk/README_zh_CN.md | 409 -- .../docs/command-line-references.md | 149 - .../docs/command-line-references_zh_CN.md | 148 - .../docs/medias/programming_model.md | 18 - .../docs/medias/programming_model.svg | 360 -- .../docs/medias/programming_model_zh_CN.md | 18 - .../docs/python-binding-references.md | 61 - .../docs/python-binding-references_zh_CN.md | 61 - contrib/python-sdk/docs/runtime-references.md | 62 - .../docs/runtime-references_zh_CN.md | 62 - .../docs/scenarios-and-user-stories.md | 66 - .../docs/scenarios-and-user-stories_zh_CN.md | 66 - ...-install-sdk-specify-openpai-cluster.ipynb | 113 - .../1-submit-and-query-via-command-line.ipynb | 192 - .../2-submit-job-from-local-notebook.ipynb | 115 - ...submit-local-notebook-python-binding.ipynb | 185 - contrib/python-sdk/examples/hello.py | 2 - .../python-sdk/examples/run_all_notebooks.py | 31 - contrib/python-sdk/openpaisdk/__init__.py | 23 - .../python-sdk/openpaisdk/cli_arguments.py | 93 - contrib/python-sdk/openpaisdk/cli_factory.py | 133 - contrib/python-sdk/openpaisdk/cluster.py | 307 -- contrib/python-sdk/openpaisdk/command_line.py | 428 -- contrib/python-sdk/openpaisdk/defaults.py | 166 - contrib/python-sdk/openpaisdk/flags.py | 149 - contrib/python-sdk/openpaisdk/io_utils.py | 204 - contrib/python-sdk/openpaisdk/job.py | 659 --- contrib/python-sdk/openpaisdk/notebook.py | 83 - contrib/python-sdk/openpaisdk/storage.py | 52 - contrib/python-sdk/openpaisdk/utils.py | 298 -- contrib/python-sdk/setup.py | 15 - contrib/python-sdk/test/basic_test.py | 62 - contrib/python-sdk/test/test_command_line.py | 111 - contrib/python-sdk/test/test_format.py | 62 - contrib/python-sdk/test/test_job.py | 51 - contrib/python-sdk/test/test_notebook.py | 46 - contrib/python-sdk/test/test_utils.py | 226 - contrib/samba-aad-server/README.md | 74 - contrib/samba-aad-server/README_zh_CN.md | 74 - contrib/samba-aad-server/build.sh | 1 - contrib/samba-aad-server/build/Dockerfile | 39 - contrib/samba-aad-server/build/default | 28 - .../build/infosrv/domaininfo.py | 62 - .../samba-aad-server/build/infosrv/uwsgi.ini | 17 - contrib/samba-aad-server/build/krb5.conf | 39 - contrib/samba-aad-server/build/nsswitch.conf | 20 - contrib/samba-aad-server/build/run.sh | 14 - .../samba-aad-server/build/sambadatacreate | 9 - .../build/sambauserhomecreate | 25 - contrib/samba-aad-server/build/smb.conf | 118 - contrib/samba-aad-server/start.sh | 15 - contrib/storage_plugin/README.MD | 241 - contrib/storage_plugin/__init__.py | 16 - .../team-storage/servers/nfs_example.json | 8 - .../team-storage/users/user_example.json | 6 - .../schemas/storage_server.schema.json | 37 - .../schemas/storage_user.schema.json | 18 - contrib/storage_plugin/storagectl.md | 111 - contrib/storage_plugin/storagectl.py | 273 -- contrib/storage_plugin/utils/__init__.py | 16 - contrib/storage_plugin/utils/storage_util.py | 194 - contrib/submit-simple-job/.editorconfig | 14 - contrib/submit-simple-job/.gitignore | 89 - .../App/Components/FormControls/CheckBox.tsx | 52 - .../Components/FormControls/NumberInput.tsx | 59 - .../App/Components/FormControls/Select.tsx | 75 - .../App/Components/FormControls/TextArea.tsx | 59 - .../App/Components/FormControls/TextInput.tsx | 56 - .../App/Components/FormControls/index.tsx | 30 - .../App/Components/Panel.tsx | 72 - .../Components/DatabaseOperation.tsx | 79 - .../Components/EnvironmentVariables.tsx | 94 - .../SimpleJob/Components/HyperParameter.tsx | 67 - .../SimpleJob/Components/MountDirectories.tsx | 112 - .../Components/PriviledgedDocker.tsx | 74 - .../App/SimpleJob/Context.ts | 42 - .../submit-simple-job/App/SimpleJob/Form.tsx | 204 - .../submit-simple-job/App/SimpleJob/index.ts | 262 - .../App/Templates/Context.ts | 39 - .../App/Templates/Select.tsx | 61 - .../submit-simple-job/App/Templates/data.json | 40 - contrib/submit-simple-job/App/convert.ts | 172 - contrib/submit-simple-job/App/index.tsx | 114 - contrib/submit-simple-job/LICENSE | 22 - contrib/submit-simple-job/README.md | 127 - contrib/submit-simple-job/config.ts | 41 - .../docs/database-operation.png | Bin 15467 -> 0 bytes .../docs/environment-variables.png | Bin 64067 -> 0 bytes .../docs/hyper-parameter.png | Bin 61931 -> 0 bytes .../docs/interactive-job.png | Bin 27043 -> 0 bytes .../submit-simple-job/docs/job-template.png | Bin 46780 -> 0 bytes .../submit-simple-job/docs/main-section.png | Bin 67105 -> 0 bytes .../docs/mount-directories.png | Bin 80436 -> 0 bytes .../docs/privileged-docker.png | Bin 75394 -> 0 bytes .../submit-simple-job/docs/tensorboard.png | Bin 30588 -> 0 bytes contrib/submit-simple-job/index.ts | 49 - contrib/submit-simple-job/package-lock.json | 4259 ----------------- contrib/submit-simple-job/package.json | 38 - contrib/submit-simple-job/tsconfig.json | 12 - contrib/submit-simple-job/tslint.json | 10 - contrib/submit-simple-job/webpack.config.js | 87 - src/cleaner/__init__.py | 16 - src/cleaner/build/cleaner.common.dockerfile | 37 - src/cleaner/cleaner_main.py | 97 - src/cleaner/config/cleaner.md | 54 - src/cleaner/config/cleaner.py | 57 - src/cleaner/config/cleaner.yaml | 21 - src/cleaner/deploy/cleaner.yaml.template | 65 - src/cleaner/deploy/delete.sh | 26 - src/cleaner/deploy/refresh.sh | 22 - src/cleaner/deploy/service.yaml | 54 - src/cleaner/deploy/start.sh | 25 - src/cleaner/deploy/stop.sh | 24 - src/cleaner/run_unit_test.sh | 32 - src/cleaner/scripts/__init__.py | 16 - src/cleaner/scripts/check_deleted_files.py | 54 - src/cleaner/scripts/clean_docker.py | 140 - src/cleaner/scripts/clean_docker_cache.py | 46 - .../scripts/reclaimable_docker_cache.sh | 43 - src/cleaner/test/__init__.py | 16 - src/cleaner/test/job/cleaner-test-job.md | 32 - src/cleaner/test/job/cleaner-test-job.yaml | 29 - src/cleaner/test/job/cleaner-test.df | 11 - src/cleaner/test/job/cleaner-test.sh | 32 - src/cleaner/test/test_scripts.py | 100 - src/cleaner/test/test_utils.py | 148 - src/cleaner/test/test_worker.py | 66 - src/cleaner/utils/__init__.py | 16 - src/cleaner/utils/common.py | 137 - src/cleaner/utils/logger.py | 41 - src/cleaner/utils/timer.py | 64 - src/cleaner/worker.py | 67 - src/drivers/build/clean.sh | 13 - src/drivers/build/config-docker-runtime.sh | 44 - .../docker-config-with-nvidia-runtime.json | 9 - .../build/drivers-384.111.yarn.dockerfile | 142 - .../build/drivers-390.25.yarn.dockerfile | 141 - .../build/drivers-410.73.yarn.dockerfile | 141 - .../build/drivers-418.56.yarn.dockerfile | 141 - .../build/enable-nvidia-persistenced-mode.sh | 26 - src/drivers/build/install-all-drivers | 64 - src/drivers/build/install-gdr-drivers | 48 - src/drivers/build/install-ib-drivers | 169 - src/drivers/build/install-nvidia-drivers | 133 - src/drivers/config/drivers.md | 69 - src/drivers/config/drivers.py | 70 - src/drivers/config/drivers.yaml | 34 - src/drivers/deploy/clean.yaml.template | 58 - src/drivers/deploy/delete.sh.template | 37 - src/drivers/deploy/drivers.yaml.template | 117 - src/drivers/deploy/refresh.sh | 23 - src/drivers/deploy/service.yaml | 38 - src/drivers/deploy/start.sh | 31 - src/drivers/deploy/stop.sh | 27 - .../build/end-to-end-test.yarn.dockerfile | 40 - src/end-to-end-test/deploy/delete.sh | 24 - .../deploy/end-to-end-test.yaml.template | 53 - src/end-to-end-test/deploy/refresh.sh | 24 - src/end-to-end-test/deploy/service.yaml | 33 - src/end-to-end-test/deploy/start.sh | 24 - src/end-to-end-test/deploy/stop.sh | 26 - src/end-to-end-test/etc/launcher.json | 42 - src/end-to-end-test/etc/tensorflow.json | 19 - src/end-to-end-test/start.sh | 58 - src/end-to-end-test/test_hdfs.sh | 56 - src/end-to-end-test/test_launcher.sh | 33 - src/end-to-end-test/test_rest_server.sh | 46 - src/end-to-end-test/test_service.sh | 66 - src/etcd-upgrade/build/ds.yaml | 55 - .../build/etcd-upgrade.dockerfile | 23 - src/etcd-upgrade/build/upgrade.py | 24 - src/etcd-upgrade/build/upgrade.sh | 25 - src/job-exit-spec/config/architecture.png | Bin 80443 -> 0 bytes src/job-exit-spec/config/job-exit-spec.md | 82 - src/job-exit-spec/config/job-exit-spec.yaml | 1015 ---- src/job-exit-spec/config/job_exit_spec.py | 20 - src/job-exit-spec/config/update_markdown.py | 103 - src/job-exit-spec/config/user-manual.md | 26 - src/tools/.gitignore | 3 - src/tools/config/logging.yaml | 58 - src/tools/node_maintain.py | 447 -- src/tools/operator_wrapper/__init__.py | 27 - src/tools/operator_wrapper/alert_operator.py | 50 - src/tools/operator_wrapper/base_operator.py | 56 - .../operator_wrapper/kubernetes_operator.py | 54 - .../operator_wrapper/restserver_operator.py | 110 - src/tools/operator_wrapper/yarn_operator.py | 392 -- src/tools/reports.py | 960 ---- src/tools/reports_requirements.txt | 2 - src/tools/tests/__init__.py | 16 - src/tools/tests/capacity_scheduler_case1.json | 910 ---- src/tools/tests/cluster_nodes_case1.json | 69 - src/tools/tests/test_alert_operator.py | 138 - src/tools/tests/test_kubernetes_operator.py | 74 - src/tools/tests/test_node_maintain.py | 190 - src/tools/tests/test_yarn_operator.py | 69 - src/tools/utility/__init__.py | 16 - src/tools/utility/common.py | 28 - src/tools/utility/log.py | 33 - tests/jenkins/config_yarn_cluster.yaml | 3 - tests/jenkins/config_yarn_singlebox.yaml | 3 - tests/jenkins/stage_build.sh | 32 - tests/jenkins/stage_clean.sh | 37 - tests/jenkins/stage_deploy.sh | 53 - tests/jenkins/stage_prepare.sh | 55 - tests/jenkins/stage_test.sh | 21 - tests/jenkins/test_generate_config.sh | 45 - tests/jenkins/test_rest_server.sh | 56 - tests/jenkins/test_rest_server_js_sdk.sh | 60 - 236 files changed, 25035 deletions(-) delete mode 100644 contrib/notebook-extension/README.md delete mode 100644 contrib/notebook-extension/docs_img/job-button.png delete mode 100644 contrib/notebook-extension/docs_img/recent-jobs.gif delete mode 100644 contrib/notebook-extension/docs_img/restart-kernel.png delete mode 100644 contrib/notebook-extension/docs_img/submit-button.png delete mode 100644 contrib/notebook-extension/docs_img/submit-form.png delete mode 100644 contrib/notebook-extension/docs_img/submitter-1.gif delete mode 100644 contrib/notebook-extension/docs_img/submitter-2.gif delete mode 100644 contrib/notebook-extension/examples/hello-openpai.ipynb delete mode 100644 contrib/notebook-extension/lint.cmd delete mode 100644 contrib/notebook-extension/openpai_submitter/README.md delete mode 100644 contrib/notebook-extension/openpai_submitter/data.py delete mode 100644 contrib/notebook-extension/openpai_submitter/description.yaml delete mode 100644 contrib/notebook-extension/openpai_submitter/main.js delete mode 100644 contrib/notebook-extension/openpai_submitter/main.py delete mode 100644 contrib/notebook-extension/openpai_submitter/misc/loading.gif delete mode 100644 contrib/notebook-extension/openpai_submitter/misc/pailogo.jpg delete mode 100644 contrib/notebook-extension/openpai_submitter/misc/style.css delete mode 100644 contrib/notebook-extension/openpai_submitter/scripts/config.js delete mode 100644 contrib/notebook-extension/openpai_submitter/scripts/interface.js delete mode 100644 contrib/notebook-extension/openpai_submitter/scripts/panel.js delete mode 100644 contrib/notebook-extension/openpai_submitter/scripts/panel_recent.js delete mode 100644 contrib/notebook-extension/openpai_submitter/scripts/utils.js delete mode 100644 contrib/notebook-extension/openpai_submitter/templates/panel.html delete mode 100644 contrib/notebook-extension/openpai_submitter/templates/panel_recent.html delete mode 100644 contrib/notebook-extension/setup.py delete mode 100644 contrib/python-sdk/README.md delete mode 100644 contrib/python-sdk/README_zh_CN.md delete mode 100644 contrib/python-sdk/docs/command-line-references.md delete mode 100644 contrib/python-sdk/docs/command-line-references_zh_CN.md delete mode 100644 contrib/python-sdk/docs/medias/programming_model.md delete mode 100644 contrib/python-sdk/docs/medias/programming_model.svg delete mode 100644 contrib/python-sdk/docs/medias/programming_model_zh_CN.md delete mode 100644 contrib/python-sdk/docs/python-binding-references.md delete mode 100644 contrib/python-sdk/docs/python-binding-references_zh_CN.md delete mode 100644 contrib/python-sdk/docs/runtime-references.md delete mode 100644 contrib/python-sdk/docs/runtime-references_zh_CN.md delete mode 100644 contrib/python-sdk/docs/scenarios-and-user-stories.md delete mode 100644 contrib/python-sdk/docs/scenarios-and-user-stories_zh_CN.md delete mode 100644 contrib/python-sdk/examples/0-install-sdk-specify-openpai-cluster.ipynb delete mode 100644 contrib/python-sdk/examples/1-submit-and-query-via-command-line.ipynb delete mode 100644 contrib/python-sdk/examples/2-submit-job-from-local-notebook.ipynb delete mode 100644 contrib/python-sdk/examples/3-submit-local-notebook-python-binding.ipynb delete mode 100644 contrib/python-sdk/examples/hello.py delete mode 100644 contrib/python-sdk/examples/run_all_notebooks.py delete mode 100644 contrib/python-sdk/openpaisdk/__init__.py delete mode 100644 contrib/python-sdk/openpaisdk/cli_arguments.py delete mode 100644 contrib/python-sdk/openpaisdk/cli_factory.py delete mode 100644 contrib/python-sdk/openpaisdk/cluster.py delete mode 100644 contrib/python-sdk/openpaisdk/command_line.py delete mode 100644 contrib/python-sdk/openpaisdk/defaults.py delete mode 100644 contrib/python-sdk/openpaisdk/flags.py delete mode 100644 contrib/python-sdk/openpaisdk/io_utils.py delete mode 100644 contrib/python-sdk/openpaisdk/job.py delete mode 100644 contrib/python-sdk/openpaisdk/notebook.py delete mode 100644 contrib/python-sdk/openpaisdk/storage.py delete mode 100644 contrib/python-sdk/openpaisdk/utils.py delete mode 100644 contrib/python-sdk/setup.py delete mode 100644 contrib/python-sdk/test/basic_test.py delete mode 100644 contrib/python-sdk/test/test_command_line.py delete mode 100644 contrib/python-sdk/test/test_format.py delete mode 100644 contrib/python-sdk/test/test_job.py delete mode 100644 contrib/python-sdk/test/test_notebook.py delete mode 100644 contrib/python-sdk/test/test_utils.py delete mode 100644 contrib/samba-aad-server/README.md delete mode 100644 contrib/samba-aad-server/README_zh_CN.md delete mode 100644 contrib/samba-aad-server/build.sh delete mode 100644 contrib/samba-aad-server/build/Dockerfile delete mode 100644 contrib/samba-aad-server/build/default delete mode 100644 contrib/samba-aad-server/build/infosrv/domaininfo.py delete mode 100644 contrib/samba-aad-server/build/infosrv/uwsgi.ini delete mode 100644 contrib/samba-aad-server/build/krb5.conf delete mode 100644 contrib/samba-aad-server/build/nsswitch.conf delete mode 100644 contrib/samba-aad-server/build/run.sh delete mode 100644 contrib/samba-aad-server/build/sambadatacreate delete mode 100644 contrib/samba-aad-server/build/sambauserhomecreate delete mode 100644 contrib/samba-aad-server/build/smb.conf delete mode 100644 contrib/samba-aad-server/start.sh delete mode 100644 contrib/storage_plugin/README.MD delete mode 100644 contrib/storage_plugin/__init__.py delete mode 100644 contrib/storage_plugin/examples/team-storage/servers/nfs_example.json delete mode 100644 contrib/storage_plugin/examples/team-storage/users/user_example.json delete mode 100644 contrib/storage_plugin/schemas/storage_server.schema.json delete mode 100644 contrib/storage_plugin/schemas/storage_user.schema.json delete mode 100644 contrib/storage_plugin/storagectl.md delete mode 100644 contrib/storage_plugin/storagectl.py delete mode 100644 contrib/storage_plugin/utils/__init__.py delete mode 100644 contrib/storage_plugin/utils/storage_util.py delete mode 100644 contrib/submit-simple-job/.editorconfig delete mode 100644 contrib/submit-simple-job/.gitignore delete mode 100644 contrib/submit-simple-job/App/Components/FormControls/CheckBox.tsx delete mode 100644 contrib/submit-simple-job/App/Components/FormControls/NumberInput.tsx delete mode 100644 contrib/submit-simple-job/App/Components/FormControls/Select.tsx delete mode 100644 contrib/submit-simple-job/App/Components/FormControls/TextArea.tsx delete mode 100644 contrib/submit-simple-job/App/Components/FormControls/TextInput.tsx delete mode 100644 contrib/submit-simple-job/App/Components/FormControls/index.tsx delete mode 100644 contrib/submit-simple-job/App/Components/Panel.tsx delete mode 100644 contrib/submit-simple-job/App/SimpleJob/Components/DatabaseOperation.tsx delete mode 100644 contrib/submit-simple-job/App/SimpleJob/Components/EnvironmentVariables.tsx delete mode 100644 contrib/submit-simple-job/App/SimpleJob/Components/HyperParameter.tsx delete mode 100644 contrib/submit-simple-job/App/SimpleJob/Components/MountDirectories.tsx delete mode 100644 contrib/submit-simple-job/App/SimpleJob/Components/PriviledgedDocker.tsx delete mode 100644 contrib/submit-simple-job/App/SimpleJob/Context.ts delete mode 100644 contrib/submit-simple-job/App/SimpleJob/Form.tsx delete mode 100644 contrib/submit-simple-job/App/SimpleJob/index.ts delete mode 100644 contrib/submit-simple-job/App/Templates/Context.ts delete mode 100644 contrib/submit-simple-job/App/Templates/Select.tsx delete mode 100644 contrib/submit-simple-job/App/Templates/data.json delete mode 100644 contrib/submit-simple-job/App/convert.ts delete mode 100644 contrib/submit-simple-job/App/index.tsx delete mode 100644 contrib/submit-simple-job/LICENSE delete mode 100644 contrib/submit-simple-job/README.md delete mode 100644 contrib/submit-simple-job/config.ts delete mode 100644 contrib/submit-simple-job/docs/database-operation.png delete mode 100644 contrib/submit-simple-job/docs/environment-variables.png delete mode 100644 contrib/submit-simple-job/docs/hyper-parameter.png delete mode 100644 contrib/submit-simple-job/docs/interactive-job.png delete mode 100644 contrib/submit-simple-job/docs/job-template.png delete mode 100644 contrib/submit-simple-job/docs/main-section.png delete mode 100644 contrib/submit-simple-job/docs/mount-directories.png delete mode 100644 contrib/submit-simple-job/docs/privileged-docker.png delete mode 100644 contrib/submit-simple-job/docs/tensorboard.png delete mode 100644 contrib/submit-simple-job/index.ts delete mode 100644 contrib/submit-simple-job/package-lock.json delete mode 100644 contrib/submit-simple-job/package.json delete mode 100644 contrib/submit-simple-job/tsconfig.json delete mode 100644 contrib/submit-simple-job/tslint.json delete mode 100644 contrib/submit-simple-job/webpack.config.js delete mode 100644 src/cleaner/__init__.py delete mode 100644 src/cleaner/build/cleaner.common.dockerfile delete mode 100644 src/cleaner/cleaner_main.py delete mode 100644 src/cleaner/config/cleaner.md delete mode 100644 src/cleaner/config/cleaner.py delete mode 100644 src/cleaner/config/cleaner.yaml delete mode 100644 src/cleaner/deploy/cleaner.yaml.template delete mode 100644 src/cleaner/deploy/delete.sh delete mode 100644 src/cleaner/deploy/refresh.sh delete mode 100644 src/cleaner/deploy/service.yaml delete mode 100644 src/cleaner/deploy/start.sh delete mode 100644 src/cleaner/deploy/stop.sh delete mode 100644 src/cleaner/run_unit_test.sh delete mode 100644 src/cleaner/scripts/__init__.py delete mode 100644 src/cleaner/scripts/check_deleted_files.py delete mode 100644 src/cleaner/scripts/clean_docker.py delete mode 100644 src/cleaner/scripts/clean_docker_cache.py delete mode 100644 src/cleaner/scripts/reclaimable_docker_cache.sh delete mode 100644 src/cleaner/test/__init__.py delete mode 100644 src/cleaner/test/job/cleaner-test-job.md delete mode 100644 src/cleaner/test/job/cleaner-test-job.yaml delete mode 100644 src/cleaner/test/job/cleaner-test.df delete mode 100644 src/cleaner/test/job/cleaner-test.sh delete mode 100644 src/cleaner/test/test_scripts.py delete mode 100644 src/cleaner/test/test_utils.py delete mode 100644 src/cleaner/test/test_worker.py delete mode 100644 src/cleaner/utils/__init__.py delete mode 100644 src/cleaner/utils/common.py delete mode 100644 src/cleaner/utils/logger.py delete mode 100644 src/cleaner/utils/timer.py delete mode 100644 src/cleaner/worker.py delete mode 100755 src/drivers/build/clean.sh delete mode 100755 src/drivers/build/config-docker-runtime.sh delete mode 100644 src/drivers/build/docker-config-with-nvidia-runtime.json delete mode 100644 src/drivers/build/drivers-384.111.yarn.dockerfile delete mode 100644 src/drivers/build/drivers-390.25.yarn.dockerfile delete mode 100644 src/drivers/build/drivers-410.73.yarn.dockerfile delete mode 100644 src/drivers/build/drivers-418.56.yarn.dockerfile delete mode 100755 src/drivers/build/enable-nvidia-persistenced-mode.sh delete mode 100755 src/drivers/build/install-all-drivers delete mode 100644 src/drivers/build/install-gdr-drivers delete mode 100644 src/drivers/build/install-ib-drivers delete mode 100755 src/drivers/build/install-nvidia-drivers delete mode 100644 src/drivers/config/drivers.md delete mode 100644 src/drivers/config/drivers.py delete mode 100644 src/drivers/config/drivers.yaml delete mode 100644 src/drivers/deploy/clean.yaml.template delete mode 100644 src/drivers/deploy/delete.sh.template delete mode 100644 src/drivers/deploy/drivers.yaml.template delete mode 100644 src/drivers/deploy/refresh.sh delete mode 100644 src/drivers/deploy/service.yaml delete mode 100755 src/drivers/deploy/start.sh delete mode 100644 src/drivers/deploy/stop.sh delete mode 100644 src/end-to-end-test/build/end-to-end-test.yarn.dockerfile delete mode 100644 src/end-to-end-test/deploy/delete.sh delete mode 100644 src/end-to-end-test/deploy/end-to-end-test.yaml.template delete mode 100644 src/end-to-end-test/deploy/refresh.sh delete mode 100644 src/end-to-end-test/deploy/service.yaml delete mode 100755 src/end-to-end-test/deploy/start.sh delete mode 100644 src/end-to-end-test/deploy/stop.sh delete mode 100644 src/end-to-end-test/etc/launcher.json delete mode 100644 src/end-to-end-test/etc/tensorflow.json delete mode 100644 src/end-to-end-test/start.sh delete mode 100644 src/end-to-end-test/test_hdfs.sh delete mode 100644 src/end-to-end-test/test_launcher.sh delete mode 100644 src/end-to-end-test/test_rest_server.sh delete mode 100644 src/end-to-end-test/test_service.sh delete mode 100644 src/etcd-upgrade/build/ds.yaml delete mode 100644 src/etcd-upgrade/build/etcd-upgrade.dockerfile delete mode 100755 src/etcd-upgrade/build/upgrade.py delete mode 100644 src/etcd-upgrade/build/upgrade.sh delete mode 100644 src/job-exit-spec/config/architecture.png delete mode 100644 src/job-exit-spec/config/job-exit-spec.md delete mode 100644 src/job-exit-spec/config/job-exit-spec.yaml delete mode 100644 src/job-exit-spec/config/job_exit_spec.py delete mode 100644 src/job-exit-spec/config/update_markdown.py delete mode 100644 src/job-exit-spec/config/user-manual.md delete mode 100644 src/tools/.gitignore delete mode 100644 src/tools/config/logging.yaml delete mode 100644 src/tools/node_maintain.py delete mode 100644 src/tools/operator_wrapper/__init__.py delete mode 100644 src/tools/operator_wrapper/alert_operator.py delete mode 100644 src/tools/operator_wrapper/base_operator.py delete mode 100644 src/tools/operator_wrapper/kubernetes_operator.py delete mode 100644 src/tools/operator_wrapper/restserver_operator.py delete mode 100644 src/tools/operator_wrapper/yarn_operator.py delete mode 100644 src/tools/reports.py delete mode 100644 src/tools/reports_requirements.txt delete mode 100644 src/tools/tests/__init__.py delete mode 100644 src/tools/tests/capacity_scheduler_case1.json delete mode 100644 src/tools/tests/cluster_nodes_case1.json delete mode 100644 src/tools/tests/test_alert_operator.py delete mode 100644 src/tools/tests/test_kubernetes_operator.py delete mode 100644 src/tools/tests/test_node_maintain.py delete mode 100644 src/tools/tests/test_yarn_operator.py delete mode 100644 src/tools/utility/__init__.py delete mode 100644 src/tools/utility/common.py delete mode 100644 src/tools/utility/log.py delete mode 100644 tests/jenkins/config_yarn_cluster.yaml delete mode 100644 tests/jenkins/config_yarn_singlebox.yaml delete mode 100644 tests/jenkins/stage_build.sh delete mode 100644 tests/jenkins/stage_clean.sh delete mode 100644 tests/jenkins/stage_deploy.sh delete mode 100644 tests/jenkins/stage_prepare.sh delete mode 100644 tests/jenkins/stage_test.sh delete mode 100644 tests/jenkins/test_generate_config.sh delete mode 100644 tests/jenkins/test_rest_server.sh delete mode 100644 tests/jenkins/test_rest_server_js_sdk.sh diff --git a/contrib/notebook-extension/README.md b/contrib/notebook-extension/README.md deleted file mode 100644 index cc93bcc746..0000000000 --- a/contrib/notebook-extension/README.md +++ /dev/null @@ -1,155 +0,0 @@ - # OpenPAI Submitter - -***Note: OpenPAI Submitter is deprecated. New plugin support for Jupyter Notebook is under development.*** - -***OpenPAI Submitter*** is a Jupyter Notebook extension, created for easy-to-use job submission and management on OpenPAI clusters. Users can submit Jupyter job in one click, and manage recent jobs by a flexible dialog. - -![](docs_img/submitter-1.gif) - -## How to Install - -This extension requires **Python 3+** and Jupyter Notebook to work. Make sure you are using Jupyter Notebook with a Python 3 kernel. - -Please use the following commands to install this extension (Make sure you are in the correct `python` environment). - -```bash -pip install --upgrade pip -git clone https://github.com/Microsoft/pai -cd pai/contrib/notebook-extension -python setup.py # add --user to avoid permission issues if necessary -``` - -This extension leverage the [`Python` SDK](https://github.com/microsoft/pai/tree/master/contrib/python-sdk) as the low level implementation. It will also be installed in above commands (use `-i` in of `setup.py` to avoid installing SDK). - -Before starting, user needs to give the basic information of the clusters. If you log in to your cluster by user/password, you can use the following command to add your cluster. The is a cluster name chosen by you. -```bash -# for user/password authentication -opai cluster add --cluster-alias --pai-uri --user --password -``` -If you log in to your cluster by Azure AD authentication, the following command is for you to add the cluster: -```bash -# for Azure AD authentication -opai cluster add --cluster-alias --pai-uri --user --toke -``` - -Now you can use the command `opai cluster list` to list all clusters. - -The following command is used to delete one of your clusters: -```bash -# Delete a cluster by calling its alias. -opai cluster delete -``` - -If you want to update some settings of clusters (e.g. cluster alias, username or password), it is recommended to delete the old cluster by `opai cluster delete `, then use `opai cluster add` to re-add it with new settings. A more complex way is to edit the [YAML file](../python-sdk/#define-your-clusters) directly. - -There are other ways to manage the clusters, see the [documentation of SDK](../python-sdk). - -## Quick Start - -Once installed, the extension will add two buttons on the notebook page, namely and . - -Button is designed for job submission. You can click it and the detailed cluster information will be loaded. Then click ***Quick Submit***. The extension will do the following work for you: - -- Pack all files in current folder as a .zip file, and upload it to the cluster by WebHDFS. -- Generate job settings automatically, then submit it. -- Wait until the notebook is ready. - -The picture below shows the submission process: - -![](docs_img/submitter-1.gif) - -You can safely close the page when the extension is waiting. Once the notebook is ready, the submitter will show up and give you the notebook URL: - -![](docs_img/submitter-2.gif) - -**Note: The waiting process will take 5 to 10 minutes.** If you are not willing to wait, you could probably click the bottom link on the submitter to start a new session. The submitted job will not lose, you can click to find it. - -### Submit as Interactive Notebook v.s. Python Script v.s. Silent Notebbook - -You can submit jobs in two ways: -- as an ***interactive notebook*** -- as a ***Python Script (.py file)*** -- as a ***silent notebook*** - -The interactive mode is a quick way for you to submit the notebook you work on locally to the cluster. The notebook will stay the same but have access to GPU resource on cluster. This mode is mainly designed for experimenting and debugging. - -On the other hand, submitting the job as a .py file will firstly convert the notebook to a Python script, then execute the script directly. This mode is a good way for deployment and batch submitting. - -If you submit a notebook as a silent notebook, you won't have an interactive notebook as in the interactive mode. Your notebook will be executed in the background. Once it is finished, you can get the result as a file. The difference between this mode and the python script mode is that, you can not see the output during the silent notebook is running, but you can get `matplotlib` plot or other graph of your notebook. - - - -### Advanced job configuration - -#### Setup frequently used `docker-images` and `resources` - -As shown in above example figure, users could specify resources and docker image by selection in the panel. And further, you can add your frequently used docker images or resource combinations by: - -```bash -opai set -g image-list+= image-list+= ... -opai set -g resource-list+="<#gpu>,<#cpu>,<#mem>" resource-list+="<#gpu>,<#cpu>,<#mem>" ... -``` -Here `<#mem>` can be numbers in unit of `MBytes`, or a string like `32GB` (or `32g`). - -For example, you can add `your.docker.image` and the resource spec `1 GPU, 4 vCores CPU, 3GB` by: - -```bash -opai set -g image-list+=your.docker.image -opai set -g resource-list+="1,4,3gb" -``` - -After running the command, one should restart the notebook to make it work: - - - - -These settings are permanent since they are saved on disk. If you want to `update`, `delete`, or `change the order of` them, you can edit the file `~/.openpai/defaults.yaml` (For Windows, the path is `C:\Users\\.openpai\defaults.yaml`) directly. Also remember to restart the notebook kernel after editing. - -#### Advanced configuration by `NotebookConfiguration` - -In the submitting panel, user can change basic configuration of the job. However, for the users who want to change the advanced configuration, the extension would receive configuration from `NotebookConfiguration` in the notebook. - -For example, after executing below codes in the notebook cell, the extension will configure the job resource specification to 2 GPUs, 16 CPU cores and 32 GB memory. -```python -from openpaisdk.notebook import NotebookConfiguration - -NotebookConfiguration.set("mem", "512GB") -``` - -Execute below codes to have a quick look of all supported items in `NotebookConfiguration`. -```python -# print supported configuration items -NotebookConfiguration.print_supported_items() -``` - -### Quick Submit v.s. Download Config - -Only the pre-defined resource and docker image settings are available, when you use the button *Quick Submit* to submit jobs. If you need different settings, you can click the button *Download Config* to get the job configuration file. Then import it on the web portal for further configuring. - -## Job Management -![](docs_img/recent-jobs.gif) - -Clicking will open the *Recent Jobs* panel. **This panel records all jobs submitted by this extension on this machine** (If a job is submitted in a different way, it won't show up). The panel will show some basic information about your jobs. Also, it will show notebook URL **when the job is submitted as an interactive notebook, and the notebook is ready.** The panel will not show completed jobs by default, but you can use the upper-right toggle to find all jobs. - -## How to Update or Uninstall - -To update this extension, please use the following commands: -```bash -git clone https://github.com/Microsoft/pai -cd pai/contrib/notebook-extension -jupyter nbextension install openpai_submitter -jupyter nbextension enable openpai_submitter/main -``` - -To disable this extension, please use the following commands: -```bash -jupyter nbextension disable openpai_submitter/main -``` - -## Known Issues -- This extension is not compatible with *Variable Inspector*. -- This extension is not compatible with AdBlock. - -## Feedback - -Please use this [link](https://github.com/microsoft/pai/issues/new?title=[Jupyter%20Extension%20Feedback]) for feedbacks. diff --git a/contrib/notebook-extension/docs_img/job-button.png b/contrib/notebook-extension/docs_img/job-button.png deleted file mode 100644 index 2118ade8b534e5fafd33aed1490f18d516850349..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2752 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 QlsW;1`lfmny8lG}53k)-B>(^b diff --git a/contrib/notebook-extension/docs_img/recent-jobs.gif b/contrib/notebook-extension/docs_img/recent-jobs.gif deleted file mode 100644 index d7a32a6c8b52588424bdbf36d513b79b2cbfac3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395939 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

?8i@^J$C5CiNmH1gf?v0#GzBi4j;yT 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

>r|qbEcfzC%$vHTysPq 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

    41vKYNIyHPGL{R~wzq-QUW48xFl_ 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 qa diff --git a/contrib/notebook-extension/docs_img/restart-kernel.png b/contrib/notebook-extension/docs_img/restart-kernel.png deleted file mode 100644 index 5653f1861f5baf1d9a672da6008377cd2b92dd8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46299 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%0D#lr^JcT7aur3{$uP)lrd+(@K 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%0AXm~OL3{cnlxaOB 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

    hD3M^G3=lvL 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%0A}l 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�K5RRN^o|cl9hGvc!bCS2Ip3AeE8%O}Dzz1Wek&lj@(qx`) zJ60BLhRE|;!nz7$GK09O2NgAw6tNb%(38qyk!XSf`+0-hyq4r~7CJWr{mLFkvR0Wg z3fQBsJc|WPX;hJvL&k&_x>>|7tyN0uA@#o^%gI4)u2rp^g=(Or$)^E!Uy;RUlKO8# zH3%wrMyq#UtL0ykJS~!*I4b|aC1t>dP4v`UzSc;ZBgFlK2YA+~U>8KH#Y?W%T!kY? z>p|J_)sSJ=#;GBkYt#m!R7Mj(wn|jAc*Ik&htXpHg`|euqz6?tufZtlRVc<*{Bo~M z_<*(18d@o9L`rBt{3|%5jLM&_Y4QQD}f{j2D$T!d;$hZZ&^Wl zj*wECAzW53!&xa;QP1~=EMSR<^fRotCyC{>Q5GIjhqLj-7hp;qHagP?`PTS}(gaEU zm$xTuTCT=*y@_MJ25c;>a|eNYv`O#0$&<5E^)(E)wdoS4akm^P@n^NN-r+Om*&hb?^?1V|$q3>DNqk<utMmh_&$H+5`Z3xjHoW z_9|*bj@9r^K3HWr=zPkKek#PF+V;|akcv0ZlLUYTBt66>dc^74*nY6iDzyJpRAYk? z{udKcgADnN8{ryH{>A`_hDd|T*guu=VP$dQ zg)tFX5fN#Tk%?guF`*HWAravr5uqUw{=t#H|4|YDQ9=KC9_bqrJ}>H+$H(VA8*MI;3zo&1Yt*fu8d$^)|Hm7qvrRyN6 z|2%!~84lZu07G;pT4r@_Os+V*BW1YyUq%&KHb1 z+}b(Z-r3*T+1}mV-rHS1*&V*v?Y`MK9v>*LCd0PTLoBYJXL8I-g zcmNoCos3x{5&O?K5VttZZvf4Up0&p86OLpQNz5wly6Zy)qt*ff%j>e=%j8^y;9+*> zvU&H6>1vQE^=-2wW`$tzmr|ZQ1RPBVN)WydJ7XU@P2QUrEX{(JBMi&5e9}0*r}8Kw z^EvJ!F?(!}06e|bw{WG4eE6^*47nEq2pX}t0`sTkBw>g&Eq2gLC)McUKX}po0H`tp zx1vjm{B`{pmLXMhB$kQZE^8{H&S4-N7izyjd<9zYArw>UT>!46Zcz=I_lWdb-{Thi zQlHN0c#TFBAWsOdRQ_tU5Ai3i^1QuzHofvK&t3rPKMf4Jb@L#k+Y46-DF*MK<0#-Q z_!SRxErf34Z`H>p(xX4fYU%5gV(qLQCxM~aNhItf+w~HR^Y2_!{IbHGkGjn9T<`)l zMnnIm`+FFl)N=gp?wPx9m{+26>;;zZ1F{rwOmnIf(A<1CHzo)GBt6o;kzfL!m@qx1 zeE!hz7rMBpDX0uWwSUxZ0+h-4>47jPdcP3(4>XQ3rtJrvEY!7rabWdL`$p@{X~LfF z_zML6mDYutSXa_p7N{GEb^-B4CR|=YaQXRGPzi5n4~0H6ILY@Rh*YfJsiDGFx8}kH zive&Vm;CRPNl^{>wjVbRVMS*u;rb=^YgNPs>DR0xHD1)GjLdj3dkB#Hh5J~@>AL-_Sg2YiR=-Hbv8FVsYNb?tG1C2^3x@h7~4 z39e@*M5Z?Xfhv?1%1nU*tApV8BXI{(2#}xjBp`rAL6IbakO%wXIKJXz*M=8t7pR+- zr)J@nEXG$0Z^A&RQplbxQJDvwS)aGBaMzzIKTk8kRJ@@y+*VP0nW1}Xg0fszOt@8o z-Gi20R~XMpIz+;i4JzGx)6;99tS&^*zTYE`gbFYa8T>wF=!eilE+`vX69JxwD`4Fu zhuOnG?R=5lPB1IW3ulDDyx;c=F9nLD2dR)Iw~u8TQckow(K@OY;&jZe30O;uTGX*l z#wkwsOUatloB$kEs2tUs(hrGB9&c@h0)>TXDghC~M0v;;Kr=9zUHwLg zHcO>GCl{zFQXiuJ&GH{ysFJmTvK~Fx%HhWAqGP@?&6!b&≫6+k3Ruj|hn?dNMSx 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') - .attr('href', cssUrl) - ) - } - - function registerButtonPanel () { - var handler = function () { - panel.send(panel.MSG.CLICK_BUTTON) - } - var action = { - icon: 'fa-rocket', // a font-awesome class used on buttons, etc - help: 'openpai-submitter', - help_index: 'zz', - handler: handler - } - var prefix = 'my_extension' - var actionName = 'show-panel' - var fullActionName = Jupyter.actions.register(action, actionName, prefix) - Jupyter.toolbar.add_buttons_group([fullActionName]) - } - function registerButtonPanelRecent () { - var handler = function () { - panelRecent.send(panelRecent.MSG.CLICK_BUTTON) - } - var action = { - icon: 'fa-list-alt', // a font-awesome class used on buttons, etc - help: 'openpai-submitter', - help_index: 'zz', - handler: handler - } - var prefix = 'my_extension' - var actionName = 'show-panel-recent' - var fullActionName = Jupyter.actions.register(action, actionName, prefix) - Jupyter.toolbar.add_buttons_group([fullActionName]) - } - var panel = Panel() - var panelRecent = PanelRecent() - - function loadIPythonExtension () { - loadCss('./misc/style.css') - loadCss('//cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css') - panel.send(panel.MSG.PLEASE_INIT) - panelRecent.send(panelRecent.MSG.PLEASE_INIT) - registerButtonPanel() - registerButtonPanelRecent() - panel.bindPanelRecent(panelRecent) - panelRecent.bindPanel(panel) - } - return { - load_ipython_extension: loadIPythonExtension - } -}) diff --git a/contrib/notebook-extension/openpai_submitter/main.py b/contrib/notebook-extension/openpai_submitter/main.py deleted file mode 100644 index 6c4e526705..0000000000 --- a/contrib/notebook-extension/openpai_submitter/main.py +++ /dev/null @@ -1,251 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import threading as openpai_ext_threading -import json as openpai_ext_json -from openpaisdk import __flags__ as openpai_ext_flags - -openpai_ext_flags.disable_to_screen = True - -if 'openpai_ext_lock' not in vars(): - openpai_ext_buffer_lock = openpai_ext_threading.Lock() - - -class openpai_ext_Thread(openpai_ext_threading.Thread): - ''' - In Javascript: - Each time the code executed by Jupyter.notebook.kernel.execute gives output, - the callback function in callbacks.iopub.output will receive message. - - In Python: - We run python code in a new thread to avoid blocking the notebook. - The handler is set to print json messages, - thus the callback in javascript will get noticed. - ''' - - def success_handler(self, ret): - openpai_ext_buffer_lock.acquire() - print("__openpai${}__".format(self.token) + openpai_ext_json.dumps( - { - 'code': 0, - 'message': ret, - } - ), flush=True) - openpai_ext_buffer_lock.release() - - def err_handler(self, e): - openpai_ext_buffer_lock.acquire() - print("__openpai${}__".format(self.token) + openpai_ext_json.dumps( - { - 'code': -1, - 'message': str(e), - } - ), flush=True) - openpai_ext_buffer_lock.release() - - def __init__(self, target, token, args=[], kwargs={}): - super(openpai_ext_Thread, self).__init__() - self.target = target - self.token = token - self.args = args - self.kwargs = kwargs - - def run(self): - try: - ret = self.target(*self.args, **self.kwargs) - self.success_handler(ret) - except Exception as e: - import traceback - self.err_handler(traceback.format_exc()) - - -class openpai_ext_Interface(object): - - def __init__(self): - from openpaisdk import LayeredSettings, ClusterList - if LayeredSettings.get('container-sdk-branch') != 'master': - LayeredSettings.update('user_basic', 'container-sdk-branch', 'master') - self.cll = ClusterList().load() - - def execute(self, target, token, args=[], kwargs={}): - t = openpai_ext_Thread(target, token, args, kwargs) - t.start() - - def tell_resources(self, token): - self.execute(self.cll.tell, token) - - def available_resources(self, token): - self.execute(self.cll.available_resources, token) - - def read_defaults(self, token): - def _read_defaults_helper(): - from openpaisdk import LayeredSettings - from openpaisdk.job import JobResource - # add default settings - image_list = LayeredSettings.get('image-list') - if image_list is None or len(image_list) == 0: - # add default images here - default_images = [ - 'openpai/pytorch-py36-cu90', - 'openpai/pytorch-py36-cpu', - 'openpai/tensorflow-py36-cu90', - 'openpai/tensorflow-py36-cpu', - ] - for image in default_images: - LayeredSettings.update('global_default', 'image-list', image) - image_list = LayeredSettings.get('image-list') - resource_list = JobResource.parse_list(LayeredSettings.get('resource-list')) - if resource_list is None or len(resource_list) == 0: - # add default resource here - default_resources = [ - '1,4,8g', - '1,8,16g', - '0,4,8g', - '2,8,16g', - '4,16,32g', - ] - for resource in default_resources: - LayeredSettings.update('global_default', 'resource-list', resource) - resource_list = JobResource.parse_list(LayeredSettings.get('resource-list')) - return { - 'image-list': image_list, - 'resource-list': resource_list, - 'web-default-form': LayeredSettings.get('web-default-form'), - 'web-default-image': LayeredSettings.get('web-default-image'), - 'web-default-resource': LayeredSettings.get('web-default-resource'), - } - self.execute(_read_defaults_helper, token) - - def __set_selected(self, ctx): - from openpaisdk import LayeredSettings - LayeredSettings.update('global_default', 'web-default-form', ctx['form']) - LayeredSettings.update('global_default', 'web-default-image', ctx['docker_image']) - LayeredSettings.update('global_default', 'web-default-resource', ','.join([str(ctx['gpu']), str(ctx['cpu']), str(ctx['memoryMB'])])) - - def __submit_job_helper(self, ctx): - import tempfile - from openpaisdk import Job - import os - import sys - from openpaisdk.notebook import get_notebook_path - from openpaisdk import LayeredSettings - import yaml - - # save settings - self.__set_selected(ctx) - - # setting layers description - # layer name | from : priority - # user_advanced | NotebookConfiguration.set : 0 - # user_basic | extension panel selection : 1 - # local_default | deaults in .openpai/defaults.yaml : 2 - # global_default | defaults in ~/.openpai/defaults.yaml : 3 - # - | predefined in flags.py : 4 - LayeredSettings.update("user_basic", "cluster-alias", ctx['cluster']) - LayeredSettings.update("user_basic", "virtual-cluster", ctx['vc']) - LayeredSettings.update("user_basic", "image", ctx['docker_image']) - LayeredSettings.update("user_basic", "cpu", ctx['cpu']), - LayeredSettings.update("user_basic", "gpu", ctx['gpu']), - LayeredSettings.update("user_basic", "memoryMB", ctx['memoryMB']) - - cfgs = LayeredSettings.as_dict() - - notebook_path = get_notebook_path() - _, _, sources = next(os.walk('.')) - - if ctx['form'] == 'file': - jobname = 'python_' + tempfile.mkdtemp()[-8:] - mode = 'script' - elif ctx['form'] == 'notebook': - jobname = 'jupyter_' + tempfile.mkdtemp()[-8:] - mode = 'interactive' - else: - jobname = 'silent_' + tempfile.mkdtemp()[-8:] - mode = 'silent' - - job = Job(jobname)\ - .from_notebook( - nb_file=get_notebook_path(), - cluster={ - 'cluster_alias': cfgs['cluster-alias'], - 'virtual_cluster': cfgs['virtual-cluster'], - 'workspace': cfgs['workspace'], - }, - mode=mode, - **{ - 'token': '', - 'image': cfgs["image"], - 'resources': { - 'cpu': cfgs["cpu"], - 'gpu': cfgs["gpu"], - 'memoryMB': cfgs["memoryMB"], - 'mem': cfgs['mem'] - }, - 'sources': sources + cfgs["sources"], - 'pip_installs': cfgs["pip-installs"], - } - ) - ctx['job_config'] = yaml.dump(job.get_config(), default_flow_style=False) - ctx['jobname'] = job.name - if ctx['type'] == 'quick': - ret = job.submit() - ctx['joblink'] = ret['job_link'] - ctx['jobname'] = ret['job_name'] - return ctx - - def submit_job(self, token, ctx): - self.execute(self.__submit_job_helper, token, args=[ctx]) - - def __wait_jupyter_helper(self, ctx): - from openpaisdk import Job - job = Job(ctx['jobname']).load(cluster_alias=ctx['cluster']) - ret = job.wait() - ret = job.connect_jupyter() # ret will be None if run in silent mode and without this - ctx['state'] = ret['state'] - if ret['notebook'] is None: - ctx['notebook_url'] = '-' - else: - ctx['notebook_url'] = ret['notebook'] - return ctx - - def wait_jupyter(self, token, ctx): - self.execute(self.__wait_jupyter_helper, token, args=[ctx]) - - def __detect_jobs_helper(self, jobs_ctx): - from openpaisdk import Job - ret = [] - for ctx in jobs_ctx: - try: - job = Job(ctx['jobname']).load(cluster_alias=ctx['cluster']) - job_info = job.connect_jupyter() - ctx['state'] = job_info['state'] - ctx['notebook_url'] = job_info['notebook'] - if ctx['notebook_url'] is None: - ctx['notebook_url'] = '-' - except Exception as e: - ctx['state'] = 'UNKNOWN'.format(e) - ctx['notebook_url'] = '-' - finally: - ret.append(ctx) - return ret - - def detect_jobs(self, token, jobs_ctx): - self.execute(self.__detect_jobs_helper, token, args=[jobs_ctx]) - - -openpai_ext_interface = openpai_ext_Interface() diff --git a/contrib/notebook-extension/openpai_submitter/misc/loading.gif b/contrib/notebook-extension/openpai_submitter/misc/loading.gif deleted file mode 100644 index e6b32df2b32adb1acc07d2b53bdaad4baadd792a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51235 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 m<}9D{_w)BB@b@S1_b2f8C-C`ta2a# diff --git a/contrib/notebook-extension/openpai_submitter/misc/pailogo.jpg b/contrib/notebook-extension/openpai_submitter/misc/pailogo.jpg deleted file mode 100644 index cb3a2b9a08342a99abd2c3015745c3f1e4a1bc42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26674 zcmeHv2Ut@{`|pI_5rGAjg-{fArGyTGCiRm4IO1QqEm=gv8SfbM>KH}^i@eV+ULGn#Yeedjmj{mna*nK|JgmB>3V zYPKiQ6X0N&f|~*W^8S}S9&z+=0KC1yWB`ByPz1_A3dSZtVFPY7kcM#_{0DGjfh-mW z3KwwWMDc65iGvuJ3r7&;y^XWN;##nr4@q<&GnlutNe{?FoeGrW0nl*LYl1Na_>lw& z0}=)#3`iJ|Fd$*zef;@}CE=9cCJOG^U5oM30|U;}_z z{#^h}M-AQoT`nt2f`gN#jT6BE4r>19CX&!8L^3$Ws!Hjl-uT8aqdxl1Sl())pH3r9^8E znYKX||A2RR-U6^YQi;37QBgrjMN3shSy^SwXiaskU&k8g|2kGr z4{u^_iZ_~Ktfx28e$o_6f{l%hfvKa5gO#(nwT%^82u@K^QAJrrS5;Nl%23bHO6-8# z1sV$Qn8-pJX9%P;aMBt$2I*`$j9c@UMA*cB}N#1CgmeuNA#}tg+F5lDkE&gU=9mZLssPv1D?wGOT zCzwv0G}*@1&fdY%$$h4Wr`IgvY(M`60f9lm3&|8}I4y#{l*@~biH%zxzjodF4M`g} zZBE|3XK%{B{Ra*nPd{<;)af&4&t18CE$e#rjhi|5AN=_+zu?j1!jhMzW#tu>Rj=NE z_*h$4-|(risr7qXdq-zicTX>B7hD+%%@SGmlU*9nE-4uqX&HIcE}T>>{77ra$Qlyl zM$h~4&xLn{bFMCetaux8fMwQGi=TOk!2#ohV6O< zRHSjR^Q1L^E9mO2zwPtkO#94Hi_Uqkd|){4%h3)-;+pHnh-GJvZY9{3jb$?Oj(slA zX-PYTtD5}B9A$$8>K*z?y|n>Z90GlUZcC$scFZO;XF|J(#ak zQgnHl-inyrr47!4J$n{y*;!|EBK^&iR-a9N?%AUrB<1eqj!oU@#AJP%x~nW$$?SNn>j(f2Rp5LLoPKW_$b?C7Wq|O+*dz`n!r81WPI6)Q;xfjHG8qW*a^Rt zwzD)BEj{SJkFiZ_=gzC1a%`Wu`tK0X+r(AUd+g1+92{=CD~I!%>(ncVY_vkalt20} zuf5yVWqa~{QO|M&tU|!Tk7u>V26$1&+^ndlrL7E1nZwtlf6r&%f2m*4;5@b=idpi- z<;er}+o!W3_)duFH>2fMTV3O8gEDU25B)AvmiPIDYx&mDZ-U4+%XoZc`qa;pzHCV= zZ8unQB$-ki0c(rP0Dz9zZWVO6imyIbV0+V4;4PP>=+VTWdrH@n`&?yb~> z$u-VNF)`{s+#c?u&rvPMu3q2%_La$I-93{%*W#vs0vYjpLyqb4ypAcYyt=1v>zymv zrBNnXIU9+}TeV%E#v8=f^S-LSY5e8Yk!!S~?ZL(o26%$BqfGpcM}jqH1M1eUt*Xq= zHAr20B9@qWH?;XY0(v@FPx;#-BT{z1>JhB;u#d{0)sT5|@xq<#E8+eVOSjE@Wj8Uy z{e{v*aD0_3QU#C}t;yI9kQ>2b53TI-8*=W(Eh1t5mILGGHm1M5jOg;d2|+&3)6K_q&u6( z9BMXjXM}M?f-jBhEfU;0O!r}d$r~2thB3IJlzB8>j7ac^V$2i?kh$Ta-N=!&LDPl2 z0ADXRci0;AF#_^9 z>3z8j9;Tlk$C%E!JA_w?p_1XD!b}p6gj#?#az1T7cgPRWIEsaLwAo-THC$NCPu2QE z&-}Y;{m2ZVem;jhJs2$k3!}&!7CSJ43Og72B%MhcqE8J?@P%!1WAS*bC?@Omej7(4-N`P$>;nC3{-6CuQ`osr%oz&1B8#(Yf4-9J96}z~u0z!XN z#YFVE%|Z-0MkMQFr3%+8ikKE&a9A#QDuV{4!C?U%7Q=R6+F8INJRGJl;1#ZwV89J( zjvY8C(pX{oh44CrvBfl~=MQSIGP|J+02@BV`r9D=2~GanB;@}l4dVhW8rlYAF$sNM z1_1g*OB67@B__%VR}q*7wE@j1WLWsrYj8A6O@|5aGnl52#;|pw5IYtXrCs4g$N?$> zML6%FA0SJc93j7dKQIFXC=Cuh6d?*DbfR3ML^Lu2Akq&u4V9VE40HxWO_d8{MKdYf zpT;?vhgOZc3qS{l$OEDLlLrGgk*8yg2fiXl#$-7zgHEP$0~mABp@{pT9$736sz<|* zJSGrlj;KqX#$iRXe^AM>ICL6aG|PJUp{4s^I#`A(DVoRfqB5x*5|2uO3gEw-J@mDp zBm|=xG=(Vqa` zSDdP{vZ|WuC^fZFT54))TIfYhOPEFD-xMI+xg7;ZrEx|>JGW{$R+W%Had1lcY5yh- z_c25JH~8rP$ITu5{t#{MMgg1*4sPtEWaZ@)WTjQCv7LpC;b?;FjNeI`M$1-P$!Wpe zkDIZHw(q?#Ya7m*Vt4uR$$sD7x01QGzZ}1^cEZfv{uGb<={!4~k_8{A->T{bbg|vbv6d@R$uLr>^Ih*LT``1=3=Z_MOfysA%Ydd$7Sx7~F8e zEwU}v1Vh4T8Q6klMw+s4W2uF<;2zvpTAPHu=d4L~_tPeGZCc06p$(9qV0*s=HX>bz z;<3PvNBtmb!hddo>2MQ}A2w7S{>jAglT4C{vxz3jzR5(BJtzK?!UuWrGuq=Tl@Xod zK-en#oVyjsWpEGs`kCxgFVDSHOQU2r??})sofDHzxT=e>=`?zEb%{i!h z+b6zap=*~}>VW~LytR2o)j^A`d!zaCi5@xUX+251S$libyY?g#Cmt9kq2wnLc64O+ zM4myw`&$TTdUI#>GMA}ME3Wp|^XE4)%`;xd+noQ2Ts$vUE2}R>RROP zDs6hY_An#m!A){O@d|!oUSAvkUZxkoNl$lB%Jgl#ac7S1$69qe=Y$DUyDI&TJ%93M zg8Pej^%r5!9_7z(r|*m&K!E-J-mC#-*p71kZ)Fel_r0|0jZX00y5URO%!6)o#4+CAFIv={7`G|iT4u+Y}hem`C^0LE!=d|ke2;fXcfJ@%n zeXlR&eenow$nGnC@3MJH?7U=ok*1_CMrYvB`TkA>#D|z(Ua-BfWcmnIC=*h7Q=6Y! z^L5U;&dHanon{$~P_1y&h;}r#=jrdYULbtVy_~ET~-|Si!$zu334mfY*p0 z)>ved_-{7n6|uTb-d~{|^yP?&`mm<6*`jY(U{8yn{f1B2`Cnh2SUs%C9ch+g^8#`X z??0GY0!_W}&!&DwN*nG>&Rdqpo>OwZYh0JCNlM4fDG5JllCucy=LYfz?pe&ve8YO9 zl{~w&00YYibNUj0^E1GbMhkI7lZ$iz3q`mhWp{}tDQ(F^-8`E(KC^?{^u;UWvC~2J zBs`^7jno32?N<-j!X!J9aHPo11>UFxBwcG=5h_Vtl6xgRydMeCx7Et&b(u zSpjbW0`eSdQsMXt<_8HblA{ZyS8LHqjSWn;DKs?qXtaNd?de9qyu5FFtLEvoJZ)84 z{rdLG*Q4w1I2p`Gz~P=Xvkt`d=mu78I}m)lcWzKYj3D6a@!sm56#K@Et4*1ukyf1z z9p|3K-F~^DF|t{(#HS(9r(eD;1pyld3_e}V+C9Zkf6}i`fsOp=HM(_^*sB}fwOwmx ze2(|@3N~y17V)aQ@=Fvqwa{p_V0)flP3#K<$cLWo^_ji7!!>gXmG6I5H-E$B+_ekK zHv;9exQn>uVKj?9bz4t(#BY@D&C;&Aym8jd#FjK$ljPaq+ST>AFti8TfbE5_8@w0$IwsByt#61`yZ-%zon_B$y6^oS6yaa{YTaI$66o1k5yY=o;Xm{-v#H#${dSx z{6zx>KBuB1UER|OSKcNjg%>Bc3DgI)5pba0e4yiz$#f&Nqu)oT>dw}ap}*`syPfD6 z5?J3Gx>zP5y!VRQy2X1Dkh(u-@5jotAZ}|*W9D_MLnQ{}%Zo_(mdmO8j`k(gq@Qzj zM?e$;?BH=@>$4_INl;Nt$WY2 z?w1HiYg`hLGcT*-qxA*e>zwEt(Iro=dvCk^+?ZSyTO19`^t_ox+w*Wr+|%%ht(r9_ zf*d#HbLA#Hgv*rir1itJzW9k&nDU=jGVr(#TPYjDwJrdQ(G@ScR8|Kw00po>7@z_? zm=7XgoCiN#EXIZio&OC24MNVN|#abTRsRE6)f|r??me+Im}hv)!o? z^jYy7s$cv(e{y^z*^y%8I!#r{InF6AiXBDek??U*3?|np&cz5T-3i7~wS^HLgYY6< zjIaeiKFE7M-krsv;%&|C%*d8@_IP_obAqkCy^Z}8JpA>Et%aqvg|(%bm9>+NrIU>n zelQrp>J*(hlyE2CnVy5SLCM8v(5~3nSo2tGa~6kYL2z_*w6L_Yu(C3P2s7?-CXWLxZ8A~BsP#M%H2;;)8B#5eFqdyKp zkA_8Aey~H7jP*ZS0o%!)LnXmeKYtdB0sH;m{K#lTJ}Nvcq`DZv9<(3E&7e$srs5kTp3OrT(cVHHU9=`nFK)t=4h)gbz#3WORGhK|JG3InS#ffSi zZXITAOEn`qlI_iG?7|()NEAzJGXljroa{)ov8R&BSi4~UnJjWN$|9Oy=)x2h8I~a; z3jP=>%${Q7U~NVXcc7XP2=*kiFse1ljACnPZ|y*KAcRqbR>IPR2PY)P$WqZ(QDBJ< zmSlpJqkXuU1KE~fW<$2KG;<7xg^?U6WIG#60+m3f7~v^or*IZ0iUi$-9z~*2EtayW zG$Z_QbFlLOZx#iTZaq>@ba#hmjsJ=()Lz5gBz7Dr}%oP5&F(|DA!t{IT$~_aD7R z2;;KCd9fr8bp{P~(a=;ff5^r0?(W#sfuHD2BEyqo==YP1EdJRJE-B`pt@wA&^WU~& zkY;iOiAkfv>DWSKm$L;rZ;ATL+2XH#Duj%f>aaN!%LgY>D8NiZ6F8KHrrQ7JT~diy z>`Lg8&?OcFVu2;zC80|!2E+nOyh}otSPX~-mUx$hF0mL83oP+230-0_AQo8ST@t#) zVn8gg#JePPiN%0eV2O80=n{(ovA`1VlF%g<17d+C-X)<+EC$2^OT0@$mskvl1(tZ1 zgf6id5DP5vE(u*?F(4LL;$0HD#9}}!u*AD0bcw})SYU~FN$3)b0kOam?~>3Z76W2| zCEg{WODqP&0!zG0LYG(!hy|8-*Z*_6hW`kR%A~lM#+tfL!(OW=g~Or$2ZOY%G#cdK zE8XA=4dA=>;737GSy4ej3BGwxNmWTn8GSQ@yrP=As)`yK$6l)kbECQ7e-#CJ1r#A( z81Y&?(aRYmuhski__cZi{m)ib_3;EXF|Jptx5k?%sis{0xaDE6ZwY5%jnBHYj_h%| zc0uq3in2N1cPd~fV+V){t*@LesA3U3$Ch(`jKdS_p#WyV0PRlK~ADb6l z%(q9t(!5{y`F-b)x;#!n~~08z2e+Qha(uOQ+ew zXA5i>8_}gh=q37xTXQGen}i3JGNUeB*wXazWTJk*dH2c8mA|xB@7UyQeTI1I^Di>% zcB&Q^CXGA3%gH%vl~UStPhBZj-@I_v>$C?5(9cz>i97h=Rl}UpYjWFb0x$VnDb(|C z)@FMV)naPb+}@CHwfsi*nkMSi&Tjv@+4J5mV^R7}7x$-L&kL09UhidlvSVfB@0r@M z#YD4L&E+jC%lFNB)p3Ve@gOIpqT*^nWF+HOZHnjpqX=*&pEcEfw9>Tup25R}$dE;g zVv^>)T)8)UxkE~VAiTl2+pEy>&a%gjQv(|iusQUX4xi0Ash>~vO-oZ|W?%6v^jzMv z9|4*lZ#E_aaJbj2IrK@~Zb5ZkXI5PF75@2mbqli#PVS2ed|R|a`OmbFr^k{WH2N&c z&3HWUr1fiMe;)$YuCeVaQV>+U1*KCc-)W&rT8?9gIxV|LZ=HJfYh(Cq(2#SJLEbimZYgK>U%q8Phz0Az_u>*+Z@+! zQ=LtDj8Frw4_gjxbAP~B<4xVLxh-J*^h1HW=IKALU{AiQv57*Rxc?Pyr-4OhqTbU> z-R64fn;ywxgh5^DYANr}o3w z3SLUtjeuh=aWyTpK9jhlPVd&j%BDqGs`B$=1dq!#>>nOHiL)lq28|EbVfwyiwOrL;y3dZ{cn0`t||u6{njQb=`(<@<3I2wncew zPJiz&?mex9fJe{M2JRr>#MQ@qW>NQqBNZ(*eSgHM2UM6J^6uuoPtf>Sc2KeN?b0h* z_o!Es=+&e5j!9-JomJLfyyam>_F8A16a5a~QVt#c<>-eY6Mmm*BAGKLIXea4+ zEjG};?6H#h8{yBubRTu!C3UtD8JoYf^yW4+`CHmVlpTq)h-bD4=DesEnD$$~NVJMG z>U)rD^74IYdxD3Zx5@z-jl!Hub-&J2%Gp^s9lyC}-@Bq_;s=AOC-?c9w_U@ZeNeSu zl>0K{+M=DUC;xnrKCOMPmDFQ{F~&;oHiV4+eOm7EYxn9a58F;6HRf@=?NTeYc)OZq zeaQ`Y|CFPrZ*^^%EqUoK-_6NyOT2CRE;2K(_SDq!yXWiMz+))bhw1EP0STF(s}JAgE5E-K TxADWILhtimBbQ#RM5_K5axC}u diff --git a/contrib/notebook-extension/openpai_submitter/misc/style.css b/contrib/notebook-extension/openpai_submitter/misc/style.css deleted file mode 100644 index 67e024ce0f..0000000000 --- a/contrib/notebook-extension/openpai_submitter/misc/style.css +++ /dev/null @@ -1,161 +0,0 @@ -.openpai-wrapper{ - position: fixed !important; /* remove !important will cause problems */ - border: thin solid rgba(0, 0, 0, 0.38); - border-radius: 5px; - padding: 10px; - background-color: #fff; - opacity: .95; - z-index: 100; - overflow: hidden; -} - -#openpai-panel-wrapper{ - width: 629px; - height: 566px; - top: 10%; - left: 50%; -} - -#openpai-panel-recent-wrapper{ - width: 720px; - height: 400px; - top: 10%; - left: 30%; -} -#openpai-panel, #openpai-panel-recent{ - margin-left: 10px; - margin-right: 10px; - margin-top: 5px; -} - -.openpai-float-right{ - float: right; -} - -.openpai-inline{ - display: inline; -} - -.openpai-header-text{ - vertical-align: middle; - padding-left: 5px; -} - -.openpai-button{ - padding-top: 8px; -} - -.openpai-panel-header{ - margin-bottom: 10px; - margin-right: 5px; - margin-left: 5px; - margin-top: 2px; -} - -table, th{ - text-align: center; -} - -.openpai-fieldset{ - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -.openpai-legend{ - font-size: 17px; - line-height: inherit; - border: 0; - padding: 2px; - width: auto; - margin-bottom: 0px; -} - -#basic-setting-fieldset{ - margin-bottom: 10px; - padding-bottom: 0.3em; - padding-top: 0.8em; - padding-left: 1em; - padding-right: 0.35em; -} - -.loading-img{ - width: 45px; - height: 45px; -} - -.loading-img-small{ - width: 19px; - height: 19px; -} - -.switch { - position: relative; - display: inline-block; - width: 36px; - height: 20px; - margin-bottom: 0px; -} - -.switch input { - opacity: 0; - width: 0; - height: 0; -} - -.slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: #ccc; - -webkit-transition: .3s; - transition: .3s; -} - -.slider:before { - position: absolute; - content: ""; - height: 15px; - width: 15px; - left: 4px; - bottom: 3px; - background-color: white; - -webkit-transition: .3s; - transition: .3s; -} - -input:checked + .slider { - background-color: #337ab7; -} - -input:focus + .slider { - box-shadow: 0 0 1px #2196F3; -} - -input:checked + .slider:before { - -webkit-transform: translateX(14px); - -ms-transform: translateX(14px); - transform: translateX(14px); -} - -.slider.round { - border-radius: 30px; -} - -.slider.round:before { - border-radius: 50%; -} - -#openpai-hide-jobs-toggle{ - margin-right: 1em; - margin-top: 0.2em; - margin-bottom: 0.2em; -} - -.openpai-fieldset .openpai-table-button{ - color: #337ab7; - line-height: 1; -} \ No newline at end of file diff --git a/contrib/notebook-extension/openpai_submitter/scripts/config.js b/contrib/notebook-extension/openpai_submitter/scripts/config.js deleted file mode 100644 index 2a3ab4127e..0000000000 --- a/contrib/notebook-extension/openpai_submitter/scripts/config.js +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) Microsoft Corporation -// All rights reserved. -// -// MIT License -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -define([], function () { - return { - plugin_name: 'openpai_submitter', - panel_toggle_speed: 400 - } -}) diff --git a/contrib/notebook-extension/openpai_submitter/scripts/interface.js b/contrib/notebook-extension/openpai_submitter/scripts/interface.js deleted file mode 100644 index 68a93fa82c..0000000000 --- a/contrib/notebook-extension/openpai_submitter/scripts/interface.js +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright (c) Microsoft Corporation -// All rights reserved. -// -// MIT License -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -define([ - 'require', - 'jquery', - 'base/js/namespace', - 'base/js/events', - 'nbextensions/openpai_submitter/scripts/config' -], -function (requirejs, $, Jupyter, events, config) { - var panel - var codeMain - var codeStorage - var pool = [] // {token: "token", resolveFunc: resolveFunc, rejectFunc: rejectFunc} - - function getToken () { - return Math.random().toString(36).substring(2, 6) + Math.random().toString(36).substring(2, 6) - } - - function initiate (panelInstance, resolve, reject) { - /* save the python code to codeMain */ - panel = panelInstance - var mainUrl = requirejs.toUrl('../main.py') - var storageUrl = requirejs.toUrl('../data.py') - var loadMain = new Promise( - function (resolve, reject) { - $.get(mainUrl).done(function (data) { - codeMain = data - resolve() - }) - }) - var loadStorage = new Promise( - function (resolve, reject) { - $.get(storageUrl).done(function (data) { - codeStorage = data - resolve() - }) - }) - Promise.all([loadMain, loadStorage]).then( - () => resolve() - ).catch((e) => reject(e)) - } - - var getIOPub = function (resolve, reject) { - return { - output: function (msg) { - /* - A callback to handle python execution. - Note: This function will be executed multiple times, - if any stdout/stderr comes out. - */ - function parseSingleOutput (token, msgContent) { - /* - msgContent: parsed JSON, such as: {"code": 0, "message": ""} - */ - for (var pooledToken in pool) { - if (pooledToken === token) { - if (msgContent['code'] !== 0) { pool[token]['rejectFunc'](msgContent['message']) } else { pool[token]['resolveFunc'](msgContent['message']) } - delete pool[token] - return - } - } - console.error('[openpai submitter] Unknown token', token) - } - console.log('[openpai submitter] [code return]:', msg) - if (msg.msg_type === 'error') { - reject(msg.content.evalue) - } else if (msg.content.name !== 'stdout') { - // ignore any info which is not stdout - console.error(msg.content.text) - } else { - try { - var m = msg.content.text - var tokens = m.match(/__openpai\$(.{8})__/g) - if (tokens === null || tokens.length === 0) { - console.error(m) - return - } - var splittedMSG = m.split(/__openpai\$.{8}__/) - var i = 0 - for (var item of splittedMSG) { - item = $.trim(item) - if (item === '') continue - var jsonMSG = JSON.parse(item) - parseSingleOutput(tokens[i].substr(10, 8), jsonMSG) - i += 1 - } - } catch (e) { - console.error(e) - } - } - } - } - } - - // return a promise - function executePromise (initCode, code) { - return new Promise( - function (resolve, reject) { - if (!(Jupyter.notebook.kernel.is_connected())) { - console.error('Cannot find active kernel.') - throw new Error('Cannot find active kernel. Please wait until the kernel is ready and refresh.') - } - resolve() - } - ).then( - function () { - console.log('[openpai submitter] [code executed]:' + code) - return new Promise( - function (resolve, reject) { - /* replace with real token */ - var token = getToken() - code = code.replace('', token) - var codeMerged = initCode + '\n' + code - /* register final resolve / reject */ - pool[token] = { - resolveFunc: resolve, - rejectFunc: reject - } - /* execute */ - Jupyter.notebook.kernel.execute( - codeMerged, { - iopub: getIOPub(resolve, reject) - } - ) - }) - } - ) - } - - return { - initiate: initiate, - - // main api - read_defaults: - () => executePromise(codeMain, 'openpai_ext_interface.read_defaults("")'), - tell_resources: - () => executePromise(codeMain, 'openpai_ext_interface.tell_resources("")'), - available_resources: - () => executePromise(codeMain, 'openpai_ext_interface.available_resources("")'), - zip_and_upload: - (ctx) => executePromise(codeMain, 'openpai_ext_interface.zip_and_upload("",' + JSON.stringify(ctx) + ')'), - submit_job: - (ctx) => executePromise(codeMain, 'openpai_ext_interface.submit_job("",' + JSON.stringify(ctx) + ')'), - wait_jupyter: - (ctx) => executePromise(codeMain, 'openpai_ext_interface.wait_jupyter("",' + JSON.stringify(ctx) + ')'), - detect_jobs: - (jobsCtx) => executePromise(codeMain, 'openpai_ext_interface.detect_jobs("",' + JSON.stringify(jobsCtx) + ')'), - - // storage api - add_job: - (record) => executePromise(codeStorage, 'openpai_ext_storage.add("",' + JSON.stringify(record) + ')'), - get_jobs: - () => executePromise(codeStorage, 'openpai_ext_storage.get("")'), - save_jobs: - (data) => executePromise(codeStorage, 'openpai_ext_storage.save("", ' + JSON.stringify(data) + ')') - - } -} -) diff --git a/contrib/notebook-extension/openpai_submitter/scripts/panel.js b/contrib/notebook-extension/openpai_submitter/scripts/panel.js deleted file mode 100644 index 8b6b5a77af..0000000000 --- a/contrib/notebook-extension/openpai_submitter/scripts/panel.js +++ /dev/null @@ -1,539 +0,0 @@ -// Copyright (c) Microsoft Corporation -// All rights reserved. -// -// MIT License -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -define([ - 'require', - 'jquery', - 'base/js/namespace', - 'base/js/events', - 'nbextensions/openpai_submitter/scripts/config', - 'nbextensions/openpai_submitter/scripts/interface', - 'nbextensions/openpai_submitter/scripts/utils' -], -function (requirejs, $, Jupyter, events, config, Interface, Utils) { - function Panel () { - var STATUS_R = [ - 'NOT_READY', - 'READY_NOT_LOADING', - 'READY_LOADING', - 'SHOWING_INFO', - 'SUBMITTING_1', - 'SUBMITTING_2', - 'SUBMITTING_3', - 'SUBMITTING_OK', - 'CANCELLING', - 'ERROR', - 'FATAL' - ] - var MSG_R = [ - 'PLEASE_INIT', - 'INIT_OK', - 'CLICK_BUTTON', - 'CLICK_CLOSE', - 'CLICK_REFRESH', - 'SUBMIT_START_1', - 'SUBMIT_START_2', - 'SUBMIT_START_3', - 'SUBMIT_OK', - 'CANCEL', - 'ERROR', - 'FATAL_ERROR' - ] - - var STATUS = {} - for (var i = 0; i < STATUS_R.length; i += 1) { STATUS[STATUS_R[i]] = i } - var MSG = {} - for (var j = 0; j < MSG_R.length; j += 1) { MSG[MSG_R[j]] = j } - - var set = function (s) { - // console.log('[openpai submitter] set status', STATUS_R[s]) - status = s - } - - var status - var panelRecent - - set(STATUS.NOT_READY) - - var speed = config.panel_toggle_speed - - var showInformation = function (info) { - /* this function will hide table and show information for users. */ - $('#panel-table-wrapper').hide() - $('#panel-information').html(info) - $('#panel-information-wrapper').show() - } - - var appendInformation = function (info) { - $('#panel-information').append(info) - } - - var send = function (msg, value) { - // console.log('[openpai submitter]', 'status:', STATUS_R[status], 'msg', MSG_R[msg], 'value', value) - switch (msg) { - case MSG.PLEASE_INIT: - handleInit() - break - case MSG.INIT_OK: - handleInitOK() - break - case MSG.CLICK_BUTTON: - if (!($('#openpai-panel-wrapper').is(':visible'))) { - if ((status !== STATUS.READY_LOADING) && (status !== STATUS.SUBMITTING_1) && - (status !== STATUS.SUBMITTING_2) && (status !== STATUS.SUBMITTING_3) && - (status !== STATUS.SUBMITTING_4) && (status !== STATUS.SUBMITTING_OK) && - (status !== STATUS.FATAL)) { send(MSG.CLICK_REFRESH) } - } - togglePanel() - break - case MSG.CLICK_CLOSE: - closePanel() - break - case MSG.CLICK_REFRESH: - handleRefresh() - break - case MSG.SUBMIT_START_1: - handleSubmitStart1(value) - break - case MSG.ERROR: - handleError(value) - break - case MSG.FATAL_ERROR: - handleFatalError(value) - break - default: - send(MSG.ERROR, 'unknown message received by panel!') - } - } - - var handleInit = function () { - var panelUrl = requirejs.toUrl('../templates/panel.html') - var panel = $('
      ').load(panelUrl) - - Promise.all([ - /* Promise 1: add panel to html body and bind functions */ - panel.promise() - .then( - function () { - panel.draggable() - panel.toggle() - $('body').append(panel) - $('body').on('click', '#close-panel-button', function () { - send(MSG.CLICK_CLOSE) - }) - $('body').on('click', '#refresh-panel-button', function () { - send(MSG.CLICK_REFRESH) - }) - } - ) - .then( - () => Utils.set_timeout(600) - ).then(function () { - panel.resizable() - $('.openpai-logo').attr('src', requirejs.toUrl('../misc/pailogo.jpg')) - $('#cluster-data') - .DataTable({ - dom: 'rtip', - order: [ - [2, 'desc'] - ] - }) - }), - /* Promise 2: load python script */ - new Promise(function (resolve, reject) { - Interface.initiate(panel, resolve, reject) - }) - ]).then(function (value) { - send(MSG.INIT_OK, value) - }) - .catch(function (err) { - send(MSG.FATAL_ERROR, err) - }) - } - - var handleInitOK = function () { - if (status === STATUS.NOT_READY) { - if ($('#openpai-panel-wrapper').is(':visible')) { - /* if the panel has been shown, then load the cluster info */ - set(STATUS.READY_NOT_LOADING) - send(MSG.CLICK_REFRESH) - } else { - /* if the panel has not been shown, change the status to READY_NOT_LOADING and wait */ - showInformation('') - set(STATUS.READY_NOT_LOADING) - } - } - } - - var handleRefresh = function () { - if (status === STATUS.NOT_READY || status === STATUS.READY_LOADING) { return } - if (status === STATUS.SUBMITTING_1 || status === STATUS.SUBMITTING_2 || - status === STATUS.SUBMITTING_3 || status === STATUS.SUBMITTING_4) { - alert('Please do not refresh during submission.') - return - } - if (status === STATUS.FATAL) { - alert('Please refresh the whole page to reload this extension.') - return - } - if (status === STATUS.SUBMIT_OK) { - if (confirm('Are you sure to refresh? This will clear the current job!') === false) { - return - } - } - set(STATUS.READY_LOADING) - showInformation('Loading the cluster information, please wait...' + Utils.getLoadingImg('loading-cluster-info')) - Interface.read_defaults().then(function (data) { - var resourceMenu = '' - for (var item of data['resource-list']) { - var memoryGB = parseInt(item['memoryMB'] / 1024) - var optionValue = item['gpu'] + ',' + item['cpu'] + ',' + item['memoryMB'] - resourceMenu += '\n' - } - resourceMenu = $('') - var imageAliasDict = { - 'openpai/pytorch-py36-cu90': 'PyTorch + Python3.6 with GPU, CUDA 9.0', - 'openpai/pytorch-py36-cpu': 'PyTorch + Python3.6 with CPU', - 'openpai/tensorflow-py36-cu90': 'TensorFlow + Python3.6 with GPU, CUDA 9.0', - 'openpai/tensorflow-py36-cpu': 'TensorFlow + Python3.6 with CPU' - } - var imageMenu = '' - var imageAlias - for (var image of data['image-list']) { - if (image in imageAliasDict) { imageAlias = imageAliasDict[image] } else { imageAlias = image } - imageMenu += '' - } - imageMenu = $('') - // select the first option - - // append to html - $('#resource-menu').remove() - $('#docker-image-menu').remove() - $('#resouce-menu-label').after(resourceMenu) - $('#docker-image-menu-label').after(imageMenu) - // select option - var formMenu = $('#submit-form-menu') - formMenu.find('option').removeAttr('selected') - resourceMenu.find('option').removeAttr('selected') - imageMenu.find('option').removeAttr('selected') - function selectOption (menu, value) { - if (value) { - var option = menu.find('option[value="' + value + '"]') - if (option.length > 0) { option.attr('selected', 'selected') } else { $(menu.find('option')[0]).attr('selected', 'selected') } - } else { $(menu.find('option')[0]).attr('selected', 'selected') } - } - selectOption(formMenu, data['web-default-form']) - selectOption(resourceMenu, data['web-default-resource']) - selectOption(imageMenu, data['web-default-image']) - }).then( - () => - Interface.tell_resources().then(function (data) { - var ret = [] - for (var cluster in data) { - for (var vc in data[cluster]) { - ret.push({ - cluster: cluster, - vc: vc, - gpu: { - display: Utils.getLoadingImgSmall(), - gpu_value: 0 - }, - button_sub: ``, - button_edit: `` - }) - } - } - $('#cluster-data') - .DataTable({ - dom: 'rtip', - order: [ - [2, 'desc'] - ], - destroy: true, - data: ret, - columns: [{ - data: 'cluster' - }, { - data: 'vc' - }, { - data: 'gpu', - type: 'num', - render: { - _: 'display', - sort: 'gpu_value' - } - }, { - data: 'button_sub' - }, { - data: 'button_edit' - }], - initComplete: function () { - set(STATUS.SHOWING_INFO) - Interface.available_resources().then(function (clusterData) { - var table = $('#cluster-data').DataTable() - table.rows().every(function (rowIdx, tableLoop, rowLoop) { - var tableData = this.data() - var info = clusterData[tableData['cluster']][tableData['vc']] - if (info === undefined) { - tableData['gpu']['gpu_value'] = -2 - tableData['gpu']['display'] = '
      ?' - } else - if (info['GPUs'] === -1) { - tableData['gpu']['gpu_value'] = info['GPUs'] - tableData['gpu']['display'] = '?' - } else { - tableData['gpu']['gpu_value'] = info['GPUs'] - tableData['gpu']['display'] = info['GPUs'] - } - this.data(tableData) - }) - table.draw() - }) - }, - fnDrawCallback: function () { - $('.openpai-tooltip').tooltip({ - classes: { - 'ui-tooltip': 'highlight' - } - } - ) - $('.submit_button').on('click', function () { - var cluster = $(this).data('cluster') - var vc = $(this).data('vc') - var type = $(this).data('type') - send(MSG.SUBMIT_START_1, { - cluster: cluster, - vc: vc, - type: type - }) - }) - } - }) - $('#panel-information-wrapper').hide() - $('#panel-table-wrapper').show() - }) - ) - .catch(function (e) { - send(MSG.ERROR, e) - }) - } - - var handleSubmitStart1 = function (info) { - if (status !== STATUS.SHOWING_INFO) { - return - } - set(STATUS.SUBMITTING_1) - /* get some basic */ - var submittingCtx = { - form: $('#submit-form-menu').val(), // file | notebook | silent - type: info['type'], // quick | edit - cluster: info['cluster'], - vc: info['vc'], - gpu: parseInt($('#resource-menu option:selected').data('gpu')), - cpu: parseInt($('#resource-menu option:selected').data('cpu')), - memoryMB: parseInt($('#resource-menu option:selected').data('memory')), - docker_image: $('#docker-image-menu').val(), - notebook_name: Jupyter.notebook.notebook_name - } - if (submittingCtx['type'] === 'edit') { submittingCtx['stage_num'] = 1 } else { - if (submittingCtx['form'] === 'file') { submittingCtx['stage_num'] = 1 } else { submittingCtx['stage_num'] = 2 } - } - - console.log('[openpai submitter] submitting ctx:', submittingCtx) - showInformation('') - if (submittingCtx['type'] === 'edit') { appendInformation('Uploading files and generating config...' + Utils.getLoadingImg('loading-stage-1')) } else { - if (submittingCtx['stage_num'] === 1) { appendInformation('Uploading files and submitting the job...' + Utils.getLoadingImg('loading-stage-1')) } else { appendInformation('Stage 1 / 2 : Uploading files and submitting the job...' + Utils.getLoadingImg('loading-stage-1')) } - } - var promiseSubmitting = Jupyter.notebook.save_notebook() - .then( - function () { - appendInformation('



      Click [here] to cancel this job.

      ') - var cancelThis - var promise = Promise.race([ - Interface.submit_job(submittingCtx), - new Promise(function (resolve, reject) { - cancelThis = reject - }) - ]) - $('body').off('click', '#openpai-clear-info-force').on('click', '#openpai-clear-info-force', function () { - if (confirm('Are you sure to start a new OpenPAI Submitter job (Your previous job will be saved in the Recent Jobs panel)?')) { - $('#openpai-clear-info-force').remove() - cancelThis('cancelled') - set(STATUS.NOT_READY) - send(MSG.INIT_OK) - } - }) - return promise - } - ) - .then( - function (ctx) { - set(STATUS.SUBMITTING_2) - $('#text-clear-info-force').remove() - $('#loading-stage-1').remove() - appendInformation('
      ') - submittingCtx = ctx - if (ctx['type'] === 'quick') { - var submissionTime = (function () { - var ts = new Date() - var mm = ts.getMonth() + 1 - var dd = ts.getDate() - var HH = ts.getHours() - var MM = ts.getMinutes() - var SS = ts.getSeconds() - if (mm < 10) mm = '0' + mm - if (dd < 10) dd = '0' + dd - if (HH < 10) HH = '0' + HH - if (MM < 10) MM = '0' + MM - if (SS < 10) SS = '0' + SS - return mm + '-' + dd + ' ' + HH + ':' + MM + ':' + SS - }()) - panelRecent.send( - panelRecent.MSG.ADD_JOB, { - cluster: ctx['cluster'], - vc: ctx['vc'], - user: ctx['user'], - time: submissionTime, - jobname: ctx['jobname'], - joblink: ctx['joblink'], - form: ctx['form'], - state: 'WAITING' - } - ) - appendInformation('The job name is: ' + ctx['jobname'] + '
      ') - appendInformation('The job link is: ' + ctx['joblink'] + '') - return new Promise((resolve, reject) => resolve(ctx)) - } else { - /* ctx["type"] === "edit" */ - var download = function (filename, text) { - var element = document.createElement('a') - element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)) - element.setAttribute('download', filename) - element.style.display = 'none' - document.body.appendChild(element) - element.click() - document.body.removeChild(element) - } - download(ctx['jobname'] + '.yaml', ctx['job_config']) - } - } - ) - if (submittingCtx['stage_num'] === 2) { - promiseSubmitting = promiseSubmitting.then( - function (ctx) { - appendInformation('

      ') - if (ctx['form'] === 'notebook') { - appendInformation('Stage 2 / 2: Wait until the notebook is ready...' + - Utils.getLoadingImg('loading-stage-2')) - } else { appendInformation('Stage 2 / 2: Wait until the result is ready...' + Utils.getLoadingImg('loading-stage-2')) } - appendInformation('
      ') - if (ctx['form'] === 'notebook') { - appendInformation('

      Note: This procedure may persist for several minutes. You can safely close' + - ' this submitter, and the notebook URL will be shown here once it is prepared.


      ') - } else { - appendInformation('

      Note: The notebook will run in the background. You can safely close' + - ' this submitter, and the result file link will be shown here once it is prepared.


      ') - } - appendInformation('

      You can also click [here] to start a new OpenPAI Submitter job. Your previous job will be saved in the Recent Jobs panel.

      ') - var cancelThis - var promise = Promise.race([ - Interface.wait_jupyter(ctx), - new Promise(function (resolve, reject) { - cancelThis = reject - }) - ]) - $('body').off('click', '#openpai-clear-info-force').on('click', '#openpai-clear-info-force', function () { - if (confirm('Are you sure to start a new OpenPAI Submitter job (Your previous job will be saved in the Recent Jobs panel)?')) { - $('#text-clear-info-force').remove() - cancelThis('cancelled') - set(STATUS.NOT_READY) - send(MSG.INIT_OK) - } - }) - return promise - } - ).then( - function (ctx) { - if (!($('#openpai-panel-wrapper').is(':visible'))) { - togglePanel() - } - $('#loading-stage-2').remove() - $('#text-notebook-show').hide() - $('#text-clear-info-force').hide() - if (ctx['form'] === 'notebook') { appendInformation('The notebook url is: ' + ctx['notebook_url'] + '') } else { appendInformation('The result file link is (please copy it to your clipboard and paste it to a new page) : ' + ctx['notebook_url'] + '') } - return new Promise((resolve, reject) => resolve(ctx)) - }) - } - promiseSubmitting = promiseSubmitting.then( - function (ctx) { - set(STATUS.SUBMITTING_OK) - appendInformation('

      You can click [here] to start a new OpenPAI Submitter job. Your previous job will be saved in the Recent Jobs panel.') - $('body').off('click', '#openpai-clear-info').on('click', '#openpai-clear-info', function () { - set(STATUS.NOT_READY) - send(MSG.INIT_OK) - }) - } - ).catch(function (e) { - if (e !== 'cancelled') { send(MSG.ERROR, e) } - }) - } - - var handleError = function (err) { - showInformation( - '

      An error happened. ' + - 'Please click [refresh] to retry.

      ' + - '

      Error Information:' + err + '

      ' - ) - set(STATUS.ERROR) - } - - var handleFatalError = function (err) { - showInformation( - '

      A fatal error happened and the OpenPAI Submitter has been terminated. ' + - 'Please refresh the page and click Kernel - Restart & Clear Output to retry.

      ' + - '

      Error Information:' + err + '

      ' - ) - $('#refresh-panel-button').hide() - set(STATUS.FATAL) - } - - var togglePanel = function (callback = null) { - $('#openpai-panel-wrapper').toggle(speed, callback) - } - - var openPanel = function (callback = null) { - $('#openpai-panel-wrapper').show(speed, callback) - } - - var closePanel = function (callback = null) { - $('#openpai-panel-wrapper').hide(speed, callback) - } - - var bindPanelRecent = function (panelRecentInstance) { - panelRecent = panelRecentInstance - } - - return { - send: send, - STATUS: STATUS, - MSG: MSG, - bindPanelRecent: bindPanelRecent - } - } - - return Panel -}) diff --git a/contrib/notebook-extension/openpai_submitter/scripts/panel_recent.js b/contrib/notebook-extension/openpai_submitter/scripts/panel_recent.js deleted file mode 100644 index 20af209d9a..0000000000 --- a/contrib/notebook-extension/openpai_submitter/scripts/panel_recent.js +++ /dev/null @@ -1,367 +0,0 @@ -// Copyright (c) Microsoft Corporation -// All rights reserved. -// -// MIT License -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -define([ - 'require', - 'jquery', - 'base/js/namespace', - 'base/js/events', - 'nbextensions/openpai_submitter/scripts/config', - 'nbextensions/openpai_submitter/scripts/interface', - 'nbextensions/openpai_submitter/scripts/utils' -], -function (requirejs, $, Jupyter, events, config, Interface, Utils) { - function Panel () { - var STATUS_R = [ - 'NOT_READY', - 'READY_NOT_LOADING', - 'READY_LOADING', - 'SHOWING_INFO', - 'ERROR', - 'FATAL' - ] - var MSG_R = [ - 'PLEASE_INIT', - 'INIT_OK', - 'ADD_JOB', - 'CLICK_BUTTON', - 'CLICK_CLOSE', - 'CLICK_REFRESH', - 'ERROR', - 'FATAL_ERROR' - ] - - var STATUS = {} - for (var i = 0; i < STATUS_R.length; i += 1) { STATUS[STATUS_R[i]] = i } - var MSG = {} - for (var j = 0; j < MSG_R.length; j += 1) { MSG[MSG_R[j]] = j } - - var set = function (s) { - // console.log('[openpai submitter] [panel-recent] set status', STATUS_R[s]) - status = s - } - - var status - var panel // main panel - var jobStatusFinished = ['FAILED', 'STOPPED', 'SUCCEEDED'] - var hasAddFilter = false - - set(STATUS.NOT_READY) - - var speed = config.panel_toggle_speed - - var showInformation = function (info) { - /* this function will hide table and show information for users. */ - $('#panel-recent-table-wrapper').hide() - $('#panel-recent-information-wrapper').show() - } - - var appendInformation = function (info) { - $('#panel-recent-information').append(info) - } - - var send = function (msg, value) { - // console.log('[openpai submitter] [panel-recent]', 'status:', STATUS_R[status], 'msg', MSG_R[msg], 'value', value) - switch (msg) { - case MSG.PLEASE_INIT: - handleInit() - break - case MSG.INIT_OK: - handleInitOK() - break - case MSG.ADD_JOB: - handleAddJob(value) - break - case MSG.CLICK_BUTTON: - if (!($('#openpai-panel-recent-wrapper').is(':visible'))) { - if ((status !== STATUS.READY_LOADING) && (status !== STATUS.FATAL)) { - Utils.set_timeout(config.panel_toggle_speed).then( - () => send(MSG.CLICK_REFRESH) - ) - } - } - togglePanel() - break - case MSG.CLICK_CLOSE: - closePanel() - break - case MSG.CLICK_REFRESH: - handleRefresh() - break - case MSG.ERROR: - handleError(value) - break - case MSG.FATAL_ERROR: - handleFatalError(value) - break - default: - send(MSG.ERROR, 'unknown message received by panel!') - } - } - - var turnOnFilter = function () { - hasAddFilter = true - $.fn.dataTable.ext.search.push( - function (settings, data, dataIndex) { - /* only show unfinished jobs */ - if (settings.nTable.getAttribute('id') !== 'recent-jobs') { return true } - return jobStatusFinished.indexOf(data[4]) < 0 - }) - } - - var turnOffFilter = function () { - hasAddFilter = false - $.fn.dataTable.ext.search.pop() - } - - var handleInit = function () { - var panelUrl = requirejs.toUrl('../templates/panel_recent.html') - var panel = $('
      ').load(panelUrl) - - Promise.all([ - /* Promise 1: add panel to html body and bind functions */ - panel.promise() - .then( - function () { - panel.draggable() - panel.toggle() - $('body').append(panel) - $('body').on('click', '#close-panel-recent-button', function () { - send(MSG.CLICK_CLOSE) - }) - $('body').on('click', '#refresh-panel-recent-button', function () { - send(MSG.CLICK_REFRESH) - }) - - turnOnFilter() - - $('body').on('click', '#openpai-if-hide-jobs', function () { - if ($('#openpai-if-hide-jobs').prop('checked') === true && - hasAddFilter === false) { - turnOnFilter() - $('#recent-jobs').DataTable().draw() - } else if ($('#openpai-if-hide-jobs').prop('checked') === false && - hasAddFilter === true) { - turnOffFilter() - $('#recent-jobs').DataTable().draw() - } - }) - } - ) - .then( - () => Utils.set_timeout(600) - ).then(function () { - panel.resizable() - $('.openpai-logo').attr('src', requirejs.toUrl('../misc/pailogo.jpg')) - $('#recent-jobs') - .DataTable({ - dom: 'rtip', - order: [ - [2, 'desc'] - ], - data: [] - }) - }), - /* Promise 2: load python script */ - new Promise(function (resolve, reject) { - Interface.initiate(panel, resolve, reject) - }) - ]).then(function (value) { - send(MSG.INIT_OK, value) - }) - .catch(function (err) { - send(MSG.FATAL_ERROR, err) - }) - } - - var handleInitOK = function () { - if (status === STATUS.NOT_READY) { - if ($('#openpai-panel-recent-wrapper').is(':visible')) { - /* if the panel has been shown, then load the cluster info */ - set(STATUS.READY_NOT_LOADING) - send(MSG.CLICK_REFRESH) - } else { - /* if the panel has not been shown, change the status to READY_NOT_LOADING and wait */ - showInformation('') - set(STATUS.READY_NOT_LOADING) - } - } - } - - var handleAddJob = function (record) { - Interface.add_job(record) - .catch((e) => send(MSG.ERROR, e)) - } - - var handleRefresh = function () { - if (status === STATUS.NOT_READY || status === STATUS.READY_LOADING) { return } - if (status === STATUS.FATAL) { - alert('Please refresh the whole page to reload this extension.') - return - } - set(STATUS.READY_LOADING) - var jobData - Interface.get_jobs().then( - function (data) { - var ret = [] - jobData = data - for (var i = 0; i < data.length; i += 1) { - var record = data[i] - var item = { - jobname: record['jobname'], - cluster: record['cluster'], - vc: record['vc'], - user: record['user'], - time: record['time'], - joblink: '' - } - if (jobStatusFinished.indexOf(record['state']) >= 0) { - item['state'] = record['state'] - if (record['form'] !== 'silent') { item['notebook_url'] = '-' } else { - if ((record['notebook_url'] === undefined) || (record['notebook_url'] === '-')) { item['notebook_url'] = '-' } else { item['notebook_url'] = '' } - } - } else { - item['state'] = '' + Utils.getLoadingImgSmall() + '' - item['notebook_url'] = '' + Utils.getLoadingImgSmall() + '' - } - ret.push(item) - } - $('#recent-jobs') - .DataTable({ - dom: 'rtip', - order: [ - [3, 'desc'] - ], - data: ret, - destroy: true, - rowId: rowData => 'openpai-job-' + rowData['jobname'], - columns: [{ - data: 'jobname', - width: '15%' - }, { - data: 'cluster', - width: '12%' - }, { - data: 'vc', - width: '12%' - }, { - data: 'time', - width: '25%' - }, { - data: 'state', - width: '12%' - }, { - data: 'joblink', - width: '12%' - }, { - data: 'notebook_url', - width: '12%' - }], - initComplete: function () { - set(STATUS.READY_LOADING) - $('body').off('click', '.silent-link').on('click', '.silent-link', function (e) { - var url = $(e.target).parent().data('path') - Utils.copy_to_clipboard(url).then( - () => alert('The result file link has been copied to your clipboard! Please paste it to a new page.') - ).catch( - () => alert('Failed to copy the file link. Please find the file manually. Location: ' + url) - ) - }) - var jobsFinished = [] - var jobsUnfinished = [] - for (var item of jobData) { - if (jobStatusFinished.indexOf(item['state']) >= 0) { jobsFinished.push(item) } else { jobsUnfinished.push(item) } - } - /* Only detect unfinished jobs */ - Interface.detect_jobs(jobsUnfinished) - .then(function (jobsUnfinished) { - Interface - .save_jobs(jobsUnfinished.concat(jobsFinished)) - .catch((e) => console.error(e)) // Although it is a promise, we don't care whether it succeeds or not. - for (var item of jobsUnfinished) { - var originalData = $('#recent-jobs').DataTable().row('#openpai-job-' + item['jobname']).data() - originalData['state'] = item['state'] - if (item['notebook_url'] !== undefined && item['notebook_url'] !== '-') { - if (item['form'] === 'notebook') { originalData['notebook_url'] = '' } else { originalData['notebook_url'] = '' } - } else { originalData['notebook_url'] = '-' } - $('#recent-jobs').DataTable().row('#openpai-job-' + item['jobname']).data(originalData) - } - set(STATUS.SHOWING_INFO) - }) - .catch( - function (e) { - console.error('[openpai submitter]', e) - set(STATUS.SHOWING_INFO) - } - ) - } - } - ) - $('#panel-recent-information-wrapper').hide() - $('#panel-recent-table-wrapper').show() - } - ).catch((e) => send(MSG.ERROR, e)) - } - - var handleError = function (err) { - showInformation( - '

      An error happened. ' + - 'Please click [refresh] to retry.

      ' + - '

      Error Information:' + err + '

      ' - ) - set(STATUS.ERROR) - } - - var handleFatalError = function (err) { - showInformation( - '

      A fatal error happened and the OpenPAI Submitter has been terminated. ' + - 'Please refresh the page and click Kernel - Restart & Clear Output to retry.

      ' + - '

      Error Information:' + err + '

      ' - ) - set(STATUS.FATAL) - } - - var togglePanel = function (callback = null) { - $('#openpai-panel-recent-wrapper').toggle(speed, callback) - } - - var openPanel = function (callback = null) { - $('#openpai-panel-recent-wrapper').show(speed, callback) - } - - var closePanel = function (callback = null) { - $('#openpai-panel-recent-wrapper').hide(speed, callback) - } - - var bindPanel = function (panelInstance) { - panel = panelInstance - } - - return { - send: send, - STATUS: STATUS, - MSG: MSG, - bindPanel: bindPanel - } - } - - return Panel -}) diff --git a/contrib/notebook-extension/openpai_submitter/scripts/utils.js b/contrib/notebook-extension/openpai_submitter/scripts/utils.js deleted file mode 100644 index a3d1345d77..0000000000 --- a/contrib/notebook-extension/openpai_submitter/scripts/utils.js +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) Microsoft Corporation -// All rights reserved. -// -// MIT License -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -// to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -// BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -define(['require'], function (requirejs) { - return { - getLoadingImg: function (idName) { - var loadingImg - if (idName !== undefined) { loadingImg = '' } else { loadingImg = '' } - return loadingImg - }, - getLoadingImgSmall: function (idName) { - var loadingImg - if (idName !== undefined) { loadingImg = '' } else { loadingImg = '' } - return loadingImg - }, - copy_to_clipboard: function (text) { - return new Promise(function (resolve, reject) { - function fallbackCopyTextToClipboard (text) { - var textArea = document.createElement('textarea') - textArea.value = text - document.body.appendChild(textArea) - textArea.focus() - textArea.select() - try { - var successful = document.execCommand('copy') - var msg = successful ? 'successful' : 'unsuccessful' - resolve() - } catch (err) { - reject(err) - } - document.body.removeChild(textArea) - } - function copyTextToClipboard (text) { - if (!navigator.clipboard) { - fallbackCopyTextToClipboard(text) - return - } - navigator.clipboard.writeText(text).then(function () { - resolve() - }, function (err) { - reject(err) - }) - } - copyTextToClipboard(text) - }) - }, - set_timeout: function timeout (ms, value) { - return new Promise((resolve, reject) => { - setTimeout(resolve, ms, value) - }) - }, - set_timeout_func: function timeoutFunc (ms, func, args) { - return new Promise((resolve, reject) => { - setTimeout(function () { - func.apply(args) - resolve() - }, ms) - }) - } - } -}) diff --git a/contrib/notebook-extension/openpai_submitter/templates/panel.html b/contrib/notebook-extension/openpai_submitter/templates/panel.html deleted file mode 100644 index 6af2c3d0b3..0000000000 --- a/contrib/notebook-extension/openpai_submitter/templates/panel.html +++ /dev/null @@ -1,63 +0,0 @@ -
      -
      - -

      OpenPAI Submitter

      - [close] -    - [refresh] -
      - -
      -
      - -
      - - -
      -
      - - -
      -
      - - -
      -
      -
      - - -
      - The panel is not ready. Please wait. -
      -
      -
      -
      \ No newline at end of file diff --git a/contrib/notebook-extension/openpai_submitter/templates/panel_recent.html b/contrib/notebook-extension/openpai_submitter/templates/panel_recent.html deleted file mode 100644 index 5646647b50..0000000000 --- a/contrib/notebook-extension/openpai_submitter/templates/panel_recent.html +++ /dev/null @@ -1,41 +0,0 @@ -
      -
      - -

      Recent Jobs

      - [close] -    - [refresh] -
      - -
      -
      - -
      - The panel is not ready. Please wait. -
      -
      -
      -
      \ No newline at end of file diff --git a/contrib/notebook-extension/setup.py b/contrib/notebook-extension/setup.py deleted file mode 100644 index e8cc113012..0000000000 --- a/contrib/notebook-extension/setup.py +++ /dev/null @@ -1,50 +0,0 @@ -"""this is the setup (install) script for OpenPAI notebook extension -""" -import os -import sys -from argparse import ArgumentParser -from subprocess import check_output - - -def run(cmds: list, comment: str = None): - if comment: - print(comment, flush=True) - check_output(cmds, shell=True) - - -if __name__ == '__main__': - parser = ArgumentParser() - parser.add_argument('--user', action='store_true', default=False, help='pip install in user mode') - parser.add_argument('--ignore-sdk', '-i', action='store_true', default=False, - help='dont install python sdk, make sure you have a workable version instead') - args = parser.parse_args() - - pip_cmd = [sys.executable, '-m', 'pip', 'install'] - if args.user: - pip_cmd += ['--user'] - jupyter_cmd = [sys.executable, '-m', 'jupyter'] - - run( - pip_cmd + ['jupyter', 'jupyter_contrib_nbextensions'], - '==== install requirements ====' - ) - - run( - jupyter_cmd + ['contrib', 'nbextension', 'install', '--user'], - '==== install nbextension ====' - ) - - if not args.ignore_sdk: - run( - pip_cmd + ['--upgrade', os.path.join('..', 'python-sdk')], - '==== install sdk ====' - ) - - run( - jupyter_cmd + ['nbextension', 'install', 'openpai_submitter'], - '==== install openpai_submitter ====' - ) - run( - jupyter_cmd + ['nbextension', 'enable', 'openpai_submitter/main'], - '==== enable openpai_submitter ====' - ) diff --git a/contrib/python-sdk/README.md b/contrib/python-sdk/README.md deleted file mode 100644 index 98e2bf2993..0000000000 --- a/contrib/python-sdk/README.md +++ /dev/null @@ -1,457 +0,0 @@ -The `Python` SDK and CLI for `OpenPAI` ----- - -***Note: Python SDK is deprecated and will be removed in the future. New SDK and CLI support is available at [openpaisdk](https://github.com/microsoft/openpaisdk).*** - -This is a proof-of-concept SDK (Python) and CLI (command-line-interface) tool for the [OpenPAI](https://github.com/microsoft/pai). This project provides some facilities to make `OpenPAI` more easily accessible and usable for users. With it, - -- User can easily access `OpenPAI` resources in scripts (`Python` or `Shell`) and `Jupyter` notebooks -- User can easily submit and list jobs by simple commands, or snippets of code -- User can easily accomplish complicated operations with `OpenPAI` -- User can easily reuse local codes and notebooks -- User can easily manage and switch between multiple `OpenPAI` clusters - -Besides above benefits, this project also provides powerful runtime support, which bridges users' (local) working environments and jobs' running environments (inside the containers started by remote cluster). See more about[ the scenarios and user stories](docs/scenarios-and-user-stories.md). - -- [Get started](#get-started) - - [Installation](#installation) - - [Dependencies](#dependencies) - - [Define your clusters](#define-your-clusters) -- [How-to guide for the CLI tool](#how-to-guide-for-the-cli-tool) - - [Cluster and storage management](#cluster-and-storage-management) - - [How to list existing clusters](#how-to-list-existing-clusters) - - [How to open and edit the cluster configuration file](#how-to-open-and-edit-the-cluster-configuration-file) - - [How to check the available resources of clusters](#how-to-check-the-available-resources-of-clusters) - - [How to add a cluster](#how-to-add-a-cluster) - - [How to delete a cluster](#how-to-delete-a-cluster) - - [How to access storages of a cluster](#how-to-access-storages-of-a-cluster) - - [Job operations](#job-operations) - - [How to query my jobs in a cluster](#how-to-query-my-jobs-in-a-cluster) - - [How to submit a job from existing job config file](#how-to-submit-a-job-from-existing-job-config-file) - - [How to change the configuration before submitting](#how-to-change-the-configuration-before-submitting) - - [How to submit a job if I have no existing job config file](#how-to-submit-a-job-if-i-have-no-existing-job-config-file) - - [How to request (GPU) resources for the job](#how-to-request-gpu-resources-for-the-job) - - [How to reference a local file when submitting a job](#how-to-reference-a-local-file-when-submitting-a-job) - - [How to submit a job given a sequence of commands](#how-to-submit-a-job-given-a-sequence-of-commands) - - [How to add `pip install` packages](#how-to-add-pip-install-packages) - - [How to preview the generated job config but not submit it](#how-to-preview-the-generated-job-config-but-not-submit-it) - - [`Jupyter` notebook](#jupyter-notebook) - - [How to run a local notebook with remote resources](#how-to-run-a-local-notebook-with-remote-resources) - - [How to launch a remote `Jupyter` server and connect it](#how-to-launch-a-remote-jupyter-server-and-connect-it) - - [Other FAQ of CLI](#other-faq-of-cli) - - [How to select a cluster to use until I change it](#how-to-select-a-cluster-to-use-until-i-change-it) - - [How to simplify the command](#how-to-simplify-the-command) - - [How to install a different version of SDK](#how-to-install-a-different-version-of-sdk) - - [How to specify the `python` environment I want to use in the job container](#how-to-specify-the-python-environment-i-want-to-use-in-the-job-container) -- [Python binding](#python-binding) - - [Cluster management](#cluster-management) - - [Job management](#job-management) -- [Make contributions](#make-contributions) - - [Release plan](#release-plan) - - [Debug the SDK](#debug-the-sdk) - - [Unit tests](#unit-tests) - -# Get started - -This section will give guidance about installation, cluster management. User may find more details not covered in the [command line ref](docs/command-line-references.md). - -## Installation - -We provide installing method leveraging `pip install` - -```bash -python -m pip install --upgrade pip -pip install -U "git+https://github.com/Microsoft/pai@master#egg=openpaisdk&subdirectory=contrib/python-sdk" -``` - -Refer to [How to install a different version of SDK](#How-to-install-a-different-version-of-SDK) for more details about installing. After installing, please verify by CLI or python binding as below. - -```bash -opai -h -python -c "from openpaisdk import __version__; print(__version__)" -``` - -### Dependencies - -- The package requires python3 (mainly because of `type hinting`), and we only tested it on `py3.5+` environment. _Only commands `job sub` and `job notebook` require installing this project inside container, others don't make any constraints of `python` version in the docker container._ -- [`Pylon`](https://github.com/microsoft/pai/tree/master/docs/pylon) is required to parse the REST api path like `/reset-server/`. - -## Define your clusters - -Please store the list of your clusters in `~/.openpai/clusters.yaml`. Every cluster would have an alias for calling, and you may save more than one cluster in the list. - -```YAML -- cluster_alias: - pai_uri: http://x.x.x.x - user: - password: - token: # if Azure AD is enabled, must use token for authentication - pylon_enabled: true - aad_enabled: false - storages: # a cluster may have multiple storages - builtin: # storage alias, every cluster would always have a builtin storage - protocol: hdfs - uri: http://x.x.x.x # if not specified, use - ports: - native: 9000 # used for hdfs-mount - webhdfs: webhdfs # used for webhdfs REST API wrapping - virtual_clusters: - - - - - - ... -``` - -Now below command shows all your clusters would be displayed. - -```bash -opai cluster list -``` - -# How-to guide for the CLI tool - -This section will brief you how to leverage the CLI tool (prefixed by `opai`) to improve the productivity of interacting with `OpenPAI`. Below is a summary of functions provided. - -| Command | Description | -| -------------------------- | ---------------------------------------------------------------------------------- | -| `opai cluster list` | list clusters defined in `~/.openpai/clusters.yaml` | -| `opai cluster resources` | list available resources of every cluster (GPUs/vCores/Memory per virtual cluster) | -| `opai cluster edit` | open `~/.openpai/clusters.yaml` for your editing | -| `opai cluster add` | add a cluster | -| `opai job list` | list all jobs of given user (in a given cluster) | -| `opai job status` | query the status of a job | -| `opai job stop` | stop a job | -| `opai job submit` | submit a given job config file to cluster | -| `opai job sub` | shortcut to generate job config and submit from a given command | -| `opai job notebook` | shortcut to run a local notebook remotely | -| `opai storage ` | execute ``* on selected storage (of a given cluster) | - -_*: operations include `list`, `status`, `upload`, `download` and `delete`_ - -Before starting, we'd like to define some commonly used variables as below. - -| Variable name | CLI options | Description | -| ----------------- | --------------------- | --------------------------------------------- | -| `` | `--cluster-alias, -a` | alias to specify a particular cluster | -| `` | `--job-name, -j` | job name | -| `` | `--image, -i` | image name (and tag) for the job | -| `` | `--workspace, -w` | remote storage path to save files for a job * | - -_*: if specified, a directory `/jobs/` and subfolders (e.g. `source`, `output` ...) will be created to store necessary files for the job named ``_ - -## Cluster and storage management - -### How to list existing clusters - -To list all existing clusters in `~/.openpai/clusters.yaml`, execute below command - -```bash -opai cluster list -``` - -### How to open and edit the cluster configuration file - -We add a convenient shortcut command to open the cluster configuration file with your editor directly by - -```bash -opai cluster edit [--editor ] -``` - -The default editor is VS Code (`code`), users may change to other editor (e.g. `--editor notepad`). - -## How to check the available resources of clusters - -To check the availability of each cluster, use the command -```bash -opai cluster resources -``` -it will return the available GPUs, vCores and memory of every virtual cluster in every cluster. - -User can also check it in a `Python` script as below -```python -from openpaisdk import __cluster_config_file__ -from openpaisdk.io_utils import from_file -from openpaisdk.cluster import ClusterList - -cfg = from_file(__cluster_config_file__, default=[]) -ClusterList(cfg).available_resources() -``` - -### How to add a cluster - -User can use `add` and `delete` command to add (or delete) a clusters from the clusters file. - -```bash -# for user/password authentication -opai cluster add --cluster-alias --pai-uri --user --password -# for Azure AD authentication -opai cluster add --cluster-alias --pai-uri --user --token -``` - -On receiving the add command, the CLI will try to connect the cluster, and get basic configuration from it. - -User can also add it by `python` binding as below. - - -### How to delete a cluster - -Delete a cluster by calling its alias. - -```bash -opai cluster delete -``` - -### How to access storages of a cluster - -Before accessing, user needs to attach storages to a specify cluster. - -```bash -opai cluster attach-hdfs --cluster-alias --storage-alias hdfs --web-hdfs-uri http://x.x.x.x:port --default -``` - -It is supported to attach multiple heterogeneous storages (e.g. `HDFS`, `NFS` ...*) to a cluster, and one of the storages will be set as default (to upload local codes). If not defined, the storage firstly added will be set as default. - -After attaching, basic operations (e.g. `list`, `upload`, `download` ...) are provided. - -```bash -opai storage list -a -s -opai storage download -a -s -opai storage upload -a -s -``` - -## Job operations - -### How to query my jobs in a cluster - -User could retrieve the list of submitted jobs from a cluster. If more information is wanted, add the `` in the command. - -```bash -opai job list -a [] -``` - -### How to submit a job from existing job config file - -If you already has a job config file, you could submit a job based on it directly. The job config file could be in the format of `json` or `yaml`, and it must be compatible with [job configuration specification v1](https://github.com/microsoft/pai/blob/master/docs/job_tutorial.md) or [pai-job-protocol v2](https://github.com/microsoft/openpai-protocol/blob/master/schemas/v2/schema.yaml). - -```bash -opai job submit -a -``` - -The CLI would judge whether it is `v1` or `v2` job configuration and call corresponding REST API to submit it. - -### How to change the configuration before submitting - -The CLI tools also provides the function to change some contents of existing job config file before submitting it. For example, we need to change the job name to avoid duplicated names, and maybe want to switch to a virtual cluster with more available resources. Of course, user could change the contents of `jobName` and `virtualCluster` (in `v1` format) or `name` and `virtualCluster` in `defaults` (in `v2` format) manually. But the CLI provides a more efficient and easy way to to the same thing. - -```bash -# compatible with v1 specification -opai job submit --update name= -u defaults:virtualCluster=test - -# compatible with v2 specification -opai job submit --update jobName= -u virtualCluster=test -``` - -### How to submit a job if I have no existing job config file - -It is not convenient to write a job config file (no matter according to `v1` or `v2` specification). For users just want to run a specific command (or a sequence of commands) in the resources of the cluster, the CLI provides a command `sub` (different from`submit`), which could generate the job config file first and then `submit` it. - -For example, user want to run `mnist_cnn.py` in a docker container (the file is contained by the docker image), the command would be - -```bash -opai job sub -a -i -j python mnist_cnn.py -``` - -### How to request (GPU) resources for the job - -User could apply for specific resources (CPUs, GPUs and Memory) for the job, just by adding below options in above commands - -- `--cpu <#cpu>` - -- `--gpu <#gpu>` -- `--memoryMB <#memory-in-unit-of-MB>` -- `--ports = [--ports = [...]]` - -### How to reference a local file when submitting a job - -If the `mnist_cnn.py` is not copied in the docker image and it is a file stored in your local disk, above command would fail due to the file cannot be accessed in remote job container. To solve this problem, the option `--sources mnist_cnn.py` would be added in the command. Since the job container could access local disk directly, we need to upload the file to somewhere (defined by `--workspace`) in [the default storage of the cluster](#How-to-access-storages-of-a-cluster). - -```bash -opai job sub -a -i -j -w --sources mnist_cnn.py python mnist_cnn.py -``` - -### How to submit a job given a sequence of commands - -In some cases, user wants to do a sequence of commands in the job. The recommended way is to put your commands in a pair of quotes (like `"git clone ... && python ..."`) and combine them with `&&` if you have multiple commands to run. Here is an example of combining 3 commands. - -```bash -opai job sub [...] "git clone && cd && python run.py arg1 arg2 ..." -``` - -### How to add `pip install` packages - -Of course, you could write a sequence of commands like `pip install ... && python ...` . There is another way which use `--pip-installs ` and `--pip-path ` options in the commands. it will add new commands in the `preCommands` in the `deployment`. - -### How to preview the generated job config but not submit it - -In some cases, user may want to preview the job config (in `v2` format) but not submit it directly. To fulfill this, just add `--preview` option. The commands support this feature includes `job submit`, `job sub` and `job notebook`. - -## `Jupyter` notebook - -### How to run a local notebook with remote resources - -If given a local `` (e.g. `mnist_cnn.ipynb` stored in local disk), and user wants to run it remotely (on `OpenPAI`) and see the result. - -```bash -opai job notebook -a -i -w -``` - -This command requires options as the `opai job sub` does. This command would - -- *Local* - upload `` to `/jobs//source` and submit the job to cluster (`` is set to `_` if not defined) -- _In job container_ - download ` ` and execute it by `jupyter nbconver --execute`, the result would be saved in `` with the same name (`*.html`) -- _In job container_ - upload `` to `/jobs//output` -- _Local_ - wait and query the job state until its status to be `SUCCEEDED` -- _Local_ - download `` to local and open it with web browser - -### How to launch a remote `Jupyter` server and connect it - -Sometimes user may want to launch a remote `Jupyter` server and do some work on it interactively. To do this, just add `--interactive` in `job notebook` command. After submitting the job, a link like `http://x.x.x.x:port/notebooks/` will be opened in your browser. Since it takes a while to start the container, please wait and refresh the page until the notebook opens. Use the default token `abcd` (unless it is overridden by `--token `) to login the notebook. - -## Other FAQ of CLI - -### How to select a cluster to use until I change it - -As shown in above examples, `--cluster-alias, -a` is required by lots of commands, but it may not be changed frequently. So it is annoying to type it every time. The CLI tool provides a command to select a cluster to use by - -``` -opai cluster select [-g] -``` - -Commands after `opai cluster select` will have a default option (if necessary) `--cluster-alias `, which can be overwritten explicitly. The mechanism and priority sequence is the same to below section. - -### How to simplify the command - -The mechanism behind `opai cluster select` command help us to simplify the command further. For example, we could set `--workspace, -w` with a default value by - -```bash -opai set [-g] workspace= -``` - -The SDK will first load (`~/.openpai/defaults.yaml`), and then update them with the contents in `.openpai/defaults.yaml` in your current working directory. In every command requires a `--workspace, -w` option but no value defined, the default value would be used. - -Some commonly used default variables includes - -- `cluster-alias=` -- `image=` -- `workspace=` -- `container-sdk-branch=` which branch to use when install the sdk in job container - -### How to install a different version of SDK - -User could easily switch to another version of SDK both in local environment and in job container. In local environment, user just change `` to another branch (e.g. `pai-0.14.y` for `OpenPAI` end-June release or a feature developing branch for the canary version). - -```bash -pip install -U "git+https://github.com/Microsoft/pai@#egg=openpaisdk&subdirectory=contrib/python-sdk" -``` - -To debug a local update, just use `pip install -U your/path/to/setup.py`. - -For jobs submitted by the SDK or command line tool, the version specified by `opai set container-sdk-branch=` would be used firstly. If not specified, `master` branch will be used. - -### How to specify the `python` environment I want to use in the job container - -In some cases, there are more than one `python` environments in a docker image. For example, there are both `python` and `python3` environments in `openpai/pai.example.keras.tensorflow`. User could add `--python ` (e.g. `--python python3`) in the command `job notebook` or `job sub` to use the specific `python` environment. Refer to [notebook example](examples/1-submit-and-query-via-command-line.ipynb) for more details. - -# Python binding - -## Cluster management - -- [x] User can describe a cluster with `openpaisdk.core.ClusterList` class to describe multiple clusters - -```python -clusters = ClusterList().load() # defaultly loaded from "~/.openpai/clusters.yaml" -``` - -User `add`, `delete` methods to update clusters, `select` and `get_client` methods to select one from multiple clusters. - -To add a cluster: -```python -cluster_cfg = { - "cluster_alias": ..., # each cluster mush have an unique alias - "pai_uri": ..., - "user": ..., - # for user/password authentication - "password": ..., - # for Azure AD authentication - "token": ..., -} -ClusterList().load().add(cluster_cfg).save() -``` - -To delete a cluster: -```python -ClusterList().load().delete(cluster_alias).save() -``` - -- [x] the `Cluster` class has methods to query and submit jobs - -```python -client = clusters.get_client(alias) -client.jobs(name) -client.rest_api_submit(job_config) -``` - -- [x] the `Cluster` class has methods to access storage (through `WebHDFS` only for this version) - -```python -Cluster(...).storage.upload/download(...) -``` - -## Job management - -- [x] User can describe a job with `openpaisdk.core.Job` class, which is compatible with the v2 protocol - -```python -job = Job(name) -job.submit(cluster_alias) # submit current job to a cluster -``` - -- [x] provide some quick template of simple jobs - -```python -job.one_liner(...) # generate job config from a command -job.from_notebook(...) # turn notebook to job -``` - -# Make contributions - -User may open issues and feature requests on [Github](https://github.com/microsoft/pai). - -## Release plan - -If there are functions requests not included, please open an issue for feature request. - -## Debug the SDK - -For users those want to improve the functions themselves, you may create the branch of `OpenPAI` project, and make modifications locally. And then set your own branch to the SDK installation source by - -```bash -opai set container-sdk-branch= -``` - -Then the `pip install` command in the job container would use `` . User may check the generated job config to check. - -To set the internal logger to debug level, create an empty file `.openpai/debug_enable` to let sdk enable debugging logging. And remove the empty file make it work normally. - -## Unit tests - -Please execute below command under the `tests` directory to have a quick unit test. -```bash -python -m unittest discover -``` - -Since the unit tests will try to connect your cluster, we set a test environment instead of corrupting the practical settings. Please add a `ut_init.sh` file in `tests` as below -```bash -opai set clusters-in-local=yes # don't corrupt practical environment -opai cluster add -a --pai-uri http://x.x.x.x --user --password -opai cluster select -``` diff --git a/contrib/python-sdk/README_zh_CN.md b/contrib/python-sdk/README_zh_CN.md deleted file mode 100644 index 39cd5af54d..0000000000 --- a/contrib/python-sdk/README_zh_CN.md +++ /dev/null @@ -1,409 +0,0 @@ -## The `Python` SDK and CLI for `OpenPAI` - -This is a proof-of-concept SDK (Python) and CLI (command-line-interface) tool for the [OpenPAI](https://github.com/microsoft/pai). This project provides some facilities to make `OpenPAI` more easily accessible and usable for users. With it, - -- User can easily access `OpenPAI` resources in scripts (`Python` or `Shell`) and `Jupyter` notebooks -- User can easily submit and list jobs by simple commands, or snippets of code -- User can easily accomplish complicated operations with `OpenPAI` -- User can easily reuse local codes and notebooks -- User can easily manage and switch between multiple `OpenPAI` clusters - -Besides above benefits, this project also provides powerful runtime support, which bridges users' (local) working environments and jobs' running environments (inside the containers started by remote cluster). See more about[ the scenarios and user stories](docs/scenarios-and-user-stories.md). - -- [Get started](#get-started) - - [Installation](#installation) - - [Dependencies](#dependencies) - - [Define your clusters](#define-your-clusters) -- [How-to guide for the CLI tool](#how-to-guide-for-the-cli-tool) - - [Cluster and storage management](#cluster-and-storage-management) - - [How to list existing clusters](#how-to-list-existing-clusters) - - [How to open and edit the cluster configuration file](#how-to-open-and-edit-the-cluster-configuration-file) - - [How to check the available resources of clusters](#how-to-check-the-available-resources-of-clusters) - - [How to add / delete a cluster](#how-to-add--delete-a-cluster) - - [How to access storages of a cluster](#how-to-access-storages-of-a-cluster) - - [Job operations](#job-operations) - - [How to query my jobs in a cluster](#how-to-query-my-jobs-in-a-cluster) - - [How to submit a job from existing job config file](#how-to-submit-a-job-from-existing-job-config-file) - - [How to change the configuration before submitting](#how-to-change-the-configuration-before-submitting) - - [How to submit a job if I have no existing job config file](#how-to-submit-a-job-if-i-have-no-existing-job-config-file) - - [How to request (GPU) resources for the job](#how-to-request-gpu-resources-for-the-job) - - [How to reference a local file when submitting a job](#how-to-reference-a-local-file-when-submitting-a-job) - - [How to submit a job given a sequence of commands](#how-to-submit-a-job-given-a-sequence-of-commands) - - [How to add `pip install` packages](#how-to-add-pip-install-packages) - - [How to preview the generated job config but not submit it](#how-to-preview-the-generated-job-config-but-not-submit-it) - - [`Jupyter` notebook](#jupyter-notebook) - - [How to run a local notebook with remote resources](#how-to-run-a-local-notebook-with-remote-resources) - - [How to launch a remote `Jupyter` server and connect it](#how-to-launch-a-remote-jupyter-server-and-connect-it) - - [Other FAQ of CLI](#other-faq-of-cli) - - [How to select a cluster to use until I change it](#how-to-select-a-cluster-to-use-until-i-change-it) - - [How to simplify the command](#how-to-simplify-the-command) - - [How to install a different version of SDK](#how-to-install-a-different-version-of-sdk) - - [How to specify the `python` environment I want to use in the job container](#how-to-specify-the-python-environment-i-want-to-use-in-the-job-container) -- [Python binding](#python-binding) - - [Cluster management](#cluster-management) - - [Job management](#job-management) -- [Make contributions](#make-contributions) - - [Release plan](#release-plan) - - [Debug the SDK](#debug-the-sdk) - - [Unit tests](#unit-tests) - -# Get started - -This section will give guidance about installation, cluster management. User may find more details not covered in the [command line ref](docs/command-line-references.md). - -## Installation - -We provide installing method leveraging `pip install` - -```bash -python -m pip install --upgrade pip -pip install -U "git+https://github.com/Microsoft/pai@master#egg=openpaisdk&subdirectory=contrib/python-sdk" -``` - -Refer to [How to install a different version of SDK](#How-to-install-a-different-version-of-SDK) for more details about installing. After installing, please verify by CLI or python binding as below. - -```bash -opai -h -python -c "from openpaisdk import __version__; print(__version__)" -``` - -### Dependencies - -- The package requires python3 (mainly because of `type hinting`), and we only tested it on `py3.5+` environment. *Only commands `job sub` and `job notebook` require installing this project inside container, others don't make any constraints of `python` version in the docker container.* -- [`Pylon`](https://github.com/microsoft/pai/tree/master/docs/pylon) is required to parse the REST api path like `/reset-server/`. - -## Define your clusters - -Please store the list of your clusters in `~/.openpai/clusters.yaml`. Every cluster would have an alias for calling, and you may save more than one cluster in the list. - -```yaml -- cluster_alias: cluster-for-test - pai_uri: http://x.x.x.x - user: myuser - password: mypassword - default_storage_alias: hdfs - storages: - - protocol: webHDFS - storage_alias: hdfs - web_hdfs_uri: http://x.x.x.x:port - -``` - -Now below command shows all your clusters would be displayed. - -```bash -opai cluster list -``` - -# How-to guide for the CLI tool - -This section will brief you how to leverage the CLI tool (prefixed by `opai`) to improve the productivity of interacting with `OpenPAI`. Below is a summary of functions provided. - -| Command | Description | -| -------------------------------- | ---------------------------------------------------------------------------------- | -| `opai cluster list` | list clusters defined in `~/.openpai/clusters.yaml` | -| `opai cluster resources` | list available resources of every cluster (GPUs/vCores/Memory per virtual cluster) | -| `opai cluster edit` | open `~/.openpai/clusters.yaml` for your editing | -| `opai cluster add` | add a cluster | -| `opai cluster attach-hdfs` | attach a `hdfs` storage through `WebHDFS` | -| `opai job list` | list all jobs of current user (in a given cluster) | -| `opai job submit` | submit a given job config file to cluster | -| `opai job sub` | shortcut to generate job config and submit from a given command | -| `opai job notebook` | shortcut to run a local notebook remotely | -| `opai storage ` | execute ``* on selected storage (of a given cluster) | - -**: operations include `list`, `status`, `upload`, `download` and `delete`* - -Before starting, we'd like to define some commonly used variables as below. - -| Variable name | CLI options | Description | -| ----------------------- | --------------------- | --------------------------------------------- | -| `` | `--cluster-alias, -a` | alias to specify a particular cluster | -| `` | `--job-name, -j` | job name | -| `` | `--image, -i` | image name (and tag) for the job | -| `` | `--workspace, -w` | remote storage path to save files for a job * | - -**: if specified, a directory `/jobs/` and subfolders (e.g. `source`, `output` ...) will be created to store necessary files for the job named ``* - -## Cluster and storage management - -### How to list existing clusters - -To list all existing clusters in `~/.openpai/clusters.yaml`, execute below command - -```bash -opai cluster list -``` - -### How to open and edit the cluster configuration file - -We add a convenient shortcut command to open the cluster configuration file with your editor directly by - -```bash -opai cluster edit [--editor ] -``` - -The default editor is VS Code (`code`), users may change to other editor (e.g. `--editor notepad`). - -## How to check the available resources of clusters - -To check the availability of each cluster, use the command - -```bash -opai cluster resources -``` - -it will return the available GPUs, vCores and memory of every virtual cluster in every cluster. - -User can also check it in a `Python` script as below - -```python -from openpaisdk import __cluster_config_file__ -from openpaisdk.io_utils import from_file -from openpaisdk.cluster import ClusterList - -cfg = from_file(__cluster_config_file__, default=[]) -ClusterList(cfg).available_resources() -``` - -### How to add / delete a cluster - -User can use `add` and `delete` command to add (or delete) a clusters from the clusters file. - -```bash -opai cluster add --cluster-alias --pai-uri http://x.x.x.x --user myuser --password mypassword -opai cluster delete -``` - -After adding a cluster, user may add more information (such as storage info) to it. - -### How to access storages of a cluster - -Before accessing, user needs to attach storages to a specify cluster. - -```bash -opai cluster attach-hdfs --cluster-alias --storage-alias hdfs --web-hdfs-uri http://x.x.x.x:port --default -``` - -It is supported to attach multiple heterogeneous storages (e.g. `HDFS`, `NFS` ...*) to a cluster, and one of the storages will be set as default (to upload local codes). If not defined, the storage firstly added will be set as default. - -After attaching, basic operations (e.g. `list`, `upload`, `download` ...) are provided. - -```bash -opai storage list -a -s -opai storage download -a -s -opai storage upload -a -s -``` - -## Job operations - -### How to query my jobs in a cluster - -User could retrieve the list of submitted jobs from a cluster. If more information is wanted, add the `` in the command. - -```bash -opai job list -a [] -``` - -### How to submit a job from existing job config file - -If you already has a job config file, you could submit a job based on it directly. The job config file could be in the format of `json` or `yaml`, and it must be compatible with [job configuration specification v1](https://github.com/microsoft/pai/blob/master/docs/job_tutorial.md) or [pai-job-protocol v2](https://github.com/microsoft/openpai-protocol/blob/master/schemas/v2/schema.yaml). - -```bash -opai job submit -a -``` - -The CLI would judge whether it is `v1` or `v2` job configuration and call corresponding REST API to submit it. - -### How to change the configuration before submitting - -The CLI tools also provides the function to change some contents of existing job config file before submitting it. For example, we need to change the job name to avoid duplicated names, and maybe want to switch to a virtual cluster with more available resources. Of course, user could change the contents of `jobName` and `virtualCluster` (in `v1` format) or `name` and `virtualCluster` in `defaults` (in `v2` format) manually. But the CLI provides a more efficient and easy way to to the same thing. - -```bash -# compatible with v1 specification -opai job submit --update name= -u defaults:virtualCluster=test - -# compatible with v2 specification -opai job submit --update jobName= -u virtualCluster=test -``` - -### How to submit a job if I have no existing job config file - -It is not convenient to write a job config file (no matter according to `v1` or `v2` specification). For users just want to run a specific command (or a sequence of commands) in the resources of the cluster, the CLI provides a command `sub` (different from`submit`), which could generate the job config file first and then `submit` it. - -For example, user want to run `mnist_cnn.py` in a docker container (the file is contained by the docker image), the command would be - -```bash -opai job sub -a -i -j python mnist_cnn.py -``` - -### How to request (GPU) resources for the job - -User could apply for specific resources (CPUs, GPUs and Memory) for the job, just by adding below options in above commands - -- `--cpu <#cpu>` - -- `--gpu <#gpu>` - -- `--memoryMB <#memory-in-unit-of-MB>` -- `--ports = [--ports = [...]]` - -### How to reference a local file when submitting a job - -If the `mnist_cnn.py` is not copied in the docker image and it is a file stored in your local disk, above command would fail due to the file cannot be accessed in remote job container. To solve this problem, the option `--sources mnist_cnn.py` would be added in the command. Since the job container could access local disk directly, we need to upload the file to somewhere (defined by `--workspace`) in [the default storage of the cluster](#How-to-access-storages-of-a-cluster). - -```bash -opai job sub -a -i -j -w --sources mnist_cnn.py python mnist_cnn.py -``` - -### How to submit a job given a sequence of commands - -In some cases, user wants to do a sequence of commands in the job. The recommended way is to put your commands in a pair of quotes (like `"git clone ... && python ..."`) and combine them with `&&` if you have multiple commands to run. Here is an example of combining 3 commands. - -```bash -opai job sub [...] "git clone && cd && python run.py arg1 arg2 ..." -``` - -### How to add `pip install` packages - -Of course, you could write a sequence of commands like `pip install ... && python ...` . There is another way which use `--pip-installs ` and `--pip-path ` options in the commands. it will add new commands in the `preCommands` in the `deployment`. - -### How to preview the generated job config but not submit it - -In some cases, user may want to preview the job config (in `v2` format) but not submit it directly. To fulfill this, just add `--preview` option. The commands support this feature includes `job submit`, `job sub` and `job notebook`. - -## `Jupyter` notebook - -### How to run a local notebook with remote resources - -If given a local `` (e.g. `mnist_cnn.ipynb` stored in local disk), and user wants to run it remotely (on `OpenPAI`) and see the result. - -```bash -opai job notebook -a -i -w -``` - -This command requires options as the `opai job sub` does. This command would - -- *Local* - upload `` to `/jobs//source` and submit the job to cluster (`` is set to `_` if not defined) -- *In job container* - download `` and execute it by `jupyter nbconver --execute`, the result would be saved in `` with the same name (`*.html`) -- *In job container* - upload `` to `/jobs//output` -- *Local* - wait and query the job state until its status to be `SUCCEEDED` -- *Local* - download `` to local and open it with web browser - -### How to launch a remote `Jupyter` server and connect it - -Sometimes user may want to launch a remote `Jupyter` server and do some work on it interactively. To do this, just add `--interactive` in `job notebook` command. After submitting the job, a link like `http://x.x.x.x:port/notebooks/` will be opened in your browser. Since it takes a while to start the container, please wait and refresh the page until the notebook opens. Use the default token `abcd` (unless it is overridden by `--token `) to login the notebook. - -## Other FAQ of CLI - -### How to select a cluster to use until I change it - -As shown in above examples, `--cluster-alias, -a` is required by lots of commands, but it may not be changed frequently. So it is annoying to type it every time. The CLI tool provides a command to select a cluster to use by - - opai cluster select [-g] - - -Commands after `opai cluster select` will have a default option (if necessary) `--cluster-alias `, which can be overwritten explicitly. The mechanism and priority sequence is the same to below section. - -### How to simplify the command - -The mechanism behind `opai cluster select` command help us to simplify the command further. For example, we could set `--workspace, -w` with a default value by - -```bash -opai set [-g] workspace= -``` - -The SDK will first load (`~/.openpai/defaults.yaml`), and then update them with the contents in `.openpai/defaults.yaml` in your current working directory. In every command requires a `--workspace, -w` option but no value defined, the default value would be used. - -Some commonly used default variables includes - -- `cluster-alias=` -- `image=` -- `workspace=` -- `sdk-branch=` which branch to use when install the sdk in job container - -### How to install a different version of SDK - -User could easily switch to another version of SDK both in local environment and in job container. In local environment, user just change `` to another branch (e.g. `pai-0.14.y` for `OpenPAI` end-June release or a feature developing branch for the canary version). - -```bash -pip install -U "git+https://github.com/Microsoft/pai@#egg=openpaisdk&subdirectory=contrib/python-sdk" -``` - -To debug a local update, just use `pip install -U your/path/to/setup.py`. - -For jobs submitted by the SDK or command line tool, the version specified by `opai set sdk-branch=` would be used firstly. If not specified, `master` branch will be used. - -### How to specify the `python` environment I want to use in the job container - -In some cases, there are more than one `python` environments in a docker image. For example, there are both `python` and `python3` environments in `openpai/pai.example.keras.tensorflow`. User could add `--python ` (e.g. `--python python3`) in the command `job notebook` or `job sub` to use the specific `python` environment. Refer to [notebook example](examples/1-submit-and-query-via-command-line.ipynb) for more details. - -# Python binding - -## Cluster management - -- [x] User can describe a cluster with `openpaisdk.core.ClusterList` class to describe multiple clusters - -```python -clusters = ClusterList().load() # defaultly loaded from "~/.openpai/clusters.yaml" -``` - -User `add`, `delete` methods to update clusters, `select` and `get_client` methods to select one from multiple clusters - -- [x] the `Cluster` class has methods to query and submit jobs - -```python -client = clusters.get_client(alias) -client.jobs(name) -client.rest_api_submit(job_config) -``` - -- [x] the `Cluster` class has methods to access storage (through `WebHDFS` only for this version) - -```python -Cluster(...).storage.upload/download(...) -``` - -## Job management - -- [x] User can describe a job with `openpaisdk.core.Job` class, which is compatible with the v2 protocol - -```python -job = Job(name) -job.submit(cluster_alias) # submit current job to a cluster -``` - -- [x] provide some quick template of simple jobs - -```python -job.one_liner(...) # generate job config from a command -job.from_notebook(...) # turn notebook to job -``` - -# Make contributions - -User may open issues and feature requests on [Github](https://github.com/microsoft/pai). - -## Release plan - -If there are functions requests not included, please open an issue for feature request. - -## Debug the SDK - -For users those want to improve the functions themselves, you may create the branch of `OpenPAI` project, and make modifications locally. And then set your own branch to the SDK installation source by - -```bash -opai set sdk-branch= -``` - -Then the `pip install` command in the job container would use `` . User may check the generated job config to check. - -To set the internal logger to debug level, create an empty file `.openpai/debug_enable` to let sdk enable debugging logging. And remove the empty file make it work normally. - -## Unit tests - -Please execute below command under the `tests` directory to have a quick unit test. - -```bash -python -m unittest discover -``` \ No newline at end of file diff --git a/contrib/python-sdk/docs/command-line-references.md b/contrib/python-sdk/docs/command-line-references.md deleted file mode 100644 index 243836df4d..0000000000 --- a/contrib/python-sdk/docs/command-line-references.md +++ /dev/null @@ -1,149 +0,0 @@ -# 1. Get started - -This section will give guidance about installation, cluster management and setting up the variables frequently used. Refer to README for more details. - -## 1.1. Installation - -Refer to [README](../README.md#21-Installation) for how to install the sdk and specify your cluster information. - -## 1.2. Set default values - -It is annoying that specify some arguments every time, (e.g. `-a ` or `-i `). During the workflow, user may often reference some variables without changing. For example, it is usually to use the same docker image for multiple jobs, and the storage root doesn't change either. To simplify, it is suggested setting them by `default` command, which would be stored in `.opanpai/defaults.json` in current working directory. - -```bash -opai set [= [= [...]]] -opai unset [ [...]] -``` - -Here are some frequently used variables. - -| Variable | Description | -| -- | -- | -| `cluster-alias` | the alias to select which cluster to connect | -| `image` | docker image name (and tag) to use | -| `workspace` | the root path in remote storage to store job information (`/jobs/`) | - -_Note: some required arguments in below examples are set in defaults (and ignored in the examples), please refer to `help` information by `-h` or `--help`_ - -# 2. CLI tools - -The command line tool `opai` provides several useful subcommands. - -| Scene | Action | Description | -| -- | -- | -- | -| `cluster` | `list` | cluster configuration management | -| `storage` | `list`, `status`, `upload`, `download`, `delete` | remote storage access | -| `job` | `list`, `new`, `submit`, `sub` | query, create and summit a job | -| `task` | `add` | add a task role to a job | -| `require` | `pip`, `weblink` | add requirements (prerequisites) to a job or task role | -| `runtime` | `execute` | python SDK run as the runtime | - -## 2.1. Query your existing jobs - -By executing below commands, all your existing job names would be displayed. - -```bash -opai job list [-a ] [] [{config,ssh}] -``` - -## 2.2. Submit a job with an existing config file - -Of course, you could submit a job from a job config `Json` file by - -```bash -opai job submit [-a ] --config -``` - -## 2.3. Submit a job step by step from sketch up - -To submit a job from sketch, user need to `create` the job (it would be cached in `.openpai/jobs/`). Then task roles could be added by `task` command one by one, and `submit` commond would dump the job config to `.openpai/jobs//config.json` and submit it through `REST` API. - -```bash -opai job new [-a ] -j [-i ] [-s ] -opai task -t [-n ] [--gpu ] [--cpu ] [--mem ] python ... -opai task -t [-n ] [--gpu ] [--cpu ] [--mem ] python ... -opai job submit [--preview] -``` - -## 2.4. Add requirements (prerequisites) - -It is common scenarios that users would prepare their environments by add requirements, such as installing python packages, mapping data storages. The prerequisites can apply to a specific task role (if both `--job-name, -j` and `--task-role-name, -t` specified) or to all task roles in the job (if only `--job-name` specified). - -```bash -opai require pip ... -opai require weblink http://x.x.x.x/filename.zip /data -``` - -In the above command, user can specify `--job-name ` (required) and `--task-role-name ` (optional). If task role name is specified, the command only applies to the specific task role, otherwise, it is for the job (all task roles). - -Now we support - -- python `pip` packages -- data mapping with weblink - -## 2.5. Submit one-line job in command line - -For the jobs that are simple (e.g. with only one task role), the CLI tool provides a shortcut to combine create, task and submit into only one command `sub`. - -If your job only has one task role and its command looks like `python script.py arg1 arg2`, you may submit it in a simplest way like - -```bash -opai job sub -j [-a ] [-i ] python script.py arg1 arg2 -``` - -## 2.6. _InProgress_ Job management and fetching outputs - -The SDK provides simple job management based folder structure on _remote_ storage. It is recommended to upload user logging or results to the output directory. - - -```bash -workspace (remote storage) - └─jobs - └─job-name-1 - ├─code - └─output - └─job-name-2 - ├─code - └─output -``` -| -The `workspace` and output directory path would be passed to job container by `PAI_SDK_JOB_WORKSPACE` and `PAI_SDK_JOB_OUTPUT_DIR`. - -User can use below commands to fetch the outputs. - -```bash -opai output list [-j ] -opai output download [-j ] [ [...]] -opai output peek [-j ] [--stdout] [--stdin] [--save ] -``` - -## 2.7. Storage access - -```bash -opai storage list -opai storage delete -opai storage status -opai storage upload [--overwrite] -opai storage download -``` - -The `HDFS` accessing is implemented by the package `hdfs`, the backend of which is through `webHDFS` API. - -## 2.8. _InProgress_ Job cloning and batch submitting - -The advanced function like job cloning has been proven to be very useful. User can clone from a local job config file or an existing job name. And user may change some parameters (nested in dictionary path joined by `::`) to a new value. - -```bash -opai job clone --from -j = [...] -``` - -It is natural to try submitting multiple jobs with only small changes in the config. - -```python -from subprocess import check_call -# base job -check_call(f'opai job sub -j base_job --env LR=0.001 python train.py $LR'.split()) -# batch submit -for lr in ["0.005", "0.01"]: - check_call(f'opai job clone --from base_job -j bj_lr_{lr} jobEnvs::LR={lr}'.split()) -``` \ No newline at end of file diff --git a/contrib/python-sdk/docs/command-line-references_zh_CN.md b/contrib/python-sdk/docs/command-line-references_zh_CN.md deleted file mode 100644 index f4a8e1b4a0..0000000000 --- a/contrib/python-sdk/docs/command-line-references_zh_CN.md +++ /dev/null @@ -1,148 +0,0 @@ -# 1. Get started - -This section will give guidance about installation, cluster management and setting up the variables frequently used. Refer to README for more details. - -## 1.1. Installation - -Refer to [README](../README.md#21-Installation) for how to install the sdk and specify your cluster information. - -## 1.2. Set default values - -It is annoying that specify some arguments every time, (e.g. `-a ` or `-i `). During the workflow, user may often reference some variables without changing. For example, it is usually to use the same docker image for multiple jobs, and the storage root doesn't change either. To simplify, it is suggested setting them by `default` command, which would be stored in `.opanpai/defaults.json` in current working directory. - -```bash -opai set [= [= [...]]] -opai unset [ [...]] -``` - -Here are some frequently used variables. - -| Variable | Description | -| --------------- | ---------------------------------------------------------------------------------------------------- | -| `cluster-alias` | the alias to select which cluster to connect | -| `image` | docker image name (and tag) to use | -| `workspace` | the root path in remote storage to store job information (`/jobs/`) | - -_Note: some required arguments in below examples are set in defaults (and ignored in the examples), please refer to `help` information by `-h` or `--help`_ - -# 2. CLI tools - -The command line tool `opai` provides several useful subcommands. - -| Scene | Action | Description | -| --------- | ------------------------------------------------ | ------------------------------------------------------ | -| `cluster` | `list` | cluster configuration management | -| `storage` | `list`, `status`, `upload`, `download`, `delete` | remote storage access | -| `job` | `list`, `new`, `submit`, `sub` | query, create and summit a job | -| `task` | `add` | add a task role to a job | -| `require` | `pip`, `weblink` | add requirements (prerequisites) to a job or task role | -| `runtime` | `execute` | python SDK run as the runtime | - -## 2.1. Query your existing jobs - -By executing below commands, all your existing job names would be displayed. - -```bash -opai job list [-a ] [] [{config,ssh}] -``` - -## 2.2. Submit a job with an existing config file - -Of course, you could submit a job from a job config `Json` file by - -```bash -opai job submit [-a ] --config -``` - -## 2.3. Submit a job step by step from sketch up - -To submit a job from sketch, user need to `create` the job (it would be cached in `.openpai/jobs/`). Then task roles could be added by `task` command one by one, and `submit` commond would dump the job config to `.openpai/jobs//config.json` and submit it through `REST` API. - -```bash -opai job new [-a ] -j [-i ] [-s ] -opai task -t [-n ] [--gpu ] [--cpu ] [--mem ] python ... -opai task -t [-n ] [--gpu ] [--cpu ] [--mem ] python ... -opai job submit [--preview] -``` - -## 2.4. Add requirements (prerequisites) - -It is common scenarios that users would prepare their environments by add requirements, such as installing python packages, mapping data storages. The prerequisites can apply to a specific task role (if both `--job-name, -j` and `--task-role-name, -t` specified) or to all task roles in the job (if only `--job-name` specified). - -```bash -opai require pip ... -opai require weblink http://x.x.x.x/filename.zip /data -``` - -In the above command, user can specify `--job-name ` (required) and `--task-role-name ` (optional). If task role name is specified, the command only applies to the specific task role, otherwise, it is for the job (all task roles). - -Now we support - -- python `pip` packages -- data mapping with weblink - -## 2.5. Submit one-line job in command line - -For the jobs that are simple (e.g. with only one task role), the CLI tool provides a shortcut to combine create, task and submit into only one command `sub`. - -If your job only has one task role and its command looks like `python script.py arg1 arg2`, you may submit it in a simplest way like - -```bash -opai job sub -j [-a ] [-i ] python script.py arg1 arg2 -``` - -## 2.6. *InProgress* Job management and fetching outputs - -The SDK provides simple job management based folder structure on *remote* storage. It is recommended to upload user logging or results to the output directory. - -```bash -workspace (remote storage) - └─jobs - └─job-name-1 - ├─code - └─output - └─job-name-2 - ├─code - └─output -``` - -| The `workspace` and output directory path would be passed to job container by `PAI_SDK_JOB_WORKSPACE` and `PAI_SDK_JOB_OUTPUT_DIR`. - -User can use below commands to fetch the outputs. - -```bash -opai output list [-j ] -opai output download [-j ] [ [...]] -opai output peek [-j ] [--stdout] [--stdin] [--save ] -``` - -## 2.7. Storage access - -```bash -opai storage list -opai storage delete -opai storage status -opai storage upload [--overwrite] -opai storage download -``` - -The `HDFS` accessing is implemented by the package `hdfs`, the backend of which is through `webHDFS` API. - -## 2.8. *InProgress* Job cloning and batch submitting - -The advanced function like job cloning has been proven to be very useful. User can clone from a local job config file or an existing job name. And user may change some parameters (nested in dictionary path joined by `::`) to a new value. - -```bash -opai job clone --from -j = [...] -``` - -It is natural to try submitting multiple jobs with only small changes in the config. - -```python -from subprocess import check_call -# base job -check_call(f'opai job sub -j base_job --env LR=0.001 python train.py $LR'.split()) -# batch submit -for lr in ["0.005", "0.01"]: - check_call(f'opai job clone --from base_job -j bj_lr_{lr} jobEnvs::LR={lr}'.split()) -``` \ No newline at end of file diff --git a/contrib/python-sdk/docs/medias/programming_model.md b/contrib/python-sdk/docs/medias/programming_model.md deleted file mode 100644 index 427b34e2e7..0000000000 --- a/contrib/python-sdk/docs/medias/programming_model.md +++ /dev/null @@ -1,18 +0,0 @@ -```mermaid -sequenceDiagram - participant FE as Front End or Plugins - participant Launcher as OpenPAI Core - participant RT as Runtime (in container) - Note left of FE: User - FE->>FE: prepare data & codes * - FE->>Launcher: submit a job * - Launcher->>+RT: pass info through Protocol - Note right of RT: parse protocol * - Note over RT, Storage: access data (if any) * - Note right of RT: execute cmds * - Note right of RT: callbacks * - RT->>Storage: save annotated files * - RT->>-Launcher: exit container - FE->>Launcher: query job info * - FE->>Storage: fetch job outputs * -``` \ No newline at end of file diff --git a/contrib/python-sdk/docs/medias/programming_model.svg b/contrib/python-sdk/docs/medias/programming_model.svg deleted file mode 100644 index 651b0ee23a..0000000000 --- a/contrib/python-sdk/docs/medias/programming_model.svg +++ /dev/null @@ -1,360 +0,0 @@ -Front End or PluginsOpenPAI CoreRuntime (in container)StorageUserprepare data & codes *submit a job *pass info through Protocolparse protocol *access data (if any) *execute cmds *callbacks *save annotated files *exit containerquery job info *fetch job outputs *Front End or PluginsOpenPAI CoreRuntime (in container)Storage \ No newline at end of file diff --git a/contrib/python-sdk/docs/medias/programming_model_zh_CN.md b/contrib/python-sdk/docs/medias/programming_model_zh_CN.md deleted file mode 100644 index 427b34e2e7..0000000000 --- a/contrib/python-sdk/docs/medias/programming_model_zh_CN.md +++ /dev/null @@ -1,18 +0,0 @@ -```mermaid -sequenceDiagram - participant FE as Front End or Plugins - participant Launcher as OpenPAI Core - participant RT as Runtime (in container) - Note left of FE: User - FE->>FE: prepare data & codes * - FE->>Launcher: submit a job * - Launcher->>+RT: pass info through Protocol - Note right of RT: parse protocol * - Note over RT, Storage: access data (if any) * - Note right of RT: execute cmds * - Note right of RT: callbacks * - RT->>Storage: save annotated files * - RT->>-Launcher: exit container - FE->>Launcher: query job info * - FE->>Storage: fetch job outputs * -``` \ No newline at end of file diff --git a/contrib/python-sdk/docs/python-binding-references.md b/contrib/python-sdk/docs/python-binding-references.md deleted file mode 100644 index d18c7bac94..0000000000 --- a/contrib/python-sdk/docs/python-binding-references.md +++ /dev/null @@ -1,61 +0,0 @@ -# 1. Python binding - -After installing the SDK, there is a package named `openpaisdk` that can be imported in python code. Here are some classes being frequently used. - -```python -from openpaisdk.core import Client # OpenPAI client -from openpaisdk.job import Job # job description -from openpaisdk.command_line import Engine # command dispatcher -``` - -## 1.1. Detect your execution environment - -In your code, you may use `openpaisdk.core.in_job_container` to indicate where you are. This let you to do different things according to your environment. - -```python -from openpaisdk.core import in_job_container -# help(in_job_container) for more details -if in_job_container(): - pass -else: - pass -``` - -This function is implemented by checking whether some environmental variable (e.g. `PAI_CONTAINER_ID` is set to a non-empty value). - -## 1.2. Do it in easy way - -To unify the interface and simplifying user's learning cost, user can do whatever CLI provides in their python code in a similar way by calling `Engine`. For example, the following lines query all existing jobs submitted by current user in cluster named `your-alias`. - -```python -from openpaisdk.command_line import Engine - -job_name_list = Engine().process(['job', 'list', '--name', '-a', 'your-alias']) -``` - -The advantages of this way over using `os.system()` or `subprocess.check_call` lies in (a) avoid overhead and (b) get the structued result (no need to parsing the text output). And this way can guarantee the consistency between CLI and python binding. - -## 1.3. Do it in a more pythoic way - -Since someone may not like above solution, of course, user can use the code snippets behind CLI. Here is the code to do the same thing. - -```python -from openpaisdk.core import Client -from openpaisdk import __cluster_config_file__ - -client, _ = Client.from_json(__cluster_config_file__, 'your-alias') -job_name_list = client.jobs(name_only=True) -``` - -## 1.4. Submit your working notebook running in local server - -If you are working in your local `Jupyter` notebook, add below cell and execute it would submit a job. - -```python -from openpaisdk.notebook import submit_notebook -from openpaisdk.core import in_job_container -# help(submit_notebook) for more details -if not in_job_container(): - job_link = submit_notebook() - print(job_link) -``` diff --git a/contrib/python-sdk/docs/python-binding-references_zh_CN.md b/contrib/python-sdk/docs/python-binding-references_zh_CN.md deleted file mode 100644 index 6d9c59f892..0000000000 --- a/contrib/python-sdk/docs/python-binding-references_zh_CN.md +++ /dev/null @@ -1,61 +0,0 @@ -# 1. Python binding - -After installing the SDK, there is a package named `openpaisdk` that can be imported in python code. Here are some classes being frequently used. - -```python -from openpaisdk.core import Client # OpenPAI client -from openpaisdk.job import Job # job description -from openpaisdk.command_line import Engine # command dispatcher -``` - -## 1.1. Detect your execution environment - -In your code, you may use `openpaisdk.core.in_job_container` to indicate where you are. This let you to do different things according to your environment. - -```python -from openpaisdk.core import in_job_container -# help(in_job_container) for more details -if in_job_container(): - pass -else: - pass -``` - -This function is implemented by checking whether some environmental variable (e.g. `PAI_CONTAINER_ID` is set to a non-empty value). - -## 1.2. Do it in easy way - -To unify the interface and simplifying user's learning cost, user can do whatever CLI provides in their python code in a similar way by calling `Engine`. For example, the following lines query all existing jobs submitted by current user in cluster named `your-alias`. - -```python -from openpaisdk.command_line import Engine - -job_name_list = Engine().process(['job', 'list', '--name', '-a', 'your-alias']) -``` - -The advantages of this way over using `os.system()` or `subprocess.check_call` lies in (a) avoid overhead and (b) get the structued result (no need to parsing the text output). And this way can guarantee the consistency between CLI and python binding. - -## 1.3. Do it in a more pythoic way - -Since someone may not like above solution, of course, user can use the code snippets behind CLI. Here is the code to do the same thing. - -```python -from openpaisdk.core import Client -from openpaisdk import __cluster_config_file__ - -client, _ = Client.from_json(__cluster_config_file__, 'your-alias') -job_name_list = client.jobs(name_only=True) -``` - -## 1.4. Submit your working notebook running in local server - -If you are working in your local `Jupyter` notebook, add below cell and execute it would submit a job. - -```python -from openpaisdk.notebook import submit_notebook -from openpaisdk.core import in_job_container -# help(submit_notebook) for more details -if not in_job_container(): - job_link = submit_notebook() - print(job_link) -``` \ No newline at end of file diff --git a/contrib/python-sdk/docs/runtime-references.md b/contrib/python-sdk/docs/runtime-references.md deleted file mode 100644 index 725d29af10..0000000000 --- a/contrib/python-sdk/docs/runtime-references.md +++ /dev/null @@ -1,62 +0,0 @@ -# 1. _ToDiscuss_ Python SDK as a runtime - -When submitting a job through the SDK (CLI or python binding), the SDK would be isntalled inside the job container automatically by default (turn off by adding `--disable-sdk-install` in `job create`). - -## 1.1. Reconstruct the client in job container - -The SDK has passed necessary information to job container through the `__clusters__` and `__defaults__` items of the `extras` part in job config file, and the `runtime` command will save them to `~/.openpai/clusters.json` and `.opanpai/defaults.json` respectively. - -## 1.2. User can customize callbacks before or after the command executation - -This is similar to the pre- or post- commands in protocol v2. - -## 1.3. User can customize callbacks when exception raised - -This is for debugging. - -## 1.4. Implementation - -An ideal implementation is SDK provides some decorators for registering callbacks. Here is an example. - -```python -# original codes -... - -def main(args): - ... - -if __name__ == "__main__": - ... - result = main(args) - ... -``` - -After customizing callbacks, it may look like - -```python -# for openpai - -from openpai.runtime import Runtime - -app = Runtime.from_env() - -@app.on('start') -def pre_commands(...): # if not defined, use that generated from job config - ... - -@app.on('end') -def post_commands(...): # if not defined, use that generated from job config - ... - -@app.on('main') -def main(args): - ... - -if __name__ == "__main__": - ... - result = app.run(args) - ... - -``` - -_Note: the RunTime may only be triggered when in_job_container() is true, or some user-defined conditions_ diff --git a/contrib/python-sdk/docs/runtime-references_zh_CN.md b/contrib/python-sdk/docs/runtime-references_zh_CN.md deleted file mode 100644 index 03ae3a38f6..0000000000 --- a/contrib/python-sdk/docs/runtime-references_zh_CN.md +++ /dev/null @@ -1,62 +0,0 @@ -# 1. *ToDiscuss* Python SDK as a runtime - -When submitting a job through the SDK (CLI or python binding), the SDK would be isntalled inside the job container automatically by default (turn off by adding `--disable-sdk-install` in `job create`). - -## 1.1. Reconstruct the client in job container - -The SDK has passed necessary information to job container through the `__clusters__` and `__defaults__` items of the `extras` part in job config file, and the `runtime` command will save them to `~/.openpai/clusters.json` and `.opanpai/defaults.json` respectively. - -## 1.2. User can customize callbacks before or after the command executation - -This is similar to the pre- or post- commands in protocol v2. - -## 1.3. User can customize callbacks when exception raised - -This is for debugging. - -## 1.4. Implementation - -An ideal implementation is SDK provides some decorators for registering callbacks. Here is an example. - -```python -# original codes -... - -def main(args): - ... - -if __name__ == "__main__": - ... - result = main(args) - ... -``` - -After customizing callbacks, it may look like - -```python -# for openpai - -from openpai.runtime import Runtime - -app = Runtime.from_env() - -@app.on('start') -def pre_commands(...): # if not defined, use that generated from job config - ... - -@app.on('end') -def post_commands(...): # if not defined, use that generated from job config - ... - -@app.on('main') -def main(args): - ... - -if __name__ == "__main__": - ... - result = app.run(args) - ... - -``` - -*Note: the RunTime may only be triggered when in_job_container() is true, or some user-defined conditions* \ No newline at end of file diff --git a/contrib/python-sdk/docs/scenarios-and-user-stories.md b/contrib/python-sdk/docs/scenarios-and-user-stories.md deleted file mode 100644 index 09d39c3458..0000000000 --- a/contrib/python-sdk/docs/scenarios-and-user-stories.md +++ /dev/null @@ -1,66 +0,0 @@ -# 1. Benefits and scenarios - -## 1.1. Easily accessible `OpenPAI` interface - -- **User can easily access `OpenPAI` resources in scripts (`Python` or `Shell`) and `Jupyter` notebooks** - -The SDK provides classes to describe the clusters (`openpaisdk.core.Cluster`) and jobs (`openpaisdk.job.Job`). The Cluster class wraps necessary REST apis for convenient operations. The Job class is an implementation of the [protocol](https://github.com/microsoft/openpai-protocol/blob/master/schemas/v2/schema.yaml), with which user can easily organize (add or edit) the content of job `yaml` and `json` configuration. - -Besides the wrapping of APIs, the SDK also provides functions to facilitate user to utilize `OpenPAI`. Such functions includes *cluster management*, *storage accessing*, *execution environment detection (local or in a job container)*. - -_Refer to [this doc]() for more details of Python binding_ - -- **User can submit and list jobs by simple commands** - -This SDK provides a command line interface with prefix (`opai`). User can complete basic and advanced operations in simple commands, e.g. - -```bash -# query jobs -opai job list -# submit an existing job config file -opai job submit --config your/job/config/file -# submit a job in one line -opai job sub --image your/docker/image --gpu 1 some/commands -# storage access -opai storage upload/download/list ... -``` - -_Refer to [command-line-references.md](command-line-references.md) or execute `opai -h` for more details about the command line interface_ - -- **User can easily accomplish complicated operations with `OpenPAI`** - -For some advanced users or tools running on `OpenPAI` (e.g. [NNI]()), it is quite convenient to provide a way to let user can complete operations. For example, user can submit tens of jobs to optimize a parameter in a simple `for-loop`, however, it is not so convenient if users have to do it manually. - -- **User can easily reuse local codes** - -`OpenPAI` is quite efficient in utilizing powerful computing resources to run deep learning jobs. However, user have to make their codes and environment ready first. One of the common way is to start a long-running interactive job and write (debug) codes in it before really execution. There are two disadvantages, one is the inconvenience of remoting debugging, the other is the wasting of computing resources. - -The SDK aims to solve the problem, by letting user codes locally and executes on `OpenPAI`. For example, user can code and debug in a local running notebook first, and use `openpaisdk.notebook.submit_notebook` to turn it to a jobs with only a few lines. - -## 1.2. Powerful runtime support - -By installing this package in the docker container, the SDK can run as part of the runtime - -- **It can provide more powerful built-in functions than `pre-commands` and `post-commands`** - -The current `OpenPAI` leverages pre-commands and post-commands to do necessary operations before or after user commands. However, it is limited by the representation capability of shell commands. It would be quite hard to specify complicated behaviors. For examples, some operations (e.g. storage mounting) requires conditional operations according to OS versions. It is hard to implement in pre-commands, however, easy to do by a function in SDK. - -- **It provide basic job management based on workspace and job folder structure** - -For jobs submitted by the SDK (or CLI), a storage structure will be constructed for it. The SDK will create `code` and `output` (or others if required) directory in `/jobs/`. The SDK or CLI also provides interfaces to access them. - -- **It can let user annotate output files to be saved before exiting the container** - -User can annotate some files (or folders) to be uploaded during submitting the job. - -- **It can provide a mechanism to execute certain callbacks at specified scenarios** - -We provide pre- and post- commands in current implementation, however, the SDK would try to let user specify behaviors at other cases. For example, user can specify what to do if user commands have a non-zero exit return code. - -## 1.3. Unified workflow - -In the new implementation, the [job protocol]() would bridge user specification and the real execution of the job. The SDK is one of the implementations of the protocol, which includes functions to organize, edit, parse and execute the protocol as user's expectation. - -![program model](C:/Users/yuqyang.FAREAST/Workings/pai/contrib/python-sdk/docs/medias/programming_model.svg) - -_*: the functions provided by the SDK or CLI_ \ No newline at end of file diff --git a/contrib/python-sdk/docs/scenarios-and-user-stories_zh_CN.md b/contrib/python-sdk/docs/scenarios-and-user-stories_zh_CN.md deleted file mode 100644 index ff935b51d5..0000000000 --- a/contrib/python-sdk/docs/scenarios-and-user-stories_zh_CN.md +++ /dev/null @@ -1,66 +0,0 @@ -# 1. Benefits and scenarios - -## 1.1. Easily accessible `OpenPAI` interface - -- **User can easily access `OpenPAI` resources in scripts (`Python` or `Shell`) and `Jupyter` notebooks** - -The SDK provides classes to describe the clusters (`openpaisdk.core.Cluster`) and jobs (`openpaisdk.job.Job`). The Cluster class wraps necessary REST apis for convenient operations. The Job class is an implementation of the [protocol](https://github.com/microsoft/openpai-protocol/blob/master/schemas/v2/schema.yaml), with which user can easily organize (add or edit) the content of job `yaml` and `json` configuration. - -Besides the wrapping of APIs, the SDK also provides functions to facilitate user to utilize `OpenPAI`. Such functions includes *cluster management*, *storage accessing*, *execution environment detection (local or in a job container)*. - -*Refer to [this doc]() for more details of Python binding* - -- **User can submit and list jobs by simple commands** - -This SDK provides a command line interface with prefix (`opai`). User can complete basic and advanced operations in simple commands, e.g. - -```bash -# query jobs -opai job list -# submit an existing job config file -opai job submit --config your/job/config/file -# submit a job in one line -opai job sub --image your/docker/image --gpu 1 some/commands -# storage access -opai storage upload/download/list ... -``` - -*Refer to or execute `opai -h` for more details about the command line interface* - -- **User can easily accomplish complicated operations with `OpenPAI`** - -For some advanced users or tools running on `OpenPAI` (e.g. [NNI]()), it is quite convenient to provide a way to let user can complete operations. For example, user can submit tens of jobs to optimize a parameter in a simple `for-loop`, however, it is not so convenient if users have to do it manually. - -- **User can easily reuse local codes** - -`OpenPAI` is quite efficient in utilizing powerful computing resources to run deep learning jobs. However, user have to make their codes and environment ready first. One of the common way is to start a long-running interactive job and write (debug) codes in it before really execution. There are two disadvantages, one is the inconvenience of remoting debugging, the other is the wasting of computing resources. - -The SDK aims to solve the problem, by letting user codes locally and executes on `OpenPAI`. For example, user can code and debug in a local running notebook first, and use `openpaisdk.notebook.submit_notebook` to turn it to a jobs with only a few lines. - -## 1.2. Powerful runtime support - -By installing this package in the docker container, the SDK can run as part of the runtime - -- **It can provide more powerful built-in functions than `pre-commands` and `post-commands`** - -The current `OpenPAI` leverages pre-commands and post-commands to do necessary operations before or after user commands. However, it is limited by the representation capability of shell commands. It would be quite hard to specify complicated behaviors. For examples, some operations (e.g. storage mounting) requires conditional operations according to OS versions. It is hard to implement in pre-commands, however, easy to do by a function in SDK. - -- **It provide basic job management based on workspace and job folder structure** - -For jobs submitted by the SDK (or CLI), a storage structure will be constructed for it. The SDK will create `code` and `output` (or others if required) directory in `/jobs/`. The SDK or CLI also provides interfaces to access them. - -- **It can let user annotate output files to be saved before exiting the container** - -User can annotate some files (or folders) to be uploaded during submitting the job. - -- **It can provide a mechanism to execute certain callbacks at specified scenarios** - -We provide pre- and post- commands in current implementation, however, the SDK would try to let user specify behaviors at other cases. For example, user can specify what to do if user commands have a non-zero exit return code. - -## 1.3. Unified workflow - -In the new implementation, the [job protocol]() would bridge user specification and the real execution of the job. The SDK is one of the implementations of the protocol, which includes functions to organize, edit, parse and execute the protocol as user's expectation. - -![program model](C:/Users/yuqyang.FAREAST/Workings/pai/contrib/python-sdk/docs/medias/programming_model.svg) - -**: the functions provided by the SDK or CLI* \ No newline at end of file diff --git a/contrib/python-sdk/examples/0-install-sdk-specify-openpai-cluster.ipynb b/contrib/python-sdk/examples/0-install-sdk-specify-openpai-cluster.ipynb deleted file mode 100644 index 03cffa2ce3..0000000000 --- a/contrib/python-sdk/examples/0-install-sdk-specify-openpai-cluster.ipynb +++ /dev/null @@ -1,113 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Install the SDK\n", - "Refer to the **Installation** part of [README](https://github.com/microsoft/pai/blob/sdk-release-v0.4.00/contrib/python-sdk/README.md)\n", - "\n", - "*Note: now the code in a feature developping branch, will merge to master if stable*\n", - "\n", - "*Note 2: Restarting the kernel may be required to let python load the newly installed package*\n", - "\n", - "After installation, check it." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import openpaisdk\n", - "print(openpaisdk.__version__)\n", - "print(openpaisdk.__container_sdk_branch__)\n", - "print(openpaisdk.get_install_uri())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And also check the command line interface (CLI) tool `opai`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "! opai -h" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sepcify `OpenPAI` cluster information\n", - "Refer to corresponding part of [README](https://github.com/microsoft/pai/blob/sdk-release-v0.4.00/contrib/python-sdk/README.md)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Add a cluster\n", - "User may add a new cluster by `opai cluster add` and attach a hdfs storage for it as below." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "! opai cluster add --cluster-alias cluster-for-test --pai-uri http://x.x.x.x --user myuser --password mypassword\n", - "! opai cluster attach-hdfs --default --cluster-alias cluster-for-test --storage-alias hdfs --web-hdfs-uri http://x.x.x.x:port" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## List your clusters\n", - "User may list all specified clusters by `opai cluster list`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from openpaisdk.command_line import Engine\n", - "\n", - "cluster_cfg = Engine().process(['cluster', 'list'])[\"cluster-for-test\"]\n", - "cluster_cfg" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file diff --git a/contrib/python-sdk/examples/1-submit-and-query-via-command-line.ipynb b/contrib/python-sdk/examples/1-submit-and-query-via-command-line.ipynb deleted file mode 100644 index 21c9690f6b..0000000000 --- a/contrib/python-sdk/examples/1-submit-and-query-via-command-line.ipynb +++ /dev/null @@ -1,192 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Prerequisites\n", - "Install the `OpenPAI` sdk from `github` and specify your cluster information in `~/.openpai/clusters.yaml`. \n", - "\n", - "And for simplicity and security, we recommand user to setup necessary information in `.openpai/defaults.json` other than shown in the example notebook. (Refer to for [README](https://github.com/microsoft/pai/blob/sdk-release-v0.4.00/contrib/python-sdk/README.md) more details.)\n", - "\n", - "_Please make sure you have set default values for ***cluster-alias***. This notebook will not set them explicitly for security and privacy issue_\n", - "\n", - "If not, use below commands to set them\n", - "```bash\n", - "opai set cluster-alias=\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "\n", - "from openpaisdk.command_line import Engine\n", - "from openpaisdk.core import ClusterList, in_job_container\n", - "from uuid import uuid4 as randstr\n", - "\n", - "clusters = Engine().process(['cluster', 'list'])\n", - "default_values = Engine().process(['set'])\n", - "print(default_values)\n", - "\n", - "cluster_alias = default_values[\"cluster-alias\"]\n", - "assert cluster_alias in clusters, \"please specify cluster-alias and workspace\"\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Submit jobs\n", - "\n", - "Now we submit jobs from \n", - "- an existing version 1 job config file\n", - "- an existing version 2 job config file\n", - "- a hello-world command line" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%%writefile mnist_v1.json\n", - "{\n", - " \"jobName\": \"keras_tensorflow_backend_mnist\",\n", - " \"image\": \"openpai/pai.example.keras.tensorflow:stable\",\n", - " \"taskRoles\": [\n", - " {\n", - " \"name\": \"mnist\",\n", - " \"taskNumber\": 1,\n", - " \"cpuNumber\": 4,\n", - " \"memoryMB\": 8192,\n", - " \"gpuNumber\": 1,\n", - " \"command\": \"python mnist_cnn.py\"\n", - " }\n", - " ]\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%%writefile mnist_v2.yaml\n", - "protocolVersion: 2\n", - "name: keras_tensorflow_mnist\n", - "type: job\n", - "version: 1.0\n", - "contributor: OpenPAI\n", - "description: |\n", - " # Keras Tensorflow Backend MNIST Digit Recognition Examples\n", - " Trains a simple convnet on the MNIST dataset.\n", - " Gets to 99.25% test accuracy after 12 epochs\n", - " (there is still a lot of margin for parameter tuning).\n", - " 16 seconds per epoch on a GRID K520 GPU.\n", - "\n", - " Reference https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py\n", - "\n", - "prerequisites:\n", - " - protocolVersion: 2\n", - " name: keras_tensorflow_example\n", - " type: dockerimage\n", - " version: 1.0\n", - " contributor : OpenPAI\n", - " description: |\n", - " This is an [example Keras with TensorFlow backend Docker image on OpenPAI](https://github.com/Microsoft/pai/tree/master/examples/keras).\n", - " uri : openpai/pai.example.keras.tensorflow\n", - "\n", - "taskRoles:\n", - " train:\n", - " instances: 1\n", - " completion:\n", - " minSucceededInstances: 1\n", - " dockerImage: keras_tensorflow_example\n", - " resourcePerInstance:\n", - " cpu: 4\n", - " memoryMB: 8192\n", - " gpu: 1\n", - " commands:\n", - " - python mnist_cnn.py" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tests = [\"submit_v1\", \"submit_v2\", \"sub_oneliner\"]\n", - "jobnames = {k: k + '_' + randstr().hex for k in tests}\n", - "\n", - "options = \"\"\n", - "# options += \" --preview\"\n", - "\n", - "if not in_job_container():\n", - " jobs, cmds = [], []\n", - " \n", - " # submit v1\n", - " jobs.append(\"submit_v1_\" + randstr().hex)\n", - " cmds.append(f'opai job submit {options} --update jobName={jobs[-1]} mnist_v1.json')\n", - "\n", - " # submit v2\n", - " jobs.append(\"submit_v2_\" + randstr().hex)\n", - " cmds.append(f'opai job submit {options} --update name={jobs[-1]} mnist_v2.yaml')\n", - " \n", - " # sub\n", - " jobs.append(\"sub_\" + randstr().hex) \n", - " resource = '-i openpai/pai.example.keras.tensorflow --cpu 4 --memoryMB 8192 --gpu 1'\n", - " cmds.append(f'opai job sub {options} -j {jobs[-1]} {resource} python mnist_cnn.py')\n", - "\n", - " # notebook\n", - " jobs.append(\"notebook_\" + randstr().hex) \n", - " cmds.append(f'opai job notebook {options} -j {jobs[-1]} {resource} --python python3 --pip-installs keras 2-submit-job-from-local-notebook.ipynb')\n", - "\n", - " for cmd in cmds:\n", - " print(cmd, \"\\n\")\n", - " ! {cmd}\n", - " print(\"\\n\")\n", - " \n", - " states = ClusterList().load().get_client(cluster_alias).wait(jobs)\n", - " failed_jobs = [t for i, t in enumerate(jobs) if states[i] != \"SUCCEEDED\"]\n", - " assert not failed_jobs, \"some of jobs fails %s\" % failed_jobs" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/contrib/python-sdk/examples/2-submit-job-from-local-notebook.ipynb b/contrib/python-sdk/examples/2-submit-job-from-local-notebook.ipynb deleted file mode 100644 index bcfe08bfbc..0000000000 --- a/contrib/python-sdk/examples/2-submit-job-from-local-notebook.ipynb +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Keras MNIST CNN example\n", - "\n", - "https://keras.io/examples/mnist_cnn/\n", - "\n", - "Trains a simple convnet on the MNIST dataset.\n", - "\n", - "Gets to 99.25% test accuracy after 12 epochs (there is still a lot of margin for parameter tuning). 16 seconds per epoch on a GRID K520 GPU.\n", - "\n", - "Submit this notebook to openpai by \n", - "\n", - "```bash\n", - "opai job notebook -i openpai/pai.example.keras.tensorflow --cpu 4 --memoryMB 8192 --gpu 1 --python python3 --pip-installs keras 2-submit-job-from-local-notebook.ipynb\n", - " ```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from __future__ import print_function\n", - "import keras\n", - "from keras.datasets import mnist\n", - "from keras.models import Sequential\n", - "from keras.layers import Dense, Dropout, Flatten\n", - "from keras.layers import Conv2D, MaxPooling2D\n", - "from keras import backend as K\n", - "\n", - "batch_size = 128\n", - "num_classes = 10\n", - "epochs = 12\n", - "\n", - "# input image dimensions\n", - "img_rows, img_cols = 28, 28\n", - "\n", - "# the data, split between train and test sets\n", - "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n", - "\n", - "if K.image_data_format() == 'channels_first':\n", - " x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)\n", - " x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)\n", - " input_shape = (1, img_rows, img_cols)\n", - "else:\n", - " x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)\n", - " x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)\n", - " input_shape = (img_rows, img_cols, 1)\n", - "\n", - "x_train = x_train.astype('float32')\n", - "x_test = x_test.astype('float32')\n", - "x_train /= 255\n", - "x_test /= 255\n", - "print('x_train shape:', x_train.shape)\n", - "print(x_train.shape[0], 'train samples')\n", - "print(x_test.shape[0], 'test samples')\n", - "\n", - "# convert class vectors to binary class matrices\n", - "y_train = keras.utils.to_categorical(y_train, num_classes)\n", - "y_test = keras.utils.to_categorical(y_test, num_classes)\n", - "\n", - "model = Sequential()\n", - "model.add(Conv2D(32, kernel_size=(3, 3),\n", - " activation='relu',\n", - " input_shape=input_shape))\n", - "model.add(Conv2D(64, (3, 3), activation='relu'))\n", - "model.add(MaxPooling2D(pool_size=(2, 2)))\n", - "model.add(Dropout(0.25))\n", - "model.add(Flatten())\n", - "model.add(Dense(128, activation='relu'))\n", - "model.add(Dropout(0.5))\n", - "model.add(Dense(num_classes, activation='softmax'))\n", - "\n", - "model.compile(loss=keras.losses.categorical_crossentropy,\n", - " optimizer=keras.optimizers.Adadelta(),\n", - " metrics=['accuracy'])\n", - "\n", - "model.fit(x_train, y_train,\n", - " batch_size=batch_size,\n", - " epochs=epochs,\n", - " verbose=1,\n", - " validation_data=(x_test, y_test))\n", - "score = model.evaluate(x_test, y_test, verbose=0)\n", - "print('Test loss:', score[0])\n", - "print('Test accuracy:', score[1])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/contrib/python-sdk/examples/3-submit-local-notebook-python-binding.ipynb b/contrib/python-sdk/examples/3-submit-local-notebook-python-binding.ipynb deleted file mode 100644 index 3b45194a42..0000000000 --- a/contrib/python-sdk/examples/3-submit-local-notebook-python-binding.ipynb +++ /dev/null @@ -1,185 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "\n", - "from hello import say_hello\n", - "say_hello()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from openpaisdk.notebook import parse_notebook_path, get_notebook_path\n", - "from openpaisdk.core import get_defaults, randstr\n", - "from openpaisdk.io_utils import to_screen\n", - "\n", - "cluster = {\n", - " \"cluster_alias\": get_defaults()[\"cluster-alias\"],\n", - " \"virtual_cluster\": None,\n", - " \"workspace\": get_defaults()[\"workspace\"],\n", - "}\n", - "\n", - "job_name = parse_notebook_path()[0] + '_' + randstr().hex\n", - "\n", - "to_screen(cluster)\n", - "to_screen(job_name)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from openpaisdk.core import Job\n", - "help(Job.from_notebook)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "__nb_ext_custom_cfg__ = {\n", - " \"token\": \"abcdef\", # not to set a int string like 1234\n", - " \"image\": 'ufoym/deepo:pytorch-py36-cu90',\n", - " \"resources\": {\n", - " \"cpu\": 4, \"memoryMB\": 8192, \"gpu\": 0,\n", - " },\n", - " \"sources\": [\"hello.py\"], \n", - " \"pip_installs\": [],\n", - "}\n", - "\n", - "job = Job(job_name).from_notebook(nb_file=get_notebook_path(), cluster=cluster, **__nb_ext_custom_cfg__)\n", - "# to_screen(job.get_config())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "help(Job.submit)\n", - "job.submit(cluster[\"cluster_alias\"], cluster[\"virtual_cluster\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# restore the job from a name and cluster\n", - "job2 = Job(job_name).load(cluster_alias=cluster[\"cluster_alias\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# one time check, return {state:..., notebook:...}\n", - "job2.connect_jupyter()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# wait until notebook url is ready\n", - "help(Job.wait)\n", - "job2.wait(timeout=100)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# to_screen(job2.logs()[\"stderr\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# job2.stop()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - }, - "varInspector": { - "cols": { - "lenName": 16, - "lenType": 16, - "lenVar": 40 - }, - "kernels_config": { - "python": { - "delete_cmd_postfix": "", - "delete_cmd_prefix": "del ", - "library": "var_list.py", - "varRefreshCmd": "print(var_dic_list())" - }, - "r": { - "delete_cmd_postfix": ") ", - "delete_cmd_prefix": "rm(", - "library": "var_list.r", - "varRefreshCmd": "cat(var_dic_list()) " - } - }, - "types_to_exclude": [ - "module", - "function", - "builtin_function_or_method", - "instance", - "_Feature" - ], - "window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file diff --git a/contrib/python-sdk/examples/hello.py b/contrib/python-sdk/examples/hello.py deleted file mode 100644 index 12a5d65d85..0000000000 --- a/contrib/python-sdk/examples/hello.py +++ /dev/null @@ -1,2 +0,0 @@ -def say_hello(): - print("Hello, OpenPAI") diff --git a/contrib/python-sdk/examples/run_all_notebooks.py b/contrib/python-sdk/examples/run_all_notebooks.py deleted file mode 100644 index c6a035d780..0000000000 --- a/contrib/python-sdk/examples/run_all_notebooks.py +++ /dev/null @@ -1,31 +0,0 @@ -import os -import sys -import shutil -from openpaisdk.utils import run_command -from openpaisdk.io_utils import browser_open - - -try: - import nbmerge -except: - run_command([sys.executable, '-m pip install nbmerge']) - -test_notebooks = [ - '0-install-sdk-specify-openpai-cluster.ipynb', - '1-submit-and-query-via-command-line.ipynb', - # '2-submit-job-from-local-notebook.ipynb', -] - -merged_file = "integrated_tests.ipynb" -html_file = os.path.splitext(merged_file)[0] + '.html' -shutil.rmtree(merged_file, ignore_errors=True) -shutil.rmtree(html_file, ignore_errors=True) - -# clear output for committing -for f in test_notebooks: - os.system("jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace %s" % f) - -os.system('nbmerge %s -o %s' % (' '.join(test_notebooks), merged_file)) -os.system('jupyter nbconvert --ExecutePreprocessor.timeout=-1 --ExecutePreprocessor.allow_errors=True --to html --execute %s' % merged_file) - -browser_open(html_file) \ No newline at end of file diff --git a/contrib/python-sdk/openpaisdk/__init__.py b/contrib/python-sdk/openpaisdk/__init__.py deleted file mode 100644 index 82a648414a..0000000000 --- a/contrib/python-sdk/openpaisdk/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -from openpaisdk.flags import __flags__ -from openpaisdk.io_utils import to_screen -from openpaisdk.defaults import get_defaults, update_default, LayeredSettings -from openpaisdk.cluster import ClusterList, Cluster -from openpaisdk.job import Job, JobStatusParser - - -__version__ = '0.4.00' - - -def in_job_container(varname: str = 'PAI_CONTAINER_ID'): - """in_job_container check whether it is inside a job container (by checking environmental variables) - - - Keyword Arguments: - varname {str} -- the variable to test (default: {'PAI_CONTAINER_ID'}) - - Returns: - [bool] -- return True is os.environ[varname] is set - """ - if not os.environ.get(varname, ''): - return False - return True diff --git a/contrib/python-sdk/openpaisdk/cli_arguments.py b/contrib/python-sdk/openpaisdk/cli_arguments.py deleted file mode 100644 index fb57d1b392..0000000000 --- a/contrib/python-sdk/openpaisdk/cli_arguments.py +++ /dev/null @@ -1,93 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -"""This file provides a mechanism to couple a Namespace (argparse) and pai protocol -""" -import argparse -from openpaisdk.defaults import LayeredSettings - - -class ArgumentFactory: - - def __init__(self): - self.factory = dict() - - # deal with predefined defaults - for name, params in LayeredSettings.definitions.items(): - args = ['--' + name] - abbr = params.get('abbreviation', None) - if abbr: # args = ['--{name}', '-{abbr}' or '--{abbr}'] - args += [('-' if len(abbr) == 1 else '--') + abbr] - kwargs = {k: v for k, v in params.items() if k not in ["name", "abbreviation"]} - kwargs["default"] = LayeredSettings.get(name) - self.add_argument(*args, **kwargs) - - # cluster - self.add_argument('cluster_alias', help='cluster alias to select') - - self.add_argument('--pai-uri', help="uri of openpai cluster, in format of http://x.x.x.x") - self.add_argument('--user', help='username') - self.add_argument('--password', help="password") - self.add_argument('--authen-token', '--token', dest='token', help="authentication token") - - self.add_argument('--editor', default="code", help="path to your editor used to open files") - - # job spec - self.add_argument('--job-name', '-j', help='job name') - - self.add_argument('--is-global', '-g', action="store_true", - help="set globally (not limited to current working folder)", default=False) - self.add_argument('--update', '-u', action='append', - help='replace current key-value pairs with new key=value (key1:key2:...=value for nested objects)') - self.add_argument('--preview', action='store_true', help='preview result before doing action') - self.add_argument('--no-browser', action='store_true', help='does not open the job link in web browser') - self.add_argument('--interactive', action='store_true', help='enter the interactive mode after job starts') - self.add_argument('--notebook-token', '--token', dest='token', default="abcd", - help='jupyter notebook authentication token') - self.add_argument("--python", default="python", - help="command or path of python, default is {python}, may be {python3}") - - self.add_argument('--cmd-sep', default="\s*&&\s*", help="command separator, default is (&&)") - self.add_argument('commands', nargs=argparse.REMAINDER, help='shell commands to execute') - - # runtime - self.add_argument('config', nargs='?', help='job config file') - self.add_argument('notebook', nargs='?', help='Jupyter notebook file') - - # storage - self.add_argument('--recursive', action='store_true', default=False, help="recursive target operation") - self.add_argument('--overwrite', action='store_true', default=False, help="enable overwrite if exists") - self.add_argument('local_path', help="local path") - self.add_argument('remote_path', help="remote path") - - def add_argument(self, *args, **kwargs): - self.factory[args[0]] = dict(args=args, kwargs=kwargs) - - def get(self, key): - value = self.factory[key] - return value['args'], value['kwargs'] - - -__arguments_factory__ = ArgumentFactory() - - -def cli_add_arguments(parser: argparse.ArgumentParser, args: list): - for a in args: - args, kwargs = __arguments_factory__.get(a) - # assert parser.conflict_handler == 'resolve', "set conflict_handler to avoid duplicated" - parser.add_argument(*args, **kwargs) diff --git a/contrib/python-sdk/openpaisdk/cli_factory.py b/contrib/python-sdk/openpaisdk/cli_factory.py deleted file mode 100644 index ea36e10010..0000000000 --- a/contrib/python-sdk/openpaisdk/cli_factory.py +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import argparse -from openpaisdk.io_utils import to_screen -from openpaisdk.job import Job -from openpaisdk.cluster import ClusterList - - -class ArgumentError(Exception): - - pass - - -class Action: - - def __init__(self, action: str, help_s: str): - self.action, self.help_s = action, help_s - - def define_arguments(self, parser: argparse.ArgumentParser): - pass - - def check_arguments(self, args): - pass - - def restore(self, args): - pass - - def store(self, args): - pass - - def do_action(self, args): - raise NotImplementedError - - -class ActionFactory(Action): - - def __init__(self, action: str, allowed_actions: dict): - assert action in allowed_actions, ("unsupported action of job", action) - super().__init__(action, allowed_actions[action]) - suffix = action.replace('-', '_') - for attr in ["define_arguments", "check_arguments", "do_action"]: - if hasattr(self, f"{attr}_{suffix}"): - setattr(self, attr, getattr(self, f"{attr}_{suffix}")) - else: - assert attr != "do_action", f"must specify a method named {attr}_{suffix} in {self.__class__.__name__}" - - self.__job__ = Job() - self.__clusters__ = ClusterList() - self.enable_svaing = dict(job=False, clusters=False) - - def restore(self, args): - if getattr(args, 'job_name', None): - self.__job__.load(job_name=args.job_name) - self.__clusters__.load() - return self - - def store(self, args): - if self.enable_svaing["job"]: - self.__job__.save() - if self.enable_svaing["clusters"]: - self.__clusters__.save() - return self - - -class Scene: - - def __init__(self, scene: str, help_s: str, parser: argparse.ArgumentParser, - action_list # type: list[Action] - ): - self.scene, self.help_s = scene, help_s - self.single_action = len(action_list) == 1 and scene == action_list[0].action - if self.single_action: - self.actor = action_list[0] - self.actor.define_arguments(parser) - else: - self.actions, subparsers = dict(), parser.add_subparsers(dest='action', help=help_s) - for a in action_list: - p = subparsers.add_parser(a.action, help=a.help_s) - a.define_arguments(p) - self.actions[a.action] = a - - def process(self, args): - actor = self.actor if self.single_action else self.actions[args.action] - actor.check_arguments(args) - actor.restore(args) - result = actor.do_action(args) - actor.store(args) - return result - - -class EngineFactory: - - def __init__(self, cli_structure): - self.parser = argparse.ArgumentParser( - description='command line interface for OpenPAI', - formatter_class=argparse.ArgumentDefaultsHelpFormatter - ) - subparsers = self.parser.add_subparsers( - dest='scene', - help='openpai cli working scenarios', - ) - self.scenes = dict() - for k, v in cli_structure.items(): - p = subparsers.add_parser(k, help=v[0]) - self.scenes[k] = Scene(k, v[0], p, v[1]) - - def process(self, a: list): - to_screen(f'Received arguments {a}', _type="debug") - args = self.parser.parse_args(a) - return self.process_args(args) - - def process_args(self, args): - to_screen(f'Parsed arguments {args}', _type="debug") - if not args.scene: - self.parser.print_help() - return - return self.scenes[args.scene].process(args) diff --git a/contrib/python-sdk/openpaisdk/cluster.py b/contrib/python-sdk/openpaisdk/cluster.py deleted file mode 100644 index 1e74b1141c..0000000000 --- a/contrib/python-sdk/openpaisdk/cluster.py +++ /dev/null @@ -1,307 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -from openpaisdk.io_utils import from_file, to_file, to_screen -from openpaisdk.storage import Storage -from openpaisdk.utils import OrganizedList -from openpaisdk.utils import get_response, na, exception_free, RestSrvError, concurrent_map - - -def get_cluster(alias: str, fname: str = None, get_client: bool = True): - """the generalized function call to load cluster - return cluster client if assert get_client else return config""" - if get_client: - return ClusterList().load(fname).get_client(alias) - else: - return ClusterList().load(fname).select(alias) - - -class ClusterList: - """Data structure corresponding to the contents of ~/.openpai/clusters.yaml - We use an OrganizedList to handle the operations to this class - """ - - def __init__(self, clusters: list = None): - self.clusters = OrganizedList(clusters, _key="cluster_alias") if clusters else [] - - def load(self, fname: str = None): - fname = na(fname, self.default_config_file) - self.clusters = OrganizedList(from_file(fname, default=[]), _key="cluster_alias") - return self - - def save(self): - to_file(self.clusters.as_list, self.default_config_file) - - @property - def default_config_file(self): - from openpaisdk.flags import __flags__ - from openpaisdk.defaults import get_defaults - return __flags__.get_cluster_cfg_file(get_defaults()["clusters-in-local"]) - - def tell(self): - return { - a: { - v: dict(GPUs='-', memory='-', vCores='-', uri=cfg["pai_uri"], user=cfg["user"]) for v in cfg["virtual_clusters"] - } for a, cfg in self.clusters.as_dict.items() - } - - def add(self, cluster: dict): - cfg = Cluster().load(**cluster).check().config - self.clusters.add(cfg, replace=True) - return self - - def update_all(self): - for a in self.aliases: - self.add(self.clusters.first(a)) - - def delete(self, alias: str): - return self.clusters.remove(alias) - - def select(self, alias: str): - return self.clusters.first(alias) - - def get_client(self, alias: str): - return Cluster().load(**self.select(alias)) - - def available_resources(self): - """concurrent version to get available resources""" - aliases = self.aliases - ret = concurrent_map(Cluster.available_resources, (self.get_client(a) for a in aliases)) - return {a: r for a, r in zip(aliases, ret) if r is not None} - - @property - def aliases(self): - return [c["cluster_alias"] for c in self.clusters if "cluster_alias" in c] - - @property - def alias(self): - return self.config["cluster_alias"] - - -class Cluster: - """A wrapper of cluster to access the REST APIs""" - - def __init__(self, toke_expiration: int = 3600): - # ! currently sdk will not handle toke refreshing - self.config = {} - self.__token_expire = toke_expiration - self.__token = None - - def load(self, cluster_alias: str = None, pai_uri: str = None, user: str = None, password: str = None, token: str = None, **kwargs): - import re - self.config.update( - cluster_alias=cluster_alias, - pai_uri=pai_uri.strip("/"), - user=user, - password=password, - token=token, - ) - self.config.update( - {k: v for k, v in kwargs.items() if k in ["info", "storages", "virtual_clusters"]} - ) - # validate - assert self.alias, "cluster must have an alias" - assert self.user, "must specify a user name" - assert re.match("^(http|https)://(.*[^/])$", - self.pai_uri), "pai_uri should be a uri in the format of http(s)://x.x.x.x" - return self - - def check(self): - to_screen("try to connect cluster {}".format(self.alias)) - storages = self.rest_api_storages() - for i, s in enumerate(storages): - s.setdefault("storage_alias", s["protocol"] + f'-{i}') - cluster_info = na(self.rest_api_cluster_info(), {}) - if cluster_info.get("authnMethod", "basic") == "OIDC": - assert self.config["token"], "must use authentication token (instead of password) in OIDC mode" - self.config.update( - info=cluster_info, - storages=storages, - virtual_clusters=self.virtual_clusters(), - ) - # ! will check authentication types according to AAD enabled or not - return self - - @property - def alias(self): - return self.config["cluster_alias"] - - @property - def pai_uri(self): - return self.config["pai_uri"].strip("/") - - @property - def user(self): - return self.config["user"] - - @property - def password(self): - return str(self.config["password"]) - - @property - def token(self): - if self.config["token"]: - return str(self.config["token"]) - if not self.__token: - self.__token = self.rest_api_token(self.__token_expire) - return self.__token - - def get_storage(self, alias: str = None): - # ! every cluster should have a builtin storage - for sto in self.config.get("storages", []): - if alias is None or sto["storage_alias"] == alias: - if sto["protocol"] == 'hdfs': - return Storage(protocol='webHDFS', url=sto["webhdfs"], user=sto.get('user', self.user)) - - def get_job_link(self, job_name: str): - return '{}/job-detail.html?username={}&jobName={}'.format(self.pai_uri, self.user, job_name) - - @property - def rest_srv(self): - return '{}/rest-server/api'.format(self.pai_uri) - - # ! for some older version that does not support this API - @exception_free(Exception, None, "Cluster info API is not supported") - def rest_api_cluster_info(self): - "refer to https://github.com/microsoft/pai/pull/3281/" - return get_response('GET', [self.rest_srv, 'v1'], allowed_status=[200]).json() - - def rest_api_storages(self): - # ! currently this is a fake - return [ - { - "protocol": "hdfs", - "webhdfs": f"{self.pai_uri}/webhdfs" - }, - ] - - @exception_free(RestSrvError, None) - def rest_api_job_list(self, user: str = None): - return get_response( - 'GET', [self.rest_srv, 'v1', ('user', user), 'jobs'] - ).json() - - @exception_free(RestSrvError, None) - def rest_api_job_info(self, job_name: str = None, info: str = None, user: str = None): - import json - import yaml - user = self.user if user is None else user - assert info in [None, 'config', 'ssh'], ('unsupported query information', info) - response = get_response( - 'GET', [self.rest_srv, 'v1', 'user', user, 'jobs', job_name, info] - ) - try: - return response.json() - except json.decoder.JSONDecodeError: - return yaml.load(response.text, Loader=yaml.FullLoader) - else: - raise RestSrvError - - @exception_free(Exception, None) - def rest_api_token(self, expiration=3600): - return get_response( - 'POST', [self.rest_srv, 'v1', 'token'], - body={ - 'username': self.user, 'password': self.password, 'expiration': expiration - } - ).json()['token'] - - def rest_api_submit(self, job: dict): - use_v2 = str(job.get("protocolVersion", 1)) == "2" - if use_v2: - import yaml - return get_response( - 'POST', [self.rest_srv, 'v2', 'jobs'], - headers={ - 'Authorization': 'Bearer {}'.format(self.token), - 'Content-Type': 'text/yaml', - }, - body=yaml.dump(job), - allowed_status=[202, 201] - ) - else: - return get_response( - 'POST', [self.rest_srv, 'v1', 'user', self.user, 'jobs'], - headers={ - 'Authorization': 'Bearer {}'.format(self.token), - 'Content-Type': 'application/json', - }, - body=job, - allowed_status=[202, 201] - ) - - @exception_free(RestSrvError, None) - def rest_api_execute_job(self, job_name: str, e_type: str = "STOP"): - assert e_type in ["START", "STOP"], "unsupported execute type {}".format(e_type) - return get_response( - 'PUT', [self.rest_srv, 'v1', 'user', self.user, 'jobs', job_name, 'executionType'], - headers={ - 'Authorization': 'Bearer {}'.format(self.token), - }, - body={ - "value": e_type - }, - allowed_status=[200, 202], - ).json() - - @exception_free(RestSrvError, None) - def rest_api_virtual_clusters(self): - return get_response( - 'GET', [self.rest_srv, 'v1', 'virtual-clusters'], - headers={ - 'Authorization': 'Bearer {}'.format(self.token), - 'Content-Type': 'application/json', - }, - allowed_status=[200] - ).json() - - @exception_free(RestSrvError, None) - def rest_api_user(self, user: str = None): - return get_response( - 'GET', [self.rest_srv, 'v1', 'user', user if user else self.user], - headers={ - 'Authorization': 'Bearer {}'.format(self.token), - }, - ).json() - - def virtual_clusters(self, user_info: dict = None): - user_info = na(user_info, self.rest_api_user()) - assert user_info, f'failed to get user information from {self.alias}' - my_virtual_clusters = user_info["virtualCluster"] - if isinstance(my_virtual_clusters, str): - my_virtual_clusters = my_virtual_clusters.split(",") - return my_virtual_clusters - - def virtual_cluster_available_resources(self): - vc_info = self.rest_api_virtual_clusters() - dic = dict() - for key, vc in vc_info.items(): - if "resourcesTotal" in vc: - used, total = vc["resourcesUsed"], vc["resourcesTotal"] - dic[key] = { - k: max(0, int(total[k] - used[k])) for k in total - } - else: - # return -1 if the REST api not supported - dic[key] = dict(GPUs=-1, memory=-1, vCores=-1) - return dic - - @exception_free(Exception, None) - def available_resources(self): - resources = self.virtual_cluster_available_resources() - return {k: v for k, v in resources.items() if k in self.config["virtual_clusters"]} diff --git a/contrib/python-sdk/openpaisdk/command_line.py b/contrib/python-sdk/openpaisdk/command_line.py deleted file mode 100644 index d622caa01a..0000000000 --- a/contrib/python-sdk/openpaisdk/command_line.py +++ /dev/null @@ -1,428 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import argparse -import os -import sys -from openpaisdk.cli_arguments import cli_add_arguments -from openpaisdk.cli_factory import ActionFactory, EngineFactory -from openpaisdk.defaults import get_defaults, update_default -from openpaisdk.io_utils import browser_open, to_screen -from openpaisdk.utils import Nested, run_command, na, randstr -from openpaisdk.defaults import __flags__ - - -def extract_args(args: argparse.Namespace, get_list: list = None, ignore_list: list = ["scene", "action"]): - if get_list: - return {k: getattr(args, k) for k in get_list} - return {k: v for k, v in vars(args).items() if k not in ignore_list} - - -class ActionFactoryForDefault(ActionFactory): - - def define_arguments(self, parser: argparse.ArgumentParser): - cli_add_arguments(parser, ['--is-global']) - parser.add_argument('contents', nargs='*', help='(variable=value) pair to be set as default') - - def do_action_set(self, args): - import re - if not args.contents: - return get_defaults(False, True, False) if args.is_global else get_defaults(True, True, False) - kv_pairs = [] - for content in args.contents: - m = re.match("^([^=]+?)([\+|\-]*=)([^=]*)$", content) - if m: - kv_pairs.append(m.groups()) - else: - kv_pairs.append((content, '', '')) - for kv_pair in kv_pairs: - assert kv_pair[0] and kv_pair[1] in ["=", "+=", "-="] and kv_pair[2], \ - f"must specify a key=value pair ({kv_pair[0]}, {kv_pair[2]})" - update_default(kv_pair[0], kv_pair[2], is_global=args.is_global) - - def do_action_unset(self, args): - for kv_pair in args.contents: - update_default(kv_pair[0], kv_pair[2], is_global=args.is_global, to_delete=True) - - -class ActionFactoryForCluster(ActionFactory): - - def define_arguments_edit(self, parser): - cli_add_arguments(parser, ["--editor"]) - - def check_arguments_edit(self, args): - assert args.editor, "cannot edit the file without an editor" - - def do_action_edit(self, args): - run_command([args.editor, cluster_cfg_file]) - - def define_arguments_update(self, parser): - pass - - def do_action_update(self, args): - self.enable_svaing["clusters"] = True - return self.__clusters__.update_all() - - def define_arguments_list(self, parser): - cli_add_arguments(parser, []) - - @staticmethod - def tabulate_resources(dic: dict): - to_screen([ - [c, i.get("uri", None), i.get("user", None), v, i["GPUs"], i["vCores"], i["memory"]] for c in dic.keys() for v, i in dic[c].items() - ], _type="table", headers=["cluster", "uri", "user", "virtual-cluster", "GPUs", "vCores", "memory"]) - return dic - - def do_action_list(self, args): - info = self.__clusters__.tell() - ActionFactoryForCluster.tabulate_resources(info) - - def define_arguments_resources(self, parser: argparse.ArgumentParser): - cli_add_arguments(parser, []) - - def do_action_resources(self, args): - r = self.__clusters__.available_resources() - ActionFactoryForCluster.tabulate_resources(r) - - def define_arguments_add(self, parser: argparse.ArgumentParser): - cli_add_arguments( - parser, ['--cluster-alias', '--pai-uri', '--user', '--password', '--authen-token']) - - def check_arguments_add(self, args): - assert args.cluster_alias or args.pai_uri or args.user, "must specify cluster-alias, pai-uri, user" - assert args.password or args.token, "please add an authentication credential, password or token" - - def do_action_add(self, args): - self.enable_svaing["clusters"] = True - self.__clusters__.add(extract_args(args)) - - def define_arguments_delete(self, parser: argparse.ArgumentParser): - cli_add_arguments(parser, ['cluster_alias']) - - def do_action_delete(self, args): - if self.__clusters__.delete(args.cluster_alias): - to_screen("cluster %s deleted" % args.cluster_alias) - return None - - def define_arguments_select(self, parser: argparse.ArgumentParser): - cli_add_arguments(parser, ['--is-global', 'cluster_alias']) - - def check_arguments_select(self, args): - assert args.cluster_alias, "must specify a valid cluster-alias" - - def do_action_select(self, args): - update_default('cluster-alias', args.cluster_alias, - is_global=args.is_global) - - -class ActionFactoryForJob(ActionFactory): - - # basic commands - def define_arguments_list(self, parser: argparse.ArgumentParser): - cli_add_arguments(parser, ['--cluster-alias', '--user']) - - def do_action_list(self, args): - client = self.__clusters__.get_client(args.cluster_alias) - if not args.user: - args.user = client.user - to_screen("if not set, only your job will be listed, user `--user __all__` to list jobs of all users") - if args.user == '__all__': - args.user = None - jobs = client.rest_api_job_list(user=args.user) - return ["%s [%s]" % (j["name"], j.get("state", "UNKNOWN")) for j in jobs] - - def define_arguments_status(self, parser: argparse.ArgumentParser): - cli_add_arguments(parser, ['--cluster-alias', '--user']) - parser.add_argument('job_name', help='job name') - parser.add_argument('query', nargs='?', choices=['config', 'ssh']) - - def check_arguments_status(self, args): - assert args.job_name, "must specify a job name" - - def do_action_status(self, args): - client = self.__clusters__.get_client(args.cluster_alias) - if not args.user: - args.user = client.user - return client.rest_api_job_info(args.job_name, args.query, user=args.user) - - def define_arguments_stop(self, parser: argparse.ArgumentParser): - cli_add_arguments(parser, ['--cluster-alias']) - parser.add_argument('job_names', nargs='+', help='job name') - - def check_arguments_stop(self, args): - assert args.job_names, "must specify a job name" - - def do_action_stop(self, args): - client = self.__clusters__.get_client(args.cluster_alias) - for job_name in args.job_names: - to_screen(client.rest_api_execute_job(job_name, "STOP")) - - def define_arguments_submit(self, parser: argparse.ArgumentParser): - cli_add_arguments( - parser, ['--cluster-alias', '--virtual-cluster', '--preview', '--update', 'config']) - - def check_arguments_submit(self, args): - assert args.config, "please specify a job config file (json or yaml format)" - assert os.path.isfile(args.config), "%s cannot be read" % args.config - - def submit_it(self, args): - if args.preview: - return self.__job__.validate().get_config() - result = self.__job__.submit(args.cluster_alias, args.virtual_cluster) - if "job_link" in result and not getattr(args, 'no_browser', False): - browser_open(result["job_link"]) - return result - - def do_action_submit(self, args): - # key-value pair in --update option would support nested key, e.g. defaults->virtualCluster= - self.__job__.load(fname=args.config) - if args.update: - for s in args.update: - key, value = s.split("=") - Nested(self.__job__.protocol).set(key, value) - return self.submit_it(args) - - def define_essentials(self, parser: argparse.ArgumentParser): - cli_add_arguments(parser, [ - '--job-name', - '--cluster-alias', '--virtual-cluster', '--workspace', # for cluster - '--sources', '--pip-installs', # for sdk_template - '--image', '--cpu', '--gpu', '--mem', "--memoryMB", - '--preview', '--no-browser', - '--python', - ]) - - def check_essentials(self, args): - assert args.cluster_alias, "must specify a cluster" - args.sources = [] if not args.sources else args.sources - args.pip_installs = [] if not args.pip_installs else args.pip_installs - if args.sources: - assert args.workspace, "must specify --workspace if --sources used" - for s in args.sources: - assert os.path.isfile(s), "file %s not found" % s - assert args.image, "must specify a docker image" - if args.job_name: - args.job_name = args.job_name.replace("$", randstr(10)) - - def define_arguments_sub(self, parser: argparse.ArgumentParser): - self.define_essentials(parser) - cli_add_arguments(parser, [ - 'commands' - ]) - - def check_arguments_sub(self, args): - self.check_essentials(args) - - def do_action_sub(self, args): - self.__job__.new(args.job_name).one_liner( - commands=" ".join(args.commands), - image=args.image, - resources=extract_args(args, ["gpu", "cpu", "memoryMB", "mem"]), - cluster=extract_args( - args, ["cluster_alias", "virtual_cluster", "workspace"]), - sources=args.sources, pip_installs=args.pip_installs, - ) - self.__job__.protocol["parameters"]["python_path"] = args.python - return self.submit_it(args) - - def define_arguments_notebook(self, parser: argparse.ArgumentParser): - self.define_essentials(parser) - cli_add_arguments(parser, [ - '--interactive', - '--notebook-token', - 'notebook' - ]) - - def check_arguments_notebook(self, args): - self.check_essentials(args) - assert args.notebook or args.interactive, "must specify a notebook name unless in interactive mode" - if not args.job_name: - assert args.notebook or args.interactive, "must specify a notebook if no job name defined" - args.job_name = os.path.splitext(os.path.basename(args.notebook))[ - 0] + "_" + randstr().hex if args.notebook else "jupyter_server_{}".format(randstr().hex) - if args.interactive and not args.token: - to_screen("no authentication token is set", _type="warn") - - def connect_notebook(self): - result = self.__job__.wait() - if result.get("notebook", None) is not None: - browser_open(result["notebook"]) - return result - - def do_action_notebook(self, args): - self.__job__.new(args.job_name).from_notebook( - nb_file=args.notebook, mode="interactive" if args.interactive else "silent", token=args.token, - image=args.image, - cluster=extract_args( - args, ["cluster_alias", "virtual_cluster", "workspace"]), - resources=extract_args(args, ["gpu", "cpu", "memoryMB", "mem"]), - sources=args.sources, pip_installs=args.pip_installs, - ) - self.__job__.protocol["parameters"]["python_path"] = args.python - result = self.submit_it(args) - if not args.preview: - result.update(na(self.connect_notebook(), {})) - return result - - def define_arguments_connect(self, parser: argparse.ArgumentParser): - cli_add_arguments(parser, ['--cluster-alias']) - parser.add_argument('job_name', help="job name to connect") - - def check_arguments_connect(self, args): - assert args.cluster_alias, "must specify a cluster" - assert args.job_name, "must specify a job name" - - def do_action_connect(self, args): - to_screen("retrieving job config from cluster") - self.__job__.load(job_name=args.job_name, cluster_alias=args.cluster_alias) - return self.connect_notebook() - - -class ActionFactoryForStorage(ActionFactory): - - def define_arguments_list_storage(self, parser: argparse.ArgumentParser): - cli_add_arguments(parser, ['--cluster-alias']) - - def do_action_list_storage(self, args): - return self.__clusters__.select(args.cluster_alias)['storages'] - - def define_arguments_list(self, parser: argparse.ArgumentParser): - cli_add_arguments( - parser, ['--cluster-alias', '--storage-alias', 'remote_path']) - - def do_action_list(self, args): - return self.__clusters__.get_client(args.cluster_alias).get_storage(args.storage_alias).list(args.remote_path) - - def define_arguments_status(self, parser: argparse.ArgumentParser): - cli_add_arguments( - parser, ['--cluster-alias', '--storage-alias', 'remote_path']) - - def do_action_status(self, args): - return self.__clusters__.get_client(args.cluster_alias).get_storage(args.storage_alias).status(args.remote_path) - - def define_arguments_delete(self, parser: argparse.ArgumentParser): - cli_add_arguments( - parser, ['--cluster-alias', '--storage-alias', '--recursive', 'remote_path']) - - def do_action_delete(self, args): - return self.__clusters__.get_client(args.cluster_alias).get_storage(args.storage_alias).delete(args.remote_path, recursive=args.recursive) - - def define_arguments_download(self, parser: argparse.ArgumentParser): - cli_add_arguments( - parser, ['--cluster-alias', '--storage-alias', 'remote_path', 'local_path']) - - def do_action_download(self, args): - return self.__clusters__.get_client(args.cluster_alias).get_storage(args.storage_alias).download(remote_path=args.remote_path, local_path=args.local_path) - - def define_arguments_upload(self, parser: argparse.ArgumentParser): - cli_add_arguments(parser, [ - '--cluster-alias', '--storage-alias', '--overwrite', 'local_path', 'remote_path']) - - def do_action_upload(self, args): - return self.__clusters__.get_client(args.cluster_alias).get_storage(args.storage_alias).upload(remote_path=args.remote_path, local_path=args.local_path, overwrite=getattr(args, "overwrite", False)) - - -cluster_cfg_file = __flags__.get_cluster_cfg_file(get_defaults()["clusters-in-local"]) - - -def generate_cli_structure(is_beta: bool): - cli_s = { - "cluster": { - "help": "cluster management", - "factory": ActionFactoryForCluster, - "actions": { - "list": "list clusters in config file %s" % cluster_cfg_file, - "resources": "report the (available, used, total) resources of the cluster", - "update": "check the healthness of clusters and update the information", - "edit": "edit the config file in your editor %s" % cluster_cfg_file, - "add": "add a cluster to config file %s" % cluster_cfg_file, - "delete": "delete a cluster from config file %s" % cluster_cfg_file, - "select": "select a cluster as default", - } - }, - "job": { - "help": "job operations", - "factory": ActionFactoryForJob, - "actions": { - "list": "list existing jobs", - "status": "query the status of a job", - "stop": "stop the job", - "submit": "submit the job from a config file", - "sub": "generate a config file from commands, and then `submit` it", - "notebook": "run a jupyter notebook remotely", - "connect": "connect to an existing job", - } - }, - "storage": { - "help": "storage operations", - "factory": ActionFactoryForStorage, - "actions": { - "list-storage": "list storage attached to the cluster", - "list": "list items about the remote path", - "status": "get detailed information about remote path", - "upload": "upload", - "download": "download", - "delete": "delete", - } - }, - } - dic = { - key: [ - value["help"], - [value["factory"](x, value["actions"]) - for x in value["actions"].keys()] - ] for key, value in cli_s.items() - } - dic.update({ - "set": [ - "set a (default) variable for cluster and job", [ - ActionFactoryForDefault("set", {"set": ["set"]})] - ], - "unset": [ - "un-set a (default) variable for cluster and job", [ - ActionFactoryForDefault("unset", {"unset": ["unset"]})] - ], - }) - return dic - - -class Engine(EngineFactory): - - def __init__(self): - super().__init__(generate_cli_structure(is_beta=False)) - - -def main(): - try: - eng = Engine() - result = eng.process(sys.argv[1:]) - if result: - to_screen(result) - return 0 - except AssertionError as identifier: - to_screen(f"Value error: {repr(identifier)}", _type="error") - return 1 - except Exception as identifier: - to_screen(f"Error: {repr(identifier)}", _type="error") - return 2 - else: - return -1 - - -if __name__ == '__main__': - main() diff --git a/contrib/python-sdk/openpaisdk/defaults.py b/contrib/python-sdk/openpaisdk/defaults.py deleted file mode 100644 index b55d8ff96c..0000000000 --- a/contrib/python-sdk/openpaisdk/defaults.py +++ /dev/null @@ -1,166 +0,0 @@ - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -""" this module is to set a way to control the predefined configurations -""" -from openpaisdk.flags import __flags__ -from openpaisdk.utils import na, OrganizedList -from openpaisdk.io_utils import from_file, to_file, to_screen - - -class CfgLayer: - - def __init__(self, name: str, include: list = None, exclude: list = None, file: str = None, values: dict = None, allow_unknown: bool = True): - self.name = name - self.file = file - self.values = from_file(file, {}, silent=True) if file else na(values, {}) - self.definitions = OrganizedList( - __flags__.default_var_definitions(), - _key="name" - ).filter(None, include, exclude) # type: OrganizedList - - def update(self, key: str, value=None, delete: bool = False): - if not self.allow(key): - to_screen(f"{key} is not a recognized default variable, ignored") - return - dic = self.values - if delete: - if key not in dic: - to_screen(f"key {key} not found in {self.name}, ignored") - elif not self.act_append(key) or not value: # delete the key when not append action - del dic[key] - to_screen(f"key {key} removed completely from {self.name} successfully") - else: - dic[key].remove(value) - to_screen(f"{value} removed in {key} under {self.name} successfully") - else: - if self.act_append(key): - def _append(dic, key, value): - dic.setdefault(key, []) - if value not in dic[key]: - dic[key].append(value) - _append(dic, key, value) - to_screen(f"{value} added to {key} under {self.name} successfully") - else: - dic[key] = value - to_screen(f"{key} set to {value} under {self.name} successfully") - if self.file: - to_file(self.values, self.file) - - def allow(self, key: str): - return self.definitions.first_index(key) is not None - - def act_append(self, key: str): - if self.allow(key): - return self.definitions.first(key).get("action", None) == "append" - return False - - -class LayeredSettings: - """key-value querying from a list of dicts, priority depends on list index - refer to [TestDefaults](../tests/test_utils.py) for more usage examples - """ - - layers = None - definitions = None - - @classmethod - def init(cls): - if cls.layers is None: - cls.reset() - - @classmethod - def reset(cls): - cls.definitions = OrganizedList(__flags__.default_var_definitions(), _key="name").as_dict - cls.layers = OrganizedList([ - CfgLayer( - name="user_advaced", - exclude=["clusters-in-local", "image-list", "resource-specs"] - ), - CfgLayer( - name="user_basic", - exclude=["clusters-in-local", "image-list", "resource-specs"] - ), - CfgLayer( - name="local_default", - exclude=[], file=__flags__.get_default_file(is_global=False) - ), - CfgLayer( - name="global_default", - exclude=[], file=__flags__.get_default_file(is_global=True) - ) - ], _key="name", _getter=getattr) - - @classmethod - def keys(cls): - dic = set() - for layer in cls.layers: - for key in layer.values.keys(): - dic.add(key) - dic = dic.union(cls.definitions.keys()) - return list(dic) - - @classmethod - def act_append(cls, key): - return cls.definitions.get(key, {}).get("action", None) == "append" - - @classmethod - def get(cls, key): - __not_found__ = "==Not-Found==" - lst = [layer.values.get(key, __not_found__) for layer in cls.layers] - lst.append(cls.definitions.get(key, {}).get("default", None)) - lst = [x for x in lst if x != __not_found__] - - if cls.act_append(key): - from openpaisdk.utils import flatten - return list(flatten(lst)) - else: - return lst[0] if lst else None - - @classmethod - def update(cls, layer: str, key: str, value=None, delete: bool = False): - cls.layers.first(layer).update(key, value, delete) - - @classmethod - def as_dict(cls): - return {key: cls.get(key) for key in cls.keys()} - - @classmethod - def print_supported_items(cls): - headers = ['name', 'default', 'help'] - return to_screen([ - [x.get(k, None) for k in headers] for x in __flags__.default_var_definitions() - ], _type="table", headers=headers) - - -LayeredSettings.init() - - -def get_defaults(en_local=True, en_global=True, en_predefined=True): - return LayeredSettings.as_dict() - - -def update_default(key: str, value: str = None, is_global: bool = False, to_delete: bool = False): - layer = "global_default" if is_global else "local_default" - LayeredSettings.update(layer, key, value, to_delete) - - -def get_install_uri(ver: str = None): - ver = get_defaults()["container-sdk-branch"] if not ver else ver - return '-e "git+https://github.com/Microsoft/pai@{}#egg=openpaisdk&subdirectory=contrib/python-sdk"'.format(ver) diff --git a/contrib/python-sdk/openpaisdk/flags.py b/contrib/python-sdk/openpaisdk/flags.py deleted file mode 100644 index 2feefa87e0..0000000000 --- a/contrib/python-sdk/openpaisdk/flags.py +++ /dev/null @@ -1,149 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import os - - -class __flags__(object): - "store the flags and constants" - disable_to_screen = False # A flag to disable to_screen output - debug_mode = os.path.isfile('debug_enable') - - # ! below attributes should not be changed - cache = '.openpai' - cluster_cfg_file = 'clusters.yaml' - defaults_file = 'defaults.yaml' - container_sdk_branch = 'master' - resources_requirements = dict(cpu=2, gpu=0, memoryMB=4096, ports={}) - storage_root = '/openpai-sdk' - custom_predefined = [] - - @staticmethod - def default_var_definitions(): - return [ - { - "name": "clusters-in-local", - "default": "no", - "help": f"[yes / no], if yes, clusters configuration stored in {__flags__.get_cluster_cfg_file('yes')} other than ~/{__flags__.get_cluster_cfg_file('yes')}", - }, - { - "name": "cluster-alias", - "abbreviation": "a", - "help": "cluster alias", - }, - { - "name": "virtual-cluster", - "abbreviation": "vc", - "help": "virtual cluster name" - }, - { - "name": "storage-alias", - "abbreviation": "s", - "help": "alias of storage to use" - }, - { - "name": "workspace", - "default": None, - "abbreviation": "w", - "help": f"storage root for a job to store its codes / data / outputs ... (default is {__flags__.storage_root}/$user)" - }, - { - "name": "container-sdk-branch", - "default": __flags__.container_sdk_branch, - "help": "code branch to install sdk from (in a job container)" - }, - { - "name": "image", - "abbreviation": "i", - "help": "docker image" - }, - { - "name": "cpu", - "help": f"cpu number per instance (default is {__flags__.resources_requirements['cpu']})" - }, - { - "name": "gpu", - "help": f"gpu number per instance (default is {__flags__.resources_requirements['gpu']})" - }, - { - "name": "memoryMB", - "help": f"memory (MB) per instance (default is {__flags__.resources_requirements['memoryMB']}) (will be overridden by --mem)" - }, - { - "name": "mem", - "help": "memory (MB / GB) per instance (default is %.0fGB)" % (__flags__.resources_requirements["memoryMB"] / 1024.0) - }, - { - "name": "sources", - "default": [], - "abbreviation": "src", - "action": "append", - "help": "source files to upload (into container)" - }, - { - "name": "pip-installs", - "default": [], - "abbreviation": "pip", - "action": "append", - "help": "packages to install via pip" - }, - { - "name": "image-list", - "default": [], - "action": "append", - "help": "list of images that are frequently used" - }, - { - "name": "resource-list", - "default": [], - "action": "append", - "help": "list of resource specs that are frequently used" - }, - { - "name": "web-default-form", - "help": "web-default-form (in Submitter)" - }, - { - "name": "web-default-image", - "help": "web-default-image (in Submitter)" - }, - { - "name": "web-default-resource", - "help": "web-default-resource (in Submitter), format: ',,'" - }, - ] + __flags__.custom_predefined - - @staticmethod - def get_cluster_cfg_file(clusters_in_local: str = 'no') -> str: - assert clusters_in_local in ['no', 'yes'], f"only allow yes / no, but {clusters_in_local} received" - pth = [__flags__.cache, __flags__.cluster_cfg_file] - if clusters_in_local == 'no': - pth = [os.path.expanduser('~')] + pth - return os.path.join(*pth) - - @staticmethod - def get_default_file(is_global: bool) -> str: - pth = [__flags__.cache, __flags__.defaults_file] - pth = [os.path.expanduser('~')] + pth if is_global else pth - return os.path.join(*pth) - - @staticmethod - def print_predefined(exclude: list = None, include: list = None): - from tabulate import tabulate - citems = __flags__.predefined_defaults(exclude, include) - print(tabulate(citems, headers=citems[0]._asdict().keys()), flush=True) diff --git a/contrib/python-sdk/openpaisdk/io_utils.py b/contrib/python-sdk/openpaisdk/io_utils.py deleted file mode 100644 index f3d9dc8574..0000000000 --- a/contrib/python-sdk/openpaisdk/io_utils.py +++ /dev/null @@ -1,204 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import os -import errno -import shutil -from webbrowser import open_new_tab -from contextlib import contextmanager -from functools import partial -import json -import yaml -import logging -from urllib.request import urlopen -from urllib.parse import urlsplit -from urllib.request import urlretrieve -import cgi -from openpaisdk.flags import __flags__ - -logging.basicConfig(format='%(name)s - %(levelname)s - %(message)s') -__logger__ = logging.getLogger(name="openpai") -__logger__.setLevel(level=logging.DEBUG if __flags__.debug_mode else logging.INFO) - - -def to_screen(msg, _type: str = "normal", **kwargs): - """a general wrapping function to deal with interactive IO and logging - """ - def print_out(msg, **kwargs): - out = yaml.dump(msg, default_flow_style=False, **kwargs) if not isinstance(msg, str) else msg - if not __flags__.disable_to_screen: - print(out, flush=True) - return out - - def print_table(msg, **kwargs): - from tabulate import tabulate - out = tabulate(msg, **kwargs) - if not __flags__.disable_to_screen: - print(out, flush=True) - return out - - func_dict = { - "normal": print_out, - "table": print_table, - "warn": partial(__logger__.warn, exc_info=__flags__.debug_mode), - "debug": __logger__.debug, - "error": partial(__logger__.error, exc_info=True), - } - assert _type in func_dict, f"unsupported output type {_type}, only {list(func_dict.keys(()))} are valid" - ret = func_dict[_type](msg, **kwargs) - return ret if _type == "table" else msg - - -def listdir(path): - assert os.path.isdir(path), "{} is not a valid path of directory".format(path) - root, dirs, files = next(os.walk(path)) - return { - "root": root, - "dirs": dirs, - "files": files - } - - -def browser_open(url: str): - __logger__.info("open in browser: %s", url) - try: - open_new_tab(url) - except Exception as e: - to_screen(f"fail to open {url} due to {repx(e)}", _type="warn") - - -def from_file(fname: str, default=None, silent: bool = False, **kwargs): - """read yaml or json file; return default if (only when default is not None) - - file non existing - - empty file or contents in file is not valid - - loaded content is not expected type (type(default)) - """ - import yaml - assert os.path.splitext(fname)[1] in __json_exts__ + __yaml_exts__, f"unrecognized {fname}" - try: - with open(fname) as fp: - dic = dict(kwargs) - dic.setdefault('Loader', yaml.FullLoader) - ret = yaml.load(fp, **dic) - assert ret, f"read empty object ({ret}) from {fname}, return {default}" - assert default is None or isinstance( - ret, type(default)), f"read wrong type ({type(ret)}, expected {type(default)}) from {fname}, return {default}" - return ret - except Exception as identifier: - if default is None: - to_screen(f"{repr(identifier)} when reading {fname}", _type="error") - raise identifier - if not silent: - to_screen(f"{repr(identifier)} when reading {fname}", _type="warn") - return default - - -def get_url_filename_from_server(url): - try: - blah = urlopen(url).info()['Content-Disposition'] - _, params = cgi.parse_header(blah) - return params["filename"] - except Exception as e: - to_screen(f'Failed to get filename from server: {repr(e)}', _type="warn") - return None - - -def web_download_to_folder(url: str, folder: str, filename: str = None): - if not filename: - split = urlsplit(url) - filename = split.path.split("/")[-1] - filename = os.path.join(folder, filename) - os.makedirs(folder, exist_ok=True) - try: - urlretrieve(url, filename) - __logger__.info('download from %s to %s', url, filename) - return filename - except Exception: - __logger__.error("failed to download", exc_info=True) - - -def mkdir_for(pth: str): - d = os.path.dirname(pth) - if d: - os.makedirs(d, exist_ok=True) - return d - - -def file_func(kwargs: dict, func=shutil.copy2, tester: str = 'dst'): - try: - return func(**kwargs) - except IOError as identifier: - # ENOENT(2): file does not exist, raised also on missing dest parent dir - if identifier.errno != errno.ENOENT: - print(identifier.__dict__) - assert tester in kwargs.keys(), 'wrong parameter {}'.format(tester) - os.makedirs(os.path.dirname(kwargs[tester]), exist_ok=True) - return func(**kwargs) - except Exception as identifier: - print(identifier) - return None - - -@contextmanager -def safe_open(filename: str, mode: str = 'r', func=open, **kwargs): - "if directory of filename does not exist, create it first" - mkdir_for(filename) - fn = func(filename, mode=mode, **kwargs) - yield fn - fn.close() - - -@contextmanager -def safe_chdir(pth: str): - "safely change directory to pth, and then go back" - currdir = os.getcwd() - try: - if not pth: - pth = currdir - os.chdir(pth) - __logger__.info("changing directory to %s", pth) - yield pth - finally: - os.chdir(currdir) - __logger__.info("changing directory back to %s", currdir) - - -def safe_copy(src: str, dst: str): - "if directory of filename doesnot exist, create it first" - return file_func({'src': src, 'dst': dst}) - - -__yaml_exts__, __json_exts__ = ['.yaml', '.yml'], ['.json', '.jsn'] - - -def to_file(obj, fname: str, fmt=None, **kwargs): - if not fmt: - _, ext = os.path.splitext(fname) - if ext in __json_exts__: - fmt, dic = json, dict(indent=4) - elif ext in __yaml_exts__: - import yaml - fmt, dic = yaml, dict(default_flow_style=False) - else: - raise NotImplementedError - dic.update(kwargs) - else: - dic = kwargs - with safe_open(fname, 'w') as fp: - fmt.dump(obj, fp, **dic) - __logger__.debug("serialize object to file %s", fname) diff --git a/contrib/python-sdk/openpaisdk/job.py b/contrib/python-sdk/openpaisdk/job.py deleted file mode 100644 index faf0849c58..0000000000 --- a/contrib/python-sdk/openpaisdk/job.py +++ /dev/null @@ -1,659 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import json -import os -import re -import pathlib -from typing import Union, List -from copy import deepcopy -from html2text import html2text - -from openpaisdk.flags import __flags__ -from openpaisdk.defaults import get_install_uri, LayeredSettings -from openpaisdk.io_utils import from_file, safe_open, to_file, to_screen -from openpaisdk.utils import Retry, concurrent_map, exception_free, find, get_response, na, na_lazy -from openpaisdk.cluster import get_cluster - -__protocol_filename__ = "job_protocol.yaml" -__config_filename__ = "job_config.json" -__protocol_unit_types__ = ["job", "data", "script", "dockerimage", "output"] - - -class ProtocolUnit: - - @staticmethod - def validate(u: dict): - # assert u["protocolVersion"] in ["1", "2", 1, 2], "invalid protocolVersion (%s)" % u["protocolVersion"] - assert u["type"] in __protocol_unit_types__, "invalid type (%s)" % u["type"] - assert u["name"], "invalid name" - # uri: String or list, required # Only when the type is data can the uri be a list. - assert isinstance(u["uri"], str) or u["type"] == "data" and isinstance(u["uri"], list), "uri: String or list, required # Only when the type is data can the uri be a list. (Error: %s)" % u - - -class TaskRole: - - @staticmethod - def validate(t: dict): - assert t["dockerImage"], "unknown dockerImage" - assert t["resourcePerInstance"]["cpu"] > 0, "invalid cpu number (%d)" % t["resourcePerInstance"]["cpu"] - assert t["resourcePerInstance"]["gpu"] >= 0, "invalid gpu number (%d)" % t["resourcePerInstance"]["gpu"] - assert t["resourcePerInstance"]["memoryMB"] > 0, "invalid memoryMB number (%d)" % t["resourcePerInstance"]["memoryMB"] - for label, port in t["resourcePerInstance"].get("ports", {}).items(): - assert port >= 0, "invalid port (%s : %d)" % (label, port) - assert isinstance(t["commands"], list) and t["commands"], "empty commands" - - -class Deployment: - - @staticmethod - def validate(d: dict, task_role_names: list): - assert d["name"], "deployment should have a name" - for t, c in d["taskRoles"].items(): - assert t in task_role_names, "invalid taskrole name (%s)" % (t) - assert isinstance(["preCommands"], list), "preCommands should be a list" - assert isinstance(["postCommands"], list), "postCommands should be a list" - - -class JobResource: - - def __init__(self, r: dict = None): - from copy import deepcopy - - def gb2mb(m): - if not isinstance(m, str) or m.isnumeric(): - return int(m) - if m.lower().endswith('g'): - return int(m[:-1]) * 1024 - if m.lower().endswith('gb'): - return int(m[:-2]) * 1024 - raise ValueError(m) - - r = {} if not r else r - dic = deepcopy(__flags__.resources_requirements) - for key in ["cpu", "gpu", "memoryMB", "ports"]: - if r.get(key, None) is not None: - dic[key] = int(r[key]) if not key == "ports" else r[key] - if r.get("mem", None) is not None: - dic["memoryMB"] = gb2mb(r["mem"]) - self.req = dic - - def add_port(self, name: str, num: int = 1): - self.req.setdefault("ports", {})[name] = num - return self - - @property - def as_dict(self): - return self.req - - @staticmethod - def parse_list(lst: List[str]): - r = [] - for spec in lst: - s = spec.replace(" ", '').split(",") - r.append(JobResource({ - "gpu": s[0], "cpu": s[1], "mem": s[2], - }).as_dict) - return r - - -class Job: - """ - the data structure and methods to describe a job compatible with https://github.com/microsoft/openpai-protocol/blob/master/schemas/v2/schema.yaml - external methods: - - I/O - - save(...) / load(...): store and restore to the disk - - Job protocol wizard - - sdk_job_template(...): generate a job template with the sdk (embedding cluster / storage information) - - one_liner(...): generate a single-taskrole job protocol from commands and other essential information - - from_notebook(...): generate a job protocol from a jupyter notebook - - Interaction with clusters - - submit(...): submit to a cluster, including archiving and uploading local source files - - wait(...): wait a job until completed - - log(...): - - Parse logs - - connect_jupyter(...): wait job running and connected to jupyter server - """ - - def __init__(self, name: str=None, **kwargs): - self.protocol = dict() # follow the schema of https://github.com/microsoft/openpai-protocol/blob/master/schemas/v2/schema.yaml - self._client = None # cluster client - self.new(name, **kwargs) - - def new(self, name: str, **kwargs): - self.protocol = { - "name": name, - "protocolVersion": 2, - "type": "job", - "prerequisites": [], - "parameters": dict(), - "secrets": dict(), - "taskRoles": dict(), - "deployments": [], - "defaults": dict(), - "extras": dict(), - } - self.protocol.update(kwargs) - return self - - def load(self, fname: str = None, job_name: str = None, cluster_alias: str = None): - if cluster_alias: # load job config from cluster by REST api - job_name = na(job_name, self.name) - self.protocol = get_cluster(cluster_alias).rest_api_job_info(job_name, 'config') - else: # load from local file - if not fname: - fname = Job(job_name).protocol_file - if os.path.isfile(fname): - self.protocol = from_file(fname, default="==FATAL==") - self.protocol.setdefault('protocolVersion', '1') # v1 protocol (json) has no protocolVersion - return self - - def save(self): - if self.name: - to_file(self.protocol, self.protocol_file) - return self - - def validate(self): - assert self.protocolVersion in ["1", "2"], "unknown protocolVersion (%s)" % self.protocol["protocolVersion"] - assert self.name is not None, "job name is null %s" % self.protocol - if self.protocolVersion == "2": - assert self.protocol["type"] == "job", "type must be job (%s)" % self.protocol["type"] - for t in self.protocol.get("taskRoles", {}).values(): - TaskRole.validate(t) - for d in self.protocol.get("deployments", []): - Deployment.validate(d, list(self.protocol["taskRoles"].keys())) - for u in self.protocol.get("prerequisites", []): - ProtocolUnit.validate(u) - return self - - @property - def protocolVersion(self): - return str(self.protocol.get("protocolVersion", "1")) - - @property - def name(self): - return self.protocol.get("name" if self.protocolVersion == "2" else "jobName", None) - - @property - def cache_dir(self): - assert self.name, "cannot get cache directory for an empty job name" - return os.path.join(__flags__.cache, self.name) - - def cache_file(self, fname): - return os.path.join(self.cache_dir, fname) - - @property - def protocol_file(self): - return self.cache_file(__protocol_filename__) - - @property - def temp_archive(self): - return self.cache_file(self.name + ".tar.gz") - - @staticmethod - def get_config_file(job_name: str, v2: bool=True): - return Job(job_name).cache_file(__protocol_filename__ if v2 else __config_filename__) - - def param(self, key, default=None, field: str="parameters"): - return self.protocol.get(field, {}).get(key, default) - - def set_param(self, key, value, field: str="parameters"): - self.protocol.setdefault(field, {})[key] = value - - def secret(self, key, default=None): - return self.param(key, default, "secrets") - - def set_secret(self, key, value): - self.set_param(key, value, "secrets") - - def extra(self, key, default=None): - return self.param(key, default, "extras") - - def set_extra(self, key, value): - self.set_param(key, value, "extras") - - def tags(self): - return self.param("tags", [], "extras") - - def add_tag(self, tag: str): - lst = self.tags() - if tag not in lst: - lst.append(tag) - self.set_param("tags", lst, "extras") - return self - - def has_tag(self, tag: str): - return tag in self.tags() - - def get_config(self): - if self.protocolVersion == "2": - self.interpret_sdk_plugin() - for d in self.protocol.get("deployments", []): - r = d["taskRoles"] - t_lst = list(r.keys()) - for t in t_lst: - for k in ["preCommands", "postCommands"]: # pre- / post- - if k not in r[t]: - continue - if len(r[t][k]) == 0: - del r[t][k] - if len(r[t]) == 0: - del r[t] - for key in ["deployments", "parameters"]: - if key in self.protocol and len(self.protocol[key]) == 0: - del self.protocol[key] - for t in self.protocol["taskRoles"].values(): - if "ports" in t["resourcePerInstance"] and len(t["resourcePerInstance"]["ports"]) == 0: - del t["resourcePerInstance"]["ports"] - return self.protocol - else: - dic = deepcopy(self.protocol) - del dic["protocolVersion"] - return dic - - def sdk_job_template(self, cluster_alias_lst: str=[], workspace: str=None, sources: list=None, pip_installs: list=None): - "generate the job template for a sdk-submitted job" - # secrets - clusters = [get_cluster(alias, get_client=False) for alias in cluster_alias_lst] - workspace = na(workspace, LayeredSettings.get("workspace")) - workspace = na(workspace, f"{__flags__.storage_root}/{clusters[0]['user']}") - self.set_secret("clusters", json.dumps(clusters)) - self.set_param("cluster_alias", cluster_alias_lst[0] if cluster_alias_lst else None) - self.set_param("work_directory", '{}/jobs/{}'.format(workspace, self.name) if workspace else None) - - # parameters - self.set_param("python_path", "python") - - # signature - self.add_tag(__internal_tags__["sdk"]) - - # sdk.plugins - sdk_install_uri = "-U {}".format(get_install_uri()) - c_dir = '~/{}'.format(__flags__.cache) - c_file = '%s/%s' % (c_dir, __flags__.cluster_cfg_file) - - plugins = [] - if sources: - plugins.append({ - "plugin": "local.uploadFiles", - "parameters": { - "files": list(set([os.path.relpath(s) for s in sources])), - }, - }) - - plugins.extend([ - { - "plugin": "container.preCommands", # commands to install essential pip packages - "parameters": { - "commands": [ - "<% $parameters.python_path %> -m pip install {}".format(p) for p in [sdk_install_uri] + na(pip_installs, []) - ] - } - }, - { - "plugin": "container.preCommands", # copy cluster information - "parameters": { - "commands": [ - "mkdir %s" % c_dir, - "echo \"write config to {}\"".format(c_file), - "echo <% $secrets.clusters %> > {}".format(c_file), - "opai cluster select <% $parameters.cluster_alias %>", - ] - } - } - ]) - - if sources: - a_file = os.path.basename(self.temp_archive) - plugins.append({ - "plugin": "container.preCommands", - "parameters": { - "commands": [ - "opai storage download <% $parameters.work_directory %>/source/{} {}".format(a_file, a_file), - "tar xvfz {}".format(a_file) - ] - } - }) - self.set_extra("sdk.plugins", plugins) - return self - - def one_liner(self, - commands: Union[list, str], image: str, cluster: dict, resources: dict=None, - sources: list = None, pip_installs: list = None - ): - """generate the single-task-role job protocol from essentials such as commands, docker image... - :param cluster (dict): a dictionary includes {cluster_alias, virtual_cluster, workspace} - """ - self.sdk_job_template([cluster["cluster_alias"]], cluster.get("workspace", None), sources, pip_installs) - self.protocol["prerequisites"].append({ - "name": "docker_image", - "type": "dockerimage", - "protocolVersion": "2", - "uri": image, - }) - self.protocol.setdefault("taskRoles", {})["main"] = { - "dockerImage": "docker_image", - "resourcePerInstance": JobResource(resources).as_dict, - "commands": commands if isinstance(commands, list) else [commands] - } - self.add_tag(__internal_tags__["one_liner"]) - return self - - def from_notebook(self, - nb_file: str, mode: str="interactive", token: str="abcd", - image: str=None, cluster: dict=None, resources: dict=None, - sources: list = None, pip_installs: list = None - ): - """ - mode: interactive / silent / script - """ - assert mode in ["interactive", "silent", "script"], "unsupported mode %s" % mode - if not nb_file: - mode, nb_file = "interactive", "" - else: - assert os.path.isfile(nb_file), "cannot read the ipython notebook {}".format(nb_file) - sources = na(sources, []) - sources.append(nb_file) - self.set_param("notebook_file", os.path.splitext(os.path.basename(nb_file))[0] if nb_file else "") - resources = JobResource(resources) - if mode == "interactive": - resources.add_port("jupyter") - self.set_secret("token", token) - cmds = [ - " ".join([ - "jupyter notebook", - "--no-browser", "--ip 0.0.0.0", "--port $PAI_CONTAINER_HOST_jupyter_PORT_LIST", - "--NotebookApp.token=<% $secrets.token %>", - "--allow-root --NotebookApp.file_to_run=<% $parameters.notebook_file %>.ipynb", - ]), - ] - elif mode == "silent": - cmds = [ - " ".join([ - "jupyter nbconvert --ExecutePreprocessor.timeout=-1 --ExecutePreprocessor.allow_errors=True", - "--to html --execute <% $parameters.notebook_file %>.ipynb", - ]), - "opai storage upload <% $parameters.notebook_file %>.html <% $parameters.work_directory %>/output/<% $parameters.notebook_file %>.html", - ] - else: - cmds = [ - "jupyter nbconvert --to script <% $parameters.notebook_file %>.ipynb --output openpai_submitter_entry", - "echo ======================== Python Script Starts ========================", - # execute notebook by iPython. To remove color information, we use "--no-term-title" and sed below - """ipython --no-term-title openpai_submitter_entry.py | sed -r "s/\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | tr -dc '[[:print:]]\\n'""", - ] - self.one_liner(cmds, image, cluster, resources.as_dict, sources, na(pip_installs, []) + ["jupyter"]) - mode_to_tag = {"interactive": "interactive_nb", "silent": "batch_nb", "script": "script_nb"} - self.add_tag(__internal_tags__[mode_to_tag[mode]]) - return self - - def interpret_sdk_plugin(self): - plugins = self.extra("sdk.plugins", []) - # concatenate commands - if len(self.protocol.setdefault("deployments", [])) == 0: # will move to plugin fields when it is ready - # we could use a new deployments for every pre- / post- commands plugin - deployment_name, task_role_names = "sdk_deployment", list(self.protocol["taskRoles"]) - deployment = {key: dict(preCommands=[], postCommands=[]) for key in task_role_names} - plugins_to_remove = [] - for i, plugin in enumerate(plugins): - target = find("container.(\w+)", plugin["plugin"]) - if target not in ["preCommands", "postCommands"]: - continue - for t in plugin.get("taskRoles", task_role_names): - deployment[t][target].extend(plugin["parameters"]["commands"]) - plugins_to_remove.append(i) - if plugins_to_remove: - self.protocol["deployments"].append({ - "name": deployment_name, - "taskRoles": deployment, - }) - self.protocol.setdefault("defaults", {})["deployment"] = deployment_name - for i in reversed(plugins_to_remove): - del plugins[i] - return self - - @property - def client(self): - if self._client is None: - alias = self.param("cluster_alias") - if alias: - self._client = get_cluster(alias) - return self._client - - def select_cluster(self, cluster_alias: str=None, virtual_cluster: str=None): - self._client = get_cluster(cluster_alias) - if virtual_cluster: - if self.protocolVersion == "1": - self.protocol["virtualCluster"] = virtual_cluster - else: - self.set_param("virtualCluster", virtual_cluster, field="defaults") - return self - - # methods only for SDK-enabled jobs - def submit(self, cluster_alias: str = None, virtual_cluster: str = None): - cluster_alias = na(cluster_alias, self.param("cluster_alias", None)) - self.select_cluster(cluster_alias, virtual_cluster) - self.validate().local_process() - to_screen("submit job %s to cluster %s" % (self.name, cluster_alias)) - try: - self.client.rest_api_submit(self.get_config()) - job_link = self.client.get_job_link(self.name) - return {"job_link": job_link, "job_name": self.name} - except Exception as identifier: - to_screen(f"submit failed due to {repr(identifier)}", _type="error") - to_screen(self.get_config()) - raise identifier - - def stop(self): - return self.client.rest_api_execute_job(self.name) - - def get_status(self): - return self.client.rest_api_job_info(self.name) - - def wait(self, t_sleep: float = 10, timeout: float = 3600, silent: bool = False): - """for jupyter job, wait until ready to connect - for normal job, wait until completed""" - exit_states = __job_states__["completed"] - repeater = Retry(timeout=timeout, t_sleep=t_sleep, silent=silent) - interactive_nb = self.has_tag(__internal_tags__["interactive_nb"]) - batch_nb = self.has_tag(__internal_tags__["batch_nb"]) - if interactive_nb or batch_nb: - if interactive_nb: - to_screen("{} is recognized to be an interactive jupyter notebook job".format(self.name)) - to_screen("notebook job needs to be RUNNING state and the kernel started") - if batch_nb: - to_screen("{} is recognized to be a silent jupyter notebook job".format(self.name)) - to_screen("notebook job needs to be SUCCEEDED state and the output is ready") - return repeater.retry( - lambda x: x.get('state', None) in exit_states or x.get("notebook", None) is not None, - self.connect_jupyter - ) - to_screen("wait until job to be completed ({})".format(exit_states)) - return repeater.retry( - lambda x: JobStatusParser.state(x) in exit_states, # x: job status - self.get_status - ) - - def plugin_uploadFiles(self, plugin: dict): - import tarfile - to_screen("archiving and uploading ...") - work_directory = self.param("work_directory") - assert work_directory, "must specify a storage to upload" - with safe_open(self.temp_archive, "w:gz", func=tarfile.open) as fn: - for src in plugin["parameters"]["files"]: - src = os.path.relpath(src) - if os.path.dirname(src) != "": - to_screen("files not in current folder may cause wrong location when unarchived in the container, please check it {}".format(src), _type="warn") - fn.add(src) - to_screen("{} archived and wait to be uploaded".format(src)) - self.client.get_storage().upload( - local_path=self.temp_archive, - remote_path="{}/source/{}".format(work_directory, os.path.basename(self.temp_archive)), - overwrite=True - ) - - def local_process(self): - "pre-process the job protocol locally, including uploading files, deal with pre-/post- commands" - self.validate() - plugins = self.protocol.get("extras", {}).get("sdk.plugins", []) - for plugin in plugins: - s = find("local.(\w+)", plugin["plugin"]) - if not s: - continue - getattr(self, "plugin_" + s)(plugin) - return self - - def connect_jupyter(self): - if self.has_tag(__internal_tags__["script_nb"]): - return self.connect_jupyter_script() - if self.has_tag(__internal_tags__["batch_nb"]): - return self.connect_jupyter_batch() - if self.has_tag(__internal_tags__["interactive_nb"]): - return self.connect_jupyter_interactive() - - def connect_jupyter_batch(self): - "fetch the html result if ready" - status = self.get_status() - state = JobStatusParser.state(status) - url = None - if state in __job_states__["successful"]: - html_file = self.param("notebook_file") + ".html" - local_path = html_file - remote_path = '{}/output/{}'.format(self.param("work_directory"), html_file) - self.client.get_storage().download(remote_path=remote_path, local_path=local_path) - url = pathlib.Path(os.path.abspath(html_file)).as_uri() - return dict(state=state, notebook=url) - - def connect_jupyter_interactive(self): - "get the url of notebook if ready" - status = self.get_status() - nb_file = self.param("notebook_file") + ".ipynb" if self.param("notebook_file") else None - return JobStatusParser.interactive_jupyter_url(status, nb_file) - - def connect_jupyter_script(self): - status = self.get_status() - state = self.state(status) - return dict(state=state, notebook=None) - - -__internal_tags__ = { - "sdk": "py-sdk", - "one_liner": 'py-sdk-one-liner', - "interactive_nb": 'py-sdk-notebook-interactive', - "batch_nb": 'py-sdk-notebook-batch', - "script_nb": 'py-sdk-notebook-script', -} - - -__job_states__ = { - "successful": ["SUCCEEDED"], - "failed": ["FAILED", "STOPPED"], - "ongoing": ["WAITING", "RUNNING", "COMPLETING"], -} -__job_states__["completed"] = __job_states__["successful"] + __job_states__["failed"] -__job_states__["ready"] = __job_states__["completed"] + ["RUNNING"] -__job_states__["valid"] = [s for sub in __job_states__.values() for s in sub] - - -class JobStatusParser: - - @staticmethod - @exception_free(KeyError, None) - def state(status: dict): - return status["jobStatus"]["state"] - - @staticmethod - @exception_free(KeyError, None) - def single_task_logs(status: dict, task_role: str = 'main', index: int = 0, log_type: dict=None, return_urls: bool=False): - """change to use containerLog""" - log_type = na(log_type, { - "stdout": "user.pai.stdout/?start=0", - "stderr": "user.pai.stderr/?start=0" - }) - containers = status.get("taskRoles", {}).get(task_role, {}).get("taskStatuses", []) - if len(containers) < index + 1: - return None - containerLog = containers[index].get("containerLog", None) - if not containerLog: - return None - urls = { - k: "{}{}".format(containerLog, v) - for k, v in log_type.items() - } - if return_urls: - return urls - else: - html_contents = {k: get_response('GET', v).text for k, v in urls.items()} - try: - from html2text import html2text - return {k: html2text(v) for k, v in html_contents.items()} - except ImportError: - return html_contents - - @staticmethod - @exception_free(Exception, None) - def all_tasks_logs(status: dict): - """retrieve logs of all tasks""" - logs = { - 'stdout': {}, 'stderr': {} - } - for tr_name, tf_info in status['taskRoles'].items(): - for task_status in tf_info['taskStatuses']: - task_id = '{}[{}]'.format(tr_name, task_status['taskIndex']) - task_logs = JobStatusParser.single_task_logs(status, tr_name, task_status['taskIndex']) - for k, v in task_logs.items(): - logs.setdefault(k, {})[task_id] = v - return logs - - @staticmethod - @exception_free(Exception, dict(state=None, notebook=None)) - def interactive_jupyter_url(status: dict, nb_file: str=None, task_role: str='main', index: int= 0): - "get the url of notebook if ready" - state = JobStatusParser.state(status) - url = None - if state == "RUNNING": - job_log = JobStatusParser.single_task_logs( - status, task_role, index - )["stderr"].split('\n') - for line in job_log: - if re.search("The Jupyter Notebook is running at:", line): - from openpaisdk.utils import path_join - container = status["taskRoles"][task_role]["taskStatuses"][index] - ip, port = container["containerIp"], container["containerPorts"]["jupyter"] - url = path_join([f"http://{ip}:{port}", "notebooks", nb_file]) - break - return dict(state=state, notebook=url) - - -def job_spider(cluster, jobs: list = None): - jobs = na_lazy(jobs, cluster.rest_api_job_list) - to_screen("{} jobs to be captured in the cluster {}".format(len(jobs), cluster.alias)) - job_statuses = concurrent_map( - lambda j: cluster.rest_api_job_info(j['name'], info=None, user=j['username']), - jobs - ) - job_configs = concurrent_map( - lambda j: cluster.rest_api_job_info(j['name'], info='config', user=j['username']), - jobs - ) - job_logs = concurrent_map(JobStatusParser.all_tasks_logs, job_statuses) - for job, sta, cfg, logs in zip(jobs, job_statuses, job_configs, job_logs): - job['status'] = sta - job['config'] = cfg - job['logs'] = logs - return jobs diff --git a/contrib/python-sdk/openpaisdk/notebook.py b/contrib/python-sdk/openpaisdk/notebook.py deleted file mode 100644 index fee7ba1101..0000000000 --- a/contrib/python-sdk/openpaisdk/notebook.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import json -import os.path -import re -from openpaisdk.defaults import LayeredSettings, __flags__ - - -def get_notebook_path(): - """ - Return the full path of the jupyter notebook. - Reference: https://github.com/jupyter/notebook/issues/1000#issuecomment-359875246 - """ - import requests - from requests.compat import urljoin - from notebook.notebookapp import list_running_servers - import ipykernel - - kernel_id = re.search('kernel-(.*).json', - ipykernel.connect.get_connection_file()).group(1) - servers = list_running_servers() - for ss in servers: - response = requests.get(urljoin(ss['url'], 'api/sessions'), - params={'token': ss.get('token', '')}) - info = json.loads(response.text) - if isinstance(info, dict) and info['message'] == 'Forbidden': - continue - for nn in info: - if nn['kernel']['id'] == kernel_id: - relative_path = nn['notebook']['path'] - return os.path.join(ss['notebook_dir'], relative_path) - - -def parse_notebook_path(): - "parse the running notebook path to name, folder, extension" - nb_file = get_notebook_path() - folder, fname = os.path.split(nb_file) - name, ext = os.path.splitext(fname) - return name, folder, ext - - -class NotebookConfiguration: - "wrapper of LayeredSettings" - - @staticmethod - def reset(): - LayeredSettings.reset() - - @staticmethod - def print_supported_items(): - ret = LayeredSettings.print_supported_items() - if __flags__.disable_to_screen: - print(ret) - - @staticmethod - def set(key, value): - LayeredSettings.update("user_advaced", key, value) - - @staticmethod - def get(*args): - dic = LayeredSettings.as_dict() - if not args: - return dic - elif len(args) == 1: - return dic[args[0]] - else: - return [dic[a] for a in args] diff --git a/contrib/python-sdk/openpaisdk/storage.py b/contrib/python-sdk/openpaisdk/storage.py deleted file mode 100644 index 4ad592f0e8..0000000000 --- a/contrib/python-sdk/openpaisdk/storage.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -""" -[summary] -""" -from openpaisdk.io_utils import mkdir_for, to_screen - - -class Storage: - - def __init__(self, protocol: str = 'webHDFS', *args, **kwargs): - self.protocol, self.client = protocol.lower(), None - if protocol.lower() == 'webHDFS'.lower(): - from hdfs import InsecureClient - self.client = InsecureClient(*args, **kwargs) - for f in 'upload download list status delete'.split(): - setattr(self, f, getattr(self, '%s_%s' % - (f, protocol.lower()))) - - def upload_webhdfs(self, local_path: str, remote_path: str, **kwargs): - to_screen("upload %s -> %s" % (local_path, remote_path)) - return self.client.upload(local_path=local_path, hdfs_path=remote_path, **kwargs) - - def download_webhdfs(self, remote_path: str, local_path: str, **kwargs): - mkdir_for(local_path) - to_screen("download %s -> %s" % (remote_path, local_path)) - return self.client.download(local_path=local_path, hdfs_path=remote_path, overwrite=True, **kwargs) - - def list_webhdfs(self, remote_path: str, **kwargs): - return self.client.list(hdfs_path=remote_path, **kwargs) - - def status_webhdfs(self, remote_path: str, **kwargs): - return self.client.status(hdfs_path=remote_path, **kwargs) - - def delete_webhdfs(self, remote_path: str, **kwargs): - return self.client.delete(hdfs_path=remote_path, **kwargs) diff --git a/contrib/python-sdk/openpaisdk/utils.py b/contrib/python-sdk/openpaisdk/utils.py deleted file mode 100644 index 9359b91212..0000000000 --- a/contrib/python-sdk/openpaisdk/utils.py +++ /dev/null @@ -1,298 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -""" -common functions to -""" -from openpaisdk.io_utils import safe_chdir, to_screen, __logger__ -import subprocess -import importlib -import os -import time -import requests -from typing import Union -from functools import wraps -from collections import Iterable -from requests_toolbelt.utils import dump -from urllib3.exceptions import InsecureRequestWarning - -# Suppress only the single warning from urllib3 needed. -requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning) - - -def exception_free(err_type, default, err_msg: str = None): - "return the default value if the exception is caught" - def inner_func(fn): - @wraps(fn) - def wrapper(*args, **kwargs): - try: - return fn(*args, **kwargs) - except err_type as e: - if not err_msg: - to_screen(repr(e), _type="warn") - else: - to_screen(err_msg, _type="warn") - return default - except Exception as e: - raise e - return wrapper - return inner_func - - -def concurrent_map(fn, it, max_workers=None): - "a wrapper of concurrent.futures.ThreadPoolExecutor.map, retrieve the results" - from concurrent.futures import ThreadPoolExecutor - ret = [] - with ThreadPoolExecutor(max_workers=max_workers) as executor: - futures = executor.map(fn, it) - for f in futures: - ret.append(f) - return ret - - -class OrganizedList(list): - - def __init__(self, lst: list, _key: str = None, _getter=dict.get): - super().__init__(lst) - self._getter = _getter - self._key = _key - - @property - def _fn_get(self): - return lambda elem: self._getter(elem, self._key) - - def first_index(self, target): - for i, elem in enumerate(self): - if self._fn_get(elem) == target: - return i - return None - - def first(self, target): - i = self.first_index(target) - return self[i] if i is not None else None - - def filter_index(self, target=None, include: list = None, exclude: list = None): - if include is not None: - return [i for i, elem in enumerate(self) if self._fn_get(elem) in include] - if exclude is not None: - return [i for i, elem in enumerate(self) if self._fn_get(elem) not in exclude] - return [i for i, elem in enumerate(self) if self._fn_get(elem) == target] - - def filter(self, target=None, include=None, exclude=None): - return OrganizedList([self[i] for i in self.filter_index(target, include, exclude)], self._key, self._getter) - - @property - def as_dict(self): - return {self._fn_get(elem): elem for elem in self} - - @property - def as_list(self): - return [x for x in self] - - def add(self, elem: dict, getter=dict.get, silent: bool = False, replace: bool = False): - for i in self.filter_index(self._fn_get(elem)): - if replace: - self[i] = elem - if not silent: - to_screen(f"OrganizedList: {self._key} = {self._fn_get(elem)} already exists, replace it") - else: - self[i].update(elem) - if not silent: - to_screen(f"OrderedDict: {self._key} = {self._fn_get(elem)} already exists, update it") - return self # ~ return - self.append(elem) - if not silent: - to_screen(f"OrganizedList: {self._key} = {self._fn_get(elem)} added") - return self - - def remove(self, target): - indexes = self.filter_index(target) - if not indexes: - to_screen(f"OrganizedList: {self._key} = {target} cannot be deleted due to non-existence") - return self - for index in sorted(indexes, reverse=True): - del self[index] - to_screen(f"OrganizedList: {self._key} = {target} removed") - return self - - -class Nested: - - def __init__(self, t, sep: str = ":"): - self.__sep__ = sep - self.content = t - - def get(self, keys: str): - return Nested.s_get(self.content, keys.split(self.__sep__)) - - def set(self, keys: str, value): - return Nested.s_set(self.content, keys.split(self.__sep__), value) - - @staticmethod - def _validate(context: Union[list, dict], idx: Union[str, int]): - return int(idx) if isinstance(context, list) else idx - - @staticmethod - def s_get(target, keys: list): - k = Nested._validate(target, keys[0]) - if len(keys) == 1: - return target[k] - return Nested.s_get(target[k], keys[1:]) - - @staticmethod - def s_set(target, keys: list, value): - # ! not allow to create a list - k = Nested._validate(target, keys[0]) - if len(keys) == 1: - target[k] = value - return - if isinstance(target, dict) and k not in target: - target[k] = dict() - return Nested.s_set(target[k], keys[1:], value) - - -def getobj(name: str): - mod_name, func_name = name.rsplit('.', 1) - mod = importlib.import_module(mod_name) - return getattr(mod, func_name) - - -class RestSrvError(Exception): - pass - - -class NotReadyError(Exception): - pass - - -class Retry: - - def __init__(self, max_try: int = 10, t_sleep: float = 10, timeout: float = 600, silent: bool = True): - self.max_try = max_try - self.t_sleep = t_sleep - self.timeout = timeout - if self.timeout: - assert self.t_sleep, "must specify a period to sleep if timeout is set" - self.silent = silent - - def retry(self, f_exit, func, *args, **kwargs): - t, i = 0, 0 - while True: - try: - x = func(*args, **kwargs) - if f_exit(x): - if not self.silent: - to_screen("ready: {}".format(x)) - return x - except NotReadyError as identifier: - __logger__.debug("condition not satisfied", identifier) - if not self.silent: - to_screen("not ready yet: {}".format(x)) - i, t = i + 1, t + self.t_sleep - if self.max_try and i >= self.max_try or self.timeout and t >= self.timeout: - return None - if self.t_sleep: - time.sleep(self.t_sleep) - - -def path_join(path: Union[list, str], sep: str = '/'): - """ join path from list or str - - ['aaa', 'bbb', 'ccc'] -> 'aaa/bbb/ccc' - - ['aaa', 'bbb', ('xxx', None), 'ddd'] -> 'aaa/bbb/ccc' - - ['aaa', 'bbb', ('xxx', 'x-val'), 'ddd'] -> 'aaa/bbb/xxx/x-val/ccc' - """ - def is_single_element(x): - return isinstance(x, str) or not isinstance(x, Iterable) - if is_single_element(path): - return str(path) - p_lst = [] - for p in path: - if not p: - continue - if is_single_element(p): - p_lst.append(str(p)) - elif all(p): - p_lst.extend([str(x) for x in p]) - return '/'.join(p_lst) - - -def get_response(method: str, path: Union[list, str], headers: dict = None, body: dict = None, allowed_status: list = [200], **kwargs): - """an easy wrapper of request, including: - - path accept a list of strings and more complicated input - - will checked the response status_code, raise RestSrvError if not in the allowed_status - """ - path = path_join(path) - headers = na(headers, {}) - body = na(body, {}) - application_json = 'Content-Type' not in headers or headers['Content-Type'] == 'application/json' - response = requests.request(method, path, headers=headers, ** kwargs, **{ - "json" if application_json else "data": body, - "verify": False, # support https - }) - __logger__.debug('----------Response-------------\n%s', dump.dump_all(response).decode('utf-8')) - if allowed_status and response.status_code not in allowed_status: - __logger__.warn(response.status_code, response.json()) - raise RestSrvError(response.status_code, response.json()) - return response - - -def run_command(commands, # type: Union[list, str] - cwd=None, # type: str - ): - command = commands if isinstance(commands, str) else " ".join(commands) - with safe_chdir(cwd): - rtn_code = os.system(command) - if rtn_code: - raise subprocess.CalledProcessError(rtn_code, commands) - - -def sys_call(args, dec_mode: str = 'utf-8'): - p = subprocess.Popen(args, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) - out, err = p.communicate() - if dec_mode: - out, err = out.decode(dec_mode), err.decode(dec_mode) - if p.returncode: - raise subprocess.CalledProcessError(f"ErrCode: {p.returncode}, {err}") - return out, err - - -def find(fmt: str, s: str, g: int = 1, func=None): - import re - func = na(func, re.match) - m = func(fmt, s) - return m.group(g) if m else None - - -def na(a, default): - return a if a is not None else default - - -def na_lazy(a, fn, *args, **kwargs): - return a if a is not None else fn(*args, **kwargs) - - -def flatten(lst: list): - return sum(lst, []) - - -def randstr(num: int = 10, letters=None): - "get a random string with given length" - import string - import random - letters = na(letters, string.ascii_letters) - return ''.join(random.choice(letters) for i in range(num)) diff --git a/contrib/python-sdk/setup.py b/contrib/python-sdk/setup.py deleted file mode 100644 index ae7af9b9de..0000000000 --- a/contrib/python-sdk/setup.py +++ /dev/null @@ -1,15 +0,0 @@ -from setuptools import setup - -setup(name='openpaisdk', - version='0.4.00', - description='A simple SDK for OpenPAI', - url='https://github.com/microsoft/pai/contrib/python-sdk', - packages=['openpaisdk'], - install_requires=[ - 'requests', 'hdfs', 'PyYAML', 'requests-toolbelt', 'html2text', 'tabulate' - ], - entry_points={ - 'console_scripts': ['opai=openpaisdk.command_line:main'], - }, - zip_safe=False - ) diff --git a/contrib/python-sdk/test/basic_test.py b/contrib/python-sdk/test/basic_test.py deleted file mode 100644 index e948df0ecf..0000000000 --- a/contrib/python-sdk/test/basic_test.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import os -import unittest -from typing import Union -from openpaisdk.io_utils import to_screen, safe_chdir - - -def separated(method): - "run the each test in a separated directory" - def func(*args, **kwargs): - dir_name = 'utdir_' + method.__name__ - os.makedirs(dir_name, exist_ok=True) - try: - with safe_chdir(dir_name): - method(*args, **kwargs) - except Exception as identifier: - raise identifier - finally: - to_screen(f"trying to remove {dir_name}") - # ! rmtree not work on windows - os.system(f'rm -rf {dir_name}') - return func - - -class OrderedUnitTestCase(unittest.TestCase): - - def get_steps(self): - for name in dir(self): # dir() result is implicitly sorted - if name.lower().startswith("step"): - yield name, getattr(self, name) - - def run_steps(self): - for name, func in self.get_steps(): - try: - to_screen(f"\n==== begin to test {name} ====") - func() - except Exception as identifier: - self.fail("test {} failed ({}: {})".format(name, type(identifier), repr(identifier))) - - def cmd_exec(self, cmds: Union[list, str]): - if isinstance(cmds, list): - cmds = ' '.join(cmds) - print(cmds) - exit_code = os.system(cmds) - self.assertEqual(exit_code, 0, f"fail to run {cmds}") diff --git a/contrib/python-sdk/test/test_command_line.py b/contrib/python-sdk/test/test_command_line.py deleted file mode 100644 index 008ee62aaf..0000000000 --- a/contrib/python-sdk/test/test_command_line.py +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import os -from openpaisdk import get_defaults, ClusterList, JobStatusParser -from openpaisdk.utils import run_command, randstr -from openpaisdk.io_utils import to_screen -from typing import Union -from basic_test import OrderedUnitTestCase, separated - - -def get_cmd(cmd: Union[str, list], flags: dict, args: Union[list, str] = None): - lst = [] - lst.extend(cmd if isinstance(cmd, list) else cmd.split()) - for flag, value in flags.items(): - lst.extend(["--" + flag, value.__str__()]) - if args: - lst.extend(args if isinstance(args, list) else args.split()) - return lst - - -def run_commands(*cmds, sep: str = '&&'): - lst = [] - for i, c in enumerate(cmds): - lst.extend(c) - if i != len(cmds) - 1: - lst.append(sep) - run_command(lst) - - -def run_test_command(cmd: Union[str, list], flags: dict, args: Union[list, str] = None): - run_command(get_cmd(cmd, flags, args)) - - -def gen_expected(dic: dict, **kwargs): - dic2 = {k.replace("-", "_"): v if k != "password" else "******" for k, v in dic.items()} - dic2.update(kwargs) - return dic2 - - -class TestCommandLineInterface(OrderedUnitTestCase): - - ut_init_shell = os.path.join('..', 'ut_init.sh') - - def step1_init_clusters(self): - to_screen("""\ -testing REST APIs related to retrieving cluster info, including -- rest_api_cluster_info -- rest_api_user -- rest_api_token -- rest_api_virtual_clusters - """) - with open(self.ut_init_shell) as fn: - for line in fn: - if line.startswith('#'): - continue - self.cmd_exec(line) - alias = get_defaults()["cluster-alias"] - self.assertTrue(alias, "not specify a cluster") - self.cmd_exec('opai cluster resources') - - def step2_submit_job(self): - import time - to_screen("""\ -testing REST APIs related to submitting a job, including -- rest_api_submit - """) - self.job_name = 'ut_test_' + randstr(10) - self.cmd_exec(['opai', 'job', 'sub', '-i', 'python:3', '-j', self.job_name, 'opai cluster resources']) - time.sleep(10) - - def step3_job_monitoring(self): - to_screen("""\ -testing REST APIs related to querying a job, including -- rest_api_job_list -- rest_api_job_info - """) - client = ClusterList().load().get_client(get_defaults()["cluster-alias"]) - self.cmd_exec(['opai', 'job', 'list']) - job_list = client.rest_api_job_list(client.user) # ! only jobs from current user to reduce time - job_list = [job['name'] for job in job_list] - assert self.job_name in job_list, job_list - to_screen(f"testing job monitoring with {self.job_name}") - status = client.rest_api_job_info(self.job_name) - to_screen(f"retrieving job status and get its state {JobStatusParser.state(status)}") - client.rest_api_job_info(self.job_name, 'config') - to_screen("retrieving job config") - logs = JobStatusParser.all_tasks_logs(status) - assert logs, f"failed to read logs from status \n{status}" - for k, v in logs.items(): - for t, content in v.items(): - to_screen(f"reading logs {k} for {t} and get {len(content)} Bytes") - - @separated - def test_commands_sequence(self): - self.run_steps() diff --git a/contrib/python-sdk/test/test_format.py b/contrib/python-sdk/test/test_format.py deleted file mode 100644 index f79698d39d..0000000000 --- a/contrib/python-sdk/test/test_format.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import os -import sys -import unittest - - -in_place_chaning = False - - -class TestFormat(unittest.TestCase): - - folders = [os.path.join('..', 'openpaisdk'), '.'] - - def test_format(self): - for folder in self.folders: - root, dirs, files = next(os.walk(folder)) - for src in [fn for fn in files if fn.endswith(".py")]: - os.system(' '.join([ - sys.executable, '-m', 'autoflake', - '--remove-unused-variables', - '--remove-all-unused-imports', - '--remove-duplicate-keys', - '--ignore-init-module-imports', - '-i' if in_place_chaning else '', - os.path.join(folder, src) - ])) - - def clear_notebook_output(self): - folders = [ - os.path.join('..', 'examples'), - os.path.join('..', '..', 'notebook-extension', 'examples'), - ] - for folder in folders: - root, dirs, files = next(os.walk(folder)) - for file in [fn for fn in files if fn.endswith('.ipynb')]: - src = os.path.join(folder, file) - print(src) - os.system(f"jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace {src}") - os.system(f"dos2unix {src}") - - -if __name__ == '__main__': - in_place_chaning = True - TestFormat().test_format() - TestFormat().clear_notebook_output() diff --git a/contrib/python-sdk/test/test_job.py b/contrib/python-sdk/test/test_job.py deleted file mode 100644 index 4ed26aa71f..0000000000 --- a/contrib/python-sdk/test/test_job.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -from basic_test import OrderedUnitTestCase, separated -from openpaisdk import to_screen - - -class TestJobResource(OrderedUnitTestCase): - - def test_job_resource_parser(self): - from openpaisdk.job import JobResource - from openpaisdk import __flags__ - self.assertDictEqual(__flags__.resources_requirements, JobResource(None).as_dict) - self.assertDictEqual(__flags__.resources_requirements, JobResource().as_dict) - self.assertDictEqual(__flags__.resources_requirements, JobResource({}).as_dict) - dic = dict(cpu=-1, gpu=-2, memoryMB=-1024) - for key, value in dic.items(): - self.assertEqual(value, JobResource(dic).as_dict[key]) - dic['mem'] = '-2gb' - self.assertEqual(-2048, JobResource(dic).as_dict["memoryMB"]) - dic['mem'] = '-3g' - self.assertEqual(-3072, JobResource(dic).as_dict["memoryMB"]) - dic['mem'] = 10240 - self.assertEqual(10240, JobResource(dic).as_dict["memoryMB"]) - self.assertEqual({"a": 1}, JobResource(dic).add_port("a").as_dict["ports"]) - - def test_job_resource_list(self): - from openpaisdk.job import JobResource - samples = { - "3,3,3g": dict(gpu=3, cpu=3, memoryMB=3072, ports={}), - "3,1, 2g": dict(gpu=3, cpu=1, memoryMB=2048, ports={}), - } - keys = list(samples.keys()) - rets = JobResource.parse_list(keys) - for k, r in zip(keys, rets): - self.assertDictEqual(r, samples[k]) diff --git a/contrib/python-sdk/test/test_notebook.py b/contrib/python-sdk/test/test_notebook.py deleted file mode 100644 index 90f14a016b..0000000000 --- a/contrib/python-sdk/test/test_notebook.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -from basic_test import OrderedUnitTestCase, separated -from openpaisdk import to_screen - - -class TestNbExtCfg(OrderedUnitTestCase): - - settings = dict(cpu=100, gpu=-2, mem='90g') - - def step1_init(self): - from openpaisdk.notebook import NotebookConfiguration - NotebookConfiguration.print_supported_items() - - def step2_setup(self): - from openpaisdk.notebook import NotebookConfiguration - from openpaisdk import LayeredSettings - NotebookConfiguration.set(**self.settings) - for key in self.settings.keys(): - LayeredSettings.update('user_basic', key, -1) - - def step3_check(self): - from openpaisdk.notebook import NotebookConfiguration - to_screen(NotebookConfiguration.get()) - dic = {k: NotebookConfiguration.get(k) for k in self.settings} - self.assertDictEqual(dic, self.settings) - - @separated - def test_nbext_configuration(self): - self.run_steps() diff --git a/contrib/python-sdk/test/test_utils.py b/contrib/python-sdk/test/test_utils.py deleted file mode 100644 index b404764474..0000000000 --- a/contrib/python-sdk/test/test_utils.py +++ /dev/null @@ -1,226 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import os -import unittest -from copy import deepcopy -from openpaisdk.utils import OrganizedList as ol -from openpaisdk.utils import Nested -from openpaisdk.utils import randstr -from openpaisdk.io_utils import __flags__, from_file, to_screen -from openpaisdk import get_defaults, update_default, LayeredSettings -from basic_test import separated - - -class TestIOUtils(unittest.TestCase): - - @separated - def test_reading_failures(self): - with self.assertRaises(Exception): # non existing file - from_file(randstr(8) + '.yaml') - with self.assertRaises(AssertionError): # unsupported file extension - from_file(randstr(10)) - with self.assertRaises(Exception): - fname = randstr(10) + '.json' - os.system(f"touch {fname}") - from_file(fname) - - @separated - def test_returning_default(self): - for dval in [[], ['a', 'b'], {}, {'a': 'b'}]: - ass_fn = self.assertListEqual if isinstance(dval, list) else self.assertDictEqual - with self.assertRaises(AssertionError): # unsupported file extension - from_file(randstr(10)) - fname = randstr(8) + '.yaml' - ass_fn(from_file(fname, dval), dval) # non existing - os.system(f"echo '' > {fname}") - ass_fn(from_file(fname, dval), dval) - os.system(f"echo 'abcd' > {fname}") - ass_fn(from_file(fname, dval), dval) - - -class TestDefaults(unittest.TestCase): - - global_default_file = __flags__.get_default_file(is_global=True) - local_default_file = __flags__.get_default_file(is_global=False) - - def get_random_var_name(self): - import random - from openpaisdk import LayeredSettings - lst = [x for x in LayeredSettings.keys() if not LayeredSettings.act_append(x)] - ret = lst[random.randint(0, len(lst) - 1)] - to_screen(f"random select {ret} in {lst}") - return ret - - @separated - def test_update_defaults(self): - # ! not test global defaults updating, test it in integration tests - test_key, test_value = self.get_random_var_name(), randstr(10) - # add a default key - update_default(test_key, test_value, is_global=False, to_delete=False) - self.assertEqual(get_defaults()[test_key], test_value, - msg=f"failed to check {test_key} in {LayeredSettings.as_dict()}") - # should appear in local - self.assertEqual(from_file(self.local_default_file)[test_key], test_value) - # delete - update_default(test_key, test_value, is_global=False, to_delete=True) - with self.assertRaises(KeyError): - os.system(f"cat {self.local_default_file}") - from_file(self.local_default_file, {})[test_key] - # add not allowed - test_key = randstr(10) - update_default(test_key, test_value, is_global=False, to_delete=False) - with self.assertRaises(KeyError): - from_file(self.local_default_file, {})[test_key] - - @separated - def test_layered_settings(self): - from openpaisdk import LayeredSettings, __flags__ - __flags__.custom_predefined = [ - { - 'name': 'test-key-1', - }, - { - 'name': 'test-key-2', - 'action': 'append', - 'default': [] - } - ] - LayeredSettings.reset() - # ? add / update append key - for test_key in ['test-key-1', 'test-key-2']: - for i, layer in enumerate(LayeredSettings.layers): - LayeredSettings.update(layer.name, test_key, i) - if layer.act_append(test_key): - self.assertTrue(isinstance(layer.values[test_key], list), msg=f"{layer.values}") - self.assertEqual(0, LayeredSettings.get('test-key-1')) - self.assertListEqual([0, 1, 2, 3], LayeredSettings.get('test-key-2')) - # ? delete - for test_key in ['test-key-1', 'test-key-2']: - for i, layer in enumerate(LayeredSettings.layers): - LayeredSettings.update(layer.name, test_key, None, delete=True) - # ? reset the predefined - __flags__.custom_predefined = [] - LayeredSettings.reset() - - @separated - def test_unknown_variable_defined(self): - from openpaisdk import LayeredSettings, __flags__ - test_key, test_value = 'test-key-long-existing', randstr(10) - __flags__.custom_predefined = [ - { - 'name': test_key, - }, - ] - LayeredSettings.reset() - # ? add / update append key - LayeredSettings.update('local_default', test_key, test_value) - # ? reset the predefined - __flags__.custom_predefined = [] - LayeredSettings.reset() - self.assertEqual(test_value, LayeredSettings.get(test_key)) - # cannot delete or change the unknown variable - LayeredSettings.update('local_default', test_key, randstr(10)) - LayeredSettings.reset() - self.assertEqual(test_value, LayeredSettings.get(test_key)) - LayeredSettings.update('local_default', test_key, delete=True) - LayeredSettings.reset() - self.assertEqual(test_value, LayeredSettings.get(test_key)) - - -class TestOrganizedList(unittest.TestCase): - - class foo: - - def __init__(self, a=None, b=None, c=None, d=None): - self.a, self.b, self.c, self.d = a, b, c, d - - @property - def as_dict(self): - return {k: v for k, v in vars(self).items() if v is not None} - - def update(self, other): - for key, value in other.as_dict.items(): - setattr(self, key, value) - - lst_objs = [foo("x", 0), foo("x", 1), foo("y", 2), foo("y", c=1), foo("z", 4)] - lst = [obj.as_dict for obj in lst_objs] - - def ol_test_run(self, lst, getter): - def to_dict(obj): - return obj if isinstance(obj, dict) else obj.as_dict - dut = ol(lst[:3], "a", getter) - # find - self.assertEqual(2, dut.first_index("y")) - self.assertDictEqual(to_dict(lst[2]), to_dict(dut.first("y"))) - # filter - self.assertListEqual([0, 1], dut.filter_index("x")) - self.assertListEqual(lst[:2], dut.filter("x").as_list) - # as_dict - self.assertDictEqual(dict(x=lst[1], y=lst[2]), dut.as_dict) - # add (update) - elem = lst[-2] - dut.add(elem) - self.assertEqual(2, getter(lst[2], "b")) - self.assertEqual(1, getter(lst[2], "c")) - # add (replace) - elem = lst[-2] - dut.add(elem, replace=True) - self.assertEqual(None, getter(dut[2], "b")) - # add (append) - elem = lst[-1] - dut.add(elem) - self.assertEqual(4, getter(dut[-1], "b")) - # delete - dut.remove("z") - self.assertEqual(3, len(dut)) - dut.remove("z") - self.assertEqual(3, len(dut)) - - def test_dict(self): - self.ol_test_run(deepcopy(self.lst), dict.get) - - def test_obj(self): - self.ol_test_run(deepcopy(self.lst_objs), getattr) - - -class TestNested(unittest.TestCase): - - def test_set(self): - nested_obj = { - "a": [ - { - "aa0": { - "aaa": "val_aaa" - }, - }, - { - "aa1": { - "aaa1": "val_aaa1" - } - } - - ], - "b": "haha" - } - n = Nested(nested_obj, sep="->") - self.assertEqual(n.get("a->0->aa0->aaa"), "val_aaa") - with self.assertRaises(KeyError): - nested_obj["a"][1]["aa2"]["aaa"] - n.set("a->1->aa2->aaa", "val_aaa2") - self.assertEqual(nested_obj["a"][1]["aa2"]["aaa"], "val_aaa2") diff --git a/contrib/samba-aad-server/README.md b/contrib/samba-aad-server/README.md deleted file mode 100644 index 902307ecbb..0000000000 --- a/contrib/samba-aad-server/README.md +++ /dev/null @@ -1,74 +0,0 @@ -# Samba server with AAD integration - -A samba server integrated with AAD. Has a shared path and private paths for AD users, and create a shared account. -Also, it offers api to query user groups by user name. -This is an example of samba server with AAD integration, please change to your own configuration before use. - -## Index -- [Components](#Components) -- [How to Use](#How_to_Use) - -### Components -- Samba server -Data Structure: -``` -root - -- data - -- users - -- user1 - -- user2 - -- user3 -``` -data: Shared folder. -user: User private folder, user folder will be created when user first use samba. - -- Nginx service -A service that can query user groups through domain user name. - - -### How to Use -- Replace with your own configs -krb5.conf: Replace realms. -smb.conf: Replace realm and id map. -domaininfo.py: Replace corp domains. - -- Build docker image -``` -./build.sh -``` - -- Start service -``` -./start.sh -``` -Variable|Spec ---|:--: -DOMAIN|Domain to join, e.g. FAREAST -DOMAINUSER|Existing domain user name. Will join domain using this account -DOMAINPWD|Password for domain user -PAISMBUSER|Create new local samba account for PAI to use -PAISMBPWD|Password for new samba account - -- Access samba with domain-joined windows system. -In windows file explorer, input: -``` -\\ -``` -This will show two folders: data and home. -Data folder is a shared folder for all users. -Home folder is private folder for current AD user. - -- Mount samba using personal account -``` -mount -t cifs /// -o username=,password=,domain= -``` - -- Mount samba using PAI account -``` -mount -t cifs /// -o username=,password=,domain=WORKGROUP -``` - -- Query user groups -``` -http://:/GetUserId?userName= -``` diff --git a/contrib/samba-aad-server/README_zh_CN.md b/contrib/samba-aad-server/README_zh_CN.md deleted file mode 100644 index b6f5019448..0000000000 --- a/contrib/samba-aad-server/README_zh_CN.md +++ /dev/null @@ -1,74 +0,0 @@ -# Samba server with AAD integration - -A samba server integrated with AAD. Has a shared path and private paths for AD users, and create a shared account. -Also, it offers api to query user groups by user name. -This is an example of samba server with AAD integration, please change to your own configuration before use. - -## Index - -- [Components](#Components) -- [How to Use](#How_to_Use) - -### Components - -- Samba server Data Structure: - - root - -- data - -- users - -- user1 - -- user2 - -- user3 - - -data: Shared folder. -user: User private folder, user folder will be created when user first use samba. - -- Nginx service A service that can query user groups through domain user name. - -### How to Use - -- Replace with your own configs krb5.conf: Replace realms. smb.conf: Replace realm and id map. domaininfo.py: Replace corp domains. - -- Build docker image - - ./build.sh - - -- Start service - - ./start.sh - - -| Variable | Spec | -| ---------- |:--------------------------------------------------------------:| -| DOMAIN | Domain to join, e.g. FAREAST | -| DOMAINUSER | Existing domain user name. Will join domain using this account | -| DOMAINPWD | Password for domain user | -| PAISMBUSER | Create new local samba account for PAI to use | -| PAISMBPWD | Password for new samba account | - - -- Access samba with domain-joined windows system. - In windows file explorer, input: - - \\ - - -This will show two folders: data and home. -Data folder is a shared folder for all users. -Home folder is private folder for current AD user. - -- Mount samba using personal account - - mount -t cifs /// -o username=,password=,domain= - - -- Mount samba using PAI account - - mount -t cifs /// -o username=,password=,domain=WORKGROUP - - -- Query user groups - - http://:/GetUserId?userName= \ No newline at end of file diff --git a/contrib/samba-aad-server/build.sh b/contrib/samba-aad-server/build.sh deleted file mode 100644 index cabe47b02d..0000000000 --- a/contrib/samba-aad-server/build.sh +++ /dev/null @@ -1 +0,0 @@ -docker build -t paismb:stable build/ \ No newline at end of file diff --git a/contrib/samba-aad-server/build/Dockerfile b/contrib/samba-aad-server/build/Dockerfile deleted file mode 100644 index 390e9466ce..0000000000 --- a/contrib/samba-aad-server/build/Dockerfile +++ /dev/null @@ -1,39 +0,0 @@ -FROM ubuntu:16.04 - -COPY krb5.conf /etc/krb5.conf -COPY nsswitch.conf /etc/nsswitch.conf - -RUN apt-get update && \ - apt-get install -y \ - samba \ - attr \ - winbind \ - libpam-winbind \ - libnss-winbind \ - libpam-krb5 \ - krb5-config \ - krb5-user \ - cifs-utils \ - nginx \ - python-dev \ - python-pip - -RUN pip install flask \ - flask_restful \ - uwsgi - -COPY smb.conf /etc/samba/smb.conf -COPY default /etc/nginx/sites-available/default - -ENV SHARE_ROOT=/share/pai - -ADD infosrv /infosrv -RUN mkdir -p /infosrv/uwsgi -COPY run.sh /run.sh -RUN chmod +x /run.sh -COPY sambauserhomecreate /usr/bin/ -RUN chmod +x /usr/bin/sambauserhomecreate -COPY sambadatacreate /usr/bin/ -RUN chmod +x /usr/bin/sambadatacreate - -CMD /run.sh diff --git a/contrib/samba-aad-server/build/default b/contrib/samba-aad-server/build/default deleted file mode 100644 index 246dc8f291..0000000000 --- a/contrib/samba-aad-server/build/default +++ /dev/null @@ -1,28 +0,0 @@ -## -# You should look at the following URL's in order to grasp a solid understanding -# of Nginx configuration files in order to fully unleash the power of Nginx. -# http://wiki.nginx.org/Pitfalls -# http://wiki.nginx.org/QuickStart -# http://wiki.nginx.org/Configuration -# -# Generally, you will want to move this file somewhere, and start with a clean -# file but keep this around for reference. Or just disable in sites-enabled. -# -# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. -## - -# Default server configuration -# -server { - listen 80 default_server; - listen [::]:80 default_server; - - server_name _domaininfo_; - - location / { - include uwsgi_params; - #uwsgi_pass unix:/infosrv/uwsgi/uwsgi.sock; - uwsgi_pass 127.0.0.1:8988; - } - -} diff --git a/contrib/samba-aad-server/build/infosrv/domaininfo.py b/contrib/samba-aad-server/build/infosrv/domaininfo.py deleted file mode 100644 index 1c1a500e63..0000000000 --- a/contrib/samba-aad-server/build/infosrv/domaininfo.py +++ /dev/null @@ -1,62 +0,0 @@ -import sys -import json -import os - -from flask import Flask -from flask_restful import reqparse, abort, Api, Resource -from flask import request, jsonify -import base64 -import subprocess - - -app = Flask(__name__) -api = Api(app) - - - -parser = reqparse.RequestParser() - -def cmd_exec(cmdStr): - try: - output = subprocess.check_output(["bash","-c", cmdStr]).strip() - except Exception as e: - print(e) - output = "" - return output - -class GetUserId(Resource): - def get(self): - parser.add_argument('userName') - args = parser.parse_args() - ret = {} - - if args["userName"] is not None and len(args["userName"].strip()) > 0: - # Replace with your corp domains - corpDomains = ['ATHENA'] - ret["uid"] = "" - - for corpDomain in corpDomains: - if len(ret["uid"].strip())==0: - userName = str(args["userName"]).strip().split("@")[0] - uid = cmd_exec("id -u %s\\\\%s" % (corpDomain,userName)) - gid = cmd_exec("id -g %s\\\\%s" % (corpDomain,userName)) - groups = cmd_exec("id -Gnz %s\\\\%s" % (corpDomain,userName)).split("\0") - - ret["uid"] = uid - ret["gid"] = gid - ret["groups"] = groups - - - resp = jsonify(ret) - resp.headers["Access-Control-Allow-Origin"] = "*" - resp.headers["dataType"] = "json" - - return resp - -## -## Actually setup the Api resource routing here -## -api.add_resource(GetUserId, '/GetUserId') - -if __name__ == '__main__': - app.run(debug=False,host="0.0.0.0",threaded=True) diff --git a/contrib/samba-aad-server/build/infosrv/uwsgi.ini b/contrib/samba-aad-server/build/infosrv/uwsgi.ini deleted file mode 100644 index 85f7b806d4..0000000000 --- a/contrib/samba-aad-server/build/infosrv/uwsgi.ini +++ /dev/null @@ -1,17 +0,0 @@ -[uwsgi] -chdir=/infosrv -module=domaininfo -callable=app -master=true -processes=4 -chmod-socket=666 -logfile-chmod=644 -procname-prefix-spaced=DomainInfo -py-autoreload=1 -socket=127.0.0.1:8988 - -vacuum=true -socket=%(chdir)/uwsgi/uwsgi.sock -stats=%(chdir)/uwsgi/uwsgi.status -pidfile=%(chdir)/uwsgi/uwsgi.pid -daemonize=%(chdir)/uwsgi/uwsgi.log diff --git a/contrib/samba-aad-server/build/krb5.conf b/contrib/samba-aad-server/build/krb5.conf deleted file mode 100644 index d464aa2cfd..0000000000 --- a/contrib/samba-aad-server/build/krb5.conf +++ /dev/null @@ -1,39 +0,0 @@ -# This is a template configure file. Please change to your own settings before use. -[libdefaults] - ticket_lifetime = 24h -# Replace with your own default realm - default_realm = ATHENA.MIT.EDU - forwardable = true - -# Replace with your own realms -[realms] - ATHENA.MIT.EDU = { - kdc = kerberos.mit.edu - kdc = kerberos-1.mit.edu - kdc = kerberos-2.mit.edu:88 - admin_server = kerberos.mit.edu - default_domain = mit.edu - } - -# Replace with your own domain realms -[domain_realm] - .mit.edu = ATHENA.MIT.EDU - mit.edu = ATHENA.MIT.EDU - -#[kdc] -# profile = /etc/krb5kdc/kdc.conf - -[appdefaults] - pam = { - debug = false - ticket_lifetime = 36000 - renew_lifetime = 36000 - forwardable = true - krb4_convert = false - } - -[logging] - kdc = SYSLOG:INFO:DAEMON - kdc = FILE:/var/log/krb5kdc.log - admin_server = FILE:/var/log/kadmin.log - default = FILE:/var/log/krb5lib.log diff --git a/contrib/samba-aad-server/build/nsswitch.conf b/contrib/samba-aad-server/build/nsswitch.conf deleted file mode 100644 index de1ce83877..0000000000 --- a/contrib/samba-aad-server/build/nsswitch.conf +++ /dev/null @@ -1,20 +0,0 @@ -# /etc/nsswitch.conf -# -# Example configuration of GNU Name Service Switch functionality. -# If you have the `glibc-doc-reference' and `info' packages installed, try: -# `info libc "Name Service Switch"' for information about this file. - -passwd: compat winbind -group: compat winbind -shadow: compat -gshadow: files - -hosts: files dns -networks: files - -protocols: db files -services: db files -ethers: db files -rpc: db files - -netgroup: compat winbind diff --git a/contrib/samba-aad-server/build/run.sh b/contrib/samba-aad-server/build/run.sh deleted file mode 100644 index c26417948b..0000000000 --- a/contrib/samba-aad-server/build/run.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -sed -i 's/%$(PAISMBUSER)/'$PAISMBUSER'/' /etc/samba/smb.conf -sed -i 's/%$(DOMAIN)/'$DOMAIN'/' /etc/samba/smb.conf - -net ads join -U "$DOMAINUSER"%"$DOMAINPWD" -service winbind restart -service smbd restart - -useradd "$PAISMBUSER" -(echo "$PAISMBPWD" && echo "$PAISMBPWD") | ./usr/bin/smbpasswd -a "$PAISMBUSER" - -uwsgi --ini /infosrv/uwsgi.ini -service nginx stop -nginx -g 'daemon off;' diff --git a/contrib/samba-aad-server/build/sambadatacreate b/contrib/samba-aad-server/build/sambadatacreate deleted file mode 100644 index adcc2e105f..0000000000 --- a/contrib/samba-aad-server/build/sambadatacreate +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -paiuser=$1 - -datapath=/share/pai/data -umask 000 -if [ ! -d "$datapath" ];then - mkdir -p "$datapath" - chown "$paiuser":"$paiuser" "$datapath" -fi diff --git a/contrib/samba-aad-server/build/sambauserhomecreate b/contrib/samba-aad-server/build/sambauserhomecreate deleted file mode 100644 index 5b5000bd8a..0000000000 --- a/contrib/samba-aad-server/build/sambauserhomecreate +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -user=$1 -domain=$2 -uname=$3 -paiuser=$4 - -userspath=/share/pai/users -umask 000 -if [ ! -d "$userspath" ];then - mkdir -p "$userspath" - chown "$paiuser":"$paiuser" "$userspath" -fi - -umask 007 -userpath="$userspath"/"$user" -if [ ! -d "$userpath" ];then - mkdir -p "$userpath" - if [ $user != $uname ] - then - chown "$domain\\$user":"$paiuser" $userpath - else - chown "$user":"$paiuser" $userpath - fi - setfacl -m u:"$paiuser":rwx $userpath -fi diff --git a/contrib/samba-aad-server/build/smb.conf b/contrib/samba-aad-server/build/smb.conf deleted file mode 100644 index 67ffed80f8..0000000000 --- a/contrib/samba-aad-server/build/smb.conf +++ /dev/null @@ -1,118 +0,0 @@ -# This is a template configure file. Please change to your own settings before use. -# Further doco is here -# https://www.samba.org/samba/docs/man/manpages/smb.conf.5.html -[global] - # No .tld - workgroup = %$(DOMAIN) - # Active Directory System - security = ADS - - # Replace with your own realm defined in krb5.conf - realm = ATHENA.MIT.EDU - -# map to guest = bad user -# guest account = guest - # Just a member server - domain master = No - local master = No - preferred master = No - # Works both in samba 3.2 and 3.6 and 4.1 - - # Replace with your own idmap config - idmap config * : backend = rid - idmap config * : range = 900000000-999999999 - idmap config ATHENA : backend = rid - idmap config ATHENA : range = 100000000-199999999 - - - # One week is the default - idmap cache time = 604800 - # If you set this to 0 winbind will get thrown into a loop and - # be stuck at 99% mem and cpu. - # 5m is the default - winbind cache time = 300 - winbind enum users = No - winbind enum groups = No - # This way users log in with username instead of username@example.org - winbind use default domain = No - # Do not recursively descend into groups, it kills performance - winbind nested groups = No - # This is what slows down logins, if we didn't care about resolving groups - # we could set this to 0 - winbind expand groups = 0 - winbind refresh tickets = Yes - # Using offline login = Yes forces max domain connections to 1 - winbind offline logon = No - winbind max clients = 1500 - winbind max domain connections = 50 - - # winbind separator = @ - winbind:ignore domains = 001D 064D 343I ADVENTUREWORKS9 AMALGA AMALGATEST BIGPARK BINGLAB CAE CCSSELFHOST CDV CERDP CETI CFDEV CLOUDLAB CONNECTED CONTOSO-01 CPEXEC CPMT CPMTPPE CRMDFIFDDOM CSLAB CTDEV DCLAB E14 E15 ERIDANUS EXCHANGE EXTRANET EXTRANETTEST FORNAX FULTONDOMAIN GME GMR HADEV HAVANATWO HEALTH HOSPITALA HVAADCS HYDRI HYPER-V IDCNETTEST ISLAND IT ITNEXTGENLAB LAB1BOISE LHWKSTA MASSIVEINCORPOR MEXEXCHANGEDC MGDNOK MMS MPSD-WI MR MSGENG MS-GMR MSLPA MSSTORE MSTT MTETCS MUTEST MYOPWV NEBCPS1 NEBCPS2 NEBCPS3 NEBCPS4 NEBCPS5 NLCPS1 NEBCPST NEBCPST NOE NOKIAEA NORTHWINDTEST NTDEV OBPPERF OCTANS OEXTRANET OFFICEDOG OFORNAX OSSCPUB OUALAB PARTNERS PARTTEST PCTS PDSTEAM PEOPLETEST PHX PIN PORTAL PROSUPPORT PRVFAB PYXIDIS RESOURCE REVOLUTION2 SAW SDITESTT SEDEV SEGROUP SENET SENTILLIONINC SLCLAB SPEECH SPWLAB SPXMAILDOMAIN STBTEST STODC01 SYS-SQLSVR SYS-WINGROUP TANGODOM1 TELECOMLAB TEQUILA Threshold TNT UKMCS UPGROUP VE VMLIBDOM VOMJUMPSTART WGIA WINDEPLOY WINSE WINSE-CTDEV WINSRVLAB WMD WPDEV XCORP XCORP XGROUP XGROUP XGROUPPPE XPORTAL XRED ZIPLINE - # Disable printer support - load printers = No - printing = bsd - printcap name = /dev/null - disable spoolss = yes - # Becomes /home/example/username - template homedir = /storage/users/%U - # shell access - template shell = /bin/bash - client use spnego = Yes - client ntlmv2 auth = Yes - encrypt passwords = Yes - restrict anonymous = 2 - log level = 2 - log file = /var/log/samba/samba.log - smb2 max read = 8388608 - smb2 max write = 8388608 - smb2 max trans = 8388608 - # This is fairly custom to Ubuntu - # See www.samba.org/samba/docs/man/manpages-3/smb.conf.5.html#ADDMACHINESCRIPT - # and https://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/domain-member.html - add machine script = /usr/sbin/adduser --system --gecos %u --home /var/lib/nobody --shell /bin/false --uid 300 --no-create-home %u - - -[root] - comment = Samba share root - path = /share/pai - valid users = %$(PAISMBUSER) - writable = yes - browseable = no - #root preexec = /usr/bin/sambarootcreate %$(PAISMBUSER) - create mask = 0777 - directory mask = 0777 - -[users] - comment = Samba share users - path = /share/pai/users - valid users = %$(PAISMBUSER) - writable = yes - browseable = no - root preexec = /usr/bin/sambauserhomecreate %U %D %u %$(PAISMBUSER) - create mask = 0777 - directory mask = 0777 - -[home] - comment = Samba share user home - path = /share/pai/users/%U - writeable = yes - browseable = yes - valid users = %$(PAISMBUSER) %D\%U - root preexec = /usr/bin/sambauserhomecreate %U %D %u %$(PAISMBUSER) - create mask = 0777 - -[data] - comment = Samba share data - path = /share/pai/data - valid users = %$(PAISMBUSER) %D\%U - writable = yes - browseable = yes - root preexec = /usr/bin/sambadatacreate %$(PAISMBUSER) - directory mask = 0777 - force directory mode = 0777 - directory security mask = 0777 - force directory security mode = 0777 - create mask = 0777 - force create mode = 0777 - security mask = 0777 - force security mode = 0777 diff --git a/contrib/samba-aad-server/start.sh b/contrib/samba-aad-server/start.sh deleted file mode 100644 index 4d1a45bee6..0000000000 --- a/contrib/samba-aad-server/start.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -if [ -z "$5" ]; then - echo "usage: ./start.sh " -else - DOMAIN=$1 - DOMAINUSER=$2 - DOMAINPWD=$3 - PAISMBUSER=$4 - PAISMBPWD=$5 - - mkdir -p /share/pai - docker run -dit --privileged --restart=always -p 8079:80 -p 445:445 --mount type=bind,source=/share/pai,target=/share/pai \ - --name paismb -e DOMAIN="$DOMAIN" -e DOMAINUSER="$DOMAINUSER" -e DOMAINPWD="$DOMAINPWD" \ - -e PAISMBUSER="$PAISMBUSER" -e PAISMBPWD="$PAISMBPWD" paismb:stable -fi \ No newline at end of file diff --git a/contrib/storage_plugin/README.MD b/contrib/storage_plugin/README.MD deleted file mode 100644 index 47ab4e89d0..0000000000 --- a/contrib/storage_plugin/README.MD +++ /dev/null @@ -1,241 +0,0 @@ -# Team wise storage - -*NOTICE: This tool has been deprecated, please refer to [Setup Kubernetes Persistent Volumes as Storage on PAI](../../docs/setup-persistent-volumes-on-pai.md).* - - -A tool to manage external storage in PAI. - -## Index -- [ What is team wise storage](#Team_storage) -- [ Team wise storage usages ](#Usages) - - [ Setup server ](#Usages_setup_server) - - [ Create storage server in PAI ](#Usages_server) - - [ Create storage config in PAI ](#Usages_config) - - [ Set storage config access for group ](#Usages_groupsc) - - [ Use Storage in PAI ](#Usages_job) - - [ Example ](#Usages_example) -- [ Storage data structure ](#Data_structure) - - [ Server data structure ](#Server_data) - - [ Nfs Server data structure ](#Nfs_data) - - [ Samba Server data structure ](#Samba_data) - - [ Azurefile Server data structure ](#Azurefile_data) - - [ Azureblob Server data structure ](#Azureblob_data) - - [ Hdfs Server data structure ](#Hdfs_data) - - [ Config data structure ](#Config_data) - - [ Config in group data ](#Config_in_group_data) - -## What is team wise storage -Team wise storage is a solution that helps admin to manage NAS(network attached storage) by team/group. After admin configured team wise storage settings, users can easily use NAS in their jobs.
      -Team wise storage solution offers: -- Multiple NAS support, including NFS, Samba, Azurefile, Azureblob and HDFS -- Configurable mount structure settings -- Mixed usage for different NAS -- Configuration for Team/Group scope - -## Team wise storage usages - -### Setup server -- NFS - -Edit /etc/exports, export /root/path/to/share -``` -/root/path/to/share (rw, sync, no_root_squash) -``` -no_root_squash is needed for storage plugin to creae folders. - -- Samba - -After create samba server, create user for PAI to use samba. -``` -useradd paismb -smbpasswd -a paismb -#Input password for paismb -``` - -- Azurefile - -Create Azurefile share through azure web portal. - -- Azureblob - -Create Azureblob share through azure web portal. - - -### Create storage server in PAI -In PAI dev-box, swith to folder pai/contrib/storage-plugin - -Create server config using command: -- NFS: -``` -python storagectl.py server set NAME nfs ADDRESS ROOTPATH -``` - -- Samba: -``` -python storagectl.py server set NAME samba ADDRESS ROOTPATH USERNAME PASSWORD DOMAIN -``` - -- Azurefile: -``` -python storagectl.py server set NAME azurefile DATASTORE FILESHARE ACCOUNTNAME KEY - ``` - -- Azureblob: -``` -python storagectl.py server set NAME azureblob DATASTORE CONTAINERNAME ACCOUNTNAME KEY -``` - -- HDFS: -``` -python storagectl.py server set NAME hdfs NAMENODE PORT -``` - -### Create storage config in PAI -In PAI dev-box, swith to folder pai/contrib/storage-plugin - -Create config using command: -``` -python storagectl.py config set CONFIG_NAME GROUP_NAME [-s SERVER_NAME_1 SERVER_NAME_2 ...] [-m MOUNT_POINT SERVER PATH]... [-d] -``` - -### Set storage config access for group -In PAI dev-box, swith to folder pai/contrib/storage-plugin - -Set storage config access for group using command: -``` -python storagectl.py groupsc add GROUP_NAME CONFIG_NAME -``` - -### Use Storage info in job container -User can use team wise storage through job submit page. Please refer to related page for details. - -### Example -Suppose admin has set up a new samba server "smbserver" on "10.0.0.0", created PAI account "paismb" with password "paipwd". -The structure of samba server is as follows: -``` --- root - -- data - -- users - -- user1 - -- user2 - ... -``` -Now we want all members of "paigroup" mount server's data folder to /data, and user's data (e.g user1) to /user by default. The admin should setup storage config in PAI using: -```bash -python storagectl.py server set smbserver samba 10.0.0.1 root paismb paipwd local -python storagectl.py config set configsmb -s smbserver -m /data smbserver data -m /user smbserver 'users/${PAI_USER_NAME}' -d -python storagectl.py groupsc add paigroup configsmb -``` -Then when "paiuser" from "paigroup" uses job submit page, the configsmb will be shown and user can choose whether to use it
      - - -## Team wise storage data structures - -### Server data structure -```json -{ - "spn": "servername", - "type": "nfs|samba|azurefile|azureblob" -} -``` -#### Nfs Server data structure -```json -{ - "spn": "servername", - "type": "nfs", - "address": "server/address", - "rootPath": "server/root/path" -} -``` - -#### Samba Server data structure -```json -{ - "spn": "servername", - "type": "samba", - "address": "server/address", - "rootPath": "server/root/path", - "userName": "username", - "password": "password", - "domain": "userdomain" -} -``` - -#### Azurefile Server data structure -```json -{ - "spn": "servername", - "type": "azurefile", - "dataStore": "datastore", - "fileShare": "fileshare", - "accountName": "accountname", - "key": "key" -} -``` - -#### Azureblob Server data structure -```json -{ - "spn": "servername", - "type": "azureblob", - "dataStore": "datastore", - "containerName": "containername", - "accountName": "accountname", - "key": "key" -} -``` - -#### Hdfs Server data structure -```json -{ - "spn": "servername", - "type": "hdfs", - "namenode": "namenode", - "port": "port", -} -``` - -### Config data structure -```json -{ - "name": "configname", - "gpn": "groupname", - "default": false, - "servers": [ - "servername", - ], - "mountInfos": [ - { - "mountpoint": "local/mount/point", - "server": "servername", - "path": "server/sub/path" - }, - ] -} -``` - -- MountInfo: How user mount server path to local. -```json -{ - "mountpoint": "local/mount/point", - "server": "servername", - "path": "server/sub/path" -} -``` - -### Config in group data -- Which storage configs that a group can access is stored in group data's extension field. For example, a group that can access STORAGE_CONFIG is like following: -```json -{ - "groupname": "groupname", - "externalName": "externalName", - "description": "description", - "extension": { - "acls": { - "admin": false, - "virtualClusters": [], - "storageConfigs": ["STORAGE_CONFIG"] - } - } -} -``` diff --git a/contrib/storage_plugin/__init__.py b/contrib/storage_plugin/__init__.py deleted file mode 100644 index d647bb847f..0000000000 --- a/contrib/storage_plugin/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/contrib/storage_plugin/examples/team-storage/servers/nfs_example.json b/contrib/storage_plugin/examples/team-storage/servers/nfs_example.json deleted file mode 100644 index 52c4ba1c8e..0000000000 --- a/contrib/storage_plugin/examples/team-storage/servers/nfs_example.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "nfs", - "title": "nfs_example", - "address": "10.0.0.1", - "rootPath": "/share/nfs", - "sharedFolders": ["data"], - "privateFolders": ["users"] - } \ No newline at end of file diff --git a/contrib/storage_plugin/examples/team-storage/users/user_example.json b/contrib/storage_plugin/examples/team-storage/users/user_example.json deleted file mode 100644 index ccc6b62b67..0000000000 --- a/contrib/storage_plugin/examples/team-storage/users/user_example.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "defaultStorage": "nfs_example.json", - "externalStorages": [ - "nfs_example.json" - ] -} \ No newline at end of file diff --git a/contrib/storage_plugin/schemas/storage_server.schema.json b/contrib/storage_plugin/schemas/storage_server.schema.json deleted file mode 100644 index 8398c9b5dd..0000000000 --- a/contrib/storage_plugin/schemas/storage_server.schema.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "The type of external storage" - }, - "title": { - "type": "string", - "description": "Shown name of external storage" - }, - "address": { - "type": "string", - "description": "The ip address of external storage" - }, - "rootPath": { - "type": "string", - "description": "The root path of external storage" - }, - "sharedFolders": { - "type": "array", - "description": "Shared folder under root path", - "items": { "type": "string" } - }, - "privateFolders": { - "type": "array", - "description": "The base of user private folder under root path, represent rootPath/$base/$username", - "items": { "type": "string" } - } - }, - "required": [ - "type", - "title", - "address", - "rootPath" - ] -} \ No newline at end of file diff --git a/contrib/storage_plugin/schemas/storage_user.schema.json b/contrib/storage_plugin/schemas/storage_user.schema.json deleted file mode 100644 index 5e4d7c4c97..0000000000 --- a/contrib/storage_plugin/schemas/storage_user.schema.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "object", - "properties": { - "defaultStorage": { - "type": "string", - "description": "User default external storage" - }, - "externalStorages": { - "type": "array", - "description": "All external storages that the user has permission to access", - "items": { "type": "string" } - } - }, - "required": [ - "defaultStorage", - "externalStorages" - ] -} \ No newline at end of file diff --git a/contrib/storage_plugin/storagectl.md b/contrib/storage_plugin/storagectl.md deleted file mode 100644 index 172340b43c..0000000000 --- a/contrib/storage_plugin/storagectl.md +++ /dev/null @@ -1,111 +0,0 @@ -# storagectl - -A tool to manage your storage config. - -## Index -- [ Manage server ](#Server_config) - - [ Set server ](#Server_set) - - [ Set nfs server ](#Server_set_nfs) - - [ Set samba server ](#Server_set_samba) - - [ Set azurefile server ](#Server_set_azurefile) - - [ Set azureblob server ](#Server_set_azureblob) - - [ Set hdfs server ](#Server_set_hdfs) - - [ List server ](#Server_list) - - [ Delete server ](#Server_delete) - -- [ Manage config ](#Config_config) - - [ Set config ](#Config_set) - - [ List config ](#Config_list) - - [ Delete config ](#Config_delete) - -- [ Manage group storage access ](#Groupsc_config) - - [ Add group storage config ](#Groupsc_add) - - [ List group storage configs ](#Groupsc_list) - - [ Delete group storage config ](#Groupsc_delete) - - -## Manage Server -Manage server in PAI. Server how PAI access a nas server. -### Set server - -#### Set nfs server -``` -python storagectl.py server set NAME nfs ADDRESS ROOTPATH -``` - -#### Set samba server -``` -python storagectl.py server set NAME samba ADDRESS ROOTPATH USERNAME PASSWORD DOMAIN -``` - -#### Set azurefile server -``` -python storagectl.py server set NAME azurefile DATASTORE FILESHARE ACCOUNTNAME KEY [-p PROXY_ADDRESS PROXY_PASSWORD] -``` - -#### Set azureblob server -``` -python storagectl.py server set NAME azureblob DATASTORE CONTAINERNAME ACCOUNTNAME KEY -``` - -#### Set hdfs server -``` -python storagectl.py server set NAME hdfs NAMENODE PORT -``` - -### List server -``` -python storagectl.py server list [-n SERVER_NAME_1, SERVER_NAME_2 ...] -``` -- If -n specified, list certain servers. Otherwise list all servers. - -### Delete server -``` -python storagectl.py user delete SERVER_NAME -``` - - -## Manage Config -Manage configs for group in PAI. Config defines a set of mount infos. Every config belongs to a group. That is to say, one group may have 0 to n configs. -### Set config -``` -python storagectl.py config set CONFIG_NAME [-m MOUNT_POINT SERVER PATH]... [-d] -``` -- If -d is set, means mount config storage by default. -- -m means the mount info for config. If -m specified, the PATH on SERVER will be mount to MOUNT_POINT. - - [Job Environment Varialbes](https://github.com/microsoft/pai/blob/master/docs/job_tutorial.md#environment-variables) can be referenced In PATH. Please use '' to quote job environment variables to avoid references to local variables in dev-box. - -For example, suppose we have set config using: -``` -python storagectl.py config set SAMPLE_CONFIG -m /mnt/job SAMPLE_SERVER 'users/${PAI_USER_NAME}/jobs/${PAI_JOB_NAME}' -``` -If current user is 'paiuser' and current job is 'job-TEST'. This config will mount SAMPLE_SERVER/users/paiuser/jobs/job-TEST to /mnt/job - -### List config -``` -python storagectl.py config list [-n CONFIG_NAME_1, CONFIG_NAME_2 ...] -``` -- If -n specified, list certain configs. Otherwise list all config. - -### Delete config -``` -python storagectl.py config delete CONFIG_NAME -``` - - -## Manage group storage access -Manage PAI group's storage config access. -### Add group storage config -``` -python storagectl.py groupsc add GROUP_NAME CONFIG_NAME -``` - -### List group storage config -``` -python storagectl.py groupsc list GROUP_NAME -``` - -### Delete group storage config -``` -python storagectl.py groupsc delete GROUP_NAME CONFIG_NAME -``` diff --git a/contrib/storage_plugin/storagectl.py b/contrib/storage_plugin/storagectl.py deleted file mode 100644 index 0b1cd01949..0000000000 --- a/contrib/storage_plugin/storagectl.py +++ /dev/null @@ -1,273 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -from __future__ import absolute_import -from __future__ import print_function - -import os -import sys -import argparse -import datetime -import logging -import logging.config -import json -import base64 -import subprocess -import multiprocessing -import random,string - -from kubernetes import client, config, watch -from kubernetes.client.rest import ApiException - -from utils.storage_util import * - -import binascii - -logger = logging.getLogger(__name__) - -# Save server config to k8s secret -def save_secret(secret_name, name, content_dict): - secret_dict = dict() - secret_dict[name] = base64.b64encode(json.dumps(content_dict)) - patch_secret(secret_name, secret_dict, "pai-storage") - -def show_secret(args): - secret_data = get_secret(args.secret_name, "pai-storage") - if secret_data is None: - logger.error("No secret found.") - else: - for key, value in secret_data.iteritems(): - if args.name is None or key in args.name: - print(key) - print(base64.b64decode(value)) - -def delete_secret(args): - delete_secret_content(args.secret_name, args.name, "pai-storage") - - -def server_set(args): - content_dict = dict() - content_dict["spn"] = args.name - content_dict["type"] = args.server_type - if args.server_type == "nfs": - content_dict["address"] = args.address - content_dict["rootPath"] = args.root_path - elif args.server_type == "samba": - content_dict["address"] = args.address - content_dict["rootPath"] = args.root_path - content_dict["userName"] = args.user_name - content_dict["password"] = args.password - content_dict["domain"] = args.domain - elif args.server_type == "azurefile": - content_dict["dataStore"] = args.data_store - content_dict["fileShare"] = args.file_share - content_dict["accountName"] = args.account_name - content_dict["key"] = args.key - if args.proxy is not None: - content_dict["proxy"] = args.proxy - elif args.server_type == "azureblob": - content_dict["dataStore"] = args.data_store - content_dict["containerName"] = args.container_name - content_dict["accountName"] = args.account_name - content_dict["key"] = args.key - elif args.server_type == "hdfs": - content_dict["namenode"] = args.namenode - content_dict["port"] = args.port - else: - logger.error("Unknow storage type") - sys.exit(1) - save_secret("storage-server", args.name, content_dict) - - -def config_set(args): - try: - content_dict = dict() - content_dict["name"] = args.name - content_dict["servers"] = args.servers - content_dict["default"] = args.default - if args.mount_info is not None: - mount_infos = [] - for info_data in args.mount_info: - # Verify mount point, mountPoint should starts with "/" and path should not - if not info_data[0].startswith("/"): - raise NameError("MOUNT_POINT should be absolute path and starts with \'/\'") - elif info_data[2].startswith("/"): - raise NameError("PATH should be relative path and not starts with \'/\'") - else: - info = {"mountPoint" : info_data[0], "server" : info_data[1], "path" : info_data[2]} - mount_infos.append(info) - content_dict["mountInfos"] = mount_infos - except NameError as e: - logger.error(e) - else: - save_secret("storage-config", args.name, content_dict) - -def get_group_extension(group_name): - group_hex = binascii.hexlify(group_name) - secret_data = get_secret(group_hex, "pai-group") - if secret_data is None: - logger.error("No group found.") - return None - else: - extension = json.loads(base64.b64decode(secret_data["extension"])) - return extension - -def groupsc_add(args): - extension = get_group_extension(args.group_name) - if extension is not None: - if "storageConfigs" not in extension["acls"]: - extension["acls"]["storageConfigs"] = [] - storageConfigs = extension["acls"]["storageConfigs"] - if args.config_name not in storageConfigs: - storageConfigs.append(args.config_name) - secret_dict = dict() - secret_dict["extension"] = base64.b64encode(json.dumps(extension)) - patch_secret(binascii.hexlify(args.group_name), secret_dict, "pai-group") - logger.info("Successfully added storage config to group!") - -def groupsc_delete(args): - extension = get_group_extension(args.group_name) - if extension is not None: - storageConfigs = extension["acls"]["storageConfigs"] - if args.config_name in storageConfigs: - storageConfigs.remove(args.config_name) - secret_dict = dict() - secret_dict["extension"] = base64.b64encode(json.dumps(extension)) - patch_secret(binascii.hexlify(args.group_name), secret_dict, "pai-group") - logger.info("Successfully deleted storage config from group!") - -def groupsc_list(args): - extension = get_group_extension(args.group_name) - if extension is not None: - print(extension["acls"]["storageConfigs"]) - -def setup_logger_config(logger): - """ - Setup logging configuration. - """ - if len(logger.handlers) == 0: - logger.propagate = False - logger.setLevel(logging.DEBUG) - consoleHandler = logging.StreamHandler() - consoleHandler.setLevel(logging.DEBUG) - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - consoleHandler.setFormatter(formatter) - logger.addHandler(consoleHandler) - - -def main(): - scriptFolder=os.path.dirname(os.path.realpath(__file__)) - os.chdir(scriptFolder) - - parser = argparse.ArgumentParser(description="pai storage management tool") - subparsers = parser.add_subparsers(help='Storage management cli') - - # ./storagectl.py server set|list|delete - server_parser = subparsers.add_parser("server", description="Commands to manage servers.", formatter_class=argparse.RawDescriptionHelpFormatter) - server_subparsers = server_parser.add_subparsers(help="Add/modify, list or delete server") - # ./storgectl.py server set ... - server_set_parser = server_subparsers.add_parser("set") - server_set_parser.add_argument("name") - server_set_subparsers = server_set_parser.add_subparsers(help="Add/modify storage types, currently support nfs, samba, azurefile and azureblob") - # ./storagectl.py server set NAME nfs ADDRESS ROOTPATH - server_set_nfs_parser = server_set_subparsers.add_parser("nfs") - server_set_nfs_parser.add_argument("address", metavar="address", help="Nfs remote address") - server_set_nfs_parser.add_argument("root_path", metavar="rootpath", help="Nfs remote root path") - server_set_nfs_parser.set_defaults(func=server_set, server_type="nfs") - # ./storagectl.py server set NAME samba ADDRESS ROOTPATH USERNAME PASSWORD DOMAIN - server_set_samba_parser = server_set_subparsers.add_parser("samba") - server_set_samba_parser.add_argument("address", metavar="address", help="Samba remote address") - server_set_samba_parser.add_argument("root_path", metavar="rootpath", help="Samba remote root path") - server_set_samba_parser.add_argument("user_name", metavar="username", help="Samba PAI username") - server_set_samba_parser.add_argument("password", metavar="password", help="Samba PAI password") - server_set_samba_parser.add_argument("domain", metavar="domain", help="Samba PAI domain") - server_set_samba_parser.set_defaults(func=server_set, server_type="samba") - # ./storagectl.py server set NAME azurefile DATASTORE FILESHARE ACCOUNTNAME KEY [-p PROXY_ADDRESS PROXY_PASSWORD] - server_set_azurefile_parser = server_set_subparsers.add_parser("azurefile") - server_set_azurefile_parser.add_argument("data_store", metavar="datastore", help="Azurefile data store") - server_set_azurefile_parser.add_argument("file_share", metavar="fileshare", help="Azurefile file share") - server_set_azurefile_parser.add_argument("account_name", metavar="accountname", help="Azurefile account name") - server_set_azurefile_parser.add_argument("key", metavar="key", help="Azurefile share key") - server_set_azurefile_parser.add_argument("-p", "--proxy", dest="proxy", nargs=2, help="Proxy to mount azure file: PROXY_INFO PROXY_PASSWORD") - server_set_azurefile_parser.set_defaults(func=server_set, server_type="azurefile") - # ./storagectl.py server set NAME azureblob DATASTORE CONTAINERNAME ACCOUNTNAME KEY - server_set_azureblob_parser = server_set_subparsers.add_parser("azureblob") - server_set_azureblob_parser.add_argument("data_store", metavar="datastore", help="Azureblob data store") - server_set_azureblob_parser.add_argument("container_name", metavar="containername", help="Azureblob container name") - server_set_azureblob_parser.add_argument("account_name", metavar="accountname", help="Azureblob account name") - server_set_azureblob_parser.add_argument("key", metavar="key", help="Azureblob share key") - server_set_azureblob_parser.set_defaults(func=server_set, server_type="azureblob") - # ./storagectl.py server set NAME hdfs NAMENODE PORT - server_set_hdfs_parser = server_set_subparsers.add_parser("hdfs") - server_set_hdfs_parser.add_argument("namenode", metavar="namenode", help="HDFS name node") - server_set_hdfs_parser.add_argument("port", metavar="port", help="HDFS name node port") - server_set_hdfs_parser.set_defaults(func=server_set, server_type="hdfs") - # ./storagectl.py server list [-n SERVER_NAME_1, SERVER_NAME_2 ...] - server_list_parser = server_subparsers.add_parser("list") - server_list_parser.add_argument("-n", "--name", dest="name", nargs="+", help="filter result by names") - server_list_parser.set_defaults(func=show_secret, secret_name="storage-server") - # ./storagectl.py user delete SERVER_NAME - server_del_parser = server_subparsers.add_parser("delete") - server_del_parser.add_argument("name") - server_del_parser.set_defaults(func=delete_secret, secret_name="storage-server") - - # ./storagectl.py config ... - config_parser = subparsers.add_parser("config", description="Manage config", formatter_class=argparse.RawDescriptionHelpFormatter) - config_subparsers = config_parser.add_subparsers(help="Manage config") - # ./storagectl.py config set CONFIG_NAME GROUP_NAME [-s SERVER_NAME_1 SERVER_NAME_2 ...] [-m MOUNT_POINT SERVER PATH]... [-d] - config_set_parser = config_subparsers.add_parser("set") - config_set_parser.add_argument("name", help="Config name") - config_set_parser.add_argument("-s", "--server", dest="servers", nargs="+", help="-s SERVER_NAME_1 SERVER_NAME_2 ...") - config_set_parser.add_argument("-m", "--mountinfo", dest="mount_info", nargs=3, action="append", help="-m MOUNT_POINT SERVER SUB_PATH") - config_set_parser.add_argument("-d", "--default", action="store_true", help="Mount by default") - config_set_parser.set_defaults(func=config_set) - # ./storagectl.py config list [-n CONFIG_NAME_1, CONFIG_NAME_2 ...] [-g GROUP_NAME_1, GROUP_NAME_2 ...] - config_list_parser = config_subparsers.add_parser("list") - config_list_parser.add_argument("-n", "--name", dest="name", nargs="+", help="filter result by names") - config_list_parser.add_argument("-g", "--group", dest="group", nargs="+", help="filter result by groups") - config_list_parser.set_defaults(func=show_secret, secret_name="storage-config") - # ./storagectl.py config delete CONFIG_NAME - config_del_parser = config_subparsers.add_parser("delete") - config_del_parser.add_argument("name") - config_del_parser.set_defaults(func=delete_secret, secret_name="storage-config") - - # ./storagectl.py groupsc add|delete|list - groupsc_parser = subparsers.add_parser("groupsc", description="Manage group storage config", formatter_class=argparse.RawDescriptionHelpFormatter) - groupsc_subparsers = groupsc_parser.add_subparsers(help="Manage group storage config") - # ./storagectl.py groupsc add GROUP_NAME STORAGE_CONFIG_NAME - groupsc_add_parser = groupsc_subparsers.add_parser("add") - groupsc_add_parser.add_argument("group_name") - groupsc_add_parser.add_argument("config_name") - groupsc_add_parser.set_defaults(func=groupsc_add) - # ./storagectl.py groupsc delete GROUP_NAME STORAGE_CONFIG_NAME - groupsc_delete_parser = groupsc_subparsers.add_parser("delete") - groupsc_delete_parser.add_argument("group_name") - groupsc_delete_parser.add_argument("config_name") - groupsc_delete_parser.set_defaults(func=groupsc_delete) - # ./storagectl.py groupsc list GROUP_NAME - groupsc_list_parser = groupsc_subparsers.add_parser("list") - groupsc_list_parser.add_argument("group_name") - groupsc_list_parser.set_defaults(func=groupsc_list) - - args = parser.parse_args() - args.func(args) - - -if __name__ == "__main__": - setup_logger_config(logger) - main() diff --git a/contrib/storage_plugin/utils/__init__.py b/contrib/storage_plugin/utils/__init__.py deleted file mode 100644 index d647bb847f..0000000000 --- a/contrib/storage_plugin/utils/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/contrib/storage_plugin/utils/storage_util.py b/contrib/storage_plugin/utils/storage_util.py deleted file mode 100644 index bd6b2fa220..0000000000 --- a/contrib/storage_plugin/utils/storage_util.py +++ /dev/null @@ -1,194 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import os -import sys -import time -import logging -import logging.config -import base64 - -from kubernetes import client, config, watch -from kubernetes.client.rest import ApiException - -logger = logging.getLogger(__name__) - -def confirm_namespace(namespace): - config.load_kube_config() - api_instance = client.CoreV1Api() - - try: - api_response = api_instance.read_namespace(namespace) - - except ApiException as e: - if e.status == 404: - logger.info("Couldn't find namespace {0}. Create new namespace".format(namespace)) - try: - meta_data = client.V1ObjectMeta(name=namespace) - body = client.V1ConfigMap(metadata=meta_data) - api_response = api_instance.create_namespace(body) - logger.info("Namesapce {0} is created".format(namespace)) - except ApiException as ie: - logger.error("Exception when calling CoreV1Api->create_namespace: {0}".format(str(ie))) - sys.exit(1) - else: - logger.error("Exception when calling CoreV1Api->read_namespace: {0}".format(str(e))) - sys.exit(1) - - -# List usernames from pai-user secrets -def get_pai_users(): - users = [] - config.load_kube_config() - api_instance = client.CoreV1Api() - - try: - api_response = api_instance.list_namespaced_secret("pai-user") - for item in api_response.items: - users.append(base64.b64decode(item.data["username"])) - - except ApiException as e: - if e.status == 404: - logger.info("Couldn't find secret in namespace pai-user, exit") - sys.exit(1) - else: - logger.error("Exception when calling CoreV1Api->list_namespaced_secret: {0}".format(str(e))) - sys.exit(1) - - return users - - -def update_configmap(name, data_dict, namespace): - confirm_namespace(namespace) - - config.load_kube_config() - api_instance = client.CoreV1Api() - - meta_data = client.V1ObjectMeta() - meta_data.namespace = namespace - meta_data.name = name - body = client.V1ConfigMap( - metadata = meta_data, - data = data_dict) - - try: - api_response = api_instance.patch_namespaced_config_map(name, namespace, body) - logger.info("configmap named {0} is updated.".format(name)) - except ApiException as e: - if e.status == 404: - try: - logger.info("Couldn't find configmap named {0}. Create a new configmap".format(name)) - api_response = api_instance.create_namespaced_config_map(namespace, body) - logger.info("Configmap named {0} is created".format(name)) - except ApiException as ie: - logger.error("Exception when calling CoreV1Api->create_namespaced_config_map: {0}".format(str(ie))) - sys.exit(1) - else: - logger.error("Exception when calling CoreV1Api->patch_namespaced_config_map: {0}".format(str(e))) - sys.exit(1) - - -def get_storage_config(storage_config_name, namespace): - confirm_namespace(namespace) - - config.load_kube_config() - api_instance = client.CoreV1Api() - - try: - api_response = api_instance.read_namespaced_config_map(storage_config_name, namespace) - - except ApiException as e: - if e.status == 404: - logger.info("Couldn't find configmap named {0}.".format(storage_config_name)) - return None - else: - logger.error("Exception when calling CoreV1Api->read_namespaced_config_map: {0}".format(str(e))) - sys.exit(1) - - return api_response.data - - -def patch_secret(name, data_dict, namespace): - confirm_namespace(namespace) - - config.load_kube_config() - api_instance = client.CoreV1Api() - - meta_data = client.V1ObjectMeta() - meta_data.namespace = namespace - meta_data.name = name - body = client.V1Secret(metadata = meta_data, data = data_dict) - - try: - api_response = api_instance.patch_namespaced_secret(name, namespace, body) - logger.info("Secret named {0} is updated.".format(name)) - except ApiException as e: - logger.info(e) - if e.status == 404: - try: - logger.info("Couldn't find secret named {0}. Create a new secret".format(name)) - api_response = api_instance.create_namespaced_secret(namespace, body) - logger.info("Secret named {0} is created".format(name)) - except ApiException as ie: - logger.error("Exception when calling CoreV1Api->create_namespaced_secret: {0}".format(str(ie))) - sys.exit(1) - else: - logger.error("Exception when calling CoreV1Api->patch_namespaced_secret: {0}".format(str(e))) - sys.exit(1) - - -def get_secret(name, namespace): - confirm_namespace(namespace) - - config.load_kube_config() - api_instance = client.CoreV1Api() - - try: - api_response = api_instance.read_namespaced_secret(name, namespace) - except ApiException as e: - if e.status == 404: - logger.info("Couldn't find secret named {0}.".format(name)) - return None - else: - logger.error("Exception when calling CoreV1Api->read_namespaced_config_map: {0}".format(str(e))) - sys.exit(1) - - return api_response.data - - -def delete_secret_content(name, key, namespace): - confirm_namespace(namespace) - - config.load_kube_config() - api_instance = client.CoreV1Api() - try: - api_response = api_instance.read_namespaced_secret(name, namespace) - if api_response is not None and type(api_response.data) is dict: - removed_content = api_response.data.pop(key, None) - if removed_content is not None: - meta_data = client.V1ObjectMeta() - meta_data.namespace = namespace - meta_data.name = name - body = client.V1Secret(metadata = meta_data, data = api_response.data) - api_instance.replace_namespaced_secret(name, namespace, body) - except ApiException as e: - if e.status == 404: - logger.info("Couldn't find secret named {0}.".format(name)) - else: - logger.error("Exception when try to delete {0} from {1}: reason: {2}".format(key, name, str(e))) - sys.exit(1) diff --git a/contrib/submit-simple-job/.editorconfig b/contrib/submit-simple-job/.editorconfig deleted file mode 100644 index 68e74812a3..0000000000 --- a/contrib/submit-simple-job/.editorconfig +++ /dev/null @@ -1,14 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true -max_line_length = 80 - -[*.md] -indent_size = 4 -trim_trailing_whitespace = false diff --git a/contrib/submit-simple-job/.gitignore b/contrib/submit-simple-job/.gitignore deleted file mode 100644 index d65e062ff7..0000000000 --- a/contrib/submit-simple-job/.gitignore +++ /dev/null @@ -1,89 +0,0 @@ - -# Created by https://www.gitignore.io/api/node -# Edit at https://www.gitignore.io/?templates=node - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# End of https://www.gitignore.io/api/node - -dist/ diff --git a/contrib/submit-simple-job/App/Components/FormControls/CheckBox.tsx b/contrib/submit-simple-job/App/Components/FormControls/CheckBox.tsx deleted file mode 100644 index 73957f3d11..0000000000 --- a/contrib/submit-simple-job/App/Components/FormControls/CheckBox.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation - * All rights reserved. - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -import * as React from "react"; - -import { IFormControlProps } from "."; - -interface ICheckBoxProps extends IFormControlProps {} - -const CheckBox: React.FunctionComponent = (props) => { - const { children, className, onChange, value } = props; - - const onInputChange: React.ChangeEventHandler = (event) => { - if (onChange !== undefined) { - onChange(event.target.checked); - } - }; - - return ( -
      -
      - -
      -
      - ); -}; - -export default CheckBox; diff --git a/contrib/submit-simple-job/App/Components/FormControls/NumberInput.tsx b/contrib/submit-simple-job/App/Components/FormControls/NumberInput.tsx deleted file mode 100644 index 8771ed1b7d..0000000000 --- a/contrib/submit-simple-job/App/Components/FormControls/NumberInput.tsx +++ /dev/null @@ -1,59 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation - * All rights reserved. - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -import classNames from "classnames"; -import * as React from "react"; - -import { IFormControlProps } from "."; - -interface INumberInputProps extends IFormControlProps { - min?: number; - max?: number; -} - -const NumberInput: React.FunctionComponent = (props) => { - const { children, className, max, min, onChange, value } = props; - const onInputChange: React.ChangeEventHandler = (event) => { - if (onChange !== undefined) { onChange(event.target.valueAsNumber); } - }; - const UID = "U" + Math.floor(Math.random() * 0xFFFFFF).toString(16); - - return ( -
      - - -
      - ); -}; - -export default NumberInput; diff --git a/contrib/submit-simple-job/App/Components/FormControls/Select.tsx b/contrib/submit-simple-job/App/Components/FormControls/Select.tsx deleted file mode 100644 index 52b11dbde8..0000000000 --- a/contrib/submit-simple-job/App/Components/FormControls/Select.tsx +++ /dev/null @@ -1,75 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation - * All rights reserved. - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -import classNames from "classnames"; -import * as React from "react"; - -import { IFormControlProps } from "."; - -interface IOptionProps { - label: string; - value: string; -} - -const Option: React.FunctionComponent = ({ value, label }) => { - return ; -}; - -interface ISelectProps extends IFormControlProps { - options: Array; -} - -const Select: React.FunctionComponent = (props) => { - const { children, className, options, value, onChange } = props; - const onSelectChange: React.ChangeEventHandler = (event) => { - if (onChange !== undefined) { - onChange(event.target.value); - } - }; - const UID = "U" + Math.floor(Math.random() * 0xFFFFFF).toString(16); - return ( -
      - - -
      - ); -}; - -export default Select; diff --git a/contrib/submit-simple-job/App/Components/FormControls/TextArea.tsx b/contrib/submit-simple-job/App/Components/FormControls/TextArea.tsx deleted file mode 100644 index 8f3e8b6cd2..0000000000 --- a/contrib/submit-simple-job/App/Components/FormControls/TextArea.tsx +++ /dev/null @@ -1,59 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation - * All rights reserved. - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -import classNames from "classnames"; -import * as React from "react"; - -import { IFormControlProps } from "."; - -interface ITextAreaProps extends IFormControlProps { - cols?: number; - rows?: number; -} - -const TextArea: React.FunctionComponent = (props) => { - const { children, className, rows, cols, value, onChange } = props; - const onTextAreaChange: React.ChangeEventHandler = (event) => { - if (onChange !== undefined) { - onChange(event.target.value); - } - }; - const UID = "U" + Math.floor(Math.random() * 0xFFFFFF).toString(16); - return ( -
      - - - - Virtual Cluster - - - Interactive Job - - - Enable Tensorboard - - - Launch container as root user. - - { - simpleJob.isInteractive ? ( - - Open ports for interactive job - - ) : null - } - { - simpleJob.enableTensorboard ? ( - - Tensorflow model path, used to enable tensorboard - - ) : null - } -
      - -
      - { - nfs ? ( - - - - ) : null - } - - - - - - - - - -
      -
      -
      -
      - - - -
      - - ); - }} - -); - -export default SimpleJobForm; diff --git a/contrib/submit-simple-job/App/SimpleJob/index.ts b/contrib/submit-simple-job/App/SimpleJob/index.ts deleted file mode 100644 index f66264a1c9..0000000000 --- a/contrib/submit-simple-job/App/SimpleJob/index.ts +++ /dev/null @@ -1,262 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation - * All rights reserved. - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -export interface IEnvironmentVariable { - name: string; - value: string; -} - -export interface ISimpleJob { - readonly name: string; - readonly gpus: number; - - readonly image: string; - readonly command: string; - readonly root: boolean; - readonly virtualCluster: string; - - readonly isInteractive: boolean; - readonly interactivePorts: string; - - readonly enableTensorboard: boolean; - readonly tensorboardModelPath: string; - - readonly enableWorkMount: boolean; - readonly workPath: string; - readonly enableDataMount: boolean; - readonly dataPath: string; - readonly enableJobMount: boolean; - readonly jobPath: string; - - readonly hyperParameterName: string; - readonly hyperParameterStartValue: number; - readonly hyperParameterEndValue: number; - readonly hyperParameterStep: number; - - readonly environmentVariables: IEnvironmentVariable[]; - - readonly isPrivileged: boolean; - readonly cpus: number; - readonly memory: number; -} - -export default class SimpleJob implements ISimpleJob { - - public static fromLegacyJSON(json: string) { - const legacyObject = JSON.parse(json); - const simpleJob = new SimpleJob(); - - if (typeof legacyObject.jobName === "string") { - simpleJob.name = legacyObject.jobName; - } - if (typeof legacyObject.resourcegpu === "number") { - simpleJob.gpus = Number(legacyObject.resourcegpu) || 0; - } - - if (typeof legacyObject.image === "string") { - simpleJob.image = legacyObject.image; - } - if (typeof legacyObject.cmd === "string") { - simpleJob.command = legacyObject.cmd; - } - if (typeof legacyObject.runningasroot === "boolean") { - simpleJob.root = legacyObject.runningasroot; - } - - if (typeof legacyObject.is_interactive === "boolean") { - simpleJob.isInteractive = legacyObject.is_interactive; - } - if (simpleJob.isInteractive && typeof legacyObject.interactivePort === "string") { - simpleJob.interactivePorts = legacyObject.interactivePort; - } - - if (typeof legacyObject.do_log === "boolean") { - simpleJob.enableTensorboard = legacyObject.do_log; - } - if (simpleJob.enableTensorboard && typeof legacyObject.logDir === "string") { - simpleJob.tensorboardModelPath = legacyObject.logDir; - } - - if (typeof legacyObject.enableworkpath === "boolean") { - simpleJob.enableWorkMount = legacyObject.enableworkpath; - } - if (typeof legacyObject.workPath === "string") { - simpleJob.workPath = legacyObject.workPath; - } - if (typeof legacyObject.enabledatapath === "boolean") { - simpleJob.enableDataMount = legacyObject.enabledatapath; - } - if (typeof legacyObject.dataPath === "string") { - simpleJob.dataPath = legacyObject.dataPath; - } - if (typeof legacyObject.enablejobpath === "boolean") { - simpleJob.enableJobMount = legacyObject.enablejobpath; - } - if (typeof legacyObject.jobPath === "string") { - simpleJob.jobPath = legacyObject.jobPath; - } - - if (typeof legacyObject.hyperparametername === "string") { - simpleJob.hyperParameterName = legacyObject.hyperparametername; - } - if ( - typeof legacyObject.hyperparameterstartvalue === "number" || - typeof legacyObject.hyperparameterstartvalue === "string" - ) { - simpleJob.hyperParameterStartValue = Number(legacyObject.hyperparameterstartvalue) || 0; - } - if ( - typeof legacyObject.hyperparameterendvalue === "number" || - typeof legacyObject.hyperparameterendvalue === "string" - ) { - simpleJob.hyperParameterEndValue = Number(legacyObject.hyperparameterendvalue) || 0; - } - if ( - typeof legacyObject.hyperparameterstep === "number" || - typeof legacyObject.hyperparameterstep === "string" - ) { - simpleJob.hyperParameterStep = Number(legacyObject.hyperparameterstep) || 0; - } - - if (Array.isArray(legacyObject.env)) { - const { environmentVariables } = simpleJob; - for (const legacyEnv of legacyObject.env) { - const { name, value } = legacyEnv; - if (typeof name === "string" && typeof value === "string") { - environmentVariables.push({ name, value }); - } - } - } - - if (typeof legacyObject.isPrivileged === "boolean") { - simpleJob.isPrivileged = legacyObject.isPrivileged; - } - - if (simpleJob.isPrivileged) { - if ( - typeof legacyObject.cpurequest === "string" || - typeof legacyObject.cpurequest === "number" - ) { - simpleJob.cpus = Number(legacyObject.cpurequest) || 1; - } - if ( - typeof legacyObject.memoryrequest === "string" || - typeof legacyObject.memoryrequest === "number" - ) { - simpleJob.memory = Number(legacyObject.memoryrequest) || 256; - } - } - - return simpleJob; - } - - public static toLegacyJSON(simpleJob: ISimpleJob): string { - const legacyObject: any = {}; - legacyObject.jobName = simpleJob.name; - legacyObject.resourcegpu = simpleJob.gpus; - - legacyObject.image = simpleJob.image; - legacyObject.cmd = simpleJob.command; - legacyObject.runningasroot = simpleJob.root; - - if (simpleJob.isInteractive) { - legacyObject.is_interactive = simpleJob.isInteractive; - legacyObject.interactivePort = simpleJob.interactivePorts; - } - - if (simpleJob.enableTensorboard) { - legacyObject.do_log = simpleJob.enableTensorboard; - legacyObject.logDir = simpleJob.tensorboardModelPath; - } - - legacyObject.enableworkpath = simpleJob.enableWorkMount; - legacyObject.workPath = simpleJob.workPath; - legacyObject.enabledatapath = simpleJob.enableDataMount; - legacyObject.dataPath = simpleJob.dataPath; - legacyObject.enablejobpath = simpleJob.enableJobMount; - legacyObject.jobPath = simpleJob.jobPath; - - legacyObject.hyperparametername = simpleJob.hyperParameterName; - legacyObject.hyperparameterstartvalue = simpleJob.hyperParameterStartValue; - legacyObject.hyperparameterendvalue = simpleJob.hyperParameterEndValue; - legacyObject.hyperparameterstep = simpleJob.hyperParameterStep; - - if (simpleJob.isPrivileged) { - legacyObject.isPrivileged = simpleJob.isPrivileged; - legacyObject.cpurequest = simpleJob.cpus; - legacyObject.memoryrequest = simpleJob.memory; - } - - return JSON.stringify(legacyObject); - } - - public name: string = ""; - public gpus: number = 0; - - public image: string = ""; - public command: string = ""; - public root: boolean = true; - public virtualCluster: string = "default"; - - public isInteractive: boolean = false; - public interactivePorts: string = ""; - - public enableTensorboard: boolean = false; - public tensorboardModelPath: string = ""; - - public enableWorkMount: boolean = false; - public workPath: string = ""; - public enableDataMount: boolean = false; - public dataPath: string = ""; - public enableJobMount: boolean = false; - public jobPath: string = ""; - - public hyperParameterName: string = ""; - public hyperParameterStartValue: number = 0; - public hyperParameterEndValue: number = 0; - public hyperParameterStep: number = 0; - - public environmentVariables: IEnvironmentVariable[] = []; - - public isPrivileged: boolean = false; - public cpus: number = 1; - public memory: number = 30 * 1024; - - public constructor(that?: ISimpleJob) { - if (that !== undefined) { - Object.assign(this, that); - } - } - - public clone< - F extends keyof ISimpleJob, - V extends ISimpleJob[F] - >(field?: F, value?: V): SimpleJob { - const that = new SimpleJob(this); - if (field !== undefined && value !== undefined) { - that[field] = value; - } - return that; - } -} diff --git a/contrib/submit-simple-job/App/Templates/Context.ts b/contrib/submit-simple-job/App/Templates/Context.ts deleted file mode 100644 index 0c4f9e62f0..0000000000 --- a/contrib/submit-simple-job/App/Templates/Context.ts +++ /dev/null @@ -1,39 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation - * All rights reserved. - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -import { createContext } from "react"; - -import { templates } from "./data.json"; - -interface ITemplatesContext { - templates: typeof templates; - apply(json: string): void; -} - -const TemplatesContext = createContext({ - templates: [], - apply() { return; }, -}); - -export default TemplatesContext; diff --git a/contrib/submit-simple-job/App/Templates/Select.tsx b/contrib/submit-simple-job/App/Templates/Select.tsx deleted file mode 100644 index 286a90464d..0000000000 --- a/contrib/submit-simple-job/App/Templates/Select.tsx +++ /dev/null @@ -1,61 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation - * All rights reserved. - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -import * as React from "react"; - -import TemplatesContext from "./Context"; - -import Select from "../Components/FormControls/Select"; - -interface ITemplatesSelectProps { - className: string; - children: string; -} - -const TemplatesSelect: React.FunctionComponent = ({ className, children }) => ( - - { ({ templates, apply }) => { - const options = templates.map(({ - Name, - Json, - }) => ({ - label: Name, - value: Json, - })); - options.unshift({ label: "None", value: "" }); - - const onChange = (value: string) => { - if (value) { apply(value); } - }; - - return ( - - ); - }} - -); - -export default TemplatesSelect; diff --git a/contrib/submit-simple-job/App/Templates/data.json b/contrib/submit-simple-job/App/Templates/data.json deleted file mode 100644 index 020f22d491..0000000000 --- a/contrib/submit-simple-job/App/Templates/data.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "templates": [ - { - "Name": "Caffe training example", - "Json": "{\"jobName\" : \"caffe training example - resnet18\", \"resourcegpu\" : 1, \"workPath\" : \"samples\", \"image\" : \"bvlc/caffe:gpu\", \"cmd\" : \"caffe train -solver /work/caffe/solver_resnet18.prototxt\", \"interactivePort\" : \"\"}\r\n" - }, - { - "Name": "Caffe-iPython-SSH-CPU", - "Json": "{\"jobName\":\"caffe-ssh-ipython-cpu\",\"resourcegpu\":0,\"workPath\":\"./\",\"dataPath\":\"imagenet\",\"jobPath\":\"\",\"image\":\"bvlc/caffe:cpu\",\"cmd\":\"apt-get update && apt-get install -y python-pip openssh-server sudo && pip install jupyter && addgroup --force-badname --gid $$gid$$ domainusers && adduser --force-badname --home /home/$$username$$ --shell /bin/bash --uid $$uid$$ -gecos '' $$username$$ --gid $$gid$$ --disabled-password && usermod -p $(echo tryme2017 | openssl passwd -1 -stdin) $$username$$ && adduser $$username$$ sudo && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && ( mkdir -p /root/.ssh && cat /work/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys && mkdir -p /home/$$username$$/.ssh && cat /work/.ssh/id_rsa.pub >> /home/$$username$$/.ssh/authorized_keys && cp /work/.ssh/id_rsa* /home/$$username$$/.ssh/ ; chown -R $$username$$ /home/$$username$$/ || /bin/true ) && service ssh restart && env | while read line; do if [[ $line != HOME=* ]] && [[ $line != INTERACTIVE* ]] ; then echo \\\"export $line\\\" >> /home/$$username$$/.bashrc; fi; done && export HOME=/job && runuser -l $$username$$ -c \\\"jupyter notebook --no-browser --port=8888 --ip=0.0.0.0 --notebook-dir=/\\\"\",\"is_interactive\":true,\"do_log\":false,\"interactivePort\":\"22, 8888\",\"runningasroot\":true,\"mountpoints\":[],\"env\":[],\"jobtrainingtype\":\"RegularJob\",\"enableworkpath\":true,\"enabledatapath\":true,\"enablejobpath\":true}" - }, - { - "Name": "Tensorflow training example", - "Json": "{\"jobName\" : \"Tensorflow training example - inception\", \"resourcegpu\" : 1, \"workPath\" : \"samples\", \"image\" : \"tensorflow/tensorflow:0.12.1-gpu\", \"cmd\" : \"/work/tensorflow/models/inception/bazel-bin/inception/imagenet_train --num_gpus=1 --batch_size=32 --train_dir=/job/model --data_dir=/data/tensor\", \"interactivePort\" : \"\"}\r\n" - }, - { - "Name": "Tensorflow-IPython-GPU", - "Json": "{\"jobName\":\"tensorflow-ipython\",\"resourcegpu\":1,\"image\":\"tensorflow/tensorflow:latest-gpu\",\"cmd\":\"export HOME=/job && jupyter notebook --no-browser --port=8888 --ip=0.0.0.0 --notebook-dir=/\",\"is_interactive\":true,\"mountpoints\":[{\"containerPath\":\"/home/jinl\",\"hostPath\":\"/dlwsdata/work/jinl\",\"description\":\"NFS (remote file share)\",\"enabled\":true,\"$$hashKey\":\"object:102\"},{\"containerPath\":\"/glusterfs/public\",\"hostPath\":\"/dlwsdata/glusterfs/public\",\"description\":\"GlusterFS (replicated distributed storage)\",\"enabled\":true,\"$$hashKey\":\"object:74\"}],\"do_log\":false,\"runningasroot\":false,\"env\":[],\"PSDistJob\":false,\"jobtrainingtype\":\"RegularJob\",\"enableworkpath\":true,\"enabledatapath\":true,\"enablejobpath\":true,\"interactivePort\":\"8888\"}" - }, - { - "Name": "Test Template", - "Json": "{\"image\":\"ubuntu:16.04\"}" - }, - { - "Name": "tutorial-caffe2-cpu", - "Json": "{\"jobName\":\"caffe2-detectron-cpu\",\"resourcegpu\":0,\"workPath\":\"./\",\"dataPath\":\"imagenet\",\"jobPath\":\"\",\"image\":\"dlws/tutorial-caffe2-cpu:1.5\",\"cmd\":\"apt-get update && apt-get install -y openssh-server sudo && addgroup --force-badname --gid $$gid$$ domainusers && adduser --force-badname --home /home/$$username$$ --shell /bin/bash --uid $$uid$$ -gecos '' $$username$$ --gid $$gid$$ --disabled-password && usermod -p $(echo tryme2017 | openssl passwd -1 -stdin) $$username$$ && usermod -p $(echo tryme2017 | openssl passwd -1 -stdin) root && adduser $$username$$ sudo && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && mkdir -p /root/.ssh && cat /work/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys && service ssh restart && env | while read line; do if [[ $line != HOME=* ]] && [[ $line != INTERACTIVE* ]] ; then echo \\\"export $line\\\" >> /home/$$username$$/.bashrc; fi; done && export HOME=/job && jupyter notebook --no-browser --port=8888 --ip=0.0.0.0 --notebook-dir=/ --allow-root\",\"is_interactive\":true,\"do_log\":false,\"interactivePort\":\"22, 8888, 6006\",\"runningasroot\":true,\"mountpoints\":[],\"env\":[],\"jobtrainingtype\":\"RegularJob\",\"enableworkpath\":true,\"enabledatapath\":true,\"enablejobpath\":true}" - }, - { - "Name": "Tutorial-pytorch", - "Json": "{\"jobName\":\"tutorial-pytorch\",\"resourcegpu\":1,\"workPath\":\"./\",\"dataPath\":\"imagenet\",\"jobPath\":\"\",\"image\":\"dlws/tutorial-pytorch:1.5\",\"cmd\":\"apt-get update && apt-get install -y openssh-server sudo && addgroup --force-badname --gid $$gid$$ domainusers && adduser --force-badname --home /home/$$username$$ --shell /bin/bash --uid $$uid$$ -gecos '' $$username$$ --gid $$gid$$ --disabled-password && usermod -p $(echo tryme2017 | openssl passwd -1 -stdin) $$username$$ && usermod -p $(echo tryme2017 | openssl passwd -1 -stdin) root && adduser $$username$$ sudo && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && mkdir -p /root/.ssh && cat /work/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys && ( chown -R $$username$$ /home/$$username$$/ || /bin/true ) && service ssh restart && env | while read line; do if [[ $line != HOME=* ]] && [[ $line != INTERACTIVE* ]] ; then echo \\\"export $line\\\" >> /home/$$username$$/.bashrc; fi; done && export HOME=/job && export LD_LIBRARY_PATH=/usr/local/nvidia/lib64/ ; runuser -p -l $$username$$ -c \\\"source /home/$$username$$/.bashrc && export PATH=/opt/conda/envs/pytorch-py35/bin/:$PATH; jupyter notebook --no-browser --port=8888 --ip=0.0.0.0 --notebook-dir=/\\\"\",\"is_interactive\":true,\"do_log\":false,\"interactivePort\":\"22, 8888, 6006\",\"runningasroot\":true,\"mountpoints\":[],\"env\":[],\"jobtrainingtype\":\"RegularJob\",\"enableworkpath\":true,\"enabledatapath\":true,\"enablejobpath\":true,\"isPrivileged\":true,\"dnsPolicy\":\"Default\",\"hostIPC\":true}" - }, - { - "Name": "tutorial-tensorflow", - "Json": "{\"jobName\":\"tutorial-tensorflow\",\"resourcegpu\":1,\"workPath\":\"./\",\"dataPath\":\"imagenet\",\"jobPath\":\"\",\"image\":\"dlws/tutorial-tensorflow:1.5\",\"cmd\":\"apt-get update && apt-get install -y openssh-server sudo && addgroup --force-badname --gid $$gid$$ domainusers && adduser --force-badname --home /home/$$username$$ --shell /bin/bash --uid $$uid$$ -gecos '' $$username$$ --gid $$gid$$ --disabled-password && usermod -p $(echo tryme2017 | openssl passwd -1 -stdin) $$username$$ && adduser $$username$$ sudo && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && ( mkdir -p /root/.ssh && cat /work/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys && mkdir -p /home/$$username$$/.ssh && cat /work/.ssh/id_rsa.pub >> /home/$$username$$/.ssh/authorized_keys && cp /work/.ssh/id_rsa* /home/$$username$$/.ssh/ ; chown -R $$username$$ /home/$$username$$/ || /bin/true ) && service ssh restart && env | while read line; do if [[ $line != HOME=* ]] && [[ $line != INTERACTIVE* ]] ; then echo \\\"export $line\\\" >> /home/$$username$$/.bashrc; fi; done && export HOME=/job && runuser -l $$username$$ -c \\\"source /home/$$username$$/.bashrc && jupyter notebook --no-browser --port=8888 --ip=0.0.0.0 --notebook-dir=/\\\"\",\"is_interactive\":true,\"do_log\":false,\"interactivePort\":\"22, 8888, 6006\",\"runningasroot\":true,\"mountpoints\":[],\"env\":[{\"name\":\"LD_LIBRARY_PATH\",\"value\":\"/usr/local/nvidia/lib64/\",\"$$hashKey\":\"object:134\"}],\"jobtrainingtype\":\"RegularJob\",\"enableworkpath\":true,\"enabledatapath\":true,\"enablejobpath\":true}" - }, - { - "Name": "tutorial-tensorflow-cpu", - "Json": "{\"jobName\":\"tutorial-tensorflow-cpu\",\"resourcegpu\":0,\"workPath\":\"./\",\"dataPath\":\"imagenet\",\"jobPath\":\"\",\"image\":\"dlws/tutorial-tensorflow-cpu:1.5\",\"cmd\":\"apt-get update && apt-get install -y openssh-server sudo && addgroup --force-badname --gid $$gid$$ domainusers && adduser --force-badname --home /home/$$username$$ --shell /bin/bash --uid $$uid$$ -gecos '' $$username$$ --gid $$gid$$ --disabled-password && usermod -p $(echo tryme2017 | openssl passwd -1 -stdin) $$username$$ && adduser $$username$$ sudo && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && ( mkdir -p /root/.ssh && cat /work/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys && mkdir -p /home/$$username$$/.ssh && cat /work/.ssh/id_rsa.pub >> /home/$$username$$/.ssh/authorized_keys && cp /work/.ssh/id_rsa* /home/$$username$$/.ssh/ ; chown -R $$username$$ /home/$$username$$/ || /bin/true ) && service ssh restart && env | while read line; do if [[ $line != HOME=* ]] && [[ $line != INTERACTIVE* ]] ; then echo \\\"export $line\\\" >> /home/$$username$$/.bashrc; fi; done && export HOME=/job && runuser -l $$username$$ -c \\\"jupyter notebook --no-browser --port=8888 --ip=0.0.0.0 --notebook-dir=/\\\"\",\"is_interactive\":true,\"do_log\":false,\"interactivePort\":\"22, 8888, 6006\",\"runningasroot\":true,\"mountpoints\":[],\"env\":[{\"name\":\"LD_LIBRARY_PATH\",\"value\":\"/usr/local/nvidia/lib64/\",\"$$hashKey\":\"object:134\"}],\"jobtrainingtype\":\"RegularJob\",\"enableworkpath\":true,\"enabledatapath\":true,\"enablejobpath\":true}" - } - ] -} diff --git a/contrib/submit-simple-job/App/convert.ts b/contrib/submit-simple-job/App/convert.ts deleted file mode 100644 index c99a5db466..0000000000 --- a/contrib/submit-simple-job/App/convert.ts +++ /dev/null @@ -1,172 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation - * All rights reserved. - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -import Hashids from "hashids"; - -import SimpleJob from "./SimpleJob"; - -import { authFile, nfs } from "../config"; - -function convertCommand(simpleJob: SimpleJob, user: string, hyperParameterValue?: number) { - const depends: { [name: string]: boolean } = {}; - - const exportCommands = simpleJob.environmentVariables.map( - ({ name, value }) => `export ${name}=${value}`); - if (hyperParameterValue !== undefined) { - exportCommands.push(`export ${simpleJob.hyperParameterName}=${hyperParameterValue}`); - } - - const mountCommands = []; - if (nfs) { - if (simpleJob.enableWorkMount) { - mountCommands.push("mkdir --parents /work", - `mount -t nfs4 ${nfs}/${user}/${simpleJob.workPath} /work`); - depends["nfs-common"] = true; - } - - if (simpleJob.enableDataMount) { - mountCommands.push("mkdir --parents /data", - `mount -t nfs4 ${nfs}/${user}/${simpleJob.dataPath} /data`); - depends["nfs-common"] = true; - } - - if (simpleJob.enableJobMount) { - mountCommands.push("mkdir --parents /job", - `mount -t nfs4 ${nfs}/${user}/${simpleJob.jobPath} /job`); - depends["nfs-common"] = true; - } - } - - const hashids = new Hashids(user, 4, "0123456789ABCDEF"); - const uid = String(parseInt(hashids.encode(0), 16) + 10000); - const gid = uid; - const command = simpleJob.command.replace(/\$\$(username|uid|gid)\$\$/g, (_, key) => { - if (key === "username") { return user; } - if (key === "uid") { return uid; } - if (key === "gid") { return gid; } - throw Error("Bad replacement"); - }).split("\n").join(" && "); - - const userCommands = []; - if (simpleJob.root) { - userCommands.push(command); - } else { - // Create a user with group. - userCommands.push( - `groupadd --gid ${gid} ${user}`, - `useradd --gid ${gid} --groups sudo --uid ${uid} ${user}`, - "echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers", - `echo '${command.replace(/'/g, "'\\''")}' | su --preserve-environment ${user}`, - ); - depends.sudo = true; - } - - const dependencies = Object.keys(depends); - const installCommands = []; - if (dependencies.length > 0) { - installCommands.push( - "apt-get update", - `apt-get install --assume-yes ${dependencies.join(" ")}`, - ); - } - - const commands = installCommands - .concat(mountCommands) - .concat(exportCommands) - .concat(userCommands); - - return commands.join(" && "); -} - -function convertTaskRole(name: string, simpleJob: SimpleJob, user: string, hyperParameterValue?: number) { - const taskRole: any = { - command: convertCommand(simpleJob, user, hyperParameterValue), - gpuNumber: simpleJob.gpus, - name, - }; - - if (simpleJob.isPrivileged) { - taskRole.cpuNumber = simpleJob.cpus; - taskRole.memoryMB = simpleJob.memory; - } - - if (simpleJob.isInteractive) { - const portList = []; - const ports = simpleJob.interactivePorts.split(/[;,]/); - for (const portString of ports) { - const port = Number(portString); - if (isNaN(port)) { continue; } - portList.push({ - beginAt: port, - label: `port_${port}`, - portNumber: 1, - }); - } - taskRole.portList = portList; - } - - return taskRole; -} - -export default function convert(simpleJob: SimpleJob, user: string) { - const job: any = { - image: simpleJob.image, - jobName: simpleJob.name, - virtualCluster: simpleJob.virtualCluster, - }; - - if (authFile !== undefined) { - job.authFile = authFile; - } - - const taskRoles = []; - - if (simpleJob.hyperParameterName === "") { - taskRoles.push(convertTaskRole("master", simpleJob, user)); - } else { - for ( - let hyperParameterValue = simpleJob.hyperParameterStartValue; - hyperParameterValue < simpleJob.hyperParameterEndValue; - hyperParameterValue += simpleJob.hyperParameterStep - ) { - const taskName = `hyper_parameter_${hyperParameterValue}`; - const taskRole = convertTaskRole(taskName, simpleJob, user, hyperParameterValue); - taskRoles.push(taskRole); - } - } - - if (simpleJob.enableTensorboard) { - const tensorboardSimpleJob = new SimpleJob(simpleJob); - tensorboardSimpleJob.gpus = 0; - tensorboardSimpleJob.command = `tensorboard --logdir ${simpleJob.tensorboardModelPath} --host 0.0.0.0`; - tensorboardSimpleJob.isInteractive = true; - tensorboardSimpleJob.interactivePorts = "6006"; - - taskRoles.push(convertTaskRole("tensorboard", tensorboardSimpleJob, user)); - } - - job.taskRoles = taskRoles; - - return job; -} diff --git a/contrib/submit-simple-job/App/index.tsx b/contrib/submit-simple-job/App/index.tsx deleted file mode 100644 index fa4bbc672e..0000000000 --- a/contrib/submit-simple-job/App/index.tsx +++ /dev/null @@ -1,114 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation - * All rights reserved. - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -import * as React from "react"; - -import SimpleJob, { ISimpleJob } from "./SimpleJob"; -import SimpleJobContext from "./SimpleJob/Context"; -import SimpleJobForm from "./SimpleJob/Form"; - -import TemplatesContext from "./Templates/Context"; -import { templates } from "./Templates/data.json"; - -import convert from "./convert"; - -const AppContent: React.FunctionComponent = ({ children }) => ( -
      - {children} -
      -); - -interface IAppProps { - api: string; - user: string; - token: string; -} - -interface IAppState { - simpleJob: SimpleJob; -} - -export default class App extends React.Component { - constructor(props: IAppProps) { - super(props); - - this.state = { - simpleJob: new SimpleJob(), - }; - } - - public render() { - const { simpleJob } = this.state; - const { setSimpleJob, applyLegacyJSON } = this; - return ( - - - - - - - - ); - } - - private setSimpleJob = < - F extends keyof ISimpleJob, - V extends ISimpleJob[F], - >(field: F) => (value: V) => { - this.setState(({ - simpleJob, - }) => ({ - simpleJob: simpleJob.clone(field, value), - })); - } - - private applyLegacyJSON = (json: string) => { - this.setState({ simpleJob: SimpleJob.fromLegacyJSON(json) }); - } - - private submitSimpleJob = (simpleJob: SimpleJob) => { - const { api, user, token } = this.props; - const job = convert(simpleJob as SimpleJob, user); - - window.fetch(`${api}/api/v1/user/${user}/jobs`, { - body: JSON.stringify(job), - headers: { - "Authorization": `Bearer ${token}`, - "Content-Type": "application/json", - }, - method: "POST", - }).then((response) => { - if (response.status >= 400) { - return response.json().then((body) => { - throw Error(body.message); - }); - } else { - window.location.href = `/view.html?username=${user}&jobName=${job.jobName}`; - return Promise.resolve(); - } - }).catch((error) => { - window.alert(error.message); - }); - } -} diff --git a/contrib/submit-simple-job/LICENSE b/contrib/submit-simple-job/LICENSE deleted file mode 100644 index a8ddf64a95..0000000000 --- a/contrib/submit-simple-job/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) Microsoft Corporation -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/contrib/submit-simple-job/README.md b/contrib/submit-simple-job/README.md deleted file mode 100644 index de514acb45..0000000000 --- a/contrib/submit-simple-job/README.md +++ /dev/null @@ -1,127 +0,0 @@ -# Submit Simple Job # - -## Background ## - -"Submit Simple Job" is released to be a PAI web portal plugin with a UI similar to [DLWorkspace](https://github.com/Microsoft/DLWorkspace) that makes DLWorkspace users familiar with OpenPAI quickly. It includes the following features: - -- Caffe / Tensorflow / Pytorch job templates -- Multilined command support -- One-click tensorboard support -- Customize the running user (root / current user) -- NFS mount (Extra configuration needed) -- HyperParameter training - -## User's Guide ## - -### Entrance ### - -The plugin could be accessed by the link in the "plugins" section of sidebar menu, with title customized by the system administrator. If you do not know which one is the plugin, ask your system administrator. - -### Usage ### - -#### Main Section #### - -![Main Section](docs/main-section.png) - -- **Job Template**: shortcut of customizing the job. - - ![Job Template](docs/job-template.png) - -- **Job Name**: the name of the job, similar to PAI -- **Job Type**: WIP, now regular job only. -- **Number of GPUs**: setting how many GPUs used in *each* task. -- **Docker Image**: the base Docker image of the job, private docker registry is supported only if the system administrator is configured the authentication file. -- **Command**: the command to run the job, will be running in root if the followed "Launch container as root user" is checked. -- **Virtual Cluster**: which virtual cluster the job will running on. -- **Interactive Job**: checked if the job could publish network interfaces, and then the specific ports could be customized. - ![Interactive Job](docs/interactive-job.png) -- **Enable Tensorboard**: checked if a tensorboard task will be run. A model path could be customized. - ![Tensorboard](docs/tensorboard.png) -- **Launch container as root user**: if checked, the *Command* will be run in root user, otherwise it will be run in the current user. - -#### Advanced Section #### - -- **Mount Directories**: Mount NFS directories to the job container. This option could be displayed only if the NFS option of the plugin is fully configured. - ![Mount Directories](docs/mount-directories.png) -- **HyperParameter Training**: Enable hyper parameter training. - ![Hyper Parameter](docs/hyper-parameter.png) -- **Environment Variables**: Customize environment variables. - ![Environment Variables](docs/environment-variables.png) -- **Privileged Docker**: Customize CPU and memory requirements of the job, other options are under development. - ![Prvileged Docker](docs/privileged-docker.png) - -#### Database Operation #### - -![Database Operation](docs/database-operation.png) - -- Download JSON: export the current form to a JSON file. -- Upload JSON: import the JSON file exported from this plugin of DLWorkspace to the form. - -## System Administrator's Guide ## - -### Build ### - - npm install - npm run build - -The build file is located in `./dist/plugin.js` - -### Deploy ### - -Deploy the build file to any server accessible by web portal users. Write down the public URL of the file for configuration. - -### Install ### - -Config your `service-configuration.yaml` add/update the following fields to `webportal` section - -```YAML -webportal: - # ... other configs - plugins: - - title: Submit Simple Job - uri: "[plugin public url]?nfs=[NFS host]:[NFS root]&auth-file=hdfs:[hdfs uri]" -``` - -### Configure ### - -According to the YAML config in [Install section](#install), there are two config fields available, in query string syntax appended to the plugin file URL: **(Don't forget to do character encoding)** - -- `nfs` the NFS host and root directory, in `[host]:[root]` format, for example `nfs=10.0.0.1%3A%2Fusers`. -- `auth-file` the docker registry authorization file path in HDFS, in `hdfs:[path]` format, for example `auth-file=hdfs%3A%2F%2F10.0.0.1%3A8020%2Fauth.txt`. - -## Developer's Guide ## - -### Contribute ### - -Start the local web portal server with .env settings: - - WEBPORTAL_PLUGINS=[{"title":"Submit Simple Job", "uri": "/scripts/plugins/submit-simple-job.js"}] - -And then run the builder within the plugin directory. - - npm install - npm run watch - -## License ## - - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE diff --git a/contrib/submit-simple-job/config.ts b/contrib/submit-simple-job/config.ts deleted file mode 100644 index 1e0d035895..0000000000 --- a/contrib/submit-simple-job/config.ts +++ /dev/null @@ -1,41 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation - * All rights reserved. - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -import * as qs from "qs"; - -const query = ((script) => { - if (script === null) { return {}; } - - const src = script.getAttribute("src"); - if (src === null) { return {}; } - - const search = src.slice(src.indexOf("?") + 1); - return qs.parse(search); -})(document.currentScript) as { - nfs?: string, - "auth-file"?: string, -}; - -export const nfs = query.nfs; -export const authFile = query["auth-file"]; diff --git a/contrib/submit-simple-job/docs/database-operation.png b/contrib/submit-simple-job/docs/database-operation.png deleted file mode 100644 index 4b852de78c16e861c89771e95ab157062702d09d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15467 zcmd^mcT|(lyC>>bEL265j#xlIKp=nt0s;ckYe2g65}I@fMWiWJrAhCd(2JCSO7As< zB0)+BEkq1G5H{%j-M#mm{b%>=p1WuFJtrr5=bf3%JZ0v2KA(5qYpN?!U1z#ZMn*=Z z^y0ZT8QDLfWMmgEUL_}$#9gA)C4F6R*H)Azs~BckC*AyGE2AbuMphk1abkX%bbrnD zg@HR68EeG(=RzEM$C`{xl1%BjjINISg;EB7`s%3pE|1oe z(uY%s!9ydr)>w~W@ZI*cLtyKo`#-E->8X3nztOjTWBL7?Em-(2x%{2p*at1jRv!#x zTQ9Rv-8JAax4PL!`}R41Fr^FF6I|3XF|YK6v3LQwt|1Lp()TvWWXlZ7#FV^qC%-@% z9vRtJk-%5dm;U~Ic$GA{^UFB=+0{QkzFPkm7I7}6f8&qv+?eEMl@9#jCk5RvpFI@% zGcGdY2RClqXkJZ)Octoz@!Xsm@{?kBx*qBPfxw>p9Xd(gjMuxmx@J_IkPdfsO-x|% zTpEVx&B}Ju3~|p~Z`!{TJm}nd=&?G;c#0MXs!qzw%cEy!cS)S%alE^-ODWXC-qqbb z3;8Rm(HoOUq|pSSuCYk7SE(Qa7@`_V()Ibp8W%tF6fe~X9(~rk1y~7{S$!h-_lbw9 zx|gL5&?#e;%j)jRAhXpl<3E3%yov4Wa~^z*X}!dO4_obMt#7TR{ErWM`aBKk+^9MJ zc4M3&OU?LiYDz4CrBH+ZuTs_j279?T%(zw4W$ftSF#av%3Jfh3aQt%QDy+h;PyuA- zAP`2E*O|5)(-Xjy`my38_fBMFU62P5AX2M4dbiQl9N3uY}#FoBCV7~B& z5$v9;uZV83t3k>qn`r$gm3a)48npRYln~UA`yEa)3_i!a^2#z)oNekNRxXd5>?h zD@vdBQif#uScLUsyI&!WQ~Z{MB4po72k6GTab6Bs88$6Xth{4Cciffg5kW@@wx5p% z^6c(zU34v(Pc3trYcQY*k2<$z*RnEB+Ut}dEDMT{CQHBQs`;B2*vzw{4WtZ8!vyY> z4%hy*QdcDt`e4oCC%t1Fayh*|)kZrudlD!Wh<{=Sw&a1YMH?&x%$?!d-83EJ!TiXIrhy-yDgKE6~H|HC&TGI z;rcENRpH{R6shS}r8JfPUHPyks`#di=ksno3~CG@ZSH{Yj=hpz1!?t*3!>{GalE>= zCcLYgG0UQk`Q1cG74G1kyYIq73V4k1g(y6bD0r7~ zD^7t4Be*#=iiG0##7qYo&^&<{h~H6xSUvVtNbb_7#3Vt5IH~l4mF=lYXgYFFzoK=Q z`?s;LO#YDex7^1DS#>aPM&W}NpAb>{#1coBM5aN{RogFoV44%8AQNLL_2-KtA+Mb# z18TI&DEupA2nB#5E(2wn zR!RR$IS)5IbYx;zPf-rajki|t$M&UqI|J^!Cld5tS8pjNXtS9WK5SPNRleZRV82+o zT0H6wjG$fJwM(df0Hkj)`Hmyk>t*rQC`l77va5+GF|Ktd*=gb z78huFv+PpLZ(5v!zfSKpg6lyt_@Ociu1T|&t}qW4T4t0gtL&m$x_G>q zMgzJbGn-Ay)kaBFSNiL4?{?A(d{Ynf!s_`0HY{S+U6RCkiBqel@-b-M1YxvD%Qv>X z1VXLHf{9!r1LSdLg{Jv z*}A~`$bpRR*SVZ9lVk!P>dSDg<2xv%xwzWH>f0?={%Yoa`(3_o);hA@4JIhpN7BR5gb{yGBE{)kdzOmfA-0w-WI)clEjLqK4NJY0^GIG^jA>4&BCLmVEqH|i9JHS)Dk7Er zP)8EJ#J_b6(L`_&JUX9pNtk97c|wOg*ZTu}qjzG%*L>zbEj4)=QiPry%(>4?`r$xR z7`y6)F@+2hr^%TQ--<_kf5E-prjLw8MFK$B)(Vz$*Kk$5>%n3EVc8;F_Rj6Ah!WS; zM|``jKZFN2^fYFsbrSjdChPWW;su|Ry}EvtuUkN{L9mm@?vKQ-dSg{vX`Ir?F!`LElirU%F;RMG%HAzvmTZqdg6G zUkz9y?fg+J%XmYM=O0G2c8>4&`y%MH9@q>cav2%X$FGKltnr_2w53 zdgq~^xvX*&hY}UK(!M)>xSsvN;I*ejWd@jhdrAeMU8M%SV^-@?cQat2Y)J(4srI|O zG0Dxn%|B#5QKKq-^tp(8-)o6v2&r$L47NuYM!M+>OdJO8=VnEDoE{;#MxNB)25o=8 zEZatK+Ryeox~#U_?gKmJ53&r;^r`>hesYu39=-8ic^?#b0mCs_zwCW#GpIlI!$Z*L zJS6&hWao0%qf3n^K=Aurot_lC=AtFKEsN}Kp@3ImGT{lvYBaaWQwFb<_QW*Yi4G`} ziX$YlK1Ohk=qf}qNtndTU1kz2VG>4NGwIj$o#rQ}%gAY>xY%)5C*fw#F!DreADYl! zGNczrt(e!};QN+^_xWcgNlKwETcRuqB>j?a0p#-3*vaL-+ClzhX)motb-jumpdTj} zZ&UIP6T#IemL5{iN}iI_ck;^o12?BZ9%dM6SLUr+KLu}_!MWGTcQlA?J?TAE&0B@^ z2^fXT6n;*4Z}@w2%xg`%fWGq194P&*(nR^4OQa$F+!>h&&uEiCWiKJInw?LH6Im33 zk9mX?`lRMc0xj!Bk%nDA6+oq9G97n23ce6$VKQ?l*L?})ydZeKHG`GVz63g1B{gp0 z8@(Z`+tbe+esykHR|Bz~woE;p>tOIn(<$nYQLme51&?-J4`E?_cx!{@-j=3Q9uw|` zo||m+I9qE^B}SPdr(sNis)w0AsCLKnwII`JEiIkVoVa2*!M^q|g6q+|cg-tlE#-l9 zJDg6v>6~-Xg{1oqj;i3_L+>M%pwABep}5cTF#{`0i?Y-%6+0_XrIHz`-2rAk*8A3< zXb23d`xM{>%PD_8x8>ITH z&86W^pjmDWt-qZ>)*dY#2B8FY2ozIam~U{3v=k`YfOwhRdoz=M=5lDi5nqL zBr=nP?ydxyL~d5jN1viL(!`KMCf%N<9GTXGc@|8IJq1R_=mxfSoM127MS42{ZO1g4 zsV0smHRDD4YOUj0=W$zwmex-e`S9*=axjih=e11cs#*q26N(Z>*u9%Wmx>kIPk!M} zZLHBOfR-Vq!|^8dNTn-&rTFRq9zy=(t-N7onuLvkN~}eiuKj{n3j;{^(s%MFh0m$J z3|!-Fus3_>{4j6AkTU6avVYV#)?yi@44$*bo*AP+aZ(1zEN#z4*Sc2^Sw$f&nRr1>%EXT_N{Q8eSAunb* z@@gnQm?W=2xf})7124XJ*Jq4+Tlf4HnJevvmw|pO-#iM=9?PZB#Oe>n<9GXwNV_Cw z6I@eaxy7%N%PQ5T6;aMvA>Q0Q?;=lv|+xLsccHCJ9fyCO)h-FOKV`kg3I3#bPhtQaw4v z?@jeLF$H;#yfJ?fQ%bO`HiZVJvN0y+404%4Fi$F@iYt!auEyFwWqdp;wBLX*56ys` znXow>N+zEk6{Q zf8Unpz%)?5)UKh0;_{-k0KA(}L_17L3ry7@DRgyp%bjqy?a%}6BHVe13;c^Ijg4n6 zc-@zaGlb$Vx2&VnDw+fYruxMqb$7Q#ouIZcdc#>2g5J9|ftc^CV;_}U7_e!ofKq?N zEj5GH!GW83ox5ZG0e&BE3z+1+^^Vj%fx4rzx>D2J&C2AU7N3L@2qTwy`1waulWn=Z zb(?QqS`~FTv<#i zRi_k3SA{w&)!LFbN6bbJDa0wnaTDiqAX^BbX1yxH2F$(hb>s$gTYItAXD$%DQFGAR z;j~m6?uW4u1mEF9K!!7lwlfPnFGB!leLMZl5@7CYAbL7F=kd9HJKdRC4A>!p<2~K& zvY#;PR0+>Iq3su7w*`i-(9~OE`P$&{O!e-(v8U~sElWxzN<(r5)btMP4lRue9;r5P zt$Y!D5yamnRog{PcVt^I(xLu9g;ooc=%bj_Ee$k-pk@j!mVNjG{aUp%T-T-*(DXp~ zb3dLwsA4$}tNp{LO?N+LAZCDVS>P+|;&-x}XW!q*n*^>|YZh)yZGT00JP-2P-cFkG zKY^mAS)z3jCb3LD+$2M%Ma;}am6tcG*~%cYX1eT_Su#gNuKkfpJV`3@1*((EwYJZy zGOs4DX#vDePyC*y$Hf=;xu>{$!+fmg(acv6B`0zi+rIvco5xd|g{9YBr1S8aIW_l+ z%qH#7tNG+`bdzG;jf%~@C6xAEr$XHN$MLcZVRo>b@Xf0 zHvsXYgO4ehYM$?@>N?m|+&(Kja@L|pgHg|(NR2T@>%nNeOnY5(rye+bo%h;Vp~lwA zeI4c5U2hpaQbxYXW;J4}w{+pnYFeVeJ?P(Qq_%6@UXE|=_*L4NShDenCa)EMG;4WC zZI@|9=opQE4h8#{4yni0w9GxZCUQP+kGuMv`Q!Qpg%0$?X?ZbTAwoR&^)1tl-p{4F z$jqy0Es9^tcsx<)Db+|NO@mU3p{H*$4D}LF?-AVg6r0J}(QaJUXkQ7vL zy;-~M)x!+lZxKu50_;zymDXZ%xaaf7<@PsT5?}gyegY4=;)ykpXvF})~5MgmO4GsG?=A;OqRiDHg zc^79&!N##_H%lYo`r&I=DGR_bN^kqI<@=^esFW13jUn%l_O_i@)whWbIsOFOP);t~XukR4QrbE0xx>Q7WUb?&OIx2fob%Z-UeV->8WEyYZ& zSA5T{c-#=~+1mbj_gbn|dtvpf*i0X|F_nzpDj=b~kc)^^AQ--w?0g-JjG(n>sloOd-g3g z!{2WexEi)@zm_YnLwj2bjdWHET(4im`!9g9sY!;B_&zNM-e@ z7*EeB+(r-08vFKcdyn_ZM}gg0n~_jKdNWqN#?6+E74tm7fK#fC+l(-FQ#=dTUeJSdKd?R++);Jy}!=ZtGS#l0R6oB+98!YYhoZ7AD-!(kSe>J!*CB?DVU1FIO~j9K${ylOY+E zvWom_H^CTtTHfhj2uoJua(NO{Dscmug3q)Tv3+-;mcB^qg*9`C5V$p`vch%Tzc*tWdWi~N00oC;aH9EJt?_1mnqAHhz zy`ka;rTPj(yVP3v7gM`PeTO=PaDf(jzzu+oag__SNFc7<1fAA8z)ya%&@)4FIUnon zB-|Q_Qwti@IiB=X;83g8)0q00Txi$D9ujn1yt0#e_O|-$8>bT~WFf&7eq2n{-F~O| zrj5OAA9Sn3K93-dyy1mGTMynU%rx!BvGCJ><>ty&cQICpqEgcGl_yd@0*sa0>#4-F zCMGO)1`!x@<@#R#nQ`%VSGi#lFtgWbtTy7ft%OE{h}~nK#q}EpTkJVg9N6c6ss#iLdsttVSb()D);6%;Ki_q(!V0^EJsxpz$b9_x5k@Xc z$=H%kiV=@iJz_G2RHDoTw8v_Gk#bZi_m9_2&GLVc@MjhbKr(Mq7zk#J8y>IO>oNq2 zsDbXsdlE*rvXY(0uLQfVJ}$|!_4Jks_G1rrZ$9`rJG(rA|nAox-}Nf3%PSx4yl;SxRS@ZQ#a$w->aa;Yl?b!LEn@Nqp|bmC~}lf zrG7`~jewduyHh5<)K58+E19Tl4jz7kk^_y&@`B4ert84KzQ)2iX#qqb_CiNY?$C&4 zzGru!+O9ZmO$=m^)s$340iyuVWVZ>iSk-fe5Z(?_4yvXslr(}-*Ka1W! zwXGVs?Ot6{qI89ZtuBdhfO7%0j8SAcjy4ONWsjU`mvk4_?i-Tn#~1fPc9%Ef0mQ;A zhi+EOt$J*S_hr`|ljvqrH2;&6)Uq*??&i%~jEp7k-d%+NZ(Yo}+g4gRcKAK)csK2= z4oT)3G6y}2nX(=lkFy|5L%uJ!T>K(AYa~X}(vNq~*6w||AJkkFjO5miTz~8-nrQ_5 zKvto-s{eDHvt+T(qp;7xC-Bp0d`mjDoi?70}IUiy9mRt{dP4)bEqWj&B8qBr?&JO}~KFFHX+Tm7Zx+w<`+9TZiLgb8F|p9=&7B26$*cCGL8WjkU~~w9$>rVlFI@YYJZ^|2rbp^AVYC)>|uP))+~ej#lNSLI&xo2SW)vojScZdVU4PUL zO|#ukl)hK12ETFqP^$2xZU3TcV(z)>vh(iIHe2ZO;AkcQ`>$Z|AK?2$n;L~_71ze} zO!ZBeo_yA0J=0>K+{X2Uy~Q3BQ2BUoc(TK5MsSIXhIh{XYhVj_=B$n9gyn%}n#g`g zV;#EAR%CJbZQjqn0WdfFTtfKWmSnkaP`ZCXMlN*s^Q}rkyB?s z0<+5dGTUVrcB5krD-H7LyDi!~9qDcOkV*u2`2ln7i?9-m1ef+Fx1itAUU3HK_MvKD z9>Thu-&&}EpIJQ<{Cw2GBrO#SO%Cv+FXn< z8((^lpZhYs7eB}-g-CXNa6pYyx7_gMSu&*heaoq1Pj{g$Gv^V8n)_@5?J!Z-(i7$3 z;@h+V3#(un!&QIiS=2q%LkB?)LSOmxA9NUrB^!aLA}D*oGYfn!ZAn4qf%=1^QHvYT zUf$6b8|q8u+B_Y6gA*X^wJ56UIe!6q{qZ!CZC?$3wia0n7GU-AyVhm@qWvqmQMwz> zw0yop!CrObO`pnr3GRK8RDTf5OC#dOX`%JInf+S|FOoMug$$b9C@SByz`Ai!wFc&! z?3)AF$W1r7*@^}1Uni%tH413XRH<5cu7_>TRhdlt>HW?wwvSw8Jl(63h*8b-)zM+@-^xrBNH*8%0c;-Jc zcReo8YI{!;A(gk-g@5q-TA@Vb1UR3@$4r&l9k|UyM4s62Zr0w!+5>_{l>(O7$CI*v zmo7TgH=w9fat9?Qd?JUoC%!VY*uBFhjk^^ax_!blbagj)1%jOuQ}+;`FDOMil_Fy+ ze+Nj7^oYL_leB=w=@9uc-O8G+H%?oGL?)eC5R*;_7N{(OXq3c@V}@1~6hA;S^;pV3 z6DSQVnEEewdL_4(2lq(q( z`kE5PY@C3v6{7HRFWf?EZZQ&1OS*;u-F@dOUKMB&x5YS!flgh zOP|Z{?NFZYE_^bM7KrdH1qLYG0mu z>-#j=?@LBfjN>1@OXo0P8k^CP(o88b$MGXCl06C9V>_p&zXw%EwP*j_~7Vlq%>i=l-}_f*WqemV(kXb*6M zAp`4`51f6$%x(CSlN#~5mpTW!#of(1T3mbUzC|`?D~wpN2;#~7y+q2a@}o=9-Bo)7 zIaKS8xODZkXBiW8Fzj#jr}~AAdepTl-{=FrOa=M$&r@m~1*VS;gD3!YiouZ^(Ot`E z!=rU~rUv(9NpMq{!UIf$eOnDhSz2Dg#2itIux**gw(4sJ2{79d-axkBwu=bp>EaiB z9|&hGNn6x9j{|8*aiFqC>ln4x$sV&uTKKfwV=tzd>dQ9E{2zc>ol;z(?deZ|(xqq)s-P?ZEgBNA?rAEf6=c*J2UYE*+|>JX^;0^#-n*7DAgknn04--1 zoyZtxr>9}uIy5~qG2J>Xb*~f$7VQgjY4jl>!ju)rS0FT16?vH%MpztS1z?Kv&j+gi zS}rmUTM!SZ@+)2-Yq9H%sg+)CQbq?EPyU9-B{NW&Vh&ABtgY=Frg&b%yFkpop*Ze1uP-vxRQ#V&Rr9<-BuY}N^)(a2$ z^YV;Dypri!0TP-!Z$qwpIZC%_f1P-bw%u8}%k2s|}Po7@pdA(5%^dIC; zElz`FpYM)$$%0404=~NlTjLywSPJ}|6#*&j_aYvu8+6M6DdoB@Mjiy8Qd8z94tYyU zP)r0!5$Vvl$7|!lmL>C#*h9!q5u3$OuOJ-@*maMehx{$K)+91c%1m}sAP@4TE=`WG z{niR9H|7O(-R&2_ybGYb=REqA86?kb)-ferxYk&MuvA&&Hb7?XuPgsNHBMn#I{8TS zDJUeTil>y~K%%{}dCUyL;z1pOUM^rQEC&KG8{=oRRp005^GkU4^eX@zp02VYw8NU2 z`!uF0fT=@=zZT?K_Lf|%@bZGL-^kEccEhky{yJwpe!a8CnC2s!2J!%gV?tT;7?HQinq$dRrMJ~HsM7V-&u=J^}soRO>0r(m&vaC}oY zNje4QwMl%7ZO7^2ZCe-y+YG^TT~iT^^>V$U&ll0VHJDvN-JpYN6Nk8`@>i%NQTxLqV_f@OQx9r1x_miH zr1qS`xVDaJWTEAwy=^*bSy^`3d*;J-7_rMXIm=gHd)lI`Q8p4k8>UD(PQpxW>9Aco z7HVXWh@qDw_mv&!bftekfgXvD=QQDmeZCN7d%)MRYhCR)9fPOAw>^@d6WHEHFWXz}lXPWGK!;V9luZ!Lt zW|m?HnOGfXn6A7r!hMz`Au=hJAi`BECUurMYhu_0ZMyAG=h*wwNK35bJjr#X zy=wAWfx9Q=3%GvP03nGC_kIx!oN<^w;tDS_t22=dP-WiA<;E4WhQ9Q^$y|729u)KL zQV*&jGe9mcusUTU`A|-SCf7Ye_jgnM@wm9xcW6ZYA*4f0MPb*&dBR_olt5iBIirMa zxh%XNI%qg?kt$r>BmVRdfFzm=cp!*ujs9> zkm6yMnc;4f*$|3()m5g}HW{Sk1KCGH6!kj5sLD( zQ|%)AHer@6-2%P9{kPgfM#JsalS5P!fa1f;YNXA%`T6C|htKCJqs{?|H+QdwRy;}Z zra@{#F52b|dF)yay(U^YzC6O3w@m7nTw2<4qixK$dk2p>rn_>&nE=uRTMMMkz0i{8 z1(qN(L#C8fP=Xp)t%vXLTF^jGo}D_M_Ukm)Iqa{$nfN7)lJ3!={C;RagJEDn1XqFz zB3uACD=YE548rZhA4v=P>EWJKqLPI#Br=)`Ed$rwF*RhTI)F#U_a%y7c6n{*^M6#Z z6liw&VC3I(^uxM$nth=um4~Npg6-loCR`O}*YP1Xu#w9bH@dQbw=65vo1wd=xC`FL z67ioyC;4=6MfpC=M@H14nZ-}*+|+pRteHaE9f#pH2nUrAx(xCf0{fQSC%2gH^rEdEM;6K#`=YJN zJeN3wU^5#|FZWa!w(LKrlcFA}Zxa`6*JP8wFqK4Qlw4iU>z(wQvkeHL0dYgAzfD-Umqc|$ z26KC@O|nT*%|dhl(CnaWq=2B&{q#O>4J1J`j5hvacN?Hg zJn3zcKj3gW>Tk#N1lQD~P-G?*%oQi?0je|+n;*yB6Rs;pPh4%m$e)Tai*R?YEWt_* zDoPTEf8ENv;d~|egC1MCBb!jdhq6zTKap*Wnv#+p;hD{-OslpMZKLl$JgZcG{L03E z-(^0G4y4D-guAd_$9~_iDL*)iiG~PtN=m1ATRVhe2FfmP*wFro>_cVlPHLUp)w>_Q z$|L>j^?@+YfN^&`R8Dp8JWdKpv)U@TJ)aAiF+QjlB#wf7QoGbJ<=7BYJ zKVq8@-5u5VTC=!>07BcK4b5=&lU-gr`Jf^up86@C8J>aqxs;L4)VSpj%3cx9uBMK> z-nad@OtHyUfM{G+`Ah&PrZ^BD0a<_7Wr$YG8PJC{hFjIhU>v8T*{mvZIk zr!g-W3h289=Rng(5IiQ`%Zirjg~OxbYo3VytYxxNc;vHarz(a|U{+End3>*Uf=n;}0d z&1q&W%~mco^+T!K)8iG4^C&cc4V}6hp#X?L7`~G zJ&E=~J%<$dt2Al1L>mbZZEW%yO3in6$-rT?HUmVc6w5(-QU_B9dCh>W1NUu*rNCfahT@>NaF?^ZHXpvcuYARAS&wLuB+A%8G4X#%R z5uMpktFk=+FMN(-a3cgSf} zW@%#r+|vDnxm01_EXe!|V!2$cCqHh7u-=W6h!4EdLe5VQ)lPHQXtM-GxcRp8vM8m3 z{8LvuBPth?To>r2JZo2dU=}T5)0x1LDGWtIeUJ1n_yf<0E%;}1|2uX2%^M0aO=DZ* z90(ff{jf|AGMTok-ta=kR!FC!Tjq7g1MG^K2%p$(-~m zDeQNH#zgj~i%!L5`f%K6R3Tj{utCL_eOS+*bmCzb?MzU&C^W=g6Y}m&zdtk|Pt7tv zD@55mNsWd~ch8)sWn*9QXHoUOin*+bN6iNdg_lER3QbaVcgqX)^wyqLAp@M)mswjp zzDki_f?6HXNCVppEX9U2_mf*r7Um?|JRhbSO6ojBEh9+|pmU-+fMrt85RHf{AFtA+ zQjgzhs)^#{-IH7Xfn=-UWRylTAEbI~*B-nchj!z_oLp0R5*sZG{aPE1Dcbf~1lqAc zBwD|_nm@fU zwB!r)U#%x&|462RgZBCp5_{rzovP?)K>8=AO@P=Y{M)~3jSv6#TFbG5&G3VT7q+SS z_qp&_F!J|#?n5~;6Gbdf*srWu;S#nvVv3tzkkLhVU(BE@@*~_nMn7Ib* zqdo*{>gp!!oy>bL7>xXFv*we&)!pYdd(ZCfts6ITDok1o(Z|Pr8BzhWJpXF_M3`B) zMKHx6Hf6m|zL!llL&AGMTsDG+o%0q6O(0!s&j!o82OU*y!p{#V(!b{K9h3_?-83Ve zip#IH9ogvpcpp`5S6yA*ygv(p@xO3VOaJ@tuCG4}#->bs?&wU+Bt2q=YJIXqNAJ2d|KCac{4LzUUaPN}%x_X|Zn0W}x7&PI@gev_-`2ww zN_OF_Au~_5zeD8wZ>|4H|J8FXe3qF!W%kxp;MKQ(i^aq7*WR*VuZRA(P&$IrrAU*GNbfb2(4?10FQFqMBHcpo1ZfEYDWMku0qH_W zsG&$N0coL!H|TTDJ>$J!&KU2xAMTqm80_r5$J%SnHP_l}{eN>NN=Hli_ARIx7LzIc;ZCnW}I{5kseLg(t=Q>6c2ZxWoR3~!cl z48`x|_~158HdeZsLrcAkss9%L?q&Pin+>awnEm>pV6D&Wnw25ss1M-~{UR+BmVc|) zMK1ItUBU+%?B@QCiV9I%3xmP>fGwMqeftwbA<1ZkzeVNTs{#yL;&&ee|8Bd1K98d0 z;Fgh@0W!tP-B8q0XRV?|7Nl4>%U*Ud5z*_4xef~1>UTHk)cPQDx9zd9s?30C32W`V|MQ3_M^*@dJbAd=eRD2>X zZHX*U$F}TeQ=0yqCl%jhz5-L+tikr$*E!-l5 zaND*|eEdvD>#EGy`l^y#rHYp4Ry&`zP{whaXO~R-9GuMQ2XFuBDu{>NRmGMLRIh0! zEQx|wcc#$ZCkRN523w+q0tc?8SaUR%MoxzAK!5?x2haB#BuAULj7W{#bo*#eD|({T z`udIL7wD_4nmq!WbdJ-U)G{|O5JOYN(J0a+Nww|p!CDKw=9DYsmn~W7^k=3@V;PR7 zHXWT@YMsStgc$~@S$za=>-!qz3opqgvhZ-PLs3A|U7PBWE7 z8tm5}hbJ-6kfGMimU+6)`cFPKg%>TroRPjrtli6p4(a>IxB*{KE)_MtkGnu&ifSdA z3?9sC8ii)eNgs35`;2tCeOaJ;TgLCGHVg8;AT=!1l78S-O2_&5RV5^j(BDFFg{mOIzi3eETUL1&R-Q>l|SrJY$53@ z152UsLs@MWfuN>b*^0o1?~lNx;-3w&o%=Zosi1>fBMTtDl%ia8kbx=;WROPd#v5rf z_%qq!7juv#yiN`zU4iy|4lbIsm@P^Hx0V{2&U`vd#C&wJ&YX@K;}rM$xV8J3Yetqq zpILe;wX#slZmsKnwzDp_#^K->-agR0LM<~3l7W1%)>6Oq8*az2+;0iz-!NII6KwXghyydm~1k~MY$0mP1XpGt7jH6*Ww${^3&MN!53Ecs-mAiYzSme9;f9L5uclde?~C(X?0;*@art%VH-U6kU=`}{AC zhIA2Xo0(!gO}evliua#w8~3TI8?LpaeJ-`@ z{Jv2x5n6Uq8wAuxqYn4GW`cJ^rg>po_=xiL7Js9j-pDtW+u_J`{Os1~1MI}t6LI7hj?lWHTX)RB zvc;iVaYnfxzn3UcKj9soxe&H&E2tZl-2Zk?v5IdL^qx8^r`b3w9c=N^D3TEjIp5(z zFdV5^*6;D01eF`!FY=yqI6%+MP|Er%H-@y#`aL#O-P=YI_qCJ+3dJ61oT(^J&FGGG z+h5;%XCXQ`9Q-UK&q0!58wH!okgcxm9*2~0H7v+2)J@i5GRXlG)-=m4pkSle+GY&Jzz=J;b}7p6VcyuRJ>d@WyK%&<+kM(jt;ehtMLyo9 z&E&L-e4;)1ZcD++hqL}MWigVl*^9PN*FnF-)no9578sMc%AAXF@39+m(wcNR>0Oj{ zw1kB+e5sBUbwmZ%(%LQdHE{3jrQ2rx$oBjRE0ti)HqGx34KnD)kJ~Y5FHCQedb#5F zUWeF6fGAPHo+%+S-q4G{Zj*$a*7#=@=n4LrBKp>!jbD7Wf;H6fDK3bXO0b_oa0!&;`@s7 z1kZdlR#|L*YVq}imR7I&Ap#68|57i_D|wx6w4rLPh36U<(cHRZ5=Xr02s^W19e0Bqx zYD%_t0KHn;J42NsQ~9Nl(Et;p{C0!W@)_80d6tp@i{Ifh7%z)_rzD-h@ejekEqW7Ygl_()thQ5^ zvvW!w1DgY=HwDrV@h=Av;5`oYzIhSP~4MSkLhNG!cF6dWtA+sYfCS zKKQBIMA;*0T{PW>n0Cefz1`^U;9c`wO^uBbV7axK{;xagdEITu54-$_lQ2{##?%OXeJDH|&FeZ1^ zOrEv-{aeLIOSHb0ir}Fk=2cwZJ=^8DUiWuF(PG6uI*I@;;K4ZqTZH2{b?7NDi8uBR z^VMdH)4g&!z>3bBcDR#xgNWZ9M#~u7wT9s(5Fj9REIP`ltNqDoyvM7lM+0R`dT4pr zVtsoH{bn>7?|`>ngi^DAzlFD74nQ%#S(+VVNmv6rLd3rA}xTTkg{ELwMuTy=U zBlo3!uT(7=Eo6E1gWE;ghw5`zemzKb!eXT15m$b_Nr=)$m~K3}o)wOosFpW9>wqXq zJ*!X^pFDC*ZVq;ttZc5({y}MLoxE%0N5yO{y|boHY%YX4vd`J_W0auvV-D5qX-=1( z=oidM;jb09814ssNoZ%*|6@^DSFnz-8OukTx(?QDkaW^Yb*PH&#j9?3Mpc%F{Um%R zm#^neyq9;#X zF@DOBU(>E^MVceZzOGBstC=}|OVeA`oHrk_D3X>P@}I0*9Dq{*S1!7o160EXtsXiwOQ6WA!9iIo!hDAbD8jlUmf48aCBk*DYi4}**bS)jHzE#!}@gx z=5%l2{?%zNp~5Nkyzg8xza?DOF(iX<`mD71hIBv!r@4A`FJNjMS`+WiLVszkSlI

      q>+*ANAu10o{jrJXu)@WoFs0kksKobe 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 diff --git a/contrib/submit-simple-job/docs/hyper-parameter.png b/contrib/submit-simple-job/docs/hyper-parameter.png deleted file mode 100644 index 10788754eb7a1163ac41819a91794f6dcd14ca77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61931 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 HuZzC}am6(% diff --git a/contrib/submit-simple-job/docs/interactive-job.png b/contrib/submit-simple-job/docs/interactive-job.png deleted file mode 100644 index c4ee9c4a45224e19963bce3a486b23625248de2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27043 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 XXZIuO{qQeVx~8G3qf-6UCj7qu=|E9- diff --git a/contrib/submit-simple-job/docs/job-template.png b/contrib/submit-simple-job/docs/job-template.png deleted file mode 100644 index e86a01fcaaf209fc5ba37b5f63af6aa24605ca1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46780 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 t!%?9J5k(vMi diff --git a/contrib/submit-simple-job/docs/main-section.png b/contrib/submit-simple-job/docs/main-section.png deleted file mode 100644 index 37c5542e3c16feee778cf15f92a4365933b9f85d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67105 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�sUPd4WtiI3G;*+kG6A9 z{N2p9een`6b!9b{GJjT*W6AF`1vgMLr%#4$3rXc%wy;2=N|MX9KWhL>- z=>sZ@lLsFov9&5$OGx9Rr1R^~MyV}3?6s$Is!cuo2(qXzcMOq3+?RSVQf_cTY(+hv z(C^)HObDIHU%|Qe{HJz_BQ@>&4o(+(ZM@HHJQ?Pzw61;?L9eckW%a6ljz%zZf!QhG zn@ZQ7$E6%HeLe>d2suK>wY{HH1UA#nf$%k_ry$p;NPQKuuphrNta6p2{^QhX-B0+-TMm z4hP2_Xd;aQDvXTAMvP>Y9qs_RMG4+a)<4(2sU;dw;iiudGL+GN#gEEZB?9g)(B1X8 zdFSZwmnpKxMTm9l5X({48|n2INa*&9z3W{M@I1suOjh$~K)_fEbnOTFB3h+MA!Ec4*uQ~Z9kLUf`e~WXg-bvT?_n|62fWWD17Er%;#N}7F-gso=U^-G zotC?bwdrln?AkzI>(NuEN;D6{CaBzSbm{U?c_sO{G|I_6kh3%3978lI9vcsy8qOw_ zaJ^iP^ko-6Hdb5d_Z@kOokZs{cIm3iA>vhpfU$l#G4bt6%zAW;^%G1a=E(H;eiO$J zs}*CC>Pn{)YD+)=b)MP7(sxGyZ*%&y%cOEmvn(+YmC%N@A_V-j*`M+J0`*naPKQ(t z{aZxH8xZ}-B>)e)M`;W#3TVw)6&oc=C-9`6L%i$O$Jm^yqvq5aMvkZ7p>##oiuhuG z{WbTM_%u>R0%O#qJ7xL|Cz#G3kSF;hK2)iS1*O3d#_H-*ZmOXhO|~PPq7p#B@-a?> zop$~5tn=3W;Qm6d#wh35vR-kvu?hp@mapTXY~nY0%?H?^_kDX_^L{1bT;Sd{p)IiZ z)Uz>{T7}Ls&t~cX+qO3l#rXPpkf~hdHj^7Z5ekDHnlY>9PfvL~nF68Tn3amVRwP4H zO5G_$$T_1D;Pym>w;RX8%Pm!Rm=CGv#n4OJPz{znfA6XG>~7Kv z!`|u#c4fpqZ#P<@Lwl?j3|s_uM&6_EPhTIKM=GmRE_wqJ$|?C7r~Ljjn3oKb3Q}ysAgegtcXwZDlM7xATl?Z40+LADGuf@|?J{(YQ6v@9d~R zfONW2(!e?hfk2{`ChH|)&5OA#_>Es!Gt67O8aZzwf8|tSp=xby&4~co?#F^^fQErj z^yAGlRT7q++I-xEZ(c+`4Gom)zhEcg z+7m1}B;`-bSoz^U4ae%ch7@X)=HMVzw^>G2SslRb75ettN5anT{>2720T>OS9^rs` zX|B6`k=MOTe&DvfPv6Q#=ZN>KY~5s+kQD8m_Q^N#DO_OsRw%bWc2@h>i;YGuK(>&e z6W8R_wa=%~)KN$NF-rx7dj$+8a8V#G{icMy#F(^Z`|{>PMcIn5BV5I zP!MF+P!zH+rGnFh9P#FSnQ6>Ir_qE@mL7%Qt#I+=zzT%x*|Ft~lszNAi|Yjyz1l(>Et^dgxiQ11$vSul;2X zE|SBdWf>S6W^c|TB3+JK@tZb+E2Ln~GiLTZFxpGJj;QHq;)WcOt0HNk(V~x|OK$jGGDNi?`&WA! z4_4lG$PrzcZRh0u$M90{NtoYJ){)r?1uJX791i~csDq>Tj|rd*g~-Fn3RU}0;Un&6 z6a62!{-iH|BmP18SpBNmpKpK6>g*F=PF6c0H*U=RANaGak_?Q-6Yo03_;kzvY=6PY KruMx5&;JB!;IIM! diff --git a/contrib/submit-simple-job/docs/privileged-docker.png b/contrib/submit-simple-job/docs/privileged-docker.png deleted file mode 100644 index 8a003966e5c8e1630d61e5f2b1476713be231476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75394 zcmd>mcT|(zx26qL5KwwYMX6GxcLZrl2`%(0z4zXvi69VAdX)|dgk~tA2`Ie^p@)cc zLXi?$C=>Mi-8*;9omn$${+O9Htd+%^yy3j(?6c1~dq2;9h*noqBqE?CxOVLt(JLi6 z&1=_gMdDu1?%?A-Au)aS0r%^=ho++JHRuriI_}La8yQuZYuBnlglFb>xc7HmmGnKX zU1Ny4dR+%C?^<2Ec3JdFPDb0;Wb>RPP6Vnt6Mu(Y3;XoJDeY^W_@IiZ zUUkg}-nYk+T_2~9hmp(CJrMGb)|EM%Ae~<0fTes>+J3x7VvKn+PQF0-0beiVnSB4L~R5$#G(>h})0 znz=fhMRM;3uCLdwy)bC(ytw=4@~wa@+pRxW3GeRU#(eej<9^=#KNl}(;oFhLAt(K& z8%Q4%EV%XZ0{f=L{?EO)h7LnnqVWA8aZDabkkZkd2MFU)1LY)#2cFbW+`0beOJ=9M z;dv+ftFyzJO)KiQW@ay5zI-{ct0;Y{f%KX*jwSuup9a-|QQ5XrMCHMd_>SH%KR^Gn zcT>fpHk6&*UExmp%f#)LBNHs}Pm|YFZnqtO=P54=X5oKh`-4zb+~H38oru5pikVnz z-6lfStTgiyMALfiMhvi9{JoQwleO73;I659Khu+Kshrso`snYl->&!eIuATseJA^9 zA2b-%xYfK*|MySEK7B%_>BoOUKjB*!{KquB0V@8d)PL_=r)Z}WGyk_Xdrba!R7x)+ zWdDBC?!Ee*KUWWl9uWMsOyMKhM}IzgDN3d5X2w z2ZwC5ee6bpDaP7A!@=37E<*P9G4~V&T!$*-kuVM(o)n&mu0RfMRPkvL!(J|(y5&^x zWrYB}PHB_O)?JsBx~sKytzOGNLN@i~hU8eu@2xfR?g)zGU{H`F!3JJPj}$(1_~*Ki z6X#)>r$BP41S1H9=#Hul>3MxW;zM@lxKu*-o2xY+-ft#b#`tXLtc{^-zv_^4^%pcVY)`08{=HY0dA$ zu=U_mB{ne*wy}aA@Ru9g5{22b%D^wrOiw`6AS-zeWUE$`SQ7$Xpp-MPhI$uIjS4?+ zZ+IYIubjgX;6H95Mf)MisqK#m8w9PL*aU>`yU(SV*@_fup%~sX21pkbai)OTPE{lo zLA@75yzDoTuo?dbp3^5Ka&b|H!1aEhj>18a8(+;5d$|VMbiBs_?`7A~&)+(T)(#G- zt1%@ESzECsJ;SxTVaB$1+Hc=PE_oQZa^0$F5B5dm)To`xb2BUGp30IvC})jG#Rg+l%*Be9uq_{SGr^iIsfkcWVOAfo#(wDH&5#|Gv@v{l;s30KA@Xi z-(t-5-5D)H<5BXZ<8-ZK3eO8Uv)*45Z}F~kBj7wDzQtXo#DAE>b2=wBDV++gPyNIq9-(>OPJEV7yZjXDd;kD4O z#pPHyL-$%Bz`925ll?(tcMRe_FG?SrlJi=%b)o=Yj8hvfF7{y5cpiKh$B6db8{jQf zM`Vwl(xNDTK}T&fe5!cr!H}}xrV_-$I8RFbd)~?ZU0;+X4nkWXWiTZe2GtSz$Qr+_DZq0babiro)GUZ4I1`uHBjULgk|?D9-P#cXrH z%mcz_Ox79hMyR|DC&)%?V4(!bQYLwI9%RU=09xN7ok)i|d7t5!Y|ir5v0xY?72>;p z%gf#vkoS7aJ^CF!3zohMM(*OM4w5u*$Z}P8G7PMCXE+J)ID#^IZ9*sT3moaOaj{GG!^wQfRFE^n1n``9v)miSch#-mR_Mh5%S8GMRjdz-5z#XD$u7TqqT)<@6f ziLw78oRTaUy+B&u4#Ss?he(SSYb^lQJV5i61DW>|i7q;GAqz~XFY)_A+ICwX1IjI| z8Zd1Um#>X&;uta5)q@?v5YtOLjSh1`4TY#WG+juk^j5Wtt8-4ELtA;J^H~r@&j>v4kh`e-;U8}$K@GbP{(|-eHKLW^n*)wRmY9V zjLMBRE)PzjiM~8wtz{m<~$g7x>qdyV~2`nwKov3ik%-H z!CKGny^E*u`r^HQ&OEu$FkZAFeVP&^*+nsUw6Sk0*tdM7d=QX(!qsv)1n_LXmjQiu zKq7tS6Li`}J?Wl`nJCTsoN?(8Nt_M%eUuxZ#MHD;b-E7V;oQ6UEQ`WIgZJn-VLvP; z%~j;uFAHR6XL#iLCHW2K5vGV#;Ywh%U%aUFB!JuKN94|BxJlES@i;fYkDCVPie0d@ zs852v2B>)-SsjNyql!4gy~?c}1}2(`VUmj=&xL)TLO`&25#@Afp2kB0h5#AXL6Tm0 z{(cnPv&+_9-%l#2=obic+w>UV&xSQVUn&`eH`1Qo4mzqp{UGc2DELr9Cv`R&bzs}R zvp(h#0w!x;gUjO?9+ui~?a(+aX&Gc;pCc`ROG@I@2ptA?^n~sHPVQu62n}D~SZOBN ztBn;?)3N%Bhg@2nE|)DA;MKk3op=w%Md@%C`mv^5JxI|J$k}dT5jFnq@}$$&%<|%# zYQiC?QKJnKiyg>>G|k^#4@>7Z+`_x6>KA|pFTFP{f&&o#mq4ISxyd+Hve?bBe$Ws0)g z$+F6_2`CU-q*M@6)WYj>8mH75zF@)n=Z{?n(c5VQt9kq-TQw0|;`x&3e8^g9n=wZ5 z*Us!Q)}|he%%EAbg9ydF*uR{{apXGSIphz>;j*Yff72i>R&PZN+e%InMQ) zdV<{oq63FSHw+MslScjBrI~2Qf)wFPeKm(4FSqq(8?9*wVIvMqbT((Jw$`F156zM) zG=>f1{GH3R%7)A7Dq}ce;i8*K(Ha~V{*qMGc3%2S!YCUF%E4OG#JLr19!T7iOiht4 zS0$&*iboR@U5L2pmE3g!sKckda-la9s<4@lLg<7Wtk@(&y^_PB=O~6niKu~{cuebi zF%u$cF6Q~S@eI3kZO@;vA##|zP%hQzN#ElbPGJ4zh*IW`%UFLUE0*$V|m@Kb6r9~B;v(4Ls?FLMTpPlrAhak!`0zHa>KX;h+Z0t_lp@wtfZC z!*k0O{*Ba95Ee~rc<3OL&iKLffaM2-th&rK8O))wr%&TdA*ugH`gx!CLj<=jcd}#I z#~mrGT{AZ3OZC*N`)8-Sc-WB#{u+b9SpQ~0dzCLz+6pOq!jpENJWwI$;4n3YT)LA0 z-CeaU@q7tg16tw=Sx+o4H$D=>m1`iamrK5KR~ z3umQDKrVN6WhLNt&JpOY=P%2YQg;Yo`_`%(m2<3WWzuE0Me#V%#@5u)u}2@1U{I|y8=s^!kNfkqP+|xtv zfAhjB9^5{t8Dr-PmgVezr~I6IIkjB1+P7Mfv(57IP%~BSDM8*m!5R=-JC|$90SLT( z>Mob4D6zL>*^52i8)pWRMsnUwwmm6Wd>lo6lpl!g;Vm{f9m;y2?9xldN#=dXMZ?H- z9tf?GWL&12D>&MWEhC7>Mf>AC^0oo_u$GsN! zr1JWn9)4PsR(Gk9=(4RH>Zx_(n>*cVC_bD|tMjhk_sPDEz@!98=%_^-n2HrnoCj#b zHcy$wamKpV0JL^w6F`I}SoDSEDOH+WIFyj>j9JWob9lb&uiGt~)iX*(=KO&1VjW~r z;NR@`K`V;tNb++LyU=?N>C?1xzndGU3&+*6L7}NzUzuIbWV?Jgc{`GI8W!=14VNTo<&hUfLl$UW3ODgaA-nj z>%>2OuR`5PeRWs_v#4YFS+}J`OA?>Fbut(`;%Dr6BcXM_n%x*W{H(4%0MG%`%QdiO zG6lW5?KH{4$^U9vvU!dhVp)@P^!`)fEzjrE0$&^^O7>Z|ItPjj906L&+`1p67w2Ar zhFJAQXPa#Ef|8W#=BkI+$JW}N7`eQ>ZRrR~&5iSf#)Zl{nY2-6H7|&+OjX=QLqmWp zf6?=tqFuf4C_*d?%^9rnito|7l*=4>1tWuMRVUEW)^hD7G$8-MoqYiwAnK?!ag^bv zaS1uC7ifiB#e3wVjgdz_yK$XsNF|(DxXjz5QAon%a~Opbg_H?+Zwq5D_Dh#HSg|Ja zalVhm_m7afAFQ&j8^>~uj6v#VoM!4IF$E_L=idC++`x8g$SK>Rz#}=xnWddcU&2$^ z@mrPD$|t!jf_XB=XX!zT}I#Cx~AJIdbA zUz}(IknZd|Bxvmwx3H3`(*b1H2IrT&sgkg6;Zkp(sIygk^2SkKnky4H=h09RAU9w1 zxLLHT>q&-C32PSD8nlMppm-9P1ZEeadPQ)7seUdq2nyf9UU9#w7$C zAQj7_+GMxFbI@Vgj*SYpN12p%U}nche&pqN?9N8e@zpN-eJiQ?MQ12&Q`dJog>htd zX}YYZ;6&6?S(uLt(lL&F7v8j3jBN{Q3lh=kLLSNx2wNQd`1v(WFbJx;x9%$ZkROnF z$TXTmkh|BlJ>vrdNM>K%uTLI#v47K|rXq(b_zcRd4nw#0-|-|3Y!xEzpvoV1y(~(3{|(QIRZ`G5VI*PY8v* zloRM%+P`JGT*E%#rrF9IT`>f_Ni8#womEqnzsP=lU1L~Kf`jSHFs< z!k8uY38knW|NdT_5JzmUqOZU@J$kevr{y_67I5jz#Io2oxhFUZbu7e23}rA0(f=sp z4%mFPYfll&Kx9t6HeVuSqgZMsXupHYu@$oxc=88Rl=wB)S&+#Y3G z@;bMh_W5KcQ@Ho3J}Xw+v4q|9a%8ZRQViJf=& z4TKrTTtEvSj>c<+6I_fm@_;xvV?OR2TCEX^W*=leHEi@#)1w>#4Fg7QN{^Ly2rhG= zj39OV)^{^zYs7ulC(DGPwYNi1zY@9nK$mR2LYG1XPFY*kpvq4Hh@Oe{n^8XNqP5#l znWX^_dv|Z;{sTK?3_0gv)>*YCm4jaUn3^Q^pjZBIfv6wx#ztm4PfJXC;eBaB@Ij16 z9-e{3_wex!8?kY1hcDTfNPD#dWS?tq%eRsraLTP`UrhODENk#8|2Ym52~`0Od0HDa z9Tc5mH4XBGS{{VqGn_aATgZ%n1`SXhm1g6C7 zo**5K5nWqDlv_deAz+~s%5{qtMA1yi%ofJqXwUilb;kp9X0d}`oa|le5hmj@HW`IG z9({niv{S);&5NDW&BcU_HnR71gHIlZHng$ek#+ttT#yxzL@q_p^QzVJnu zS2+GnRWMS#7cV+?*wBPF`_l4!Z{1Mzt#2dood zbo@Ns4mfGmYae8l9;DjU5^{d>x#MnFcKeI{o;7NhbRF^i7Dl5I4x2kVm)D&tc7D9b zH?#G9ae-_apI{m_V=HWJE^=!RS3WTX*C@KnkMG7Actv!9mSfJ!U&2sTIEy8<*q0na zYoj{T3=2aVjRr4TBaWPDh&jiRpZ9o#*~}`RCN()%dQ%otKeZ&3FsxXaB#TuI=&yWN zLNaw-3o2B>sowXD1^6@Ng-*MeQ%(JQkmrQG!$&yL?b$DaI?zUr0QWF-17l9IfkTKO zvts5ry%MQ(E24K{hlfuDV0sa!1&Y$vjMLm`n2V46q;bYiT1;i-`YdwvGx}l}ig*n;6X%Dm zh5DWL_OoJEu$}O;0`Buck_-8r;NP4`nu|y;)q=jKV~~ul*OKH89q9&Vy`bq37tdp! zoN*tq%U73t0*XGDV&%DQ4B9`xuVQRaj^jQ9?!wDS_NXz_1T1t-t3O1q{C4mn>*=<1 zYuUmPO8aM12qeTmK*=K(On9k`iy8#i=|WD8jd`UkzFlR;xjKPmDkkrwQZCaNe@L%0 z%~K0Vd8oIOF`RPl&)mK=jSQjCI9|O;d#qpS--->(XgiVi{CRoLZsasDRRSPYfHWP{ z)#*_3Rm!vASzF3H)GELa54jXR?GA}v8xoJho-}H(@SLSzNTUK}WFShh`^h0%;umAx zT~2Z-Zp-B}@$&Vxgy#pV@YMpQiIL&BjN`R#PY`B>eCubtpZ}Uq7Q7l=hh>Gk*J}v7 zd10ju)HXf_nfhhsB8X9GXr<|3g{HvM*{-903Akx4mvPzm%Xa^1S5PqLD$1)vWEi+8 zy&B(A+9nwy@A24sR=EE}{IUt$cEZpUZ@edo`I4iz6j6HRgs$kTL^(9%Ux~8K5Ix$j zS(GU)8bGj885I?UKrv<4ele5jJ0BV|m@4@+I7_PA2Go768kIrm6?I=U$_!p#EUQ<@j+1AfkfYVs^{S>FILb)TULU#mxI{=o zhYyFq%yq%*64q-~TEjX6WBuqpudnpa1-8Y)?72(ToBTvZ1#|3l+9}c5dpLmA!aU5! zWJ9BK5{;mE{hZjwITUfg=xdmtGFaU8V#KWu(BXtcfR??{B?!xa$6ER2y?fz>tP zu_EPBb_r2Y(Y~G@C2E4_L5_X*)}}OU1esD_Gq&Z}J#!;`kr~f~s6NKL;j2liZ9#COeWgNFd|j!vvCN!k{-pZJz$1pT zeY=IJ1p#3;?1Cl&c8X|hQv(7{lXjv}kCDflPZe4u^ozPyo0g?#L}VTc%y&?%NNzpf z5a-c>TBnnj^P}O0;-Bzji&ZMY#5<$K8eXJ7zSpx7SJ6X3RAnn>KEL3`nx8*z#dTp| zU>1#s0^jGX^_xAF;%1e#tDXpN2T=NOA*23saRbz`%>S}z!aJy6;Yhyxhw|LN7E8fPcV0-eY_CZw)I?q=w6QV*n(-fP7%*+@bXM-Wz-YgNz!Xv zI(Iu2T|HcxBy5u(LjZ34EW5Rm_vZwMw{m7#cRccf9oR2u74_Ac!h@{sXs(>IezZtA zwLJIl0XC8)>QTO0i;N_sD$gz3&QxcMUMDAz4|4)f1;5DCQ+MCDqSzi!WWa-`NU&;9 zF9g61y*ODyQhL@|D4ciHzXj*$bEa2EY%8J8O&u(4GLsFL+t>k zq;mA+YyjTh@nr3acLH=C3MB98B$qi_{8D@ss+e=a45OC{dNDfzgm9kjSkc}=Z(iEr z%N}Z7xswuqge-r1*yF9ardNLHhx?h&d{he#FU;qOa9Okpw(=aMwPWcK-=m+srZ%gz zR_yz8S9L}^=U4+)3#?E)-*B$bNbH7I=Dnr8Fsu!`8~#xOcz96S9mpHD%#s&-<*{>O zxFRi_h^X^T&Ngpz&3+xDys6$>xzi%lsLkfS5&<9JeO&wP7`x`sa8e^7 z51y{qEfPH>Jl_Ie_M4r?|7Ar5WY`44=Qho3!8aa#IP&1AuJmx%>Uq4e6%Bp5#9;(2 zs<+i9cTD#KpN-M_ZI#@NIx0hRVgJde7jw3k`>{adjp3NA)93)@$fi!nLsY;eomjn)DGDt9NT!Vd&pR$&+!l&aL2Z^ zgvR5_^Z5;KqM1rD{3giOz5v~h04`SCV^TjqOmx_*VAtK+CdRNFXHDVY{uHXZTiz72 ztIyQ;X|Ufjo!Vbl7%!^O-rGP-;%{0gg5BR^jX!7*bcSz8>OqJ=nUyEnMkbJz?U7^G z5nt1)CO^;f3XUA@^Egr(>JY{P21o45b+2q1LyI98CFGG=TcI~lBqa57JXdP?hJD3k z-QJs%&7%xV#xegdW98{WXNO(27Q;PNzlWCnhC(Me1I=q~@RIN;A53+s@g~l^ZIfAc5GwWeiSi%9#N8s+ z#gcEVtB*|zmHK*wpVhm6>sMF5Ekp%rZdJV)W1b{$q}K%4e5$Kp*WTi^=uBDfC_1B1 z%YN0)gs=6Ew6_KF^P*yAVy2)Kva{X_T5&(tEiNNw9m}xTwWsqhyMC4=`4psVGt7AxV z)VsV}_M`k0u8gLR15gB_>S2%UNw)@S(^pY_VKffeUACGq-RfGxq}DKKA14V<`e&ZP z9e^z;eO7i|NJUMB);cK~?`0^**4}*Wb7}8v>k-m9)4UkUl5=Z)aX3Q4qP1Q_kWNvG zIdG<-q>{z3a8@X~=9L{==}M)}+Sl~8>~Hn_t40%k?_@VlyYPWNtflP`$r%`eJzzih zwS`q(3G{W56o}#8A0c-#2$JHjC>`~~J?JAWR2+fL@>WkaM*gadA zBm`hU6_& z`-u)w#PxC$5`(oQgX%xu^x1j6x+hQG3(-bjh$Uxu)s!n`w$A7GDQ-SjvS!=WZgTT} z8FpIR2PvBMt&r1+PRG=Xw`+4ON(^toW;Y#6QB zC%I=Mj||%Q8Zd9q4T5uKiREL9{Q^@de(C)iIa-)+wGz<6!67VFP;2ZJ>5V+BcR<%l z_TC(c?qeyc^3Oqny*brA;~Z>;8gaxY_#1rn{f(xKF4Z`Ckzl=G&in2V&&plN6Mw7n zfxV!o;Bp5<9>csI@Aw4LA@w=V;%}$lsoTD5nm1c3zAY;>Y!ed;Enz<)ulenOs|Rq< zQ!nmj8Hk9D-(9#l`l9__V$M9IW{NFKghs#5uuWGy+biyrWbNnfl0|ZH?C1ijnj4^R z(T`}zIpcvc==YoqoS?HZylSl+7CLc|B-^xJ{@fEM&hcr-C{p%~;e?j**W&dvM2|-b zJ1r)32wIl16!)YMr5r9{M02%!K>em(=kS~M;?5PP0OTe4TamSgMdT)sZ0ljFaZ{CMvT{vQ)3<`#v7`-ns6W+)_1E)8p1D@Ek5u5+aZVA(YthJOWSBmzm5!Eg0V}XsVa|ej! z8d`zGnf*TY?ApT^w&leDcG}OD+%IZg-Zp(LB*Uxw6x-xw8v;3W6uhXYGQCQ;d7JJN z43d5#dgpBS&@#i8U>fnZ)n`t^6|%;!7WhdP<%gMy!m(uWYCNx>+U)im9sY=$B@;Kq{qf*Vzjqa?<54dwD^;vBjrSn6_S~gTMzWnrt4y=2_ zZdR1rW1#F&k$$PNanTQoRyexD>k_x`4di-$eeS#9=&1VCW&YRrqu6%X@h4{H_OPH= z8^ZF_g#xAfHdzoiPQHZC|I~PA`&6Fz*y28;z@P$y;y3s+0=&o8l|h~i+%0s3Jc{X* zR*RY@evtT0XzVP-@BwmvS-sY-tBW$N}UF~6KS1S-9F+(6rr+0UNg*^ zCQF$qwlX>s)+;BwVitRsHMYpLMa$=h;!??~qQc&@%x?$Hbk$IKNlD4c-=$xu0Ih;G zJ0PgFr!h1@Zp1PP{M7v9Nr<+T?WJATrXnt8nfEub(}grroP#B-Km?zd30lTK?=diJ zSQuO}g1nr#_(9W}cYH4pa=0m8m@-RqXPQ*?5uL<|y{G-iM?@b0_TEKe5?O7>({i(y zvNulnbExoU=Ri}Xi`e+@10z!Z4SCPQDC5Iw?cd@j)tJEI*Z^}!B!h7)sj&Sft<|@< z`gNuTb~Hbd!7xF8gD&kG>pkMw*qYO-(TUB@vW1Bby>{dD8M}mZXTO1pwYK^EAzl9^ z={Yc*AXmcs1-W0#E1uRA*Eup=XW!DqtJ?}??r2h)C}t0Zgi0N) zB`L~k9?C9@6=P45JD zys%X=!0iuY!Hc)6HFUO{=hzw9lW>I+J~I&0lKF{R_dx;sA5ttoq5=B5}bRf7Evrn%ITE_RsqrHtU^QSsEoa$}}&pYUWb zUozj`LE{_Nxi!uG(ebBrcNs_C0l(v@E$CiQXhWjBThmP0OP*7$*rn)$4a86t{>w*^ zL(0%zYhyQ=Vlfgh1SO?r*#PK{Ki*=+RiE%Rt|v@BcF}+3m~=%15fo+opt!s7)!$U$ z&g@+ITP;_8oVTxOtQqBY@MNpI#8iUNoy>U4IRRuh{?vNcGvwWOPETaFWDq+Z=pWUf z@B{S*{VvouLBd$i_*{$&&fJf?@T=U4xS>fX+2k9@M2BJ zKTa`K9sW}0Vmm_cobh)&F-9WNG;xyAi+l=;d9r1u9-6}9HRXjq??k+!5(sfI>iIQF zMj<8s{w{dEO}OVW1!MVT;rdB#1@KdLX=6%|JcPCO(>%=IH5;52hL-+Zfib34BEOeD zSsRc#bIPo9eGw^nxClwY$ZlYKNN z=Elqu)^1B8=8`N-IiQkJq7o-x+93LEPCj!UzA-7_=9&L>1~Aa84%YS?DgzYIz@@v}fT&dD8JSU;;; zL!v$lVS`VhGdw0ywLAy8vomC<XxA=FTMm1eeI56J^?=)VSd(Qhm!iHab z>aKvTRY&2&R;p+3F^q|FRYfl-q6)f;u%tV_PN%h>G1M3$I}3S zTo4kMVIq>%@%(X|j|+{OWk zw=Tq2*HbXv@`ypO6uR+7P|rosCxNy$bHX)Otj_U$oQPYJz$tK9)&2bLx5>_>#v~`t zi(I71W5ADeSs6hp?NX!!y)JQCaO#xVXMI3WfpK0EnxJvX&%Gq4La9~n^y@A@grQIj zFcHH6+hn8BAMT;ND^OMiXQsTNf5mGAFSZF%33G+}=uf9$l^|WM|`)zSoUB zh9wO?nHQ&4-`9fK`-C+=G0M^03arzdmt*oSQzW{q5W*yhymU6trp?{!m1LNBdIhdP zaqPf<7hFk{Z77n!b5Jba@lAEG3wvSfZln+eQ;33-l;JA<2qdPN3m&bk(B^98gKdb* zJVI1)alx0bCE3~8_R|_-8}$03Cwst64VzUp3gfYZI=X~J$VX(9wpLcs8ulC zcmkU3(5jfD7|4M%DVbnKZj>ui+)-_DbSW}0wHNMdRcTd}aGTA$Dl+d2v4}H>McZea z9Z4L;(83sT?8u&Oa+$Sh2|SmP=}x-QJO{&clidL-yQwtvxcMow;mI=B9+Q*CphE7R zhXO(Gv(71-O*Qg6$XowTIaKte+FU5%81x)(uN?sCopeg_(iO9MVo9x{k2i)(4^xsC zHDuh9X>)~x+rnR5G1O^;)a*&O{?WvwolvuXQ~Ha$UHkU`AplL*fKx|pF<-6BYrJHm z^?+D)+Z)`e{ZdzDl-I8DKM2BpyA!FI#%~iZb+$kUhwFo_l79eMmHUI;3_f#tjUKBrm48}$oBnNcEHfyeBp3AHKW+kTn849| zc^qVIHjk|gId^EmiMVuVj9UDGI4#zp%OA}4t7me0x*eV@4GqnN?3fyF689haV4%0R zy6@p=3%@2Co=stbzVAw>qYBeWk7D^dE2%$B`n9pBXc2! z%p(2IxTJsk+P^EXyqTI5+Rm1FFxyQ#2GXdI%b>cFKch0E<@K5TkJ2{&>}u>3c@s|C zHXn?2;v~n3)q>?8{_Tf=`QhkbD}35U7`tuF#8~!R)Al1iKE8l}fF(o7K>-uO*as>9 z7ZCp{@FxD<^YA>MdB1M|ob+_|`dKH25;_F})d&2>0yiIdtW95uWEO01{Rty&FfQ9FFqhBGGmEVduXZl z2OY+_SkzdmF!pfZmE=yxlvIA9?9Mobc9X`{ewg zJpOg>%9;Kv9)%5$RPN6Mt#6+m;~w^BZm#`btz`S_TL04;yZ?OUOgnD|@#s~3J&j(% z;i$l7&ig?%xQv9tZ*=k1`%A-}cr`&vYr}549rsl5q(Bch;;tpTPxP#>L~&8;jfw$} z{$%q@g8Ip26IhUqI)pPYW1cHO-5BxRKFugxxy;iPgsZm89eA;O$uf8lfHSI+Pb#-@ zP4LRn5*st~OOKU->YQP3DsH2y;9|IoY~GV%EjIGIb!Bg`*CXF;QaOi~cVvsz6ui(s z-0yuz4!?_2P0|i7vm=IVIG2mqTnehfZaZMK9V$EioYlDe=l-8Lt-YP6zK69wox1lk zLm05XxoBuLf9B^t-JQll=?ko>RXBnsDxT z>S4FA^Tgip&>~LP8JkT8>junkgnYU34A>5Q!{EiqF(tQ53!e)I+N+`Ydfswzg1E*9QqZ9G=6Hi`Bhwj z*2>lIV?}}7rx*5K#zG|lUS)R5)q#gzj#%ra8>uYKW8-{t2FD3O!R9dZ+J$aYF(YXAcNPGshFDR*8)@B5ScD<&DYRd z5#U6(9F9NN`YiK(2qnJdT8`rrqR_C4Ic~*$bL3d)-I*1oX}wh;XycJtg)#T2_w*bC zoXCOhyRoiU>aMEFf{MpMP#3dKTfCm%OdH*X*5o!plN2FNmDMtH^X5bw3G-IX^s#67 z=!)#cO)yGIGeqZnXB(F(Re3H+;Mq%AwAp5Yhu^;%=^~hP(K=r+Au`xDk3nbXXfg+`KTndT-%HcBsvdpWz@WSxCf0SJ>r(Eam7HRs{D#J{j z)T2fh>YWE0;^%cu#!pP=*7#669D9UVb;k3RmczWxwQu+&E?RkR*%*ax*s2k#^y|Yp zCO&9^J^~#_d?dGQo-q*AysX=4T@Y9=Tsp{x9a(PZqo>tgGXl-{080;c31HcopY!9e zXmq(CG$c^cV6p`|x7L%n`kw6|FfyheT>+>4GN~W)FZr7`gj1|VB(JJ*-_*RC!y5+T zX5RM?5F0;$5pm4Vea<0YO)JOM)d-P0t9yMgZF$s0uR0+K(|4+M4ZuF}eiW$Ner^b> zfOT`H+BP{}@f5Q(F30)sjkq0Mn-M60-}V6gJ%ku!N*}^jdQ%~jv(n|$<$=<i z=;S~E#P&UDEh(E@vq?jJh+CZ1YiQHGNO9ueh5{!Icc%Zu8CoB3m~95w%=Q#ObCvsL z;X%X?HhPcO-o!2>sCi9iS5oAD@^LFztY%CI7#CZAfOlCVOTl#r)$`b2 z3aEMQwIWFk>S9Rd&=;!tkgm_DT3JZD_&gfhu&Ikl#nm$L^$!+pT0I5NjZ$;fBfY@> zKT0G@S_jm;ksbuaJ&~suaGm9*II+Hgl=`Vw?}9UBrs~(Iz^IvAd!6o41K=hJ2cNLC z4j@ka^>Vfg3aS2r2;eg%^UF4oe-K>iO6dbK@kmCP40t5Q45Y3R}f*0yMURvN+Ym};IJIZA-O21WnpZPz36_R5V1={@5M1Tgil5g}j)lpl8wR zbyz(<;Tq0q?c1^|NikE~7Q$w8+ZHZfrEiS2JTu<8l)%v+J)Ps!nq8EeVz<*@d;35( z9Xfr{JY{oCBzmm46N! zj+WFvRV_0fSVI{9v{Ie8NfaKug9JjJMM9K*_xKQmxyh) ztQ?9&V|~)bx?^`L?dIC9@8&wVQV4@RAUk55yCafv&p^!1BiCjy!csX$`--j<}?HX>wY}>4K-M3|n9V@}Dz#>~8 z&iwfBA#H)#Mk<7(*Utg9^(%?h!~1-LAZfr0Rn)6${GN}mB@>_BhwHpFCrU%pOJXda z-T&xDk!(uKkdMJLiN}{!xSQmNef^{E6XrLW0Xl-O(p05|Q3Z^Bf3OijaffD)1DMQq zpU>2N_{82CKYJ6s?!wCX!~Q~xx=u^vuBt4-VZIufrxrioGv-`ncu|b_|Pv~ z2!lwVdbegdP^+fea^q&6U1vcb53b;@>-o%Vyj**QM$U<;5ohJO=g)zY@h$OW^m%N3 z{Cd^-PINQSzb+8h1-_Zuow983#Hgb{U&zzcJSRZf;Y=?=EP z%SrFnU;C|Kv+=3_=7P45TRjHVtK`R&${Zu{E0MLkw7WYMMC&9lR5)uHog$raJY!5q z)gK-3Wz%DnUF2@V4igP*^vF8UN79-07mhAs6f|&bp0iR2sEvQT;maj|ElsIGS6alG z2|Ho8TneY{f4W1!DnPg<=Tbx63Bie>f(H2wRy4WP^wpTJ2&vBM6GGV3iSWK8x@~gV zUz%Aei_19o%`Kn;R7YyP_D_}C)mf5~=E&>WuW(1QK_RnGSoO4e*GEf{SsxFw>=_l% z$}}>i$Mz#YmSLiYxIQM>W^?AT8>0#Itf9($@KsiBH~uw^88c-D1ZFz`>z=>30j8L0AIq+9qJdun#DQ)RH!yEzs*l-dM2LCPer9*e4^=?@j82 zpJ3*T7`-PS7u80m>q6qaPMU|r&^M7xqc1v6;{uv#;^V%>obBIY26w@KTbyilZVqsY z<*uFWf;d-1(o4TaYAjCuTI$O_D7FcWnkx(cE|N2+y(2KRxH%#`s?MNpYu$0}xqHzxv7>7hiUx3wO3G_P%n(d?R`Z>V( z^vhtmkxnzL1aTz1J#Q zqciYRS@rIa%1A+;+ABP5Ji-D8xvFo?5&|27 zGieP5xPC9z?+II4_wT<4SbdL;YB2wlixK8mT@jbql0R@hbN0gZ=&RG!l8+;LXB~_y zL1*!05>G^`~RYRBumh3c%A8%VhE==qiYZG!M5TSv4bN1X=anzYvE)x5SLT1EVQw$3R=T5~%1 z|AoEx4r`+O+kF)uMM2$H^W|mNfzD zaolScOm%vs47iXGN2N-sx+e6@I)tLzNi)T2_VWIf_Au!@O}(+(k0l(l8}=N6!9h>f zz&<|+6&U&R=1G!iYhM=>zAF*-P7+xB9@1aU!=oK=$cjJ@z<^6BcDWXf7v6 z#;R15o7mB&IC+7kgY>ulxdpKbyo=Ih%{q z;Oy-*4C_KzseSBC(2rtSOuz8`?)oNWIa70NwBize8qrB~h*~+C;OeSYl1dTLd{5mT{^~H0#KD9e8 zl3SB5W+1m0$Red3PTRImkN7B*5!RQoj5c!@Yu8T-wtoVg6DM8z-)0Z0HDF9%=x!;l z*EW8GaiTBIRXv`+dcyqMrZT}mY2fBRMx9|Er%Fq`H#ShmZvRd76_kwPjaT{+_1(`SvDGf>H7+`>N}-+`H^I-ew_F7>L;%-7YAAi;K&*=nc4Sfd{UPde z*nHm2B4gOC(IfRrN*#u259Zq0!ovZ-1#V>dIJ4k=e^5Je<>z{^oPv;l_3Q zi*-KI9pKhuY+}7~rt0N*@Z}s{g%ZoCvb>EybpUoo&5epImFsGst;>(KHjfC{6EmJroQMOITl>n}dmDIOIZR~XR3tMeW75OsxN`En_HwAw=3 zQIpI_eTHIT+UMT&Z?ap-3+&OV^A!-fOlKVx-GVbaFEVMx{3E-RmWnDJ(+j7fDxnN& zz~XCMi#i5(*z5WJM6x%Wb&6X*Mv0hqF3Hr!PGv2hb{S1s9@D~CBn4%Y-~qQ2cB^Oz`K}PMeicOF=@6RlPSiVL0g?A>}t1Ozlm=Bg%Coi zJEa~{4yWY)q`JqgdO7IDjnsjjLYOoT2SsXQJf!iuE52uc3Z^}31Rz1jG^XVqS)r#w zy*oywRkVB;Y@PDL1-NzM8hxNmJyt0!z@-qIJ=oZujN5lP(7sEAQ>fzmj=7w`V%y;= zz;uk-s?4>2KwF6}vYL#Gts$*Sdlwo+145Phdhr7D#VwG1b-!~P; z<7;5(bW z3r}tThOc_5m%yahq~Vq20{m~*L=>wuqcQN&hGN`X_e#9zp56ZIQ)rj^mCuA_B{|G1 z(0nz2&oEcpHLAc+#;&m3&W?QNWmhFC9w1pw=igU~DWf}y682=s2wOrpzGUoP#5_O!#!qmZy8BSi?H@b+|}n(*U@a4htt)A$xpEcUFc|7+rVS39vxZoXKjZ*B#cYzeDreXctFkj&|4H<>4A^CUPF zG9Zc)+n_cCEudx9eX2R*-`>2J%IpSgy)i=gz2EAX+|oQ33poJRG5J{9Eey!LMm$QS zZrbhBJcy>Bx_1xP>m2{*bzhgTmW;Qh=s2@VTxqu-xA*noH_I-O1l4X2XtVG0opbiTGHv+=OjHAAEj4ylA5OW)bB8!h@m_yD*Zoau708Q)_6uPeEd)wK%X zxe&6ZyF7Wu(mi7DoQkwy=ka_tc-Q)Ppbm&yp$|oZ&)=H}9e9RAmIoPqzg?+oYC+1k zxfM?iK2%N;%4^2RXTD9kZdkUBRj9>C;7CZ$azB#q5-p4;g66E0_x!W5djQsjeg@Hk0VSjX#32j2-f4NZ4CBqk6G2~oA7 z1*rBxGlaq0z2xt1`N-ORa2&+$($;GTLw61ybeM$WXs~_HEy{oZ!lYd zcS{PfYo#VFTc2W}v1@W-VsRI?2pQGh=ni~6P8;|2GD_5SbIp_n zu6JkJV=egz*YSWR`MN&EDD{HpdTh5TJ#fOn2#){K05J*>XX=UPmZrb>9fUT={qr@$ z=UkX0GkSWU09s)l5Uid*xLW5n4CKNbn9b1va?G<2&%dk!$erzh=~`#B=GESQ${XQS zL&R`@`@y_Xp@nz>T{2uK^vThK&^Yx&OhU*f9_GkEEp zMp*+-<1#<@1ZfekDwWG8{gDsj=z8YcJp}w;_oM=w$(v>Uoj&k1eq}yDV)xe{|4ba+ z;*G~^5ijn_;0K7S_1yWC^dvED{p!#A$+r9#y`n%A%>;|4V~by=9`*q?0?$jm9Bd2za*0WZ`j#?Z5R8es^+~R zR?^9TW|VoByd+hRsLSSeV0!4 z=)R5GX#pNN*>s)s0*vl6x*y*x@m-?-XE)sbN58v%GYF6w zGya8ayo>oP6P&uYaAgp(*?bUZ7nkBv&UrP=hDnCo<3#wDYGa}-cV-p3;GGPXF#bOS z;u<$0U{-J{_ka9PFCN1G=P-*iA^9e1_ioRGY#1}FRk+DkHrm;9Qivn$%zW$n|~GKx{Z zU!#%7;~ec>d@PIxvl*3VvZb1Kj3E`M`7~lWksL7#<$JYJ=v}Lox=>_IQ)b~Eq;idD z8cc#?eRQ^*KraloX$mco zQgC2n07rM2xHWF7wXYIc37S7Ni?QgJ0|8~L*Tw<(*OiI8w9YV6n$g2gB`V(fM>Qd5ooQ z6Ws*=oPJr*px`4^!TC0X82oQH&W$6e3haD^xwM;Uf|j#xKOaYn<@x)EY(<^nr&$xc zofOL|JfU(4yD}L1cm7~1M#E(dN@QTIDjhx?!Aq6A>nx0#03;RbuF-jV2*({Fl8(zz zadLZrx=0WpuZbDK$R?t?L-(wRteT!hH$zY*eZ#K{Y?`r%y=ryn0ZZ@T-%c;Gs*22L zE1>PbH|`MydXDHDz!s70L{F!ByX(jFXw+)}LS*qlSOC$jO=n`hyr#Tn+aL*2gW}oY zpDdNky5$NA$-<6nTwT8_3~W~`Z5p(!9ag$@EZUhQXaxs_evJky=Chn#-s)7V^LBXz z;Bo<<(2__Os1Yt9>%Aaq@v-> z>Syksk$np4a)W}NLj^k)k4%Cg2C1y-t^1Mrn@^kGRNC(5y908lG$cF&{qjgyFa@|| zD(j~Nf&Lc}VjU*lzT(0FY%*a`pPw(U9VQA)9fnn%C#3$6q^MU`tEkcS%Ww<> z{ppuOZrYYPH;u7M{J;3s+N9}+jKj^=r7!gLeCB+11?5d2@sJ7TP+sgRY@S>(DEdQl zH5k_Fr8RwyY{6KAd$p@xho{9pS_W9`eQa)!Xb#B*I=9Xctj~bLTqwEh`05ua31m6} zL@J#Ui}p!sBj+Bx6n3=E(Ex5jiNVLbL6^4iI)g@3s_PSkf|fJLE4aj1 zd*OH{dnzAnv(STV=k9(|iL$S>uy>I?I61Eeu#*=V^0Zmcs)J@gcg3EOs!HeR- zS;#r!eAZkfz2~@pv#If}aYnMs zDIU%TkqnHcd|#a}7p`O9Oq++0qt0S3P+)F{j^Q?2-!!Fjj=}NXBkJ=bGtff;N+PKq zuG1#ZA`S!S4^X3d)TKSs=8a5SokI)tH|z8VIT*sF2F*x&-~6dkb_@tnI%}86ZpwkF zZ#c&{7^8o!ViFaqQsule1h>~8FfA9Z_tioaBXX5|e+jhb(a`5JU@v_##`Q&v>lc5t zALE~OX=Z>AbUfQFIATM+=*Cv)slbqN^TQVZ%wx@v%j#vnCefi>-)6ywFUi#ReTxRt z_wO`F{|ob(e@eA_yzce2QTkt$%K+2Mjr!WU&E)Uwcd6GJsfR?*Isect+b=_an<*y) z4%uvD4x*_5_9TnZFNYA|jymNn( z6}1x$HCJRnzK7k=h?I5W2y`e>P_lJH@n|M$ljO5r{4gGF$Z#Uu965hLk zaqga{kAK&(^d{rvA@f7kc7B!-m!W#2Y8CvT5Wz30`egjPol$C8b%E5U+vTZ3vs|## z?mk{jMLAs27$2h7eUR1CGPFe8Rqr?tQ%)okWIVI`yOnPWLm7^ zN}>}~^%5KvpQ`{*1!>K$H+{uHg$!)VHeV=#f^^jHYli1ILOE^-M#aANN}5wtdnwIgp9D=Z!hx zY~=%okn73rOvpQ~QUd-nG2%vS!WSMfFAPxxeWSPxJY?4lYd(6_GH=HXM zVwabH1&&Nm<&ib}%3S^Y_WQfQVv=@}>%yfYib-5EHT#OEl;R>b`Ft=l)M(nNU5fi~!$|ihjCbb~{7YZT zR&dzJ52bLAB{}v&hZeT}`{8A4I3Sr?WgxuhQc-H}h~KaK-dnoej>yPo#e)<-B*j%C zv39I4hU>^SooeayintgHv74l>Vtl25(aw4#b#k?fP6;cl8m0+Fi?I!PSdExZqbrX4 z{866WB6KXdl0_V}s+$+W1=_Al47g>4j~jru@=9BU;ypetyB}@K3J+{oWlNez3fJb> z71-6%mywW$J#$M;qrd7*6MWinWP$nH8&D z^Q3J%fIvyLx};YzAR_xzXM1ApfN3->Ont3Z$T({%`TU~icoN_EAlbR8#AXI^SnsKH zoa24Bi|O*?#jCo)9{1VL+Hn~~=5S{;!_vN5m|5+07=A_l0DI!noZ6$Rfl@ZRgHY>U ztI)21p33iIXu$HS0d7#wuP;63A{#UGRrcF<ECRHudP$LzNTM zNAX-NYC^L(I5!i1s*pGDH?m+AIM|lF0FhXezWKG22z5?nzF<-P%)^+i8Et3qxb&asUyRb8%0GMxsn(mn_ zXSWGzx?0s*Ly`o)PLYYn>flSQS}ZNuituy$3?`Y#AH|!aqP;m6_1W&&!>UC zXjdt?%Z9EJ+_GJpU-KnE>`)XV=24M6?1h#d5eeS1+$}tVJU+`Kc2;AVD)Y|GuFVG0rQ3~ zj3}IDysRm=sa+1#fY4WvJ|}3~c^4y&`Z=^bR3H9oF5n}(qEWdp_Xy$vVTb3aMq&+7 zt7t+II8}Z(bwPEOek{LdX+-utWYy02kQ}MJrS@xyMjZ~9xNyD^Je?I`1~ku47qLIi zK{HfTX@2ChogE5E5{}B&oM0_+#)D77*@cF^T{1WMzEaWln5+m1eD_pHy%P}h0Kv)T zAvFd?c^pbk->w9_>PQAFiYQC)kBtvEE^b99`pH2ek-cp5##86gz#EIYvhMR#?r6?z zGPFGx@Gxu7p}uftYi04Wx;=bub>@3KTR($HG`Uc-m)&&zR>VEM>ZID+M;8o8wFR}= z3EDfwM_N;>TcBr!o@BHV7Fwx(;W7WTCR1;Y*^MXNhG(MvfQ-Y58*a6 zSL}a5+BB=@GkTE)(_1Onu8(++Q-9-9{;mE-;nZJ3KjkPEgYI!jxL3qBsi1X^c=O|A zRM}b-S+T~iiF-HHo-J)he72o?P$H2xa_g2Snjy0}$vv&}?)Re4r86aGE-REr3#>mj z^=ykZ$w#2YZ>{;xk;hxDmBL@g^MVgh^V=V3~jT=NAt@ja?hn-JN5Ve*rf0= z$H(czlT`Lvp-3ST%e5m_a<*G8p3et+VG=EBEwHYxh&U*^);77OtjfyTzyax>!JX0FSL9wA{unN@#qem1MnT zv)rNL?X)KdQ1jdLh*2%jBOhxI=!!x`o;x5S_ff00MxS*xGfCyW?b|$mN}13gg5zz* zD{ZKlzKxh>y69c!hCx*IMN>VymP;nv&`UQ-Ubw0HH}!lUJdHU6qe3_3EU!qIIoOZEdDqvc7mGo9vI=OfnXHM$mHc>L{gkf znKE6vL5>{X_0Bm;eSJ!Cr`{$A6iD8fd7fB%`&c0cyYBR=R5|Z3&9iNLh_@^4++aW7 z0WtVtPPZuRPILLjBRfRFJkw#yt87x&FOe=@#|y_&sJRtcDkQ9$CHTx9x9L?f(*I4?aptd^cP6F@+yM@;XP?fNR*^t93X zvB0tYxin3l1ChqgcrAqgp-O7wo6-I@5>iy+@)&yjiO+#TvHtq)=fpDq7M*zy$x5$R zj*mjSwal3mPYzcjFkJ`vd%K-d;(_?%`CUx)7dMdFbJ>29V1d_w`Eglv?+IyIL757U4o8(L`tH*18=+lfnZ`0Dx0~lf&w3AmP5`Lr9brNT!1cEtkm_Kpycpa(D zGm{+2GCoSjTgWoPmkU#J-4KJ+23J>2sdYPn&bGp=b-P(~-cBX&M39NhrVT9;j8?k> zSpU?yykSoeS!_YWRLV}YS^*+)DL06E?lf2xBXTyPg3StUq;TtR16S?L<}`tc2qxy< z8nlw$p}c!Fgt!3zDcKE1p%K>-G?M<;)5~vI^}7D`@9lw>4`K>O_jJDB(E?ohYpLUT z9e3WbgOe(%pY|W*Sx7^VU~Uw3$qQWj>Zj9>K}97&R(FY*4X>K> z$jX}V;HRljM7&N~f#@976bftRAY7sT%r)=tJK+2c>s9cU#-qV6$uf>izO5Y<&(%7O zXUQ1q%hZ35%)VDP+jdwH{gL*%r_4gwsN#m#`){7$U9;t!6fWNF-)%5a?>dQIc!4px z3>%%+)MhWN#E0s*pw-?O>FsB4vuzgD-i~!GFm+DZ)%ltlAvF#goRE#8`M-{B>-2%M@Q|v@BEo zrks;BURJ5;LZ|B3jnuN-#J3}kuScl`#{2aq@)R@em^D|rx#wzK|0vIeD%~oL+C|BC zg|E1ayHmfzox@*m>bPWOOJ(0=IF5}rPAYzaY-2%0YU>G>+7vS%yFnoap z{oHyHY1pbNTxFEKM^Uq7pj-R~45EboIy+IV zJWyxu_k=KK3A!ow-Xyo;CqeL{Y*(=@Pdq@+~0*W4l=H_MyR=Y&6d z83`;A`wfg0;gdZqGvHi?S&q!I>6^~ACEJTM$lYnF{e94p4b&=T($@J!THuTxb%+SA6+deEDO*s; zP~3i%W6imI82#XqpV?_U13&@JS9Li+^I$63ed}prk;Exx)Htxt$4P(Oiqng~o#eX> zI}pmJN9p>F0#-ay0C3{w&DBh;)dv~B#;4Tb4FjIN)j7JAY~fwU+e` zX#*DJw`(nqY7+)DUcN?ZCN;C`Y%F&fDel)ev-V+o~P|;cS)Eh zW(tuLuYl0WVo&7Ea{P8}RY{RbUi7&X>QmyiECu z1jyjK=(R=uu7MCkb&;c9lRnMpAMwSE4a@Q^!Fij@lOvn@dc*}#unTP>`XB){F&`y; zN^MZ_dh5&*bvLiyGG^S$T};owxlc2V$Sd+vi1T6}po{nIFXAW-FaBK{!u zUSw5{a%Hh@g+aaWbhk#gHNAA57kOE@G=TGWcTXf3SI=9RUl-(?vh=3KSNklukcOf33A1hH70KT!(>hsQMyVNb*vuOL>lVK15v_Z* zX9mG|yQ4+l3Xl8QWilAdnc}Mgyg5)#g89*d;}U7`l-zQq+Xuo_JB?G#1k&-9Z1z!~ zN*Q5SiyzTzYLj7Y6R-9{xxNI1R4LEhgGk&5im^fJAr-NO(z5CxbA7pr*TV6G`!-WU zS+nap_k)ux!-T@+CcBgNw^Xihiy3|iwO*R&HY@P6yMa##w&w~^46Z+c6)t=IM+tai(FBuV-=##d9Wi?QpqP1|J;EHFi|y}*$D}TUY-L! zNM^o^HiGxfC|f2?4>{Bfp4Tx*CpG@?on-|pszAN0$9j|n*P}OpS>hIa7RVT4`;_ib zOuX$TwN|5k&~ZaX>YgMSRhQaIYIT8KveId|J4jtWHzxS}=?;BFbw&?y0+6x7xFA5% zJ>RKGj<_Eyt0C__D|4qZ-!m2g*H(-`5xYTGHWSq=Sm$bjyibFnBkoyhMLLMV{!M#L ztU(ysCTO(0QRceP$Ihwg3@GjF_{Jw}q5IV_CCj`HnW<+cW=?0mYN;ldE12ro7s+A2@O-q=g{CtmOAk-GgDdi3pkyz(Q0F)>J!A^~QfZ$88APzY7^n4R zVF_Nrdm$npA=_NARMdYoaee5^z@VO0wS?Sw88fZm&{fbKdN0pAM=dC& zZ0f644%>y}+5>ZUG2woxW-7G;z1tE&OS77|ytbNt-zoYX|@lxb7=8d??|EI0=3m%CX3m|z<@0ap2>SHBEZxwiIWIM#Y z13H2$b;Nf2OnpiWg?KDBLmyA!|q3JAm6r>Q_3cwwG)H!$k7*h~7vnO1s26Arzn0-)`TmF#e2PK7k5GSV8Emt@JCc&=I1wn@4%iWFBQfeP~@o zMEmoqbG@AyJq=={pMe!I50o+c?W$WHt12s$h@~m!tLYlJrQJ#>0MetlKc)YKEl%K7 zex++@mn*8Y@J!}4S*6I^rje2sc#A)jSbZWWz2janq{Vsygt4`{wbA0lDa5A=%s#+x z3=Xpa+;b(lnVr>&ERnYepU2j-$ZjotR6GcCsl?!Mv{O{Gdl+Sxp_d$`*n(ecNFs!3 zUELQzla%{EVoh^2q5Mx%TFe6<<<@Pba}jn`AQS7PoMMZrDDQ>mEmhV$t7AY2I*t(6 z0V^6-&MvC=w?Wowf$G&wGo46@^^p!9*kUNNEU2BTmKnJ|vJ3bU!doIE%0++7i5x{y zo5mdYlrLkGlmJJR2f=h5hO$!%HKDd2)^<}oaX<1F&%!MIMCNix&e?KT)SN^)gw=Oi zgg8lASB;hpkcV<@_JOv#X2&m{PGweb<8eDWQ8p&Kei48W%`zDTtFY(jx(x}Kh;K{N ztMRbE6kGzNCJl?H?w!L(aDif@hQQnl2YE#hz-yu((~2`urzuX{N%4G-rf9 z#K{r$cUy8bPiKPs<77yyh;ErWNl$fnJFv3O*j) z|GLSw{Ze2^^|0R_8DuORWdq^FwZ-twt2#Hl$L;F3B(_bTF;BgZIrzXPTi>WRb75C$ z!|}tsDYRj)^0)EP!eNbl_SnR*-7TDsgre(BhHcG1+j;4cYtb9|iyy66`{8%?bK9u~ zw!_Q@h>6uyf6}#QK++mv`?6J&?$)fw*Bddv$r0#^L@&L%b`g1$v7J{y{{z5)_aRKN zI-hS465`3zE|vDe;Uz_y1rWgI*x;41{zz{B`R!6W*omM+C^heazKKazUzT{c&G9?z z`2l(Y<`v;)oc;JXw8B{~7MU#8!84J*Dv?j|nQo*tbuy^UaeQ0yP~c3(*W~GYv=?`$ za{5EJJr!Hrsps4Ty1}9uJ`iR|5a{IVmdO`wFMC!(@l1bFV@y(l#VCY7Ct-*yoz>&N z%315%8YFUFd)9D~?#8GeYGmQGMTA?i$`O8SmvTv4@5l=4|AVN8xJ0amfa4LmRf3oQ_&uP*}fJFZ)6UoG`XRh z8o$t-IzbOp=_gZsf8FQ`g~n}RNW*dyl7c8_D*2N|EG>A7L3tYtL>KSKlh<;Q-=+Q`vKnwq0Z%9FB3Z=rJSn-NkQ_7D}S@5AKLB z)>5{OwG6J%STG!4tacReK<*e9s?5q&j$SD64PdNnv{T_0mRofSZg8oSSUtY`-Y)@sZ&AYMe3jI|AB^79k^CUG=-YqH3a`-g;eQ&|FH%xLf}~%%)ENk-LaveCwUY zUH^#$c>q>9;l}C~AzV2q(46l~8WLPLos9x=0=@V7Mlq!LRt%eTRJINE%vD}GbHDUF zAHVqkcQ$4NG3qylW|rYP^t38Yr2vS$Wm2<}BZo+>!<33@%YN2DV-h9Hr%!tg3RV;i zFw@S06On=gRNmRzBG7UJ7^*KK%;QKx&UhGhE*Auhb!TL?} z4`|6i&qF7#A9Lo*8_unYufX}I7F`0;|M>T2)J_|Ic64L_>NEv%t#%|Q_D1JYREIUk z)UO#fJ^(3rrVXC>72BaZfu0^9Pm)q!yY+4F~dG|bOk!E;w!-wG<#1sH4;2YZ}xK!-&wj*V*=nZ%Wa4xp=Vtyjw}9-Vega zi2LvP_U1MnN+sLDG^7i>a3&1SqI(375hm^x^*l(b@Q1#N{j}jn4KoIw@*eyZ-@#8N zwQCzj=w$9k_>ODPx(hpUk`Y&JY{G8@zfXq5#)wc?2TcHJ@nwB<;rDG+Z8JXq48kX$ z(1hlk+^lGKz=gc^H8o>4N55M{eI*Z2hYG*F9SLwQ-+vsa_Jvx(BjqnWyNh$okt6&( z7Sn2}biY^It8%NQO1wK?;mDeKAZZKlNlBlvbfo7jMPa4}gQ$~_mUez)wiTP_s&H5Ik@cfDC+0EI zk=#y}Z}P`j6Q`-)Yq3;Wv~vjs08GrYX5*&%QOJfP2QG3y}SxE)3K;itp!8m)S zZWH$LXReqo>*^~ICb!c6lsJY>4HMmq2!Ag+{N@~DZaR~6^NV?8`oK%X?{ItV_G4ey zA`Q=^(>LQgdmHvpppwz0QADRs_1mTYp%b3ORakUUxUU%Wa(!5~s{9z?>|5k3NIkIf z+jQwe!{Qi{?Gi-NTkexAR^V)a3)22Es?c~@t_^o8UEC2|;=j!FkJ7I{kC8gHzYn=n_bSL3w$8<~1 zA;Y@Z&Xdyq z7TX){n@(aLH$Id*+lV3L#mZy~iZ?r%*72PC@I*gwOSvq0PjcR-bfA|B3nEvU6Qy1| z&Gj7|pmn36Ja#5JpSzB5Kj}YUB$_LQjRT&=R9By0!k#y3Pxk9CbMWS{I@sYUi3H<% zrgIJiN^m60{(Qp?{EL}V8daz8yup^(_jd~H=;kQKbEl^LD`g@$?er2Vj1M2dRFU3Z zu^gT?2mMGC;B|p`=Zmb2?2dj{e27hqz?_`EtMzF=M=<5SQyP!9?9B631&Y&K?88SK z*8>`cPXm2kn!k6RCEQ#SrO~0QWu7^#2=*DS&H0M-&7lzHR1!T+jO3bgI+PY2MO=DR zirmwYuy&!Lq4SpTy7s2R@@sCqI-6rpq5i)&@hia6 ziQ+P2H=KlPWY{)mL8s$|a9PikUt;AcXHs56`;z~_KfkbhCv^a^4x@*941}EF5tSK= z(fgaD4lUk%Dl^Y1=J<-=YUt;qP%JA7$ZZ=SpaR=n3_UYM>0!#~CbN<&O}mtiMjsI5 zV>fk1y#?ROy+qX>Y?y;KLPa~5k(WQ^MwuaF>_M+HXLh)e5O2iY!+c}S&k135zLA!VS4= z`9i0g-dV%pGTr5(1<&*;6{IS3!X1;pV0l4phyjU?hhv4C2o}%yVQT7gC3QD@{`>J!o;iP zQ%I&bXq;xgl7{>tgKBn%aV>ei?g}G%&eb2yF(#Gz{U|Kjc;wL zA8(TZNS3?a0Q1KgkjgYxSoryVFlvix2)#lIKL0!6wcCg6f~2J96IptW)|y&e&Y-;t z$2lN4tzaTAyarR!m6Ik3l1g@Q+kQxY1tW}e{DTes-X|qBR#TZ@sb`wWKZ9G?`AFp- zAr2&o4W*DDM8!hAy@0}kJ-)A>M==uS1<{({?6)~_uWDB~hQG4D7TQ$f0MClm(9`0` zVhHzdRfH>TI30Y9Ra2z=%HV_xS-~3$V7V-fVA~+k%qywa?@jgr@WYjK7ky@tK?;cD215tcL z{7(eb|Hrkzfh3ZqExL-(Rj__F5@-B)vnG?6)CB})t-3cMlQHs zjl(Zobv4yL(Q)4cfu15+H_Lyub$O?WR8Nl-&_Awz{eKw_cji=)(M3$I$7?VGP*o{x;xjl zzTYReyYq14VY0J}fN#UvG3MgS7o)%Z#U=mwy!`U!@smHFj0Y`gf8YD_QMqfR{NU=+@_dZU5i92U_U=$Bm=COXH_XEa&ZIWQ133 zKNk}?UZlf_g-^GlJfS$tYE!b1Th=&-@2Q++Voz%@Im_=J?ta7G1m2-d?$pzeJ>ox| zYH+a*ycu(_gRHc^M@h*zliBtuzL4LVK;^xWSjUFTVrIBV)8(1LrFGx+#}NWW0wj+5 zi?3TfIPNl1tEojWHzXu?2?X2Rt=ePs@_LmRy~0s_$GZF)jIV27uIQt!Iu#>zWxDue zHFYubl99L}eg3-sceaNng>a(}zKtH*zp-C&{dxUPbK2jZpN$dMc^$*lDXe9%7dw|C z^3R8p^cO2G5;Sl}B>m^_U1|k3&9>t^{>txuQsn-QT4Iaim#V_2Zz5GB$5Qd1eg217fKU0d`Yi8?jP^W z#m?^cTQ4~MYm^S^0t5L2_H4W{Mj!RDUtS-LMxS6BFTL^uzn|239x@j|p}U=osqc0$ zYw)ZP_=g=UF_5DOSJZM-e*Q)WQtfjfyU_Fp7QS9qOXrrBx{JTsFLpDD-&@N?G)ly; zg?UGfX)h=Ye$otE=0lsvwUG5^Nn5`HLN<8nURz9(xp>Z&JOS+^=t# z!tei1K8kJ|9py1V^o#( zH>;VJozw-_JG={iXv4btyZNV0J{xMY%3ps&7Uy7)r%m+pCik6pcUtf@HFX;jw zL1S4@fw7+<9RysSZu;eW)`vX@;L|O!qL#aajgYveJvw5^PJo>!!$mV7 zQN?ek?rlwc&zt<3E&ld^X8`r&;kqS745pUA#pj`qb_hxH9(chFlLz80s_z@i{M;dE z;%`nT8i^4ncRISwUxW3tW#-UiDsvrA=jb{*z}gZLe4`m~R!AA*M+FQYlikls&p((l z_^83^KI=d8ER>*|dxYU8G!1h7IfBQk&zs&YgPDb;r^+q87(r~d;0A@0eRxJMFt{fh zXX{&uABtc0-M5fr`$hD|>hX-73tg{xpP$sh-BVwh75K3z$^NS#l)Yh{@mjg2(dcaSRM7C-FgT$BIHnt(ajuAxX-fQJABTUss&7|tDl zwo)ldJi+>*hd2eAe~t&>3pdTZnfX`)2EVY{6kDMPJx`g7qYWL}5je!OG|mLqvwrZZ zd+wW>?_D#k{iTVt$%m;3dLksSFf552z8dTlbil|Qv#}|{pC>MY;1-lLfoSBX{g51W1Stg(ml76$H^({gQt&!L{A9eK9uSpKkeG;)Y* zdd5gfO|$VFE8)LxTP$vtadMr%a3$0sU{)*4#mLu@Fp1<^@0spM#j%mYJN=`JBkJXx z+o>Lg(#=pdhrgVB@Lj6YR!~;UbfsxtVkvg+k4pL)`~=k-g~s2-k%KFnj$~EXVoMZf za(g*j2<^isltJvQUIFlxKE7`i!hO2mW35ZzHxxWnG6XiuRVuVt-G9#-X61dSiG{CF z>mex>2Kw3UJvqaPf{ysolxiYKW{&(3w0RyX95xdCHqy*Fw+>p6jH8$jwM-%5$|0XN_i$v$zt2j?@&k zIYR~lr4C=lH@-^#i1obQRuq&?U<~zL^r0-0{lZjE%&gX`Q9Wmz5EG^p7vy0d2a%p0 zH-LSzm3+ZSt>RiIRH9e6f@a>nk-XAwm}pm>^1vS(N}$d%#bhJ4?nfGGQ2Y^ePAk!% zbS8wfCmU;GwCP6(jL>cn3VpDI6H0Va9Rv>t`!b*vI_C1~ujb!_+nm4@c4;EVK zXRp8)ISJU=IVtCgQ;nj=bEJN1%PNN5#e4PQa9&v8lM$`{K?Pq&rM_zL08+z$I#g!h zgIB;$bXGd)y{#ZUI{n}2R!e$U`z zj&s4v{V|zDjazco@eYY>4@%QsF7}pPkDg=qSCKg{97Lr@;+aHPl%ikxtM6491aRvT z<=(@$QH^|gBiOYkH{m-aBv+}4{T8yx#!KM`U9EI~dgXgvIsU@Rv9#y5vlkRe2je1^ zB0*iOwD-@4VJ|bb`sVGSp6$p){smDaVznoGhw&2dLub4l+_2*zgC5D5o;mlv^@FU< z%r{Dn>o5*7vAfmZ;YFJpDh}VO`lc}fV=LnP=BGO0Sl0ZQ&D`DSk+~@IY=n60!VPh} zaUpO?@bx^-IYumPbkZB?BAJOHk%@5LjCO-frjb?IksbagGD#ZeG?Op3NcM!TZm!{f z`HSl{_r=5kIZ&72PQX{sX(ua1KI8|Ksby3Dh^K@r{hrlPI7}mjjAyC5(Zy=KbFA#0oZ##Bz^`?_H>UqGEA7p%^s?Vm`tJR| zo$kpS4Gsr>i|k(dj8zSP_`M@vQY+5z#$rVW8&gDL^XG(dH^M2ybzu)L!bZrX^M{7V ziYGcR3IiVMCuWDE-IY>a$;vvV6P1fH+Hii!!#>N(%eVNRa$MfLTr^-E)sqkUG)%j`j*?bWT<+^7)hJSx{h7PpQA!$57dZDn z*n6k&%(|d|^X;T#+qP}nX2-VCai?S3=-9SxcWm29$LOSI=fyYQ{14`IP9_J>b>-xF z_Fj9hT2=MCt13*9Lok7GeV0a+%gkHAwU<6gc0@KxwOSB#FZbJB*Fr94YeK56bC%rd=J* zdK^1?DJoUDL9zvQk##@f;TWYRzk46I=c(S_K+RG2cAUEuS{iZU$hi|u2v420@AO6y zk$r9^VRO1|WfM2~nfn}nGz?GHLqVUR3Mm3({54fes|&{gZcI$Y6PT48U!!1-IwBSW z%E2EO(c&y(Nn9%QRcl|%V3il&Z^$eWes8WAc~O$V0_pF zWTT?ln6m`@_+NY_W3gTt(0|4x0%rTuhF?o{FuOUv+*&P^S&Y|0ODU@q8{EFwtp|8% z(x)k_j|bJL8{gyl3qM{`w))Sy_Tdt1cOHHzEXZ4>Z)==8pVq?L_q2g;dFu>|@&eYW zkEdLK0?o|625F&qu&c*}?*d~d8u9bPW>?|o9$t$T6uZ|~{gaa8cz#OReK>g47a#HG zl)s&JCPT&0qWcK_-@?$48{NM8SR^RJAu2jLk-oR~?@`PR15wV)XdlzC5wL~c47n{>tR2zjUR({@U$DY2%k|%=Wyz`XN8^v$S3`g6n$0)f_b?G} z9b3lVPZyi!mvn&3U2I_T>XJrfmn%^8Eh1=c25%raHBs`n!nEpz;jemtTl!mMi4ENv zjr4>}eJg}oG3mmBgLZ0~6bP#phmsn|Fhuf7PaiGU8J*2v7;XJ_XvM$92a_#+0`I$d z$YXE#GWZ-Zn_IHrUluQ|dJ&fqxDt~MyQQ*Xa)FO>>eX*^>rj2DGtsC_@b?`U0V#r_ zMx#M!?+a`F1glw567uBtJ%M*)Q;RT^_B4iOX})mFMU31onafqLYheg(`KA0iPK=@` zE$`DP?9J3gllpY9g0ROB_B@L22fZ@!mnvaYbnPS^)|haFO-i@RO$A=y8NipL-^qUg z-E)?XKcsJ8kNVTdU#L-r5nJo}?kcNZtrqVfaJ{{0Lla3_m2RVT5S`xm8-HjZt5SI4 zti2YR`{3u&`&=nk4+!t|x@vfRja5{gO@Q5cc)ZuRGerpwUz%t8dUV$02FI>4NVxcM z;^qnBpU8NU5x@3#UXh*k210X*uIop|kgn-!DTY28Wqevgf>mElDMZ`h(W~Wcs4v+C zY(~w0@&;x26+RB3yAr^|U?C=tL!zBU@bQ~eI*%d2LoXMhTS67xRFLC46A`H`E0kAc2?Sq2edL4%yI{4;qrKav zB8ahJq<1JmaA_`c^;IxB&TL}Ah_4S_OSxyGV{y$!;tj2Z@6uL;Izd%X*y~7#1AGuv zd|C5&4vCGhSsDVt>Q+L;FVExO&jDSD;j&brdjW54nUvhPF}KXTdv-12$TiejaE
        V+DGU`d%_Ka>@;1&?s(9D>Kk_gW#(c$}7r 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 BV*mgE diff --git a/contrib/submit-simple-job/docs/tensorboard.png b/contrib/submit-simple-job/docs/tensorboard.png deleted file mode 100644 index ef09178ca16fef58ca4d0d8c0d76a5cc299d5cef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30588 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 W#glILv2V=1qpGN>P$6d#^1lE)js$D~ diff --git a/contrib/submit-simple-job/index.ts b/contrib/submit-simple-job/index.ts deleted file mode 100644 index 43f03c812b..0000000000 --- a/contrib/submit-simple-job/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation - * All rights reserved. - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -import * as React from "react"; -import * as ReactDOM from "react-dom"; - -import "whatwg-fetch"; - -import App from "./App"; - -class PAIPluginElement extends HTMLElement { - public connectedCallback() { - const api = this.getAttribute("pai-rest-server-uri") as string; - const user = this.getAttribute("pai-user"); - const token = this.getAttribute("pai-rest-server-token"); - if (user === null || token === null) { - window.location.href = "/login.html"; - return; - } - ReactDOM.render(React.createElement(App, { api, user, token }), this); - } - - public disconnectedCallback() { - ReactDOM.unmountComponentAtNode(this); - } -} - -window.customElements.define("pai-plugin", PAIPluginElement); diff --git a/contrib/submit-simple-job/package-lock.json b/contrib/submit-simple-job/package-lock.json deleted file mode 100644 index aa11bb09b1..0000000000 --- a/contrib/submit-simple-job/package-lock.json +++ /dev/null @@ -1,4259 +0,0 @@ -{ - "name": "submit-simple-job", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/anymatch": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", - "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", - "dev": true - }, - "@types/classnames": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.7.tgz", - "integrity": "sha512-rzOhiQ55WzAiFgXRtitP/ZUT8iVNyllEpylJ5zHzR4vArUvMB39GTk+Zon/uAM0JxEFAWnwsxC2gH8s+tZ3Myg==", - "dev": true - }, - "@types/hashids": { - "version": "1.0.30", - "resolved": "https://registry.npmjs.org/@types/hashids/-/hashids-1.0.30.tgz", - "integrity": "sha512-ESXJxz/GRY+SGa3n0WuWZLR0xM3k8LTr4+2xOoj/a0ZThglF/UfEeKVaMQNNFvFQ+mw3ng8LbC3gmJx/GmR5EQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "11.9.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.9.3.tgz", - "integrity": "sha512-DMiqG51GwES/c4ScBY0u5bDlH44+oY8AeYHjY1SGCWidD7h08o1dfHue/TGK7REmif2KiJzaUskO+Q0eaeZ2fQ==", - "dev": true - }, - "@types/prop-types": { - "version": "15.5.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.8.tgz", - "integrity": "sha512-3AQoUxQcQtLHsK25wtTWIoIpgYjH3vSDroZOUr7PpCHw/jLY1RB9z9E8dBT/OSmwStVgkRNvdh+ZHNiomRieaw==", - "dev": true - }, - "@types/qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-mNhVdZHdtKHMMxbqzNK3RzkBcN1cux3AvuCYGTvjEIQT2uheH3eCAyYsbMbh2Bq8nXkeOWs1kyDiF7geWRFQ4Q==", - "dev": true - }, - "@types/react": { - "version": "16.7.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.7.20.tgz", - "integrity": "sha512-Qd5RWkwl6SL7R2XzLk/cicjVQm1Mhc6HqXY5Ei4pWd1Vi8Fkbd5O0sA398x8fRSTPAuHdDYD9nrWmJMYTJI0vQ==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" - } - }, - "@types/react-dom": { - "version": "16.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.11.tgz", - "integrity": "sha512-x6zUx9/42B5Kl2Vl9HlopV8JF64wLpX3c+Pst9kc1HgzrsH+mkehe/zmHMQTplIrR48H2gpU7ZqurQolYu8XBA==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/tapable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz", - "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==", - "dev": true - }, - "@types/uglify-js": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", - "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@types/webpack": { - "version": "4.4.24", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.4.24.tgz", - "integrity": "sha512-yg99CjvB7xZ/iuHrsZ7dkGKoq/FRDzqLzAxKh2EmTem6FWjzrty4FqCqBYuX5z+MFwSaaQGDAX4Q9HQkLjGLnQ==", - "dev": true, - "requires": { - "@types/anymatch": "*", - "@types/node": "*", - "@types/tapable": "*", - "@types/uglify-js": "*", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@types/whatwg-fetch": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/whatwg-fetch/-/whatwg-fetch-0.0.33.tgz", - "integrity": "sha1-GcDShjyMsjgPIaHHNrecv3iVuxM=", - "dev": true, - "requires": { - "@types/whatwg-streams": "*" - } - }, - "@types/whatwg-streams": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@types/whatwg-streams/-/whatwg-streams-0.0.7.tgz", - "integrity": "sha512-6sDiSEP6DWcY2ZolsJ2s39ZmsoGQ7KVwBDI3sESQsEm9P2dHTcqnDIHRZFRNtLCzWp7hCFGqYbw5GyfpQnJ01A==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", - "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", - "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", - "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", - "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", - "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", - "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", - "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", - "dev": true - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", - "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", - "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", - "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", - "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/utf8": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", - "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", - "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/helper-wasm-section": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-opt": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", - "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", - "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", - "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", - "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/floating-point-hex-parser": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-code-frame": "1.7.11", - "@webassemblyjs/helper-fsm": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", - "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - } - }, - "ajv": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", - "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", - "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", - "dev": true - }, - "biskviit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/biskviit/-/biskviit-1.0.1.tgz", - "integrity": "sha1-A3oM1LcbnjMf2QoRIt4X3EnkIKc=", - "requires": { - "psl": "^1.1.7" - } - }, - "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cacache": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", - "dev": true, - "requires": { - "bluebird": "^3.5.3", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "csstype": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.0.tgz", - "integrity": "sha512-by8hi8BlLbowQq0qtkx54d9aN73R9oUW20HISpka5kmgsR9F7nnxgfsemuR2sdCKZh+CDNf5egW9UZMm4mgJRg==", - "dev": true - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-CoJ58Gvjf58Ou1Z1YKMKSA2lmi4=", - "requires": { - "biskviit": "1.0.1", - "encoding": "0.1.12" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.6.tgz", - "integrity": "sha512-BalK54tfK0pMC0jQFb2oHn1nz7JNQD/2ex5pBnCHgBi2xG7VV0cAOGy2RS2VbCqUXx5/6obMrMcQTJ8yjcGzbg==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-modules-path": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", - "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", - "dev": true - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hashids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/hashids/-/hashids-1.2.2.tgz", - "integrity": "sha512-dEHCG2LraR6PNvSGxosZHIRgxF5sNLOIBFEHbj8lfP9WWmu/PWPMzsip1drdVSOFi51N2pU7gZavrgn7sbGFuw==" - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "lightercollective": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lightercollective/-/lightercollective-0.1.0.tgz", - "integrity": "sha512-J9tg5uraYoQKaWbmrzDDexbG6hHnMcWS1qLYgJSWE+mpA3U5OCSeMUhb+K55otgZJ34oFdR0ECvdIb3xuO5JOQ==", - "dev": true - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "nan": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "needle": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", - "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", - "dev": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-pre-gyp": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz", - "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "npm-bundled": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", - "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.2.0.tgz", - "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - }, - "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "pako": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", - "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz", - "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.7.0.tgz", - "integrity": "sha512-StCz3QY8lxTb5cl2HJxjwLFOXPIFQp+p+hxQfc8WE0QiLfCtIlKj8/+5tjjKm8uSTlAW+fCPaavGFS06V9Ar3A==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.12.0" - } - }, - "react-dom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.7.0.tgz", - "integrity": "sha512-D0Ufv1ExCAmF38P2Uh1lwpminZFRXEINJe53zRAbm4KPwSyd6DY/uDoS0Blj9jvPpn1+wivKpZYc8aAAN/nAkg==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.12.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", - "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "scheduler": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.12.0.tgz", - "integrity": "sha512-t7MBR28Akcp4Jm+QoR63XgAi9YgCUmgvDHqf5otgAj4QvdoBE4ImCX0ffehefePPG+aitiYHp0g/mW6s4Tp+dw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "serialize-javascript": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", - "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", - "dev": true - }, - "tar": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "terser": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.14.1.tgz", - "integrity": "sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw==", - "dev": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1", - "source-map-support": "~0.5.6" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz", - "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==", - "dev": true, - "requires": { - "cacache": "^11.0.2", - "find-cache-dir": "^2.0.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "terser": "^3.8.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "ts-loader": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.3.3.tgz", - "integrity": "sha512-KwF1SplmOJepnoZ4eRIloH/zXL195F51skt7reEsS6jvDqzgc/YSbz9b8E07GxIUwLXdcD4ssrJu6v8CwaTafA==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" - } - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tslint": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", - "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.7.0", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.27.2" - } - }, - "tslint-react": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/tslint-react/-/tslint-react-3.6.0.tgz", - "integrity": "sha512-AIv1QcsSnj7e9pFir6cJ6vIncTqxfqeFF3Lzh8SuuBljueYzEAtByuB6zMaD27BL0xhMEqsZ9s5eHuCONydjBw==", - "dev": true, - "requires": { - "tsutils": "^2.13.1" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", - "dev": true - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "webpack": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.4.tgz", - "integrity": "sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - } - }, - "webpack-cli": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.2.1.tgz", - "integrity": "sha512-jeJveHwz/vwpJ3B8bxEL5a/rVKIpRNJDsKggfKnxuYeohNDW4Y/wB9N/XHJA093qZyS0r6mYL+/crLsIol4WKA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "findup-sync": "^2.0.0", - "global-modules": "^1.0.0", - "global-modules-path": "^2.3.0", - "import-local": "^2.0.0", - "interpret": "^1.1.0", - "lightercollective": "^0.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.4" - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/contrib/submit-simple-job/package.json b/contrib/submit-simple-job/package.json deleted file mode 100644 index c147dd0b6a..0000000000 --- a/contrib/submit-simple-job/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "submit-simple-job", - "version": "1.0.0", - "description": "PAI web portal plugin for submit simple job", - "main": "index.tsx", - "scripts": { - "watch": "webpack --env development", - "prebuild": "npm test", - "build": "webpack", - "test": "tslint --project ." - }, - "author": "Microsoft Corporation", - "license": "MIT", - "dependencies": { - "classnames": "^2.2.6", - "fetch": "^1.1.0", - "hashids": "1.2.2", - "qs": "^6.6.0", - "react": "^16.7.0", - "react-dom": "^16.7.0", - "whatwg-fetch": "^3.0.0" - }, - "devDependencies": { - "@types/classnames": "^2.2.7", - "@types/hashids": "^1.0.30", - "@types/qs": "^6.5.1", - "@types/react": "^16.7.20", - "@types/react-dom": "^16.0.11", - "@types/webpack": "^4.4.24", - "@types/whatwg-fetch": "0.0.33", - "ts-loader": "^5.3.3", - "tslint": "^5.12.1", - "tslint-react": "^3.6.0", - "typescript": "^3.2.2", - "webpack": "^4.28.4", - "webpack-cli": "^3.2.1" - } -} diff --git a/contrib/submit-simple-job/tsconfig.json b/contrib/submit-simple-job/tsconfig.json deleted file mode 100644 index cfec1a9012..0000000000 --- a/contrib/submit-simple-job/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "target": "es2015", - "module": "es2015", - "lib": ["dom", "es2015"], - "jsx": "react", - "sourceMap": true, - "moduleResolution": "node", - "resolveJsonModule": true, - "strict": true - } -} diff --git a/contrib/submit-simple-job/tslint.json b/contrib/submit-simple-job/tslint.json deleted file mode 100644 index d505e4aa23..0000000000 --- a/contrib/submit-simple-job/tslint.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "defaultSeverity": "error", - "extends": [ - "tslint:recommended", - "tslint-react" - ], - "rules": { - "jsx-no-multiline-js": false - } -} diff --git a/contrib/submit-simple-job/webpack.config.js b/contrib/submit-simple-job/webpack.config.js deleted file mode 100644 index d46c3b43c9..0000000000 --- a/contrib/submit-simple-job/webpack.config.js +++ /dev/null @@ -1,87 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation - * All rights reserved. - * - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -const {resolve} = require('path'); -const {BannerPlugin} = require('webpack'); - -module.exports = (env) => { - /** @type { import('webpack').Configuration } */ - const config = { - entry: './index.ts', - output: {}, - module: { - rules: [{ - test: /\.tsx?$/, - use: 'ts-loader', - exclude: /node_modules/, - }], - }, - resolve: { - extensions: ['.tsx', '.ts', '.js'], - }, - plugins: [], - }; - - if (env === 'development') { - config.mode = 'development'; - config.output.path = resolve(__dirname, '..', '..', - 'src', 'webportal', 'dist', 'scripts', 'plugins'); - config.output.filename = 'submit-simple-job.js'; - - config.watch = true; - config.watchOptions = {ignored: /node_modules/}; - } else { - config.mode = 'production'; - config.output.path = resolve(__dirname, 'dist'); - config.output.filename = 'plugin.js'; - config.plugins.push( - new BannerPlugin(` -Copyright (c) Microsoft Corporation -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - `.trim()) - ) - } - - return config; -}; diff --git a/src/cleaner/__init__.py b/src/cleaner/__init__.py deleted file mode 100644 index afedca73fa..0000000000 --- a/src/cleaner/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/cleaner/build/cleaner.common.dockerfile b/src/cleaner/build/cleaner.common.dockerfile deleted file mode 100644 index e2903376bc..0000000000 --- a/src/cleaner/build/cleaner.common.dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -FROM python:2.7 - -RUN apt-get -y update && \ - apt-get -y install lsof gawk - -RUN pip install psutil - -RUN curl -SL https://download.docker.com/linux/static/stable/x86_64/docker-17.06.2-ce.tgz \ - | tar -xzvC /usr/local \ - && mv /usr/local/docker/* /usr/bin - -ENV PYTHONPATH "${PYTHONPATH}:/" -RUN mkdir -p /cleaner -WORKDIR /cleaner - -COPY scripts /cleaner/scripts -COPY utils /cleaner/utils -COPY ./*.py /cleaner/ - -ENTRYPOINT ["python", "/cleaner/cleaner_main.py"] diff --git a/src/cleaner/cleaner_main.py b/src/cleaner/cleaner_main.py deleted file mode 100644 index 2af78875ff..0000000000 --- a/src/cleaner/cleaner_main.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import time -import argparse -import os -from datetime import timedelta -from cleaner.scripts.clean_docker import DockerCleaner -from cleaner.worker import Worker -from cleaner.utils.logger import LoggerMixin -from cleaner.utils import common - - -class Cleaner(LoggerMixin): - - def __init__(self, liveness): - self.workers = {} - self.liveness = liveness - - def add_worker(self, key, worker): - if key not in self.workers: - self.workers[key] = worker - else: - self.logger.warn("worker with key %s already exists.", key) - - def start(self): - for k, w in self.workers.items(): - w.start() - self.logger.info("worker %s started.", k) - - def terminate(self): - for k, w in self.workers.items(): - try: - # terminate the worker and all its subprocesses - common.kill_process_tree(w.pid, 5, self.logger) - except Exception as e: - self.logger.error("errors occur when terminating worker %s.", k) - self.logger.exception(e) - - def update_liveness(self): - if self.liveness: - file_name = os.path.join("/tmp", self.liveness) - with open(file_name, "a"): - os.utime(file_name, None) - - def sync(self): - try: - while True: - stopped_workers = [(k, w) for k, w in self.workers.items() if not w.is_alive()] - if len(stopped_workers) > 0: - for k, w in stopped_workers: - self.logger.error("worker %s exit with code %s", k, w.exitcode) - self.workers.pop(k) - if len(self.workers) == 0: - self.logger.info("all workers are stopped and exit cleaner.") - break - self.update_liveness() - time.sleep(2) - except Exception as e: - self.logger.exception("cleaner interrupted and will exit.") - self.terminate() - time.sleep(1) - - -def get_worker(threshold): - worker = Worker(clean_docker.check_and_clean, threshold, timeout=timedelta(minutes=10), cool_down_time=60) - return worker; - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("-t", "--threshold", help="the disk usage precent to start cleaner") - parser.add_argument("-i", "--interval", help="the base interval to check disk usage") - args = parser.parse_args() - - common.setup_logging() - - cleaner = DockerCleaner(args.threshold, args.interval, timedelta(minutes=10)) - cleaner.run() - - -if __name__ == "__main__": - main() diff --git a/src/cleaner/config/cleaner.md b/src/cleaner/config/cleaner.md deleted file mode 100644 index e160437309..0000000000 --- a/src/cleaner/config/cleaner.md +++ /dev/null @@ -1,54 +0,0 @@ -## Cleaner section parser - -- [Default Configuration](#D_Config) -- [How to Configure](#HT_Config) -- [Generated Configuration](#G_Config) -- [Data Table](#T_config) - -#### Default configuration - -[cleaner default configuration](cleaner.yaml) - -#### How to configure cluster section in service-configuration.yaml - -All configurations in this section is optional. If you want to customized these value, you can configure it in service-configuration.yaml. - -For example, if you want to use different threshold than the default value 94, add following to your service-configuration.yaml as following: -```yaml -cleaner: - threshold: new-value - interval: new-value -``` - -#### Generated Configuration - -After parsing, object model looks like: -```yaml -cleaner: - threshold: 90 - interval: 60 -``` - - -#### Table - - - - - - - - - - - - - - - - - - - - -
        Data in Configuration FileData in Cluster Object ModelData in Jinja2 TemplateData type
        cleaner.thresholdcom["cleaner"]["threshold"]cluster_cfg["cleaner"]["threshold"]Int
        cleaner.intervalcom["cleaner"]["interval"]cluster_cfg["cleaner"]["interval"]Int
        diff --git a/src/cleaner/config/cleaner.py b/src/cleaner/config/cleaner.py deleted file mode 100644 index 2eccd24f8a..0000000000 --- a/src/cleaner/config/cleaner.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import logging -import logging.config -import copy - -class Cleaner(object): - - def __init__(self, cluster_conf, service_conf, default_service_conf): - self.logger = logging.getLogger(__name__) - self.cluster_conf = cluster_conf - self.service_conf = service_conf - self.default_service_conf = default_service_conf - - def validation_pre(self): - return True, None - - def run(self): - result = copy.deepcopy(self.default_service_conf) - result.update(self.service_conf) - return result - - def validation_post(self, conf): - threshold = conf["cleaner"].get("threshold") - if type(threshold) != int: - msg = "expect threshold in cleaner to be int but get %s with type %s" % \ - (threshold, type(threshold)) - return False, msg - else: - if threshold < 0 or threshold > 100: - msg = "expect threshold in [0, 100]" - return False, msg - - interval = conf["cleaner"].get("interval") - if type(interval) != int: - msg = "expect interval in cleaner to be int but get %s with type %s" % \ - (interval, type(interval)) - return False, msg - - return True, None - diff --git a/src/cleaner/config/cleaner.yaml b/src/cleaner/config/cleaner.yaml deleted file mode 100644 index 0901eae0ee..0000000000 --- a/src/cleaner/config/cleaner.yaml +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -service_type: "yarn" - -threshold: 90 -interval: 60 \ No newline at end of file diff --git a/src/cleaner/deploy/cleaner.yaml.template b/src/cleaner/deploy/cleaner.yaml.template deleted file mode 100644 index 30fe974876..0000000000 --- a/src/cleaner/deploy/cleaner.yaml.template +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: cleaner-ds -spec: - selector: - matchLabels: - app: cleaner - template: - metadata: - labels: - app: cleaner - spec: - hostPID: true - hostNetwork: true - containers: - - name: docker-cleaner - image: {{ cluster_cfg["cluster"]["docker-registry"]["prefix"] }}cleaner:{{ cluster_cfg["cluster"]["docker-registry"]["tag"] }} - args: - - -t {{ cluster_cfg["cleaner"]["threshold"] }} - - -i {{ cluster_cfg["cleaner"]["interval"] }} - imagePullPolicy: Always - securityContext: - privileged: True - volumeMounts: - - mountPath: /var/run/docker.sock - name: docker-socket - - mountPath: /logs - name: cleaner-logs - {%- if cluster_cfg['cluster']['common']['qos-switch'] == "true" %} - resources: - limits: - memory: "1Gi" - {%- endif %} - imagePullSecrets: - - name: {{ cluster_cfg["cluster"]["docker-registry"]["secret-name"] }} - volumes: - - name: docker-socket - hostPath: - path: /var/run/docker.sock - - name: cleaner-logs - hostPath: - path: {{ cluster_cfg["cluster"]["common"]["data-path"] }}/yarn/node/userlogs - tolerations: - - key: node.kubernetes.io/memory-pressure - operator: "Exists" - - key: node.kubernetes.io/disk-pressure - operator: "Exists" \ No newline at end of file diff --git a/src/cleaner/deploy/delete.sh b/src/cleaner/deploy/delete.sh deleted file mode 100644 index 04fa853c78..0000000000 --- a/src/cleaner/deploy/delete.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -echo "stop the cleaner service." - -pushd $(dirname "$0") > /dev/null - -/bin/bash stop.sh || exit $? - -popd > /dev/null diff --git a/src/cleaner/deploy/refresh.sh b/src/cleaner/deploy/refresh.sh deleted file mode 100644 index 5c0576f518..0000000000 --- a/src/cleaner/deploy/refresh.sh +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -pushd $(dirname "$0") > /dev/null - -# TODO will add when necessary - -popd > /dev/null diff --git a/src/cleaner/deploy/service.yaml b/src/cleaner/deploy/service.yaml deleted file mode 100644 index ae2fdeeb5a..0000000000 --- a/src/cleaner/deploy/service.yaml +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -cluster-type: - - yarn - -# to avoid possible race condition, start cleaner after all services are ready -prerequisite: - - cluster-configuration - - alert-manager - - drivers - - end-to-end-test - - grafana - - hadoop-batch-job - - hadoop-data-node - - hadoop-jobhistory - - hadoop-name-node - - hadoop-node-manager - - hadoop-resource-manager - - node-exporter - - prometheus - - pylon - - rest-server - - watchdog - - webportal - - yarn-exporter - - yarn-fremeworklauncher - - zookeeper - -template-list: - - cleaner.yaml - -start-script: start.sh -stop-script: stop.sh -delete-script: delete.sh -refresh-script: refresh.sh - - -deploy-rules: - - in: pai-worker diff --git a/src/cleaner/deploy/start.sh b/src/cleaner/deploy/start.sh deleted file mode 100644 index f42f8b2192..0000000000 --- a/src/cleaner/deploy/start.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -pushd $(dirname "$0") > /dev/null - -kubectl apply --overwrite=true -f cleaner.yaml || exit $? - -popd > /dev/null diff --git a/src/cleaner/deploy/stop.sh b/src/cleaner/deploy/stop.sh deleted file mode 100644 index ae36c9c22c..0000000000 --- a/src/cleaner/deploy/stop.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -pushd $(dirname "$0") > /dev/null - -kubectl delete --ignore-not-found --now daemonset/cleaner-ds - -popd > /dev/null diff --git a/src/cleaner/run_unit_test.sh b/src/cleaner/run_unit_test.sh deleted file mode 100644 index 53fd499822..0000000000 --- a/src/cleaner/run_unit_test.sh +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#!/bin/bash - -set -x - -DIR="$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)" -export PYTHONPATH=$PYTHONPATH:$DIR - -nose_args="--with-coverage \ - --cover-erase \ - --cover-html \ - --logging-level=DEBUG \ - -s \ - -v " - -nosetests $nose_args diff --git a/src/cleaner/scripts/__init__.py b/src/cleaner/scripts/__init__.py deleted file mode 100644 index afedca73fa..0000000000 --- a/src/cleaner/scripts/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/cleaner/scripts/check_deleted_files.py b/src/cleaner/scripts/check_deleted_files.py deleted file mode 100644 index 175f3231a8..0000000000 --- a/src/cleaner/scripts/check_deleted_files.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import multiprocessing -from cleaner.utils import common - -logger = multiprocessing.get_logger() - -# This command will output the deleted files which has been opened by a process. -# The output of the deleted file list is like: -# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME -# dhclient 1008 root txt REG 8,1 487248 0 12320783 /sbin/dhclient (deleted) -# python 31848 root 3w REG 8,1 0 0 29362883 /tmp/tmp_out.txt (deleted) -# -# We only retrieve the PID (second column) and NAME (10th column). -DELETED_FILES_CMD = "lsof +L1 2>/dev/null | awk '{print $2, $10}'" - - -def list_and_check_files(arg, log=logger): - files = common.run_cmd(DELETED_FILES_CMD, log) - if len(files) <= 1: - log.info("no deleted files found.") - return - else: - # skip the field names from the command - files = files[1:] - - for f in files: - f_fields = f.split(" ") - log.warning("process [%s] opened file [%s] but the file has been deleted.", f_fields[0], f_fields[1]) - - -def main(): - common.setup_logging() - logger.info("start to check the deleted files opened by each running process.") - list_and_check_files(None) - - -if __name__ == "__main__": - main() diff --git a/src/cleaner/scripts/clean_docker.py b/src/cleaner/scripts/clean_docker.py deleted file mode 100644 index e536d4703e..0000000000 --- a/src/cleaner/scripts/clean_docker.py +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -from cleaner.utils.logger import LoggerMixin -from cleaner.utils.timer import CountdownTimer, Timeout -from cleaner.utils import common -from datetime import timedelta -import subprocess -import multiprocessing -import re -import time -import os - -class DockerCleaner(LoggerMixin): - def __init__(self, threshold, interval, timeout=timedelta(hours=1)): - self.__threshold = int(threshold) - self.__interval = int(interval) - self.__timeout = timeout - - def _exec(self): - exc = None - try: - with CountdownTimer(duration=self.__timeout): - self.check_and_clean() - except Timeout as e: - self.logger.error("Cleaner timeout.") - exc = e - except Exception as e: - self.logger.error("Unexpected error to run cleaner.") - exc = e - - if exc is not None: - self.logger.exception(exc) - - def run(self): - while True: - # allow a delay before the cleaning - time.sleep(self.__interval) - self._exec() - - - def check_disk_usage(self, partition): - df = subprocess.Popen(["df","-h", partition], stdout=subprocess.PIPE) - sized = 0 - try: - for line in df.stdout: - splitline = line.decode().split() - if splitline[5] == partition: - sized = splitline[1] - used = splitline[2] - usep = int(splitline[4][:-1]) - except ValueError: - self.logger.error("cannot get disk size, reset size to 0") - sized = 0 - used = 0 - usep = 0 - self.logger.info("Checking disk, disk usage = {0}%".format(usep)) - return sized, used, usep - - - def check_and_clean(self): - sized, used, usep = self.check_disk_usage("/") - if usep >= self.__threshold: - self.logger.info("Disk usage is above {0}%, Try to remove containers".format(self.__threshold)) - self.kill_largest_container(sized, used, usep) - - - # Clean logic v1: kill largest container - white_list = ["k8s_POD", "k8s_kube", "k8s_pylon", "k8s_zookeeper", "k8s_rest-server", "k8s_yarn", "k8s_hadoop", "k8s_job-exporter", "k8s_watchdog", "k8s_grafana", "k8s_node-exporter", "k8s_webportal", "k8s_prometheus", "k8s_nvidia-drivers", "k8s_etcd-container", "k8s_apiserver-container", "k8s_docker-cleaner", "kubelet", "dev-box"] - def kill_largest_container(self, sized, used, usep): - containers = [] - # Only try to stop PAI jobs and user created containers - containers_source = subprocess.Popen(["docker", "ps", "-a", "--format", r'{{.ID}}\t{{.Image}}\t{{.Size}}\t{{.Names}}\t'], stdout=subprocess.PIPE) - for line in containers_source.stdout: - splitline = line.split("\t") - for prefix in self.white_list: - if (splitline[3].startswith(prefix)): - break - else: - # Only check job containers - if re.search(r"container(_\w+)?_\d+_\d+_\d+_\d+$", splitline[3]) is not None: - size_str = splitline[2].split()[0] - size = common.calculate_size(size_str) - containers.append([size, splitline[0], splitline[1], splitline[3], size_str]) - - containers.sort(key=lambda x:x[0], reverse=True) - - if containers.count > 0 and containers[0][0] > 1024**3: - self.logger.warning("Kill container {0} due to disk pressure. Container size: {1}".format(containers[0][3], containers[0][4])) - - # Write error log - container_name = re.search(r"container(_\w+)?_\d+_\d+_\d+_\d+$", containers[0][3]).group() - application_name = "application{0}".format(re.search(r"^_\d+_\d+", re.search(r"_\d+_\d+_\d+_\d+$", container_name).group()).group()) - full_path = "/logs/{0}/{1}".format(application_name, container_name) - - if not os.path.isdir(full_path): - self.logger.error("Cannot find job log dir, creating path. Log may not be collected.") - try: - os.makedirs(full_path) - except OSError as exc: - self.logger.error("Failed to create path {0}.".format(full_path)) - - if os.path.isdir(full_path): - error_filename = "{0}/diskCleaner.pai.error".format(full_path) - timestamp = int(time.time()) - try: - fp = open(error_filename, "w") - except IOError: - self.logger.error("Failed to write error log, skipped") - else: - fp.writelines([ - "{0} ERROR ACTION \"KILL\"\n".format(timestamp), - "{0} ERROR REASON \"{1} killed due to disk pressure. Disk size: {2}, Used: {3}, Cleaner threshold: {4}, Container cost: {5} \"\n".format(timestamp, container_name, sized, "{0}({1}%)".format(used, usep), "{0}%".format(self.__threshold), containers[0][4]), - "{0} ERROR SOLUTION \"Node disk is full, please try another time. If your job needs large space, please use NAS to store data.\"\n".format(timestamp) - ]) - fp.close() - - subprocess.Popen(["docker", "kill", "--signal=10", containers[0][1]]) - - # Because docker stop will not immedicately stop container, we can not remove docker image right after stop container - #container_image = subprocess.Popen(["docker", "inspect", containers[0][1], r"--format='{{.Image}}'"], stdout=subprocess.PIPE).stdout.readline() - #subprocess.Popen(["docker", "image", "rmi", container_image]) - return True - else: - return False - diff --git a/src/cleaner/scripts/clean_docker_cache.py b/src/cleaner/scripts/clean_docker_cache.py deleted file mode 100644 index 6667ffdbaa..0000000000 --- a/src/cleaner/scripts/clean_docker_cache.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -from cleaner.utils import common -import multiprocessing - -logger = multiprocessing.get_logger() - - -def get_cache_size(): - out = common.run_cmd("source ./scripts/reclaimable_docker_cache.sh 2> /dev/null", logger) - size = 0 - if len(out) == 0: - logger.error("cannot retrieve cache size.") - return size - try: - size = float(out[0]) - except ValueError: - logger.error("cannot convert cache size, reset size to 0") - size = 0 - return size - - -def check_and_clean(threshold): - if get_cache_size() > threshold: - # to avoid possible race condition, only clean the containers, images and networks created 1h ago - common.run_cmd("docker system prune -af --filter until=1h", logger) - - -if __name__ == "__main__": - common.setup_logging() - check_and_clean(10) diff --git a/src/cleaner/scripts/reclaimable_docker_cache.sh b/src/cleaner/scripts/reclaimable_docker_cache.sh deleted file mode 100644 index a907394d0e..0000000000 --- a/src/cleaner/scripts/reclaimable_docker_cache.sh +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#!/bin/bash - -# This script parse the result of "docker system df" command to get the total reclaimable disk space. -# This command will list the reclaimable space of all docker objects including images, local volumes and build caches. -# Following is a example of the command's output: -# TYPE TOTAL ACTIVE SIZE RECLAIMABLE -# Images 38 18 16.13GB 11.26GB (69%) -# Containers 42 42 95.3MB 0B (0%) -# Local Volumes 13 1 3.553GB 3.28GB (92%) -# Build Cache 0 0 0B 0B -# -# We summer up the result in column 5 (RECLAIMABLE) and return the size in gigabytes. - -docker system df --format "{{.Reclaimable}}" | \ -gawk 'BEGIN {s=0} - END {print s} - match($1, /([0-9]+\.?[0-9]*)(M|G|B|T)/, a) { - if(a[2] == "M") - s += a[1]/1024; - else if(a[2] == "B") - s += a[1]/1024/1024; - else if(a[2] == "T") - s += a[1]*1024; - else - s += a[1]; - }' diff --git a/src/cleaner/test/__init__.py b/src/cleaner/test/__init__.py deleted file mode 100644 index afedca73fa..0000000000 --- a/src/cleaner/test/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/cleaner/test/job/cleaner-test-job.md b/src/cleaner/test/job/cleaner-test-job.md deleted file mode 100644 index 336d681961..0000000000 --- a/src/cleaner/test/job/cleaner-test-job.md +++ /dev/null @@ -1,32 +0,0 @@ -## Cleaner-Test-Job - -- [How to Use](#HT_Use) -- [How to Configure](#HT_Config) -- [How to Build Job Image](#HT_Image) - -#### How to use cleaner test job - -1. Go to PAI web portal, enter job submission page. -2. Import job yaml file. (cleaner-test-job.yaml) -3. Change parameters if needed. -4. Click Submit button to submit job. -5. Go to Jobs page, keep monitoring the job you just submitted. -6. If everything work as expected, the job will fail due to killed by cleaner. Click "Go to Tracking Page", you will find info "Docker container killed by cleaner due to disk pressure" in the end. - -#### How to configure variables in job - -In the job page, use the following command to run cleaner test: -```sh -sh /cleaner-test/cleaner-test.sh <% $parameters.threshold %> <% $parameters.time %> -``` -Set parameters: - - threshold: Test job will fill the disk to (threshold + 1)%. Please adjust this value according to cleaner threshold settings. Default value is 94. - - time: The time cost that job fill disk to (threshold + 1)%. Default value is 30. - -#### How to build job docker image - -Run the following command under this folder, make sure you have docker installed. -```sh -docker build -f cleaner-test.df -t . -``` -Then tag the docker image and upload to your docker repo. We offer the default docker image on openpai/testcleaner diff --git a/src/cleaner/test/job/cleaner-test-job.yaml b/src/cleaner/test/job/cleaner-test-job.yaml deleted file mode 100644 index c2cadda524..0000000000 --- a/src/cleaner/test/job/cleaner-test-job.yaml +++ /dev/null @@ -1,29 +0,0 @@ -protocolVersion: 2 -name: cleaner-test-job -type: job -jobRetryCount: 0 -prerequisites: - - type: dockerimage - uri: 'openpai/testcleaner:stable' - name: docker_image_1 -parameters: - threshold: '94' - time: '30' -taskRoles: - taskrole: - instances: 1 - completion: - minFailedInstances: 1 - minSucceededInstances: 1 - dockerImage: docker_image_1 - resourcePerInstance: - gpu: 1 - cpu: 4 - memoryMB: 8192 - commands: - - >- - sh /cleaner-test/cleaner-test.sh <% $parameters.threshold %> <% - $parameters.time %> - taskRetryCount: 0 -defaults: - virtualCluster: default diff --git a/src/cleaner/test/job/cleaner-test.df b/src/cleaner/test/job/cleaner-test.df deleted file mode 100644 index 89982f658a..0000000000 --- a/src/cleaner/test/job/cleaner-test.df +++ /dev/null @@ -1,11 +0,0 @@ -FROM alpine - -RUN apk update && \ - apk add lsof gawk bash - -RUN mkdir -p /cleaner-test -WORKDIR /cleaner-test - -COPY cleaner-test.sh /cleaner-test/ - -ENTRYPOINT ["sh", "/cleaner-test/cleaner-test.sh 94 60"] \ No newline at end of file diff --git a/src/cleaner/test/job/cleaner-test.sh b/src/cleaner/test/job/cleaner-test.sh deleted file mode 100644 index 031befd8d9..0000000000 --- a/src/cleaner/test/job/cleaner-test.sh +++ /dev/null @@ -1,32 +0,0 @@ -threshold="$1" -time="$2" -df / | gawk \ -'BEGIN {threshold=int("'"$threshold"'"); time=int("'"$time"'"); fb=0; chunk=0} - END { - if (chunk > 0) { - for (var=0; var= 100) threshold = 94; - if (time <= 0) time = 1; - chunk = $2 / 1024 / 100; - fb = int(chunk * (threshold + 1) - $3 / 1024); - if (fb < 0) fb = 0; - max = int($4 / 1024 - chunk); - if (fb > max) fb = max; - chunk = int(fb / time) - } -' -while true -do - echo "Waiting cleaner to kill job..." - sleep 5 -done \ No newline at end of file diff --git a/src/cleaner/test/test_scripts.py b/src/cleaner/test/test_scripts.py deleted file mode 100644 index d4426faf2b..0000000000 --- a/src/cleaner/test/test_scripts.py +++ /dev/null @@ -1,100 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -from unittest import TestCase, main -import mock -import time -import psutil -import os -import multiprocessing -from cleaner.utils.common import setup_logging, run_cmd -from cleaner.scripts import clean_docker_cache, check_deleted_files - -CALLED_CMD = "docker system prune -af" -LOGGER = multiprocessing.get_logger() - - -class TestCacheClean(TestCase): - - def setUp(self): - setup_logging() - - @mock.patch("cleaner.utils.common.run_cmd", return_value=[]) - def testCacheEmpty(self, mock_cmd): - self.assertEqual(clean_docker_cache.get_cache_size(), 0) - - @mock.patch("cleaner.utils.common.run_cmd", return_value=["0"]) - def testCacheZero(self, mock_cmd): - self.assertEqual(clean_docker_cache.get_cache_size(), 0) - - @mock.patch("cleaner.utils.common.run_cmd", return_value=["error"]) - def testCacheError(self, mock_cmd): - self.assertEqual(clean_docker_cache.get_cache_size(), 0) - - @mock.patch("cleaner.scripts.clean_docker_cache.get_cache_size", return_value=1) - @mock.patch("cleaner.utils.common.run_cmd", return_value=["0"]) - def testCleanTrue(self, mock_cmd, mock_size): - clean_docker_cache.check_and_clean(0) - mock_cmd.assert_called_once_with(CALLED_CMD, LOGGER) - - @mock.patch("cleaner.scripts.clean_docker_cache.get_cache_size", return_value=0) - @mock.patch("cleaner.utils.common.run_cmd", return_value=["0"]) - def testCleanFalse(self, mock_cmd, mock_size): - clean_docker_cache.check_and_clean(0) - mock_cmd.assert_not_called() - - -class TestDeletedFiles(TestCase): - - def testDeletedCmd(self): - test_file = "/tmp/deleted_test.txt" - - def open_and_loop(): - with open(test_file, "w"): - while True: - pass - - proc = multiprocessing.Process(target=open_and_loop) - proc.start() - time.sleep(1) - os.remove("/tmp/deleted_test.txt") - time.sleep(1) - - mock_logger = mock.Mock() - cmd_out = run_cmd(check_deleted_files.DELETED_FILES_CMD, mock_logger) - files = [f.split(" ")[1] for f in cmd_out[1:]] - self.assertTrue(test_file in files) - - proc.terminate() - proc.join() - - @mock.patch("cleaner.utils.common.run_cmd", return_value=["PID NAME"]) - def testDeletedCheckEmpty(self, mock_cmd): - mock_log = mock.Mock() - check_deleted_files.list_and_check_files(None, mock_log) - mock_log.info.assert_called_once() - - @mock.patch("cleaner.utils.common.run_cmd", return_value=["PID NAME", "1, /test"]) - def testDeletedCheckNonEmpty(self, mock_cmd): - mock_log = mock.Mock() - check_deleted_files.list_and_check_files(None, mock_log) - mock_log.info.assert_not_called() - mock_log.warning.assert_called_once() - - -if __name__ == "__main__": - main() diff --git a/src/cleaner/test/test_utils.py b/src/cleaner/test/test_utils.py deleted file mode 100644 index 0ead28cc9d..0000000000 --- a/src/cleaner/test/test_utils.py +++ /dev/null @@ -1,148 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -from cleaner.utils.logger import LoggerMixin -from cleaner.utils.timer import CountdownTimer, Timeout -from cleaner.utils.common import * -from datetime import timedelta -from unittest import TestCase, main -import time -import mock -import subprocess as sp -import signal -import os -import psutil - - -def ps_raise(procs, timeout, callback): - raise psutil.Error - - -def kill_process_list_mock(procs, sig, timeout, logger): - for p in procs: - kill_process(p, sig, logger) - time.sleep(timeout) - return procs - - -class UtilsTest(TestCase, LoggerMixin): - - def setUp(self): - setup_logging() - - def testLogger(self): - self.assertTrue(self.logger is not None, "logger cannot be None.") - - def testTimerException(self): - count = 0 - with self.assertRaises(Timeout): - with CountdownTimer(duration=timedelta(seconds=1)): - while count < 3: - time.sleep(1) - count += 1 - - def testTimerExceptionSleep(self): - with self.assertRaises(Timeout): - with CountdownTimer(duration=timedelta(seconds=1)): - time.sleep(10) - - def testTimerNoException(self): - no_timeout = True - try: - with CountdownTimer(duration=timedelta(seconds=3)): - time.sleep(1) - except Timeout: - no_timeout = False - self.assertTrue(no_timeout) - - def testNoTimer(self): - no_timer = True - try: - with CountdownTimer(duration=None): - time.sleep(1) - except Timeout: - no_timer = False - self.assertTrue(no_timer) - - def testRunCmdOneLine(self): - out = run_cmd("echo test", self.logger) - self.assertEqual(out[0], "test") - - def testRunCmdEmptyOut(self): - out = run_cmd("echo test > /dev/null", self.logger) - self.assertEqual(len(out), 0) - - def testTerminateProcess(self): - proc = sp.Popen(["/bin/bash", "-c", "sleep 3600"]) - kill_process(proc, signal.SIGTERM, self.logger) - time.sleep(1) - self.assertEqual(proc.poll(), -signal.SIGTERM) - - def testKillProcess(self): - proc = sp.Popen(["/bin/bash", "-c", "sleep 3600"]) - kill_process(proc, signal.SIGKILL, self.logger) - time.sleep(1) - self.assertEqual(proc.poll(), -signal.SIGKILL) - - def testKillProcessList(self): - procs = [] - procs.append(sp.Popen(["/bin/bash", "-c", "sleep 3600"])) - procs.append(sp.Popen(["/bin/bash", "-c", "sleep 3600"])) - - ps_procs = [psutil.Process(p.pid) for p in procs] - alive = kill_process_list(ps_procs, signal.SIGTERM, 1, self.logger) - self.assertEqual(len(alive), 0) - self.assertTrue(procs[0].poll() is not None) - self.assertTrue(procs[1].poll() is not None) - - @mock.patch("psutil.wait_procs", side_effect=ps_raise) - def testKillProcessListError(self, mock_wait): - proc = sp.Popen(["/bin/bash", "-c", "sleep 1200"]) - ps_procs = [psutil.Process(proc.pid)] - alive = kill_process_list(ps_procs, signal.SIGTERM, 1, self.logger) - mock_wait.assert_called_once() - self.assertEqual(ps_procs, alive) - self.assertTrue(proc.poll() is not None) - - def testKillProcessTree(self): - test_shell = "#!/bin/bash \n" \ - "# create a background process as child \n" \ - "sleep 1000 & \n" \ - "# wait to block the foreground process \n" \ - "sleep 1000 \n" - with open("/tmp/subprocess.sh", "w") as sh: - sh.write(test_shell) - proc = sp.Popen(["/bin/bash", "/tmp/subprocess.sh"]) - time.sleep(1) - subproc = psutil.Process(proc.pid).children(recursive=True) - self.assertTrue(len(subproc) == 2) - - kill_process_tree(proc.pid, 1, self.logger) - gone, alive = psutil.wait_procs(subproc, timeout=1) - self.assertTrue(len(alive) == 0) - self.assertTrue(proc.poll() is not None) - - @mock.patch("cleaner.utils.common.kill_process_list", side_effect=kill_process_list_mock) - def testKillProcessTreeError(self, mock_kill): - proc = sp.Popen(["/bin/bash", "-c", "sleep 1200"]) - kill_process_tree(proc.pid, 1, self.logger) - self.assertTrue(mock_kill.call_count == 2) - self.assertTrue(proc.poll() is not None) - - -if __name__ == "__main__": - main() diff --git a/src/cleaner/test/test_worker.py b/src/cleaner/test/test_worker.py deleted file mode 100644 index 5451f27a7c..0000000000 --- a/src/cleaner/test/test_worker.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -from cleaner.worker import Worker -from cleaner.utils import common -import datetime -import time -from multiprocessing import Queue -from unittest import TestCase, main - - -def called_by_worker(queue): - queue.put(1) - - -def timeout_worker(queue): - time.sleep(2) - queue.put(1) - - -class TestWorker(TestCase): - - def setUp(self): - common.setup_logging() - - def testWorkerRunOnce(self): - queue = Queue() - worker = Worker(called_by_worker, queue, long_run=False) - worker.start() - worker.join() - data = queue.get(timeout=2) - self.assertEqual(data, 1) - - def testWorkerLongRun(self): - queue = Queue() - worker = Worker(called_by_worker, queue, cool_down_time=0.1) - worker.start() - time.sleep(3) - worker.terminate() - worker.join() - self.assertTrue(queue.qsize() > 1) - - def testWorkerTimeout(self): - queue = Queue() - worker = Worker(timeout_worker, queue, long_run=False, timeout=datetime.timedelta(seconds=1)) - worker.start() - worker.join() - self.assertEqual(queue.qsize(), 0) - - -if __name__ == "__main__": - main() diff --git a/src/cleaner/utils/__init__.py b/src/cleaner/utils/__init__.py deleted file mode 100644 index afedca73fa..0000000000 --- a/src/cleaner/utils/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/cleaner/utils/common.py b/src/cleaner/utils/common.py deleted file mode 100644 index 875d74c097..0000000000 --- a/src/cleaner/utils/common.py +++ /dev/null @@ -1,137 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import subprocess -import multiprocessing -import logging -import sys -import os -import psutil -import signal -import re - -def kill_process_tree(pid, time_to_die, logger): - """ - Kills a process and all its subprocesses in best effort. - The processes are first killed by sending SIGTERM. - If they cannot terminate in time_to_die seconds. - They will be killed by sending SIGKILL. - - :param pid: id of process to be killed - :param time_to_die: the time period in which the process should terminate - :param logger: logger handler - """ - if os.getpid() == pid: - logger.error("I refuse to kill myself.") - return - - try: - process = psutil.Process(pid) - processes = process.children(recursive=True) - processes.append(process) - except psutil.Error as e: - logger.error("cannot get process %s and its subprocesses.", pid) - logger.exception(e) - return - - alive = kill_process_list(processes, signal.SIGTERM, time_to_die, logger) - - if alive: - # the processes survive SIGTERM so try to kill them by SIGKILL - alive = kill_process_list(alive, signal.SIGKILL, time_to_die, logger) - if alive: - for p in alive: - logger.error("Process %s cannot be killed.", p.pid) - - -def kill_process_list(processes, sig, time_to_die, logger): - def on_kill(proc): - logger.info("process %s is killed, exit code %s", proc.pid, proc.returncode) - - for p in processes: - kill_process(p, sig, logger) - - try: - gone, alive = psutil.wait_procs(processes, timeout=time_to_die, callback=on_kill) - except psutil.Error as e: - logger.error("error to wait the processes to terminate.") - logger.exception(e) - alive = processes - return alive - - -def kill_process(process, sig, logger): - """ - kill a process by sending signal. - - :param process: process to kill - :param sig: the signal - :param logger: logger handler - """ - try: - logger.info("kill process %s by sending %s", process.pid, sig) - os.kill(process.pid, sig) - except Exception as e: - logger.error("error to send %s to process %s.", sig, process.pid) - logger.exception(e) - - -def run_cmd(cmd, logger): - """ - Runs a given command and returns its output. If exceptions occur and the command process is still running. - The command process and all its subprocesses will be terminated in best effort. - - :param cmd: the command to run - :param logger: logger handler - :return the output of the command - """ - proc = subprocess.Popen(["/bin/bash", "-c", cmd], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - lines = [] - try: - while True: - line = proc.stdout.readline() - if not line: - break - line = line.encode("UTF-8").strip() - logger.info("output from command [%s] : %s", cmd, line) - lines.append(line) - proc.wait() - if proc.returncode: - logger.error("failed to run command %s, error code is %s", cmd, proc.returncode) - finally: - if proc.poll() is None: - # the process is till running and terminate it before exit - logger.error("process %s is not completed and will terminate it before exit.", proc.pid) - kill_process_tree(proc.pid, 2, logger) - - return lines - - -def setup_logging(): - logger = multiprocessing.get_logger() - if len(logger.handlers) == 0: - handler = logging.StreamHandler(sys.stdout) - formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s:%(lineno)s - %(message)s") - handler.setFormatter(formatter) - logger.addHandler(handler) - logger.setLevel(logging.INFO) - - -size_defs={'B':1, 'K':1024, 'M':1024**2, 'G':1024**3, 'T':1024**4, 'b':1, 'k':1024, 'm':1024**2, 'g':1024**3, 't':1024**4} -def calculate_size(size_str): - size_search = re.search(r"[BbKkMmGgTt]", size_str) - return float(size_str[0:size_search.start()]) * size_defs[size_search.group()] \ No newline at end of file diff --git a/src/cleaner/utils/logger.py b/src/cleaner/utils/logger.py deleted file mode 100644 index ba64b20a60..0000000000 --- a/src/cleaner/utils/logger.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import multiprocessing - - -class LoggerMixin(object): - """ - This mixin is to add a logger property conveniently to classes derived from it. - The usage is like: - - class A(LoggerMixin): - def do_something(): - self.logger().info("log message") - """ - - @property - def logger(self): - try: - if self._logger is None: - self._logger = self._get_logger() - except AttributeError: - self._logger = self._get_logger() - return self._logger - - def _get_logger(self): - return multiprocessing.get_logger().getChild(".".join([self.__class__.__module__, self.__class__.__name__])) diff --git a/src/cleaner/utils/timer.py b/src/cleaner/utils/timer.py deleted file mode 100644 index 9f027cf81b..0000000000 --- a/src/cleaner/utils/timer.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import signal -import time -from datetime import timedelta -from cleaner.utils.logger import LoggerMixin - - -class Timeout(Exception): - pass - - -class CountdownTimer(LoggerMixin): - """ - This class is to set a countdown with the given time. It will raise exceptions when the time is out. - """ - - def __init__(self, duration=timedelta(hours=1), name="countdown_timer"): - self.duration_in_seconds = int(duration.total_seconds()) if duration else 0 - self.name = name - self.enter_time = 0 - - def __enter__(self): - if self.duration_in_seconds == 0: - return - - try: - signal.signal(signal.SIGALRM, self.on_alarm) - signal.alarm(self.duration_in_seconds) - self.logger.info("setup countdown timer %s with duration %d" % (self.name, self.duration_in_seconds)) - self.enter_time = time.time() - except ValueError as e: - self.logger.error("Failed to setup countdown timer %s", self.name) - self.logger.exception(e) - - def __exit__(self, type, value, traceback): - if self.duration_in_seconds == 0: - return - - try: - signal.alarm(0) - self.logger.info("exit the countdown timer %s after %d seconds" % (self.name, time.time() - self.enter_time)) - except ValueError as e: - self.logger.error("Failed to setup countdown time %s", self.name) - self.logger.exception(e) - - def on_alarm(self, signum, frame): - self.logger.error("%s : the maximum time duration %d reached and will exit.", self.name, self.duration_in_seconds) - raise Timeout() diff --git a/src/cleaner/worker.py b/src/cleaner/worker.py deleted file mode 100644 index 9d67cc48a7..0000000000 --- a/src/cleaner/worker.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -from cleaner.utils.logger import LoggerMixin -from cleaner.utils.timer import CountdownTimer, Timeout -import multiprocessing -import time -from datetime import timedelta - - -class Worker(LoggerMixin, multiprocessing.Process): - - def __init__(self, method, arg, timeout=timedelta(hours=1), long_run=True, cool_down_time=2): - super(Worker, self).__init__() - self.method = method - self.timeout = timeout - self.long_run = long_run - self.cool_down_time = cool_down_time - self.arg = arg - - def _exec(self): - exc = None - method_name = self.method.__name__ - try: - self.logger.info("start to execute method %s.", method_name) - with CountdownTimer(duration=self.timeout): - self.method(self.arg) - except Timeout as e: - self.logger.error("command %s timeout.", method_name) - exc = e - except Exception as e: - self.logger.error("unexpected error to run method %s.", method_name) - exc = e - - if exc is not None: - self.logger.exception(exc) - - def run(self): - if self.method is None: - self.logger.error("cannot start worker with empty method.") - return - - if self.long_run and self.cool_down_time <= 0: - self.cool_down_time = 1 - self.logger.warn("input cool down time should be positive, will use value %d.", self.cool_down_time) - - if self.long_run: - while True: - # allow a delay before the cleaning - time.sleep(self.cool_down_time) - self._exec() - else: - self._exec() diff --git a/src/drivers/build/clean.sh b/src/drivers/build/clean.sh deleted file mode 100755 index 66f1196aed..0000000000 --- a/src/drivers/build/clean.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -set -e - -if [ -f /etc/docker/daemon.json ] ; then - cat /etc/docker/daemon.json | jq 'del(."default-runtime")' | jq 'del(.runtimes.nvidia)' > tmp - mv tmp /etc/docker/daemon.json - pkill -SIGHUP dockerd -fi - -touch /finished - -while true; do sleep 3600; done diff --git a/src/drivers/build/config-docker-runtime.sh b/src/drivers/build/config-docker-runtime.sh deleted file mode 100755 index c71a4f7078..0000000000 --- a/src/drivers/build/config-docker-runtime.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -x - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -CONFIG_RUNTIME=false - -if [ "$#" -eq "1" -a "$1" == "--config-runtime" ] ; then - CONFIG_RUNTIME=true -fi - -echo CONFIG_RUNTIME is $CONFIG_RUNTIME - -function configDockerRuntime { - cp /etc/docker/daemon.json /etc/docker/daemon.json.before_config_runtime - - jq -s '.[0] * .[1]' docker-config-with-nvidia-runtime.json /etc/docker/daemon.json > tmp - mv tmp /etc/docker/daemon.json - - pkill -SIGHUP dockerd -} - -function dockerRuntimeConfigured { - cat /etc/docker/daemon.json | jq -e 'has("default-runtime")' &> /dev/null - return $? -} - -if test $CONFIG_RUNTIME == "true" && ! dockerRuntimeConfigured ; then - configDockerRuntime -fi diff --git a/src/drivers/build/docker-config-with-nvidia-runtime.json b/src/drivers/build/docker-config-with-nvidia-runtime.json deleted file mode 100644 index e5f5dc65e2..0000000000 --- a/src/drivers/build/docker-config-with-nvidia-runtime.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "default-runtime": "nvidia", - "runtimes": { - "nvidia": { - "path": "/usr/bin/nvidia-container-runtime", - "runtimeArgs": [] - } - } -} diff --git a/src/drivers/build/drivers-384.111.yarn.dockerfile b/src/drivers/build/drivers-384.111.yarn.dockerfile deleted file mode 100644 index a6f6de2fb7..0000000000 --- a/src/drivers/build/drivers-384.111.yarn.dockerfile +++ /dev/null @@ -1,142 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -FROM nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04 - -ENV STAGE_DIR=/root/drivers \ - PYTHONPATH=/modules - -RUN apt-get -y update && \ - apt-get -y install \ - build-essential \ - gcc \ - pciutils \ - bind9-host \ - bc \ - libssl-dev \ - sudo \ - dkms \ - net-tools \ - iproute2 \ - software-properties-common \ - git \ - vim \ - wget \ - curl \ - make \ - jq \ - psmisc \ - python \ - python-dev \ - python-yaml \ - python-jinja2 \ - python-urllib3 \ - python-tz \ - python-nose \ - python-prettytable \ - python-netifaces \ - python-pip \ - realpath \ - gawk \ - module-init-tools \ - # For MLNX OFED - ethtool \ - lsof \ - python-libxml2 \ - quilt \ - libltdl-dev \ - dpatch \ - autotools-dev \ - graphviz \ - autoconf \ - chrpath \ - swig \ - automake \ - tk8.4 \ - tcl8.4 \ - libgfortran3 \ - tcl \ - gfortran \ - libnl-3-200 \ - libnl-3-dev \ - libnl-route-3-200 \ - libnl-route-3-dev \ - libcr-dev \ - libcr0 \ - pkg-config \ - flex \ - debhelper \ - bison \ - tk \ - libelf-dev \ - libaudit-dev \ - libslang2-dev \ - libgtk2.0-dev \ - libperl-dev \ - liblzma-dev \ - libnuma-dev \ - libglib2.0-dev \ - libnuma1 \ - libtool \ - libdw-dev \ - libiberty-dev \ - libunwind8-dev \ - binutils-dev && \ - pip install subprocess32 && \ - add-apt-repository -y ppa:ubuntu-toolchain-r/test && \ - apt-get -y update && \ - apt-get -y install g++-4.9 && \ - mkdir -p $STAGE_DIR - -WORKDIR $STAGE_DIR - -ENV NVIDIA_VERSION=384.111 \ - OFED_VERSION=4.2-1.2.0.0 \ - OS_VERSION=ubuntu16.04 \ - ARCHITECTURE=x86_64 - -ENV MLNX_OFED_STRING=MLNX_OFED_LINUX-${OFED_VERSION}-${OS_VERSION}-${ARCHITECTURE} - -RUN wget --no-verbose http://us.download.nvidia.com/XFree86/Linux-x86_64/$NVIDIA_VERSION/NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run && \ - chmod 750 ./NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run && \ - ./NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run --extract-only && \ - rm ./NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run - -RUN echo "wget -q -O - http://www.mellanox.com/downloads/ofed/MLNX_OFED-$OFED_VERSION/$MLNX_OFED_STRING.tgz | tar xzf -" && \ - wget -q -O - http://www.mellanox.com/downloads/ofed/MLNX_OFED-$OFED_VERSION/$MLNX_OFED_STRING.tgz | tar xzf - && \ - echo "wget -q -O - http://www.mellanox.com/downloads/ofed/nvidia-peer-memory_1.0.5.tar.gz | tar xzf -" && \ - wget -q -O - http://www.mellanox.com/downloads/ofed/nvidia-peer-memory_1.0.5.tar.gz | tar xzf - && \ - git clone https://github.com/NVIDIA/gdrcopy.git - -RUN cd $MLNX_OFED_STRING/DEBS && \ - for dep in libibverbs1 libibverbs-dev ibverbs-utils libmlx4-1 libmlx5-1 librdmacm1 librdmacm-dev libibumad libibumad-devel libibmad libibmad-devel libopensm infiniband-diags mlnx-ofed-kernel-utils; do \ - dpkg -i $dep\_*_amd64.deb && \ - dpkg --contents $dep\_*_amd64.deb | while read i; do \ - src="/$(echo $i | cut -f6 -d' ')" && \ - dst="$STAGE_DIR/$MLNX_OFED_STRING/usermode$(echo $src | sed -e 's/\.\/usr//' | sed -e 's/\.\//\//')" && \ - (([ -d $src ] && mkdir -p $dst) || \ - ([ -h $src ] && cd $(dirname $dst) && ln -s -f $(echo $i | cut -f8 -d' ') $(basename $dst) && cd $STAGE_DIR/$MLNX_OFED_STRING/DEBS) || \ - ([ -f $src ] && cp $src $dst) \ - ); \ - done; \ - done - - -COPY build/* $STAGE_DIR/ -RUN chmod a+x enable-nvidia-persistenced-mode.sh install-all-drivers install-gdr-drivers install-ib-drivers install-nvidia-drivers - -CMD /bin/bash install-all-drivers diff --git a/src/drivers/build/drivers-390.25.yarn.dockerfile b/src/drivers/build/drivers-390.25.yarn.dockerfile deleted file mode 100644 index 7d56887ada..0000000000 --- a/src/drivers/build/drivers-390.25.yarn.dockerfile +++ /dev/null @@ -1,141 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -FROM nvidia/cuda:9.1-cudnn7-devel-ubuntu16.04 - -ENV STAGE_DIR=/root/drivers \ - PYTHONPATH=/modules - -RUN apt-get -y update && \ - apt-get -y install \ - build-essential \ - gcc \ - g++ \ - binutils \ - pciutils \ - bind9-host \ - bc \ - sudo \ - dkms \ - net-tools \ - iproute2 \ - libssl-dev \ - software-properties-common \ - git \ - vim \ - wget \ - curl \ - make \ - jq \ - psmisc \ - python \ - python-dev \ - python-yaml \ - python-jinja2 \ - python-urllib3 \ - python-tz \ - python-nose \ - python-prettytable \ - python-netifaces \ - python-pip \ - realpath \ - gawk \ - module-init-tools \ - # For MLNX OFED - ethtool \ - lsof \ - python-libxml2 \ - quilt \ - libltdl-dev \ - dpatch \ - autotools-dev \ - graphviz \ - autoconf \ - chrpath \ - swig \ - automake \ - tk8.4 \ - tcl8.4 \ - libgfortran3 \ - tcl \ - gfortran \ - libnl-3-200 \ - libnl-3-dev \ - libnl-route-3-200 \ - libnl-route-3-dev \ - libcr-dev \ - libcr0 \ - pkg-config \ - flex \ - debhelper \ - bison \ - tk \ - libelf-dev \ - libaudit-dev \ - libslang2-dev \ - libgtk2.0-dev \ - libperl-dev \ - liblzma-dev \ - libnuma-dev \ - libglib2.0-dev \ - libnuma1 \ - libtool \ - libdw-dev \ - libiberty-dev \ - libunwind8-dev \ - binutils-dev && \ - pip install subprocess32 && \ - add-apt-repository -y ppa:ubuntu-toolchain-r/test && \ - mkdir -p $STAGE_DIR - -WORKDIR $STAGE_DIR - -ENV NVIDIA_VERSION=390.25 \ - OFED_VERSION=4.2-1.2.0.0 \ - OS_VERSION=ubuntu16.04 \ - ARCHITECTURE=x86_64 - -ENV MLNX_OFED_STRING=MLNX_OFED_LINUX-${OFED_VERSION}-${OS_VERSION}-${ARCHITECTURE} - -RUN wget --no-verbose http://us.download.nvidia.com/XFree86/Linux-x86_64/$NVIDIA_VERSION/NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run && \ - chmod 750 ./NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run && \ - ./NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run --extract-only && \ - rm ./NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run - -RUN echo "wget -q -O - http://www.mellanox.com/downloads/ofed/MLNX_OFED-$OFED_VERSION/$MLNX_OFED_STRING.tgz | tar xzf -" && \ - wget -q -O - http://www.mellanox.com/downloads/ofed/MLNX_OFED-$OFED_VERSION/$MLNX_OFED_STRING.tgz | tar xzf - && \ - echo "wget -q -O - http://www.mellanox.com/downloads/ofed/nvidia-peer-memory_1.0.5.tar.gz | tar xzf -" && \ - wget -q -O - http://www.mellanox.com/downloads/ofed/nvidia-peer-memory_1.0.5.tar.gz | tar xzf - && \ - git clone https://github.com/NVIDIA/gdrcopy.git - -RUN cd $MLNX_OFED_STRING/DEBS && \ - for dep in libibverbs1 libibverbs-dev ibverbs-utils libmlx4-1 libmlx5-1 librdmacm1 librdmacm-dev libibumad libibumad-devel libibmad libibmad-devel libopensm infiniband-diags mlnx-ofed-kernel-utils; do \ - dpkg -i $dep\_*_amd64.deb && \ - dpkg --contents $dep\_*_amd64.deb | while read i; do \ - src="/$(echo $i | cut -f6 -d' ')" && \ - dst="$STAGE_DIR/$MLNX_OFED_STRING/usermode$(echo $src | sed -e 's/\.\/usr//' | sed -e 's/\.\//\//')" && \ - (([ -d $src ] && mkdir -p $dst) || \ - ([ -h $src ] && cd $(dirname $dst) && ln -s -f $(echo $i | cut -f8 -d' ') $(basename $dst) && cd $STAGE_DIR/$MLNX_OFED_STRING/DEBS) || \ - ([ -f $src ] && cp $src $dst) \ - ); \ - done; \ - done - -COPY build/* $STAGE_DIR/ -RUN chmod a+x enable-nvidia-persistenced-mode.sh install-all-drivers install-gdr-drivers install-ib-drivers install-nvidia-drivers - -CMD /bin/bash install-all-drivers diff --git a/src/drivers/build/drivers-410.73.yarn.dockerfile b/src/drivers/build/drivers-410.73.yarn.dockerfile deleted file mode 100644 index 65901969ed..0000000000 --- a/src/drivers/build/drivers-410.73.yarn.dockerfile +++ /dev/null @@ -1,141 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -FROM nvidia/cuda:9.1-cudnn7-devel-ubuntu16.04 - -ENV STAGE_DIR=/root/drivers \ - PYTHONPATH=/modules - -RUN apt-get -y update && \ - apt-get -y install \ - build-essential \ - gcc \ - g++ \ - binutils \ - pciutils \ - bind9-host \ - bc \ - libssl-dev \ - sudo \ - dkms \ - net-tools \ - iproute2 \ - software-properties-common \ - git \ - vim \ - wget \ - curl \ - make \ - jq \ - psmisc \ - python \ - python-dev \ - python-yaml \ - python-jinja2 \ - python-urllib3 \ - python-tz \ - python-nose \ - python-prettytable \ - python-netifaces \ - python-pip \ - realpath \ - gawk \ - module-init-tools \ - # For MLNX OFED - ethtool \ - lsof \ - python-libxml2 \ - quilt \ - libltdl-dev \ - dpatch \ - autotools-dev \ - graphviz \ - autoconf \ - chrpath \ - swig \ - automake \ - tk8.4 \ - tcl8.4 \ - libgfortran3 \ - tcl \ - gfortran \ - libnl-3-200 \ - libnl-3-dev \ - libnl-route-3-200 \ - libnl-route-3-dev \ - libcr-dev \ - libcr0 \ - pkg-config \ - flex \ - debhelper \ - bison \ - tk \ - libelf-dev \ - libaudit-dev \ - libslang2-dev \ - libgtk2.0-dev \ - libperl-dev \ - liblzma-dev \ - libnuma-dev \ - libglib2.0-dev \ - libnuma1 \ - libtool \ - libdw-dev \ - libiberty-dev \ - libunwind8-dev \ - binutils-dev && \ - pip install subprocess32 && \ - add-apt-repository -y ppa:ubuntu-toolchain-r/test && \ - mkdir -p $STAGE_DIR - -WORKDIR $STAGE_DIR - -ENV NVIDIA_VERSION=410.73 \ - OFED_VERSION=4.2-1.2.0.0 \ - OS_VERSION=ubuntu16.04 \ - ARCHITECTURE=x86_64 - -ENV MLNX_OFED_STRING=MLNX_OFED_LINUX-${OFED_VERSION}-${OS_VERSION}-${ARCHITECTURE} - -RUN wget --no-verbose http://us.download.nvidia.com/XFree86/Linux-x86_64/$NVIDIA_VERSION/NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run && \ - chmod 750 ./NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run && \ - ./NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run --extract-only && \ - rm ./NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run - -RUN echo "wget -q -O - http://www.mellanox.com/downloads/ofed/MLNX_OFED-$OFED_VERSION/$MLNX_OFED_STRING.tgz | tar xzf -" && \ - wget -q -O - http://www.mellanox.com/downloads/ofed/MLNX_OFED-$OFED_VERSION/$MLNX_OFED_STRING.tgz | tar xzf - && \ - echo "wget -q -O - http://www.mellanox.com/downloads/ofed/nvidia-peer-memory_1.0.5.tar.gz | tar xzf -" && \ - wget -q -O - http://www.mellanox.com/downloads/ofed/nvidia-peer-memory_1.0.5.tar.gz | tar xzf - && \ - git clone https://github.com/NVIDIA/gdrcopy.git - -RUN cd $MLNX_OFED_STRING/DEBS && \ - for dep in libibverbs1 libibverbs-dev ibverbs-utils libmlx4-1 libmlx5-1 librdmacm1 librdmacm-dev libibumad libibumad-devel libibmad libibmad-devel libopensm infiniband-diags mlnx-ofed-kernel-utils; do \ - dpkg -i $dep\_*_amd64.deb && \ - dpkg --contents $dep\_*_amd64.deb | while read i; do \ - src="/$(echo $i | cut -f6 -d' ')" && \ - dst="$STAGE_DIR/$MLNX_OFED_STRING/usermode$(echo $src | sed -e 's/\.\/usr//' | sed -e 's/\.\//\//')" && \ - (([ -d $src ] && mkdir -p $dst) || \ - ([ -h $src ] && cd $(dirname $dst) && ln -s -f $(echo $i | cut -f8 -d' ') $(basename $dst) && cd $STAGE_DIR/$MLNX_OFED_STRING/DEBS) || \ - ([ -f $src ] && cp $src $dst) \ - ); \ - done; \ - done - -COPY build/* $STAGE_DIR/ -RUN chmod a+x enable-nvidia-persistenced-mode.sh install-all-drivers install-gdr-drivers install-ib-drivers install-nvidia-drivers - -CMD /bin/bash install-all-drivers diff --git a/src/drivers/build/drivers-418.56.yarn.dockerfile b/src/drivers/build/drivers-418.56.yarn.dockerfile deleted file mode 100644 index d47fc46d7c..0000000000 --- a/src/drivers/build/drivers-418.56.yarn.dockerfile +++ /dev/null @@ -1,141 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -FROM nvidia/cuda:9.1-cudnn7-devel-ubuntu16.04 - -ENV STAGE_DIR=/root/drivers \ - PYTHONPATH=/modules - -RUN apt-get -y update && \ - apt-get -y install \ - build-essential \ - gcc \ - g++ \ - binutils \ - pciutils \ - bind9-host \ - bc \ - libssl-dev \ - sudo \ - dkms \ - net-tools \ - iproute2 \ - software-properties-common \ - git \ - vim \ - wget \ - curl \ - make \ - jq \ - psmisc \ - python \ - python-dev \ - python-yaml \ - python-jinja2 \ - python-urllib3 \ - python-tz \ - python-nose \ - python-prettytable \ - python-netifaces \ - python-pip \ - realpath \ - gawk \ - module-init-tools \ - # For MLNX OFED - ethtool \ - lsof \ - python-libxml2 \ - quilt \ - libltdl-dev \ - dpatch \ - autotools-dev \ - graphviz \ - autoconf \ - chrpath \ - swig \ - automake \ - tk8.4 \ - tcl8.4 \ - libgfortran3 \ - tcl \ - gfortran \ - libnl-3-200 \ - libnl-3-dev \ - libnl-route-3-200 \ - libnl-route-3-dev \ - libcr-dev \ - libcr0 \ - pkg-config \ - flex \ - debhelper \ - bison \ - tk \ - libelf-dev \ - libaudit-dev \ - libslang2-dev \ - libgtk2.0-dev \ - libperl-dev \ - liblzma-dev \ - libnuma-dev \ - libglib2.0-dev \ - libnuma1 \ - libtool \ - libdw-dev \ - libiberty-dev \ - libunwind8-dev \ - binutils-dev && \ - pip install subprocess32 && \ - add-apt-repository -y ppa:ubuntu-toolchain-r/test && \ - mkdir -p $STAGE_DIR - -WORKDIR $STAGE_DIR - -ENV NVIDIA_VERSION=418.56 \ - OFED_VERSION=4.2-1.2.0.0 \ - OS_VERSION=ubuntu16.04 \ - ARCHITECTURE=x86_64 - -ENV MLNX_OFED_STRING=MLNX_OFED_LINUX-${OFED_VERSION}-${OS_VERSION}-${ARCHITECTURE} - -RUN wget --no-verbose http://us.download.nvidia.com/XFree86/Linux-x86_64/$NVIDIA_VERSION/NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run && \ - chmod 750 ./NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run && \ - ./NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run --extract-only && \ - rm ./NVIDIA-Linux-x86_64-$NVIDIA_VERSION.run - -RUN echo "wget -q -O - http://www.mellanox.com/downloads/ofed/MLNX_OFED-$OFED_VERSION/$MLNX_OFED_STRING.tgz | tar xzf -" && \ - wget -q -O - http://www.mellanox.com/downloads/ofed/MLNX_OFED-$OFED_VERSION/$MLNX_OFED_STRING.tgz | tar xzf - && \ - echo "wget -q -O - http://www.mellanox.com/downloads/ofed/nvidia-peer-memory_1.0.5.tar.gz | tar xzf -" && \ - wget -q -O - http://www.mellanox.com/downloads/ofed/nvidia-peer-memory_1.0.5.tar.gz | tar xzf - && \ - git clone https://github.com/NVIDIA/gdrcopy.git - -RUN cd $MLNX_OFED_STRING/DEBS && \ - for dep in libibverbs1 libibverbs-dev ibverbs-utils libmlx4-1 libmlx5-1 librdmacm1 librdmacm-dev libibumad libibumad-devel libibmad libibmad-devel libopensm infiniband-diags mlnx-ofed-kernel-utils; do \ - dpkg -i $dep\_*_amd64.deb && \ - dpkg --contents $dep\_*_amd64.deb | while read i; do \ - src="/$(echo $i | cut -f6 -d' ')" && \ - dst="$STAGE_DIR/$MLNX_OFED_STRING/usermode$(echo $src | sed -e 's/\.\/usr//' | sed -e 's/\.\//\//')" && \ - (([ -d $src ] && mkdir -p $dst) || \ - ([ -h $src ] && cd $(dirname $dst) && ln -s -f $(echo $i | cut -f8 -d' ') $(basename $dst) && cd $STAGE_DIR/$MLNX_OFED_STRING/DEBS) || \ - ([ -f $src ] && cp $src $dst) \ - ); \ - done; \ - done - -COPY build/* $STAGE_DIR/ -RUN chmod a+x enable-nvidia-persistenced-mode.sh install-all-drivers install-gdr-drivers install-ib-drivers install-nvidia-drivers - -CMD /bin/bash install-all-drivers diff --git a/src/drivers/build/enable-nvidia-persistenced-mode.sh b/src/drivers/build/enable-nvidia-persistenced-mode.sh deleted file mode 100755 index 1f4dc8bab5..0000000000 --- a/src/drivers/build/enable-nvidia-persistenced-mode.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -echo === Enable nvidia persistenced mode -nvidia-persistenced --persistence-mode || exit $? - -echo === Recall nvidia-smi -nvidia-smi || exit $? - -echo === Persistence-mode enabled \ No newline at end of file diff --git a/src/drivers/build/install-all-drivers b/src/drivers/build/install-all-drivers deleted file mode 100755 index 14b7505405..0000000000 --- a/src/drivers/build/install-all-drivers +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -export MLNX_PREFIX=/var/drivers/mellanox/$MLNX_OFED_STRING/usermode -export NV_DRIVER=${DRIVER_PATH}/$NVIDIA_VERSION -export LIBRARY_PATH=${LIBRARY_PATH:+$LIBRARY_PATH:}${MLNX_PREFIX}/lib -export LD_LIBRARY_PATH=${MLNX_PREFIX}/lib:$LD_LIBRARY_PATH:$NV_DRIVER/lib:$NV_DRIVER/lib64:/usr/local/cuda/lib64 -export PATH=${MLNX_PREFIX}/bin:$PATH:$NV_DRIVER/bin -export C_INCLUDE_PATH=${C_INCLUDE_PATH:+$C_INCLUDE_PATH:}${MLNX_PREFIX}/include:${MLNX_PREFIX}/include/infiniband -export CPLUS_INCLUDE_PATH=${CPLUS_INCLUDE_PATH:+$CPLUS_INCLUDE_PATH:}${MLNX_PREFIX}/include:${MLNX_PREFIX}/include/infiniband - -if lspci | grep -qE "[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F].[0-9] (3D|VGA compatible) controller: NVIDIA Corporation.*"; then - if [ -f "$PRE_INSTALLED_NV_DRIVER_PATH/bin/nvidia-smi" ]; then - ls -a $PRE_INSTALLED_NV_DRIVER_PATH - echo pre installed nvidia driver detectived, skip driver installation - rm -f $DRIVER_PATH/current # remove pre-exist link - mkdir -p $DRIVER_PATH - ln -s $PRE_INSTALLED_NV_DRIVER_PATH $DRIVER_PATH/current - else - /bin/bash -x install-nvidia-drivers || exit $? - echo NVIDIA gpu detected, drivers installed - - /bin/bash enable-nvidia-persistenced-mode.sh || exit $? - fi - - ./config-docker-runtime.sh "$@" -else - echo NVIDIA gpu not detected, skipping driver installation -fi - -if [[ -n ${ENABLE_IB} ]]; then - if lspci | grep -qE '(Network|Infiniband) controller.*Mellanox.*ConnectX'; then - echo Infiniband hardware detected - # Installing InfiniBand drivers and GPU direct RDMA drivers - ./install-ib-drivers || exit $? - echo Infiniband drivers is installed successfully. - else - echo Infiniband hardware is not detected, skipping driver installation - fi -else - echo "Depending on configuration, the variable ENABLE_IB is not set. So the ib installation will be skipped!" -fi - - - -mkdir -p /jobstatus -touch /jobstatus/jobok - -while true; do sleep 1000; done diff --git a/src/drivers/build/install-gdr-drivers b/src/drivers/build/install-gdr-drivers deleted file mode 100644 index 238f9ab0be..0000000000 --- a/src/drivers/build/install-gdr-drivers +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash -x - -# Recognize InfiniBand supported network card -lspci | grep -qE '(Network|Infiniband) controller.*Mellanox.*ConnectX' || -{ - echo ======== No IB present, exit early ========= - exit 1 -} - -[[ -L ${DRIVER_PATH}/current ]] || -{ - echo ======== No NVIDIA drivers found ========= - exit 1 -} - -# This script installs GPU direct RDMA drivers -KERNEL_FULL_VERSION=`uname -r` -export DESTDIR=/root/gdr-module/build -export DEPMOD=depmod - -# Make sure that GPU driver kernel sources are available in /usr/src -[[ -e /usr/src/nvidia-$NVIDIA_VERSION ]] || -{ - cp -r /root/drivers/NVIDIA-Linux-x86_64-$NVIDIA_VERSION/kernel /usr/src/nvidia-$NVIDIA_VERSION || exit $? -} - -# Install nv_peer_mem kernel module used in OpenMPI -lsmod | grep -qE "^nv_peer_mem" || -{ - cd nvidia-peer-memory-1.0 || exit $? - make clean || exit $? - make all install || exit $? - insmod $DESTDIR/lib/modules/$KERNEL_FULL_VERSION/extra/nv_peer_mem.ko || exit $? - cd .. || exit $? -} - -# Install gdrcopy kernel module used in MVAPICH2 -lsmod | grep -qE "^gdrdrv" || -{ - cd gdrcopy || exit $? - make clean || exit $? - mkdir -p ${DRIVER_PATH}/current/include || exit $? - make PREFIX=${DRIVER_PATH}/current all install || exit $? - ./insmod.sh || exit $? - ./validate || exit $? - ./copybw || exit $? - cd .. || exit $? -} diff --git a/src/drivers/build/install-ib-drivers b/src/drivers/build/install-ib-drivers deleted file mode 100644 index 0b7232aeb8..0000000000 --- a/src/drivers/build/install-ib-drivers +++ /dev/null @@ -1,169 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -# Recognize InfiniBand supported network card -lspci | grep -qE '(Network|Infiniband) controller.*Mellanox.*ConnectX' || -{ - echo ======== No IB present, exit early ========= - exit 1 -} - -# This script is used for installation of InfiniBand drivers -KERNEL_FULL_VERSION=`uname -r` - -HOSTNAME=`hostname` -# HACK: using last octet of the host's IP -LAST_OCTET=`host $HOSTNAME | head -n1 | sed 's/^.*\.//'` -echo POD_IP: ${POD_IP} -OCT1=33 -echo OCT1: $OCT1 -OCT2=`echo ${POD_IP} | awk -F'.' '{ print $(NF) }'` -echo OCT1: $OCT2 -IP_ADDRESS="192.168.${OCT1}.${OCT2}" - -echo IB_ADDRESS: $IP_ADDRESS - -CURRENT_DRIVER=/var/drivers/mellanox/current - -if [[ ! -f /var/drivers/mellanox/$MLNX_OFED_STRING/mlnxofedinstall ]]; then - [[ -f /tmp/$MLNX_OFED_STRING-ext.tgz ]] || - { - ./$MLNX_OFED_STRING/mlnx_add_kernel_support.sh -y -m ./$MLNX_OFED_STRING --make-tgz || exit $? - } - mkdir -p /var/drivers/mellanox/$MLNX_OFED_STRING || exit $? - tar -xvf /tmp/$MLNX_OFED_STRING-ext.tgz -C /var/drivers/mellanox/$MLNX_OFED_STRING --strip 1 || exit $? - [[ -L $CURRENT_DRIVER ]] && - { - rm -f $CURRENT_DRIVER || exit $? - } - ln -s -f /var/drivers/mellanox/$MLNX_OFED_STRING $CURRENT_DRIVER || exit $? -fi - -function ibPresent { - # Check that at least one IP address is up for IB - ip a | grep "state UP" -A 2 | grep -q $IP_ADDRESS || return 1 - # Make sure that the devices are configured in connected mode. See below. - cat /sys/class/net/ib*/mode | grep -q datagram && echo 7 - lsmod | grep -qE "^mlx[4-5]_ib" || return 2 - [[ -e /dev/infiniband/rdma_cm ]] || return 3 - lsmod | grep -qE "^nv_peer_mem" || return 4 - lsmod | grep -qE "^gdrdrv" || return 5 - grep -q "$HOSTNAME" /sys/class/infiniband/mlx?_?/node_desc || return 6 - return 0 -} - -echo ======== If IB present exit early ========= -ibPresent && -{ - # Install only user mode diagnostic components of Mellanox drivers - echo "====== Installing Infiniband drivers (diag components only) ======" - pushd $CURRENT_DRIVER || exit $? - echo "infiniband-diags=y" > /tmp/ibdiag.conf || exit $? - ./mlnxofedinstall --force --without-dkms --without-fw-update -c /tmp/ibdiag.conf || exit $? - popd - ibstat || exit $? - exit 0 -} - -# The following lines uninstall inbox network drivers and install -# Mellanox OFED drivers, which are more reliable and have better tools. -echo ====== Installing Infiniband drivers ====== - -# If we had incorrect install last time, first remove ib's -for iface in `ifconfig 2>/dev/null | grep -oE "ib[0-9]" | xargs` -do - ifconfig $iface down || exit $? -done - -# Then remove nv_peer_mem -lsmod | grep -qE "^nv_peer_mem" && -{ - rmmod nv_peer_mem || exit $? -} - -# Then gdrdrv -lsmod | grep -qE "^gdrdrv" && -{ - rmmod gdrdrv || exit $? -} - -# Since we already prepared kernel modules above we don't need --add-kernel-support switch -pushd $CURRENT_DRIVER || exit $? -./mlnxofedinstall --force --kernel-only --without-dkms --without-fw-update --with-infiniband-diags || exit $? -popd - -# Disable enhanced ipoib -cat << EOF > /etc/modprobe.d/ib_ipoib.conf -alias netdev-ib* ib_ipoib -options ib_ipoib send_queue_size=128 recv_queue_size=128 ipoib_enhanced=0 -EOF - -/etc/init.d/openibd restart || exit $? - -# Installing GPU direct RDMA drivers -# NOTE: do this here because it takes some time to install GDR drivers -# and that's enough time for IB devices to come up so we can test them -./install-gdr-drivers || exit $? - -IB_DEVICES=`ibstat -l | xargs` - -# The ib_ipoib modules automatically creates network devices for ip assignment. We use the last 48 bytes of the hardware address -# to map the devices to their corresponding mellanox devices. -declare -A ADDRESS_MAP -for device_path in /sys/class/net/ib*; -do - address=$(cat "$device_path/address" | sed "s/://g") - ADDRESS_MAP["${address: -12}"]=${device_path: -3} -done - - -for dev in $IB_DEVICES -do - for port_path in /sys/class/infiniband/$dev/ports/* - do - if grep -q InfiniBand "$port_path/link_layer" && grep -q LinkUp "$port_path/phys_state"; then - - grep -q "$HOSTNAME" /sys/class/infiniband/$dev/node_desc || echo "$HOSTNAME" > /sys/class/infiniband/$dev/node_desc || exit $? - - # Configuring IP address for IP-over-IB interface - GID=$(cat "$port_path/gids/0" | sed "s/://g") - GID_ADDRESS=${GID: -12} - IB_INTERFACE=${ADDRESS_MAP[$GID_ADDRESS]} - IB_IP_ADDRESS="192.168.${OCT1}.${OCT2}" - echo "Assiging ip address $IB_IP_ADDRESS for $IB_INTERFACE interface" - ifconfig $IB_INTERFACE up $IB_IP_ADDRESS/24 || exit $? - grep -q "connected" /sys/class/net/$IB_INTERFACE/mode || echo "connected" > /sys/class/net/$IB_INTERFACE/mode || exit $? - grep -q "65520" /sys/class/net/$IB_INTERFACE/mtu || echo "65520" > /sys/class/net/$IB_INTERFACE/mtu || exit $? - OCT1=$((OCT1+1)) - fi - - if grep -q Ethernet "$port_path/link_layer" && grep -qE "LinkUp|Polling" "$port_path/phys_state"; then - ETH_INTERFACE=`ls /sys/class/infiniband/$dev/device/net | grep -v ib` - grep -q "1500" /sys/class/net/$ETH_INTERFACE/mtu || echo "1500" > /sys/class/net/$ETH_INTERFACE/mtu || exit $? - fi - done -done - -# Verifying whether IB is up and running by invoking ibstat. This will also print basic device/link information -ibstat || exit $? -ibdev2netdev || exit $? - -# Final check -ibPresent -echo ibPresent exit value: $? diff --git a/src/drivers/build/install-nvidia-drivers b/src/drivers/build/install-nvidia-drivers deleted file mode 100755 index 4ec5a60e28..0000000000 --- a/src/drivers/build/install-nvidia-drivers +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/bash -x - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -KERNEL_FULL_VERSION=`uname -r` -CURRENT_DRIVER=${DRIVER_PATH}/current - -function nvidiaPresent { - [[ -f /proc/driver/nvidia/version ]] || return 1 - grep -q $NVIDIA_VERSION /proc/driver/nvidia/version || return 2 - lsmod | grep -qE "^nvidia" || return 3 - lsmod | grep -qE "^nvidia_uvm" || return 3 - [[ -e /dev/nvidia0 ]] || return 4 - [[ -e ${DRIVER_PATH}/$NVIDIA_VERSION/lib64/libnvidia-ml.so ]] || return 5 - - [[ -e /etc/ld.so.conf.d/nvidia-drivers.conf ]] || return 6 - return 0 -} - -echo ======== If NVIDIA present exit early ========= -nvidiaPresent -if [ $? == 0 ] ; then - if [[ ! -L $CURRENT_DRIVER ]]; then - mkdir -p `dirname $CURRENT_DRIVER` - ln -s $DRIVER_PATH/$NVIDIA_VERSION $CURRENT_DRIVER - fi - exit 0 -fi - -echo ======== If NVIDIA driver already running uninstall it ========= -lsmod | grep -qE "^nvidia" && -{ - DEP_MODS=`lsmod | tr -s " " | grep -E "^nvidia" | cut -f 4 -d " "` - for mod in ${DEP_MODS//,/ } - do - rmmod $mod || - { - echo "The driver $mod is still in use, can't unload it." - exit 1 - } - done - rmmod nvidia || - { - echo "The driver nvidia is still in use, can't unload it." - exit 1 - } -} - -echo === Building and installing NVIDIA modules -# Add new directories to ld.so to make sure that the dependencies -# are properly recorded and in the ld.so cache for later discovery. -echo $NV_DRIVER/lib > /etc/ld.so.conf.d/nvidia-drivers.conf -echo $NV_DRIVER/lib64 >> /etc/ld.so.conf.d/nvidia-drivers.conf -mkdir -p $NV_DRIVER/lib $NV_DRIVER/lib64 $NV_DRIVER/bin || exit $? - -# Install NVIDIA driver user mode components to a directory -# that is mapped outside of Docker file, for easier mapping into -# user job containers afterwards. -./NVIDIA-Linux-x86_64-$NVIDIA_VERSION/nvidia-installer \ - --utility-prefix=$NV_DRIVER \ - --opengl-prefix=$NV_DRIVER \ - --x-prefix=$NV_DRIVER \ - --compat32-prefix=$NV_DRIVER \ - --opengl-libdir=lib64 \ - --utility-libdir=lib64 \ - --x-library-path=lib64 \ - --compat32-libdir=lib \ - --dkms \ - -a -s -N - -echo === Loading NVIDIA UVM module -modprobe nvidia-uvm || exit $? - -echo === Creating /dev entries -UVM_MAJOR=`grep nvidia-uvm /proc/devices | awk '{print $1}'` -FRONTEND_MAJOR=`grep nvidia-frontend /proc/devices | awk '{print $1}'` -rm -f /dev/nvidia* 2>/dev/null -mknod -m 666 /dev/nvidia-uvm c $UVM_MAJOR 0 || exit $? -mknod -m 666 /dev/nvidiactl c $FRONTEND_MAJOR 255 || exit $? -GPU_COUNT=`ls /proc/driver/nvidia/gpus | wc -l` -echo === Number of GPUS: $GPU_COUNT -for ((GPU=0; GPU<$GPU_COUNT; GPU++)); do - mknod -m 666 /dev/nvidia$GPU c $FRONTEND_MAJOR $GPU || exit $? -done - -ls -la /dev/nvidia* - -ldconfig - -echo === Check if everything is loaded -nvidiaPresent || exit $? - -echo === Checking the driver -nvidia-smi || exit $? - -echo === Updating current driver -# Remove previous soft link for current driver -[[ -L $CURRENT_DRIVER ]] && -{ - rm -f $CURRENT_DRIVER || exit $? -} - -# Remove benign issue where "current" exists as directory -[[ -d $CURRENT_DRIVER ]] && -{ - echo === Removing current driver as directory, should be soft link - rm -rf $CURRENT_DRIVER || exit $? -} - -ln -s -f $NV_DRIVER $CURRENT_DRIVER || exit $? - -[[ -L $CURRENT_DRIVER ]] || -{ - echo ======== Current drivers link not updated ========= - exit 1 -} - -echo NVIDIA driver installed successfully diff --git a/src/drivers/config/drivers.md b/src/drivers/config/drivers.md deleted file mode 100644 index 90223461a4..0000000000 --- a/src/drivers/config/drivers.md +++ /dev/null @@ -1,69 +0,0 @@ -## cluster section parser - -- [Default Configuration](#D_Config) -- [How to Configure](#HT_Config) -- [Generated Configuration](#G_Config) -- [Data Table](#T_config) - - - -#### Default configuration - -[drivers default configuration](drivers.yaml) - -#### How to configure cluster section in service-configuration.yaml - -All configurations in this section is optional. If you wanna customized these value, you can configure it in service-configuration.yaml. - -For example, if you wanna reconfigure ```drivers.set-nvidia-runtme``` with a new value. You should configure it in [service-configuration.yaml](../../../examples/cluster-configuration/services-configuration.yaml) with the yaml style as following. -```yaml -drivers: - set-nvidia-runtme: true -``` - -Or if your cluster has already installed nvidia-driver, and do not need pai to install it -again, then you can provide this info in your service-configuration.yaml like: - -```yaml -drivers: - pre-installed-nvidia-path: /path/to/your/drivers -``` - -#### Generated Configuration - -Generated configuration means the object model after parsing. The parsed data will be presented by a yaml format. -```yaml -drivers: - set-nvidia-runtme: false - version: "384.111" - pre-installed-nvidia-path: /usr/local/nvidia -``` - -#### Table - - - - - - - - - - - - - - - - - - - - - - - - - - -
        Data in Configuration FileData in Cluster Object ModelData in Jinja2 TemplateData type
        drivers.set-nvidia-runtmecom["drivers"]["set-nvidia-runtime"]cluster_cfg["drivers"]["set-nvidia-runtime"]Bool
        drivers.versioncom["drivers"]["version"]cluster_cfg["drivers"]["version"]string
        drivers.pre-installed-nvidia-pathcom["drivers"]["pre-installed-nvidia-path"]cluster_cfg["drivers"]["pre-installed-nvidia-path"]path string
        diff --git a/src/drivers/config/drivers.py b/src/drivers/config/drivers.py deleted file mode 100644 index d9d751f231..0000000000 --- a/src/drivers/config/drivers.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -import logging -import logging.config - - -class Drivers: - - def __init__(self, cluster_configuration, service_configuration, default_service_configuration): - self.logger = logging.getLogger(__name__) - - self.cluster_configuration = cluster_configuration - self.service_configuration = self.merge_service_configuration(service_configuration, default_service_configuration) - - - - def merge_service_configuration(self, overwrite_srv_cfg, default_srv_cfg): - if overwrite_srv_cfg == None: - return default_srv_cfg - srv_cfg = default_srv_cfg.copy() - for k in overwrite_srv_cfg: - v = overwrite_srv_cfg[k] - if (k in srv_cfg and isinstance(overwrite_srv_cfg[k], dict) and isinstance(srv_cfg[k], dict)): - srv_cfg[k] = self.merge_service_configuration(overwrite_srv_cfg[k], srv_cfg[k]) - else: - srv_cfg[k] = overwrite_srv_cfg[k] - return srv_cfg - - - - def validation_pre(self): - if "set-nvidia-runtime" not in self.service_configuration: - return False, "set-nvidia-runtime is miss in service-configuration -> drivers." - if self.service_configuration["set-nvidia-runtime"] not in [False, True]: - return False, "Value of set-nvidia-runtme should be false or true." - if self.service_configuration["enable-ib-installation"] not in [False, True]: - return False, "Value of enable-ib-installation should be false or true." - if "version" not in self.service_configuration: - return False, "version is miss in service-configuration -> drivers." - if self.service_configuration["version"] not in ["384.111", "390.25", "410.73", "418.56"]: - return False, "Value of version in drivers should be [384.111, 390.25, 410.73, 418.56]." - return True, None - - - - def run(self): - drivers_com = self.service_configuration - return drivers_com - - - - def validation_post(self, cluster_object_model): - return True, None - diff --git a/src/drivers/config/drivers.yaml b/src/drivers/config/drivers.yaml deleted file mode 100644 index 59c1d7e79b..0000000000 --- a/src/drivers/config/drivers.yaml +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -service_type: "yarn" - -set-nvidia-runtime: false - -# You can set drivers version here. If this value is miss, default value will be 384.111 -# Current supported version list -# 384.111 -# 390.25 -# 410.73 -# 418.56 -version: "384.111" - -pre-installed-nvidia-path: /usr/local/nvidia - -# IB driver installation will fail when VM builtin IB kernel modules into vmlinux image. -# If IB installation is needed during deployment, you can set the following field to true. -enable-ib-installation: false diff --git a/src/drivers/deploy/clean.yaml.template b/src/drivers/deploy/clean.yaml.template deleted file mode 100644 index b8b6c967fd..0000000000 --- a/src/drivers/deploy/clean.yaml.template +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: rollback-nvidia-runtime -spec: - selector: - matchLabels: - app: rollback-nvidia-runtime - template: - metadata: - labels: - app: rollback-nvidia-runtime - spec: - hostNetwork: false - hostPID: true # this is required by pkill dockerd - containers: - - name: rollback-nvidia-runtime - image: {{ cluster_cfg["cluster"]["docker-registry"]["prefix"] }}drivers-{{ cluster_cfg["drivers"]["version"] }}:{{ cluster_cfg["cluster"]["docker-registry"]["tag"] }} - imagePullPolicy: Always - securityContext: - privileged: true # this is required by pkill dockerd - command: - - sh - - -x - - clean.sh - volumeMounts: - - mountPath: /etc/docker - name: docker-config - readinessProbe: - exec: - command: - - cat - - /finished - initialDelaySeconds: 5 - periodSeconds: 3 - imagePullSecrets: - - name: {{ cluster_cfg["cluster"]['docker-registry']['secret-name'] }} - volumes: - - name: docker-config - hostPath: - path: /etc/docker diff --git a/src/drivers/deploy/delete.sh.template b/src/drivers/deploy/delete.sh.template deleted file mode 100644 index 03b54133c6..0000000000 --- a/src/drivers/deploy/delete.sh.template +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -pushd $(dirname "$0") > /dev/null - -{% if cluster_cfg["drivers"]['set-nvidia-runtime'] %} -kubectl apply --overwrite=true -f clean.yaml || exit $? - -export PYTHONPATH="../../../deployment" - -# wait until all clean finished -python -m k8sPaiLibrary.monitorTool.check_pod_ready_status -w -k app -v rollback-nvidia-runtime - -sleep 30 # SIGHUP in clean container may restart dockerd which will leads to restart of all docker containers include api server - -kubectl delete -f clean.yaml -{% endif %} - -/bin/bash stop.sh || exit $? - -popd > /dev/null diff --git a/src/drivers/deploy/drivers.yaml.template b/src/drivers/deploy/drivers.yaml.template deleted file mode 100644 index a46ae83653..0000000000 --- a/src/drivers/deploy/drivers.yaml.template +++ /dev/null @@ -1,117 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: drivers-one-shot -spec: - selector: - matchLabels: - app: drivers-one-shot - template: - metadata: - labels: - app: drivers-one-shot - spec: - hostNetwork: true - hostPID: true - containers: - - name: nvidia-drivers - image: {{ cluster_cfg["cluster"]["docker-registry"]["prefix"] }}drivers-{{ cluster_cfg["drivers"]["version"] }}:{{ cluster_cfg["cluster"]["docker-registry"]["tag"] }} - imagePullPolicy: Always - securityContext: - privileged: true - capabilities: - add: - - ALL - volumeMounts: - - mountPath: /var/drivers - name: driver-path - - mountPath: /dev - name: device-path - - mountPath: /lib/modules - name: modules-path - - mountPath: /var/log - name: drivers-log - - mountPath: /usr/src - name: kernel-head - - mountPath: /etc/ld.so.conf.d - name: etc-path-ld - - mountPath: /etc/docker - name: etc-path-docker - - mountPath: {{ cluster_cfg["drivers"]["pre-installed-nvidia-path"] }} - name: pre-install-nv-driver-path - env: - {% if cluster_cfg['drivers']['enable-ib-installation'] %} - - name: ENABLE_IB - value: "true" - {%- endif %} - - name: DRIVER_PATH - value: /var/drivers/nvidia - - name: PRE_INSTALLED_NV_DRIVER_PATH - value: /usr/local/nvidia # the path user has pre-installed nvidia driver - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - readinessProbe: - exec: - command: - - cat - - /jobstatus/jobok - initialDelaySeconds: 5 - periodSeconds: 3 - {%- if cluster_cfg['cluster']['common']['qos-switch'] == "true" %} - resources: - limits: - memory: "2Gi" - requests: - memory: "256Mi" - {%- endif %} - command: ["bash", "-x", "./install-all-drivers"] - {% if cluster_cfg['drivers']['set-nvidia-runtime'] %} - args: - - "--config-runtime" - {% endif %} - imagePullSecrets: - - name: {{ cluster_cfg["cluster"]['docker-registry']['secret-name'] }} - volumes: - - name: driver-path - hostPath: - path: /var/drivers - - name: device-path - hostPath: - path: /dev - - name: modules-path - hostPath: - path: /lib/modules - - name: drivers-log - hostPath: - path: /var/log/drivers - - name: kernel-head - hostPath: - path: /usr/src - - name: etc-path-ld - hostPath: - path: /etc/ld.so.conf.d - - name: etc-path-docker - hostPath: - path: /etc/docker - - name: pre-install-nv-driver-path - hostPath: - path: /usr/local/nvidia # TODO make it argument \ No newline at end of file diff --git a/src/drivers/deploy/refresh.sh b/src/drivers/deploy/refresh.sh deleted file mode 100644 index 8c55d2f524..0000000000 --- a/src/drivers/deploy/refresh.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -pushd $(dirname "$0") > /dev/null - - -popd > /dev/null \ No newline at end of file diff --git a/src/drivers/deploy/service.yaml b/src/drivers/deploy/service.yaml deleted file mode 100644 index f9a1fc598a..0000000000 --- a/src/drivers/deploy/service.yaml +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -cluster-type: - - yarn - -prerequisite: - - cluster-configuration - -template-list: - - drivers.yaml - - clean.yaml - - delete.sh - -# Note: your script should start all your service dependency. Make sure service has completed the starting process. -start-script: start.sh -stop-script: stop.sh -delete-script: delete.sh -refresh-script: refresh.sh -upgraded-script: upgraded.sh - - -deploy-rules: - - notin: no-drivers diff --git a/src/drivers/deploy/start.sh b/src/drivers/deploy/start.sh deleted file mode 100755 index 9893dd2701..0000000000 --- a/src/drivers/deploy/start.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -pushd $(dirname "$0") > /dev/null - - -kubectl apply --overwrite=true -f drivers.yaml || exit $? - -sleep 10 - -# wait until all drivers are ready. -PYTHONPATH="../../../deployment" python -m k8sPaiLibrary.monitorTool.check_pod_ready_status -w -k app -v drivers-one-shot || exit $? - -popd > /dev/null - diff --git a/src/drivers/deploy/stop.sh b/src/drivers/deploy/stop.sh deleted file mode 100644 index a114719379..0000000000 --- a/src/drivers/deploy/stop.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -pushd $(dirname "$0") > /dev/null - -if kubectl get daemonset | grep -q "drivers-one-shot"; then - kubectl delete ds drivers-one-shot || exit $? -fi - - -popd > /dev/null \ No newline at end of file diff --git a/src/end-to-end-test/build/end-to-end-test.yarn.dockerfile b/src/end-to-end-test/build/end-to-end-test.yarn.dockerfile deleted file mode 100644 index 14c6061a97..0000000000 --- a/src/end-to-end-test/build/end-to-end-test.yarn.dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -FROM hadoop-run - -RUN apt-get -y update && \ - apt-get -y install python git jq && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - -WORKDIR /root/end-to-end-test - -COPY etc /root/end-to-end-test/etc/ -COPY *.sh /root/end-to-end-test/ - - -RUN git clone https://github.com/sstephenson/bats.git && \ - cd bats && \ - ./install.sh /usr/local - -RUN wget http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz -RUN tar zxvf cifar-10-python.tar.gz -RUN rm cifar-10-python.tar.gz -RUN git clone -b tf_benchmark_stage https://github.com/tensorflow/benchmarks.git - -CMD ["/bin/bash", "/root/end-to-end-test/start.sh"] diff --git a/src/end-to-end-test/deploy/delete.sh b/src/end-to-end-test/deploy/delete.sh deleted file mode 100644 index d77ce6e7c2..0000000000 --- a/src/end-to-end-test/deploy/delete.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -pushd $(dirname "$0") > /dev/null - -/bin/bash stop.sh || exit $? - -popd > /dev/null \ No newline at end of file diff --git a/src/end-to-end-test/deploy/end-to-end-test.yaml.template b/src/end-to-end-test/deploy/end-to-end-test.yaml.template deleted file mode 100644 index 40f8b49e75..0000000000 --- a/src/end-to-end-test/deploy/end-to-end-test.yaml.template +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: end-to-end-test-deployment - labels: - app: end-to-end-test -spec: - replicas: 1 - selector: - matchLabels: - app: end-to-end-test - template: - metadata: - name: end-to-end-test - labels: - app: end-to-end-test - spec: - hostNetwork: false - hostPID: false - containers: - - name: end-to-end-test - image: {{ cluster_cfg["cluster"]["docker-registry"]["prefix"] }}end-to-end-test:{{ cluster_cfg["cluster"]["docker-registry"]["tag"] }} - imagePullPolicy: Always - env: - - name: HDFS_URI - value: hdfs://{{ cluster_cfg['hadoop-name-node']['master-ip'] }}:9000 - - name: WEBSERVICE_URI - value: {{ cluster_cfg['yarn-frameworklauncher']['webservice'] }} - - name: REST_SERVER_URI - value: {{ cluster_cfg['rest-server']['uri'] }} - - name: TEST_USERNAME - value: {{ cluster_cfg['rest-server']['default-pai-admin-username'] }} - - name: TEST_PASSWORD - value: {{ cluster_cfg['rest-server']['default-pai-admin-password'] }} - imagePullSecrets: - - name: {{ cluster_cfg["cluster"]["docker-registry"]["secret-name"] }} diff --git a/src/end-to-end-test/deploy/refresh.sh b/src/end-to-end-test/deploy/refresh.sh deleted file mode 100644 index e872d8f8ab..0000000000 --- a/src/end-to-end-test/deploy/refresh.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -pushd $(dirname "$0") > /dev/null - -echo "no job in the refresh script of end-to-end-test" - -popd > /dev/null \ No newline at end of file diff --git a/src/end-to-end-test/deploy/service.yaml b/src/end-to-end-test/deploy/service.yaml deleted file mode 100644 index d9d19a14e4..0000000000 --- a/src/end-to-end-test/deploy/service.yaml +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -cluster-type: - - yarn - -prerequisite: - - cluster-configuration - - yarn-frameworklauncher - - rest-server - -template-list: - - end-to-end-test.yaml - -start-script: start.sh -stop-script: stop.sh -delete-script: delete.sh -refresh-script: refresh.sh -upgraded-script: upgraded.sh \ No newline at end of file diff --git a/src/end-to-end-test/deploy/start.sh b/src/end-to-end-test/deploy/start.sh deleted file mode 100755 index 1f1e89cc15..0000000000 --- a/src/end-to-end-test/deploy/start.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -pushd $(dirname "$0") > /dev/null - -# kubectl apply --overwrite=true -f end-to-end-test.yaml || exit $? - -popd > /dev/null diff --git a/src/end-to-end-test/deploy/stop.sh b/src/end-to-end-test/deploy/stop.sh deleted file mode 100644 index 879889572e..0000000000 --- a/src/end-to-end-test/deploy/stop.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -pushd $(dirname "$0") > /dev/null - -if kubectl get deployments | grep -q "end-to-end-test-deployment"; then - kubectl delete deployment end-to-end-test-deployment || exit $? -fi - -popd > /dev/null diff --git a/src/end-to-end-test/etc/launcher.json b/src/end-to-end-test/etc/launcher.json deleted file mode 100644 index 9cd25a68cf..0000000000 --- a/src/end-to-end-test/etc/launcher.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "version": 10, - "user": { - "name": "test" - }, - "retryPolicy": { - "maxRetryCount": 0, - "fancyRetryPolicy": true - }, - "taskRoles": { - "Master": { - "taskNumber": 10, - "taskRetryPolicy": { - "maxRetryCount": 0, - "fancyRetryPolicy": true - }, - "taskService": { - "version": 23, - "entryPoint": "echo 'TEST'", - "sourceLocations": [ - "/Test/launcher" - ], - "resource": { - "cpuNumber": 1, - "memoryMB": 512, - "portDefinitions": { - "http": { - "start": 0, - "count": 1 - }, - "ssh": { - "start": 0, - "count": 1 - } - }, - "diskType": 0, - "diskMB": 0 - } - } - } - } -} \ No newline at end of file diff --git a/src/end-to-end-test/etc/tensorflow.json b/src/end-to-end-test/etc/tensorflow.json deleted file mode 100644 index 4dc4945ea3..0000000000 --- a/src/end-to-end-test/etc/tensorflow.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "jobName": "tensorflow-cifar10", - "image": "openpai/pai.example.tensorflow", - "dataDir": "HDFS_URI/Test/tensorflow/cifar-10-batches-py", - "outputDir": "HDFS_URI/Test/tensorflow/output", - "codeDir": "HDFS_URI/Test/tensorflow/benchmarks", - "taskRoles": [ - { - "name": "tf_benchmark", - "taskNumber": 1, - "cpuNumber": 2, - "memoryMB": 10240, - "gpuNumber": 1, - "command": "pip --quiet install scipy && ls . && python benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --num_batches=1 --local_parameter_device=gpu --batch_size=8 --model=alexnet --variable_update=parameter_server --data_dir=$PAI_DATA_DIR --data_name=cifar10 --train_dir=$PAI_OUTPUT_DIR", - "minSucceededTaskCount": 1 - } - ], - "retryCount": 0 -} diff --git a/src/end-to-end-test/start.sh b/src/end-to-end-test/start.sh deleted file mode 100644 index c92ddf657e..0000000000 --- a/src/end-to-end-test/start.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -account_file="./etc/account.config" -token_file="./etc/token.config" -expiration="$((7*24*60*60))" - -rest_server_uri=$REST_SERVER_URI -echo "$TEST_USERNAME:$TEST_PASSWORD" > $account_file - - -get_auth_token() { - account="$(cat $account_file)" - account=(${account//:/ }) - curl -X POST -d "username=${account[0]}" -d "password=${account[1]}" -d "expiration=$expiration" $rest_server_uri/api/v1/authn/basic/login | jq -r ".token" > $token_file -} - - -while true; do - printf "\nStarting end to end tests:\n" - - if [ ! -s $token_file ] || [ $(( $(date +%s) - $(stat -c %Y $token_file) )) -gt $expiration ]; then - get_auth_token - fi - - # printf "\nTesting service ...\n" - # bats test_service.sh - - printf "\nTesting hdfs ...\n" - bats test_hdfs.sh - - printf "\nTesting framework launcher ...\n" - bats test_launcher.sh - - printf "\nTesting rest server ...\n" - bats test_rest_server.sh - - printf "\n Sleeping ...\n" - sleep 1800 - -done diff --git a/src/end-to-end-test/test_hdfs.sh b/src/end-to-end-test/test_hdfs.sh deleted file mode 100644 index 1a7faea49f..0000000000 --- a/src/end-to-end-test/test_hdfs.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bats - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -hdfs_uri=$HDFS_URI - - -@test "list hdfs root dir" { - result="$(hdfs dfs -ls $hdfs_uri/)" - [[ $result == *Launcher* ]] -} - -@test "make hdfs test root dir" { - result="$(hdfs dfs -mkdir $hdfs_uri/Test)" - [[ ! $result == *mkdir* ]] - result="$(hdfs dfs -ls $hdfs_uri/)" - [[ $result == *Test* ]] -} - -@test "make hdfs test sub dir" { - result="$(hdfs dfs -mkdir $hdfs_uri/Test/launcher)" - [[ ! $result == *mkdir* ]] - result="$(hdfs dfs -mkdir $hdfs_uri/Test/tensorflow)" - [[ ! $result == *mkdir* ]] -} - -@test "upload cifar10 tensorflow test data to hdfs" { - result="$(hdfs dfs -put -f cifar-10-batches-py $hdfs_uri/Test/tensorflow/)" - [[ ! $result == *put* ]] -} - -@test "upload tensorflow script to hdfs" { - result="$(hdfs dfs -put -f benchmarks $hdfs_uri/Test/tensorflow/)" - [[ ! $result == *put* ]] -} - -@test "hdfs test root dir chmod" { - result="$(hdfs dfs -chmod -R 777 $hdfs_uri/Test)" - [[ ! $result == *chmod* ]] -} diff --git a/src/end-to-end-test/test_launcher.sh b/src/end-to-end-test/test_launcher.sh deleted file mode 100644 index 9d69e74da0..0000000000 --- a/src/end-to-end-test/test_launcher.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bats - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -launcher_uri=$WEBSERVICE_URI - - -@test "check framework launcher health check" { - result="$(curl $launcher_uri)" - [[ $result == *Active* ]] -} - -@test "submit framework launcher test job" { - job_name="launcher-test-$RANDOM-$RANDOM" - result="$(cat ./etc/launcher.json | curl -H "Content-Type: application/json" -H "UserName: test" -X PUT -d @- $launcher_uri/v1/Frameworks/test~$job_name)" - [[ ! $result == *Error* ]] -} diff --git a/src/end-to-end-test/test_rest_server.sh b/src/end-to-end-test/test_rest_server.sh deleted file mode 100644 index a017bf60b1..0000000000 --- a/src/end-to-end-test/test_rest_server.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env bats - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -hdfs_uri=$HDFS_URI -rest_server_uri=$REST_SERVER_URI - - -@test "check rest server health check" { - result="$(curl $rest_server_uri)" - [[ $result == *API* ]] -} - -@test "submit tensorflow test job" { - account="$(cat ./etc/account.config)" - account=(${account//:/ }) - job_name="tensorflow-test-$RANDOM-$RANDOM" - token="$(cat ./etc/token.config)" - result="$(cat ./etc/tensorflow.json | sed -e "s@tensorflow-cifar10@$job_name@g" -e "s@HDFS_URI@$hdfs_uri@g" | curl -H "Content-Type: application/json" -H "Authorization: Bearer $token" -X POST -d @- $rest_server_uri/api/v1/user/${account[0]}/jobs)" - [[ ! $result == *Error* ]] -} - -@test "clean up jobs" { - account="$(cat ./etc/account.config)" - account=(${account//:/ }) - token="$(cat ./etc/token.config)" - job_list="$(curl -H "Content-Type: application/json" -X GET $rest_server_uri/api/v1/user/${account[0]}/jobs | jq -r --arg username ${account[0]} --argjson timestamp $(( $(date +%s) * 1000 - 24 * 60 * 60 * 1000 )) '.[] | select((.username | match($username)) and (.state | match("SUCCEEDED")) and (.createdTime < $timestamp)) | .name')" - result="$(for job in $job_list; do curl -H "Content-Type: application/json" -H "Authorization: Bearer $token" -X DELETE $rest_server_uri/api/v1/user/${account[0]}/jobs/$job; done)" - [[ ! $result == *Error* ]] -} diff --git a/src/end-to-end-test/test_service.sh b/src/end-to-end-test/test_service.sh deleted file mode 100644 index 1fe3ba3ece..0000000000 --- a/src/end-to-end-test/test_service.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env bats - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -service_list="$(kubectl get pods)" - - -@test "check etcd server" { - [[ $service_list == *"etcd-server"!(*$'\n'*)"Running"* ]] -} - -@test "check drivers" { - [[ $service_list == *"drivers-one-shot"!(*$'\n'*)"Running"* ]] -} - -@test "check hadoop name node" { - [[ $service_list == *"hadoop-name-node-ds"!(*$'\n'*)"Running"* ]] -} - -@test "check hadoop data node" { - [[ $service_list == *"hadoop-data-node-ds"!(*$'\n'*)"Running"* ]] -} - -@test "check hadoop resource manager" { - [[ $service_list == *"hadoop-resource-manager-ds"!(*$'\n'*)"Running"* ]] -} - -@test "check hadoop node manager" { - [[ $service_list == *"hadoop-node-manager-ds"!(*$'\n'*)"Running"* ]] -} - -@test "check hadoop job history" { - [[ $service_list == *"hadoop-jobhistory-service"!(*$'\n'*)"Running"* ]] -} - -@test "check zookeeper" { - [[ $service_list == *"zookeeper-ds"!(*$'\n'*)"Running"* ]] -} - -@test "check yarn-frameworklauncher" { - [[ $service_list == *"yarn-frameworklauncher-ds"!(*$'\n'*)"Running"* ]] -} - -@test "check rest server" { - [[ $service_list == *"rest-server-ds"!(*$'\n'*)"Running"* ]] -} - -@test "check webportal" { - [[ $service_list == *"webportal-ds"!(*$'\n'*)"Running"* ]] -} diff --git a/src/etcd-upgrade/build/ds.yaml b/src/etcd-upgrade/build/ds.yaml deleted file mode 100644 index 1cc5b1c45f..0000000000 --- a/src/etcd-upgrade/build/ds.yaml +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: etcd-upgrade -spec: - selector: - matchLabels: - app: etcd-upgrade - template: - metadata: - labels: - app: etcd-upgrade - name: etcd-upgrade - spec: - containers: - - image: docker.io/openpai/etcd-upgrade:v0.11.0 - name: etcd-upgrade - imagePullPolicy: Always - readinessProbe: - exec: - command: - - cat - - /upgrade/done - initialDelaySeconds: 5 - periodSeconds: 3 - command: ["sh", "-x", "/upgrade/upgrade.sh"] - resources: - limits: - memory: "128Mi" - securityContext: - privileged: true - volumeMounts: - - mountPath: /etc/kubernetes/manifests - name: manifests-dir - volumes: - - name: manifests-dir - hostPath: - path: /etc/kubernetes/manifests diff --git a/src/etcd-upgrade/build/etcd-upgrade.dockerfile b/src/etcd-upgrade/build/etcd-upgrade.dockerfile deleted file mode 100644 index a233913a33..0000000000 --- a/src/etcd-upgrade/build/etcd-upgrade.dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -FROM python:3.7 - -RUN pip3 install PyYAML && \ - mkdir /upgrade - -COPY build/*.py build/*.sh /upgrade/ diff --git a/src/etcd-upgrade/build/upgrade.py b/src/etcd-upgrade/build/upgrade.py deleted file mode 100755 index e25faea323..0000000000 --- a/src/etcd-upgrade/build/upgrade.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python - -import copy -import sys -import yaml - -labels = {"app": "etcd-server"} - -probe = {"httpGet": {"path": "/health", "port": 4001}, - "initialDelaySeconds": 10, - "periodSeconds": 30, - "timeoutSeconds": 10} - -def add_fields(obj): - obj = copy.deepcopy(obj) - assert obj["apiVersion"] == "v1" - assert obj["kind"] == "Pod" - assert obj["metadata"]["name"] == "etcd-server" - obj["metadata"]["labels"] = labels - obj["spec"]["containers"][0]["readinessProbe"] = probe - return obj - -if __name__ == '__main__': - print(yaml.dump(add_fields(yaml.load(sys.stdin)))) diff --git a/src/etcd-upgrade/build/upgrade.sh b/src/etcd-upgrade/build/upgrade.sh deleted file mode 100644 index d33a7616a6..0000000000 --- a/src/etcd-upgrade/build/upgrade.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env sh - -MANIFESTS_DIR=/etc/kubernetes/manifests -ORIGIN=$MANIFESTS_DIR/etcd.yaml -UPGRADED_NAME=etcd-upgraded.yaml -TMP_DIR=/tmp - -if [ -f "$ORIGIN" ] ; then - cat $ORIGIN | /upgrade/upgrade.py > $TMP_DIR/$UPGRADED_NAME - rtn=$? - if [ $rtn -eq 0 ] ; then - rm $ORIGIN - sleep 10 # it seems k8s requires the yaml file disappear some time - mv $TMP_DIR/$UPGRADED_NAME $MANIFESTS_DIR - echo success - touch /upgrade/done - else - echo failed, nothing changed, return code is $rtn >&2 - fi -else - echo no etcd file found, nothing changed - touch /upgrade/done -fi - -sleep infinity diff --git a/src/job-exit-spec/config/architecture.png b/src/job-exit-spec/config/architecture.png deleted file mode 100644 index a69a8462f853f5bf2878aa2086789426ecc7a505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80443 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®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

        *F!t23Dx8O}}o>b=~5#|-ALc&96?Jbhm3_<`|}0 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 BbL9X4 diff --git a/src/job-exit-spec/config/job-exit-spec.md b/src/job-exit-spec/config/job-exit-spec.md deleted file mode 100644 index 5c9c656a0c..0000000000 --- a/src/job-exit-spec/config/job-exit-spec.md +++ /dev/null @@ -1,82 +0,0 @@ -# PAI Job Exit Spec -1. See details in [job-exit-spec.yaml](job-exit-spec.yaml) -2. This markdown file is generated by [update_markdown.py](update_markdown.py) with [job-exit-spec.yaml](job-exit-spec.yaml) -3. See full doc in [PAI Job Exit Spec User Manual](user-manual.md) - -## Spec Schema -|field|description|required|unique|type|range| -|-----|-----------|--------|------|----|----| -| **code** | The PAI Job ExitCode | True | True | Integer | begin: -8000
        end: 256
        | -| **phrase** | The textual phrase representation of this ExitCode | True | True | String | Any | -| **issuer** | Who root issued this ExitCode in details | False | False | Enum | 1. USER_CONTAINER
        2. PAI_OS
        3. PAI_RUNTIME
        4. PAI_YARN
        5. PAI_LAUNCHER
        | -| **causer** | Who root caused this ExitCode in details | False | False | Enum | 1. USER_SUBMISSION
        2. USER_CONTAINER
        3. USER_STOP
        4. USER_DELETION
        5. USER_RETRY
        6. USER_UPGRADE
        7. RESOURCE_ALLOCATION_TIMEOUT
        8. PAI_HDFS
        9. PAI_OS
        10. PAI_DOCKER
        11. PAI_RUNTIME
        12. PAI_YARN
        13. PAI_LAUNCHER
        14. UNKNOWN
        | -| **type** | The rough type of this ExitCode | False | False | Enum | 1. USER_SUCCESS
        2. USER_STOP
        3. USER_FAILURE
        4. PLATFORM_FAILURE
        5. RESOURCE_ALLOCATION_TIMEOUT
        6. UNKNOWN_FAILURE
        | -| **stage** | The user process stage just before this ExitCode issued | False | False | Enum | 1. SUBMITTING
        2. ALLOCATING
        3. LAUNCHING
        4. RUNNING
        5. COMPLETING
        6. UNKNOWN
        | -| **behavior** | The rerun behavior of this ExitCode | False | False | Enum | 1. TRANSIENT_NORMAL
        2. TRANSIENT_CONFLICT
        3. NON_TRANSIENT
        4. UNKNOWN
        | -| **reaction** | The reaction for this ExitCode will be executed by PAI automatically | False | False | Enum | 1. ALWAYS_RETRY
        2. ALWAYS_BACKOFF_RETRY
        3. RETRY_TO_MAX
        4. NEVER_RETRY
        | -| **reason** | Why this ExitCode is issued | False | False | String | Any | -| **repro** | One specific reproduce steps of this ExitCode | False | False | List\ | Any | -| **solution** | Some optional solutions to resolve this ExitCode if it indicates failure | False | False | List\ | Any | -| **pattern** | The pattern that PAI used to detect this ExitCode | False | False | String | Any, such as USER_EXITCODE=X && USER_LOG_PATTERN=Y \|\| OS_Signal=Z | - -## Spec Table -1. You may need to **scroll right side to see full table**. -2. The code **256** is just used to represent all **undefined positive** exitcodes in this spec, and the specific undefined exitcode will always override it to expose to user. -3. The code **-8000** is just used to represent all **undefined negative** exitcodes in this spec, and the specific undefined exitcode will always override it to expose to user. - -|code|phrase|issuer|causer|type|stage|behavior|reaction|reason|repro|solution|pattern| -|----|------|------|------|----|-----|--------|--------|------|-----|--------|-------| -| **154** | **CONTAINER_EXIT_CODE_FILE_LOST** | PAI_YARN | PAI_YARN | PLATFORM_FAILURE | COMPLETING | TRANSIENT_NORMAL | ALWAYS_RETRY | Container exitcode file cannot be found by YARN NM, maybe node unexpected shutdown, disk cleaned up or disk failure | 1. Stop YARN NM
        2. Kill container process
        3. Delete container exitcode file
        4. Start YARN NM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **130** | **CONTAINER_KILLED_BY_SIGINT** | PAI_OS | PAI_OS | PLATFORM_FAILURE | RUNNING | TRANSIENT_NORMAL | ALWAYS_RETRY | Container killed by OS Signal: SIGINT | 1. Kill container process by SIGINT
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **132** | **CONTAINER_KILLED_BY_SIGILL** | USER_CONTAINER | USER_CONTAINER | USER_FAILURE | RUNNING | NON_TRANSIENT | NEVER_RETRY | Container killed by OS Signal: SIGILL | 1. User program executes an illegal, malformed, unknown, or privileged machine instruction
        | 1. Check container log and fix your program bug
        | | -| **134** | **CONTAINER_KILLED_BY_SIGABRT** | USER_CONTAINER | UNKNOWN | UNKNOWN_FAILURE | RUNNING | UNKNOWN | RETRY_TO_MAX | Container killed by OS Signal: SIGABRT | 1. User program calls abort() by libc
        | 1. Check container log and find root cause
        2. Wait result from next retry
        | | -| **135** | **CONTAINER_KILLED_BY_SIGBUS** | USER_CONTAINER | USER_CONTAINER | USER_FAILURE | RUNNING | NON_TRANSIENT | NEVER_RETRY | Container killed by OS Signal: SIGBUS | 1. User program accesses an unaligned memory address
        | 1. Check container log and fix your program bug
        | | -| **136** | **CONTAINER_KILLED_BY_SIGFPE** | USER_CONTAINER | USER_CONTAINER | USER_FAILURE | RUNNING | NON_TRANSIENT | NEVER_RETRY | Container killed by OS Signal: SIGFPE | 1. User program division by zero
        | 1. Check container log and fix your program bug
        | | -| **137** | **CONTAINER_KILLED_BY_SIGKILL** | PAI_OS | PAI_OS | PLATFORM_FAILURE | RUNNING | TRANSIENT_NORMAL | ALWAYS_RETRY | Container killed by OS Signal: SIGKILL | 1. Kill container process by SIGKILL
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **139** | **CONTAINER_KILLED_BY_SIGSEGV** | USER_CONTAINER | USER_CONTAINER | USER_FAILURE | RUNNING | NON_TRANSIENT | NEVER_RETRY | Container killed by OS Signal: SIGSEGV | 1. User program accesses an illegal memory address
        | 1. Check container log and fix your program bug
        | | -| **141** | **CONTAINER_KILLED_BY_SIGPIPE** | USER_CONTAINER | USER_CONTAINER | USER_FAILURE | RUNNING | NON_TRANSIENT | NEVER_RETRY | Container killed by OS Signal: SIGPIPE | 1. User program writes to a pipe without a process connected to the other end
        | 1. Check container log and fix your program bug
        | | -| **143** | **CONTAINER_KILLED_BY_SIGTERM** | PAI_OS | PAI_OS | PLATFORM_FAILURE | RUNNING | TRANSIENT_NORMAL | ALWAYS_RETRY | Container killed by OS Signal: SIGTERM | 1. Kill container process by SIGTERM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **193** | **CONTAINER_DOCKER_RUN_FAILED** | PAI_RUNTIME | PAI_DOCKER | PLATFORM_FAILURE | LAUNCHING | TRANSIENT_NORMAL | ALWAYS_RETRY | Container cannot be launched by docker run | 1. PAI Runtime calls docker run with unknown flag
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **196** | **CONTAINER_OOM_KILLED_BY_DOCKER** | PAI_RUNTIME | USER_CONTAINER | USER_FAILURE | RUNNING | NON_TRANSIENT | NEVER_RETRY | Container killed by docker due to it exceeded the request memory | 1. User program uses more memory than its requested
        | 1. Increase per task memory request
        2. Decrease per task memory usage by such as increasing task number
        | | -| **198** | **CONTAINER_OOD_KILLED_BY_DISKCLEANER** | PAI_RUNTIME | USER_CONTAINER | USER_FAILURE | RUNNING | NON_TRANSIENT | NEVER_RETRY | Container is killed by disk cleaner due to it used major disk space and all containers disk usage on the node exceeded platform limit | 1. User program uses almost all disk space of the node
        | 1. Decrease per task disk space usage by such as increasing task number
        | | -| **255** | **CONTAINER_RUNTIME_UNKNOWN_FAILURE** | PAI_RUNTIME | UNKNOWN | UNKNOWN_FAILURE | COMPLETING | UNKNOWN | RETRY_TO_MAX | Container failed but the failure cannot be recognized by PAI Runtime | 1. User program directly exits with exitcode 1
        | 1. Check container log and find root cause
        2. Wait result from next retry
        | | -| **256** | **CONTAINER_RUNTIME_EXIT_ABNORMALLY** | PAI_RUNTIME | PAI_RUNTIME | PLATFORM_FAILURE | UNKNOWN | UNKNOWN | RETRY_TO_MAX | PAI Runtime exit abnormally with undefined exitcode, it may have bugs | 1. PAI Runtime exits with exitcode 1
        | 1. Contact PAI Dev to fix PAI Runtime bugs
        | | -| **0** | **SUCCEEDED** | USER_CONTAINER | USER_CONTAINER | USER_SUCCESS | COMPLETING | UNKNOWN | NEVER_RETRY | | 1. User program exits with exitcode 0
        | | | -| **-7100** | **CONTAINER_INVALID_EXIT_STATUS** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | LAUNCHING | TRANSIENT_NORMAL | ALWAYS_RETRY | Container exited with invalid exit status, maybe YARN failed to initialize container environment | 1. Disable write permission for YARN NM to access {yarn.nodemanager.local-dirs}
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7101** | **CONTAINER_NOT_AVAILABLE_EXIT_STATUS** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | LAUNCHING | TRANSIENT_NORMAL | ALWAYS_RETRY | Container exited with not available exit status, maybe YARN failed to create container executor process | 1. Disable execute permission for YARN NM to access bash on *nix or winutils.exe on Windows
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7102** | **CONTAINER_NODE_DISKS_FAILED** | PAI_LAUNCHER | PAI_OS | PLATFORM_FAILURE | LAUNCHING | TRANSIENT_NORMAL | ALWAYS_RETRY | Container cannot be launched by YARN due to local bad disk, maybe no disk space left | 1. Set zero disk space for {yarn.nodemanager.local-dirs}
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7103** | **CONTAINER_PORT_CONFLICT** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | LAUNCHING | TRANSIENT_NORMAL | ALWAYS_RETRY | Container cannot be launched by YARN due to local port conflict | 1. After container allocated and before container started, stop the container's YARN NM
        2. Occupy a container requested port on the container node
        3. Start the container's YARN NM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7110** | **CONTAINER_ABORTED** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Container aborted by YARN | 1. Corrupt the container entry in YARN NM state store
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7111** | **CONTAINER_NODE_LOST** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Container lost due to node lost, maybe its YARN NM is down for a long time | 1. Stop the container's YARN NM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7112** | **CONTAINER_EXPIRED** | PAI_LAUNCHER | RESOURCE_ALLOCATION_TIMEOUT | RESOURCE_ALLOCATION_TIMEOUT | ALLOCATING | TRANSIENT_CONFLICT | ALWAYS_BACKOFF_RETRY | Container previously allocated is expired due to it is not launched on YARN NM in time, maybe other containers cannot be allocated in time | 1. Disable virtual cluster bonus token
        2. Set amGangAllocationTimeoutSec large than yarn.resourcemanager.rm.container-allocation.expiry-interval-ms
        3. Request more containers in a job than its virtual cluster current available resource
        | 1. Wait result from next retry
        2. Decrease task number
        3. Decrease per task resource request
        4. Contact Cluster Admin to increase your virtual cluster quota
        | | -| **-7113** | **CONTAINER_ABORTED_ON_AM_RESTART** | PAI_LAUNCHER | RESOURCE_ALLOCATION_TIMEOUT | RESOURCE_ALLOCATION_TIMEOUT | ALLOCATING | TRANSIENT_CONFLICT | ALWAYS_BACKOFF_RETRY | Container previously allocated is aborted by YARN RM during Launcher AM restart, maybe other containers cannot be allocated in time | 1. Disable virtual cluster bonus token
        2. Request more containers in a job than its virtual cluster current available resource
        3. Kill Launcher AM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7120** | **CONTAINER_PREEMPTED** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Container preempted by YARN RM, maybe its virtual cluster overused resource was reclaimed | 1. Enable virtual cluster bonus token
        2. Request more containers in a job than its virtual cluster current available resource
        3. Use up all other virtual clusters available resource
        | 1. Wait result from next retry
        2. Decrease task number
        3. Decrease per task resource request
        4. Contact Cluster Admin to increase your virtual cluster quota
        5. Contact Cluster Admin to disable your virtual cluster bonus token
        | | -| **-7121** | **CONTAINER_RUNTIME_VIRTUAL_MEMORY_EXCEEDED** | PAI_LAUNCHER | PAI_RUNTIME | PLATFORM_FAILURE | UNKNOWN | NON_TRANSIENT | NEVER_RETRY | Container killed by YARN due to its PAI Runtime exceeded the request virtual memory | 1. PAI Runtime uses more virtual memory than its container requested
        | 1. Increase per task virtual memory request
        2. Contact PAI Dev to decrease PAI Runtime virtual memory usage
        | | -| **-7122** | **CONTAINER_RUNTIME_PHYSICAL_MEMORY_EXCEEDED** | PAI_LAUNCHER | PAI_RUNTIME | PLATFORM_FAILURE | UNKNOWN | NON_TRANSIENT | NEVER_RETRY | Container killed by YARN due to its PAI Runtime exceeded the request physical memory | 1. PAI Runtime uses more physical memory than its container requested
        | 1. Increase per task physical memory request
        2. Contact PAI Dev to decrease PAI Runtime physical memory usage
        | | -| **-7123** | **CONTAINER_KILLED_BY_AM** | PAI_LAUNCHER | PAI_LAUNCHER | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Container killed by Launcher AM, maybe allocated container is rejected | 1. Setup single node cluster
        2. Submit job with two tasks and antiaffinityAllocation enabled
        3. Launcher rejects allocated container whose node already allocated another container
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7124** | **CONTAINER_KILLED_BY_RM** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Container killed by YARN RM, maybe the container is not managed by YARN RM anymore | 1. Delete the container's app entry in YARN RM state store
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7125** | **CONTAINER_KILLED_ON_APP_COMPLETION** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | COMPLETING | TRANSIENT_NORMAL | ALWAYS_RETRY | Container killed by YARN RM due to its app is already completed | 1. Stop Launcher AM container's YARN NM
        2. Kill the container's app
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7126** | **CONTAINER_EXTERNAL_UTILIZATION_SPIKED** | PAI_LAUNCHER | PAI_OS | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Container killed by YARN due to external utilization spiked | 1. Enable YARN external utilization check
        2. Start raw process to use up almost all memory on the node
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7150** | **CONTAINER_NM_LAUNCH_FAILED** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | LAUNCHING | TRANSIENT_NORMAL | ALWAYS_RETRY | Container failed to launch on YARN NM | 1. After container allocated and before container started, stop the container's YARN NM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7151** | **CONTAINER_RM_RESYNC_LOST** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Container lost after Launcher AM resynced with YARN RM | 1. Stop the container's YARN NM
        2. Restart YARN RM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7152** | **CONTAINER_RM_RESYNC_EXCEEDED** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | UNKNOWN | NON_TRANSIENT | NEVER_RETRY | Container exceeded after Launcher AM resynced with YARN RM | 1. Stop the container's YARN NM
        2. Restart YARN RM
        3. Wait until AM releases container
        4. Start the container's YARN NM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7153** | **CONTAINER_MIGRATE_TASK_REQUESTED** | PAI_LAUNCHER | USER_RETRY | USER_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Container killed by Launcher due to user MigrateTaskRequest | 1. Send MigrateTaskRequest for the container
        | 1. Wait result from next retry
        | | -| **-7154** | **CONTAINER_AGENT_EXPIRED** | PAI_LAUNCHER | PAI_OS | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Container killed by Launcher due to no Launcher Agent heartbeat is received in time | 1. Enable Launcher Agent
        2. Bring down the container's node
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7200** | **AM_RM_HEARTBEAT_YARN_EXCEPTION** | PAI_LAUNCHER | USER_SUBMISSION | USER_FAILURE | SUBMITTING | NON_TRANSIENT | NEVER_RETRY | Launcher AM failed to heartbeat with YARN RM due to YarnException, maybe App is non-compliant | 1. Submit a job with invalid node label
        | 1. Check diagnostics and revise your job config
        | | -| **-7201** | **AM_RM_HEARTBEAT_IO_EXCEPTION** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Launcher AM failed to heartbeat with YARN RM due to IOException, maybe YARN RM is down | 1. Stop YARN RM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7202** | **AM_RM_HEARTBEAT_UNKNOWN_EXCEPTION** | PAI_LAUNCHER | UNKNOWN | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Launcher AM failed to heartbeat with YARN RM due to unknown Exception | 1. AM sends invalid message to YARN RM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7203** | **AM_RM_HEARTBEAT_SHUTDOWN_REQUESTED** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Launcher AM failed to heartbeat with YARN RM due to ShutdownRequest, maybe AM is not managed by YARN RM anymore | 1. Set small AM expiry time
        2. Set network partition between AM and YARN RM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7250** | **AM_UNKNOWN_EXCEPTION** | PAI_LAUNCHER | PAI_LAUNCHER | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | Launcher AM failed due to unknown Exception | 1. Set network partition between AM and ZK
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7251** | **AM_NON_TRANSIENT_EXCEPTION** | PAI_LAUNCHER | USER_SUBMISSION | USER_FAILURE | SUBMITTING | NON_TRANSIENT | NEVER_RETRY | Launcher AM failed due to NonTransientException, maybe App is non-compliant | 1. Submit a job with invalid data dir
        | 1. Check diagnostics and revise your job config
        | | -| **-7252** | **AM_GANG_ALLOCATION_TIMEOUT** | PAI_LAUNCHER | RESOURCE_ALLOCATION_TIMEOUT | RESOURCE_ALLOCATION_TIMEOUT | ALLOCATING | TRANSIENT_CONFLICT | ALWAYS_BACKOFF_RETRY | Launcher AM failed due to all the requested resource cannot be satisfied in time | 1. Disable virtual cluster bonus token
        2. Request more containers in a job than its virtual cluster current available resource
        | 1. Wait result from next retry
        2. Decrease task number
        3. Decrease per task resource request
        4. Contact Cluster Admin to increase your virtual cluster quota
        | | -| **-7300** | **APP_SUBMISSION_YARN_EXCEPTION** | PAI_LAUNCHER | USER_SUBMISSION | USER_FAILURE | SUBMITTING | NON_TRANSIENT | NEVER_RETRY | Failed to submit App to YARN RM due to YarnException, maybe App is non-compliant | 1. Submit a job to invalid virtual cluster
        | 1. Check diagnostics and revise your job config
        | | -| **-7301** | **APP_SUBMISSION_IO_EXCEPTION** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | SUBMITTING | TRANSIENT_NORMAL | ALWAYS_RETRY | Failed to submit App to YARN RM due to IOException, maybe YARN RM is down | 1. Stop YARN RM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7302** | **APP_SUBMISSION_UNKNOWN_EXCEPTION** | PAI_LAUNCHER | UNKNOWN | UNKNOWN_FAILURE | SUBMITTING | UNKNOWN | RETRY_TO_MAX | Failed to submit App to YARN RM due to unknown Exception | 1. Launcher Service sends invalid message to YARN RM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7303** | **APP_KILLED_UNEXPECTEDLY** | PAI_LAUNCHER | UNKNOWN | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | App killed unexpectedly and directly through YARN RM | 1. Kill the app directly through YARN RM
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7350** | **APP_RM_RESYNC_LOST** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | UNKNOWN | TRANSIENT_NORMAL | ALWAYS_RETRY | App lost after Launcher Service resynced with YARN RM | 1. Delete the app entry in YARN RM state store
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7351** | **APP_STOP_FRAMEWORK_REQUESTED** | PAI_LAUNCHER | USER_STOP | USER_STOP | UNKNOWN | NON_TRANSIENT | NEVER_RETRY | App stopped by Launcher due to user StopFrameworkRequest | 1. Stop a job
        | | | -| **-7352** | **APP_AM_DIAGNOSTICS_LOST** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | COMPLETING | TRANSIENT_NORMAL | ALWAYS_RETRY | Failed to retrieve AMDiagnostics from YARN, maybe the App is cleaned up in YARN | 1. App is in APPLICATION_RETRIEVING_DIAGNOSTICS state
        2. Stop Launcher Service
        3. Delete the app entry in YARN RM state store
        4. Start Launcher Service
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7353** | **APP_AM_DIAGNOSTICS_DESERIALIZATION_FAILED** | PAI_LAUNCHER | PAI_YARN | PLATFORM_FAILURE | COMPLETING | TRANSIENT_NORMAL | ALWAYS_RETRY | Failed to deserialize AMDiagnostics from YARN, maybe it is corrupted or Launcher AM unexpectedly crashed frequently without generating AMDiagnostics | 1. Set yarn.app.attempt.diagnostics.limit.kc to 1B
        | 1. Wait result from next retry
        2. Contact Cluster Admin
        | | -| **-7400** | **TASK_STOPPED_ON_APP_COMPLETION** | PAI_LAUNCHER | USER_STOP | USER_STOP | UNKNOWN | NON_TRANSIENT | NEVER_RETRY | Task stopped by Launcher due to its app is already completed | 1. Stop a job with long running container
        | | | -| **-8000** | **CONTAINER_UNKNOWN_YARN_EXIT_STATUS** | PAI_YARN | UNKNOWN | UNKNOWN_FAILURE | UNKNOWN | UNKNOWN | RETRY_TO_MAX | Container exited with unknown exitcode which is issued from YARN | 1. Change YARN code to make it return container exitcode -886
        | 1. Contact PAI Dev to recognize this exitcode
        | | - diff --git a/src/job-exit-spec/config/job-exit-spec.yaml b/src/job-exit-spec/config/job-exit-spec.yaml deleted file mode 100644 index 2bd8e13a16..0000000000 --- a/src/job-exit-spec/config/job-exit-spec.yaml +++ /dev/null @@ -1,1015 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -service_type: "yarn" - -################################################################################ -# PAI Job ExitSpec Schema -################################################################################ -schema: - - field: code - description: "The PAI Job ExitCode" - required: True - unique: True - type: Integer - range: - begin: -8000 - end: 256 - - field: phrase - description: "The textual phrase representation of this ExitCode" - required: True - unique: True - type: String - range: "Any" - - field: issuer - description: "Who root issued this ExitCode in details" - required: False - unique: False - type: Enum - range: - - USER_CONTAINER - - PAI_OS - - PAI_RUNTIME - - PAI_YARN - - PAI_LAUNCHER - - field: causer - description: "Who root caused this ExitCode in details" - required: False - unique: False - type: Enum - range: - - USER_SUBMISSION - - USER_CONTAINER - - USER_STOP - - USER_DELETION - - USER_RETRY - - USER_UPGRADE - - RESOURCE_ALLOCATION_TIMEOUT - - PAI_HDFS - - PAI_OS - - PAI_DOCKER - - PAI_RUNTIME - - PAI_YARN - - PAI_LAUNCHER - - UNKNOWN - - field: type - description: "The rough type of this ExitCode" - required: False - unique: False - type: Enum - range: - - USER_SUCCESS - - USER_STOP - - USER_FAILURE - - PLATFORM_FAILURE - - RESOURCE_ALLOCATION_TIMEOUT - - UNKNOWN_FAILURE - - field: stage - description: "The user process stage just before this ExitCode issued" - required: False - unique: False - type: Enum - range: - - SUBMITTING - - ALLOCATING - - LAUNCHING - - RUNNING - - COMPLETING - - UNKNOWN - - field: behavior - description: "The rerun behavior of this ExitCode" - required: False - unique: False - type: Enum - range: - - TRANSIENT_NORMAL - - TRANSIENT_CONFLICT - - NON_TRANSIENT - - UNKNOWN - - field: reaction - description: "The reaction for this ExitCode will be executed by PAI automatically" - required: False - unique: False - type: Enum - range: - - ALWAYS_RETRY - - ALWAYS_BACKOFF_RETRY - - RETRY_TO_MAX - - NEVER_RETRY - - field: reason - description: "Why this ExitCode is issued" - required: False - unique: False - type: String - range: "Any" - - field: repro - description: "One specific reproduce steps of this ExitCode" - required: False - unique: False - type: List - range: "Any" - - field: solution - description: "Some optional solutions to resolve this ExitCode if it indicates failure" - required: False - unique: False - type: List - range: "Any" - - field: pattern - description: "The pattern that PAI used to detect this ExitCode" - required: False - unique: False - type: String - range: "Any, such as USER_EXITCODE=X && USER_LOG_PATTERN=Y || OS_Signal=Z" - - -################################################################################ -# PAI Job ExitSpec -################################################################################ -spec: -################################ -# Range: [129, 192] -# Owner: PAI_RUNTIME -# Description: Recognized From YARN / Signal -################################ -# Container Failed by YARN -- code: 154 - phrase: CONTAINER_EXIT_CODE_FILE_LOST - issuer: PAI_YARN - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: COMPLETING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container exitcode file cannot be found by YARN NM, maybe node unexpected shutdown, disk cleaned up or disk failure" - repro: - - "Stop YARN NM" - - "Kill container process" - - "Delete container exitcode file" - - "Start YARN NM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -# Container Failed by OS Signal -- code: 130 - phrase: CONTAINER_KILLED_BY_SIGINT - issuer: PAI_OS - causer: PAI_OS - type: PLATFORM_FAILURE - stage: RUNNING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container killed by OS Signal: SIGINT" - repro: - - "Kill container process by SIGINT" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: 132 - phrase: CONTAINER_KILLED_BY_SIGILL - issuer: USER_CONTAINER - causer: USER_CONTAINER - type: USER_FAILURE - stage: RUNNING - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Container killed by OS Signal: SIGILL" - repro: - - "User program executes an illegal, malformed, unknown, or privileged machine instruction" - solution: - - "Check container log and fix your program bug" - -- code: 134 - phrase: CONTAINER_KILLED_BY_SIGABRT - issuer: USER_CONTAINER - causer: UNKNOWN - type: UNKNOWN_FAILURE - stage: RUNNING - behavior: UNKNOWN - reaction: RETRY_TO_MAX - reason: "Container killed by OS Signal: SIGABRT" - repro: - - "User program calls abort() by libc" - solution: - - "Check container log and find root cause" - - "Wait result from next retry" - -- code: 135 - phrase: CONTAINER_KILLED_BY_SIGBUS - issuer: USER_CONTAINER - causer: USER_CONTAINER - type: USER_FAILURE - stage: RUNNING - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Container killed by OS Signal: SIGBUS" - repro: - - "User program accesses an unaligned memory address" - solution: - - "Check container log and fix your program bug" - -- code: 136 - phrase: CONTAINER_KILLED_BY_SIGFPE - issuer: USER_CONTAINER - causer: USER_CONTAINER - type: USER_FAILURE - stage: RUNNING - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Container killed by OS Signal: SIGFPE" - repro: - - "User program division by zero" - solution: - - "Check container log and fix your program bug" - -- code: 137 - phrase: CONTAINER_KILLED_BY_SIGKILL - issuer: PAI_OS - causer: PAI_OS - type: PLATFORM_FAILURE - stage: RUNNING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container killed by OS Signal: SIGKILL" - repro: - - "Kill container process by SIGKILL" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: 139 - phrase: CONTAINER_KILLED_BY_SIGSEGV - issuer: USER_CONTAINER - causer: USER_CONTAINER - type: USER_FAILURE - stage: RUNNING - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Container killed by OS Signal: SIGSEGV" - repro: - - "User program accesses an illegal memory address" - solution: - - "Check container log and fix your program bug" - -- code: 141 - phrase: CONTAINER_KILLED_BY_SIGPIPE - issuer: USER_CONTAINER - causer: USER_CONTAINER - type: USER_FAILURE - stage: RUNNING - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Container killed by OS Signal: SIGPIPE" - repro: - - "User program writes to a pipe without a process connected to the other end" - solution: - - "Check container log and fix your program bug" - -- code: 143 - phrase: CONTAINER_KILLED_BY_SIGTERM - issuer: PAI_OS - causer: PAI_OS - type: PLATFORM_FAILURE - stage: RUNNING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container killed by OS Signal: SIGTERM" - repro: - - "Kill container process by SIGTERM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - - -################################ -# Range: [193, 254] -# Owner: PAI_RUNTIME -# Description: Recognized From Error Pattern -################################ -# Recognized during user process LAUNCHING stage -- code: 193 - phrase: CONTAINER_DOCKER_RUN_FAILED - issuer: PAI_RUNTIME - causer: PAI_DOCKER - type: PLATFORM_FAILURE - stage: LAUNCHING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container cannot be launched by docker run" - repro: - - "PAI Runtime calls docker run with unknown flag" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -# Recognized during user process COMPLETING stage -- code: 196 - phrase: CONTAINER_OOM_KILLED_BY_DOCKER - issuer: PAI_RUNTIME - causer: USER_CONTAINER - type: USER_FAILURE - stage: RUNNING - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Container killed by docker due to it exceeded the request memory" - repro: - - "User program uses more memory than its requested" - solution: - - "Increase per task memory request" - - "Decrease per task memory usage by such as increasing task number" - -- code: 198 - phrase: CONTAINER_OOD_KILLED_BY_DISKCLEANER - issuer: PAI_RUNTIME - causer: USER_CONTAINER - type: USER_FAILURE - stage: RUNNING - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Container is killed by disk cleaner due to it used major disk space and all containers disk usage on the node exceeded platform limit" - repro: - - "User program uses almost all disk space of the node" - solution: - - "Decrease per task disk space usage by such as increasing task number" - -- code: 255 - phrase: CONTAINER_RUNTIME_UNKNOWN_FAILURE - issuer: PAI_RUNTIME - causer: UNKNOWN - type: UNKNOWN_FAILURE - stage: COMPLETING - behavior: UNKNOWN - reaction: RETRY_TO_MAX - reason: "Container failed but the failure cannot be recognized by PAI Runtime" - repro: - - "User program directly exits with exitcode 1" - solution: - - "Check container log and find root cause" - - "Wait result from next retry" - - -################################ -# Range: {Undefined Positive ExitCodes} -# Owner: PAI_RUNTIME -# Description: Shadow Fallback ExitCode -################################ -# Here the code 256 is just used to represent all undefined positive exitcodes in this spec, -# and the specific undefined exitcode should always override it to expose outside. -- code: 256 - phrase: CONTAINER_RUNTIME_EXIT_ABNORMALLY - issuer: PAI_RUNTIME - causer: PAI_RUNTIME - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: UNKNOWN - reaction: RETRY_TO_MAX - reason: "PAI Runtime exit abnormally with undefined exitcode, it may have bugs" - repro: - - "PAI Runtime exits with exitcode 1" - solution: - - "Contact PAI Dev to fix PAI Runtime bugs" - - -################################ -# Range: [0, 0] -# Owner: PAI_LAUNCHER -# Description: Success ExitCode -################################ -- code: 0 - phrase: SUCCEEDED - issuer: USER_CONTAINER - causer: USER_CONTAINER - type: USER_SUCCESS - stage: COMPLETING - behavior: UNKNOWN - reaction: NEVER_RETRY - repro: - - "User program exits with exitcode 0" - - -################################ -# Range: [-7199, -7100] -# Owner: PAI_LAUNCHER AM -# Description: Container Failure -################################ -# Container Init Failed by YARN -- code: -7100 - phrase: CONTAINER_INVALID_EXIT_STATUS - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: LAUNCHING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container exited with invalid exit status, maybe YARN failed to initialize container environment" - repro: - - "Disable write permission for YARN NM to access {yarn.nodemanager.local-dirs}" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7101 - phrase: CONTAINER_NOT_AVAILABLE_EXIT_STATUS - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: LAUNCHING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container exited with not available exit status, maybe YARN failed to create container executor process" - repro: - - "Disable execute permission for YARN NM to access bash on *nix or winutils.exe on Windows" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7102 - phrase: CONTAINER_NODE_DISKS_FAILED - issuer: PAI_LAUNCHER - causer: PAI_OS - type: PLATFORM_FAILURE - stage: LAUNCHING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container cannot be launched by YARN due to local bad disk, maybe no disk space left" - repro: - - "Set zero disk space for {yarn.nodemanager.local-dirs}" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7103 - phrase: CONTAINER_PORT_CONFLICT - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: LAUNCHING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container cannot be launched by YARN due to local port conflict" - repro: - - "After container allocated and before container started, stop the container's YARN NM" - - "Occupy a container requested port on the container node" - - "Start the container's YARN NM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -# Container Aborted Failed by YARN -- code: -7110 - phrase: CONTAINER_ABORTED - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container aborted by YARN" - repro: - - "Corrupt the container entry in YARN NM state store" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7111 - phrase: CONTAINER_NODE_LOST - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container lost due to node lost, maybe its YARN NM is down for a long time" - repro: - - "Stop the container's YARN NM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7112 - phrase: CONTAINER_EXPIRED - issuer: PAI_LAUNCHER - causer: RESOURCE_ALLOCATION_TIMEOUT - type: RESOURCE_ALLOCATION_TIMEOUT - stage: ALLOCATING - behavior: TRANSIENT_CONFLICT - reaction: ALWAYS_BACKOFF_RETRY - reason: "Container previously allocated is expired due to it is not launched on YARN NM in time, maybe other containers cannot be allocated in time" - repro: - - "Disable virtual cluster bonus token" - - "Set amGangAllocationTimeoutSec large than yarn.resourcemanager.rm.container-allocation.expiry-interval-ms" - - "Request more containers in a job than its virtual cluster current available resource" - solution: - - "Wait result from next retry" - - "Decrease task number" - - "Decrease per task resource request" - - "Contact Cluster Admin to increase your virtual cluster quota" - -- code: -7113 - phrase: CONTAINER_ABORTED_ON_AM_RESTART - issuer: PAI_LAUNCHER - causer: RESOURCE_ALLOCATION_TIMEOUT - type: RESOURCE_ALLOCATION_TIMEOUT - stage: ALLOCATING - behavior: TRANSIENT_CONFLICT - reaction: ALWAYS_BACKOFF_RETRY - reason: "Container previously allocated is aborted by YARN RM during Launcher AM restart, maybe other containers cannot be allocated in time" - repro: - - "Disable virtual cluster bonus token" - - "Request more containers in a job than its virtual cluster current available resource" - - "Kill Launcher AM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -# Container Other Failed by YARN -- code: -7120 - phrase: CONTAINER_PREEMPTED - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container preempted by YARN RM, maybe its virtual cluster overused resource was reclaimed" - repro: - - "Enable virtual cluster bonus token" - - "Request more containers in a job than its virtual cluster current available resource" - - "Use up all other virtual clusters available resource" - solution: - - "Wait result from next retry" - - "Decrease task number" - - "Decrease per task resource request" - - "Contact Cluster Admin to increase your virtual cluster quota" - - "Contact Cluster Admin to disable your virtual cluster bonus token" - -- code: -7121 - phrase: CONTAINER_RUNTIME_VIRTUAL_MEMORY_EXCEEDED - issuer: PAI_LAUNCHER - causer: PAI_RUNTIME - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Container killed by YARN due to its PAI Runtime exceeded the request virtual memory" - repro: - - "PAI Runtime uses more virtual memory than its container requested" - solution: - - "Increase per task virtual memory request" - - "Contact PAI Dev to decrease PAI Runtime virtual memory usage" - -- code: -7122 - phrase: CONTAINER_RUNTIME_PHYSICAL_MEMORY_EXCEEDED - issuer: PAI_LAUNCHER - causer: PAI_RUNTIME - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Container killed by YARN due to its PAI Runtime exceeded the request physical memory" - repro: - - "PAI Runtime uses more physical memory than its container requested" - solution: - - "Increase per task physical memory request" - - "Contact PAI Dev to decrease PAI Runtime physical memory usage" - -- code: -7123 - phrase: CONTAINER_KILLED_BY_AM - issuer: PAI_LAUNCHER - causer: PAI_LAUNCHER - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container killed by Launcher AM, maybe allocated container is rejected" - repro: - - "Setup single node cluster" - - "Submit job with two tasks and antiaffinityAllocation enabled" - - "Launcher rejects allocated container whose node already allocated another container" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7124 - phrase: CONTAINER_KILLED_BY_RM - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container killed by YARN RM, maybe the container is not managed by YARN RM anymore" - repro: - - "Delete the container's app entry in YARN RM state store" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7125 - phrase: CONTAINER_KILLED_ON_APP_COMPLETION - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: COMPLETING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container killed by YARN RM due to its app is already completed" - repro: - - "Stop Launcher AM container's YARN NM" - - "Kill the container's app" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7126 - phrase: CONTAINER_EXTERNAL_UTILIZATION_SPIKED - issuer: PAI_LAUNCHER - causer: PAI_OS - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container killed by YARN due to external utilization spiked" - repro: - - "Enable YARN external utilization check" - - "Start raw process to use up almost all memory on the node" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -# Container Failed by Launcher AM -- code: -7150 - phrase: CONTAINER_NM_LAUNCH_FAILED - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: LAUNCHING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container failed to launch on YARN NM" - repro: - - "After container allocated and before container started, stop the container's YARN NM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7151 - phrase: CONTAINER_RM_RESYNC_LOST - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container lost after Launcher AM resynced with YARN RM" - repro: - - "Stop the container's YARN NM" - - "Restart YARN RM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7152 - phrase: CONTAINER_RM_RESYNC_EXCEEDED - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Container exceeded after Launcher AM resynced with YARN RM" - repro: - - "Stop the container's YARN NM" - - "Restart YARN RM" - - "Wait until AM releases container" - - "Start the container's YARN NM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7153 - phrase: CONTAINER_MIGRATE_TASK_REQUESTED - issuer: PAI_LAUNCHER - causer: USER_RETRY - type: USER_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container killed by Launcher due to user MigrateTaskRequest" - repro: - - "Send MigrateTaskRequest for the container" - solution: - - "Wait result from next retry" - -- code: -7154 - phrase: CONTAINER_AGENT_EXPIRED - issuer: PAI_LAUNCHER - causer: PAI_OS - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Container killed by Launcher due to no Launcher Agent heartbeat is received in time" - repro: - - "Enable Launcher Agent" - - "Bring down the container's node" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - - -################################ -# Range: [-7299, -7200] -# Owner: PAI_LAUNCHER AM -# Description: Job Failure -################################ -# App Failed by YARN -- code: -7200 - phrase: AM_RM_HEARTBEAT_YARN_EXCEPTION - issuer: PAI_LAUNCHER - causer: USER_SUBMISSION - type: USER_FAILURE - stage: SUBMITTING - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Launcher AM failed to heartbeat with YARN RM due to YarnException, maybe App is non-compliant" - repro: - - "Submit a job with invalid node label" - solution: - - "Check diagnostics and revise your job config" - -- code: -7201 - phrase: AM_RM_HEARTBEAT_IO_EXCEPTION - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Launcher AM failed to heartbeat with YARN RM due to IOException, maybe YARN RM is down" - repro: - - "Stop YARN RM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7202 - phrase: AM_RM_HEARTBEAT_UNKNOWN_EXCEPTION - issuer: PAI_LAUNCHER - causer: UNKNOWN - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Launcher AM failed to heartbeat with YARN RM due to unknown Exception" - repro: - - "AM sends invalid message to YARN RM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7203 - phrase: AM_RM_HEARTBEAT_SHUTDOWN_REQUESTED - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Launcher AM failed to heartbeat with YARN RM due to ShutdownRequest, maybe AM is not managed by YARN RM anymore" - repro: - - "Set small AM expiry time" - - "Set network partition between AM and YARN RM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -# App Failed by Launcher AM -- code: -7250 - phrase: AM_UNKNOWN_EXCEPTION - issuer: PAI_LAUNCHER - causer: PAI_LAUNCHER - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Launcher AM failed due to unknown Exception" - repro: - - "Set network partition between AM and ZK" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7251 - phrase: AM_NON_TRANSIENT_EXCEPTION - issuer: PAI_LAUNCHER - causer: USER_SUBMISSION - type: USER_FAILURE - stage: SUBMITTING - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Launcher AM failed due to NonTransientException, maybe App is non-compliant" - repro: - - "Submit a job with invalid data dir" - solution: - - "Check diagnostics and revise your job config" - -- code: -7252 - phrase: AM_GANG_ALLOCATION_TIMEOUT - issuer: PAI_LAUNCHER - causer: RESOURCE_ALLOCATION_TIMEOUT - type: RESOURCE_ALLOCATION_TIMEOUT - stage: ALLOCATING - behavior: TRANSIENT_CONFLICT - reaction: ALWAYS_BACKOFF_RETRY - reason: "Launcher AM failed due to all the requested resource cannot be satisfied in time" - repro: - - "Disable virtual cluster bonus token" - - "Request more containers in a job than its virtual cluster current available resource" - solution: - - "Wait result from next retry" - - "Decrease task number" - - "Decrease per task resource request" - - "Contact Cluster Admin to increase your virtual cluster quota" - - -################################ -# Range: [-7399, -7300] -# Owner: PAI_LAUNCHER Service -# Description: Job Failure -################################ -# App Failed by YARN -- code: -7300 - phrase: APP_SUBMISSION_YARN_EXCEPTION - issuer: PAI_LAUNCHER - causer: USER_SUBMISSION - type: USER_FAILURE - stage: SUBMITTING - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Failed to submit App to YARN RM due to YarnException, maybe App is non-compliant" - repro: - - "Submit a job to invalid virtual cluster" - solution: - - "Check diagnostics and revise your job config" - -- code: -7301 - phrase: APP_SUBMISSION_IO_EXCEPTION - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: SUBMITTING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Failed to submit App to YARN RM due to IOException, maybe YARN RM is down" - repro: - - "Stop YARN RM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7302 - phrase: APP_SUBMISSION_UNKNOWN_EXCEPTION - issuer: PAI_LAUNCHER - causer: UNKNOWN - type: UNKNOWN_FAILURE - stage: SUBMITTING - behavior: UNKNOWN - reaction: RETRY_TO_MAX - reason: "Failed to submit App to YARN RM due to unknown Exception" - repro: - - "Launcher Service sends invalid message to YARN RM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7303 - phrase: APP_KILLED_UNEXPECTEDLY - issuer: PAI_LAUNCHER - causer: UNKNOWN - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "App killed unexpectedly and directly through YARN RM" - repro: - - "Kill the app directly through YARN RM" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -# App Failed by Launcher Service -- code: -7350 - phrase: APP_RM_RESYNC_LOST - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: UNKNOWN - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "App lost after Launcher Service resynced with YARN RM" - repro: - - "Delete the app entry in YARN RM state store" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7351 - phrase: APP_STOP_FRAMEWORK_REQUESTED - issuer: PAI_LAUNCHER - causer: USER_STOP - type: USER_STOP - stage: UNKNOWN - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "App stopped by Launcher due to user StopFrameworkRequest" - repro: - - "Stop a job" - -- code: -7352 - phrase: APP_AM_DIAGNOSTICS_LOST - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: COMPLETING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Failed to retrieve AMDiagnostics from YARN, maybe the App is cleaned up in YARN" - repro: - - "App is in APPLICATION_RETRIEVING_DIAGNOSTICS state" - - "Stop Launcher Service" - - "Delete the app entry in YARN RM state store" - - "Start Launcher Service" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - -- code: -7353 - phrase: APP_AM_DIAGNOSTICS_DESERIALIZATION_FAILED - issuer: PAI_LAUNCHER - causer: PAI_YARN - type: PLATFORM_FAILURE - stage: COMPLETING - behavior: TRANSIENT_NORMAL - reaction: ALWAYS_RETRY - reason: "Failed to deserialize AMDiagnostics from YARN, maybe it is corrupted or Launcher AM unexpectedly crashed frequently without generating AMDiagnostics" - repro: - - "Set yarn.app.attempt.diagnostics.limit.kc to 1B" - solution: - - "Wait result from next retry" - - "Contact Cluster Admin" - - -################################ -# Range: [-7499, -7400] -# Owner: PAI_LAUNCHER WebServer -# Description: Task Failure -################################ -- code: -7400 - phrase: TASK_STOPPED_ON_APP_COMPLETION - issuer: PAI_LAUNCHER - causer: USER_STOP - type: USER_STOP - stage: UNKNOWN - behavior: NON_TRANSIENT - reaction: NEVER_RETRY - reason: "Task stopped by Launcher due to its app is already completed" - repro: - - "Stop a job with long running container" - - -################################ -# Range: {Undefined Negative ExitCodes} -# Owner: PAI_LAUNCHER -# Description: Container Failure:Shadow Fallback ExitCode -################################ -# Here the code -8000 is just used to represent all undefined negative exitcodes in this spec, -# and the specific undefined exitcode should always override it to expose outside. -- code: -8000 - phrase: CONTAINER_UNKNOWN_YARN_EXIT_STATUS - issuer: PAI_YARN - causer: UNKNOWN - type: UNKNOWN_FAILURE - stage: UNKNOWN - behavior: UNKNOWN - reaction: RETRY_TO_MAX - reason: "Container exited with unknown exitcode which is issued from YARN" - repro: - - "Change YARN code to make it return container exitcode -886" - solution: - - "Contact PAI Dev to recognize this exitcode" diff --git a/src/job-exit-spec/config/job_exit_spec.py b/src/job-exit-spec/config/job_exit_spec.py deleted file mode 100644 index ff602dd89a..0000000000 --- a/src/job-exit-spec/config/job_exit_spec.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python - -import copy - -class JobExitSpec(object): - def __init__(self, cluster_conf, service_conf, default_service_conf): - self.cluster_conf = cluster_conf - self.service_conf = service_conf - self.default_service_conf = default_service_conf - - def validation_pre(self): - return True, None - - def run(self): - result = copy.deepcopy(self.default_service_conf) - result.update(self.service_conf) - return result - - def validation_post(self, conf): - return True, None diff --git a/src/job-exit-spec/config/update_markdown.py b/src/job-exit-spec/config/update_markdown.py deleted file mode 100644 index 32f45fd14d..0000000000 --- a/src/job-exit-spec/config/update_markdown.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python3 - -import sys - -import yaml - - -def escape(s): - return str(s) \ - .replace('<', '\<') \ - .replace('>', '\>') \ - .replace('|', '\|') \ - .replace('\r\n', '
        ') \ - .replace('\r', '
        ') \ - .replace('\n', '
        ') - - -def bold(s): - return '**' + str(s) + '**' - - -def get(dic, key): - if key in dic: - value = dic[key] - - if type(value) == list: - rows = '' - row_id = 1 - for row in value: - rows += str(row_id) + '. ' + escape(row) + '
        ' - row_id += 1 - return rows - - if type(value) == dict: - rows = '' - for row_key, row_value in sorted(value.items()): - rows += escape(row_key) + ': ' + escape(row_value) + '
        ' - return rows - - return escape(value) - else: - return '' - - -def update_markdown(): - sys.stdout = open("job-exit-spec.md", "w") - with open('job-exit-spec.yaml', 'r') as stream: - data = yaml.safe_load(stream) - - schema = data['schema'] - spec = data['spec'] - - print('# PAI Job Exit Spec') - print('1. See details in [job-exit-spec.yaml](job-exit-spec.yaml)') - print('2. This markdown file is generated by [update_markdown.py](update_markdown.py) with [job-exit-spec.yaml](job-exit-spec.yaml)') - print('3. See full doc in [PAI Job Exit Spec User Manual](user-manual.md)') - print('') - - print('## Spec Schema') - print('|field|description|required|unique|type|range|') - print('|-----|-----------|--------|------|----|----|') - for field in schema: - print('|', bold(get(field, 'field')), '|', - get(field, 'description'), '|', - get(field, 'required'), '|', - get(field, 'unique'), '|', - get(field, 'type'), '|', - get(field, 'range'), '|') - print('') - - print('## Spec Table') - print('1. You may need to **scroll right side to see full table**.') - print('2. The code **256** is just used to represent all **undefined ' - 'positive** exitcodes in this spec, and the specific undefined exitcode ' - 'will always override it to expose to user.') - print('3. The code **-8000** is just used to represent all **undefined ' - 'negative** exitcodes in this spec, and the specific undefined exitcode ' - 'will always override it to expose to user.') - print('') - print('|code|phrase|issuer|causer|type|stage|behavior|reaction|reason|repro|solution|pattern|') - print('|----|------|------|------|----|-----|--------|--------|------|-----|--------|-------|') - for code in spec: - print('|', bold(get(code, 'code')), '|', - bold(get(code, 'phrase')), '|', - get(code, 'issuer'), '|', - get(code, 'causer'), '|', - get(code, 'type'), '|', - get(code, 'stage'), '|', - get(code, 'behavior'), '|', - get(code, 'reaction'), '|', - get(code, 'reason'), '|', - get(code, 'repro'), '|', - get(code, 'solution'), '|', - get(code, 'pattern'), '|') - print('') - - -def main(): - update_markdown() - - -if __name__ == "__main__": - main() diff --git a/src/job-exit-spec/config/user-manual.md b/src/job-exit-spec/config/user-manual.md deleted file mode 100644 index 1939d748e6..0000000000 --- a/src/job-exit-spec/config/user-manual.md +++ /dev/null @@ -1,26 +0,0 @@ -# PAI Job Exit Spec User Manual - -## Architecture -**PAI Exit Info Setup and Propagation** -

        - Architecture -

        - -## Spec -**PAI Static Exit Info**: [job-exit-spec.md](job-exit-spec.md) - -**PAI Dynamic Exit Info**: runtime-exit-spec.md - -## How to grow PAI Static Exit Info -### Add a new job exitcode -1. Add the spec of the exitcode into the spec section of [job-exit-spec.yaml](job-exit-spec.yaml) -2. Execute [update_markdown.py](update_markdown.py) to update [job-exit-spec.md](job-exit-spec.md) -3. Return the exitcode from Launcher or PAI Runtime -4. Redeploy PAI - -### Add a new spec field -1. Add the field info into the schema section of [job-exit-spec.yaml](job-exit-spec.yaml) -2. Add the field for all necessary exitcodes into the spec section of [job-exit-spec.yaml](job-exit-spec.yaml) -3. Add the field generator into [update_markdown.py](update_markdown.py) -4. Execute [update_markdown.py](update_markdown.py) to update [job-exit-spec.md](job-exit-spec.md) -5. Redeploy PAI diff --git a/src/tools/.gitignore b/src/tools/.gitignore deleted file mode 100644 index e830cd00fd..0000000000 --- a/src/tools/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.hadoop/ -.config/ -.restserver/ diff --git a/src/tools/config/logging.yaml b/src/tools/config/logging.yaml deleted file mode 100644 index 8a04f4fed3..0000000000 --- a/src/tools/config/logging.yaml +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -version: 1 -disable_existing_loggers: False -formatters: - simple: - format: "[%(asctime)s] %(name)s:%(levelname)s: %(message)s" - -handlers: - console: - class: logging.StreamHandler - level: DEBUG - formatter: simple - stream: ext://sys.stdout - -# info_file_handler: -# class: logging.handlers.RotatingFileHandler -# level: INFO -# formatter: simple -# filename: info.log -# maxBytes: 10485760 # 10MB -# backupCount: 20 -# encoding: utf8 -# -# error_file_handler: -# class: logging.handlers.RotatingFileHandler -# level: ERROR -# formatter: simple -# filename: errors.log -# maxBytes: 10485760 # 10MB -# backupCount: 20 -# encoding: utf8 - -loggers: - my_module: - level: ERROR - handlers: [console] - propagate: no - -root: - level: DEBUG - handlers: [console] -# handlers: [console, info_file_handler, error_file_handler] \ No newline at end of file diff --git a/src/tools/node_maintain.py b/src/tools/node_maintain.py deleted file mode 100644 index 31ca5b9391..0000000000 --- a/src/tools/node_maintain.py +++ /dev/null @@ -1,447 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -from __future__ import print_function - -import argparse -import time -import re -import logging -import copy -import sys - -from utility import log -log.setup_logging() - -from operator_wrapper import AlertOperator, KubernetesOperator, YarnOperator, Resource, RestserverOperator - -logger = logging.getLogger(__name__) - -def get_unready_nodes(decommissioned_nodes, current_status): - unready_nodes = {} - for node, state in current_status.items(): - # should decommission but not - if state not in {"DECOMMISSIONED"} and node in decommissioned_nodes: - unready_nodes[node] = state - # should recommission but not - if state in {"DECOMMISSIONED", "DECOMMISSIONING"} and node not in decommissioned_nodes: - unready_nodes[node] = state - return unready_nodes - - -def validate_string_is_ip(validated_str): - ip_pattern = re.compile(r"^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])(\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)){3}$") - found = ip_pattern.match(validated_str) is not None - return found - - -def get_gpu_alert(args): - alert_operator = AlertOperator(args.prometheus_ip, args.prometheus_port) - alerting_nodes = alert_operator.get_gpu_alert_nodes() - logger.info("Successfully aggregate gpu alerts.") - if len(alerting_nodes) > 0: - output_info = '\n'.join([node_name+': '+alert_type for node_name, alert_type in alerting_nodes.items()]) - else: - output_info = "No gpu alerting nodes" - print(output_info) - - -def get_decommission_nodes(args): - k8s_operator = KubernetesOperator(args.api_server_ip) - existing_nodes = k8s_operator.get_nodes() - logger.info("Successfully aggregate blacklist info.") - if len(existing_nodes) > 0: - output_info = ','.join(existing_nodes) - else: - output_info = "No blacklist nodes" - print(output_info) - return existing_nodes - - -def add_decommission_nodes(args): - k8s_operator = KubernetesOperator(args.api_server_ip) - existing_nodes = k8s_operator.get_nodes() - nodes = args.nodes - inter_list = existing_nodes & nodes - if len(inter_list) > 0: - logger.warning("Try to add existing blacklist nodes: {}".format(','.join(inter_list))) - full_list = existing_nodes | nodes - k8s_operator.set_nodes(full_list) - logger.info("Add node: {} to blacklist".format(','.join(args.nodes))) - return full_list - - -def remove_decommission_nodes(args): - k8s_operator = KubernetesOperator(args.api_server_ip) - existing_nodes = k8s_operator.get_nodes() - nodes = args.nodes - supplement_list = nodes - existing_nodes - if len(supplement_list) > 0: - logger.warning("Try to remove non-existing blacklist nodes: {}".format(','.join(supplement_list))) - full_list = existing_nodes - nodes - k8s_operator.set_nodes(full_list) - logger.info("Remove node: {} from blacklist".format(','.join(args.nodes))) - return full_list - - -def update_decommission_nodes(args): - k8s_operator = KubernetesOperator(args.api_server_ip) - nodes = args.nodes - k8s_operator.set_nodes(nodes) - logger.info("Update blacklist nodes: {}".format(','.join(args.nodes))) - return nodes - - -def refresh_yarn_nodes(args): - k8s_operator = KubernetesOperator(args.api_server_ip) - yarn_operator = YarnOperator(args.resource_manager_ip) - while True: - yarn_operator.decommission_nodes() - node_info = yarn_operator.get_nodes_info() - current_status = {k: v["state"] for k, v in node_info.items()} - decommissioned_nodes = k8s_operator.get_nodes() - unready_nodes = get_unready_nodes(decommissioned_nodes, current_status) - if len(unready_nodes) == 0: - break - unready_info = ','.join([node_name+" in "+status for node_name, status in unready_nodes.items()]) - logger.info("Unready nodes: {}. Waiting...".format(unready_info)) - time.sleep(30) - logger.info("Successfully refresh nodes.") - - -def convert_nodes(nodes_str): - if isinstance(nodes_str, str): - nodes = set(nodes_str.split(',')) - for node in nodes: - if not validate_string_is_ip(node): - raise argparse.ArgumentTypeError("Value has to be a comma-delimited ip list, but found {}".format(node)) - return nodes - return set() - - -def validate_vc_name(vc_name_str): - if re.match(r"^[A-Za-z0-9_]+$", vc_name_str) is None: - raise argparse.ArgumentTypeError("invalid vc name: {}. Only alphanumeric and _ allowed".format(vc_name_str)) - return vc_name_str - - -def is_dedicated_vc(queue_name, queue_attr): - # print(json.dumps(queue_attr, indent=2)) - if queue_name == "" or queue_name == "*" or queue_attr["defaultNodeLabelExpression"] != queue_name: - return False - if queue_name not in queue_attr["capacities"] or queue_attr["capacities"][queue_name]["maxCapacity"] != 100: - return False - return True - - -def get_resource_by_label(nodes_info): - labels_dict = {} - default_resource = Resource(**{"cpus": 0, "memory": 0, "gpus": 0}) - for node, info in nodes_info.items(): - if info["nodeLabel"] not in labels_dict: - labels_dict[info["nodeLabel"]] = { - "resource": default_resource - } - labels_dict[info["nodeLabel"]]["resource"] += info["resource"] - return labels_dict - - -def get_dedicate_vc(args): - yarn_operator = YarnOperator(args.resource_manager_ip) - queues_info = yarn_operator.get_queues_info() - nodes_info = yarn_operator.get_nodes_info() - dedicate_queues = {queue_name: {"resource": Resource(**{"cpus": 0, "memory": 0, "gpus": 0}), "nodes": []} for queue_name, queue_info in queues_info.items() if - is_dedicated_vc(queue_name, queue_info)} - if len(dedicate_queues) == 0: - logger.info("No dedicated vc found") - return - - labeled_resources = get_resource_by_label(nodes_info) - for partition in labeled_resources: - if partition in dedicate_queues: - dedicate_queues[partition]["resource"] = labeled_resources[partition]["resource"] - - for node in nodes_info: - if nodes_info[node]["nodeLabel"] in dedicate_queues: - dedicate_queues[nodes_info[node]["nodeLabel"]]["nodes"].append(node) - for queue_name, queue_attr in dedicate_queues.items(): - print(queue_name + ":") - print("\tNodes: " + ",".join(queue_attr["nodes"])) - print("\tResource: ".format(queue_attr["resource"].cpus, queue_attr["resource"].memory, queue_attr["resource"].gpus)) - - -def convert_percentage_to_gpus(queues_info, partition_resource): - new_queues_info = copy.deepcopy(queues_info) - for queue, info in new_queues_info.items(): - p = info["capacity"] / float(100) - info["gpus"] = partition_resource.gpus * p - return new_queues_info - - -def convert_gpus_to_percentage(queues_info, partition_resource): - new_queues_info = copy.deepcopy(queues_info) - if partition_resource.gpus > 0: - for queue, info in new_queues_info.items(): - gpus = info["gpus"] - info["capacity"] = float(gpus) / partition_resource.gpus * 100 - return new_queues_info - - -def normalize_percentage(queues_info): - new_queues_info = copy.deepcopy(queues_info) - sum_percentage = 0 - for queue, info in new_queues_info.items(): - sum_percentage += info["capacity"] - - if sum_percentage != 100: - logger.warning("Renormalize percentage to 100%, current: {}%".format(sum_percentage)) - new_queues_info["default"]["capacity"] -= sum_percentage - 100 - - for queue, info in new_queues_info.items(): - if queue != "default": - info["maxCapacity"] = info["capacity"] - - return new_queues_info - - -def add_dedicate_vc(args): - yarn_operator = YarnOperator(args.resource_manager_ip) - restserver_operator = RestserverOperator(args.restserver_ip) - vc_name = args.vc_name - nodes = args.nodes - - logger.info("Adding cluster label...") - existing_labels = yarn_operator.get_cluster_labels() - if vc_name in existing_labels: - logger.warning("Label already exists: {}".format(vc_name)) - else: - yarn_operator.add_cluster_label(vc_name) - - logger.info("Adding dedicated vc...") - queues_info = yarn_operator.get_queues_info() - if vc_name in queues_info: - logger.warning("Virtual cluster already exists: {}. Adding node to it".format(vc_name)) - else: - restserver_operator.add_vc(vc_name) - yarn_operator.add_dedicated_queue(vc_name) - - nodes_info = yarn_operator.get_nodes_info() - if len(nodes) > 0: - logger.info("Labeling node...") - - if queues_info["default"]["maxCapacity"] == 100 or queues_info["default"]["maxCapacity"] > \ - queues_info["default"]["capacity"]: - queues_info["default"]["maxCapacity"] = 100.0 - - added_resource = Resource(**{"cpus": 0, "memory": 0, "gpus": 0}) - for node, info in nodes_info.items(): - if node in nodes and info["nodeLabel"] == "": - added_resource += info["resource"] - - default_partition_resource = get_resource_by_label(nodes_info)[""]["resource"] - default_vc_percentage = queues_info["default"]["capacity"] / 100.0 - default_vc_resource = default_partition_resource * default_vc_percentage - - if default_vc_resource.cpus < added_resource.cpus \ - or default_vc_resource.gpus < added_resource.gpus \ - or default_vc_resource.memory < added_resource.memory: - logger.error("Default vc resource isn't enough for the dedicated vc, please free some resource") - sys.exit(1) - - new_default_partition_resource = default_partition_resource - added_resource - new_default_vc_resource = default_vc_resource - added_resource - - queues_info_with_gpus = convert_percentage_to_gpus(queues_info, default_partition_resource) - queues_info_with_gpus["default"]["gpus"] = new_default_vc_resource.gpus - new_queues_percentage = convert_gpus_to_percentage(queues_info_with_gpus, new_default_partition_resource) - new_queues_percentage = normalize_percentage(new_queues_percentage) - updated_dict = {} - for queue, info in new_queues_percentage.items(): - updated_dict[queue] = { - "capacity": info["capacity"], - "maximum-capacity": info["maxCapacity"] - } - if queue != "default": - updated_dict[queue]["disable_preemption"] = True - - yarn_operator.label_nodes(nodes, vc_name) - yarn_operator.update_queue_capacity(updated_dict) - - -def remove_dedicate_vc(args): - yarn_operator = YarnOperator(args.resource_manager_ip) - restserver_operator = RestserverOperator(args.restserver_ip) - vc_name = args.vc_name - nodes = args.nodes - remove_queue_flag = nodes is None - - logger.info("Unlabeling node...") - nodes_info = yarn_operator.get_nodes_info() - queues_info = yarn_operator.get_queues_info() - if nodes is None: - nodes = set(nodes_info.keys()) - t_nodes = [node for node in nodes if nodes_info[node]["nodeLabel"] == vc_name] - if len(t_nodes) > 0: - - if queues_info["default"]["maxCapacity"] == 100 or queues_info["default"]["maxCapacity"] > \ - queues_info["default"]["capacity"]: - queues_info["default"]["maxCapacity"] = 100.0 - - removed_resource = Resource(**{"cpus": 0, "memory": 0, "gpus": 0}) - for node, info in nodes_info.items(): - if node in nodes and info["nodeLabel"] == vc_name: - removed_resource += info["resource"] - - default_partition_resource = get_resource_by_label(nodes_info)[""]["resource"] - default_vc_percentage = queues_info["default"]["capacity"] / 100.0 - default_vc_resource = default_partition_resource * default_vc_percentage - - new_default_partition_resource = default_partition_resource + removed_resource - new_default_vc_resource = default_vc_resource + removed_resource - - queues_info_with_gpus = convert_percentage_to_gpus(queues_info, default_partition_resource) - queues_info_with_gpus["default"]["gpus"] = new_default_vc_resource.gpus - new_queues_percentage = convert_gpus_to_percentage(queues_info_with_gpus, new_default_partition_resource) - new_queues_percentage = normalize_percentage(new_queues_percentage) - updated_dict = {} - for queue, info in new_queues_percentage.items(): - updated_dict[queue] = { - "capacity": info["capacity"], - "maximum-capacity": info["maxCapacity"] - } - - yarn_operator.label_nodes(t_nodes, "") - yarn_operator.update_queue_capacity(updated_dict) - - if remove_queue_flag: - logger.info("Removing dedicated vc...") - if vc_name not in queues_info: - logger.warning("Virtual cluster not found: {}.".format(vc_name)) - else: - yarn_operator.remove_dedicated_queue(vc_name) - restserver_operator.delete_vc(vc_name) - - logger.info("Removing cluster label...") - if vc_name not in yarn_operator.get_cluster_labels(): - logger.warning("Cluster label not found: {}".format(vc_name)) - else: - yarn_operator.remove_cluster_label(vc_name) - -def setup_user(args): - username = args.username - password = args.password - RestserverOperator.setup_user(username, password) - logger.info("Setup user done") - - -def setup_parser(): - top_parser = argparse.ArgumentParser() - sub_parser = top_parser.add_subparsers(dest="subcommands") - - # a parent parser to avoid repeatedly add arguments for all subcommands - parent_parser = argparse.ArgumentParser(add_help=False) - parent_parser.add_argument("-m", "--master", dest="master_ip", - help="master node ip", required=True) - parent_parser.add_argument("--resource-manager-ip", - help="specify yarn resource manager ip separately, by default it's master node ip") - parent_parser.add_argument("--api-server-ip", - help="specify kubernetes api-server ip separately, by default it's master node ip") - parent_parser.add_argument("--prometheus-ip", - help="specify prometheus ip separately, by default it's master node ip") - parent_parser.add_argument("--restserver-ip", - help="specify restserver ip separately, by default it's master node ip") - parent_parser.add_argument("--prometheus-port", default=9091, - help="specify prometheus port, by default it's 9091") - - # setup restserver user - user_parser = sub_parser.add_parser("user", help="query prometheus alerts") - user_subparsers = user_parser.add_subparsers(dest="action") - - parser_set = user_subparsers.add_parser("set", parents=[parent_parser], help="print current gpu alerts") - parser_set.add_argument("-u", "--username", required=True) - parser_set.add_argument("-p", "--password", required=True) - parser_set.set_defaults(func=setup_user) - - # prometheus operator parser - prometheus_parser = sub_parser.add_parser("badgpus", help="query prometheus alerts") - prometheus_subparsers = prometheus_parser.add_subparsers(dest="action") - - parser_get = prometheus_subparsers.add_parser("get", parents=[parent_parser], help="print current gpu alerts") - parser_get.set_defaults(func=get_gpu_alert) - - # blacklist parser - blacklist_parser = sub_parser.add_parser("blacklist", help="blacklist operation") - blacklist_subparsers = blacklist_parser.add_subparsers(dest="action") - - parser_get = blacklist_subparsers.add_parser("get", parents=[parent_parser], help="get blacklist nodes") - parser_get.set_defaults(func=get_decommission_nodes) - - parser_add = blacklist_subparsers.add_parser("add", parents=[parent_parser], help="add nodes to blacklist") - parser_add.add_argument("-n", "--nodes", type=convert_nodes, help="support comma-delimited node list", required=True) - parser_add.set_defaults(func=add_decommission_nodes) - - parser_remove = blacklist_subparsers.add_parser("remove", parents=[parent_parser], help="remove nodes from blacklist") - parser_remove.add_argument("-n", "--nodes", type=convert_nodes, help="support comma-delimited node list", required=True) - parser_remove.set_defaults(func=remove_decommission_nodes) - - parser_update = blacklist_subparsers.add_parser("update", parents=[parent_parser], help="update blacklist") - parser_update.add_argument("-n", "--nodes", type=convert_nodes, help="support comma-delimited node list") - parser_update.set_defaults(func=update_decommission_nodes) - - parser_refresh = blacklist_subparsers.add_parser("enforce", parents=[parent_parser], - help="enforce yarn to gracefully decommission nodes in blacklist") - parser_refresh.set_defaults(func=refresh_yarn_nodes) - - # dedicated vc parser - dedicated_vc_parser = sub_parser.add_parser("dedicated-vc", help="operate dedicated vc") - dedicated_vc_subparsers = dedicated_vc_parser.add_subparsers(dest="action") - - parser_get = dedicated_vc_subparsers.add_parser("get", parents=[parent_parser], help="get dedicate vc info") - parser_get.set_defaults(func=get_dedicate_vc) - - parser_add = dedicated_vc_subparsers.add_parser("add", parents=[parent_parser], help="add dedicate vc") - parser_add.add_argument("-n", "--nodes", type=convert_nodes, help="support comma-delimited node list", default={}) - parser_add.add_argument("-v", "--vc-name", type=validate_vc_name, required=True) - parser_add.set_defaults(func=add_dedicate_vc) - - parser_remove = dedicated_vc_subparsers.add_parser("remove", parents=[parent_parser], help="remove dedicate vc") - parser_remove.add_argument("-v", "--vc-name", type=validate_vc_name, required=True) - parser_remove.add_argument("-n", "--nodes", type=convert_nodes, help="support comma-delimited node list") - parser_remove.set_defaults(func=remove_dedicate_vc) - - return top_parser - - -def main(): - parser = setup_parser() - args = parser.parse_args() - args.resource_manager_ip = args.resource_manager_ip or args.master_ip - args.api_server_ip = args.api_server_ip or args.master_ip - args.prometheus_ip = args.prometheus_ip or args.master_ip - args.restserver_ip = args.restserver_ip or args.master_ip - try: - args.func(args) - except Exception as e: - from subprocess import CalledProcessError - if isinstance(e, CalledProcessError): - logger.error(e.output) - else: - logger.exception(e) - - -if __name__ == "__main__": - main() diff --git a/src/tools/operator_wrapper/__init__.py b/src/tools/operator_wrapper/__init__.py deleted file mode 100644 index 84e139b798..0000000000 --- a/src/tools/operator_wrapper/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -from __future__ import absolute_import - -__all__ = ["AlertOperator", "KubernetesOperator", "YarnOperator", "Resource", "RestserverOperator"] - - -from .alert_operator import AlertOperator -from .kubernetes_operator import KubernetesOperator -from .yarn_operator import YarnOperator, Resource -from .base_operator import BaseOperator -from .restserver_operator import RestserverOperator diff --git a/src/tools/operator_wrapper/alert_operator.py b/src/tools/operator_wrapper/alert_operator.py deleted file mode 100644 index f8dae50ecd..0000000000 --- a/src/tools/operator_wrapper/alert_operator.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import logging -import sys - -from .base_operator import BaseOperator - -logger = logging.getLogger(__name__) - - -class AlertOperator(BaseOperator): - ALERT_TYPE = { - "gpu_related": {"NvidiaSmiLatencyTooLarge", "NvidiaSmiEccError", "NvidiaMemoryLeak", "NvidiaZombieProcess", "GpuUsedByExternalProcess", "GpuUsedByZombieContainer"}, - } - - def __init__(self, prometheus_ip, prometheus_port=9091): - super(AlertOperator, self).__init__(prometheus_ip, prometheus_port) - - def get_gpu_alert_nodes(self): - api_path = "/prometheus/api/v1/query?query=ALERTS" - alerts_info = self.request(api_path) - - if alerts_info["status"] != "success": - logger.error("Alert response error: {}".format(alerts_info["data"])) - sys.exit(1) - - alerts_info = alerts_info["data"]["result"] - gpu_alert_nodes = {} - for alert in alerts_info: - metric = alert["metric"] - if metric["alertname"] in self.ALERT_TYPE["gpu_related"] and metric["alertstate"] == "firing": - node_ip = metric["instance"].split(':')[0] - gpu_alert_nodes[node_ip] = metric["alertname"] - - return gpu_alert_nodes diff --git a/src/tools/operator_wrapper/base_operator.py b/src/tools/operator_wrapper/base_operator.py deleted file mode 100644 index fe725414b1..0000000000 --- a/src/tools/operator_wrapper/base_operator.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import logging -import requests -import subprocess - -logger = logging.getLogger(__name__) - - -class BaseOperator(object): - def __init__(self, master_ip, port): - self.master_ip = master_ip - self.port = port - - def request(self, api_path, method="get", return_json=True, timeout=10, **kwargs): - - url = "http://{}:{}{}".format(self.master_ip, self.port, api_path) - - logger.debug("{}: {}".format(method, url)) - func = getattr(requests, method) - response = func(url, timeout=timeout, **kwargs) - response.raise_for_status() - if return_json: - return response.json() - else: - return response.text - - def execute(self, command, redirect_stderr=True, shell=True, **kwargs): - logger.debug(command) - stderr = subprocess.STDOUT if redirect_stderr else None - output = subprocess.check_output(command, stderr=stderr, shell=shell, **kwargs) - try: - output = output.decode("utf8") - except AttributeError: - pass - return output - - -if __name__ == "__main__": - pass - diff --git a/src/tools/operator_wrapper/kubernetes_operator.py b/src/tools/operator_wrapper/kubernetes_operator.py deleted file mode 100644 index d8e35a9c72..0000000000 --- a/src/tools/operator_wrapper/kubernetes_operator.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import sys -sys.path.append("../..") -from deployment.paiLibrary.common.kubernetes_handler import get_configmap, update_configmap -from deployment.k8sPaiLibrary.maintainlib import common - - -class KubernetesOperator(object): - kubernetes_template = "../../deployment/k8sPaiLibrary/template/config.template" - kube_config_path = "./.config" - configmap_name = "exclude-file" - configmap_data_key = "nodes" - - def __init__(self, master_ip): - self.master_ip = master_ip - self.setup_kubernetes_configfile(master_ip) - - def setup_kubernetes_configfile(self, api_servers_ip): - - template_data = common.read_template(self.kubernetes_template) - dict_map = { - "cluster_cfg": {"kubernetes": {"api-servers-ip": api_servers_ip}}, - } - generated_data = common.generate_from_template_dict(template_data, dict_map) - - common.write_generated_file(generated_data, self.kube_config_path) - - def get_nodes(self): - configmap_info = get_configmap(self.kube_config_path, self.configmap_name) - nodes_str = configmap_info["data"][self.configmap_data_key] - nodes = set(nodes_str.splitlines()) - return nodes - - def set_nodes(self, nodes): - nodes = set(nodes) - nodes_str = '\n'.join(nodes) - data_dict = {self.configmap_data_key: nodes_str} - update_configmap(self.kube_config_path, self.configmap_name, data_dict) diff --git a/src/tools/operator_wrapper/restserver_operator.py b/src/tools/operator_wrapper/restserver_operator.py deleted file mode 100644 index 0bf83ddd65..0000000000 --- a/src/tools/operator_wrapper/restserver_operator.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import logging -import os -import json -import sys - -from base_operator import BaseOperator - -logger = logging.getLogger(__name__) - - -class RestserverOperator(BaseOperator): - - secret_file = ".restserver/user_info" - - def __init__(self, restserver_ip, restserver_port=9186): - super(RestserverOperator, self).__init__(restserver_ip, restserver_port) - self.token = "" - self.load_token() - - @classmethod - def setup_user(cls, username, password): - if not os.path.exists(os.path.dirname(cls.secret_file)): - os.mkdir(os.path.dirname(cls.secret_file)) - with open(cls.secret_file, "w") as f: - data = { - "username": username, - "password": password - } - json.dump(data, f) - - def load_token(self): - if not os.path.exists(self.secret_file): - return - with open(self.secret_file) as f: - data = json.load(f) - api_path = "/api/v1/token" - headers = { - "Content-Type": "application/x-www-form-urlencoded" - } - response = self.request(api_path, method="post", headers=headers, data=data) - self.token = response["token"] - - def get_vc(self): - api_path = "/api/v1/virtual-clusters" - response = self.request(api_path) - return response - - def add_vc(self, name, capacity=0, maxcapacity=0): - if self.token == "": - logger.error("Anonymous user can't add vc, please setup user firstly") - sys.exit(1) - api_path = "/api/v1/virtual-clusters/{}".format(name) - headers = { - "Authorization": "Bearer " + self.token - } - data = { - "vcCapacity": capacity, - "vcMaxCapacity": maxcapacity - } - response = self.request(api_path, method="put", headers=headers, data=data) - return response - - def delete_vc(self, name): - if self.token == "": - logger.error("Anonymous user can't delete vc, please setup user firstly") - sys.exit(1) - api_path = "/api/v1/virtual-clusters/{}".format(name) - headers = { - "Authorization": "Bearer " + self.token - } - response = self.request(api_path, method="delete", headers=headers) - return response - - def delete_group(self, name): - if self.token == "": - logger.error("Anonymous user can't delete group, please setup user firstly") - sys.exit(1) - api_path = "/api/v2/group/{}".format(name) - headers = { - "Authorization": "Bearer " + self.token - } - response = self.request(api_path, method="delete", headers=headers) - return response - - -if __name__ == '__main__': - pass - - - - - - diff --git a/src/tools/operator_wrapper/yarn_operator.py b/src/tools/operator_wrapper/yarn_operator.py deleted file mode 100644 index fbf55e5ac0..0000000000 --- a/src/tools/operator_wrapper/yarn_operator.py +++ /dev/null @@ -1,392 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import logging -import sys -import os -import re -import json -from bs4 import BeautifulSoup -import dicttoxml -dicttoxml.LOG.setLevel(logging.ERROR) -import time -import attr -from attr.validators import instance_of - - -from base_operator import BaseOperator - -logger = logging.getLogger(__name__) - -@attr.s -class Resource(object): - cpus = attr.ib(converter=float, validator=instance_of(float)) - gpus = attr.ib(converter=float, validator=instance_of(float)) - memory = attr.ib(converter=float, validator=instance_of(float)) - - def __add__(self, other): - if isinstance(other, Resource): - cpus = self.cpus + other.cpus - gpus = self.gpus + other.gpus - memory = self.memory + other.memory - return Resource(cpus=cpus, gpus=gpus, memory=memory) - else: - raise NotImplemented - - def __radd__(self, other): - return self + other - - def __sub__(self, other): - if isinstance(other, Resource): - cpus = self.cpus - other.cpus - gpus = self.gpus - other.gpus - memory = self.memory - other.memory - return Resource(cpus=cpus, gpus=gpus, memory=memory) - else: - raise NotImplemented - - def __mul__(self, other): - if isinstance(other, (int, float)): - cpus = self.cpus * other - gpus = self.gpus * other - memory = self.memory * other - return Resource(cpus=cpus, gpus=gpus, memory=memory) - else: - raise NotImplemented - - def __rmul__(self, other): - return self * other - - def __div__(self, other): - if isinstance(other, (int, float)): - cpus = self.cpus / other - gpus = self.gpus / other - memory = self.memory / other - return Resource(cpus=cpus, gpus=gpus, memory=memory) - else: - raise NotImplemented - - -class YarnOperator(BaseOperator): - yarn_config_path = "./.hadoop" - - def __init__(self, master_ip, port=8088): - super(YarnOperator, self).__init__(master_ip, port) - self.setup_yarn_configfile() - - def setup_yarn_configfile(self): - if not os.path.exists(self.yarn_config_path): - os.mkdir(self.yarn_config_path) - - yarn_config_str = \ - ''' - - yarn.resourcemanager.hostname - {} - - '''.format(self.master_ip) - - with open(os.path.join(self.yarn_config_path, "yarn-site.xml"), 'w') as f: - f.write(yarn_config_str) - - def get_nodes_info(self): - api_path = "/ws/v1/cluster/nodes" - nodes_info = self.request(api_path) - current_nodes = {} - for node in nodes_info["nodes"]["node"]: - host = node["nodeHostName"] - state = node["state"] - node_label = node.get("nodeLabels", [""])[0] - resource = Resource(**{ - "cpus": node["usedVirtualCores"] + node["availableVirtualCores"], - "memory": node["usedMemoryMB"] + node["availMemoryMB"], - "gpus": node["usedGPUs"] + node["availableGPUs"] - }) - current_nodes[host] = { - "state": state, - "nodeLabel": node_label, - "resource": resource - } - return current_nodes - - def decommission_nodes(self): - command = "yarn --config {} rmadmin -refreshNodes -g -server".format(self.yarn_config_path) - self.execute(command) - - def get_cluster_labels(self): - # Sample output: "Node Labels: ," - # Sample output: "Node Labels: " - command = "yarn --config {} cluster --list-node-labels".format(self.yarn_config_path) - - output = self.execute(command) - - lines = output.split("\n") - labels = dict() # key: label name, value: exclusivity - for line in lines: - if not line.startswith("Node Labels:"): - continue - line = line.lstrip("Node Labels:") - labels_str = line.split(",") - label_regex = r"<([a-zA-Z0-9][a-zA-Z0-9_\-]*):exclusivity=(true|false)>" - for label_str in labels_str: - match = re.search(label_regex, label_str) - if match: - label_name, exclusivity = match.groups() - exclusivity = exclusivity == "true" - labels[label_name] = {"exclusive": exclusivity} - - return labels - - def add_cluster_label(self, label, exclusivity=True): - - label_str = "{}(exclusive={})".format(label, "true" if exclusivity else "false") - - command = "yarn --config {} rmadmin -addToClusterNodeLabels \"{}\"".format(self.yarn_config_path, label_str) - self.execute(command) - - def remove_cluster_label(self, label): - - command = "yarn --config {} rmadmin -removeFromClusterNodeLabels {}".format(self.yarn_config_path, label) - self.execute(command) - - def label_nodes(self, nodes, label): - if isinstance(nodes, str): - nodes = [nodes] - - nodes_str_builder = [] - - for node in nodes: - node_str = "{}={}".format(node, label) - nodes_str_builder.append(node_str) - - nodes_str = " ".join(nodes_str_builder) - - # yarn rmadmin -replaceLabelsOnNode "node1[:port]=label1 node2=label2" [-failOnUnknownNodes] - command = "yarn --config {} rmadmin -replaceLabelsOnNode \"{}\" -failOnUnknownNodes"\ - .format(self.yarn_config_path, nodes_str) - - self.execute(command) - - def get_queues_info(self): - api_path = "/ws/v1/cluster/scheduler" - scheduler_info = self.request(api_path) - - def traverse(queue_info, result_dict): - if queue_info["type"] == "capacitySchedulerLeafQueueInfo": - result_dict[queue_info["queueName"]] = { - "capacity": queue_info["absoluteCapacity"], - "maxCapacity": queue_info["absoluteMaxCapacity"], - "usedCapacity": queue_info["absoluteUsedCapacity"], - "numActiveJobs": queue_info["numActiveApplications"], - "numJobs": queue_info["numApplications"], - "numPendingJobs": queue_info["numPendingApplications"], - "resourcesUsed": queue_info["resourcesUsed"], - "state": queue_info["state"], - "nodeLabels": queue_info["nodeLabels"], - "capacities": { - partitionCapacities["partitionName"]: { - "capacity": partitionCapacities["absoluteCapacity"], - "maxCapacity": partitionCapacities["absoluteMaxCapacity"], - "usedCapacity": partitionCapacities["absoluteUsedCapacity"], - } - for partitionCapacities in queue_info["capacities"]["queueCapacitiesByPartition"] - }, - "preemptionDisabled": queue_info.get("preemptionDisabled", False), - "defaultNodeLabelExpression": queue_info.get("defaultNodeLabelExpression", ""), - } - elif queue_info["type"] == "capacityScheduler": - for queue in queue_info["queues"]["queue"]: - traverse(queue, result_dict) - else: - logger.error("unsupported scheduler type: {}".format(queue_info["type"])) - return - - queues = {} - traverse(scheduler_info["scheduler"]["schedulerInfo"], queues) - return queues - - def get_resource_by_label(self): - api_path = "/cluster/nodelabels" - html_text = self.request(api_path, return_json=False) - - soup = BeautifulSoup(html_text) - result = soup.find("table", id="nodelabels") - tbody = result.find("tbody") - labels = tbody.find_all("tr") - labels_dict = {} - for label in labels: - label_dict = {} - - label_name_raw, exclusive_raw, active_nm_raw, resources_raw = label.find_all("td") - label_name = label_name_raw.string.strip() - if label_name == "": - label_name = "" - - exclusive = exclusive_raw.string.strip() - if exclusive == "Exclusive Partition": - label_dict["exclusive"] = True - elif exclusive == "Non Exclusive Partition": - label_dict["exclusive"] = False - else: - logger.error("unknown exclusivity: {}".format(exclusive)) - sys.exit(1) - - if active_nm_raw.find('a'): - active_nm = active_nm_raw.find('a').string.strip() - else: - active_nm = active_nm_raw.string.strip() - label_dict["active_nm"] = int(active_nm) - - resources = resources_raw.string.strip() - r_dict = {} - for resource in resources.strip("<>").split(","): - r_type, r_quota = resource.split(":") - r_dict[r_type.strip()] = int(r_quota) - label_dict["resource"] = Resource(**{ - "cpus": r_dict["vCores"], - "memory": r_dict["memory"], - "gpus": r_dict["GPUs"] - }) - labels_dict[label_name] = label_dict - return labels_dict - - def add_dedicated_queue(self, label_name): - - raw_dict = { - "update-queue": { - "queue-name": "root.{}".format(label_name), - "params": [ - { - "key": "capacity", - "value": 0 - }, - { - "key": "maximum-capacity", - "value": 0 - }, - { - "key": "default-node-label-expression", - "value": label_name - }, - { - "key": "accessible-node-labels", - "value": label_name - }, - { - "key": "disable_preemption", - "value": True - }, - { - "key": "maximum-applications", - "value": 10000 - }, - { - "key": "user-limit-factor", - "value": 100 - } - ] - - }, - "global-updates": [ - { - "key": "yarn.scheduler.capacity.root.accessible-node-labels.{}.capacity".format(label_name), - "value": 100 - }, - { - "key": "yarn.scheduler.capacity.root.{vc_name}.accessible-node-labels.{vc_name}.capacity".format(vc_name=label_name), - "value": 100 - } - ] - } - request_xml = self.generate_queue_update_xml(raw_dict) - - self.put_queue_update_xml(request_xml) - - def remove_dedicated_queue(self, label_name): - - raw_dict = { - "update-queue": { - "queue-name": "root.{}".format(label_name), - "params": [ - { - "key": "state", - "value": "STOPPED" - } - ] - - }, - } - request_xml = self.generate_queue_update_xml(raw_dict) - - self.put_queue_update_xml(request_xml) - while True: - current_state = self.get_queues_info()[label_name]["state"] - if current_state == "STOPPED": - break - logger.info("current vc status: {}. waiting...".format(current_state)) - time.sleep(5) - - raw_dict = { - # "remove-queue": "root.{}".format(label_name), - "global-updates": [ - { - "key": "yarn.scheduler.capacity.root.accessible-node-labels.{}.capacity".format(label_name), - "value": 0 - }, - { - "key": "yarn.scheduler.capacity.root.{vc_name}.accessible-node-labels.{vc_name}.capacity".format( - vc_name=label_name), - "value": 0 - }, - { - "key": "yarn.scheduler.capacity.root.{vc_name}.default-node-label-expression".format( - vc_name=label_name), - "value": None - } - ] - } - request_xml = self.generate_queue_update_xml(raw_dict) - - self.put_queue_update_xml(request_xml) - - def update_queue_capacity(self, update_dict): - # Todo: current we use global-updates to update capacity due to dicttoxml package limitation - # Todo: change it to update-queue after this pr: https://github.com/quandyfactory/dicttoxml/pull/64 - raw_dict = {"global-updates": []} - for queue, info in update_dict.items(): - for attribute, value in info.items(): - key = "yarn.scheduler.capacity.root.{}.{}".format(queue, attribute) - raw_dict["global-updates"].append({ - "key": key, - "value": value - }) - - request_xml = self.generate_queue_update_xml(raw_dict) - self.put_queue_update_xml(request_xml) - - def generate_queue_update_xml(self, g_dict): - return dicttoxml.dicttoxml(g_dict, attr_type=False, custom_root="sched-conf", item_func=lambda x: "entry") - - def put_queue_update_xml(self, update_xml): - api_path = "/ws/v1/cluster/scheduler-conf" - headers = {"Content-Type": "application/xml"} - self.request(api_path, method="put", return_json=False, headers=headers, data=update_xml) - - -if __name__ == "__main__": - pass - diff --git a/src/tools/reports.py b/src/tools/reports.py deleted file mode 100644 index fa349cbfea..0000000000 --- a/src/tools/reports.py +++ /dev/null @@ -1,960 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import urllib.parse -import argparse -import logging -import datetime -import json -import collections -import re -import sys -import math - -import sqlite3 -import requests - -import flask -from flask import Flask -from flask import request -from flask import Response - -logger = logging.getLogger(__name__) - - -def walk_json_field_safe(obj, *fields): - """ for example a=[{"a": {"b": 2}}] - walk_json_field_safe(a, 0, "a", "b") will get 2 - walk_json_field_safe(a, 0, "not_exist") will get None - """ - try: - for f in fields: - obj = obj[f] - return obj - except: - return None - - -def request_with_error_handling(url): - try: - response = requests.get(url, allow_redirects=True, timeout=15) - response.raise_for_status() - return response.json() - except Exception as e: - logger.exception(e) - return None - - -def format_time(timestamp): - d = datetime.datetime.fromtimestamp(timestamp) - return d.strftime("%Y/%m/%d-%H:%M:%S") - - -def get_ip(ip_port): - """ return 1.2.3.4 on 1.2.3.4:123 """ - m = re.match("([0-9]+[.][0-9]+[.][0-9]+[.][0-9]+):?.*", ip_port) - if m: - return m.groups()[0] - return ip_port - - -class JobInfo(object): - def __init__(self, job_count=0, elapsed_time=0, cpu_sec=0, mem_sec=0, gpu_sec=0, - user="unknown", vc="unknown", start_time=0, finished_time=0, retries=0, - status="unknown", exit_code="N/A", max_mem_usage="N/A"): - """ elapsed_time is seconds, cpu_sec is vcore-seconds, mem_sec is - megabyte-seconds, gpu_sec is card-seconds """ - self.job_count = job_count - self.elapsed_time = elapsed_time - self.cpu_sec = cpu_sec - self.mem_sec = mem_sec - self.gpu_sec = gpu_sec - - self.user = user - self.vc = vc - self.start_time = start_time - self.finished_time = finished_time - self.retries = retries - self.status = status - self.exit_code = exit_code - self.max_mem_usage = max_mem_usage - - def __iadd__(self, o): - self.job_count += o.job_count - self.elapsed_time += o.elapsed_time - self.cpu_sec += o.cpu_sec - self.mem_sec += o.mem_sec - self.gpu_sec += o.gpu_sec - return self - - def __add__(self, o): - return JobInfo( - job_count=self.job_count + o.job_count, - elapsed_time=self.elapsed_time + o.elapsed_time, - cpu_sec=self.cpu_sec + o.cpu_sec, - mem_sec=self.mem_sec + o.mem_sec, - gpu_sec=self.gpu_sec + o.gpu_sec) - - def values(self): - return [self.job_count, self.elapsed_time, - self.cpu_sec, self.mem_sec, self.gpu_sec] - - def __repr__(self): - # NOTE this is used to generate final report - return ",".join(map(str, self.values())) - - -class JobReportEntries(object): - def __init__(self, username, vc, total_job_info, success_job_info, - failed_job_info, stopped_job_info, running_job_info, waiting_job_info): - self.username = username - self.vc = vc - self.total_job_info = total_job_info - self.success_job_info = success_job_info - self.failed_job_info = failed_job_info - self.stopped_job_info = stopped_job_info - self.running_job_info = running_job_info - self.waiting_job_info = waiting_job_info - - def values(self): - result = [self.username, self.vc] - result.extend(self.total_job_info.values()) - result.extend(self.success_job_info.values()) - result.extend(self.failed_job_info.values()) - result.extend(self.stopped_job_info.values()) - result.extend(self.running_job_info.values()) - result.extend(self.waiting_job_info.values()) - return result - - def __repr__(self): - # NOTE this is used to generate final report - return ",".join(map(str, self.values())) - - -class RawJob(object): - def __init__(self, user, vc, job, - start_time, finish_time, waiting_time, run_time, - retries, status, exit_code, cpu, mem, max_mem, gpu): - self.user = user - self.vc = vc - self.job = job - self.start_time = start_time - self.finish_time = finish_time - self.waiting_time = waiting_time - self.run_time = run_time - self.retries = retries - self.status = status - self.exit_code = exit_code - self.cpu = cpu - self.mem = mem - self.max_mem = max_mem - self.gpu = gpu - - def values(self): - return [self.user, self.vc, self.job, - self.start_time, self.finish_time, self.waiting_time, self.run_time, - self.retries, self.status, self.exit_code, - self.cpu, self.mem, self.max_mem, self.gpu] - - def __repr__(self): - # NOTE this is used to generate final report - return ",".join(map(str, self.values())) - - -class Alert(object): - default_get_ip = lambda a: get_ip(a["instance"]) - host_ip_mapping = { - "NodeNotReady": lambda a: get_ip(a["name"]), - "k8sApiServerNotOk": lambda a: get_ip(a["host_ip"]), - "NodeDiskPressure": lambda a: get_ip(a["name"]), - "NodeNotReady": lambda a: get_ip(a["name"]), - "PaiServicePodNotRunning": lambda a: get_ip(a["host_ip"]), - "PaiServicePodNotReady": lambda a: get_ip(a["host_ip"]), - } - - src_mapping = { - "NvidiaSmiEccError": lambda a: a["minor_number"], - "NvidiaMemoryLeak": lambda a: a["minor_number"], - "GpuUsedByExternalProcess": lambda a: a["minor_number"], - "GpuUsedByZombieContainer": lambda a: a["minor_number"], - "k8sApiServerNotOk": lambda a: a["error"], - "k8sDockerDaemonNotOk": lambda a: a["error"], - "NodeFilesystemUsage": lambda a: a["device"], - "NodeDiskPressure": lambda a: get_ip(a["name"]), - "NodeNotReady": lambda a: get_ip(a["name"]), - "AzureAgentConsumeTooMuchMem": lambda a: a["cmd"], - "PaiServicePodNotRunning": lambda a: a["name"], - "PaiServicePodNotReady": lambda a: a["name"], - "PaiServiceNotUp": lambda a: a["pai_service_name"], - "JobExporterHangs": lambda a: a["name"], - } - - def __init__(self, alert_name, start, durtion, labels): - """ alert_name are derived from labels, start/durtion is timestamp - value """ - self.alert_name = alert_name - self.start = start - self.durtion = durtion - self.labels = labels - - #f.write("alert_name,host_ip,source,start,durtion,labels\n") - - @staticmethod - def get_info(alert_name, labels, mapping): - return mapping.get(alert_name, Alert.default_get_ip)(labels) - - def labels_repr(self): - r = [] - for k, v in self.labels.items(): - if k in {"__name__", "alertname", "alertstate", "job", "type"}: - continue - r.append("%s:%s" % (k, v)) - return "|".join(r) - - def values(self): - return [self.alert_name, - Alert.get_info(self.alert_name, self.labels, Alert.host_ip_mapping), - Alert.get_info(self.alert_name, self.labels, Alert.src_mapping), - format_time(self.start), - self.durtion, - self.labels_repr()] - - def __repr__(self): - # NOTE this is used to generate final report - return ",".join(map(str, self.values())) - - -class GPUEntry(object): - def __init__(self, node_ip, gpu_id, avg_util): - self.node_ip = node_ip - self.gpu_id = gpu_id - self.avg_util = avg_util - - def values(self): - return [self.node_ip, self.gpu_id, self.avg_util] - - def __repr__(self): - # NOTE this is used to generate final report - return ",".join(map(str, self.values())) - - -class DB(object): - # If app is running, the finished_time is 0, should not delete it in delete_old_data - CREATE_APPS_TABLE = """CREATE TABLE IF NOT EXISTS apps ( - app_id text NOT NULL, - finished_time integer NOT NULL, - content text NOT NULL - )""" - CREATE_APP_ID_INDEX = "CREATE INDEX IF NOT EXISTS app_id_index ON apps (app_id);" - CREATE_APP_TIME_INDEX = "CREATE INDEX IF NOT EXISTS app_time_index ON apps (finished_time);" - - # If job is running, the finished_time is 0, should not delete it in delete_old_data - CREATE_FRAMEWORKS_TABLE = """CREATE TABLE IF NOT EXISTS frameworks ( - name text NOT NULL, - start_time integer NOT NULL, - finished_time integer NOT NULL, - content text NOT NULL - )""" - CREATE_FRAMEWORK_NAME_INDEX = "CREATE INDEX IF NOT EXISTS framework_name_index ON frameworks (name);" - CREATE_FRAMEWORK_TIME_INDEX = "CREATE INDEX IF NOT EXISTS framework_time_index ON frameworks (start_time, finished_time);" - - def __init__(self, db_path): - self.db_path = db_path - self.conn = sqlite3.connect(self.db_path) - cursor = self.conn.cursor() - cursor.execute(DB.CREATE_APPS_TABLE) - cursor.execute(DB.CREATE_APP_ID_INDEX) - cursor.execute(DB.CREATE_APP_TIME_INDEX) - cursor.execute(DB.CREATE_FRAMEWORKS_TABLE) - cursor.execute(DB.CREATE_FRAMEWORK_NAME_INDEX) - cursor.execute(DB.CREATE_FRAMEWORK_TIME_INDEX) - self.conn.commit() - - -def get_yarn_apps(yarn_url): - apps_url = urllib.parse.urljoin(yarn_url, "/ws/v1/cluster/apps") - result = [] - - obj = request_with_error_handling(apps_url) - - apps = walk_json_field_safe(obj, "apps", "app") - - if apps is None: - return result - - for app in apps: - app_id = walk_json_field_safe(app, "id") - if app_id is None: - continue - - finished_time = walk_json_field_safe(app, "finishedTime") or 0 - finished_time = int(finished_time / 1000) # yarn's time is in millisecond - content = json.dumps(app) - result.append({"app_id": app_id, - "finished_time": finished_time, "content": content}) - - return result - - -def get_frameworks(launcher_url): - launcher_url = urllib.parse.urljoin(launcher_url, "/v1/Frameworks") - result = [] - - obj = request_with_error_handling(launcher_url) - - frameworks = walk_json_field_safe(obj, "summarizedFrameworkInfos") - - if frameworks is None: - return result - - for framework in frameworks: - name = walk_json_field_safe(framework, "frameworkName") - if name is None: - continue - - finished_time = walk_json_field_safe(framework, "frameworkCompletedTimestamp") or 0 - finished_time = int(finished_time / 1000) # yarn's time is in millisecond - start_time = walk_json_field_safe(framework, "firstRequestTimestamp") or 0 - start_time = int(start_time / 1000) # yarn's time is in millisecond - content = json.dumps(framework) - result.append({"name": name, "start_time": start_time, - "finished_time": finished_time, "content": content}) - - return result - - -def refresh_cache(database, yarn_url, launcher_url): - db = DB(database) - - apps = get_yarn_apps(yarn_url) - logger.info("get %d of apps from yarn", len(apps)) - - with db.conn: - cursor = db.conn.cursor() - - for app in apps: - cursor.execute("""SELECT COUNT(*) FROM apps - WHERE app_id=?""", - (app["app_id"],)) - result = cursor.fetchone() - - if result[0] > 0: - cursor.execute("""UPDATE apps SET finished_time=?, content=? - WHERE app_id=?""", - (app["finished_time"], app["content"], app["app_id"])) - else: - cursor.execute("""INSERT INTO apps(app_id,finished_time,content) - VALUES(?,?,?)""", - (app["app_id"], app["finished_time"], app["content"])) - - db.conn.commit() - - frameworks = get_frameworks(launcher_url) - logger.info("get %d of frameworks from launcher", len(frameworks)) - - with db.conn: - cursor = db.conn.cursor() - - for framework in frameworks: - cursor.execute("""SELECT COUNT(*) FROM frameworks - WHERE name=?""", - (framework["name"],)) - result = cursor.fetchone() - - if result[0] > 0: - cursor.execute("""UPDATE frameworks SET finished_time=?, content=? - WHERE name=?""", - (framework["finished_time"], framework["content"], framework["name"])) - else: - cursor.execute("""INSERT INTO frameworks(name,start_time,finished_time,content) - VALUES(?,?,?,?)""", - (framework["name"], - framework["start_time"], - framework["finished_time"], - framework["content"])) - - db.conn.commit() - - -# https://github.com/Microsoft/pai/blob/pai-0.9.y/src/rest-server/src/models/job.js#L45 -# https://github.com/microsoft/pai/blob/v0.13.0/src/job-exit-spec/config/job-exit-spec.md -def convert_job_state(framework_state, exit_code): - if framework_state in { - "FRAMEWORK_WAITING", - "APPLICATION_CREATED", - "APPLICATION_LAUNCHED", - "APPLICATION_WAITING"}: - return "WAITING" - elif framework_state in { - "APPLICATION_RUNNING", - "APPLICATION_RETRIEVING_DIAGNOSTICS", - "APPLICATION_COMPLETED"}: - return "RUNNING" - elif framework_state == "FRAMEWORK_COMPLETED": - if exit_code is not None: - if exit_code == 0: - return "SUCCEEDED" - elif exit_code == -7351: - return "STOPPED" - else: - return "FAILED" - else: - return "FAILED" - - return "UNKNOWN" - - -def get_job_report(database, since, until, max_mem_usage): - """ return two values, one is aggregated job info, the other is raw job status """ - db = DB(database) - - with db.conn: - # Select more apps, since framework may retry, and previous retry - # may not finished in since~until range. - # Assume no retry will happen 1 month before framework finish. - app_since = datetime.datetime.fromtimestamp(since) - datetime.timedelta(days=31) - app_since = int(datetime.datetime.timestamp(app_since)) - cursor = db.conn.cursor() - cursor.execute("""SELECT content FROM apps - WHERE (finished_time>? AND finished_time? AND finished_time 0: - start = end = values[0][0] - events = [] - - for i, value in enumerate(values): - if i == len(values) - 1: - events.append({"start": start, "end": value[0]}) - break - - if value[0] - end <= gap: - end = value[0] - continue - else: - events.append({"start": start, "end": end}) - start = end = value[0] - - for event in events: - # because the end is the last time alert still happening, if we - # treat end - start equals to be the durtion of the alert, - # the alert with start == end will have durtion of 0, which is - # quite confusing, so we set durtion to be end - start + gap - result.append(Alert(alert_name, int(event["start"]), - int(event["end"] - event["start"] + gap), - labels)) - else: - logger.warning("unexpected zero values in alert %s", alert_name) - - logger.info("get %d alert entries", len(result)) - - return result - - -def get_gpu_util(prometheus_url, since, until): - args = urllib.parse.urlencode({ - "query": "nvidiasmi_utilization_gpu", - "start": str(since), - "end": str(until), - "step": "10m", - }) - - url = urllib.parse.urljoin(prometheus_url, - "/prometheus/api/v1/query_range") + "?" + args - - logger.debug("requesting %s", url) - result = [] - - obj = request_with_error_handling(url) - - if walk_json_field_safe(obj, "status") != "success": - logger.warning("requesting %s failed, body is %s", url, obj) - return result - - metrics = walk_json_field_safe(obj, "data", "result") - - for metric in metrics: - node_ip = get_ip(walk_json_field_safe(metric, "metric", "instance")) - gpu_id = walk_json_field_safe(metric, "metric", "minor_number") - - values = walk_json_field_safe(metric, "values") - sum_ = count = avg = 0 - if values is not None and len(values) > 0: - for val in values: - sum_ += float(val[1]) - count += 1 - avg = sum_ / count - else: - logger.warning("unexpected no values in gpu utils %s, %s, default avg to 0", - node_ip, - gpu_id) - - result.append(GPUEntry(node_ip, gpu_id, avg)) - - logger.info("get %d gpu entries", len(result)) - - return result - - -def delete_old_data(database, days): - db = DB(database) - now = datetime.datetime.now() - delta = datetime.timedelta(days=days) - - ago = int(datetime.datetime.timestamp(now - delta)) - - with db.conn: - cursor = db.conn.cursor() - - # should not delete entries if finished_time is 0, they are running apps - cursor.execute("""DELETE FROM apps WHERE finished_time", u"label_ex:", - u"Resource: "}, output_lines) - - @patch("node_maintain.YarnOperator.execute") - def test_add_dedicate_vc(self, execute_mock): - args = self.ArgsMock(resource_manager_ip="127.0.0.1", restserver_ip="127.0.0.1", vc_name="test_vc_2", nodes={"10.151.40.132"}) - - execute_mock.side_effect = [ - "Node Labels: ,,,,", - None - ] - with requests_mock.mock() as requests_get_mock: - requests_get_mock.post("http://127.0.0.1:9186/api/v1/token", text=json.dumps({"token": "test"})) - requests_get_mock.get("http://127.0.0.1:8088/ws/v1/cluster/scheduler", - text=self.capacity_scheduler_response) - requests_get_mock.get("http://127.0.0.1:8088/ws/v1/cluster/nodes", text=self.cluster_nodes_response) - requests_get_mock.put("http://127.0.0.1:8088/ws/v1/cluster/scheduler-conf") - requests_get_mock.delete("http://127.0.0.1:9186/api/v1/virtual-clusters/test_vc", text="{}") - - remove_dedicate_vc(args) - - yarn_command_call = [ - call("yarn --config ./.hadoop rmadmin -replaceLabelsOnNode \"10.151.40.132=\" -failOnUnknownNodes"), - call("yarn --config ./.hadoop cluster --list-node-labels"), - call("yarn --config ./.hadoop rmadmin -removeFromClusterNodeLabels test_vc") - ] - execute_mock.assert_has_calls(yarn_command_call, any_order=False) - - scheduler_conf_call = [request_object for request_object in requests_get_mock.request_history if request_object.path == "/ws/v1/cluster/scheduler-conf"] - self.assertEqual(len(scheduler_conf_call), 3) - update_capacity, stop_queue, remove_queue = [xmltodict.parse(request_object.text) for request_object in scheduler_conf_call] - update_capacity = {or_dict["key"]: or_dict["value"] for or_dict in update_capacity["sched-conf"]["global-updates"]["entry"]} - update_capacity_expect = { - u"yarn.scheduler.capacity.root.default.maximum-capacity": u"100.0", - u"yarn.scheduler.capacity.root.test_vc.capacity": u"0.0", - u"yarn.scheduler.capacity.root.label_ex.maximum-capacity": u"0.0", - u"yarn.scheduler.capacity.root.vc_a.maximum-capacity": u"5.0", - u"yarn.scheduler.capacity.root.vc_a.capacity": u"5.0", - u"yarn.scheduler.capacity.root.default.capacity": u"95.0", - u"yarn.scheduler.capacity.root.test_vc.maximum-capacity": u"0.0", - u"yarn.scheduler.capacity.root.label_ex.capacity": u"0.0" - } - self.assertDictEqual(update_capacity, update_capacity_expect) - - remove_queue = {or_dict["key"]: or_dict["value"] for or_dict in - remove_queue["sched-conf"]["global-updates"]["entry"]} - remove_queue_expect = { - u"yarn.scheduler.capacity.root.accessible-node-labels.test_vc.capacity": u"0", - u"yarn.scheduler.capacity.root.test_vc.accessible-node-labels.test_vc.capacity": u"0", - u"yarn.scheduler.capacity.root.test_vc.default-node-label-expression": None, - } - self.assertDictEqual(remove_queue, remove_queue_expect) - - -if __name__ == "__main__": - assert not hasattr(sys.stdout, "getvalue") - unittest.main(module=__name__, buffer=True, exit=False) diff --git a/src/tools/tests/test_yarn_operator.py b/src/tools/tests/test_yarn_operator.py deleted file mode 100644 index b7bc1163c1..0000000000 --- a/src/tools/tests/test_yarn_operator.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -from __future__ import absolute_import - -from mock import patch -import unittest - -from operator_wrapper.yarn_operator import YarnOperator - - -class YarnOperatorTestCase(unittest.TestCase): - - def setUp(self): - with patch("operator_wrapper.yarn_operator.YarnOperator.setup_yarn_configfile"): - self.yarnOperator = YarnOperator("localhost") - - @patch("operator_wrapper.yarn_operator.YarnOperator.setup_yarn_configfile") - def test__init__(self, setup_yarn_configfile): - YarnOperator("127.0.0.1") - setup_yarn_configfile.assert_called_with() - - - def test_generate_queue_update_xml(self): - from collections import OrderedDict - from xml.dom.minidom import parseString - raw_dict = OrderedDict([ - ("global-updates", [ - OrderedDict([("key", "yarn.scheduler.capacity.root.default.default-node-label-expression"), - ("value", "label_non")]), - OrderedDict([("key", "yarn.scheduler.capacity.root.default.accessible-node-labels.label_ex.capacity"), - ("value", 0)]), - - ]) - ]) - dom = parseString(self.yarnOperator.generate_queue_update_xml(raw_dict)) - expect_output = ''' - - - - yarn.scheduler.capacity.root.default.default-node-label-expression - label_non - - - yarn.scheduler.capacity.root.default.accessible-node-labels.label_ex.capacity - 0 - - - -''' - self.assertEquals(dom.toprettyxml(), expect_output) - - -if __name__ == "__main__": - unittest.main() diff --git a/src/tools/utility/__init__.py b/src/tools/utility/__init__.py deleted file mode 100644 index afedca73fa..0000000000 --- a/src/tools/utility/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/tools/utility/common.py b/src/tools/utility/common.py deleted file mode 100644 index 8f271f237e..0000000000 --- a/src/tools/utility/common.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import logging - -logger = logging.getLogger(__name__) - -def safe_get(dct, *keys): - for key in keys: - try: - dct = dct[key] - except KeyError: - return None - return dct diff --git a/src/tools/utility/log.py b/src/tools/utility/log.py deleted file mode 100644 index a96f96ca74..0000000000 --- a/src/tools/utility/log.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import yaml -import logging -import logging.config -import os - -def setup_logging(default_path="config/logging.yaml", default_level=logging.INFO, env_key="LOG_CFG"): - path = default_path - value = os.getenv(env_key, None) - if value: - path = value - if os.path.exists(path): - with open(path, "rt") as f: - config = yaml.safe_load(f) - logging.config.dictConfig(config) - else: - logging.basicConfig(level=default_level) \ No newline at end of file diff --git a/tests/jenkins/config_yarn_cluster.yaml b/tests/jenkins/config_yarn_cluster.yaml deleted file mode 100644 index d56224af1e..0000000000 --- a/tests/jenkins/config_yarn_cluster.yaml +++ /dev/null @@ -1,3 +0,0 @@ -machines: ["10.0.1.8", "10.0.1.7", "10.0.1.5"] -ssh-username: $ACCOUNT_USR -ssh-password: $ACCOUNT_PSW diff --git a/tests/jenkins/config_yarn_singlebox.yaml b/tests/jenkins/config_yarn_singlebox.yaml deleted file mode 100644 index 71527441e2..0000000000 --- a/tests/jenkins/config_yarn_singlebox.yaml +++ /dev/null @@ -1,3 +0,0 @@ -machines: ["10.0.1.6"] -ssh-username: $ACCOUNT_USR -ssh-password: $ACCOUNT_PSW diff --git a/tests/jenkins/stage_build.sh b/tests/jenkins/stage_build.sh deleted file mode 100644 index 150edc57b5..0000000000 --- a/tests/jenkins/stage_build.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -cluster_type="k8s" -cluster_scale="cluster" - -config_path=${WORKSPACE}/tests/jenkins/${cluster_type}/${cluster_scale}/cluster-configuration - -# generate config -bash -Eeuxo pipefail ${WORKSPACE}/tests/jenkins/test_generate_config.sh ${cluster_type} ${cluster_scale} ${config_path} - -# build images -sudo python build/pai_build.py build -c ${config_path} - -# push images -sudo python build/pai_build.py push -c ${config_path} diff --git a/tests/jenkins/stage_clean.sh b/tests/jenkins/stage_clean.sh deleted file mode 100644 index 63d037d256..0000000000 --- a/tests/jenkins/stage_clean.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -cluster_type="$1" -cluster_scale="$2" - -dev_box_name="dev-box-${cluster_type}-${cluster_scale}" - -# Work in dev-box -sudo docker exec -i ${dev_box_name} /bin/bash << EOF_DEV_BOX -set -Eeuxo pipefail -cd /root/pai - -# 1. delete PAI services -echo -e "Y\npai\n" | python paictl.py service delete - -# 2. cleanup k8s -echo -e "Y\nY\n" | python paictl.py cluster k8s-clean -p /cluster-configuration -f -EOF_DEV_BOX - -sudo docker rm -f ${dev_box_name} diff --git a/tests/jenkins/stage_deploy.sh b/tests/jenkins/stage_deploy.sh deleted file mode 100644 index 854b26e2f0..0000000000 --- a/tests/jenkins/stage_deploy.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -cluster_type="$1" -cluster_scale="$2" - -dev_box_name="dev-box-${cluster_type}-${cluster_scale}" -config_path=${WORKSPACE}/tests/jenkins/${cluster_type}/${cluster_scale}/cluster-configuration - -# generate config -bash -Eeuxo pipefail ${WORKSPACE}/tests/jenkins/test_generate_config.sh ${cluster_type} ${cluster_scale} ${config_path} - -# Run dev-box -sudo docker run -it -d \ - --name=${dev_box_name} \ - --privileged=true \ - -v /var/run/docker.sock:/var/run/docker.sock \ - --entrypoint /bin/bash \ - ${REGISTRY_URI}/openpai/dev-box:${IMAGE_TAG} - -sudo docker cp ${WORKSPACE}/. ${dev_box_name}:/root/pai -sudo docker cp ${config_path}/. ${dev_box_name}:/cluster-configuration - -# Work in dev-box -sudo docker exec -i ${dev_box_name} /bin/bash << EOF_DEV_BOX -set -Eeuxo pipefail -cd /root/pai - -# 1. bootup kubernetes -echo "Y" | python paictl.py cluster k8s-bootup -p /cluster-configuration - -# 2. push cluster configuration -echo "pai" | python paictl.py config push -p /cluster-configuration - -# 3. start PAI services -echo -e "pai\nY\n" | python paictl.py service start -EOF_DEV_BOX diff --git a/tests/jenkins/stage_prepare.sh b/tests/jenkins/stage_prepare.sh deleted file mode 100644 index 4ff145ea85..0000000000 --- a/tests/jenkins/stage_prepare.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -# remove unused packages especially linux headers/image/modules -sudo apt autoremove -y || true -# stop all docker containers -sudo docker stop $(sudo docker ps -q) || true -# remove all docker containers -sudo docker rm $(sudo docker ps -aq) || true -# remove all docker images -#sudo docker rmi $(sudo docker images -q | uniq) || true -# prune docker system -sudo docker system prune -f - -# change permissions -sudo chown ${ACCOUNT_USR}:${ACCOUNT_USR} -R ${WORKSPACE} -sudo chown ${ACCOUNT_USR}:${ACCOUNT_USR} -R ${JENKINS_HOME} - -# clean remote nodes -for host in $(seq -s " " -f "10.0.1.%g" 5 8) $(seq -s " " -f "10.0.3.%g" 4 6); do - echo "clean node ${host}:" - ssh ${ACCOUNT_USR}@${host} -o StrictHostKeyChecking=no -i /home/${ACCOUNT_USR}/.ssh/id_rsa \ - 'sudo apt autoremove -y || true; \ - sudo rm -rf /datastorage || true; \ - sudo rm -rf /mnt/datastorage || true; \ - sudo service stop kubelet || true; \ - sudo docker stop $(sudo docker ps -q) || true; \ - sudo docker system prune -af || true' -done - -# start registry -ssh ${ACCOUNT_USR}@$(echo ${REGISTRY_URI} | cut -d: -f1) -o StrictHostKeyChecking=no -i /home/${ACCOUNT_USR}/.ssh/id_rsa \ - sudo docker run -d \ - --name registry2 \ - --restart unless-stopped \ - -p $(echo ${REGISTRY_URI} | cut -d: -f2):5000 \ - -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \ - -v /var/lib/docker/registry/data:/var/lib/registry \ - registry:2 || true diff --git a/tests/jenkins/stage_test.sh b/tests/jenkins/stage_test.sh deleted file mode 100644 index 44ae503969..0000000000 --- a/tests/jenkins/stage_test.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -bash -Eeuxo pipefail ${WORKSPACE}/tests/jenkins/test_rest_server.sh $1 $2 -bash -Eeuxo pipefail ${WORKSPACE}/tests/jenkins/test_rest_server_js_sdk.sh $1 $2 diff --git a/tests/jenkins/test_generate_config.sh b/tests/jenkins/test_generate_config.sh deleted file mode 100644 index 1a592cdbca..0000000000 --- a/tests/jenkins/test_generate_config.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -cluster_type="$1" -cluster_scale="$2" -config_path="$3" - -# prepare path -mkdir -p ${config_path} -rm -rf ${config_path}/*.yaml - -# generate quick-start and config -case ${cluster_type} in - "yarn") - envsubst < ${WORKSPACE}/tests/jenkins/config_${cluster_type}_${cluster_scale}.yaml > ${config_path}/quick-start.yaml - python paictl.py config generate -i ${config_path}/quick-start.yaml -o ${config_path} - ;; - "k8s") - cp ${JENKINS_HOME}/config/${cluster_type}/${cluster_scale}/*.yaml ${config_path} - ;; - *) - echo "Unknown cluster type ${cluster_type}" - exit 1 - ;; -esac -# update image tag -sed -i "s/tag: \\(latest\\|v[[:digit:]]\\+.[[:digit:]]\\+.[[:digit:]]\\+\\)/tag: ${IMAGE_TAG}/" ${config_path}/services-configuration.yaml -# update registry -sed -i "s/docker.io/${REGISTRY_URI}/g" ${config_path}/services-configuration.yaml diff --git a/tests/jenkins/test_rest_server.sh b/tests/jenkins/test_rest_server.sh deleted file mode 100644 index afc1ca3083..0000000000 --- a/tests/jenkins/test_rest_server.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation -# All rights reserved. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -# to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -cluster_type="$1" -rest_server_uri="$2" -job_name="ci-test-$RANDOM-$RANDOM" - -# get token -token="" -until [ ! -z ${token} ]; do - token=$(curl -sS -X POST -d "username=admin" -d "password=admin-password" -d "expiration=36000" ${rest_server_uri}/api/v1/authn/basic/login | jq -r ".token") - sleep 10s -done - -# check job status -function check_status() { - while true; do - sleep 30s - status=$(curl -sS -H "Authorization: Bearer ${token}" "$1" | jq -r ".jobStatus.state") - case ${status} in - "SUCCEEDED") break ;; - "WAITING"|"RUNNING") ;; - *) exit 1 ;; - esac - done -} - -case ${cluster_type} in - "k8s") - # submit keras mnist example in marketplace - cat ${WORKSPACE}/marketplace-v2/keras-tensorflow-mnist.yaml \ - | sed "s/keras_tensorflow_mnist/${job_name}/g" \ - | curl -sS -X POST -H "Authorization: Bearer ${token}" -H "Content-Type: text/yaml" --data-binary @- ${rest_server_uri}/api/v2/jobs - check_status ${rest_server_uri}/api/v2/jobs/admin~${job_name} - ;; - *) - echo "Unknown cluster type ${cluster_type}" - exit 1 - ;; -esac diff --git a/tests/jenkins/test_rest_server_js_sdk.sh b/tests/jenkins/test_rest_server_js_sdk.sh deleted file mode 100644 index 518424dbee..0000000000 --- a/tests/jenkins/test_rest_server_js_sdk.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -cluster_type="$1" -rest_server_uri="$2" - -case ${cluster_type} in - "yarn") - echo "Skip the API tests for yarn version" - ;; - "k8s") - # install nodejs 12.x - sudo apt update || true - sudo apt -y install curl dirmngr apt-transport-https lsb-release ca-certificates || true - curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - || true - sudo apt install nodejs -y || true - node --version - - # install openpai-js-sdk - rm -rf openpaisdk - git clone https://github.com/microsoft/openpaisdk - cd openpaisdk - npm install - npm run build - cd lib - - # get token - token="" - until [ ! -z ${token} ]; do - token=$(curl -sS -X POST -d "username=admin" -d "password=admin-password" -d "expiration=36000" ${rest_server_uri}/api/v2/authn/basic/login | jq -r ".token") - sleep 10s - done - -cat <.tests/clusters.json -[ - { - "alias": "test", - "rest_server_uri": "${rest_server_uri}", - "username": "admin", - "password": "admin-password", - "token": "${token}", - "https": false - } -] -EOT - - cp ${WORKSPACE}/src/rest-server/docs/swagger.yaml . - node tests/common/apiTestCaseGenerator.js -- "swagger.yaml" ".tests/apiTestCase.json" - sudo npm install -g mocha - mocha tests/api_tests/**/*.spec.js -t 1800000 - - cd ../.. - ;; - *) - echo "Unknown cluster type ${cluster_type}" - exit 1 - ;; -esac From 48153a984e184911cb91bb8154c8739d5d924c95 Mon Sep 17 00:00:00 2001 From: Binyang Li Date: Tue, 11 May 2021 18:37:24 +0800 Subject: [PATCH 2/3] fix CI --- .github/workflows/continuous-integration.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 4b089f9b32..50ba0235c6 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -178,11 +178,6 @@ jobs: uses: actions/setup-node@v1 with: node-version: ${{ matrix.node }} - - name: Test contrib/submit-simple-job - run: | - cd contrib/submit-simple-job - npm install - npm test - name: Test contrib/submit-job-v2 run: | cd contrib/submit-job-v2 From 41745ddd36c15e7a33f8204d48a0db2a65531f75 Mon Sep 17 00:00:00 2001 From: Binyang Li Date: Tue, 11 May 2021 19:14:53 +0800 Subject: [PATCH 3/3] revert test --- tests/jenkins/config_yarn_cluster.yaml | 3 ++ tests/jenkins/config_yarn_singlebox.yaml | 3 ++ tests/jenkins/stage_build.sh | 32 +++++++++++++ tests/jenkins/stage_clean.sh | 37 +++++++++++++++ tests/jenkins/stage_deploy.sh | 53 +++++++++++++++++++++ tests/jenkins/stage_prepare.sh | 55 ++++++++++++++++++++++ tests/jenkins/stage_test.sh | 21 +++++++++ tests/jenkins/test_generate_config.sh | 45 ++++++++++++++++++ tests/jenkins/test_rest_server.sh | 56 ++++++++++++++++++++++ tests/jenkins/test_rest_server_js_sdk.sh | 60 ++++++++++++++++++++++++ 10 files changed, 365 insertions(+) create mode 100644 tests/jenkins/config_yarn_cluster.yaml create mode 100644 tests/jenkins/config_yarn_singlebox.yaml create mode 100644 tests/jenkins/stage_build.sh create mode 100644 tests/jenkins/stage_clean.sh create mode 100644 tests/jenkins/stage_deploy.sh create mode 100644 tests/jenkins/stage_prepare.sh create mode 100644 tests/jenkins/stage_test.sh create mode 100644 tests/jenkins/test_generate_config.sh create mode 100644 tests/jenkins/test_rest_server.sh create mode 100644 tests/jenkins/test_rest_server_js_sdk.sh diff --git a/tests/jenkins/config_yarn_cluster.yaml b/tests/jenkins/config_yarn_cluster.yaml new file mode 100644 index 0000000000..d56224af1e --- /dev/null +++ b/tests/jenkins/config_yarn_cluster.yaml @@ -0,0 +1,3 @@ +machines: ["10.0.1.8", "10.0.1.7", "10.0.1.5"] +ssh-username: $ACCOUNT_USR +ssh-password: $ACCOUNT_PSW diff --git a/tests/jenkins/config_yarn_singlebox.yaml b/tests/jenkins/config_yarn_singlebox.yaml new file mode 100644 index 0000000000..71527441e2 --- /dev/null +++ b/tests/jenkins/config_yarn_singlebox.yaml @@ -0,0 +1,3 @@ +machines: ["10.0.1.6"] +ssh-username: $ACCOUNT_USR +ssh-password: $ACCOUNT_PSW diff --git a/tests/jenkins/stage_build.sh b/tests/jenkins/stage_build.sh new file mode 100644 index 0000000000..150edc57b5 --- /dev/null +++ b/tests/jenkins/stage_build.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Copyright (c) Microsoft Corporation +# All rights reserved. +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and +# to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +cluster_type="k8s" +cluster_scale="cluster" + +config_path=${WORKSPACE}/tests/jenkins/${cluster_type}/${cluster_scale}/cluster-configuration + +# generate config +bash -Eeuxo pipefail ${WORKSPACE}/tests/jenkins/test_generate_config.sh ${cluster_type} ${cluster_scale} ${config_path} + +# build images +sudo python build/pai_build.py build -c ${config_path} + +# push images +sudo python build/pai_build.py push -c ${config_path} diff --git a/tests/jenkins/stage_clean.sh b/tests/jenkins/stage_clean.sh new file mode 100644 index 0000000000..63d037d256 --- /dev/null +++ b/tests/jenkins/stage_clean.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# Copyright (c) Microsoft Corporation +# All rights reserved. +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and +# to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +cluster_type="$1" +cluster_scale="$2" + +dev_box_name="dev-box-${cluster_type}-${cluster_scale}" + +# Work in dev-box +sudo docker exec -i ${dev_box_name} /bin/bash << EOF_DEV_BOX +set -Eeuxo pipefail +cd /root/pai + +# 1. delete PAI services +echo -e "Y\npai\n" | python paictl.py service delete + +# 2. cleanup k8s +echo -e "Y\nY\n" | python paictl.py cluster k8s-clean -p /cluster-configuration -f +EOF_DEV_BOX + +sudo docker rm -f ${dev_box_name} diff --git a/tests/jenkins/stage_deploy.sh b/tests/jenkins/stage_deploy.sh new file mode 100644 index 0000000000..854b26e2f0 --- /dev/null +++ b/tests/jenkins/stage_deploy.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +# Copyright (c) Microsoft Corporation +# All rights reserved. +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and +# to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +cluster_type="$1" +cluster_scale="$2" + +dev_box_name="dev-box-${cluster_type}-${cluster_scale}" +config_path=${WORKSPACE}/tests/jenkins/${cluster_type}/${cluster_scale}/cluster-configuration + +# generate config +bash -Eeuxo pipefail ${WORKSPACE}/tests/jenkins/test_generate_config.sh ${cluster_type} ${cluster_scale} ${config_path} + +# Run dev-box +sudo docker run -it -d \ + --name=${dev_box_name} \ + --privileged=true \ + -v /var/run/docker.sock:/var/run/docker.sock \ + --entrypoint /bin/bash \ + ${REGISTRY_URI}/openpai/dev-box:${IMAGE_TAG} + +sudo docker cp ${WORKSPACE}/. ${dev_box_name}:/root/pai +sudo docker cp ${config_path}/. ${dev_box_name}:/cluster-configuration + +# Work in dev-box +sudo docker exec -i ${dev_box_name} /bin/bash << EOF_DEV_BOX +set -Eeuxo pipefail +cd /root/pai + +# 1. bootup kubernetes +echo "Y" | python paictl.py cluster k8s-bootup -p /cluster-configuration + +# 2. push cluster configuration +echo "pai" | python paictl.py config push -p /cluster-configuration + +# 3. start PAI services +echo -e "pai\nY\n" | python paictl.py service start +EOF_DEV_BOX diff --git a/tests/jenkins/stage_prepare.sh b/tests/jenkins/stage_prepare.sh new file mode 100644 index 0000000000..4ff145ea85 --- /dev/null +++ b/tests/jenkins/stage_prepare.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +# Copyright (c) Microsoft Corporation +# All rights reserved. +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and +# to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +# remove unused packages especially linux headers/image/modules +sudo apt autoremove -y || true +# stop all docker containers +sudo docker stop $(sudo docker ps -q) || true +# remove all docker containers +sudo docker rm $(sudo docker ps -aq) || true +# remove all docker images +#sudo docker rmi $(sudo docker images -q | uniq) || true +# prune docker system +sudo docker system prune -f + +# change permissions +sudo chown ${ACCOUNT_USR}:${ACCOUNT_USR} -R ${WORKSPACE} +sudo chown ${ACCOUNT_USR}:${ACCOUNT_USR} -R ${JENKINS_HOME} + +# clean remote nodes +for host in $(seq -s " " -f "10.0.1.%g" 5 8) $(seq -s " " -f "10.0.3.%g" 4 6); do + echo "clean node ${host}:" + ssh ${ACCOUNT_USR}@${host} -o StrictHostKeyChecking=no -i /home/${ACCOUNT_USR}/.ssh/id_rsa \ + 'sudo apt autoremove -y || true; \ + sudo rm -rf /datastorage || true; \ + sudo rm -rf /mnt/datastorage || true; \ + sudo service stop kubelet || true; \ + sudo docker stop $(sudo docker ps -q) || true; \ + sudo docker system prune -af || true' +done + +# start registry +ssh ${ACCOUNT_USR}@$(echo ${REGISTRY_URI} | cut -d: -f1) -o StrictHostKeyChecking=no -i /home/${ACCOUNT_USR}/.ssh/id_rsa \ + sudo docker run -d \ + --name registry2 \ + --restart unless-stopped \ + -p $(echo ${REGISTRY_URI} | cut -d: -f2):5000 \ + -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \ + -v /var/lib/docker/registry/data:/var/lib/registry \ + registry:2 || true diff --git a/tests/jenkins/stage_test.sh b/tests/jenkins/stage_test.sh new file mode 100644 index 0000000000..44ae503969 --- /dev/null +++ b/tests/jenkins/stage_test.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Copyright (c) Microsoft Corporation +# All rights reserved. +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and +# to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +bash -Eeuxo pipefail ${WORKSPACE}/tests/jenkins/test_rest_server.sh $1 $2 +bash -Eeuxo pipefail ${WORKSPACE}/tests/jenkins/test_rest_server_js_sdk.sh $1 $2 diff --git a/tests/jenkins/test_generate_config.sh b/tests/jenkins/test_generate_config.sh new file mode 100644 index 0000000000..1a592cdbca --- /dev/null +++ b/tests/jenkins/test_generate_config.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# Copyright (c) Microsoft Corporation +# All rights reserved. +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and +# to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +cluster_type="$1" +cluster_scale="$2" +config_path="$3" + +# prepare path +mkdir -p ${config_path} +rm -rf ${config_path}/*.yaml + +# generate quick-start and config +case ${cluster_type} in + "yarn") + envsubst < ${WORKSPACE}/tests/jenkins/config_${cluster_type}_${cluster_scale}.yaml > ${config_path}/quick-start.yaml + python paictl.py config generate -i ${config_path}/quick-start.yaml -o ${config_path} + ;; + "k8s") + cp ${JENKINS_HOME}/config/${cluster_type}/${cluster_scale}/*.yaml ${config_path} + ;; + *) + echo "Unknown cluster type ${cluster_type}" + exit 1 + ;; +esac +# update image tag +sed -i "s/tag: \\(latest\\|v[[:digit:]]\\+.[[:digit:]]\\+.[[:digit:]]\\+\\)/tag: ${IMAGE_TAG}/" ${config_path}/services-configuration.yaml +# update registry +sed -i "s/docker.io/${REGISTRY_URI}/g" ${config_path}/services-configuration.yaml diff --git a/tests/jenkins/test_rest_server.sh b/tests/jenkins/test_rest_server.sh new file mode 100644 index 0000000000..afc1ca3083 --- /dev/null +++ b/tests/jenkins/test_rest_server.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# Copyright (c) Microsoft Corporation +# All rights reserved. +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and +# to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +cluster_type="$1" +rest_server_uri="$2" +job_name="ci-test-$RANDOM-$RANDOM" + +# get token +token="" +until [ ! -z ${token} ]; do + token=$(curl -sS -X POST -d "username=admin" -d "password=admin-password" -d "expiration=36000" ${rest_server_uri}/api/v1/authn/basic/login | jq -r ".token") + sleep 10s +done + +# check job status +function check_status() { + while true; do + sleep 30s + status=$(curl -sS -H "Authorization: Bearer ${token}" "$1" | jq -r ".jobStatus.state") + case ${status} in + "SUCCEEDED") break ;; + "WAITING"|"RUNNING") ;; + *) exit 1 ;; + esac + done +} + +case ${cluster_type} in + "k8s") + # submit keras mnist example in marketplace + cat ${WORKSPACE}/marketplace-v2/keras-tensorflow-mnist.yaml \ + | sed "s/keras_tensorflow_mnist/${job_name}/g" \ + | curl -sS -X POST -H "Authorization: Bearer ${token}" -H "Content-Type: text/yaml" --data-binary @- ${rest_server_uri}/api/v2/jobs + check_status ${rest_server_uri}/api/v2/jobs/admin~${job_name} + ;; + *) + echo "Unknown cluster type ${cluster_type}" + exit 1 + ;; +esac diff --git a/tests/jenkins/test_rest_server_js_sdk.sh b/tests/jenkins/test_rest_server_js_sdk.sh new file mode 100644 index 0000000000..518424dbee --- /dev/null +++ b/tests/jenkins/test_rest_server_js_sdk.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +cluster_type="$1" +rest_server_uri="$2" + +case ${cluster_type} in + "yarn") + echo "Skip the API tests for yarn version" + ;; + "k8s") + # install nodejs 12.x + sudo apt update || true + sudo apt -y install curl dirmngr apt-transport-https lsb-release ca-certificates || true + curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - || true + sudo apt install nodejs -y || true + node --version + + # install openpai-js-sdk + rm -rf openpaisdk + git clone https://github.com/microsoft/openpaisdk + cd openpaisdk + npm install + npm run build + cd lib + + # get token + token="" + until [ ! -z ${token} ]; do + token=$(curl -sS -X POST -d "username=admin" -d "password=admin-password" -d "expiration=36000" ${rest_server_uri}/api/v2/authn/basic/login | jq -r ".token") + sleep 10s + done + +cat <.tests/clusters.json +[ + { + "alias": "test", + "rest_server_uri": "${rest_server_uri}", + "username": "admin", + "password": "admin-password", + "token": "${token}", + "https": false + } +] +EOT + + cp ${WORKSPACE}/src/rest-server/docs/swagger.yaml . + node tests/common/apiTestCaseGenerator.js -- "swagger.yaml" ".tests/apiTestCase.json" + sudo npm install -g mocha + mocha tests/api_tests/**/*.spec.js -t 1800000 + + cd ../.. + ;; + *) + echo "Unknown cluster type ${cluster_type}" + exit 1 + ;; +esac

    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