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,146 @@
1
+ # Copyright 2015-2019 Yelp Inc.
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ from typing import List
14
+ from typing import Mapping
15
+ from typing import Optional
16
+
17
+ import service_configuration_lib
18
+
19
+ from paasta_tools.kubernetes_tools import sanitised_cr_name
20
+ from paasta_tools.long_running_service_tools import LongRunningServiceConfig
21
+ from paasta_tools.long_running_service_tools import LongRunningServiceConfigDict
22
+ from paasta_tools.utils import BranchDictV2
23
+ from paasta_tools.utils import deep_merge_dictionaries
24
+ from paasta_tools.utils import DEFAULT_SOA_DIR
25
+ from paasta_tools.utils import load_service_instance_config
26
+ from paasta_tools.utils import load_v2_deployments_json
27
+
28
+
29
+ class MonkRelayClusterDeploymentConfigDict(LongRunningServiceConfigDict, total=False):
30
+ replicas: int
31
+
32
+
33
+ class MonkRelayClusterDeploymentConfig(LongRunningServiceConfig):
34
+ config_dict: MonkRelayClusterDeploymentConfigDict
35
+
36
+ config_filename_prefix = "monkrelays"
37
+
38
+ def __init__(
39
+ self,
40
+ service: str,
41
+ cluster: str,
42
+ instance: str,
43
+ config_dict: MonkRelayClusterDeploymentConfigDict,
44
+ branch_dict: Optional[BranchDictV2],
45
+ soa_dir: str = DEFAULT_SOA_DIR,
46
+ ) -> None:
47
+
48
+ super().__init__(
49
+ cluster=cluster,
50
+ instance=instance,
51
+ service=service,
52
+ soa_dir=soa_dir,
53
+ config_dict=config_dict,
54
+ branch_dict=branch_dict,
55
+ )
56
+
57
+ def get_instances(self, with_limit: bool = True) -> int:
58
+ return self.config_dict.get("replicas", 1)
59
+
60
+ def validate(
61
+ self,
62
+ params: List[str] = None,
63
+ ) -> List[str]:
64
+ # Use InstanceConfig to validate shared config keys like cpus and mem
65
+ # TODO: add mem back to this list once we fix PAASTA-15582 and
66
+ # move to using the same units as flink/marathon etc.
67
+ if params is None:
68
+ params = [
69
+ "cpus",
70
+ "security",
71
+ "dependencies_reference",
72
+ "deploy_group",
73
+ ]
74
+
75
+ error_msgs = super().validate(params=params)
76
+
77
+ if error_msgs:
78
+ name = self.get_instance()
79
+ return [f"{name}: {msg}" for msg in error_msgs]
80
+ else:
81
+ return []
82
+
83
+
84
+ def load_monkrelaycluster_instance_config(
85
+ service: str,
86
+ instance: str,
87
+ cluster: str,
88
+ load_deployments: bool = True,
89
+ soa_dir: str = DEFAULT_SOA_DIR,
90
+ ) -> MonkRelayClusterDeploymentConfig:
91
+ """Read a service instance's configuration for MonkRelayCluster.
92
+
93
+ If a branch isn't specified for a config, the 'branch' key defaults to
94
+ paasta-${cluster}.${instance}.
95
+
96
+ :param service: The service name
97
+ :param instance: The instance of the service to retrieve
98
+ :param cluster: The cluster to read the configuration for
99
+ :param load_deployments: A boolean indicating if the corresponding deployments.json for this service
100
+ should also be loaded
101
+ :param soa_dir: The SOA configuration directory to read from
102
+ :returns: A dictionary of whatever was in the config for the service instance"""
103
+ general_config = service_configuration_lib.read_service_configuration(
104
+ service, soa_dir=soa_dir
105
+ )
106
+ instance_config = load_service_instance_config(
107
+ service, instance, "monkrelays", cluster, soa_dir=soa_dir
108
+ )
109
+ general_config = deep_merge_dictionaries(
110
+ overrides=instance_config, defaults=general_config
111
+ )
112
+
113
+ branch_dict: Optional[BranchDictV2] = None
114
+ if load_deployments:
115
+ deployments_json = load_v2_deployments_json(service, soa_dir=soa_dir)
116
+ temp_instance_config = MonkRelayClusterDeploymentConfig(
117
+ service=service,
118
+ cluster=cluster,
119
+ instance=instance,
120
+ config_dict=general_config,
121
+ branch_dict=None,
122
+ soa_dir=soa_dir,
123
+ )
124
+ branch = temp_instance_config.get_branch()
125
+ deploy_group = temp_instance_config.get_deploy_group()
126
+ branch_dict = deployments_json.get_branch_dict(service, branch, deploy_group)
127
+
128
+ return MonkRelayClusterDeploymentConfig(
129
+ service=service,
130
+ cluster=cluster,
131
+ instance=instance,
132
+ config_dict=general_config,
133
+ branch_dict=branch_dict,
134
+ soa_dir=soa_dir,
135
+ )
136
+
137
+
138
+ # TODO: read this from CRD in service configs
139
+ def cr_id(service: str, instance: str) -> Mapping[str, str]:
140
+ return dict(
141
+ group="yelp.com",
142
+ version="v1alpha1",
143
+ namespace="paasta-monkrelays",
144
+ plural="monkrelays",
145
+ name=sanitised_cr_name(service, instance),
146
+ )
@@ -0,0 +1,143 @@
1
+ # Copyright 2015-2019 Yelp Inc.
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ from typing import List
14
+ from typing import Mapping
15
+ from typing import Optional
16
+
17
+ import service_configuration_lib
18
+
19
+ from paasta_tools.kubernetes_tools import sanitised_cr_name
20
+ from paasta_tools.long_running_service_tools import LongRunningServiceConfig
21
+ from paasta_tools.long_running_service_tools import LongRunningServiceConfigDict
22
+ from paasta_tools.utils import BranchDictV2
23
+ from paasta_tools.utils import deep_merge_dictionaries
24
+ from paasta_tools.utils import DEFAULT_SOA_DIR
25
+ from paasta_tools.utils import load_service_instance_config
26
+ from paasta_tools.utils import load_v2_deployments_json
27
+
28
+
29
+ class NrtsearchServiceDeploymentConfigDict(LongRunningServiceConfigDict, total=False):
30
+ replicas: int
31
+
32
+
33
+ class NrtsearchServiceDeploymentConfig(LongRunningServiceConfig):
34
+ config_dict: NrtsearchServiceDeploymentConfigDict
35
+
36
+ config_filename_prefix = "nrtsearchservice"
37
+
38
+ def __init__(
39
+ self,
40
+ service: str,
41
+ cluster: str,
42
+ instance: str,
43
+ config_dict: NrtsearchServiceDeploymentConfigDict,
44
+ branch_dict: Optional[BranchDictV2],
45
+ soa_dir: str = DEFAULT_SOA_DIR,
46
+ ) -> None:
47
+
48
+ super().__init__(
49
+ cluster=cluster,
50
+ instance=instance,
51
+ service=service,
52
+ soa_dir=soa_dir,
53
+ config_dict=config_dict,
54
+ branch_dict=branch_dict,
55
+ )
56
+
57
+ def get_instances(self, with_limit: bool = True) -> int:
58
+ return self.config_dict.get("replicas", 1)
59
+
60
+ def validate(
61
+ self,
62
+ params: List[str] = [
63
+ "cpus",
64
+ "security",
65
+ "dependencies_reference",
66
+ "deploy_group",
67
+ ],
68
+ ) -> List[str]:
69
+ # Use InstanceConfig to validate shared config keys like cpus and mem
70
+ # TODO: add mem back to this list once we fix PAASTA-15582 and
71
+ # move to using the same units as flink/marathon etc.
72
+ error_msgs = super().validate(params=params)
73
+
74
+ if error_msgs:
75
+ name = self.get_instance()
76
+ return [f"{name}: {msg}" for msg in error_msgs]
77
+ else:
78
+ return []
79
+
80
+
81
+ def load_nrtsearchservice_instance_config(
82
+ service: str,
83
+ instance: str,
84
+ cluster: str,
85
+ load_deployments: bool = True,
86
+ soa_dir: str = DEFAULT_SOA_DIR,
87
+ ) -> NrtsearchServiceDeploymentConfig:
88
+ """Read a service instance's configuration for Nrtsearch.
89
+
90
+ If a branch isn't specified for a config, the 'branch' key defaults to
91
+ paasta-${cluster}.${instance}.
92
+
93
+ :param service: The service name
94
+ :param instance: The instance of the service to retrieve
95
+ :param cluster: The cluster to read the configuration for
96
+ :param load_deployments: A boolean indicating if the corresponding deployments.json for this service
97
+ should also be loaded
98
+ :param soa_dir: The SOA configuration directory to read from
99
+ :returns: A dictionary of whatever was in the config for the service instance"""
100
+ general_config = service_configuration_lib.read_service_configuration(
101
+ service, soa_dir=soa_dir
102
+ )
103
+ instance_config = load_service_instance_config(
104
+ service, instance, "nrtsearchservice", cluster, soa_dir=soa_dir
105
+ )
106
+ general_config = deep_merge_dictionaries(
107
+ overrides=instance_config, defaults=general_config
108
+ )
109
+
110
+ branch_dict: Optional[BranchDictV2] = None
111
+ if load_deployments:
112
+ deployments_json = load_v2_deployments_json(service, soa_dir=soa_dir)
113
+ temp_instance_config = NrtsearchServiceDeploymentConfig(
114
+ service=service,
115
+ cluster=cluster,
116
+ instance=instance,
117
+ config_dict=general_config,
118
+ branch_dict=None,
119
+ soa_dir=soa_dir,
120
+ )
121
+ branch = temp_instance_config.get_branch()
122
+ deploy_group = temp_instance_config.get_deploy_group()
123
+ branch_dict = deployments_json.get_branch_dict(service, branch, deploy_group)
124
+
125
+ return NrtsearchServiceDeploymentConfig(
126
+ service=service,
127
+ cluster=cluster,
128
+ instance=instance,
129
+ config_dict=general_config,
130
+ branch_dict=branch_dict,
131
+ soa_dir=soa_dir,
132
+ )
133
+
134
+
135
+ # TODO: read this from CRD in service configs
136
+ def cr_id(service: str, instance: str) -> Mapping[str, str]:
137
+ return dict(
138
+ group="yelp.com",
139
+ version="v1alpha1",
140
+ namespace="paasta-nrtsearchservices",
141
+ plural="nrtsearchservices",
142
+ name=sanitised_cr_name(service, instance),
143
+ )
@@ -0,0 +1,68 @@
1
+ from typing import Optional
2
+
3
+ import service_configuration_lib
4
+
5
+ from paasta_tools.nrtsearchservice_tools import NrtsearchServiceDeploymentConfig
6
+ from paasta_tools.utils import BranchDictV2
7
+ from paasta_tools.utils import deep_merge_dictionaries
8
+ from paasta_tools.utils import DEFAULT_SOA_DIR
9
+ from paasta_tools.utils import load_service_instance_config
10
+ from paasta_tools.utils import load_v2_deployments_json
11
+
12
+
13
+ class NrtsearchServiceEksDeploymentConfig(NrtsearchServiceDeploymentConfig):
14
+ config_filename_prefix = "nrtsearchserviceeks"
15
+
16
+
17
+ def load_nrtsearchserviceeks_instance_config(
18
+ service: str,
19
+ instance: str,
20
+ cluster: str,
21
+ load_deployments: bool = True,
22
+ soa_dir: str = DEFAULT_SOA_DIR,
23
+ ) -> NrtsearchServiceEksDeploymentConfig:
24
+ """Read a service instance's configuration for Nrtsearch.
25
+
26
+ If a branch isn't specified for a config, the 'branch' key defaults to
27
+ paasta-${cluster}.${instance}.
28
+
29
+ :param service: The service name
30
+ :param instance: The instance of the service to retrieve
31
+ :param cluster: The cluster to read the configuration for
32
+ :param load_deployments: A boolean indicating if the corresponding deployments.json for this service
33
+ should also be loaded
34
+ :param soa_dir: The SOA configuration directory to read from
35
+ :returns: A dictionary of whatever was in the config for the service instance"""
36
+ general_config = service_configuration_lib.read_service_configuration(
37
+ service, soa_dir=soa_dir
38
+ )
39
+ instance_config = load_service_instance_config(
40
+ service, instance, "nrtsearchserviceeks", cluster, soa_dir=soa_dir
41
+ )
42
+ general_config = deep_merge_dictionaries(
43
+ overrides=instance_config, defaults=general_config
44
+ )
45
+
46
+ branch_dict: Optional[BranchDictV2] = None
47
+ if load_deployments:
48
+ deployments_json = load_v2_deployments_json(service, soa_dir=soa_dir)
49
+ temp_instance_config = NrtsearchServiceEksDeploymentConfig(
50
+ service=service,
51
+ cluster=cluster,
52
+ instance=instance,
53
+ config_dict=general_config,
54
+ branch_dict=None,
55
+ soa_dir=soa_dir,
56
+ )
57
+ branch = temp_instance_config.get_branch()
58
+ deploy_group = temp_instance_config.get_deploy_group()
59
+ branch_dict = deployments_json.get_branch_dict(service, branch, deploy_group)
60
+
61
+ return NrtsearchServiceEksDeploymentConfig(
62
+ service=service,
63
+ cluster=cluster,
64
+ instance=instance,
65
+ config_dict=general_config,
66
+ branch_dict=branch_dict,
67
+ soa_dir=soa_dir,
68
+ )
@@ -0,0 +1,321 @@
1
+ #!/usr/bin/env python
2
+ # Copyright 2015-2017 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
+ paasta_oom_logger is supposed to be used as a syslog-ng destination.
17
+ It looks for OOM events in the log, adds PaaSTA service and instance names
18
+ and send JSON-encoded messages the stream 'tmp_paasta_oom_events'.
19
+
20
+ syslog-ng.conf:
21
+
22
+ destination paasta_oom_logger {
23
+ program("exec /usr/bin/paasta_oom_logger" template("${UNIXTIME} ${HOST} ${MESSAGE}\n") );
24
+ };
25
+
26
+ filter f_cgroup_oom {
27
+ match(" killed as a result of limit of ") or match(" invoked oom-killer: ");
28
+ };
29
+
30
+ log {
31
+ source(s_all);
32
+ filter(f_cgroup_oom);
33
+ destination(paasta_oom_logger);
34
+ };
35
+ """
36
+ import argparse
37
+ import json
38
+ import re
39
+ import sys
40
+ from collections import namedtuple
41
+ from typing import Dict
42
+
43
+ import grpc
44
+ from containerd.services.containers.v1 import containers_pb2
45
+ from containerd.services.containers.v1 import containers_pb2_grpc
46
+ from docker.errors import APIError
47
+
48
+ from paasta_tools.cli.utils import get_instance_config
49
+ from paasta_tools.utils import _log
50
+ from paasta_tools.utils import DEFAULT_LOGLEVEL
51
+ from paasta_tools.utils import get_docker_client
52
+ from paasta_tools.utils import load_system_paasta_config
53
+
54
+
55
+ # Sorry to any non-yelpers but this won't
56
+ # do much as our metrics and logging libs
57
+ # are not open source
58
+ try:
59
+ import yelp_meteorite
60
+ except ImportError:
61
+ yelp_meteorite = None
62
+
63
+ try:
64
+ import clog
65
+ except ImportError:
66
+ clog = None
67
+
68
+
69
+ LogLine = namedtuple(
70
+ "LogLine",
71
+ [
72
+ "timestamp",
73
+ "hostname",
74
+ "container_id",
75
+ "cluster",
76
+ "service",
77
+ "instance",
78
+ "process_name",
79
+ "mesos_container_id",
80
+ "mem_limit",
81
+ ],
82
+ )
83
+
84
+
85
+ def parse_args() -> argparse.Namespace:
86
+ parser = argparse.ArgumentParser(description="paasta_oom_logger")
87
+ parser.add_argument(
88
+ "--containerd",
89
+ action="store_true",
90
+ help="Use containerd to inspect containers, otherwise use docker",
91
+ )
92
+ return parser.parse_args()
93
+
94
+
95
+ def capture_oom_events_from_stdin():
96
+ process_name_regex = re.compile(
97
+ r"^\d+\s[a-zA-Z0-9\-]+\s.*\]\s(.+)\sinvoked\soom-killer:"
98
+ )
99
+ oom_regex_docker = re.compile(
100
+ r"^(\d+)\s([a-zA-Z0-9\-]+)\s.*Task in /docker/(\w{12})\w+ killed as a"
101
+ )
102
+ oom_regex_kubernetes = re.compile(
103
+ r"""
104
+ ^(\d+)\s # timestamp
105
+ ([a-zA-Z0-9\-]+) # hostname
106
+ \s.*Task\sin\s/kubepods/(?:[a-zA-Z]+/)? # start of message; non capturing, optional group for the qos cgroup
107
+ pod[-\w]+/(\w{12})\w+\s # containerid
108
+ killed\sas\sa* # eom
109
+ """,
110
+ re.VERBOSE,
111
+ )
112
+ oom_regex_kubernetes_containerd_systemd_cgroup = re.compile(
113
+ r"""
114
+ ^(\d+)\s # timestamp
115
+ ([a-zA-Z0-9\-]+) # hostname
116
+ \s.*oom-kill:.*task_memcg=/.*\.slice/.* # loosely match systemd slice and containerid
117
+ cri-containerd:(\w{64}).*$ # containerid
118
+ """,
119
+ re.VERBOSE,
120
+ )
121
+
122
+ oom_regex_kubernetes_containerd_systemd_cgroup_structured = re.compile(
123
+ r"""
124
+ ^(\d+)\s # timestamp
125
+ ([a-zA-Z0-9\-]+) # hostname
126
+ \s.*oom-kill:.*task_memcg=/kubepods\.slice/.* # match systemd slice and containerid
127
+ cri-containerd-(\w{64}).*$ # containerid
128
+ """,
129
+ re.VERBOSE,
130
+ )
131
+ oom_regex_kubernetes_structured = re.compile(
132
+ r"""
133
+ ^(\d+)\s # timestamp
134
+ ([a-zA-Z0-9\-]+) # hostname
135
+ \s.*oom-kill:.*task_memcg=/kubepods/(?:[a-zA-Z]+/)? # start of message; non-capturing, optional group for the qos cgroup
136
+ pod[-\w]+/(\w{12})\w+,.*$ # containerid
137
+ """,
138
+ re.VERBOSE,
139
+ )
140
+ oom_regex_kubernetes_systemd_cgroup = re.compile(
141
+ r"""
142
+ ^(\d+)\s # timestamp
143
+ ([a-zA-Z0-9\-]+) # hostname
144
+ \s.*oom-kill:.*task_memcg=/kubepods\.slice/[^,]+docker-(\w{12})\w+\.scope,.*$ # loosely match systemd slice and containerid
145
+ """,
146
+ re.VERBOSE,
147
+ )
148
+ event_detail_regexes = [
149
+ oom_regex_docker,
150
+ oom_regex_kubernetes,
151
+ oom_regex_kubernetes_structured,
152
+ oom_regex_kubernetes_systemd_cgroup,
153
+ oom_regex_kubernetes_containerd_systemd_cgroup,
154
+ oom_regex_kubernetes_containerd_systemd_cgroup_structured,
155
+ ]
156
+
157
+ process_name = ""
158
+ while True:
159
+ try:
160
+ syslog = sys.stdin.readline()
161
+ except StopIteration:
162
+ break
163
+ if not syslog:
164
+ break
165
+ r = process_name_regex.search(syslog)
166
+ if r:
167
+ process_name = r.group(1)
168
+ for expression in event_detail_regexes:
169
+ r = expression.search(syslog)
170
+ if r:
171
+ yield (int(r.group(1)), r.group(2), r.group(3), process_name)
172
+ process_name = ""
173
+ break
174
+
175
+
176
+ def get_container_env_as_dict(
177
+ is_cri_containerd: bool, container_inspect: dict
178
+ ) -> Dict[str, str]:
179
+ env_vars = {}
180
+ if is_cri_containerd:
181
+ config = container_inspect.get("process")
182
+ env_key = "env"
183
+ else:
184
+ config = container_inspect.get("Config")
185
+ env_key = "Env"
186
+ if config is not None:
187
+ env = config.get(env_key, [])
188
+ for i in env:
189
+ name, _, value = i.partition("=")
190
+ env_vars[name] = value
191
+ return env_vars
192
+
193
+
194
+ def log_to_clog(log_line):
195
+ """Send the event to 'tmp_paasta_oom_events'."""
196
+ line = (
197
+ '{"timestamp": %d, "hostname": "%s", "container_id": "%s", "cluster": "%s", '
198
+ '"service": "%s", "instance": "%s", "process_name": "%s", '
199
+ '"mesos_container_id": "%s", "mem_limit": "%s"}'
200
+ % (
201
+ log_line.timestamp,
202
+ log_line.hostname,
203
+ log_line.container_id,
204
+ log_line.cluster,
205
+ log_line.service,
206
+ log_line.instance,
207
+ log_line.process_name,
208
+ log_line.mesos_container_id,
209
+ log_line.mem_limit,
210
+ )
211
+ )
212
+ clog.log_line("tmp_paasta_oom_events", line)
213
+
214
+
215
+ def log_to_paasta(log_line):
216
+ """Add the event to the standard PaaSTA logging backend."""
217
+ line = "oom-killer killed {} on {} (container_id: {}).".format(
218
+ "a %s process" % log_line.process_name
219
+ if log_line.process_name
220
+ else "a process",
221
+ log_line.hostname,
222
+ log_line.container_id,
223
+ )
224
+ _log(
225
+ service=log_line.service,
226
+ instance=log_line.instance,
227
+ component="oom",
228
+ cluster=log_line.cluster,
229
+ level=DEFAULT_LOGLEVEL,
230
+ line=line,
231
+ )
232
+
233
+
234
+ def send_sfx_event(service, instance, cluster):
235
+ if yelp_meteorite:
236
+ service_instance_config = get_instance_config(
237
+ service=service, instance=instance, cluster=cluster
238
+ )
239
+ dimensions = {
240
+ "paasta_cluster": cluster,
241
+ "paasta_instance": instance,
242
+ "paasta_service": service,
243
+ "paasta_pool": service_instance_config.get_pool(),
244
+ }
245
+ yelp_meteorite.events.emit_event(
246
+ "paasta.service.oom_events",
247
+ dimensions=dimensions,
248
+ )
249
+ counter = yelp_meteorite.create_counter(
250
+ "paasta.service.oom_count",
251
+ default_dimensions=dimensions,
252
+ )
253
+ counter.count()
254
+
255
+
256
+ def get_containerd_container(container_id: str) -> containers_pb2.Container:
257
+ with grpc.insecure_channel("unix:///run/containerd/containerd.sock") as channel:
258
+ containersv1 = containers_pb2_grpc.ContainersStub(channel)
259
+ return containersv1.Get(
260
+ containers_pb2.GetContainerRequest(id=container_id),
261
+ metadata=(("containerd-namespace", "k8s.io"),),
262
+ ).container
263
+
264
+
265
+ def main():
266
+ if clog is None:
267
+ print("CLog logger unavailable, exiting.", file=sys.stderr)
268
+ sys.exit(1)
269
+ args = parse_args()
270
+ clog.config.configure(
271
+ scribe_host="169.254.255.254",
272
+ scribe_port=1463,
273
+ monk_disable=False,
274
+ scribe_disable=False,
275
+ )
276
+ cluster = load_system_paasta_config().get_cluster()
277
+ client = get_docker_client()
278
+ for (
279
+ timestamp,
280
+ hostname,
281
+ container_id,
282
+ process_name,
283
+ ) in capture_oom_events_from_stdin():
284
+ if args.containerd:
285
+ # then we're using containerd to inspect containers
286
+ try:
287
+ container_info = get_containerd_container(container_id)
288
+ except grpc.RpcError as e:
289
+ print("An error occurred while getting the container:", e)
290
+ continue
291
+ container_spec_raw = container_info.spec.value.decode("utf-8")
292
+ container_inspect = json.loads(container_spec_raw)
293
+ else:
294
+ # we're using docker to inspect containers
295
+ try:
296
+ container_inspect = client.inspect_container(resource_id=container_id)
297
+ except (APIError):
298
+ continue
299
+ env_vars = get_container_env_as_dict(args.containerd, container_inspect)
300
+ service = env_vars.get("PAASTA_SERVICE", "unknown")
301
+ instance = env_vars.get("PAASTA_INSTANCE", "unknown")
302
+ mesos_container_id = env_vars.get("MESOS_CONTAINER_NAME", "mesos-null")
303
+ mem_limit = env_vars.get("PAASTA_RESOURCE_MEM", "unknown")
304
+ log_line = LogLine(
305
+ timestamp=timestamp,
306
+ hostname=hostname,
307
+ container_id=container_id,
308
+ cluster=cluster,
309
+ service=service,
310
+ instance=instance,
311
+ process_name=process_name,
312
+ mesos_container_id=mesos_container_id,
313
+ mem_limit=mem_limit,
314
+ )
315
+ log_to_clog(log_line)
316
+ log_to_paasta(log_line)
317
+ send_sfx_event(service, instance, cluster)
318
+
319
+
320
+ if __name__ == "__main__":
321
+ main()
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+ set -eo pipefail
3
+ paasta_list_tron_namespaces | xargs -n 1 -r -P 1 paasta_setup_tron_namespace