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,558 @@
1
+ # Copyright 2015-2016 Yelp Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ import hashlib
15
+ import logging
16
+ from time import sleep
17
+ from typing import List
18
+ from typing import Optional
19
+ from typing import Sequence
20
+ from typing import TypedDict
21
+
22
+ from kubernetes.client import AuthenticationV1TokenRequest
23
+ from kubernetes.client import V1Job
24
+ from kubernetes.client import V1ObjectMeta
25
+ from kubernetes.client import V1Pod
26
+ from kubernetes.client import V1PolicyRule
27
+ from kubernetes.client import V1Role
28
+ from kubernetes.client import V1RoleBinding
29
+ from kubernetes.client import V1RoleRef
30
+ from kubernetes.client import V1ServiceAccount
31
+ from kubernetes.client import V1Subject
32
+ from kubernetes.client import V1TokenRequestSpec
33
+ from kubernetes.client.exceptions import ApiException
34
+
35
+ from paasta_tools.adhoc_tools import load_adhoc_job_config
36
+ from paasta_tools.eks_tools import EksDeploymentConfig
37
+ from paasta_tools.eks_tools import load_eks_service_config
38
+ from paasta_tools.kubernetes.application.controller_wrappers import (
39
+ get_application_wrapper,
40
+ )
41
+ from paasta_tools.kubernetes_tools import get_all_service_accounts
42
+ from paasta_tools.kubernetes_tools import JOB_TYPE_LABEL_NAME
43
+ from paasta_tools.kubernetes_tools import KubeClient
44
+ from paasta_tools.kubernetes_tools import limit_size_with_hash
45
+ from paasta_tools.kubernetes_tools import paasta_prefixed
46
+ from paasta_tools.utils import load_system_paasta_config
47
+
48
+
49
+ logger = logging.getLogger(__name__)
50
+ REMOTE_RUN_JOB_LABEL = "remote-run"
51
+ POD_OWNER_LABEL = paasta_prefixed("pod_owner")
52
+ TOOLBOX_MOCK_SERVICE = "prod-toolbox"
53
+ DEFAULT_MAX_DURATION_LIMIT = 8 * 60 * 60 # 8 hours
54
+
55
+
56
+ class RemoteRunError(Exception):
57
+ pass
58
+
59
+
60
+ class RemoteRunOutcome(TypedDict, total=False):
61
+ status: int
62
+ message: str
63
+ job_name: str
64
+ pod_name: str
65
+ pod_address: str
66
+ namespace: str
67
+
68
+
69
+ def _format_remote_run_job_name(
70
+ job: V1Job,
71
+ user: str,
72
+ ) -> str:
73
+ """Format name for remote run job
74
+
75
+ :param V1Job job: job definition
76
+ :param str user: the user requesting the remote-run
77
+ :return: job name
78
+ """
79
+ return limit_size_with_hash(f"remote-run-{user}-{job.metadata.name}")
80
+
81
+
82
+ def remote_run_start(
83
+ service: str,
84
+ instance: str,
85
+ cluster: str,
86
+ user: str,
87
+ interactive: bool,
88
+ recreate: bool,
89
+ max_duration: int,
90
+ is_toolbox: bool,
91
+ ) -> RemoteRunOutcome:
92
+ """Trigger remote-run job
93
+
94
+ :param str service: service name
95
+ :param str instance: service instance
96
+ :param str cluster: paasta cluster
97
+ :param str user: the user requesting the remote-run sandbox
98
+ :param bool interactive: whether it is expected to access the remote-run job interactively
99
+ :param bool recreate: whether to recreate remote-run job if existing
100
+ :param int max_duration: maximum allowed duration for the remote-ruh job
101
+ :param bool is_toolbox: requested job is for a toolbox container
102
+ :return: outcome of the operation, and resulting Kubernetes pod information
103
+ """
104
+ kube_client = KubeClient()
105
+
106
+ # Load the service deployment settings
107
+ deployment_config = (
108
+ generate_toolbox_deployment(service, cluster, user)
109
+ if is_toolbox
110
+ else load_eks_service_config(service, instance, cluster)
111
+ )
112
+
113
+ # Set to interactive mode
114
+ if interactive and not is_toolbox:
115
+ deployment_config.config_dict["cmd"] = f"sleep {max_duration}"
116
+
117
+ # Create the app with a new name
118
+ formatted_job = deployment_config.format_kubernetes_job(
119
+ job_label=REMOTE_RUN_JOB_LABEL,
120
+ deadline_seconds=max_duration,
121
+ keep_routable_ip=is_toolbox,
122
+ )
123
+ job_name = _format_remote_run_job_name(formatted_job, user)
124
+ formatted_job.metadata.name = job_name
125
+ app_wrapper = get_application_wrapper(formatted_job)
126
+ app_wrapper.soa_config = deployment_config
127
+
128
+ # Launch pod
129
+ logger.info(f"Starting {job_name}")
130
+ try:
131
+ app_wrapper.create(kube_client)
132
+ except ApiException as e:
133
+ if e.status != 409:
134
+ raise
135
+ if recreate:
136
+ remote_run_stop(
137
+ service=service,
138
+ instance=instance,
139
+ cluster=cluster,
140
+ user=user,
141
+ is_toolbox=is_toolbox,
142
+ )
143
+ return remote_run_start(
144
+ service=service,
145
+ instance=instance,
146
+ cluster=cluster,
147
+ user=user,
148
+ interactive=interactive,
149
+ recreate=False,
150
+ max_duration=max_duration,
151
+ is_toolbox=is_toolbox,
152
+ )
153
+
154
+ return {
155
+ "status": 200,
156
+ "message": "Remote run sandbox started",
157
+ "job_name": job_name,
158
+ }
159
+
160
+
161
+ def remote_run_ready(
162
+ service: str,
163
+ instance: str,
164
+ cluster: str,
165
+ job_name: str,
166
+ user: str,
167
+ is_toolbox: bool,
168
+ ) -> RemoteRunOutcome:
169
+ """Check if remote-run pod is ready
170
+
171
+ :param str service: service name
172
+ :param str instance: service instance
173
+ :param str cluster: paasta cluster
174
+ :param str job_name: name of the remote-run job to check
175
+ :param bool is_toolbox: requested job is for a toolbox container
176
+ :return: job status, with pod info
177
+ """
178
+ kube_client = KubeClient()
179
+
180
+ # Load the service deployment settings
181
+ deployment_config = (
182
+ generate_toolbox_deployment(service, cluster, user)
183
+ if is_toolbox
184
+ else load_eks_service_config(service, instance, cluster)
185
+ )
186
+ namespace = deployment_config.get_namespace()
187
+
188
+ pod = find_job_pod(kube_client, namespace, job_name)
189
+ if not pod:
190
+ return {"status": 404, "message": "No pod found"}
191
+ if pod.status.phase == "Running":
192
+ result: RemoteRunOutcome = {
193
+ "status": 200,
194
+ "message": "Pod ready",
195
+ "pod_name": pod.metadata.name,
196
+ "namespace": namespace,
197
+ }
198
+ if is_toolbox:
199
+ result["pod_address"] = pod.status.pod_ip
200
+ return result
201
+ return {
202
+ "status": 204,
203
+ "message": "Pod not ready",
204
+ }
205
+
206
+
207
+ def remote_run_stop(
208
+ service: str,
209
+ instance: str,
210
+ cluster: str,
211
+ user: str,
212
+ is_toolbox: bool,
213
+ ) -> RemoteRunOutcome:
214
+ """Stop remote-run job
215
+
216
+ :param str service: service name
217
+ :param str instance: service instance
218
+ :param str cluster: paasta cluster
219
+ :param str user: the user requesting the remote-run sandbox
220
+ :param bool is_toolbox: requested job is for a toolbox container
221
+ :return: outcome of the operation
222
+ """
223
+ kube_client = KubeClient()
224
+
225
+ # Load the service deployment settings
226
+ deployment_config = (
227
+ generate_toolbox_deployment(service, cluster, user)
228
+ if is_toolbox
229
+ else load_eks_service_config(service, instance, cluster)
230
+ )
231
+
232
+ # Rebuild the job metadata
233
+ formatted_job = deployment_config.format_kubernetes_job(
234
+ job_label=REMOTE_RUN_JOB_LABEL
235
+ )
236
+ job_name = _format_remote_run_job_name(formatted_job, user)
237
+ formatted_job.metadata.name = job_name
238
+
239
+ # Stop the job
240
+ logger.info(f"Stopping {job_name}")
241
+ app_wrapper = get_application_wrapper(formatted_job)
242
+ app_wrapper.soa_config = deployment_config
243
+ app_wrapper.deep_delete(kube_client)
244
+
245
+ return {"status": 200, "message": "Job successfully removed"}
246
+
247
+
248
+ def remote_run_token(
249
+ service: str,
250
+ instance: str,
251
+ cluster: str,
252
+ user: str,
253
+ ) -> str:
254
+ """Creates a short lived token for execing into a pod
255
+
256
+ :param str service: service name
257
+ :param str instance: service instance
258
+ :param str cluster: paasta cluster
259
+ :param str user: the user requesting the remote-run sandbox
260
+ """
261
+ kube_client = KubeClient()
262
+
263
+ # Load the service deployment settings
264
+ deployment_config = load_eks_service_config(service, instance, cluster)
265
+ namespace = deployment_config.get_namespace()
266
+
267
+ # Rebuild the job metadata
268
+ formatted_job = deployment_config.format_kubernetes_job(
269
+ job_label=REMOTE_RUN_JOB_LABEL
270
+ )
271
+ job_name = _format_remote_run_job_name(formatted_job, user)
272
+
273
+ # Find pod and create exec token for it
274
+ pod = find_job_pod(kube_client, namespace, job_name)
275
+ if not pod:
276
+ raise RemoteRunError(f"Pod for {job_name} not found")
277
+ pod_name = pod.metadata.name
278
+ logger.info(f"Generating temporary service account token for {pod_name}")
279
+ service_account = create_remote_run_service_account(
280
+ kube_client, namespace, pod_name, user
281
+ )
282
+ role = create_pod_scoped_role(kube_client, namespace, pod_name, user)
283
+ bind_role_to_service_account(kube_client, namespace, service_account, role, user)
284
+ return create_temp_exec_token(kube_client, namespace, service_account)
285
+
286
+
287
+ def generate_toolbox_deployment(
288
+ service: str, cluster: str, user: str
289
+ ) -> EksDeploymentConfig:
290
+ """Creates virtual EKS deployment for toolbox containers starting from adhoc configuration
291
+
292
+ :param str service: toolbox name
293
+ :param str cluster: target deployment cluster
294
+ :param str user: user requesting the toolbox
295
+ :return: deployment configuration
296
+ """
297
+ if not user.isalnum():
298
+ raise RemoteRunError(
299
+ f"Provided username contains non-alphanumeric characters: {user}"
300
+ )
301
+ # NOTE: API authorization is enforced by service, and we want different rules
302
+ # for each toolbox, so clients send a combined service-instance string, and then
303
+ # we split it here to load the correct instance settings.
304
+ adhoc_instance = service[len(TOOLBOX_MOCK_SERVICE) + 1 :]
305
+ adhoc_deployment = load_adhoc_job_config(
306
+ TOOLBOX_MOCK_SERVICE,
307
+ adhoc_instance,
308
+ cluster,
309
+ load_deployments=False,
310
+ )
311
+ # NOTE: we're explicitly dynamically mounting a single user's public keys
312
+ # as we want these pods to only be usable by said user.
313
+ adhoc_deployment.config_dict.setdefault("extra_volumes", []).append(
314
+ {
315
+ "containerPath": f"/etc/authorized_keys.d/{user}.pub",
316
+ "hostPath": f"/etc/authorized_keys.d/{user}.pub",
317
+ "mode": "RO",
318
+ },
319
+ )
320
+ adhoc_deployment.config_dict.setdefault("env", {})["SANDBOX_USER"] = user
321
+ adhoc_deployment.config_dict["routable_ip"] = True
322
+ return EksDeploymentConfig(
323
+ service=service,
324
+ cluster=cluster,
325
+ instance="main",
326
+ config_dict=adhoc_deployment.config_dict,
327
+ branch_dict=adhoc_deployment.branch_dict,
328
+ )
329
+
330
+
331
+ def find_job_pod(
332
+ kube_client: KubeClient,
333
+ namespace: str,
334
+ job_name: str,
335
+ job_label: str = REMOTE_RUN_JOB_LABEL,
336
+ retries: int = 3,
337
+ ) -> Optional[V1Pod]:
338
+ """Locate pod for remote-run job
339
+
340
+ :param KubeClient kube_client: Kubernetes client
341
+ :param str namespace: the pod namespace
342
+ :param str job_name: remote-run job name
343
+ :param int retries: maximum number of attemps
344
+ :return: pod object if found
345
+ """
346
+ selectors = (
347
+ f"{paasta_prefixed(JOB_TYPE_LABEL_NAME)}={job_label}",
348
+ f"job-name={job_name}",
349
+ )
350
+ for _ in range(retries):
351
+ pod_list = kube_client.core.list_namespaced_pod(
352
+ namespace,
353
+ label_selector=",".join(selectors),
354
+ )
355
+ if pod_list.items:
356
+ return pod_list.items[0]
357
+ sleep(0.5)
358
+ return None
359
+
360
+
361
+ def create_temp_exec_token(
362
+ kube_client: KubeClient,
363
+ namespace: str,
364
+ service_account: str,
365
+ ) -> str:
366
+ """Create a short lived token for service account
367
+
368
+ :param KubeClient kube_client: Kubernetes client
369
+ :param str namespace: service account namespace
370
+ :param str service_account: service account name
371
+ :return: token value
372
+ """
373
+ token_spec = V1TokenRequestSpec(
374
+ expiration_seconds=600, # minimum allowed by k8s
375
+ audiences=[],
376
+ )
377
+ request = AuthenticationV1TokenRequest(spec=token_spec)
378
+ response = kube_client.core.create_namespaced_service_account_token(
379
+ service_account, namespace, request
380
+ )
381
+ return response.status.token
382
+
383
+
384
+ def get_remote_run_service_accounts(
385
+ kube_client: KubeClient, namespace: str, user: str = ""
386
+ ) -> Sequence[V1ServiceAccount]:
387
+ """List all temporary service account related to remote-run
388
+
389
+ :param KubeClient kube_client: Kubernetes client
390
+ :param str namespace: pod namespace
391
+ :param str user: optionally filter by owning user
392
+ :return: list of service accounts
393
+ """
394
+ return get_all_service_accounts(
395
+ kube_client,
396
+ namespace=namespace,
397
+ label_selector=(f"{POD_OWNER_LABEL}={user}" if user else POD_OWNER_LABEL),
398
+ )
399
+
400
+
401
+ def create_remote_run_service_account(
402
+ kube_client: KubeClient,
403
+ namespace: str,
404
+ pod_name: str,
405
+ user: str,
406
+ ) -> str:
407
+ """Create service account to exec into remote-run pod
408
+
409
+ :param KubeClient kube_client: Kubernetes client
410
+ :param str namespace: pod namespace
411
+ :param str pod_name: pod name
412
+ :param str user: user requiring credentials
413
+ """
414
+ pod_name_hash = hashlib.sha1(pod_name.encode("utf-8")).hexdigest()[:12]
415
+ service_account_name = limit_size_with_hash(f"remote-run-{user}-{pod_name_hash}")
416
+ service_accounts = get_remote_run_service_accounts(kube_client, namespace, user)
417
+ if any(item.metadata.name == service_account_name for item in service_accounts):
418
+ return service_account_name
419
+ service_account = V1ServiceAccount(
420
+ metadata=V1ObjectMeta(
421
+ name=service_account_name,
422
+ namespace=namespace,
423
+ labels={POD_OWNER_LABEL: user},
424
+ )
425
+ )
426
+ kube_client.core.create_namespaced_service_account(
427
+ namespace=namespace, body=service_account
428
+ )
429
+ return service_account_name
430
+
431
+
432
+ def create_pod_scoped_role(
433
+ kube_client: KubeClient,
434
+ namespace: str,
435
+ pod_name: str,
436
+ user: str,
437
+ ) -> str:
438
+ """Create role with execution access to specific pod
439
+
440
+ :param KubeClient kube_client: Kubernetes client
441
+ :param str namespace: pod namespace
442
+ :param str pod_name: pod name
443
+ :param str user: user requiring the role
444
+ :return: name of the role
445
+ """
446
+ pod_name_hash = hashlib.sha1(pod_name.encode("utf-8")).hexdigest()[:12]
447
+ role_name = f"remote-run-role-{pod_name_hash}"
448
+ policy = V1PolicyRule(
449
+ verbs=["create", "get"],
450
+ resources=["pods", "pods/exec"],
451
+ resource_names=[pod_name],
452
+ api_groups=[""],
453
+ )
454
+ role = V1Role(
455
+ rules=[policy],
456
+ metadata=V1ObjectMeta(
457
+ name=role_name,
458
+ labels={POD_OWNER_LABEL: user},
459
+ ),
460
+ )
461
+ try:
462
+ kube_client.rbac.create_namespaced_role(namespace=namespace, body=role)
463
+ except ApiException as e:
464
+ if e.status != 409:
465
+ raise
466
+ return role_name
467
+
468
+
469
+ def bind_role_to_service_account(
470
+ kube_client: KubeClient,
471
+ namespace: str,
472
+ service_account: str,
473
+ role: str,
474
+ user: str,
475
+ ) -> None:
476
+ """Bind service account to role
477
+
478
+ :param KubeClient kube_client: Kubernetes client
479
+ :param str namespace: service account namespace
480
+ :param str service_account: service account name
481
+ :param str role: role name
482
+ :param str user: user requiring the role
483
+ """
484
+ role_binding = V1RoleBinding(
485
+ metadata=V1ObjectMeta(
486
+ name=limit_size_with_hash(f"remote-run-binding-{role}"),
487
+ namespace=namespace,
488
+ labels={POD_OWNER_LABEL: user},
489
+ ),
490
+ role_ref=V1RoleRef(
491
+ api_group="rbac.authorization.k8s.io",
492
+ kind="Role",
493
+ name=role,
494
+ ),
495
+ subjects=[
496
+ V1Subject(
497
+ kind="ServiceAccount",
498
+ name=service_account,
499
+ ),
500
+ ],
501
+ )
502
+ try:
503
+ kube_client.rbac.create_namespaced_role_binding(
504
+ namespace=namespace,
505
+ body=role_binding,
506
+ )
507
+ except ApiException as e:
508
+ if e.status != 409:
509
+ raise
510
+
511
+
512
+ def get_remote_run_roles(kube_client: KubeClient, namespace: str) -> List[V1Role]:
513
+ """List all temporary roles related to remote-run
514
+
515
+ :param KubeClient kube_client: Kubernetes client
516
+ :param str namespace: role namespace
517
+ :return: list of roles
518
+ """
519
+ return kube_client.rbac.list_namespaced_role(
520
+ namespace,
521
+ label_selector=POD_OWNER_LABEL,
522
+ ).items
523
+
524
+
525
+ def get_remote_run_role_bindings(
526
+ kube_client: KubeClient, namespace: str
527
+ ) -> List[V1RoleBinding]:
528
+ """List all temporary role bindings related to remote-run
529
+
530
+ :param KubeClient kube_client: Kubernetes client
531
+ :param str namespace: role namespace
532
+ :return: list of roles
533
+ """
534
+ return kube_client.rbac.list_namespaced_role_binding(
535
+ namespace,
536
+ label_selector=POD_OWNER_LABEL,
537
+ ).items
538
+
539
+
540
+ def get_remote_run_jobs(kube_client: KubeClient, namespace: str) -> List[V1Job]:
541
+ """List all remote-run jobs
542
+
543
+ :param KubeClient kube_client: Kubernetes client
544
+ :param str namespace: job namespace
545
+ """
546
+ return kube_client.batches.list_namespaced_job(
547
+ namespace,
548
+ label_selector=f"{paasta_prefixed(JOB_TYPE_LABEL_NAME)}={REMOTE_RUN_JOB_LABEL}",
549
+ ).items
550
+
551
+
552
+ def get_max_job_duration_limit() -> int:
553
+ """Get maximum configured duration for a remote run job
554
+
555
+ :return: max duration in seconds
556
+ """
557
+ system_config = load_system_paasta_config()
558
+ return system_config.get_remote_run_duration_limit(DEFAULT_MAX_DURATION_LIMIT)