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,255 @@
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
+ r"""
16
+ Creates a deployments.json file in the specified SOA configuration directory.
17
+ This file contains a dictionary of k/v pairs representing a map between remote
18
+ deploy groups of a service's Git repository and the current SHA at the tip of that deploy group.
19
+ This is done by specifying a 'deploy_group' key in a service instance's configuration,
20
+ or if there is no 'docker_image' key in the configuration, a deploy group name
21
+ is assumed to be paasta-{cluster}-{instance}, where cluster is the cluster
22
+ the configuration is for and instance is the instance name.
23
+
24
+ For example, if the service paasta_test has an instance called main with no
25
+ deploy group in its configuration in the hab cluster, then this script
26
+ will create a key/value pair of 'paasta_test:paasta-hab.main': 'services-paasta_test:paasta-SHA',
27
+ where SHA is the current SHA at the tip of the branch named hab in
28
+ git@github.yelpcorp.com:services/paasta_test.git. If main had a deploy_group key with
29
+ a value of 'master', the key would be paasta_test:master instead, and the SHA
30
+ would be the SHA at the tip of master.
31
+
32
+ This is done for all services in the SOA configuration directory, across any
33
+ service configuration files (filename is 'kubernetes-\*.yaml').
34
+
35
+ Command line options:
36
+
37
+ - -d <SOA_DIR>, --soa-dir <SOA_DIR>: Specify a SOA config dir to read from
38
+ - -v, --verbose: Verbose output
39
+ """
40
+ import argparse
41
+ import concurrent.futures
42
+ import json
43
+ import logging
44
+ import os
45
+ import re
46
+ from typing import Any
47
+ from typing import Dict
48
+ from typing import List
49
+ from typing import Optional
50
+ from typing import Tuple
51
+
52
+ from mypy_extensions import TypedDict
53
+
54
+ from paasta_tools import remote_git
55
+ from paasta_tools.cli.utils import get_instance_configs_for_service
56
+ from paasta_tools.utils import atomic_file_write
57
+ from paasta_tools.utils import DEFAULT_SOA_DIR
58
+ from paasta_tools.utils import get_git_url
59
+ from paasta_tools.utils import get_latest_deployment_tag
60
+
61
+ log = logging.getLogger(__name__)
62
+ TARGET_FILE = "deployments.json"
63
+
64
+
65
+ V1_Mapping = TypedDict(
66
+ "V1_Mapping", {"docker_image": str, "desired_state": str, "force_bounce": str}
67
+ )
68
+ V2_Deployment = TypedDict(
69
+ "V2_Deployment",
70
+ {"docker_image": str, "git_sha": str, "image_version": Optional[str]},
71
+ )
72
+ V2_Control = TypedDict("V2_Control", {"desired_state": str, "force_bounce": str})
73
+ V2_Mappings = TypedDict(
74
+ "V2_Mappings",
75
+ {"deployments": Dict[str, V2_Deployment], "controls": Dict[str, V2_Control]},
76
+ )
77
+
78
+
79
+ DeploymentsDict = TypedDict(
80
+ "DeploymentsDict", {"v1": Dict[str, V1_Mapping], "v2": V2_Mappings}
81
+ )
82
+
83
+
84
+ def parse_args() -> argparse.Namespace:
85
+ parser = argparse.ArgumentParser(
86
+ description="Creates deployments.json for paasta services."
87
+ )
88
+ parser.add_argument(
89
+ "-d",
90
+ "--soa-dir",
91
+ dest="soa_dir",
92
+ metavar="SOA_DIR",
93
+ default=DEFAULT_SOA_DIR,
94
+ help="define a different soa config directory",
95
+ )
96
+ parser.add_argument(
97
+ "-v", "--verbose", action="store_true", dest="verbose", default=False
98
+ )
99
+ parser.add_argument(
100
+ "-s",
101
+ "--service",
102
+ required=True,
103
+ help="Service name to make the deployments.json for",
104
+ )
105
+ args = parser.parse_args()
106
+ return args
107
+
108
+
109
+ def get_deploy_group_mappings(
110
+ soa_dir: str, service: str
111
+ ) -> Tuple[Dict[str, V1_Mapping], V2_Mappings]:
112
+ """Gets mappings from service:deploy_group to services-service:paasta-hash-image_version,
113
+ where hash is the current SHA at the HEAD of branch_name and image_version
114
+ can be used to provide additional version information for the Docker image.
115
+ This is done for all services in soa_dir.
116
+
117
+ :param soa_dir: The SOA configuration directory to read from
118
+ :returns: A dictionary mapping service:deploy_group to a dictionary
119
+ containing:
120
+
121
+ - 'docker_image': something like "services-service:paasta-hash". This is
122
+ relative to the paasta docker registry.
123
+ - 'desired_state': either 'start' or 'stop'. Says whether this branch
124
+ should be running.
125
+ - 'force_bounce': An arbitrary value, which may be None. A change in this
126
+ value should trigger a bounce, even if the other properties of this app
127
+ have not changed.
128
+ """
129
+ mappings: Dict[str, V1_Mapping] = {}
130
+ v2_mappings: V2_Mappings = {"deployments": {}, "controls": {}}
131
+ git_url = get_git_url(service=service, soa_dir=soa_dir)
132
+
133
+ # Most of the time of this function is in two parts:
134
+ # 1. getting remote refs from git. (Mostly IO, just waiting for git to get back to us.)
135
+ # 2. loading instance configs. (Mostly CPU, copy.deepcopying yaml over and over again)
136
+ # Let's do these two things in parallel.
137
+
138
+ executor = concurrent.futures.ThreadPoolExecutor(max_workers=1)
139
+ remote_refs_future = executor.submit(remote_git.list_remote_refs, git_url)
140
+
141
+ service_configs = get_instance_configs_for_service(soa_dir=soa_dir, service=service)
142
+
143
+ deploy_group_branch_mappings = {
144
+ config.get_branch(): config.get_deploy_group() for config in service_configs
145
+ }
146
+ if not deploy_group_branch_mappings:
147
+ log.info("Service %s has no valid deploy groups. Skipping.", service)
148
+ return mappings, v2_mappings
149
+
150
+ remote_refs = remote_refs_future.result()
151
+
152
+ tag_by_deploy_group = {
153
+ dg: get_latest_deployment_tag(remote_refs, dg)
154
+ for dg in set(deploy_group_branch_mappings.values())
155
+ }
156
+ state_by_branch_and_sha = get_desired_state_by_branch_and_sha(remote_refs)
157
+
158
+ for control_branch, deploy_group in deploy_group_branch_mappings.items():
159
+ (deploy_ref_name, deploy_ref_sha, image_version) = tag_by_deploy_group[
160
+ deploy_group
161
+ ]
162
+ if deploy_ref_name in remote_refs:
163
+ commit_sha = remote_refs[deploy_ref_name]
164
+ control_branch_alias = f"{service}:paasta-{control_branch}"
165
+ control_branch_alias_v2 = f"{service}:{control_branch}"
166
+ docker_image = build_docker_image_name(service, commit_sha, image_version)
167
+ desired_state, force_bounce = state_by_branch_and_sha.get(
168
+ (control_branch, deploy_ref_sha), ("start", None)
169
+ )
170
+ log.info("Mapping %s to docker image %s", control_branch, docker_image)
171
+
172
+ v2_mappings["deployments"][deploy_group] = {
173
+ "docker_image": docker_image,
174
+ "git_sha": commit_sha,
175
+ "image_version": image_version,
176
+ }
177
+ mappings[control_branch_alias] = {
178
+ "docker_image": docker_image,
179
+ "desired_state": desired_state,
180
+ "force_bounce": force_bounce,
181
+ }
182
+ v2_mappings["controls"][control_branch_alias_v2] = {
183
+ "desired_state": desired_state,
184
+ "force_bounce": force_bounce,
185
+ }
186
+ return mappings, v2_mappings
187
+
188
+
189
+ def build_docker_image_name(
190
+ service: str, sha: str, image_version: Optional[str] = None
191
+ ) -> str:
192
+ image_name = f"services-{service}:paasta-{sha}"
193
+ if image_version is not None:
194
+ image_name += f"-{image_version}"
195
+
196
+ return image_name
197
+
198
+
199
+ def get_desired_state_by_branch_and_sha(
200
+ remote_refs: Dict[str, str]
201
+ ) -> Dict[Tuple[str, str], Tuple[str, Any]]:
202
+ tag_pattern = r"^refs/tags/(?:paasta-){0,2}(?P<branch>[a-zA-Z0-9-_.]+)-(?P<force_bounce>[^-]+)-(?P<state>(start|stop))$"
203
+
204
+ states_by_branch_and_sha: Dict[Tuple[str, str], List[Tuple[str, Any]]] = {}
205
+
206
+ for ref_name, sha in remote_refs.items():
207
+ match = re.match(tag_pattern, ref_name)
208
+ if match:
209
+ gd = match.groupdict()
210
+ states_by_branch_and_sha.setdefault((gd["branch"], sha), []).append(
211
+ (gd["state"], gd["force_bounce"])
212
+ )
213
+
214
+ return {
215
+ (branch, sha): sorted(states, key=lambda x: x[1])[-1]
216
+ for ((branch, sha), states) in states_by_branch_and_sha.items()
217
+ }
218
+
219
+
220
+ def get_deployments_dict_from_deploy_group_mappings(
221
+ deploy_group_mappings: Dict[str, V1_Mapping], v2_deploy_group_mappings: V2_Mappings
222
+ ) -> DeploymentsDict:
223
+ return {"v1": deploy_group_mappings, "v2": v2_deploy_group_mappings}
224
+
225
+
226
+ def generate_deployments_for_service(service: str, soa_dir: str) -> None:
227
+ try:
228
+ with open(os.path.join(soa_dir, service, TARGET_FILE), "r") as oldf:
229
+ old_deployments_dict = json.load(oldf)
230
+ except (IOError, ValueError):
231
+ old_deployments_dict = {}
232
+ mappings, v2_mappings = get_deploy_group_mappings(soa_dir=soa_dir, service=service)
233
+
234
+ deployments_dict = get_deployments_dict_from_deploy_group_mappings(
235
+ mappings, v2_mappings
236
+ )
237
+ if deployments_dict != old_deployments_dict:
238
+ with atomic_file_write(os.path.join(soa_dir, service, TARGET_FILE)) as newf:
239
+ json.dump(deployments_dict, newf)
240
+
241
+
242
+ def main() -> None:
243
+ args = parse_args()
244
+ soa_dir = os.path.abspath(args.soa_dir)
245
+ service = args.service
246
+ if args.verbose:
247
+ logging.basicConfig(level=logging.DEBUG)
248
+ else:
249
+ logging.basicConfig(level=logging.WARNING)
250
+
251
+ generate_deployments_for_service(service=service, soa_dir=soa_dir)
252
+
253
+
254
+ if __name__ == "__main__":
255
+ main()
@@ -0,0 +1,114 @@
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
+ """
16
+ A simple script to enumerate all smartstack namespaces and output
17
+ a /etc/services compatible file
18
+ """
19
+ import argparse
20
+ import os
21
+
22
+ import service_configuration_lib
23
+
24
+ from paasta_tools.long_running_service_tools import get_all_namespaces
25
+ from paasta_tools.long_running_service_tools import get_all_namespaces_for_service
26
+ from paasta_tools.utils import atomic_file_write
27
+ from paasta_tools.utils import compose_job_id
28
+ from paasta_tools.utils import DEFAULT_SOA_DIR
29
+ from paasta_tools.utils import write_json_configuration_file
30
+ from paasta_tools.utils import write_yaml_configuration_file
31
+
32
+
33
+ YOCALHOST = "169.254.255.254"
34
+
35
+
36
+ def parse_args():
37
+ parser = argparse.ArgumentParser(description="")
38
+ parser.add_argument(
39
+ "-o", "--output", help="Output filename.", dest="output_filename", required=True
40
+ )
41
+ parser.add_argument(
42
+ "-f",
43
+ "--format",
44
+ help="Output format. Defaults to %(default)s",
45
+ dest="output_format",
46
+ choices=["rfc1700", "yaml", "json"],
47
+ default="rfc1700",
48
+ )
49
+ args = parser.parse_args()
50
+ return args
51
+
52
+
53
+ def get_service_lines_for_service(service):
54
+ lines = []
55
+ config = service_configuration_lib.read_service_configuration(service)
56
+ port = config.get("port", None)
57
+ description = config.get("description", "No description")
58
+
59
+ if port is not None:
60
+ lines.append("%s\t%d/tcp\t# %s" % (service, port, description))
61
+
62
+ for namespace, config in get_all_namespaces_for_service(service, full_name=False):
63
+ proxy_port = config.get("proxy_port", None)
64
+ if proxy_port is not None:
65
+ lines.append(
66
+ "%s\t%d/tcp\t# %s"
67
+ % (compose_job_id(service, namespace), proxy_port, description)
68
+ )
69
+ return lines
70
+
71
+
72
+ def generate_configuration():
73
+ service_data = get_all_namespaces()
74
+ config = {}
75
+ for (name, data) in service_data:
76
+ proxy_port = data.get("proxy_port")
77
+ if proxy_port is None:
78
+ continue
79
+ config[name] = {"host": YOCALHOST, "port": int(proxy_port)}
80
+ return config
81
+
82
+
83
+ def write_rfc1700_file(filename):
84
+ strings = [
85
+ "# This file is generated by generate_services_file",
86
+ "# DO NOT EDIT BY HAND",
87
+ ]
88
+ for service in sorted(os.listdir(DEFAULT_SOA_DIR)):
89
+ strings.extend(get_service_lines_for_service(service))
90
+ with atomic_file_write(filename) as fp:
91
+ fp.write("\n".join(strings))
92
+ fp.write("\n")
93
+
94
+
95
+ def main():
96
+ args = parse_args()
97
+ if args.output_format == "rfc1700":
98
+ write_rfc1700_file(filename=args.output_filename)
99
+ elif args.output_format in ("json", "yaml"):
100
+ writer = (
101
+ write_json_configuration_file
102
+ if args.output_format == "json"
103
+ else write_yaml_configuration_file
104
+ )
105
+ writer(
106
+ filename=args.output_filename,
107
+ configuration=generate_configuration(),
108
+ )
109
+ else:
110
+ raise (NotImplementedError)
111
+
112
+
113
+ if __name__ == "__main__":
114
+ main()
@@ -0,0 +1,30 @@
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
+ import argparse
16
+
17
+ from paasta_tools.generate_services_file import generate_configuration
18
+ from paasta_tools.utils import write_yaml_configuration_file
19
+
20
+
21
+ def main(argv=None):
22
+ parser = argparse.ArgumentParser()
23
+ parser.add_argument("output_path")
24
+ args = parser.parse_args(argv)
25
+
26
+ write_yaml_configuration_file(args.output_path, generate_configuration())
27
+
28
+
29
+ if __name__ == "__main__":
30
+ main()
@@ -0,0 +1,76 @@
1
+ # Copyright 2015-2016 Yelp Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ import re
15
+ from typing import Dict
16
+
17
+ import aiohttp
18
+ from mypy_extensions import TypedDict
19
+
20
+ from paasta_tools.utils import get_user_agent
21
+
22
+ HACHECK_TIMEOUT = aiohttp.ClientTimeout(total=45, connect=30, sock_read=10)
23
+
24
+ SpoolInfo = TypedDict(
25
+ "SpoolInfo",
26
+ {"service": str, "state": str, "since": float, "until": float, "reason": str},
27
+ total=False,
28
+ )
29
+
30
+
31
+ async def post_spool(url: str, status: str, data: Dict["str", "str"]) -> None:
32
+ async with aiohttp.ClientSession(timeout=HACHECK_TIMEOUT) as session:
33
+ async with session.post(
34
+ url, data=data, headers={"User-Agent": get_user_agent()}
35
+ ) as resp:
36
+ resp.raise_for_status()
37
+
38
+
39
+ async def get_spool(spool_url: str) -> SpoolInfo:
40
+ """Query hacheck for the state of a task, and parse the result into a dictionary."""
41
+ if spool_url is None:
42
+ return None
43
+
44
+ # TODO: aiohttp says not to create a session per request. Fix this.
45
+ async with aiohttp.ClientSession(timeout=HACHECK_TIMEOUT) as session:
46
+ async with session.get(
47
+ spool_url, headers={"User-Agent": get_user_agent()}
48
+ ) as response:
49
+ if response.status == 200:
50
+ return {"state": "up"}
51
+
52
+ regex = "".join(
53
+ [
54
+ "^",
55
+ r"Service (?P<service>.+)",
56
+ r" in (?P<state>.+) state",
57
+ r"(?: since (?P<since>[0-9.]+))?",
58
+ r"(?: until (?P<until>[0-9.]+))?",
59
+ r"(?:: (?P<reason>.*))?",
60
+ "$",
61
+ ]
62
+ )
63
+
64
+ response_text = await response.text()
65
+ match = re.match(regex, response_text)
66
+ groupdict = match.groupdict()
67
+ info: SpoolInfo = {}
68
+ info["service"] = groupdict["service"]
69
+ info["state"] = groupdict["state"]
70
+ if "since" in groupdict:
71
+ info["since"] = float(groupdict["since"] or 0)
72
+ if "until" in groupdict:
73
+ info["until"] = float(groupdict["until"] or 0)
74
+ if "reason" in groupdict:
75
+ info["reason"] = groupdict["reason"]
76
+ return info
File without changes
@@ -0,0 +1,122 @@
1
+ from typing import Optional
2
+
3
+ from kubernetes.client.models.v2beta2_object_metric_status import (
4
+ V2beta2ObjectMetricStatus,
5
+ )
6
+ from mypy_extensions import TypedDict
7
+
8
+
9
+ class HPAMetricsDict(TypedDict, total=False):
10
+ name: str
11
+ target_value: str
12
+ current_value: str
13
+
14
+
15
+ class HPAMetricsParser:
16
+ def __init__(self, hpa):
17
+ self.NAME = "name"
18
+ self.TARGET = "target_value"
19
+ self.CURRENT = "current_value"
20
+
21
+ def parse_target(self, metric) -> HPAMetricsDict:
22
+ """
23
+ Parse target metrics.
24
+ """
25
+ metric_spec = getattr(metric, metric.type.lower())
26
+ status: HPAMetricsDict = {}
27
+ switchers = {
28
+ "Pods": self.parse_pod_metric,
29
+ "External": self.parse_external_metric,
30
+ "Resource": self.parse_resource_metric,
31
+ "Object": self.parse_object_metric,
32
+ }
33
+ switchers[metric.type](metric_spec, status)
34
+ status["target_value"] = (
35
+ str(status["target_value"]) if status["target_value"] else "N/A"
36
+ )
37
+ return status
38
+
39
+ def parse_current(self, metric) -> Optional[HPAMetricsDict]:
40
+ """
41
+ Parse current metrics
42
+ """
43
+ status: HPAMetricsDict = {}
44
+
45
+ # Sometimes, when the custom metrics adapter is having a bad day, we get metric = {"type": ""}
46
+ # Try to gracefully handle that.
47
+ try:
48
+ metric_spec = getattr(metric, metric.type.lower())
49
+ except AttributeError:
50
+ return None
51
+
52
+ switchers = {
53
+ "Pods": self.parse_pod_metric_current,
54
+ "External": self.parse_external_metric_current,
55
+ "Resource": self.parse_resource_metric_current,
56
+ "Object": self.parse_object_metric_current,
57
+ }
58
+ switchers[metric.type](metric_spec, status)
59
+ status["current_value"] = (
60
+ str(status["current_value"]) if status["current_value"] else "N/A"
61
+ )
62
+ return status
63
+
64
+ def parse_external_metric(self, metric_spec, status: HPAMetricsDict):
65
+ status["name"] = metric_spec.metric.name
66
+ status["target_value"] = (
67
+ metric_spec.target.average_value
68
+ if getattr(metric_spec.target, "average_value")
69
+ else metric_spec.target.value
70
+ )
71
+
72
+ def parse_external_metric_current(self, metric_spec, status: HPAMetricsDict):
73
+ status["name"] = metric_spec.metric.name
74
+ status["current_value"] = (
75
+ metric_spec.current.average_value
76
+ if getattr(metric_spec.current, "average_value")
77
+ else metric_spec.current.value
78
+ )
79
+
80
+ def parse_pod_metric(self, metric_spec, status: HPAMetricsDict):
81
+ status["name"] = metric_spec.metric.name
82
+ status["target_value"] = metric_spec.target.average_value
83
+
84
+ def parse_pod_metric_current(self, metric_spec, status: HPAMetricsDict):
85
+ status["name"] = metric_spec.metric.name
86
+ status["current_value"] = metric_spec.current.average_value
87
+
88
+ def parse_resource_metric(self, metric_spec, status: HPAMetricsDict):
89
+ status["name"] = metric_spec.name
90
+ status["target_value"] = (
91
+ metric_spec.target.average_value
92
+ if getattr(metric_spec.target, "average_value")
93
+ else metric_spec.target.average_utilization
94
+ )
95
+
96
+ def parse_resource_metric_current(self, metric_spec, status: HPAMetricsDict):
97
+ status["name"] = metric_spec.name
98
+ status["current_value"] = (
99
+ metric_spec.current.average_value
100
+ if getattr(metric_spec.current, "average_value")
101
+ else metric_spec.current.average_utilization
102
+ )
103
+
104
+ def parse_object_metric(
105
+ self, metric_spec: V2beta2ObjectMetricStatus, status: HPAMetricsDict
106
+ ) -> None:
107
+ status["name"] = metric_spec.metric.name
108
+ status["target_value"] = (
109
+ metric_spec.target.average_value
110
+ if getattr(metric_spec.target, "average_value")
111
+ else metric_spec.target.value
112
+ )
113
+
114
+ def parse_object_metric_current(
115
+ self, metric_spec: V2beta2ObjectMetricStatus, status: HPAMetricsDict
116
+ ) -> None:
117
+ status["name"] = metric_spec.metric.name
118
+ status["current_value"] = (
119
+ metric_spec.current.average_value
120
+ if getattr(metric_spec.current, "average_value")
121
+ else metric_spec.current.value
122
+ )