paasta-tools 1.21.3__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.
Files changed (348) hide show
  1. k8s_itests/__init__.py +0 -0
  2. k8s_itests/test_autoscaling.py +23 -0
  3. k8s_itests/utils.py +38 -0
  4. paasta_tools/__init__.py +20 -0
  5. paasta_tools/adhoc_tools.py +142 -0
  6. paasta_tools/api/__init__.py +13 -0
  7. paasta_tools/api/api.py +330 -0
  8. paasta_tools/api/api_docs/swagger.json +2323 -0
  9. paasta_tools/api/client.py +106 -0
  10. paasta_tools/api/settings.py +33 -0
  11. paasta_tools/api/tweens/__init__.py +6 -0
  12. paasta_tools/api/tweens/auth.py +125 -0
  13. paasta_tools/api/tweens/profiling.py +108 -0
  14. paasta_tools/api/tweens/request_logger.py +124 -0
  15. paasta_tools/api/views/__init__.py +13 -0
  16. paasta_tools/api/views/autoscaler.py +100 -0
  17. paasta_tools/api/views/exception.py +45 -0
  18. paasta_tools/api/views/flink.py +73 -0
  19. paasta_tools/api/views/instance.py +395 -0
  20. paasta_tools/api/views/pause_autoscaler.py +71 -0
  21. paasta_tools/api/views/remote_run.py +113 -0
  22. paasta_tools/api/views/resources.py +76 -0
  23. paasta_tools/api/views/service.py +35 -0
  24. paasta_tools/api/views/version.py +25 -0
  25. paasta_tools/apply_external_resources.py +79 -0
  26. paasta_tools/async_utils.py +109 -0
  27. paasta_tools/autoscaling/__init__.py +0 -0
  28. paasta_tools/autoscaling/autoscaling_service_lib.py +57 -0
  29. paasta_tools/autoscaling/forecasting.py +106 -0
  30. paasta_tools/autoscaling/max_all_k8s_services.py +41 -0
  31. paasta_tools/autoscaling/pause_service_autoscaler.py +77 -0
  32. paasta_tools/autoscaling/utils.py +52 -0
  33. paasta_tools/bounce_lib.py +184 -0
  34. paasta_tools/broadcast_log_to_services.py +62 -0
  35. paasta_tools/cassandracluster_tools.py +210 -0
  36. paasta_tools/check_autoscaler_max_instances.py +212 -0
  37. paasta_tools/check_cassandracluster_services_replication.py +35 -0
  38. paasta_tools/check_flink_services_health.py +203 -0
  39. paasta_tools/check_kubernetes_api.py +57 -0
  40. paasta_tools/check_kubernetes_services_replication.py +141 -0
  41. paasta_tools/check_oom_events.py +244 -0
  42. paasta_tools/check_services_replication_tools.py +324 -0
  43. paasta_tools/check_spark_jobs.py +234 -0
  44. paasta_tools/cleanup_kubernetes_cr.py +138 -0
  45. paasta_tools/cleanup_kubernetes_crd.py +145 -0
  46. paasta_tools/cleanup_kubernetes_jobs.py +344 -0
  47. paasta_tools/cleanup_tron_namespaces.py +96 -0
  48. paasta_tools/cli/__init__.py +13 -0
  49. paasta_tools/cli/authentication.py +85 -0
  50. paasta_tools/cli/cli.py +260 -0
  51. paasta_tools/cli/cmds/__init__.py +13 -0
  52. paasta_tools/cli/cmds/autoscale.py +143 -0
  53. paasta_tools/cli/cmds/check.py +334 -0
  54. paasta_tools/cli/cmds/cook_image.py +147 -0
  55. paasta_tools/cli/cmds/get_docker_image.py +76 -0
  56. paasta_tools/cli/cmds/get_image_version.py +172 -0
  57. paasta_tools/cli/cmds/get_latest_deployment.py +93 -0
  58. paasta_tools/cli/cmds/info.py +155 -0
  59. paasta_tools/cli/cmds/itest.py +117 -0
  60. paasta_tools/cli/cmds/list.py +66 -0
  61. paasta_tools/cli/cmds/list_clusters.py +42 -0
  62. paasta_tools/cli/cmds/list_deploy_queue.py +171 -0
  63. paasta_tools/cli/cmds/list_namespaces.py +84 -0
  64. paasta_tools/cli/cmds/local_run.py +1396 -0
  65. paasta_tools/cli/cmds/logs.py +1601 -0
  66. paasta_tools/cli/cmds/mark_for_deployment.py +1988 -0
  67. paasta_tools/cli/cmds/mesh_status.py +174 -0
  68. paasta_tools/cli/cmds/pause_service_autoscaler.py +107 -0
  69. paasta_tools/cli/cmds/push_to_registry.py +275 -0
  70. paasta_tools/cli/cmds/remote_run.py +252 -0
  71. paasta_tools/cli/cmds/rollback.py +347 -0
  72. paasta_tools/cli/cmds/secret.py +549 -0
  73. paasta_tools/cli/cmds/security_check.py +59 -0
  74. paasta_tools/cli/cmds/spark_run.py +1400 -0
  75. paasta_tools/cli/cmds/start_stop_restart.py +401 -0
  76. paasta_tools/cli/cmds/status.py +2302 -0
  77. paasta_tools/cli/cmds/validate.py +1012 -0
  78. paasta_tools/cli/cmds/wait_for_deployment.py +275 -0
  79. paasta_tools/cli/fsm/__init__.py +13 -0
  80. paasta_tools/cli/fsm/autosuggest.py +82 -0
  81. paasta_tools/cli/fsm/template/README.md +8 -0
  82. paasta_tools/cli/fsm/template/cookiecutter.json +7 -0
  83. paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +91 -0
  84. paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +20 -0
  85. paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +8 -0
  86. paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +6 -0
  87. paasta_tools/cli/fsm_cmd.py +121 -0
  88. paasta_tools/cli/paasta_tabcomplete.sh +23 -0
  89. paasta_tools/cli/schemas/adhoc_schema.json +199 -0
  90. paasta_tools/cli/schemas/autoscaling_schema.json +91 -0
  91. paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +37 -0
  92. paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +89 -0
  93. paasta_tools/cli/schemas/deploy_schema.json +173 -0
  94. paasta_tools/cli/schemas/eks_schema.json +970 -0
  95. paasta_tools/cli/schemas/kubernetes_schema.json +970 -0
  96. paasta_tools/cli/schemas/rollback_schema.json +160 -0
  97. paasta_tools/cli/schemas/service_schema.json +25 -0
  98. paasta_tools/cli/schemas/smartstack_schema.json +322 -0
  99. paasta_tools/cli/schemas/tron_schema.json +699 -0
  100. paasta_tools/cli/utils.py +1118 -0
  101. paasta_tools/clusterman.py +21 -0
  102. paasta_tools/config_utils.py +385 -0
  103. paasta_tools/contrib/__init__.py +0 -0
  104. paasta_tools/contrib/bounce_log_latency_parser.py +68 -0
  105. paasta_tools/contrib/check_manual_oapi_changes.sh +24 -0
  106. paasta_tools/contrib/check_orphans.py +306 -0
  107. paasta_tools/contrib/create_dynamodb_table.py +35 -0
  108. paasta_tools/contrib/create_paasta_playground.py +105 -0
  109. paasta_tools/contrib/emit_allocated_cpu_metrics.py +50 -0
  110. paasta_tools/contrib/get_running_task_allocation.py +346 -0
  111. paasta_tools/contrib/habitat_fixer.py +86 -0
  112. paasta_tools/contrib/ide_helper.py +316 -0
  113. paasta_tools/contrib/is_pod_healthy_in_proxy.py +139 -0
  114. paasta_tools/contrib/is_pod_healthy_in_smartstack.py +50 -0
  115. paasta_tools/contrib/kill_bad_containers.py +109 -0
  116. paasta_tools/contrib/mass-deploy-tag.sh +44 -0
  117. paasta_tools/contrib/mock_patch_checker.py +86 -0
  118. paasta_tools/contrib/paasta_update_soa_memcpu.py +520 -0
  119. paasta_tools/contrib/render_template.py +129 -0
  120. paasta_tools/contrib/rightsizer_soaconfigs_update.py +348 -0
  121. paasta_tools/contrib/service_shard_remove.py +157 -0
  122. paasta_tools/contrib/service_shard_update.py +373 -0
  123. paasta_tools/contrib/shared_ip_check.py +77 -0
  124. paasta_tools/contrib/timeouts_metrics_prom.py +64 -0
  125. paasta_tools/delete_kubernetes_deployments.py +89 -0
  126. paasta_tools/deployment_utils.py +44 -0
  127. paasta_tools/docker_wrapper.py +234 -0
  128. paasta_tools/docker_wrapper_imports.py +13 -0
  129. paasta_tools/drain_lib.py +351 -0
  130. paasta_tools/dump_locally_running_services.py +71 -0
  131. paasta_tools/eks_tools.py +119 -0
  132. paasta_tools/envoy_tools.py +373 -0
  133. paasta_tools/firewall.py +504 -0
  134. paasta_tools/firewall_logging.py +154 -0
  135. paasta_tools/firewall_update.py +172 -0
  136. paasta_tools/flink_tools.py +345 -0
  137. paasta_tools/flinkeks_tools.py +90 -0
  138. paasta_tools/frameworks/__init__.py +0 -0
  139. paasta_tools/frameworks/adhoc_scheduler.py +71 -0
  140. paasta_tools/frameworks/constraints.py +87 -0
  141. paasta_tools/frameworks/native_scheduler.py +652 -0
  142. paasta_tools/frameworks/native_service_config.py +301 -0
  143. paasta_tools/frameworks/task_store.py +245 -0
  144. paasta_tools/generate_all_deployments +9 -0
  145. paasta_tools/generate_authenticating_services.py +94 -0
  146. paasta_tools/generate_deployments_for_service.py +255 -0
  147. paasta_tools/generate_services_file.py +114 -0
  148. paasta_tools/generate_services_yaml.py +30 -0
  149. paasta_tools/hacheck.py +76 -0
  150. paasta_tools/instance/__init__.py +0 -0
  151. paasta_tools/instance/hpa_metrics_parser.py +122 -0
  152. paasta_tools/instance/kubernetes.py +1362 -0
  153. paasta_tools/iptables.py +240 -0
  154. paasta_tools/kafkacluster_tools.py +143 -0
  155. paasta_tools/kubernetes/__init__.py +0 -0
  156. paasta_tools/kubernetes/application/__init__.py +0 -0
  157. paasta_tools/kubernetes/application/controller_wrappers.py +476 -0
  158. paasta_tools/kubernetes/application/tools.py +90 -0
  159. paasta_tools/kubernetes/bin/__init__.py +0 -0
  160. paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +164 -0
  161. paasta_tools/kubernetes/bin/paasta_cleanup_remote_run_resources.py +135 -0
  162. paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +181 -0
  163. paasta_tools/kubernetes/bin/paasta_secrets_sync.py +758 -0
  164. paasta_tools/kubernetes/remote_run.py +558 -0
  165. paasta_tools/kubernetes_tools.py +4679 -0
  166. paasta_tools/list_kubernetes_service_instances.py +128 -0
  167. paasta_tools/list_tron_namespaces.py +60 -0
  168. paasta_tools/long_running_service_tools.py +678 -0
  169. paasta_tools/mac_address.py +44 -0
  170. paasta_tools/marathon_dashboard.py +0 -0
  171. paasta_tools/mesos/__init__.py +0 -0
  172. paasta_tools/mesos/cfg.py +46 -0
  173. paasta_tools/mesos/cluster.py +60 -0
  174. paasta_tools/mesos/exceptions.py +59 -0
  175. paasta_tools/mesos/framework.py +77 -0
  176. paasta_tools/mesos/log.py +48 -0
  177. paasta_tools/mesos/master.py +306 -0
  178. paasta_tools/mesos/mesos_file.py +169 -0
  179. paasta_tools/mesos/parallel.py +52 -0
  180. paasta_tools/mesos/slave.py +115 -0
  181. paasta_tools/mesos/task.py +94 -0
  182. paasta_tools/mesos/util.py +69 -0
  183. paasta_tools/mesos/zookeeper.py +37 -0
  184. paasta_tools/mesos_maintenance.py +848 -0
  185. paasta_tools/mesos_tools.py +1051 -0
  186. paasta_tools/metrics/__init__.py +0 -0
  187. paasta_tools/metrics/metastatus_lib.py +1110 -0
  188. paasta_tools/metrics/metrics_lib.py +217 -0
  189. paasta_tools/monitoring/__init__.py +13 -0
  190. paasta_tools/monitoring/check_k8s_api_performance.py +110 -0
  191. paasta_tools/monitoring_tools.py +652 -0
  192. paasta_tools/monkrelaycluster_tools.py +146 -0
  193. paasta_tools/nrtsearchservice_tools.py +143 -0
  194. paasta_tools/nrtsearchserviceeks_tools.py +68 -0
  195. paasta_tools/oom_logger.py +321 -0
  196. paasta_tools/paasta_deploy_tron_jobs +3 -0
  197. paasta_tools/paasta_execute_docker_command.py +123 -0
  198. paasta_tools/paasta_native_serviceinit.py +21 -0
  199. paasta_tools/paasta_service_config_loader.py +201 -0
  200. paasta_tools/paastaapi/__init__.py +29 -0
  201. paasta_tools/paastaapi/api/__init__.py +3 -0
  202. paasta_tools/paastaapi/api/autoscaler_api.py +302 -0
  203. paasta_tools/paastaapi/api/default_api.py +569 -0
  204. paasta_tools/paastaapi/api/remote_run_api.py +604 -0
  205. paasta_tools/paastaapi/api/resources_api.py +157 -0
  206. paasta_tools/paastaapi/api/service_api.py +1736 -0
  207. paasta_tools/paastaapi/api_client.py +818 -0
  208. paasta_tools/paastaapi/apis/__init__.py +22 -0
  209. paasta_tools/paastaapi/configuration.py +455 -0
  210. paasta_tools/paastaapi/exceptions.py +137 -0
  211. paasta_tools/paastaapi/model/__init__.py +5 -0
  212. paasta_tools/paastaapi/model/adhoc_launch_history.py +176 -0
  213. paasta_tools/paastaapi/model/autoscaler_count_msg.py +176 -0
  214. paasta_tools/paastaapi/model/deploy_queue.py +178 -0
  215. paasta_tools/paastaapi/model/deploy_queue_service_instance.py +194 -0
  216. paasta_tools/paastaapi/model/envoy_backend.py +185 -0
  217. paasta_tools/paastaapi/model/envoy_location.py +184 -0
  218. paasta_tools/paastaapi/model/envoy_status.py +181 -0
  219. paasta_tools/paastaapi/model/flink_cluster_overview.py +188 -0
  220. paasta_tools/paastaapi/model/flink_config.py +173 -0
  221. paasta_tools/paastaapi/model/flink_job.py +186 -0
  222. paasta_tools/paastaapi/model/flink_job_details.py +192 -0
  223. paasta_tools/paastaapi/model/flink_jobs.py +175 -0
  224. paasta_tools/paastaapi/model/float_and_error.py +173 -0
  225. paasta_tools/paastaapi/model/hpa_metric.py +176 -0
  226. paasta_tools/paastaapi/model/inline_object.py +170 -0
  227. paasta_tools/paastaapi/model/inline_response200.py +170 -0
  228. paasta_tools/paastaapi/model/inline_response2001.py +170 -0
  229. paasta_tools/paastaapi/model/instance_bounce_status.py +200 -0
  230. paasta_tools/paastaapi/model/instance_mesh_status.py +186 -0
  231. paasta_tools/paastaapi/model/instance_status.py +220 -0
  232. paasta_tools/paastaapi/model/instance_status_adhoc.py +187 -0
  233. paasta_tools/paastaapi/model/instance_status_cassandracluster.py +173 -0
  234. paasta_tools/paastaapi/model/instance_status_flink.py +173 -0
  235. paasta_tools/paastaapi/model/instance_status_kafkacluster.py +173 -0
  236. paasta_tools/paastaapi/model/instance_status_kubernetes.py +263 -0
  237. paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +187 -0
  238. paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +197 -0
  239. paasta_tools/paastaapi/model/instance_status_tron.py +204 -0
  240. paasta_tools/paastaapi/model/instance_tasks.py +182 -0
  241. paasta_tools/paastaapi/model/integer_and_error.py +173 -0
  242. paasta_tools/paastaapi/model/kubernetes_container.py +178 -0
  243. paasta_tools/paastaapi/model/kubernetes_container_v2.py +219 -0
  244. paasta_tools/paastaapi/model/kubernetes_healthcheck.py +176 -0
  245. paasta_tools/paastaapi/model/kubernetes_pod.py +201 -0
  246. paasta_tools/paastaapi/model/kubernetes_pod_event.py +176 -0
  247. paasta_tools/paastaapi/model/kubernetes_pod_v2.py +213 -0
  248. paasta_tools/paastaapi/model/kubernetes_replica_set.py +185 -0
  249. paasta_tools/paastaapi/model/kubernetes_version.py +202 -0
  250. paasta_tools/paastaapi/model/remote_run_outcome.py +189 -0
  251. paasta_tools/paastaapi/model/remote_run_start.py +185 -0
  252. paasta_tools/paastaapi/model/remote_run_stop.py +176 -0
  253. paasta_tools/paastaapi/model/remote_run_token.py +173 -0
  254. paasta_tools/paastaapi/model/resource.py +187 -0
  255. paasta_tools/paastaapi/model/resource_item.py +187 -0
  256. paasta_tools/paastaapi/model/resource_value.py +176 -0
  257. paasta_tools/paastaapi/model/smartstack_backend.py +191 -0
  258. paasta_tools/paastaapi/model/smartstack_location.py +181 -0
  259. paasta_tools/paastaapi/model/smartstack_status.py +181 -0
  260. paasta_tools/paastaapi/model/task_tail_lines.py +176 -0
  261. paasta_tools/paastaapi/model_utils.py +1879 -0
  262. paasta_tools/paastaapi/models/__init__.py +62 -0
  263. paasta_tools/paastaapi/rest.py +287 -0
  264. paasta_tools/prune_completed_pods.py +220 -0
  265. paasta_tools/puppet_service_tools.py +59 -0
  266. paasta_tools/py.typed +1 -0
  267. paasta_tools/remote_git.py +127 -0
  268. paasta_tools/run-paasta-api-in-dev-mode.py +57 -0
  269. paasta_tools/run-paasta-api-playground.py +51 -0
  270. paasta_tools/secret_providers/__init__.py +66 -0
  271. paasta_tools/secret_providers/vault.py +214 -0
  272. paasta_tools/secret_tools.py +277 -0
  273. paasta_tools/setup_istio_mesh.py +353 -0
  274. paasta_tools/setup_kubernetes_cr.py +412 -0
  275. paasta_tools/setup_kubernetes_crd.py +138 -0
  276. paasta_tools/setup_kubernetes_internal_crd.py +154 -0
  277. paasta_tools/setup_kubernetes_job.py +353 -0
  278. paasta_tools/setup_prometheus_adapter_config.py +1028 -0
  279. paasta_tools/setup_tron_namespace.py +248 -0
  280. paasta_tools/slack.py +75 -0
  281. paasta_tools/smartstack_tools.py +676 -0
  282. paasta_tools/spark_tools.py +283 -0
  283. paasta_tools/synapse_srv_namespaces_fact.py +42 -0
  284. paasta_tools/tron/__init__.py +0 -0
  285. paasta_tools/tron/client.py +158 -0
  286. paasta_tools/tron/tron_command_context.py +194 -0
  287. paasta_tools/tron/tron_timeutils.py +101 -0
  288. paasta_tools/tron_tools.py +1448 -0
  289. paasta_tools/utils.py +4307 -0
  290. paasta_tools/yaml_tools.py +44 -0
  291. paasta_tools-1.21.3.data/scripts/apply_external_resources.py +79 -0
  292. paasta_tools-1.21.3.data/scripts/bounce_log_latency_parser.py +68 -0
  293. paasta_tools-1.21.3.data/scripts/check_autoscaler_max_instances.py +212 -0
  294. paasta_tools-1.21.3.data/scripts/check_cassandracluster_services_replication.py +35 -0
  295. paasta_tools-1.21.3.data/scripts/check_flink_services_health.py +203 -0
  296. paasta_tools-1.21.3.data/scripts/check_kubernetes_api.py +57 -0
  297. paasta_tools-1.21.3.data/scripts/check_kubernetes_services_replication.py +141 -0
  298. paasta_tools-1.21.3.data/scripts/check_manual_oapi_changes.sh +24 -0
  299. paasta_tools-1.21.3.data/scripts/check_oom_events.py +244 -0
  300. paasta_tools-1.21.3.data/scripts/check_orphans.py +306 -0
  301. paasta_tools-1.21.3.data/scripts/check_spark_jobs.py +234 -0
  302. paasta_tools-1.21.3.data/scripts/cleanup_kubernetes_cr.py +138 -0
  303. paasta_tools-1.21.3.data/scripts/cleanup_kubernetes_crd.py +145 -0
  304. paasta_tools-1.21.3.data/scripts/cleanup_kubernetes_jobs.py +344 -0
  305. paasta_tools-1.21.3.data/scripts/create_dynamodb_table.py +35 -0
  306. paasta_tools-1.21.3.data/scripts/create_paasta_playground.py +105 -0
  307. paasta_tools-1.21.3.data/scripts/delete_kubernetes_deployments.py +89 -0
  308. paasta_tools-1.21.3.data/scripts/emit_allocated_cpu_metrics.py +50 -0
  309. paasta_tools-1.21.3.data/scripts/generate_all_deployments +9 -0
  310. paasta_tools-1.21.3.data/scripts/generate_authenticating_services.py +94 -0
  311. paasta_tools-1.21.3.data/scripts/generate_deployments_for_service.py +255 -0
  312. paasta_tools-1.21.3.data/scripts/generate_services_file.py +114 -0
  313. paasta_tools-1.21.3.data/scripts/generate_services_yaml.py +30 -0
  314. paasta_tools-1.21.3.data/scripts/get_running_task_allocation.py +346 -0
  315. paasta_tools-1.21.3.data/scripts/habitat_fixer.py +86 -0
  316. paasta_tools-1.21.3.data/scripts/ide_helper.py +316 -0
  317. paasta_tools-1.21.3.data/scripts/is_pod_healthy_in_proxy.py +139 -0
  318. paasta_tools-1.21.3.data/scripts/is_pod_healthy_in_smartstack.py +50 -0
  319. paasta_tools-1.21.3.data/scripts/kill_bad_containers.py +109 -0
  320. paasta_tools-1.21.3.data/scripts/kubernetes_remove_evicted_pods.py +164 -0
  321. paasta_tools-1.21.3.data/scripts/mass-deploy-tag.sh +44 -0
  322. paasta_tools-1.21.3.data/scripts/mock_patch_checker.py +86 -0
  323. paasta_tools-1.21.3.data/scripts/paasta_cleanup_remote_run_resources.py +135 -0
  324. paasta_tools-1.21.3.data/scripts/paasta_cleanup_stale_nodes.py +181 -0
  325. paasta_tools-1.21.3.data/scripts/paasta_deploy_tron_jobs +3 -0
  326. paasta_tools-1.21.3.data/scripts/paasta_execute_docker_command.py +123 -0
  327. paasta_tools-1.21.3.data/scripts/paasta_secrets_sync.py +758 -0
  328. paasta_tools-1.21.3.data/scripts/paasta_tabcomplete.sh +23 -0
  329. paasta_tools-1.21.3.data/scripts/paasta_update_soa_memcpu.py +520 -0
  330. paasta_tools-1.21.3.data/scripts/render_template.py +129 -0
  331. paasta_tools-1.21.3.data/scripts/rightsizer_soaconfigs_update.py +348 -0
  332. paasta_tools-1.21.3.data/scripts/service_shard_remove.py +157 -0
  333. paasta_tools-1.21.3.data/scripts/service_shard_update.py +373 -0
  334. paasta_tools-1.21.3.data/scripts/setup_istio_mesh.py +353 -0
  335. paasta_tools-1.21.3.data/scripts/setup_kubernetes_cr.py +412 -0
  336. paasta_tools-1.21.3.data/scripts/setup_kubernetes_crd.py +138 -0
  337. paasta_tools-1.21.3.data/scripts/setup_kubernetes_internal_crd.py +154 -0
  338. paasta_tools-1.21.3.data/scripts/setup_kubernetes_job.py +353 -0
  339. paasta_tools-1.21.3.data/scripts/setup_prometheus_adapter_config.py +1028 -0
  340. paasta_tools-1.21.3.data/scripts/shared_ip_check.py +77 -0
  341. paasta_tools-1.21.3.data/scripts/synapse_srv_namespaces_fact.py +42 -0
  342. paasta_tools-1.21.3.data/scripts/timeouts_metrics_prom.py +64 -0
  343. paasta_tools-1.21.3.dist-info/LICENSE +201 -0
  344. paasta_tools-1.21.3.dist-info/METADATA +74 -0
  345. paasta_tools-1.21.3.dist-info/RECORD +348 -0
  346. paasta_tools-1.21.3.dist-info/WHEEL +5 -0
  347. paasta_tools-1.21.3.dist-info/entry_points.txt +20 -0
  348. paasta_tools-1.21.3.dist-info/top_level.txt +2 -0
@@ -0,0 +1,373 @@
1
+ import argparse
2
+ import logging
3
+ import sys
4
+
5
+ from paasta_tools.cli.utils import trigger_deploys
6
+ from paasta_tools.config_utils import AutoConfigUpdater
7
+ from paasta_tools.utils import DEFAULT_SOA_CONFIGS_GIT_URL
8
+ from paasta_tools.utils import format_git_url
9
+ from paasta_tools.utils import load_system_paasta_config
10
+
11
+ log = logging.getLogger(__name__)
12
+
13
+
14
+ def parse_args():
15
+ parser = argparse.ArgumentParser(description="")
16
+ parser.add_argument(
17
+ "--git-remote",
18
+ help="Master git repo for soaconfigs",
19
+ default=None,
20
+ dest="git_remote",
21
+ )
22
+ parser.add_argument(
23
+ "--branch",
24
+ help="Branch name to push to",
25
+ required=True,
26
+ dest="branch",
27
+ )
28
+ parser.add_argument(
29
+ "--local-dir",
30
+ help="Act on configs in the local directory rather than cloning the git_remote",
31
+ required=False,
32
+ default=None,
33
+ dest="local_dir",
34
+ )
35
+ parser.add_argument(
36
+ "-v",
37
+ "--verbose",
38
+ help="Logging verbosity",
39
+ action="store_true",
40
+ dest="verbose",
41
+ )
42
+ parser.add_argument(
43
+ "-d",
44
+ "--dry-run",
45
+ help="Do not commit changes to git",
46
+ action="store_true",
47
+ dest="dry_run",
48
+ )
49
+ parser.add_argument(
50
+ "--source-id",
51
+ help="String to attribute the changes in the commit message.",
52
+ required=False,
53
+ default=None,
54
+ dest="source_id",
55
+ )
56
+ parser.add_argument(
57
+ "--service",
58
+ help="Service to modify",
59
+ required=True,
60
+ dest="service",
61
+ )
62
+ parser.add_argument(
63
+ "--min-instance-count",
64
+ help="If a deploy group is added, the min_instance count to create it with",
65
+ required=False,
66
+ default=1,
67
+ dest="min_instance_count",
68
+ )
69
+ parser.add_argument(
70
+ "--prod-max-instance-count",
71
+ help="If a deploy group is added, the prod max_instance count to create it with",
72
+ required=False,
73
+ default=100,
74
+ type=int,
75
+ dest="prod_max_instance_count",
76
+ )
77
+ parser.add_argument(
78
+ "--non-prod-max-instance-count",
79
+ help="If a deploy group is added, the non-prod max_instance count to create it with",
80
+ required=False,
81
+ default=5,
82
+ type=int,
83
+ dest="non_prod_max_instance_count",
84
+ )
85
+ parser.add_argument(
86
+ "--cpus",
87
+ help="If a deploy group is added, the cpu value to create it with",
88
+ required=False,
89
+ type=float,
90
+ dest="cpus",
91
+ )
92
+ parser.add_argument(
93
+ "--mem",
94
+ help="If a deploy group is added, the mem value to create it with",
95
+ required=False,
96
+ type=int,
97
+ dest="mem",
98
+ )
99
+ parser.add_argument(
100
+ "--setpoint",
101
+ help="If a deploy group is added, the autoscaling.setpoint value to create it with",
102
+ required=False,
103
+ type=float,
104
+ dest="setpoint",
105
+ )
106
+ parser.add_argument(
107
+ "--shard-name",
108
+ help="Shard name to add if it does not exist",
109
+ required=True,
110
+ dest="shard_name",
111
+ )
112
+ parser.add_argument(
113
+ "--metrics-provider",
114
+ help="Autoscaling metrics provider",
115
+ required=False,
116
+ dest="metrics_provider",
117
+ )
118
+ parser.add_argument(
119
+ "--timeout-server-ms",
120
+ help="smartstack server timeout",
121
+ required=False,
122
+ type=int,
123
+ dest="timeout_server_ms",
124
+ )
125
+ parser.add_argument(
126
+ "--autotune-min-cpus",
127
+ help="Minimum number of CPUs Autotune should give the shard",
128
+ required=False,
129
+ type=float,
130
+ dest="autotune_min_cpus",
131
+ )
132
+ parser.add_argument(
133
+ "--autotune-max-cpus",
134
+ help="Maximum number of CPUs Autotune should give the shard",
135
+ required=False,
136
+ type=float,
137
+ dest="autotune_max_cpus",
138
+ )
139
+ parser.add_argument(
140
+ "--autotune-min-mem",
141
+ help="Minimum amount of memory Autotune should give the shard",
142
+ required=False,
143
+ type=int,
144
+ dest="autotune_min_mem",
145
+ )
146
+ parser.add_argument(
147
+ "--autotune-max-mem",
148
+ help="Maximum amount of memory Autotune should give the shard",
149
+ required=False,
150
+ type=int,
151
+ dest="autotune_max_mem",
152
+ )
153
+ parser.add_argument(
154
+ "--autotune-min-disk",
155
+ help="Minimum amount of disk Autotune should give the shard",
156
+ required=False,
157
+ type=int,
158
+ dest="autotune_min_disk",
159
+ )
160
+ parser.add_argument(
161
+ "--autotune-max-disk",
162
+ help="Maximum amount of disk Autotune should give the shard",
163
+ required=False,
164
+ type=int,
165
+ dest="autotune_max_disk",
166
+ )
167
+ parser.add_argument(
168
+ "--iam-role",
169
+ help="IAM role to use for the shard",
170
+ required=False,
171
+ type=str,
172
+ dest="iam_role",
173
+ )
174
+ parser.add_argument(
175
+ "--environment",
176
+ help="Environment to deploy in, defaults to all environments if not specified",
177
+ required=False,
178
+ choices=DEPLOY_MAPPINGS.keys(),
179
+ dest="environment",
180
+ )
181
+ return parser.parse_args()
182
+
183
+
184
+ def get_default_git_remote():
185
+ system_paasta_config = load_system_paasta_config()
186
+ repo_config = system_paasta_config.get_git_repo_config("yelpsoa-configs")
187
+ default_git_remote = format_git_url(
188
+ system_paasta_config.get_git_config()["git_user"],
189
+ repo_config.get("git_server", DEFAULT_SOA_CONFIGS_GIT_URL),
190
+ repo_config["repo_name"],
191
+ )
192
+ return default_git_remote
193
+
194
+
195
+ DEPLOY_MAPPINGS = {
196
+ "dev": ["norcal-devc"],
197
+ "stage": ["norcal-stagef", "norcal-stageg"],
198
+ "prod": ["nova-prod", "pnw-prod"],
199
+ }
200
+
201
+
202
+ def main(args):
203
+ changes_made = False
204
+ updater = AutoConfigUpdater(
205
+ config_source=args.source_id,
206
+ git_remote=args.git_remote or get_default_git_remote(),
207
+ branch=args.branch,
208
+ working_dir=args.local_dir or "/nail/tmp",
209
+ do_clone=args.local_dir is None,
210
+ )
211
+ deploy_environments = (
212
+ {args.environment: DEPLOY_MAPPINGS[args.environment]}
213
+ if args.environment
214
+ else DEPLOY_MAPPINGS
215
+ )
216
+
217
+ with updater:
218
+ deploy_file = updater.get_existing_configs(args.service, "deploy")
219
+ smartstack_file = updater.get_existing_configs(args.service, "smartstack")
220
+ shard_deploy_groups = {
221
+ f"{prefix}.{args.shard_name}" for prefix in deploy_environments.keys()
222
+ }
223
+ pipeline_steps = {step["step"] for step in deploy_file["pipeline"]}
224
+
225
+ if not shard_deploy_groups.issubset(pipeline_steps):
226
+ changes_made = True
227
+ steps_to_add = shard_deploy_groups - pipeline_steps
228
+
229
+ # If the pipeline does not contain deploy groups for the service shard
230
+ # Add the missing steps and write to deploy config
231
+ for step in steps_to_add:
232
+ deploy_file["pipeline"].append(
233
+ {
234
+ "step": step,
235
+ "wait_for_deployment": True,
236
+ "disabled": True,
237
+ }
238
+ )
239
+ log.info(f"{step} added to deploy config")
240
+ updater.write_configs(args.service, "deploy", deploy_file)
241
+
242
+ for deploy_prefix, config_paths in deploy_environments.items():
243
+ for config_path in config_paths:
244
+ # Determine configuration suffix (PAASTA-18216)
245
+ eks_config = updater.get_existing_configs(
246
+ args.service, f"eks-{config_path}"
247
+ )
248
+ kube_config = updater.get_existing_configs(
249
+ args.service, f"kubernetes-{config_path}"
250
+ )
251
+
252
+ if eks_config:
253
+ config_file = eks_config
254
+ config_prefix = "eks-"
255
+ elif kube_config:
256
+ config_file = kube_config
257
+ config_prefix = "kubernetes-"
258
+ else:
259
+ log.error(
260
+ f"No EKS or Kubernetes config found for {args.service}"
261
+ )
262
+ continue
263
+
264
+ instance_config = {
265
+ "deploy_group": f"{deploy_prefix}.{args.shard_name}",
266
+ "min_instances": args.min_instance_count,
267
+ "max_instances": (
268
+ args.prod_max_instance_count
269
+ if deploy_prefix == "prod"
270
+ else args.non_prod_max_instance_count
271
+ ),
272
+ "env": {
273
+ "PAASTA_SECRET_BUGSNAG_API_KEY": "SECRET(bugsnag_api_key)",
274
+ },
275
+ }
276
+ if args.metrics_provider is not None or args.setpoint is not None:
277
+ instance_config["autoscaling"] = {"metrics_providers": []}
278
+ metrics_provider_config = {}
279
+ if args.metrics_provider is not None:
280
+ metrics_provider_config["type"] = args.metrics_provider
281
+ if args.setpoint is not None:
282
+ metrics_provider_config["setpoint"] = args.setpoint
283
+ instance_config["autoscaling"]["metrics_providers"].append(
284
+ metrics_provider_config
285
+ )
286
+
287
+ if args.iam_role is not None:
288
+ instance_config["iam_role"] = args.iam_role
289
+ if args.cpus is not None:
290
+ instance_config["cpus"] = args.cpus
291
+ if args.mem is not None:
292
+ instance_config["mem"] = args.mem
293
+ if any(
294
+ (
295
+ args.autotune_min_cpus,
296
+ args.autotune_max_cpus,
297
+ args.autotune_min_mem,
298
+ args.autotune_max_mem,
299
+ args.autotune_min_disk,
300
+ args.autotune_max_disk,
301
+ )
302
+ ):
303
+ limit_config = {}
304
+ limit_config["cpus"] = {
305
+ "min": args.autotune_min_cpus,
306
+ "max": args.autotune_max_cpus,
307
+ }
308
+ limit_config["mem"] = {
309
+ "min": args.autotune_min_mem,
310
+ "max": args.autotune_max_mem,
311
+ }
312
+ limit_config["disk"] = {
313
+ "min": args.autotune_min_disk,
314
+ "max": args.autotune_max_disk,
315
+ }
316
+
317
+ # remove any None values to keep the config clean
318
+ for resource in list(limit_config):
319
+ for key in list(limit_config[resource]):
320
+ if limit_config[resource][key] is None:
321
+ del limit_config[resource][key]
322
+ if len(limit_config[resource]) == 0:
323
+ del limit_config[resource]
324
+
325
+ if len(limit_config) > 0:
326
+ instance_config["autotune_limits"] = limit_config
327
+ # If the service config does not contain definitions for the shard in each ecosystem
328
+ # Add the missing definition and write to the corresponding config
329
+ if args.shard_name not in config_file.keys():
330
+ config_file[args.shard_name] = instance_config
331
+
332
+ updater.write_configs(
333
+ args.service, f"{config_prefix}{config_path}", config_file
334
+ )
335
+ log.info(
336
+ f"{deploy_prefix}.{args.shard_name} added to {config_prefix}{config_path}"
337
+ )
338
+ else:
339
+ log.info(f"{args.shard_name} is in deploy config already.")
340
+
341
+ # If the service shard is not defined in smartstack
342
+ # Add the definition with a suggested proxy port
343
+ if args.shard_name not in smartstack_file.keys():
344
+ changes_made = True
345
+ smartstack_file[args.shard_name] = {
346
+ "proxy_port": None,
347
+ "extra_advertise": {"ecosystem:devc": ["ecosystem:devc"]},
348
+ }
349
+ if args.timeout_server_ms:
350
+ smartstack_file[args.shard_name][
351
+ "timeout_server_ms"
352
+ ] = args.timeout_server_ms
353
+ updater.write_configs(args.service, "smartstack", smartstack_file)
354
+ else:
355
+ log.info(f"{args.shard_name} is in smartstack config already, skipping.")
356
+
357
+ # Only commit to remote if changes were made
358
+ if changes_made and not args.dry_run:
359
+ updater.commit_to_remote()
360
+ trigger_deploys(args.service)
361
+ else:
362
+ # exit with code to indicate nothing was changed
363
+ sys.exit(129)
364
+
365
+
366
+ if __name__ == "__main__":
367
+ args = parse_args()
368
+ if args.verbose:
369
+ logging.basicConfig(level=logging.DEBUG)
370
+ else:
371
+ logging.basicConfig(level=logging.WARNING)
372
+
373
+ main(args)
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env python3.8
2
+ import sys
3
+ from collections import defaultdict
4
+
5
+ import iptc
6
+
7
+ from paasta_tools import iptables
8
+ from paasta_tools.utils import get_docker_client
9
+
10
+
11
+ def list_docker_nat_rules():
12
+ chain_name = "DOCKER"
13
+ table = iptc.Table(iptc.Table.NAT)
14
+ chain = iptc.Chain(table, chain_name)
15
+ for rule in chain.rules:
16
+ yield iptables.Rule.from_iptc(rule)
17
+
18
+
19
+ def main():
20
+ docker_client = get_docker_client()
21
+ ip_to_containers = defaultdict(list)
22
+
23
+ for container in docker_client.containers():
24
+ networks = container["NetworkSettings"]["Networks"]
25
+ if "bridge" in networks:
26
+ ip = networks["bridge"]["IPAddress"]
27
+ if ip:
28
+ ip_to_containers[ip].append(container)
29
+
30
+ output = []
31
+ for ip, containers in ip_to_containers.items():
32
+ if len(containers) > 1:
33
+ output.append(f"{ip} shared by the following containers:")
34
+ for container in containers:
35
+ output.append(" Image: {}".format(container["Image"]))
36
+ output.append(" ID: {}".format(container["Id"]))
37
+ output.append(" State: {}".format(container["State"]))
38
+ output.append(" Status: {}".format(container["Status"]))
39
+ output.append("")
40
+
41
+ if output:
42
+ print(
43
+ "CRITICAL - There are multiple Docker containers assigned to the same IP."
44
+ )
45
+ print(
46
+ "There should only be one per IP. Choose one to keep and try stopping the others."
47
+ )
48
+ print("\n".join(output))
49
+ return 2
50
+ else:
51
+ print("OK - No Docker containers sharing an IP on this host.")
52
+
53
+ targets_seen = {}
54
+ duplicates_found = False
55
+ for rule in list_docker_nat_rules():
56
+ target = rule.target_parameters
57
+ if target not in targets_seen:
58
+ targets_seen[target] = rule
59
+ else:
60
+ print(
61
+ "This is the second time we've seen a rule with the same target_parameters!"
62
+ )
63
+ print(rule)
64
+ print("The other rule with that target is:")
65
+ print(targets_seen[target])
66
+ duplicates_found = True
67
+ if duplicates_found is True:
68
+ print(
69
+ "CRITICAL - Duplicate iptables rules found! This will route traffic to the wrong service!"
70
+ )
71
+ return 2
72
+ else:
73
+ print("OK - No duplicate Docker iptables rules detected")
74
+
75
+
76
+ if __name__ == "__main__":
77
+ sys.exit(main())
@@ -0,0 +1,64 @@
1
+ #!/opt/venvs/paasta-tools/bin/python
2
+ """
3
+ The goal is to walk through all smartstack.yaml in yelpsoa directories
4
+ and convert timeout values to the prometheus format.
5
+
6
+ For every upstream and path, if endpoint timeout is specified, we record
7
+ per endpoint timeout value. If timeout_server_ms is specified,
8
+ we record timeout_server_ms value in path `/`. Otherwise, we record the default
9
+ timeout_server_ms 1000.
10
+
11
+ Example output:
12
+ # HELP endpoint timeout value defined in yelpsoa-config.
13
+ # TYPE TYPE yelpsoaconfig_endpoint_timeouts_ms gauge
14
+ yelpsoaconfig_endpoint_timeouts_ms{path="/consumer_app/devices/braze/info",upstream="push_notifications.main.egress_cluster"} 10000.0
15
+ yelpsoaconfig_endpoint_timeouts_ms{path="/",upstream="mysql_read_security.main.egress_cluster"} 100.0
16
+ """
17
+ import os
18
+
19
+ from prometheus_client import CollectorRegistry
20
+ from prometheus_client import Gauge
21
+ from prometheus_client import write_to_textfile
22
+ from prometheus_client.metrics import MetricWrapperBase
23
+
24
+ from paasta_tools import yaml_tools as yaml
25
+ from paasta_tools.utils import DEFAULT_SOA_DIR
26
+
27
+ PROM_OUTPUT_FILE = f"{DEFAULT_SOA_DIR}/.autotune_timeouts.prom"
28
+ DEFAULT_TIMEOUT = 1000
29
+
30
+
31
+ def read_and_write_timeouts_metrics(
32
+ root: str, service: str, prom_metric: MetricWrapperBase
33
+ ) -> None:
34
+ with open(os.path.join(root, "smartstack.yaml")) as smartstack_file:
35
+ smartstack_yaml = yaml.safe_load(smartstack_file)
36
+ for instance_name, info in smartstack_yaml.items():
37
+ upstream = f"{service}.{instance_name}.egress_cluster"
38
+ if "endpoint_timeouts" in info:
39
+ for path, endpoint_timeout in info["endpoint_timeouts"].items():
40
+ prom_metric.labels(path, upstream).set(endpoint_timeout)
41
+ # always record default timeout
42
+ default_timeout = info.get("timeout_server_ms", DEFAULT_TIMEOUT)
43
+ prom_metric.labels("/", upstream).set(default_timeout)
44
+
45
+
46
+ if __name__ == "__main__":
47
+ registry = CollectorRegistry()
48
+ prom_metric = Gauge(
49
+ "yelpsoaconfig_endpoint_timeouts_ms",
50
+ "endpoint timeout value defined in yelpsoa-config",
51
+ ["path", "upstream"],
52
+ registry=registry,
53
+ )
54
+ # Walk through soa config dir and filter smartstack yaml
55
+ for root, dirs, files in os.walk(DEFAULT_SOA_DIR):
56
+ service = root.split("/")[-1]
57
+ # Avoid confusion of the smartstacks.yaml under autotuned_defaults/ in the future
58
+ if "autotuned_defaults" == service:
59
+ continue
60
+ for f in files:
61
+ if f == "smartstack.yaml":
62
+ read_and_write_timeouts_metrics(root, service, prom_metric)
63
+
64
+ write_to_textfile(PROM_OUTPUT_FILE, registry)
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env python
2
+ # Copyright 2015-2016 Yelp Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ """
16
+ Usage: ./delete_paasta_contract_monitor.py <service.instance> [options]
17
+
18
+ The following script is a setup on a cron job in k8s masters. This is responsible for deleting
19
+ paasta-contract-monitor deployments and its services. By deleting the deployment itself,
20
+ setup_kubernetes_job.py will be able to reschedule the deployment and its pods on different nodes.
21
+ """
22
+ import argparse
23
+ import logging
24
+ import sys
25
+
26
+ from paasta_tools.kubernetes_tools import delete_deployment
27
+ from paasta_tools.kubernetes_tools import ensure_namespace
28
+ from paasta_tools.kubernetes_tools import get_kubernetes_app_name
29
+ from paasta_tools.kubernetes_tools import KubeClient
30
+ from paasta_tools.utils import decompose_job_id
31
+ from paasta_tools.utils import InvalidJobNameError
32
+ from paasta_tools.utils import SPACER
33
+
34
+ log = logging.getLogger(__name__)
35
+
36
+
37
+ def parse_args(args=None) -> argparse.Namespace:
38
+ parser = argparse.ArgumentParser(description="Deletes list of deployments.")
39
+ parser.add_argument(
40
+ "service_instance_list",
41
+ nargs="+",
42
+ help="The list of service instances to delete",
43
+ metavar=f"SERVICE{SPACER}INSTANCE",
44
+ )
45
+ args = parser.parse_args(args=args)
46
+ return args
47
+
48
+
49
+ def get_deployment_names_from_list(service_instance_list):
50
+ app_names = []
51
+ for service_instance in service_instance_list:
52
+ try:
53
+ service, instance, _, __ = decompose_job_id(service_instance)
54
+ app_name = get_kubernetes_app_name(service, instance)
55
+ app_names.append(app_name)
56
+ except InvalidJobNameError:
57
+ log.error(
58
+ f"Invalid service instance specified. Format is service{SPACER}instance."
59
+ )
60
+ sys.exit(1)
61
+ return app_names
62
+
63
+
64
+ def main(args=None) -> None:
65
+ args = parse_args(args=args)
66
+ service_instance_list = args.service_instance_list
67
+ deployment_names = get_deployment_names_from_list(service_instance_list)
68
+
69
+ log.debug(f"Deleting deployments: {deployment_names}")
70
+ kube_client = KubeClient()
71
+ ensure_namespace(kube_client=kube_client, namespace="paasta")
72
+
73
+ for deployment_name in deployment_names:
74
+ try:
75
+ log.debug(f"Deleting {deployment_name}")
76
+ delete_deployment(
77
+ kube_client=kube_client,
78
+ deployment_name=deployment_name,
79
+ namespace="paasta",
80
+ )
81
+ except Exception as err:
82
+ log.error(f"Unable to delete {deployment_name}: {err}")
83
+ sys.exit(1)
84
+
85
+ sys.exit(0)
86
+
87
+
88
+ if __name__ == "__main__":
89
+ main()
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env python
2
+ # Copyright 2015-2016 Yelp Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ from typing import Optional
16
+
17
+ from paasta_tools.utils import DEFAULT_SOA_DIR
18
+ from paasta_tools.utils import DeploymentVersion
19
+ from paasta_tools.utils import load_v2_deployments_json
20
+ from paasta_tools.utils import NoDeploymentsAvailable
21
+
22
+
23
+ def get_currently_deployed_sha(service, deploy_group, soa_dir=DEFAULT_SOA_DIR):
24
+ """Tries to determine the currently deployed sha for a service and deploy_group,
25
+ returns None if there isn't one ready yet"""
26
+ try:
27
+ deployments = load_v2_deployments_json(service=service, soa_dir=soa_dir)
28
+ return deployments.get_git_sha_for_deploy_group(deploy_group=deploy_group)
29
+ except NoDeploymentsAvailable:
30
+ return None
31
+
32
+
33
+ def get_currently_deployed_version(
34
+ service, deploy_group, soa_dir=DEFAULT_SOA_DIR
35
+ ) -> Optional[DeploymentVersion]:
36
+ """Tries to determine the currently deployed version for a service and deploy_group,
37
+ returns None if there isn't one ready yet"""
38
+ try:
39
+ deployments = load_v2_deployments_json(service=service, soa_dir=soa_dir)
40
+ return deployments.get_deployment_version_for_deploy_group(
41
+ deploy_group=deploy_group
42
+ )
43
+ except NoDeploymentsAvailable:
44
+ return None