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,145 @@
1
+ #!python
2
+ # Copyright 2015-2019 Yelp Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ """
16
+ Usage: ./cleanup_kubernetes_crd.py [options]
17
+
18
+ Command line options:
19
+
20
+ - -d <SOA_DIR>, --soa-dir <SOA_DIR>: Specify a SOA config dir to read from
21
+ - -c <cluster>, --cluster <cluster>: Specify a kubernetes cluster name
22
+ - -v, --verbose: Verbose output
23
+ - -n, --dry-run: Only report what would have been deleted
24
+ """
25
+ import argparse
26
+ import logging
27
+ import sys
28
+
29
+ import service_configuration_lib
30
+ from kubernetes.client import V1DeleteOptions
31
+ from kubernetes.client.rest import ApiException
32
+
33
+ from paasta_tools.kubernetes_tools import KubeClient
34
+ from paasta_tools.kubernetes_tools import paasta_prefixed
35
+ from paasta_tools.utils import DEFAULT_SOA_DIR
36
+ from paasta_tools.utils import load_system_paasta_config
37
+
38
+ log = logging.getLogger(__name__)
39
+
40
+
41
+ def parse_args() -> argparse.Namespace:
42
+ parser = argparse.ArgumentParser(description="Removes stale kubernetes CRDs.")
43
+ parser.add_argument(
44
+ "-c",
45
+ "--cluster",
46
+ dest="cluster",
47
+ metavar="CLUSTER",
48
+ default=None,
49
+ help="Kubernetes cluster name",
50
+ )
51
+ parser.add_argument(
52
+ "-d",
53
+ "--soa-dir",
54
+ dest="soa_dir",
55
+ metavar="SOA_DIR",
56
+ default=DEFAULT_SOA_DIR,
57
+ help="define a different soa config directory",
58
+ )
59
+ parser.add_argument(
60
+ "-v", "--verbose", action="store_true", dest="verbose", default=False
61
+ )
62
+ parser.add_argument(
63
+ "-n", "--dry-run", action="store_true", dest="dry_run", default=False
64
+ )
65
+ args = parser.parse_args()
66
+ return args
67
+
68
+
69
+ def main() -> None:
70
+ args = parse_args()
71
+ soa_dir = args.soa_dir
72
+ if args.verbose:
73
+ logging.basicConfig(level=logging.DEBUG)
74
+ else:
75
+ logging.basicConfig(level=logging.WARNING)
76
+
77
+ if args.cluster:
78
+ cluster = args.cluster
79
+ else:
80
+ system_paasta_config = load_system_paasta_config()
81
+ cluster = system_paasta_config.get_cluster()
82
+
83
+ kube_client = KubeClient()
84
+
85
+ success = cleanup_kube_crd(
86
+ kube_client=kube_client, cluster=cluster, soa_dir=soa_dir, dry_run=args.dry_run
87
+ )
88
+ sys.exit(0 if success else 1)
89
+
90
+
91
+ def cleanup_kube_crd(
92
+ kube_client: KubeClient,
93
+ cluster: str,
94
+ soa_dir: str = DEFAULT_SOA_DIR,
95
+ dry_run: bool = False,
96
+ ) -> bool:
97
+ service_attr = paasta_prefixed("service")
98
+ existing_crds = kube_client.apiextensions.list_custom_resource_definition(
99
+ label_selector=service_attr
100
+ )
101
+
102
+ success = True
103
+ for crd in existing_crds.items:
104
+ service = crd.metadata.labels[service_attr]
105
+ if not service:
106
+ log.error(f"CRD {crd.metadata.name} has empty {service_attr} label")
107
+ continue
108
+
109
+ protected_attr = paasta_prefixed("protected")
110
+ if crd.metadata.labels.get(protected_attr) is not None:
111
+ log.info(
112
+ f"CRD {crd.metadata.name} has {protected_attr} label set - skipping."
113
+ )
114
+ continue
115
+
116
+ crd_config = service_configuration_lib.read_extra_service_information(
117
+ service, f"crd-{cluster}", soa_dir=soa_dir
118
+ )
119
+ if crd_config:
120
+ log.debug(f"CRD {crd.metadata.name} declaration found in {service}")
121
+ continue
122
+
123
+ log.info(f"CRD {crd.metadata.name} not found in {service} service")
124
+ if dry_run:
125
+ log.info("not deleting in dry-run mode")
126
+ continue
127
+
128
+ try:
129
+ kube_client.apiextensions.delete_custom_resource_definition(
130
+ name=crd.metadata.name, body=V1DeleteOptions()
131
+ )
132
+ log.info(f"deleted {crd.metadata.name} for {cluster}:{service}")
133
+ except ApiException as exc:
134
+ log.error(
135
+ f"error deploying crd for {cluster}:{service}, "
136
+ f"status: {exc.status}, reason: {exc.reason}"
137
+ )
138
+ log.debug(exc.body)
139
+ success = False
140
+
141
+ return success
142
+
143
+
144
+ if __name__ == "__main__":
145
+ main()
@@ -0,0 +1,344 @@
1
+ #!python
2
+ # Copyright 2019-2020 Yelp Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ """
16
+ Usage: ./cleanup_kubernetes_jobs.py [options]
17
+
18
+ Clean up kubernetes apps that aren't supposed to run on this cluster by deleting them.
19
+
20
+ Gets the current app list from kubernetes, and then a 'valid_app_list'
21
+ via utils.get_services_for_cluster
22
+
23
+ If an app in the kubernetes app list isn't in the valid_app_list, it's
24
+ deleted.
25
+
26
+ Command line options:
27
+
28
+ - -d <SOA_DIR>, --soa-dir <SOA_DIR>: Specify a SOA config dir to read from
29
+ - -v, --verbose: Verbose output
30
+ - -t <KILL_THRESHOLD>, --kill-threshold: The decimal fraction of apps we think
31
+ is sane to kill when this job runs
32
+ - -f, --force: Force the killing of apps if we breach the threshold
33
+ - -c, --cluster: Specifies the paasta cluster to check
34
+ - --eks: This flag cleans up only k8 services that shouldn't be running on EKS leaving instances from eks-*.yaml files
35
+ """
36
+ import argparse
37
+ import logging
38
+ import sys
39
+ import traceback
40
+ from contextlib import contextmanager
41
+ from typing import Dict
42
+ from typing import Generator
43
+ from typing import List
44
+ from typing import Set
45
+ from typing import Tuple
46
+ from typing import Union
47
+
48
+ from kubernetes.client import V1Deployment
49
+ from kubernetes.client import V1StatefulSet
50
+ from pysensu_yelp import Status
51
+
52
+ from paasta_tools.eks_tools import EksDeploymentConfig
53
+ from paasta_tools.eks_tools import load_eks_service_config
54
+ from paasta_tools.kubernetes.application.controller_wrappers import DeploymentWrapper
55
+ from paasta_tools.kubernetes.application.controller_wrappers import StatefulSetWrapper
56
+ from paasta_tools.kubernetes.application.tools import Application
57
+ from paasta_tools.kubernetes.application.tools import list_all_applications
58
+ from paasta_tools.kubernetes_tools import KubeClient
59
+ from paasta_tools.kubernetes_tools import KubernetesDeploymentConfig
60
+ from paasta_tools.kubernetes_tools import load_kubernetes_service_config
61
+ from paasta_tools.monitoring_tools import send_event
62
+ from paasta_tools.utils import _log
63
+ from paasta_tools.utils import DEFAULT_SOA_DIR
64
+ from paasta_tools.utils import get_services_for_cluster
65
+ from paasta_tools.utils import load_system_paasta_config
66
+
67
+ log = logging.getLogger(__name__)
68
+ APPLICATION_TYPES = [V1StatefulSet, V1Deployment]
69
+
70
+
71
+ class DontKillEverythingError(Exception):
72
+ pass
73
+
74
+
75
+ class StatefulSetsAreNotSupportedError(Exception):
76
+ pass
77
+
78
+
79
+ @contextmanager
80
+ def alert_state_change(application: Application, cluster: str) -> Generator:
81
+ service = application.kube_deployment.service
82
+ instance = application.kube_deployment.instance
83
+ try:
84
+ yield
85
+ log_line = (
86
+ "Deleted stale Kubernetes apps that looks lost: %s"
87
+ % application.item.metadata.name
88
+ )
89
+ _log(
90
+ service=service,
91
+ component="deploy",
92
+ level="event",
93
+ cluster=cluster,
94
+ instance=instance,
95
+ line=log_line,
96
+ )
97
+
98
+ except Exception:
99
+ loglines = ["Exception raised during cleanup of service %s:" % application]
100
+ loglines.extend(traceback.format_exc().rstrip().split("\n"))
101
+ for logline in loglines:
102
+ _log(
103
+ service=service,
104
+ component="deploy",
105
+ level="debug",
106
+ cluster=cluster,
107
+ instance=instance,
108
+ line=logline,
109
+ )
110
+ raise
111
+
112
+
113
+ def instance_is_not_bouncing(
114
+ instance_config: Union[KubernetesDeploymentConfig, EksDeploymentConfig],
115
+ applications: List[Application],
116
+ ) -> bool:
117
+ """
118
+
119
+ :param instance_config: a KubernetesDeploymentConfig or an EksDeploymentConfig with the configuration of the instance
120
+ :param applications: a list of all deployments or stateful sets on the cluster that match the service
121
+ and instance of provided instance_config
122
+ """
123
+ for application in applications:
124
+ if isinstance(application, DeploymentWrapper):
125
+ existing_app = application.item
126
+ if (
127
+ (
128
+ existing_app.metadata.namespace != instance_config.get_namespace()
129
+ and (instance_config.get_bounce_method() == "downthenup")
130
+ )
131
+ or (
132
+ existing_app.metadata.namespace == instance_config.get_namespace()
133
+ and (
134
+ instance_config.get_instances()
135
+ <= (existing_app.status.ready_replicas or 0)
136
+ )
137
+ )
138
+ ) or instance_config.get_desired_state() == "stop":
139
+ return True
140
+
141
+ elif (
142
+ isinstance(application, StatefulSetWrapper)
143
+ and application.item.metadata.namespace != instance_config.get_namespace()
144
+ ):
145
+ log.critical(
146
+ "Paasta detected a StatefulSet that was migrated to a new namespace"
147
+ "StatefulSet bouncing across namespaces is not supported"
148
+ )
149
+ raise StatefulSetsAreNotSupportedError
150
+ return False
151
+
152
+
153
+ def get_applications_to_kill(
154
+ applications_dict: Dict[Tuple[str, str], List[Application]],
155
+ cluster: str,
156
+ valid_services: Set[Tuple[str, str]],
157
+ soa_dir: str,
158
+ eks: bool = False,
159
+ ) -> List[Application]:
160
+ """
161
+
162
+ :param applications_dict: A dictionary with (service, instance) as keys and a list of applications for each tuple
163
+ :param cluster: paasta cluster
164
+ :param valid_services: a set with the valid (service, instance) tuples for this cluster
165
+ :param soa_dir: The SOA config directory to read from
166
+ :return: list of applications to kill
167
+ """
168
+ log.info("Determining apps to be killed")
169
+
170
+ applications_to_kill: List[Application] = []
171
+ for (service, instance), applications in applications_dict.items():
172
+ if len(applications) >= 1:
173
+ if (service, instance) not in valid_services:
174
+ applications_to_kill.extend(applications)
175
+ else:
176
+ instance_config: Union[KubernetesDeploymentConfig, EksDeploymentConfig]
177
+ if eks:
178
+ instance_config = load_eks_service_config(
179
+ cluster=cluster,
180
+ service=service,
181
+ instance=instance,
182
+ soa_dir=soa_dir,
183
+ )
184
+ else:
185
+ instance_config = load_kubernetes_service_config(
186
+ cluster=cluster,
187
+ service=service,
188
+ instance=instance,
189
+ soa_dir=soa_dir,
190
+ )
191
+ try:
192
+ not_bouncing = instance_is_not_bouncing(
193
+ instance_config, applications
194
+ )
195
+ except StatefulSetsAreNotSupportedError:
196
+ overrides = {
197
+ "page": True,
198
+ "alert_after": 0,
199
+ "tip": f"Revert {service}.{instance} in soa-configs to not include the namespace key.",
200
+ "runbook": "y/rb-paasta-namespace",
201
+ "ticket": True,
202
+ }
203
+ send_event(
204
+ service=service,
205
+ check_name=f"statefulset_bounce_{service}.{instance}",
206
+ overrides=overrides,
207
+ status=Status.CRITICAL, # type: ignore
208
+ output=f"Unsupported bounce: {service}.{instance}. PaaSTA managed StatefulSets do not support custom namespace",
209
+ soa_dir=soa_dir,
210
+ )
211
+ else:
212
+ for application in applications:
213
+ if (
214
+ application.kube_deployment.namespace
215
+ != instance_config.get_namespace()
216
+ and not_bouncing
217
+ ):
218
+ applications_to_kill.append(application)
219
+ return applications_to_kill
220
+
221
+
222
+ def cleanup_unused_apps(
223
+ soa_dir: str,
224
+ cluster: str,
225
+ kill_threshold: float = 0.5,
226
+ force: bool = False,
227
+ eks: bool = False,
228
+ ) -> None:
229
+ """Clean up old or invalid jobs/apps from kubernetes. Retrieves
230
+ both a list of apps currently in kubernetes and a list of valid
231
+ app ids in order to determine what to kill.
232
+
233
+ :param soa_dir: The SOA config directory to read from
234
+ :param cluster: paasta cluster to clean
235
+ :param kill_threshold: The decimal fraction of apps we think is
236
+ sane to kill when this job runs.
237
+ :param force: Force the cleanup if we are above the kill_threshold"""
238
+ log.info("Creating KubeClient")
239
+ kube_client = KubeClient()
240
+
241
+ log.info("Loading running Kubernetes apps")
242
+ applications_dict = list_all_applications(kube_client, APPLICATION_TYPES)
243
+ log.info("Retrieving valid apps from yelpsoa_configs")
244
+ valid_services = set(
245
+ get_services_for_cluster(
246
+ instance_type="eks" if eks else "kubernetes", soa_dir=soa_dir
247
+ )
248
+ )
249
+
250
+ applications_to_kill: List[Application] = get_applications_to_kill(
251
+ applications_dict, cluster, valid_services, soa_dir, eks
252
+ )
253
+
254
+ log.debug("Running apps: %s" % list(applications_dict))
255
+ log.debug("Valid apps: %s" % valid_services)
256
+ log.debug("Terminating: %s" % applications_to_kill)
257
+ if applications_to_kill:
258
+ above_kill_threshold = float(len(applications_to_kill)) / float(
259
+ len(applications_dict)
260
+ ) > float(kill_threshold)
261
+ if above_kill_threshold and not force:
262
+ log.critical(
263
+ "Paasta was about to kill more than %s of the running services, this "
264
+ "is probably a BAD mistake!, run again with --force if you "
265
+ "really need to destroy everything" % kill_threshold
266
+ )
267
+ raise DontKillEverythingError
268
+
269
+ for applicaton in applications_to_kill:
270
+ with alert_state_change(applicaton, cluster):
271
+ applicaton.deep_delete(kube_client)
272
+
273
+
274
+ def parse_args(argv):
275
+ parser = argparse.ArgumentParser(description="Cleans up stale kubernetes jobs.")
276
+ parser.add_argument(
277
+ "-d",
278
+ "--soa-dir",
279
+ dest="soa_dir",
280
+ metavar="SOA_DIR",
281
+ default=DEFAULT_SOA_DIR,
282
+ help="define a different soa config directory",
283
+ )
284
+ parser.add_argument(
285
+ "-c",
286
+ "--cluster",
287
+ dest="cluster",
288
+ default=load_system_paasta_config().get_cluster(),
289
+ help="paasta cluster",
290
+ )
291
+ parser.add_argument(
292
+ "-t",
293
+ "--kill-threshold",
294
+ dest="kill_threshold",
295
+ default=0.5,
296
+ help="The decimal fraction of apps we think is "
297
+ "sane to kill when this job runs",
298
+ )
299
+ parser.add_argument(
300
+ "-v", "--verbose", action="store_true", dest="verbose", default=False
301
+ )
302
+ parser.add_argument(
303
+ "-f",
304
+ "--force",
305
+ action="store_true",
306
+ dest="force",
307
+ default=False,
308
+ help="Force the cleanup if we are above the " "kill_threshold",
309
+ )
310
+ parser.add_argument(
311
+ "--eks",
312
+ help="This flag cleans up only k8 services that shouldn't be running on EKS leaving instances from eks-*.yaml files",
313
+ dest="eks",
314
+ action="store_true",
315
+ default=False,
316
+ )
317
+ return parser.parse_args(argv)
318
+
319
+
320
+ def main(argv=None) -> None:
321
+ args = parse_args(argv)
322
+ soa_dir = args.soa_dir
323
+ kill_threshold = args.kill_threshold
324
+ force = args.force
325
+ cluster = args.cluster
326
+ eks = args.eks
327
+ if args.verbose:
328
+ logging.basicConfig(level=logging.DEBUG)
329
+ else:
330
+ logging.basicConfig(level=logging.WARNING)
331
+ try:
332
+ cleanup_unused_apps(
333
+ soa_dir,
334
+ cluster=cluster,
335
+ kill_threshold=kill_threshold,
336
+ force=force,
337
+ eks=eks,
338
+ )
339
+ except DontKillEverythingError:
340
+ sys.exit(1)
341
+
342
+
343
+ if __name__ == "__main__":
344
+ main()
@@ -0,0 +1,35 @@
1
+ #!python
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()