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,174 @@
1
+ #!/usr/bin/env python
2
+ # Copyright 2015-2016 Yelp Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ from typing import List
16
+ from typing import Tuple
17
+
18
+ from paasta_tools.api.client import get_paasta_oapi_client
19
+ from paasta_tools.cli.cmds.status import get_envoy_status_human
20
+ from paasta_tools.cli.cmds.status import get_smartstack_status_human
21
+ from paasta_tools.cli.utils import figure_out_service_name
22
+ from paasta_tools.cli.utils import get_instance_configs_for_service
23
+ from paasta_tools.cli.utils import get_paasta_oapi_api_clustername
24
+ from paasta_tools.cli.utils import lazy_choices_completer
25
+ from paasta_tools.cli.utils import verify_instances
26
+ from paasta_tools.eks_tools import EksDeploymentConfig
27
+ from paasta_tools.utils import DEFAULT_SOA_DIR
28
+ from paasta_tools.utils import list_clusters
29
+ from paasta_tools.utils import list_services
30
+ from paasta_tools.utils import load_system_paasta_config
31
+ from paasta_tools.utils import PaastaColors
32
+ from paasta_tools.utils import SystemPaastaConfig
33
+
34
+
35
+ def add_subparser(subparsers) -> None:
36
+ mesh_status_parser = subparsers.add_parser(
37
+ "mesh-status",
38
+ help="Display the mesh status of a PaaSTA service.",
39
+ description=(
40
+ "'paasta mesh-status' queries the PaaSTA API in order to report "
41
+ "on the health of a PaaSTA service in the mesh."
42
+ ),
43
+ )
44
+ mesh_status_parser.add_argument(
45
+ "-s",
46
+ "--service",
47
+ type=str,
48
+ help="The name of the service you wish to inspect",
49
+ required=True,
50
+ ).completer = lazy_choices_completer(list_services)
51
+ mesh_status_parser.add_argument(
52
+ "-i",
53
+ "--instance",
54
+ type=str,
55
+ help="The name of the instance of the service you wish to inspect",
56
+ required=True,
57
+ ) # No completer because we need to know service first and we can't until some other stuff has happened
58
+ mesh_status_parser.add_argument(
59
+ "-c",
60
+ "--cluster",
61
+ type=str,
62
+ help="The name of the cluster in which the instance runs",
63
+ required=True,
64
+ ).completer = lazy_choices_completer(list_clusters)
65
+ mesh_status_parser.add_argument(
66
+ "-d",
67
+ "--soa-dir",
68
+ dest="soa_dir",
69
+ metavar="SOA_DIR",
70
+ default=DEFAULT_SOA_DIR,
71
+ help="define a different soa config directory",
72
+ )
73
+ mesh_status_parser.set_defaults(command=paasta_mesh_status)
74
+
75
+
76
+ def paasta_mesh_status_on_api_endpoint(
77
+ cluster: str,
78
+ service: str,
79
+ instance: str,
80
+ system_paasta_config: SystemPaastaConfig,
81
+ soa_dir: str = DEFAULT_SOA_DIR,
82
+ ) -> Tuple[int, List[str]]:
83
+ instance_config = next(
84
+ get_instance_configs_for_service(
85
+ service=service,
86
+ soa_dir=soa_dir,
87
+ clusters=[cluster],
88
+ instances=[instance],
89
+ ),
90
+ None,
91
+ )
92
+ if not instance_config:
93
+ print(
94
+ "ERROR: Could not find config files for this service instance in soaconfigs. Maybe you mispelled an argument?"
95
+ )
96
+ exit(1)
97
+
98
+ client = get_paasta_oapi_client(
99
+ cluster=get_paasta_oapi_api_clustername(
100
+ cluster,
101
+ is_eks=(instance_config.__class__ == EksDeploymentConfig),
102
+ ),
103
+ system_paasta_config=system_paasta_config,
104
+ )
105
+ if not client:
106
+ print("ERROR: Cannot get a paasta-api client")
107
+ exit(1)
108
+
109
+ try:
110
+ mesh_status = client.service.mesh_instance(
111
+ service=service,
112
+ instance=instance,
113
+ )
114
+ except client.api_error as exc:
115
+ # 405 (method not allowed) is returned for instances that are not configured
116
+ # for the mesh, or for which getting mesh status is not supported
117
+ return (
118
+ exc.status,
119
+ [PaastaColors.red(exc.body if exc.status == 405 else exc.reason)],
120
+ )
121
+ except (client.connection_error, client.timeout_error) as exc:
122
+ return (
123
+ 1,
124
+ [PaastaColors.red(f"Could not connect to API: {exc.__class__.__name__}")],
125
+ )
126
+ except Exception as e:
127
+ output = [PaastaColors.red(f"Exception when talking to the API:")]
128
+ output.extend(str(e).split("\n"))
129
+ return 1, output
130
+
131
+ output = []
132
+ if mesh_status.smartstack is not None:
133
+ smartstack_status_human = get_smartstack_status_human(
134
+ mesh_status.smartstack.registration,
135
+ mesh_status.smartstack.expected_backends_per_location,
136
+ mesh_status.smartstack.locations,
137
+ )
138
+ output.extend(smartstack_status_human)
139
+ if mesh_status.envoy is not None:
140
+ envoy_status_human = get_envoy_status_human(
141
+ mesh_status.envoy.registration,
142
+ mesh_status.envoy.expected_backends_per_location,
143
+ mesh_status.envoy.locations,
144
+ )
145
+ output.extend(envoy_status_human)
146
+
147
+ return 0, output
148
+
149
+
150
+ def paasta_mesh_status(args) -> int:
151
+ system_paasta_config = load_system_paasta_config()
152
+
153
+ # validate args, funcs have their own error output
154
+ service = figure_out_service_name(args, args.soa_dir)
155
+ if verify_instances(args.instance, service, [args.cluster], args.soa_dir):
156
+ return 1
157
+
158
+ return_code, mesh_output = paasta_mesh_status_on_api_endpoint(
159
+ cluster=args.cluster,
160
+ service=service,
161
+ instance=args.instance,
162
+ system_paasta_config=system_paasta_config,
163
+ soa_dir=args.soa_dir,
164
+ )
165
+
166
+ output = [
167
+ f"service: {service}",
168
+ f"cluster: {args.cluster}",
169
+ f"instance: {PaastaColors.cyan(args.instance)}",
170
+ ]
171
+ output.extend([" " + line for line in mesh_output])
172
+ print("\n".join(output))
173
+
174
+ return return_code
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env python
2
+ # Copyright 2015-2016 Yelp Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ from paasta_tools.autoscaling.pause_service_autoscaler import (
16
+ delete_service_autoscale_pause_time,
17
+ )
18
+ from paasta_tools.autoscaling.pause_service_autoscaler import (
19
+ get_service_autoscale_pause_time,
20
+ )
21
+ from paasta_tools.autoscaling.pause_service_autoscaler import (
22
+ update_service_autoscale_pause_time,
23
+ )
24
+ from paasta_tools.utils import _log_audit
25
+
26
+ MAX_PAUSE_DURATION = 320
27
+
28
+
29
+ def add_subparser(subparsers):
30
+ status_parser = subparsers.add_parser(
31
+ "pause_service_autoscaler",
32
+ help="Pause the service autoscaler for an entire cluster",
33
+ description=(
34
+ "'paasta pause_service_autoscaler is used to pause the paasta service autoscaler "
35
+ "for an entire paasta cluster. "
36
+ ),
37
+ )
38
+ status_parser.add_argument(
39
+ "-c",
40
+ "--cluster",
41
+ dest="cluster",
42
+ help="which cluster to pause autoscaling in. ie. pnw-prod",
43
+ )
44
+ status_parser.add_argument(
45
+ "-d",
46
+ "--pause-duration",
47
+ default=120,
48
+ dest="duration",
49
+ type=int,
50
+ help="How long to pause the autoscaler for, defaults to %(default)s minutes",
51
+ )
52
+ status_parser.add_argument(
53
+ "-f",
54
+ "--force",
55
+ help="Force pause for longer than max duration",
56
+ action="store_true",
57
+ dest="force",
58
+ default=False,
59
+ )
60
+ status_parser.add_argument(
61
+ "-i",
62
+ "--info",
63
+ help="Print when the autoscaler is paused until",
64
+ action="store_true",
65
+ dest="info",
66
+ default=False,
67
+ )
68
+ status_parser.add_argument(
69
+ "-r",
70
+ "--resume",
71
+ help="Resume autoscaling (unpause) in a cluster",
72
+ action="store_true",
73
+ dest="resume",
74
+ default=False,
75
+ )
76
+
77
+ status_parser.set_defaults(command=paasta_pause_service_autoscaler)
78
+
79
+
80
+ def paasta_pause_service_autoscaler(args):
81
+ """With a given cluster and duration, pauses the paasta service autoscaler
82
+ in that cluster for duration minutes"""
83
+ if args.duration > MAX_PAUSE_DURATION:
84
+ if not args.force:
85
+ print(
86
+ "Specified duration: {d} longer than max: {m}".format(
87
+ d=args.duration, m=MAX_PAUSE_DURATION
88
+ )
89
+ )
90
+ print("If you are really sure, run again with --force")
91
+ return 3
92
+
93
+ if args.info:
94
+ return_code = get_service_autoscale_pause_time(args.cluster)
95
+ elif args.resume:
96
+ return_code = delete_service_autoscale_pause_time(args.cluster)
97
+ _log_audit(action="resume-service-autoscaler", cluster=args.cluster)
98
+ else:
99
+ minutes = args.duration
100
+ return_code = update_service_autoscale_pause_time(args.cluster, minutes)
101
+ _log_audit(
102
+ action="pause-service-autoscaler",
103
+ action_details={"duration": minutes},
104
+ cluster=args.cluster,
105
+ )
106
+
107
+ return return_code
@@ -0,0 +1,275 @@
1
+ #!/usr/bin/env python
2
+ # Copyright 2015-2016 Yelp Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ """Contains methods used by the paasta client to upload a docker
16
+ image to a registry.
17
+ """
18
+ import argparse
19
+ import base64
20
+ import binascii
21
+ import json
22
+ import os
23
+ from typing import Optional
24
+ from typing import Tuple
25
+
26
+ import requests
27
+ from requests.exceptions import RequestException
28
+ from requests.exceptions import SSLError
29
+
30
+ from paasta_tools.cli.utils import get_jenkins_build_output_url
31
+ from paasta_tools.cli.utils import validate_full_git_sha
32
+ from paasta_tools.cli.utils import validate_service_name
33
+ from paasta_tools.generate_deployments_for_service import build_docker_image_name
34
+ from paasta_tools.utils import _log
35
+ from paasta_tools.utils import _log_audit
36
+ from paasta_tools.utils import _run
37
+ from paasta_tools.utils import build_docker_tag
38
+ from paasta_tools.utils import build_image_identifier
39
+ from paasta_tools.utils import DEFAULT_SOA_DIR
40
+ from paasta_tools.utils import get_service_docker_registry
41
+
42
+
43
+ def add_subparser(subparsers: argparse._SubParsersAction) -> None:
44
+ list_parser = subparsers.add_parser(
45
+ "push-to-registry",
46
+ help="Uploads a docker image to a registry",
47
+ description=(
48
+ "'paasta push-to-registry' is a tool to upload a local docker image "
49
+ "to the configured PaaSTA docker registry with a predictable and "
50
+ "well-constructed image name. The image name must be predictable because "
51
+ "the other PaaSTA components are expecting a particular format for the docker "
52
+ "image name."
53
+ ),
54
+ epilog=(
55
+ "Note: Uploading to a docker registry often requires access to the local "
56
+ "docker socket as well as credentials to the remote registry"
57
+ ),
58
+ )
59
+ list_parser.add_argument(
60
+ "-s",
61
+ "--service",
62
+ help='Name of service for which you wish to upload a docker image. Leading "services-", '
63
+ "as included in a Jenkins job name, will be stripped.",
64
+ required=True,
65
+ )
66
+ list_parser.add_argument(
67
+ "-c",
68
+ "--commit",
69
+ help="Git sha after which to name the remote image",
70
+ required=True,
71
+ type=validate_full_git_sha,
72
+ )
73
+ list_parser.add_argument(
74
+ "--image-version",
75
+ type=str,
76
+ required=False,
77
+ default=None,
78
+ help=(
79
+ "Extra version metadata to use when naming the remote image."
80
+ " When set, both versioned and non-versioned Docker tags are"
81
+ " pushed to the registry. The image with a versioned tag is"
82
+ " expected to have been build locally."
83
+ ),
84
+ )
85
+ list_parser.add_argument(
86
+ "-d",
87
+ "--soa-dir",
88
+ dest="soa_dir",
89
+ metavar="SOA_DIR",
90
+ default=DEFAULT_SOA_DIR,
91
+ help="define a different soa config directory",
92
+ )
93
+ list_parser.add_argument(
94
+ "-f",
95
+ "--force",
96
+ help=(
97
+ "Do not check if the image is already in the PaaSTA docker registry. "
98
+ "Push it anyway."
99
+ ),
100
+ action="store_true",
101
+ )
102
+ list_parser.set_defaults(command=paasta_push_to_registry)
103
+
104
+
105
+ def build_command(
106
+ upstream_job_name: str,
107
+ upstream_git_commit: str,
108
+ image_version: Optional[str] = None,
109
+ ) -> str:
110
+ # This is kinda dumb since we just cleaned the 'services-' off of the
111
+ # service so we could validate it, but the Docker image will have the full
112
+ # name with 'services-' so add it back.
113
+ tag = build_docker_tag(upstream_job_name, upstream_git_commit, image_version)
114
+ cmd = f"docker push {tag}"
115
+ return cmd
116
+
117
+
118
+ def paasta_push_to_registry_impl(
119
+ args: argparse.Namespace, service: str, image_version: Optional[str]
120
+ ) -> int:
121
+ """Upload a docker image to a registry"""
122
+ image_identifier = build_image_identifier(args.commit, None, image_version)
123
+
124
+ if not args.force:
125
+ try:
126
+ if is_docker_image_already_in_registry(
127
+ service, args.soa_dir, args.commit, image_version
128
+ ):
129
+ print(
130
+ "The docker image is already in the PaaSTA docker registry. "
131
+ "I'm NOT overriding the existing image. "
132
+ "Add --force to override the image in the registry if you are sure what you are doing."
133
+ )
134
+ return 0
135
+ except RequestException as e:
136
+ registry_uri = get_service_docker_registry(service, args.soa_dir)
137
+ print(
138
+ "Can not connect to the PaaSTA docker registry '%s' to verify if this image exists.\n"
139
+ "%s" % (registry_uri, str(e))
140
+ )
141
+ return 1
142
+
143
+ cmd = build_command(service, args.commit, image_version)
144
+ loglines = []
145
+ returncode, output = _run(
146
+ cmd,
147
+ timeout=3600,
148
+ log=True,
149
+ component="build",
150
+ service=service,
151
+ loglevel="debug",
152
+ )
153
+ if returncode != 0:
154
+ loglines.append("ERROR: Failed to promote image for %s." % image_identifier)
155
+ output = get_jenkins_build_output_url()
156
+ if output:
157
+ loglines.append("See output: %s" % output)
158
+ else:
159
+ loglines.append(
160
+ "Successfully pushed image for %s to registry" % image_identifier
161
+ )
162
+ _log_audit(
163
+ action="push-to-registry",
164
+ action_details={"commit": args.commit},
165
+ service=service,
166
+ )
167
+ for logline in loglines:
168
+ _log(service=service, line=logline, component="build", level="event")
169
+ return returncode
170
+
171
+
172
+ def paasta_push_to_registry(args: argparse.Namespace) -> int:
173
+ """Upload a docker images to a registry"""
174
+ service = args.service
175
+ if service and service.startswith("services-"):
176
+ service = service.split("services-", 1)[1]
177
+ validate_service_name(service, args.soa_dir)
178
+
179
+ returncode = 0
180
+ image_versions = [None]
181
+ if args.image_version:
182
+ # re-tag with legacy convention as well
183
+ returncode = retag_versioned_image(service, args.commit, args.image_version)
184
+ if returncode != 0:
185
+ _log(
186
+ service=service,
187
+ line=f"ERROR: failed re-tagging image. See output at {get_jenkins_build_output_url()}",
188
+ component="build",
189
+ level="event",
190
+ )
191
+ return returncode
192
+ image_versions.append(args.image_version)
193
+
194
+ for image_version in image_versions:
195
+ returncode = paasta_push_to_registry_impl(args, service, image_version)
196
+ if returncode != 0:
197
+ break
198
+
199
+ return returncode
200
+
201
+
202
+ def retag_versioned_image(service: str, commit: str, image_version: str) -> int:
203
+ """Create new local tag without additional version information
204
+
205
+ :param str service: service name
206
+ :param str commit: commit sha
207
+ :param str image_version: additional image version metadata
208
+ :return: docker command return code
209
+ """
210
+ unversioned_tag = build_docker_tag(service, commit, None)
211
+ image_version_tag = build_docker_tag(service, commit, image_version)
212
+ returncode, _ = _run(
213
+ ["docker", "tag", image_version_tag, unversioned_tag],
214
+ timeout=30,
215
+ log=True,
216
+ component="build",
217
+ service=service,
218
+ loglevel="debug",
219
+ )
220
+ return returncode
221
+
222
+
223
+ def read_docker_registry_creds(
224
+ registry_uri: str,
225
+ ) -> Tuple[Optional[str], Optional[str]]:
226
+ dockercfg_path = os.path.expanduser("~/.dockercfg")
227
+ try:
228
+ with open(dockercfg_path) as f:
229
+ dockercfg = json.load(f)
230
+ auth = base64.b64decode(dockercfg[registry_uri]["auth"]).decode("utf-8")
231
+ first_colon = auth.find(":")
232
+ if first_colon != -1:
233
+ return (auth[:first_colon], auth[first_colon + 1 : -2])
234
+ except IOError: # Can't open ~/.dockercfg
235
+ pass
236
+ except json.JSONDecodeError: # JSON decoder error
237
+ pass
238
+ except binascii.Error: # base64 decode error
239
+ pass
240
+ return (None, None)
241
+
242
+
243
+ def is_docker_image_already_in_registry(service: str, soa_dir: str, sha: str, image_version: Optional[str] = None) -> bool: # type: ignore
244
+ """Verifies that docker image exists in the paasta registry.
245
+
246
+ :param service: name of the service
247
+ :param sha: git sha
248
+ :returns: True, False or raises requests.exceptions.RequestException
249
+ """
250
+ registry_uri = get_service_docker_registry(service, soa_dir)
251
+ repository, tag = build_docker_image_name(service, sha, image_version).split(":", 1)
252
+
253
+ creds = read_docker_registry_creds(registry_uri)
254
+ uri = f"{registry_uri}/v2/{repository}/manifests/{tag}"
255
+
256
+ with requests.Session() as s:
257
+ try:
258
+ url = "https://" + uri
259
+ r = (
260
+ s.head(url, timeout=30)
261
+ if creds[0] is None
262
+ else s.head(url, auth=creds, timeout=30)
263
+ )
264
+ except SSLError:
265
+ # If no auth creds, fallback to trying http
266
+ if creds[0] is not None:
267
+ raise
268
+ url = "http://" + uri
269
+ r = s.head(url, timeout=30)
270
+
271
+ if r.status_code == 200:
272
+ return True
273
+ elif r.status_code == 404:
274
+ return False # No Such Repository Error
275
+ r.raise_for_status()