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,334 @@
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 check whether Yelp service
16
+ passes all the markers required to be considered paasta ready."""
17
+ import os
18
+ import re
19
+
20
+ from paasta_tools.cli.cmds.validate import paasta_validate_soa_configs
21
+ from paasta_tools.cli.utils import figure_out_service_name
22
+ from paasta_tools.cli.utils import get_file_contents
23
+ from paasta_tools.cli.utils import get_instance_config
24
+ from paasta_tools.cli.utils import is_file_in_dir
25
+ from paasta_tools.cli.utils import lazy_choices_completer
26
+ from paasta_tools.cli.utils import NoSuchService
27
+ from paasta_tools.cli.utils import PaastaCheckMessages
28
+ from paasta_tools.cli.utils import success
29
+ from paasta_tools.cli.utils import validate_service_name
30
+ from paasta_tools.cli.utils import x_mark
31
+ from paasta_tools.long_running_service_tools import get_all_namespaces_for_service
32
+ from paasta_tools.monitoring_tools import get_team
33
+ from paasta_tools.utils import _run
34
+ from paasta_tools.utils import DEFAULT_SOA_DIR
35
+ from paasta_tools.utils import get_git_url
36
+ from paasta_tools.utils import get_pipeline_config
37
+ from paasta_tools.utils import get_pipeline_deploy_groups
38
+ from paasta_tools.utils import get_service_instance_list
39
+ from paasta_tools.utils import INSTANCE_TYPES
40
+ from paasta_tools.utils import list_clusters
41
+ from paasta_tools.utils import list_services
42
+ from paasta_tools.utils import PaastaColors
43
+
44
+
45
+ def add_subparser(subparsers):
46
+ help_text = (
47
+ "Determine whether service in pwd is 'paasta ready', checking for common "
48
+ "mistakes in the soa-configs directory and the local service directory. This "
49
+ "command is designed to be run from the 'root' of a service directory."
50
+ )
51
+ check_parser = subparsers.add_parser("check", description=help_text, help=help_text)
52
+ check_parser.add_argument(
53
+ "-s",
54
+ "--service",
55
+ help="The name of the service you wish to inspect. Defaults to autodetect.",
56
+ ).completer = lazy_choices_completer(list_services)
57
+ check_parser.add_argument(
58
+ "-y",
59
+ "--yelpsoa-config-root",
60
+ dest="yelpsoa_config_root",
61
+ help="A directory from which yelpsoa-configs should be read from",
62
+ default=DEFAULT_SOA_DIR,
63
+ )
64
+ check_parser.set_defaults(command=paasta_check)
65
+
66
+
67
+ def deploy_check(service_path):
68
+ """Check whether deploy.yaml exists in service directory. Prints success or
69
+ error message.
70
+
71
+ :param service_path: path to a directory containing deploy.yaml"""
72
+ if is_file_in_dir("deploy.yaml", service_path):
73
+ print(PaastaCheckMessages.DEPLOY_YAML_FOUND)
74
+ else:
75
+ print(PaastaCheckMessages.DEPLOY_YAML_MISSING)
76
+
77
+
78
+ def deploy_has_security_check(service, soa_dir):
79
+ pipeline = get_pipeline_config(service=service, soa_dir=soa_dir)
80
+ steps = [step["step"] for step in pipeline if not step.get("parallel")]
81
+ steps += [
82
+ substep["step"]
83
+ for step in pipeline
84
+ if step.get("parallel")
85
+ for substep in step.get("parallel")
86
+ ]
87
+ if "security-check" in steps:
88
+ print(PaastaCheckMessages.DEPLOY_SECURITY_FOUND)
89
+ return True
90
+ else:
91
+ print(PaastaCheckMessages.DEPLOY_SECURITY_MISSING)
92
+ return False
93
+
94
+
95
+ def docker_check():
96
+ """Check whether Dockerfile exists in service directory, and is valid.
97
+ Prints suitable message depending on outcome"""
98
+ docker_file_path = is_file_in_dir("Dockerfile", os.getcwd())
99
+ if docker_file_path:
100
+ print(PaastaCheckMessages.DOCKERFILE_FOUND)
101
+ else:
102
+ print(PaastaCheckMessages.DOCKERFILE_MISSING)
103
+
104
+
105
+ def makefile_responds_to(target):
106
+ """Runs `make --question <target>` to detect if a makefile responds to the
107
+ specified target."""
108
+ # According to http://www.gnu.org/software/make/manual/make.html#index-exit-status-of-make,
109
+ # 0 means OK, 1 means the target is not up to date, and 2 means error
110
+ returncode, _ = _run(["make", "--question", target], timeout=5)
111
+ return returncode != 2
112
+
113
+
114
+ def makefile_has_a_tab(makefile_path):
115
+ contents = get_file_contents(makefile_path)
116
+ return "\t" in contents
117
+
118
+
119
+ def makefile_has_docker_tag(makefile_path):
120
+ contents = get_file_contents(makefile_path)
121
+ return re.search(r"DOCKER_TAG\s*\?=", contents, re.MULTILINE) is not None
122
+
123
+
124
+ def makefile_check():
125
+ """Detects if you have a makefile and runs some sanity tests against
126
+ it to ensure it is paasta-ready"""
127
+ makefile_path = is_file_in_dir("Makefile", os.getcwd())
128
+ if makefile_path:
129
+ print(PaastaCheckMessages.MAKEFILE_FOUND)
130
+
131
+ if makefile_has_a_tab(makefile_path):
132
+ print(PaastaCheckMessages.MAKEFILE_HAS_A_TAB)
133
+ else:
134
+ print(PaastaCheckMessages.MAKEFILE_HAS_NO_TABS)
135
+
136
+ if makefile_has_docker_tag(makefile_path):
137
+ print(PaastaCheckMessages.MAKEFILE_HAS_DOCKER_TAG)
138
+ else:
139
+ print(PaastaCheckMessages.MAKEFILE_HAS_NO_DOCKER_TAG)
140
+
141
+ if makefile_responds_to("cook-image"):
142
+ print(PaastaCheckMessages.MAKEFILE_RESPONDS_BUILD_IMAGE)
143
+ else:
144
+ print(PaastaCheckMessages.MAKEFILE_RESPONDS_BUILD_IMAGE_FAIL)
145
+
146
+ if makefile_responds_to("itest"):
147
+ print(PaastaCheckMessages.MAKEFILE_RESPONDS_ITEST)
148
+ else:
149
+ print(PaastaCheckMessages.MAKEFILE_RESPONDS_ITEST_FAIL)
150
+
151
+ if makefile_responds_to("test"):
152
+ print(PaastaCheckMessages.MAKEFILE_RESPONDS_TEST)
153
+ else:
154
+ print(PaastaCheckMessages.MAKEFILE_RESPONDS_TEST_FAIL)
155
+ else:
156
+ print(PaastaCheckMessages.MAKEFILE_MISSING)
157
+
158
+
159
+ def git_repo_check(service, soa_dir):
160
+ git_url = get_git_url(service, soa_dir)
161
+ cmd = "git ls-remote %s" % git_url
162
+ returncode, _ = _run(cmd, timeout=5)
163
+ if returncode == 0:
164
+ print(PaastaCheckMessages.GIT_REPO_FOUND)
165
+ else:
166
+ print(PaastaCheckMessages.git_repo_missing(git_url))
167
+
168
+
169
+ def get_deploy_groups_used_by_framework(instance_type, service, soa_dir):
170
+ """This is a kind of funny function that gets all the instances for specified
171
+ service and framework, and massages it into a form that matches up with what
172
+ deploy.yaml's steps look like. This is only so we can compare it 1-1
173
+ with what deploy.yaml has for linting.
174
+
175
+ :param instance_type: one of the entries in utils.INSTANCE_TYPES
176
+ :param service: the service name
177
+ :param soa_dir: The SOA configuration directory to read from
178
+
179
+ :returns: a list of deploy group names used by the service.
180
+ """
181
+
182
+ deploy_groups = []
183
+ for cluster in list_clusters(service, soa_dir):
184
+ for _, instance in get_service_instance_list(
185
+ service=service,
186
+ cluster=cluster,
187
+ instance_type=instance_type,
188
+ soa_dir=soa_dir,
189
+ ):
190
+ try:
191
+ config = get_instance_config(
192
+ service=service,
193
+ instance=instance,
194
+ cluster=cluster,
195
+ soa_dir=soa_dir,
196
+ load_deployments=False,
197
+ instance_type=instance_type,
198
+ )
199
+ deploy_groups.append(config.get_deploy_group())
200
+ except NotImplementedError:
201
+ pass
202
+ return set(filter(None, deploy_groups))
203
+
204
+
205
+ def deployments_check(service, soa_dir):
206
+ """Checks for consistency between deploy.yaml and the kubernetes/etc yamls"""
207
+ the_return = True
208
+ pipeline_deploy_groups = get_pipeline_deploy_groups(
209
+ service=service, soa_dir=soa_dir
210
+ )
211
+
212
+ framework_deploy_groups = {}
213
+ in_deploy_not_frameworks = set(pipeline_deploy_groups)
214
+ for it in INSTANCE_TYPES:
215
+ framework_deploy_groups[it] = get_deploy_groups_used_by_framework(
216
+ it, service, soa_dir
217
+ )
218
+ in_framework_not_deploy = set(framework_deploy_groups[it]) - set(
219
+ pipeline_deploy_groups
220
+ )
221
+ in_deploy_not_frameworks -= set(framework_deploy_groups[it])
222
+ if len(in_framework_not_deploy) > 0:
223
+ print(
224
+ "{} There are some instance(s) you have asked to run in {} that".format(
225
+ x_mark(), it
226
+ )
227
+ )
228
+ print(" do not have a corresponding entry in deploy.yaml:")
229
+ print(" %s" % PaastaColors.bold(", ".join(in_framework_not_deploy)))
230
+ print(" You should probably configure these to use a 'deploy_group' or")
231
+ print(
232
+ " add entries to deploy.yaml for them so they are deployed to those clusters."
233
+ )
234
+ the_return = False
235
+
236
+ if len(in_deploy_not_frameworks) > 0:
237
+ print(
238
+ "%s There are some instance(s) in deploy.yaml that are not referenced"
239
+ % x_mark()
240
+ )
241
+ print(" by any instance:")
242
+ print(" %s" % PaastaColors.bold((", ".join(in_deploy_not_frameworks))))
243
+ print(
244
+ " You should probably delete these deploy.yaml entries if they are unused."
245
+ )
246
+ the_return = False
247
+
248
+ if the_return is True:
249
+ print(success("All entries in deploy.yaml correspond to a paasta instance"))
250
+ for it in INSTANCE_TYPES:
251
+ if len(framework_deploy_groups[it]) > 0:
252
+ print(
253
+ success(
254
+ "All %s instances have a corresponding deploy.yaml entry" % it
255
+ )
256
+ )
257
+ return the_return
258
+
259
+
260
+ def sensu_check(service, service_path, soa_dir):
261
+ """Check whether monitoring.yaml exists in service directory,
262
+ and that the team name is declared.
263
+
264
+ :param service: name of service currently being examined
265
+ :param service_path: path to location of monitoring.yaml file"""
266
+ if is_file_in_dir("monitoring.yaml", service_path):
267
+ print(PaastaCheckMessages.SENSU_MONITORING_FOUND)
268
+ team = get_team(service=service, overrides={}, soa_dir=soa_dir)
269
+ if team is None:
270
+ print(PaastaCheckMessages.SENSU_TEAM_MISSING)
271
+ else:
272
+ print(PaastaCheckMessages.sensu_team_found(team))
273
+ else:
274
+ print(PaastaCheckMessages.SENSU_MONITORING_MISSING)
275
+
276
+
277
+ def service_dir_check(service, soa_dir):
278
+ """Check whether directory service exists in /nail/etc/services
279
+ :param service: string of service name we wish to inspect
280
+ """
281
+ try:
282
+ validate_service_name(service, soa_dir)
283
+ print(PaastaCheckMessages.service_dir_found(service, soa_dir))
284
+ except NoSuchService:
285
+ print(PaastaCheckMessages.service_dir_missing(service, soa_dir))
286
+
287
+
288
+ def smartstack_check(service, service_path, soa_dir):
289
+ """Check whether smartstack.yaml exists in service directory, and the proxy
290
+ ports are declared. Print appropriate message depending on outcome.
291
+
292
+ :param service: name of service currently being examined
293
+ :param service_path: path to location of smartstack.yaml file"""
294
+ if is_file_in_dir("smartstack.yaml", service_path):
295
+ print(PaastaCheckMessages.SMARTSTACK_YAML_FOUND)
296
+ instances = get_all_namespaces_for_service(service=service, soa_dir=soa_dir)
297
+ if len(instances) > 0:
298
+ for namespace, config in get_all_namespaces_for_service(
299
+ service=service, soa_dir=soa_dir, full_name=False
300
+ ):
301
+ if "proxy_port" in config:
302
+ print(
303
+ PaastaCheckMessages.smartstack_port_found(
304
+ namespace, config.get("proxy_port")
305
+ )
306
+ )
307
+ else:
308
+ print(PaastaCheckMessages.SMARTSTACK_PORT_MISSING)
309
+ else:
310
+ print(PaastaCheckMessages.SMARTSTACK_PORT_MISSING)
311
+
312
+
313
+ def paasta_check(args):
314
+ """Analyze the service in the PWD to determine if it is paasta ready
315
+ :param args: argparse.Namespace obj created from sys.args by cli"""
316
+ soa_dir = args.yelpsoa_config_root
317
+ service = figure_out_service_name(args, soa_dir)
318
+ service_path = os.path.join(soa_dir, service)
319
+
320
+ service_dir_check(service, soa_dir)
321
+ deploy_check(service_path)
322
+ deploy_has_security_check(service, soa_dir)
323
+ git_repo_check(service, soa_dir)
324
+ docker_check()
325
+ makefile_check()
326
+ deployments_check(service, soa_dir)
327
+ sensu_check(service, service_path, soa_dir)
328
+ smartstack_check(service, service_path, soa_dir)
329
+ paasta_validate_soa_configs(service, service_path)
330
+
331
+
332
+ def read_dockerfile_lines(path):
333
+ with open(path, "r") as dockerfile:
334
+ return dockerfile.readlines()
@@ -0,0 +1,147 @@
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 build a docker image."""
16
+ import argparse
17
+ import os
18
+ import sys
19
+ from typing import Optional
20
+
21
+ from paasta_tools.cli.cmds.check import makefile_responds_to
22
+ from paasta_tools.cli.utils import validate_service_name
23
+ from paasta_tools.utils import _log
24
+ from paasta_tools.utils import _log_audit
25
+ from paasta_tools.utils import _run
26
+ from paasta_tools.utils import build_docker_tag
27
+ from paasta_tools.utils import DEFAULT_SOA_DIR
28
+ from paasta_tools.utils import get_username
29
+
30
+
31
+ def add_subparser(subparsers: argparse._SubParsersAction) -> None:
32
+ list_parser = subparsers.add_parser(
33
+ "cook-image",
34
+ description="Calls 'make cook-image' as part of the PaaSTA contract",
35
+ help=(
36
+ "'paasta cook-image' calls 'make cook-image' as part of the PaaSTA contract.\n\n"
37
+ "The PaaSTA contract specifies that a service MUST respond to 'cook-image' and produce "
38
+ "a docker image as a result. This command is often run as part of the normal build pipeline "
39
+ "('paasta itest'), or via a 'paasta local-run --build'."
40
+ ),
41
+ epilog="This command assumes that the Makefile is in the current working directory.",
42
+ )
43
+ list_parser.add_argument(
44
+ "-s",
45
+ "--service",
46
+ help=(
47
+ "Build docker image for this service. Leading "
48
+ '"services-", as included in a Jenkins job name, '
49
+ "will be stripped."
50
+ ),
51
+ required=True,
52
+ )
53
+ list_parser.add_argument(
54
+ "-y",
55
+ "--yelpsoa-config-root",
56
+ dest="yelpsoa_config_root",
57
+ help="A directory from which yelpsoa-configs should be read from",
58
+ default=DEFAULT_SOA_DIR,
59
+ )
60
+ list_parser.add_argument(
61
+ "-c",
62
+ "--commit",
63
+ help="Git sha used to construct tag for built image",
64
+ )
65
+ list_parser.add_argument(
66
+ "--image-version",
67
+ type=str,
68
+ required=False,
69
+ default=None,
70
+ help="Extra version metadata used to construct tag for built image",
71
+ )
72
+ list_parser.set_defaults(command=paasta_cook_image)
73
+
74
+
75
+ def paasta_cook_image(
76
+ args: Optional[argparse.Namespace],
77
+ service: Optional[str] = None,
78
+ soa_dir: Optional[str] = None,
79
+ ) -> int:
80
+ """Build a docker image"""
81
+ if not service:
82
+ if args is None:
83
+ print(
84
+ "ERROR: No arguments or service passed to cook-image - unable to determine what service to cook an image for",
85
+ file=sys.stderr,
86
+ )
87
+ return 1
88
+ service = args.service
89
+ if service and service.startswith("services-"):
90
+ service = service.split("services-", 1)[1]
91
+ if not soa_dir:
92
+ if args is None:
93
+ print(
94
+ "ERROR: No arguments or soadir passed to cook-image - unable to determine where to look for soa-configs",
95
+ file=sys.stderr,
96
+ )
97
+ return 1
98
+ soa_dir = args.yelpsoa_config_root
99
+
100
+ validate_service_name(service, soa_dir)
101
+
102
+ run_env = os.environ.copy()
103
+ if args is not None and args.commit is not None:
104
+ # if we're given a commit, we're likely being called by Jenkins or someone
105
+ # trying to push the cooked image to our registry - as such, we should tag
106
+ # the cooked image as `paasta itest` would.
107
+ tag = build_docker_tag(service, args.commit, args.image_version)
108
+ else:
109
+ default_tag = "paasta-cook-image-{}-{}".format(service, get_username())
110
+ tag = run_env.get("DOCKER_TAG", default_tag)
111
+ run_env["DOCKER_TAG"] = tag
112
+
113
+ if not makefile_responds_to("cook-image"):
114
+ print(
115
+ "ERROR: local-run now requires a cook-image target to be present in the Makefile. See "
116
+ "http://paasta.readthedocs.io/en/latest/about/contract.html.",
117
+ file=sys.stderr,
118
+ )
119
+ return 1
120
+
121
+ try:
122
+ cmd = "make cook-image"
123
+ returncode, output = _run(
124
+ cmd,
125
+ env=run_env,
126
+ log=True,
127
+ component="build",
128
+ service=service,
129
+ loglevel="debug",
130
+ )
131
+ if returncode != 0:
132
+ _log(
133
+ service=service,
134
+ line="ERROR: make cook-image failed for %s." % service,
135
+ component="build",
136
+ level="event",
137
+ )
138
+ else:
139
+ action_details = {"tag": tag}
140
+ _log_audit(
141
+ action="cook-image", action_details=action_details, service=service
142
+ )
143
+ return returncode
144
+
145
+ except KeyboardInterrupt:
146
+ print("\nProcess interrupted by the user. Cancelling.", file=sys.stderr)
147
+ return 2
@@ -0,0 +1,76 @@
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 sys
16
+
17
+ from paasta_tools.cli.utils import lazy_choices_completer
18
+ from paasta_tools.cli.utils import list_deploy_groups
19
+ from paasta_tools.cli.utils import PaastaColors
20
+ from paasta_tools.cli.utils import validate_service_name
21
+ from paasta_tools.deployment_utils import load_v2_deployments_json
22
+ from paasta_tools.utils import DEFAULT_SOA_DIR
23
+ from paasta_tools.utils import get_service_docker_registry
24
+ from paasta_tools.utils import list_services
25
+
26
+
27
+ def add_subparser(subparsers):
28
+ list_parser = subparsers.add_parser(
29
+ "get-docker-image",
30
+ help="Gets the docker image URL for the deployment of a service",
31
+ )
32
+ list_parser.add_argument(
33
+ "-s",
34
+ "--service",
35
+ help="Name of the service which you want to get the docker image for.",
36
+ required=True,
37
+ ).completer = lazy_choices_completer(list_services)
38
+ list_parser.add_argument(
39
+ "-i",
40
+ "-l",
41
+ "--deploy-group",
42
+ help='Name of the deploy group, like "prod".',
43
+ required=True,
44
+ ).completer = lazy_choices_completer(list_deploy_groups)
45
+ list_parser.add_argument(
46
+ "-d",
47
+ "--soa-dir",
48
+ help="A directory from which soa-configs should be read from",
49
+ default=DEFAULT_SOA_DIR,
50
+ )
51
+
52
+ list_parser.set_defaults(command=paasta_get_docker_image)
53
+
54
+
55
+ def paasta_get_docker_image(args):
56
+ service = args.service
57
+ deploy_group = args.deploy_group
58
+ soa_dir = args.soa_dir
59
+ validate_service_name(service, soa_dir)
60
+
61
+ deployments = load_v2_deployments_json(service=service, soa_dir=soa_dir)
62
+ docker_image = deployments.get_docker_image_for_deploy_group(deploy_group)
63
+
64
+ if not docker_image:
65
+ print(
66
+ PaastaColors.red(
67
+ f"There is no {service} docker_image for {deploy_group}. Has it been deployed yet?"
68
+ ),
69
+ file=sys.stderr,
70
+ )
71
+ return 1
72
+ else:
73
+ registry_uri = get_service_docker_registry(service=service, soa_dir=soa_dir)
74
+ docker_url = f"{registry_uri}/{docker_image}"
75
+ print(docker_url)
76
+ return 0