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,306 @@
1
+ #!/usr/bin/env python3
2
+ import argparse
3
+ import asyncio
4
+ import functools
5
+ import json
6
+ import logging
7
+ import os.path
8
+ import re
9
+ import socket
10
+ import sys
11
+ from collections import defaultdict
12
+ from enum import Enum
13
+ from typing import Any
14
+ from typing import DefaultDict
15
+ from typing import Dict
16
+ from typing import List
17
+ from typing import NamedTuple
18
+ from typing import Optional
19
+ from typing import Set
20
+ from typing import Tuple
21
+
22
+ from kazoo.client import KazooClient
23
+ from kazoo.exceptions import NoNodeError
24
+
25
+ from paasta_tools import yaml_tools as yaml
26
+
27
+ logger = logging.getLogger("check_orphans")
28
+
29
+ PREFIX = "/smartstack/global/"
30
+ CHUNK_SIZE = 50 # How many concurrent xinetd connections
31
+ DEFAULT_ZK_DISCOVERY_PATH = "/nail/etc/zookeeper_discovery/infrastructure/local.yaml"
32
+ DEFAULT_NERVE_XINETD_PORT = 8735
33
+
34
+
35
+ class ExitCode(Enum):
36
+ OK = 0
37
+ ORPHANS = 1
38
+ COLLISIONS = 2
39
+ UNKNOWN = 3
40
+
41
+
42
+ def get_zk_hosts(path: str) -> List[str]:
43
+ with open(path) as f:
44
+ x = yaml.safe_load(f)
45
+ return [f"{host}:{port}" for host, port in x]
46
+
47
+
48
+ SmartstackData = Dict[str, Dict[str, Any]]
49
+
50
+
51
+ def get_zk_data(ignored_services: Set[str]) -> SmartstackData:
52
+ logger.info(f"using {DEFAULT_ZK_DISCOVERY_PATH} for zookeeper")
53
+ zk_hosts = get_zk_hosts(DEFAULT_ZK_DISCOVERY_PATH)
54
+
55
+ logger.debug(f"connecting to zk hosts {zk_hosts}")
56
+ zk = KazooClient(hosts=zk_hosts)
57
+ zk.start()
58
+
59
+ logger.debug(f"pulling smartstack data from zookeeper")
60
+ zk_data = {}
61
+ services = zk.get_children(PREFIX)
62
+ for service in services:
63
+ if service in ignored_services:
64
+ continue
65
+ service_instances = zk.get_children(os.path.join(PREFIX, service))
66
+ instances_data = {}
67
+ for instance in service_instances:
68
+ try:
69
+ instance_node = zk.get(os.path.join(PREFIX, service, instance))
70
+ except NoNodeError:
71
+ continue
72
+ instances_data[instance] = json.loads(instance_node[0])
73
+ zk_data[service] = instances_data
74
+
75
+ return zk_data
76
+
77
+
78
+ class InstanceTuple(NamedTuple):
79
+ # paasta_host may be different from the service's host if running on k8s.
80
+ # We need the actual PaaSTA host because the k8s pod does not listen for
81
+ # xinetd connections.
82
+ paasta_host: str
83
+ host: str
84
+ port: int
85
+ service: str
86
+
87
+
88
+ def read_from_zk_data(registrations: SmartstackData) -> Set[InstanceTuple]:
89
+ return {
90
+ InstanceTuple(
91
+ host_to_ip(instance_data["name"], instance_data["host"]),
92
+ instance_data["host"],
93
+ instance_data["port"],
94
+ service,
95
+ )
96
+ for service, instance in registrations.items()
97
+ for instance_data in instance.values()
98
+ }
99
+
100
+
101
+ @functools.lru_cache()
102
+ def host_to_ip(host: str, fallback: str) -> str:
103
+ """Try to resolve a host to an IP with a fallback.
104
+
105
+ Because DNS resolution is relatively slow and can't be easily performed
106
+ using asyncio, we cheat a little and use a regex for well-formed hostnames
107
+ to try to guess the IP without doing real resolution.
108
+
109
+ A fallback is needed because in some cases the nerve registration does not
110
+ match an actual hostname (e.g. "prod-db15" or "prod-splunk-master").
111
+ """
112
+ for match in (
113
+ re.match(r"^(\d+)-(\d+)-(\d+)-(\d+)-", host),
114
+ re.match(r"^ip-(\d+)-(\d+)-(\d+)-(\d+)", host),
115
+ ):
116
+ if match:
117
+ return ".".join(match.groups())
118
+ else:
119
+ try:
120
+ return socket.gethostbyname(host)
121
+ except socket.gaierror:
122
+ return fallback
123
+
124
+
125
+ async def transfer_one_file(
126
+ host: str, port: int = DEFAULT_NERVE_XINETD_PORT
127
+ ) -> Tuple[str, Optional[str]]:
128
+ logger.debug(f"getting file from {host}")
129
+ try:
130
+ reader, _ = await asyncio.wait_for(
131
+ asyncio.open_connection(host=host, port=port, limit=2**32), timeout=1.0
132
+ )
133
+ resp = await asyncio.wait_for(reader.read(), timeout=1.0)
134
+ except (asyncio.TimeoutError, ConnectionRefusedError) as ex:
135
+ # this is not ununusual because we sometimes advertise hosts from
136
+ # firewalled subnets where we can't make this connection to get
137
+ # the file. check y/ipam to see what the subnet means
138
+ logger.debug(f"error getting file from {host}: {ex!r}")
139
+ return (host, None)
140
+
141
+ return (host, resp.decode())
142
+
143
+
144
+ async def gather_files(hosts: Set[str]) -> Dict[str, str]:
145
+ logger.info("gathering files from {} hosts".format(len(hosts)))
146
+ tasks = [transfer_one_file(host) for host in hosts]
147
+ responses = {}
148
+ for idx in range(0, len(tasks), CHUNK_SIZE):
149
+ resp = await asyncio.gather(
150
+ *tasks[idx : idx + CHUNK_SIZE], return_exceptions=True
151
+ )
152
+ responses.update(dict(resp))
153
+ return responses
154
+
155
+
156
+ def read_one_nerve_file(nerve_config: str) -> Set[InstanceTuple]:
157
+ nerve_config = json.loads(nerve_config)
158
+ return {
159
+ InstanceTuple(
160
+ # The "instance_id" configured in nerve's config file is the same
161
+ # as the "name" attribute in a zookeeper registration (i.e. for
162
+ # PaaSTA hosts, it will be the hostname of the machine running
163
+ # nerve). To be able to easily compare the tuples using set
164
+ # operations, we resolve it to an IP in both places.
165
+ host_to_ip(nerve_config["instance_id"], service["host"]),
166
+ service["host"],
167
+ service["port"],
168
+ service["zk_path"][len(PREFIX) :],
169
+ )
170
+ for service in nerve_config["services"].values()
171
+ if service["zk_path"].startswith(PREFIX)
172
+ }
173
+
174
+
175
+ def read_nerve_files(
176
+ nerve_configs: Dict[str, Optional[str]]
177
+ ) -> Tuple[Set[InstanceTuple], Set[str]]:
178
+ instance_set: Set[InstanceTuple] = set()
179
+ not_found_hosts: Set[str] = set()
180
+ for host, host_config in nerve_configs.items():
181
+ if host_config is None:
182
+ not_found_hosts.add(host)
183
+ else:
184
+ instance_set |= read_one_nerve_file(host_config)
185
+ return instance_set, not_found_hosts
186
+
187
+
188
+ def get_instance_data(
189
+ ignored_services: Set[str],
190
+ ) -> Tuple[Set[InstanceTuple], Set[InstanceTuple]]:
191
+ # Dump ZK
192
+ zk_data = get_zk_data(ignored_services)
193
+ zk_instance_data = read_from_zk_data(zk_data)
194
+
195
+ hosts = {x[0] for x in zk_instance_data}
196
+
197
+ # Dump Nerve configs from each host via xinetd
198
+ results = asyncio.get_event_loop().run_until_complete(gather_files(hosts))
199
+
200
+ nerve_instance_data, not_found_hosts = read_nerve_files(results)
201
+
202
+ # Filter out anything that we couldn't get a nerve config for
203
+ zk_instance_data_filtered = {
204
+ x for x in zk_instance_data if x[0] not in not_found_hosts
205
+ }
206
+
207
+ logger.info("zk_instance_data (unfiltered) len: {}".format(len(zk_instance_data)))
208
+ logger.info(
209
+ "zk_instance_data (filtered) len: {}".format(len(zk_instance_data_filtered))
210
+ )
211
+ logger.info("nerve_instance_data len: {}".format(len(nerve_instance_data)))
212
+
213
+ return zk_instance_data_filtered, nerve_instance_data
214
+
215
+
216
+ def check_orphans(
217
+ zk_instance_data: Set[InstanceTuple],
218
+ nerve_instance_data: Set[InstanceTuple],
219
+ check_orphans: bool,
220
+ check_collisions: bool,
221
+ ) -> ExitCode:
222
+
223
+ if check_collisions:
224
+ # collisions
225
+ instance_by_addr: DefaultDict[Tuple[str, int], Set[str]] = defaultdict(set)
226
+ for nerve_inst in nerve_instance_data:
227
+ instance_by_addr[(nerve_inst.host, nerve_inst.port)].add(nerve_inst.service)
228
+ collisions: List[str] = []
229
+ for zk_inst in zk_instance_data:
230
+ nerve_services = instance_by_addr[(zk_inst.host, zk_inst.port)]
231
+ if len(nerve_services) >= 1 and zk_inst.service not in nerve_services:
232
+ collisions.append(
233
+ f"[{zk_inst.host}:{zk_inst.port}] {zk_inst.service} collides with {nerve_services}"
234
+ )
235
+
236
+ if collisions:
237
+ logger.warning("Collisions found! Traffic is being misrouted!")
238
+ print("\n".join(collisions))
239
+ return ExitCode.COLLISIONS
240
+ else:
241
+ logger.info(
242
+ f"No collisions found out of {len(zk_instance_data)} service registrations seen."
243
+ )
244
+ if check_orphans:
245
+ orphans = zk_instance_data - nerve_instance_data
246
+
247
+ # groupby host
248
+ orphans_by_host: DefaultDict[str, List[Tuple[int, str]]] = defaultdict(list)
249
+ for orphan in orphans:
250
+ orphans_by_host[orphan.host].append((orphan.port, orphan.service))
251
+
252
+ if orphans:
253
+ logger.warning("{} orphans found".format(len(orphans)))
254
+ print(dict(orphans_by_host))
255
+ return ExitCode.ORPHANS
256
+ else:
257
+ logger.info(
258
+ f"No orphans found out of {len(zk_instance_data)} service registrations seen."
259
+ )
260
+
261
+ return ExitCode.OK
262
+
263
+
264
+ def main() -> ExitCode:
265
+ logging.basicConfig(level=logging.WARNING)
266
+ parser = argparse.ArgumentParser()
267
+ parser.add_argument(
268
+ "--ignored-services",
269
+ # TODO(ckuehl|2020-08-27): Remove this deprecated option alias eventually.
270
+ "--blacklisted-services-DEPRECATED",
271
+ default="",
272
+ type=str,
273
+ help="Comma separated list of services to ignore",
274
+ )
275
+ parser.add_argument(
276
+ "--no-check-collisions",
277
+ default=False,
278
+ action="store_true",
279
+ help="Skip checking collisions",
280
+ )
281
+ parser.add_argument(
282
+ "--no-check-orphans",
283
+ default=False,
284
+ action="store_true",
285
+ help="Skip checking orphans",
286
+ )
287
+ args = parser.parse_args()
288
+
289
+ if args.no_check_collisions and args.no_check_orphans:
290
+ logger.error("Must check at least one of orphans or collisions.")
291
+ return ExitCode.UNKNOWN
292
+
293
+ zk_instance_data, nerve_instance_data = get_instance_data(
294
+ set(args.ignored_services.split(","))
295
+ )
296
+
297
+ return check_orphans(
298
+ zk_instance_data,
299
+ nerve_instance_data,
300
+ check_orphans=not args.no_check_orphans,
301
+ check_collisions=not args.no_check_collisions,
302
+ )
303
+
304
+
305
+ if __name__ == "__main__":
306
+ sys.exit(main().value)
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env python3
2
+ import argparse
3
+
4
+ from boto3 import session
5
+
6
+
7
+ def get_client(endpoint):
8
+ s = session.Session(
9
+ region_name="foo", aws_access_key_id="foo", aws_secret_access_key="bar"
10
+ )
11
+ client = s.client(service_name="dynamodb", endpoint_url=endpoint)
12
+ return client
13
+
14
+
15
+ def create_table(client, table_name):
16
+ return client.create_table(
17
+ TableName=table_name,
18
+ KeySchema=[
19
+ {"AttributeName": "task_id", "KeyType": "HASH"},
20
+ {"AttributeName": "timestamp", "KeyType": "RANGE"},
21
+ ],
22
+ AttributeDefinitions=[
23
+ {"AttributeName": "task_id", "AttributeType": "S"},
24
+ {"AttributeName": "timestamp", "AttributeType": "N"},
25
+ ],
26
+ ProvisionedThroughput={"ReadCapacityUnits": 123, "WriteCapacityUnits": 123},
27
+ )
28
+
29
+
30
+ if __name__ == "__main__":
31
+ parser = argparse.ArgumentParser(description="Create a dummy dynamodb table")
32
+ parser.add_argument("endpoint", type=str, help="the dynamodb endpoint")
33
+ parser.add_argument("table_name", type=str, help="the name of the table to create")
34
+ args = parser.parse_args()
35
+ create_table(get_client(args.endpoint), args.table_name)
@@ -0,0 +1,105 @@
1
+ import json
2
+ import os
3
+ import socket
4
+ import subprocess
5
+
6
+ from render_template import render_values
7
+
8
+ from paasta_tools.cli.utils import pick_random_port
9
+ from paasta_tools.utils import get_docker_client
10
+
11
+
12
+ def main():
13
+ config_path = "etc_paasta_playground"
14
+ values_path = "./k8s_itests/deployments/paasta/values.yaml"
15
+ user = os.getenv("USER")
16
+
17
+ # start a local copy of zookeeper on a random port
18
+ zookeeper_port = pick_random_port(f"{user}-paasta-zookeeper")
19
+ ensure_running_local_zookeeper(user, zookeeper_port)
20
+ os.environ["ZOOKEEPER_PORT"] = str(zookeeper_port)
21
+ os.environ["HOST_IP"] = socket.gethostbyname(socket.gethostname())
22
+
23
+ # create an etc_paasta_playground directory if it doesn't exist
24
+ # and copy fake_etc_paasta content into etc_paasta_playground directory
25
+ if not os.path.isdir("etc_paasta_playground"):
26
+ os.mkdir("etc_paasta_playground")
27
+
28
+ render_values(
29
+ src="./k8s_itests/deployments/paasta/fake_etc_paasta",
30
+ dst=config_path,
31
+ values=values_path,
32
+ )
33
+
34
+ # Add in volumes.json
35
+ hacheck_sidecar_volumes = {"volumes": [], "hacheck_sidecar_volumes": []}
36
+ volumes_path = os.path.join(config_path, "volumes.json")
37
+ with open(volumes_path, "w") as f:
38
+ json.dump(hacheck_sidecar_volumes, f)
39
+
40
+ # create a fake_soa_config directory if it doesn't exist
41
+ # and copy fake_soa_config content into soa_config_playground directory
42
+ if not os.path.isdir("soa_config_playground"):
43
+ os.mkdir("soa_config_playground")
44
+
45
+ render_values(
46
+ src="./k8s_itests/deployments/paasta/fake_soa_config",
47
+ dst="soa_config_playground",
48
+ values=values_path,
49
+ overwrite=False,
50
+ )
51
+
52
+
53
+ def ensure_running_local_zookeeper(user: str, zookeeper_port: int) -> None:
54
+ client = get_docker_client()
55
+ containers = client.containers()
56
+ zookeeper_container = next(
57
+ (
58
+ container
59
+ for container in containers
60
+ if container["Names"] == [f"/{user}-paasta-zookeeper"]
61
+ ),
62
+ None,
63
+ )
64
+ if zookeeper_container is None:
65
+ run_zookeeper_container(user, zookeeper_port)
66
+ elif zookeeper_container.get("Status") != "running":
67
+ client.remove_container(zookeeper_container, force=True)
68
+ run_zookeeper_container(user, zookeeper_port)
69
+
70
+
71
+ def run_zookeeper_container(user: str, zookeeper_port: int) -> None:
72
+ if "yelpcorp.com" in socket.getfqdn():
73
+ subprocess.run(
74
+ [
75
+ "docker",
76
+ "run",
77
+ "-d",
78
+ "-p",
79
+ f"{zookeeper_port}:2181",
80
+ "-e",
81
+ '"ALLOW_ANONYMOUS_LOGIN=yes"',
82
+ "--name",
83
+ f"{user}-paasta-zookeeper",
84
+ "docker-dev.yelpcorp.com/zookeeper-testing",
85
+ ]
86
+ )
87
+ else:
88
+ subprocess.run(
89
+ [
90
+ "docker",
91
+ "run",
92
+ "-d",
93
+ "-p",
94
+ f"{zookeeper_port}:2181",
95
+ "-e",
96
+ '"ALLOW_ANONYMOUS_LOGIN=yes"',
97
+ "--name",
98
+ f"{user}-paasta-zookeeper",
99
+ "zookeeper:3.5",
100
+ ]
101
+ )
102
+
103
+
104
+ if __name__ == "__main__":
105
+ main()
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env python
2
+ import logging
3
+
4
+ import yelp_meteorite
5
+
6
+ from paasta_tools.cli.utils import get_instance_config
7
+ from paasta_tools.utils import get_services_for_cluster
8
+ from paasta_tools.utils import load_system_paasta_config
9
+
10
+ log = logging.getLogger(__name__)
11
+
12
+
13
+ def emit_metrics_for_type(instance_type):
14
+ cluster = load_system_paasta_config().get_cluster()
15
+ instances = get_services_for_cluster(cluster=cluster, instance_type=instance_type)
16
+
17
+ for service, instance in instances:
18
+ service_instance_config = get_instance_config(
19
+ service=service, instance=instance, cluster=cluster
20
+ )
21
+ dimensions = {
22
+ "paasta_service": service_instance_config.service,
23
+ "paasta_cluster": service_instance_config.cluster,
24
+ "paasta_instance": service_instance_config.instance,
25
+ "paasta_pool": service_instance_config.get_pool(),
26
+ }
27
+
28
+ log.info(f"Emitting paasta.service.* with dimensions {dimensions}")
29
+ gauge = yelp_meteorite.create_gauge("paasta.service.cpus", dimensions)
30
+ gauge.set(service_instance_config.get_cpus())
31
+ gauge = yelp_meteorite.create_gauge("paasta.service.mem", dimensions)
32
+ gauge.set(service_instance_config.get_mem())
33
+ gauge = yelp_meteorite.create_gauge("paasta.service.disk", dimensions)
34
+ gauge.set(service_instance_config.get_disk())
35
+ if hasattr(service_instance_config, "get_instances"):
36
+ if service_instance_config.get_max_instances() is None:
37
+ gauge = yelp_meteorite.create_gauge(
38
+ "paasta.service.instances", dimensions
39
+ )
40
+ gauge.set(service_instance_config.get_instances())
41
+
42
+
43
+ def main():
44
+ logging.basicConfig(level=logging.INFO)
45
+ for thing in ["adhoc"]:
46
+ emit_metrics_for_type(thing)
47
+
48
+
49
+ if __name__ == "__main__":
50
+ main()