qwak-sdk 0.1.0__py3-none-any.whl → 0.2.21rc0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of qwak-sdk might be problematic. Click here for more details.

Files changed (305) hide show
  1. qwak_sdk/__init__.py +9 -0
  2. qwak_sdk/cli.py +51 -0
  3. qwak_sdk/commands/admin/__init__.py +0 -0
  4. qwak_sdk/commands/admin/admin_commands_group.py +17 -0
  5. qwak_sdk/commands/admin/apikeys/__init__.py +0 -0
  6. qwak_sdk/commands/admin/apikeys/api_keys_commands_group.py +17 -0
  7. qwak_sdk/commands/admin/apikeys/generate/__init__.py +0 -0
  8. qwak_sdk/commands/admin/apikeys/generate/_logic.py +21 -0
  9. qwak_sdk/commands/admin/apikeys/generate/ui.py +45 -0
  10. qwak_sdk/commands/admin/apikeys/revoke/__init__.py +0 -0
  11. qwak_sdk/commands/admin/apikeys/revoke/_logic.py +22 -0
  12. qwak_sdk/commands/admin/apikeys/revoke/ui.py +31 -0
  13. qwak_sdk/commands/audience/__init__.py +0 -0
  14. qwak_sdk/commands/audience/_logic/__init__.py +0 -0
  15. qwak_sdk/commands/audience/_logic/config/__init__.py +0 -0
  16. qwak_sdk/commands/audience/_logic/config/config_base.py +16 -0
  17. qwak_sdk/commands/audience/_logic/config/parser.py +28 -0
  18. qwak_sdk/commands/audience/_logic/config/v1/__init__.py +0 -0
  19. qwak_sdk/commands/audience/_logic/config/v1/audience_config.py +26 -0
  20. qwak_sdk/commands/audience/_logic/config/v1/conditions_config.py +60 -0
  21. qwak_sdk/commands/audience/_logic/config/v1/config_v1.py +24 -0
  22. qwak_sdk/commands/audience/_logic/config/v1/route_config.py +14 -0
  23. qwak_sdk/commands/audience/_logic/config/v1/spec.py +11 -0
  24. qwak_sdk/commands/auto_scalling/__init__.py +0 -0
  25. qwak_sdk/commands/auto_scalling/_logic/__init__.py +0 -0
  26. qwak_sdk/commands/auto_scalling/_logic/config/__init__.py +3 -0
  27. qwak_sdk/commands/auto_scalling/_logic/config/config.py +100 -0
  28. qwak_sdk/commands/auto_scalling/_logic/config/parser.py +21 -0
  29. qwak_sdk/commands/auto_scalling/attach/__init__.py +0 -0
  30. qwak_sdk/commands/auto_scalling/attach/_logic.py +43 -0
  31. qwak_sdk/commands/auto_scalling/attach/ui.py +21 -0
  32. qwak_sdk/commands/auto_scalling/autoscaling_commands_group.py +15 -0
  33. qwak_sdk/commands/automations/__init__.py +0 -0
  34. qwak_sdk/commands/automations/automations_commands_group.py +30 -0
  35. qwak_sdk/commands/automations/delete/__init__.py +0 -0
  36. qwak_sdk/commands/automations/delete/_logic.py +6 -0
  37. qwak_sdk/commands/automations/delete/ui.py +23 -0
  38. qwak_sdk/commands/automations/executions/__init__.py +0 -0
  39. qwak_sdk/commands/automations/executions/executions_commands_group.py +14 -0
  40. qwak_sdk/commands/automations/executions/list/__init__.py +0 -0
  41. qwak_sdk/commands/automations/executions/list/_logic.py +8 -0
  42. qwak_sdk/commands/automations/executions/list/ui.py +25 -0
  43. qwak_sdk/commands/automations/list/__init__.py +0 -0
  44. qwak_sdk/commands/automations/list/_logic.py +8 -0
  45. qwak_sdk/commands/automations/list/ui.py +21 -0
  46. qwak_sdk/commands/automations/register/__init__.py +0 -0
  47. qwak_sdk/commands/automations/register/_logic.py +43 -0
  48. qwak_sdk/commands/automations/register/ui.py +44 -0
  49. qwak_sdk/commands/feature_store/__init__.py +0 -0
  50. qwak_sdk/commands/feature_store/delete/__init__.py +0 -0
  51. qwak_sdk/commands/feature_store/delete/_logic.py +52 -0
  52. qwak_sdk/commands/feature_store/delete/ui.py +40 -0
  53. qwak_sdk/commands/feature_store/feature_store_command_group.py +25 -0
  54. qwak_sdk/commands/feature_store/list/__init__.py +0 -0
  55. qwak_sdk/commands/feature_store/list/ui.py +140 -0
  56. qwak_sdk/commands/feature_store/pause/__init__.py +0 -0
  57. qwak_sdk/commands/feature_store/pause/ui.py +18 -0
  58. qwak_sdk/commands/feature_store/register/__init__.py +0 -0
  59. qwak_sdk/commands/feature_store/register/_logic.py +289 -0
  60. qwak_sdk/commands/feature_store/register/ui.py +105 -0
  61. qwak_sdk/commands/feature_store/resume/__init__.py +0 -0
  62. qwak_sdk/commands/feature_store/resume/ui.py +18 -0
  63. qwak_sdk/commands/feature_store/trigger/__init__.py +0 -0
  64. qwak_sdk/commands/feature_store/trigger/ui.py +32 -0
  65. qwak_sdk/commands/models/__init__.py +0 -0
  66. qwak_sdk/commands/models/_logic/__init__.py +0 -0
  67. qwak_sdk/commands/models/_logic/variations.py +55 -0
  68. qwak_sdk/commands/models/build/__init__.py +0 -0
  69. qwak_sdk/commands/models/build/_logic/__init__.py +0 -0
  70. qwak_sdk/commands/models/build/_logic/build_steps.py +68 -0
  71. qwak_sdk/commands/models/build/_logic/client_logs/__init__.py +0 -0
  72. qwak_sdk/commands/models/build/_logic/client_logs/build_run_handlers.py +189 -0
  73. qwak_sdk/commands/models/build/_logic/client_logs/cli_ui.py +125 -0
  74. qwak_sdk/commands/models/build/_logic/client_logs/logger.py +88 -0
  75. qwak_sdk/commands/models/build/_logic/client_logs/messages.py +40 -0
  76. qwak_sdk/commands/models/build/_logic/client_logs/notifier_impl.py +49 -0
  77. qwak_sdk/commands/models/build/_logic/client_logs/spinner.py +14 -0
  78. qwak_sdk/commands/models/build/_logic/client_logs/time_source.py +37 -0
  79. qwak_sdk/commands/models/build/_logic/client_logs/utils.py +12 -0
  80. qwak_sdk/commands/models/build/_logic/config/config_v1.py +253 -0
  81. qwak_sdk/commands/models/build/_logic/constant/host_resource.py +4 -0
  82. qwak_sdk/commands/models/build/_logic/constant/step_description.py +29 -0
  83. qwak_sdk/commands/models/build/_logic/constant/temp_dir.py +2 -0
  84. qwak_sdk/commands/models/build/_logic/constant/upload_tag.py +5 -0
  85. qwak_sdk/commands/models/build/_logic/context.py +62 -0
  86. qwak_sdk/commands/models/build/_logic/interface/__init__.py +0 -0
  87. qwak_sdk/commands/models/build/_logic/interface/notifier_interface.py +29 -0
  88. qwak_sdk/commands/models/build/_logic/interface/step_inteface.py +29 -0
  89. qwak_sdk/commands/models/build/_logic/phase/__init__.py +0 -0
  90. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/__init__.py +14 -0
  91. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/__init__.py +0 -0
  92. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/fetch_model_step.py +42 -0
  93. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/fetch_strategy_manager/__init__.py +0 -0
  94. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/fetch_strategy_manager/common.py +33 -0
  95. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/fetch_strategy_manager/fetch_strategy_manager.py +60 -0
  96. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/fetch_strategy_manager/strategy/__init__.py +0 -0
  97. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/fetch_strategy_manager/strategy/folder/__init__.py +0 -0
  98. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/fetch_strategy_manager/strategy/folder/folder_strategy.py +73 -0
  99. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/fetch_strategy_manager/strategy/git/__init__.py +0 -0
  100. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/fetch_strategy_manager/strategy/git/git_strategy.py +149 -0
  101. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/fetch_strategy_manager/strategy/strategy.py +69 -0
  102. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/fetch_strategy_manager/strategy/zip/__init__.py +0 -0
  103. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/fetch_model_step/fetch_strategy_manager/strategy/zip/zip_strategy.py +64 -0
  104. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/post_fetch_validation_step.py +117 -0
  105. qwak_sdk/commands/models/build/_logic/phase/a_fetch_model_code/pre_fetch_validation_step.py +135 -0
  106. qwak_sdk/commands/models/build/_logic/phase/b_remote_register_qwak_build/__init__.py +11 -0
  107. qwak_sdk/commands/models/build/_logic/phase/b_remote_register_qwak_build/cleanup_step.py +20 -0
  108. qwak_sdk/commands/models/build/_logic/phase/b_remote_register_qwak_build/start_remote_build_step.py +42 -0
  109. qwak_sdk/commands/models/build/_logic/phase/b_remote_register_qwak_build/upload_step.py +349 -0
  110. qwak_sdk/commands/models/build/_logic/phase/c_deploy/__init__.py +6 -0
  111. qwak_sdk/commands/models/build/_logic/phase/c_deploy/build_polling_status.py +54 -0
  112. qwak_sdk/commands/models/build/_logic/phase/c_deploy/deploy_build.py +44 -0
  113. qwak_sdk/commands/models/build/_logic/util/__init__.py +0 -0
  114. qwak_sdk/commands/models/build/_logic/util/protobuf_factory.py +45 -0
  115. qwak_sdk/commands/models/build/_logic/util/step_decorator.py +37 -0
  116. qwak_sdk/commands/models/build/_logic/util/text.py +9 -0
  117. qwak_sdk/commands/models/build/ui.py +241 -0
  118. qwak_sdk/commands/models/builds/__init__.py +0 -0
  119. qwak_sdk/commands/models/builds/builds_commands_group.py +16 -0
  120. qwak_sdk/commands/models/builds/cancel/__init__.py +0 -0
  121. qwak_sdk/commands/models/builds/cancel/_logic.py +5 -0
  122. qwak_sdk/commands/models/builds/cancel/ui.py +15 -0
  123. qwak_sdk/commands/models/builds/logs/__init__.py +0 -0
  124. qwak_sdk/commands/models/builds/logs/ui.py +35 -0
  125. qwak_sdk/commands/models/builds/status/__init__.py +0 -0
  126. qwak_sdk/commands/models/builds/status/_logic.py +6 -0
  127. qwak_sdk/commands/models/builds/status/ui.py +30 -0
  128. qwak_sdk/commands/models/create/__init__.py +0 -0
  129. qwak_sdk/commands/models/create/_logic.py +35 -0
  130. qwak_sdk/commands/models/create/ui.py +27 -0
  131. qwak_sdk/commands/models/delete/__init__.py +0 -0
  132. qwak_sdk/commands/models/delete/_logic.py +5 -0
  133. qwak_sdk/commands/models/delete/ui.py +16 -0
  134. qwak_sdk/commands/models/deployments/__init__.py +0 -0
  135. qwak_sdk/commands/models/deployments/deploy/__init__.py +0 -0
  136. qwak_sdk/commands/models/deployments/deploy/_logic/__init__.py +0 -0
  137. qwak_sdk/commands/models/deployments/deploy/_logic/advance_deployment_options_handler.py +31 -0
  138. qwak_sdk/commands/models/deployments/deploy/_logic/base_deploy_executor.py +64 -0
  139. qwak_sdk/commands/models/deployments/deploy/_logic/deploy_config.py +241 -0
  140. qwak_sdk/commands/models/deployments/deploy/_logic/deployment.py +405 -0
  141. qwak_sdk/commands/models/deployments/deploy/_logic/deployment_message_helpers.py +98 -0
  142. qwak_sdk/commands/models/deployments/deploy/_logic/deployment_response_handler.py +154 -0
  143. qwak_sdk/commands/models/deployments/deploy/_logic/deployment_size_mapper.py +21 -0
  144. qwak_sdk/commands/models/deployments/deploy/_logic/get_latest_successful_build.py +31 -0
  145. qwak_sdk/commands/models/deployments/deploy/_logic/variations.py +79 -0
  146. qwak_sdk/commands/models/deployments/deploy/batch/__init__.py +0 -0
  147. qwak_sdk/commands/models/deployments/deploy/batch/_logic/__init__.py +0 -0
  148. qwak_sdk/commands/models/deployments/deploy/batch/_logic/advanced_deployment_mapper.py +14 -0
  149. qwak_sdk/commands/models/deployments/deploy/batch/_logic/deploy_executor.py +24 -0
  150. qwak_sdk/commands/models/deployments/deploy/batch/ui.py +104 -0
  151. qwak_sdk/commands/models/deployments/deploy/deploy_commands_group.py +19 -0
  152. qwak_sdk/commands/models/deployments/deploy/realtime/__init__.py +0 -0
  153. qwak_sdk/commands/models/deployments/deploy/realtime/_logic/__init__.py +0 -0
  154. qwak_sdk/commands/models/deployments/deploy/realtime/_logic/advanced_deployment_mapper.py +20 -0
  155. qwak_sdk/commands/models/deployments/deploy/realtime/_logic/deploy_executor.py +24 -0
  156. qwak_sdk/commands/models/deployments/deploy/realtime/_logic/serving_strategy_mapper.py +105 -0
  157. qwak_sdk/commands/models/deployments/deploy/realtime/ui.py +179 -0
  158. qwak_sdk/commands/models/deployments/deploy/streaming/__init__.py +0 -0
  159. qwak_sdk/commands/models/deployments/deploy/streaming/_logic/__init__.py +0 -0
  160. qwak_sdk/commands/models/deployments/deploy/streaming/_logic/deploy_executor.py +24 -0
  161. qwak_sdk/commands/models/deployments/deploy/streaming/_logic/serving_strategy_mapper.py +38 -0
  162. qwak_sdk/commands/models/deployments/deploy/streaming/ui.py +196 -0
  163. qwak_sdk/commands/models/deployments/undeploy/__init__.py +0 -0
  164. qwak_sdk/commands/models/deployments/undeploy/_logic/__init__.py +0 -0
  165. qwak_sdk/commands/models/deployments/undeploy/_logic/request_undeploy.py +176 -0
  166. qwak_sdk/commands/models/deployments/undeploy/_logic/variations.py +74 -0
  167. qwak_sdk/commands/models/deployments/undeploy/ui.py +78 -0
  168. qwak_sdk/commands/models/executions/__init__.py +0 -0
  169. qwak_sdk/commands/models/executions/cancel/__init__.py +0 -0
  170. qwak_sdk/commands/models/executions/cancel/_logic.py +9 -0
  171. qwak_sdk/commands/models/executions/cancel/ui.py +27 -0
  172. qwak_sdk/commands/models/executions/execution_commands_group.py +24 -0
  173. qwak_sdk/commands/models/executions/report/__init__.py +0 -0
  174. qwak_sdk/commands/models/executions/report/_logic.py +14 -0
  175. qwak_sdk/commands/models/executions/report/ui.py +43 -0
  176. qwak_sdk/commands/models/executions/start/__init__.py +0 -0
  177. qwak_sdk/commands/models/executions/start/_logic.py +16 -0
  178. qwak_sdk/commands/models/executions/start/ui.py +176 -0
  179. qwak_sdk/commands/models/executions/status/__init__.py +0 -0
  180. qwak_sdk/commands/models/executions/status/_logic.py +13 -0
  181. qwak_sdk/commands/models/executions/status/ui.py +27 -0
  182. qwak_sdk/commands/models/init/__init__.py +0 -0
  183. qwak_sdk/commands/models/init/_logic/__init__.py +0 -0
  184. qwak_sdk/commands/models/init/_logic/initialize_model_structure.py +40 -0
  185. qwak_sdk/commands/models/init/_logic/template/__init__.py +0 -0
  186. qwak_sdk/commands/models/init/_logic/template/churn/__init__.py +0 -0
  187. qwak_sdk/commands/models/init/_logic/template/churn/cookiecutter.json +3 -0
  188. qwak_sdk/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/__init__.py +0 -0
  189. qwak_sdk/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
  190. qwak_sdk/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/conda.yml +10 -0
  191. qwak_sdk/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/data.csv +1001 -0
  192. qwak_sdk/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/model.py +95 -0
  193. qwak_sdk/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/tests/__init__.py +0 -0
  194. qwak_sdk/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/tests/it/__init__.py +0 -0
  195. qwak_sdk/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/tests/it/test_churn.py +32 -0
  196. qwak_sdk/commands/models/init/_logic/template/credit_risk/__init__.py +0 -0
  197. qwak_sdk/commands/models/init/_logic/template/credit_risk/cookiecutter.json +3 -0
  198. qwak_sdk/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/__init__.py +0 -0
  199. qwak_sdk/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
  200. qwak_sdk/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/conda.yml +10 -0
  201. qwak_sdk/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/data.csv +1001 -0
  202. qwak_sdk/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/model.py +108 -0
  203. qwak_sdk/commands/models/init/_logic/template/general/__init__.py +0 -0
  204. qwak_sdk/commands/models/init/_logic/template/general/cookiecutter.json +6 -0
  205. qwak_sdk/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/__init__.py +0 -0
  206. qwak_sdk/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.main_directory}}/__init__.py +5 -0
  207. qwak_sdk/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.main_directory}}/conda.yml +8 -0
  208. qwak_sdk/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.main_directory}}/model.py +66 -0
  209. qwak_sdk/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.test_directory}}/__init__.py +0 -0
  210. qwak_sdk/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.test_directory}}/test_qwak_model.py +5 -0
  211. qwak_sdk/commands/models/init/_logic/template/titanic/__init__.py +0 -0
  212. qwak_sdk/commands/models/init/_logic/template/titanic/cookiecutter.json +3 -0
  213. qwak_sdk/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/__init__.py +0 -0
  214. qwak_sdk/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
  215. qwak_sdk/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/main/conda.yml +10 -0
  216. qwak_sdk/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/main/model.py +98 -0
  217. qwak_sdk/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/tests/__init__.py +0 -0
  218. qwak_sdk/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/tests/it/__init__.py +0 -0
  219. qwak_sdk/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/tests/it/test_titanic.py +24 -0
  220. qwak_sdk/commands/models/init/_logic/template/titanic_poetry/__init__.py +0 -0
  221. qwak_sdk/commands/models/init/_logic/template/titanic_poetry/cookiecutter.json +3 -0
  222. qwak_sdk/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/__init__.py +0 -0
  223. qwak_sdk/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
  224. qwak_sdk/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/main/model.py +98 -0
  225. qwak_sdk/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/main/pyproject.toml +18 -0
  226. qwak_sdk/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/tests/__init__.py +0 -0
  227. qwak_sdk/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/tests/it/__init__.py +0 -0
  228. qwak_sdk/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/tests/it/test_titanic.py +25 -0
  229. qwak_sdk/commands/models/init/ui.py +61 -0
  230. qwak_sdk/commands/models/list/__init__.py +0 -0
  231. qwak_sdk/commands/models/list/_logic.py +5 -0
  232. qwak_sdk/commands/models/list/ui.py +31 -0
  233. qwak_sdk/commands/models/models_command_group.py +36 -0
  234. qwak_sdk/commands/models/runtime/__init__.py +0 -0
  235. qwak_sdk/commands/models/runtime/feedback/__init__.py +0 -0
  236. qwak_sdk/commands/models/runtime/feedback/_logic.py +81 -0
  237. qwak_sdk/commands/models/runtime/feedback/ui.py +45 -0
  238. qwak_sdk/commands/models/runtime/logs/__init__.py +0 -0
  239. qwak_sdk/commands/models/runtime/logs/ui.py +63 -0
  240. qwak_sdk/commands/models/runtime/runtime_commands_group.py +21 -0
  241. qwak_sdk/commands/models/runtime/traffic_update/__init__.py +0 -0
  242. qwak_sdk/commands/models/runtime/traffic_update/_logic/__init__.py +0 -0
  243. qwak_sdk/commands/models/runtime/traffic_update/_logic/execute_runtime_update_traffic.py +54 -0
  244. qwak_sdk/commands/models/runtime/traffic_update/_logic/variations.py +84 -0
  245. qwak_sdk/commands/models/runtime/traffic_update/ui.py +37 -0
  246. qwak_sdk/commands/models/runtime/update/__init__.py +0 -0
  247. qwak_sdk/commands/models/runtime/update/_logic.py +9 -0
  248. qwak_sdk/commands/models/runtime/update/ui.py +15 -0
  249. qwak_sdk/commands/projects/__init__.py +0 -0
  250. qwak_sdk/commands/projects/create/__init__.py +0 -0
  251. qwak_sdk/commands/projects/create/_logic.py +6 -0
  252. qwak_sdk/commands/projects/create/ui.py +21 -0
  253. qwak_sdk/commands/projects/delete/__init__.py +0 -0
  254. qwak_sdk/commands/projects/delete/_logic.py +6 -0
  255. qwak_sdk/commands/projects/delete/ui.py +15 -0
  256. qwak_sdk/commands/projects/list/__init__.py +0 -0
  257. qwak_sdk/commands/projects/list/_logic.py +6 -0
  258. qwak_sdk/commands/projects/list/ui.py +36 -0
  259. qwak_sdk/commands/projects/projects_command_group.py +19 -0
  260. qwak_sdk/commands/secrets/__init__.py +0 -0
  261. qwak_sdk/commands/secrets/delete/__init__.py +0 -0
  262. qwak_sdk/commands/secrets/delete/_logic.py +5 -0
  263. qwak_sdk/commands/secrets/delete/ui.py +21 -0
  264. qwak_sdk/commands/secrets/get/__init__.py +0 -0
  265. qwak_sdk/commands/secrets/get/_logic.py +5 -0
  266. qwak_sdk/commands/secrets/get/ui.py +17 -0
  267. qwak_sdk/commands/secrets/secrets_commands_group.py +19 -0
  268. qwak_sdk/commands/secrets/set/__init__.py +0 -0
  269. qwak_sdk/commands/secrets/set/_logic.py +5 -0
  270. qwak_sdk/commands/secrets/set/ui.py +16 -0
  271. qwak_sdk/commands/ui_tools.py +18 -0
  272. qwak_sdk/common/__init__.py +0 -0
  273. qwak_sdk/common/run_config/__init__.py +22 -0
  274. qwak_sdk/common/run_config/base.py +101 -0
  275. qwak_sdk/common/run_config/utils.py +249 -0
  276. qwak_sdk/exceptions/__init__.py +11 -0
  277. qwak_sdk/exceptions/qwak_command_exception.py +2 -0
  278. qwak_sdk/exceptions/qwak_deploy_new_build_failed.py +5 -0
  279. qwak_sdk/exceptions/qwak_general_build_exception.py +13 -0
  280. qwak_sdk/exceptions/qwak_remote_build_failed.py +5 -0
  281. qwak_sdk/exceptions/qwak_resource_not_found.py +2 -0
  282. qwak_sdk/exceptions/qwak_suggestion_exception.py +27 -0
  283. qwak_sdk/inner/__init__.py +0 -0
  284. qwak_sdk/inner/file_registry.py +97 -0
  285. qwak_sdk/inner/tools/__init__.py +0 -0
  286. qwak_sdk/inner/tools/cli_tools.py +159 -0
  287. qwak_sdk/inner/tools/config_handler.py +18 -0
  288. qwak_sdk/inner/tools/logger/__init__.py +3 -0
  289. qwak_sdk/inner/tools/logger/logger.py +269 -0
  290. qwak_sdk/inner/tools/logger/logging.yml +79 -0
  291. qwak_sdk/inner/tools/tracking.py +47 -0
  292. qwak_sdk/main.py +9 -0
  293. qwak_sdk/tools/__init__.py +0 -0
  294. qwak_sdk/tools/colors.py +13 -0
  295. qwak_sdk/tools/files.py +9 -0
  296. qwak_sdk/tools/log_handling.py +146 -0
  297. qwak_sdk/tools/utils.py +46 -0
  298. qwak_sdk-0.2.21rc0.dist-info/METADATA +42 -0
  299. qwak_sdk-0.2.21rc0.dist-info/RECORD +302 -0
  300. {qwak_sdk-0.1.0.dist-info → qwak_sdk-0.2.21rc0.dist-info}/WHEEL +1 -2
  301. qwak_sdk-0.2.21rc0.dist-info/entry_points.txt +3 -0
  302. qwak_sdk-0.1.0.dist-info/METADATA +0 -19
  303. qwak_sdk-0.1.0.dist-info/RECORD +0 -5
  304. qwak_sdk-0.1.0.dist-info/top_level.txt +0 -1
  305. {qwak-sdk → qwak_sdk/commands}/__init__.py +0 -0
@@ -0,0 +1,241 @@
1
+ from dataclasses import dataclass, field
2
+ from enum import Enum
3
+ from typing import Dict, List, Optional, Tuple, Union
4
+
5
+ from qwak_sdk.commands.audience._logic.config.v1.audience_config import AudienceConfig
6
+ from qwak_sdk.commands.auto_scalling._logic.config.config import AutoScaling
7
+ from qwak_sdk.commands.models.deployments.deploy._logic.get_latest_successful_build import (
8
+ get_latest_successful_build_from_model,
9
+ )
10
+ from qwak_sdk.common.run_config import (
11
+ ConfigCliMap,
12
+ QwakConfigBase,
13
+ YamlConfigMixin,
14
+ validate_bool,
15
+ validate_enum,
16
+ validate_int,
17
+ validate_list_of_strings,
18
+ validate_string,
19
+ )
20
+ from qwak_sdk.common.run_config.utils import validate_float, validate_variations
21
+
22
+
23
+ class CompressionTypes(Enum):
24
+ UNCOMPRESSED = "uncompressed"
25
+ GZIP = "gzip"
26
+ SNAPPY = "snappy"
27
+ LZ4 = "lz4"
28
+ ZSTD = "zstd"
29
+
30
+
31
+ class AutoOffsetReset(Enum):
32
+ UNSET = "unset"
33
+ LATEST = "latest"
34
+ EARLIEST = "earliest"
35
+
36
+
37
+ class PurchaseOption(Enum):
38
+ SPOT = "spot"
39
+ ONDEMAND = "ondemand"
40
+
41
+
42
+ CONFIG_MAPPING: List[ConfigCliMap] = [
43
+ # Stream
44
+ # General
45
+ ConfigCliMap("model_id", "model_id", validate_string, True),
46
+ ConfigCliMap("build_id", "build_id", validate_string, False),
47
+ # Kafka
48
+ ConfigCliMap(
49
+ "bootstrap_server", "stream.kafka.bootstrap_servers", validate_list_of_strings
50
+ ),
51
+ # Kafka - Consumer
52
+ ConfigCliMap(
53
+ "consumer_bootstrap_server",
54
+ "stream.kafka.consumer.bootstrap_servers",
55
+ validate_list_of_strings,
56
+ False,
57
+ ),
58
+ ConfigCliMap(
59
+ "consumer_topic", "stream.kafka.consumer.topic", validate_string, True
60
+ ),
61
+ ConfigCliMap(
62
+ "consumer_group", "stream.kafka.consumer.group", validate_string, True
63
+ ),
64
+ ConfigCliMap(
65
+ "consumer_auto_offset_reset",
66
+ "stream.kafka.consumer.auto_offset_reset",
67
+ validate_enum(AutoOffsetReset),
68
+ False,
69
+ ),
70
+ ConfigCliMap(
71
+ "consumer_timeout", "stream.kafka.consumer.timeout", validate_int, True
72
+ ),
73
+ ConfigCliMap(
74
+ "consumer_max_batch_size",
75
+ "stream.kafka.consumer.max_batch_size",
76
+ validate_int,
77
+ True,
78
+ ),
79
+ ConfigCliMap(
80
+ "consumer_max_poll_latency",
81
+ "stream.kafka.consumer.max_poll_latency",
82
+ validate_float,
83
+ True,
84
+ ),
85
+ # Kafka - Producer
86
+ ConfigCliMap(
87
+ "producer_bootstrap_server",
88
+ "stream.kafka.producer.bootstrap_servers",
89
+ validate_list_of_strings,
90
+ False,
91
+ ),
92
+ ConfigCliMap(
93
+ "producer_topic", "stream.kafka.producer.topic", validate_string, True
94
+ ),
95
+ ConfigCliMap(
96
+ "producer_compression_type",
97
+ "stream.kafka.producer.compression_type",
98
+ validate_enum(CompressionTypes),
99
+ False,
100
+ ),
101
+ ConfigCliMap("env_vars", "stream.env_vars", validate_list_of_strings),
102
+ # Realtime
103
+ ConfigCliMap("timeout", "realtime.timeout", validate_int, False),
104
+ ConfigCliMap("workers", "realtime.workers", validate_int, False),
105
+ ConfigCliMap("daemon_mode", "realtime.daemon_mode", validate_bool, False),
106
+ ConfigCliMap("server_workers", "realtime.workers", validate_int, False),
107
+ ConfigCliMap("max_batch_size", "realtime.max_batch_size", validate_int, False),
108
+ ConfigCliMap(
109
+ "deployment_timeout", "realtime.deployment_timeout", validate_int, False
110
+ ),
111
+ ConfigCliMap("variation_name", "realtime.variation_name", validate_string, False),
112
+ ConfigCliMap(
113
+ "environment_name", "realtime.environments", validate_list_of_strings, False
114
+ ),
115
+ ConfigCliMap(
116
+ "variations",
117
+ "realtime.variations",
118
+ validate_variations,
119
+ False,
120
+ ),
121
+ ConfigCliMap("env_vars", "realtime.env_vars", validate_list_of_strings),
122
+ # Batch
123
+ # Resources
124
+ ConfigCliMap("pods", "resources.pods", validate_int, False),
125
+ ConfigCliMap("cpus", "resources.cpus", validate_int, False),
126
+ ConfigCliMap("memory", "resources.memory", validate_int, False),
127
+ ConfigCliMap("gpu_type", "resources.gpu_type", validate_string, False),
128
+ ConfigCliMap("gpu_amount", "resources.gpu_amount", validate_int, False),
129
+ # Permissions
130
+ ConfigCliMap(
131
+ "iam_role_arn", "advanced_options.iam_role_arn", validate_string, False
132
+ ),
133
+ ConfigCliMap(
134
+ "purchase_option",
135
+ "advanced_options.purchase_option",
136
+ validate_enum(PurchaseOption),
137
+ False,
138
+ ),
139
+ ]
140
+
141
+
142
+ @dataclass
143
+ class DeployConfig(YamlConfigMixin, QwakConfigBase):
144
+ def _post_merge_cli(self):
145
+ if self.stream.kafka.bootstrap_servers:
146
+ if not self.stream.kafka.consumer.bootstrap_servers:
147
+ self.stream.kafka.consumer.bootstrap_servers = (
148
+ self.stream.kafka.bootstrap_servers
149
+ )
150
+ if not self.stream.kafka.producer.bootstrap_servers:
151
+ self.stream.kafka.producer.bootstrap_servers = (
152
+ self.stream.kafka.bootstrap_servers
153
+ )
154
+ if not self.build_id:
155
+ self.build_id = get_latest_successful_build_from_model(self.model_id)
156
+
157
+ @property
158
+ def _config_mapping(self) -> List[ConfigCliMap]:
159
+ return CONFIG_MAPPING
160
+
161
+ @dataclass
162
+ class Stream:
163
+ @dataclass
164
+ class Kafka:
165
+ @dataclass
166
+ class Consumer:
167
+ bootstrap_servers: List[str] = field(default_factory=list)
168
+ topic: str = field(default="")
169
+ group: str = field(default="")
170
+ auto_offset_reset: str = field(default=AutoOffsetReset.LATEST.name)
171
+ timeout: int = field(default=20)
172
+ max_batch_size: int = field(default=1)
173
+ max_poll_latency: float = field(default=1.0)
174
+
175
+ @dataclass
176
+ class Producer:
177
+ bootstrap_servers: List[str] = field(default_factory=list)
178
+ topic: str = field(default="")
179
+ compression_type: str = field(default=CompressionTypes.GZIP.name)
180
+
181
+ bootstrap_servers: List[str] = field(default_factory=list)
182
+ consumer: Consumer = field(default_factory=Consumer)
183
+ producer: Producer = field(default_factory=Producer)
184
+
185
+ kafka: Kafka = field(default_factory=Kafka)
186
+ env_vars: Optional[Union[List[str], Dict[str, str], Tuple]] = field(
187
+ default_factory=list
188
+ )
189
+
190
+ @dataclass
191
+ class Realtime:
192
+ @dataclass
193
+ class VariationConfig:
194
+ @dataclass
195
+ class TrafficConfig:
196
+ percentage: int = field(default=100)
197
+ shadow: bool = field(default=False)
198
+
199
+ name: str = field(default="default")
200
+ traffic: TrafficConfig = field(default_factory=TrafficConfig)
201
+
202
+ timeout: int = field(default=6000)
203
+ workers: int = field(default=2)
204
+ deployment_timeout: int = field(default=0)
205
+ daemon_mode: bool = field(default=True)
206
+ max_batch_size: int = field(default=1)
207
+ variation_name: str = field(default="")
208
+ variations: List[VariationConfig] = field(default_factory=list)
209
+ audiences: List[AudienceConfig] = field(default_factory=list)
210
+ environments: List[str] = field(default_factory=list)
211
+ fallback_variation: str = field(default="")
212
+ env_vars: Optional[Union[List[str], Dict[str, str], Tuple]] = field(
213
+ default_factory=list
214
+ )
215
+
216
+ @dataclass
217
+ class Batch:
218
+ pass
219
+
220
+ @dataclass
221
+ class Resources:
222
+ pods: int = field(default=1)
223
+ cpus: int = field(default=2)
224
+ memory: int = field(default=512)
225
+ gpu_type: str = field(default=None)
226
+ gpu_amount: int = field(default=0)
227
+
228
+ @dataclass
229
+ class AdvancedOptions:
230
+ iam_role_arn: str = field(default=None)
231
+ purchase_option: str = field(default=PurchaseOption.SPOT.value)
232
+
233
+ model_id: str = field(default="")
234
+ build_id: str = field(default="")
235
+
236
+ stream: Stream = field(default_factory=Stream)
237
+ auto_scaling: AutoScaling = field(default=None)
238
+ realtime: Realtime = field(default_factory=Realtime)
239
+ batch: Batch = field(default_factory=Batch)
240
+ resources: Resources = field(default_factory=Resources)
241
+ advanced_options: AdvancedOptions = field(default_factory=AdvancedOptions)
@@ -0,0 +1,405 @@
1
+ from abc import ABC
2
+ from dataclasses import dataclass, field
3
+ from datetime import datetime
4
+ from enum import Enum
5
+ from typing import Dict, List
6
+
7
+ from _qwak_proto.qwak.audience.v1.audience_pb2 import (
8
+ AudienceRoutesEntry as AudienceProto,
9
+ )
10
+ from _qwak_proto.qwak.audience.v1.audience_pb2 import Route as RouteProto
11
+ from _qwak_proto.qwak.auto_scaling.v1.auto_scaling_pb2 import (
12
+ AutoScalingConfig as AutoScalingProto,
13
+ )
14
+ from _qwak_proto.qwak.deployment.deployment_pb2 import (
15
+ DeploymentDetails as DeploymentProto,
16
+ )
17
+ from _qwak_proto.qwak.deployment.deployment_pb2 import (
18
+ RealTimeConfig as RealTimeConfigProto,
19
+ )
20
+ from _qwak_proto.qwak.deployment.deployment_pb2 import (
21
+ ServingStrategy as ServingStrategyProto,
22
+ )
23
+ from _qwak_proto.qwak.deployment.deployment_pb2 import StreamConfig as StreamConfigProto
24
+
25
+
26
+ @dataclass
27
+ class TrafficSpec:
28
+ percentage: int = field(default=None)
29
+ is_shadow: bool = field(default=None)
30
+
31
+
32
+ @dataclass
33
+ class Variation:
34
+ name: str = field(default=None)
35
+ environment_id: str = field(default=None)
36
+ traffic_spec: TrafficSpec = field(default=None)
37
+
38
+
39
+ @dataclass
40
+ class Route:
41
+ variation_name: str = field(default=None)
42
+ weight: int = field(default=None)
43
+ shadow: bool = field(default=None)
44
+ model_id: str = field(default=None)
45
+ environment_id: str = field(default=None)
46
+ audience_id: str = field(default=None)
47
+
48
+
49
+ @dataclass
50
+ class AudienceRoute:
51
+ audience_id: str = field(default=None)
52
+ audience_name: str = field(default=None)
53
+ routes: List[Route] = field(default_factory=list)
54
+ order: int = field(default=None)
55
+
56
+
57
+ @dataclass
58
+ class EnvironmentAudienceRoute(AudienceRoute):
59
+ environment_id: str = field(default=None)
60
+
61
+ @staticmethod
62
+ def from_proto(environment_id: str, proto: AudienceProto):
63
+ return EnvironmentAudienceRoute(
64
+ audience_id=proto.audience_id,
65
+ audience_name=proto.audience_name,
66
+ routes=Deployment.parse_routes(proto.routes),
67
+ order=proto.order,
68
+ environment_id=environment_id,
69
+ )
70
+
71
+
72
+ class Metric(Enum):
73
+ NOT_VALID = 0
74
+ CPU = 1
75
+ MEMORY = 2
76
+ LATENCY = 3
77
+ GPU = 4
78
+ ERROR_RATE = 5
79
+ THROUGHPUT = 6
80
+
81
+
82
+ class Aggregation(Enum):
83
+ NOT_VALID = 0
84
+ MIN = 1
85
+ MAX = 2
86
+ AVERAGE = 3
87
+ SUM = 4
88
+
89
+
90
+ @dataclass
91
+ class QuerySpec:
92
+ metric: Metric = field(default=None)
93
+ aggregation: Aggregation = field(default=None)
94
+ time_period: int = field(default=None)
95
+ error_code: str = field(default=None)
96
+
97
+
98
+ class Triggers(ABC):
99
+ pass
100
+
101
+
102
+ @dataclass
103
+ class PrometheusTrigger(Triggers):
104
+ query_spec: QuerySpec = field(default=None)
105
+ threshold: int = field(default=None)
106
+
107
+
108
+ @dataclass
109
+ class AutoScalingConfig:
110
+ min_replica_count: int = field(default=None)
111
+ max_replica_count: int = field(default=None)
112
+ pooling_interval: int = field(default=None)
113
+ cool_down_period: int = field(default=None)
114
+ triggers: List[Triggers] = field(default_factory=list)
115
+
116
+
117
+ @dataclass
118
+ class TrafficConfig:
119
+ selected_variation_name: str = field(default=None)
120
+ variations: List[Variation] = field(default_factory=list)
121
+ audiences: List[AudienceRoute] = field(default_factory=list)
122
+ fallback_variation: str = field(default=None)
123
+
124
+
125
+ class ServingConfig(ABC):
126
+ pass
127
+
128
+
129
+ @dataclass
130
+ class RealTimeConfig(ServingConfig):
131
+ traffic_config: TrafficConfig = field(default=None)
132
+ autoscaling_config: AutoScalingConfig = field(default=None)
133
+
134
+
135
+ @dataclass
136
+ class BatchConfig(ServingConfig):
137
+ pass
138
+
139
+
140
+ class AutoOffSet(Enum):
141
+ UNKNOWN = 0
142
+ EARLIEST = 1
143
+ LATEST = 2
144
+
145
+
146
+ @dataclass
147
+ class Consumer:
148
+ bootstrap_server: List[str] = field(default_factory=list)
149
+ topic: str = field(default=None)
150
+ group: str = field(default=None)
151
+ timeout: int = field(default=None)
152
+ auto_offset: AutoOffSet = field(default=None)
153
+ max_batch_size: int = field(default=None)
154
+ max_poll_latency: float = field(default=None)
155
+
156
+
157
+ class Compression(Enum):
158
+ UNKNOWN = 0
159
+ UNCOMPRESSED = 1
160
+ GZIP = 2
161
+ SNAPPY = 3
162
+ LZ4 = 4
163
+ ZSTD = 5
164
+
165
+
166
+ @dataclass
167
+ class Producer:
168
+ bootstrap_server: List[str] = field(default_factory=list)
169
+ topic: str = field(default=None)
170
+ compression: Compression = field(default=None)
171
+
172
+
173
+ @dataclass
174
+ class KafkaConfig:
175
+ consumer: Consumer = field(default=None)
176
+ producer: Producer = field(default=None)
177
+ workers: int = field(default=None)
178
+
179
+
180
+ @dataclass
181
+ class StreamConfig(ServingConfig):
182
+ kafka: KafkaConfig = field(default=None)
183
+
184
+
185
+ class BuildStatus(Enum):
186
+ INVALID = 0
187
+ IN_PROGRESS = 1
188
+ SUCCESSFUL = 2
189
+ FAILED = 3
190
+ REMOTE_BUILD_INITIALIZING = 4
191
+ REMOTE_BUILD_CANCELLED = 5
192
+ REMOTE_BUILD_TIMED_OUT = 6
193
+ REMOTE_BUILD_UNKNOWN = 7
194
+ SYNCING_ENVIRONMENTS = 8
195
+ FINISHED_SYNCING = 9
196
+
197
+
198
+ class MemoryUnit(Enum):
199
+ UNKNOWN = 0
200
+ MIB = 1
201
+ GIB = 2
202
+
203
+
204
+ class KubeDeploymentType(Enum):
205
+ UNDEFINED = 0
206
+ ONLINE = 1
207
+ STREAM = 2
208
+ BATCH = 3
209
+
210
+
211
+ class GpuType(Enum):
212
+ INVALID_GPU = 0
213
+ ONLINE = 1
214
+ STREAM = 2
215
+ BATCH = 3
216
+
217
+
218
+ @dataclass
219
+ class Deployment:
220
+ build_id: str = field(default=None)
221
+ number_of_pods: int = field(default=None)
222
+ cpu_fraction: float = field(default=None)
223
+ memory_amount: int = field(default=None)
224
+ memory_units: MemoryUnit = field(default=MemoryUnit.UNKNOWN)
225
+ number_of_workers: int = field(default=None)
226
+ http_request_timeout_ms: int = field(default=None)
227
+ kube_deployment_type: KubeDeploymentType = field(
228
+ default=KubeDeploymentType.UNDEFINED
229
+ )
230
+ serving_config: ServingConfig = field(default=None)
231
+ variation: Variation = field(default=None)
232
+ custom_iam_role_arn: str = field(default=None)
233
+ max_batch_size: int = field(default=None)
234
+ gpu_type: GpuType = field(default=GpuType.INVALID_GPU)
235
+ gpu_amount: int = field(default=None)
236
+ environment_id: str = field(default=None)
237
+ available_replicas: int = field(default=None)
238
+ deployment_process_timeout_limit: int = field(default=None)
239
+ daemon_mode: bool = field(default=None)
240
+ purchase_option: str = field(default=None)
241
+ environment_variables: Dict[str, str] = field(default_factory=dict)
242
+ last_deployed: datetime = field(default=datetime.now())
243
+
244
+ @staticmethod
245
+ def parse_routes(proto: List[RouteProto]) -> List[Route]:
246
+ routes = []
247
+ for proto_route in proto:
248
+ route = Route(
249
+ variation_name=proto_route.variation_name,
250
+ weight=proto_route.weight,
251
+ shadow=proto_route.shadow,
252
+ model_id=proto_route.model_id,
253
+ environment_id=proto_route.environment_id,
254
+ audience_id=proto_route.audience_id,
255
+ )
256
+ routes.append(route)
257
+ return routes
258
+
259
+ @staticmethod
260
+ def parse_audience_routes(proto: List[RouteProto]) -> List[AudienceRoute]:
261
+ routes = []
262
+ for proto_route in proto:
263
+ route = AudienceRoute(
264
+ audience_id=proto_route.audience_id,
265
+ audience_name=proto_route.audience_name,
266
+ routes=Deployment.parse_routes(proto_route.routes),
267
+ order=proto_route.order,
268
+ )
269
+ routes.append(route)
270
+ return routes
271
+
272
+ @staticmethod
273
+ def parse_autoscaling(proto: AutoScalingProto) -> AutoScalingConfig:
274
+ triggers = []
275
+ for proto_trigger in proto.triggers.triggers:
276
+ trigger = PrometheusTrigger(
277
+ query_spec=QuerySpec(
278
+ metric=Metric(
279
+ proto_trigger.prometheus_trigger.query_spec.metric_type
280
+ ),
281
+ aggregation=Aggregation(
282
+ proto_trigger.prometheus_trigger.query_spec.aggregation_type
283
+ ),
284
+ time_period=proto_trigger.prometheus_trigger.query_spec.time_period,
285
+ error_code=proto_trigger.prometheus_trigger.query_spec.error_code,
286
+ ),
287
+ threshold=proto_trigger.prometheus_trigger.threshold,
288
+ )
289
+ triggers.append(trigger)
290
+ return AutoScalingConfig(
291
+ min_replica_count=proto.min_replica_count,
292
+ max_replica_count=proto.max_replica_count,
293
+ pooling_interval=proto.polling_interval,
294
+ cool_down_period=proto.cool_down_period,
295
+ triggers=triggers,
296
+ )
297
+
298
+ @staticmethod
299
+ def parse_realtime_config(proto: RealTimeConfigProto) -> RealTimeConfig:
300
+ variations = []
301
+ for proto_variation in proto.traffic_config.variations:
302
+ variation = Variation(
303
+ name=proto_variation.name,
304
+ environment_id=proto_variation.environment_id,
305
+ traffic_spec=TrafficSpec(
306
+ percentage=proto_variation.traffic.percentage,
307
+ is_shadow=proto_variation.traffic.is_shadow,
308
+ ),
309
+ )
310
+ variations.append(variation)
311
+ audiences = []
312
+ for proto_audience in proto.traffic_config.audience_routes_entries:
313
+ audience = AudienceRoute(
314
+ audience_id=proto_audience.audience_id,
315
+ audience_name=proto_audience.audience_name,
316
+ routes=Deployment.parse_routes(proto_audience.routes),
317
+ order=proto_audience.order,
318
+ )
319
+ audiences.append(audience)
320
+
321
+ autoscaling = Deployment.parse_autoscaling(proto.auto_scaling_config)
322
+ return RealTimeConfig(
323
+ traffic_config=TrafficConfig(
324
+ variations=variations,
325
+ audiences=audiences,
326
+ fallback_variation=proto.traffic_config.fallback_variation,
327
+ ),
328
+ autoscaling_config=autoscaling,
329
+ )
330
+
331
+ @staticmethod
332
+ def parse_streaming_config(proto_config: StreamConfigProto) -> StreamConfig:
333
+ return StreamConfig(
334
+ kafka=KafkaConfig(
335
+ consumer=Consumer(
336
+ bootstrap_server=list(proto_config.kafka.consumer.bootstrap_server),
337
+ topic=proto_config.kafka.consumer.topic,
338
+ group=proto_config.kafka.consumer.group,
339
+ timeout=proto_config.kafka.consumer.timeout,
340
+ auto_offset=AutoOffSet(proto_config.kafka.consumer.auto_offset_type)
341
+ if proto_config.kafka.consumer.auto_offset_type
342
+ else None,
343
+ max_batch_size=proto_config.kafka.consumer.max_batch_size,
344
+ max_poll_latency=proto_config.kafka.consumer.max_poll_latency,
345
+ ),
346
+ producer=Producer(
347
+ bootstrap_server=list(proto_config.kafka.producer.bootstrap_server),
348
+ topic=proto_config.kafka.producer.topic,
349
+ compression=Compression(
350
+ proto_config.kafka.producer.compression_type
351
+ )
352
+ if proto_config.kafka.producer.compression_type
353
+ else None,
354
+ ),
355
+ workers=proto_config.kafka.workers,
356
+ )
357
+ )
358
+
359
+ @staticmethod
360
+ def parse_serving_strategy(proto: ServingStrategyProto) -> ServingConfig:
361
+ which = proto.WhichOneof("Strategy")
362
+ if which == "realtime_config":
363
+ return Deployment.parse_realtime_config(proto.realtime_config)
364
+ elif which == "batch_config":
365
+ return BatchConfig()
366
+ elif which == "stream_config":
367
+ return Deployment.parse_streaming_config(proto.stream_config)
368
+ else:
369
+ raise ValueError(f"Unknown serving strategy: {which}")
370
+
371
+ @staticmethod
372
+ def from_proto(proto: DeploymentProto):
373
+ variation = Variation(
374
+ name=proto.variation.name,
375
+ environment_id=proto.variation.environment_id,
376
+ traffic_spec=TrafficSpec(
377
+ percentage=proto.variation.traffic.percentage,
378
+ is_shadow=proto.variation.traffic.is_shadow,
379
+ ),
380
+ )
381
+ return Deployment(
382
+ build_id=proto.build_id,
383
+ number_of_pods=proto.number_of_pods,
384
+ cpu_fraction=proto.cpu_fraction,
385
+ memory_amount=proto.memory_amount,
386
+ memory_units=MemoryUnit(proto.memory_units),
387
+ number_of_workers=proto.number_of_workers,
388
+ http_request_timeout_ms=proto.http_request_timeout_ms,
389
+ kube_deployment_type=KubeDeploymentType(proto.kube_deployment_type),
390
+ serving_config=Deployment.parse_serving_strategy(proto.serving_strategy),
391
+ variation=variation,
392
+ custom_iam_role_arn=proto.custom_iam_role_arn,
393
+ max_batch_size=proto.max_batch_size,
394
+ gpu_type=GpuType(proto.gpu_type),
395
+ gpu_amount=proto.gpu_amount,
396
+ environment_id=proto.environment_id,
397
+ available_replicas=proto.available_replicas,
398
+ daemon_mode=bool(proto.daemon_mode.value),
399
+ deployment_process_timeout_limit=proto.deployment_process_timeout_limit,
400
+ purchase_option=proto.purchase_option,
401
+ environment_variables=dict(proto.environment_variables),
402
+ last_deployed=datetime.fromtimestamp(
403
+ proto.last_deployed.seconds + proto.last_deployed.nanos / 1e9
404
+ ),
405
+ )